aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/bcma/scan.c
diff options
context:
space:
mode:
authorHauke Mehrtens <hauke@hauke-m.de>2012-03-15 18:49:56 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-04-18 16:43:13 -0400
commite167d9fbb881c030f93563fd364c8a0b8c5cd6d3 (patch)
tree0a05fb5f1794ae7fbf1516530efa08ff52f1a25d /drivers/bcma/scan.c
parentaf5810597ab38ed1eb1d38e04b6e89c9ccec988e (diff)
bcma: scan for extra address space
Some cores like the USB core have two address spaces. In the USB host controller one address space is used for the OHCI and the other for the EHCI controller interface. The USB controller is the only core I found with two address spaces. This code is based on the AI scan function ai_scan() in shared/aiutils.c in the Broadcom SDK. CC: Rafał Miłecki <zajec5@gmail.com> CC: linux-wireless@vger.kernel.org Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/bcma/scan.c')
-rw-r--r--drivers/bcma/scan.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/drivers/bcma/scan.c b/drivers/bcma/scan.c
index f94cccccfa5..3bea7fe25b2 100644
--- a/drivers/bcma/scan.c
+++ b/drivers/bcma/scan.c
@@ -297,6 +297,23 @@ static int bcma_get_next_core(struct bcma_bus *bus, u32 __iomem **eromptr,
297 return -EILSEQ; 297 return -EILSEQ;
298 } 298 }
299 299
300 /* First Slave Address Descriptor should be port 0:
301 * the main register space for the core
302 */
303 tmp = bcma_erom_get_addr_desc(bus, eromptr, SCAN_ADDR_TYPE_SLAVE, 0);
304 if (tmp <= 0) {
305 /* Try again to see if it is a bridge */
306 tmp = bcma_erom_get_addr_desc(bus, eromptr,
307 SCAN_ADDR_TYPE_BRIDGE, 0);
308 if (tmp <= 0) {
309 return -EILSEQ;
310 } else {
311 pr_info("Bridge found\n");
312 return -ENXIO;
313 }
314 }
315 core->addr = tmp;
316
300 /* get & parse slave ports */ 317 /* get & parse slave ports */
301 for (i = 0; i < ports[1]; i++) { 318 for (i = 0; i < ports[1]; i++) {
302 for (j = 0; ; j++) { 319 for (j = 0; ; j++) {
@@ -309,7 +326,7 @@ static int bcma_get_next_core(struct bcma_bus *bus, u32 __iomem **eromptr,
309 break; 326 break;
310 } else { 327 } else {
311 if (i == 0 && j == 0) 328 if (i == 0 && j == 0)
312 core->addr = tmp; 329 core->addr1 = tmp;
313 } 330 }
314 } 331 }
315 } 332 }