#include <linux/string.h>
#include <linux/etherdevice.h>
#include <bcmdefs.h>
-#include <osl.h>
#include <linux/module.h>
#include <linux/pci.h>
#include <stdarg.h>
#include <hndsoc.h>
#include <sbchipc.h>
#include <bcmdevs.h>
-#include <bcmendian.h>
#include <pcicfg.h>
#include <siutils.h>
#include <bcmsrom.h>
#include <sbsdpcmdev.h>
#endif
-#include <proto/ethernet.h> /* for sprom content groking */
+#include <linux/if_ether.h>
#define BS_ERROR(args)
#define SROM_CIS_SINGLE 1
-static int initvars_srom_si(si_t *sih, struct osl_info *osh, void *curmap,
- char **vars, uint *count);
-static void _initvars_srom_pci(u8 sromrev, u16 *srom, uint off,
- varbuf_t *b);
-static int initvars_srom_pci(si_t *sih, void *curmap, char **vars,
- uint *count);
+static int initvars_srom_si(si_t *sih, void *curmap, char **vars, uint *count);
+static void _initvars_srom_pci(u8 sromrev, u16 *srom, uint off, varbuf_t *b);
+static int initvars_srom_pci(si_t *sih, void *curmap, char **vars, uint *count);
static int initvars_flash_si(si_t *sih, char **vars, uint *count);
#ifdef BCMSDIO
-static int initvars_cis_sdio(struct osl_info *osh, char **vars, uint *count);
-static int sprom_cmd_sdio(struct osl_info *osh, u8 cmd);
-static int sprom_read_sdio(struct osl_info *osh, u16 addr, u16 *data);
+static int initvars_cis_sdio(char **vars, uint *count);
+static int sprom_cmd_sdio(u8 cmd);
+static int sprom_read_sdio(u16 addr, u16 *data);
#endif /* BCMSDIO */
-static int sprom_read_pci(struct osl_info *osh, si_t *sih, u16 *sprom,
+static int sprom_read_pci(si_t *sih, u16 *sprom,
uint wordoff, u16 *buf, uint nwords, bool check_crc);
#if defined(BCMNVRAMR)
-static int otp_read_pci(struct osl_info *osh, si_t *sih, u16 *buf, uint bufsz);
+static int otp_read_pci(si_t *sih, u16 *buf, uint bufsz);
#endif
-static u16 srom_cc_cmd(si_t *sih, struct osl_info *osh, void *ccregs, u32 cmd,
+static u16 srom_cc_cmd(si_t *sih, void *ccregs, u32 cmd,
uint wordoff, u16 data);
-static int initvars_table(struct osl_info *osh, char *start, char *end,
+static int initvars_table(char *start, char *end,
char **vars, uint *count);
-static int initvars_flash(si_t *sih, struct osl_info *osh, char **vp,
+static int initvars_flash(si_t *sih, char **vp,
uint len);
/* Initialization of varbuf structure */
* Initialize local vars from the right source for this platform.
* Return 0 on success, nonzero on error.
*/
-int srom_var_init(si_t *sih, uint bustype, void *curmap, struct osl_info *osh,
+int srom_var_init(si_t *sih, uint bustype, void *curmap,
char **vars, uint *count)
{
uint len;
switch (bustype) {
case SI_BUS:
case JTAG_BUS:
- return initvars_srom_si(sih, osh, curmap, vars, count);
+ return initvars_srom_si(sih, curmap, vars, count);
case PCI_BUS:
ASSERT(curmap != NULL);
#ifdef BCMSDIO
case SDIO_BUS:
- return initvars_cis_sdio(osh, vars, count);
+ return initvars_cis_sdio(vars, count);
#endif /* BCMSDIO */
default:
/* support only 16-bit word read from srom */
int
-srom_read(si_t *sih, uint bustype, void *curmap, struct osl_info *osh,
+srom_read(si_t *sih, uint bustype, void *curmap,
uint byteoff, uint nbytes, u16 *buf, bool check_crc)
{
uint off, nw;
return 1;
if (sprom_read_pci
- (osh, sih, srom, off, buf, nw, check_crc))
+ (sih, srom, off, buf, nw, check_crc))
return 1;
}
#if defined(BCMNVRAMR)
else {
- if (otp_read_pci(osh, sih, buf, SROM_MAX))
+ if (otp_read_pci(sih, buf, SROM_MAX))
return 1;
}
#endif
nw = nbytes / 2;
for (i = 0; i < nw; i++) {
if (sprom_read_sdio
- (osh, (u16) (off + i), (u16 *) (buf + i)))
+ ((u16) (off + i), (u16 *) (buf + i)))
return 1;
}
#endif /* BCMSDIO */
/* For dongle HW, accept partial calibration parameters */
#define BCMDONGLECASE(n)
-int srom_parsecis(struct osl_info *osh, u8 *pcis[], uint ciscnt, char **vars,
+int srom_parsecis(u8 *pcis[], uint ciscnt, char **vars,
uint *count)
{
char eabuf[32];
u8 srev = cis[i + 1 + 70];
ASSERT(srev == 3);
/* make tuple value 16-bit aligned and parse it */
- bcopy(&cis[i + 1], srom,
- sizeof(srom));
+ memcpy(srom, &cis[i + 1],
+ sizeof(srom));
_initvars_srom_pci(srev, srom,
SROM3_SWRGN_OFF,
&b);
*b.buf++ = '\0';
ASSERT(b.buf - base <= MAXSZ_NVRAM_VARS);
- err = initvars_table(osh, base, b.buf, vars, count);
+ err = initvars_table(base, b.buf, vars, count);
kfree(base);
return err;
* not in the bus cores.
*/
static u16
-srom_cc_cmd(si_t *sih, struct osl_info *osh, void *ccregs, u32 cmd,
+srom_cc_cmd(si_t *sih, void *ccregs, u32 cmd,
uint wordoff, u16 data)
{
chipcregs_t *cc = (chipcregs_t *) ccregs;
uint wait_cnt = 1000;
if ((cmd == SRC_OP_READ) || (cmd == SRC_OP_WRITE)) {
- W_REG(osh, &cc->sromaddress, wordoff * 2);
+ W_REG(&cc->sromaddress, wordoff * 2);
if (cmd == SRC_OP_WRITE)
- W_REG(osh, &cc->sromdata, data);
+ W_REG(&cc->sromdata, data);
}
- W_REG(osh, &cc->sromcontrol, SRC_START | cmd);
+ W_REG(&cc->sromcontrol, SRC_START | cmd);
while (wait_cnt--) {
- if ((R_REG(osh, &cc->sromcontrol) & SRC_BUSY) == 0)
+ if ((R_REG(&cc->sromcontrol) & SRC_BUSY) == 0)
break;
}
return 0xffff;
}
if (cmd == SRC_OP_READ)
- return (u16) R_REG(osh, &cc->sromdata);
+ return (u16) R_REG(&cc->sromdata);
else
return 0xffff;
}
+static inline void ltoh16_buf(u16 *buf, unsigned int size)
+{
+ for (size /= 2; size; size--)
+ *(buf + size) = le16_to_cpu(*(buf + size));
+}
+
+static inline void htol16_buf(u16 *buf, unsigned int size)
+{
+ for (size /= 2; size; size--)
+ *(buf + size) = cpu_to_le16(*(buf + size));
+}
+
/*
* Read in and validate sprom.
* Return 0 on success, nonzero on error.
*/
static int
-sprom_read_pci(struct osl_info *osh, si_t *sih, u16 *sprom, uint wordoff,
+sprom_read_pci(si_t *sih, u16 *sprom, uint wordoff,
u16 *buf, uint nwords, bool check_crc)
{
int err = 0;
ccregs = (void *)((u8 *) sprom - CC_SROM_OTP);
buf[i] =
- srom_cc_cmd(sih, osh, ccregs, SRC_OP_READ,
+ srom_cc_cmd(sih, ccregs, SRC_OP_READ,
wordoff + i, 0);
} else {
if (ISSIM_ENAB(sih))
- buf[i] = R_REG(osh, &sprom[wordoff + i]);
+ buf[i] = R_REG(&sprom[wordoff + i]);
- buf[i] = R_REG(osh, &sprom[wordoff + i]);
+ buf[i] = R_REG(&sprom[wordoff + i]);
}
}
}
#if defined(BCMNVRAMR)
-static int otp_read_pci(struct osl_info *osh, si_t *sih, u16 *buf, uint bufsz)
+static int otp_read_pci(si_t *sih, u16 *buf, uint bufsz)
{
u8 *otp;
uint sz = OTP_SZ_MAX / 2; /* size in words */
err = otp_read_region(sih, OTP_HW_RGN, (u16 *) otp, &sz);
- bcopy(otp, buf, bufsz);
+ memcpy(buf, otp, bufsz);
- if (otp)
- kfree(otp);
+ kfree(otp);
/* Check CRC */
if (buf[0] == 0xffff) {
* Create variable table from memory.
* Return 0 on success, nonzero on error.
*/
-static int initvars_table(struct osl_info *osh, char *start, char *end,
+static int initvars_table(char *start, char *end,
char **vars, uint *count)
{
int c = (int)(end - start);
ASSERT(vp != NULL);
if (!vp)
return BCME_NOMEM;
- bcopy(start, vp, c);
+ memcpy(vp, start, c);
*vars = vp;
*count = c;
} else {
* of the table upon enter and to the end of the table upon exit when success.
* Return 0 on success, nonzero on error.
*/
-static int initvars_flash(si_t *sih, struct osl_info *osh, char **base,
- uint len)
+static int initvars_flash(si_t *sih, char **base, uint len)
{
char *vp = *base;
char *flash;
*/
static int initvars_flash_si(si_t *sih, char **vars, uint *count)
{
- struct osl_info *osh = si_osh(sih);
char *vp, *base;
int err;
if (!vp)
return BCME_NOMEM;
- err = initvars_flash(sih, osh, &vp, MAXSZ_NVRAM_VARS);
+ err = initvars_flash(sih, &vp, MAXSZ_NVRAM_VARS);
if (err == 0)
- err = initvars_table(osh, base, vp, vars, count);
+ err = initvars_table(base, vp, vars, count);
kfree(base);
continue;
if (flags & SRFL_ETHADDR) {
- struct ether_addr ea;
+ u8 ea[ETH_ALEN];
- ea.octet[0] = (srom[srv->off - off] >> 8) & 0xff;
- ea.octet[1] = srom[srv->off - off] & 0xff;
- ea.octet[2] = (srom[srv->off + 1 - off] >> 8) & 0xff;
- ea.octet[3] = srom[srv->off + 1 - off] & 0xff;
- ea.octet[4] = (srom[srv->off + 2 - off] >> 8) & 0xff;
- ea.octet[5] = srom[srv->off + 2 - off] & 0xff;
+ ea[0] = (srom[srv->off - off] >> 8) & 0xff;
+ ea[1] = srom[srv->off - off] & 0xff;
+ ea[2] = (srom[srv->off + 1 - off] >> 8) & 0xff;
+ ea[3] = srom[srv->off + 1 - off] & 0xff;
+ ea[4] = (srom[srv->off + 2 - off] >> 8) & 0xff;
+ ea[5] = srom[srv->off + 2 - off] & 0xff;
- varbuf_append(b, "%s=%pM", name, ea.octet);
+ varbuf_append(b, "%s=%pM", name, ea);
} else {
ASSERT(mask_valid(srv->mask));
ASSERT(mask_width(srv->mask));
u32 sr;
varbuf_t b;
char *vp, *base = NULL;
- struct osl_info *osh = si_osh(sih);
bool flash = false;
int err = 0;
sromwindow = (u16 *) SROM_OFFSET(sih);
if (si_is_sprom_available(sih)) {
err =
- sprom_read_pci(osh, sih, sromwindow, 0, srom, SROM_WORDS,
+ sprom_read_pci(sih, sromwindow, 0, srom, SROM_WORDS,
true);
if ((srom[SROM4_SIGN] == SROM4_SIGNATURE) ||
&& (sih->buscorerev >= 0xe)))) {
/* sromrev >= 4, read more */
err =
- sprom_read_pci(osh, sih, sromwindow, 0, srom,
+ sprom_read_pci(sih, sromwindow, 0, srom,
SROM4_WORDS, true);
sromrev = srom[SROM4_CRCREV] & 0xff;
if (err)
}
#if defined(BCMNVRAMR)
/* Use OTP if SPROM not available */
- else if ((err = otp_read_pci(osh, sih, srom, SROM_MAX)) == 0) {
- /* OTP only contain SROM rev8/rev9 for now */
- sromrev = srom[SROM4_CRCREV] & 0xff;
- }
-#endif
else {
- err = 1;
- BS_ERROR(("Neither SPROM nor OTP has valid image\n"));
+ err = otp_read_pci(sih, srom, SROM_MAX);
+ if (err == 0)
+ /* OTP only contain SROM rev8/rev9 for now */
+ sromrev = srom[SROM4_CRCREV] & 0xff;
+ else
+ err = 1;
}
+#else
+ else
+ err = 1;
+#endif
- /* We want internal/wltest driver to come up with default sromvars so we can
- * program a blank SPROM/OTP.
+ /*
+ * We want internal/wltest driver to come up with default
+ * sromvars so we can program a blank SPROM/OTP.
*/
if (err) {
char *value;
u32 val;
val = 0;
+ BS_ERROR(("Neither SPROM nor OTP has valid image\n"));
value = si_getdevpathvar(sih, "sromrev");
if (value) {
sromrev = (u8) simple_strtoul(value, NULL, 0);
/* read variables from flash */
if (flash) {
- err = initvars_flash(sih, osh, &vp, MAXSZ_NVRAM_VARS);
+ err = initvars_flash(sih, &vp, MAXSZ_NVRAM_VARS);
if (err)
goto errout;
goto varsdone;
ASSERT((vp - base) <= MAXSZ_NVRAM_VARS);
varsdone:
- err = initvars_table(osh, base, vp, vars, count);
+ err = initvars_table(base, vp, vars, count);
errout:
if (base)
* Read the SDIO cis and call parsecis to initialize the vars.
* Return 0 on success, nonzero on error.
*/
-static int initvars_cis_sdio(struct osl_info *osh, char **vars, uint *count)
+static int initvars_cis_sdio(char **vars, uint *count)
{
u8 *cis[SBSDIO_NUM_FUNCTION + 1];
uint fn, numfn;
}
if (!rc)
- rc = srom_parsecis(osh, cis, fn, vars, count);
+ rc = srom_parsecis(cis, fn, vars, count);
while (fn-- > 0)
kfree(cis[fn]);
}
/* set SDIO sprom command register */
-static int sprom_cmd_sdio(struct osl_info *osh, u8 cmd)
+static int sprom_cmd_sdio(u8 cmd)
{
u8 status = 0;
uint wait_cnt = 1000;
}
/* read a word from the SDIO srom */
-static int sprom_read_sdio(struct osl_info *osh, u16 addr, u16 *data)
+static int sprom_read_sdio(u16 addr, u16 *data)
{
u8 addr_l, addr_h, data_l, data_h;
NULL);
/* do read */
- if (sprom_cmd_sdio(osh, SBSDIO_SPROM_READ))
+ if (sprom_cmd_sdio(SBSDIO_SPROM_READ))
return 1;
/* read data */
}
#endif /* BCMSDIO */
-static int initvars_srom_si(si_t *sih, struct osl_info *osh, void *curmap,
- char **vars, uint *varsz)
+static int initvars_srom_si(si_t *sih, void *curmap, char **vars, uint *varsz)
{
/* Search flash nvram section for srom variables */
return initvars_flash_si(sih, vars, varsz);