rt2x00: Add support for retry rates
authorBenoit PAPILLAULT <benoit.papillault@free.fr>
Mon, 17 Aug 2009 16:56:10 +0000 (18:56 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 20 Aug 2009 15:36:02 +0000 (11:36 -0400)
rt2800pci can handle different retry rates,
it will always step 1 rate down after a failed
transmission so creating the retry rate list
for mac80211 is quite simple.

Signed-off-by: Benoit PAPILLAULT <benoit.papillault@free.fr>
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/rt2x00/rt2x00dev.c
drivers/net/wireless/rt2x00/rt2x00queue.h

index b6676c6722fc54de677c1cf6bef92f29f7771ec1..9ab70e435b5d1b1211642a60601c9a57b25e6205 100644 (file)
@@ -220,7 +220,8 @@ void rt2x00lib_txdone(struct queue_entry *entry,
        struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
        enum data_queue_qid qid = skb_get_queue_mapping(entry->skb);
        unsigned int header_length = ieee80211_get_hdrlen_from_skb(entry->skb);
-       u8 rate_idx, rate_flags;
+       u8 rate_idx, rate_flags, retry_rates;
+       unsigned int i;
 
        /*
         * Unmap the skb.
@@ -259,16 +260,27 @@ void rt2x00lib_txdone(struct queue_entry *entry,
 
        rate_idx = skbdesc->tx_rate_idx;
        rate_flags = skbdesc->tx_rate_flags;
+       retry_rates = test_bit(TXDONE_FALLBACK, &txdesc->flags) ?
+           (txdesc->retry + 1) : 1;
 
        /*
         * Initialize TX status
         */
        memset(&tx_info->status, 0, sizeof(tx_info->status));
        tx_info->status.ack_signal = 0;
-       tx_info->status.rates[0].idx = rate_idx;
-       tx_info->status.rates[0].flags = rate_flags;
-       tx_info->status.rates[0].count = txdesc->retry + 1;
-       tx_info->status.rates[1].idx = -1; /* terminate */
+
+       /*
+        * Frame was send with retries, hardware tried
+        * different rates to send out the frame, at each
+        * retry it lowered the rate 1 step.
+        */
+       for (i = 0; i < retry_rates && i < IEEE80211_TX_MAX_RATES; i++) {
+               tx_info->status.rates[i].idx = rate_idx - i;
+               tx_info->status.rates[i].flags = rate_flags;
+               tx_info->status.rates[i].count = 1;
+       }
+       if (i < (IEEE80211_TX_MAX_RATES -1))
+               tx_info->status.rates[i].idx = -1; /* terminate */
 
        if (!(tx_info->flags & IEEE80211_TX_CTL_NO_ACK)) {
                if (test_bit(TXDONE_SUCCESS, &txdesc->flags) ||
index 47d175a13790951a252421f189724fa8dc17079c..a5591fb2b1915a5114046001f3b10374d4b81bd7 100644 (file)
@@ -214,6 +214,7 @@ struct rxdone_entry_desc {
  *
  * @TXDONE_UNKNOWN: Hardware could not determine success of transmission.
  * @TXDONE_SUCCESS: Frame was successfully send
+ * @TXDONE_FALLBACK: Frame was successfully send using a fallback rate.
  * @TXDONE_FAILURE: Frame was not successfully send
  * @TXDONE_EXCESSIVE_RETRY: In addition to &TXDONE_FAILURE, the
  *     frame transmission failed due to excessive retries.
@@ -221,6 +222,7 @@ struct rxdone_entry_desc {
 enum txdone_entry_desc_flags {
        TXDONE_UNKNOWN,
        TXDONE_SUCCESS,
+       TXDONE_FALLBACK,
        TXDONE_FAILURE,
        TXDONE_EXCESSIVE_RETRY,
 };