scan.c (e5451c8f8330e03ad3cfa16048b4daf961af434f) scan.c (b8b6069cf2087545fe53ec920e8353133e9a70bf)
1/*
2 * Sonics Silicon Backplane
3 * Bus scanning
4 *
5 * Copyright (C) 2005-2007 Michael Buesch <m@bues.ch>
6 * Copyright (C) 2005 Martin Langer <martin-langer@gmx.de>
7 * Copyright (C) 2005 Stefano Brivio <st3@riseup.net>
8 * Copyright (C) 2005 Danny van Dyk <kugelfang@gentoo.org>
9 * Copyright (C) 2005 Andreas Jaggi <andreas.jaggi@waterwave.ch>
10 * Copyright (C) 2006 Broadcom Corporation.
11 *
12 * Licensed under the GNU/GPL. See COPYING for details.
13 */
14
1/*
2 * Sonics Silicon Backplane
3 * Bus scanning
4 *
5 * Copyright (C) 2005-2007 Michael Buesch <m@bues.ch>
6 * Copyright (C) 2005 Martin Langer <martin-langer@gmx.de>
7 * Copyright (C) 2005 Stefano Brivio <st3@riseup.net>
8 * Copyright (C) 2005 Danny van Dyk <kugelfang@gentoo.org>
9 * Copyright (C) 2005 Andreas Jaggi <andreas.jaggi@waterwave.ch>
10 * Copyright (C) 2006 Broadcom Corporation.
11 *
12 * Licensed under the GNU/GPL. See COPYING for details.
13 */
14
15#include "ssb_private.h"
16
15#include <linux/ssb/ssb.h>
16#include <linux/ssb/ssb_regs.h>
17#include <linux/pci.h>
18#include <linux/io.h>
19
20#include <pcmcia/cistpl.h>
21#include <pcmcia/ds.h>
22
17#include <linux/ssb/ssb.h>
18#include <linux/ssb/ssb_regs.h>
19#include <linux/pci.h>
20#include <linux/io.h>
21
22#include <pcmcia/cistpl.h>
23#include <pcmcia/ds.h>
24
23#include "ssb_private.h"
24
25
25
26const char *ssb_core_name(u16 coreid)
27{
28 switch (coreid) {
29 case SSB_DEV_CHIPCOMMON:
30 return "ChipCommon";
31 case SSB_DEV_ILINE20:
32 return "ILine 20";
33 case SSB_DEV_SDRAM:

--- 86 unchanged lines hidden (view full) ---

120 chipid_fallback = 0x4309;
121 break;
122 case PCI_DEVICE_ID_BCM4401:
123 case PCI_DEVICE_ID_BCM4401B0:
124 case PCI_DEVICE_ID_BCM4401B1:
125 chipid_fallback = 0x4401;
126 break;
127 default:
26const char *ssb_core_name(u16 coreid)
27{
28 switch (coreid) {
29 case SSB_DEV_CHIPCOMMON:
30 return "ChipCommon";
31 case SSB_DEV_ILINE20:
32 return "ILine 20";
33 case SSB_DEV_SDRAM:

--- 86 unchanged lines hidden (view full) ---

120 chipid_fallback = 0x4309;
121 break;
122 case PCI_DEVICE_ID_BCM4401:
123 case PCI_DEVICE_ID_BCM4401B0:
124 case PCI_DEVICE_ID_BCM4401B1:
125 chipid_fallback = 0x4401;
126 break;
127 default:
128 ssb_err("PCI-ID not in fallback list\n");
128 dev_err(&pci_dev->dev, "PCI-ID not in fallback list\n");
129 }
130
131 return chipid_fallback;
132}
133
134static u8 chipid_to_nrcores(u16 chipid)
135{
136 switch (chipid) {

--- 9 unchanged lines hidden (view full) ---

146 case 0x4401:
147 case 0x4402:
148 return 3;
149 case 0x4710:
150 case 0x4610:
151 case 0x4704:
152 return 9;
153 default:
129 }
130
131 return chipid_fallback;
132}
133
134static u8 chipid_to_nrcores(u16 chipid)
135{
136 switch (chipid) {

--- 9 unchanged lines hidden (view full) ---

146 case 0x4401:
147 case 0x4402:
148 return 3;
149 case 0x4710:
150 case 0x4610:
151 case 0x4704:
152 return 9;
153 default:
154 ssb_err("CHIPID not in nrcores fallback list\n");
154 pr_err("CHIPID not in nrcores fallback list\n");
155 }
156
157 return 1;
158}
159
160static u32 scan_read32(struct ssb_bus *bus, u8 current_coreidx,
161 u16 offset)
162{

--- 150 unchanged lines hidden (view full) ---

313 bus->chip_rev = bus->host_pci->revision;
314 bus->chip_package = 0;
315 } else {
316 bus->chip_id = 0x4710;
317 bus->chip_rev = 0;
318 bus->chip_package = 0;
319 }
320 }
155 }
156
157 return 1;
158}
159
160static u32 scan_read32(struct ssb_bus *bus, u8 current_coreidx,
161 u16 offset)
162{

--- 150 unchanged lines hidden (view full) ---

313 bus->chip_rev = bus->host_pci->revision;
314 bus->chip_package = 0;
315 } else {
316 bus->chip_id = 0x4710;
317 bus->chip_rev = 0;
318 bus->chip_package = 0;
319 }
320 }
321 ssb_info("Found chip with id 0x%04X, rev 0x%02X and package 0x%02X\n",
322 bus->chip_id, bus->chip_rev, bus->chip_package);
321 pr_info("Found chip with id 0x%04X, rev 0x%02X and package 0x%02X\n",
322 bus->chip_id, bus->chip_rev, bus->chip_package);
323 if (!bus->nr_devices)
324 bus->nr_devices = chipid_to_nrcores(bus->chip_id);
325 if (bus->nr_devices > ARRAY_SIZE(bus->devices)) {
323 if (!bus->nr_devices)
324 bus->nr_devices = chipid_to_nrcores(bus->chip_id);
325 if (bus->nr_devices > ARRAY_SIZE(bus->devices)) {
326 ssb_err("More than %d ssb cores found (%d)\n",
327 SSB_MAX_NR_CORES, bus->nr_devices);
326 pr_err("More than %d ssb cores found (%d)\n",
327 SSB_MAX_NR_CORES, bus->nr_devices);
328 goto err_unmap;
329 }
330 if (bus->bustype == SSB_BUSTYPE_SSB) {
331 /* Now that we know the number of cores,
332 * remap the whole IO space for all cores.
333 */
334 err = -ENOMEM;
335 iounmap(mmio);

--- 14 unchanged lines hidden (view full) ---

350 dev->id.coreid = (idhi & SSB_IDHIGH_CC) >> SSB_IDHIGH_CC_SHIFT;
351 dev->id.revision = (idhi & SSB_IDHIGH_RCLO);
352 dev->id.revision |= (idhi & SSB_IDHIGH_RCHI) >> SSB_IDHIGH_RCHI_SHIFT;
353 dev->id.vendor = (idhi & SSB_IDHIGH_VC) >> SSB_IDHIGH_VC_SHIFT;
354 dev->core_index = i;
355 dev->bus = bus;
356 dev->ops = bus->ops;
357
328 goto err_unmap;
329 }
330 if (bus->bustype == SSB_BUSTYPE_SSB) {
331 /* Now that we know the number of cores,
332 * remap the whole IO space for all cores.
333 */
334 err = -ENOMEM;
335 iounmap(mmio);

--- 14 unchanged lines hidden (view full) ---

350 dev->id.coreid = (idhi & SSB_IDHIGH_CC) >> SSB_IDHIGH_CC_SHIFT;
351 dev->id.revision = (idhi & SSB_IDHIGH_RCLO);
352 dev->id.revision |= (idhi & SSB_IDHIGH_RCHI) >> SSB_IDHIGH_RCHI_SHIFT;
353 dev->id.vendor = (idhi & SSB_IDHIGH_VC) >> SSB_IDHIGH_VC_SHIFT;
354 dev->core_index = i;
355 dev->bus = bus;
356 dev->ops = bus->ops;
357
358 printk(KERN_DEBUG PFX
359 "Core %d found: %s "
360 "(cc 0x%03X, rev 0x%02X, vendor 0x%04X)\n",
361 i, ssb_core_name(dev->id.coreid),
362 dev->id.coreid, dev->id.revision, dev->id.vendor);
358 pr_debug("Core %d found: %s (cc 0x%03X, rev 0x%02X, vendor 0x%04X)\n",
359 i, ssb_core_name(dev->id.coreid),
360 dev->id.coreid, dev->id.revision, dev->id.vendor);
363
364 switch (dev->id.coreid) {
365 case SSB_DEV_80211:
366 nr_80211_cores++;
367 if (nr_80211_cores > 1) {
368 if (!we_support_multiple_80211_cores(bus)) {
361
362 switch (dev->id.coreid) {
363 case SSB_DEV_80211:
364 nr_80211_cores++;
365 if (nr_80211_cores > 1) {
366 if (!we_support_multiple_80211_cores(bus)) {
369 ssb_dbg("Ignoring additional 802.11 core\n");
367 pr_debug("Ignoring additional 802.11 core\n");
370 continue;
371 }
372 }
373 break;
374 case SSB_DEV_EXTIF:
375#ifdef CONFIG_SSB_DRIVER_EXTIF
376 if (bus->extif.dev) {
368 continue;
369 }
370 }
371 break;
372 case SSB_DEV_EXTIF:
373#ifdef CONFIG_SSB_DRIVER_EXTIF
374 if (bus->extif.dev) {
377 ssb_warn("WARNING: Multiple EXTIFs found\n");
375 pr_warn("WARNING: Multiple EXTIFs found\n");
378 break;
379 }
380 bus->extif.dev = dev;
381#endif /* CONFIG_SSB_DRIVER_EXTIF */
382 break;
383 case SSB_DEV_CHIPCOMMON:
384 if (bus->chipco.dev) {
376 break;
377 }
378 bus->extif.dev = dev;
379#endif /* CONFIG_SSB_DRIVER_EXTIF */
380 break;
381 case SSB_DEV_CHIPCOMMON:
382 if (bus->chipco.dev) {
385 ssb_warn("WARNING: Multiple ChipCommon found\n");
383 pr_warn("WARNING: Multiple ChipCommon found\n");
386 break;
387 }
388 bus->chipco.dev = dev;
389 break;
390 case SSB_DEV_MIPS:
391 case SSB_DEV_MIPS_3302:
392#ifdef CONFIG_SSB_DRIVER_MIPS
393 if (bus->mipscore.dev) {
384 break;
385 }
386 bus->chipco.dev = dev;
387 break;
388 case SSB_DEV_MIPS:
389 case SSB_DEV_MIPS_3302:
390#ifdef CONFIG_SSB_DRIVER_MIPS
391 if (bus->mipscore.dev) {
394 ssb_warn("WARNING: Multiple MIPS cores found\n");
392 pr_warn("WARNING: Multiple MIPS cores found\n");
395 break;
396 }
397 bus->mipscore.dev = dev;
398#endif /* CONFIG_SSB_DRIVER_MIPS */
399 break;
400 case SSB_DEV_PCI:
401 case SSB_DEV_PCIE:
402#ifdef CONFIG_SSB_DRIVER_PCICORE

--- 4 unchanged lines hidden (view full) ---

407 if (pci_is_pcie(bus->host_pci))
408 continue;
409 } else {
410 if (!pci_is_pcie(bus->host_pci))
411 continue;
412 }
413 }
414 if (bus->pcicore.dev) {
393 break;
394 }
395 bus->mipscore.dev = dev;
396#endif /* CONFIG_SSB_DRIVER_MIPS */
397 break;
398 case SSB_DEV_PCI:
399 case SSB_DEV_PCIE:
400#ifdef CONFIG_SSB_DRIVER_PCICORE

--- 4 unchanged lines hidden (view full) ---

405 if (pci_is_pcie(bus->host_pci))
406 continue;
407 } else {
408 if (!pci_is_pcie(bus->host_pci))
409 continue;
410 }
411 }
412 if (bus->pcicore.dev) {
415 ssb_warn("WARNING: Multiple PCI(E) cores found\n");
413 pr_warn("WARNING: Multiple PCI(E) cores found\n");
416 break;
417 }
418 bus->pcicore.dev = dev;
419#endif /* CONFIG_SSB_DRIVER_PCICORE */
420 break;
421 case SSB_DEV_ETHERNET:
422 if (bus->bustype == SSB_BUSTYPE_PCI) {
423 if (bus->host_pci->vendor == PCI_VENDOR_ID_BROADCOM &&

--- 22 unchanged lines hidden ---
414 break;
415 }
416 bus->pcicore.dev = dev;
417#endif /* CONFIG_SSB_DRIVER_PCICORE */
418 break;
419 case SSB_DEV_ETHERNET:
420 if (bus->bustype == SSB_BUSTYPE_PCI) {
421 if (bus->host_pci->vendor == PCI_VENDOR_ID_BROADCOM &&

--- 22 unchanged lines hidden ---