diff --git a/sys/dev/usb/wlan/if_mtw.c b/sys/dev/usb/wlan/if_mtw.c --- a/sys/dev/usb/wlan/if_mtw.c +++ b/sys/dev/usb/wlan/if_mtw.c @@ -74,8 +74,10 @@ #include "if_mtwreg.h" #include "if_mtwvar.h" -#define MTW_DEBUG +#ifdef USB_DEBUG +#define MTW_DEBUG +#endif #ifdef MTW_DEBUG int mtw_debug; static SYSCTL_NODE(_hw_usb, OID_AUTO, mtw, CTLFLAG_RW | CTLFLAG_MPSAFE, 0, @@ -166,7 +168,7 @@ static void mtw_setup_tx_list(struct mtw_softc *, struct mtw_endpoint_queue *); static void mtw_unsetup_tx_list(struct mtw_softc *, struct mtw_endpoint_queue *); -static void mtw_load_microcode(void *arg); +static int mtw_load_microcode(struct mtw_softc *); static usb_error_t mtw_do_request(struct mtw_softc *, struct usb_device_request *, void *); @@ -356,7 +358,7 @@ .flags = {.pipe_bof = 1, .force_short_xfer = 1, .no_pipe_ok = 1,}, .callback = mtw_fw_callback, - + .timeout = 5000, /* ms */ }, [MTW_BULK_RAW_TX] = { @@ -515,7 +517,7 @@ struct usb_attach_arg *uaa = device_get_ivars(self); struct ieee80211com *ic = &sc->sc_ic; uint32_t ver; - int i, ret; + int ret; // uint32_t tmp; uint8_t iface_index; int ntries, error; @@ -523,7 +525,6 @@ device_set_usb_desc(self); sc->sc_udev = uaa->device; sc->sc_dev = self; - sc->sc_sent = 0; mtx_init(&sc->sc_mtx, device_get_nameunit(sc->sc_dev), MTX_NETWORK_LOCK, MTX_DEF); @@ -539,13 +540,7 @@ usbd_errstr(error)); goto detach; } - for (i = 0; i < 4; i++) { - sc->txd_fw[i] = (struct mtw_txd_fw *) - malloc(sizeof(struct mtw_txd_fw), - M_USBDEV, M_NOWAIT | M_ZERO); - } MTW_LOCK(sc); - sc->sc_idx = 0; mbufq_init(&sc->sc_snd, ifqmaxlen); /*enable WLAN core */ @@ -579,11 +574,10 @@ goto detach; } - mtw_load_microcode(sc); - ret = msleep(&sc->fwloading, &sc->sc_mtx, 0, "fwload", 3 * hz); - if (ret == EWOULDBLOCK || sc->fwloading != 1) { + ret = mtw_load_microcode(sc); + if (ret != 0) { device_printf(sc->sc_dev, - "timeout waiting for MCU to initialize\n"); + "error loading firmware: %d\n", ret); goto detach; } @@ -597,7 +591,8 @@ sc->nrxchains, ether_sprintf(ic->ic_macaddr)); DELAY(100); - //mtw_set_leds(sc,5); + mtw_set_leds(sc, MTW_LED_MODE_ON); + mtw_set_leds(sc, MTW_LED_MODE_BLINK_TX); // mtw_mcu_radio(sc,0x31,0); MTW_UNLOCK(sc); @@ -728,10 +723,6 @@ ieee80211_draintask(ic, &sc->ratectl_task); ieee80211_ifdetach(ic); } - for (i = 0; i < 4; i++) { - free(sc->txd_fw[i], M_USBDEV); - } - firmware_unregister("/mediatek/mt7601u"); mtx_destroy(&sc->sc_mtx); return (0); @@ -1012,7 +1003,6 @@ static void mtw_ucode_setup(struct mtw_softc *sc) { - mtw_usb_dma_write(sc, (MTW_USB_TX_EN | MTW_USB_RX_EN)); mtw_write(sc, MTW_FCE_PSE_CTRL, 1); mtw_write(sc, MTW_TX_CPU_FCE_BASE, 0x400230); @@ -1021,151 +1011,133 @@ mtw_write(sc, MTW_FCE_PDMA, 0x44); mtw_write(sc, MTW_FCE_SKIP_FS, 3); } + static int -mtw_ucode_write(struct mtw_softc *sc, const uint8_t *fw, const uint8_t *ivb, - int32_t len, uint32_t offset) +mtw_ucode_write(struct mtw_softc *sc, const uint8_t *fw, int32_t len, + uint32_t offset) { + struct usb_xfer *xfer; + struct usb_page_cache *frame; + struct mtw_txd txd; + uint32_t blksz, sent, xferlen, tmp; - // struct usb_attach_arg *uaa = device_get_ivars(sc->sc_dev); -#if 0 // firmware not tested - + blksz = 0x2000; if (sc->asic_ver == 0x7612 && offset >= 0x90000) blksz = 0x800; /* MT7612 ROM Patch */ - xfer = usbd_alloc_xfer(sc->sc_udev); - if (xfer == NULL) { - error = ENOMEM; - goto fail; - } - buf = usbd_alloc_buffer(xfer, blksz + 12); - if (buf == NULL) { - error = ENOMEM; - goto fail; - } -#endif - - + xfer = sc->sc_xfer[MTW_BULK_FW_CMD]; - int mlen; - int idx = 0; - - mlen = 0x2c44; - - while (len > 0) { + sent = 0; + for (;;) { + xferlen = min(len - sent, blksz); + if (xferlen == 0) + break; + txd.len = htole16(xferlen); + txd.flags = htole16(MTW_TXD_DATA | MTW_TXD_MCU); + mtw_write_cfg(sc, MTW_MCU_DMA_ADDR, 0x40 + sent); + mtw_write_cfg(sc, MTW_MCU_DMA_LEN, (xferlen << 16)); + + usbd_xfer_set_frames(xfer, 1); + usbd_xfer_set_frame_len(xfer, 0, + xferlen + sizeof(struct mtw_txd)); + frame = usbd_xfer_get_frame(xfer, 0); + usbd_copy_in(frame, 0, &txd, sizeof(struct mtw_txd)); + usbd_copy_in(frame, sizeof(struct mtw_txd), fw + sent, xferlen); + usbd_frame_zero(frame, sizeof(struct mtw_txd) + xferlen, + MTW_DMA_PAD); + + + sc->sc_mcu_xfer_status = 0; + usbd_transfer_submit(xfer); + msleep(&sc->sc_mcu_xfer_status, &sc->sc_mtx, 0, + "mtw_ucode_write", MTW_TX_TIMEOUT); - if (len < 0x2c44 && len > 0) { - mlen = len; + if (sc->sc_mcu_xfer_status <= 0) { + usbd_transfer_stop(xfer); + return (-1); } - sc->txd_fw[idx]->len = htole16(mlen); - sc->txd_fw[idx]->flags = htole16(MTW_TXD_DATA | MTW_TXD_MCU); - - memcpy(&sc->txd_fw[idx]->fw, fw, mlen); - // memcpy(&txd[1], fw, mlen); - // memset(&txd[1] + mlen, 0, MTW_DMA_PAD); - // mtw_write_cfg(sc, MTW_MCU_DMA_ADDR, offset - //+sent); 1mtw_write_cfg(sc, MTW_MCU_DMA_LEN, (mlen << 16)); - - // sc->sc_fw_data[idx]->len=htole16(mlen); - - // memcpy(tmpbuf,fw,mlen); - // memset(tmpbuf+mlen,0,MTW_DMA_PAD); - // memcpy(sc->sc_fw_data[idx].buf, fw, mlen); - - fw += mlen; - len -= mlen; - // sent+=mlen; - idx++; + mtw_read(sc, MTW_MCU_FW_IDX, &tmp); + mtw_write(sc, MTW_MCU_FW_IDX, tmp++); + sent += xferlen; + DELAY(100); } - sc->sc_sent = 0; - memcpy(sc->sc_ivb_1, ivb, MTW_MCU_IVB_LEN); - - usbd_transfer_start(sc->sc_xfer[7]); return (0); } -static void -mtw_load_microcode(void *arg) +static int +mtw_load_microcode(struct mtw_softc *sc) { - - struct mtw_softc *sc = (struct mtw_softc *)arg; - const struct mtw_ucode_hdr *hdr; - // onst struct mtw_ucode *fw = NULL; const char *fwname; - size_t size; - int error = 0; - uint32_t tmp, iofs = 0x40; - // int ntries; + const struct firmware *firmware; + uint32_t tmp, iofs; + int error, ready, ntries; int dlen, ilen; - device_printf(sc->sc_dev, "version:0x%hx\n", sc->asic_ver); + /* is firmware already running? */ mtw_read_cfg(sc, MTW_MCU_DMA_ADDR, &tmp); - if (tmp == MTW_MCU_READY) { - return; - } + if (tmp == MTW_MCU_READY) + return (0); + if (sc->asic_ver == 0x7612) { fwname = "mtw-mt7662u_rom_patch"; - const struct firmware *firmware = firmware_get_flags(fwname,FIRMWARE_GET_NOWARN); + firmware = firmware_get_flags(fwname, FIRMWARE_GET_NOWARN); if (firmware == NULL) { device_printf(sc->sc_dev, - "failed loadfirmware of file %s (error %d)\n", - fwname, error); - return; + "failed loadfirmware of file %s\n", + fwname); + return (-1); } - size = firmware->datasize; const struct mtw_ucode *fw = (const struct mtw_ucode *) - firmware->data; - hdr = (const struct mtw_ucode_hdr *)&fw->hdr; - // memcpy(fw,(const unsigned char*)firmware->data + - // 0x1e,size-0x1e); - ilen = size - 0x1e; + ((const u_char *)firmware->data + 0x1e); + ilen = firmware->datasize - 0x1e; mtw_ucode_setup(sc); - if ((error = mtw_ucode_write(sc, firmware->data, fw->ivb, ilen, - 0x90000)) != 0) { - goto fail; - } + error = mtw_ucode_write(sc, fw->data, ilen, 0x90000); + + if (error != 0) + return (error); + mtw_usb_dma_write(sc, 0x00e41814); } fwname = "/mediatek/mt7601u.bin"; iofs = 0x40; - // dofs = 0; if (sc->asic_ver == 0x7612) { fwname = "mtw-mt7662u"; iofs = 0x80040; - // dofs = 0x110800; } else if (sc->asic_ver == 0x7610) { - fwname = "mt7610u"; - // dofs = 0x80000; + fwname = "mtw-mt7610u"; } - MTW_UNLOCK(sc); - const struct firmware *firmware = firmware_get_flags(fwname, FIRMWARE_GET_NOWARN); + MTW_UNLOCK(sc); + firmware = firmware_get_flags(fwname, FIRMWARE_GET_NOWARN); if (firmware == NULL) { device_printf(sc->sc_dev, "failed loadfirmware of file %s (error %d)\n", fwname, error); MTW_LOCK(sc); - return; + return (-1); } MTW_LOCK(sc); - size = firmware->datasize; - MTW_DPRINTF(sc, MTW_DEBUG_FIRMWARE, "firmware size:%zu\n", size); - const struct mtw_ucode *fw = (const struct mtw_ucode *)firmware->data; - if (size < sizeof(struct mtw_ucode_hdr)) { + MTW_DPRINTF(sc, MTW_DEBUG_FIRMWARE, "firmware size:%zu\n", + firmware->datasize); + + if (firmware->datasize < sizeof(struct mtw_ucode_hdr)) { device_printf(sc->sc_dev, "firmware header too short\n"); goto fail; } - hdr = (const struct mtw_ucode_hdr *)&fw->hdr; + const struct mtw_ucode *fw = (const struct mtw_ucode *)firmware->data; + const struct mtw_ucode_hdr *hdr = &fw->hdr; - if (size < sizeof(struct mtw_ucode_hdr) + le32toh(hdr->ilm_len) + + if (firmware->datasize < sizeof(struct mtw_ucode_hdr) + + le32toh(hdr->ilm_len) + le32toh(hdr->dlm_len)) { device_printf(sc->sc_dev, "firmware payload too short\n"); goto fail; @@ -1174,7 +1146,7 @@ ilen = le32toh(hdr->ilm_len) - MTW_MCU_IVB_LEN; dlen = le32toh(hdr->dlm_len); - if (ilen > size || dlen > size) { + if (ilen > firmware->datasize || dlen > firmware->datasize) { device_printf(sc->sc_dev, "firmware payload too large\n"); goto fail; } @@ -1183,17 +1155,51 @@ mtw_write(sc, MTW_FCE_PSE_CTRL, 0); mtw_ucode_setup(sc); - if ((error = mtw_ucode_write(sc, fw->data, fw->ivb, ilen, iofs)) != 0) + if ((error = mtw_ucode_write(sc, fw->data, ilen, iofs)) != 0) { device_printf(sc->sc_dev, "Could not write ucode errro=%d\n", error); + goto fail; + } + uint8_t ivb[MTW_MCU_IVB_LEN]; + memcpy(&ivb[0], fw->ivb, MTW_MCU_IVB_LEN); + if ((error = mtw_write_ivb(sc, ivb, MTW_MCU_IVB_LEN)) != 0) { + device_printf(sc->sc_dev, "Could not write ivb error: %d\n", + error); + goto fail; + } + + mtw_delay(sc, 10); + for (ntries = 0; ntries < 100; ntries++) { + if ((error = mtw_read_cfg(sc, MTW_MCU_DMA_ADDR, &ready)) != 0) { + device_printf(sc->sc_dev, + "Could not read cfg error: %d\n", error); + } + if (ready == MTW_MCU_READY) { + MTW_DPRINTF(sc, MTW_DEBUG_FIRMWARE, + "mcu reaady %d\n", ready); + break; + } + mtw_delay(sc, 10); + } + + if (ntries == 100) { + device_printf(sc->sc_dev, "%s\n", + "timeout waiting for MCU to initialize"); + error = ETIMEDOUT; + goto fail; + } + firmware_put(firmware, FIRMWARE_UNLOAD); + device_printf(sc->sc_dev, "loaded firmware ver %.8x %.8x %s\n", + le32toh(hdr->fw_ver), + le32toh(hdr->build_ver), + hdr->build_time); - device_printf(sc->sc_dev, "loaded firmware ver %.8x %.8x %s\n", - le32toh(hdr->fw_ver), le32toh(hdr->build_ver), hdr->build_time); - return; fail: - return; + firmware_put(firmware, FIRMWARE_UNLOAD); + return (error); } + static usb_error_t mtw_do_request(struct mtw_softc *sc, struct usb_device_request *req, void *data) { @@ -1400,15 +1406,27 @@ static int mtw_mcu_cmd(struct mtw_softc *sc, u_int8_t cmd, void *buf, int len) { - sc->sc_idx = 0; - sc->txd_fw[sc->sc_idx]->len = htole16( + struct mtw_txd txd; + struct usb_xfer *xfer; + struct usb_page_cache *frame; + + txd.len = htole16( len + 8); - sc->txd_fw[sc->sc_idx]->flags = htole16(MTW_TXD_CMD | MTW_TXD_MCU | + txd.flags = htole16(MTW_TXD_CMD | MTW_TXD_MCU | (cmd & 0x1f) << MTW_TXD_CMD_SHIFT | (0 & 0xf)); - memset(&sc->txd_fw[sc->sc_idx]->fw, 0, 2004); - memcpy(&sc->txd_fw[sc->sc_idx]->fw, buf, len); - usbd_transfer_start(sc->sc_xfer[7]); + xfer = sc->sc_xfer[7]; + + usbd_xfer_set_frames(xfer, 1); + usbd_xfer_set_frame_len(xfer, 0, + len + sizeof(struct mtw_txd) + MTW_DMA_PAD); + + frame = usbd_xfer_get_frame(xfer, 0); + usbd_copy_in(frame, 0, &txd, sizeof(struct mtw_txd)); + usbd_frame_zero(frame, sizeof(struct mtw_txd), 2004); + usbd_copy_in(frame, sizeof(struct mtw_txd), buf, len); + + usbd_transfer_submit(xfer); return (0); } @@ -2157,8 +2175,9 @@ struct mtw_node *rn = MTW_NODE(ni); uint32_t sta[3]; uint16_t(*wstat)[3]; - int error, ridx; uint8_t txrate = 0; + int error, ridx; + /* Check for special case */ if (sc->rvp_cnt <= 1 && vap->iv_opmode == IEEE80211_M_STA && @@ -2816,91 +2835,26 @@ mtw_fw_callback(struct usb_xfer *xfer, usb_error_t error) { struct mtw_softc *sc = usbd_xfer_softc(xfer); - int actlen; - int ntries, tmp; - // struct mtw_txd *data; usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL); - // data = usbd_xfer_get_priv(xfer); - usbd_xfer_set_priv(xfer, NULL); - switch (USB_GET_STATE(xfer)) { + switch (USB_GET_STATE(xfer)) { case USB_ST_TRANSFERRED: - sc->sc_sent += actlen; - memset(sc->txd_fw[sc->sc_idx], 0, actlen); - - if (actlen < 0x2c44 && sc->sc_idx == 0) { - return; - } - if (sc->sc_idx == 3) { - - if ((error = mtw_write_ivb(sc, sc->sc_ivb_1, - MTW_MCU_IVB_LEN)) != 0) { - device_printf(sc->sc_dev, - "Could not write ivb error: %d\n", error); - } - - mtw_delay(sc, 10); - for (ntries = 0; ntries < 100; ntries++) { - if ((error = mtw_read_cfg(sc, MTW_MCU_DMA_ADDR, - &tmp)) != 0) { - device_printf(sc->sc_dev, - "Could not read cfg error: %d\n", error); - - } - if (tmp == MTW_MCU_READY) { - MTW_DPRINTF(sc, MTW_DEBUG_FIRMWARE, - "mcu reaady %d\n", tmp); - sc->fwloading = 1; - break; - } - - mtw_delay(sc, 10); - } - if (ntries == 100) - sc->fwloading = 0; - wakeup(&sc->fwloading); - return; - } - - if (actlen == 0x2c44) { - sc->sc_idx++; - DELAY(1000); - } - - case USB_ST_SETUP: { - int dlen = 0; - dlen = sc->txd_fw[sc->sc_idx]->len; - - mtw_write_cfg(sc, MTW_MCU_DMA_ADDR, 0x40 + sc->sc_sent); - mtw_write_cfg(sc, MTW_MCU_DMA_LEN, (dlen << 16)); - - usbd_xfer_set_frame_len(xfer, 0, dlen); - usbd_xfer_set_frame_data(xfer, 0, sc->txd_fw[sc->sc_idx], dlen); - - // usbd_xfer_set_priv(xfer,sc->txd[sc->sc_idx]); - usbd_transfer_submit(xfer); + sc->sc_mcu_xfer_status = actlen; + wakeup(&sc->sc_mcu_xfer_status); break; - default: /* Error */ + case USB_ST_ERROR: + sc->sc_mcu_xfer_status = -1; device_printf(sc->sc_dev, "%s:%d %s\n", __FILE__, __LINE__, usbd_errstr(error)); - sc->fwloading = 0; - wakeup(&sc->fwloading); - /* - * Print error message and clear stall - * for example. - */ + wakeup(&sc->sc_mcu_xfer_status); break; - } - /* - * Here it is safe to do something without the private - * USB mutex locked. - */ } return; } + static void mtw_bulk_tx_callback0(struct usb_xfer *xfer, usb_error_t error) { @@ -2910,8 +2864,6 @@ static void mtw_bulk_tx_callback1(struct usb_xfer *xfer, usb_error_t error) { - - mtw_bulk_tx_callbackN(xfer, error, 1); } @@ -4422,7 +4374,7 @@ tmp |= MTW_TX_WB_DDONE; mtw_write(sc, MTW_WPDMA_GLO_CFG, tmp); - mtw_set_leds(sc, MTW_LED_MODE_ON); + mtw_set_leds(sc, 2); /* reset MAC and baseband */ mtw_write(sc, MTW_MAC_SYS_CTRL, MTW_BBP_HRST | MTW_MAC_SRST); mtw_write(sc, MTW_USB_DMA_CFG, 0); diff --git a/sys/dev/usb/wlan/if_mtwvar.h b/sys/dev/usb/wlan/if_mtwvar.h --- a/sys/dev/usb/wlan/if_mtwvar.h +++ b/sys/dev/usb/wlan/if_mtwvar.h @@ -38,8 +38,8 @@ struct mtw_rx_radiotap_header { struct ieee80211_radiotap_header wr_ihdr; - uint64_t wr_tsf; - uint8_t wr_flags; + uint64_t wr_tsf; + uint8_t wr_flags; uint8_t wr_rate; uint16_t wr_chan_freq; uint16_t wr_chan_flags; @@ -58,10 +58,10 @@ struct mtw_tx_radiotap_header { struct ieee80211_radiotap_header wt_ihdr; uint8_t wt_flags; - uint8_t wt_rate; + uint8_t wt_rate; uint16_t wt_chan_freq; uint16_t wt_chan_flags; - uint8_t wt_hwqueue; + uint8_t wt_hwqueue; } __packed; #define MTW_TX_RADIOTAP_PRESENT \ @@ -71,57 +71,6 @@ struct mtw_softc; -struct mtw_fw_data { - uint16_t len; - uint16_t flags; - - uint8_t *buf; - uint32_t buflen; - -}; -struct mtw_tx_desc { - uint32_t flags; -#define RT2573_TX_BURST (1 << 0) -#define RT2573_TX_VALID (1 << 1) -#define RT2573_TX_MORE_FRAG (1 << 2) -#define RT2573_TX_NEED_ACK (1 << 3) -#define RT2573_TX_TIMESTAMP (1 << 4) -#define RT2573_TX_OFDM (1 << 5) -#define RT2573_TX_IFS_SIFS (1 << 6) -#define RT2573_TX_LONG_RETRY (1 << 7) -#define RT2573_TX_TKIPMIC (1 << 8) -#define RT2573_TX_KEY_PAIR (1 << 9) -#define RT2573_TX_KEY_ID(id) (((id) & 0x3f) << 10) -#define RT2573_TX_CIP_MODE(m) ((m) << 29) - - uint16_t wme; -#define RT2573_QID(v) (v) -#define RT2573_AIFSN(v) ((v) << 4) -#define RT2573_LOGCWMIN(v) ((v) << 8) -#define RT2573_LOGCWMAX(v) ((v) << 12) - - uint8_t hdrlen; - uint8_t xflags; -#define RT2573_TX_HWSEQ (1 << 4) - - uint8_t plcp_signal; - uint8_t plcp_service; -#define RT2573_PLCP_LENGEXT 0x80 - - uint8_t plcp_length_lo; - uint8_t plcp_length_hi; - - uint32_t iv; - uint32_t eiv; - - uint8_t offset; - uint8_t qid; - uint8_t txpower; -#define RT2573_DEFAULT_TXPOWER 0 - - uint8_t reserved; -} __packed; - struct mtw_tx_data { STAILQ_ENTRY(mtw_tx_data) next; struct mbuf *m; @@ -129,34 +78,9 @@ struct usbd_xfer *xfer; uint8_t qid; uint8_t ridx; - uint32_t buflen; - //struct mtw_tx_desc desc; + uint32_t buflen; struct ieee80211_node *ni; - //struct mtw_txd desc; uint8_t desc[sizeof(struct mtw_txd)+sizeof(struct mtw_txwi)]; - -}; - -struct mtw_rx_data { - STAILQ_ENTRY(mtw_rx_data) next; - struct mtw_softc *sc; - struct usbd_xfer *xfer; - - uint8_t *buf; -}; - -struct mtw_tx_ring { - struct mtw_tx_data data[MTW_TX_RING_COUNT]; - struct usbd_pipe *pipeh; - int cur; - int queued; - uint8_t pipe_no; -}; - -struct mtw_rx_ring { - struct mtw_rx_data data[MTW_RX_RING_COUNT]; - struct usbd_pipe *pipeh; - uint8_t pipe_no; }; struct mtw_vap { @@ -173,49 +97,15 @@ uint8_t rvp_id; }; #define MTW_VAP(vap) ((struct mtw_vap *)(vap)) -struct mtw_host_cmd { - void (*cb)(struct mtw_softc *, void *); - uint8_t data[256]; -}; - -struct mtw_cmd_newstate { - enum ieee80211_state state; - int arg; -}; - -struct mtw_cmd_key { - struct ieee80211_key key; - struct ieee80211_node *ni; -}; - -#define MTW_HOST_CMD_RING_COUNT 32 -struct mtw_host_cmd_ring { - struct mtw_host_cmd cmd[MTW_HOST_CMD_RING_COUNT]; - int cur; - int next; - int queued; -}; - - struct mtw_node { struct ieee80211_node ni; - uint8_t mgt_ridx; - uint8_t amrr_ridx; + uint8_t mgt_ridx; + uint8_t amrr_ridx; uint8_t fix_ridx; - }; #define MTW_NODE(ni) ((struct mtw_node *)(ni)) -struct mtw_mcu_tx { - struct mtw_softc *sc; - struct usbd_xfer *xfer; - struct usbd_pipe *pipeh; - uint8_t pipe_no; - uint8_t *buf; - int8_t seq; -}; - #define MTW_MCU_IVB_LEN 0x40 struct mtw_ucode_hdr { uint32_t ilm_len; @@ -249,11 +139,12 @@ uint8_t mac[IEEE80211_ADDR_LEN]; uint8_t wcid; }; + enum { MTW_BULK_RX, /* = WME_AC_BK */ //MTW_BULK_RX1, - MTW_BULK_TX_BE, /* = WME_AC_BE */ - MTW_BULK_TX_VI, /* = WME_AC_VI */ + MTW_BULK_TX_BE, /* = WME_AC_BE */ + MTW_BULK_TX_VI, /* = WME_AC_VI */ MTW_BULK_TX_VO, /* = WME_AC_VO */ MTW_BULK_TX_HCCA, MTW_BULK_TX_PRIO, @@ -270,118 +161,91 @@ #define MTW_RUNNING 0x02 struct mtw_softc { device_t sc_dev; - int sc_idx; - struct ieee80211com sc_ic; - struct ieee80211_ratectl_tx_stats sc_txs; + struct ieee80211com sc_ic; + + struct ieee80211_ratectl_tx_stats sc_txs; int (*sc_newstate)(struct ieee80211com *, - enum ieee80211_state, int); + enum ieee80211_state, int); int (*sc_srom_read)(struct mtw_softc *, - uint16_t, uint16_t *); + uint16_t, uint16_t *); #define MTW_CMDQ_MAX 16 #define MTW_CMDQ_MASQ (MTW_CMDQ_MAX - 1) #define MTW_CMDQ_ABORT 0 #define MTW_CMDQ_GO 1 struct mbuf *rx_m; - uint8_t runbmap; - uint8_t running; - uint8_t ap_running; + uint8_t runbmap; + uint8_t running; + uint8_t ap_running; uint8_t adhoc_running; - uint8_t sta_running; - uint8_t fwloading; - uint16_t wcid_stats[MTW_WCID_MAX + 1][3]; - struct mbufq sc_snd; - uint8_t cmdq_exec; - uint8_t fifo_cnt; - uint32_t sc_flags; - uint8_t rvp_cnt; - uint8_t cmdq_run; - uint8_t rvp_bmap; - struct mtw_cmdq cmdq[MTW_CMDQ_MAX]; + uint8_t sta_running; + uint16_t wcid_stats[MTW_WCID_MAX + 1][3]; + struct mbufq sc_snd; + uint8_t cmdq_exec; + uint8_t fifo_cnt; + uint32_t sc_flags; + uint8_t rvp_cnt; + uint8_t cmdq_run; + uint8_t rvp_bmap; + struct mtw_cmdq cmdq[MTW_CMDQ_MAX]; struct task cmdq_task; - uint8_t cmdq_mtw; uint8_t cmdq_key_set; - struct usb_device *sc_udev; - struct usb_interface *sc_iface; + struct usb_device *sc_udev; uint32_t cmdq_store; - struct mtx sc_mtx; - uint32_t sc_mcu_xferlen; - struct usb_xfer *sc_xfer[MTW_N_XFER]; + + struct mtx sc_mtx; uint16_t asic_ver; uint16_t asic_rev; - uint16_t mac_ver; uint16_t mac_rev; uint16_t rf_rev; - int ridx; - int amrr_ridx; - uint8_t freq; uint8_t ntxchains; uint8_t nrxchains; - struct mtw_txd_fw *txd_fw[4]; - int sc_sent; - uint8_t sc_ivb_1[MTW_MCU_IVB_LEN]; - struct mtw_endpoint_queue sc_epq[MTW_BULK_RX]; + int sc_mcu_xfer_status; + uint8_t rfswitch; uint8_t ext_2ghz_lna; uint8_t ext_5ghz_lna; uint8_t calib_2ghz; uint8_t calib_5ghz; uint8_t txmixgain_2ghz; - uint8_t txmixgain_5ghz; int8_t txpow1[54]; int8_t txpow2[54]; - int8_t txpow3[54]; int8_t rssi_2ghz[3]; int8_t rssi_5ghz[3]; uint8_t lna[4]; - uint8_t leds; - uint16_t led[3]; uint32_t txpow20mhz[5]; uint32_t txpow40mhz_2ghz[5]; uint32_t txpow40mhz_5ghz[5]; int8_t bbp_temp; uint8_t rf_freq_offset; - uint32_t rf_pa_mode[2]; - int sc_rf_calibrated; - int sc_bw_calibrated; - int sc_chan_group; + int sc_rf_calibrated; + int sc_bw_calibrated; + int sc_chan_group; + uint8_t sc_detached; + struct usb_xfer *sc_xfer[MTW_N_XFER]; + struct mtw_endpoint_queue sc_epq[MTW_N_XFER]; + struct task ratectl_task; + struct usb_callout ratectl_ch; + uint8_t ratectl_run; - - - uint8_t cmd_seq; - uint8_t sc_detached; - struct mtw_tx_ring sc_mcu; - struct mtw_rx_ring rxq[MTW_RXQ_COUNT]; - struct mtw_tx_ring txq[MTW_TXQ_COUNT]; - struct task ratectl_task; - struct usb_callout ratectl_ch; - uint8_t ratectl_run; - //struct mtw_host_cmd_ring cmdq; - uint8_t qfullmsk; - int sc_tx_timer; - - uint8_t sc_bssid[IEEE80211_ADDR_LEN]; + uint8_t sc_bssid[IEEE80211_ADDR_LEN]; union { struct mtw_rx_radiotap_header th; uint8_t pad[64]; } sc_rxtapu; #define sc_rxtap sc_rxtapu.th - int sc_rxtap_len; - union { struct mtw_tx_radiotap_header th; uint8_t pad[64]; uint8_t wt_hwqueue; - } sc_txtapu; #define sc_txtap sc_txtapu.th - int sc_txtap_len; - int sc_key_tasks; }; + #define MTW_LOCK(sc) mtx_lock(&(sc)->sc_mtx) #define MTW_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx) #define MTW_LOCK_ASSERT(sc, t) mtx_assert(&(sc)->sc_mtx, t)