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: Hauke Mehrtens <hauke@hauke-m.de> Acked-by: Arend van Spriel <arend@broadcom.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
ec5ab1dd73
commit
cacaa64be6
3 changed files with 34 additions and 9 deletions
|
@ -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,
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue