On Thu, Feb 3, 2011 at 10:23 PM, Vivek Natarajan <vnatarajan@xxxxxxxxxxx> wrote: > In a highly noisy environment, a data frame which is queued before > a nullfunc frame on a different hw queue may be sent over the air > after the tx completion of nullfunc frame. This causes the station > to enter power save and the AP to see the station as awake and > continues to send the data traffic. Fix this by draining all tx > queues before we send the null function frame with PM bit set. > > Signed-off-by: Vivek Natarajan <vnatarajan@xxxxxxxxxxx> Hm nice, this is a good example of one of those random not-so-critical but still nice fixes which I wish would go to stable. John, Greg, any qualms for such things to go to stable if they apply? It was my impression we could send it, but I want to verify with both you guys so neither we or John get bashed if we try to send it as a stable fix. Vivek, is this applicable to stable kernels or does the hunk not even apply? Luis > --- > Âdrivers/net/wireless/ath/ath9k/xmit.c | Â 10 +++++++++- > Â1 files changed, 9 insertions(+), 1 deletions(-) > > diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c > index 68a1c76..0cb6017 100644 > --- a/drivers/net/wireless/ath/ath9k/xmit.c > +++ b/drivers/net/wireless/ath/ath9k/xmit.c > @@ -1710,7 +1710,6 @@ static struct ath_buf *ath_tx_setup_buffer(struct ieee80211_hw *hw, > Â Â Â Â Â Â Â Â Â Â Â Â Â Âbf->bf_buf_addr, > Â Â Â Â Â Â Â Â Â Â Â Â Â Âtxq->axq_qnum); > > - > Â Â Â Âreturn bf; > Â} > > @@ -1813,6 +1812,15 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb, > Â Â Â Âif (unlikely(!bf)) > Â Â Â Â Â Â Â Âreturn -ENOMEM; > > + Â Â Â if (ieee80211_is_nullfunc(hdr->frame_control) && > + Â Â Â Â Â ieee80211_has_pm(hdr->frame_control)) { > + Â Â Â Â Â Â Â /* Drain all the pending frames before we send a nullfunc frame > + Â Â Â Â Â Â Â Â* to avoid any power save state mismatch between the station > + Â Â Â Â Â Â Â Â* and the AP. > + Â Â Â Â Â Â Â Â*/ > + Â Â Â Â Â Â Â ath_drain_all_txq(sc, false); > + Â Â Â } > + > Â Â Â Âq = skb_get_queue_mapping(skb); > Â Â Â Âspin_lock_bh(&txq->axq_lock); > Â Â Â Âif (txq == sc->tx.txq_map[q] && > -- > 1.6.3.3 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-wireless" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at Âhttp://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html