staging: vt6655: change tx wake queue
authorMalcolm Priestley <tvboxspy@gmail.com>
Tue, 4 Nov 2014 14:49:46 +0000 (14:49 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 5 Nov 2014 22:52:59 +0000 (14:52 -0800)
Wake queue in the dwIsr loop of device_intr instead of device_tx_srv.

This fixes an issue when ISR_TXDMA0 or ISR_AC0DMA does not occur
device_tx_srv is not called and the queue gets stuck in stopped
condition.

On test if the queue is stuck another MACvTransmitAC0 or MACvTransmit0
in vnt_tx_packet will clear it.

Check on vif that both buffers are available and the queue is stopped.

Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/vt6655/device_main.c

index 00eb89a2792568bd95b8cc77315b68ddb533d3d0..5fc6022badb214ce722e9630dcdbf2a41aee5cf2 100644 (file)
@@ -1014,10 +1014,6 @@ static int device_tx_srv(struct vnt_private *pDevice, unsigned int uIdx)
                        }
                        device_free_tx_buf(pDevice, pTD);
                        pDevice->iTDUsed[uIdx]--;
-
-                       /* Make sure queue is available */
-                       if (AVAIL_TD(pDevice, uIdx))
-                               ieee80211_wake_queues(pDevice->hw);
                }
        }
 
@@ -1190,6 +1186,14 @@ static  irqreturn_t  device_intr(int irq,  void *dev_instance)
                        }
                }
 
+               /* If both buffers available wake the queue */
+               if (pDevice->vif) {
+                       if (AVAIL_TD(pDevice, TYPE_TXDMA0) &&
+                           AVAIL_TD(pDevice, TYPE_AC0DMA) &&
+                           ieee80211_queue_stopped(pDevice->hw, 0))
+                               ieee80211_wake_queues(pDevice->hw);
+               }
+
                MACvReadISR(pDevice->PortOffset, &pDevice->dwIsr);
 
                MACvReceive0(pDevice->PortOffset);