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: Mattias Nissler <mattias.nissler@gmx.de> Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
3ce5445046
commit
62bc060b8e
|
@ -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)
|
||||||
!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.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue