On iMacPro1,1, iMac19,1 and iMac19,2, the Antenna SKU property required for firmware selection is not advertised by ACPI. It has been found that the firmware shipped by macOS for the BCM4364/3 chip is independent of the Antenna SKU property by comparing SHA256 sums. Thus, for this chip, make its requirement optional and use it only if ACPI advertises it. Signed-off-by: Aditya Garg --- --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c @@ -2428,39 +2428,54 @@ fwreq->domain_nr = pci_domain_nr(devinfo->pdev->bus) + 1; fwreq->bus_nr = devinfo->pdev->bus->number; - /* Apple platforms with fancy firmware/NVRAM selection */ + /* Apple platforms with fancy firmware/NVRAM selection. + * Antenna SKU is not advertised by ACPI in iMacPro1,1, + * iMac19,1 and iMac19,2. Since they use BCM4364/3, and + * the firmware for that chip doesn't depend on antenna-sku, + * make its check optional on that chip. + */ if (devinfo->settings->board_type && - devinfo->settings->antenna_sku && + (devinfo->settings->antenna_sku || + (devinfo->ci->chip == BRCM_CC_4364_CHIP_ID && + devinfo->ci->chiprev == 3)) && devinfo->otp.valid) { const struct brcmf_otp_params *otp = &devinfo->otp; struct device *dev = &devinfo->pdev->dev; const char **bt = fwreq->board_types; + int i = 0; + int j; brcmf_dbg(PCIE, "Apple board: %s\n", devinfo->settings->board_type); /* Example: apple,shikoku-RASP-m-6.11-X3 */ - bt[0] = devm_kasprintf(dev, GFP_KERNEL, "%s-%s-%s-%s-%s", - devinfo->settings->board_type, - otp->module, otp->vendor, otp->version, - devinfo->settings->antenna_sku); - bt[1] = devm_kasprintf(dev, GFP_KERNEL, "%s-%s-%s-%s", - devinfo->settings->board_type, - otp->module, otp->vendor, otp->version); - bt[2] = devm_kasprintf(dev, GFP_KERNEL, "%s-%s-%s", - devinfo->settings->board_type, - otp->module, otp->vendor); - bt[3] = devm_kasprintf(dev, GFP_KERNEL, "%s-%s", - devinfo->settings->board_type, - otp->module); - bt[4] = devm_kasprintf(dev, GFP_KERNEL, "%s-%s", - devinfo->settings->board_type, - devinfo->settings->antenna_sku); - bt[5] = devinfo->settings->board_type; + if (devinfo->settings->antenna_sku) + bt[i++] = devm_kasprintf(dev, GFP_KERNEL, "%s-%s-%s-%s-%s", + devinfo->settings->board_type, + otp->module, otp->vendor, otp->version, + devinfo->settings->antenna_sku); + else + brcmf_dbg(PCIE, "Antenna SKU not found\n"); + bt[i++] = devm_kasprintf(dev, GFP_KERNEL, "%s-%s-%s-%s", + devinfo->settings->board_type, + otp->module, otp->vendor, otp->version); + bt[i++] = devm_kasprintf(dev, GFP_KERNEL, "%s-%s-%s", + devinfo->settings->board_type, + otp->module, otp->vendor); + bt[i++] = devm_kasprintf(dev, GFP_KERNEL, "%s-%s", + devinfo->settings->board_type, + otp->module); + if (devinfo->settings->antenna_sku) + bt[i++] = devm_kasprintf(dev, GFP_KERNEL, "%s-%s", + devinfo->settings->board_type, + devinfo->settings->antenna_sku); + bt[i++] = devinfo->settings->board_type; - if (!bt[0] || !bt[1] || !bt[2] || !bt[3] || !bt[4]) { - kfree(fwreq); - return NULL; + for (j = 0; j < i - 1; j++) { + if (!bt[j]) { + kfree(fwreq); + return NULL; + } } } else { brcmf_dbg(PCIE, "Board: %s\n", devinfo->settings->board_type);