|
@@ -813,29 +813,24 @@ static void rt2800pci_txdone(struct rt2x00_dev *rt2x00dev)
|
|
struct txdone_entry_desc txdesc;
|
|
struct txdone_entry_desc txdesc;
|
|
u32 word;
|
|
u32 word;
|
|
u32 reg;
|
|
u32 reg;
|
|
- u32 old_reg;
|
|
|
|
int wcid, ack, pid, tx_wcid, tx_ack, tx_pid;
|
|
int wcid, ack, pid, tx_wcid, tx_ack, tx_pid;
|
|
u16 mcs, real_mcs;
|
|
u16 mcs, real_mcs;
|
|
|
|
+ int i;
|
|
|
|
|
|
/*
|
|
/*
|
|
- * During each loop we will compare the freshly read
|
|
|
|
- * TX_STA_FIFO register value with the value read from
|
|
|
|
- * the previous loop. If the 2 values are equal then
|
|
|
|
- * we should stop processing because the chance it
|
|
|
|
- * 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++) {
|
|
rt2800_register_read(rt2x00dev, TX_STA_FIFO, ®);
|
|
rt2800_register_read(rt2x00dev, TX_STA_FIFO, ®);
|
|
if (!rt2x00_get_field32(reg, TX_STA_FIFO_VALID))
|
|
if (!rt2x00_get_field32(reg, TX_STA_FIFO_VALID))
|
|
break;
|
|
break;
|
|
|
|
|
|
- if (old_reg == reg)
|
|
|
|
- break;
|
|
|
|
- old_reg = reg;
|
|
|
|
-
|
|
|
|
wcid = rt2x00_get_field32(reg, TX_STA_FIFO_WCID);
|
|
wcid = rt2x00_get_field32(reg, TX_STA_FIFO_WCID);
|
|
ack = rt2x00_get_field32(reg, TX_STA_FIFO_TX_ACK_REQUIRED);
|
|
ack = rt2x00_get_field32(reg, TX_STA_FIFO_TX_ACK_REQUIRED);
|
|
pid = rt2x00_get_field32(reg, TX_STA_FIFO_PID_TYPE);
|
|
pid = rt2x00_get_field32(reg, TX_STA_FIFO_PID_TYPE);
|