diff options
author | Johannes Berg <johannes.berg@intel.com> | 2012-03-05 14:24:32 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-03-06 15:16:11 -0500 |
commit | 7e79a3937a44b1dc5f457e6dbb8c50e93719286a (patch) | |
tree | 305626d41a85e102396f23e4f5b7bb611a3f0935 /drivers/net | |
parent | 54708d8df355b7ecf1d25d4049336840e6107d96 (diff) |
iwlwifi: use valid TX/RX antenna from hw_params
It's not really a good idea to write to the
global static configuration. Use the valid
TX/RX antenna information only from the HW
params struct except in the case where the
values from the config are used to override
the values from the EEPROM.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-1000.c | 7 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-2000.c | 7 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-5000.c | 16 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-6000.c | 7 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn-calib.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-debugfs.c | 9 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-eeprom.c | 38 |
8 files changed, 46 insertions, 44 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-1000.c b/drivers/net/wireless/iwlwifi/iwl-1000.c index 605ee3df1d82..22eb0622ac21 100644 --- a/drivers/net/wireless/iwlwifi/iwl-1000.c +++ b/drivers/net/wireless/iwlwifi/iwl-1000.c | |||
@@ -131,14 +131,13 @@ static void iwl1000_hw_set_hw_params(struct iwl_priv *priv) | |||
131 | 131 | ||
132 | hw_params(priv).ht40_channel = BIT(IEEE80211_BAND_2GHZ); | 132 | hw_params(priv).ht40_channel = BIT(IEEE80211_BAND_2GHZ); |
133 | 133 | ||
134 | hw_params(priv).tx_chains_num = num_of_ant(cfg(priv)->valid_tx_ant); | 134 | hw_params(priv).tx_chains_num = |
135 | num_of_ant(hw_params(priv).valid_tx_ant); | ||
135 | if (cfg(priv)->rx_with_siso_diversity) | 136 | if (cfg(priv)->rx_with_siso_diversity) |
136 | hw_params(priv).rx_chains_num = 1; | 137 | hw_params(priv).rx_chains_num = 1; |
137 | else | 138 | else |
138 | hw_params(priv).rx_chains_num = | 139 | hw_params(priv).rx_chains_num = |
139 | num_of_ant(cfg(priv)->valid_rx_ant); | 140 | num_of_ant(hw_params(priv).valid_rx_ant); |
140 | hw_params(priv).valid_tx_ant = cfg(priv)->valid_tx_ant; | ||
141 | hw_params(priv).valid_rx_ant = cfg(priv)->valid_rx_ant; | ||
142 | 141 | ||
143 | iwl1000_set_ct_threshold(priv); | 142 | iwl1000_set_ct_threshold(priv); |
144 | 143 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-2000.c b/drivers/net/wireless/iwlwifi/iwl-2000.c index e6e8c79a80d8..43d17a4564e3 100644 --- a/drivers/net/wireless/iwlwifi/iwl-2000.c +++ b/drivers/net/wireless/iwlwifi/iwl-2000.c | |||
@@ -127,14 +127,13 @@ static void iwl2000_hw_set_hw_params(struct iwl_priv *priv) | |||
127 | 127 | ||
128 | hw_params(priv).ht40_channel = BIT(IEEE80211_BAND_2GHZ); | 128 | hw_params(priv).ht40_channel = BIT(IEEE80211_BAND_2GHZ); |
129 | 129 | ||
130 | hw_params(priv).tx_chains_num = num_of_ant(cfg(priv)->valid_tx_ant); | 130 | hw_params(priv).tx_chains_num = |
131 | num_of_ant(hw_params(priv).valid_tx_ant); | ||
131 | if (cfg(priv)->rx_with_siso_diversity) | 132 | if (cfg(priv)->rx_with_siso_diversity) |
132 | hw_params(priv).rx_chains_num = 1; | 133 | hw_params(priv).rx_chains_num = 1; |
133 | else | 134 | else |
134 | hw_params(priv).rx_chains_num = | 135 | hw_params(priv).rx_chains_num = |
135 | num_of_ant(cfg(priv)->valid_rx_ant); | 136 | num_of_ant(hw_params(priv).valid_rx_ant); |
136 | hw_params(priv).valid_tx_ant = cfg(priv)->valid_tx_ant; | ||
137 | hw_params(priv).valid_rx_ant = cfg(priv)->valid_rx_ant; | ||
138 | 137 | ||
139 | iwl2000_set_ct_threshold(priv); | 138 | iwl2000_set_ct_threshold(priv); |
140 | 139 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c index ccaeead29c2f..8cdc4a35a973 100644 --- a/drivers/net/wireless/iwlwifi/iwl-5000.c +++ b/drivers/net/wireless/iwlwifi/iwl-5000.c | |||
@@ -167,10 +167,10 @@ static void iwl5000_hw_set_hw_params(struct iwl_priv *priv) | |||
167 | hw_params(priv).ht40_channel = BIT(IEEE80211_BAND_2GHZ) | | 167 | hw_params(priv).ht40_channel = BIT(IEEE80211_BAND_2GHZ) | |
168 | BIT(IEEE80211_BAND_5GHZ); | 168 | BIT(IEEE80211_BAND_5GHZ); |
169 | 169 | ||
170 | hw_params(priv).tx_chains_num = num_of_ant(cfg(priv)->valid_tx_ant); | 170 | hw_params(priv).tx_chains_num = |
171 | hw_params(priv).rx_chains_num = num_of_ant(cfg(priv)->valid_rx_ant); | 171 | num_of_ant(hw_params(priv).valid_tx_ant); |
172 | hw_params(priv).valid_tx_ant = cfg(priv)->valid_tx_ant; | 172 | hw_params(priv).rx_chains_num = |
173 | hw_params(priv).valid_rx_ant = cfg(priv)->valid_rx_ant; | 173 | num_of_ant(hw_params(priv).valid_rx_ant); |
174 | 174 | ||
175 | iwl5000_set_ct_threshold(priv); | 175 | iwl5000_set_ct_threshold(priv); |
176 | 176 | ||
@@ -190,10 +190,10 @@ static void iwl5150_hw_set_hw_params(struct iwl_priv *priv) | |||
190 | hw_params(priv).ht40_channel = BIT(IEEE80211_BAND_2GHZ) | | 190 | hw_params(priv).ht40_channel = BIT(IEEE80211_BAND_2GHZ) | |
191 | BIT(IEEE80211_BAND_5GHZ); | 191 | BIT(IEEE80211_BAND_5GHZ); |
192 | 192 | ||
193 | hw_params(priv).tx_chains_num = num_of_ant(cfg(priv)->valid_tx_ant); | 193 | hw_params(priv).tx_chains_num = |
194 | hw_params(priv).rx_chains_num = num_of_ant(cfg(priv)->valid_rx_ant); | 194 | num_of_ant(hw_params(priv).valid_tx_ant); |
195 | hw_params(priv).valid_tx_ant = cfg(priv)->valid_tx_ant; | 195 | hw_params(priv).rx_chains_num = |
196 | hw_params(priv).valid_rx_ant = cfg(priv)->valid_rx_ant; | 196 | num_of_ant(hw_params(priv).valid_rx_ant); |
197 | 197 | ||
198 | iwl5150_set_ct_threshold(priv); | 198 | iwl5150_set_ct_threshold(priv); |
199 | 199 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c index 223e60a1b79d..720e8e6e62ae 100644 --- a/drivers/net/wireless/iwlwifi/iwl-6000.c +++ b/drivers/net/wireless/iwlwifi/iwl-6000.c | |||
@@ -149,14 +149,13 @@ static void iwl6000_hw_set_hw_params(struct iwl_priv *priv) | |||
149 | hw_params(priv).ht40_channel = BIT(IEEE80211_BAND_2GHZ) | | 149 | hw_params(priv).ht40_channel = BIT(IEEE80211_BAND_2GHZ) | |
150 | BIT(IEEE80211_BAND_5GHZ); | 150 | BIT(IEEE80211_BAND_5GHZ); |
151 | 151 | ||
152 | hw_params(priv).tx_chains_num = num_of_ant(cfg(priv)->valid_tx_ant); | 152 | hw_params(priv).tx_chains_num = |
153 | num_of_ant(hw_params(priv).valid_tx_ant); | ||
153 | if (cfg(priv)->rx_with_siso_diversity) | 154 | if (cfg(priv)->rx_with_siso_diversity) |
154 | hw_params(priv).rx_chains_num = 1; | 155 | hw_params(priv).rx_chains_num = 1; |
155 | else | 156 | else |
156 | hw_params(priv).rx_chains_num = | 157 | hw_params(priv).rx_chains_num = |
157 | num_of_ant(cfg(priv)->valid_rx_ant); | 158 | num_of_ant(hw_params(priv).valid_rx_ant); |
158 | hw_params(priv).valid_tx_ant = cfg(priv)->valid_tx_ant; | ||
159 | hw_params(priv).valid_rx_ant = cfg(priv)->valid_rx_ant; | ||
160 | 159 | ||
161 | iwl6000_set_ct_threshold(priv); | 160 | iwl6000_set_ct_threshold(priv); |
162 | 161 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-calib.c b/drivers/net/wireless/iwlwifi/iwl-agn-calib.c index 12acc81ed419..84fc5ce91b35 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-calib.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-calib.c | |||
@@ -848,7 +848,7 @@ static void iwl_find_disconn_antenna(struct iwl_priv *priv, u32* average_sig, | |||
848 | * connect the first valid tx chain | 848 | * connect the first valid tx chain |
849 | */ | 849 | */ |
850 | first_chain = | 850 | first_chain = |
851 | find_first_chain(cfg(priv)->valid_tx_ant); | 851 | find_first_chain(hw_params(priv).valid_tx_ant); |
852 | data->disconn_array[first_chain] = 0; | 852 | data->disconn_array[first_chain] = 0; |
853 | active_chains |= BIT(first_chain); | 853 | active_chains |= BIT(first_chain); |
854 | IWL_DEBUG_CALIB(priv, | 854 | IWL_DEBUG_CALIB(priv, |
@@ -1082,7 +1082,7 @@ void iwl_chain_noise_calibration(struct iwl_priv *priv) | |||
1082 | 1082 | ||
1083 | iwlagn_gain_computation(priv, average_noise, | 1083 | iwlagn_gain_computation(priv, average_noise, |
1084 | min_average_noise_antenna_i, min_average_noise, | 1084 | min_average_noise_antenna_i, min_average_noise, |
1085 | find_first_chain(cfg(priv)->valid_rx_ant)); | 1085 | find_first_chain(hw_params(priv).valid_rx_ant)); |
1086 | 1086 | ||
1087 | /* Some power changes may have been made during the calibration. | 1087 | /* Some power changes may have been made during the calibration. |
1088 | * Update and commit the RXON | 1088 | * Update and commit the RXON |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index e1bf12578f87..6cec7e63c171 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
@@ -699,7 +699,7 @@ int iwl_alive_start(struct iwl_priv *priv) | |||
699 | priv->active_rate = IWL_RATES_MASK; | 699 | priv->active_rate = IWL_RATES_MASK; |
700 | 700 | ||
701 | /* Configure Tx antenna selection based on H/W config */ | 701 | /* Configure Tx antenna selection based on H/W config */ |
702 | iwlagn_send_tx_ant_config(priv, cfg(priv)->valid_tx_ant); | 702 | iwlagn_send_tx_ant_config(priv, hw_params(priv).valid_tx_ant); |
703 | 703 | ||
704 | if (iwl_is_associated_ctx(ctx) && !priv->shrd->wowlan) { | 704 | if (iwl_is_associated_ctx(ctx) && !priv->shrd->wowlan) { |
705 | struct iwl_rxon_cmd *active_rxon = | 705 | struct iwl_rxon_cmd *active_rxon = |
diff --git a/drivers/net/wireless/iwlwifi/iwl-debugfs.c b/drivers/net/wireless/iwlwifi/iwl-debugfs.c index dd502e82e410..b6740c33b519 100644 --- a/drivers/net/wireless/iwlwifi/iwl-debugfs.c +++ b/drivers/net/wireless/iwlwifi/iwl-debugfs.c | |||
@@ -1546,15 +1546,18 @@ static ssize_t iwl_dbgfs_ucode_tx_stats_read(struct file *file, | |||
1546 | if (tx->tx_power.ant_a || tx->tx_power.ant_b || tx->tx_power.ant_c) { | 1546 | if (tx->tx_power.ant_a || tx->tx_power.ant_b || tx->tx_power.ant_c) { |
1547 | pos += scnprintf(buf + pos, bufsz - pos, | 1547 | pos += scnprintf(buf + pos, bufsz - pos, |
1548 | "tx power: (1/2 dB step)\n"); | 1548 | "tx power: (1/2 dB step)\n"); |
1549 | if ((cfg(priv)->valid_tx_ant & ANT_A) && tx->tx_power.ant_a) | 1549 | if ((hw_params(priv).valid_tx_ant & ANT_A) && |
1550 | tx->tx_power.ant_a) | ||
1550 | pos += scnprintf(buf + pos, bufsz - pos, | 1551 | pos += scnprintf(buf + pos, bufsz - pos, |
1551 | fmt_hex, "antenna A:", | 1552 | fmt_hex, "antenna A:", |
1552 | tx->tx_power.ant_a); | 1553 | tx->tx_power.ant_a); |
1553 | if ((cfg(priv)->valid_tx_ant & ANT_B) && tx->tx_power.ant_b) | 1554 | if ((hw_params(priv).valid_tx_ant & ANT_B) && |
1555 | tx->tx_power.ant_b) | ||
1554 | pos += scnprintf(buf + pos, bufsz - pos, | 1556 | pos += scnprintf(buf + pos, bufsz - pos, |
1555 | fmt_hex, "antenna B:", | 1557 | fmt_hex, "antenna B:", |
1556 | tx->tx_power.ant_b); | 1558 | tx->tx_power.ant_b); |
1557 | if ((cfg(priv)->valid_tx_ant & ANT_C) && tx->tx_power.ant_c) | 1559 | if ((hw_params(priv).valid_tx_ant & ANT_C) && |
1560 | tx->tx_power.ant_c) | ||
1558 | pos += scnprintf(buf + pos, bufsz - pos, | 1561 | pos += scnprintf(buf + pos, bufsz - pos, |
1559 | fmt_hex, "antenna C:", | 1562 | fmt_hex, "antenna C:", |
1560 | tx->tx_power.ant_c); | 1563 | tx->tx_power.ant_c); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.c b/drivers/net/wireless/iwlwifi/iwl-eeprom.c index d8668bccc083..6915b33add36 100644 --- a/drivers/net/wireless/iwlwifi/iwl-eeprom.c +++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.c | |||
@@ -271,25 +271,27 @@ int iwl_eeprom_init_hw_params(struct iwl_priv *priv) | |||
271 | 271 | ||
272 | IWL_INFO(priv, "Device SKU: 0x%X\n", hw_params(priv).sku); | 272 | IWL_INFO(priv, "Device SKU: 0x%X\n", hw_params(priv).sku); |
273 | 273 | ||
274 | if (!cfg(priv)->valid_tx_ant && !cfg(priv)->valid_rx_ant) { | 274 | radio_cfg = iwl_eeprom_query16(shrd, EEPROM_RADIO_CONFIG); |
275 | /* not using .cfg overwrite */ | 275 | |
276 | radio_cfg = iwl_eeprom_query16(shrd, EEPROM_RADIO_CONFIG); | 276 | hw_params(priv).valid_tx_ant = EEPROM_RF_CFG_TX_ANT_MSK(radio_cfg); |
277 | cfg(priv)->valid_tx_ant = EEPROM_RF_CFG_TX_ANT_MSK(radio_cfg); | 277 | hw_params(priv).valid_rx_ant = EEPROM_RF_CFG_RX_ANT_MSK(radio_cfg); |
278 | cfg(priv)->valid_rx_ant = EEPROM_RF_CFG_RX_ANT_MSK(radio_cfg); | 278 | |
279 | if (!cfg(priv)->valid_tx_ant || !cfg(priv)->valid_rx_ant) { | 279 | /* check overrides (some devices have wrong EEPROM) */ |
280 | IWL_ERR(priv, "Invalid chain (0x%X, 0x%X)\n", | 280 | if (cfg(priv)->valid_tx_ant) |
281 | cfg(priv)->valid_tx_ant, | 281 | hw_params(priv).valid_tx_ant = cfg(priv)->valid_tx_ant; |
282 | cfg(priv)->valid_rx_ant); | 282 | if (cfg(priv)->valid_rx_ant) |
283 | return -EINVAL; | 283 | hw_params(priv).valid_rx_ant = cfg(priv)->valid_rx_ant; |
284 | } | 284 | |
285 | IWL_INFO(priv, "Valid Tx ant: 0x%X, Valid Rx ant: 0x%X\n", | 285 | if (!hw_params(priv).valid_tx_ant || !hw_params(priv).valid_rx_ant) { |
286 | cfg(priv)->valid_tx_ant, cfg(priv)->valid_rx_ant); | 286 | IWL_ERR(priv, "Invalid chain (0x%X, 0x%X)\n", |
287 | hw_params(priv).valid_tx_ant, | ||
288 | hw_params(priv).valid_rx_ant); | ||
289 | return -EINVAL; | ||
287 | } | 290 | } |
288 | /* | 291 | |
289 | * for some special cases, | 292 | IWL_INFO(priv, "Valid Tx ant: 0x%X, Valid Rx ant: 0x%X\n", |
290 | * EEPROM did not reflect the correct antenna setting | 293 | hw_params(priv).valid_tx_ant, hw_params(priv).valid_rx_ant); |
291 | * so overwrite the valid tx/rx antenna from .cfg | 294 | |
292 | */ | ||
293 | return 0; | 295 | return 0; |
294 | } | 296 | } |
295 | 297 | ||