Takashi Iwai cdb9e4
From 6ad0435991482107664f65b7ae3fd588f10149d4 Mon Sep 17 00:00:00 2001
Takashi Iwai cdb9e4
From: Johannes Berg <johannes.berg@intel.com>
Takashi Iwai cdb9e4
Date: Tue, 25 Apr 2017 10:21:18 +0200
Takashi Iwai cdb9e4
Subject: [PATCH] iwlwifi: mvm: don't warn in queue sync on RF-kill
Takashi Iwai cdb9e4
Git-commit: 6ad0435991482107664f65b7ae3fd588f10149d4
Takashi Iwai cdb9e4
Patch-mainline: 4.13-rc1
Takashi Iwai cdb9e4
References: bsc#1051510
Takashi Iwai cdb9e4
Takashi Iwai cdb9e4
If we happen to be in or get into the queue sync when RF-kill
Takashi Iwai cdb9e4
is asserted, we return from there and warn since there are
Takashi Iwai cdb9e4
still queue sync notifications outstanding. These can't ever
Takashi Iwai cdb9e4
come though, because we're in RF-kill, so don't WARN then.
Takashi Iwai cdb9e4
Takashi Iwai cdb9e4
While at it, also move the warning to the appropriate place,
Takashi Iwai cdb9e4
if the request is not synchronous then we shouldn't warn, but
Takashi Iwai cdb9e4
currently always will.
Takashi Iwai cdb9e4
Takashi Iwai cdb9e4
To make it fast, also trigger the waitq when on rfkill assert.
Takashi Iwai cdb9e4
Takashi Iwai cdb9e4
Fixes: 0636b938214c ("iwlwifi: mvm: implement driver RX queues sync command")
Takashi Iwai cdb9e4
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Takashi Iwai cdb9e4
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Takashi Iwai cdb9e4
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai cdb9e4
Takashi Iwai cdb9e4
---
Takashi Iwai cdb9e4
 drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c |    8 +++++---
Oliver Neukum 318dca
 drivers/net/wireless/intel/iwlwifi/mvm/ops.c      |    4 ++--
Oliver Neukum 318dca
 2 files changed, 7 insertions(+), 5 deletions(-)
Takashi Iwai cdb9e4
Takashi Iwai cdb9e4
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
Takashi Iwai cdb9e4
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
Oliver Neukum 318dca
@@ -4268,11 +4268,13 @@ void iwl_mvm_sync_rx_queues_internal(str
Takashi Iwai cdb9e4
 		goto out;
Takashi Iwai cdb9e4
 	}
Takashi Iwai cdb9e4
 
Takashi Iwai cdb9e4
-	if (notif->sync)
Takashi Iwai cdb9e4
+	if (notif->sync) {
Takashi Iwai cdb9e4
 		ret = wait_event_timeout(mvm->rx_sync_waitq,
Takashi Iwai cdb9e4
-					 atomic_read(&mvm->queue_sync_counter) == 0,
Takashi Iwai cdb9e4
+					 atomic_read(&mvm->queue_sync_counter) == 0 ||
Takashi Iwai cdb9e4
+					 iwl_mvm_is_radio_killed(mvm),
Takashi Iwai cdb9e4
 					 HZ);
Takashi Iwai cdb9e4
-	WARN_ON_ONCE(!ret);
Takashi Iwai cdb9e4
+		WARN_ON_ONCE(!ret && !iwl_mvm_is_radio_killed(mvm));
Takashi Iwai cdb9e4
+	}
Takashi Iwai cdb9e4
 
Takashi Iwai cdb9e4
 out:
Takashi Iwai cdb9e4
 	atomic_set(&mvm->queue_sync_counter, 0);
Takashi Iwai cdb9e4
--- a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
Takashi Iwai cdb9e4
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
Oliver Neukum 318dca
@@ -1112,7 +1112,7 @@ void iwl_mvm_set_hw_ctkill_state(struct
Takashi Iwai cdb9e4
 	else
Takashi Iwai cdb9e4
 		clear_bit(IWL_MVM_STATUS_HW_CTKILL, &mvm->status);
Takashi Iwai cdb9e4
 
Takashi Iwai cdb9e4
-	wiphy_rfkill_set_hw_state(mvm->hw->wiphy, iwl_mvm_is_radio_killed(mvm));
Takashi Iwai cdb9e4
+	iwl_mvm_set_rfkill_state(mvm);
Takashi Iwai cdb9e4
 }
Takashi Iwai cdb9e4
 
Takashi Iwai cdb9e4
 static bool iwl_mvm_set_hw_rfkill_state(struct iwl_op_mode *op_mode, bool state)
Oliver Neukum 318dca
@@ -1125,7 +1125,7 @@ static bool iwl_mvm_set_hw_rfkill_state(
Takashi Iwai cdb9e4
 	else
Takashi Iwai cdb9e4
 		clear_bit(IWL_MVM_STATUS_HW_RFKILL, &mvm->status);
Takashi Iwai cdb9e4
 
Takashi Iwai cdb9e4
-	wiphy_rfkill_set_hw_state(mvm->hw->wiphy, iwl_mvm_is_radio_killed(mvm));
Takashi Iwai cdb9e4
+	iwl_mvm_set_rfkill_state(mvm);
Takashi Iwai cdb9e4
 
Takashi Iwai cdb9e4
 	/* iwl_run_init_mvm_ucode is waiting for results, abort it */
Takashi Iwai cdb9e4
 	if (calibrating)