staging: rtl8192e: Don't call ieee80211_ps_tx_ack in interrupt context
authorMike McCormack <mikem@ring3k.org>
Sun, 6 Feb 2011 13:55:16 +0000 (22:55 +0900)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 9 Feb 2011 19:50:19 +0000 (11:50 -0800)
Signed-off-by: Mike McCormack <mikem@ring3k.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/rtl8192e/r8192E_core.c

index a63c6e59b2e953f33a42c3d80d143cefa2804c0f..d9e47d0d10175a1974fbd615dec290d4d89e9a13 100644 (file)
@@ -988,14 +988,6 @@ static void rtl8192_tx_isr(struct net_device *dev, int prio)
 
                kfree_skb(skb);
        }
-       if (prio == MGNT_QUEUE) {
-               if (priv->ieee80211->ack_tx_to_ieee) {
-                       if (rtl8192_is_tx_queue_empty(dev)) {
-                               priv->ieee80211->ack_tx_to_ieee = 0;
-                               ieee80211_ps_tx_ack(priv->ieee80211, 1);
-                       }
-               }
-       }
 
        if (prio != BEACON_QUEUE) {
                /* try to deal with the pending packets  */
@@ -4957,7 +4949,23 @@ static void rtl8192_tx_resume(struct net_device *dev)
 
 static void rtl8192_irq_tx_tasklet(struct r8192_priv *priv)
 {
-       rtl8192_tx_resume(priv->ieee80211->dev);
+       struct rtl8192_tx_ring *mgnt_ring = &priv->tx_ring[MGNT_QUEUE];
+       struct net_device *dev = priv->ieee80211->dev;
+       unsigned long flags;
+
+       /* check if we need to report that the management queue is drained */
+       spin_lock_irqsave(&priv->irq_th_lock, flags);
+
+       if (!skb_queue_len(&mgnt_ring->queue) &&
+           priv->ieee80211->ack_tx_to_ieee &&
+           rtl8192_is_tx_queue_empty(dev)) {
+               priv->ieee80211->ack_tx_to_ieee = 0;
+               ieee80211_ps_tx_ack(priv->ieee80211, 1);
+       }
+
+       spin_unlock_irqrestore(&priv->irq_th_lock, flags);
+
+       rtl8192_tx_resume(dev);
 }
 
 /* Record the received data rate */