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

iwlwifi: use station HT capabilities and BSS operating mode for Green-field

Green-field mode should be configured in the HT station table.  This patch uses
both the per-station GF support flag as well as the current BSS HT operation
mode (non-GF stations present flag).

Added the "ht_greenfield_support" field to struct iwl_cfg to replace the
device-specific check in rs_use_green().  That check has been moved to
iwlcore_init_ht_hw_capab().
Signed-off-by: default avatarDaniel C Halperin <daniel.c.halperin@intel.com>
Signed-off-by: default avatarReinette Chatre <reinette.chatre@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 28e6f489
...@@ -158,5 +158,6 @@ struct iwl_cfg iwl1000_bgn_cfg = { ...@@ -158,5 +158,6 @@ struct iwl_cfg iwl1000_bgn_cfg = {
.need_pll_cfg = true, .need_pll_cfg = true,
.max_ll_items = OTP_MAX_LL_ITEMS_1000, .max_ll_items = OTP_MAX_LL_ITEMS_1000,
.shadow_ram_support = false, .shadow_ram_support = false,
.ht_greenfield_support = true,
}; };
...@@ -2889,7 +2889,8 @@ static struct iwl_cfg iwl3945_bg_cfg = { ...@@ -2889,7 +2889,8 @@ static struct iwl_cfg iwl3945_bg_cfg = {
.eeprom_ver = EEPROM_3945_EEPROM_VERSION, .eeprom_ver = EEPROM_3945_EEPROM_VERSION,
.ops = &iwl3945_ops, .ops = &iwl3945_ops,
.mod_params = &iwl3945_mod_params, .mod_params = &iwl3945_mod_params,
.use_isr_legacy = true .use_isr_legacy = true,
.ht_greenfield_support = false,
}; };
static struct iwl_cfg iwl3945_abg_cfg = { static struct iwl_cfg iwl3945_abg_cfg = {
...@@ -2902,7 +2903,8 @@ static struct iwl_cfg iwl3945_abg_cfg = { ...@@ -2902,7 +2903,8 @@ static struct iwl_cfg iwl3945_abg_cfg = {
.eeprom_ver = EEPROM_3945_EEPROM_VERSION, .eeprom_ver = EEPROM_3945_EEPROM_VERSION,
.ops = &iwl3945_ops, .ops = &iwl3945_ops,
.mod_params = &iwl3945_mod_params, .mod_params = &iwl3945_mod_params,
.use_isr_legacy = true .use_isr_legacy = true,
.ht_greenfield_support = false,
}; };
struct pci_device_id iwl3945_hw_card_ids[] = { struct pci_device_id iwl3945_hw_card_ids[] = {
......
...@@ -2344,7 +2344,8 @@ struct iwl_cfg iwl4965_agn_cfg = { ...@@ -2344,7 +2344,8 @@ struct iwl_cfg iwl4965_agn_cfg = {
.eeprom_calib_ver = EEPROM_4965_TX_POWER_VERSION, .eeprom_calib_ver = EEPROM_4965_TX_POWER_VERSION,
.ops = &iwl4965_ops, .ops = &iwl4965_ops,
.mod_params = &iwl4965_mod_params, .mod_params = &iwl4965_mod_params,
.use_isr_legacy = true .use_isr_legacy = true,
.ht_greenfield_support = false,
}; };
/* Module firmware */ /* Module firmware */
......
...@@ -1652,6 +1652,7 @@ struct iwl_cfg iwl5300_agn_cfg = { ...@@ -1652,6 +1652,7 @@ struct iwl_cfg iwl5300_agn_cfg = {
.valid_tx_ant = ANT_ABC, .valid_tx_ant = ANT_ABC,
.valid_rx_ant = ANT_ABC, .valid_rx_ant = ANT_ABC,
.need_pll_cfg = true, .need_pll_cfg = true,
.ht_greenfield_support = true,
}; };
struct iwl_cfg iwl5100_bg_cfg = { struct iwl_cfg iwl5100_bg_cfg = {
...@@ -1668,6 +1669,7 @@ struct iwl_cfg iwl5100_bg_cfg = { ...@@ -1668,6 +1669,7 @@ struct iwl_cfg iwl5100_bg_cfg = {
.valid_tx_ant = ANT_B, .valid_tx_ant = ANT_B,
.valid_rx_ant = ANT_AB, .valid_rx_ant = ANT_AB,
.need_pll_cfg = true, .need_pll_cfg = true,
.ht_greenfield_support = true,
}; };
struct iwl_cfg iwl5100_abg_cfg = { struct iwl_cfg iwl5100_abg_cfg = {
...@@ -1684,6 +1686,7 @@ struct iwl_cfg iwl5100_abg_cfg = { ...@@ -1684,6 +1686,7 @@ struct iwl_cfg iwl5100_abg_cfg = {
.valid_tx_ant = ANT_B, .valid_tx_ant = ANT_B,
.valid_rx_ant = ANT_AB, .valid_rx_ant = ANT_AB,
.need_pll_cfg = true, .need_pll_cfg = true,
.ht_greenfield_support = true,
}; };
struct iwl_cfg iwl5100_agn_cfg = { struct iwl_cfg iwl5100_agn_cfg = {
...@@ -1700,6 +1703,7 @@ struct iwl_cfg iwl5100_agn_cfg = { ...@@ -1700,6 +1703,7 @@ struct iwl_cfg iwl5100_agn_cfg = {
.valid_tx_ant = ANT_B, .valid_tx_ant = ANT_B,
.valid_rx_ant = ANT_AB, .valid_rx_ant = ANT_AB,
.need_pll_cfg = true, .need_pll_cfg = true,
.ht_greenfield_support = true,
}; };
struct iwl_cfg iwl5350_agn_cfg = { struct iwl_cfg iwl5350_agn_cfg = {
...@@ -1716,6 +1720,7 @@ struct iwl_cfg iwl5350_agn_cfg = { ...@@ -1716,6 +1720,7 @@ struct iwl_cfg iwl5350_agn_cfg = {
.valid_tx_ant = ANT_ABC, .valid_tx_ant = ANT_ABC,
.valid_rx_ant = ANT_ABC, .valid_rx_ant = ANT_ABC,
.need_pll_cfg = true, .need_pll_cfg = true,
.ht_greenfield_support = true,
}; };
struct iwl_cfg iwl5150_agn_cfg = { struct iwl_cfg iwl5150_agn_cfg = {
...@@ -1732,6 +1737,7 @@ struct iwl_cfg iwl5150_agn_cfg = { ...@@ -1732,6 +1737,7 @@ struct iwl_cfg iwl5150_agn_cfg = {
.valid_tx_ant = ANT_A, .valid_tx_ant = ANT_A,
.valid_rx_ant = ANT_AB, .valid_rx_ant = ANT_AB,
.need_pll_cfg = true, .need_pll_cfg = true,
.ht_greenfield_support = true,
}; };
MODULE_FIRMWARE(IWL5000_MODULE_FIRMWARE(IWL5000_UCODE_API_MAX)); MODULE_FIRMWARE(IWL5000_MODULE_FIRMWARE(IWL5000_UCODE_API_MAX));
......
...@@ -171,6 +171,7 @@ struct iwl_cfg iwl6000h_2agn_cfg = { ...@@ -171,6 +171,7 @@ struct iwl_cfg iwl6000h_2agn_cfg = {
.pa_type = IWL_PA_HYBRID, .pa_type = IWL_PA_HYBRID,
.max_ll_items = OTP_MAX_LL_ITEMS_6x00, .max_ll_items = OTP_MAX_LL_ITEMS_6x00,
.shadow_ram_support = true, .shadow_ram_support = true,
.ht_greenfield_support = true,
}; };
/* /*
...@@ -193,6 +194,7 @@ struct iwl_cfg iwl6000i_2agn_cfg = { ...@@ -193,6 +194,7 @@ struct iwl_cfg iwl6000i_2agn_cfg = {
.pa_type = IWL_PA_INTERNAL, .pa_type = IWL_PA_INTERNAL,
.max_ll_items = OTP_MAX_LL_ITEMS_6x00, .max_ll_items = OTP_MAX_LL_ITEMS_6x00,
.shadow_ram_support = true, .shadow_ram_support = true,
.ht_greenfield_support = true,
}; };
struct iwl_cfg iwl6050_2agn_cfg = { struct iwl_cfg iwl6050_2agn_cfg = {
...@@ -212,6 +214,7 @@ struct iwl_cfg iwl6050_2agn_cfg = { ...@@ -212,6 +214,7 @@ struct iwl_cfg iwl6050_2agn_cfg = {
.pa_type = IWL_PA_SYSTEM, .pa_type = IWL_PA_SYSTEM,
.max_ll_items = OTP_MAX_LL_ITEMS_6x00, .max_ll_items = OTP_MAX_LL_ITEMS_6x00,
.shadow_ram_support = true, .shadow_ram_support = true,
.ht_greenfield_support = true,
}; };
struct iwl_cfg iwl6000_3agn_cfg = { struct iwl_cfg iwl6000_3agn_cfg = {
...@@ -231,6 +234,7 @@ struct iwl_cfg iwl6000_3agn_cfg = { ...@@ -231,6 +234,7 @@ struct iwl_cfg iwl6000_3agn_cfg = {
.pa_type = IWL_PA_SYSTEM, .pa_type = IWL_PA_SYSTEM,
.max_ll_items = OTP_MAX_LL_ITEMS_6x00, .max_ll_items = OTP_MAX_LL_ITEMS_6x00,
.shadow_ram_support = true, .shadow_ram_support = true,
.ht_greenfield_support = true,
}; };
struct iwl_cfg iwl6050_3agn_cfg = { struct iwl_cfg iwl6050_3agn_cfg = {
...@@ -250,6 +254,7 @@ struct iwl_cfg iwl6050_3agn_cfg = { ...@@ -250,6 +254,7 @@ struct iwl_cfg iwl6050_3agn_cfg = {
.pa_type = IWL_PA_SYSTEM, .pa_type = IWL_PA_SYSTEM,
.max_ll_items = OTP_MAX_LL_ITEMS_6x00, .max_ll_items = OTP_MAX_LL_ITEMS_6x00,
.shadow_ram_support = true, .shadow_ram_support = true,
.ht_greenfield_support = true,
}; };
MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX)); MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX));
......
...@@ -657,19 +657,15 @@ static int rs_toggle_antenna(u32 valid_ant, u32 *rate_n_flags, ...@@ -657,19 +657,15 @@ static int rs_toggle_antenna(u32 valid_ant, u32 *rate_n_flags,
return 1; return 1;
} }
/* in 4965 we don't use greenfield at all */ /**
static inline u8 rs_use_green(struct iwl_priv *priv, * Green-field mode is valid if the station supports it and
struct ieee80211_conf *conf) * there are no non-GF stations present in the BSS.
*/
static inline u8 rs_use_green(struct ieee80211_sta *sta,
struct iwl_ht_info *ht_conf)
{ {
u8 is_green; return (sta->ht_cap.cap & IEEE80211_HT_CAP_GRN_FLD) &&
!(ht_conf->non_GF_STA_present);
if ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) == CSR_HW_REV_TYPE_4965)
is_green = 0;
else
is_green = (conf_is_ht(conf) &&
priv->current_ht_config.is_green_field &&
!priv->current_ht_config.non_GF_STA_present);
return is_green;
} }
/** /**
...@@ -2072,7 +2068,7 @@ static void rs_rate_scale_perform(struct iwl_priv *priv, ...@@ -2072,7 +2068,7 @@ static void rs_rate_scale_perform(struct iwl_priv *priv,
if (is_legacy(tbl->lq_type)) if (is_legacy(tbl->lq_type))
lq_sta->is_green = 0; lq_sta->is_green = 0;
else else
lq_sta->is_green = rs_use_green(priv, conf); lq_sta->is_green = rs_use_green(sta, &priv->current_ht_config);
is_green = lq_sta->is_green; is_green = lq_sta->is_green;
/* current tx rate */ /* current tx rate */
...@@ -2430,7 +2426,7 @@ static void rs_initialize_lq(struct iwl_priv *priv, ...@@ -2430,7 +2426,7 @@ static void rs_initialize_lq(struct iwl_priv *priv,
int rate_idx; int rate_idx;
int i; int i;
u32 rate; u32 rate;
u8 use_green = rs_use_green(priv, conf); u8 use_green = rs_use_green(sta, &priv->current_ht_config);
u8 active_tbl = 0; u8 active_tbl = 0;
u8 valid_tx_ant; u8 valid_tx_ant;
...@@ -2627,7 +2623,7 @@ static void rs_rate_init(void *priv_r, struct ieee80211_supported_band *sband, ...@@ -2627,7 +2623,7 @@ static void rs_rate_init(void *priv_r, struct ieee80211_supported_band *sband,
lq_sta->is_dup = 0; lq_sta->is_dup = 0;
lq_sta->max_rate_idx = -1; lq_sta->max_rate_idx = -1;
lq_sta->missed_rate_counter = IWL_MISSED_RATE_MAX; lq_sta->missed_rate_counter = IWL_MISSED_RATE_MAX;
lq_sta->is_green = rs_use_green(priv, conf); lq_sta->is_green = rs_use_green(sta, &priv->current_ht_config);
lq_sta->active_legacy_rate = priv->active_rate & ~(0x1000); lq_sta->active_legacy_rate = priv->active_rate & ~(0x1000);
lq_sta->active_rate_basic = priv->active_rate_basic; lq_sta->active_rate_basic = priv->active_rate_basic;
lq_sta->band = priv->band; lq_sta->band = priv->band;
......
...@@ -394,7 +394,8 @@ static void iwlcore_init_ht_hw_capab(const struct iwl_priv *priv, ...@@ -394,7 +394,8 @@ static void iwlcore_init_ht_hw_capab(const struct iwl_priv *priv,
ht_info->ht_supported = true; ht_info->ht_supported = true;
ht_info->cap |= IEEE80211_HT_CAP_GRN_FLD; if (priv->cfg->ht_greenfield_support)
ht_info->cap |= IEEE80211_HT_CAP_GRN_FLD;
ht_info->cap |= IEEE80211_HT_CAP_SGI_20; ht_info->cap |= IEEE80211_HT_CAP_SGI_20;
ht_info->cap |= (IEEE80211_HT_CAP_SM_PS & ht_info->cap |= (IEEE80211_HT_CAP_SM_PS &
(WLAN_HT_CAP_SM_PS_DISABLED << 2)); (WLAN_HT_CAP_SM_PS_DISABLED << 2));
...@@ -2391,8 +2392,6 @@ static void iwl_ht_conf(struct iwl_priv *priv, ...@@ -2391,8 +2392,6 @@ static void iwl_ht_conf(struct iwl_priv *priv,
} }
ht_conf = &sta->ht_cap; ht_conf = &sta->ht_cap;
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);
memcpy(&iwl_conf->mcs, &ht_conf->mcs, 16); memcpy(&iwl_conf->mcs, &ht_conf->mcs, 16);
......
...@@ -251,6 +251,7 @@ struct iwl_cfg { ...@@ -251,6 +251,7 @@ struct iwl_cfg {
enum iwl_pa_type pa_type; enum iwl_pa_type pa_type;
const u16 max_ll_items; const u16 max_ll_items;
const bool shadow_ram_support; const bool shadow_ram_support;
const bool ht_greenfield_support;
}; };
/*************************** /***************************
......
...@@ -507,7 +507,6 @@ struct iwl_ht_info { ...@@ -507,7 +507,6 @@ struct iwl_ht_info {
u8 is_ht; u8 is_ht;
u8 supported_chan_width; u8 supported_chan_width;
u8 sm_ps; u8 sm_ps;
u8 is_green_field;
struct ieee80211_mcs_info mcs; struct ieee80211_mcs_info mcs;
/* BSS related data */ /* BSS related data */
u8 extension_chan_offset; u8 extension_chan_offset;
......
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