diff options
author | Mike McCormack | 2011-02-06 14:55:16 +0100 |
---|---|---|
committer | Greg Kroah-Hartman | 2011-02-09 20:50:19 +0100 |
commit | 1348dc08a912c0bdfc8680df8919dd79de8c3b9a (patch) | |
tree | 8a9773b7b072ae51ee6c62ea1f16c952c26354ef /drivers/staging/rtl8192e | |
parent | staging: rtl8192e: Simplify flow of control in rtl8192_rx (diff) | |
download | kernel-qcow2-linux-1348dc08a912c0bdfc8680df8919dd79de8c3b9a.tar.gz kernel-qcow2-linux-1348dc08a912c0bdfc8680df8919dd79de8c3b9a.tar.xz kernel-qcow2-linux-1348dc08a912c0bdfc8680df8919dd79de8c3b9a.zip |
staging: rtl8192e: Don't call ieee80211_ps_tx_ack in interrupt context
Signed-off-by: Mike McCormack <mikem@ring3k.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/rtl8192e')
-rw-r--r-- | drivers/staging/rtl8192e/r8192E_core.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/drivers/staging/rtl8192e/r8192E_core.c b/drivers/staging/rtl8192e/r8192E_core.c index a63c6e59b2e9..d9e47d0d1017 100644 --- a/drivers/staging/rtl8192e/r8192E_core.c +++ b/drivers/staging/rtl8192e/r8192E_core.c @@ -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 */ |