On 12/26/2012 10:29 AM, Rafał Miłecki wrote: > Also check if parallel flash is present at all before accessing it and > add support for serial flash on BCMA bus. > > Signed-off-by: Rafał Miłecki <zajec5@xxxxxxxxx> Acked-by: Hauke Mehrtens <hauke@xxxxxxxxxx> I came up with a similar patch [0], but I will rebase mine and send it in some days. [0): https://dev.openwrt.org/browser/trunk/target/linux/brcm47xx/patches-3.6/080-MIPS-BCM47XX-rewrite-nvram-probing.patch > --- > arch/mips/bcm47xx/nvram.c | 87 +++++++++++++++++++++++++++++++-------------- > 1 files changed, 60 insertions(+), 27 deletions(-) > > diff --git a/arch/mips/bcm47xx/nvram.c b/arch/mips/bcm47xx/nvram.c > index 48a4c70..6461367 100644 > --- a/arch/mips/bcm47xx/nvram.c > +++ b/arch/mips/bcm47xx/nvram.c > @@ -23,39 +23,13 @@ > > static char nvram_buf[NVRAM_SPACE]; > > -/* Probe for NVRAM header */ > -static void early_nvram_init(void) > +static void nvram_find_and_copy(u32 base, u32 lim) > { > -#ifdef CONFIG_BCM47XX_SSB > - struct ssb_mipscore *mcore_ssb; > -#endif > -#ifdef CONFIG_BCM47XX_BCMA > - struct bcma_drv_cc *bcma_cc; > -#endif > struct nvram_header *header; > int i; > - u32 base = 0; > - u32 lim = 0; > u32 off; > u32 *src, *dst; > > - switch (bcm47xx_bus_type) { > -#ifdef CONFIG_BCM47XX_SSB > - case BCM47XX_BUS_TYPE_SSB: > - mcore_ssb = &bcm47xx_bus.ssb.mipscore; > - base = mcore_ssb->pflash.window; > - lim = mcore_ssb->pflash.window_size; > - break; > -#endif > -#ifdef CONFIG_BCM47XX_BCMA > - case BCM47XX_BUS_TYPE_BCMA: > - bcma_cc = &bcm47xx_bus.bcma.bus.drv_cc; > - base = bcma_cc->pflash.window; > - lim = bcma_cc->pflash.window_size; > - break; > -#endif > - } > - > off = FLASH_MIN; > while (off <= lim) { > /* Windowed flash access */ > @@ -86,6 +60,65 @@ found: > *dst++ = le32_to_cpu(*src++); > } > > +#ifdef CONFIG_BCM47XX_SSB > +static void nvram_init_ssb(void) > +{ > + struct ssb_mipscore *mcore = &bcm47xx_bus.ssb.mipscore; > + u32 base; > + u32 lim; > + > + if (mcore->pflash.present) { > + base = mcore->pflash.window; > + lim = mcore->pflash.window_size; > + } else { > + pr_err("Couldn't find supported flash memory\n"); > + return; > + } > + > + nvram_find_and_copy(base, lim); > +} > +#endif > + > +#ifdef CONFIG_BCM47XX_BCMA > +static void nvram_init_bcma(void) > +{ > + struct bcma_drv_cc *cc = &bcm47xx_bus.bcma.bus.drv_cc; > + u32 base; > + u32 lim; > + > + if (cc->pflash.present) { > + base = cc->pflash.window; > + lim = cc->pflash.window_size; > +#ifdef CONFIG_BCMA_SFLASH > + } else if (cc->sflash.present) { > + base = cc->sflash.window; > + lim = cc->sflash.size; > +#endif > + } else { > + pr_err("Couldn't find supported flash memory\n"); > + return; > + } > + > + nvram_find_and_copy(base, lim); > +} > +#endif > + > +static void early_nvram_init(void) > +{ > + switch (bcm47xx_bus_type) { > +#ifdef CONFIG_BCM47XX_SSB > + case BCM47XX_BUS_TYPE_SSB: > + nvram_init_ssb(); > + break; > +#endif > +#ifdef CONFIG_BCM47XX_BCMA > + case BCM47XX_BUS_TYPE_BCMA: > + nvram_init_bcma(); > + break; > +#endif > + } > +} > + > int nvram_getenv(char *name, char *val, size_t val_len) > { > char *var, *value, *end, *eq; >