diff options
| author | Malcolm Priestley <tvboxspy@gmail.com> | 2014-11-04 14:49:46 +0000 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-11-05 14:52:59 -0800 |
| commit | 54fbb2da8d4cef4f57d0cf70b84471dd61a7af5f (patch) | |
| tree | 89fecd3d1cb01900649e8cd88acaba5e96b5eae8 | |
| parent | 9b505647bf995bb2a11ad361f6d4799e05b3478e (diff) | |
staging: vt6655: change tx wake queue
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>
| -rw-r--r-- | drivers/staging/vt6655/device_main.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/drivers/staging/vt6655/device_main.c b/drivers/staging/vt6655/device_main.c index 00eb89a27925..5fc6022badb2 100644 --- a/drivers/staging/vt6655/device_main.c +++ b/drivers/staging/vt6655/device_main.c @@ -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); |
