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 <[email protected]>
---
drivers/staging/vt6655/device_main.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/drivers/staging/vt6655/device_main.c b/drivers/staging/vt6655/device_main.c
index f0b336b..35d69a9 100644
--- a/drivers/staging/vt6655/device_main.c
+++ b/drivers/staging/vt6655/device_main.c
@@ -1181,10 +1181,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);
}
}
@@ -1357,6 +1353,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);
--
2.1.0