wl12xx: Set IEEE80211_TX_RC_MCS on MCS rates on TX complete.
authorPontus Fuchs <pontus.fuchs@gmail.com>
Tue, 31 Jan 2012 15:54:40 +0000 (17:54 +0200)
committerLuciano Coelho <coelho@ti.com>
Wed, 15 Feb 2012 06:38:32 +0000 (08:38 +0200)
IEEE80211_TX_RC_MCS was not set correctly leading to incorrect link
speed calculation.

Signed-off-by: Pontus Fuchs <pontus.fuchs@gmail.com>
Signed-off-by: Ido Reis <idor@ti.com>
Signed-off-by: Eliad Peller <eliad@wizery.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
drivers/net/wireless/wl12xx/conf.h
drivers/net/wireless/wl12xx/tx.c

index 10e5e3df4b95637b72ae0001505419d77f47ffac..209f053129095772635e9ab583924b5fea17cbe8 100644 (file)
@@ -91,6 +91,10 @@ enum {
        CONF_HW_RXTX_RATE_UNSUPPORTED = 0xff
 };
 
+/* Rates between and including these are MCS rates */
+#define CONF_HW_RXTX_RATE_MCS_MIN CONF_HW_RXTX_RATE_MCS7
+#define CONF_HW_RXTX_RATE_MCS_MAX CONF_HW_RXTX_RATE_MCS0
+
 enum {
        CONF_SG_DISABLE = 0,
        CONF_SG_PROTECTIVE,
index 2bf43b86a3f9f48ec52ba52505df401a147dffae..f95112f6769fae2ce029f99ea87274b6679697fe 100644 (file)
@@ -764,6 +764,14 @@ out:
        mutex_unlock(&wl->mutex);
 }
 
+static u8 wl1271_tx_get_rate_flags(u8 rate_class_index)
+{
+       if (rate_class_index >= CONF_HW_RXTX_RATE_MCS_MIN &&
+           rate_class_index <= CONF_HW_RXTX_RATE_MCS_MAX)
+               return IEEE80211_TX_RC_MCS;
+       return 0;
+}
+
 static void wl1271_tx_complete_packet(struct wl1271 *wl,
                                      struct wl1271_tx_hw_res_descr *result)
 {
@@ -773,6 +781,7 @@ static void wl1271_tx_complete_packet(struct wl1271 *wl,
        struct sk_buff *skb;
        int id = result->id;
        int rate = -1;
+       u8 rate_flags = 0;
        u8 retries = 0;
 
        /* check for id legality */
@@ -799,6 +808,7 @@ static void wl1271_tx_complete_packet(struct wl1271 *wl,
                        info->flags |= IEEE80211_TX_STAT_ACK;
                rate = wl1271_rate_to_idx(result->rate_class_index,
                                          wlvif->band);
+               rate_flags = wl1271_tx_get_rate_flags(result->rate_class_index);
                retries = result->ack_failures;
        } else if (result->status == TX_RETRY_EXCEEDED) {
                wl->stats.excessive_retries++;
@@ -807,7 +817,7 @@ static void wl1271_tx_complete_packet(struct wl1271 *wl,
 
        info->status.rates[0].idx = rate;
        info->status.rates[0].count = retries;
-       info->status.rates[0].flags = 0;
+       info->status.rates[0].flags = rate_flags;
        info->status.ack_signal = -1;
 
        wl->stats.retry_count += result->ack_failures;