Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/netbsd-9]: src/sys/net Pull up following revision(s) (requested by mrg i...
details: https://anonhg.NetBSD.org/src/rev/5716d5dbefee
branches: netbsd-9
changeset: 1001503:5716d5dbefee
user: martin <martin%NetBSD.org@localhost>
date: Tue Feb 25 18:40:43 2020 +0000
description:
Pull up following revision(s) (requested by mrg in ticket #717):
sys/dev/fdt/dwcmmc_fdt.c 1.11
sys/dev/ic/bwfm.c 1.15-1.18
sys/dev/ic/bwfmreg.h 1.4-1.6
sys/dev/ic/bwfmvar.h 1.4,1.5
sys/dev/ic/dwc_mmc.c 1.21,1.22
sys/dev/ic/dwc_mmc_reg.h 1.8,1.9,1.12,1.13
sys/dev/pcmcia/pcmciareg.h 1.11
sys/dev/sdmmc/if_bwfm_sdio.c 1.4,1.6-1.12
sys/dev/sdmmc/if_bwfm_sdio.h 1.1,1.2
sys/dev/sdmmc/sdhc.c 1.105,1.106
sys/dev/sdmmc/sdmmc.c 1.37,1.39
sys/dev/sdmmc/sdmmc_cis.c 1.6,1.8
sys/dev/sdmmc/sdmmc_io.c 1.15-1.19
sys/dev/sdmmc/sdmmc_ioreg.h 1.4,1.5
sys/dev/sdmmc/sdmmc_mem.c 1.69-1.71
sys/dev/sdmmc/sdmmcdevs 1.5-1.8
sys/dev/sdmmc/sdmmcvar.h 1.31,1.33,1.34
sys/net/if_media.h 1.66
Add Broadcom devices
-
Fix typo
-
add PCMCIA_CISTPL_SDIO definition.
-
>From OpenBSD:
- move event handling to workqueue
- check for save/restore capability
-
Tag work queue as MPsafe and increase length.
-
Juse use bpf_mtap(), the 802.11 encapsulation is handled by firmware.
-
>From OpenBSD:
- support block length per function
- add functions to read/write regions
-
Decode (but not use) SDIO tuple in CIS.
-
Fix locking.
-
Add more SDIO defines (partially from version 3.0).
-
>From OpenBSD:
- All the missing pieces (firmware load, chip setup, protocol handling)
TX queue and interrupt handling via sdmmc_task.
-
Fix locking.
-
Fix packet parsing.
-
Add parser for original firmware config files.
-
tagging work queue as MPSAFE was premature. Revert.
-
SD_IO_RW_EXTENDED is a data transfer command, so set ADTC flag instead of AC
Use correct function to verify if a task has been queued. Avoids race
that can corrupt the task queue.
-
More register definitions.
-
Add IFM_IEEE80211_VHT subtype, IFM_IEEE80211_11AC operating mode, and missing descriptions
-
If firmware is connected in HT or VHT mode, report it to SIOCGIFMEDIA
-
white space police.
Skip setting power when the voltage doesn't change.
Also increase some timeouts.
-
Add and use sdmmc_pause to avoid long-term busy waits.
-
Add sdio abort function.
-
Additional error messages.
-
Print parameters for SDIO devices.
-
Minor cosmetics.
-
Simplyfy sdmmc_io_set_blocklen function signature by dropping the
extra softc pointer. Aligns with OpenBSD.
-
Missing commit for sdio abort function.
-
More code from OpenBSD
-
no need to splnet() when enqueing packets
-
explicit structure padding
-
make internal functions static
-
also prepare for GPIO interrupts.
-
Avoid warnings for tautological shifts as sole conditional.
-
Follow the Linux driver an use the FDT "compatible" property to build a
filename for the nvram config file, fall back to the standard filename.
E.g.
[Caching 123 nodes and 1093 properties]
compatible 73696e6f 766f6970 2c627069 2d6d322d "sinovoip,bpi-m2-
0010: 7a65726f 00...... ........ ........ zero"
0015: 616c6c77 696e6e65 722c7375 6e38692d "allwinner,sun8i-
0025: 68322d70 6c757300 ........ ........ h2-plus"
interrupt-parent 00000001 ........ ........ ........ ....
model 42616e61 6e612050 69204250 492d4d32 "Banana Pi BPI-M2
0010: 2d5a6572 6f00.... ........ ........ -Zero"
name 00...... ........ ........ ........ ""
serial-number 30326330 30303432 65636431 36376566 02c00042ecd167ef
0010: 00...... ........ ........ ........ .
-rw-r--r-- 1 root wheel 875 Nov 2 12:06 brcmfmac43430-sdio.AP6212.txt
lrwxr-xr-x 1 root wheel 29 Dec 30 16:19 brcmfmac43430-sdio.sinovoip,bpi-m2-zero.txt -> brcmfmac43430-sdio.AP6212.txt
-rw-r--r-- 1 root wheel 874 Jun 30 2019 brcmfmac43430-sdio.raspberrypi,3-model-b.txt
-rw-r--r-- 1 root wheel 1864 Jun 30 2019 brcmfmac43455-sdio.raspberrypi,3-model-b-plus.txt
lrwxr-xr-x 1 root wheel 29 Dec 30 11:24 brcmfmac43455-sdio.raspberrypi,4-model-b-plus.txt -> brcmfmac43455-sdio.raspberrypi,3-model-b-plus.txt
-
Add product ID for Broadcom BCM43455
-
Use correct firmware for BCM43456
-
size check was backwards.
-
Be less noisy for some commands.
-
Fix DWC_MMC_INT_SDIO_INT bit
-
dwc_mmc fixes:
- Rockchip uses a different SDIO int bit, so take this into consideration
- Avoid unnecessary resets and always wait for resets to complete
- kpause instead of delay while holding spinlock
- Do not attempt autostop for SD_IO_RW_EXTENDED commands
- Allow for sub-blklen byte counts for single block transfers
-
More SDIO stability and performance fixes
diffstat:
sys/dev/fdt/dwcmmc_fdt.c | 7 +-
sys/dev/ic/bwfm.c | 270 ++++-
sys/dev/ic/bwfmreg.h | 151 +++-
sys/dev/ic/bwfmvar.h | 10 +-
sys/dev/ic/dwc_mmc.c | 99 +-
sys/dev/ic/dwc_mmc_reg.h | 8 +-
sys/dev/ic/dwc_mmc_var.h | 5 +-
sys/dev/pcmcia/pcmciareg.h | 3 +-
sys/dev/sdmmc/if_bwfm_sdio.c | 1835 +++++++++++++++++++++++++++++++++++++++--
sys/dev/sdmmc/if_bwfm_sdio.h | 209 ++++
sys/dev/sdmmc/sdhc.c | 60 +-
sys/dev/sdmmc/sdmmc.c | 27 +-
sys/dev/sdmmc/sdmmc_cis.c | 14 +-
sys/dev/sdmmc/sdmmc_io.c | 201 +++-
sys/dev/sdmmc/sdmmc_ioreg.h | 38 +-
sys/dev/sdmmc/sdmmc_mem.c | 12 +-
sys/dev/sdmmc/sdmmcdevs | 20 +-
sys/dev/sdmmc/sdmmcvar.h | 9 +-
sys/net/if_media.h | 7 +-
19 files changed, 2702 insertions(+), 283 deletions(-)
diffs (truncated from 4336 to 300 lines):
diff -r 3f147a38d5da -r 5716d5dbefee sys/dev/fdt/dwcmmc_fdt.c
--- a/sys/dev/fdt/dwcmmc_fdt.c Thu Feb 20 14:54:22 2020 +0000
+++ b/sys/dev/fdt/dwcmmc_fdt.c Tue Feb 25 18:40:43 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: dwcmmc_fdt.c,v 1.8.2.1 2020/01/21 10:39:58 martin Exp $ */
+/* $NetBSD: dwcmmc_fdt.c,v 1.8.2.2 2020/02/25 18:40:43 martin Exp $ */
/*-
* Copyright (c) 2015-2018 Jared McNeill <jmcneill%invisible.ca@localhost>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dwcmmc_fdt.c,v 1.8.2.1 2020/01/21 10:39:58 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dwcmmc_fdt.c,v 1.8.2.2 2020/02/25 18:40:43 martin Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -56,12 +56,14 @@
struct dwcmmc_fdt_config {
u_int ciu_div;
u_int flags;
+ uint32_t intr_cardmask;
};
static const struct dwcmmc_fdt_config dwcmmc_rk3288_config = {
.ciu_div = 2,
.flags = DWC_MMC_F_USE_HOLD_REG |
DWC_MMC_F_DMA,
+ .intr_cardmask = __BIT(24),
};
static const struct of_compat_data compat_data[] = {
@@ -156,6 +158,7 @@
sc->sc_bus_width = 4;
sc->sc_fifo_depth = fifo_depth;
+ sc->sc_intr_cardmask = esc->sc_conf->intr_cardmask;
sc->sc_ciu_div = esc->sc_conf->ciu_div;
sc->sc_flags = esc->sc_conf->flags;
sc->sc_pre_power_on = dwcmmc_fdt_pre_power_on;
diff -r 3f147a38d5da -r 5716d5dbefee sys/dev/ic/bwfm.c
--- a/sys/dev/ic/bwfm.c Thu Feb 20 14:54:22 2020 +0000
+++ b/sys/dev/ic/bwfm.c Tue Feb 25 18:40:43 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: bwfm.c,v 1.14 2018/09/02 19:46:53 maya Exp $ */
+/* $NetBSD: bwfm.c,v 1.14.6.1 2020/02/25 18:40:43 martin Exp $ */
/* $OpenBSD: bwfm.c,v 1.5 2017/10/16 22:27:16 patrick Exp $ */
/*
* Copyright (c) 2010-2016 Broadcom Corporation
@@ -112,9 +112,11 @@
struct ieee80211_channel *bwfm_bss2chan(struct bwfm_softc *, struct bwfm_bss_info *);
void bwfm_scan(struct bwfm_softc *);
void bwfm_connect(struct bwfm_softc *);
+void bwfm_get_sta_info(struct bwfm_softc *, struct ifmediareq *);
void bwfm_rx(struct bwfm_softc *, struct mbuf *);
-void bwfm_rx_event(struct bwfm_softc *, char *, size_t);
+void bwfm_rx_event(struct bwfm_softc *, struct mbuf *);
+void bwfm_rx_event_cb(struct bwfm_softc *, struct mbuf *);
void bwfm_scan_node(struct bwfm_softc *, struct bwfm_bss_info *, size_t);
uint8_t bwfm_2ghz_channels[] = {
@@ -304,9 +306,6 @@
/* TODO: return if no link? */
for (;;) {
- struct ieee80211_node *ni;
- struct ether_header *eh;
-
/* Discard management packets (fw handles this for us) */
IF_DEQUEUE(&ic->ic_mgtq, m);
if (m != NULL) {
@@ -323,36 +322,19 @@
if (m == NULL)
break;
- eh = mtod(m, struct ether_header *);
- ni = ieee80211_find_txnode(ic, eh->ether_dhost);
- if (ni == NULL) {
- ifp->if_oerrors++;
- m_freem(m);
- continue;
- }
-
- if (ieee80211_classify(ic, m, ni) != 0) {
- ifp->if_oerrors++;
- m_freem(m);
- ieee80211_free_node(ni);
- continue;
- }
-
error = sc->sc_bus_ops->bs_txdata(sc, &m);
if (error == ENOBUFS) {
IF_PREPEND(&ifp->if_snd, m);
ifp->if_flags |= IFF_OACTIVE;
break;
}
-
if (error != 0) {
ifp->if_oerrors++;
m_freem(m);
- if (ni != NULL)
- ieee80211_free_node(ni);
- } else {
- bpf_mtap3(ic->ic_rawbpf, m, BPF_D_OUT);
+ continue;
}
+
+ bpf_mtap(ifp, m, BPF_D_OUT);
}
}
@@ -363,6 +345,7 @@
struct ieee80211com *ic = &sc->sc_ic;
uint8_t evmask[BWFM_EVENT_MASK_LEN];
struct bwfm_join_pref_params join_pref[2];
+ int pm;
if (bwfm_fwvar_var_set_int(sc, "mpc", 1)) {
printf("%s: could not set mpc\n", DEVNAME(sc));
@@ -388,10 +371,31 @@
#define ENABLE_EVENT(e) evmask[(e) / 8] |= 1 << ((e) % 8)
/* Events used to drive the state machine */
- ENABLE_EVENT(BWFM_E_ASSOC);
- ENABLE_EVENT(BWFM_E_ESCAN_RESULT);
- ENABLE_EVENT(BWFM_E_SET_SSID);
- ENABLE_EVENT(BWFM_E_LINK);
+ switch (ic->ic_opmode) {
+ case IEEE80211_M_STA:
+ ENABLE_EVENT(BWFM_E_IF);
+ ENABLE_EVENT(BWFM_E_LINK);
+ ENABLE_EVENT(BWFM_E_AUTH);
+ ENABLE_EVENT(BWFM_E_ASSOC);
+ ENABLE_EVENT(BWFM_E_DEAUTH);
+ ENABLE_EVENT(BWFM_E_DISASSOC);
+ ENABLE_EVENT(BWFM_E_SET_SSID);
+ ENABLE_EVENT(BWFM_E_ESCAN_RESULT);
+ break;
+#ifndef IEEE80211_STA_ONLY
+ case IEEE80211_M_HOSTAP:
+ ENABLE_EVENT(BWFM_E_AUTH_IND);
+ ENABLE_EVENT(BWFM_E_ASSOC_IND);
+ ENABLE_EVENT(BWFM_E_REASSOC_IND);
+ ENABLE_EVENT(BWFM_E_DEAUTH_IND);
+ ENABLE_EVENT(BWFM_E_DISASSOC_IND);
+ ENABLE_EVENT(BWFM_E_ESCAN_RESULT);
+ ENABLE_EVENT(BWFM_E_ESCAN_RESULT);
+ break;
+#endif
+ default:
+ break;
+ }
#undef ENABLE_EVENT
#ifdef BWFM_DEBUG
@@ -419,7 +423,16 @@
return EIO;
}
- if (bwfm_fwvar_cmd_set_int(sc, BWFM_C_SET_PM, 2)) {
+ /*
+ * Use CAM (constantly awake) when we are running as AP
+ * otherwise use fast power saving.
+ */
+ pm = BWFM_PM_FAST_PS;
+#ifndef IEEE80211_STA_ONLY
+ if (ic->ic_opmode == IEEE80211_M_HOSTAP)
+ pm = BWFM_PM_CAM;
+#endif
+ if (bwfm_fwvar_cmd_set_int(sc, BWFM_C_SET_PM, pm)) {
printf("%s: could not set power\n", DEVNAME(sc));
return EIO;
}
@@ -466,15 +479,25 @@
{
struct bwfm_softc *sc = ifp->if_softc;
struct ieee80211com *ic = &sc->sc_ic;
+ struct bwfm_join_params join;
sc->sc_tx_timer = 0;
ifp->if_timer = 0;
ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
+ memset(&join, 0, sizeof(join));
+ bwfm_fwvar_cmd_set_data(sc, BWFM_C_SET_SSID, &join, sizeof(join));
bwfm_fwvar_cmd_set_int(sc, BWFM_C_DOWN, 1);
bwfm_fwvar_cmd_set_int(sc, BWFM_C_SET_PM, 0);
+ bwfm_fwvar_cmd_set_int(sc, BWFM_C_SET_AP, 0);
+ bwfm_fwvar_cmd_set_int(sc, BWFM_C_SET_INFRA, 0);
+ bwfm_fwvar_cmd_set_int(sc, BWFM_C_UP, 1);
+ bwfm_fwvar_cmd_set_int(sc, BWFM_C_SET_PM, BWFM_PM_FAST_PS);
ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
+
+ if (sc->sc_bus_ops->bs_stop)
+ sc->sc_bus_ops->bs_stop(sc);
}
void
@@ -531,6 +554,12 @@
}
break;
+ case SIOCGIFMEDIA:
+ error = ieee80211_ioctl(ic, cmd, data);
+ if (error == 0 && ic->ic_state == IEEE80211_S_RUN)
+ bwfm_get_sta_info(sc, (struct ifmediareq *)data);
+ break;
+
default:
error = ieee80211_ioctl(ic, cmd, data);
}
@@ -618,7 +647,7 @@
wsec_key.len = htole32(wk->wk_keylen);
memcpy(wsec_key.data, wk->wk_key, sizeof(wsec_key.data));
if (!ext_key)
- wsec_key.flags = htole32(BWFM_PRIMARY_KEY);
+ wsec_key.flags = htole32(BWFM_WSEC_PRIMARY_KEY);
switch (wk->wk_cipher->ic_cipher) {
case IEEE80211_CIPHER_WEP:
@@ -682,7 +711,7 @@
memset(&wsec_key, 0, sizeof(wsec_key));
wsec_key.index = htole32(wk->wk_keyix);
- wsec_key.flags = htole32(BWFM_PRIMARY_KEY);
+ wsec_key.flags = htole32(BWFM_WSEC_PRIMARY_KEY);
if (bwfm_fwvar_var_set_data(sc, "wsec_key", &wsec_key, sizeof(wsec_key)))
return;
@@ -770,6 +799,9 @@
case BWFM_TASK_KEY_DELETE:
bwfm_key_delete_cb(sc, &t->t_key);
break;
+ case BWFM_TASK_RX_EVENT:
+ bwfm_rx_event_cb(sc, t->t_mbuf);
+ break;
default:
panic("bwfm: unknown task command %d", t->t_cmd);
}
@@ -1261,6 +1293,52 @@
}
}
+int
+bwfm_chip_sr_capable(struct bwfm_softc *sc)
+{
+ struct bwfm_core *core;
+ uint32_t reg;
+
+ if (sc->sc_chip.ch_pmurev < 17)
+ return 0;
+
+ switch (sc->sc_chip.ch_chip) {
+ case BRCM_CC_4345_CHIP_ID:
+ case BRCM_CC_4354_CHIP_ID:
+ case BRCM_CC_4356_CHIP_ID:
+ core = bwfm_chip_get_pmu(sc);
+ sc->sc_buscore_ops->bc_write(sc, core->co_base +
+ BWFM_CHIP_REG_CHIPCONTROL_ADDR, 3);
+ reg = sc->sc_buscore_ops->bc_read(sc, core->co_base +
+ BWFM_CHIP_REG_CHIPCONTROL_DATA);
+ return (reg & (1 << 2)) != 0;
+ case BRCM_CC_43241_CHIP_ID:
+ case BRCM_CC_4335_CHIP_ID:
+ case BRCM_CC_4339_CHIP_ID:
+ core = bwfm_chip_get_pmu(sc);
+ sc->sc_buscore_ops->bc_write(sc, core->co_base +
+ BWFM_CHIP_REG_CHIPCONTROL_ADDR, 3);
+ reg = sc->sc_buscore_ops->bc_read(sc, core->co_base +
+ BWFM_CHIP_REG_CHIPCONTROL_DATA);
+ return reg != 0;
+ case BRCM_CC_43430_CHIP_ID:
+ core = bwfm_chip_get_core(sc, BWFM_AGENT_CORE_CHIPCOMMON);
+ reg = sc->sc_buscore_ops->bc_read(sc, core->co_base +
+ BWFM_CHIP_REG_SR_CONTROL1);
+ return reg != 0;
+ default:
+ core = bwfm_chip_get_pmu(sc);
+ reg = sc->sc_buscore_ops->bc_read(sc, core->co_base +
+ BWFM_CHIP_REG_PMUCAPABILITIES_EXT);
+ if ((reg & BWFM_CHIP_REG_PMUCAPABILITIES_SR_SUPP) == 0)
+ return 0;
+ reg = sc->sc_buscore_ops->bc_read(sc, core->co_base +
+ BWFM_CHIP_REG_RETENTION_CTL);
+ return (reg & (BWFM_CHIP_REG_RETENTION_CTL_MACPHY_DIS |
+ BWFM_CHIP_REG_RETENTION_CTL_LOGIC_DIS)) == 0;
+ }
+}
+
/* RAM size helpers */
void
bwfm_chip_socram_ramsize(struct bwfm_softc *sc, struct bwfm_core *core)
@@ -1415,10 +1493,10 @@
{
struct bwfm_proto_bcdc_dcmd *dcmd;
size_t size = sizeof(dcmd->hdr) + *len;
- static int reqid = 0;
Home |
Main Index |
Thread Index |
Old Index