]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/wireless/iwlwifi/iwl-agn-rs.c
mac80211: clean up rate control API
[linux-2.6-omap-h63xx.git] / drivers / net / wireless / iwlwifi / iwl-agn-rs.c
index 8b57b390c8bace21e6407e1ec51e00d1d590e0c2..93944de923cafd0913979e1f45bf8a36023d2285 100644 (file)
@@ -35,8 +35,6 @@
 
 #include <linux/workqueue.h>
 
-#include "../net/mac80211/rate.h"
-
 #include "iwl-dev.h"
 #include "iwl-sta.h"
 #include "iwl-core.h"
@@ -169,9 +167,9 @@ struct iwl_lq_sta {
 };
 
 static void rs_rate_scale_perform(struct iwl_priv *priv,
-                                  struct net_device *dev,
                                   struct ieee80211_hdr *hdr,
-                                  struct sta_info *sta);
+                                  struct ieee80211_sta *sta,
+                                  struct iwl_lq_sta *lq_sta);
 static void rs_fill_link_cmd(const struct iwl_priv *priv,
                             struct iwl_lq_sta *lq_sta, u32 rate_n_flags);
 
@@ -357,20 +355,20 @@ static u32 rs_tl_get_load(struct iwl_lq_sta *lq_data, u8 tid)
 
 static void rs_tl_turn_on_agg_for_tid(struct iwl_priv *priv,
                                      struct iwl_lq_sta *lq_data, u8 tid,
-                                     struct sta_info *sta)
+                                     struct ieee80211_sta *sta)
 {
        DECLARE_MAC_BUF(mac);
 
        if (rs_tl_get_load(lq_data, tid) > IWL_AGG_LOAD_THRESHOLD) {
                IWL_DEBUG_HT("Starting Tx agg: STA: %s tid: %d\n",
-                               print_mac(mac, sta->sta.addr), tid);
-               ieee80211_start_tx_ba_session(priv->hw, sta->sta.addr, tid);
+                               print_mac(mac, sta->addr), tid);
+               ieee80211_start_tx_ba_session(priv->hw, sta->addr, tid);
        }
 }
 
 static void rs_tl_turn_on_agg(struct iwl_priv *priv, u8 tid,
                              struct iwl_lq_sta *lq_data,
-                             struct sta_info *sta)
+                             struct ieee80211_sta *sta)
 {
        if ((tid < TID_MAX_LOAD_COUNT))
                rs_tl_turn_on_agg_for_tid(priv, lq_data, tid, sta);
@@ -770,7 +768,8 @@ out:
 /*
  * mac80211 sends us Tx status
  */
-static void rs_tx_status(void *priv_rate, struct net_device *dev,
+static void rs_tx_status(void *priv_r, struct ieee80211_supported_band *sband,
+                        struct ieee80211_sta *sta, void *priv_sta,
                         struct sk_buff *skb)
 {
        int status;
@@ -778,11 +777,9 @@ static void rs_tx_status(void *priv_rate, struct net_device *dev,
        int rs_index, index = 0;
        struct iwl_lq_sta *lq_sta;
        struct iwl_link_quality_cmd *table;
-       struct sta_info *sta;
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
-       struct iwl_priv *priv = (struct iwl_priv *)priv_rate;
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
-       struct ieee80211_hw *hw = local_to_hw(local);
+       struct iwl_priv *priv = (struct iwl_priv *)priv_r;
+       struct ieee80211_hw *hw = priv->hw;
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
        struct iwl_rate_scale_data *window = NULL;
        struct iwl_rate_scale_data *search_win = NULL;
@@ -808,15 +805,7 @@ static void rs_tx_status(void *priv_rate, struct net_device *dev,
        if (retries > 15)
                retries = 15;
 
-       rcu_read_lock();
-
-       sta = sta_info_get(local, hdr->addr1);
-
-       if (!sta || !sta->rate_ctrl_priv)
-               goto out;
-
-
-       lq_sta = (struct iwl_lq_sta *)sta->rate_ctrl_priv;
+       lq_sta = (struct iwl_lq_sta *)priv_sta;
 
        if ((priv->iw_mode == NL80211_IFTYPE_ADHOC) &&
            !lq_sta->ibss_sta_added)
@@ -962,9 +951,8 @@ static void rs_tx_status(void *priv_rate, struct net_device *dev,
        }
 
        /* See if there's a better rate or modulation mode to try. */
-       rs_rate_scale_perform(priv, dev, hdr, sta);
+       rs_rate_scale_perform(priv, hdr, sta, lq_sta);
 out:
-       rcu_read_unlock();
        return;
 }
 
@@ -1140,7 +1128,7 @@ static s32 rs_get_best_rate(struct iwl_priv *priv,
 static int rs_switch_to_mimo2(struct iwl_priv *priv,
                             struct iwl_lq_sta *lq_sta,
                             struct ieee80211_conf *conf,
-                            struct sta_info *sta,
+                            struct ieee80211_sta *sta,
                             struct iwl_scale_tbl_info *tbl, int index)
 {
        u16 rate_mask;
@@ -1148,10 +1136,10 @@ static int rs_switch_to_mimo2(struct iwl_priv *priv,
        s8 is_green = lq_sta->is_green;
 
        if (!(conf->flags & IEEE80211_CONF_SUPPORT_HT_MODE) ||
-           !sta->sta.ht_info.ht_supported)
+           !sta->ht_info.ht_supported)
                return -1;
 
-       if (((sta->sta.ht_info.cap & IEEE80211_HT_CAP_SM_PS) >> 2)
+       if (((sta->ht_info.cap & IEEE80211_HT_CAP_SM_PS) >> 2)
                                                == WLAN_HT_CAP_SM_PS_STATIC)
                return -1;
 
@@ -1208,7 +1196,7 @@ static int rs_switch_to_mimo2(struct iwl_priv *priv,
 static int rs_switch_to_siso(struct iwl_priv *priv,
                             struct iwl_lq_sta *lq_sta,
                             struct ieee80211_conf *conf,
-                            struct sta_info *sta,
+                            struct ieee80211_sta *sta,
                             struct iwl_scale_tbl_info *tbl, int index)
 {
        u16 rate_mask;
@@ -1216,7 +1204,7 @@ static int rs_switch_to_siso(struct iwl_priv *priv,
        s32 rate;
 
        if (!(conf->flags & IEEE80211_CONF_SUPPORT_HT_MODE) ||
-           !sta->sta.ht_info.ht_supported)
+           !sta->ht_info.ht_supported)
                return -1;
 
        IWL_DEBUG_RATE("LQ: try to switch to SISO\n");
@@ -1268,7 +1256,7 @@ static int rs_switch_to_siso(struct iwl_priv *priv,
 static int rs_move_legacy_other(struct iwl_priv *priv,
                                struct iwl_lq_sta *lq_sta,
                                struct ieee80211_conf *conf,
-                               struct sta_info *sta,
+                               struct ieee80211_sta *sta,
                                int index)
 {
        struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
@@ -1376,7 +1364,7 @@ out:
 static int rs_move_siso_to_other(struct iwl_priv *priv,
                                 struct iwl_lq_sta *lq_sta,
                                 struct ieee80211_conf *conf,
-                                struct sta_info *sta, int index)
+                                struct ieee80211_sta *sta, int index)
 {
        u8 is_green = lq_sta->is_green;
        struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
@@ -1487,7 +1475,7 @@ static int rs_move_siso_to_other(struct iwl_priv *priv,
 static int rs_move_mimo_to_other(struct iwl_priv *priv,
                                 struct iwl_lq_sta *lq_sta,
                                 struct ieee80211_conf *conf,
-                                struct sta_info *sta, int index)
+                                struct ieee80211_sta *sta, int index)
 {
        s8 is_green = lq_sta->is_green;
        struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
@@ -1680,12 +1668,11 @@ static void rs_stay_in_table(struct iwl_lq_sta *lq_sta)
  * Do rate scaling and search for new modulation mode.
  */
 static void rs_rate_scale_perform(struct iwl_priv *priv,
-                                 struct net_device *dev,
                                  struct ieee80211_hdr *hdr,
-                                 struct sta_info *sta)
+                                 struct ieee80211_sta *sta,
+                                 struct iwl_lq_sta *lq_sta)
 {
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
-       struct ieee80211_hw *hw = local_to_hw(local);
+       struct ieee80211_hw *hw = priv->hw;
        struct ieee80211_conf *conf = &hw->conf;
        int low = IWL_RATE_INVALID;
        int high = IWL_RATE_INVALID;
@@ -1700,7 +1687,6 @@ static void rs_rate_scale_perform(struct iwl_priv *priv,
        __le16 fc;
        u16 rate_mask;
        u8 update_lq = 0;
-       struct iwl_lq_sta *lq_sta;
        struct iwl_scale_tbl_info *tbl, *tbl1;
        u16 rate_scale_index_msk = 0;
        u32 rate;
@@ -1721,11 +1707,10 @@ static void rs_rate_scale_perform(struct iwl_priv *priv,
                return;
        }
 
-       if (!sta || !sta->rate_ctrl_priv)
+       if (!sta || !lq_sta)
                return;
 
-       lq_sta = (struct iwl_lq_sta *)sta->rate_ctrl_priv;
-       lq_sta->supp_rates = sta->sta.supp_rates[lq_sta->band];
+       lq_sta->supp_rates = sta->supp_rates[lq_sta->band];
 
        tid = rs_tl_add_packet(lq_sta, hdr);
 
@@ -2064,9 +2049,9 @@ out:
 
 static void rs_initialize_lq(struct iwl_priv *priv,
                             struct ieee80211_conf *conf,
-                            struct sta_info *sta)
+                            struct ieee80211_sta *sta,
+                            struct iwl_lq_sta *lq_sta)
 {
-       struct iwl_lq_sta *lq_sta;
        struct iwl_scale_tbl_info *tbl;
        int rate_idx;
        int i;
@@ -2075,10 +2060,9 @@ static void rs_initialize_lq(struct iwl_priv *priv,
        u8 active_tbl = 0;
        u8 valid_tx_ant;
 
-       if (!sta || !sta->rate_ctrl_priv)
+       if (!sta || !lq_sta)
                goto out;
 
-       lq_sta = (struct iwl_lq_sta *)sta->rate_ctrl_priv;
        i = lq_sta->last_txrate_idx;
 
        if ((lq_sta->lq.sta_id == 0xff) &&
@@ -2119,37 +2103,30 @@ static void rs_initialize_lq(struct iwl_priv *priv,
        return;
 }
 
-static void rs_get_rate(void *priv_rate, struct net_device *dev,
-                       struct ieee80211_supported_band *sband,
-                       struct sk_buff *skb,
-                       struct rate_selection *sel)
+static void rs_get_rate(void *priv_r, struct ieee80211_supported_band *sband,
+                       struct ieee80211_sta *sta, void *priv_sta,
+                       struct sk_buff *skb, struct rate_selection *sel)
 {
 
        int i;
-       struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
-       struct ieee80211_conf *conf = &local->hw.conf;
+       struct iwl_priv *priv = (struct iwl_priv *)priv_r;
+       struct ieee80211_conf *conf = &priv->hw->conf;
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
-       struct sta_info *sta;
        __le16 fc;
-       struct iwl_priv *priv = (struct iwl_priv *)priv_rate;
        struct iwl_lq_sta *lq_sta;
 
        IWL_DEBUG_RATE_LIMIT("rate scale calculate new rate for skb\n");
 
-       rcu_read_lock();
-
-       sta = sta_info_get(local, hdr->addr1);
-
        /* Send management frames and broadcast/multicast data using lowest
         * rate. */
        fc = hdr->frame_control;
        if (!ieee80211_is_data(fc) || is_multicast_ether_addr(hdr->addr1) ||
-           !sta || !sta->rate_ctrl_priv) {
-               sel->rate_idx = rate_lowest_index(local, sband, sta);
-               goto out;
+           !sta || !priv_sta) {
+               sel->rate_idx = rate_lowest_index(sband, sta);
+               return;
        }
 
-       lq_sta = (struct iwl_lq_sta *)sta->rate_ctrl_priv;
+       lq_sta = (struct iwl_lq_sta *)priv_sta;
        i = lq_sta->last_txrate_idx;
 
        if ((priv->iw_mode == NL80211_IFTYPE_ADHOC) &&
@@ -2167,23 +2144,22 @@ static void rs_get_rate(void *priv_rate, struct net_device *dev,
                        lq_sta->lq.sta_id = sta_id;
                        lq_sta->lq.rs_table[0].rate_n_flags = 0;
                        lq_sta->ibss_sta_added = 1;
-                       rs_initialize_lq(priv, conf, sta);
+                       rs_initialize_lq(priv, conf, sta, lq_sta);
                }
        }
 
        if ((i < 0) || (i > IWL_RATE_COUNT)) {
-               sel->rate_idx = rate_lowest_index(local, sband, sta);
-               goto out;
+               sel->rate_idx = rate_lowest_index(sband, sta);
+               return;
        }
 
        if (sband->band == IEEE80211_BAND_5GHZ)
                i -= IWL_FIRST_OFDM_RATE;
        sel->rate_idx = i;
-out:
-       rcu_read_unlock();
 }
 
-static void *rs_alloc_sta(void *priv_rate, gfp_t gfp)
+static void *rs_alloc_sta(void *priv_rate, struct ieee80211_sta *sta,
+                         gfp_t gfp)
 {
        struct iwl_lq_sta *lq_sta;
        struct iwl_priv *priv;
@@ -2206,20 +2182,16 @@ static void *rs_alloc_sta(void *priv_rate, gfp_t gfp)
        return lq_sta;
 }
 
-static void rs_rate_init(void *priv_rate, void *priv_sta,
-                        struct ieee80211_local *local,
-                        struct sta_info *sta)
+static void rs_rate_init(void *priv_r, struct ieee80211_supported_band *sband,
+                        struct ieee80211_sta *sta, void *priv_sta)
 {
        int i, j;
-       struct ieee80211_conf *conf = &local->hw.conf;
-       struct ieee80211_supported_band *sband;
-       struct iwl_priv *priv = (struct iwl_priv *)priv_rate;
+       struct iwl_priv *priv = (struct iwl_priv *)priv_r;
+       struct ieee80211_conf *conf = &priv->hw->conf;
        struct iwl_lq_sta *lq_sta = priv_sta;
 
-       sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
-
        lq_sta->flush_timer = 0;
-       lq_sta->supp_rates = sta->sta.supp_rates[sband->band];
+       lq_sta->supp_rates = sta->supp_rates[sband->band];
        for (j = 0; j < LQ_SIZE; j++)
                for (i = 0; i < IWL_RATE_COUNT; i++)
                        rs_rate_scale_clear_window(&lq_sta->lq_info[j].win[i]);
@@ -2232,17 +2204,17 @@ static void rs_rate_init(void *priv_rate, void *priv_sta,
 
        lq_sta->ibss_sta_added = 0;
        if (priv->iw_mode == NL80211_IFTYPE_AP) {
-               u8 sta_id = iwl_find_station(priv, sta->sta.addr);
+               u8 sta_id = iwl_find_station(priv, sta->addr);
                DECLARE_MAC_BUF(mac);
 
                /* for IBSS the call are from tasklet */
                IWL_DEBUG_RATE("LQ: ADD station %s\n",
-                            print_mac(mac, sta->sta.addr));
+                            print_mac(mac, sta->addr));
 
                if (sta_id == IWL_INVALID_STATION) {
                        IWL_DEBUG_RATE("LQ: ADD station %s\n",
-                                      print_mac(mac, sta->sta.addr));
-                       sta_id = iwl_add_station_flags(priv, sta->sta.addr,
+                                      print_mac(mac, sta->addr));
+                       sta_id = iwl_add_station_flags(priv, sta->addr,
                                                        0, CMD_ASYNC, NULL);
                }
                if ((sta_id != IWL_INVALID_STATION)) {
@@ -2256,11 +2228,11 @@ static void rs_rate_init(void *priv_rate, void *priv_sta,
        /* Find highest tx rate supported by hardware and destination station */
        lq_sta->last_txrate_idx = 3;
        for (i = 0; i < sband->n_bitrates; i++)
-               if (sta->sta.supp_rates[sband->band] & BIT(i))
+               if (sta->supp_rates[sband->band] & BIT(i))
                        lq_sta->last_txrate_idx = i;
 
        /* For MODE_IEEE80211A, skip over cck rates in global rate table */
-       if (local->hw.conf.channel->band == IEEE80211_BAND_5GHZ)
+       if (sband->band == IEEE80211_BAND_5GHZ)
                lq_sta->last_txrate_idx += IWL_FIRST_OFDM_RATE;
 
        lq_sta->is_dup = 0;
@@ -2301,7 +2273,7 @@ static void rs_rate_init(void *priv_rate, void *priv_sta,
        lq_sta->tx_agg_tid_en = IWL_AGG_ALL_TID;
        lq_sta->drv = priv;
 
-       rs_initialize_lq(priv, conf, sta);
+       rs_initialize_lq(priv, conf, sta, lq_sta);
 }
 
 static void rs_fill_link_cmd(const struct iwl_priv *priv,
@@ -2423,9 +2395,9 @@ static void rs_fill_link_cmd(const struct iwl_priv *priv,
        lq_cmd->agg_params.agg_time_limit = cpu_to_le16(4000);
 }
 
-static void *rs_alloc(struct ieee80211_local *local)
+static void *rs_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir)
 {
-       return local->hw.priv;
+       return hw->priv;
 }
 /* rate scale requires free function to be implemented */
 static void rs_free(void *priv_rate)
@@ -2446,12 +2418,12 @@ static void rs_clear(void *priv_rate)
 #endif /* CONFIG_IWLWIFI_DEBUG */
 }
 
-static void rs_free_sta(void *priv_rate, void *priv_sta)
+static void rs_free_sta(void *priv_r, struct ieee80211_sta *sta,
+                       void *priv_sta)
 {
        struct iwl_lq_sta *lq_sta = priv_sta;
-       struct iwl_priv *priv;
+       struct iwl_priv *priv = priv_r;
 
-       priv = (struct iwl_priv *)priv_rate;
        IWL_DEBUG_RATE("enter\n");
        kfree(lq_sta);
        IWL_DEBUG_RATE("leave\n");