aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-trans.h3
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/fw.c19
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/nvm.c4
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/ops.c3
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/tx.c3
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;