summaryrefslogtreecommitdiff
path: root/sys/dev/usb
diff options
context:
space:
mode:
authorStefan Sperling <stsp@cvs.openbsd.org>2014-06-07 12:03:02 +0000
committerStefan Sperling <stsp@cvs.openbsd.org>2014-06-07 12:03:02 +0000
commitf76d213bcaa08e46d9e5f11c48bc320be20c465e (patch)
tree08771e6a41dab6fd88a68e370a3a332a5771f883 /sys/dev/usb
parent3f2264cf3a188c53f866fa0c3ed2a34047a9f71d (diff)
In run(4), fix TXWI and RXWI offset calculations for RT5592 devices.
Makes RT5592 devices work, except for an 11a scanning issue, according to Brendan MacDonell who submitted this patch on tech@. Thanks! ok claudio@
Diffstat (limited to 'sys/dev/usb')
-rw-r--r--sys/dev/usb/if_run.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/sys/dev/usb/if_run.c b/sys/dev/usb/if_run.c
index bac0fef593f..e7cdda5b98c 100644
--- a/sys/dev/usb/if_run.c
+++ b/sys/dev/usb/if_run.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_run.c,v 1.98 2014/05/24 10:10:17 stsp Exp $ */
+/* $OpenBSD: if_run.c,v 1.99 2014/06/07 12:03:01 stsp Exp $ */
/*-
* Copyright (c) 2008-2010 Damien Bergamini <damien.bergamini@free.fr>
@@ -781,6 +781,11 @@ run_alloc_tx_ring(struct run_softc *sc, int qid)
{
struct run_tx_ring *txq = &sc->txq[qid];
int i, error;
+ uint16_t txwisize;
+
+ txwisize = sizeof(struct rt2860_txwi);
+ if (sc->mac_ver == 0x5592)
+ txwisize += sizeof(uint32_t);
txq->cur = txq->queued = 0;
@@ -805,8 +810,7 @@ run_alloc_tx_ring(struct run_softc *sc, int qid)
goto fail;
}
/* zeroize the TXD + TXWI part */
- memset(data->buf, 0, sizeof (struct rt2870_txd) +
- sizeof (struct rt2860_txwi));
+ memset(data->buf, 0, sizeof(struct rt2870_txd) + txwisize);
}
if (error != 0)
fail: run_free_tx_ring(sc, qid);
@@ -2312,6 +2316,13 @@ run_rxeof(struct usbd_xfer *xfer, void *priv, usbd_status status)
uint8_t *buf;
uint32_t dmalen;
int xferlen;
+ uint16_t rxwisize;
+
+ rxwisize = sizeof(struct rt2860_rxwi);
+ if (sc->mac_ver == 0x5592)
+ rxwisize += sizeof(uint64_t);
+ else if (sc->mac_ver == 0x3593)
+ rxwisize += sizeof(uint32_t);
if (__predict_false(status != USBD_NORMAL_COMPLETION)) {
DPRINTF(("RX status=%d\n", status));
@@ -2323,8 +2334,8 @@ run_rxeof(struct usbd_xfer *xfer, void *priv, usbd_status status)
}
usbd_get_xfer_status(xfer, NULL, NULL, &xferlen, NULL);
- if (__predict_false(xferlen < sizeof (uint32_t) +
- sizeof (struct rt2860_rxwi) + sizeof (struct rt2870_rxd))) {
+ if (__predict_false(xferlen < sizeof (uint32_t) + rxwisize +
+ sizeof(struct rt2870_rxd))) {
DPRINTF(("xfer too short %d\n", xferlen));
goto skip;
}
@@ -2394,6 +2405,7 @@ run_tx(struct run_softc *sc, struct mbuf *m, struct ieee80211_node *ni)
struct rt2870_txd *txd;
struct rt2860_txwi *txwi;
uint16_t qos, dur;
+ uint16_t txwisize;
uint8_t type, mcs, tid, qid;
int error, hasqos, ridx, ctl_ridx, xferlen;
@@ -2429,7 +2441,11 @@ run_tx(struct run_softc *sc, struct mbuf *m, struct ieee80211_node *ni)
/* get MCS code from rate index */
mcs = rt2860_rates[ridx].mcs;
- xferlen = sizeof (*txwi) + m->m_pkthdr.len;
+ txwisize = sizeof(struct rt2860_txwi);
+ if (sc->mac_ver == 0x5592)
+ txwisize += sizeof(uint32_t);
+ xferlen = txwisize + m->m_pkthdr.len;
+
/* roundup to 32-bit alignment */
xferlen = (xferlen + 3) & ~3;
@@ -2489,7 +2505,7 @@ run_tx(struct run_softc *sc, struct mbuf *m, struct ieee80211_node *ni)
}
#endif
- m_copydata(m, 0, m->m_pkthdr.len, (caddr_t)(txwi + 1));
+ m_copydata(m, 0, m->m_pkthdr.len, (caddr_t)txwi + txwisize);
m_freem(m);
xferlen += sizeof (*txd) + 4;