wl1271: Add TX rate reporting
authorJuuso Oikarinen <juuso.oikarinen@nokia.com>
Fri, 26 Mar 2010 10:53:12 +0000 (12:53 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 31 Mar 2010 18:39:11 +0000 (14:39 -0400)
Add reporting of the used TX rate to mac80211 in the tx_status.

Signed-off-by: Juuso Oikarinen <juuso.oikarinen@nokia.com>
Reviewed-by: Kalle Valo <kalle.valo@nokia.com>
Signed-off-by: Luciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/wl12xx/wl1271_main.c
drivers/net/wireless/wl12xx/wl1271_tx.c
drivers/net/wireless/wl12xx/wl1271_tx.h

index 49779e5..8645030 100644 (file)
@@ -2127,6 +2127,7 @@ int wl1271_init_ieee80211(struct wl1271 *wl)
                wl->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = &wl1271_band_5ghz;
 
        wl->hw->queues = 4;
+       wl->hw->max_rates = 1;
 
        SET_IEEE80211_DEV(wl->hw, wl1271_wl_to_dev(wl));
 
index 6d109df..5712489 100644 (file)
@@ -304,6 +304,8 @@ static void wl1271_tx_complete_packet(struct wl1271 *wl,
        struct ieee80211_tx_info *info;
        struct sk_buff *skb;
        int id = result->id;
+       int rate = -1;
+       u8 retries = 0;
 
        /* check for id legality */
        if (unlikely(id >= ACX_TX_DESCRIPTORS || wl->tx_frames[id] == NULL)) {
@@ -314,19 +316,22 @@ static void wl1271_tx_complete_packet(struct wl1271 *wl,
        skb = wl->tx_frames[id];
        info = IEEE80211_SKB_CB(skb);
 
-       /* update packet status */
-       if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) {
-               if (result->status == TX_SUCCESS)
+       /* update the TX status info */
+       if (result->status == TX_SUCCESS) {
+               if (!(info->flags & IEEE80211_TX_CTL_NO_ACK))
                        info->flags |= IEEE80211_TX_STAT_ACK;
-               if (result->status & TX_RETRY_EXCEEDED) {
-                       /* FIXME */
-                       /* info->status.excessive_retries = 1; */
-                       wl->stats.excessive_retries++;
-               }
+               rate = wl1271_rate_to_idx(wl, result->rate_class_index);
+               retries = result->ack_failures;
+       } else if (result->status == TX_RETRY_EXCEEDED) {
+               wl->stats.excessive_retries++;
+               retries = result->ack_failures;
        }
 
-       /* FIXME */
-       /* info->status.retry_count = result->ack_failures; */
+       info->status.rates[0].idx = rate;
+       info->status.rates[0].count = retries;
+       info->status.rates[0].flags = 0;
+       info->status.ack_signal = -1;
+
        wl->stats.retry_count += result->ack_failures;
 
        /* update security sequence number */
@@ -350,8 +355,6 @@ static void wl1271_tx_complete_packet(struct wl1271 *wl,
                     result->id, skb, result->ack_failures,
                     result->rate_class_index, result->status);
 
-       /* FIXME: do we need to tell the stack about the used rate? */
-
        /* return the packet to the stack */
        ieee80211_tx_status(wl->hw, skb);
        wl->tx_frames[result->id] = NULL;
index 5e6c27a..b03c95d 100644 (file)
@@ -159,5 +159,6 @@ static inline int wl1271_tx_ac_to_tid(int ac)
 void wl1271_tx_work(struct work_struct *work);
 void wl1271_tx_complete(struct wl1271 *wl);
 void wl1271_tx_flush(struct wl1271 *wl);
+u8 wl1271_rate_to_idx(struct wl1271 *wl, int rate);
 
 #endif