[Madwifi-cvs] revision 2975 committed
Status: Beta
Brought to you by:
otaku
From: Michael T. <svn...@ma...> - 2007-11-26 08:32:24
|
Project : madwifi Revision : 2975 Author : mtaylor (Michael Taylor) Date : 2007-11-26 09:32:20 +0100 (Mon, 26 Nov 2007) Log Message : CABQ has been disabled for IBSS in this branch for some time, but the mcastq was not being drained and was consuming/holding txbufs. I've added a simplified block to drain that queue until the IBSS bug gets fixed. Affected Files: * madwifi/branches/madwifi-dfs/ath/if_ath.c updated Modified: madwifi/branches/madwifi-dfs/ath/if_ath.c =================================================================== --- madwifi/branches/madwifi-dfs/ath/if_ath.c 2007-11-26 08:06:27 UTC (rev 2974) +++ madwifi/branches/madwifi-dfs/ath/if_ath.c 2007-11-26 08:32:20 UTC (rev 2975) @@ -2726,7 +2726,6 @@ struct ath_desc *lastds, int framelen) { struct ath_hal *ah = sc->sc_ah; - if (ath_check_radio_silence_not_required(sc, __func__)) return; /* @@ -4694,17 +4693,32 @@ * Enable the CAB queue before the beacon queue to * ensure cab frames are triggered by this beacon. */ - /* - Currently CABQ is disabled for IBSS because it was reported that this - prevented beaconing in IBSS mode, but we *need* to flush stuff in this - queue or else it is a source of buffer leaks, as it is *never* reclaimed - if it isn't processed.... - */ /* NB: only at DTIM */ - if (sc->sc_ic.ic_opmode != IEEE80211_M_IBSS && (avp->av_boff.bo_tim[4] & 1)) { + if (avp->av_boff.bo_tim[4] & 1) { struct ath_txq *cabq = sc->sc_cabq; struct ath_buf *bfmcast; +/* +Currently CABQ is disabled for IBSS because it was reported that this +prevented beaconing in IBSS mode, in the mean time we are flushing the +mcast/cabq instead of sending it to hardware because otherwise it eats into +our txbuf pool drastically. This is clone of a subset of the ath_draintxq +method, as a temporary fix until IBSS multicast is fixed... +*/ +if (sc->sc_ic.ic_opmode == IEEE80211_M_IBSS) { + for (;;) { + ATH_TXQ_LOCK_IRQ(&avp->av_mcastq); + bfmcast = STAILQ_FIRST(&avp->av_mcastq.axq_q); + if (bfmcast == NULL) { + ATH_TXQ_UNLOCK_IRQ_EARLY(&avp->av_mcastq); + avp->av_mcastq.axq_link = NULL; + return bf; + } + ATH_TXQ_REMOVE_HEAD(&avp->av_mcastq, bf_list); + ath_return_txbuf(sc, &bfmcast); + ATH_TXQ_UNLOCK_IRQ(&avp->av_mcastq); + } +} /* * Move everything from the VAPs mcast queue * to the hardware cab queue. |