Commit bf18723d authored by Alban Browaeys's avatar Alban Browaeys Committed by John W. Linville

rt2x00: Fix TX status reporting for rt2800pci.

After testing, we found that TX_STA_FIFO_MCS is the last MCS value
tried. If the transmission failed, 8 frames have been transmitted. If the
transmission succeed, we can easily compute the number of retry.  This patch fix
the way status is reported to mac80211 rate control. It has 2 bugs :

1. mcs can contain the short preamble flag and it will lead to wrong
computations.

2. minstrel nearly always say that 54 Mbits is the best rate, even if we are
very far from the AP
Signed-off-by: default avatarBenoit Papillault <benoit.papillault@free.fr>
Signed-off-by: default avatarAlban Browaeys <prahal@yahoo.com>
Acked-by: default avatarIvo van Doorn <ivdoorn@gmail.com>
Signed-off-by: default avatarGertjan van Wingerde <gwingerde@gmail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 632dd959
...@@ -974,26 +974,36 @@ static void rt2800pci_txdone(struct rt2x00_dev *rt2x00dev) ...@@ -974,26 +974,36 @@ static void rt2800pci_txdone(struct rt2x00_dev *rt2x00dev)
* Obtain the status about this packet. * Obtain the status about this packet.
*/ */
txdesc.flags = 0; txdesc.flags = 0;
if (rt2x00_get_field32(reg, TX_STA_FIFO_TX_SUCCESS)) rt2x00_desc_read(txwi, 0, &word);
__set_bit(TXDONE_SUCCESS, &txdesc.flags); mcs = rt2x00_get_field32(word, TXWI_W0_MCS);
else real_mcs = rt2x00_get_field32(reg, TX_STA_FIFO_MCS);
__set_bit(TXDONE_FAILURE, &txdesc.flags);
/* /*
* Ralink has a retry mechanism using a global fallback * Ralink has a retry mechanism using a global fallback
* table. We setup this fallback table to try immediate * table. We setup this fallback table to try the immediate
* lower rate for all rates. In the TX_STA_FIFO, * lower rate for all rates. In the TX_STA_FIFO, the MCS field
* the MCS field contains the MCS used for the successfull * always contains the MCS used for the last transmission, be
* transmission. If the first transmission succeed, * it successful or not.
* we have mcs == tx_mcs. On the second transmission,
* we have mcs = tx_mcs - 1. So the number of
* retry is (tx_mcs - mcs).
*/ */
rt2x00_desc_read(txwi, 0, &word); if (rt2x00_get_field32(reg, TX_STA_FIFO_TX_SUCCESS)) {
mcs = rt2x00_get_field32(word, TXWI_W0_MCS); /*
real_mcs = rt2x00_get_field32(reg, TX_STA_FIFO_MCS); * Transmission succeeded. The number of retries is
* mcs - real_mcs
*/
__set_bit(TXDONE_SUCCESS, &txdesc.flags);
txdesc.retry = ((mcs > real_mcs) ? mcs - real_mcs : 0);
} else {
/*
* Transmission failed. The number of retries is
* always 7 in this case (for a total number of 8
* frames sent).
*/
__set_bit(TXDONE_FAILURE, &txdesc.flags);
txdesc.retry = 7;
}
__set_bit(TXDONE_FALLBACK, &txdesc.flags); __set_bit(TXDONE_FALLBACK, &txdesc.flags);
txdesc.retry = mcs - min(mcs, real_mcs);
rt2x00lib_txdone(entry, &txdesc); rt2x00lib_txdone(entry, &txdesc);
} }
......
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