]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/net/wireless/iwlwifi/iwl-3945-rs.c
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
[karo-tx-linux.git] / drivers / net / wireless / iwlwifi / iwl-3945-rs.c
index a16bd4147eac7898fa222b318c78e3525dad6396..d4b49883b30ea5c7e307fd78ad7492b584b203dd 100644 (file)
 
 #define RS_NAME "iwl-3945-rs"
 
-struct iwl3945_rate_scale_data {
-       u64 data;
-       s32 success_counter;
-       s32 success_ratio;
-       s32 counter;
-       s32 average_tpt;
-       unsigned long stamp;
-};
-
-struct iwl3945_rs_sta {
-       spinlock_t lock;
-       struct iwl_priv *priv;
-       s32 *expected_tpt;
-       unsigned long last_partial_flush;
-       unsigned long last_flush;
-       u32 flush_time;
-       u32 last_tx_packets;
-       u32 tx_packets;
-       u8 tgg;
-       u8 flush_pending;
-       u8 start_rate;
-       u8 ibss_sta_added;
-       struct timer_list rate_scale_flush;
-       struct iwl3945_rate_scale_data win[IWL_RATE_COUNT_3945];
-#ifdef CONFIG_MAC80211_DEBUGFS
-       struct dentry *rs_sta_dbgfs_stats_table_file;
-#endif
-
-       /* used to be in sta_info */
-       int last_txrate_idx;
-};
-
 static s32 iwl3945_expected_tpt_g[IWL_RATE_COUNT_3945] = {
        7, 13, 35, 58, 0, 0, 76, 104, 130, 168, 191, 202
 };
@@ -370,6 +338,28 @@ static void rs_rate_init(void *priv_r, struct ieee80211_supported_band *sband,
 
        IWL_DEBUG_RATE(priv, "enter\n");
 
+       spin_lock_init(&rs_sta->lock);
+
+       rs_sta->priv = priv;
+
+       rs_sta->start_rate = IWL_RATE_INVALID;
+
+       /* default to just 802.11b */
+       rs_sta->expected_tpt = iwl3945_expected_tpt_b;
+
+       rs_sta->last_partial_flush = jiffies;
+       rs_sta->last_flush = jiffies;
+       rs_sta->flush_time = IWL_RATE_FLUSH;
+       rs_sta->last_tx_packets = 0;
+       rs_sta->ibss_sta_added = 0;
+
+       init_timer(&rs_sta->rate_scale_flush);
+       rs_sta->rate_scale_flush.data = (unsigned long)rs_sta;
+       rs_sta->rate_scale_flush.function = iwl3945_bg_rate_scale_flush;
+
+       for (i = 0; i < IWL_RATE_COUNT_3945; i++)
+               iwl3945_clear_window(&rs_sta->win[i]);
+
        /* TODO: what is a good starting rate for STA? About middle? Maybe not
         * the lowest or the highest rate.. Could consider using RSSI from
         * previous packets? Need to have IEEE 802.1X auth succeed immediately
@@ -409,45 +399,11 @@ static void *rs_alloc_sta(void *iwl_priv, struct ieee80211_sta *sta, gfp_t gfp)
 {
        struct iwl3945_rs_sta *rs_sta;
        struct iwl3945_sta_priv *psta = (void *) sta->drv_priv;
-       struct iwl_priv *priv = iwl_priv;
-       int i;
-
-       /*
-        * XXX: If it's using sta->drv_priv anyway, it might
-        *      as well just put all the information there.
-        */
+       struct iwl_priv *priv __maybe_unused = iwl_priv;
 
        IWL_DEBUG_RATE(priv, "enter\n");
 
-       rs_sta = kzalloc(sizeof(struct iwl3945_rs_sta), gfp);
-       if (!rs_sta) {
-               IWL_DEBUG_RATE(priv, "leave: ENOMEM\n");
-               return NULL;
-       }
-
-       psta->rs_sta = rs_sta;
-
-       spin_lock_init(&rs_sta->lock);
-
-       rs_sta->priv = priv;
-
-       rs_sta->start_rate = IWL_RATE_INVALID;
-
-       /* default to just 802.11b */
-       rs_sta->expected_tpt = iwl3945_expected_tpt_b;
-
-       rs_sta->last_partial_flush = jiffies;
-       rs_sta->last_flush = jiffies;
-       rs_sta->flush_time = IWL_RATE_FLUSH;
-       rs_sta->last_tx_packets = 0;
-       rs_sta->ibss_sta_added = 0;
-
-       init_timer(&rs_sta->rate_scale_flush);
-       rs_sta->rate_scale_flush.data = (unsigned long)rs_sta;
-       rs_sta->rate_scale_flush.function = &iwl3945_bg_rate_scale_flush;
-
-       for (i = 0; i < IWL_RATE_COUNT_3945; i++)
-               iwl3945_clear_window(&rs_sta->win[i]);
+       rs_sta = &psta->rs_sta;
 
        IWL_DEBUG_RATE(priv, "leave\n");
 
@@ -458,14 +414,11 @@ static void rs_free_sta(void *iwl_priv, struct ieee80211_sta *sta,
                        void *priv_sta)
 {
        struct iwl3945_sta_priv *psta = (void *) sta->drv_priv;
-       struct iwl3945_rs_sta *rs_sta = priv_sta;
+       struct iwl3945_rs_sta *rs_sta = &psta->rs_sta;
        struct iwl_priv *priv __maybe_unused = rs_sta->priv;
 
-       psta->rs_sta = NULL;
-
        IWL_DEBUG_RATE(priv, "enter\n");
        del_timer_sync(&rs_sta->rate_scale_flush);
-       kfree(rs_sta);
        IWL_DEBUG_RATE(priv, "leave\n");
 }
 
@@ -702,7 +655,7 @@ static void rs_get_rate(void *priv_r, struct ieee80211_sta *sta,
                u8 sta_id = iwl_find_station(priv, hdr->addr1);
 
                if (sta_id == IWL_INVALID_STATION) {
-                       IWL_DEBUG_RATE(priv, "LQ: ADD station %pm\n",
+                       IWL_DEBUG_RATE(priv, "LQ: ADD station %pM\n",
                                       hdr->addr1);
                        sta_id = iwl_add_station(priv, hdr->addr1, false,
                                CMD_ASYNC, NULL);
@@ -960,14 +913,15 @@ void iwl3945_rate_scale_init(struct ieee80211_hw *hw, s32 sta_id)
 
        rcu_read_lock();
 
-       sta = ieee80211_find_sta(hw, priv->stations[sta_id].sta.sta.addr);
+       sta = ieee80211_find_sta(priv->vif,
+                                priv->stations[sta_id].sta.sta.addr);
        if (!sta) {
                rcu_read_unlock();
                return;
        }
 
        psta = (void *) sta->drv_priv;
-       rs_sta = psta->rs_sta;
+       rs_sta = &psta->rs_sta;
 
        spin_lock_irqsave(&rs_sta->lock, flags);