aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/mvm/ops.c
diff options
context:
space:
mode:
authorJohn W. Linville <linville@tuxdriver.com>2013-05-29 14:50:45 -0400
committerJohn W. Linville <linville@tuxdriver.com>2013-05-29 14:50:45 -0400
commit531efffc3e3ff52d732c8fa6f32e084e9c447612 (patch)
tree79c301b2c8b5400a39c95e034764cf7a208a16a2 /drivers/net/wireless/iwlwifi/mvm/ops.c
parentbbf71a8f35cf52e97ba129401f82ccefd249c757 (diff)
parentb571a69745dc90aec3d0505a7ceac2702a93861b (diff)
Merge branch 'for-john' of git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-next
Diffstat (limited to 'drivers/net/wireless/iwlwifi/mvm/ops.c')
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/ops.c31
1 files changed, 29 insertions, 2 deletions
diff --git a/drivers/net/wireless/iwlwifi/mvm/ops.c b/drivers/net/wireless/iwlwifi/mvm/ops.c
index fe031d304d1e..d7a199b1cdef 100644
--- a/drivers/net/wireless/iwlwifi/mvm/ops.c
+++ b/drivers/net/wireless/iwlwifi/mvm/ops.c
@@ -222,10 +222,14 @@ static const struct iwl_rx_handlers iwl_mvm_rx_handlers[] = {
222 222
223 RX_HANDLER(BT_PROFILE_NOTIFICATION, iwl_mvm_rx_bt_coex_notif, true), 223 RX_HANDLER(BT_PROFILE_NOTIFICATION, iwl_mvm_rx_bt_coex_notif, true),
224 RX_HANDLER(BEACON_NOTIFICATION, iwl_mvm_rx_beacon_notif, false), 224 RX_HANDLER(BEACON_NOTIFICATION, iwl_mvm_rx_beacon_notif, false),
225 RX_HANDLER(STATISTICS_NOTIFICATION, iwl_mvm_rx_statistics, true),
225 226
226 RX_HANDLER(RADIO_VERSION_NOTIFICATION, iwl_mvm_rx_radio_ver, false), 227 RX_HANDLER(RADIO_VERSION_NOTIFICATION, iwl_mvm_rx_radio_ver, false),
227 RX_HANDLER(CARD_STATE_NOTIFICATION, iwl_mvm_rx_card_state_notif, false), 228 RX_HANDLER(CARD_STATE_NOTIFICATION, iwl_mvm_rx_card_state_notif, false),
228 229
230 RX_HANDLER(MISSED_BEACONS_NOTIFICATION, iwl_mvm_rx_missed_beacons_notif,
231 false),
232
229 RX_HANDLER(REPLY_ERROR, iwl_mvm_rx_fw_error, false), 233 RX_HANDLER(REPLY_ERROR, iwl_mvm_rx_fw_error, false),
230}; 234};
231#undef RX_HANDLER 235#undef RX_HANDLER
@@ -288,10 +292,14 @@ static const char *iwl_mvm_cmd_strings[REPLY_MAX] = {
288 CMD(NET_DETECT_HOTSPOTS_CMD), 292 CMD(NET_DETECT_HOTSPOTS_CMD),
289 CMD(NET_DETECT_HOTSPOTS_QUERY_CMD), 293 CMD(NET_DETECT_HOTSPOTS_QUERY_CMD),
290 CMD(CARD_STATE_NOTIFICATION), 294 CMD(CARD_STATE_NOTIFICATION),
295 CMD(MISSED_BEACONS_NOTIFICATION),
291 CMD(BT_COEX_PRIO_TABLE), 296 CMD(BT_COEX_PRIO_TABLE),
292 CMD(BT_COEX_PROT_ENV), 297 CMD(BT_COEX_PROT_ENV),
293 CMD(BT_PROFILE_NOTIFICATION), 298 CMD(BT_PROFILE_NOTIFICATION),
294 CMD(BT_CONFIG), 299 CMD(BT_CONFIG),
300 CMD(MCAST_FILTER_CMD),
301 CMD(REPLY_BEACON_FILTERING_CMD),
302 CMD(REPLY_THERMAL_MNG_BACKOFF),
295}; 303};
296#undef CMD 304#undef CMD
297 305
@@ -392,10 +400,13 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
392 if (err) 400 if (err)
393 goto out_free; 401 goto out_free;
394 402
403 iwl_mvm_tt_initialize(mvm);
404
395 mutex_lock(&mvm->mutex); 405 mutex_lock(&mvm->mutex);
396 err = iwl_run_init_mvm_ucode(mvm, true); 406 err = iwl_run_init_mvm_ucode(mvm, true);
397 mutex_unlock(&mvm->mutex); 407 mutex_unlock(&mvm->mutex);
398 if (err && !iwlmvm_mod_params.init_dbg) { 408 /* returns 0 if successful, 1 if success but in rfkill */
409 if (err < 0 && !iwlmvm_mod_params.init_dbg) {
399 IWL_ERR(mvm, "Failed to run INIT ucode: %d\n", err); 410 IWL_ERR(mvm, "Failed to run INIT ucode: %d\n", err);
400 goto out_free; 411 goto out_free;
401 } 412 }
@@ -438,10 +449,16 @@ static void iwl_op_mode_mvm_stop(struct iwl_op_mode *op_mode)
438 449
439 iwl_mvm_leds_exit(mvm); 450 iwl_mvm_leds_exit(mvm);
440 451
452 iwl_mvm_tt_exit(mvm);
453
441 ieee80211_unregister_hw(mvm->hw); 454 ieee80211_unregister_hw(mvm->hw);
442 455
443 kfree(mvm->scan_cmd); 456 kfree(mvm->scan_cmd);
444 457
458#if defined(CONFIG_PM_SLEEP) && defined(CONFIG_IWLWIFI_DEBUGFS)
459 kfree(mvm->d3_resume_sram);
460#endif
461
445 iwl_trans_stop_hw(mvm->trans, true); 462 iwl_trans_stop_hw(mvm->trans, true);
446 463
447 iwl_phy_db_free(mvm->phy_db); 464 iwl_phy_db_free(mvm->phy_db);
@@ -588,6 +605,16 @@ static void iwl_mvm_wake_sw_queue(struct iwl_op_mode *op_mode, int queue)
588 ieee80211_wake_queue(mvm->hw, mq); 605 ieee80211_wake_queue(mvm->hw, mq);
589} 606}
590 607
608void iwl_mvm_set_hw_ctkill_state(struct iwl_mvm *mvm, bool state)
609{
610 if (state)
611 set_bit(IWL_MVM_STATUS_HW_CTKILL, &mvm->status);
612 else
613 clear_bit(IWL_MVM_STATUS_HW_CTKILL, &mvm->status);
614
615 wiphy_rfkill_set_hw_state(mvm->hw->wiphy, iwl_mvm_is_radio_killed(mvm));
616}
617
591static void iwl_mvm_set_hw_rfkill_state(struct iwl_op_mode *op_mode, bool state) 618static void iwl_mvm_set_hw_rfkill_state(struct iwl_op_mode *op_mode, bool state)
592{ 619{
593 struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode); 620 struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode);
@@ -597,7 +624,7 @@ static void iwl_mvm_set_hw_rfkill_state(struct iwl_op_mode *op_mode, bool state)
597 else 624 else
598 clear_bit(IWL_MVM_STATUS_HW_RFKILL, &mvm->status); 625 clear_bit(IWL_MVM_STATUS_HW_RFKILL, &mvm->status);
599 626
600 wiphy_rfkill_set_hw_state(mvm->hw->wiphy, state); 627 wiphy_rfkill_set_hw_state(mvm->hw->wiphy, iwl_mvm_is_radio_killed(mvm));
601} 628}
602 629
603static void iwl_mvm_free_skb(struct iwl_op_mode *op_mode, struct sk_buff *skb) 630static void iwl_mvm_free_skb(struct iwl_op_mode *op_mode, struct sk_buff *skb)