Page MenuHomeFreeBSD

D50174.id.diff
No OneTemporary

D50174.id.diff

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)

File Metadata

Mime Type
text/plain
Expires
Fri, Jan 23, 2:03 PM (19 h, 35 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27885045
Default Alt Text
D50174.id.diff (22 KB)

Event Timeline