PERFORCE change 64280 for review
Sam Leffler
sam at FreeBSD.org
Thu Nov 4 16:29:02 PST 2004
http://perforce.freebsd.org/chv.cgi?CH=64280
Change 64280 by sam at sam_ebb on 2004/11/05 00:28:12
Handle forthcoming parts that have few h/w tx queues. When
we don't have enough queues to handle all the WME classes
we fallback to sticking them all in the same h/w queue.
We could do better here if we're more intelligent about
managing the queues, like allocating+freeing them based
on operation mode changes (since the only issue is when
operating in ap or ibss mode). To be revisited.
Affected files ...
.. //depot/projects/wifi/sys/dev/ath/if_ath.c#12 edit
.. //depot/projects/wifi/sys/dev/ath/if_athvar.h#4 edit
Differences ...
==== //depot/projects/wifi/sys/dev/ath/if_ath.c#12 (text+ko) ====
@@ -249,6 +249,7 @@
struct ath_hal *ah;
HAL_STATUS status;
int error = 0, i;
+ u_int32_t numqs;
DPRINTF(sc, ATH_DEBUG_ANY, "%s: devid 0x%x\n", __func__, devid);
@@ -376,14 +377,35 @@
error = EIO;
goto bad2;
}
- /* NB: insure BK queue is h/w queue 0 */
- if (!ath_tx_setup(sc, WME_AC_BK, HAL_WME_AC_BK) ||
- !ath_tx_setup(sc, WME_AC_BE, HAL_WME_AC_BE) ||
- !ath_tx_setup(sc, WME_AC_VI, HAL_WME_AC_VI) ||
- !ath_tx_setup(sc, WME_AC_VO, HAL_WME_AC_VO)) {
- error = EIO;
- goto bad2;
+ (void) ath_hal_getnumtxqueues(ah, &numqs);
+ if (numqs < 5) {
+ int qnum;
+ /*
+ * Not enough hardware tx queues to properly do WME;
+ * just punt and assign them all to the same h/w queue.
+ * We could do a better job of this if, for example,
+ * we allocate queues when we switch from station
+ * to AP mode.
+ */
+ if (!ath_tx_setup(sc, WME_AC_BK, HAL_WME_AC_BK)) {
+ error = EIO;
+ goto bad2;
+ }
+ qnum = sc->sc_txq[WME_AC_BK].axq_qnum;
+ sc->sc_ac2q[WME_AC_BE] = &sc->sc_txq[qnum];
+ sc->sc_ac2q[WME_AC_VI] = &sc->sc_txq[qnum];
+ sc->sc_ac2q[WME_AC_VO] = &sc->sc_txq[qnum];
+ } else {
+ /* NB: insure BK queue is h/w queue 0 */
+ if (!ath_tx_setup(sc, WME_AC_BK, HAL_WME_AC_BK) ||
+ !ath_tx_setup(sc, WME_AC_BE, HAL_WME_AC_BE) ||
+ !ath_tx_setup(sc, WME_AC_VI, HAL_WME_AC_VI) ||
+ !ath_tx_setup(sc, WME_AC_VO, HAL_WME_AC_VO)) {
+ error = EIO;
+ goto bad2;
+ }
}
+
/*
* Special case certain configurations.
*/
@@ -511,13 +533,13 @@
ath_announce(sc);
return 0;
bad2:
- if (sc->sc_txq[WME_AC_BK].axq_qnum != (u_int) -1)
+ if (ATH_TXQ_SETUP(sc, WME_AC_BK))
ATH_TXQ_LOCK_DESTROY(&sc->sc_txq[WME_AC_BK]);
- if (sc->sc_txq[WME_AC_BE].axq_qnum != (u_int) -1)
+ if (ATH_TXQ_SETUP(sc, WME_AC_BE))
ATH_TXQ_LOCK_DESTROY(&sc->sc_txq[WME_AC_BE]);
- if (sc->sc_txq[WME_AC_VI].axq_qnum != (u_int) -1)
+ if (ATH_TXQ_SETUP(sc, WME_AC_VI))
ATH_TXQ_LOCK_DESTROY(&sc->sc_txq[WME_AC_VI]);
- if (sc->sc_txq[WME_AC_VO].axq_qnum != (u_int) -1)
+ if (ATH_TXQ_SETUP(sc, WME_AC_VO))
ATH_TXQ_LOCK_DESTROY(&sc->sc_txq[WME_AC_VO]);
ath_desc_free(sc);
bad:
==== //depot/projects/wifi/sys/dev/ath/if_athvar.h#4 (text+ko) ====
@@ -400,6 +400,8 @@
(ath_hal_getcapability(_ah, HAL_CAP_DIAG, 0, _pv) == HAL_OK)
#define ath_hal_setdiag(_ah, _v) \
ath_hal_setcapability(_ah, HAL_CAP_DIAG, 0, _v, NULL)
+#define ath_hal_getnumtxqueues(_ah, _pv) \
+ (ath_hal_getcapability(_ah, HAL_CAP_NUM_TXQUEUES, 0, _pv) == HAL_OK)
#define ath_hal_setuprxdesc(_ah, _ds, _size, _intreq) \
((*(_ah)->ah_setupRxDesc)((_ah), (_ds), (_size), (_intreq)))
More information about the p4-projects
mailing list