|
@@ -2052,29 +2052,24 @@ static void rt61pci_txdone(struct rt2x00_dev *rt2x00dev)
|
|
|
struct txdone_entry_desc txdesc;
|
|
|
u32 word;
|
|
|
u32 reg;
|
|
|
- u32 old_reg;
|
|
|
int type;
|
|
|
int index;
|
|
|
+ int i;
|
|
|
|
|
|
/*
|
|
|
- * During each loop we will compare the freshly read
|
|
|
- * STA_CSR4 register value with the value read from
|
|
|
- * the previous loop. If the 2 values are equal then
|
|
|
- * we should stop processing because the chance is
|
|
|
- * quite big that the device has been unplugged and
|
|
|
- * we risk going into an endless loop.
|
|
|
+ * TX_STA_FIFO is a stack of X entries, hence read TX_STA_FIFO
|
|
|
+ * at most X times and also stop processing once the TX_STA_FIFO_VALID
|
|
|
+ * flag is not set anymore.
|
|
|
+ *
|
|
|
+ * The legacy drivers use X=TX_RING_SIZE but state in a comment
|
|
|
+ * that the TX_STA_FIFO stack has a size of 16. We stick to our
|
|
|
+ * tx ring size for now.
|
|
|
*/
|
|
|
- old_reg = 0;
|
|
|
-
|
|
|
- while (1) {
|
|
|
+ for (i = 0; i < TX_ENTRIES; i++) {
|
|
|
rt2x00pci_register_read(rt2x00dev, STA_CSR4, ®);
|
|
|
if (!rt2x00_get_field32(reg, STA_CSR4_VALID))
|
|
|
break;
|
|
|
|
|
|
- if (old_reg == reg)
|
|
|
- break;
|
|
|
- old_reg = reg;
|
|
|
-
|
|
|
/*
|
|
|
* Skip this entry when it contains an invalid
|
|
|
* queue identication number.
|