Merge branch 'nfs-for-2.6.39' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / staging / brcm80211 / util / bcmsrom.c
index 19d45026a5ee159265310ff174a20eaa6c8f08e6..eca35b94e96c961a694773f9d518255afe8a88d3 100644 (file)
@@ -17,7 +17,6 @@
 #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>
@@ -25,7 +24,6 @@
 #include <hndsoc.h>
 #include <sbchipc.h>
 #include <bcmdevs.h>
-#include <bcmendian.h>
 #include <pcicfg.h>
 #include <siutils.h>
 #include <bcmsrom.h>
@@ -44,7 +42,7 @@
 #include <sbsdpcmdev.h>
 #endif
 
-#include <proto/ethernet.h>    /* for sprom content groking */
+#include <linux/if_ether.h>
 
 #define        BS_ERROR(args)
 
@@ -68,29 +66,26 @@ extern uint _varsz;
 
 #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 */
@@ -158,7 +153,7 @@ static int varbuf_append(varbuf_t *b, const char *fmt, ...)
  * 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;
@@ -175,7 +170,7 @@ int srom_var_init(si_t *sih, uint bustype, void *curmap, struct osl_info *osh,
        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);
@@ -186,7 +181,7 @@ int srom_var_init(si_t *sih, uint bustype, void *curmap, struct osl_info *osh,
 
 #ifdef BCMSDIO
        case SDIO_BUS:
-               return initvars_cis_sdio(osh, vars, count);
+               return initvars_cis_sdio(vars, count);
 #endif                         /* BCMSDIO */
 
        default:
@@ -197,7 +192,7 @@ int srom_var_init(si_t *sih, uint bustype, void *curmap, struct osl_info *osh,
 
 /* 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;
@@ -226,12 +221,12 @@ srom_read(si_t *sih, uint bustype, void *curmap, struct osl_info *osh,
                                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
@@ -241,7 +236,7 @@ srom_read(si_t *sih, uint bustype, void *curmap, struct osl_info *osh,
                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 */
@@ -379,7 +374,7 @@ u8 patch_pair;
 /* 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];
@@ -1336,8 +1331,8 @@ int srom_parsecis(struct osl_info *osh, u8 *pcis[], uint ciscnt, char **vars,
                                                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);
@@ -1399,7 +1394,7 @@ int srom_parsecis(struct osl_info *osh, u8 *pcis[], uint ciscnt, char **vars,
        *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;
@@ -1409,22 +1404,22 @@ int srom_parsecis(struct osl_info *osh, u8 *pcis[], uint ciscnt, char **vars,
  * 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;
        }
 
@@ -1433,17 +1428,29 @@ srom_cc_cmd(si_t *sih, struct osl_info *osh, void *ccregs, u32 cmd,
                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;
@@ -1460,14 +1467,14 @@ sprom_read_pci(struct osl_info *osh, si_t *sih, u16 *sprom, uint wordoff,
 
                        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]);
                }
 
        }
@@ -1503,7 +1510,7 @@ sprom_read_pci(struct osl_info *osh, si_t *sih, u16 *sprom, uint wordoff,
 }
 
 #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 */
@@ -1518,10 +1525,9 @@ static int otp_read_pci(struct osl_info *osh, si_t *sih, u16 *buf, uint bufsz)
 
        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) {
@@ -1551,7 +1557,7 @@ static int otp_read_pci(struct osl_info *osh, si_t *sih, u16 *buf, uint bufsz)
 * 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);
@@ -1562,7 +1568,7 @@ static int initvars_table(struct osl_info *osh, char *start, char *end,
                ASSERT(vp != NULL);
                if (!vp)
                        return BCME_NOMEM;
-               bcopy(start, vp, c);
+               memcpy(vp, start, c);
                *vars = vp;
                *count = c;
        } else {
@@ -1578,8 +1584,7 @@ static int initvars_table(struct osl_info *osh, char *start, char *end,
  * 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;
@@ -1639,7 +1644,6 @@ static int initvars_flash(si_t *sih, struct osl_info *osh, char **base,
  */
 static int initvars_flash_si(si_t *sih, char **vars, uint *count)
 {
-       struct osl_info *osh = si_osh(sih);
        char *vp, *base;
        int err;
 
@@ -1651,9 +1655,9 @@ static int initvars_flash_si(si_t *sih, char **vars, uint *count)
        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);
 
@@ -1725,16 +1729,16 @@ static void _initvars_srom_pci(u8 sromrev, u16 *srom, uint off, varbuf_t *b)
                        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));
@@ -1850,7 +1854,6 @@ static int initvars_srom_pci(si_t *sih, void *curmap, char **vars, uint *count)
        u32 sr;
        varbuf_t b;
        char *vp, *base = NULL;
-       struct osl_info *osh = si_osh(sih);
        bool flash = false;
        int err = 0;
 
@@ -1868,7 +1871,7 @@ static int initvars_srom_pci(si_t *sih, void *curmap, char **vars, uint *count)
        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) ||
@@ -1878,7 +1881,7 @@ static int initvars_srom_pci(si_t *sih, void *curmap, char **vars, uint *count)
                         && (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)
@@ -1896,24 +1899,29 @@ static int initvars_srom_pci(si_t *sih, void *curmap, char **vars, uint *count)
        }
 #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);
@@ -1957,7 +1965,7 @@ static int initvars_srom_pci(si_t *sih, void *curmap, char **vars, uint *count)
 
        /* 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;
@@ -1976,7 +1984,7 @@ static int initvars_srom_pci(si_t *sih, void *curmap, char **vars, uint *count)
        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)
@@ -1991,7 +1999,7 @@ static int initvars_srom_pci(si_t *sih, void *curmap, char **vars, uint *count)
  * 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;
@@ -2016,7 +2024,7 @@ static int initvars_cis_sdio(struct osl_info *osh, char **vars, uint *count)
        }
 
        if (!rc)
-               rc = srom_parsecis(osh, cis, fn, vars, count);
+               rc = srom_parsecis(cis, fn, vars, count);
 
        while (fn-- > 0)
                kfree(cis[fn]);
@@ -2025,7 +2033,7 @@ static int initvars_cis_sdio(struct osl_info *osh, char **vars, uint *count)
 }
 
 /* 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;
@@ -2045,7 +2053,7 @@ static int sprom_cmd_sdio(struct osl_info *osh, u8 cmd)
 }
 
 /* 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;
 
@@ -2059,7 +2067,7 @@ static int sprom_read_sdio(struct osl_info *osh, u16 addr, u16 *data)
                         NULL);
 
        /* do read */
-       if (sprom_cmd_sdio(osh, SBSDIO_SPROM_READ))
+       if (sprom_cmd_sdio(SBSDIO_SPROM_READ))
                return 1;
 
        /* read data */
@@ -2073,8 +2081,7 @@ static int sprom_read_sdio(struct osl_info *osh, u16 addr, u16 *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);