24#include <sys/kernel.h>
25#include <sys/endian.h>
26#include <sys/firmware.h>
27#include <sys/linker.h>
29#include <sys/malloc.h>
30#include <sys/module.h>
31#include <sys/socket.h>
32#include <sys/sockio.h>
33#include <sys/sysctl.h>
36#include <net/if_var.h>
37#include <net/if_arp.h>
38#include <net/ethernet.h>
40#include <net/if_media.h>
41#include <net/if_types.h>
45#include <net80211/ieee80211_var.h>
46#include <net80211/ieee80211_phy.h>
47#include <net80211/ieee80211_radiotap.h>
48#include <net80211/ieee80211_regdomain.h>
75static SYSCTL_NODE(_hw, OID_AUTO, upgt, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
76 "USB PrismGT GW3887 driver parameters");
81 0,
"control debugging printfs");
83 UPGT_DEBUG_XMIT = 0x00000001,
84 UPGT_DEBUG_RECV = 0x00000002,
85 UPGT_DEBUG_RESET = 0x00000004,
86 UPGT_DEBUG_INTR = 0x00000008,
87 UPGT_DEBUG_TX_PROC = 0x00000010,
88 UPGT_DEBUG_RX_PROC = 0x00000020,
89 UPGT_DEBUG_STATE = 0x00000040,
90 UPGT_DEBUG_STAT = 0x00000080,
91 UPGT_DEBUG_FW = 0x00000100,
92 UPGT_DEBUG_ANY = 0xffffffff
94#define DPRINTF(sc, m, fmt, ...) do { \
95 if (sc->sc_debug & (m)) \
96 printf(fmt, __VA_ARGS__); \
99#define DPRINTF(sc, m, fmt, ...) do { \
134static int upgt_transmit(
struct ieee80211com *,
struct mbuf *);
136static int upgt_raw_xmit(
struct ieee80211_node *,
struct mbuf *,
137 const struct ieee80211_bpf_params *);
142 const char [IFNAMSIZ],
int,
enum ieee80211_opmode,
int,
143 const uint8_t [IEEE80211_ADDR_LEN],
144 const uint8_t [IEEE80211_ADDR_LEN]);
152static int upgt_newstate(
struct ieee80211vap *,
enum ieee80211_state,
int);
170 struct ieee80211_node *,
struct upgt_data *);
175#define UPGT_DEV(v,p) { USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p) }
207 .force_short_xfer = 1,
245 struct ieee80211com *ic = &sc->
sc_ic;
247 uint8_t bands[IEEE80211_MODE_BYTES];
258 mtx_init(&sc->
sc_mtx, device_get_nameunit(sc->
sc_dev), MTX_NETWORK_LOCK,
262 mbufq_init(&sc->
sc_snd, ifqmaxlen);
267 device_printf(
dev,
"could not allocate USB transfers, "
296 "could not find memory space addresses on FW\n");
303 DPRINTF(sc, UPGT_DEBUG_FW,
"memory address frame start=0x%08x\n",
305 DPRINTF(sc, UPGT_DEBUG_FW,
"memory address frame end=0x%08x\n",
307 DPRINTF(sc, UPGT_DEBUG_FW,
"memory address rx start=0x%08x\n",
329 ic->ic_name = device_get_nameunit(
dev);
330 ic->ic_phytype = IEEE80211_T_OFDM;
331 ic->ic_opmode = IEEE80211_M_STA;
335 | IEEE80211_C_MONITOR
336 | IEEE80211_C_SHPREAMBLE
342 memset(bands, 0,
sizeof(bands));
343 setbit(bands, IEEE80211_MODE_11B);
344 setbit(bands, IEEE80211_MODE_11G);
345 ieee80211_init_channels(ic, NULL, bands);
347 ieee80211_ifattach(ic);
358 ieee80211_radiotap_attach(ic,
367 ieee80211_announce(ic);
374fail1: mtx_destroy(&sc->
sc_mtx);
385 ieee80211_tx_complete(
data->ni,
data->m, 0);
399 if (data_cmd == NULL) {
400 device_printf(sc->
sc_dev,
"%s: out of buffers.\n", __func__);
407 memset(data_cmd->
buf, 0, MCLBYTES);
424 data_cmd->
buflen =
sizeof(*mem) +
sizeof(*stats);
427 data_cmd->
buflen -
sizeof(*mem));
443 if (ic->ic_nrunning > 0) {
445 if (ic->ic_allmulti > 0 || ic->ic_promisc > 0)
455 ieee80211_start_all(ic);
469 sc->
sc_flags &= ~UPGT_FLAG_INITDONE;
480 if (data_cmd == NULL) {
481 device_printf(sc->
sc_dev,
"%s: out of buffers.\n", __func__);
488 memset(data_cmd->
buf, 0, MCLBYTES);
520 if (sc->
sc_state != IEEE80211_S_RUN) {
542 data_cmd->
buflen =
sizeof(*mem) +
sizeof(*led);
545 data_cmd->
buflen -
sizeof(*mem));
580 struct ieee80211com *ic = &sc->
sc_ic;
581 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
582 struct ieee80211_node *ni;
590 if (data_cmd == NULL) {
591 device_printf(sc->
sc_dev,
"out of TX buffers.\n");
598 memset(data_cmd->
buf, 0, MCLBYTES);
617 case IEEE80211_S_INIT:
618 DPRINTF(sc, UPGT_DEBUG_STATE,
"%s: set MAC filter to INIT\n",
622 case IEEE80211_S_SCAN:
624 "set MAC filter to SCAN (bssid %s)\n",
625 ether_sprintf(ieee80211broadcastaddr));
627 IEEE80211_ADDR_COPY(filter->
dst,
628 vap ? vap->iv_myaddr : ic->ic_macaddr);
629 IEEE80211_ADDR_COPY(filter->
src, ieee80211broadcastaddr);
636 case IEEE80211_S_RUN:
637 ni = ieee80211_ref_node(vap->iv_bss);
639 if (vap->iv_opmode == IEEE80211_M_MONITOR) {
641 IEEE80211_ADDR_COPY(filter->
dst,
642 vap ? vap->iv_myaddr : ic->ic_macaddr);
643 IEEE80211_ADDR_COPY(filter->
src, ni->ni_bssid);
651 "set MAC filter to RUN (bssid %s)\n",
652 ether_sprintf(ni->ni_bssid));
654 IEEE80211_ADDR_COPY(filter->
dst,
655 vap ? vap->iv_myaddr : ic->ic_macaddr);
656 IEEE80211_ADDR_COPY(filter->
src, ni->ni_bssid);
663 ieee80211_free_node(ni);
667 "MAC filter does not know that state\n");
671 data_cmd->
buflen =
sizeof(*mem) +
sizeof(*filter);
674 data_cmd->
buflen -
sizeof(*mem));
685 const struct ieee80211_txparam *tp;
697 const uint8_t rateset_auto_11b[] =
698 { 0x13, 0x13, 0x12, 0x11, 0x11, 0x10, 0x10, 0x10 };
699 const uint8_t rateset_auto_11g[] =
700 { 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x04, 0x01 };
701 const uint8_t rateset_fix_11bg[] =
702 { 0x10, 0x11, 0x12, 0x13, 0x01, 0x04, 0x06, 0x07,
703 0x08, 0x09, 0x0a, 0x0b };
705 tp = &vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)];
708 if (tp->ucastrate == IEEE80211_FIXED_RATE_NONE) {
714 if (ic->ic_curmode == IEEE80211_MODE_11B)
717 if (ic->ic_curmode == IEEE80211_MODE_11G ||
718 ic->ic_curmode == IEEE80211_MODE_AUTO)
761 struct ieee80211_node *ni;
769 while ((m = mbufq_dequeue(&sc->
sc_snd)) != NULL) {
771 if (data_tx == NULL) {
772 mbufq_prepend(&sc->
sc_snd, m);
776 ni = (
struct ieee80211_node *)m->m_pkthdr.rcvif;
777 m->m_pkthdr.rcvif = NULL;
780 if_inc_counter(ni->ni_vap->iv_ifp,
781 IFCOUNTER_OERRORS, 1);
784 ieee80211_free_node(ni);
793 const struct ieee80211_bpf_params *params)
795 struct ieee80211com *ic = ni->ni_ic;
808 if (data_tx == NULL) {
830 struct ieee80211com *ic = &sc->
sc_ic;
834 device_printf(sc->
sc_dev,
"watchdog timeout\n");
836 counter_u64_add(ic->ic_oerrors, 1);
883 struct ieee80211com *ic = &sc->
sc_ic;
891 channel = ieee80211_chan2ieee(ic, c);
892 if (channel == 0 || channel == IEEE80211_CHAN_ANY) {
895 "%s: invalid channel %x\n", __func__, channel);
899 DPRINTF(sc, UPGT_DEBUG_STATE,
"%s: channel %d\n", __func__, channel);
902 if (data_cmd == NULL) {
903 device_printf(sc->
sc_dev,
"%s: out of buffers.\n", __func__);
909 memset(data_cmd->
buf, 0, MCLBYTES);
919 chan->header1.len = htole16(
924 chan->header2.flags = 0;
933 sizeof(
chan->freq3_1));
937 sizeof(
chan->freq3_2));
939 data_cmd->
buflen =
sizeof(*mem) +
sizeof(*chan);
942 data_cmd->
buflen -
sizeof(*mem));
947static struct ieee80211vap *
949 enum ieee80211_opmode opmode,
int flags,
950 const uint8_t bssid[IEEE80211_ADDR_LEN],
951 const uint8_t mac[IEEE80211_ADDR_LEN])
954 struct ieee80211vap *vap;
956 if (!TAILQ_EMPTY(&ic->ic_vaps))
958 uvp = malloc(
sizeof(
struct upgt_vap), M_80211_VAP, M_WAITOK | M_ZERO);
962 if (ieee80211_vap_setup(ic, vap,
name, unit, opmode,
963 flags | IEEE80211_CLONE_NOBEACONS, bssid) != 0) {
965 free(uvp, M_80211_VAP);
977 ieee80211_vap_attach(vap, ieee80211_media_change,
978 ieee80211_media_status, mac);
979 ic->ic_opmode = opmode;
984upgt_newstate(
struct ieee80211vap *vap,
enum ieee80211_state nstate,
int arg)
987 struct ieee80211com *ic = vap->iv_ic;
993 IEEE80211_UNLOCK(ic);
999 case IEEE80211_S_INIT:
1004 case IEEE80211_S_SCAN:
1007 case IEEE80211_S_AUTH:
1010 case IEEE80211_S_ASSOC:
1012 case IEEE80211_S_RUN:
1021 return (uvp->
newstate(vap, nstate, arg));
1029 ieee80211_vap_detach(
vap);
1030 free(uvp, M_80211_VAP);
1044 struct ieee80211com *ic = &sc->
sc_ic;
1047 uint16_t option_len;
1048 uint16_t option_type;
1049 uint16_t preamble_len;
1058 while (!option_end) {
1067 (le16toh(eeprom_option->
len) - 1) *
sizeof(uint16_t);
1069 le16toh(eeprom_option->
type);
1075 switch (option_type) {
1078 "EEPROM name len=%d\n", option_len);
1082 "EEPROM serial len=%d\n", option_len);
1086 "EEPROM mac len=%d\n", option_len);
1088 IEEE80211_ADDR_COPY(ic->ic_macaddr,
1089 eeprom_option->
data);
1093 "EEPROM hwrx len=%d\n", option_len);
1099 "EEPROM chip len=%d\n", option_len);
1103 "EEPROM freq3 len=%d\n", option_len);
1110 "EEPROM freq4 len=%d\n", option_len);
1117 "EEPROM freq5 len=%d\n", option_len);
1121 "EEPROM freq6 len=%d\n", option_len);
1128 "EEPROM end len=%d\n", option_len);
1133 "%s: EEPROM off without end option\n", __func__);
1137 "EEPROM unknown type 0x%04x len=%d\n",
1138 option_type, option_len);
1144 (eeprom_option->
data + option_len);
1162 flags = freq3_header->
flags;
1165 DPRINTF(sc, UPGT_DEBUG_FW,
"flags=0x%02x elements=%d\n",
1171 for (i = 0; i < elements; i++) {
1172 channel = ieee80211_mhz2ieee(le16toh(freq3[i].
freq), 0);
1173 if (channel >= IEEE80211_CHAN_MAX)
1178 DPRINTF(sc, UPGT_DEBUG_FW,
"frequence=%d, channel=%d\n",
1198 flags = freq4_header->
flags;
1205 DPRINTF(sc, UPGT_DEBUG_FW,
"flags=0x%02x elements=%d settings=%d\n",
1206 flags, elements, settings);
1211 for (i = 0; i < elements; i++) {
1212 channel = ieee80211_mhz2ieee(le16toh(freq4_1[i].
freq), 0);
1213 if (channel >= IEEE80211_CHAN_MAX)
1217 for (j = 0; j < settings; j++) {
1222 DPRINTF(sc, UPGT_DEBUG_FW,
"frequence=%d, channel=%d\n",
1223 le16toh(freq4_1[i].freq), channel);
1238 DPRINTF(sc, UPGT_DEBUG_FW,
"elements=%d\n", elements);
1243 for (i = 0; i < elements; i++) {
1244 channel = ieee80211_mhz2ieee(le16toh(freq6[i].
freq), 0);
1245 if (channel >= IEEE80211_CHAN_MAX)
1250 DPRINTF(sc, UPGT_DEBUG_FW,
"frequence=%d, channel=%d\n",
1264 DPRINTF(sc, UPGT_DEBUG_FW,
"hwrx option value=0x%04x\n",
1283 "request EEPROM block (offset=%d, len=%d)\n",
offset, block);
1286 if (data_cmd == NULL) {
1294 memset(data_cmd->
buf, 0, MCLBYTES);
1312 eeprom->
len = htole16(block);
1314 data_cmd->
buflen =
sizeof(*mem) +
sizeof(*eeprom) + block;
1317 data_cmd->
buflen -
sizeof(*mem));
1320 error = mtx_sleep(sc, &sc->
sc_mtx, 0,
"eeprom_request", hz);
1322 device_printf(sc->
sc_dev,
1323 "timeout while waiting for EEPROM data\n");
1343 struct mbuf *m = NULL;
1360 (memcmp(
data->buf,
"OK", 2) == 0)) {
1379 uint16_t eeprom_offset = le16toh(eeprom->
offset);
1380 uint16_t eeprom_len = le16toh(eeprom->
len);
1383 "received EEPROM block (offset=%d, len=%d)\n",
1384 eeprom_offset, eeprom_len);
1386 memcpy(sc->sc_eeprom + eeprom_offset,
1394 DPRINTF(sc, UPGT_DEBUG_XMIT,
"%s: received 802.11 TX done\n",
1399 DPRINTF(sc, UPGT_DEBUG_RECV,
"%s: received 802.11 RX data\n",
1405 DPRINTF(sc, UPGT_DEBUG_STAT,
"%s: received statistic data\n",
1411 "received unknown frame type 0x%02x\n",
1427 for (i = 0; i <
size; i +=
sizeof(uint32_t)) {
1428 crc = htole32(crc ^ *buf++);
1429 crc = htole32((crc >> 5) ^ (crc << 3));
1438 struct ieee80211com *ic = &sc->
sc_ic;
1453 KASSERT((pkglen + ETHER_ALIGN) < MCLBYTES,
1454 (
"A current mbuf storage is small (%d)", pkglen + ETHER_ALIGN));
1455 m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
1457 device_printf(sc->
sc_dev,
"could not create RX mbuf\n");
1460 m_adj(m, ETHER_ALIGN);
1461 memcpy(mtod(m,
char *), rxdesc->
data, pkglen);
1463 m->m_len = m->m_pkthdr.len = pkglen - IEEE80211_CRC_LEN;
1465 if (ieee80211_radiotap_active(ic)) {
1473 DPRINTF(sc, UPGT_DEBUG_RX_PROC,
"%s: RX done\n", __func__);
1474 *rssi = rxdesc->
rssi;
1481 struct ieee80211com *ic = &sc->
sc_ic;
1482 static const uint8_t cck_upgt2rate[4] = { 2, 4, 11, 22 };
1483 static const uint8_t ofdm_upgt2rate[12] =
1484 { 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108 };
1486 if (ic->ic_curmode == IEEE80211_MODE_11B &&
1487 !(rate < 0 || rate > 3))
1488 return cck_upgt2rate[rate & 0xf];
1490 if (ic->ic_curmode == IEEE80211_MODE_11G &&
1491 !(rate < 0 || rate > 11))
1492 return ofdm_upgt2rate[rate & 0xf];
1510 if (data_tx->
addr == le32toh(
desc->header2.reqid)) {
1516 DPRINTF(sc, UPGT_DEBUG_TX_PROC,
1517 "TX done: memaddr=0x%08x, status=0x%04x, rssi=%d, ",
1518 le32toh(
desc->header2.reqid),
1519 le16toh(
desc->status), le16toh(
desc->rssi));
1520 DPRINTF(sc, UPGT_DEBUG_TX_PROC,
"seq=%d\n",
1521 le16toh(
desc->seq));
1547 device_printf(sc->
sc_dev,
1548 "could not free memory address 0x%08x\n",
addr);
1554 const struct firmware *fw;
1557 char start_fwload_cmd[] = { 0x3c, 0x0d };
1566 device_printf(sc->
sc_dev,
"could not read microcode %s\n",
1575 if (data_cmd == NULL) {
1579 data_cmd->
buflen =
sizeof(start_fwload_cmd);
1580 memcpy(data_cmd->
buf, start_fwload_cmd, data_cmd->
buflen);
1585 if (data_cmd == NULL) {
1593 x2->
len = htole32(fw->datasize);
1605 bsize = fw->datasize -
offset;
1608 if (data_cmd == NULL) {
1613 data_cmd->
buf, bsize);
1614 data_cmd->
buflen = bsize;
1617 DPRINTF(sc, UPGT_DEBUG_FW,
"FW offset=%zu, read=%d, sent=%d\n",
1621 DPRINTF(sc, UPGT_DEBUG_FW,
"%s: firmware downloaded\n", __func__);
1625 if (data_cmd == NULL) {
1630 *((uint32_t *)(data_cmd->
buf) ) = crc32;
1631 *((uint8_t *)(data_cmd->
buf) + 4) =
'g';
1632 *((uint8_t *)(data_cmd->
buf) + 5) =
'\r';
1638 error = mtx_sleep(sc, &sc->
sc_mtx, 0,
"upgtfw", 2 * hz);
1640 device_printf(sc->
sc_dev,
"firmware load failed\n");
1644 DPRINTF(sc, UPGT_DEBUG_FW,
"%s: firmware loaded\n", __func__);
1647 firmware_put(fw, FIRMWARE_UNLOAD);
1656 crc = ether_crc32_le(buf,
size);
1659 crc = htole32(
crc ^ 0xffffffffU);
1675 for (i = 0, j = 0; i <
size && j <
size; i++) {
1723 DPRINTF(sc, UPGT_DEBUG_FW,
"memory address page %d=0x%08x\n",
1736 const struct firmware *fw;
1741 uint32_t bra_option_type, bra_option_len;
1748 device_printf(sc->
sc_dev,
"could not read microcode %s\n",
1757 uc = (
const uint32_t *)((
const uint8_t *)fw->data +
offset);
1762 uc = (
const uint32_t *)((
const uint8_t *)fw->data +
offset);
1766 if (
offset == fw->datasize) {
1767 device_printf(sc->
sc_dev,
1768 "firmware Boot Record Area not found\n");
1774 "firmware Boot Record Area found at offset %zu\n",
offset);
1779 while (offset < fw->datasize && bra_end == 0) {
1781 p = (
const uint8_t *)fw->data +
offset;
1783 bra_option_type = le32toh(bra_opt->
type);
1784 bra_option_len = le32toh(bra_opt->
len) *
sizeof(*uc);
1786 switch (bra_option_type) {
1788 DPRINTF(sc, UPGT_DEBUG_FW,
"UPGT_BRA_TYPE_FW len=%d\n",
1792 device_printf(sc->
sc_dev,
1793 "wrong UPGT_BRA_TYPE_FW len\n");
1798 bra_option_len) == 0) {
1803 bra_option_len) == 0) {
1807 device_printf(sc->
sc_dev,
1808 "unsupported firmware type\n");
1813 "UPGT_BRA_TYPE_VERSION len=%d\n", bra_option_len);
1817 "UPGT_BRA_TYPE_DEPIF len=%d\n", bra_option_len);
1821 "UPGT_BRA_TYPE_EXPIF len=%d\n", bra_option_len);
1825 "UPGT_BRA_TYPE_DESCR len=%d\n", bra_option_len);
1835 "memory address space start=0x%08x\n",
1838 "memory address space end=0x%08x\n",
1842 DPRINTF(sc, UPGT_DEBUG_FW,
"UPGT_BRA_TYPE_END len=%d\n",
1847 DPRINTF(sc, UPGT_DEBUG_FW,
"unknown BRA option len=%d\n",
1857 DPRINTF(sc, UPGT_DEBUG_FW,
"%s: firmware verified", __func__);
1859 firmware_put(fw, FIRMWARE_UNLOAD);
1878 char init_cmd[] = { 0x7e, 0x7e, 0x7e, 0x7e };
1887 memcpy(
data->buf, init_cmd,
sizeof(init_cmd));
1888 data->buflen =
sizeof(init_cmd);
1893 DPRINTF(sc, UPGT_DEBUG_FW,
"%s: device initialized\n", __func__);
1936 struct ieee80211com *ic = &sc->
sc_ic;
1972 ieee80211_ifdetach(ic);
1973 mbufq_drain(&sc->
sc_snd);
1974 mtx_destroy(&sc->
sc_mtx);
2000 if (
data->ni != NULL)
2001 ieee80211_free_node(
data->ni);
2028#define UPGT_SYSCTL_STAT_ADD32(c, h, n, p, d) \
2029 SYSCTL_ADD_UINT(c, h, OID_AUTO, n, CTLFLAG_RD, p, 0, d)
2034 struct sysctl_ctx_list *ctx;
2035 struct sysctl_oid_list *
child;
2036 struct sysctl_oid *tree;
2040 ctx = device_get_sysctl_ctx(sc->
sc_dev);
2041 child = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->
sc_dev));
2043 tree = SYSCTL_ADD_NODE(ctx,
child, OID_AUTO,
"stats",
2044 CTLFLAG_RD | CTLFLAG_MPSAFE, NULL,
"UPGT statistics");
2045 child = SYSCTL_CHILDREN(tree);
2054#undef UPGT_SYSCTL_STAT_ADD32
2068 DPRINTF(sc, UPGT_DEBUG_XMIT,
"%s: %s\n", __func__,
2069 "out of xmit buffers");
2082 DPRINTF(sc, UPGT_DEBUG_XMIT,
"%s: stop queue\n", __func__);
2099 if (bf->
addr == 0) {
2100 DPRINTF(sc, UPGT_DEBUG_XMIT,
"%s: no free prism memory!\n",
2113 struct ieee80211vap *vap = ni->ni_vap;
2115 struct ieee80211_frame *wh;
2116 struct ieee80211_key *
k;
2127 wh = mtod(m,
struct ieee80211_frame *);
2128 if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
2129 k = ieee80211_crypto_encap(ni, m);
2131 device_printf(sc->
sc_dev,
2132 "ieee80211_crypto_encap returns NULL.\n");
2138 wh = mtod(m,
struct ieee80211_frame *);
2142 memset(
data->buf, 0, MCLBYTES);
2147 if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) ==
2148 IEEE80211_FC0_TYPE_MGT) {
2152 memset(txdesc->
rates, 0x10,
sizeof(txdesc->
rates));
2159 txdesc->
header1.
len = htole16(m->m_pkthdr.len);
2166 if (ieee80211_radiotap_active_vap(vap)) {
2172 ieee80211_radiotap_tx(vap, m);
2176 m_copydata(m, 0, m->m_pkthdr.len,
2177 data->buf + (
sizeof(*mem) +
sizeof(*txdesc)));
2179 len =
sizeof(*mem) +
sizeof(*txdesc) + m->m_pkthdr.len;
2188 DPRINTF(sc, UPGT_DEBUG_XMIT,
"%s: TX start data sending (%d bytes)\n",
2190 KASSERT(
len <= MCLBYTES, (
"mbuf is small for saving data"));
2199 if (!(vap->iv_ifp->if_get_counter(vap->iv_ifp, IFCOUNTER_OPACKETS) %
2210 struct ieee80211com *ic = &sc->
sc_ic;
2211 struct ieee80211_frame *wh;
2212 struct ieee80211_node *ni;
2213 struct epoch_tracker et;
2214 struct mbuf *m = NULL;
2247 wh = mtod(
m,
struct ieee80211_frame *);
2248 ni = ieee80211_find_rxnode(ic,
2249 (
struct ieee80211_frame_min *)wh);
2251 NET_EPOCH_ENTER(et);
2253 (void) ieee80211_input(
ni,
m, rssi, nf);
2255 ieee80211_free_node(
ni);
2257 (
void) ieee80211_input_all(ic,
m, rssi, nf);
2273 counter_u64_add(ic->ic_ierrors, 1);
2302 DPRINTF(sc, UPGT_DEBUG_XMIT,
"%s: empty pending queue\n",
2319 if (
data->ni != NULL) {
2320 if_inc_counter(
data->ni->ni_vap->iv_ifp,
2321 IFCOUNTER_OERRORS, 1);
2322 ieee80211_free_node(
data->ni);
SYSCTL_INT(_hw_usb_dwc_otg, OID_AUTO, phy_type, CTLFLAG_RDTUN, &dwc_otg_phy_type, 0, "DWC OTG PHY TYPE - 0/1/2/3 - ULPI/HSIC/INTERNAL/UTMI+")
static void upgt_abort_xfers(struct upgt_softc *)
static int upgt_set_macfilter(struct upgt_softc *, uint8_t)
static int upgt_raw_xmit(struct ieee80211_node *, struct mbuf *, const struct ieee80211_bpf_params *)
USB_PNP_HOST_INFO(upgt_devs)
static int upgt_mem_init(struct upgt_softc *)
static int upgt_tx_start(struct upgt_softc *, struct mbuf *, struct ieee80211_node *, struct upgt_data *)
static int upgt_transmit(struct ieee80211com *, struct mbuf *)
static int upgt_fw_verify(struct upgt_softc *)
static struct upgt_data * upgt_gettxbuf(struct upgt_softc *)
static void upgt_scan_start(struct ieee80211com *)
static struct upgt_data * upgt_getbuf(struct upgt_softc *)
static struct upgt_data * _upgt_getbuf(struct upgt_softc *sc)
static void upgt_scan_end(struct ieee80211com *)
static uint8_t upgt_rx_rate(struct upgt_softc *, const int)
#define UPGT_SYSCTL_STAT_ADD32(c, h, n, p, d)
static struct ieee80211vap * upgt_vap_create(struct ieee80211com *, const char[IFNAMSIZ], int, enum ieee80211_opmode, int, const uint8_t[IEEE80211_ADDR_LEN], const uint8_t[IEEE80211_ADDR_LEN])
static void upgt_eeprom_parse_freq6(struct upgt_softc *, uint8_t *, int)
static void upgt_watchdog(void *)
static void upgt_update_mcast(struct ieee80211com *)
static void upgt_set_multi(void *)
static const struct usb_config upgt_config[UPGT_N_XFERS]
static const char * upgt_fwname
static void upgt_mem_free(struct upgt_softc *, uint32_t)
static void upgt_bulk_tx(struct upgt_softc *, struct upgt_data *)
static void upgt_set_chan(struct upgt_softc *, struct ieee80211_channel *)
static int upgt_fw_load(struct upgt_softc *)
static struct mbuf * upgt_rxeof(struct usb_xfer *, struct upgt_data *, int *)
MODULE_VERSION(if_upgt, 1)
static int upgt_eeprom_parse(struct upgt_softc *)
static void upgt_setup_rates(struct ieee80211vap *, struct ieee80211com *)
static int upgt_fw_copy(const uint8_t *, char *, int)
static uint32_t upgt_mem_alloc(struct upgt_softc *)
static uint32_t upgt_crc32_le(const void *, size_t)
static void upgt_sysctl_node(struct upgt_softc *)
#define DPRINTF(sc, m, fmt,...)
static void upgt_init(struct upgt_softc *)
static void upgt_txeof(struct usb_xfer *, struct upgt_data *)
static uint32_t upgt_chksum_le(const uint32_t *, size_t)
static int upgt_alloc_tx(struct upgt_softc *)
static void upgt_vap_delete(struct ieee80211vap *)
static void upgt_abort_xfers_locked(struct upgt_softc *)
static void upgt_set_led(struct upgt_softc *, int)
static int upgt_newstate(struct ieee80211vap *, enum ieee80211_state, int)
static device_method_t upgt_methods[]
static int upgt_alloc_rx(struct upgt_softc *)
static void upgt_free_rx(struct upgt_softc *)
static void upgt_set_channel(struct ieee80211com *)
static const STRUCT_USB_HOST_ID upgt_devs[]
static device_detach_t upgt_detach
static devclass_t upgt_devclass
static device_probe_t upgt_match
static void upgt_set_led_blink(void *)
static void upgt_start(struct upgt_softc *)
static void upgt_tx_done(struct upgt_softc *, uint8_t *)
static void upgt_free_tx(struct upgt_softc *)
static struct mbuf * upgt_rx(struct upgt_softc *, uint8_t *, int, int *)
static void upgt_eeprom_parse_freq3(struct upgt_softc *, uint8_t *, int)
static int upgt_eeprom_read(struct upgt_softc *)
static void upgt_parent(struct ieee80211com *)
static usb_callback_t upgt_bulk_rx_callback
static SYSCTL_NODE(_hw, OID_AUTO, upgt, CTLFLAG_RD|CTLFLAG_MPSAFE, 0, "USB PrismGT GW3887 driver parameters")
static void upgt_eeprom_parse_hwrx(struct upgt_softc *, uint8_t *)
static driver_t upgt_driver
MODULE_DEPEND(if_upgt, usb, 1, 1, 1)
static usb_callback_t upgt_bulk_tx_callback
static void upgt_eeprom_parse_freq4(struct upgt_softc *, uint8_t *, int)
static void upgt_stop(struct upgt_softc *)
DRIVER_MODULE(if_upgt, uhub, upgt_driver, upgt_devclass, NULL, 0)
static int upgt_device_reset(struct upgt_softc *)
static device_attach_t upgt_attach
static void upgt_get_stats(struct upgt_softc *)
#define UPGT_CONFIG_INDEX
#define UPGT_BRA_FWTYPE_LM86
#define UPGT_X2_SIGNATURE
#define UPGT_EEPROM_TYPE_OFF
#define UPGT_BRA_TYPE_EXPIF
#define UPGT_H2_TYPE_STATS
#define UPGT_FLAG_DETACHED
#define UPGT_STAT_DEC(sc, var)
#define UPGT_LED_ACTION_OFF
#define UPGT_FILTER_TYPE_RESET
#define UPGT_H1_TYPE_TX_DATA
#define UPGT_EEPROM_RX_CONST
#define UPGT_STAT_INC(sc, var)
#define UPGT_FILTER_MONITOR_UNKNOWN3
#define UPGT_FILTER_TYPE_MONITOR
#define UPGT_H2_TYPE_TX_DONE
#define UPGT_H2_TYPE_TX_ACK_YES
#define UPGT_EEPROM_TYPE_FREQ5
#define UPGT_H2_TYPE_EEPROM
#define UPGT_CHANNEL_UNKNOWN1
#define UPGT_FILTER_TYPE_STA
#define UPGT_BRA_TYPE_DESCR
#define UPGT_BRA_TYPE_END
#define UPGT_FLAG_FWLOADED
#define UPGT_EEPROM_TYPE_HWRX
#define UPGT_EEPROM_TYPE_MAC
#define UPGT_LED_MODE_SET
#define UPGT_EEPROM_TYPE_FREQ6
#define UPGT_H1_TYPE_CTRL
#define UPGT_MEMSIZE_FRAME_HEAD
#define UPGT_BRA_TYPE_VERSION
#define UPGT_ASSERT_LOCKED(sc)
#define UPGT_BRA_FWTYPE_LM87
#define UPGT_FILTER_MONITOR_UNKNOWN1
#define UPGT_H2_TYPE_MACFILTER
#define UPGT_X2_SIGNATURE_SIZE
#define UPGT_EEPROM_TYPE_NAME
#define UPGT_RX_RADIOTAP_PRESENT
#define UPGT_EEPROM_TYPE_END
#define UPGT_TX_DESC_PAD3_SIZE
#define UPGT_TX_STAT_INTERVAL
#define UPGT_FILTER_MONITOR_UNKNOWN2
#define UPGT_H1_FLAGS_TX_DATA
#define UPGT_H1_FLAGS_TX_MGMT
#define UPGT_CHANNEL_UNKNOWN3
#define UPGT_H2_TYPE_CHANNEL
#define UPGT_H1_FLAGS_TX_NO_CALLBACK
#define UPGT_FW_BLOCK_SIZE
#define UPGT_EEPROM_TYPE_FREQ4
#define UPGT_MEMADDR_FIRMWARE_START
#define UPGT_H2_FLAGS_TX_ACK_YES
#define UPGT_FILTER_UNKNOWN3
#define UPGT_EEPROM_TYPE_SERIAL
#define UPGT_LED_ACTION_TMP_DUR
#define UPGT_H1_TYPE_RX_DATA_MGMT
#define UPGT_FILTER_TYPE_NONE
#define UPGT_FILTER_UNKNOWN2
#define UPGT_MEMORY_MAX_PAGES
#define UPGT_EEPROM_TYPE_FREQ3
#define UPGT_H1_TYPE_RX_DATA
#define UPGT_CHANNEL_UNKNOWN2
#define UPGT_TX_DESC_TYPE_DATA
#define UPGT_EEPROM_BLOCK_SIZE
#define UPGT_BRA_TYPE_DEPIF
#define UPGT_EEPROM_TYPE_CHIP
#define UPGT_FLAG_INITDONE
#define UPGT_LED_ACTION_ON
#define UPGT_BRA_FWTYPE_SIZE
#define UPGT_FILTER_UNKNOWN1
#define UPGT_TX_RADIOTAP_PRESENT
struct ieee80211_node * ni
uint32_t memaddr_space_start
uint32_t memaddr_space_end
struct upgt_lmac_h2 header2
struct upgt_lmac_h1 header1
struct upgt_lmac_h2 header2
struct upgt_lmac_h1 header1
uint8_t src[IEEE80211_ADDR_LEN]
uint8_t dst[IEEE80211_ADDR_LEN]
struct upgt_eeprom_freq4_2 cmd
struct upgt_lmac_h1 header1
struct upgt_lmac_h2 header2
struct upgt_lmac_h2 header2
struct upgt_lmac_h1 header1
struct upgt_lmac_h1 header1
struct upgt_lmac_h2 header2
struct upgt_memory_page page[UPGT_MEMORY_MAX_PAGES]
struct upgt_data sc_rx_data[UPGT_RX_MAXCOUNT]
struct usb_xfer * sc_xfer[UPGT_N_XFERS]
uint32_t sc_memaddr_frame_start
enum ieee80211_state sc_state
struct upgt_lmac_freq6 sc_eeprom_freq6[IEEE80211_CHAN_MAX]
uint8_t sc_cur_rateset[8]
upgt_datahead sc_rx_active
struct callout sc_watchdog_ch
upgt_datahead sc_tx_active
upgt_datahead sc_tx_pending
struct upgt_lmac_freq3 sc_eeprom_freq3[IEEE80211_CHAN_MAX]
struct upgt_lmac_freq4 sc_eeprom_freq4[IEEE80211_CHAN_MAX][8]
struct upgt_data sc_tx_data[UPGT_TX_MAXCOUNT]
uint32_t sc_memaddr_frame_end
uint8_t sc_eeprom_freq6_settings
uint32_t sc_memaddr_rx_start
struct upgt_memory sc_memory
struct upgt_tx_radiotap_header sc_txtap
struct upgt_rx_radiotap_header sc_rxtap
upgt_datahead sc_tx_inactive
upgt_datahead sc_rx_inactive
struct usb_device * sc_udev
struct ieee80211com sc_ic
int(* newstate)(struct ieee80211vap *, enum ieee80211_state, int)
enum usb_hc_mode usb_mode
struct usbd_lookup_info info
struct usb_device * device
struct usb_endpoint_descriptor desc
const char * usbd_errstr(usb_error_t err)
int usbd_lookup_id_by_uaa(const struct usb_device_id *id, usb_size_t sizeof_id, struct usb_attach_arg *uaa)
void usbd_transfer_submit(struct usb_xfer *xfer)
void usbd_transfer_unsetup(struct usb_xfer **pxfer, uint16_t n_setup)
void usbd_xfer_set_frame_data(struct usb_xfer *xfer, usb_frcount_t frindex, void *ptr, usb_frlength_t len)
void * usbd_xfer_get_frame_buffer(struct usb_xfer *xfer, usb_frcount_t frindex)
usb_error_t usbd_transfer_setup(struct usb_device *udev, const uint8_t *ifaces, struct usb_xfer **ppxfer, const struct usb_config *setup_start, uint16_t n_setup, void *priv_sc, struct mtx *xfer_mtx)
void usbd_transfer_start(struct usb_xfer *xfer)
void usbd_transfer_drain(struct usb_xfer *xfer)
void * usbd_xfer_softc(struct usb_xfer *xfer)
void usbd_xfer_set_stall(struct usb_xfer *xfer)
void usbd_transfer_stop(struct usb_xfer *xfer)
void usbd_xfer_status(struct usb_xfer *xfer, int *actlen, int *sumlen, int *aframes, int *nframes)
void device_set_usb_desc(device_t dev)
void usb_pause_mtx(struct mtx *mtx, int timo)
#define USB_ST_TRANSFERRED
void() usb_callback_t(struct usb_xfer *, usb_error_t)
#define STRUCT_USB_HOST_ID
#define USB_GET_STATE(xfer)