wifi: iwlwifi: read BIOS PNVM only for non-Intel SKU
authorMiri Korenblit <miriam.rachel.korenblit@intel.com>
Wed, 31 Jan 2024 08:24:34 +0000 (10:24 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 2 Feb 2024 13:15:14 +0000 (14:15 +0100)
The driver is supposed to read the PNVM from BIOS only for non-Intel
SKUs. For Intel SKUs the OEM ID will be 0.
Read BIOS PNVM only when a non-Intel SKU is indicated.

Fixes: b99e32cbfdf6 ("wifi: iwlwifi: Take loading and setting of pnvm image out of parsing part")
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Reviewed-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://msgid.link/20240131091413.3625cf1223d3.Ieffda5f506713b1c979388dd7a0e1c1a0145cfca@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/fw/pnvm.c

index d467ec0e35520b46f221ff5af704c4b44d1febca..053174f00e49cc8fbac0634af5353c2fc545b6af 100644 (file)
@@ -268,21 +268,27 @@ static u8 *iwl_get_pnvm_image(struct iwl_trans *trans_p, size_t *len)
        struct pnvm_sku_package *package;
        u8 *image = NULL;
 
-       /* First attempt to get the PNVM from BIOS */
-       package = iwl_uefi_get_pnvm(trans_p, len);
-       if (!IS_ERR_OR_NULL(package)) {
-               if (*len >= sizeof(*package)) {
-                       /* we need only the data */
-                       *len -= sizeof(*package);
-                       image = kmemdup(package->data, *len, GFP_KERNEL);
+       /* Get PNVM from BIOS for non-Intel SKU */
+       if (trans_p->sku_id[2]) {
+               package = iwl_uefi_get_pnvm(trans_p, len);
+               if (!IS_ERR_OR_NULL(package)) {
+                       if (*len >= sizeof(*package)) {
+                               /* we need only the data */
+                               *len -= sizeof(*package);
+                               image = kmemdup(package->data,
+                                               *len, GFP_KERNEL);
+                       }
+                       /*
+                        * free package regardless of whether kmemdup
+                        * succeeded
+                        */
+                       kfree(package);
+                       if (image)
+                               return image;
                }
-               /* free package regardless of whether kmemdup succeeded */
-               kfree(package);
-               if (image)
-                       return image;
        }
 
-       /* If it's not available, try from the filesystem */
+       /* If it's not available, or for Intel SKU, try from the filesystem */
        if (iwl_pnvm_get_from_fs(trans_p, &image, len))
                return NULL;
        return image;