There is zero need to keep these structures separate, they are *always* allocated together. All they do is obfuscate the code, whilst offering zero real gain. Signed-off-by: Ian Molton <ian@xxxxxxxxxxxxxx> --- .../wireless/broadcom/brcm80211/brcmfmac/chip.c | 384 +++++++++------------ .../wireless/broadcom/brcm80211/brcmfmac/chip.h | 22 ++ 2 files changed, 192 insertions(+), 214 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c index 7b8ba7192e1a..781f54bb844b 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c @@ -223,75 +223,58 @@ struct sbsocramregs { #define ARMCR4_BSZ_MASK 0x3f #define ARMCR4_BSZ_MULT 8192 -struct brcmf_core_priv { - struct brcmf_core pub; - u32 wrapbase; - struct list_head list; - struct brcmf_chip_priv *chip; -}; - -struct brcmf_chip_priv { - struct brcmf_chip pub; - const struct brcmf_buscore_ops *ops; - void *ctx; - /* assured first core is chipcommon, second core is buscore */ - struct list_head cores; - u16 num_cores; - - bool (*iscoreup)(struct brcmf_core_priv *core); - void (*coredisable)(struct brcmf_core_priv *core, u32 prereset, - u32 reset); - void (*resetcore)(struct brcmf_core_priv *core, u32 prereset, u32 reset, - u32 postreset); -}; -static void brcmf_chip_sb_corerev(struct brcmf_chip_priv *ci, +static void brcmf_chip_sb_corerev(struct brcmf_chip *ci, struct brcmf_core *core) { u32 regdata; regdata = ci->ops->read32(ci->ctx, CORE_SB(core->base, sbidhigh)); + core->rev = SBCOREREV(regdata); } -static bool brcmf_chip_sb_iscoreup(struct brcmf_core_priv *core) +static bool brcmf_chip_sb_iscoreup(struct brcmf_core *core) { - struct brcmf_chip_priv *ci; + struct brcmf_chip *ci = core->chip; u32 regdata; u32 address; - ci = core->chip; - address = CORE_SB(core->pub.base, sbtmstatelow); + address = CORE_SB(core->base, sbtmstatelow); + regdata = ci->ops->read32(ci->ctx, address); + regdata &= (SSB_TMSLOW_RESET | SSB_TMSLOW_REJECT | SSB_IMSTATE_REJECT | SSB_TMSLOW_CLOCK); + return SSB_TMSLOW_CLOCK == regdata; } -static bool brcmf_chip_ai_iscoreup(struct brcmf_core_priv *core) +static bool brcmf_chip_ai_iscoreup(struct brcmf_core *core) { - struct brcmf_chip_priv *ci; + struct brcmf_chip *ci = core->chip; u32 regdata; bool ret; - ci = core->chip; regdata = ci->ops->read32(ci->ctx, core->wrapbase + BCMA_IOCTL); + ret = (regdata & (BCMA_IOCTL_FGC | BCMA_IOCTL_CLK)) == BCMA_IOCTL_CLK; regdata = ci->ops->read32(ci->ctx, core->wrapbase + BCMA_RESET_CTL); + ret = ret && ((regdata & BCMA_RESET_CTL_RESET) == 0); return ret; } -static void brcmf_chip_sb_coredisable(struct brcmf_core_priv *core, +static void brcmf_chip_sb_coredisable(struct brcmf_core *core, u32 prereset, u32 reset) { - struct brcmf_chip_priv *ci; + struct brcmf_chip *ci = core->chip; u32 val, base; - ci = core->chip; - base = core->pub.base; + base = core->base; + val = ci->ops->read32(ci->ctx, CORE_SB(base, sbtmstatelow)); if (val & SSB_TMSLOW_RESET) return; @@ -354,14 +337,12 @@ static void brcmf_chip_sb_coredisable(struct brcmf_core_priv *core, udelay(1); } -static void brcmf_chip_ai_coredisable(struct brcmf_core_priv *core, +static void brcmf_chip_ai_coredisable(struct brcmf_core *core, u32 prereset, u32 reset) { - struct brcmf_chip_priv *ci; + struct brcmf_chip *ci = core->chip; u32 regdata; - ci = core->chip; - /* if core is already in reset, skip reset */ regdata = ci->ops->read32(ci->ctx, core->wrapbase + BCMA_RESET_CTL); if ((regdata & BCMA_RESET_CTL_RESET) != 0) @@ -388,15 +369,13 @@ static void brcmf_chip_ai_coredisable(struct brcmf_core_priv *core, ci->ops->read32(ci->ctx, core->wrapbase + BCMA_IOCTL); } -static void brcmf_chip_sb_resetcore(struct brcmf_core_priv *core, u32 prereset, +static void brcmf_chip_sb_resetcore(struct brcmf_core *core, u32 prereset, u32 reset, u32 postreset) { - struct brcmf_chip_priv *ci; + struct brcmf_chip *ci = core->chip; + u32 base = core->base; u32 regdata; - u32 base; - ci = core->chip; - base = core->pub.base; /* * Must do the disable sequence first to work for * arbitrary current core state. @@ -438,14 +417,12 @@ static void brcmf_chip_sb_resetcore(struct brcmf_core_priv *core, u32 prereset, udelay(1); } -static void brcmf_chip_ai_resetcore(struct brcmf_core_priv *core, u32 prereset, +static void brcmf_chip_ai_resetcore(struct brcmf_core *core, u32 prereset, u32 reset, u32 postreset) { - struct brcmf_chip_priv *ci; + struct brcmf_chip *ci = core->chip; int count; - ci = core->chip; - /* must disable first to work for arbitrary current core state */ brcmf_chip_ai_coredisable(core, prereset, reset); @@ -473,29 +450,30 @@ static char *brcmf_chip_name(uint chipid, char *buf, uint len) return buf; } -static struct brcmf_core *brcmf_chip_add_core(struct brcmf_chip_priv *ci, +static struct brcmf_core *brcmf_chip_add_core(struct brcmf_chip *ci, u16 coreid, u32 base, u32 wrapbase) { - struct brcmf_core_priv *core; + struct brcmf_core *core; core = kzalloc(sizeof(*core), GFP_KERNEL); if (!core) return ERR_PTR(-ENOMEM); - core->pub.id = coreid; - core->pub.base = base; + core->id = coreid; + core->base = base; core->chip = ci; core->wrapbase = wrapbase; list_add_tail(&core->list, &ci->cores); - return &core->pub; + + return core; } /* safety check for chipinfo */ -static int brcmf_chip_cores_check(struct brcmf_chip_priv *ci) +static int brcmf_chip_cores_check(struct brcmf_chip *ci) { - struct brcmf_core_priv *core; + struct brcmf_core *core; bool need_socram = false; bool has_socram = false; bool cpu_found = false; @@ -503,10 +481,10 @@ static int brcmf_chip_cores_check(struct brcmf_chip_priv *ci) list_for_each_entry(core, &ci->cores, list) { brcmf_dbg(INFO, " [%-2d] core 0x%x:%-2d base 0x%08x wrap 0x%08x\n", - idx++, core->pub.id, core->pub.rev, core->pub.base, + idx++, core->id, core->rev, core->base, core->wrapbase); - switch (core->pub.id) { + switch (core->id) { case BCMA_CORE_ARM_CM3: cpu_found = true; need_socram = true; @@ -529,26 +507,28 @@ static int brcmf_chip_cores_check(struct brcmf_chip_priv *ci) brcmf_err("CPU core not detected\n"); return -ENXIO; } + /* check RAM core presence for ARM CM3 core */ if (need_socram && !has_socram) { brcmf_err("RAM core not provided with ARM CM3 core\n"); return -ENODEV; } + return 0; } -static u32 brcmf_chip_core_read32(struct brcmf_core_priv *core, u16 reg) +static u32 brcmf_chip_core_read32(struct brcmf_core *core, u16 reg) { - return core->chip->ops->read32(core->chip->ctx, core->pub.base + reg); + return core->chip->ops->read32(core->chip->ctx, core->base + reg); } -static void brcmf_chip_core_write32(struct brcmf_core_priv *core, +static void brcmf_chip_core_write32(struct brcmf_core *core, u16 reg, u32 val) { - core->chip->ops->write32(core->chip->ctx, core->pub.base + reg, val); + core->chip->ops->write32(core->chip->ctx, core->base + reg, val); } -static bool brcmf_chip_socram_banksize(struct brcmf_core_priv *core, u8 idx, +static bool brcmf_chip_socram_banksize(struct brcmf_core *core, u8 idx, u32 *banksize) { u32 bankinfo; @@ -562,7 +542,7 @@ static bool brcmf_chip_socram_banksize(struct brcmf_core_priv *core, u8 idx, return !!(bankinfo & SOCRAM_BANKINFO_RETNTRAM_MASK); } -static void brcmf_chip_socram_ramsize(struct brcmf_core_priv *sr, u32 *ramsize, +static void brcmf_chip_socram_ramsize(struct brcmf_core *sr, u32 *ramsize, u32 *srsize) { u32 coreinfo; @@ -573,17 +553,17 @@ static void brcmf_chip_socram_ramsize(struct brcmf_core_priv *sr, u32 *ramsize, *ramsize = 0; *srsize = 0; - if (WARN_ON(sr->pub.rev < 4)) + if (WARN_ON(sr->rev < 4)) return; - if (!brcmf_chip_iscoreup(&sr->pub)) - brcmf_chip_resetcore(&sr->pub, 0, 0, 0); + if (!brcmf_chip_iscoreup(sr)) + brcmf_chip_resetcore(sr, 0, 0, 0); /* Get info for determining size */ coreinfo = brcmf_chip_core_read32(sr, SOCRAMREGOFFS(coreinfo)); nb = (coreinfo & SRCI_SRNB_MASK) >> SRCI_SRNB_SHIFT; - if ((sr->pub.rev <= 7) || (sr->pub.rev == 12)) { + if ((sr->rev <= 7) || (sr->rev == 12)) { banksize = (coreinfo & SRCI_SRBSZ_MASK); lss = (coreinfo & SRCI_LSS_MASK) >> SRCI_LSS_SHIFT; if (lss != 0) @@ -602,9 +582,9 @@ static void brcmf_chip_socram_ramsize(struct brcmf_core_priv *sr, u32 *ramsize, } /* hardcoded save&restore memory sizes */ - switch (sr->chip->pub.chip) { + switch (sr->chip->chip) { case BRCM_CC_4334_CHIP_ID: - if (sr->chip->pub.chiprev < 2) + if (sr->chip->chiprev < 2) *srsize = (32 * 1024); break; case BRCM_CC_43430_CHIP_ID: @@ -619,7 +599,7 @@ static void brcmf_chip_socram_ramsize(struct brcmf_core_priv *sr, u32 *ramsize, } /** Return the SYS MEM size */ -static u32 brcmf_chip_sysmem_ramsize(struct brcmf_core_priv *sysmem) +static u32 brcmf_chip_sysmem_ramsize(struct brcmf_core *sysmem) { u32 memsize = 0; u32 coreinfo; @@ -627,8 +607,8 @@ static u32 brcmf_chip_sysmem_ramsize(struct brcmf_core_priv *sysmem) u32 nb; u32 banksize; - if (!brcmf_chip_iscoreup(&sysmem->pub)) - brcmf_chip_resetcore(&sysmem->pub, 0, 0, 0); + if (!brcmf_chip_iscoreup(sysmem)) + brcmf_chip_resetcore(sysmem, 0, 0, 0); coreinfo = brcmf_chip_core_read32(sysmem, SYSMEMREGOFFS(coreinfo)); nb = (coreinfo & SRCI_SRNB_MASK) >> SRCI_SRNB_SHIFT; @@ -642,7 +622,7 @@ static u32 brcmf_chip_sysmem_ramsize(struct brcmf_core_priv *sysmem) } /** Return the TCM-RAM size of the ARMCR4 core. */ -static u32 brcmf_chip_tcm_ramsize(struct brcmf_core_priv *cr4) +static u32 brcmf_chip_tcm_ramsize(struct brcmf_core *cr4) { u32 corecap; u32 memsize = 0; @@ -667,9 +647,9 @@ static u32 brcmf_chip_tcm_ramsize(struct brcmf_core_priv *cr4) return memsize; } -static u32 brcmf_chip_tcm_rambase(struct brcmf_chip_priv *ci) +static u32 brcmf_chip_tcm_rambase(struct brcmf_chip *ci) { - switch (ci->pub.chip) { + switch (ci->chip) { case BRCM_CC_4345_CHIP_ID: return 0x198000; case BRCM_CC_4335_CHIP_ID: @@ -691,60 +671,53 @@ static u32 brcmf_chip_tcm_rambase(struct brcmf_chip_priv *ci) case BRCM_CC_4366_CHIP_ID: return 0x200000; default: - brcmf_err("unknown chip: %s\n", ci->pub.name); + brcmf_err("unknown chip: %s\n", ci->name); break; } return 0; } -static int brcmf_chip_get_raminfo(struct brcmf_chip_priv *ci) +static int brcmf_chip_get_raminfo(struct brcmf_chip *ci) { - struct brcmf_core_priv *mem_core; struct brcmf_core *mem; - mem = brcmf_chip_get_core(&ci->pub, BCMA_CORE_ARM_CR4); + mem = brcmf_chip_get_core(ci, BCMA_CORE_ARM_CR4); if (mem) { - mem_core = container_of(mem, struct brcmf_core_priv, pub); - ci->pub.ramsize = brcmf_chip_tcm_ramsize(mem_core); - ci->pub.rambase = brcmf_chip_tcm_rambase(ci); - if (!ci->pub.rambase) { + ci->ramsize = brcmf_chip_tcm_ramsize(mem); + ci->rambase = brcmf_chip_tcm_rambase(ci); + if (!ci->rambase) { brcmf_err("RAM base not provided with ARM CR4 core\n"); return -EINVAL; } } else { - mem = brcmf_chip_get_core(&ci->pub, BCMA_CORE_SYS_MEM); + mem = brcmf_chip_get_core(ci, BCMA_CORE_SYS_MEM); if (mem) { - mem_core = container_of(mem, struct brcmf_core_priv, - pub); - ci->pub.ramsize = brcmf_chip_sysmem_ramsize(mem_core); - ci->pub.rambase = brcmf_chip_tcm_rambase(ci); - if (!ci->pub.rambase) { + ci->ramsize = brcmf_chip_sysmem_ramsize(mem); + ci->rambase = brcmf_chip_tcm_rambase(ci); + if (!ci->rambase) { brcmf_err("RAM base not provided with ARM CA7 core\n"); return -EINVAL; } } else { - mem = brcmf_chip_get_core(&ci->pub, - BCMA_CORE_INTERNAL_MEM); + mem = brcmf_chip_get_core(ci, BCMA_CORE_INTERNAL_MEM); if (!mem) { brcmf_err("No memory cores found\n"); return -ENOMEM; } - mem_core = container_of(mem, struct brcmf_core_priv, - pub); - brcmf_chip_socram_ramsize(mem_core, &ci->pub.ramsize, - &ci->pub.srsize); + brcmf_chip_socram_ramsize(mem, &ci->ramsize, + &ci->srsize); } } brcmf_dbg(INFO, "RAM: base=0x%x size=%d (0x%x) sr=%d (0x%x)\n", - ci->pub.rambase, ci->pub.ramsize, ci->pub.ramsize, - ci->pub.srsize, ci->pub.srsize); + ci->rambase, ci->ramsize, ci->ramsize, + ci->srsize, ci->srsize); - if (!ci->pub.ramsize) { + if (!ci->ramsize) { brcmf_err("RAM size is undetermined\n"); return -ENOMEM; } - if (ci->pub.ramsize > BRCMF_CHIP_MAX_MEMSIZE) { + if (ci->ramsize > BRCMF_CHIP_MAX_MEMSIZE) { brcmf_err("RAM size is incorrect\n"); return -ENOMEM; } @@ -752,7 +725,7 @@ static int brcmf_chip_get_raminfo(struct brcmf_chip_priv *ci) return 0; } -static u32 brcmf_chip_dmp_get_desc(struct brcmf_chip_priv *ci, u32 *eromaddr, +static u32 brcmf_chip_dmp_get_desc(struct brcmf_chip *ci, u32 *eromaddr, u8 *type) { u32 val; @@ -772,7 +745,7 @@ static u32 brcmf_chip_dmp_get_desc(struct brcmf_chip_priv *ci, u32 *eromaddr, return val; } -static int brcmf_chip_dmp_get_regaddr(struct brcmf_chip_priv *ci, u32 *eromaddr, +static int brcmf_chip_dmp_get_regaddr(struct brcmf_chip *ci, u32 *eromaddr, u32 *regbase, u32 *wrapbase) { u8 desc; @@ -845,7 +818,7 @@ static int brcmf_chip_dmp_get_regaddr(struct brcmf_chip_priv *ci, u32 *eromaddr, } static -int brcmf_chip_dmp_erom_scan(struct brcmf_chip_priv *ci) +int brcmf_chip_dmp_erom_scan(struct brcmf_chip *ci) { struct brcmf_core *core; u32 eromaddr; @@ -905,7 +878,7 @@ int brcmf_chip_dmp_erom_scan(struct brcmf_chip_priv *ci) return 0; } -static int brcmf_chip_recognition(struct brcmf_chip_priv *ci) +static int brcmf_chip_recognition(struct brcmf_chip *ci) { struct brcmf_core *core; u32 regdata; @@ -918,18 +891,20 @@ static int brcmf_chip_recognition(struct brcmf_chip_priv *ci) * other ways of recognition should be added here. */ regdata = ci->ops->read32(ci->ctx, CORE_CC_REG(SI_ENUM_BASE, chipid)); - ci->pub.chip = regdata & CID_ID_MASK; - ci->pub.chiprev = (regdata & CID_REV_MASK) >> CID_REV_SHIFT; + ci->chip = regdata & CID_ID_MASK; + ci->chiprev = (regdata & CID_REV_MASK) >> CID_REV_SHIFT; socitype = (regdata & CID_TYPE_MASK) >> CID_TYPE_SHIFT; - brcmf_chip_name(ci->pub.chip, ci->pub.name, sizeof(ci->pub.name)); - brcmf_dbg(INFO, "found %s chip: BCM%s, rev=%d\n", - socitype == SOCI_SB ? "SB" : "AXI", ci->pub.name, - ci->pub.chiprev); + brcmf_chip_name(ci->chip, ci->name, sizeof(ci->name)); + + printk("found %s chip: BCM%s, rev=%d\n", + socitype == SOCI_SB ? "SB" : "AXI", ci->name, + ci->chiprev); switch(socitype) { case SOCI_SB: - if (ci->pub.chip != BRCM_CC_4329_CHIP_ID) { + + if (ci->chip != BRCM_CC_4329_CHIP_ID) { brcmf_err("SB chip is not supported\n"); return -ENODEV; } @@ -971,42 +946,40 @@ static int brcmf_chip_recognition(struct brcmf_chip_priv *ci) return ret; /* assure chip is passive for core access */ - brcmf_chip_set_passive(&ci->pub); + brcmf_chip_set_passive(ci); /* Call bus specific reset function now. Cores have been determined * but further access may require a chip specific reset at this point. */ if (ci->ops->reset) { - ci->ops->reset(ci->ctx, &ci->pub); - brcmf_chip_set_passive(&ci->pub); + ci->ops->reset(ci->ctx, ci); + brcmf_chip_set_passive(ci); } return brcmf_chip_get_raminfo(ci); } -static void brcmf_chip_disable_arm(struct brcmf_chip_priv *chip, u16 id) +static void brcmf_chip_disable_arm(struct brcmf_chip *chip, u16 id) { - struct brcmf_core *core; - struct brcmf_core_priv *cpu; + struct brcmf_core *cpu; u32 val; - core = brcmf_chip_get_core(&chip->pub, id); - if (!core) + cpu = brcmf_chip_get_core(chip, id); + if (!cpu) return; switch (id) { case BCMA_CORE_ARM_CM3: - brcmf_chip_coredisable(core, 0, 0); + brcmf_chip_coredisable(cpu, 0, 0); break; case BCMA_CORE_ARM_CR4: case BCMA_CORE_ARM_CA7: - cpu = container_of(core, struct brcmf_core_priv, pub); /* clear all IOCTL bits except HALT bit */ val = chip->ops->read32(chip->ctx, cpu->wrapbase + BCMA_IOCTL); val &= ARMCR4_BCMA_IOCTL_CPUHALT; - brcmf_chip_resetcore(core, val, ARMCR4_BCMA_IOCTL_CPUHALT, + brcmf_chip_resetcore(cpu, val, ARMCR4_BCMA_IOCTL_CPUHALT, ARMCR4_BCMA_IOCTL_CPUHALT); break; default: @@ -1015,41 +988,38 @@ static void brcmf_chip_disable_arm(struct brcmf_chip_priv *chip, u16 id) } } -static int brcmf_chip_setup(struct brcmf_chip_priv *chip) +static int brcmf_chip_setup(struct brcmf_chip *chip) { - struct brcmf_chip *pub; - struct brcmf_core_priv *cc; - struct brcmf_core *pmu; + struct brcmf_core *cc, *pmu; u32 base; u32 val; int ret = 0; - pub = &chip->pub; - cc = list_first_entry(&chip->cores, struct brcmf_core_priv, list); - base = cc->pub.base; + cc = list_first_entry(&chip->cores, struct brcmf_core, list); + base = cc->base; /* get chipcommon capabilites */ - pub->cc_caps = chip->ops->read32(chip->ctx, + chip->cc_caps = chip->ops->read32(chip->ctx, CORE_CC_REG(base, capabilities)); - pub->cc_caps_ext = chip->ops->read32(chip->ctx, + chip->cc_caps_ext = chip->ops->read32(chip->ctx, CORE_CC_REG(base, capabilities_ext)); /* get pmu caps & rev */ - pmu = brcmf_chip_get_pmu(pub); /* after reading cc_caps_ext */ - if (pub->cc_caps & CC_CAP_PMU) { + pmu = brcmf_chip_get_pmu(chip); /* after reading cc_caps_ext */ + if (chip->cc_caps & CC_CAP_PMU) { val = chip->ops->read32(chip->ctx, CORE_CC_REG(pmu->base, pmucapabilities)); - pub->pmurev = val & PCAP_REV_MASK; - pub->pmucaps = val; + chip->pmurev = val & PCAP_REV_MASK; + chip->pmucaps = val; } brcmf_dbg(INFO, "ccrev=%d, pmurev=%d, pmucaps=0x%x\n", - cc->pub.rev, pub->pmurev, pub->pmucaps); + cc->rev, chip->pmurev, chip->pmucaps); /* execute bus core specific setup */ if (chip->ops->setup) - ret = chip->ops->setup(chip->ctx, pub); + ret = chip->ops->setup(chip->ctx, chip); return ret; } @@ -1057,7 +1027,7 @@ static int brcmf_chip_setup(struct brcmf_chip_priv *chip) struct brcmf_chip *brcmf_chip_attach(void *ctx, const struct brcmf_buscore_ops *ops) { - struct brcmf_chip_priv *chip; + struct brcmf_chip *chip; int err = 0; if (WARN_ON(!ops->read32)) @@ -1092,20 +1062,18 @@ struct brcmf_chip *brcmf_chip_attach(void *ctx, if (err < 0) goto fail; - return &chip->pub; + return chip; fail: - brcmf_chip_detach(&chip->pub); + brcmf_chip_detach(chip); return ERR_PTR(err); } -void brcmf_chip_detach(struct brcmf_chip *pub) +void brcmf_chip_detach(struct brcmf_chip *chip) { - struct brcmf_chip_priv *chip; - struct brcmf_core_priv *core; - struct brcmf_core_priv *tmp; + struct brcmf_core *core; + struct brcmf_core *tmp; - chip = container_of(pub, struct brcmf_chip_priv, pub); list_for_each_entry_safe(core, tmp, &chip->cores, list) { list_del(&core->list); kfree(core); @@ -1113,40 +1081,38 @@ void brcmf_chip_detach(struct brcmf_chip *pub) kfree(chip); } -struct brcmf_core *brcmf_chip_get_core(struct brcmf_chip *pub, u16 coreid) +struct brcmf_core *brcmf_chip_get_core(struct brcmf_chip *chip, u16 coreid) { - struct brcmf_chip_priv *chip; - struct brcmf_core_priv *core; + struct brcmf_core *core; - chip = container_of(pub, struct brcmf_chip_priv, pub); list_for_each_entry(core, &chip->cores, list) - if (core->pub.id == coreid) - return &core->pub; + if (core->id == coreid) + return core; return NULL; } -struct brcmf_core *brcmf_chip_get_chipcommon(struct brcmf_chip *pub) +struct brcmf_core *brcmf_chip_get_chipcommon(struct brcmf_chip *chip) { - struct brcmf_chip_priv *chip; - struct brcmf_core_priv *cc; - - chip = container_of(pub, struct brcmf_chip_priv, pub); - cc = list_first_entry(&chip->cores, struct brcmf_core_priv, list); - if (WARN_ON(!cc || cc->pub.id != BCMA_CORE_CHIPCOMMON)) - return brcmf_chip_get_core(pub, BCMA_CORE_CHIPCOMMON); - return &cc->pub; + struct brcmf_core *cc; + + cc = list_first_entry(&chip->cores, struct brcmf_core, list); + + if (WARN_ON(!cc || cc->id != BCMA_CORE_CHIPCOMMON)) + return brcmf_chip_get_core(chip, BCMA_CORE_CHIPCOMMON); + + return cc; } -struct brcmf_core *brcmf_chip_get_pmu(struct brcmf_chip *pub) +struct brcmf_core *brcmf_chip_get_pmu(struct brcmf_chip *chip) { - struct brcmf_core *cc = brcmf_chip_get_chipcommon(pub); + struct brcmf_core *cc = brcmf_chip_get_chipcommon(chip); struct brcmf_core *pmu; /* See if there is separated PMU core available */ if (cc->rev >= 35 && - pub->cc_caps_ext & BCMA_CC_CAP_EXT_AOB_PRESENT) { - pmu = brcmf_chip_get_core(pub, BCMA_CORE_PMU); + chip->cc_caps_ext & BCMA_CC_CAP_EXT_AOB_PRESENT) { + pmu = brcmf_chip_get_core(chip, BCMA_CORE_PMU); if (pmu) return pmu; } @@ -1155,188 +1121,178 @@ struct brcmf_core *brcmf_chip_get_pmu(struct brcmf_chip *pub) return cc; } -bool brcmf_chip_iscoreup(struct brcmf_core *pub) +bool brcmf_chip_iscoreup(struct brcmf_core *core) { - struct brcmf_core_priv *core; - - core = container_of(pub, struct brcmf_core_priv, pub); return core->chip->iscoreup(core); } -void brcmf_chip_coredisable(struct brcmf_core *pub, u32 prereset, u32 reset) +void brcmf_chip_coredisable(struct brcmf_core *core, u32 prereset, u32 reset) { - struct brcmf_core_priv *core; - - core = container_of(pub, struct brcmf_core_priv, pub); core->chip->coredisable(core, prereset, reset); } -void brcmf_chip_resetcore(struct brcmf_core *pub, u32 prereset, u32 reset, +void brcmf_chip_resetcore(struct brcmf_core *core, u32 prereset, u32 reset, u32 postreset) { - struct brcmf_core_priv *core; - - core = container_of(pub, struct brcmf_core_priv, pub); core->chip->resetcore(core, prereset, reset, postreset); } static void -brcmf_chip_cm3_set_passive(struct brcmf_chip_priv *chip) +brcmf_chip_cm3_set_passive(struct brcmf_chip *chip) { struct brcmf_core *core; - struct brcmf_core_priv *sr; brcmf_chip_disable_arm(chip, BCMA_CORE_ARM_CM3); - core = brcmf_chip_get_core(&chip->pub, BCMA_CORE_80211); + + core = brcmf_chip_get_core(chip, BCMA_CORE_80211); brcmf_chip_resetcore(core, D11_BCMA_IOCTL_PHYRESET | D11_BCMA_IOCTL_PHYCLOCKEN, D11_BCMA_IOCTL_PHYCLOCKEN, D11_BCMA_IOCTL_PHYCLOCKEN); - core = brcmf_chip_get_core(&chip->pub, BCMA_CORE_INTERNAL_MEM); + + core = brcmf_chip_get_core(chip, BCMA_CORE_INTERNAL_MEM); brcmf_chip_resetcore(core, 0, 0, 0); /* disable bank #3 remap for this device */ - if (chip->pub.chip == BRCM_CC_43430_CHIP_ID) { - sr = container_of(core, struct brcmf_core_priv, pub); - brcmf_chip_core_write32(sr, SOCRAMREGOFFS(bankidx), 3); - brcmf_chip_core_write32(sr, SOCRAMREGOFFS(bankpda), 0); + if (chip->chip == BRCM_CC_43430_CHIP_ID) { + brcmf_chip_core_write32(core, SOCRAMREGOFFS(bankidx), 3); + brcmf_chip_core_write32(core, SOCRAMREGOFFS(bankpda), 0); } } -static bool brcmf_chip_cm3_set_active(struct brcmf_chip_priv *chip) +static bool brcmf_chip_cm3_set_active(struct brcmf_chip *chip) { struct brcmf_core *core; - core = brcmf_chip_get_core(&chip->pub, BCMA_CORE_INTERNAL_MEM); + core = brcmf_chip_get_core(chip, BCMA_CORE_INTERNAL_MEM); + if (!brcmf_chip_iscoreup(core)) { brcmf_err("SOCRAM core is down after reset?\n"); return false; } - chip->ops->activate(chip->ctx, &chip->pub, 0); + chip->ops->activate(chip->ctx, chip, 0); - core = brcmf_chip_get_core(&chip->pub, BCMA_CORE_ARM_CM3); + core = brcmf_chip_get_core(chip, BCMA_CORE_ARM_CM3); brcmf_chip_resetcore(core, 0, 0, 0); return true; } static inline void -brcmf_chip_cr4_set_passive(struct brcmf_chip_priv *chip) +brcmf_chip_cr4_set_passive(struct brcmf_chip *chip) { struct brcmf_core *core; brcmf_chip_disable_arm(chip, BCMA_CORE_ARM_CR4); - core = brcmf_chip_get_core(&chip->pub, BCMA_CORE_80211); + core = brcmf_chip_get_core(chip, BCMA_CORE_80211); brcmf_chip_resetcore(core, D11_BCMA_IOCTL_PHYRESET | D11_BCMA_IOCTL_PHYCLOCKEN, D11_BCMA_IOCTL_PHYCLOCKEN, D11_BCMA_IOCTL_PHYCLOCKEN); } -static bool brcmf_chip_cr4_set_active(struct brcmf_chip_priv *chip, u32 rstvec) +static bool brcmf_chip_cr4_set_active(struct brcmf_chip *chip, u32 rstvec) { struct brcmf_core *core; - chip->ops->activate(chip->ctx, &chip->pub, rstvec); + chip->ops->activate(chip->ctx, chip, rstvec); /* restore ARM */ - core = brcmf_chip_get_core(&chip->pub, BCMA_CORE_ARM_CR4); + core = brcmf_chip_get_core(chip, BCMA_CORE_ARM_CR4); brcmf_chip_resetcore(core, ARMCR4_BCMA_IOCTL_CPUHALT, 0, 0); return true; } static inline void -brcmf_chip_ca7_set_passive(struct brcmf_chip_priv *chip) +brcmf_chip_ca7_set_passive(struct brcmf_chip *chip) { struct brcmf_core *core; brcmf_chip_disable_arm(chip, BCMA_CORE_ARM_CA7); - core = brcmf_chip_get_core(&chip->pub, BCMA_CORE_80211); + core = brcmf_chip_get_core(chip, BCMA_CORE_80211); brcmf_chip_resetcore(core, D11_BCMA_IOCTL_PHYRESET | D11_BCMA_IOCTL_PHYCLOCKEN, D11_BCMA_IOCTL_PHYCLOCKEN, D11_BCMA_IOCTL_PHYCLOCKEN); } -static bool brcmf_chip_ca7_set_active(struct brcmf_chip_priv *chip, u32 rstvec) +static bool brcmf_chip_ca7_set_active(struct brcmf_chip *chip, u32 rstvec) { struct brcmf_core *core; - chip->ops->activate(chip->ctx, &chip->pub, rstvec); + chip->ops->activate(chip->ctx, chip, rstvec); /* restore ARM */ - core = brcmf_chip_get_core(&chip->pub, BCMA_CORE_ARM_CA7); + core = brcmf_chip_get_core(chip, BCMA_CORE_ARM_CA7); brcmf_chip_resetcore(core, ARMCR4_BCMA_IOCTL_CPUHALT, 0, 0); return true; } -void brcmf_chip_set_passive(struct brcmf_chip *pub) +void brcmf_chip_set_passive(struct brcmf_chip *chip) { - struct brcmf_chip_priv *chip; struct brcmf_core *arm; brcmf_dbg(TRACE, "Enter\n"); - chip = container_of(pub, struct brcmf_chip_priv, pub); - arm = brcmf_chip_get_core(pub, BCMA_CORE_ARM_CR4); + arm = brcmf_chip_get_core(chip, BCMA_CORE_ARM_CR4); if (arm) { brcmf_chip_cr4_set_passive(chip); return; } - arm = brcmf_chip_get_core(pub, BCMA_CORE_ARM_CA7); + + arm = brcmf_chip_get_core(chip, BCMA_CORE_ARM_CA7); if (arm) { brcmf_chip_ca7_set_passive(chip); return; } - arm = brcmf_chip_get_core(pub, BCMA_CORE_ARM_CM3); + + arm = brcmf_chip_get_core(chip, BCMA_CORE_ARM_CM3); if (arm) { brcmf_chip_cm3_set_passive(chip); return; } } -bool brcmf_chip_set_active(struct brcmf_chip *pub, u32 rstvec) +bool brcmf_chip_set_active(struct brcmf_chip *chip, u32 rstvec) { - struct brcmf_chip_priv *chip; struct brcmf_core *arm; brcmf_dbg(TRACE, "Enter\n"); - chip = container_of(pub, struct brcmf_chip_priv, pub); - arm = brcmf_chip_get_core(pub, BCMA_CORE_ARM_CR4); + arm = brcmf_chip_get_core(chip, BCMA_CORE_ARM_CR4); if (arm) return brcmf_chip_cr4_set_active(chip, rstvec); - arm = brcmf_chip_get_core(pub, BCMA_CORE_ARM_CA7); + + arm = brcmf_chip_get_core(chip, BCMA_CORE_ARM_CA7); if (arm) return brcmf_chip_ca7_set_active(chip, rstvec); - arm = brcmf_chip_get_core(pub, BCMA_CORE_ARM_CM3); + + arm = brcmf_chip_get_core(chip, BCMA_CORE_ARM_CM3); if (arm) return brcmf_chip_cm3_set_active(chip); return false; } -bool brcmf_chip_sr_capable(struct brcmf_chip *pub) +bool brcmf_chip_sr_capable(struct brcmf_chip *chip) { + struct brcmf_core *pmu = brcmf_chip_get_pmu(chip); u32 base, addr, reg, pmu_cc3_mask = ~0; - struct brcmf_chip_priv *chip; - struct brcmf_core *pmu = brcmf_chip_get_pmu(pub); brcmf_dbg(TRACE, "Enter\n"); /* old chips with PMU version less than 17 don't support save restore */ - if (pub->pmurev < 17) + if (chip->pmurev < 17) return false; - base = brcmf_chip_get_chipcommon(pub)->base; - chip = container_of(pub, struct brcmf_chip_priv, pub); + base = brcmf_chip_get_chipcommon(chip)->base; - switch (pub->chip) { + switch (chip->chip) { case BRCM_CC_4354_CHIP_ID: case BRCM_CC_4356_CHIP_ID: /* explicitly check SR engine enable bit */ diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h index dd0ec3eba6a9..0babb328d155 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h @@ -21,6 +21,8 @@ #define CORE_CC_REG(base, field) \ (base + offsetof(struct chipcregs, field)) +struct brcmf_core; + /** * struct brcmf_chip - chip level information. * @@ -36,6 +38,20 @@ * @name: string representation of the chip identifier. */ struct brcmf_chip { + const struct brcmf_buscore_ops *ops; + + /* assured first core is chipcommon, second core is buscore */ + //FIXME: Really? does not appear to hold true for 43430 + struct list_head cores; /* List of cores in this chip */ + u16 num_cores; + + bool (*iscoreup)(struct brcmf_core *core); + void (*coredisable)(struct brcmf_core *core, u32 prereset, u32 reset); + void (*resetcore)(struct brcmf_core *core, u32 prereset, u32 reset, + u32 postreset); + + void *ctx; + u32 chip; u32 chiprev; u32 cc_caps; @@ -45,6 +61,7 @@ struct brcmf_chip { u32 rambase; u32 ramsize; u32 srsize; + char name[8]; }; @@ -56,9 +73,14 @@ struct brcmf_chip { * @base: base address of core register space. */ struct brcmf_core { + struct brcmf_chip *chip; /* Parent chip */ + struct list_head list; + u16 id; u16 rev; u32 base; + u32 wrapbase; + }; /** -- 2.11.0