wifi: brcmfmac: add firmware vendor info in driver info
authorArend van Spriel <arend.vanspriel@broadcom.com>
Tue, 29 Nov 2022 13:54:41 +0000 (14:54 +0100)
committerKalle Valo <kvalo@kernel.org>
Thu, 8 Dec 2022 14:44:07 +0000 (16:44 +0200)
In order to determine the vendor that released a firmware image for
a specific device, the device table now sets the vendor identifier
in driver info and it is stored in struct brcmf_bus::fwvid during
probe.

Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
Reviewed-by: Franky Lin <franky.lin@broadcom.com>
Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20221129135446.151065-3-arend.vanspriel@broadcom.com
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c

index d0daef6..fa91943 100644 (file)
@@ -960,7 +960,10 @@ out:
 }
 
 #define BRCMF_SDIO_DEVICE(dev_id)      \
-       {SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, dev_id)}
+       { \
+               SDIO_DEVICE(SDIO_VENDOR_ID_BROADCOM, dev_id), \
+               .driver_data = BRCMF_FWVENDOR_WCC \
+       }
 
 /* devices we support, null terminated */
 static const struct sdio_device_id brcmf_sdmmc_ids[] = {
@@ -1051,6 +1054,7 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
        sdiodev->bus_if = bus_if;
        bus_if->bus_priv.sdio = sdiodev;
        bus_if->proto_type = BRCMF_PROTO_BCDC;
+       bus_if->fwvid = id->driver_data;
        dev_set_drvdata(&func->dev, bus_if);
        dev_set_drvdata(&sdiodev->func1->dev, bus_if);
        sdiodev->dev = &sdiodev->func1->dev;
index 256456e..79fe0a4 100644 (file)
 /* The maximum console interval value (5 mins) */
 #define MAX_CONSOLE_INTERVAL   (5 * 60)
 
+enum brcmf_fwvendor {
+       BRCMF_FWVENDOR_WCC,
+       /* keep last */
+       BRCMF_FWVENDOR_NUM,
+       BRCMF_FWVENDOR_INVALID
+};
+
 /* The level of bus communication with the dongle */
 enum brcmf_bus_state {
        BRCMF_BUS_DOWN,         /* Not ready for frame transfers */
@@ -144,9 +151,10 @@ struct brcmf_bus_stats {
  * @stats: statistics shared between common and bus layer.
  * @maxctl: maximum size for rxctl request message.
  * @chip: device identifier of the dongle chip.
+ * @chiprev: revision of the dongle chip.
+ * @fwvid: firmware vendor-support identifier of the device.
  * @always_use_fws_queue: bus wants use queue also when fwsignal is inactive.
  * @wowl_supported: is wowl supported by bus driver.
- * @chiprev: revision of the dongle chip.
  * @msgbuf: msgbuf protocol parameters provided by bus layer.
  */
 struct brcmf_bus {
@@ -163,6 +171,7 @@ struct brcmf_bus {
        uint maxctl;
        u32 chip;
        u32 chiprev;
+       enum brcmf_fwvendor fwvid;
        bool always_use_fws_queue;
        bool wowl_supported;
 
index cf564ad..094bb84 100644 (file)
@@ -2389,6 +2389,7 @@ brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        bus->bus_priv.pcie = pcie_bus_dev;
        bus->ops = &brcmf_pcie_bus_ops;
        bus->proto_type = BRCMF_PROTO_MSGBUF;
+       bus->fwvid = id->driver_data;
        bus->chip = devinfo->coreid;
        bus->wowl_supported = pci_pme_capable(pdev, PCI_D3hot);
        dev_set_drvdata(&pdev->dev, bus);
@@ -2570,11 +2571,20 @@ static const struct dev_pm_ops brcmf_pciedrvr_pm = {
 #endif /* CONFIG_PM */
 
 
-#define BRCMF_PCIE_DEVICE(dev_id)      { BRCM_PCIE_VENDOR_ID_BROADCOM, dev_id,\
-       PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_NETWORK_OTHER << 8, 0xffff00, 0 }
-#define BRCMF_PCIE_DEVICE_SUB(dev_id, subvend, subdev) { \
-       BRCM_PCIE_VENDOR_ID_BROADCOM, dev_id,\
-       subvend, subdev, PCI_CLASS_NETWORK_OTHER << 8, 0xffff00, 0 }
+#define BRCMF_PCIE_DEVICE(dev_id) \
+       { \
+               BRCM_PCIE_VENDOR_ID_BROADCOM, (dev_id), \
+               PCI_ANY_ID, PCI_ANY_ID, \
+               PCI_CLASS_NETWORK_OTHER << 8, 0xffff00, \
+               BRCMF_FWVENDOR_WCC \
+       }
+#define BRCMF_PCIE_DEVICE_SUB(dev_id, subvend, subdev) \
+       { \
+               BRCM_PCIE_VENDOR_ID_BROADCOM, (dev_id), \
+               (subvend), (subdev), \
+               PCI_CLASS_NETWORK_OTHER << 8, 0xffff00, \
+               BRCMF_FWVENDOR_WCC \
+       }
 
 static const struct pci_device_id brcmf_pcie_devid_table[] = {
        BRCMF_PCIE_DEVICE(BRCM_PCIE_4350_DEVICE_ID),
index 85e18fb..246843a 100644 (file)
@@ -1240,7 +1240,8 @@ brcmf_usb_prepare_fw_request(struct brcmf_usbdev_info *devinfo)
        return fwreq;
 }
 
-static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo)
+static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo,
+                             enum brcmf_fwvendor fwvid)
 {
        struct brcmf_bus *bus = NULL;
        struct brcmf_usbdev *bus_pub = NULL;
@@ -1265,6 +1266,7 @@ static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo)
        dev_set_drvdata(dev, bus);
        bus->ops = &brcmf_usb_bus_ops;
        bus->proto_type = BRCMF_PROTO_BCDC;
+       bus->fwvid = fwvid;
        bus->always_use_fws_queue = true;
 #ifdef CONFIG_PM
        bus->wowl_supported = true;
@@ -1423,7 +1425,7 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
        else
                brcmf_dbg(USB, "Broadcom full speed USB WLAN interface detected\n");
 
-       ret = brcmf_usb_probe_cb(devinfo);
+       ret = brcmf_usb_probe_cb(devinfo, id->driver_info);
        if (ret)
                goto fail;
 
@@ -1511,14 +1513,23 @@ static int brcmf_usb_reset_resume(struct usb_interface *intf)
        return ret;
 }
 
-#define BRCMF_USB_DEVICE(dev_id)       \
-       { USB_DEVICE(BRCM_USB_VENDOR_ID_BROADCOM, dev_id) }
+#define BRCMF_USB_DEVICE(dev_id) \
+       { \
+               USB_DEVICE(BRCM_USB_VENDOR_ID_BROADCOM, dev_id), \
+               .driver_info = BRCMF_FWVENDOR_WCC \
+       }
 
-#define LINKSYS_USB_DEVICE(dev_id)     \
-       { USB_DEVICE(BRCM_USB_VENDOR_ID_LINKSYS, dev_id) }
+#define LINKSYS_USB_DEVICE(dev_id) \
+       { \
+               USB_DEVICE(BRCM_USB_VENDOR_ID_LINKSYS, dev_id), \
+               .driver_info = BRCMF_FWVENDOR_WCC \
+       }
 
-#define CYPRESS_USB_DEVICE(dev_id)     \
-       { USB_DEVICE(CY_USB_VENDOR_ID_CYPRESS, dev_id) }
+#define CYPRESS_USB_DEVICE(dev_id) \
+       { \
+               USB_DEVICE(CY_USB_VENDOR_ID_CYPRESS, dev_id), \
+               .driver_info = BRCMF_FWVENDOR_WCC \
+       }
 
 static const struct usb_device_id brcmf_usb_devid_table[] = {
        BRCMF_USB_DEVICE(BRCM_USB_43143_DEVICE_ID),