diff options
author | Emmanuel Grumbach <emmanuel.grumbach@intel.com> | 2012-03-07 12:52:41 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-03-09 11:32:59 -0500 |
commit | 3dc420be8ce72688bd333afdab6d911e3ceb94e7 (patch) | |
tree | 9016fc5cdcfa4b63e7fb96ed3a0abf73d0b95e6a /drivers/net/wireless/iwlwifi/iwl-agn.c | |
parent | c6f600fcfe8a7e4f594fc4c80b2c7b66f248958b (diff) |
iwlwifi: restore PAN support
in iwlwifi: move setting up fw parameters
Meenakshi moved code up to configure the transport layer, but this
code read the sku before it was set (from the EEPROM). This killed
P2P.
Only the ucode_flags are needed to configure the transport layer, not
the sku which _must_ be set after the EEPROM is read.
We need to reconfigure the transport in case the EEPROM disabled PAN
support. This is not the nicest thing to do, but we have no choice.
Document that we are allowed to configure the transport several times
before start_fw, but not after.
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@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/wireless/iwlwifi/iwl-agn.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.c | 59 |
1 files changed, 30 insertions, 29 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index 1e6b5e41a72b..28422c03d673 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
@@ -1206,35 +1206,17 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans, | |||
1206 | /* TODO: remove fw from shared data later */ | 1206 | /* TODO: remove fw from shared data later */ |
1207 | priv->shrd->fw = fw; | 1207 | priv->shrd->fw = fw; |
1208 | 1208 | ||
1209 | /************************ | 1209 | /* |
1210 | * 2. Setup HW constants | 1210 | * Populate the state variables that the transport layer needs |
1211 | ************************/ | 1211 | * to know about. |
1212 | iwl_set_hw_params(priv); | 1212 | */ |
1213 | trans_cfg.op_mode = op_mode; | ||
1213 | 1214 | ||
1214 | ucode_flags = fw->ucode_capa.flags; | 1215 | ucode_flags = fw->ucode_capa.flags; |
1215 | 1216 | ||
1216 | #ifndef CONFIG_IWLWIFI_P2P | 1217 | #ifndef CONFIG_IWLWIFI_P2P |
1217 | ucode_flags &= ~IWL_UCODE_TLV_FLAGS_PAN; | 1218 | ucode_flags &= ~IWL_UCODE_TLV_FLAGS_PAN; |
1218 | #endif | 1219 | #endif |
1219 | if (!(hw_params(priv).sku & EEPROM_SKU_CAP_IPAN_ENABLE)) | ||
1220 | ucode_flags &= ~IWL_UCODE_TLV_FLAGS_PAN; | ||
1221 | |||
1222 | /* | ||
1223 | * if not PAN, then don't support P2P -- might be a uCode | ||
1224 | * packaging bug or due to the eeprom check above | ||
1225 | */ | ||
1226 | if (!(ucode_flags & IWL_UCODE_TLV_FLAGS_PAN)) | ||
1227 | ucode_flags &= ~IWL_UCODE_TLV_FLAGS_P2P; | ||
1228 | |||
1229 | |||
1230 | /***************************** | ||
1231 | * Configure transport layer | ||
1232 | *****************************/ | ||
1233 | /* | ||
1234 | * Populate the state variables that the transport layer needs | ||
1235 | * to know about. | ||
1236 | */ | ||
1237 | trans_cfg.op_mode = op_mode; | ||
1238 | 1220 | ||
1239 | if (ucode_flags & IWL_UCODE_TLV_FLAGS_PAN) { | 1221 | if (ucode_flags & IWL_UCODE_TLV_FLAGS_PAN) { |
1240 | priv->sta_key_max_num = STA_KEY_MAX_NUM_PAN; | 1222 | priv->sta_key_max_num = STA_KEY_MAX_NUM_PAN; |
@@ -1277,7 +1259,7 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans, | |||
1277 | spin_lock_init(&priv->statistics.lock); | 1259 | spin_lock_init(&priv->statistics.lock); |
1278 | 1260 | ||
1279 | /*********************** | 1261 | /*********************** |
1280 | * 3. Read REV register | 1262 | * 2. Read REV register |
1281 | ***********************/ | 1263 | ***********************/ |
1282 | IWL_INFO(priv, "Detected %s, REV=0x%X\n", | 1264 | IWL_INFO(priv, "Detected %s, REV=0x%X\n", |
1283 | cfg(priv)->name, trans(priv)->hw_rev); | 1265 | cfg(priv)->name, trans(priv)->hw_rev); |
@@ -1287,9 +1269,8 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans, | |||
1287 | goto out_free_traffic_mem; | 1269 | goto out_free_traffic_mem; |
1288 | 1270 | ||
1289 | /***************** | 1271 | /***************** |
1290 | * 4. Read EEPROM | 1272 | * 3. Read EEPROM |
1291 | *****************/ | 1273 | *****************/ |
1292 | /* Read the EEPROM */ | ||
1293 | err = iwl_eeprom_init(trans(priv), trans(priv)->hw_rev); | 1274 | err = iwl_eeprom_init(trans(priv), trans(priv)->hw_rev); |
1294 | /* Reset chip to save power until we load uCode during "up". */ | 1275 | /* Reset chip to save power until we load uCode during "up". */ |
1295 | iwl_trans_stop_hw(trans(priv)); | 1276 | iwl_trans_stop_hw(trans(priv)); |
@@ -1318,8 +1299,28 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans, | |||
1318 | priv->hw->wiphy->n_addresses++; | 1299 | priv->hw->wiphy->n_addresses++; |
1319 | } | 1300 | } |
1320 | 1301 | ||
1302 | /************************ | ||
1303 | * 4. Setup HW constants | ||
1304 | ************************/ | ||
1305 | iwl_set_hw_params(priv); | ||
1306 | |||
1307 | if (!(hw_params(priv).sku & EEPROM_SKU_CAP_IPAN_ENABLE)) { | ||
1308 | IWL_DEBUG_INFO(priv, "Your EEPROM disabled PAN"); | ||
1309 | ucode_flags &= ~IWL_UCODE_TLV_FLAGS_PAN; | ||
1310 | /* | ||
1311 | * if not PAN, then don't support P2P -- might be a uCode | ||
1312 | * packaging bug or due to the eeprom check above | ||
1313 | */ | ||
1314 | ucode_flags &= ~IWL_UCODE_TLV_FLAGS_P2P; | ||
1315 | priv->sta_key_max_num = STA_KEY_MAX_NUM; | ||
1316 | trans_cfg.cmd_queue = IWL_DEFAULT_CMD_QUEUE_NUM; | ||
1317 | |||
1318 | /* Configure transport layer again*/ | ||
1319 | iwl_trans_configure(trans(priv), &trans_cfg); | ||
1320 | } | ||
1321 | |||
1321 | /******************* | 1322 | /******************* |
1322 | * 6. Setup priv | 1323 | * 5. Setup priv |
1323 | *******************/ | 1324 | *******************/ |
1324 | 1325 | ||
1325 | err = iwl_init_drv(priv); | 1326 | err = iwl_init_drv(priv); |
@@ -1328,7 +1329,7 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans, | |||
1328 | /* At this point both hw and priv are initialized. */ | 1329 | /* At this point both hw and priv are initialized. */ |
1329 | 1330 | ||
1330 | /******************** | 1331 | /******************** |
1331 | * 7. Setup services | 1332 | * 6. Setup services |
1332 | ********************/ | 1333 | ********************/ |
1333 | iwl_setup_deferred_work(priv); | 1334 | iwl_setup_deferred_work(priv); |
1334 | iwl_setup_rx_handlers(priv); | 1335 | iwl_setup_rx_handlers(priv); |
@@ -1355,7 +1356,7 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans, | |||
1355 | /************************************************** | 1356 | /************************************************** |
1356 | * This is still part of probe() in a sense... | 1357 | * This is still part of probe() in a sense... |
1357 | * | 1358 | * |
1358 | * 9. Setup and register with mac80211 and debugfs | 1359 | * 7. Setup and register with mac80211 and debugfs |
1359 | **************************************************/ | 1360 | **************************************************/ |
1360 | err = iwlagn_mac_setup_register(priv, &fw->ucode_capa); | 1361 | err = iwlagn_mac_setup_register(priv, &fw->ucode_capa); |
1361 | if (err) | 1362 | if (err) |