]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/wireless/b43/wa.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/agk/linux-2.6-dm
[linux-2.6-omap-h63xx.git] / drivers / net / wireless / b43 / wa.c
index b3df1ba0e544e67f758b6984505098cb654d9fd0..daa94211f8388c7d1e1945317daaff3d44904623 100644 (file)
@@ -123,17 +123,24 @@ static void b43_wa_rssi_lt(struct b43_wldev *dev) /* RSSI lookup table */
 {
        int i;
 
-       for (i = 0; i < 8; i++)
-               b43_ofdmtab_write16(dev, B43_OFDMTAB_RSSI, i, i + 8);
-       for (i = 8; i < 16; i++)
-               b43_ofdmtab_write16(dev, B43_OFDMTAB_RSSI, i, i - 8);
+       if (0 /* FIXME: For APHY.rev=2 this might be needed */) {
+               for (i = 0; i < 8; i++)
+                       b43_ofdmtab_write16(dev, B43_OFDMTAB_RSSI, i, i + 8);
+               for (i = 8; i < 16; i++)
+                       b43_ofdmtab_write16(dev, B43_OFDMTAB_RSSI, i, i - 8);
+       } else {
+               for (i = 0; i < 64; i++)
+                       b43_ofdmtab_write16(dev, B43_OFDMTAB_RSSI, i, i);
+       }
 }
 
 static void b43_wa_analog(struct b43_wldev *dev)
 {
        struct b43_phy *phy = &dev->phy;
+       u16 ofdmrev;
 
-       if (phy->analog > 2) {
+       ofdmrev = b43_phy_read(dev, B43_PHY_VERSION_OFDM) & B43_PHYVER_VERSION;
+       if (ofdmrev > 2) {
                if (phy->type == B43_PHYTYPE_A)
                        b43_phy_write(dev, B43_PHY_PWRDOWN, 0x1808);
                else
@@ -197,42 +204,43 @@ static void b43_wa_rt(struct b43_wldev *dev) /* Rotor table */
                b43_ofdmtab_write32(dev, B43_OFDMTAB_ROTOR, i, b43_tab_rotor[i]);
 }
 
+static void b43_write_null_nst(struct b43_wldev *dev)
+{
+       int i;
+
+       for (i = 0; i < B43_TAB_NOISESCALE_SIZE; i++)
+               b43_ofdmtab_write16(dev, B43_OFDMTAB_NOISESCALE, i, 0);
+}
+
+static void b43_write_nst(struct b43_wldev *dev, const u16 *nst)
+{
+       int i;
+
+       for (i = 0; i < B43_TAB_NOISESCALE_SIZE; i++)
+               b43_ofdmtab_write16(dev, B43_OFDMTAB_NOISESCALE, i, nst[i]);
+}
+
 static void b43_wa_nst(struct b43_wldev *dev) /* Noise scale table */
 {
        struct b43_phy *phy = &dev->phy;
-       int i;
 
        if (phy->type == B43_PHYTYPE_A) {
                if (phy->rev <= 1)
-                       for (i = 0; i < B43_TAB_NOISESCALE_SIZE; i++)
-                               b43_ofdmtab_write16(dev, B43_OFDMTAB_NOISESCALE,
-                                                       i, 0);
+                       b43_write_null_nst(dev);
                else if (phy->rev == 2)
-                       for (i = 0; i < B43_TAB_NOISESCALE_SIZE; i++)
-                               b43_ofdmtab_write16(dev, B43_OFDMTAB_NOISESCALE,
-                                                       i, b43_tab_noisescalea2[i]);
+                       b43_write_nst(dev, b43_tab_noisescalea2);
                else if (phy->rev == 3)
-                       for (i = 0; i < B43_TAB_NOISESCALE_SIZE; i++)
-                               b43_ofdmtab_write16(dev, B43_OFDMTAB_NOISESCALE,
-                                                       i, b43_tab_noisescalea3[i]);
+                       b43_write_nst(dev, b43_tab_noisescalea3);
                else
-                       for (i = 0; i < B43_TAB_NOISESCALE_SIZE; i++)
-                               b43_ofdmtab_write16(dev, B43_OFDMTAB_NOISESCALE,
-                                                       i, b43_tab_noisescaleg3[i]);
+                       b43_write_nst(dev, b43_tab_noisescaleg3);
        } else {
                if (phy->rev >= 6) {
                        if (b43_phy_read(dev, B43_PHY_ENCORE) & B43_PHY_ENCORE_EN)
-                               for (i = 0; i < B43_TAB_NOISESCALE_SIZE; i++)
-                                       b43_ofdmtab_write16(dev, B43_OFDMTAB_NOISESCALE,
-                                               i, b43_tab_noisescaleg3[i]);
+                               b43_write_nst(dev, b43_tab_noisescaleg3);
                        else
-                               for (i = 0; i < B43_TAB_NOISESCALE_SIZE; i++)
-                                       b43_ofdmtab_write16(dev, B43_OFDMTAB_NOISESCALE,
-                                               i, b43_tab_noisescaleg2[i]);
+                               b43_write_nst(dev, b43_tab_noisescaleg2);
                } else {
-                       for (i = 0; i < B43_TAB_NOISESCALE_SIZE; i++)
-                               b43_ofdmtab_write16(dev, B43_OFDMTAB_NOISESCALE,
-                                                       i, b43_tab_noisescaleg1[i]);
+                       b43_write_nst(dev, b43_tab_noisescaleg1);
                }
        }
 }
@@ -306,16 +314,16 @@ static void b43_wa_crs_ed(struct b43_wldev *dev)
        struct b43_phy *phy = &dev->phy;
 
        if (phy->rev == 1) {
-               b43_phy_write(dev, B43_PHY_CRSTHRES1, 0x4F19);
+               b43_phy_write(dev, B43_PHY_CRSTHRES1_R1, 0x4F19);
        } else if (phy->rev == 2) {
-               b43_phy_write(dev, B43_PHY_CRSTHRES1_R1, 0x1861);
-               b43_phy_write(dev, B43_PHY_CRSTHRES2_R1, 0x1861);
+               b43_phy_write(dev, B43_PHY_CRSTHRES1, 0x1861);
+               b43_phy_write(dev, B43_PHY_CRSTHRES2, 0x0271);
                b43_phy_write(dev, B43_PHY_ANTDWELL,
                                  b43_phy_read(dev, B43_PHY_ANTDWELL)
                                  | 0x0800);
        } else {
-               b43_phy_write(dev, B43_PHY_CRSTHRES1_R1, 0x0098);
-               b43_phy_write(dev, B43_PHY_CRSTHRES2_R1, 0x0070);
+               b43_phy_write(dev, B43_PHY_CRSTHRES1, 0x0098);
+               b43_phy_write(dev, B43_PHY_CRSTHRES2, 0x0070);
                b43_phy_write(dev, B43_PHY_OFDM(0xC9), 0x0080);
                b43_phy_write(dev, B43_PHY_ANTDWELL,
                                  b43_phy_read(dev, B43_PHY_ANTDWELL)
@@ -441,7 +449,7 @@ static void b43_wa_altagc(struct b43_wldev *dev)
                }
        }
        b43_phy_write(dev, B43_PHY_DIVSRCHIDX,
-               (b43_phy_read(dev, B43_PHY_DIVSRCHIDX) & 0x7F7F) | 0x7874);
+               (b43_phy_read(dev, B43_PHY_DIVSRCHIDX) & 0x8080) | 0x7874);
        b43_phy_write(dev, B43_PHY_OFDM(0x8E), 0x1C00);
        if (phy->rev == 1) {
                b43_phy_write(dev, B43_PHY_DIVP1P2GAIN,
@@ -466,6 +474,7 @@ static void b43_wa_altagc(struct b43_wldev *dev)
                b43_phy_write(dev, B43_PHY_OFDM(0x26),
                        b43_phy_read(dev, B43_PHY_OFDM(0x26)) & ~0x1000);
        }
+       b43_phy_read(dev, B43_PHY_VERSION_OFDM); /* Dummy read */
 }
 
 static void b43_wa_tr_ltov(struct b43_wldev *dev) /* TR Lookup Table Original Values */
@@ -642,6 +651,7 @@ void b43_wa_all(struct b43_wldev *dev)
                case 6:
                case 7:
                case 8:
+               case 9:
                        b43_wa_tr_ltov(dev);
                        b43_wa_crs_ed(dev);
                        b43_wa_rssi_lt(dev);