Commit 62bc060b authored by Mattias Nissler's avatar Mattias Nissler Committed by John W. Linville

rt2x00: Allow rt61 to catch up after a missing tx report

Sometimes it happens in the tx path that an entry given to the hardware isn't
reported in the txdone handler. This ultimately led to the dreaded "non-free
entry in the non-full queue" message and the stopping of the tx queue. Work
around this issue by allowing the driver to also clear out previos entries in
the txdone handler.
Signed-off-by: default avatarMattias Nissler <mattias.nissler@gmx.de>
Signed-off-by: default avatarIvo van Doorn <IvDoorn@gmail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 3ce54450
...@@ -1738,6 +1738,7 @@ static void rt61pci_txdone(struct rt2x00_dev *rt2x00dev) ...@@ -1738,6 +1738,7 @@ static void rt61pci_txdone(struct rt2x00_dev *rt2x00dev)
{ {
struct data_ring *ring; struct data_ring *ring;
struct data_entry *entry; struct data_entry *entry;
struct data_entry *entry_done;
struct data_desc *txd; struct data_desc *txd;
u32 word; u32 word;
u32 reg; u32 reg;
...@@ -1791,6 +1792,17 @@ static void rt61pci_txdone(struct rt2x00_dev *rt2x00dev) ...@@ -1791,6 +1792,17 @@ static void rt61pci_txdone(struct rt2x00_dev *rt2x00dev)
!rt2x00_get_field32(word, TXD_W0_VALID)) !rt2x00_get_field32(word, TXD_W0_VALID))
return; return;
entry_done = rt2x00_get_data_entry_done(ring);
while (entry != entry_done) {
/* Catch up. Just report any entries we missed as
* failed. */
WARNING(rt2x00dev,
"TX status report missed for entry %p\n",
entry_done);
rt2x00lib_txdone(entry_done, TX_FAIL_OTHER, 0);
entry_done = rt2x00_get_data_entry_done(ring);
}
/* /*
* Obtain the status about this packet. * Obtain the status about this packet.
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment