فهرست منبع

iwlwifi: mvm: init country code on init/recovery

During init queue a regulatory update to retrieve the default
regulatory settings from FW. If we're during recovery, only replay the
current country code to FW, if it exists.

Signed-off-by: Arik Nemtsov <arikx.nemtsov@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Arik Nemtsov 11 سال پیش
والد
کامیت
90d4f7db6c
3فایلهای تغییر یافته به همراه42 افزوده شده و 0 حذف شده
  1. 4 0
      drivers/net/wireless/iwlwifi/mvm/fw.c
  2. 1 0
      drivers/net/wireless/iwlwifi/mvm/mvm.h
  3. 37 0
      drivers/net/wireless/iwlwifi/mvm/nvm.c

+ 4 - 0
drivers/net/wireless/iwlwifi/mvm/fw.c

@@ -739,6 +739,10 @@ int iwl_mvm_up(struct iwl_mvm *mvm)
 	if (ret)
 		goto error;
 
+	ret = iwl_mvm_init_mcc(mvm);
+	if (ret)
+		goto error;
+
 	if (mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_UMAC_SCAN) {
 		ret = iwl_mvm_config_scan(mvm);
 		if (ret)

+ 1 - 0
drivers/net/wireless/iwlwifi/mvm/mvm.h

@@ -1397,6 +1397,7 @@ int iwl_mvm_get_temp(struct iwl_mvm *mvm);
 /* Location Aware Regulatory */
 struct iwl_mcc_update_resp *
 iwl_mvm_update_mcc(struct iwl_mvm *mvm, const char *alpha2);
+int iwl_mvm_init_mcc(struct iwl_mvm *mvm);
 
 /* smart fifo */
 int iwl_mvm_sf_update(struct iwl_mvm *mvm, struct ieee80211_vif *vif,

+ 37 - 0
drivers/net/wireless/iwlwifi/mvm/nvm.c

@@ -63,6 +63,7 @@
  *
  *****************************************************************************/
 #include <linux/firmware.h>
+#include <linux/rtnetlink.h>
 #include "iwl-trans.h"
 #include "iwl-csr.h"
 #include "mvm.h"
@@ -654,3 +655,39 @@ exit:
 		return ERR_PTR(ret);
 	return resp_cp;
 }
+
+int iwl_mvm_init_mcc(struct iwl_mvm *mvm)
+{
+	if (!iwl_mvm_is_lar_supported(mvm))
+		return 0;
+
+	/*
+	 * During HW restart, only replay the last set MCC to FW. Otherwise,
+	 * queue an update to cfg80211 to retrieve the default alpha2 from FW.
+	 */
+	if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) {
+		/* This should only be called during vif up and hold RTNL */
+		const struct ieee80211_regdomain *r =
+				rtnl_dereference(mvm->hw->wiphy->regd);
+
+		if (r) {
+			struct iwl_mcc_update_resp *resp;
+
+			resp = iwl_mvm_update_mcc(mvm, r->alpha2);
+			if (IS_ERR_OR_NULL(resp))
+				return -EIO;
+
+			kfree(resp);
+		}
+
+		return 0;
+	}
+
+	/*
+	 * Driver regulatory hint for initial update - use the special
+	 * unknown-country "99" code. This will also clear the "custom reg"
+	 * flag and allow regdomain changes. It will happen after init since
+	 * RTNL is required.
+	 */
+	return regulatory_hint(mvm->hw->wiphy, "99");
+}