PERFORCE change 173060 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Wed Jan 13 08:29:24 UTC 2010
http://p4web.freebsd.org/chv.cgi?CH=173060
Change 173060 by hselasky at hselasky_laptop001 on 2010/01/13 08:28:28
USB wlan:
- patch for RUN driver
- patch done by: Akinori
Affected files ...
.. //depot/projects/usb/src/sys/dev/usb/wlan/if_run.c#3 edit
Differences ...
==== //depot/projects/usb/src/sys/dev/usb/wlan/if_run.c#3 (text+ko) ====
@@ -701,10 +701,6 @@
ieee80211_vap_setup(ic, vap, name, unit, opmode,
flags | IEEE80211_CLONE_NOBEACONS, bssid, mac);
- /*
- * I couldn't make these func work.
- * Let me know if you can.
- */
vap->iv_key_update_begin = run_key_update_begin;
vap->iv_key_update_end = run_key_update_end;
vap->iv_key_delete = run_key_delete;
@@ -869,7 +865,7 @@
return error;
if (tmp & RT2860_MCU_READY)
break;
- run_delay(sc, 1000);
+ run_delay(sc, 10);
}
if (ntries == 1000) {
printf("%s: timeout waiting for MCU to initialize\n",
@@ -1726,11 +1722,10 @@
/* map net80211 cipher to RT2860 security mode */
switch (k->wk_cipher->ic_cipher) {
case IEEE80211_CIPHER_WEP:
- if(k->wk_keylen < 8){
+ if(k->wk_keylen < 8)
mode = RT2860_MODE_WEP40;
- }else{
+ else
mode = RT2860_MODE_WEP104;
- }
break;
case IEEE80211_CIPHER_TKIP:
mode = RT2860_MODE_TKIP;
@@ -1908,11 +1903,26 @@
struct run_vap *rvp = arg;
struct ieee80211vap *vap = &rvp->vap;
struct ieee80211com *ic = vap->iv_ic;
+ struct run_softc *sc = ic->ic_ifp->if_softc;
if (ic->ic_opmode == IEEE80211_M_STA)
run_iter_func(rvp, vap->iv_bss);
- else
+ else {
+ /*
+ * run_reset_livelock() doesn't do anything with AMRR,
+ * but Ralink wants us to call it every 1 sec. So, we
+ * piggyback here rather than creating another callout.
+ * Livelock may occur only in HOSTAP or IBSS mode
+ * (when h/w is sending beacons).
+ */
+ RUN_LOCK(sc);
+ run_reset_livelock(sc);
+ RUN_UNLOCK(sc);
ieee80211_iterate_nodes(&ic->ic_sta, run_iter_func, rvp);
+ }
+
+ if(rvp->amrr_run == RUN_AMRR_ON)
+ usb_callout_reset(&rvp->amrr_ch, hz, run_amrr_to, rvp);
}
@@ -1936,7 +1946,7 @@
if(ic->ic_opmode != IEEE80211_M_STA){
/* drain Tx status FIFO (maxsize = 16) */
- run_read_region_1(sc, RT2860_TX_STAT_FIFO, (uint8_t *)&stat, sizeof stat);
+ run_read(sc, RT2860_TX_STAT_FIFO, &stat);
while (stat & RT2860_TXQ_VLD) {
DPRINTFN(4, "tx stat 0x%08x\n", stat);
@@ -2002,9 +2012,6 @@
ieee80211_amrr_choose(ni, amn);
skip:;
- if(rvp->amrr_run == RUN_AMRR_ON)
- usb_callout_reset(&rvp->amrr_ch, hz, run_amrr_to, rvp);
-
RUN_UNLOCK(sc);
if(ic->ic_opmode != IEEE80211_M_STA)
@@ -2335,7 +2342,9 @@
struct mbuf *m;
usb_frlength_t size;
unsigned int len;
- int actlen, sumlen;
+ int actlen;
+ int sumlen;
+ int timeout;
usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL);
@@ -2347,6 +2356,7 @@
data = usbd_xfer_get_priv(xfer);
run_tx_free(pq, data, 0);
+ ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
usbd_xfer_set_priv(xfer, NULL);
@@ -2404,10 +2414,19 @@
usbd_transfer_submit(xfer);
+ /* avoid doing the USB timeout from this function */
+
+ timeout = sc->sc_usb_timeout;
+ sc->sc_usb_timeout = 0;
+
RUN_UNLOCK(sc);
+
run_start(ifp);
+
RUN_LOCK(sc);
+ sc->sc_usb_timeout = timeout;
+
break;
default:
@@ -2429,9 +2448,6 @@
/* defer until later */
sc->sc_usb_timeout = 1;
-
- /* XXX this should be in a separate task! */
- run_usb_timeout(sc);
}
/*
@@ -2625,7 +2641,7 @@
/* reserve slots for mgmt packets, just in case */
if (sc->sc_epq[qid].tx_nfree < 3) {
- DPRINTF("tx ring %d is full\n", qid);
+ DPRINTFN(10, "tx ring %d is full\n", qid);
return (-1);
}
@@ -2766,7 +2782,8 @@
mprot = ieee80211_alloc_cts(ic, ni->ni_vap->iv_myaddr, dur);
}
if (mprot == NULL) {
- /* XXX stat + msg */
+ sc->sc_ifp->if_oerrors++;
+ DPRINTF("could not allocate mbuf\n");
return (ENOBUFS);
}
@@ -2884,6 +2901,10 @@
goto bad;
}
+ /* Device is in trouble. Fix it before sending more frame. */
+ if(sc->sc_usb_timeout == 1)
+ run_usb_timeout(sc);
+
if (params == NULL) {
/* tx mgt packet */
if ((error = run_tx_mgt(sc, m, ni)) != 0){
@@ -2930,6 +2951,10 @@
}
for (;;) {
+ /* Device is in trouble. Fix it before sending more frame. */
+ if(sc->sc_usb_timeout == 1)
+ run_usb_timeout(sc);
+
/* send data frames */
IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
if (m == NULL)
@@ -3082,14 +3107,14 @@
run_rt2870_rf_write(sc, RT2860_RF3, r3);
run_rt2870_rf_write(sc, RT2860_RF4, r4);
- run_delay(sc, 200);
+ run_delay(sc, 10);
run_rt2870_rf_write(sc, RT2860_RF1, rfprog[i].r1);
run_rt2870_rf_write(sc, RT2860_RF2, r2);
run_rt2870_rf_write(sc, RT2860_RF3, r3 | 1);
run_rt2870_rf_write(sc, RT2860_RF4, r4);
- run_delay(sc, 200);
+ run_delay(sc, 10);
run_rt2870_rf_write(sc, RT2860_RF1, rfprog[i].r1);
run_rt2870_rf_write(sc, RT2860_RF2, r2);
@@ -3201,7 +3226,7 @@
/* XXX necessary only when group has changed! */
run_select_chan_group(sc, group);
- run_delay(sc, 1000);
+ run_delay(sc, 10);
return 0;
}
@@ -3359,18 +3384,21 @@
sc->sc_usb_timeout = 0;
- if(vap->iv_state == IEEE80211_S_SCAN){
+ if(vap->iv_state == IEEE80211_S_RUN &&
+ vap->iv_opmode != IEEE80211_M_STA)
+ run_reset_livelock(sc);
+ else if(vap->iv_state == IEEE80211_S_SCAN){
DPRINTF("timeout caused by scan\n");
/* cancel bgscan */
ieee80211_cancel_scan(vap);
- } else if(vap->iv_state == IEEE80211_S_RUN)
- run_reset_livelock(sc);
+ } else
+ DPRINTF("timeout by unknown cause\n");
}
static void
run_reset_livelock(struct run_softc *sc)
{
- struct ieee80211vap *vap = &sc->sc_rvp->vap;
+ uint32_t tmp;
/*
* In IBSS or HostAP modes (when the hardware sends beacons), the
@@ -3378,10 +3406,11 @@
* like crazy if protection is enabled.
* Reset MAC/BBP for a while
*/
- if (vap->iv_opmode != IEEE80211_M_STA) {
+ run_read(sc, RT2860_DEBUG, &tmp);
+ if((tmp & (1 << 29)) && (tmp & (1 << 7 | 1 << 5))){
DPRINTF("CTS-to-self livelock detected\n");
run_write(sc, RT2860_MAC_SYS_CTRL, RT2860_MAC_SRST);
- run_delay(sc, 4);
+ run_delay(sc, 1);
run_write(sc, RT2860_MAC_SYS_CTRL,
RT2860_MAC_RX_EN | RT2860_MAC_TX_EN);
}
@@ -3623,7 +3652,7 @@
run_rt3070_rf_read(sc, 30, &rf);
/* toggle RF R30 bit 7 */
run_rt3070_rf_write(sc, 30, rf | 0x80);
- run_delay(sc, 1000);
+ run_delay(sc, 10);
run_rt3070_rf_write(sc, 30, rf & ~0x80);
/* initialize RF registers to default value */
@@ -3747,7 +3776,7 @@
for (ntries = 0; ntries < 100; ntries++) {
/* transmit test tone */
run_bbp_write(sc, 25, 0x90);
- run_delay(sc, 1000);
+ run_delay(sc, 10);
/* read received power */
run_bbp_read(sc, 55, &bbp55_pb);
if (bbp55_pb != 0)
@@ -3761,7 +3790,7 @@
for (ntries = 0; ntries < 100; ntries++) {
/* transmit test tone */
run_bbp_write(sc, 25, 0x90);
- run_delay(sc, 1000);
+ run_delay(sc, 10);
/* read received power */
run_bbp_read(sc, 55, &bbp55_sb);
@@ -3803,7 +3832,7 @@
return error;
if ((tmp & (RT2860_TX_DMA_BUSY | RT2860_RX_DMA_BUSY)) == 0)
break;
- run_delay(sc, 1000);
+ run_delay(sc, 50);
}
if (ntries == 200)
return ETIMEDOUT;
@@ -3870,7 +3899,7 @@
goto fail;
if ((tmp & (RT2860_TX_DMA_BUSY | RT2860_RX_DMA_BUSY)) == 0)
break;
- run_delay(sc, 1000);
+ run_delay(sc, 10);
}
if (ntries == 100) {
printf("%s: timeout waiting for DMA engine\n",
@@ -3924,7 +3953,7 @@
goto fail;
if (!(tmp & (RT2860_RX_STATUS_BUSY | RT2860_TX_STATUS_BUSY)))
break;
- run_delay(sc, 1000);
+ run_delay(sc, 10);
}
if (ntries == 100)
goto fail;
@@ -3932,7 +3961,7 @@
/* clear Host to MCU mailbox */
run_write(sc, RT2860_H2M_BBPAGENT, 0);
run_write(sc, RT2860_H2M_MAILBOX, 0);
- run_delay(sc, 1000);
+ run_delay(sc, 10);
if (run_bbp_init(sc) != 0) {
printf("%s: could not initialize BBP\n",
@@ -4094,11 +4123,11 @@
DPRINTF("All Tx cleared\n");
break;
}
- run_delay(sc, 1000);
+ run_delay(sc, 10);
}
if(ntries >= 100)
DPRINTF("There are still pending Tx\n");
- run_delay(sc, 1000);
+ run_delay(sc, 10);
run_write(sc, RT2860_USB_DMA_CFG, 0);
run_write(sc, RT2860_MAC_SYS_CTRL, RT2860_BBP_HRST | RT2860_MAC_SRST);
More information about the p4-projects
mailing list