constchar *ssb_core_name(u16 coreid)
{ switch (coreid) { case SSB_DEV_CHIPCOMMON: return"ChipCommon"; case SSB_DEV_ILINE20: return"ILine 20"; case SSB_DEV_SDRAM: return"SDRAM"; case SSB_DEV_PCI: return"PCI"; case SSB_DEV_MIPS: return"MIPS"; case SSB_DEV_ETHERNET: return"Fast Ethernet"; case SSB_DEV_V90: return"V90"; case SSB_DEV_USB11_HOSTDEV: return"USB 1.1 Hostdev"; case SSB_DEV_ADSL: return"ADSL"; case SSB_DEV_ILINE100: return"ILine 100"; case SSB_DEV_IPSEC: return"IPSEC"; case SSB_DEV_PCMCIA: return"PCMCIA"; case SSB_DEV_INTERNAL_MEM: return"Internal Memory"; case SSB_DEV_MEMC_SDRAM: return"MEMC SDRAM"; case SSB_DEV_EXTIF: return"EXTIF"; case SSB_DEV_80211: return"IEEE 802.11"; case SSB_DEV_MIPS_3302: return"MIPS 3302"; case SSB_DEV_USB11_HOST: return"USB 1.1 Host"; case SSB_DEV_USB11_DEV: return"USB 1.1 Device"; case SSB_DEV_USB20_HOST: return"USB 2.0 Host"; case SSB_DEV_USB20_DEV: return"USB 2.0 Device"; case SSB_DEV_SDIO_HOST: return"SDIO Host"; case SSB_DEV_ROBOSWITCH: return"Roboswitch"; case SSB_DEV_PARA_ATA: return"PATA"; case SSB_DEV_SATA_XORDMA: return"SATA XOR-DMA"; case SSB_DEV_ETHERNET_GBIT: return"GBit Ethernet"; case SSB_DEV_PCIE: return"PCI-E"; case SSB_DEV_MIMO_PHY: return"MIMO PHY"; case SSB_DEV_SRAM_CTRLR: return"SRAM Controller"; case SSB_DEV_MINI_MACPHY: return"Mini MACPHY"; case SSB_DEV_ARM_1176: return"ARM 1176"; case SSB_DEV_ARM_7TDMI: return"ARM 7TDMI"; case SSB_DEV_ARM_CM3: return"ARM Cortex M3";
} return"UNKNOWN";
}
switch (pci_dev->device) { case 0x4301:
chipid_fallback = 0x4301; break; case 0x4305 ... 0x4307:
chipid_fallback = 0x4307; break; case 0x4403:
chipid_fallback = 0x4402; break; case 0x4610 ... 0x4615:
chipid_fallback = 0x4610; break; case 0x4710 ... 0x4715:
chipid_fallback = 0x4710; break; case 0x4320 ... 0x4325:
chipid_fallback = 0x4309; break; case PCI_DEVICE_ID_BCM4401: case PCI_DEVICE_ID_BCM4401B0: case PCI_DEVICE_ID_BCM4401B1:
chipid_fallback = 0x4401; break; default:
dev_err(&pci_dev->dev, "PCI-ID not in fallback list\n");
}
return chipid_fallback;
}
static u8 chipid_to_nrcores(u16 chipid)
{ switch (chipid) { case 0x5365: return 7; case 0x4306: return 6; case 0x4310: return 8; case 0x4307: case 0x4301: return 5; case 0x4401: case 0x4402: return 3; case 0x4710: case 0x4610: case 0x4704: return 9; default:
pr_err("CHIPID not in nrcores fallback list\n");
}
switch (bus->bustype) { case SSB_BUSTYPE_SSB: /* Only map the first core for now. */
fallthrough; case SSB_BUSTYPE_PCMCIA:
mmio = ioremap(baseaddr, SSB_CORE_SIZE); break; case SSB_BUSTYPE_PCI: #ifdef CONFIG_SSB_PCIHOST
mmio = pci_iomap(bus->host_pci, 0, ~0UL); #else
WARN_ON(1); /* Can't reach this code. */ #endif break; case SSB_BUSTYPE_SDIO: /* Nothing to ioremap in the SDIO case, just fake it */
mmio = (void __iomem *)baseaddr; break;
}
return mmio;
}
staticint we_support_multiple_80211_cores(struct ssb_bus *bus)
{ /* More than one 802.11 core is only supported by special chips. * There are chips with two 802.11 cores, but with dangling * pins on the second core. Be careful and reject them here.
*/
bus->chip_id = (tmp & SSB_CHIPCO_IDMASK);
bus->chip_rev = (tmp & SSB_CHIPCO_REVMASK) >>
SSB_CHIPCO_REVSHIFT;
bus->chip_package = (tmp & SSB_CHIPCO_PACKMASK) >>
SSB_CHIPCO_PACKSHIFT; if (rev >= 4) {
bus->nr_devices = (tmp & SSB_CHIPCO_NRCORESMASK) >>
SSB_CHIPCO_NRCORESSHIFT;
}
tmp = scan_read32(bus, 0, SSB_CHIPCO_CAP);
bus->chipco.capabilities = tmp;
} else { if (bus->bustype == SSB_BUSTYPE_PCI) {
bus->chip_id = pcidev_to_chipid(bus->host_pci);
bus->chip_rev = bus->host_pci->revision;
bus->chip_package = 0;
} else {
bus->chip_id = 0x4710;
bus->chip_rev = 0;
bus->chip_package = 0;
}
}
pr_info("Found chip with id 0x%04X, rev 0x%02X and package 0x%02X\n",
bus->chip_id, bus->chip_rev, bus->chip_package); if (!bus->nr_devices)
bus->nr_devices = chipid_to_nrcores(bus->chip_id); if (bus->nr_devices > ARRAY_SIZE(bus->devices)) {
pr_err("More than %d ssb cores found (%d)\n",
SSB_MAX_NR_CORES, bus->nr_devices);
err = -EINVAL; goto err_unmap;
} if (bus->bustype == SSB_BUSTYPE_SSB) { /* Now that we know the number of cores, * remap the whole IO space for all cores.
*/
err = -ENOMEM;
iounmap(mmio);
mmio = ioremap(baseaddr, SSB_CORE_SIZE * bus->nr_devices); if (!mmio) goto out;
bus->mmio = mmio;
}
/* Fetch basic information about each core/device */ for (i = 0, dev_i = 0; i < bus->nr_devices; i++) {
err = scan_switchcore(bus, i); if (err) goto err_unmap;
dev = &(bus->devices[dev_i]);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.