iwlwifi: mvm: Add list of OEMs allowed to use TAS
authorAyala Barazani <ayala.barazani@intel.com>
Fri, 10 Dec 2021 07:06:16 +0000 (09:06 +0200)
committerLuca Coelho <luciano.coelho@intel.com>
Tue, 21 Dec 2021 10:35:04 +0000 (12:35 +0200)
Add list of vendors that are allowed to use TAS and check it
against the value provided in the SMBIOS manufacturer field.
Initially add the following approved vendors: HP, Dell, Lenovo and Samsung.

Signed-off-by: Ayala Barazani <ayala.barazani@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20211210090244.27fe6abf2e4c.I806e4b47dabddaa8ac27172e7cfa3d719c100e8f@changeid
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/fw.c

index 72227c8..19a18b6 100644 (file)
@@ -1153,11 +1153,38 @@ static int iwl_mvm_ppag_init(struct iwl_mvm *mvm)
        return iwl_mvm_ppag_send_cmd(mvm);
 }
 
+static const struct dmi_system_id dmi_tas_approved_list[] = {
+       { .ident = "HP",
+         .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "HP"),
+               },
+       },
+       { .ident = "SAMSUNG",
+         .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD"),
+               },
+       },
+               { .ident = "LENOVO",
+         .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Lenovo"),
+               },
+       },
+       { .ident = "DELL",
+         .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+               },
+       },
+
+       /* keep last */
+       {}
+};
+
 static void iwl_mvm_tas_init(struct iwl_mvm *mvm)
 {
        int ret;
        struct iwl_tas_config_cmd_v3 cmd = {};
        int cmd_size;
+       const struct ieee80211_regdomain *regd;
 
        BUILD_BUG_ON(ARRAY_SIZE(cmd.block_list_array) <
                     APCI_WTAS_BLACK_LIST_MAX);
@@ -1167,6 +1194,24 @@ static void iwl_mvm_tas_init(struct iwl_mvm *mvm)
                return;
        }
 
+       /* Get the MCC from cfg80211 */
+       regd = wiphy_dereference(mvm->hw->wiphy, mvm->hw->wiphy->regd);
+
+       if (!regd) {
+               IWL_DEBUG_RADIO(mvm, "MCC is unavailable\n");
+               return;
+       }
+
+       if ((regd->alpha2[0] == 'U' && regd->alpha2[1] == 'S') ||
+           (regd->alpha2[0] == 'C' && regd->alpha2[1] == 'A')) {
+               if (!dmi_check_system(dmi_tas_approved_list)) {
+                       IWL_DEBUG_RADIO(mvm,
+                                       "System vendor '%s' is not in the approved list, disabling TAS.\n",
+                                       dmi_get_system_info(DMI_SYS_VENDOR));
+                       return;
+               }
+       }
+
        ret = iwl_acpi_get_tas(&mvm->fwrt, &cmd);
        if (ret < 0) {
                IWL_DEBUG_RADIO(mvm,