mirror of
https://github.com/torvalds/linux.git
synced 2024-12-22 19:01:37 +00:00
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: Benoit Papillault <benoit.papillault@free.fr> Signed-off-by: Alban Browaeys <prahal@yahoo.com> Acked-by: Ivo van Doorn <ivdoorn@gmail.com> Signed-off-by: Gertjan van Wingerde <gwingerde@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
632dd959d1
commit
bf18723d50
@ -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))
|
|
||||||
__set_bit(TXDONE_SUCCESS, &txdesc.flags);
|
|
||||||
else
|
|
||||||
__set_bit(TXDONE_FAILURE, &txdesc.flags);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Ralink has a retry mechanism using a global fallback
|
|
||||||
* table. We setup this fallback table to try immediate
|
|
||||||
* lower rate for all rates. In the TX_STA_FIFO,
|
|
||||||
* the MCS field contains the MCS used for the successfull
|
|
||||||
* transmission. If the first transmission succeed,
|
|
||||||
* 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);
|
rt2x00_desc_read(txwi, 0, &word);
|
||||||
mcs = rt2x00_get_field32(word, TXWI_W0_MCS);
|
mcs = rt2x00_get_field32(word, TXWI_W0_MCS);
|
||||||
real_mcs = rt2x00_get_field32(reg, TX_STA_FIFO_MCS);
|
real_mcs = rt2x00_get_field32(reg, TX_STA_FIFO_MCS);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ralink has a retry mechanism using a global fallback
|
||||||
|
* table. We setup this fallback table to try the immediate
|
||||||
|
* lower rate for all rates. In the TX_STA_FIFO, the MCS field
|
||||||
|
* always contains the MCS used for the last transmission, be
|
||||||
|
* it successful or not.
|
||||||
|
*/
|
||||||
|
if (rt2x00_get_field32(reg, TX_STA_FIFO_TX_SUCCESS)) {
|
||||||
|
/*
|
||||||
|
* 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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user