Commit 28e6f489 authored by Daniel C Halperin's avatar Daniel C Halperin Committed by John W. Linville

iwlwifi: check short GI support per-station rather than globally

Short guard interval support is a local per-station parameter not a global
per-NIC parameter.  (mac80211 will correctly remove SGI support from station
capabilities if the BSS does not permit it).  This patch removes the short GI
support bitfield from the global iwl_ht_info struct and properly uses
per-station HT capabilities during rate selection.
Signed-off-by: default avatarDaniel C Halperin <daniel.c.halperin@intel.com>
Acked-by: default avatarJohannes Berg <johannes@sipsolutions.net>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 28bd723b
...@@ -1225,18 +1225,6 @@ static int rs_switch_to_mimo2(struct iwl_priv *priv, ...@@ -1225,18 +1225,6 @@ static int rs_switch_to_mimo2(struct iwl_priv *priv,
else else
tbl->is_ht40 = 0; tbl->is_ht40 = 0;
/* FIXME: - don't toggle SGI here
if (tbl->is_ht40) {
if (priv->current_ht_config.sgf & HT_SHORT_GI_40MHZ_ONLY)
tbl->is_SGI = 1;
else
tbl->is_SGI = 0;
} else if (priv->current_ht_config.sgf & HT_SHORT_GI_20MHZ_ONLY)
tbl->is_SGI = 1;
else
tbl->is_SGI = 0;
*/
rs_set_expected_tpt_table(lq_sta, tbl); rs_set_expected_tpt_table(lq_sta, tbl);
rate = rs_get_best_rate(priv, lq_sta, tbl, rate_mask, index); rate = rs_get_best_rate(priv, lq_sta, tbl, rate_mask, index);
...@@ -1291,18 +1279,6 @@ static int rs_switch_to_mimo3(struct iwl_priv *priv, ...@@ -1291,18 +1279,6 @@ static int rs_switch_to_mimo3(struct iwl_priv *priv,
else else
tbl->is_ht40 = 0; tbl->is_ht40 = 0;
/* FIXME: - don't toggle SGI here
if (tbl->is_ht40) {
if (priv->current_ht_config.sgf & HT_SHORT_GI_40MHZ_ONLY)
tbl->is_SGI = 1;
else
tbl->is_SGI = 0;
} else if (priv->current_ht_config.sgf & HT_SHORT_GI_20MHZ_ONLY)
tbl->is_SGI = 1;
else
tbl->is_SGI = 0;
*/
rs_set_expected_tpt_table(lq_sta, tbl); rs_set_expected_tpt_table(lq_sta, tbl);
rate = rs_get_best_rate(priv, lq_sta, tbl, rate_mask, index); rate = rs_get_best_rate(priv, lq_sta, tbl, rate_mask, index);
...@@ -1350,18 +1326,6 @@ static int rs_switch_to_siso(struct iwl_priv *priv, ...@@ -1350,18 +1326,6 @@ static int rs_switch_to_siso(struct iwl_priv *priv,
else else
tbl->is_ht40 = 0; tbl->is_ht40 = 0;
/* FIXME: - don't toggle SGI here
if (tbl->is_ht40) {
if (priv->current_ht_config.sgf & HT_SHORT_GI_40MHZ_ONLY)
tbl->is_SGI = 1;
else
tbl->is_SGI = 0;
} else if (priv->current_ht_config.sgf & HT_SHORT_GI_20MHZ_ONLY)
tbl->is_SGI = 1;
else
tbl->is_SGI = 0;
*/
if (is_green) if (is_green)
tbl->is_SGI = 0; /*11n spec: no SGI in SISO+Greenfield*/ tbl->is_SGI = 0; /*11n spec: no SGI in SISO+Greenfield*/
...@@ -1530,6 +1494,7 @@ static int rs_move_siso_to_other(struct iwl_priv *priv, ...@@ -1530,6 +1494,7 @@ static int rs_move_siso_to_other(struct iwl_priv *priv,
struct iwl_scale_tbl_info *search_tbl = struct iwl_scale_tbl_info *search_tbl =
&(lq_sta->lq_info[(1 - lq_sta->active_tbl)]); &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
struct iwl_rate_scale_data *window = &(tbl->win[index]); struct iwl_rate_scale_data *window = &(tbl->win[index]);
struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
u32 sz = (sizeof(struct iwl_scale_tbl_info) - u32 sz = (sizeof(struct iwl_scale_tbl_info) -
(sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT)); (sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT));
u8 start_action = tbl->action; u8 start_action = tbl->action;
...@@ -1589,13 +1554,11 @@ static int rs_move_siso_to_other(struct iwl_priv *priv, ...@@ -1589,13 +1554,11 @@ static int rs_move_siso_to_other(struct iwl_priv *priv,
goto out; goto out;
break; break;
case IWL_SISO_SWITCH_GI: case IWL_SISO_SWITCH_GI:
if (!tbl->is_ht40 && if (!tbl->is_ht40 && !(ht_cap->cap &
!(priv->current_ht_config.sgf & IEEE80211_HT_CAP_SGI_20))
HT_SHORT_GI_20MHZ))
break; break;
if (tbl->is_ht40 && if (tbl->is_ht40 && !(ht_cap->cap &
!(priv->current_ht_config.sgf & IEEE80211_HT_CAP_SGI_40))
HT_SHORT_GI_40MHZ))
break; break;
IWL_DEBUG_RATE(priv, "LQ: SISO toggle SGI/NGI\n"); IWL_DEBUG_RATE(priv, "LQ: SISO toggle SGI/NGI\n");
...@@ -1669,6 +1632,7 @@ static int rs_move_mimo2_to_other(struct iwl_priv *priv, ...@@ -1669,6 +1632,7 @@ static int rs_move_mimo2_to_other(struct iwl_priv *priv,
struct iwl_scale_tbl_info *search_tbl = struct iwl_scale_tbl_info *search_tbl =
&(lq_sta->lq_info[(1 - lq_sta->active_tbl)]); &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
struct iwl_rate_scale_data *window = &(tbl->win[index]); struct iwl_rate_scale_data *window = &(tbl->win[index]);
struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
u32 sz = (sizeof(struct iwl_scale_tbl_info) - u32 sz = (sizeof(struct iwl_scale_tbl_info) -
(sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT)); (sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT));
u8 start_action = tbl->action; u8 start_action = tbl->action;
...@@ -1729,13 +1693,11 @@ static int rs_move_mimo2_to_other(struct iwl_priv *priv, ...@@ -1729,13 +1693,11 @@ static int rs_move_mimo2_to_other(struct iwl_priv *priv,
break; break;
case IWL_MIMO2_SWITCH_GI: case IWL_MIMO2_SWITCH_GI:
if (!tbl->is_ht40 && if (!tbl->is_ht40 && !(ht_cap->cap &
!(priv->current_ht_config.sgf & IEEE80211_HT_CAP_SGI_20))
HT_SHORT_GI_20MHZ))
break; break;
if (tbl->is_ht40 && if (tbl->is_ht40 && !(ht_cap->cap &
!(priv->current_ht_config.sgf & IEEE80211_HT_CAP_SGI_40))
HT_SHORT_GI_40MHZ))
break; break;
IWL_DEBUG_RATE(priv, "LQ: MIMO2 toggle SGI/NGI\n"); IWL_DEBUG_RATE(priv, "LQ: MIMO2 toggle SGI/NGI\n");
...@@ -1811,6 +1773,7 @@ static int rs_move_mimo3_to_other(struct iwl_priv *priv, ...@@ -1811,6 +1773,7 @@ static int rs_move_mimo3_to_other(struct iwl_priv *priv,
struct iwl_scale_tbl_info *search_tbl = struct iwl_scale_tbl_info *search_tbl =
&(lq_sta->lq_info[(1 - lq_sta->active_tbl)]); &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]);
struct iwl_rate_scale_data *window = &(tbl->win[index]); struct iwl_rate_scale_data *window = &(tbl->win[index]);
struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
u32 sz = (sizeof(struct iwl_scale_tbl_info) - u32 sz = (sizeof(struct iwl_scale_tbl_info) -
(sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT)); (sizeof(struct iwl_rate_scale_data) * IWL_RATE_COUNT));
u8 start_action = tbl->action; u8 start_action = tbl->action;
...@@ -1893,13 +1856,11 @@ static int rs_move_mimo3_to_other(struct iwl_priv *priv, ...@@ -1893,13 +1856,11 @@ static int rs_move_mimo3_to_other(struct iwl_priv *priv,
break; break;
case IWL_MIMO3_SWITCH_GI: case IWL_MIMO3_SWITCH_GI:
if (!tbl->is_ht40 && if (!tbl->is_ht40 && !(ht_cap->cap &
!(priv->current_ht_config.sgf & IEEE80211_HT_CAP_SGI_20))
HT_SHORT_GI_20MHZ))
break; break;
if (tbl->is_ht40 && if (tbl->is_ht40 && !(ht_cap->cap &
!(priv->current_ht_config.sgf & IEEE80211_HT_CAP_SGI_40))
HT_SHORT_GI_40MHZ))
break; break;
IWL_DEBUG_RATE(priv, "LQ: MIMO3 toggle SGI/NGI\n"); IWL_DEBUG_RATE(priv, "LQ: MIMO3 toggle SGI/NGI\n");
......
...@@ -2391,11 +2391,6 @@ static void iwl_ht_conf(struct iwl_priv *priv, ...@@ -2391,11 +2391,6 @@ static void iwl_ht_conf(struct iwl_priv *priv,
} }
ht_conf = &sta->ht_cap; ht_conf = &sta->ht_cap;
if (ht_conf->cap & IEEE80211_HT_CAP_SGI_20)
iwl_conf->sgf |= HT_SHORT_GI_20MHZ;
if (ht_conf->cap & IEEE80211_HT_CAP_SGI_40)
iwl_conf->sgf |= HT_SHORT_GI_40MHZ;
iwl_conf->is_green_field = !!(ht_conf->cap & IEEE80211_HT_CAP_GRN_FLD); iwl_conf->is_green_field = !!(ht_conf->cap & IEEE80211_HT_CAP_GRN_FLD);
iwl_conf->sm_ps = (u8)((ht_conf->cap & IEEE80211_HT_CAP_SM_PS) >> 2); iwl_conf->sm_ps = (u8)((ht_conf->cap & IEEE80211_HT_CAP_SM_PS) >> 2);
......
...@@ -508,7 +508,6 @@ struct iwl_ht_info { ...@@ -508,7 +508,6 @@ struct iwl_ht_info {
u8 supported_chan_width; u8 supported_chan_width;
u8 sm_ps; u8 sm_ps;
u8 is_green_field; u8 is_green_field;
u8 sgf; /* HT_SHORT_GI_* short guard interval */
struct ieee80211_mcs_info mcs; struct ieee80211_mcs_info mcs;
/* BSS related data */ /* BSS related data */
u8 extension_chan_offset; u8 extension_chan_offset;
...@@ -728,9 +727,6 @@ struct iwl_dma_ptr { ...@@ -728,9 +727,6 @@ struct iwl_dma_ptr {
size_t size; size_t size;
}; };
#define HT_SHORT_GI_20MHZ (1 << 0)
#define HT_SHORT_GI_40MHZ (1 << 1)
#define IWL_CHANNEL_WIDTH_20MHZ 0 #define IWL_CHANNEL_WIDTH_20MHZ 0
#define IWL_CHANNEL_WIDTH_40MHZ 1 #define IWL_CHANNEL_WIDTH_40MHZ 1
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment