Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cacaa64b authored by Hauke Mehrtens's avatar Hauke Mehrtens Committed by John W. Linville
Browse files

brcmsmac: extend brcms_c_chipmatch() to also handle non PCIe devices



Now brcms_c_chipmatch() is also able to handle non PCI devices and also
does some checking for SoC if they are supported by brcmsmac.

Signed-off-by: default avatarHauke Mehrtens <hauke@hauke-m.de>
Acked-by: default avatarArend van Spriel <arend@broadcom.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent ec5ab1dd
Loading
Loading
Loading
Loading
+1 −2
Original line number Original line Diff line number Diff line
@@ -319,8 +319,7 @@ static void brcms_ops_stop(struct ieee80211_hw *hw)
		return;
		return;


	spin_lock_bh(&wl->lock);
	spin_lock_bh(&wl->lock);
	status = brcms_c_chipmatch(wl->wlc->hw->vendorid,
	status = brcms_c_chipmatch(wl->wlc->hw->d11core);
				   wl->wlc->hw->deviceid);
	spin_unlock_bh(&wl->lock);
	spin_unlock_bh(&wl->lock);
	if (!status) {
	if (!status) {
		wiphy_err(wl->wiphy,
		wiphy_err(wl->wiphy,
+32 −6
Original line number Original line Diff line number Diff line
@@ -4469,11 +4469,9 @@ static int brcms_b_attach(struct brcms_c_info *wlc, struct bcma_device *core,
	}
	}


	/* verify again the device is supported */
	/* verify again the device is supported */
	if (core->bus->hosttype == BCMA_HOSTTYPE_PCI &&
	if (!brcms_c_chipmatch(core)) {
	    !brcms_c_chipmatch(pcidev->vendor, pcidev->device)) {
		wiphy_err(wiphy, "wl%d: brcms_b_attach: Unsupported device\n",
		wiphy_err(wiphy, "wl%d: brcms_b_attach: Unsupported "
			 unit);
			"vendor/device (0x%x/0x%x)\n",
			 unit, pcidev->vendor, pcidev->device);
		err = 12;
		err = 12;
		goto fail;
		goto fail;
	}
	}
@@ -5786,8 +5784,12 @@ void brcms_c_print_txstatus(struct tx_status *txs)
		 (txs->ackphyrxsh & PRXS1_SQ_MASK) >> PRXS1_SQ_SHIFT);
		 (txs->ackphyrxsh & PRXS1_SQ_MASK) >> PRXS1_SQ_SHIFT);
}
}


bool brcms_c_chipmatch(u16 vendor, u16 device)
static bool brcms_c_chipmatch_pci(struct bcma_device *core)
{
{
	struct pci_dev *pcidev = core->bus->host_pci;
	u16 vendor = pcidev->vendor;
	u16 device = pcidev->device;

	if (vendor != PCI_VENDOR_ID_BROADCOM) {
	if (vendor != PCI_VENDOR_ID_BROADCOM) {
		pr_err("unknown vendor id %04x\n", vendor);
		pr_err("unknown vendor id %04x\n", vendor);
		return false;
		return false;
@@ -5806,6 +5808,30 @@ bool brcms_c_chipmatch(u16 vendor, u16 device)
	return false;
	return false;
}
}


static bool brcms_c_chipmatch_soc(struct bcma_device *core)
{
	struct bcma_chipinfo *chipinfo = &core->bus->chipinfo;

	if (chipinfo->id == BCMA_CHIP_ID_BCM4716)
		return true;

	pr_err("unknown chip id %04x\n", chipinfo->id);
	return false;
}

bool brcms_c_chipmatch(struct bcma_device *core)
{
	switch (core->bus->hosttype) {
	case BCMA_HOSTTYPE_PCI:
		return brcms_c_chipmatch_pci(core);
	case BCMA_HOSTTYPE_SOC:
		return brcms_c_chipmatch_soc(core);
	default:
		pr_err("unknown host type: %i\n", core->bus->hosttype);
		return false;
	}
}

#if defined(DEBUG)
#if defined(DEBUG)
void brcms_c_print_txdesc(struct d11txh *txh)
void brcms_c_print_txdesc(struct d11txh *txh)
{
{
+1 −1
Original line number Original line Diff line number Diff line
@@ -311,7 +311,7 @@ extern uint brcms_c_detach(struct brcms_c_info *wlc);
extern int brcms_c_up(struct brcms_c_info *wlc);
extern int brcms_c_up(struct brcms_c_info *wlc);
extern uint brcms_c_down(struct brcms_c_info *wlc);
extern uint brcms_c_down(struct brcms_c_info *wlc);


extern bool brcms_c_chipmatch(u16 vendor, u16 device);
extern bool brcms_c_chipmatch(struct bcma_device *core);
extern void brcms_c_init(struct brcms_c_info *wlc, bool mute_tx);
extern void brcms_c_init(struct brcms_c_info *wlc, bool mute_tx);
extern void brcms_c_reset(struct brcms_c_info *wlc);
extern void brcms_c_reset(struct brcms_c_info *wlc);