aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00/rt61pci.c
diff options
context:
space:
mode:
authorIvo van Doorn <ivdoorn@gmail.com>2008-05-10 07:42:06 -0400
committerJohn W. Linville <linville@tuxdriver.com>2008-05-21 21:47:30 -0400
commitfb55f4d1fa252ba1e479284b79da1049d658c371 (patch)
tree0922dcd4e12037026293dd41914d774f06955641 /drivers/net/wireless/rt2x00/rt61pci.c
parent5a6e59991b82580c3ca00115603b85762ec76104 (diff)
rt2x00: Fix TX status reporting
The tx_status enumeration was broken since the introduction of rt61pci. That driver uses different values to report the status of the tx action. This would lead to frames that were reported as success but actually failed to be send out, or frames that were neither successfull or failure which were reported as failure. Fix this by change the TX status reporting and more explicitely check for failure or success. Note that a third possibility is added "unknown". Not all hardware (USB) can report the actual TX status, for rt61pci some frames will receive this status because the TXdone handler is never called for those frames. This unknown will now be handled as neither success or failure, so we no longer increment the failure counter while this conclusion could not be determined from the real status of the frame. Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt61pci.c')
-rw-r--r--drivers/net/wireless/rt2x00/rt61pci.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
index edddbf35bbab..15191d6581b1 100644
--- a/drivers/net/wireless/rt2x00/rt61pci.c
+++ b/drivers/net/wireless/rt2x00/rt61pci.c
@@ -1764,7 +1764,8 @@ static void rt61pci_txdone(struct rt2x00_dev *rt2x00dev)
1764 "TX status report missed for entry %d\n", 1764 "TX status report missed for entry %d\n",
1765 entry_done->entry_idx); 1765 entry_done->entry_idx);
1766 1766
1767 txdesc.status = TX_FAIL_OTHER; 1767 txdesc.flags = 0;
1768 __set_bit(TXDONE_UNKNOWN, &txdesc.flags);
1768 txdesc.retry = 0; 1769 txdesc.retry = 0;
1769 1770
1770 rt2x00pci_txdone(rt2x00dev, entry_done, &txdesc); 1771 rt2x00pci_txdone(rt2x00dev, entry_done, &txdesc);
@@ -1774,7 +1775,17 @@ static void rt61pci_txdone(struct rt2x00_dev *rt2x00dev)
1774 /* 1775 /*
1775 * Obtain the status about this packet. 1776 * Obtain the status about this packet.
1776 */ 1777 */
1777 txdesc.status = rt2x00_get_field32(reg, STA_CSR4_TX_RESULT); 1778 txdesc.flags = 0;
1779 switch (rt2x00_get_field32(reg, STA_CSR4_TX_RESULT)) {
1780 case 0: /* Success, maybe with retry */
1781 __set_bit(TXDONE_SUCCESS, &txdesc.flags);
1782 break;
1783 case 6: /* Failure, excessive retries */
1784 __set_bit(TXDONE_EXCESSIVE_RETRY, &txdesc.flags);
1785 /* Don't break, this is a failed frame! */
1786 default: /* Failure */
1787 __set_bit(TXDONE_FAILURE, &txdesc.flags);
1788 }
1778 txdesc.retry = rt2x00_get_field32(reg, STA_CSR4_RETRY_COUNT); 1789 txdesc.retry = rt2x00_get_field32(reg, STA_CSR4_RETRY_COUNT);
1779 1790
1780 rt2x00pci_txdone(rt2x00dev, entry, &txdesc); 1791 rt2x00pci_txdone(rt2x00dev, entry, &txdesc);