bcma: scan for extra address space
authorHauke Mehrtens <hauke@hauke-m.de>
Thu, 15 Mar 2012 22:49:56 +0000 (23:49 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 18 Apr 2012 20:43:13 +0000 (13:43 -0700)
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>
drivers/bcma/scan.c
include/linux/bcma/bcma.h

index f94cccccfa56fc94a2e0b2cf454b30afd3864855..3bea7fe25b20e1c21feec451897cbcb8aa078400 100644 (file)
@@ -297,6 +297,23 @@ static int bcma_get_next_core(struct bcma_bus *bus, u32 __iomem **eromptr,
                        return -EILSEQ;
        }
 
+       /* First Slave Address Descriptor should be port 0:
+        * the main register space for the core
+        */
+       tmp = bcma_erom_get_addr_desc(bus, eromptr, SCAN_ADDR_TYPE_SLAVE, 0);
+       if (tmp <= 0) {
+               /* Try again to see if it is a bridge */
+               tmp = bcma_erom_get_addr_desc(bus, eromptr,
+                                             SCAN_ADDR_TYPE_BRIDGE, 0);
+               if (tmp <= 0) {
+                       return -EILSEQ;
+               } else {
+                       pr_info("Bridge found\n");
+                       return -ENXIO;
+               }
+       }
+       core->addr = tmp;
+
        /* get & parse slave ports */
        for (i = 0; i < ports[1]; i++) {
                for (j = 0; ; j++) {
@@ -309,7 +326,7 @@ static int bcma_get_next_core(struct bcma_bus *bus, u32 __iomem **eromptr,
                                break;
                        } else {
                                if (i == 0 && j == 0)
-                                       core->addr = tmp;
+                                       core->addr1 = tmp;
                        }
                }
        }
index 5af9a075498f144fa3c6ea6d86744201a65428b7..98bb2901d7b71c6d87ad5bb4063f4590c2ebaf20 100644 (file)
@@ -139,6 +139,7 @@ struct bcma_device {
        u8 core_unit;
 
        u32 addr;
+       u32 addr1;
        u32 wrap;
 
        void __iomem *io_addr;