]> Pileus Git - ~andy/linux/blobdiff - drivers/ssb/pci.c
Merge branch 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa...
[~andy/linux] / drivers / ssb / pci.c
index e9d94968f394579af2527c572168be945c12ac3d..a8dc95ebf2d605a8a774c6b05b9287dfaa3b7846 100644 (file)
@@ -56,7 +56,7 @@ int ssb_pci_switch_coreidx(struct ssb_bus *bus, u8 coreidx)
        }
        return 0;
 error:
-       ssb_printk(KERN_ERR PFX "Failed to switch to core %u\n", coreidx);
+       ssb_err("Failed to switch to core %u\n", coreidx);
        return -ENODEV;
 }
 
@@ -67,10 +67,9 @@ int ssb_pci_switch_core(struct ssb_bus *bus,
        unsigned long flags;
 
 #if SSB_VERBOSE_PCICORESWITCH_DEBUG
-       ssb_printk(KERN_INFO PFX
-                  "Switching to %s core, index %d\n",
-                  ssb_core_name(dev->id.coreid),
-                  dev->core_index);
+       ssb_info("Switching to %s core, index %d\n",
+                ssb_core_name(dev->id.coreid),
+                dev->core_index);
 #endif
 
        spin_lock_irqsave(&bus->bar_lock, flags);
@@ -231,6 +230,15 @@ static inline u8 ssb_crc8(u8 crc, u8 data)
        return t[crc ^ data];
 }
 
+static void sprom_get_mac(char *mac, const u16 *in)
+{
+       int i;
+       for (i = 0; i < 3; i++) {
+               *mac++ = in[i] >> 8;
+               *mac++ = in[i];
+       }
+}
+
 static u8 ssb_sprom_crc(const u16 *sprom, u16 size)
 {
        int word;
@@ -278,7 +286,7 @@ static int sprom_do_write(struct ssb_bus *bus, const u16 *sprom)
        u32 spromctl;
        u16 size = bus->sprom_size;
 
-       ssb_printk(KERN_NOTICE PFX "Writing SPROM. Do NOT turn off the power! Please stand by...\n");
+       ssb_notice("Writing SPROM. Do NOT turn off the power! Please stand by...\n");
        err = pci_read_config_dword(pdev, SSB_SPROMCTL, &spromctl);
        if (err)
                goto err_ctlreg;
@@ -286,17 +294,17 @@ static int sprom_do_write(struct ssb_bus *bus, const u16 *sprom)
        err = pci_write_config_dword(pdev, SSB_SPROMCTL, spromctl);
        if (err)
                goto err_ctlreg;
-       ssb_printk(KERN_NOTICE PFX "[ 0%%");
+       ssb_notice("[ 0%%");
        msleep(500);
        for (i = 0; i < size; i++) {
                if (i == size / 4)
-                       ssb_printk("25%%");
+                       ssb_cont("25%%");
                else if (i == size / 2)
-                       ssb_printk("50%%");
+                       ssb_cont("50%%");
                else if (i == (size * 3) / 4)
-                       ssb_printk("75%%");
+                       ssb_cont("75%%");
                else if (i % 2)
-                       ssb_printk(".");
+                       ssb_cont(".");
                writew(sprom[i], bus->mmio + bus->sprom_offset + (i * 2));
                mmiowb();
                msleep(20);
@@ -309,12 +317,12 @@ static int sprom_do_write(struct ssb_bus *bus, const u16 *sprom)
        if (err)
                goto err_ctlreg;
        msleep(500);
-       ssb_printk("100%% ]\n");
-       ssb_printk(KERN_NOTICE PFX "SPROM written.\n");
+       ssb_cont("100%% ]\n");
+       ssb_notice("SPROM written\n");
 
        return 0;
 err_ctlreg:
-       ssb_printk(KERN_ERR PFX "Could not access SPROM control register.\n");
+       ssb_err("Could not access SPROM control register.\n");
        return err;
 }
 
@@ -339,10 +347,23 @@ static s8 r123_extract_antgain(u8 sprom_revision, const u16 *in,
        return (s8)gain;
 }
 
+static void sprom_extract_r23(struct ssb_sprom *out, const u16 *in)
+{
+       SPEX(boardflags_hi, SSB_SPROM2_BFLHI, 0xFFFF, 0);
+       SPEX(opo, SSB_SPROM2_OPO, SSB_SPROM2_OPO_VALUE, 0);
+       SPEX(pa1lob0, SSB_SPROM2_PA1LOB0, 0xFFFF, 0);
+       SPEX(pa1lob1, SSB_SPROM2_PA1LOB1, 0xFFFF, 0);
+       SPEX(pa1lob2, SSB_SPROM2_PA1LOB2, 0xFFFF, 0);
+       SPEX(pa1hib0, SSB_SPROM2_PA1HIB0, 0xFFFF, 0);
+       SPEX(pa1hib1, SSB_SPROM2_PA1HIB1, 0xFFFF, 0);
+       SPEX(pa1hib2, SSB_SPROM2_PA1HIB2, 0xFFFF, 0);
+       SPEX(maxpwr_ah, SSB_SPROM2_MAXP_A, SSB_SPROM2_MAXP_A_HI, 0);
+       SPEX(maxpwr_al, SSB_SPROM2_MAXP_A, SSB_SPROM2_MAXP_A_LO,
+            SSB_SPROM2_MAXP_A_LO_SHIFT);
+}
+
 static void sprom_extract_r123(struct ssb_sprom *out, const u16 *in)
 {
-       int i;
-       u16 v;
        u16 loc[3];
 
        if (out->revision == 3)                 /* rev 3 moved MAC */
@@ -352,19 +373,10 @@ static void sprom_extract_r123(struct ssb_sprom *out, const u16 *in)
                loc[1] = SSB_SPROM1_ET0MAC;
                loc[2] = SSB_SPROM1_ET1MAC;
        }
-       for (i = 0; i < 3; i++) {
-               v = in[SPOFF(loc[0]) + i];
-               *(((__be16 *)out->il0mac) + i) = cpu_to_be16(v);
-       }
+       sprom_get_mac(out->il0mac, &in[SPOFF(loc[0])]);
        if (out->revision < 3) {        /* only rev 1-2 have et0, et1 */
-               for (i = 0; i < 3; i++) {
-                       v = in[SPOFF(loc[1]) + i];
-                       *(((__be16 *)out->et0mac) + i) = cpu_to_be16(v);
-               }
-               for (i = 0; i < 3; i++) {
-                       v = in[SPOFF(loc[2]) + i];
-                       *(((__be16 *)out->et1mac) + i) = cpu_to_be16(v);
-               }
+               sprom_get_mac(out->et0mac, &in[SPOFF(loc[1])]);
+               sprom_get_mac(out->et1mac, &in[SPOFF(loc[2])]);
        }
        SPEX(et0phyaddr, SSB_SPROM1_ETHPHY, SSB_SPROM1_ETHPHY_ET0A, 0);
        SPEX(et1phyaddr, SSB_SPROM1_ETHPHY, SSB_SPROM1_ETHPHY_ET1A,
@@ -372,6 +384,7 @@ static void sprom_extract_r123(struct ssb_sprom *out, const u16 *in)
        SPEX(et0mdcport, SSB_SPROM1_ETHPHY, SSB_SPROM1_ETHPHY_ET0M, 14);
        SPEX(et1mdcport, SSB_SPROM1_ETHPHY, SSB_SPROM1_ETHPHY_ET1M, 15);
        SPEX(board_rev, SSB_SPROM1_BINF, SSB_SPROM1_BINF_BREV, 0);
+       SPEX(board_type, SSB_SPROM1_SPID, 0xFFFF, 0);
        if (out->revision == 1)
                SPEX(country_code, SSB_SPROM1_BINF, SSB_SPROM1_BINF_CCODE,
                     SSB_SPROM1_BINF_CCODE_SHIFT);
@@ -398,8 +411,7 @@ static void sprom_extract_r123(struct ssb_sprom *out, const u16 *in)
             SSB_SPROM1_ITSSI_A_SHIFT);
        SPEX(itssi_bg, SSB_SPROM1_ITSSI, SSB_SPROM1_ITSSI_BG, 0);
        SPEX(boardflags_lo, SSB_SPROM1_BFLLO, 0xFFFF, 0);
-       if (out->revision >= 2)
-               SPEX(boardflags_hi, SSB_SPROM2_BFLHI, 0xFFFF, 0);
+
        SPEX(alpha2[0], SSB_SPROM1_CCODE, 0xff00, 8);
        SPEX(alpha2[1], SSB_SPROM1_CCODE, 0x00ff, 0);
 
@@ -410,6 +422,8 @@ static void sprom_extract_r123(struct ssb_sprom *out, const u16 *in)
        out->antenna_gain.a1 = r123_extract_antgain(out->revision, in,
                                                    SSB_SPROM1_AGAIN_A,
                                                    SSB_SPROM1_AGAIN_A_SHIFT);
+       if (out->revision >= 2)
+               sprom_extract_r23(out, in);
 }
 
 /* Revs 4 5 and 8 have partially shared layout */
@@ -454,23 +468,20 @@ static void sprom_extract_r458(struct ssb_sprom *out, const u16 *in)
 
 static void sprom_extract_r45(struct ssb_sprom *out, const u16 *in)
 {
-       int i;
-       u16 v;
        u16 il0mac_offset;
 
        if (out->revision == 4)
                il0mac_offset = SSB_SPROM4_IL0MAC;
        else
                il0mac_offset = SSB_SPROM5_IL0MAC;
-       /* extract the MAC address */
-       for (i = 0; i < 3; i++) {
-               v = in[SPOFF(il0mac_offset) + i];
-               *(((__be16 *)out->il0mac) + i) = cpu_to_be16(v);
-       }
+
+       sprom_get_mac(out->il0mac, &in[SPOFF(il0mac_offset)]);
+
        SPEX(et0phyaddr, SSB_SPROM4_ETHPHY, SSB_SPROM4_ETHPHY_ET0A, 0);
        SPEX(et1phyaddr, SSB_SPROM4_ETHPHY, SSB_SPROM4_ETHPHY_ET1A,
             SSB_SPROM4_ETHPHY_ET1A_SHIFT);
        SPEX(board_rev, SSB_SPROM4_BOARDREV, 0xFFFF, 0);
+       SPEX(board_type, SSB_SPROM1_SPID, 0xFFFF, 0);
        if (out->revision == 4) {
                SPEX(alpha2[0], SSB_SPROM4_CCODE, 0xff00, 8);
                SPEX(alpha2[1], SSB_SPROM4_CCODE, 0x00ff, 0);
@@ -530,7 +541,7 @@ static void sprom_extract_r45(struct ssb_sprom *out, const u16 *in)
 static void sprom_extract_r8(struct ssb_sprom *out, const u16 *in)
 {
        int i;
-       u16 v, o;
+       u16 o;
        u16 pwr_info_offset[] = {
                SSB_SROM8_PWR_INFO_CORE0, SSB_SROM8_PWR_INFO_CORE1,
                SSB_SROM8_PWR_INFO_CORE2, SSB_SROM8_PWR_INFO_CORE3
@@ -539,11 +550,10 @@ static void sprom_extract_r8(struct ssb_sprom *out, const u16 *in)
                        ARRAY_SIZE(out->core_pwr_info));
 
        /* extract the MAC address */
-       for (i = 0; i < 3; i++) {
-               v = in[SPOFF(SSB_SPROM8_IL0MAC) + i];
-               *(((__be16 *)out->il0mac) + i) = cpu_to_be16(v);
-       }
+       sprom_get_mac(out->il0mac, &in[SPOFF(SSB_SPROM8_IL0MAC)]);
+
        SPEX(board_rev, SSB_SPROM8_BOARDREV, 0xFFFF, 0);
+       SPEX(board_type, SSB_SPROM1_SPID, 0xFFFF, 0);
        SPEX(alpha2[0], SSB_SPROM8_CCODE, 0xff00, 8);
        SPEX(alpha2[1], SSB_SPROM8_CCODE, 0x00ff, 0);
        SPEX(boardflags_lo, SSB_SPROM8_BFLLO, 0xFFFF, 0);
@@ -743,7 +753,7 @@ static int sprom_extract(struct ssb_bus *bus, struct ssb_sprom *out,
        memset(out, 0, sizeof(*out));
 
        out->revision = in[size - 1] & 0x00FF;
-       ssb_dprintk(KERN_DEBUG PFX "SPROM revision %d detected.\n", out->revision);
+       ssb_dbg("SPROM revision %d detected\n", out->revision);
        memset(out->et0mac, 0xFF, 6);           /* preset et0 and et1 mac */
        memset(out->et1mac, 0xFF, 6);
 
@@ -752,7 +762,7 @@ static int sprom_extract(struct ssb_bus *bus, struct ssb_sprom *out,
                 * number stored in the SPROM.
                 * Always extract r1. */
                out->revision = 1;
-               ssb_dprintk(KERN_DEBUG PFX "SPROM treated as revision %d\n", out->revision);
+               ssb_dbg("SPROM treated as revision %d\n", out->revision);
        }
 
        switch (out->revision) {
@@ -769,9 +779,8 @@ static int sprom_extract(struct ssb_bus *bus, struct ssb_sprom *out,
                sprom_extract_r8(out, in);
                break;
        default:
-               ssb_printk(KERN_WARNING PFX "Unsupported SPROM"
-                          " revision %d detected. Will extract"
-                          " v1\n", out->revision);
+               ssb_warn("Unsupported SPROM revision %d detected. Will extract v1\n",
+                        out->revision);
                out->revision = 1;
                sprom_extract_r123(out, in);
        }
@@ -791,7 +800,7 @@ static int ssb_pci_sprom_get(struct ssb_bus *bus,
        u16 *buf;
 
        if (!ssb_is_sprom_available(bus)) {
-               ssb_printk(KERN_ERR PFX "No SPROM available!\n");
+               ssb_err("No SPROM available!\n");
                return -ENODEV;
        }
        if (bus->chipco.dev) {  /* can be unavailable! */
@@ -810,7 +819,7 @@ static int ssb_pci_sprom_get(struct ssb_bus *bus,
        } else {
                bus->sprom_offset = SSB_SPROM_BASE1;
        }
-       ssb_dprintk(KERN_INFO PFX "SPROM offset is 0x%x\n", bus->sprom_offset);
+       ssb_dbg("SPROM offset is 0x%x\n", bus->sprom_offset);
 
        buf = kcalloc(SSB_SPROMSIZE_WORDS_R123, sizeof(u16), GFP_KERNEL);
        if (!buf)
@@ -835,18 +844,15 @@ static int ssb_pci_sprom_get(struct ssb_bus *bus,
                         * available for this device in some other storage */
                        err = ssb_fill_sprom_with_fallback(bus, sprom);
                        if (err) {
-                               ssb_printk(KERN_WARNING PFX "WARNING: Using"
-                                          " fallback SPROM failed (err %d)\n",
-                                          err);
+                               ssb_warn("WARNING: Using fallback SPROM failed (err %d)\n",
+                                        err);
                        } else {
-                               ssb_dprintk(KERN_DEBUG PFX "Using SPROM"
-                                           " revision %d provided by"
-                                           " platform.\n", sprom->revision);
+                               ssb_dbg("Using SPROM revision %d provided by platform\n",
+                                       sprom->revision);
                                err = 0;
                                goto out_free;
                        }
-                       ssb_printk(KERN_WARNING PFX "WARNING: Invalid"
-                                  " SPROM CRC (corrupt SPROM)\n");
+                       ssb_warn("WARNING: Invalid SPROM CRC (corrupt SPROM)\n");
                }
        }
        err = sprom_extract(bus, sprom, buf, bus->sprom_size);