|
@@ -35,8 +35,6 @@
|
|
|
|
|
|
#include <linux/workqueue.h>
|
|
#include <linux/workqueue.h>
|
|
|
|
|
|
-#include "../net/mac80211/rate.h"
|
|
|
|
-
|
|
|
|
#include "iwl-dev.h"
|
|
#include "iwl-dev.h"
|
|
#include "iwl-sta.h"
|
|
#include "iwl-sta.h"
|
|
#include "iwl-core.h"
|
|
#include "iwl-core.h"
|
|
@@ -169,9 +167,9 @@ struct iwl_lq_sta {
|
|
};
|
|
};
|
|
|
|
|
|
static void rs_rate_scale_perform(struct iwl_priv *priv,
|
|
static void rs_rate_scale_perform(struct iwl_priv *priv,
|
|
- struct net_device *dev,
|
|
|
|
struct ieee80211_hdr *hdr,
|
|
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,
|
|
static void rs_fill_link_cmd(const struct iwl_priv *priv,
|
|
struct iwl_lq_sta *lq_sta, u32 rate_n_flags);
|
|
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,
|
|
static void rs_tl_turn_on_agg_for_tid(struct iwl_priv *priv,
|
|
struct iwl_lq_sta *lq_data, u8 tid,
|
|
struct iwl_lq_sta *lq_data, u8 tid,
|
|
- struct sta_info *sta)
|
|
|
|
|
|
+ struct ieee80211_sta *sta)
|
|
{
|
|
{
|
|
DECLARE_MAC_BUF(mac);
|
|
DECLARE_MAC_BUF(mac);
|
|
|
|
|
|
if (rs_tl_get_load(lq_data, tid) > IWL_AGG_LOAD_THRESHOLD) {
|
|
if (rs_tl_get_load(lq_data, tid) > IWL_AGG_LOAD_THRESHOLD) {
|
|
IWL_DEBUG_HT("Starting Tx agg: STA: %s tid: %d\n",
|
|
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,
|
|
static void rs_tl_turn_on_agg(struct iwl_priv *priv, u8 tid,
|
|
struct iwl_lq_sta *lq_data,
|
|
struct iwl_lq_sta *lq_data,
|
|
- struct sta_info *sta)
|
|
|
|
|
|
+ struct ieee80211_sta *sta)
|
|
{
|
|
{
|
|
if ((tid < TID_MAX_LOAD_COUNT))
|
|
if ((tid < TID_MAX_LOAD_COUNT))
|
|
rs_tl_turn_on_agg_for_tid(priv, lq_data, tid, sta);
|
|
rs_tl_turn_on_agg_for_tid(priv, lq_data, tid, sta);
|
|
@@ -770,7 +768,8 @@ out:
|
|
/*
|
|
/*
|
|
* mac80211 sends us Tx status
|
|
* 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)
|
|
struct sk_buff *skb)
|
|
{
|
|
{
|
|
int status;
|
|
int status;
|
|
@@ -778,11 +777,9 @@ static void rs_tx_status(void *priv_rate, struct net_device *dev,
|
|
int rs_index, index = 0;
|
|
int rs_index, index = 0;
|
|
struct iwl_lq_sta *lq_sta;
|
|
struct iwl_lq_sta *lq_sta;
|
|
struct iwl_link_quality_cmd *table;
|
|
struct iwl_link_quality_cmd *table;
|
|
- struct sta_info *sta;
|
|
|
|
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
|
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 ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
|
struct iwl_rate_scale_data *window = NULL;
|
|
struct iwl_rate_scale_data *window = NULL;
|
|
struct iwl_rate_scale_data *search_win = 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)
|
|
if (retries > 15)
|
|
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) &&
|
|
if ((priv->iw_mode == NL80211_IFTYPE_ADHOC) &&
|
|
!lq_sta->ibss_sta_added)
|
|
!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. */
|
|
/* 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:
|
|
out:
|
|
- rcu_read_unlock();
|
|
|
|
return;
|
|
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,
|
|
static int rs_switch_to_mimo2(struct iwl_priv *priv,
|
|
struct iwl_lq_sta *lq_sta,
|
|
struct iwl_lq_sta *lq_sta,
|
|
struct ieee80211_conf *conf,
|
|
struct ieee80211_conf *conf,
|
|
- struct sta_info *sta,
|
|
|
|
|
|
+ struct ieee80211_sta *sta,
|
|
struct iwl_scale_tbl_info *tbl, int index)
|
|
struct iwl_scale_tbl_info *tbl, int index)
|
|
{
|
|
{
|
|
u16 rate_mask;
|
|
u16 rate_mask;
|
|
@@ -1148,10 +1136,10 @@ static int rs_switch_to_mimo2(struct iwl_priv *priv,
|
|
s8 is_green = lq_sta->is_green;
|
|
s8 is_green = lq_sta->is_green;
|
|
|
|
|
|
if (!(conf->flags & IEEE80211_CONF_SUPPORT_HT_MODE) ||
|
|
if (!(conf->flags & IEEE80211_CONF_SUPPORT_HT_MODE) ||
|
|
- !sta->sta.ht_info.ht_supported)
|
|
|
|
|
|
+ !sta->ht_info.ht_supported)
|
|
return -1;
|
|
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)
|
|
== WLAN_HT_CAP_SM_PS_STATIC)
|
|
return -1;
|
|
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,
|
|
static int rs_switch_to_siso(struct iwl_priv *priv,
|
|
struct iwl_lq_sta *lq_sta,
|
|
struct iwl_lq_sta *lq_sta,
|
|
struct ieee80211_conf *conf,
|
|
struct ieee80211_conf *conf,
|
|
- struct sta_info *sta,
|
|
|
|
|
|
+ struct ieee80211_sta *sta,
|
|
struct iwl_scale_tbl_info *tbl, int index)
|
|
struct iwl_scale_tbl_info *tbl, int index)
|
|
{
|
|
{
|
|
u16 rate_mask;
|
|
u16 rate_mask;
|
|
@@ -1216,7 +1204,7 @@ static int rs_switch_to_siso(struct iwl_priv *priv,
|
|
s32 rate;
|
|
s32 rate;
|
|
|
|
|
|
if (!(conf->flags & IEEE80211_CONF_SUPPORT_HT_MODE) ||
|
|
if (!(conf->flags & IEEE80211_CONF_SUPPORT_HT_MODE) ||
|
|
- !sta->sta.ht_info.ht_supported)
|
|
|
|
|
|
+ !sta->ht_info.ht_supported)
|
|
return -1;
|
|
return -1;
|
|
|
|
|
|
IWL_DEBUG_RATE("LQ: try to switch to SISO\n");
|
|
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,
|
|
static int rs_move_legacy_other(struct iwl_priv *priv,
|
|
struct iwl_lq_sta *lq_sta,
|
|
struct iwl_lq_sta *lq_sta,
|
|
struct ieee80211_conf *conf,
|
|
struct ieee80211_conf *conf,
|
|
- struct sta_info *sta,
|
|
|
|
|
|
+ struct ieee80211_sta *sta,
|
|
int index)
|
|
int index)
|
|
{
|
|
{
|
|
struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
|
|
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,
|
|
static int rs_move_siso_to_other(struct iwl_priv *priv,
|
|
struct iwl_lq_sta *lq_sta,
|
|
struct iwl_lq_sta *lq_sta,
|
|
struct ieee80211_conf *conf,
|
|
struct ieee80211_conf *conf,
|
|
- struct sta_info *sta, int index)
|
|
|
|
|
|
+ struct ieee80211_sta *sta, int index)
|
|
{
|
|
{
|
|
u8 is_green = lq_sta->is_green;
|
|
u8 is_green = lq_sta->is_green;
|
|
struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
|
|
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,
|
|
static int rs_move_mimo_to_other(struct iwl_priv *priv,
|
|
struct iwl_lq_sta *lq_sta,
|
|
struct iwl_lq_sta *lq_sta,
|
|
struct ieee80211_conf *conf,
|
|
struct ieee80211_conf *conf,
|
|
- struct sta_info *sta, int index)
|
|
|
|
|
|
+ struct ieee80211_sta *sta, int index)
|
|
{
|
|
{
|
|
s8 is_green = lq_sta->is_green;
|
|
s8 is_green = lq_sta->is_green;
|
|
struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
|
|
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.
|
|
* Do rate scaling and search for new modulation mode.
|
|
*/
|
|
*/
|
|
static void rs_rate_scale_perform(struct iwl_priv *priv,
|
|
static void rs_rate_scale_perform(struct iwl_priv *priv,
|
|
- struct net_device *dev,
|
|
|
|
struct ieee80211_hdr *hdr,
|
|
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;
|
|
struct ieee80211_conf *conf = &hw->conf;
|
|
int low = IWL_RATE_INVALID;
|
|
int low = IWL_RATE_INVALID;
|
|
int high = IWL_RATE_INVALID;
|
|
int high = IWL_RATE_INVALID;
|
|
@@ -1700,7 +1687,6 @@ static void rs_rate_scale_perform(struct iwl_priv *priv,
|
|
__le16 fc;
|
|
__le16 fc;
|
|
u16 rate_mask;
|
|
u16 rate_mask;
|
|
u8 update_lq = 0;
|
|
u8 update_lq = 0;
|
|
- struct iwl_lq_sta *lq_sta;
|
|
|
|
struct iwl_scale_tbl_info *tbl, *tbl1;
|
|
struct iwl_scale_tbl_info *tbl, *tbl1;
|
|
u16 rate_scale_index_msk = 0;
|
|
u16 rate_scale_index_msk = 0;
|
|
u32 rate;
|
|
u32 rate;
|
|
@@ -1721,11 +1707,10 @@ static void rs_rate_scale_perform(struct iwl_priv *priv,
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- if (!sta || !sta->rate_ctrl_priv)
|
|
|
|
|
|
+ if (!sta || !lq_sta)
|
|
return;
|
|
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);
|
|
tid = rs_tl_add_packet(lq_sta, hdr);
|
|
|
|
|
|
@@ -2064,9 +2049,9 @@ out:
|
|
|
|
|
|
static void rs_initialize_lq(struct iwl_priv *priv,
|
|
static void rs_initialize_lq(struct iwl_priv *priv,
|
|
struct ieee80211_conf *conf,
|
|
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;
|
|
struct iwl_scale_tbl_info *tbl;
|
|
int rate_idx;
|
|
int rate_idx;
|
|
int i;
|
|
int i;
|
|
@@ -2075,10 +2060,9 @@ static void rs_initialize_lq(struct iwl_priv *priv,
|
|
u8 active_tbl = 0;
|
|
u8 active_tbl = 0;
|
|
u8 valid_tx_ant;
|
|
u8 valid_tx_ant;
|
|
|
|
|
|
- if (!sta || !sta->rate_ctrl_priv)
|
|
|
|
|
|
+ if (!sta || !lq_sta)
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
- lq_sta = (struct iwl_lq_sta *)sta->rate_ctrl_priv;
|
|
|
|
i = lq_sta->last_txrate_idx;
|
|
i = lq_sta->last_txrate_idx;
|
|
|
|
|
|
if ((lq_sta->lq.sta_id == 0xff) &&
|
|
if ((lq_sta->lq.sta_id == 0xff) &&
|
|
@@ -2119,37 +2103,30 @@ static void rs_initialize_lq(struct iwl_priv *priv,
|
|
return;
|
|
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;
|
|
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 ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
|
- struct sta_info *sta;
|
|
|
|
__le16 fc;
|
|
__le16 fc;
|
|
- struct iwl_priv *priv = (struct iwl_priv *)priv_rate;
|
|
|
|
struct iwl_lq_sta *lq_sta;
|
|
struct iwl_lq_sta *lq_sta;
|
|
|
|
|
|
IWL_DEBUG_RATE_LIMIT("rate scale calculate new rate for skb\n");
|
|
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
|
|
/* Send management frames and broadcast/multicast data using lowest
|
|
* rate. */
|
|
* rate. */
|
|
fc = hdr->frame_control;
|
|
fc = hdr->frame_control;
|
|
if (!ieee80211_is_data(fc) || is_multicast_ether_addr(hdr->addr1) ||
|
|
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;
|
|
i = lq_sta->last_txrate_idx;
|
|
|
|
|
|
if ((priv->iw_mode == NL80211_IFTYPE_ADHOC) &&
|
|
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.sta_id = sta_id;
|
|
lq_sta->lq.rs_table[0].rate_n_flags = 0;
|
|
lq_sta->lq.rs_table[0].rate_n_flags = 0;
|
|
lq_sta->ibss_sta_added = 1;
|
|
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)) {
|
|
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)
|
|
if (sband->band == IEEE80211_BAND_5GHZ)
|
|
i -= IWL_FIRST_OFDM_RATE;
|
|
i -= IWL_FIRST_OFDM_RATE;
|
|
sel->rate_idx = i;
|
|
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_lq_sta *lq_sta;
|
|
struct iwl_priv *priv;
|
|
struct iwl_priv *priv;
|
|
@@ -2206,20 +2182,16 @@ static void *rs_alloc_sta(void *priv_rate, gfp_t gfp)
|
|
return lq_sta;
|
|
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;
|
|
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;
|
|
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->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 (j = 0; j < LQ_SIZE; j++)
|
|
for (i = 0; i < IWL_RATE_COUNT; i++)
|
|
for (i = 0; i < IWL_RATE_COUNT; i++)
|
|
rs_rate_scale_clear_window(&lq_sta->lq_info[j].win[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;
|
|
lq_sta->ibss_sta_added = 0;
|
|
if (priv->iw_mode == NL80211_IFTYPE_AP) {
|
|
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);
|
|
DECLARE_MAC_BUF(mac);
|
|
|
|
|
|
/* for IBSS the call are from tasklet */
|
|
/* for IBSS the call are from tasklet */
|
|
IWL_DEBUG_RATE("LQ: ADD station %s\n",
|
|
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) {
|
|
if (sta_id == IWL_INVALID_STATION) {
|
|
IWL_DEBUG_RATE("LQ: ADD station %s\n",
|
|
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);
|
|
0, CMD_ASYNC, NULL);
|
|
}
|
|
}
|
|
if ((sta_id != IWL_INVALID_STATION)) {
|
|
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 */
|
|
/* Find highest tx rate supported by hardware and destination station */
|
|
lq_sta->last_txrate_idx = 3;
|
|
lq_sta->last_txrate_idx = 3;
|
|
for (i = 0; i < sband->n_bitrates; i++)
|
|
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;
|
|
lq_sta->last_txrate_idx = i;
|
|
|
|
|
|
/* For MODE_IEEE80211A, skip over cck rates in global rate table */
|
|
/* 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->last_txrate_idx += IWL_FIRST_OFDM_RATE;
|
|
|
|
|
|
lq_sta->is_dup = 0;
|
|
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->tx_agg_tid_en = IWL_AGG_ALL_TID;
|
|
lq_sta->drv = priv;
|
|
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,
|
|
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);
|
|
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 */
|
|
/* rate scale requires free function to be implemented */
|
|
static void rs_free(void *priv_rate)
|
|
static void rs_free(void *priv_rate)
|
|
@@ -2446,12 +2418,12 @@ static void rs_clear(void *priv_rate)
|
|
#endif /* CONFIG_IWLWIFI_DEBUG */
|
|
#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_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");
|
|
IWL_DEBUG_RATE("enter\n");
|
|
kfree(lq_sta);
|
|
kfree(lq_sta);
|
|
IWL_DEBUG_RATE("leave\n");
|
|
IWL_DEBUG_RATE("leave\n");
|