|
@@ -974,26 +974,36 @@ static void rt2800pci_txdone(struct rt2x00_dev *rt2x00dev)
|
|
|
* Obtain the status about this packet.
|
|
|
*/
|
|
|
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);
|
|
|
+ rt2x00_desc_read(txwi, 0, &word);
|
|
|
+ mcs = rt2x00_get_field32(word, TXWI_W0_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 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).
|
|
|
+ * 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.
|
|
|
*/
|
|
|
- rt2x00_desc_read(txwi, 0, &word);
|
|
|
- mcs = rt2x00_get_field32(word, TXWI_W0_MCS);
|
|
|
- real_mcs = rt2x00_get_field32(reg, TX_STA_FIFO_MCS);
|
|
|
+ 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);
|
|
|
- txdesc.retry = mcs - min(mcs, real_mcs);
|
|
|
+
|
|
|
|
|
|
rt2x00lib_txdone(entry, &txdesc);
|
|
|
}
|