Module Name:    src
Committed By:   maya
Date:           Fri May 11 07:41:11 UTC 2018

Modified Files:
        src/sys/dev/ic: bwfm.c bwfmreg.h bwfmvar.h
        src/sys/dev/sdmmc: if_bwfm_sdio.c
        src/sys/dev/usb: if_bwfm_usb.c

Log Message:
sync with openbsd bwfm to some extent.

add a txcheck
set chip active/passive for more kinds of chips
add wrapper around setting active/passive
detect chip RAM
make bwfm_rx take an mbuf


To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/sys/dev/ic/bwfm.c
cvs rdiff -u -r1.2 -r1.3 src/sys/dev/ic/bwfmreg.h
cvs rdiff -u -r1.1 -r1.2 src/sys/dev/ic/bwfmvar.h
cvs rdiff -u -r1.2 -r1.3 src/sys/dev/sdmmc/if_bwfm_sdio.c
cvs rdiff -u -r1.4 -r1.5 src/sys/dev/usb/if_bwfm_usb.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/ic/bwfm.c
diff -u src/sys/dev/ic/bwfm.c:1.10 src/sys/dev/ic/bwfm.c:1.11
--- src/sys/dev/ic/bwfm.c:1.10	Tue Jan 16 18:42:43 2018
+++ src/sys/dev/ic/bwfm.c	Fri May 11 07:41:11 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: bwfm.c,v 1.10 2018/01/16 18:42:43 maxv Exp $ */
+/* $NetBSD: bwfm.c,v 1.11 2018/05/11 07:41:11 maya Exp $ */
 /* $OpenBSD: bwfm.c,v 1.5 2017/10/16 22:27:16 patrick Exp $ */
 /*
  * Copyright (c) 2010-2016 Broadcom Corporation
@@ -21,7 +21,6 @@
 #include <sys/systm.h>
 #include <sys/buf.h>
 #include <sys/kernel.h>
-#include <sys/malloc.h>
 #include <sys/device.h>
 #include <sys/queue.h>
 #include <sys/socket.h>
@@ -85,9 +84,16 @@ void	 bwfm_chip_ai_reset(struct bwfm_sof
 void	 bwfm_chip_dmp_erom_scan(struct bwfm_softc *);
 int	 bwfm_chip_dmp_get_regaddr(struct bwfm_softc *, uint32_t *,
 	     uint32_t *, uint32_t *);
+int	 bwfm_chip_cr4_set_active(struct bwfm_softc *, const uint32_t);
 void	 bwfm_chip_cr4_set_passive(struct bwfm_softc *);
+int	 bwfm_chip_ca7_set_active(struct bwfm_softc *, const uint32_t);
 void	 bwfm_chip_ca7_set_passive(struct bwfm_softc *);
+int	 bwfm_chip_cm3_set_active(struct bwfm_softc *);
 void	 bwfm_chip_cm3_set_passive(struct bwfm_softc *);
+void	 bwfm_chip_socram_ramsize(struct bwfm_softc *, struct bwfm_core *);
+void	 bwfm_chip_sysmem_ramsize(struct bwfm_softc *, struct bwfm_core *);
+void	 bwfm_chip_tcm_ramsize(struct bwfm_softc *, struct bwfm_core *);
+void	 bwfm_chip_tcm_rambase(struct bwfm_softc *);
 
 int	 bwfm_proto_bcdc_query_dcmd(struct bwfm_softc *, int,
 	     int, char *, size_t *);
@@ -107,7 +113,7 @@ struct ieee80211_channel *bwfm_bss2chan(
 void	 bwfm_scan(struct bwfm_softc *);
 void	 bwfm_connect(struct bwfm_softc *);
 
-void	 bwfm_rx(struct bwfm_softc *, char *, size_t);
+void	 bwfm_rx(struct bwfm_softc *, struct mbuf *);
 void	 bwfm_rx_event(struct bwfm_softc *, char *, size_t);
 void	 bwfm_scan_node(struct bwfm_softc *, struct bwfm_bss_info *, size_t);
 
@@ -133,7 +139,7 @@ bwfm_attach(struct bwfm_softc *sc)
 	char fw_version[BWFM_DCMD_SMLEN];
 	uint32_t bandlist[3];
 	uint32_t tmp;
-	int i, error;
+	int i, j, error;
 
 	error = workqueue_create(&sc->sc_taskq, DEVNAME(sc),
 	    bwfm_task, sc, PRI_NONE, IPL_NET, 0);
@@ -203,8 +209,8 @@ bwfm_attach(struct bwfm_softc *sc)
 			ic->ic_sup_rates[IEEE80211_MODE_11B] = ieee80211_std_rateset_11b;
 			ic->ic_sup_rates[IEEE80211_MODE_11G] = ieee80211_std_rateset_11g;
 
-			for (i = 0; i < __arraycount(bwfm_2ghz_channels); i++) {
-				uint8_t chan = bwfm_2ghz_channels[i];
+			for (j = 0; j < __arraycount(bwfm_2ghz_channels); j++) {
+				uint8_t chan = bwfm_2ghz_channels[j];
 				ic->ic_channels[chan].ic_freq =
 				    ieee80211_ieee2mhz(chan, IEEE80211_CHAN_2GHZ);
 				ic->ic_channels[chan].ic_flags =
@@ -215,8 +221,8 @@ bwfm_attach(struct bwfm_softc *sc)
 		case BWFM_BAND_5G:
 			ic->ic_sup_rates[IEEE80211_MODE_11A] = ieee80211_std_rateset_11a;
 
-			for (i = 0; i < __arraycount(bwfm_5ghz_channels); i++) {
-				uint8_t chan = bwfm_5ghz_channels[i];
+			for (j = 0; j < __arraycount(bwfm_5ghz_channels); j++) {
+				uint8_t chan = bwfm_5ghz_channels[j];
 				ic->ic_channels[chan].ic_freq =
 				    ieee80211_ieee2mhz(chan, IEEE80211_CHAN_5GHZ);
 				ic->ic_channels[chan].ic_flags =
@@ -307,6 +313,11 @@ bwfm_start(struct ifnet *ifp)
 			continue;
 		}
 
+		if (sc->sc_bus_ops->bs_txcheck(sc)) {
+			ifp->if_flags |= IFF_OACTIVE;
+			break;
+		}
+
 		IFQ_DEQUEUE(&ifp->if_snd, m);
 		if (m == NULL)
 			break;
@@ -848,24 +859,22 @@ bwfm_chip_attach(struct bwfm_softc *sc)
 		return 1;
 	}
 
-	if (bwfm_chip_get_core(sc, BWFM_AGENT_CORE_ARM_CR4) != NULL)
-		bwfm_chip_cr4_set_passive(sc);
-	if (bwfm_chip_get_core(sc, BWFM_AGENT_CORE_ARM_CA7) != NULL)
-		bwfm_chip_ca7_set_passive(sc);
-	if (bwfm_chip_get_core(sc, BWFM_AGENT_CORE_ARM_CM3) != NULL)
-		bwfm_chip_cm3_set_passive(sc);
+	bwfm_chip_set_passive(sc);
 
 	if (sc->sc_buscore_ops->bc_reset) {
 		sc->sc_buscore_ops->bc_reset(sc);
-		if (bwfm_chip_get_core(sc, BWFM_AGENT_CORE_ARM_CR4) != NULL)
-			bwfm_chip_cr4_set_passive(sc);
-		if (bwfm_chip_get_core(sc, BWFM_AGENT_CORE_ARM_CA7) != NULL)
-			bwfm_chip_ca7_set_passive(sc);
-		if (bwfm_chip_get_core(sc, BWFM_AGENT_CORE_ARM_CM3) != NULL)
-			bwfm_chip_cm3_set_passive(sc);
+		bwfm_chip_set_passive(sc);
 	}
 
-	/* TODO: get raminfo */
+	if ((core = bwfm_chip_get_core(sc, BWFM_AGENT_CORE_ARM_CR4)) != NULL) {
+		bwfm_chip_tcm_ramsize(sc, core);
+		bwfm_chip_tcm_rambase(sc);
+	} else if ((core = bwfm_chip_get_core(sc, BWFM_AGENT_SYS_MEM)) != NULL) {
+		bwfm_chip_sysmem_ramsize(sc, core);
+		bwfm_chip_tcm_rambase(sc);
+	} else if ((core = bwfm_chip_get_core(sc, BWFM_AGENT_INTERNAL_MEM)) != NULL) {
+		bwfm_chip_socram_ramsize(sc, core);
+	}
 
 	core = bwfm_chip_get_core(sc, BWFM_AGENT_CORE_CHIPCOMMON);
 	sc->sc_chip.ch_cc_caps = sc->sc_buscore_ops->bc_read(sc,
@@ -1117,16 +1126,116 @@ bwfm_chip_dmp_get_regaddr(struct bwfm_so
 }
 
 /* Core configuration */
+int
+bwfm_chip_set_active(struct bwfm_softc *sc, const uint32_t rstvec)
+{
+	if (bwfm_chip_get_core(sc, BWFM_AGENT_CORE_ARM_CR4) != NULL)
+		return bwfm_chip_cr4_set_active(sc, rstvec);
+	if (bwfm_chip_get_core(sc, BWFM_AGENT_CORE_ARM_CA7) != NULL)
+		return bwfm_chip_ca7_set_active(sc, rstvec);
+	if (bwfm_chip_get_core(sc, BWFM_AGENT_CORE_ARM_CM3) != NULL)
+		return bwfm_chip_cm3_set_active(sc);
+	return 1;
+}
+
+void
+bwfm_chip_set_passive(struct bwfm_softc *sc)
+{
+	if (bwfm_chip_get_core(sc, BWFM_AGENT_CORE_ARM_CR4) != NULL) {
+		bwfm_chip_cr4_set_passive(sc);
+		return;
+	}
+	if (bwfm_chip_get_core(sc, BWFM_AGENT_CORE_ARM_CA7) != NULL) {
+		bwfm_chip_ca7_set_passive(sc);
+		return;
+	}
+	if (bwfm_chip_get_core(sc, BWFM_AGENT_CORE_ARM_CM3) != NULL) {
+		bwfm_chip_cm3_set_passive(sc);
+		return;
+	}
+}
+
+int
+bwfm_chip_cr4_set_active(struct bwfm_softc *sc, const uint32_t rstvec)
+{
+	struct bwfm_core *core;
+
+	sc->sc_buscore_ops->bc_activate(sc, rstvec);
+	core = bwfm_chip_get_core(sc, BWFM_AGENT_CORE_ARM_CR4);
+	sc->sc_chip.ch_core_reset(sc, core,
+	    BWFM_AGENT_IOCTL_ARMCR4_CPUHALT, 0, 0);
+
+	return 0;
+}
+
 void
 bwfm_chip_cr4_set_passive(struct bwfm_softc *sc)
 {
-	panic("%s: CR4 not supported", DEVNAME(sc));
+	struct bwfm_core *core;
+	uint32_t val;
+
+	core = bwfm_chip_get_core(sc, BWFM_AGENT_CORE_ARM_CR4);
+	val = sc->sc_buscore_ops->bc_read(sc,
+	    core->co_wrapbase + BWFM_AGENT_IOCTL);
+	sc->sc_chip.ch_core_reset(sc, core,
+	    val & BWFM_AGENT_IOCTL_ARMCR4_CPUHALT,
+	    BWFM_AGENT_IOCTL_ARMCR4_CPUHALT,
+	    BWFM_AGENT_IOCTL_ARMCR4_CPUHALT);
+
+	core = bwfm_chip_get_core(sc, BWFM_AGENT_CORE_80211);
+	sc->sc_chip.ch_core_reset(sc, core, BWFM_AGENT_D11_IOCTL_PHYRESET |
+	    BWFM_AGENT_D11_IOCTL_PHYCLOCKEN, BWFM_AGENT_D11_IOCTL_PHYCLOCKEN,
+	    BWFM_AGENT_D11_IOCTL_PHYCLOCKEN);
+}
+
+int
+bwfm_chip_ca7_set_active(struct bwfm_softc *sc, const uint32_t rstvec)
+{
+	struct bwfm_core *core;
+
+	sc->sc_buscore_ops->bc_activate(sc, rstvec);
+	core = bwfm_chip_get_core(sc, BWFM_AGENT_CORE_ARM_CA7);
+	sc->sc_chip.ch_core_reset(sc, core,
+	    BWFM_AGENT_IOCTL_ARMCR4_CPUHALT, 0, 0);
+
+	return 0;
 }
 
 void
 bwfm_chip_ca7_set_passive(struct bwfm_softc *sc)
 {
-	panic("%s: CA7 not supported", DEVNAME(sc));
+	struct bwfm_core *core;
+	uint32_t val;
+
+	core = bwfm_chip_get_core(sc, BWFM_AGENT_CORE_ARM_CA7);
+	val = sc->sc_buscore_ops->bc_read(sc,
+	    core->co_wrapbase + BWFM_AGENT_IOCTL);
+	sc->sc_chip.ch_core_reset(sc, core,
+	    val & BWFM_AGENT_IOCTL_ARMCR4_CPUHALT,
+	    BWFM_AGENT_IOCTL_ARMCR4_CPUHALT,
+	    BWFM_AGENT_IOCTL_ARMCR4_CPUHALT);
+
+	core = bwfm_chip_get_core(sc, BWFM_AGENT_CORE_80211);
+	sc->sc_chip.ch_core_reset(sc, core, BWFM_AGENT_D11_IOCTL_PHYRESET |
+	    BWFM_AGENT_D11_IOCTL_PHYCLOCKEN, BWFM_AGENT_D11_IOCTL_PHYCLOCKEN,
+	    BWFM_AGENT_D11_IOCTL_PHYCLOCKEN);
+}
+
+int
+bwfm_chip_cm3_set_active(struct bwfm_softc *sc)
+{
+	struct bwfm_core *core;
+
+	core = bwfm_chip_get_core(sc, BWFM_AGENT_INTERNAL_MEM);
+	if (!sc->sc_chip.ch_core_isup(sc, core))
+		return 1;
+
+	sc->sc_buscore_ops->bc_activate(sc, 0);
+
+	core = bwfm_chip_get_core(sc, BWFM_AGENT_CORE_ARM_CM3);
+	sc->sc_chip.ch_core_reset(sc, core, 0, 0, 0);
+
+	return 0;
 }
 
 void
@@ -1151,6 +1260,153 @@ bwfm_chip_cm3_set_passive(struct bwfm_so
 	}
 }
 
+/* RAM size helpers */
+void
+bwfm_chip_socram_ramsize(struct bwfm_softc *sc, struct bwfm_core *core)
+{
+	uint32_t coreinfo, nb, lss, banksize, bankinfo;
+	uint32_t ramsize = 0, srsize = 0;
+	int i;
+
+	if (!sc->sc_chip.ch_core_isup(sc, core))
+		sc->sc_chip.ch_core_reset(sc, core, 0, 0, 0);
+
+	coreinfo = sc->sc_buscore_ops->bc_read(sc,
+	    core->co_base + BWFM_SOCRAM_COREINFO);
+	nb = (coreinfo & BWFM_SOCRAM_COREINFO_SRNB_MASK)
+	    >> BWFM_SOCRAM_COREINFO_SRNB_SHIFT;
+
+	if (core->co_rev <= 7 || core->co_rev == 12) {
+		banksize = coreinfo & BWFM_SOCRAM_COREINFO_SRBSZ_MASK;
+		lss = (coreinfo & BWFM_SOCRAM_COREINFO_LSS_MASK)
+		    >> BWFM_SOCRAM_COREINFO_LSS_SHIFT;
+		if (lss != 0)
+			nb--;
+		ramsize = nb * (1 << (banksize + BWFM_SOCRAM_COREINFO_SRBSZ_BASE));
+		if (lss != 0)
+			ramsize += (1 << ((lss - 1) + BWFM_SOCRAM_COREINFO_SRBSZ_BASE));
+	} else {
+		for (i = 0; i < nb; i++) {
+			sc->sc_buscore_ops->bc_write(sc,
+			    core->co_base + BWFM_SOCRAM_BANKIDX,
+			    (BWFM_SOCRAM_BANKIDX_MEMTYPE_RAM <<
+			    BWFM_SOCRAM_BANKIDX_MEMTYPE_SHIFT) | i);
+			bankinfo = sc->sc_buscore_ops->bc_read(sc,
+			    core->co_base + BWFM_SOCRAM_BANKINFO);
+			banksize = ((bankinfo & BWFM_SOCRAM_BANKINFO_SZMASK) + 1)
+			    * BWFM_SOCRAM_BANKINFO_SZBASE;
+			ramsize += banksize;
+			if (bankinfo & BWFM_SOCRAM_BANKINFO_RETNTRAM_MASK)
+				srsize += banksize;
+		}
+	}
+
+	switch (sc->sc_chip.ch_chip) {
+	case BRCM_CC_4334_CHIP_ID:
+		if (sc->sc_chip.ch_chiprev < 2)
+			srsize = 32 * 1024;
+		break;
+	case BRCM_CC_43430_CHIP_ID:
+		srsize = 64 * 1024;
+		break;
+	default:
+		break;
+	}
+
+	sc->sc_chip.ch_ramsize = ramsize;
+	sc->sc_chip.ch_srsize = srsize;
+}
+
+void
+bwfm_chip_sysmem_ramsize(struct bwfm_softc *sc, struct bwfm_core *core)
+{
+	uint32_t coreinfo, nb, banksize, bankinfo;
+	uint32_t ramsize = 0;
+	int i;
+
+	if (!sc->sc_chip.ch_core_isup(sc, core))
+		sc->sc_chip.ch_core_reset(sc, core, 0, 0, 0);
+
+	coreinfo = sc->sc_buscore_ops->bc_read(sc,
+	    core->co_base + BWFM_SOCRAM_COREINFO);
+	nb = (coreinfo & BWFM_SOCRAM_COREINFO_SRNB_MASK)
+	    >> BWFM_SOCRAM_COREINFO_SRNB_SHIFT;
+
+	for (i = 0; i < nb; i++) {
+		sc->sc_buscore_ops->bc_write(sc,
+		    core->co_base + BWFM_SOCRAM_BANKIDX,
+		    (BWFM_SOCRAM_BANKIDX_MEMTYPE_RAM <<
+		    BWFM_SOCRAM_BANKIDX_MEMTYPE_SHIFT) | i);
+		bankinfo = sc->sc_buscore_ops->bc_read(sc,
+		    core->co_base + BWFM_SOCRAM_BANKINFO);
+		banksize = ((bankinfo & BWFM_SOCRAM_BANKINFO_SZMASK) + 1)
+		    * BWFM_SOCRAM_BANKINFO_SZBASE;
+		ramsize += banksize;
+	}
+
+	sc->sc_chip.ch_ramsize = ramsize;
+}
+
+void
+bwfm_chip_tcm_ramsize(struct bwfm_softc *sc, struct bwfm_core *core)
+{
+	uint32_t cap, nab, nbb, totb, bxinfo, ramsize = 0;
+	int i;
+
+	cap = sc->sc_buscore_ops->bc_read(sc, core->co_base + BWFM_ARMCR4_CAP);
+	nab = (cap & BWFM_ARMCR4_CAP_TCBANB_MASK) >> BWFM_ARMCR4_CAP_TCBANB_SHIFT;
+	nbb = (cap & BWFM_ARMCR4_CAP_TCBBNB_MASK) >> BWFM_ARMCR4_CAP_TCBBNB_SHIFT;
+	totb = nab + nbb;
+
+	for (i = 0; i < totb; i++) {
+		sc->sc_buscore_ops->bc_write(sc,
+		    core->co_base + BWFM_ARMCR4_BANKIDX, i);
+		bxinfo = sc->sc_buscore_ops->bc_read(sc,
+		    core->co_base + BWFM_ARMCR4_BANKINFO);
+		ramsize += ((bxinfo & BWFM_ARMCR4_BANKINFO_BSZ_MASK) + 1) *
+		    BWFM_ARMCR4_BANKINFO_BSZ_MULT;
+	}
+
+	sc->sc_chip.ch_ramsize = ramsize;
+}
+
+void
+bwfm_chip_tcm_rambase(struct bwfm_softc *sc)
+{
+	switch (sc->sc_chip.ch_chip) {
+	case BRCM_CC_4345_CHIP_ID:
+		sc->sc_chip.ch_rambase = 0x198000;
+		break;
+	case BRCM_CC_4335_CHIP_ID:
+	case BRCM_CC_4339_CHIP_ID:
+	case BRCM_CC_4350_CHIP_ID:
+	case BRCM_CC_4354_CHIP_ID:
+	case BRCM_CC_4356_CHIP_ID:
+	case BRCM_CC_43567_CHIP_ID:
+	case BRCM_CC_43569_CHIP_ID:
+	case BRCM_CC_43570_CHIP_ID:
+	case BRCM_CC_4358_CHIP_ID:
+	case BRCM_CC_4359_CHIP_ID:
+	case BRCM_CC_43602_CHIP_ID:
+	case BRCM_CC_4371_CHIP_ID:
+		sc->sc_chip.ch_rambase = 0x180000;
+		break;
+	case BRCM_CC_43465_CHIP_ID:
+	case BRCM_CC_43525_CHIP_ID:
+	case BRCM_CC_4365_CHIP_ID:
+	case BRCM_CC_4366_CHIP_ID:
+		sc->sc_chip.ch_rambase = 0x200000;
+		break;
+	case CY_CC_4373_CHIP_ID:
+		sc->sc_chip.ch_rambase = 0x160000;
+		break;
+	default:
+		printf("%s: unknown chip: %d\n", DEVNAME(sc),
+		    sc->sc_chip.ch_chip);
+		break;
+	}
+}
+
 /* BCDC protocol implementation */
 int
 bwfm_proto_bcdc_query_dcmd(struct bwfm_softc *sc, int ifidx,
@@ -1504,44 +1760,26 @@ bwfm_connect(struct bwfm_softc *sc)
 }
 
 void
-bwfm_rx(struct bwfm_softc *sc, char *buf, size_t len)
+bwfm_rx(struct bwfm_softc *sc, struct mbuf *m)
 {
 	struct ieee80211com *ic = &sc->sc_ic;
 	struct ifnet *ifp = ic->ic_ifp;
-	struct bwfm_event *e = (void *)buf;
-	struct mbuf *m;
-	char *mb;
+	struct bwfm_event *e = mtod(m, struct bwfm_event *);
 	int s;
 
-	DPRINTF(("%s: buf %p len %lu\n", __func__, buf, len));
-
-	if (len >= sizeof(e->ehdr) &&
+	if (m->m_len >= sizeof(e->ehdr) &&
 	    ntohs(e->ehdr.ether_type) == BWFM_ETHERTYPE_LINK_CTL &&
 	    memcmp(BWFM_BRCM_OUI, e->hdr.oui, sizeof(e->hdr.oui)) == 0 &&
-	    ntohs(e->hdr.usr_subtype) == BWFM_BRCM_SUBTYPE_EVENT)
-		bwfm_rx_event(sc, buf, len);
-
-	if (__predict_false(len > MCLBYTES || len == 0))
+	    ntohs(e->hdr.usr_subtype) == BWFM_BRCM_SUBTYPE_EVENT) {
+		bwfm_rx_event(sc, mtod(m, char *), m->m_len);
+		m_freem(m);
 		return;
-	MGETHDR(m, M_DONTWAIT, MT_DATA);
-	if (__predict_false(m == NULL))
-		return;
-	if (len > MHLEN) {
-		MCLGET(m, M_DONTWAIT);
-		if (!(m->m_flags & M_EXT)) {
-			m_free(m);
-			return;
-		}
 	}
 
 	s = splnet();
 
 	if ((ifp->if_flags & IFF_RUNNING) != 0) {
-		mb = mtod(m, char *);
-		memcpy(mb, buf, len);
-		m->m_pkthdr.len = m->m_len = len;
 		m_set_rcvif(m, ifp);
-
 		if_percpuq_enqueue(ifp->if_percpuq, m);
 	}
 
@@ -1627,7 +1865,7 @@ bwfm_rx_event(struct bwfm_softc *sc, cha
 		if (ntohl(e->msg.status) == BWFM_E_STATUS_SUCCESS &&
 		    ntohl(e->msg.reason) == 0)
 			break;
-		
+
 		/* Link status has changed */
 		ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
 		break;

Index: src/sys/dev/ic/bwfmreg.h
diff -u src/sys/dev/ic/bwfmreg.h:1.2 src/sys/dev/ic/bwfmreg.h:1.3
--- src/sys/dev/ic/bwfmreg.h:1.2	Fri Oct 20 23:38:56 2017
+++ src/sys/dev/ic/bwfmreg.h	Fri May 11 07:41:11 2018
@@ -1,5 +1,5 @@
-/* $NetBSD: bwfmreg.h,v 1.2 2017/10/20 23:38:56 jmcneill Exp $ */
-/* $OpenBSD: bwfmreg.h,v 1.4 2017/10/16 22:27:16 patrick Exp $ */
+/* $NetBSD: bwfmreg.h,v 1.3 2018/05/11 07:41:11 maya Exp $ */
+/* $OpenBSD: bwfmreg.h,v 1.16 2018/02/07 21:44:09 patrick Exp $ */
 /*
  * Copyright (c) 2010-2016 Broadcom Corporation
  * Copyright (c) 2016,2017 Patrick Wildt <patr...@blueri.se>
@@ -50,13 +50,24 @@
 #define  BWFM_CHIP_REG_CAPABILITIES_PMU			0x10000000
 #define BWFM_CHIP_REG_CAPABILITIES_EXT		0x000000AC
 #define  BWFM_CHIP_REG_CAPABILITIES_EXT_AOB_PRESENT	0x00000040
+#define BWFM_CHIP_REG_WATCHDOG			0x00000080
 #define BWFM_CHIP_REG_EROMPTR			0x000000FC
+#define BWFM_CHIP_REG_SR_CAPABILITY		0x00000500
+#define BWFM_CHIP_REG_SR_CONTROL0		0x00000504
+#define BWFM_CHIP_REG_SR_CONTROL1		0x00000508
 #define BWFM_CHIP_REG_PMUCONTROL		0x00000600
 #define  BWFM_CHIP_REG_PMUCONTROL_RES_MASK		0x00006000
 #define  BWFM_CHIP_REG_PMUCONTROL_RES_SHIFT		13
 #define  BWFM_CHIP_REG_PMUCONTROL_RES_RELOAD		0x2
 #define BWFM_CHIP_REG_PMUCAPABILITIES		0x00000604
 #define  BWFM_CHIP_REG_PMUCAPABILITIES_REV_MASK		0x000000ff
+#define BWFM_CHIP_REG_PMUCAPABILITIES_EXT	0x0000064C
+#define  BWFM_CHIP_REG_PMUCAPABILITIES_SR_SUPP		(1 << 1)
+#define BWFM_CHIP_REG_CHIPCONTROL_ADDR		0x00000650
+#define BWFM_CHIP_REG_CHIPCONTROL_DATA		0x00000654
+#define BWFM_CHIP_REG_RETENTION_CTL		0x00000670
+#define  BWFM_CHIP_REG_RETENTION_CTL_MACPHY_DIS		(1 << 26)
+#define  BWFM_CHIP_REG_RETENTION_CTL_LOGIC_DIS		(1 << 27)
 
 /* Agent registers */
 #define BWFM_AGENT_IOCTL			0x0408
@@ -65,6 +76,7 @@
 #define  BWFM_AGENT_IOCTL_CORE_BITS			0x3FFC
 #define  BWFM_AGENT_IOCTL_PME_EN			0x4000
 #define  BWFM_AGENT_IOCTL_BIST_EN			0x8000
+#define  BWFM_AGENT_IOCTL_ARMCR4_CPUHALT		0x0020
 #define BWFM_AGENT_RESET_CTL			0x0800
 #define  BWFM_AGENT_RESET_CTL_RESET			0x0001
 
@@ -75,16 +87,46 @@
 #define BWFM_AGENT_CORE_PMU			0x827
 #define BWFM_AGENT_CORE_SDIO_DEV		0x829
 #define BWFM_AGENT_CORE_ARM_CM3			0x82A
+#define BWFM_AGENT_CORE_PCIE2			0x83C
 #define BWFM_AGENT_CORE_ARM_CR4			0x83E
 #define BWFM_AGENT_CORE_ARM_CA7			0x847
+#define BWFM_AGENT_SYS_MEM			0x849
 
 /* Specific Core Bits */
 #define BWFM_AGENT_ARMCR4_IOCTL_CPUHALT		0x0020
 #define BWFM_AGENT_D11_IOCTL_PHYCLOCKEN		0x0004
 #define BWFM_AGENT_D11_IOCTL_PHYRESET		0x0008
 
+/* CR4 registers */
+#define BWFM_ARMCR4_CAP				0x0004
+#define  BWFM_ARMCR4_CAP_TCBANB_MASK			0xf
+#define  BWFM_ARMCR4_CAP_TCBANB_SHIFT			0
+#define  BWFM_ARMCR4_CAP_TCBBNB_MASK			0xf0
+#define  BWFM_ARMCR4_CAP_TCBBNB_SHIFT			4
+#define BWFM_ARMCR4_BANKIDX			0x0040
+#define BWFM_ARMCR4_BANKINFO			0x0044
+#define  BWFM_ARMCR4_BANKINFO_BSZ_MASK			0x3f
+#define  BWFM_ARMCR4_BANKINFO_BSZ_MULT			8192
+#define BWFM_ARMCR4_BANKPDA			0x004C
+
 /* SOCRAM registers */
+#define BWFM_SOCRAM_COREINFO			0x0000
+#define  BWFM_SOCRAM_COREINFO_SRBSZ_BASE		14
+#define  BWFM_SOCRAM_COREINFO_SRBSZ_MASK		0xf
+#define  BWFM_SOCRAM_COREINFO_SRBSZ_SHIFT		0
+#define  BWFM_SOCRAM_COREINFO_SRNB_MASK			0xf0
+#define  BWFM_SOCRAM_COREINFO_SRNB_SHIFT		4
+#define  BWFM_SOCRAM_COREINFO_LSS_MASK			0xf00000
+#define  BWFM_SOCRAM_COREINFO_LSS_SHIFT			20
 #define BWFM_SOCRAM_BANKIDX			0x0010
+#define  BWFM_SOCRAM_BANKIDX_MEMTYPE_RAM		0
+#define  BWFM_SOCRAM_BANKIDX_MEMTYPE_ROM		1
+#define  BWFM_SOCRAM_BANKIDX_MEMTYPE_DEVRAM		2
+#define  BWFM_SOCRAM_BANKIDX_MEMTYPE_SHIFT		8
+#define BWFM_SOCRAM_BANKINFO			0x0040
+#define  BWFM_SOCRAM_BANKINFO_SZBASE			8192
+#define  BWFM_SOCRAM_BANKINFO_SZMASK			0x7f
+#define  BWFM_SOCRAM_BANKINFO_RETNTRAM_MASK		0x10000
 #define BWFM_SOCRAM_BANKPDA			0x0044
 
 /* SDPCMD registers */
@@ -140,6 +182,13 @@
 #define BWFM_AUTH_OPEN				0
 #define BWFM_AUTH_SHARED_KEY			1
 #define BWFM_AUTH_AUTO				2
+#define BWFM_CRYPTO_ALGO_OFF			0
+#define BWFM_CRYPTO_ALGO_WEP1			1
+#define BWFM_CRYPTO_ALGO_TKIP			2
+#define BWFM_CRYPTO_ALGO_WEP128			3
+#define BWFM_CRYPTO_ALGO_AES_CCM		4
+#define BWFM_CRYPTO_ALGO_AES_RESERVED1		5
+#define BWFM_CRYPTO_ALGO_AES_RESERVED2		6
 #define BWFM_MFP_NONE				0
 #define BWFM_MFP_CAPABLE			1
 #define BWFM_MFP_REQUIRED			2
@@ -156,6 +205,59 @@
 #define BWFM_WSEC_TKIP				(1 << 1)
 #define BWFM_WSEC_AES				(1 << 2)
 
+/* Channel Parameters */
+#define BWFM_CHANSPEC_CHAN_MASK			0xff
+#define BWFM_CHANSPEC_CHAN_SHIFT		0
+#define BWFM_CHANSPEC_D11N_SB_L			(0x1 << 8) /* control lower */
+#define BWFM_CHANSPEC_D11N_SB_U			(0x2 << 8) /* control lower */
+#define BWFM_CHANSPEC_D11N_SB_N			(0x3 << 8) /* none */
+#define BWFM_CHANSPEC_D11N_SB_MASK		(0x3 << 8)
+#define BWFM_CHANSPEC_D11N_SB_SHIFT		8
+#define BWFM_CHANSPEC_D11N_BW_10		(0x1 << 10)
+#define BWFM_CHANSPEC_D11N_BW_20		(0x2 << 10)
+#define BWFM_CHANSPEC_D11N_BW_40		(0x3 << 10)
+#define BWFM_CHANSPEC_D11N_BW_MASK		(0x3 << 10)
+#define BWFM_CHANSPEC_D11N_BW_SHIFT		10
+#define BWFM_CHANSPEC_D11N_BND_5G		(0x1 << 12)
+#define BWFM_CHANSPEC_D11N_BND_2G		(0x2 << 12)
+#define BWFM_CHANSPEC_D11N_BND_MASK		(0x3 << 12)
+#define BWFM_CHANSPEC_D11N_BND_SHIFT		12
+#define BWFM_CHANSPEC_D11AC_SB_LLL		(0x0 << 8)
+#define BWFM_CHANSPEC_D11AC_SB_LLU		(0x1 << 8)
+#define BWFM_CHANSPEC_D11AC_SB_LUL		(0x2 << 8)
+#define BWFM_CHANSPEC_D11AC_SB_LUU		(0x3 << 8)
+#define BWFM_CHANSPEC_D11AC_SB_ULL		(0x4 << 8)
+#define BWFM_CHANSPEC_D11AC_SB_ULU		(0x5 << 8)
+#define BWFM_CHANSPEC_D11AC_SB_UUL		(0x6 << 8)
+#define BWFM_CHANSPEC_D11AC_SB_UUU		(0x7 << 8)
+#define BWFM_CHANSPEC_D11AC_SB_MASK		(0x7 << 8)
+#define BWFM_CHANSPEC_D11AC_SB_SHIFT		8
+#define BWFM_CHANSPEC_D11AC_BW_5		(0x0 << 11)
+#define BWFM_CHANSPEC_D11AC_BW_10		(0x1 << 11)
+#define BWFM_CHANSPEC_D11AC_BW_20		(0x2 << 11)
+#define BWFM_CHANSPEC_D11AC_BW_40		(0x3 << 11)
+#define BWFM_CHANSPEC_D11AC_BW_80		(0x4 << 11)
+#define BWFM_CHANSPEC_D11AC_BW_160		(0x5 << 11)
+#define BWFM_CHANSPEC_D11AC_BW_8080		(0x6 << 11)
+#define BWFM_CHANSPEC_D11AC_BW_MASK		(0x7 << 11)
+#define BWFM_CHANSPEC_D11AC_BW_SHIFT		11
+#define BWFM_CHANSPEC_D11AC_BND_2G		(0x0 << 14)
+#define BWFM_CHANSPEC_D11AC_BND_3G		(0x1 << 14)
+#define BWFM_CHANSPEC_D11AC_BND_4G		(0x2 << 14)
+#define BWFM_CHANSPEC_D11AC_BND_5G		(0x3 << 14)
+#define BWFM_CHANSPEC_D11AC_BND_MASK		(0x3 << 14)
+#define BWFM_CHANSPEC_D11AC_BND_SHIFT		14
+
+#define BWFM_BAND_AUTO				0
+#define BWFM_BAND_5G				1
+#define BWFM_BAND_2G				2
+#define BWFM_BAND_ALL				3
+
+/* Power Modes */
+#define BWFM_PM_CAM				0
+#define BWFM_PM_PS				1
+#define BWFM_PM_FAST_PS				2
+
 /* DCMD commands */
 #define BWFM_C_GET_VERSION			1
 #define BWFM_C_UP				2
@@ -300,6 +402,9 @@ struct bwfm_scan_params {
 	uint8_t bss_type;
 #define DOT11_BSSTYPE_ANY		2
 	uint8_t scan_type;
+#define BWFM_SCANTYPE_ACTIVE		0
+#define BWFM_SCANTYPE_PASSIVE		1
+#define BWFM_SCANTYPE_DEFAULT		0xff
 	uint32_t nprobes;
 	uint32_t active_time;
 	uint32_t passive_time;

Index: src/sys/dev/ic/bwfmvar.h
diff -u src/sys/dev/ic/bwfmvar.h:1.1 src/sys/dev/ic/bwfmvar.h:1.2
--- src/sys/dev/ic/bwfmvar.h:1.1	Thu Oct 19 23:58:41 2017
+++ src/sys/dev/ic/bwfmvar.h	Fri May 11 07:41:11 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: bwfmvar.h,v 1.1 2017/10/19 23:58:41 jmcneill Exp $ */
+/* $NetBSD: bwfmvar.h,v 1.2 2018/05/11 07:41:11 maya Exp $ */
 /* $OpenBSD: bwfmvar.h,v 1.1 2017/10/11 17:19:50 patrick Exp $ */
 /*
  * Copyright (c) 2010-2016 Broadcom Corporation
@@ -17,6 +17,8 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#include <sys/pcq.h>
+
 /* Chipcommon Core Chip IDs */
 #define BRCM_CC_43143_CHIP_ID		43143
 #define BRCM_CC_43235_CHIP_ID		43235
@@ -33,7 +35,9 @@
 #define BRCM_CC_4339_CHIP_ID		0x4339
 #define BRCM_CC_43430_CHIP_ID		43430
 #define BRCM_CC_4345_CHIP_ID		0x4345
+#define BRCM_CC_43465_CHIP_ID		43465
 #define BRCM_CC_4350_CHIP_ID		0x4350
+#define BRCM_CC_43525_CHIP_ID		43525
 #define BRCM_CC_4354_CHIP_ID		0x4354
 #define BRCM_CC_4356_CHIP_ID		0x4356
 #define BRCM_CC_43566_CHIP_ID		43566
@@ -46,6 +50,7 @@
 #define BRCM_CC_4365_CHIP_ID		0x4365
 #define BRCM_CC_4366_CHIP_ID		0x4366
 #define BRCM_CC_4371_CHIP_ID		0x4371
+#define CY_CC_4373_CHIP_ID		0x4373
 
 /* Defaults */
 #define BWFM_DEFAULT_SCAN_CHANNEL_TIME	40
@@ -87,6 +92,7 @@ struct bwfm_chip {
 struct bwfm_bus_ops {
 	void (*bs_init)(struct bwfm_softc *);
 	void (*bs_stop)(struct bwfm_softc *);
+	int (*bs_txcheck)(struct bwfm_softc *);
 	int (*bs_txdata)(struct bwfm_softc *, struct mbuf *);
 	int (*bs_txctl)(struct bwfm_softc *, char *, size_t);
 	int (*bs_rxctl)(struct bwfm_softc *, char *, size_t *);
@@ -98,7 +104,7 @@ struct bwfm_buscore_ops {
 	int (*bc_prepare)(struct bwfm_softc *);
 	int (*bc_reset)(struct bwfm_softc *);
 	int (*bc_setup)(struct bwfm_softc *);
-	void (*bc_activate)(struct bwfm_softc *, uint32_t);
+	void (*bc_activate)(struct bwfm_softc *, const uint32_t);
 };
 
 struct bwfm_proto_ops {
@@ -163,8 +169,15 @@ struct bwfm_softc {
 };
 
 void bwfm_attach(struct bwfm_softc *);
+void bwfm_chip_socram_ramsize(struct bwfm_softc *, struct bwfm_core *);
+void bwfm_chip_sysmem_ramsize(struct bwfm_softc *, struct bwfm_core *);
+void bwfm_chip_tcm_ramsize(struct bwfm_softc *, struct bwfm_core *);
+void bwfm_chip_tcm_rambase(struct bwfm_softc *);
+void bwfm_start(struct ifnet *);
 int bwfm_detach(struct bwfm_softc *, int);
 int bwfm_chip_attach(struct bwfm_softc *);
+int bwfm_chip_set_active(struct bwfm_softc *, uint32_t);
+void bwfm_chip_set_passive(struct bwfm_softc *);
 struct bwfm_core *bwfm_chip_get_core(struct bwfm_softc *, int);
 struct bwfm_core *bwfm_chip_get_pmu(struct bwfm_softc *);
-void bwfm_rx(struct bwfm_softc *, char *, size_t);
+void bwfm_rx(struct bwfm_softc *, struct mbuf *m);

Index: src/sys/dev/sdmmc/if_bwfm_sdio.c
diff -u src/sys/dev/sdmmc/if_bwfm_sdio.c:1.2 src/sys/dev/sdmmc/if_bwfm_sdio.c:1.3
--- src/sys/dev/sdmmc/if_bwfm_sdio.c:1.2	Sun Mar 11 00:17:28 2018
+++ src/sys/dev/sdmmc/if_bwfm_sdio.c	Fri May 11 07:41:11 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: if_bwfm_sdio.c,v 1.2 2018/03/11 00:17:28 khorben Exp $ */
+/* $NetBSD: if_bwfm_sdio.c,v 1.3 2018/05/11 07:41:11 maya Exp $ */
 /* $OpenBSD: if_bwfm_sdio.c,v 1.1 2017/10/11 17:19:50 patrick Exp $ */
 /*
  * Copyright (c) 2010-2016 Broadcom Corporation
@@ -87,6 +87,7 @@ void		 bwfm_sdio_buscore_write(struct bw
 int		 bwfm_sdio_buscore_prepare(struct bwfm_softc *);
 void		 bwfm_sdio_buscore_activate(struct bwfm_softc *, uint32_t);
 
+int		 bwfm_sdio_txcheck(struct bwfm_softc *);
 int		 bwfm_sdio_txdata(struct bwfm_softc *, struct mbuf *);
 int		 bwfm_sdio_txctl(struct bwfm_softc *, char *, size_t);
 int		 bwfm_sdio_rxctl(struct bwfm_softc *, char *, size_t *);
@@ -94,6 +95,7 @@ int		 bwfm_sdio_rxctl(struct bwfm_softc 
 struct bwfm_bus_ops bwfm_sdio_bus_ops = {
 	.bs_init = NULL,
 	.bs_stop = NULL,
+	.bs_txcheck = bwfm_sdio_txcheck,
 	.bs_txdata = bwfm_sdio_txdata,
 	.bs_txctl = bwfm_sdio_txctl,
 	.bs_rxctl = bwfm_sdio_rxctl,
@@ -405,6 +407,15 @@ bwfm_sdio_buscore_activate(struct bwfm_s
 }
 
 int
+bwfm_sdio_txcheck(struct bwfm_softc *bwfm, struct mbuf *m)
+{
+	DPRINTFN(2, ("%s: %s\n", DEVNAME(sc), __func__));
+
+	return 0;
+}
+
+
+int
 bwfm_sdio_txdata(struct bwfm_softc *bwfm, struct mbuf *m)
 {
 #ifdef BWFM_DEBUG

Index: src/sys/dev/usb/if_bwfm_usb.c
diff -u src/sys/dev/usb/if_bwfm_usb.c:1.4 src/sys/dev/usb/if_bwfm_usb.c:1.5
--- src/sys/dev/usb/if_bwfm_usb.c:1.4	Sun Jan 21 13:57:11 2018
+++ src/sys/dev/usb/if_bwfm_usb.c	Fri May 11 07:41:11 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: if_bwfm_usb.c,v 1.4 2018/01/21 13:57:11 skrll Exp $ */
+/* $NetBSD: if_bwfm_usb.c,v 1.5 2018/05/11 07:41:11 maya Exp $ */
 /* $OpenBSD: if_bwfm_usb.c,v 1.2 2017/10/15 14:55:13 patrick Exp $ */
 /*
  * Copyright (c) 2010-2016 Broadcom Corporation
@@ -199,16 +199,19 @@ void		 bwfm_usb_free_rx_list(struct bwfm
 int		 bwfm_usb_alloc_tx_list(struct bwfm_usb_softc *);
 void		 bwfm_usb_free_tx_list(struct bwfm_usb_softc *);
 
+int		 bwfm_usb_txcheck(struct bwfm_softc *);
 int		 bwfm_usb_txdata(struct bwfm_softc *, struct mbuf *);
 int		 bwfm_usb_txctl(struct bwfm_softc *, char *, size_t);
 int		 bwfm_usb_rxctl(struct bwfm_softc *, char *, size_t *);
 
+struct mbuf *	 bwfm_usb_newbuf(void);
 void		 bwfm_usb_rxeof(struct usbd_xfer *, void *, usbd_status);
 void		 bwfm_usb_txeof(struct usbd_xfer *, void *, usbd_status);
 
 struct bwfm_bus_ops bwfm_usb_bus_ops = {
 	.bs_init = NULL,
 	.bs_stop = NULL,
+	.bs_txcheck = bwfm_usb_txcheck,
 	.bs_txdata = bwfm_usb_txdata,
 	.bs_txctl = bwfm_usb_txctl,
 	.bs_rxctl = bwfm_usb_rxctl,
@@ -435,6 +438,26 @@ bwfm_usb_attachhook(device_t self)
 	}
 }
 
+struct mbuf *
+bwfm_usb_newbuf(void)
+{
+	struct mbuf *m;
+
+	MGETHDR(m, M_DONTWAIT, MT_DATA);
+	if (m == NULL)
+		return (NULL);
+
+	MCLGET(m, M_DONTWAIT);
+	if (!(m->m_flags & M_EXT)) {
+		m_freem(m);
+		return (NULL);
+	}
+
+	m->m_len = m->m_pkthdr.len = MCLBYTES;
+
+	return (m);
+}
+
 void
 bwfm_usb_rxeof(struct usbd_xfer *xfer, void *priv, usbd_status status)
 {
@@ -443,6 +466,7 @@ bwfm_usb_rxeof(struct usbd_xfer *xfer, v
 	struct bwfm_proto_bcdc_hdr *hdr;
 	usbd_status error;
 	uint32_t len, off;
+	struct mbuf *m;
 
 	DPRINTFN(2, ("%s: %s status %s\n", DEVNAME(sc), __func__,
 	    usbd_errstr(status)));
@@ -466,8 +490,14 @@ bwfm_usb_rxeof(struct usbd_xfer *xfer, v
 	len -= hdr->data_offset << 2;
 	off += hdr->data_offset << 2;
 
-	mutex_enter(&sc->sc_rx_lock);
-	bwfm_rx(&sc->sc_sc, &data->buf[off], len);
+	m = bwfm_usb_newbuf();
+	if (m == NULL)
+		goto resubmit;
+
+	memcpy(mtod(m, char *), data->buf + off, len);
+	m->m_len = m->m_pkthdr.len = len;
+	mutex_enter(&sc->sc_rx_lock); /* XXX */
+	bwfm_rx(&sc->sc_sc, m);
 	mutex_exit(&sc->sc_rx_lock);
 
 resubmit:
@@ -735,6 +765,23 @@ err:
 }
 
 int
+bwfm_usb_txcheck(struct bwfm_softc *bwfm)
+{
+	struct bwfm_usb_softc *sc = (void *)bwfm;
+
+	mutex_enter(&sc->sc_tx_lock);
+
+	if (TAILQ_EMPTY(&sc->sc_tx_free_list)) {
+		mutex_exit(&sc->sc_tx_lock);
+		return ENOBUFS;
+	}
+
+	mutex_exit(&sc->sc_tx_lock);
+	return 0;
+}
+
+
+int
 bwfm_usb_txdata(struct bwfm_softc *bwfm, struct mbuf *m)
 {
 	struct bwfm_usb_softc *sc = (void *)bwfm;

Reply via email to