}
 
 static struct si_info *ai_doattach(struct si_info *sii,
-                                  void __iomem *regs, struct pci_dev *pbus)
+                                  struct bcma_bus *pbus)
 {
+       void __iomem *regs = pbus->mmio;
        struct si_pub *sih = &sii->pub;
        u32 w, savewin;
        struct chipcregs __iomem *cc;
        uint socitype;
        uint origidx;
 
+       /* assume the window is looking at chipcommon */
+       WARN_ON(pbus->mapped_core->id.id != BCMA_CORE_CHIPCOMMON);
        memset((unsigned char *) sii, 0, sizeof(struct si_info));
 
        savewin = 0;
 
+       sii->icbus = pbus;
        sii->buscoreidx = BADIDX;
-
        sii->curmap = regs;
-       sii->pcibus = pbus;
+       sii->pcibus = pbus->host_pci;
 
        /* find Chipcommon address */
        pci_read_config_dword(sii->pcibus, PCI_BAR0_WIN, &savewin);
 }
 
 /*
- * Allocate a si handle.
- * devid - pci device id (used to determine chip#)
- * osh - opaque OS handle
- * regs - virtual address of initial core registers
+ * Allocate a si handle and do the attach.
  */
 struct si_pub *
-ai_attach(void __iomem *regs, struct pci_dev *sdh)
+ai_attach(struct bcma_bus *pbus)
 {
        struct si_info *sii;
 
        if (sii == NULL)
                return NULL;
 
-       if (ai_doattach(sii, regs, sdh) == NULL) {
+       if (ai_doattach(sii, pbus) == NULL) {
                kfree(sii);
                return NULL;
        }
 
 #ifndef        _BRCM_AIUTILS_H_
 #define        _BRCM_AIUTILS_H_
 
+#include <linux/bcma/bcma.h>
+
 #include "types.h"
 
 /*
 /* misc si info needed by some of the routines */
 struct si_info {
        struct si_pub pub;      /* back plane public state (must be first) */
+       struct bcma_bus *icbus; /* handle to soc interconnect bus */
        struct pci_dev *pcibus; /* handle to pci bus */
        uint dev_coreid;        /* the core provides driver functions */
        void *intr_arg;         /* interrupt callback function arg */
 extern void ai_write_wrap_reg(struct si_pub *sih, u32 offset, u32 val);
 
 /* === exported functions === */
-extern struct si_pub *ai_attach(void __iomem *regs, struct pci_dev *sdh);
+extern struct si_pub *ai_attach(struct bcma_bus *pbus);
 extern void ai_detach(struct si_pub *sih);
 extern uint ai_coreid(struct si_pub *sih);
 extern uint ai_corerev(struct si_pub *sih);
 
         * Do the hardware portion of the attach. Also initialize software
         * state that depends on the particular hardware we are running.
         */
-       wlc_hw->sih = ai_attach(core->bus->mmio, core->bus->host_pci);
+       wlc_hw->sih = ai_attach(core->bus);
        if (wlc_hw->sih == NULL) {
                wiphy_err(wiphy, "wl%d: brcms_b_attach: si_attach failed\n",
                          unit);