iwlwifi: mvm: support BIOS enable/disable for 11ax in Ukraine
authorMiri Korenblit <miriam.rachel.korenblit@intel.com>
Wed, 31 Mar 2021 09:14:50 +0000 (12:14 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Wed, 14 Apr 2021 09:07:18 +0000 (12:07 +0300)
Read the new BIOS DSM and Pass to FW if to disable\enable
11ax for Ukraine according to the BIOS key. this is
needed to enable OEMs to control enable/disable 11ax in Ukraine

Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20210331121101.055654e7707e.If7eaf9839cd5d59729a235df07e31668b408e740@changeid
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/fw/acpi.c
drivers/net/wireless/intel/iwlwifi/fw/acpi.h
drivers/net/wireless/intel/iwlwifi/fw/api/nvm-reg.h
drivers/net/wireless/intel/iwlwifi/mvm/fw.c

index 56c4d05..874cc11 100644 (file)
@@ -695,3 +695,32 @@ int iwl_sar_geo_init(struct iwl_fw_runtime *fwrt,
        return 0;
 }
 IWL_EXPORT_SYMBOL(iwl_sar_geo_init);
+
+u32 iwl_acpi_eval_dsm_11ax_enablement(struct device *dev)
+{
+       union acpi_object *obj;
+       u32 ret;
+
+       obj = iwl_acpi_get_dsm_object(dev, 0,
+                                     DSM_FUNC_11AX_ENABLEMENT, NULL,
+                                     &iwl_guid);
+       if (IS_ERR(obj))
+               return 0;
+
+       if (obj->type != ACPI_TYPE_INTEGER) {
+               IWL_DEBUG_DEV_RADIO(dev,
+                                   "ACPI: DSM method did not return a valid object, type=%d\n",
+                                   obj->type);
+               ret = 0;
+               goto out;
+       }
+
+       ret = obj->integer.value;
+       IWL_DEBUG_DEV_RADIO(dev,
+                           "ACPI: DSM method evaluated: func=DSM_FUNC_11AX_ENABLEMENT, ret=%d\n",
+                           ret);
+out:
+       ACPI_FREE(obj);
+       return ret;
+}
+IWL_EXPORT_SYMBOL(iwl_acpi_eval_dsm_11ax_enablement);
index f8ea588..b7389f4 100644 (file)
@@ -77,6 +77,7 @@ enum iwl_dsm_funcs_rev_0 {
        DSM_FUNC_QUERY = 0,
        DSM_FUNC_DISABLE_SRD = 1,
        DSM_FUNC_ENABLE_INDONESIA_5G2 = 2,
+       DSM_FUNC_11AX_ENABLEMENT = 6,
 };
 
 enum iwl_dsm_values_srd {
@@ -160,6 +161,8 @@ int iwl_sar_geo_init(struct iwl_fw_runtime *fwrt,
 int iwl_acpi_get_tas(struct iwl_fw_runtime *fwrt, __le32 *block_list_array,
                     int *block_list_size);
 
+u32 iwl_acpi_eval_dsm_11ax_enablement(struct device *dev);
+
 #else /* CONFIG_ACPI */
 
 static inline void *iwl_acpi_get_object(struct device *dev, acpi_string method)
@@ -235,5 +238,11 @@ static inline int iwl_acpi_get_tas(struct iwl_fw_runtime *fwrt,
 {
        return -ENOENT;
 }
+
+static inline u32 iwl_acpi_eval_dsm_11ax_enablement(struct device *dev)
+{
+       return 0;
+}
+
 #endif /* CONFIG_ACPI */
 #endif /* __iwl_fw_acpi__ */
index fbca9dd..3a358bb 100644 (file)
@@ -414,6 +414,9 @@ enum iwl_lari_config_masks {
        LARI_CONFIG_ENABLE_5G2_IN_INDONESIA_MSK         = BIT(3),
 };
 
+#define IWL_11AX_UKRAINE_MASK 3
+#define IWL_11AX_UKRAINE_SHIFT 8
+
 /**
  * struct iwl_lari_config_change_cmd_v1 - change LARI configuration
  * @config_bitmap: bit map of the config commands. each bit will trigger a
index b8a2594..ff3967f 100644 (file)
@@ -1213,6 +1213,10 @@ static void iwl_mvm_lari_cfg(struct iwl_mvm *mvm)
                cmd.config_bitmap |=
                        cpu_to_le32(LARI_CONFIG_CHANGE_ETSI_TO_DISABLED_MSK);
 
+       ret = iwl_acpi_eval_dsm_11ax_enablement((&mvm->fwrt)->dev);
+       cmd.config_bitmap |=
+               cpu_to_le32((ret &= IWL_11AX_UKRAINE_MASK) << IWL_11AX_UKRAINE_SHIFT);
+
        /* apply more config masks here */
 
        if (cmd.config_bitmap) {