iwlwifi: mvm: move the check if associated outside of the iterator for wowlan

Instead of checking if we are associated when suspending with wowlan
enabled in the interface iterator, allow it to return an unassociated
vif and move the check to the main suspend function.  This will be
needed by netdetect, since it should also work when we are not
associated but the vif is active.

Signed-off-by: Luciano Coelho <luciano.coelho@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
diff --git a/drivers/net/wireless/iwlwifi/mvm/d3.c b/drivers/net/wireless/iwlwifi/mvm/d3.c
index b8e8a97..7a66a09 100644
--- a/drivers/net/wireless/iwlwifi/mvm/d3.c
+++ b/drivers/net/wireless/iwlwifi/mvm/d3.c
@@ -611,14 +611,10 @@
 				      struct ieee80211_vif *vif)
 {
 	struct iwl_d3_iter_data *data = _data;
-	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
 
 	if (vif->type != NL80211_IFTYPE_STATION || vif->p2p)
 		return;
 
-	if (mvmvif->ap_sta_id == IWL_MVM_STATION_COUNT)
-		return;
-
 	if (data->vif) {
 		IWL_ERR(data->mvm, "More than one managed interface active!\n");
 		data->error = true;
@@ -1029,7 +1025,7 @@
 
 	mutex_lock(&mvm->mutex);
 
-	/* see if there's only a single BSS vif and it's associated */
+	/* see if there's only a single BSS vif */
 	ieee80211_iterate_active_interfaces_atomic(
 		mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
 		iwl_mvm_d3_iface_iterator, &suspend_iter_data);
@@ -1042,28 +1038,34 @@
 	vif = suspend_iter_data.vif;
 	mvmvif = iwl_mvm_vif_from_mac80211(vif);
 
-	ap_sta = rcu_dereference_protected(
-		mvm->fw_id_to_mac_id[mvmvif->ap_sta_id],
-		lockdep_is_held(&mvm->mutex));
-	if (IS_ERR_OR_NULL(ap_sta)) {
-		ret = -EINVAL;
+	/* if we're associated, this is wowlan */
+	if (mvmvif->ap_sta_id != IWL_MVM_STATION_COUNT) {
+		ap_sta = rcu_dereference_protected(
+			mvm->fw_id_to_mac_id[mvmvif->ap_sta_id],
+			lockdep_is_held(&mvm->mutex));
+		if (IS_ERR_OR_NULL(ap_sta)) {
+			ret = -EINVAL;
+			goto out_noreset;
+		}
+
+		ret = iwl_mvm_get_wowlan_config(mvm, wowlan, &wowlan_config_cmd,
+						vif, mvmvif, ap_sta);
+		if (ret)
+			goto out_noreset;
+
+		ret = iwl_mvm_switch_to_d3(mvm);
+		if (ret)
+			goto out;
+
+		ret = iwl_mvm_wowlan_config(mvm, wowlan, &wowlan_config_cmd,
+					    vif, mvmvif, ap_sta);
+		if (ret)
+			goto out;
+	} else {
+		ret = 1;
 		goto out_noreset;
 	}
 
-	ret = iwl_mvm_get_wowlan_config(mvm, wowlan, &wowlan_config_cmd, vif,
-					mvmvif, ap_sta);
-	if (ret)
-		goto out_noreset;
-
-	ret = iwl_mvm_switch_to_d3(mvm);
-	if (ret)
-		goto out;
-
-	ret = iwl_mvm_wowlan_config(mvm, wowlan, &wowlan_config_cmd,
-				    vif, mvmvif, ap_sta);
-	if (ret)
-		goto out;
-
 	ret = iwl_mvm_power_update_device(mvm);
 	if (ret)
 		goto out;