mwifiex: do not increase tx_pkts_queued if receive address tx paused
authorXinming Hu <huxm@marvell.com>
Mon, 22 Jun 2015 13:36:09 +0000 (19:06 +0530)
committerKalle Valo <kvalo@codeaurora.org>
Tue, 21 Jul 2015 13:40:16 +0000 (16:40 +0300)
If tx_pkts_queued is increased for tx paused receive address, tx process
will be triggered for this packet. But since RA list was tx paused,
there will be an infinite loop in mwifiex_wmm_process_tx waiting for the
event(tx pause, tdls cs) to cancel tx pause. This will be an dead loop,
since main_process was locked at this time, there will be no opportunity
to process event.

So do not increase tx_pkts_queued if receive address tx paused,
this will be restored RA list is unpaused.

Signed-off-by: Xinming Hu <huxm@marvell.com>
Signed-off-by: Avinash Patil <patila@marvell.com>
Signed-off-by: Cathy Luo <cluo@marvell.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/mwifiex/wmm.c

index 8a4dd248ff01fe598cefa475251fbcdcc3c78ba3..8e343b3f60e9038149ceff42c9d05eacc434e844 100644 (file)
@@ -803,7 +803,10 @@ mwifiex_wmm_add_buf_txqueue(struct mwifiex_private *priv,
                atomic_set(&priv->wmm.highest_queued_prio,
                           priv->tos_to_tid_inv[tid_down]);
 
-       atomic_inc(&priv->wmm.tx_pkts_queued);
+       if (ra_list->tx_paused)
+               priv->wmm.pkts_paused[tid_down]++;
+       else
+               atomic_inc(&priv->wmm.tx_pkts_queued);
 
        spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock, flags);
 }