b43: N-PHY: add RF power tables for radio 0x2057 revs 9 & 14
authorRafał Miłecki <zajec5@gmail.com>
Thu, 31 Jul 2014 19:59:46 +0000 (21:59 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 25 Aug 2014 20:00:43 +0000 (16:00 -0400)
Don't write them as we don't have gains configured correctly yet.

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/b43/phy_n.c
drivers/net/wireless/b43/tables_nphy.c
drivers/net/wireless/b43/tables_nphy.h

index df64032..57a3ab2 100644 (file)
@@ -4235,8 +4235,9 @@ static void b43_nphy_tx_gain_table_upload(struct b43_wldev *dev)
 
        const u32 *table = NULL;
        u32 rfpwr_offset;
-       u8 pga_gain;
+       u8 pga_gain, pad_gain;
        int i;
+       const s16 *uninitialized_var(rf_pwr_offset_table);
 
        table = b43_nphy_get_tx_gain_table(dev);
        if (!table)
@@ -4252,13 +4253,27 @@ static void b43_nphy_tx_gain_table_upload(struct b43_wldev *dev)
        nphy->gmval = (table[0] >> 16) & 0x7000;
 #endif
 
+       if (phy->rev >= 19) {
+               return;
+       } else if (phy->rev >= 7) {
+               rf_pwr_offset_table = b43_ntab_get_rf_pwr_offset_table(dev);
+               if (!rf_pwr_offset_table)
+                       return;
+               /* TODO: Enable this once we have gains configured */
+               return;
+       }
+
        for (i = 0; i < 128; i++) {
                if (phy->rev >= 19) {
                        /* TODO */
                        return;
                } else if (phy->rev >= 7) {
-                       /* TODO */
-                       return;
+                       pga_gain = (table[i] >> 24) & 0xf;
+                       pad_gain = (table[i] >> 19) & 0x1f;
+                       if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ)
+                               rfpwr_offset = rf_pwr_offset_table[pad_gain];
+                       else
+                               rfpwr_offset = rf_pwr_offset_table[pga_gain];
                } else {
                        pga_gain = (table[i] >> 24) & 0xF;
                        if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ)
index f449cff..25d1cbd 100644 (file)
@@ -2878,6 +2878,40 @@ const s8 b43_ntab_papd_pga_gain_delta_ipa_2g[] = {
        -54, -46, -39, -31, -23, -15, -8, 0
 };
 
+/* Extracted from MMIO dump of 6.30.223.248
+ * Entries: 0, 15, 17, 21, 24, 26, 27, 29, 30 were guessed
+ */
+static const s16 b43_ntab_rf_pwr_offset_2057_rev9_2g[] = {
+       -133, -133, -107, -92, -81,
+       -73, -66, -61, -56, -52,
+       -48, -44, -41, -37, -34,
+       -31, -28, -25, -22, -19,
+       -17, -14, -12, -10, -9,
+       -7, -5, -4, -3, -2,
+       -1, 0,
+};
+
+/* Extracted from MMIO dump of 6.30.223.248 */
+static const s16 b43_ntab_rf_pwr_offset_2057_rev9_5g[] = {
+       -101, -94, -86, -79, -72,
+       -65, -57, -50, -42, -35,
+       -28, -21, -16, -9, -4,
+       0,
+};
+
+/* Extracted from MMIO dump of 6.30.223.248
+ * Entries: 0, 26, 28, 29, 30, 31 were guessed
+ */
+static const s16 b43_ntab_rf_pwr_offset_2057_rev14_2g[] = {
+       -111, -111, -111, -84, -70,
+       -59, -52, -45, -40, -36,
+       -32, -29, -26, -23, -21,
+       -18, -16, -15, -13, -11,
+       -10, -8, -7, -6, -5,
+       -4, -4, -3, -3, -2,
+       -2, -1,
+};
+
 const u16 tbl_iqcal_gainparams[2][9][8] = {
        {
                { 0x000, 0, 0, 2, 0x69, 0x69, 0x69, 0x69 },
@@ -3708,6 +3742,39 @@ const u32 *b43_nphy_get_tx_gain_table(struct b43_wldev *dev)
        }
 }
 
+const s16 *b43_ntab_get_rf_pwr_offset_table(struct b43_wldev *dev)
+{
+       struct b43_phy *phy = &dev->phy;
+
+       if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) {
+               switch (phy->rev) {
+               case 17:
+                       if (phy->radio_rev == 14)
+                               return b43_ntab_rf_pwr_offset_2057_rev14_2g;
+                       break;
+               case 16:
+                       if (phy->radio_rev == 9)
+                               return b43_ntab_rf_pwr_offset_2057_rev9_2g;
+                       break;
+               }
+
+               b43err(dev->wl,
+                      "No 2GHz RF power table available for this device\n");
+               return NULL;
+       } else {
+               switch (phy->rev) {
+               case 16:
+                       if (phy->radio_rev == 9)
+                               return b43_ntab_rf_pwr_offset_2057_rev9_5g;
+                       break;
+               }
+
+               b43err(dev->wl,
+                      "No 5GHz RF power table available for this device\n");
+               return NULL;
+       }
+}
+
 struct nphy_gain_ctl_workaround_entry *b43_nphy_get_gain_ctl_workaround_ent(
        struct b43_wldev *dev, bool ghz5, bool ext_lna)
 {
index 3ce2e6f..b51f386 100644 (file)
@@ -191,6 +191,8 @@ void b43_nphy_tables_init(struct b43_wldev *dev);
 
 const u32 *b43_nphy_get_tx_gain_table(struct b43_wldev *dev);
 
+const s16 *b43_ntab_get_rf_pwr_offset_table(struct b43_wldev *dev);
+
 extern const s8 b43_ntab_papd_pga_gain_delta_ipa_2g[];
 
 extern const u16 tbl_iqcal_gainparams[2][9][8];