Module Name:    src
Committed By:   dyoung
Date:           Thu Apr  2 00:57:20 UTC 2009

Modified Files:
        src/sys/dev/ic: rtw.c

Log Message:
Add the WEP capability to our net80211 capability flags, since we do
sort of support hardware WEP.  Only change the WEP key index in a Tx
descriptor from 0 if the type of our transmit key is _WEP, not _TKIP:
i.e., only if we're really doing WEP crypto in the hardware.

Ignore a watchdog timeout on any Tx ring if we can collect some packets
from that ring.  Restart both the receiver and the transmitter when a
watchdog timeout occurs instead of restarting only the transmitter.


To generate a diff of this commit:
cvs rdiff -u -r1.106 -r1.107 src/sys/dev/ic/rtw.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/ic/rtw.c
diff -u src/sys/dev/ic/rtw.c:1.106 src/sys/dev/ic/rtw.c:1.107
--- src/sys/dev/ic/rtw.c:1.106	Wed Nov 12 12:36:11 2008
+++ src/sys/dev/ic/rtw.c	Thu Apr  2 00:57:20 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: rtw.c,v 1.106 2008/11/12 12:36:11 ad Exp $ */
+/* $NetBSD: rtw.c,v 1.107 2009/04/02 00:57:20 dyoung Exp $ */
 /*-
  * Copyright (c) 2004, 2005, 2006, 2007 David Young.  All rights
  * reserved.
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rtw.c,v 1.106 2008/11/12 12:36:11 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtw.c,v 1.107 2009/04/02 00:57:20 dyoung Exp $");
 
 #include "bpfilter.h"
 
@@ -1422,7 +1422,11 @@
 
 	/* XXX reference source does not enable MULRW */
 	/* enable PCI Read/Write Multiple */
+#if 1
 	cr |= RTW_CR_MULRW;
+#else
+	cr &= ~RTW_CR_MULRW;
+#endif
 
 	/* The receive engine will always start at RDSAR.  */
 	if (enable && (flags & ~cr & RTW_CR_RE)) {
@@ -1766,10 +1770,11 @@
 }
 
 /* Collect transmitted packets. */
-static void
+static bool
 rtw_collect_txring(struct rtw_softc *sc, struct rtw_txsoft_blk *tsb,
     struct rtw_txdesc_blk *tdb, int force)
 {
+	bool collected = false;
 	int ndesc;
 	struct rtw_txsoft *ts;
 
@@ -1822,6 +1827,8 @@
 			break;
 		}
 
+		collected = true;
+
 		rtw_collect_txpkt(sc, tdb, ts, ndesc);
 		SIMPLEQ_REMOVE_HEAD(&tsb->tsb_dirtyq, ts_q);
 		SIMPLEQ_INSERT_TAIL(&tsb->tsb_freeq, ts, ts_q);
@@ -1831,6 +1838,8 @@
 	if (ts == NULL)
 		tsb->tsb_tx_timer = 0;
 	rtw_reset_oactive(sc);
+
+	return collected;
 }
 
 static void
@@ -3340,7 +3349,8 @@
                  * seem to care, since we don't activate h/w Tx
                  * encryption.
 		 */
-		if (k != NULL) {
+		if (k != NULL &&
+		    k->wk_cipher->ic_cipher == IEEE80211_CIPHER_WEP) {
 			ctl0 |= __SHIFTIN(k->wk_keyix, RTW_TXCTL0_KEYID_MASK) &
 			    RTW_TXCTL0_KEYID_MASK;
 		}
@@ -3510,6 +3520,9 @@
 		else if (--tsb->tsb_tx_timer == 0) {
 			if (SIMPLEQ_EMPTY(&tsb->tsb_dirtyq))
 				continue;
+			else if (rtw_collect_txring(sc, tsb,
+			    &sc->sc_txdesc_blk[pri], 0))
+				continue;
 			printf("%s: transmit timeout, priority %d\n",
 			    ifp->if_xname, pri);
 			ifp->if_oerrors++;
@@ -3526,9 +3539,9 @@
 		 * TBD Stop/restart just the broken rings?
 		 */
 		rtw_idle(&sc->sc_regs);
-		rtw_io_enable(sc, RTW_CR_TE, 0);
+		rtw_io_enable(sc, RTW_CR_RE | RTW_CR_TE, 0);
 		rtw_txdescs_reset(sc);
-		rtw_io_enable(sc, RTW_CR_TE, 1);
+		rtw_io_enable(sc, RTW_CR_RE | RTW_CR_TE, 1);
 		rtw_start(ifp);
 	}
 	ieee80211_watchdog(&sc->sc_ic);
@@ -3761,7 +3774,7 @@
 	ic->ic_phytype = IEEE80211_T_DS;
 	ic->ic_opmode = IEEE80211_M_STA;
 	ic->ic_caps = IEEE80211_C_PMGT | IEEE80211_C_IBSS |
-	    IEEE80211_C_HOSTAP | IEEE80211_C_MONITOR;
+	    IEEE80211_C_HOSTAP | IEEE80211_C_MONITOR | IEEE80211_C_WEP;
 
 	nrate = 0;
 	ic->ic_sup_rates[IEEE80211_MODE_11B].rs_rates[nrate++] =

Reply via email to