diff options
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-trans.h | 3 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/fw.c | 19 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/nvm.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/ops.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/pcie/tx.c | 3 |
5 files changed, 27 insertions, 5 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-trans.h b/drivers/net/wireless/iwlwifi/iwl-trans.h index 0470334d6a81..84f1c8dc9741 100644 --- a/drivers/net/wireless/iwlwifi/iwl-trans.h +++ b/drivers/net/wireless/iwlwifi/iwl-trans.h | |||
@@ -189,7 +189,8 @@ enum CMD_MODE { | |||
189 | CMD_SYNC = 0, | 189 | CMD_SYNC = 0, |
190 | CMD_ASYNC = BIT(0), | 190 | CMD_ASYNC = BIT(0), |
191 | CMD_WANT_SKB = BIT(1), | 191 | CMD_WANT_SKB = BIT(1), |
192 | CMD_ON_DEMAND = BIT(2), | 192 | CMD_SEND_IN_RFKILL = BIT(2), |
193 | CMD_ON_DEMAND = BIT(3), | ||
193 | }; | 194 | }; |
194 | 195 | ||
195 | #define DEF_CMD_PAYLOAD_SIZE 320 | 196 | #define DEF_CMD_PAYLOAD_SIZE 320 |
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw.c b/drivers/net/wireless/iwlwifi/mvm/fw.c index a4071cf09a24..20ee2812cc9b 100644 --- a/drivers/net/wireless/iwlwifi/mvm/fw.c +++ b/drivers/net/wireless/iwlwifi/mvm/fw.c | |||
@@ -326,6 +326,17 @@ int iwl_run_init_mvm_ucode(struct iwl_mvm *mvm, bool read_nvm) | |||
326 | ret = iwl_nvm_check_version(mvm->nvm_data, mvm->trans); | 326 | ret = iwl_nvm_check_version(mvm->nvm_data, mvm->trans); |
327 | WARN_ON(ret); | 327 | WARN_ON(ret); |
328 | 328 | ||
329 | /* | ||
330 | * abort after reading the nvm in case RF Kill is on, we will complete | ||
331 | * the init seq later when RF kill will switch to off | ||
332 | */ | ||
333 | if (test_bit(IWL_MVM_STATUS_HW_RFKILL, &mvm->status)) { | ||
334 | IWL_DEBUG_RF_KILL(mvm, | ||
335 | "jump over all phy activities due to RF kill\n"); | ||
336 | iwl_remove_notification(&mvm->notif_wait, &calib_wait); | ||
337 | return 1; | ||
338 | } | ||
339 | |||
329 | /* Send TX valid antennas before triggering calibrations */ | 340 | /* Send TX valid antennas before triggering calibrations */ |
330 | ret = iwl_send_tx_ant_cfg(mvm, iwl_fw_valid_tx_ant(mvm->fw)); | 341 | ret = iwl_send_tx_ant_cfg(mvm, iwl_fw_valid_tx_ant(mvm->fw)); |
331 | if (ret) | 342 | if (ret) |
@@ -402,8 +413,16 @@ int iwl_mvm_up(struct iwl_mvm *mvm) | |||
402 | ret = iwl_run_init_mvm_ucode(mvm, false); | 413 | ret = iwl_run_init_mvm_ucode(mvm, false); |
403 | if (ret && !iwlmvm_mod_params.init_dbg) { | 414 | if (ret && !iwlmvm_mod_params.init_dbg) { |
404 | IWL_ERR(mvm, "Failed to run INIT ucode: %d\n", ret); | 415 | IWL_ERR(mvm, "Failed to run INIT ucode: %d\n", ret); |
416 | /* this can't happen */ | ||
417 | if (WARN_ON(ret > 0)) | ||
418 | ret = -ERFKILL; | ||
405 | goto error; | 419 | goto error; |
406 | } | 420 | } |
421 | /* should stop & start HW since that INIT image just loaded */ | ||
422 | iwl_trans_stop_hw(mvm->trans, false); | ||
423 | ret = iwl_trans_start_hw(mvm->trans); | ||
424 | if (ret) | ||
425 | return ret; | ||
407 | } | 426 | } |
408 | 427 | ||
409 | if (iwlmvm_mod_params.init_dbg) | 428 | if (iwlmvm_mod_params.init_dbg) |
diff --git a/drivers/net/wireless/iwlwifi/mvm/nvm.c b/drivers/net/wireless/iwlwifi/mvm/nvm.c index 3f05c6b23874..2cd669c3c47a 100644 --- a/drivers/net/wireless/iwlwifi/mvm/nvm.c +++ b/drivers/net/wireless/iwlwifi/mvm/nvm.c | |||
@@ -98,7 +98,7 @@ static int iwl_nvm_write_chunk(struct iwl_mvm *mvm, u16 section, | |||
98 | struct iwl_host_cmd cmd = { | 98 | struct iwl_host_cmd cmd = { |
99 | .id = NVM_ACCESS_CMD, | 99 | .id = NVM_ACCESS_CMD, |
100 | .len = { sizeof(struct iwl_nvm_access_cmd), length }, | 100 | .len = { sizeof(struct iwl_nvm_access_cmd), length }, |
101 | .flags = CMD_SYNC, | 101 | .flags = CMD_SYNC | CMD_SEND_IN_RFKILL, |
102 | .data = { &nvm_access_cmd, data }, | 102 | .data = { &nvm_access_cmd, data }, |
103 | /* data may come from vmalloc, so use _DUP */ | 103 | /* data may come from vmalloc, so use _DUP */ |
104 | .dataflags = { 0, IWL_HCMD_DFL_DUP }, | 104 | .dataflags = { 0, IWL_HCMD_DFL_DUP }, |
@@ -120,7 +120,7 @@ static int iwl_nvm_read_chunk(struct iwl_mvm *mvm, u16 section, | |||
120 | struct iwl_rx_packet *pkt; | 120 | struct iwl_rx_packet *pkt; |
121 | struct iwl_host_cmd cmd = { | 121 | struct iwl_host_cmd cmd = { |
122 | .id = NVM_ACCESS_CMD, | 122 | .id = NVM_ACCESS_CMD, |
123 | .flags = CMD_SYNC | CMD_WANT_SKB, | 123 | .flags = CMD_SYNC | CMD_WANT_SKB | CMD_SEND_IN_RFKILL, |
124 | .data = { &nvm_access_cmd, }, | 124 | .data = { &nvm_access_cmd, }, |
125 | }; | 125 | }; |
126 | int ret, bytes_read, offset_read; | 126 | int ret, bytes_read, offset_read; |
diff --git a/drivers/net/wireless/iwlwifi/mvm/ops.c b/drivers/net/wireless/iwlwifi/mvm/ops.c index bb79a8dcf6bb..e3f69a08251d 100644 --- a/drivers/net/wireless/iwlwifi/mvm/ops.c +++ b/drivers/net/wireless/iwlwifi/mvm/ops.c | |||
@@ -396,7 +396,8 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg, | |||
396 | mutex_lock(&mvm->mutex); | 396 | mutex_lock(&mvm->mutex); |
397 | err = iwl_run_init_mvm_ucode(mvm, true); | 397 | err = iwl_run_init_mvm_ucode(mvm, true); |
398 | mutex_unlock(&mvm->mutex); | 398 | mutex_unlock(&mvm->mutex); |
399 | if (err && !iwlmvm_mod_params.init_dbg) { | 399 | /* returns 0 if successful, 1 if success but in rfkill */ |
400 | if (err < 0 && !iwlmvm_mod_params.init_dbg) { | ||
400 | IWL_ERR(mvm, "Failed to run INIT ucode: %d\n", err); | 401 | IWL_ERR(mvm, "Failed to run INIT ucode: %d\n", err); |
401 | goto out_free; | 402 | goto out_free; |
402 | } | 403 | } |
diff --git a/drivers/net/wireless/iwlwifi/pcie/tx.c b/drivers/net/wireless/iwlwifi/pcie/tx.c index 595df1756b84..bf5f8246385e 100644 --- a/drivers/net/wireless/iwlwifi/pcie/tx.c +++ b/drivers/net/wireless/iwlwifi/pcie/tx.c | |||
@@ -1569,7 +1569,8 @@ int iwl_trans_pcie_send_hcmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd) | |||
1569 | if (test_bit(STATUS_FW_ERROR, &trans_pcie->status)) | 1569 | if (test_bit(STATUS_FW_ERROR, &trans_pcie->status)) |
1570 | return -EIO; | 1570 | return -EIO; |
1571 | 1571 | ||
1572 | if (test_bit(STATUS_RFKILL, &trans_pcie->status)) { | 1572 | if (!(cmd->flags & CMD_SEND_IN_RFKILL) && |
1573 | test_bit(STATUS_RFKILL, &trans_pcie->status)) { | ||
1573 | IWL_DEBUG_RF_KILL(trans, "Dropping CMD 0x%x: RF KILL\n", | 1574 | IWL_DEBUG_RF_KILL(trans, "Dropping CMD 0x%x: RF KILL\n", |
1574 | cmd->id); | 1575 | cmd->id); |
1575 | return -ERFKILL; | 1576 | return -ERFKILL; |