Commit da6d9c8e authored by Arend van Spriel's avatar Arend van Spriel Committed by Kalle Valo
Browse files

wifi: brcmfmac: add firmware vendor info in driver info



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: default avatarHante Meuleman <hante.meuleman@broadcom.com>
Reviewed-by: default avatarPieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
Reviewed-by: default avatarFranky Lin <franky.lin@broadcom.com>
Signed-off-by: default avatarArend van Spriel <arend.vanspriel@broadcom.com>
Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20221129135446.151065-3-arend.vanspriel@broadcom.com
parent 76821aad
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -960,7 +960,10 @@ int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
}

#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;
+10 −1
Original line number Diff line number Diff line
@@ -31,6 +31,13 @@
/* 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;

+15 −5
Original line number Diff line number Diff line
@@ -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),
+19 −8
Original line number Diff line number Diff line
@@ -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;

@@ -1512,13 +1514,22 @@ static int brcmf_usb_reset_resume(struct usb_interface *intf)
}

#define BRCMF_USB_DEVICE(dev_id) \
	{ USB_DEVICE(BRCM_USB_VENDOR_ID_BROADCOM, 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) }
	{ \
		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) }
	{ \
		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),