diff options
author | Emmanuel Grumbach <emmanuel.grumbach@intel.com> | 2013-03-04 01:53:07 -0500 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2013-03-06 10:48:01 -0500 |
commit | 490953ac344725f56746d16ef8480842f4087fc4 (patch) | |
tree | 0ca250aa7a92f199a84957dccfbf9f06feeaab84 | |
parent | 6bfcb7e88cbb45782664caeb9bfe1a1c1b83a10e (diff) |
iwlwifi: move firmware restart debugfs hook to op_mode
This allows to test fw restart flow. The hook in transport
layer doesn't really make the fw assert. Moving this hook
to the op_mode allows to use the fw API to actually send a
host command that will make the fw assert.
Change the restart_fw module parameter to be a boolean on
the way.
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-rw-r--r-- | drivers/net/wireless/iwlwifi/dvm/debugfs.c | 24 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-drv.c | 6 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-modparams.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/debugfs.c | 24 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/pcie/trans.c | 18 |
5 files changed, 52 insertions, 22 deletions
diff --git a/drivers/net/wireless/iwlwifi/dvm/debugfs.c b/drivers/net/wireless/iwlwifi/dvm/debugfs.c index 9d3b7e3165f4..7b8178be119f 100644 --- a/drivers/net/wireless/iwlwifi/dvm/debugfs.c +++ b/drivers/net/wireless/iwlwifi/dvm/debugfs.c | |||
@@ -2324,6 +2324,28 @@ static ssize_t iwl_dbgfs_calib_disabled_write(struct file *file, | |||
2324 | return count; | 2324 | return count; |
2325 | } | 2325 | } |
2326 | 2326 | ||
2327 | static ssize_t iwl_dbgfs_fw_restart_write(struct file *file, | ||
2328 | const char __user *user_buf, | ||
2329 | size_t count, loff_t *ppos) | ||
2330 | { | ||
2331 | struct iwl_priv *priv = file->private_data; | ||
2332 | bool restart_fw = iwlwifi_mod_params.restart_fw; | ||
2333 | int ret; | ||
2334 | |||
2335 | iwlwifi_mod_params.restart_fw = true; | ||
2336 | |||
2337 | mutex_lock(&priv->mutex); | ||
2338 | |||
2339 | /* take the return value to make compiler happy - it will fail anyway */ | ||
2340 | ret = iwl_dvm_send_cmd_pdu(priv, REPLY_ERROR, CMD_SYNC, 0, NULL); | ||
2341 | |||
2342 | mutex_unlock(&priv->mutex); | ||
2343 | |||
2344 | iwlwifi_mod_params.restart_fw = restart_fw; | ||
2345 | |||
2346 | return count; | ||
2347 | } | ||
2348 | |||
2327 | DEBUGFS_READ_FILE_OPS(ucode_rx_stats); | 2349 | DEBUGFS_READ_FILE_OPS(ucode_rx_stats); |
2328 | DEBUGFS_READ_FILE_OPS(ucode_tx_stats); | 2350 | DEBUGFS_READ_FILE_OPS(ucode_tx_stats); |
2329 | DEBUGFS_READ_FILE_OPS(ucode_general_stats); | 2351 | DEBUGFS_READ_FILE_OPS(ucode_general_stats); |
@@ -2343,6 +2365,7 @@ DEBUGFS_READ_FILE_OPS(bt_traffic); | |||
2343 | DEBUGFS_READ_WRITE_FILE_OPS(protection_mode); | 2365 | DEBUGFS_READ_WRITE_FILE_OPS(protection_mode); |
2344 | DEBUGFS_READ_FILE_OPS(reply_tx_error); | 2366 | DEBUGFS_READ_FILE_OPS(reply_tx_error); |
2345 | DEBUGFS_WRITE_FILE_OPS(echo_test); | 2367 | DEBUGFS_WRITE_FILE_OPS(echo_test); |
2368 | DEBUGFS_WRITE_FILE_OPS(fw_restart); | ||
2346 | #ifdef CONFIG_IWLWIFI_DEBUG | 2369 | #ifdef CONFIG_IWLWIFI_DEBUG |
2347 | DEBUGFS_READ_WRITE_FILE_OPS(log_event); | 2370 | DEBUGFS_READ_WRITE_FILE_OPS(log_event); |
2348 | #endif | 2371 | #endif |
@@ -2400,6 +2423,7 @@ int iwl_dbgfs_register(struct iwl_priv *priv, struct dentry *dbgfs_dir) | |||
2400 | DEBUGFS_ADD_FILE(rxon_flags, dir_debug, S_IWUSR); | 2423 | DEBUGFS_ADD_FILE(rxon_flags, dir_debug, S_IWUSR); |
2401 | DEBUGFS_ADD_FILE(rxon_filter_flags, dir_debug, S_IWUSR); | 2424 | DEBUGFS_ADD_FILE(rxon_filter_flags, dir_debug, S_IWUSR); |
2402 | DEBUGFS_ADD_FILE(echo_test, dir_debug, S_IWUSR); | 2425 | DEBUGFS_ADD_FILE(echo_test, dir_debug, S_IWUSR); |
2426 | DEBUGFS_ADD_FILE(fw_restart, dir_debug, S_IWUSR); | ||
2403 | #ifdef CONFIG_IWLWIFI_DEBUG | 2427 | #ifdef CONFIG_IWLWIFI_DEBUG |
2404 | DEBUGFS_ADD_FILE(log_event, dir_debug, S_IWUSR | S_IRUSR); | 2428 | DEBUGFS_ADD_FILE(log_event, dir_debug, S_IWUSR | S_IRUSR); |
2405 | #endif | 2429 | #endif |
diff --git a/drivers/net/wireless/iwlwifi/iwl-drv.c b/drivers/net/wireless/iwlwifi/iwl-drv.c index 15ac54baa833..3ce4e9d5082d 100644 --- a/drivers/net/wireless/iwlwifi/iwl-drv.c +++ b/drivers/net/wireless/iwlwifi/iwl-drv.c | |||
@@ -1102,7 +1102,7 @@ void iwl_drv_stop(struct iwl_drv *drv) | |||
1102 | 1102 | ||
1103 | /* shared module parameters */ | 1103 | /* shared module parameters */ |
1104 | struct iwl_mod_params iwlwifi_mod_params = { | 1104 | struct iwl_mod_params iwlwifi_mod_params = { |
1105 | .restart_fw = 1, | 1105 | .restart_fw = true, |
1106 | .plcp_check = true, | 1106 | .plcp_check = true, |
1107 | .bt_coex_active = true, | 1107 | .bt_coex_active = true, |
1108 | .power_level = IWL_POWER_INDEX_1, | 1108 | .power_level = IWL_POWER_INDEX_1, |
@@ -1207,8 +1207,8 @@ MODULE_PARM_DESC(11n_disable, | |||
1207 | module_param_named(amsdu_size_8K, iwlwifi_mod_params.amsdu_size_8K, | 1207 | module_param_named(amsdu_size_8K, iwlwifi_mod_params.amsdu_size_8K, |
1208 | int, S_IRUGO); | 1208 | int, S_IRUGO); |
1209 | MODULE_PARM_DESC(amsdu_size_8K, "enable 8K amsdu size (default 0)"); | 1209 | MODULE_PARM_DESC(amsdu_size_8K, "enable 8K amsdu size (default 0)"); |
1210 | module_param_named(fw_restart, iwlwifi_mod_params.restart_fw, int, S_IRUGO); | 1210 | module_param_named(fw_restart, iwlwifi_mod_params.restart_fw, bool, S_IRUGO); |
1211 | MODULE_PARM_DESC(fw_restart, "restart firmware in case of error"); | 1211 | MODULE_PARM_DESC(fw_restart, "restart firmware in case of error (default true)"); |
1212 | 1212 | ||
1213 | module_param_named(antenna_coupling, iwlwifi_mod_params.ant_coupling, | 1213 | module_param_named(antenna_coupling, iwlwifi_mod_params.ant_coupling, |
1214 | int, S_IRUGO); | 1214 | int, S_IRUGO); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-modparams.h b/drivers/net/wireless/iwlwifi/iwl-modparams.h index a2cefe2c3e1d..3cc39ffe8ba5 100644 --- a/drivers/net/wireless/iwlwifi/iwl-modparams.h +++ b/drivers/net/wireless/iwlwifi/iwl-modparams.h | |||
@@ -109,7 +109,7 @@ struct iwl_mod_params { | |||
109 | int sw_crypto; | 109 | int sw_crypto; |
110 | unsigned int disable_11n; | 110 | unsigned int disable_11n; |
111 | int amsdu_size_8K; | 111 | int amsdu_size_8K; |
112 | int restart_fw; | 112 | bool restart_fw; |
113 | bool plcp_check; | 113 | bool plcp_check; |
114 | int wd_disable; | 114 | int wd_disable; |
115 | bool bt_coex_active; | 115 | bool bt_coex_active; |
diff --git a/drivers/net/wireless/iwlwifi/mvm/debugfs.c b/drivers/net/wireless/iwlwifi/mvm/debugfs.c index 56bf601f8991..b080b4ba5458 100644 --- a/drivers/net/wireless/iwlwifi/mvm/debugfs.c +++ b/drivers/net/wireless/iwlwifi/mvm/debugfs.c | |||
@@ -398,6 +398,28 @@ static ssize_t iwl_dbgfs_bt_notif_read(struct file *file, char __user *user_buf, | |||
398 | } | 398 | } |
399 | #undef BT_MBOX_PRINT | 399 | #undef BT_MBOX_PRINT |
400 | 400 | ||
401 | static ssize_t iwl_dbgfs_fw_restart_write(struct file *file, | ||
402 | const char __user *user_buf, | ||
403 | size_t count, loff_t *ppos) | ||
404 | { | ||
405 | struct iwl_mvm *mvm = file->private_data; | ||
406 | bool restart_fw = iwlwifi_mod_params.restart_fw; | ||
407 | int ret; | ||
408 | |||
409 | iwlwifi_mod_params.restart_fw = true; | ||
410 | |||
411 | mutex_lock(&mvm->mutex); | ||
412 | |||
413 | /* take the return value to make compiler happy - it will fail anyway */ | ||
414 | ret = iwl_mvm_send_cmd_pdu(mvm, REPLY_ERROR, CMD_SYNC, 0, NULL); | ||
415 | |||
416 | mutex_unlock(&mvm->mutex); | ||
417 | |||
418 | iwlwifi_mod_params.restart_fw = restart_fw; | ||
419 | |||
420 | return count; | ||
421 | } | ||
422 | |||
401 | #define MVM_DEBUGFS_READ_FILE_OPS(name) \ | 423 | #define MVM_DEBUGFS_READ_FILE_OPS(name) \ |
402 | static const struct file_operations iwl_dbgfs_##name##_ops = { \ | 424 | static const struct file_operations iwl_dbgfs_##name##_ops = { \ |
403 | .read = iwl_dbgfs_##name##_read, \ | 425 | .read = iwl_dbgfs_##name##_read, \ |
@@ -440,6 +462,7 @@ MVM_DEBUGFS_READ_FILE_OPS(stations); | |||
440 | MVM_DEBUGFS_READ_FILE_OPS(bt_notif); | 462 | MVM_DEBUGFS_READ_FILE_OPS(bt_notif); |
441 | MVM_DEBUGFS_WRITE_FILE_OPS(power_down_allow); | 463 | MVM_DEBUGFS_WRITE_FILE_OPS(power_down_allow); |
442 | MVM_DEBUGFS_WRITE_FILE_OPS(power_down_d3_allow); | 464 | MVM_DEBUGFS_WRITE_FILE_OPS(power_down_d3_allow); |
465 | MVM_DEBUGFS_WRITE_FILE_OPS(fw_restart); | ||
443 | 466 | ||
444 | int iwl_mvm_dbgfs_register(struct iwl_mvm *mvm, struct dentry *dbgfs_dir) | 467 | int iwl_mvm_dbgfs_register(struct iwl_mvm *mvm, struct dentry *dbgfs_dir) |
445 | { | 468 | { |
@@ -454,6 +477,7 @@ int iwl_mvm_dbgfs_register(struct iwl_mvm *mvm, struct dentry *dbgfs_dir) | |||
454 | MVM_DEBUGFS_ADD_FILE(bt_notif, dbgfs_dir, S_IRUSR); | 477 | MVM_DEBUGFS_ADD_FILE(bt_notif, dbgfs_dir, S_IRUSR); |
455 | MVM_DEBUGFS_ADD_FILE(power_down_allow, mvm->debugfs_dir, S_IWUSR); | 478 | MVM_DEBUGFS_ADD_FILE(power_down_allow, mvm->debugfs_dir, S_IWUSR); |
456 | MVM_DEBUGFS_ADD_FILE(power_down_d3_allow, mvm->debugfs_dir, S_IWUSR); | 479 | MVM_DEBUGFS_ADD_FILE(power_down_d3_allow, mvm->debugfs_dir, S_IWUSR); |
480 | MVM_DEBUGFS_ADD_FILE(fw_restart, mvm->debugfs_dir, S_IWUSR); | ||
457 | 481 | ||
458 | /* | 482 | /* |
459 | * Create a symlink with mac80211. It will be removed when mac80211 | 483 | * Create a symlink with mac80211. It will be removed when mac80211 |
diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c index d90cbf5041f5..d17fb4bd3efb 100644 --- a/drivers/net/wireless/iwlwifi/pcie/trans.c +++ b/drivers/net/wireless/iwlwifi/pcie/trans.c | |||
@@ -1370,28 +1370,11 @@ static ssize_t iwl_dbgfs_fh_reg_read(struct file *file, | |||
1370 | return ret; | 1370 | return ret; |
1371 | } | 1371 | } |
1372 | 1372 | ||
1373 | static ssize_t iwl_dbgfs_fw_restart_write(struct file *file, | ||
1374 | const char __user *user_buf, | ||
1375 | size_t count, loff_t *ppos) | ||
1376 | { | ||
1377 | struct iwl_trans *trans = file->private_data; | ||
1378 | |||
1379 | if (!trans->op_mode) | ||
1380 | return -EAGAIN; | ||
1381 | |||
1382 | local_bh_disable(); | ||
1383 | iwl_op_mode_nic_error(trans->op_mode); | ||
1384 | local_bh_enable(); | ||
1385 | |||
1386 | return count; | ||
1387 | } | ||
1388 | |||
1389 | DEBUGFS_READ_WRITE_FILE_OPS(interrupt); | 1373 | DEBUGFS_READ_WRITE_FILE_OPS(interrupt); |
1390 | DEBUGFS_READ_FILE_OPS(fh_reg); | 1374 | DEBUGFS_READ_FILE_OPS(fh_reg); |
1391 | DEBUGFS_READ_FILE_OPS(rx_queue); | 1375 | DEBUGFS_READ_FILE_OPS(rx_queue); |
1392 | DEBUGFS_READ_FILE_OPS(tx_queue); | 1376 | DEBUGFS_READ_FILE_OPS(tx_queue); |
1393 | DEBUGFS_WRITE_FILE_OPS(csr); | 1377 | DEBUGFS_WRITE_FILE_OPS(csr); |
1394 | DEBUGFS_WRITE_FILE_OPS(fw_restart); | ||
1395 | 1378 | ||
1396 | /* | 1379 | /* |
1397 | * Create the debugfs files and directories | 1380 | * Create the debugfs files and directories |
@@ -1405,7 +1388,6 @@ static int iwl_trans_pcie_dbgfs_register(struct iwl_trans *trans, | |||
1405 | DEBUGFS_ADD_FILE(interrupt, dir, S_IWUSR | S_IRUSR); | 1388 | DEBUGFS_ADD_FILE(interrupt, dir, S_IWUSR | S_IRUSR); |
1406 | DEBUGFS_ADD_FILE(csr, dir, S_IWUSR); | 1389 | DEBUGFS_ADD_FILE(csr, dir, S_IWUSR); |
1407 | DEBUGFS_ADD_FILE(fh_reg, dir, S_IRUSR); | 1390 | DEBUGFS_ADD_FILE(fh_reg, dir, S_IRUSR); |
1408 | DEBUGFS_ADD_FILE(fw_restart, dir, S_IWUSR); | ||
1409 | return 0; | 1391 | return 0; |
1410 | 1392 | ||
1411 | err: | 1393 | err: |