* 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);
        }