Changeset 41668


Ignore:
Timestamp:
2014-07-15T23:58:03+02:00 (4 years ago)
Author:
hauke
Message:

mac80211: b43: backport b43 patches from wireless testing

This brings b43 up to wireless-testing/master master-2014-07-15

Signed-off-by: Hauke Mehrtens <hauke@…>

Location:
trunk/package/kernel/mac80211/patches
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/kernel/mac80211/patches/800-b43-backports-form-wireless-testing-master-master-20.patch

    r41593 r41668  
    11backport b43 patches from wireless testing 
    22 
    3 This brings b43 up to wireless-testing/master master-2014-07-10 
     3This brings b43 up to wireless-testing/master master-2014-07-15 
    44 
    55--- a/drivers/net/wireless/b43/main.c 
     
    1717 }; 
    1818 MODULE_DEVICE_TABLE(bcma, b43_bcma_tbl); 
    19 @@ -2201,52 +2205,82 @@ err_format: 
     19@@ -206,6 +210,9 @@ static struct ieee80211_channel b43_2ghz 
     20        CHAN2G(13, 2472, 0), 
     21        CHAN2G(14, 2484, 0), 
     22 }; 
     23+ 
     24+/* No support for the last 3 channels (12, 13, 14) */ 
     25+#define b43_2ghz_chantable_limited_size                11 
     26 #undef CHAN2G 
     27  
     28 #define CHAN4G(_channel, _flags) {                             \ 
     29@@ -331,6 +338,14 @@ static struct ieee80211_supported_band b 
     30        .n_bitrates     = b43_g_ratetable_size, 
     31 }; 
     32  
     33+static struct ieee80211_supported_band b43_band_2ghz_limited = { 
     34+       .band           = IEEE80211_BAND_2GHZ, 
     35+       .channels       = b43_2ghz_chantable, 
     36+       .n_channels     = b43_2ghz_chantable_limited_size, 
     37+       .bitrates       = b43_g_ratetable, 
     38+       .n_bitrates     = b43_g_ratetable_size, 
     39+}; 
     40+ 
     41 static void b43_wireless_core_exit(struct b43_wldev *dev); 
     42 static int b43_wireless_core_init(struct b43_wldev *dev); 
     43 static struct b43_wldev * b43_wireless_core_stop(struct b43_wldev *dev); 
     44@@ -2201,52 +2216,82 @@ err_format: 
    2045        return -EPROTO; 
    2146 } 
     
    135160        if (err) 
    136161                goto err_load; 
    137 @@ -2268,117 +2302,121 @@ static int b43_try_request_fw(struct b43 
     162@@ -2268,117 +2313,121 @@ static int b43_try_request_fw(struct b43 
    138163                goto err_load; 
    139164  
     
    321346        if (err) 
    322347                goto err_load; 
    323 @@ -3742,7 +3780,9 @@ static int b43_switch_band(struct b43_wl 
     348@@ -3742,7 +3791,9 @@ static int b43_switch_band(struct b43_wl 
    324349        b43dbg(dev->wl, "Switching to %s GHz band\n", 
    325350               band_to_string(chan->band)); 
     
    332357        phy->gmode = gmode; 
    333358        b43_phy_put_into_reset(dev); 
    334 @@ -3796,38 +3836,29 @@ static void b43_set_retry_limits(struct 
     359@@ -3796,38 +3847,29 @@ static void b43_set_retry_limits(struct 
    335360 static int b43_op_config(struct ieee80211_hw *hw, u32 changed) 
    336361 { 
     
    385410        if (changed & IEEE80211_CONF_CHANGE_RETRY_LIMITS) 
    386411                b43_set_retry_limits(dev, conf->short_frame_max_tx_count, 
    387 @@ -3836,11 +3867,6 @@ static int b43_op_config(struct ieee8021 
     412@@ -3836,11 +3878,6 @@ static int b43_op_config(struct ieee8021 
    388413        if (!changed) 
    389414                goto out_mac_enable; 
     
    397422  
    398423        /* Adjust the desired TX power level. */ 
    399 @@ -3876,12 +3902,8 @@ static int b43_op_config(struct ieee8021 
     424@@ -3876,12 +3913,8 @@ static int b43_op_config(struct ieee8021 
    400425  
    401426 out_mac_enable: 
     
    410435 } 
    411436  
    412 @@ -4307,6 +4329,7 @@ static char *b43_phy_name(struct b43_wld 
     437@@ -4307,6 +4340,7 @@ static char *b43_phy_name(struct b43_wld 
    413438 static int b43_phy_versioning(struct b43_wldev *dev) 
    414439 { 
     
    418443        u8 analog_type; 
    419444        u8 phy_type; 
    420 @@ -4321,20 +4344,20 @@ static int b43_phy_versioning(struct b43 
     445@@ -4321,23 +4355,23 @@ static int b43_phy_versioning(struct b43 
    421446        analog_type = (tmp & B43_PHYVER_ANALOG) >> B43_PHYVER_ANALOG_SHIFT; 
    422447        phy_type = (tmp & B43_PHYVER_TYPE) >> B43_PHYVER_TYPE_SHIFT; 
     
    447472 #ifdef CPTCFG_B43_PHY_N 
    448473        case B43_PHYTYPE_N: 
    449                 if (phy_rev > 9) 
    450 @@ -4372,7 +4395,15 @@ static int b43_phy_versioning(struct b43 
     474-               if (phy_rev > 9) 
     475+               if (phy_rev >= 19) 
     476                        unsupported = 1; 
     477                break; 
     478 #endif 
     479@@ -4372,7 +4406,15 @@ static int b43_phy_versioning(struct b43 
    451480                analog_type, phy_type, b43_phy_name(dev, phy_type), phy_rev); 
    452481  
     
    465494  
    466495                for (tmp = 0; tmp < 3; tmp++) { 
    467 @@ -5164,6 +5195,7 @@ static void b43_supported_bands(struct b 
     496@@ -4428,7 +4470,10 @@ static int b43_phy_versioning(struct b43 
     497                        unsupported = 1; 
     498                break; 
     499        case B43_PHYTYPE_N: 
     500-               if (radio_ver != 0x2055 && radio_ver != 0x2056) 
     501+               if (radio_ver != 0x2055 && radio_ver != 0x2056 && 
     502+                   radio_ver != 0x2057) 
     503+                       unsupported = 1; 
     504+               if (radio_ver == 0x2057 && !(radio_rev == 9)) 
     505                        unsupported = 1; 
     506                break; 
     507        case B43_PHYTYPE_LP: 
     508@@ -4447,13 +4492,13 @@ static int b43_phy_versioning(struct b43 
     509                B43_WARN_ON(1); 
     510        } 
     511        if (unsupported) { 
     512-               b43err(dev->wl, "FOUND UNSUPPORTED RADIO " 
     513-                      "(Manuf 0x%X, Version 0x%X, Revision %u)\n", 
     514+               b43err(dev->wl, 
     515+                      "FOUND UNSUPPORTED RADIO (Manuf 0x%X, ID 0x%X, Revision %u)\n", 
     516                       radio_manuf, radio_ver, radio_rev); 
     517                return -EOPNOTSUPP; 
     518        } 
     519-       b43dbg(dev->wl, "Found Radio: Manuf 0x%X, Version 0x%X, Revision %u\n", 
     520-              radio_manuf, radio_ver, radio_rev); 
     521+       b43info(dev->wl, "Found Radio: Manuf 0x%X, ID 0x%X, Revision %u\n", 
     522+               radio_manuf, radio_ver, radio_rev); 
     523  
     524        phy->radio_manuf = radio_manuf; 
     525        phy->radio_ver = radio_ver; 
     526@@ -5064,9 +5109,15 @@ static int b43_setup_bands(struct b43_wl 
     527                           bool have_2ghz_phy, bool have_5ghz_phy) 
     528 { 
     529        struct ieee80211_hw *hw = dev->wl->hw; 
     530+       struct b43_phy *phy = &dev->phy; 
     531+       bool limited_2g; 
     532+ 
     533+       /* We don't support all 2 GHz channels on some devices */ 
     534+       limited_2g = phy->radio_ver == 0x2057 && phy->radio_rev == 9; 
     535  
     536        if (have_2ghz_phy) 
     537-               hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &b43_band_2GHz; 
     538+               hw->wiphy->bands[IEEE80211_BAND_2GHZ] = limited_2g ? 
     539+                       &b43_band_2ghz_limited : &b43_band_2GHz; 
     540        if (dev->phy.type == B43_PHYTYPE_N) { 
     541                if (have_5ghz_phy) 
     542                        hw->wiphy->bands[IEEE80211_BAND_5GHZ] = &b43_band_5GHz_nphy; 
     543@@ -5164,6 +5215,7 @@ static void b43_supported_bands(struct b 
    468544 static int b43_wireless_core_attach(struct b43_wldev *dev) 
    469545 { 
     
    473549        u32 tmp; 
    474550        bool have_2ghz_phy = false, have_5ghz_phy = false; 
    475 @@ -5181,6 +5213,8 @@ static int b43_wireless_core_attach(stru 
     551@@ -5181,6 +5233,8 @@ static int b43_wireless_core_attach(stru 
    476552                goto out; 
    477553        } 
     
    482558        switch (dev->dev->bus_type) { 
    483559 #ifdef CPTCFG_B43_BCMA 
     560@@ -5214,14 +5268,16 @@ static int b43_wireless_core_attach(stru 
     561        b43_supported_bands(dev, &have_2ghz_phy, &have_5ghz_phy); 
     562  
     563        /* We don't support 5 GHz on some PHYs yet */ 
     564-       switch (dev->phy.type) { 
     565-       case B43_PHYTYPE_A: 
     566-       case B43_PHYTYPE_G: 
     567-       case B43_PHYTYPE_N: 
     568-       case B43_PHYTYPE_LP: 
     569-       case B43_PHYTYPE_HT: 
     570-               b43warn(wl, "5 GHz band is unsupported on this PHY\n"); 
     571-               have_5ghz_phy = false; 
     572+       if (have_5ghz_phy) { 
     573+               switch (dev->phy.type) { 
     574+               case B43_PHYTYPE_A: 
     575+               case B43_PHYTYPE_G: 
     576+               case B43_PHYTYPE_N: 
     577+               case B43_PHYTYPE_LP: 
     578+               case B43_PHYTYPE_HT: 
     579+                       b43warn(wl, "5 GHz band is unsupported on this PHY\n"); 
     580+                       have_5ghz_phy = false; 
     581+               } 
     582        } 
     583  
     584        if (!have_2ghz_phy && !have_5ghz_phy) { 
    484585--- a/drivers/net/wireless/b43/phy_common.c 
    485586+++ b/drivers/net/wireless/b43/phy_common.c 
     
    626727--- a/drivers/net/wireless/b43/phy_n.c 
    627728+++ b/drivers/net/wireless/b43/phy_n.c 
    628 @@ -590,7 +590,103 @@ static void b43_nphy_set_rf_sequence(str 
     729@@ -36,6 +36,7 @@ 
     730 #include "main.h" 
     731  
     732 struct nphy_txgains { 
     733+       u16 tx_lpf[2]; 
     734        u16 txgm[2]; 
     735        u16 pga[2]; 
     736        u16 pad[2]; 
     737@@ -43,6 +44,7 @@ struct nphy_txgains { 
     738 }; 
     739  
     740 struct nphy_iqcal_params { 
     741+       u16 tx_lpf; 
     742        u16 txgm; 
     743        u16 pga; 
     744        u16 pad; 
     745@@ -69,6 +71,14 @@ enum b43_nphy_rf_sequence { 
     746        B43_RFSEQ_UPDATE_GAINU, 
     747 }; 
     748  
     749+enum n_rf_ctl_over_cmd { 
     750+       N_RF_CTL_OVER_CMD_RXRF_PU = 0, 
     751+       N_RF_CTL_OVER_CMD_RX_PU = 1, 
     752+       N_RF_CTL_OVER_CMD_TX_PU = 2, 
     753+       N_RF_CTL_OVER_CMD_RX_GAIN = 3, 
     754+       N_RF_CTL_OVER_CMD_TX_GAIN = 4, 
     755+}; 
     756+ 
     757 enum n_intc_override { 
     758        N_INTC_OVERRIDE_OFF = 0, 
     759        N_INTC_OVERRIDE_TRSW = 1, 
     760@@ -140,11 +150,19 @@ ok: 
     761        b43_phy_write(dev, B43_NPHY_RFSEQMODE, seq_mode); 
     762 } 
     763  
     764+static void b43_nphy_rf_ctl_override_rev19(struct b43_wldev *dev, u16 field, 
     765+                                          u16 value, u8 core, bool off, 
     766+                                          u8 override_id) 
     767+{ 
     768+       /* TODO */ 
     769+} 
     770+ 
     771 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RFCtrlOverrideRev7 */ 
     772 static void b43_nphy_rf_ctl_override_rev7(struct b43_wldev *dev, u16 field, 
     773                                          u16 value, u8 core, bool off, 
     774                                          u8 override) 
     775 { 
     776+       struct b43_phy *phy = &dev->phy; 
     777        const struct nphy_rf_control_override_rev7 *e; 
     778        u16 en_addrs[3][2] = { 
     779                { 0x0E7, 0x0EC }, { 0x342, 0x343 }, { 0x346, 0x347 } 
     780@@ -154,6 +172,11 @@ static void b43_nphy_rf_ctl_override_rev 
     781        u16 val_addr; 
     782        u8 i; 
     783  
     784+       if (phy->rev >= 19 || phy->rev < 3) { 
     785+               B43_WARN_ON(1); 
     786+               return; 
     787+       } 
     788+ 
     789        /* Remember: we can get NULL! */ 
     790        e = b43_nphy_get_rf_ctl_over_rev7(dev, field, override); 
     791  
     792@@ -181,6 +204,50 @@ static void b43_nphy_rf_ctl_override_rev 
     793        } 
     794 } 
     795  
     796+/* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RFCtrlOverideOneToMany */ 
     797+static void b43_nphy_rf_ctl_override_one_to_many(struct b43_wldev *dev, 
     798+                                                enum n_rf_ctl_over_cmd cmd, 
     799+                                                u16 value, u8 core, bool off) 
     800+{ 
     801+       struct b43_phy *phy = &dev->phy; 
     802+       u16 tmp; 
     803+ 
     804+       B43_WARN_ON(phy->rev < 7); 
     805+ 
     806+       switch (cmd) { 
     807+       case N_RF_CTL_OVER_CMD_RXRF_PU: 
     808+               b43_nphy_rf_ctl_override_rev7(dev, 0x20, value, core, off, 1); 
     809+               b43_nphy_rf_ctl_override_rev7(dev, 0x10, value, core, off, 1); 
     810+               b43_nphy_rf_ctl_override_rev7(dev, 0x08, value, core, off, 1); 
     811+               break; 
     812+       case N_RF_CTL_OVER_CMD_RX_PU: 
     813+               b43_nphy_rf_ctl_override_rev7(dev, 0x4, value, core, off, 1); 
     814+               b43_nphy_rf_ctl_override_rev7(dev, 0x2, value, core, off, 1); 
     815+               b43_nphy_rf_ctl_override_rev7(dev, 0x1, value, core, off, 1); 
     816+               b43_nphy_rf_ctl_override_rev7(dev, 0x2, value, core, off, 2); 
     817+               b43_nphy_rf_ctl_override_rev7(dev, 0x0800, value, core, off, 1); 
     818+               break; 
     819+       case N_RF_CTL_OVER_CMD_TX_PU: 
     820+               b43_nphy_rf_ctl_override_rev7(dev, 0x4, value, core, off, 0); 
     821+               b43_nphy_rf_ctl_override_rev7(dev, 0x2, value, core, off, 1); 
     822+               b43_nphy_rf_ctl_override_rev7(dev, 0x1, value, core, off, 2); 
     823+               b43_nphy_rf_ctl_override_rev7(dev, 0x0800, value, core, off, 1); 
     824+               break; 
     825+       case N_RF_CTL_OVER_CMD_RX_GAIN: 
     826+               tmp = value & 0xFF; 
     827+               b43_nphy_rf_ctl_override_rev7(dev, 0x0800, tmp, core, off, 0); 
     828+               tmp = value >> 8; 
     829+               b43_nphy_rf_ctl_override_rev7(dev, 0x6000, tmp, core, off, 0); 
     830+               break; 
     831+       case N_RF_CTL_OVER_CMD_TX_GAIN: 
     832+               tmp = value & 0x7FFF; 
     833+               b43_nphy_rf_ctl_override_rev7(dev, 0x1000, tmp, core, off, 0); 
     834+               tmp = value >> 14; 
     835+               b43_nphy_rf_ctl_override_rev7(dev, 0x4000, tmp, core, off, 0); 
     836+               break; 
     837+       } 
     838+} 
     839+ 
     840 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RFCtrlOverride */ 
     841 static void b43_nphy_rf_ctl_override(struct b43_wldev *dev, u16 field, 
     842                                     u16 value, u8 core, bool off) 
     843@@ -264,6 +331,8 @@ static void b43_nphy_rf_ctl_intc_overrid 
     844        u16 reg, tmp, tmp2, val; 
     845        int core; 
     846  
     847+       /* TODO: What about rev19+? Revs 3+ and 7+ are a bit similar */ 
     848+ 
     849        for (core = 0; core < 2; core++) { 
     850                if ((core_sel == 1 && core != 0) || 
     851                    (core_sel == 2 && core != 1)) 
     852@@ -505,6 +574,14 @@ static void b43_nphy_stay_in_carrier_sea 
     853        } 
     854 } 
     855  
     856+/* http://bcm-v4.sipsolutions.net/PHY/N/Read_Lpf_Bw_Ctl */ 
     857+static u16 b43_nphy_read_lpf_ctl(struct b43_wldev *dev, u16 offset) 
     858+{ 
     859+       if (!offset) 
     860+               offset = b43_is_40mhz(dev) ? 0x159 : 0x154; 
     861+       return b43_ntab_read(dev, B43_NTAB16(7, offset)) & 0x7; 
     862+} 
     863+ 
     864 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/AdjustLnaGainTbl */ 
     865 static void b43_nphy_adjust_lna_gain_table(struct b43_wldev *dev) 
     866 { 
     867@@ -590,7 +667,148 @@ static void b43_nphy_set_rf_sequence(str 
    629868  * Radio 0x2057 
    630869  **************************************************/ 
     
    710949+               } 
    711950+               break; 
     951+       case 9: /* e.g. PHY rev 16 */ 
     952+               b43_radio_write(dev, R2057_LOGEN_PTAT_RESETS, 0x20); 
     953+               b43_radio_write(dev, R2057_VCOBUF_IDACS, 0x18); 
     954+               if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) { 
     955+                       b43_radio_write(dev, R2057_LOGEN_PTAT_RESETS, 0x38); 
     956+                       b43_radio_write(dev, R2057_VCOBUF_IDACS, 0x0f); 
     957+ 
     958+                       if (b43_is_40mhz(dev)) { 
     959+                               /* TODO */ 
     960+                       } else { 
     961+                               b43_radio_write(dev, 
     962+                                               R2057_PAD_BIAS_FILTER_BWS_CORE0, 
     963+                                               0x3c); 
     964+                               b43_radio_write(dev, 
     965+                                               R2057_PAD_BIAS_FILTER_BWS_CORE1, 
     966+                                               0x3c); 
     967+                       } 
     968+               } 
     969+               break; 
    712970+       /* TODO */ 
    713971+       } 
    714972+ 
    715 +       /* TODO */ 
     973+       if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) { 
     974+               u16 txmix2g_tune_boost_pu = 0; 
     975+               u16 pad2g_tune_pus = 0; 
     976+ 
     977+               if (b43_nphy_ipa(dev)) { 
     978+                       switch (phy->radio_rev) { 
     979+                       case 9: 
     980+                               txmix2g_tune_boost_pu = 0x0041; 
     981+                               /* TODO */ 
     982+                               break; 
     983+                       } 
     984+                       /* TODO */ 
     985+               } 
     986+ 
     987+               if (txmix2g_tune_boost_pu) 
     988+                       b43_radio_write(dev, R2057_TXMIX2G_TUNE_BOOST_PU_CORE0, 
     989+                                       txmix2g_tune_boost_pu); 
     990+               if (pad2g_tune_pus) 
     991+                       b43_radio_write(dev, R2057_PAD2G_TUNE_PUS_CORE0, 
     992+                                       pad2g_tune_pus); 
     993+               if (txmix2g_tune_boost_pu) 
     994+                       b43_radio_write(dev, R2057_TXMIX2G_TUNE_BOOST_PU_CORE1, 
     995+                                       txmix2g_tune_boost_pu); 
     996+               if (pad2g_tune_pus) 
     997+                       b43_radio_write(dev, R2057_PAD2G_TUNE_PUS_CORE1, 
     998+                                       pad2g_tune_pus); 
     999+       } 
    7161000+ 
    7171001+       usleep_range(50, 100); 
     
    7311015 { 
    7321016        struct b43_phy *phy = &dev->phy; 
    733 @@ -603,15 +699,25 @@ static u8 b43_radio_2057_rcal(struct b43 
     1017@@ -603,15 +821,25 @@ static u8 b43_radio_2057_rcal(struct b43 
    7341018                b43_radio_maskset(dev, 0x1ca, ~0x2, 0x1); 
    7351019        } 
     
    7601044  
    7611045        if (phy->radio_rev == 5) { 
    762 @@ -627,7 +733,9 @@ static u8 b43_radio_2057_rcal(struct b43 
     1046@@ -627,7 +855,9 @@ static u8 b43_radio_2057_rcal(struct b43 
    7631047        return tmp & 0x3e; 
    7641048 } 
     
    7711055 { 
    7721056        struct b43_phy *phy = &dev->phy; 
    773 @@ -635,49 +743,76 @@ static u16 b43_radio_2057_rccal(struct b 
     1057@@ -635,49 +865,76 @@ static u16 b43_radio_2057_rccal(struct b 
    7741058                        phy->radio_rev == 6); 
    7751059        u16 tmp; 
     
    8541138 } 
    8551139  
    856 @@ -700,13 +835,11 @@ static void b43_radio_2057_init_post(str 
     1140@@ -700,13 +957,11 @@ static void b43_radio_2057_init_post(str 
    8571141        b43_radio_mask(dev, R2057_RFPLL_MISC_CAL_RESETN, ~0x78); 
    8581142        b43_radio_mask(dev, R2057_XTAL_CONFIG2, ~0x80); 
     
    8691153  
    8701154 /* http://bcm-v4.sipsolutions.net/802.11/Radio/2057/Init */ 
    871 @@ -800,6 +933,7 @@ static void b43_chantab_radio_2056_uploa 
     1155@@ -800,6 +1055,7 @@ static void b43_chantab_radio_2056_uploa 
    8721156 static void b43_radio_2056_setup(struct b43_wldev *dev, 
    8731157                                const struct b43_nphy_channeltab_entry_rev3 *e) 
     
    8771161        enum ieee80211_band band = b43_current_band(dev->wl); 
    8781162        u16 offset; 
    879 @@ -897,7 +1031,7 @@ static void b43_radio_2056_setup(struct 
     1163@@ -897,7 +1153,7 @@ static void b43_radio_2056_setup(struct 
    8801164                                        offset | B2056_TX_MIXG_BOOST_TUNE, 
    8811165                                        mixg_boost); 
     
    8861170                                        offset | B2056_TX_INTPAG_IMAIN_STAT, 
    8871171                                        bias); 
    888 @@ -911,7 +1045,7 @@ static void b43_radio_2056_setup(struct 
     1172@@ -911,7 +1167,7 @@ static void b43_radio_2056_setup(struct 
    8891173                        b43_radio_write(dev, offset | B2056_TX_PA_SPARE1, 0xee); 
    8901174                } 
     
    8951179                        paa_boost = 0xA; 
    8961180                        pada_boost = 0x77; 
    897 @@ -1028,7 +1162,7 @@ static void b43_radio_init2056_post(stru 
     1181@@ -1028,7 +1284,7 @@ static void b43_radio_init2056_post(stru 
    8981182        b43_radio_mask(dev, B2056_SYN_COM_RESET, ~0x2); 
    8991183        b43_radio_mask(dev, B2056_SYN_PLL_MAST2, ~0xFC); 
     
    9041188 } 
    9051189  
    906 @@ -1041,8 +1175,6 @@ static void b43_radio_init2056(struct b4 
     1190@@ -1041,8 +1297,6 @@ static void b43_radio_init2056(struct b4 
    9071191        b43_radio_init2056_pre(dev); 
    9081192        b2056_upload_inittabs(dev, 0, 0); 
     
    9131197  
    9141198 /************************************************** 
    915 @@ -1214,8 +1346,7 @@ static u16 b43_nphy_gen_load_samples(str 
     1199@@ -1214,8 +1468,7 @@ static u16 b43_nphy_gen_load_samples(str 
    9161200        u16 bw, len, rot, angle; 
    9171201        struct b43_c32 *samples; 
     
    9231207  
    9241208        if (test) { 
    925 @@ -1224,7 +1355,7 @@ static u16 b43_nphy_gen_load_samples(str 
     1209@@ -1224,7 +1477,7 @@ static u16 b43_nphy_gen_load_samples(str 
    9261210                else 
    9271211                        bw = 80; 
     
    9321216  
    9331217                len = bw << 1; 
    934 @@ -1252,7 +1383,8 @@ static u16 b43_nphy_gen_load_samples(str 
     1218@@ -1252,8 +1505,10 @@ static u16 b43_nphy_gen_load_samples(str 
    9351219  
    9361220 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RunSamples */ 
     
    9401224+                                bool modify_bbmult) 
    9411225 { 
     1226+       struct b43_phy *phy = &dev->phy; 
    9421227        struct b43_phy_n *nphy = dev->phy.n; 
    9431228        int i; 
    944 @@ -1266,12 +1398,10 @@ static void b43_nphy_run_samples(struct 
     1229        u16 seq_mode; 
     1230@@ -1261,17 +1516,35 @@ static void b43_nphy_run_samples(struct 
     1231  
     1232        b43_nphy_stay_in_carrier_search(dev, true); 
     1233  
     1234+       if (phy->rev >= 7) { 
     1235+               bool lpf_bw3, lpf_bw4; 
     1236+ 
     1237+               lpf_bw3 = b43_phy_read(dev, B43_NPHY_REV7_RF_CTL_OVER3) & 0x80; 
     1238+               lpf_bw4 = b43_phy_read(dev, B43_NPHY_REV7_RF_CTL_OVER3) & 0x80; 
     1239+ 
     1240+               if (lpf_bw3 || lpf_bw4) { 
     1241+                       /* TODO */ 
     1242+               } else { 
     1243+                       u16 value = b43_nphy_read_lpf_ctl(dev, 0); 
     1244+                       if (phy->rev >= 19) 
     1245+                               b43_nphy_rf_ctl_override_rev19(dev, 0x80, value, 
     1246+                                                              0, false, 1); 
     1247+                       else 
     1248+                               b43_nphy_rf_ctl_override_rev7(dev, 0x80, value, 
     1249+                                                             0, false, 1); 
     1250+                       nphy->lpf_bw_overrode_for_sample_play = true; 
     1251+               } 
     1252+       } 
     1253+ 
     1254        if ((nphy->bb_mult_save & 0x80000000) == 0) { 
     1255                tmp = b43_ntab_read(dev, B43_NTAB16(15, 87)); 
    9451256                nphy->bb_mult_save = (tmp & 0xFFFF) | 0x80000000; 
    9461257        } 
     
    9591270        b43_phy_write(dev, B43_NPHY_SAMP_DEPCNT, (samps - 1)); 
    9601271  
    961 @@ -1289,10 +1419,8 @@ static void b43_nphy_run_samples(struct 
     1272@@ -1289,10 +1562,8 @@ static void b43_nphy_run_samples(struct 
    9621273                b43_phy_mask(dev, B43_NPHY_IQLOCAL_CMDGCTL, 0x7FFF); 
    9631274                b43_phy_set(dev, B43_NPHY_IQLOCAL_CMDGCTL, 0x8000); 
     
    9721283        for (i = 0; i < 100; i++) { 
    9731284                if (!(b43_phy_read(dev, B43_NPHY_RFSEQST) & 1)) { 
    974 @@ -1679,6 +1807,7 @@ static int b43_nphy_poll_rssi(struct b43 
     1285@@ -1392,6 +1663,12 @@ static void b43_nphy_scale_offset_rssi(s 
     1286        } 
     1287 } 
     1288  
     1289+static void b43_nphy_rssi_select_rev19(struct b43_wldev *dev, u8 code, 
     1290+                                      enum n_rssi_type rssi_type) 
     1291+{ 
     1292+       /* TODO */ 
     1293+} 
     1294+ 
     1295 static void b43_nphy_rev3_rssi_select(struct b43_wldev *dev, u8 code, 
     1296                                      enum n_rssi_type rssi_type) 
     1297 { 
     1298@@ -1461,13 +1738,15 @@ static void b43_nphy_rev3_rssi_select(st 
     1299                                        enum ieee80211_band band = 
     1300                                                b43_current_band(dev->wl); 
     1301  
     1302-                                       if (b43_nphy_ipa(dev)) 
     1303-                                               val = (band == IEEE80211_BAND_5GHZ) ? 0xC : 0xE; 
     1304-                                       else 
     1305-                                               val = 0x11; 
     1306-                                       reg = (i == 0) ? 0x2000 : 0x3000; 
     1307-                                       reg |= B2055_PADDRV; 
     1308-                                       b43_radio_write(dev, reg, val); 
     1309+                                       if (dev->phy.rev < 7) { 
     1310+                                               if (b43_nphy_ipa(dev)) 
     1311+                                                       val = (band == IEEE80211_BAND_5GHZ) ? 0xC : 0xE; 
     1312+                                               else 
     1313+                                                       val = 0x11; 
     1314+                                               reg = (i == 0) ? B2056_TX0 : B2056_TX1; 
     1315+                                               reg |= B2056_TX_TX_SSI_MUX; 
     1316+                                               b43_radio_write(dev, reg, val); 
     1317+                                       } 
     1318  
     1319                                        reg = (i == 0) ? 
     1320                                                B43_NPHY_AFECTL_OVER1 : 
     1321@@ -1554,7 +1833,9 @@ static void b43_nphy_rev2_rssi_select(st 
     1322 static void b43_nphy_rssi_select(struct b43_wldev *dev, u8 code, 
     1323                                 enum n_rssi_type type) 
     1324 { 
     1325-       if (dev->phy.rev >= 3) 
     1326+       if (dev->phy.rev >= 19) 
     1327+               b43_nphy_rssi_select_rev19(dev, code, type); 
     1328+       else if (dev->phy.rev >= 3) 
     1329                b43_nphy_rev3_rssi_select(dev, code, type); 
     1330        else 
     1331                b43_nphy_rev2_rssi_select(dev, code, type); 
     1332@@ -1598,6 +1879,8 @@ static int b43_nphy_poll_rssi(struct b43 
     1333        u16 save_regs_phy[9]; 
     1334        u16 s[2]; 
     1335  
     1336+       /* TODO: rev7+ is treated like rev3+, what about rev19+? */ 
     1337+ 
     1338        if (dev->phy.rev >= 3) { 
     1339                save_regs_phy[0] = b43_phy_read(dev, B43_NPHY_AFECTL_C1); 
     1340                save_regs_phy[1] = b43_phy_read(dev, B43_NPHY_AFECTL_C2); 
     1341@@ -1679,6 +1962,7 @@ static int b43_nphy_poll_rssi(struct b43 
    9751342 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RSSICalRev3 */ 
    9761343 static void b43_nphy_rev3_rssi_cal(struct b43_wldev *dev) 
     
    9801347  
    9811348        u16 saved_regs_phy_rfctl[2]; 
    982 @@ -1901,9 +2030,9 @@ static void b43_nphy_rev3_rssi_cal(struc 
     1349@@ -1696,12 +1980,14 @@ static void b43_nphy_rev3_rssi_cal(struc 
     1350                B43_NPHY_AFECTL_OVER1, B43_NPHY_AFECTL_OVER, 
     1351                B43_NPHY_AFECTL_C1, B43_NPHY_AFECTL_C2, 
     1352                B43_NPHY_TXF_40CO_B1S1, B43_NPHY_RFCTL_OVER, 
     1353-               0x342, 0x343, 0x346, 0x347, 
     1354+               B43_NPHY_REV7_RF_CTL_OVER3, B43_NPHY_REV7_RF_CTL_OVER4, 
     1355+               B43_NPHY_REV7_RF_CTL_OVER5, B43_NPHY_REV7_RF_CTL_OVER6, 
     1356                0x2ff, 
     1357                B43_NPHY_TXF_40CO_B1S0, B43_NPHY_TXF_40CO_B32S1, 
     1358                B43_NPHY_RFCTL_CMD, 
     1359                B43_NPHY_RFCTL_LUT_TRSW_UP1, B43_NPHY_RFCTL_LUT_TRSW_UP2, 
     1360-               0x340, 0x341, 0x344, 0x345, 
     1361+               B43_NPHY_REV7_RF_CTL_MISC_REG3, B43_NPHY_REV7_RF_CTL_MISC_REG4, 
     1362+               B43_NPHY_REV7_RF_CTL_MISC_REG5, B43_NPHY_REV7_RF_CTL_MISC_REG6, 
     1363                B43_NPHY_RFCTL_RSSIO1, B43_NPHY_RFCTL_RSSIO2 
     1364        }; 
     1365        u16 *regs_to_store; 
     1366@@ -1748,9 +2034,24 @@ static void b43_nphy_rev3_rssi_cal(struc 
     1367        b43_nphy_rf_ctl_intc_override(dev, N_INTC_OVERRIDE_TRSW, 1, 7); 
     1368  
     1369        if (dev->phy.rev >= 7) { 
     1370-               /* TODO */ 
     1371+               b43_nphy_rf_ctl_override_one_to_many(dev, 
     1372+                                                    N_RF_CTL_OVER_CMD_RXRF_PU, 
     1373+                                                    0, 0, false); 
     1374+               b43_nphy_rf_ctl_override_one_to_many(dev, 
     1375+                                                    N_RF_CTL_OVER_CMD_RX_PU, 
     1376+                                                    1, 0, false); 
     1377+               b43_nphy_rf_ctl_override_rev7(dev, 0x80, 1, 0, false, 0); 
     1378+               b43_nphy_rf_ctl_override_rev7(dev, 0x80, 1, 0, false, 0); 
     1379                if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) { 
     1380+                       b43_nphy_rf_ctl_override_rev7(dev, 0x20, 0, 0, false, 
     1381+                                                     0); 
     1382+                       b43_nphy_rf_ctl_override_rev7(dev, 0x10, 1, 0, false, 
     1383+                                                     0); 
     1384                } else { 
     1385+                       b43_nphy_rf_ctl_override_rev7(dev, 0x10, 0, 0, false, 
     1386+                                                     0); 
     1387+                       b43_nphy_rf_ctl_override_rev7(dev, 0x20, 1, 0, false, 
     1388+                                                     0); 
     1389                } 
     1390        } else { 
     1391                b43_nphy_rf_ctl_override(dev, 0x1, 0, 0, false); 
     1392@@ -1779,7 +2080,10 @@ static void b43_nphy_rev3_rssi_cal(struc 
     1393                /* Grab RSSI results for every possible VCM */ 
     1394                for (vcm = 0; vcm < 8; vcm++) { 
     1395                        if (dev->phy.rev >= 7) 
     1396-                               ; 
     1397+                               b43_radio_maskset(dev, 
     1398+                                                 core ? R2057_NB_MASTER_CORE1 : 
     1399+                                                        R2057_NB_MASTER_CORE0, 
     1400+                                                 ~R2057_VCM_MASK, vcm); 
     1401                        else 
     1402                                b43_radio_maskset(dev, r | B2056_RX_RSSI_MISC, 
     1403                                                  0xE3, vcm << 2); 
     1404@@ -1810,7 +2114,10 @@ static void b43_nphy_rev3_rssi_cal(struc 
     1405  
     1406                /* Select the best VCM */ 
     1407                if (dev->phy.rev >= 7) 
     1408-                       ; 
     1409+                       b43_radio_maskset(dev, 
     1410+                                         core ? R2057_NB_MASTER_CORE1 : 
     1411+                                                R2057_NB_MASTER_CORE0, 
     1412+                                         ~R2057_VCM_MASK, vcm); 
     1413                else 
     1414                        b43_radio_maskset(dev, r | B2056_RX_RSSI_MISC, 
     1415                                          0xE3, vcm_final << 2); 
     1416@@ -1880,6 +2187,10 @@ static void b43_nphy_rev3_rssi_cal(struc 
     1417                rssical_phy_regs = nphy->rssical_cache.rssical_phy_regs_5G; 
     1418        } 
     1419        if (dev->phy.rev >= 7) { 
     1420+               rssical_radio_regs[0] = b43_radio_read(dev, 
     1421+                                                      R2057_NB_MASTER_CORE0); 
     1422+               rssical_radio_regs[1] = b43_radio_read(dev, 
     1423+                                                      R2057_NB_MASTER_CORE1); 
     1424        } else { 
     1425                rssical_radio_regs[0] = b43_radio_read(dev, B2056_RX0 | 
     1426                                                       B2056_RX_RSSI_MISC); 
     1427@@ -1901,9 +2212,9 @@ static void b43_nphy_rev3_rssi_cal(struc 
    9831428  
    9841429        /* Remember for which channel we store configuration */ 
     
    9921437        /* End of calibration, restore configuration */ 
    9931438        b43_nphy_classifier(dev, 7, class); 
    994 @@ -2196,7 +2325,7 @@ static void b43_nphy_gain_ctl_workaround 
     1439@@ -2080,7 +2391,9 @@ static void b43_nphy_rev2_rssi_cal(struc 
     1440  */ 
     1441 static void b43_nphy_rssi_cal(struct b43_wldev *dev) 
     1442 { 
     1443-       if (dev->phy.rev >= 3) { 
     1444+       if (dev->phy.rev >= 19) { 
     1445+               /* TODO */ 
     1446+       } else if (dev->phy.rev >= 3) { 
     1447                b43_nphy_rev3_rssi_cal(dev); 
     1448        } else { 
     1449                b43_nphy_rev2_rssi_cal(dev, N_RSSI_NB); 
     1450@@ -2093,7 +2406,21 @@ static void b43_nphy_rssi_cal(struct b43 
     1451  * Workarounds 
     1452  **************************************************/ 
     1453  
     1454-static void b43_nphy_gain_ctl_workarounds_rev3plus(struct b43_wldev *dev) 
     1455+static void b43_nphy_gain_ctl_workarounds_rev19(struct b43_wldev *dev) 
     1456+{ 
     1457+       /* TODO */ 
     1458+} 
     1459+ 
     1460+static void b43_nphy_gain_ctl_workarounds_rev7(struct b43_wldev *dev) 
     1461+{ 
     1462+       struct b43_phy *phy = &dev->phy; 
     1463+ 
     1464+       switch (phy->rev) { 
     1465+       /* TODO */ 
     1466+       } 
     1467+} 
     1468+ 
     1469+static void b43_nphy_gain_ctl_workarounds_rev3(struct b43_wldev *dev) 
     1470 { 
     1471        struct ssb_sprom *sprom = dev->dev->bus_sprom; 
     1472  
     1473@@ -2196,7 +2523,7 @@ static void b43_nphy_gain_ctl_workaround 
    9951474        b43_phy_write(dev, B43_NPHY_C1_NBCLIPTHRES, 0x84); 
    9961475        b43_phy_write(dev, B43_NPHY_C2_NBCLIPTHRES, 0x84); 
     
    10011480                b43_phy_write(dev, B43_NPHY_CLIP1_NBDWELL_LEN, 0x002B); 
    10021481                b43_phy_write(dev, B43_NPHY_CLIP2_NBDWELL_LEN, 0x002B); 
    1003 @@ -2210,7 +2339,7 @@ static void b43_nphy_gain_ctl_workaround 
     1482@@ -2210,7 +2537,7 @@ static void b43_nphy_gain_ctl_workaround 
    10041483        b43_phy_maskset(dev, B43_NPHY_C2_CLIPWBTHRES, 
    10051484                        ~B43_NPHY_C2_CLIPWBTHRES_CLIP2, 21); 
     
    10101489                        ~B43_NPHY_C1_CGAINI_GAINBKOFF, 0x1); 
    10111490                b43_phy_maskset(dev, B43_NPHY_C2_CGAINI, 
    1012 @@ -2225,12 +2354,12 @@ static void b43_nphy_gain_ctl_workaround 
     1491@@ -2225,12 +2552,12 @@ static void b43_nphy_gain_ctl_workaround 
    10131492  
    10141493        if (nphy->gain_boost) { 
     
    10251504  
    10261505        /* Set HPVGA2 index */ 
    1027 @@ -2302,7 +2431,7 @@ static void b43_nphy_gain_ctl_workaround 
    1028  static u16 b43_nphy_read_lpf_ctl(struct b43_wldev *dev, u16 offset) 
    1029  { 
    1030         if (!offset) 
     1506@@ -2290,22 +2617,16 @@ static void b43_nphy_gain_ctl_workaround 
     1507 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/WorkaroundsGainCtrl */ 
     1508 static void b43_nphy_gain_ctl_workarounds(struct b43_wldev *dev) 
     1509 { 
     1510-       if (dev->phy.rev >= 7) 
     1511-               ; /* TODO */ 
     1512+       if (dev->phy.rev >= 19) 
     1513+               b43_nphy_gain_ctl_workarounds_rev19(dev); 
     1514+       else if (dev->phy.rev >= 7) 
     1515+               b43_nphy_gain_ctl_workarounds_rev7(dev); 
     1516        else if (dev->phy.rev >= 3) 
     1517-               b43_nphy_gain_ctl_workarounds_rev3plus(dev); 
     1518+               b43_nphy_gain_ctl_workarounds_rev3(dev); 
     1519        else 
     1520                b43_nphy_gain_ctl_workarounds_rev1_2(dev); 
     1521 } 
     1522  
     1523-/* http://bcm-v4.sipsolutions.net/PHY/N/Read_Lpf_Bw_Ctl */ 
     1524-static u16 b43_nphy_read_lpf_ctl(struct b43_wldev *dev, u16 offset) 
     1525-{ 
     1526-       if (!offset) 
    10311527-               offset = (dev->phy.is_40mhz) ? 0x159 : 0x154; 
    1032 +               offset = b43_is_40mhz(dev) ? 0x159 : 0x154; 
    1033         return b43_ntab_read(dev, B43_NTAB16(7, offset)) & 0x7; 
    1034  } 
    1035   
    1036 @@ -2375,13 +2504,13 @@ static void b43_nphy_workarounds_rev7plu 
     1528-       return b43_ntab_read(dev, B43_NTAB16(7, offset)) & 0x7; 
     1529-} 
     1530- 
     1531 static void b43_nphy_workarounds_rev7plus(struct b43_wldev *dev) 
     1532 { 
     1533        struct ssb_sprom *sprom = dev->dev->bus_sprom; 
     1534@@ -2375,13 +2696,13 @@ static void b43_nphy_workarounds_rev7plu 
    10371535        lpf_40 = b43_nphy_read_lpf_ctl(dev, 0x159); 
    10381536        lpf_11b = b43_nphy_read_lpf_ctl(dev, 0x152); 
     
    10501548                                bcap_val_11n_20 = bcap_val; 
    10511549                                scap_val_11n_40 = bcap_val_11n_40 = 0xc; 
    1052 @@ -2523,7 +2652,7 @@ static void b43_nphy_workarounds_rev7plu 
     1550@@ -2523,7 +2844,7 @@ static void b43_nphy_workarounds_rev7plu 
    10531551                                        } 
    10541552                                } 
     
    10591557                                        b43_radio_write(dev, 0xE8, 0x12); 
    10601558                                } else { 
    1061 @@ -2532,7 +2661,7 @@ static void b43_nphy_workarounds_rev7plu 
     1559@@ -2532,7 +2853,7 @@ static void b43_nphy_workarounds_rev7plu 
    10621560                                } 
    10631561                        } 
     
    10681566                            (freq >= 5745 && freq <= 5805)) { 
    10691567                                b43_radio_write(dev, 0x7D, 0xFF); 
    1070 @@ -2596,7 +2725,7 @@ static void b43_nphy_workarounds_rev7plu 
     1568@@ -2596,7 +2917,7 @@ static void b43_nphy_workarounds_rev7plu 
    10711569        b43_ntab_write(dev, B43_NTAB16(7, 0x123), 0x77); 
    10721570        b43_ntab_write(dev, B43_NTAB16(7, 0x12A), 0x77); 
     
    10771575                b43_ntab_write(dev, B43_NTAB32(16, 0x7F), 0x18D); 
    10781576        } else { 
    1079 @@ -2695,7 +2824,7 @@ static void b43_nphy_workarounds_rev3plu 
     1577@@ -2695,7 +3016,7 @@ static void b43_nphy_workarounds_rev3plu 
    10801578  
    10811579        b43_phy_maskset(dev, B43_NPHY_SGILTRNOFFSET, 0xF0FF, 0x0700); 
     
    10861584                b43_ntab_write(dev, B43_NTAB32(16, 127), 0x18D); 
    10871585        } else { 
    1088 @@ -2950,12 +3079,13 @@ static void b43_nphy_workarounds(struct 
     1586@@ -2930,6 +3251,7 @@ static void b43_nphy_workarounds(struct 
     1587        b43_phy_set(dev, B43_NPHY_IQFLIP, 
     1588                    B43_NPHY_IQFLIP_ADC1 | B43_NPHY_IQFLIP_ADC2); 
     1589  
     1590+       /* TODO: rev19+ */ 
     1591        if (dev->phy.rev >= 7) 
     1592                b43_nphy_workarounds_rev7plus(dev); 
     1593        else if (dev->phy.rev >= 3) 
     1594@@ -2950,12 +3272,13 @@ static void b43_nphy_workarounds(struct 
    10891595  * http://bcm-v4.sipsolutions.net/802.11/PHY/N/TXTone 
    10901596  */ 
     
    11021608 } 
    11031609  
    1104 @@ -3118,7 +3248,7 @@ static void b43_nphy_tx_power_ctrl(struc 
     1610@@ -2990,6 +3313,7 @@ static void b43_nphy_update_txrx_chain(s 
     1611 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/stop-playback */ 
     1612 static void b43_nphy_stop_playback(struct b43_wldev *dev) 
     1613 { 
     1614+       struct b43_phy *phy = &dev->phy; 
     1615        struct b43_phy_n *nphy = dev->phy.n; 
     1616        u16 tmp; 
     1617  
     1618@@ -3010,6 +3334,15 @@ static void b43_nphy_stop_playback(struc 
     1619                nphy->bb_mult_save = 0; 
     1620        } 
     1621  
     1622+       if (phy->rev >= 7) { 
     1623+               if (phy->rev >= 19) 
     1624+                       b43_nphy_rf_ctl_override_rev19(dev, 0x80, 0, 0, true, 
     1625+                                                      1); 
     1626+               else 
     1627+                       b43_nphy_rf_ctl_override_rev7(dev, 0x80, 0, 0, true, 1); 
     1628+               nphy->lpf_bw_overrode_for_sample_play = false; 
     1629+       } 
     1630+ 
     1631        if (nphy->hang_avoid) 
     1632                b43_nphy_stay_in_carrier_search(dev, 0); 
     1633 } 
     1634@@ -3019,16 +3352,23 @@ static void b43_nphy_iq_cal_gain_params( 
     1635                                        struct nphy_txgains target, 
     1636                                        struct nphy_iqcal_params *params) 
     1637 { 
     1638+       struct b43_phy *phy = &dev->phy; 
     1639        int i, j, indx; 
     1640        u16 gain; 
     1641  
     1642        if (dev->phy.rev >= 3) { 
     1643+               params->tx_lpf = target.tx_lpf[core]; /* Rev 7+ */ 
     1644                params->txgm = target.txgm[core]; 
     1645                params->pga = target.pga[core]; 
     1646                params->pad = target.pad[core]; 
     1647                params->ipa = target.ipa[core]; 
     1648-               params->cal_gain = (params->txgm << 12) | (params->pga << 8) | 
     1649-                                       (params->pad << 4) | (params->ipa); 
     1650+               if (phy->rev >= 19) { 
     1651+                       /* TODO */ 
     1652+               } else if (phy->rev >= 7) { 
     1653+                       params->cal_gain = (params->txgm << 12) | (params->pga << 8) | (params->pad << 3) | (params->ipa) | (params->tx_lpf << 15); 
     1654+               } else { 
     1655+                       params->cal_gain = (params->txgm << 12) | (params->pga << 8) | (params->pad << 4) | (params->ipa); 
     1656+               } 
     1657                for (j = 0; j < 5; j++) 
     1658                        params->ncorr[j] = 0x79; 
     1659        } else { 
     1660@@ -3069,6 +3409,7 @@ static enum b43_txpwr_result b43_nphy_op 
     1661 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/TxPwrCtrlEnable */ 
     1662 static void b43_nphy_tx_power_ctrl(struct b43_wldev *dev, bool enable) 
     1663 { 
     1664+       struct b43_phy *phy = &dev->phy; 
     1665        struct b43_phy_n *nphy = dev->phy.n; 
     1666        u8 i; 
     1667        u16 bmask, val, tmp; 
     1668@@ -3118,7 +3459,7 @@ static void b43_nphy_tx_power_ctrl(struc 
    11051669                        b43_phy_maskset(dev, B43_NPHY_BPHY_CTL3, 
    11061670                                ~B43_NPHY_BPHY_CTL3_SCALE, 0x5A); 
     
    11111675        } else { 
    11121676                b43_ntab_write_bulk(dev, B43_NTAB16(26, 64), 84, 
    1113 @@ -3172,7 +3302,7 @@ static void b43_nphy_tx_power_ctrl(struc 
     1677@@ -3138,12 +3479,25 @@ static void b43_nphy_tx_power_ctrl(struc 
     1678                b43_phy_maskset(dev, B43_NPHY_TXPCTL_CMD, ~(bmask), val); 
     1679  
     1680                if (band == IEEE80211_BAND_5GHZ) { 
     1681-                       b43_phy_maskset(dev, B43_NPHY_TXPCTL_CMD, 
     1682-                                       ~B43_NPHY_TXPCTL_CMD_INIT, 0x64); 
     1683-                       if (dev->phy.rev > 1) 
     1684+                       if (phy->rev >= 19) { 
     1685+                               /* TODO */ 
     1686+                       } else if (phy->rev >= 7) { 
     1687+                               b43_phy_maskset(dev, B43_NPHY_TXPCTL_CMD, 
     1688+                                               ~B43_NPHY_TXPCTL_CMD_INIT, 
     1689+                                               0x32); 
     1690                                b43_phy_maskset(dev, B43_NPHY_TXPCTL_INIT, 
     1691                                                ~B43_NPHY_TXPCTL_INIT_PIDXI1, 
     1692+                                               0x32); 
     1693+                       } else { 
     1694+                               b43_phy_maskset(dev, B43_NPHY_TXPCTL_CMD, 
     1695+                                               ~B43_NPHY_TXPCTL_CMD_INIT, 
     1696                                                0x64); 
     1697+                               if (phy->rev > 1) 
     1698+                                       b43_phy_maskset(dev, 
     1699+                                                       B43_NPHY_TXPCTL_INIT, 
     1700+                                                       ~B43_NPHY_TXPCTL_INIT_PIDXI1, 
     1701+                                                       0x64); 
     1702+                       } 
     1703                } 
     1704  
     1705                if (dev->phy.rev >= 3) { 
     1706@@ -3160,6 +3514,10 @@ static void b43_nphy_tx_power_ctrl(struc 
     1707                        } 
     1708                } 
     1709  
     1710+               if (phy->rev >= 7) { 
     1711+                       /* TODO */ 
     1712+               } 
     1713+ 
     1714                if (dev->phy.rev >= 3) { 
     1715                        b43_phy_mask(dev, B43_NPHY_AFECTL_OVER1, ~0x100); 
     1716                        b43_phy_mask(dev, B43_NPHY_AFECTL_OVER, ~0x100); 
     1717@@ -3172,7 +3530,7 @@ static void b43_nphy_tx_power_ctrl(struc 
    11141718                else if (dev->phy.rev < 2) 
    11151719                        b43_phy_maskset(dev, B43_NPHY_BPHY_CTL3, ~0xFF, 0x40); 
     
    11201724  
    11211725                if (b43_nphy_ipa(dev)) { 
    1122 @@ -3188,12 +3318,13 @@ static void b43_nphy_tx_power_ctrl(struc 
     1726@@ -3188,18 +3546,20 @@ static void b43_nphy_tx_power_ctrl(struc 
    11231727 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/TxPwrFix */ 
    11241728 static void b43_nphy_tx_power_fix(struct b43_wldev *dev) 
     
    11351739        /* u32 gaintbl; rev3+ */ 
    11361740  
    1137 @@ -3238,7 +3369,11 @@ static void b43_nphy_tx_power_fix(struct 
     1741        if (nphy->hang_avoid) 
     1742                b43_nphy_stay_in_carrier_search(dev, 1); 
     1743  
     1744+       /* TODO: rev19+ */ 
     1745        if (dev->phy.rev >= 7) { 
     1746                txpi[0] = txpi[1] = 30; 
     1747        } else if (dev->phy.rev >= 3) { 
     1748@@ -3238,7 +3598,11 @@ static void b43_nphy_tx_power_fix(struct 
    11381749        */ 
    11391750  
     
    11481759                if (dev->phy.rev >= 3) 
    11491760                        radio_gain = (txgain >> 16) & 0x1FFFF; 
    1150 @@ -3392,7 +3527,7 @@ static void b43_nphy_tx_power_ctl_idle_t 
     1761@@ -3298,7 +3662,9 @@ static void b43_nphy_ipa_internal_tssi_s 
     1762        u8 core; 
     1763        u16 r; /* routing */ 
     1764  
     1765-       if (phy->rev >= 7) { 
     1766+       if (phy->rev >= 19) { 
     1767+               /* TODO */ 
     1768+       } else if (phy->rev >= 7) { 
     1769                for (core = 0; core < 2; core++) { 
     1770                        r = core ? 0x190 : 0x170; 
     1771                        if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) { 
     1772@@ -3386,24 +3752,32 @@ static void b43_nphy_tx_power_ctl_idle_t 
     1773        if (b43_nphy_ipa(dev)) 
     1774                b43_nphy_ipa_internal_tssi_setup(dev); 
     1775  
     1776-       if (phy->rev >= 7) 
     1777+       if (phy->rev >= 19) 
     1778+               b43_nphy_rf_ctl_override_rev19(dev, 0x2000, 0, 3, false, 0); 
     1779+       else if (phy->rev >= 7) 
     1780                b43_nphy_rf_ctl_override_rev7(dev, 0x2000, 0, 3, false, 0); 
     1781        else if (phy->rev >= 3) 
    11511782                b43_nphy_rf_ctl_override(dev, 0x2000, 0, 3, false); 
    11521783  
     
    11571788        tmp = b43_nphy_poll_rssi(dev, N_RSSI_TSSI_2G, rssi, 1); 
    11581789        b43_nphy_stop_playback(dev); 
    1159 @@ -3443,21 +3578,21 @@ static void b43_nphy_tx_prepare_adjusted 
     1790+ 
     1791        b43_nphy_rssi_select(dev, 0, N_RSSI_W1); 
     1792  
     1793-       if (phy->rev >= 7) 
     1794+       if (phy->rev >= 19) 
     1795+               b43_nphy_rf_ctl_override_rev19(dev, 0x2000, 0, 3, true, 0); 
     1796+       else if (phy->rev >= 7) 
     1797                b43_nphy_rf_ctl_override_rev7(dev, 0x2000, 0, 3, true, 0); 
     1798        else if (phy->rev >= 3) 
     1799                b43_nphy_rf_ctl_override(dev, 0x2000, 0, 3, true); 
     1800  
     1801-       if (phy->rev >= 3) { 
     1802+       if (phy->rev >= 19) { 
     1803+               /* TODO */ 
     1804+               return; 
     1805+       } else if (phy->rev >= 3) { 
     1806                nphy->pwr_ctl_info[0].idle_tssi_5g = (tmp >> 24) & 0xFF; 
     1807                nphy->pwr_ctl_info[1].idle_tssi_5g = (tmp >> 8) & 0xFF; 
     1808        } else { 
     1809@@ -3443,21 +3817,21 @@ static void b43_nphy_tx_prepare_adjusted 
    11601810                delta = 0; 
    11611811                switch (stf_mode) { 
     
    11841834                } 
    11851835  
    1186 @@ -3478,6 +3613,7 @@ static void b43_nphy_tx_prepare_adjusted 
     1836@@ -3478,6 +3852,7 @@ static void b43_nphy_tx_prepare_adjusted 
    11871837 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/TxPwrCtrlSetup */ 
    11881838 static void b43_nphy_tx_power_ctl_setup(struct b43_wldev *dev) 
     
    11921842        struct ssb_sprom *sprom = dev->dev->bus_sprom; 
    11931843  
    1194 @@ -3487,7 +3623,7 @@ static void b43_nphy_tx_power_ctl_setup( 
     1844@@ -3487,7 +3862,7 @@ static void b43_nphy_tx_power_ctl_setup( 
    11951845        s32 num, den, pwr; 
    11961846        u32 regval[64]; 
     
    12011851        u16 r; /* routing */ 
    12021852        u8 i, c; 
    1203 @@ -3651,6 +3787,9 @@ static void b43_nphy_tx_gain_table_uploa 
     1853@@ -3594,7 +3969,9 @@ static void b43_nphy_tx_power_ctl_setup( 
     1854                udelay(1); 
     1855        } 
     1856  
     1857-       if (dev->phy.rev >= 7) { 
     1858+       if (phy->rev >= 19) { 
     1859+               /* TODO */ 
     1860+       } else if (phy->rev >= 7) { 
     1861                b43_phy_maskset(dev, B43_NPHY_TXPCTL_CMD, 
     1862                                ~B43_NPHY_TXPCTL_CMD_INIT, 0x19); 
     1863                b43_phy_maskset(dev, B43_NPHY_TXPCTL_INIT, 
     1864@@ -3651,27 +4028,36 @@ static void b43_nphy_tx_gain_table_uploa 
    12041865        int i; 
    12051866  
     
    12111872        b43_ntab_write_bulk(dev, B43_NTAB32(27, 192), 128, table); 
    12121873  
    1213 @@ -3709,21 +3848,28 @@ static void b43_nphy_pa_override(struct 
     1874-       if (phy->rev >= 3) { 
     1875+       if (phy->rev < 3) 
     1876+               return; 
     1877+ 
     1878 #if 0 
     1879-               nphy->gmval = (table[0] >> 16) & 0x7000; 
     1880+       nphy->gmval = (table[0] >> 16) & 0x7000; 
     1881 #endif 
     1882  
     1883-               for (i = 0; i < 128; i++) { 
     1884+       for (i = 0; i < 128; i++) { 
     1885+               if (phy->rev >= 19) { 
     1886+                       /* TODO */ 
     1887+                       return; 
     1888+               } else if (phy->rev >= 7) { 
     1889+                       /* TODO */ 
     1890+                       return; 
     1891+               } else { 
     1892                        pga_gain = (table[i] >> 24) & 0xF; 
     1893                        if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) 
     1894-                               rfpwr_offset = 
     1895-                                b43_ntab_papd_pga_gain_delta_ipa_2g[pga_gain]; 
     1896+                               rfpwr_offset = b43_ntab_papd_pga_gain_delta_ipa_2g[pga_gain]; 
     1897                        else 
     1898-                               rfpwr_offset = 
     1899-                                0; /* FIXME */ 
     1900-                       b43_ntab_write(dev, B43_NTAB32(26, 576 + i), 
     1901-                                      rfpwr_offset); 
     1902-                       b43_ntab_write(dev, B43_NTAB32(27, 576 + i), 
     1903-                                      rfpwr_offset); 
     1904+                               rfpwr_offset = 0; /* FIXME */ 
     1905                } 
     1906+ 
     1907+               b43_ntab_write(dev, B43_NTAB32(26, 576 + i), rfpwr_offset); 
     1908+               b43_ntab_write(dev, B43_NTAB32(27, 576 + i), rfpwr_offset); 
     1909        } 
     1910 } 
     1911  
     1912@@ -3688,7 +4074,9 @@ static void b43_nphy_pa_override(struct 
     1913                nphy->rfctrl_intc2_save = b43_phy_read(dev, 
     1914                                                       B43_NPHY_RFCTL_INTC2); 
     1915                band = b43_current_band(dev->wl); 
     1916-               if (dev->phy.rev >= 3) { 
     1917+               if (dev->phy.rev >= 7) { 
     1918+                       tmp = 0x1480; 
     1919+               } else if (dev->phy.rev >= 3) { 
     1920                        if (band == IEEE80211_BAND_5GHZ) 
     1921                                tmp = 0x600; 
     1922                        else 
     1923@@ -3709,21 +4097,28 @@ static void b43_nphy_pa_override(struct 
    12141924        } 
    12151925 } 
     
    12331943+       if (dev->phy.rev < 3 || dev->phy.rev >= 7) 
    12341944+               return; 
    1235   
    1236 -               tmp = 1; 
     1945+ 
    12371946+       if (b43_nphy_ipa(dev)) 
    12381947+               tmp = b43_is_40mhz(dev) ? 5 : 4; 
     
    12411950+       b43_phy_write(dev, B43_NPHY_TXF_40CO_B32S2, 
    12421951+                     (tmp << 9) | (tmp << 6) | (tmp << 3) | tmp); 
    1243 + 
     1952  
     1953-               tmp = 1; 
    12441954+       if (b43_nphy_ipa(dev)) { 
    12451955+               tmp = b43_is_40mhz(dev) ? 4 : 1; 
     
    12501960 } 
    12511961  
    1252 @@ -3996,7 +4142,7 @@ static void b43_nphy_spur_workaround(str 
     1962@@ -3996,7 +4391,7 @@ static void b43_nphy_spur_workaround(str 
    12531963  
    12541964        if (nphy->gband_spurwar_en) { 
     
    12591969                else 
    12601970                        ; /* TODO: N PHY Adjust Min Noise Var(0, NULL, NULL)*/ 
    1261 @@ -4290,7 +4436,7 @@ static void b43_nphy_int_pa_set_tx_dig_f 
     1971@@ -4128,7 +4523,13 @@ static void b43_nphy_restore_rssi_cal(st 
     1972                rssical_phy_regs = nphy->rssical_cache.rssical_phy_regs_5G; 
     1973        } 
     1974  
     1975-       if (dev->phy.rev >= 7) { 
     1976+       if (dev->phy.rev >= 19) { 
     1977+               /* TODO */ 
     1978+       } else if (dev->phy.rev >= 7) { 
     1979+               b43_radio_maskset(dev, R2057_NB_MASTER_CORE0, ~R2057_VCM_MASK, 
     1980+                                 rssical_radio_regs[0]); 
     1981+               b43_radio_maskset(dev, R2057_NB_MASTER_CORE1, ~R2057_VCM_MASK, 
     1982+                                 rssical_radio_regs[1]); 
     1983        } else { 
     1984                b43_radio_maskset(dev, B2056_RX0 | B2056_RX_RSSI_MISC, 0xE3, 
     1985                                  rssical_radio_regs[0]); 
     1986@@ -4152,15 +4553,78 @@ static void b43_nphy_restore_rssi_cal(st 
     1987        b43_phy_write(dev, B43_NPHY_RSSIMC_1Q_RSSI_Y, rssical_phy_regs[11]); 
     1988 } 
     1989  
     1990+static void b43_nphy_tx_cal_radio_setup_rev19(struct b43_wldev *dev) 
     1991+{ 
     1992+       /* TODO */ 
     1993+} 
     1994+ 
     1995+static void b43_nphy_tx_cal_radio_setup_rev7(struct b43_wldev *dev) 
     1996+{ 
     1997+       struct b43_phy *phy = &dev->phy; 
     1998+       struct b43_phy_n *nphy = dev->phy.n; 
     1999+       u16 *save = nphy->tx_rx_cal_radio_saveregs; 
     2000+       int core, off; 
     2001+       u16 r, tmp; 
     2002+ 
     2003+       for (core = 0; core < 2; core++) { 
     2004+               r = core ? 0x20 : 0; 
     2005+               off = core * 11; 
     2006+ 
     2007+               save[off + 0] = b43_radio_read(dev, r + R2057_TX0_TX_SSI_MASTER); 
     2008+               save[off + 1] = b43_radio_read(dev, r + R2057_TX0_IQCAL_VCM_HG); 
     2009+               save[off + 2] = b43_radio_read(dev, r + R2057_TX0_IQCAL_IDAC); 
     2010+               save[off + 3] = b43_radio_read(dev, r + R2057_TX0_TSSI_VCM); 
     2011+               save[off + 4] = 0; 
     2012+               save[off + 5] = b43_radio_read(dev, r + R2057_TX0_TX_SSI_MUX); 
     2013+               if (phy->radio_rev != 5) 
     2014+                       save[off + 6] = b43_radio_read(dev, r + R2057_TX0_TSSIA); 
     2015+               save[off + 7] = b43_radio_read(dev, r + R2057_TX0_TSSIG); 
     2016+               save[off + 8] = b43_radio_read(dev, r + R2057_TX0_TSSI_MISC1); 
     2017+ 
     2018+               if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) { 
     2019+                       b43_radio_write(dev, r + R2057_TX0_TX_SSI_MASTER, 0xA); 
     2020+                       b43_radio_write(dev, r + R2057_TX0_IQCAL_VCM_HG, 0x43); 
     2021+                       b43_radio_write(dev, r + R2057_TX0_IQCAL_IDAC, 0x55); 
     2022+                       b43_radio_write(dev, r + R2057_TX0_TSSI_VCM, 0); 
     2023+                       b43_radio_write(dev, r + R2057_TX0_TSSIG, 0); 
     2024+                       if (nphy->use_int_tx_iq_lo_cal) { 
     2025+                               b43_radio_write(dev, r + R2057_TX0_TX_SSI_MUX, 0x4); 
     2026+                               tmp = true ? 0x31 : 0x21; /* TODO */ 
     2027+                               b43_radio_write(dev, r + R2057_TX0_TSSIA, tmp); 
     2028+                       } 
     2029+                       b43_radio_write(dev, r + R2057_TX0_TSSI_MISC1, 0x00); 
     2030+               } else { 
     2031+                       b43_radio_write(dev, r + R2057_TX0_TX_SSI_MASTER, 0x6); 
     2032+                       b43_radio_write(dev, r + R2057_TX0_IQCAL_VCM_HG, 0x43); 
     2033+                       b43_radio_write(dev, r + R2057_TX0_IQCAL_IDAC, 0x55); 
     2034+                       b43_radio_write(dev, r + R2057_TX0_TSSI_VCM, 0); 
     2035+ 
     2036+                       if (phy->radio_rev != 5) 
     2037+                               b43_radio_write(dev, r + R2057_TX0_TSSIA, 0); 
     2038+                       if (nphy->use_int_tx_iq_lo_cal) { 
     2039+                               b43_radio_write(dev, r + R2057_TX0_TX_SSI_MUX, 0x6); 
     2040+                               tmp = true ? 0x31 : 0x21; /* TODO */ 
     2041+                               b43_radio_write(dev, r + R2057_TX0_TSSIG, tmp); 
     2042+                       } 
     2043+                       b43_radio_write(dev, r + R2057_TX0_TSSI_MISC1, 0); 
     2044+               } 
     2045+       } 
     2046+} 
     2047+ 
     2048 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/TxCalRadioSetup */ 
     2049 static void b43_nphy_tx_cal_radio_setup(struct b43_wldev *dev) 
     2050 { 
     2051+       struct b43_phy *phy = &dev->phy; 
     2052        struct b43_phy_n *nphy = dev->phy.n; 
     2053        u16 *save = nphy->tx_rx_cal_radio_saveregs; 
     2054        u16 tmp; 
     2055        u8 offset, i; 
     2056  
     2057-       if (dev->phy.rev >= 3) { 
     2058+       if (phy->rev >= 19) { 
     2059+               b43_nphy_tx_cal_radio_setup_rev19(dev); 
     2060+       } else if (phy->rev >= 7) { 
     2061+               b43_nphy_tx_cal_radio_setup_rev7(dev); 
     2062+       } else if (phy->rev >= 3) { 
     2063            for (i = 0; i < 2; i++) { 
     2064                tmp = (i == 0) ? 0x2000 : 0x3000; 
     2065                offset = i * 11; 
     2066@@ -4290,7 +4754,7 @@ static void b43_nphy_int_pa_set_tx_dig_f 
    12622067                        b43_phy_write(dev, B43_PHY_N(offset[i] + j), 
    12632068                                        tbl_tx_filter_coef_rev4[i][j]); 
     
    12682073                        b43_phy_write(dev, B43_PHY_N(offset[0] + j), 
    12692074                                        tbl_tx_filter_coef_rev4[3][j]); 
    1270 @@ -4349,6 +4495,9 @@ static struct nphy_txgains b43_nphy_get_ 
     2075@@ -4325,7 +4789,13 @@ static struct nphy_txgains b43_nphy_get_ 
     2076                        b43_nphy_stay_in_carrier_search(dev, false); 
     2077  
     2078                for (i = 0; i < 2; ++i) { 
     2079-                       if (dev->phy.rev >= 3) { 
     2080+                       if (dev->phy.rev >= 7) { 
     2081+                               target.ipa[i] = curr_gain[i] & 0x0007; 
     2082+                               target.pad[i] = (curr_gain[i] & 0x00F8) >> 3; 
     2083+                               target.pga[i] = (curr_gain[i] & 0x0F00) >> 8; 
     2084+                               target.txgm[i] = (curr_gain[i] & 0x7000) >> 12; 
     2085+                               target.tx_lpf[i] = (curr_gain[i] & 0x8000) >> 15; 
     2086+                       } else if (dev->phy.rev >= 3) { 
     2087                                target.ipa[i] = curr_gain[i] & 0x000F; 
     2088                                target.pad[i] = (curr_gain[i] & 0x00F0) >> 4; 
     2089                                target.pga[i] = (curr_gain[i] & 0x0F00) >> 8; 
     2090@@ -4349,7 +4819,16 @@ static struct nphy_txgains b43_nphy_get_ 
    12712091  
    12722092                for (i = 0; i < 2; ++i) { 
    12732093                        table = b43_nphy_get_tx_gain_table(dev); 
     2094-                       if (dev->phy.rev >= 3) { 
    12742095+                       if (!table) 
    12752096+                               break; 
    12762097+ 
    1277                         if (dev->phy.rev >= 3) { 
     2098+                       if (dev->phy.rev >= 7) { 
     2099+                               target.ipa[i] = (table[index[i]] >> 16) & 0x7; 
     2100+                               target.pad[i] = (table[index[i]] >> 19) & 0x1F; 
     2101+                               target.pga[i] = (table[index[i]] >> 24) & 0xF; 
     2102+                               target.txgm[i] = (table[index[i]] >> 28) & 0x7; 
     2103+                               target.tx_lpf[i] = (table[index[i]] >> 31) & 0x1; 
     2104+                       } else if (dev->phy.rev >= 3) { 
    12782105                                target.ipa[i] = (table[index[i]] >> 16) & 0xF; 
    12792106                                target.pad[i] = (table[index[i]] >> 20) & 0xF; 
    1280 @@ -4504,8 +4653,9 @@ static void b43_nphy_save_cal(struct b43 
     2107                                target.pga[i] = (table[index[i]] >> 24) & 0xF; 
     2108@@ -4398,6 +4877,8 @@ static void b43_nphy_tx_cal_phy_cleanup( 
     2109 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/TxCalPhySetup */ 
     2110 static void b43_nphy_tx_cal_phy_setup(struct b43_wldev *dev) 
     2111 { 
     2112+       struct b43_phy *phy = &dev->phy; 
     2113+       struct b43_phy_n *nphy = dev->phy.n; 
     2114        u16 *regs = dev->phy.n->tx_rx_cal_phy_saveregs; 
     2115        u16 tmp; 
     2116  
     2117@@ -4429,7 +4910,12 @@ static void b43_nphy_tx_cal_phy_setup(st 
     2118                regs[7] = b43_phy_read(dev, B43_NPHY_RFCTL_INTC1); 
     2119                regs[8] = b43_phy_read(dev, B43_NPHY_RFCTL_INTC2); 
     2120  
     2121-               b43_nphy_rf_ctl_intc_override(dev, N_INTC_OVERRIDE_PA, 1, 3); 
     2122+               if (!nphy->use_int_tx_iq_lo_cal) 
     2123+                       b43_nphy_rf_ctl_intc_override(dev, N_INTC_OVERRIDE_PA, 
     2124+                                                     1, 3); 
     2125+               else 
     2126+                       b43_nphy_rf_ctl_intc_override(dev, N_INTC_OVERRIDE_PA, 
     2127+                                                     0, 3); 
     2128                b43_nphy_rf_ctl_intc_override(dev, N_INTC_OVERRIDE_TRSW, 2, 1); 
     2129                b43_nphy_rf_ctl_intc_override(dev, N_INTC_OVERRIDE_TRSW, 8, 2); 
     2130  
     2131@@ -4437,6 +4923,33 @@ static void b43_nphy_tx_cal_phy_setup(st 
     2132                regs[10] = b43_phy_read(dev, B43_NPHY_PAPD_EN1); 
     2133                b43_phy_mask(dev, B43_NPHY_PAPD_EN0, ~0x0001); 
     2134                b43_phy_mask(dev, B43_NPHY_PAPD_EN1, ~0x0001); 
     2135+ 
     2136+               tmp = b43_nphy_read_lpf_ctl(dev, 0); 
     2137+               if (phy->rev >= 19) 
     2138+                       b43_nphy_rf_ctl_override_rev19(dev, 0x80, tmp, 0, false, 
     2139+                                                      1); 
     2140+               else if (phy->rev >= 7) 
     2141+                       b43_nphy_rf_ctl_override_rev7(dev, 0x80, tmp, 0, false, 
     2142+                                                     1); 
     2143+ 
     2144+               if (nphy->use_int_tx_iq_lo_cal && true /* FIXME */) { 
     2145+                       if (phy->rev >= 19) { 
     2146+                               b43_nphy_rf_ctl_override_rev19(dev, 0x8, 0, 0x3, 
     2147+                                                              false, 0); 
     2148+                       } else if (phy->rev >= 8) { 
     2149+                               b43_nphy_rf_ctl_override_rev7(dev, 0x8, 0, 0x3, 
     2150+                                                             false, 0); 
     2151+                       } else if (phy->rev == 7) { 
     2152+                               b43_radio_maskset(dev, R2057_OVR_REG0, 1 << 4, 1 << 4); 
     2153+                               if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) { 
     2154+                                       b43_radio_maskset(dev, R2057_PAD2G_TUNE_PUS_CORE0, ~1, 0); 
     2155+                                       b43_radio_maskset(dev, R2057_PAD2G_TUNE_PUS_CORE1, ~1, 0); 
     2156+                               } else { 
     2157+                                       b43_radio_maskset(dev, R2057_IPA5G_CASCOFFV_PU_CORE0, ~1, 0); 
     2158+                                       b43_radio_maskset(dev, R2057_IPA5G_CASCOFFV_PU_CORE1, ~1, 0); 
     2159+                               } 
     2160+                       } 
     2161+               } 
     2162        } else { 
     2163                b43_phy_maskset(dev, B43_NPHY_AFECTL_C1, 0x0FFF, 0xA000); 
     2164                b43_phy_maskset(dev, B43_NPHY_AFECTL_C2, 0x0FFF, 0xA000); 
     2165@@ -4465,6 +4978,7 @@ static void b43_nphy_tx_cal_phy_setup(st 
     2166 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/SaveCal */ 
     2167 static void b43_nphy_save_cal(struct b43_wldev *dev) 
     2168 { 
     2169+       struct b43_phy *phy = &dev->phy; 
     2170        struct b43_phy_n *nphy = dev->phy.n; 
     2171  
     2172        struct b43_phy_n_iq_comp *rxcal_coeffs = NULL; 
     2173@@ -4489,7 +5003,26 @@ static void b43_nphy_save_cal(struct b43 
     2174  
     2175        b43_nphy_rx_iq_coeffs(dev, false, rxcal_coeffs); 
     2176        /* TODO use some definitions */ 
     2177-       if (dev->phy.rev >= 3) { 
     2178+       if (phy->rev >= 19) { 
     2179+               /* TODO */ 
     2180+       } else if (phy->rev >= 7) { 
     2181+               txcal_radio_regs[0] = b43_radio_read(dev, 
     2182+                                                    R2057_TX0_LOFT_FINE_I); 
     2183+               txcal_radio_regs[1] = b43_radio_read(dev, 
     2184+                                                    R2057_TX0_LOFT_FINE_Q); 
     2185+               txcal_radio_regs[4] = b43_radio_read(dev, 
     2186+                                                    R2057_TX0_LOFT_COARSE_I); 
     2187+               txcal_radio_regs[5] = b43_radio_read(dev, 
     2188+                                                    R2057_TX0_LOFT_COARSE_Q); 
     2189+               txcal_radio_regs[2] = b43_radio_read(dev, 
     2190+                                                    R2057_TX1_LOFT_FINE_I); 
     2191+               txcal_radio_regs[3] = b43_radio_read(dev, 
     2192+                                                    R2057_TX1_LOFT_FINE_Q); 
     2193+               txcal_radio_regs[6] = b43_radio_read(dev, 
     2194+                                                    R2057_TX1_LOFT_COARSE_I); 
     2195+               txcal_radio_regs[7] = b43_radio_read(dev, 
     2196+                                                    R2057_TX1_LOFT_COARSE_Q); 
     2197+       } else if (phy->rev >= 3) { 
     2198                txcal_radio_regs[0] = b43_radio_read(dev, 0x2021); 
     2199                txcal_radio_regs[1] = b43_radio_read(dev, 0x2022); 
     2200                txcal_radio_regs[2] = b43_radio_read(dev, 0x3021); 
     2201@@ -4504,8 +5037,9 @@ static void b43_nphy_save_cal(struct b43 
    12812202                txcal_radio_regs[2] = b43_radio_read(dev, 0x8D); 
    12822203                txcal_radio_regs[3] = b43_radio_read(dev, 0xBC); 
     
    12902211  
    12912212        if (nphy->hang_avoid) 
    1292 @@ -4585,6 +4735,7 @@ static int b43_nphy_cal_tx_iq_lo(struct 
     2213@@ -4515,6 +5049,7 @@ static void b43_nphy_save_cal(struct b43 
     2214 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RestoreCal */ 
     2215 static void b43_nphy_restore_cal(struct b43_wldev *dev) 
     2216 { 
     2217+       struct b43_phy *phy = &dev->phy; 
     2218        struct b43_phy_n *nphy = dev->phy.n; 
     2219  
     2220        u16 coef[4]; 
     2221@@ -4562,7 +5097,26 @@ static void b43_nphy_restore_cal(struct 
     2222        } 
     2223  
     2224        /* TODO use some definitions */ 
     2225-       if (dev->phy.rev >= 3) { 
     2226+       if (phy->rev >= 19) { 
     2227+               /* TODO */ 
     2228+       } else if (phy->rev >= 7) { 
     2229+               b43_radio_write(dev, R2057_TX0_LOFT_FINE_I, 
     2230+                               txcal_radio_regs[0]); 
     2231+               b43_radio_write(dev, R2057_TX0_LOFT_FINE_Q, 
     2232+                               txcal_radio_regs[1]); 
     2233+               b43_radio_write(dev, R2057_TX0_LOFT_COARSE_I, 
     2234+                               txcal_radio_regs[4]); 
     2235+               b43_radio_write(dev, R2057_TX0_LOFT_COARSE_Q, 
     2236+                               txcal_radio_regs[5]); 
     2237+               b43_radio_write(dev, R2057_TX1_LOFT_FINE_I, 
     2238+                               txcal_radio_regs[2]); 
     2239+               b43_radio_write(dev, R2057_TX1_LOFT_FINE_Q, 
     2240+                               txcal_radio_regs[3]); 
     2241+               b43_radio_write(dev, R2057_TX1_LOFT_COARSE_I, 
     2242+                               txcal_radio_regs[6]); 
     2243+               b43_radio_write(dev, R2057_TX1_LOFT_COARSE_Q, 
     2244+                               txcal_radio_regs[7]); 
     2245+       } else if (phy->rev >= 3) { 
     2246                b43_radio_write(dev, 0x2021, txcal_radio_regs[0]); 
     2247                b43_radio_write(dev, 0x2022, txcal_radio_regs[1]); 
     2248                b43_radio_write(dev, 0x3021, txcal_radio_regs[2]); 
     2249@@ -4585,6 +5139,7 @@ static int b43_nphy_cal_tx_iq_lo(struct 
    12932250                                struct nphy_txgains target, 
    12942251                                bool full, bool mphase) 
     
    12982255        int i; 
    12992256        int error = 0; 
    1300 @@ -4625,7 +4776,7 @@ static int b43_nphy_cal_tx_iq_lo(struct 
     2257@@ -4625,7 +5180,7 @@ static int b43_nphy_cal_tx_iq_lo(struct 
    13012258                (dev->phy.rev == 5 && nphy->ipa2g_on && 
    13022259                b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ); 
     
    13072264                                        tbl_tx_iqlo_cal_loft_ladder_40); 
    13082265                        b43_ntab_write_bulk(dev, B43_NTAB16(15, 32), 18, 
    1309 @@ -4640,16 +4791,16 @@ static int b43_nphy_cal_tx_iq_lo(struct 
    1310   
    1311         b43_phy_write(dev, B43_NPHY_IQLOCAL_CMDGCTL, 0x8AA9); 
     2266@@ -4638,18 +5193,24 @@ static int b43_nphy_cal_tx_iq_lo(struct 
     2267                } 
     2268        } 
     2269  
     2270-       b43_phy_write(dev, B43_NPHY_IQLOCAL_CMDGCTL, 0x8AA9); 
     2271+       if (phy->rev >= 19) { 
     2272+               /* TODO */ 
     2273+       } else if (phy->rev >= 7) { 
     2274+               b43_phy_write(dev, B43_NPHY_IQLOCAL_CMDGCTL, 0x8AD9); 
     2275+       } else { 
     2276+               b43_phy_write(dev, B43_NPHY_IQLOCAL_CMDGCTL, 0x8AA9); 
     2277+       } 
    13122278  
    13132279-       if (!dev->phy.is_40mhz) 
     
    13282294        if (error == 0) { 
    13292295                if (nphy->mphase_cal_phase_id > 2) { 
    1330 @@ -4777,9 +4928,9 @@ static int b43_nphy_cal_tx_iq_lo(struct 
     2296@@ -4777,9 +5338,9 @@ static int b43_nphy_cal_tx_iq_lo(struct 
    13312297                                                nphy->txiqlocal_bestc); 
    13322298                        nphy->txiqlocal_coeffsvalid = true; 
     
    13402306                        length = 11; 
    13412307                        if (dev->phy.rev < 3) 
    1342 @@ -4815,8 +4966,8 @@ static void b43_nphy_reapply_tx_cal_coef 
     2308@@ -4815,8 +5376,8 @@ static void b43_nphy_reapply_tx_cal_coef 
    13432309        bool equal = true; 
    13442310  
     
    13512317  
    13522318        b43_ntab_read_bulk(dev, B43_NTAB16(15, 80), 7, buffer); 
    1353 @@ -4972,11 +5123,11 @@ static int b43_nphy_rev2_cal_rx_iq(struc 
     2319@@ -4972,11 +5533,11 @@ static int b43_nphy_rev2_cal_rx_iq(struc 
    13542320                        if (playtone) { 
    13552321                                ret = b43_nphy_tx_tone(dev, 4000, 
     
    13662332  
    13672333                        if (ret == 0) { 
    1368 @@ -5348,7 +5499,7 @@ static int b43_phy_initn(struct b43_wlde 
     2334@@ -5032,6 +5593,9 @@ static int b43_nphy_rev3_cal_rx_iq(struc 
     2335 static int b43_nphy_cal_rx_iq(struct b43_wldev *dev, 
     2336                        struct nphy_txgains target, u8 type, bool debug) 
     2337 { 
     2338+       if (dev->phy.rev >= 7) 
     2339+               type = 0; 
     2340+ 
     2341        if (dev->phy.rev >= 3) 
     2342                return b43_nphy_rev3_cal_rx_iq(dev, target, type, debug); 
     2343        else 
     2344@@ -5118,6 +5682,9 @@ static void b43_nphy_bphy_init(struct b4 
     2345 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/SuperSwitchInit */ 
     2346 static void b43_nphy_superswitch_init(struct b43_wldev *dev, bool init) 
     2347 { 
     2348+       if (dev->phy.rev >= 7) 
     2349+               return; 
     2350+ 
     2351        if (dev->phy.rev >= 3) { 
     2352                if (!init) 
     2353                        return; 
     2354@@ -5193,6 +5760,10 @@ static int b43_phy_initn(struct b43_wlde 
     2355 #endif 
     2356                } 
     2357        } 
     2358+       nphy->use_int_tx_iq_lo_cal = b43_nphy_ipa(dev) || 
     2359+               phy->rev >= 7 || 
     2360+               (phy->rev >= 5 && 
     2361+                sprom->boardflags2_hi & B43_BFH2_INTERNDET_TXIQCAL); 
     2362        nphy->deaf_count = 0; 
     2363        b43_nphy_tables_init(dev); 
     2364        nphy->crsminpwr_adjusted = false; 
     2365@@ -5202,6 +5773,16 @@ static int b43_phy_initn(struct b43_wlde 
     2366        if (dev->phy.rev >= 3) { 
     2367                b43_phy_write(dev, B43_NPHY_TXF_40CO_B1S1, 0); 
     2368                b43_phy_write(dev, B43_NPHY_RFCTL_OVER, 0); 
     2369+               if (phy->rev >= 7) { 
     2370+                       b43_phy_write(dev, B43_NPHY_REV7_RF_CTL_OVER3, 0); 
     2371+                       b43_phy_write(dev, B43_NPHY_REV7_RF_CTL_OVER4, 0); 
     2372+                       b43_phy_write(dev, B43_NPHY_REV7_RF_CTL_OVER5, 0); 
     2373+                       b43_phy_write(dev, B43_NPHY_REV7_RF_CTL_OVER6, 0); 
     2374+               } 
     2375+               if (phy->rev >= 19) { 
     2376+                       /* TODO */ 
     2377+               } 
     2378+ 
     2379                b43_phy_write(dev, B43_NPHY_TXF_40CO_B1S0, 0); 
     2380                b43_phy_write(dev, B43_NPHY_TXF_40CO_B32S1, 0); 
     2381        } else { 
     2382@@ -5239,7 +5820,9 @@ static int b43_phy_initn(struct b43_wlde 
     2383        b43_phy_write(dev, B43_NPHY_PLOAD_CSENSE_EXTLEN, 0x50); 
     2384        b43_phy_write(dev, B43_NPHY_TXRIFS_FRDEL, 0x30); 
     2385  
     2386-       b43_nphy_update_mimo_config(dev, nphy->preamble_override); 
     2387+       if (phy->rev < 8) 
     2388+               b43_nphy_update_mimo_config(dev, nphy->preamble_override); 
     2389+ 
     2390        b43_nphy_update_txrx_chain(dev); 
     2391  
     2392        if (phy->rev < 2) { 
     2393@@ -5271,10 +5854,12 @@ static int b43_phy_initn(struct b43_wlde 
     2394  
     2395        b43_mac_phy_clock_set(dev, true); 
     2396  
     2397-       b43_nphy_pa_override(dev, false); 
     2398-       b43_nphy_force_rf_sequence(dev, B43_RFSEQ_RX2TX); 
     2399-       b43_nphy_force_rf_sequence(dev, B43_RFSEQ_RESET2RX); 
     2400-       b43_nphy_pa_override(dev, true); 
     2401+       if (phy->rev < 7) { 
     2402+               b43_nphy_pa_override(dev, false); 
     2403+               b43_nphy_force_rf_sequence(dev, B43_RFSEQ_RX2TX); 
     2404+               b43_nphy_force_rf_sequence(dev, B43_RFSEQ_RESET2RX); 
     2405+               b43_nphy_pa_override(dev, true); 
     2406+       } 
     2407  
     2408        b43_nphy_classifier(dev, 0, 0); 
     2409        b43_nphy_read_clip_detection(dev, clip); 
     2410@@ -5348,7 +5933,7 @@ static int b43_phy_initn(struct b43_wlde 
    13692411        b43_phy_write(dev, B43_NPHY_TXMACDELAY, 0x0320); 
    13702412        if (phy->rev >= 3 && phy->rev <= 6) 
     
    13752417                b43_nphy_spur_workaround(dev); 
    13762418  
    1377 @@ -5434,14 +5585,14 @@ static void b43_nphy_channel_setup(struc 
     2419@@ -5434,14 +6019,14 @@ static void b43_nphy_channel_setup(struc 
    13782420        if (dev->phy.rev < 3) 
    13792421                b43_nphy_adjust_lna_gain_table(dev); 
     
    13922434                                avoid = true; 
    13932435                } else { /* 40MHz */ 
    1394 @@ -5488,10 +5639,17 @@ static int b43_nphy_set_channel(struct b 
     2436@@ -5488,10 +6073,20 @@ static int b43_nphy_set_channel(struct b 
    13952437  
    13962438        const struct b43_nphy_channeltab_entry_rev2 *tabent_r2 = NULL; 
     
    14022444  
    14032445-       if (dev->phy.rev >= 3) { 
    1404 +       if (phy->rev >= 7) { 
     2446+       if (phy->rev >= 19) { 
     2447+               return -ESRCH; 
     2448+               /* TODO */ 
     2449+       } else if (phy->rev >= 7) { 
    14052450+               r2057_get_chantabent_rev7(dev, channel->center_freq, 
    14062451+                                         &tabent_r7, &tabent_r7_2g); 
     
    14112456                                                        channel->center_freq); 
    14122457                if (!tabent_r3) 
    1413 @@ -5506,20 +5664,36 @@ static int b43_nphy_set_channel(struct b 
     2458@@ -5506,20 +6101,38 @@ static int b43_nphy_set_channel(struct b 
    14142459        /* Channel is set later in common code, but we need to set it on our 
    14152460           own to let this function's subcalls work properly. */ 
     
    14402485  
    14412486-       if (dev->phy.rev >= 3) { 
    1442 +       if (phy->rev >= 7) { 
     2487+       if (phy->rev >= 19) { 
     2488+               /* TODO */ 
     2489+       } else if (phy->rev >= 7) { 
    14432490+               const struct b43_phy_n_sfo_cfg *phy_regs = tabent_r7 ? 
    14442491+                       &(tabent_r7->phy_regs) : &(tabent_r7_2g->phy_regs); 
     
    14562503                b43_radio_maskset(dev, 0x08, 0xFFFB, tmp); 
    14572504                b43_radio_2056_setup(dev, tabent_r3); 
    1458 @@ -5561,7 +5735,6 @@ static void b43_nphy_op_prepare_structs( 
     2505@@ -5561,7 +6174,6 @@ static void b43_nphy_op_prepare_structs( 
    14592506        nphy->hang_avoid = (phy->rev == 3 || phy->rev == 4); 
    14602507        nphy->spur_avoid = (phy->rev >= 3) ? 
     
    14642511        nphy->txrx_chain = 2; /* sth different than 0 and 1 for now */ 
    14652512        nphy->phyrxchain = 3; /* to avoid b43_nphy_set_rx_core_state like wl */ 
    1466 @@ -5602,8 +5775,6 @@ static void b43_nphy_op_prepare_structs( 
     2513@@ -5602,8 +6214,6 @@ static void b43_nphy_op_prepare_structs( 
    14672514                nphy->ipa2g_on = sprom->fem.ghz2.extpa_gain == 2; 
    14682515                nphy->ipa5g_on = sprom->fem.ghz5.extpa_gain == 2; 
     
    14732520  
    14742521 static void b43_nphy_op_free(struct b43_wldev *dev) 
    1475 @@ -5714,10 +5885,12 @@ static void b43_nphy_op_software_rfkill( 
     2522@@ -5663,7 +6273,7 @@ static void b43_nphy_op_maskset(struct b 
     2523 static u16 b43_nphy_op_radio_read(struct b43_wldev *dev, u16 reg) 
     2524 { 
     2525        /* Register 1 is a 32-bit register. */ 
     2526-       B43_WARN_ON(reg == 1); 
     2527+       B43_WARN_ON(dev->phy.rev < 7 && reg == 1); 
     2528  
     2529        if (dev->phy.rev >= 7) 
     2530                reg |= 0x200; /* Radio 0x2057 */ 
     2531@@ -5677,7 +6287,7 @@ static u16 b43_nphy_op_radio_read(struct 
     2532 static void b43_nphy_op_radio_write(struct b43_wldev *dev, u16 reg, u16 value) 
     2533 { 
     2534        /* Register 1 is a 32-bit register. */ 
     2535-       B43_WARN_ON(reg == 1); 
     2536+       B43_WARN_ON(dev->phy.rev < 7 && reg == 1); 
     2537  
     2538        b43_write16(dev, B43_MMIO_RADIO_CONTROL, reg); 
     2539        b43_write16(dev, B43_MMIO_RADIO_DATA_LOW, value); 
     2540@@ -5687,15 +6297,23 @@ static void b43_nphy_op_radio_write(stru 
     2541 static void b43_nphy_op_software_rfkill(struct b43_wldev *dev, 
     2542                                        bool blocked) 
     2543 { 
     2544+       struct b43_phy *phy = &dev->phy; 
     2545+ 
     2546        if (b43_read32(dev, B43_MMIO_MACCTL) & B43_MACCTL_ENABLED) 
     2547                b43err(dev->wl, "MAC not suspended\n"); 
     2548  
     2549        if (blocked) { 
     2550-               b43_phy_mask(dev, B43_NPHY_RFCTL_CMD, 
     2551-                               ~B43_NPHY_RFCTL_CMD_CHIP0PU); 
     2552-               if (dev->phy.rev >= 7) { 
     2553+               if (phy->rev >= 19) { 
     2554                        /* TODO */ 
     2555-               } else if (dev->phy.rev >= 3) { 
     2556+               } else if (phy->rev >= 8) { 
     2557+                       b43_phy_mask(dev, B43_NPHY_RFCTL_CMD, 
     2558+                                    ~B43_NPHY_RFCTL_CMD_CHIP0PU); 
     2559+               } else if (phy->rev >= 7) { 
     2560+                       /* Nothing needed */ 
     2561+               } else if (phy->rev >= 3) { 
     2562+                       b43_phy_mask(dev, B43_NPHY_RFCTL_CMD, 
     2563+                                    ~B43_NPHY_RFCTL_CMD_CHIP0PU); 
     2564+ 
     2565                        b43_radio_mask(dev, 0x09, ~0x2); 
     2566  
     2567                        b43_radio_write(dev, 0x204D, 0); 
     2568@@ -5713,11 +6331,15 @@ static void b43_nphy_op_software_rfkill( 
     2569                        b43_radio_write(dev, 0x3064, 0); 
    14762570                } 
    14772571        } else { 
    1478                 if (dev->phy.rev >= 7) { 
     2572-               if (dev->phy.rev >= 7) { 
    14792573-                       b43_radio_2057_init(dev); 
     2574+               if (phy->rev >= 19) { 
     2575+                       /* TODO */ 
     2576+               } else if (phy->rev >= 7) { 
    14802577+                       if (!dev->phy.radio_on) 
    14812578+                               b43_radio_2057_init(dev); 
    14822579                        b43_switch_channel(dev, dev->phy.channel); 
    1483                 } else if (dev->phy.rev >= 3) { 
     2580-               } else if (dev->phy.rev >= 3) { 
    14842581-                       b43_radio_init2056(dev); 
     2582+               } else if (phy->rev >= 3) { 
    14852583+                       if (!dev->phy.radio_on) 
    14862584+                               b43_radio_init2056(dev); 
     
    14882586                } else { 
    14892587                        b43_radio_init2055(dev); 
     2588@@ -5728,10 +6350,13 @@ static void b43_nphy_op_software_rfkill( 
     2589 /* http://bcm-v4.sipsolutions.net/802.11/PHY/Anacore */ 
     2590 static void b43_nphy_op_switch_analog(struct b43_wldev *dev, bool on) 
     2591 { 
     2592+       struct b43_phy *phy = &dev->phy; 
     2593        u16 override = on ? 0x0 : 0x7FFF; 
     2594        u16 core = on ? 0xD : 0x00FD; 
     2595  
     2596-       if (dev->phy.rev >= 3) { 
     2597+       if (phy->rev >= 19) { 
     2598+               /* TODO */ 
     2599+       } else if (phy->rev >= 3) { 
     2600                if (on) { 
     2601                        b43_phy_write(dev, B43_NPHY_AFECTL_C1, core); 
     2602                        b43_phy_write(dev, B43_NPHY_AFECTL_OVER1, override); 
    14902603--- a/drivers/net/wireless/b43/phy_n.h 
    14912604+++ b/drivers/net/wireless/b43/phy_n.h 
    1492 @@ -931,7 +931,6 @@ struct b43_phy_n { 
     2605@@ -857,6 +857,15 @@ 
     2606 #define B43_NPHY_REV3_C2_CLIP2_GAIN_A          B43_PHY_N(0x2AF) 
     2607 #define B43_NPHY_REV3_C2_CLIP2_GAIN_B          B43_PHY_N(0x2B0) 
     2608  
     2609+#define B43_NPHY_REV7_RF_CTL_MISC_REG3         B43_PHY_N(0x340) 
     2610+#define B43_NPHY_REV7_RF_CTL_MISC_REG4         B43_PHY_N(0x341) 
     2611+#define B43_NPHY_REV7_RF_CTL_OVER3             B43_PHY_N(0x342) 
     2612+#define B43_NPHY_REV7_RF_CTL_OVER4             B43_PHY_N(0x343) 
     2613+#define B43_NPHY_REV7_RF_CTL_MISC_REG5         B43_PHY_N(0x344) 
     2614+#define B43_NPHY_REV7_RF_CTL_MISC_REG6         B43_PHY_N(0x345) 
     2615+#define B43_NPHY_REV7_RF_CTL_OVER5             B43_PHY_N(0x346) 
     2616+#define B43_NPHY_REV7_RF_CTL_OVER6             B43_PHY_N(0x347) 
     2617+ 
     2618 #define B43_PHY_B_BBCFG                                B43_PHY_N_BMODE(0x001) /* BB config */ 
     2619 #define B43_PHY_B_TEST                         B43_PHY_N_BMODE(0x00A) 
     2620  
     2621@@ -931,11 +940,12 @@ struct b43_phy_n { 
    14932622        u16 papd_epsilon_offset[2]; 
    14942623        s32 preamble_override; 
     
    14982627        bool gain_boost; 
    14992628        bool elna_gain_config; 
     2629        bool band5g_pwrgain; 
     2630+       bool use_int_tx_iq_lo_cal; 
     2631+       bool lpf_bw_overrode_for_sample_play; 
     2632  
     2633        u8 mphase_cal_phase_id; 
     2634        u16 mphase_txcal_cmdidx; 
    15002635--- a/drivers/net/wireless/b43/tables_nphy.c 
    15012636+++ b/drivers/net/wireless/b43/tables_nphy.c 
     
    17092844        0x1f41003c, 0x1f41003b, 0x1f410039, 0x1f410037, 
    17102845        0x1e410044, 0x1e410042, 0x1e410040, 0x1e41003e, 
    1711 @@ -2217,7 +2408,9 @@ static const u32 b43_ntab_tx_gain_rev3pl 
     2846@@ -2217,7 +2408,44 @@ static const u32 b43_ntab_tx_gain_rev3pl 
    17122847        0x1041003c, 0x1041003b, 0x10410039, 0x10410037, 
    17132848 }; 
    17142849  
    17152850-static const u32 b43_ntab_tx_gain_rev3_5ghz[] = { 
     2851+static const u32 b43_ntab_tx_gain_epa_rev3_hi_pwr_2g[] = { 
     2852+       0x0f410044, 0x0f410042, 0x0f410040, 0x0f41003e, 
     2853+       0x0f41003c, 0x0f41003b, 0x0f410039, 0x0f410037, 
     2854+       0x0e410044, 0x0e410042, 0x0e410040, 0x0e41003e, 
     2855+       0x0e41003c, 0x0e41003b, 0x0e410039, 0x0e410037, 
     2856+       0x0d410044, 0x0d410042, 0x0d410040, 0x0d41003e, 
     2857+       0x0d41003c, 0x0d41003b, 0x0d410039, 0x0d410037, 
     2858+       0x0c410044, 0x0c410042, 0x0c410040, 0x0c41003e, 
     2859+       0x0c41003c, 0x0c41003b, 0x0c410039, 0x0c410037, 
     2860+       0x0b410044, 0x0b410042, 0x0b410040, 0x0b41003e, 
     2861+       0x0b41003c, 0x0b41003b, 0x0b410039, 0x0b410037, 
     2862+       0x0a410044, 0x0a410042, 0x0a410040, 0x0a41003e, 
     2863+       0x0a41003c, 0x0a41003b, 0x0a410039, 0x0a410037, 
     2864+       0x09410044, 0x09410042, 0x09410040, 0x0941003e, 
     2865+       0x0941003c, 0x0941003b, 0x09410039, 0x09410037, 
     2866+       0x08410044, 0x08410042, 0x08410040, 0x0841003e, 
     2867+       0x0841003c, 0x0841003b, 0x08410039, 0x08410037, 
     2868+       0x07410044, 0x07410042, 0x07410040, 0x0741003e, 
     2869+       0x0741003c, 0x0741003b, 0x07410039, 0x07410037, 
     2870+       0x06410044, 0x06410042, 0x06410040, 0x0641003e, 
     2871+       0x0641003c, 0x0641003b, 0x06410039, 0x06410037, 
     2872+       0x05410044, 0x05410042, 0x05410040, 0x0541003e, 
     2873+       0x0541003c, 0x0541003b, 0x05410039, 0x05410037, 
     2874+       0x04410044, 0x04410042, 0x04410040, 0x0441003e, 
     2875+       0x0441003c, 0x0441003b, 0x04410039, 0x04410037, 
     2876+       0x03410044, 0x03410042, 0x03410040, 0x0341003e, 
     2877+       0x0341003c, 0x0341003b, 0x03410039, 0x03410037, 
     2878+       0x02410044, 0x02410042, 0x02410040, 0x0241003e, 
     2879+       0x0241003c, 0x0241003b, 0x02410039, 0x02410037, 
     2880+       0x01410044, 0x01410042, 0x01410040, 0x0141003e, 
     2881+       0x0141003c, 0x0141003b, 0x01410039, 0x01410037, 
     2882+       0x00410044, 0x00410042, 0x00410040, 0x0041003e, 
     2883+       0x0041003c, 0x0041003b, 0x00410039, 0x00410037 
     2884+}; 
     2885+ 
    17162886+/* EPA 5 GHz */ 
    17172887+ 
     
    17202890        0xcff7003c, 0xcff7003b, 0xcff70039, 0xcff70037, 
    17212891        0xcef70044, 0xcef70042, 0xcef70040, 0xcef7003e, 
    1722 @@ -2252,7 +2445,7 @@ static const u32 b43_ntab_tx_gain_rev3_5 
     2892@@ -2252,7 +2480,7 @@ static const u32 b43_ntab_tx_gain_rev3_5 
    17232893        0xc0f7003c, 0xc0f7003b, 0xc0f70039, 0xc0f70037, 
    17242894 }; 
     
    17292899        0x2ff2003c, 0x2ff2003b, 0x2ff20039, 0x2ff20037, 
    17302900        0x2ef20044, 0x2ef20042, 0x2ef20040, 0x2ef2003e, 
    1731 @@ -2287,7 +2480,7 @@ static const u32 b43_ntab_tx_gain_rev4_5 
     2901@@ -2287,7 +2515,42 @@ static const u32 b43_ntab_tx_gain_rev4_5 
    17322902        0x20d2003a, 0x20d20038, 0x20d20036, 0x20d20034, 
    17332903 }; 
    17342904  
    17352905-static const u32 b43_ntab_tx_gain_rev5plus_5ghz[] = { 
     2906+static const u32 b43_ntab_tx_gain_epa_rev4_hi_pwr_5g[] = { 
     2907+       0x2ff10044, 0x2ff10042, 0x2ff10040, 0x2ff1003e, 
     2908+       0x2ff1003c, 0x2ff1003b, 0x2ff10039, 0x2ff10037, 
     2909+       0x2ef10044, 0x2ef10042, 0x2ef10040, 0x2ef1003e, 
     2910+       0x2ef1003c, 0x2ef1003b, 0x2ef10039, 0x2ef10037, 
     2911+       0x2df10044, 0x2df10042, 0x2df10040, 0x2df1003e, 
     2912+       0x2df1003c, 0x2df1003b, 0x2df10039, 0x2df10037, 
     2913+       0x2cf10044, 0x2cf10042, 0x2cf10040, 0x2cf1003e, 
     2914+       0x2cf1003c, 0x2cf1003b, 0x2cf10039, 0x2cf10037, 
     2915+       0x2bf10044, 0x2bf10042, 0x2bf10040, 0x2bf1003e, 
     2916+       0x2bf1003c, 0x2bf1003b, 0x2bf10039, 0x2bf10037, 
     2917+       0x2af10044, 0x2af10042, 0x2af10040, 0x2af1003e, 
     2918+       0x2af1003c, 0x2af1003b, 0x2af10039, 0x2af10037, 
     2919+       0x29f10044, 0x29f10042, 0x29f10040, 0x29f1003e, 
     2920+       0x29f1003c, 0x29f1003b, 0x29f10039, 0x29f10037, 
     2921+       0x28f10044, 0x28f10042, 0x28f10040, 0x28f1003e, 
     2922+       0x28f1003c, 0x28f1003b, 0x28f10039, 0x28f10037, 
     2923+       0x27f10044, 0x27f10042, 0x27f10040, 0x27f1003e, 
     2924+       0x27f1003c, 0x27f1003b, 0x27f10039, 0x27f10037, 
     2925+       0x26f10044, 0x26f10042, 0x26f10040, 0x26f1003e, 
     2926+       0x26f1003c, 0x26f1003b, 0x26f10039, 0x26f10037, 
     2927+       0x25f10044, 0x25f10042, 0x25f10040, 0x25f1003e, 
     2928+       0x25f1003c, 0x25f1003b, 0x25f10039, 0x25f10037, 
     2929+       0x24f10044, 0x24f10042, 0x24f10040, 0x24f1003e, 
     2930+       0x24f1003c, 0x24f1003b, 0x24f10039, 0x24f10038, 
     2931+       0x23f10041, 0x23f10040, 0x23f1003f, 0x23f1003e, 
     2932+       0x23f1003c, 0x23f1003b, 0x23f10039, 0x23f10037, 
     2933+       0x22f10044, 0x22f10042, 0x22f10040, 0x22f1003e, 
     2934+       0x22f1003c, 0x22f1003b, 0x22f10039, 0x22f10037, 
     2935+       0x21f10044, 0x21f10042, 0x21f10040, 0x21f1003e, 
     2936+       0x21f1003c, 0x21f1003b, 0x21f10039, 0x21f10037, 
     2937+       0x20d10043, 0x20d10041, 0x20d1003e, 0x20d1003c, 
     2938+       0x20d1003a, 0x20d10038, 0x20d10036, 0x20d10034 
     2939+}; 
     2940+ 
    17362941+static const u32 b43_ntab_tx_gain_epa_rev5_5g[] = { 
    17372942        0x0f62004a, 0x0f620048, 0x0f620046, 0x0f620044, 
    17382943        0x0f620042, 0x0f620040, 0x0f62003e, 0x0f62003c, 
    17392944        0x0e620044, 0x0e620042, 0x0e620040, 0x0e62003e, 
    1740 @@ -2322,7 +2515,9 @@ static const u32 b43_ntab_tx_gain_rev5pl 
     2945@@ -2322,7 +2585,9 @@ static const u32 b43_ntab_tx_gain_rev5pl 
    17412946        0x0062003b, 0x00620039, 0x00620037, 0x00620035, 
    17422947 }; 
     
    17492954        0x5ff70028, 0x5ff70027, 0x5ff70026, 0x5ff70025, 
    17502955        0x5ef7002d, 0x5ef7002b, 0x5ef7002a, 0x5ef70029, 
    1751 @@ -2357,7 +2552,7 @@ static const u32 txpwrctrl_tx_gain_ipa[] 
     2956@@ -2357,7 +2622,7 @@ static const u32 txpwrctrl_tx_gain_ipa[] 
    17522957        0x50f70028, 0x50f70027, 0x50f70026, 0x50f70025, 
    17532958 }; 
     
    17582963        0x1ff70028, 0x1ff70027, 0x1ff70026, 0x1ff70025, 
    17592964        0x1ef7002d, 0x1ef7002b, 0x1ef7002a, 0x1ef70029, 
    1760 @@ -2392,7 +2587,7 @@ static const u32 txpwrctrl_tx_gain_ipa_r 
     2965@@ -2392,7 +2657,7 @@ static const u32 txpwrctrl_tx_gain_ipa_r 
    17612966        0x10f70028, 0x10f70027, 0x10f70026, 0x10f70025, 
    17622967 }; 
     
    17672972        0x0ff70028, 0x0ff70027, 0x0ff70026, 0x0ff70025, 
    17682973        0x0ef7002d, 0x0ef7002b, 0x0ef7002a, 0x0ef70029, 
    1769 @@ -2427,7 +2622,45 @@ static const u32 txpwrctrl_tx_gain_ipa_r 
     2974@@ -2427,7 +2692,81 @@ static const u32 txpwrctrl_tx_gain_ipa_r 
    17702975        0x00f70028, 0x00f70027, 0x00f70026, 0x00f70025, 
    17712976 }; 
    17722977  
    17732978-static const u32 txpwrctrl_tx_gain_ipa_5g[] = { 
     2979+/* Copied from brcmsmac (5.75.11): nphy_tpc_txgain_ipa_2g_2057rev5 */ 
     2980+static const u32 b43_ntab_tx_gain_ipa_2057_rev5_2g[] = { 
     2981+       0x30ff0031, 0x30e70031, 0x30e7002e, 0x30cf002e, 
     2982+       0x30bf002e, 0x30af002e, 0x309f002f, 0x307f0033, 
     2983+       0x307f0031, 0x307f002e, 0x3077002e, 0x306f002e, 
     2984+       0x3067002e, 0x305f002f, 0x30570030, 0x3057002d, 
     2985+       0x304f002e, 0x30470031, 0x3047002e, 0x3047002c, 
     2986+       0x30470029, 0x303f002c, 0x303f0029, 0x3037002d, 
     2987+       0x3037002a, 0x30370028, 0x302f002c, 0x302f002a, 
     2988+       0x302f0028, 0x302f0026, 0x3027002c, 0x30270029, 
     2989+       0x30270027, 0x30270025, 0x30270023, 0x301f002c, 
     2990+       0x301f002a, 0x301f0028, 0x301f0025, 0x301f0024, 
     2991+       0x301f0022, 0x301f001f, 0x3017002d, 0x3017002b, 
     2992+       0x30170028, 0x30170026, 0x30170024, 0x30170022, 
     2993+       0x30170020, 0x3017001e, 0x3017001d, 0x3017001b, 
     2994+       0x3017001a, 0x30170018, 0x30170017, 0x30170015, 
     2995+       0x300f002c, 0x300f0029, 0x300f0027, 0x300f0024, 
     2996+       0x300f0022, 0x300f0021, 0x300f001f, 0x300f001d, 
     2997+       0x300f001b, 0x300f001a, 0x300f0018, 0x300f0017, 
     2998+       0x300f0016, 0x300f0015, 0x300f0115, 0x300f0215, 
     2999+       0x300f0315, 0x300f0415, 0x300f0515, 0x300f0615, 
     3000+       0x300f0715, 0x300f0715, 0x300f0715, 0x300f0715, 
     3001+       0x300f0715, 0x300f0715, 0x300f0715, 0x300f0715, 
     3002+       0x300f0715, 0x300f0715, 0x300f0715, 0x300f0715, 
     3003+       0x300f0715, 0x300f0715, 0x300f0715, 0x300f0715, 
     3004+       0x300f0715, 0x300f0715, 0x300f0715, 0x300f0715, 
     3005+       0x300f0715, 0x300f0715, 0x300f0715, 0x300f0715, 
     3006+       0x300f0715, 0x300f0715, 0x300f0715, 0x300f0715, 
     3007+       0x300f0715, 0x300f0715, 0x300f0715, 0x300f0715, 
     3008+       0x300f0715, 0x300f0715, 0x300f0715, 0x300f0715, 
     3009+       0x300f0715, 0x300f0715, 0x300f0715, 0x300f0715, 
     3010+       0x300f0715, 0x300f0715, 0x300f0715, 0x300f0715, 
     3011+       0x300f0715, 0x300f0715, 0x300f0715, 0x300f0715, 
     3012+       0x300f0715, 0x300f0715, 0x300f0715, 0x300f0715, 
     3013+}; 
     3014+ 
    17743015+/* Extracted from MMIO dump of 6.30.223.141 */ 
    17753016+static const u32 b43_ntab_tx_gain_ipa_2057_rev9_2g[] = { 
     
    18143055        0x7ff7002f, 0x7ff7002e, 0x7ff7002d, 0x7ff7002b, 
    18153056        0x7ff7002a, 0x7ff70029, 0x7ff70028, 0x7ff70027, 
    1816 @@ -2462,6 +2695,42 @@ static const u32 txpwrctrl_tx_gain_ipa_5 
     3057@@ -2462,6 +2801,42 @@ static const u32 txpwrctrl_tx_gain_ipa_5 
    18173058        0x70f70021, 0x70f70020, 0x70f70020, 0x70f7001f, 
    18183059 }; 
     
    18573098        -114, -108, -98, -91, -84, -78, -70, -62, 
    18583099        -54, -46, -39, -31, -23, -15, -8, 0 
    1859 @@ -3031,31 +3300,8 @@ void b43_ntab_write_bulk(struct b43_wlde 
     3100@@ -3031,31 +3406,8 @@ void b43_ntab_write_bulk(struct b43_wlde 
    18603101                b43_ntab_write_bulk(dev, offset, ARRAY_SIZE(data), data); \ 
    18613102        } while (0) 
     
    18903131        ntab_upload(dev, B43_NTAB_C1_ESTPLT_R3, b43_ntab_estimatepowerlt1_r3); 
    18913132        ntab_upload(dev, B43_NTAB_C0_ADJPLT_R3, b43_ntab_adjustpower0_r3); 
    1892 @@ -3066,6 +3312,107 @@ static void b43_nphy_tables_init_rev3(st 
     3133@@ -3066,6 +3418,107 @@ static void b43_nphy_tables_init_rev3(st 
    18933134        ntab_upload(dev, B43_NTAB_C1_IQLT_R3, b43_ntab_iqlt1_r3); 
    18943135        ntab_upload(dev, B43_NTAB_C0_LOFEEDTH_R3, b43_ntab_loftlt0_r3); 
     
    19983239        /* Volatile tables */ 
    19993240        if (antswlut < ARRAY_SIZE(b43_ntab_antswctl_r3)) 
    2000 @@ -3078,20 +3425,22 @@ static void b43_nphy_tables_init_rev3(st 
     3241@@ -3078,20 +3531,22 @@ static void b43_nphy_tables_init_rev3(st 
    20013242 static void b43_nphy_tables_init_rev0(struct b43_wldev *dev) 
    20023243 { 
     
    20353276        /* Volatile tables */ 
    20363277        ntab_upload(dev, B43_NTAB_BDI, b43_ntab_bdi); 
    2037 @@ -3111,7 +3460,11 @@ static void b43_nphy_tables_init_rev0(st 
     3278@@ -3111,7 +3566,11 @@ static void b43_nphy_tables_init_rev0(st 
    20383279 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/InitTables */ 
    20393280 void b43_nphy_tables_init(struct b43_wldev *dev) 
     
    20483289        else 
    20493290                b43_nphy_tables_init_rev0(dev); 
    2050 @@ -3120,23 +3473,45 @@ void b43_nphy_tables_init(struct b43_wld 
     3291@@ -3120,23 +3579,51 @@ void b43_nphy_tables_init(struct b43_wld 
    20513292 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/GetIpaGainTbl */ 
    20523293 static const u32 *b43_nphy_get_ipa_gain_table(struct b43_wldev *dev) 
     
    20673308+                       if (phy->radio_rev == 9) 
    20683309+                               return b43_ntab_tx_gain_ipa_2057_rev9_2g; 
     3310+                       break; 
     3311+               case 8: 
     3312+                       if (phy->radio_rev == 5) 
     3313+                               return b43_ntab_tx_gain_ipa_2057_rev5_2g; 
     3314+                       break; 
    20693315+               case 6: 
    20703316+                       if (dev->dev->chip_id == BCMA_CHIP_ID_BCM47162) 
     
    20763322+               case 3: 
    20773323+                       return b43_ntab_tx_gain_ipa_rev3_2g; 
    2078 +               default: 
    2079 +                       b43err(dev->wl, 
    2080 +                              "No 2GHz IPA gain table available for this device\n"); 
    2081 +                       return NULL; 
    20823324                } 
     3325+ 
     3326+               b43err(dev->wl, 
     3327+                      "No 2GHz IPA gain table available for this device\n"); 
     3328+               return NULL; 
    20833329        } else { 
    20843330-               return txpwrctrl_tx_gain_ipa_5g; 
     
    20873333+                       if (phy->radio_rev == 9) 
    20883334+                               return b43_ntab_tx_gain_ipa_2057_rev9_5g; 
     3335+                       break; 
    20893336+               case 3 ... 6: 
    20903337+                       return b43_ntab_tx_gain_ipa_rev3_5g; 
    2091 +               default: 
    2092 +                       b43err(dev->wl, 
    2093 +                              "No 5GHz IPA gain table available for this device\n"); 
    2094 +                       return NULL; 
    20953338+               } 
     3339+ 
     3340+               b43err(dev->wl, 
     3341+                      "No 5GHz IPA gain table available for this device\n"); 
     3342+               return NULL; 
    20963343        } 
    20973344 } 
     
    21033350        struct ssb_sprom *sprom = dev->dev->bus_sprom; 
    21043351  
    2105 @@ -3148,19 +3523,36 @@ const u32 *b43_nphy_get_tx_gain_table(st 
     3352@@ -3148,19 +3635,36 @@ const u32 *b43_nphy_get_tx_gain_table(st 
    21063353            (dev->phy.n->ipa5g_on && band == IEEE80211_BAND_5GHZ)) { 
    21073354                return b43_nphy_get_ipa_gain_table(dev); 
     
    21213368-                       return b43_ntab_tx_gain_rev5plus_5ghz; 
    21223369+                               b43_ntab_tx_gain_epa_rev4_5g : 
    2123 +                               b43_ntab_tx_gain_epa_rev4_5g; /* FIXME */ 
     3370+                               b43_ntab_tx_gain_epa_rev4_hi_pwr_5g; 
    21243371+               case 3: 
    21253372+                       return b43_ntab_tx_gain_epa_rev3_5g; 
     
    21383385+               case 5: 
    21393386+                       if (sprom->fem.ghz5.extpa_gain == 3) 
    2140 +                               return b43_ntab_tx_gain_epa_rev3_2g; /* FIXME */ 
     3387+                               return b43_ntab_tx_gain_epa_rev3_hi_pwr_2g; 
    21413388+                       /* fall through */ 
    21423389+               case 4: 
     
    21513398 } 
    21523399  
    2153 @@ -3187,7 +3579,7 @@ struct nphy_gain_ctl_workaround_entry *b 
     3400@@ -3187,7 +3691,7 @@ struct nphy_gain_ctl_workaround_entry *b 
    21543401        /* Some workarounds to the workarounds... */ 
    21553402        if (ghz5 && dev->phy.rev >= 6) { 
     
    22943541        { 0x32, 0x00 }, { 0x33, 0x00 }, { 0x51, 0x70 }, { 0x59, 0x88 }, 
    22953542        { 0x5C, 0x20 }, { 0x62, 0x33 }, { 0x63, 0x0f }, { 0x64, 0x0f }, 
    2296 @@ -102,6 +103,47 @@ static u16 r2057_rev8_init[54][2] = { 
     3543@@ -102,6 +103,346 @@ static u16 r2057_rev8_init[54][2] = { 
    22973544        { 0x1A6, 0x00 }, { 0x1AA, 0x00 }, { 0x1AB, 0x00 }, { 0x1AC, 0x00 }, 
    22983545        { 0x1B7, 0x05 }, { 0x1C2, 0xa0 }, 
    22993546 }; 
    23003547+*/ 
     3548+ 
     3549+/* Extracted from MMIO dump of 6.30.223.141 */ 
     3550+static u16 r2057_rev9_init[][2] = { 
     3551+       { 0x27, 0x1f }, { 0x28, 0x0a }, { 0x29, 0x2f }, { 0x42, 0x1f }, 
     3552+       { 0x48, 0x3f }, { 0x5c, 0x41 }, { 0x63, 0x14 }, { 0x64, 0x12 }, 
     3553+       { 0x66, 0xff }, { 0x74, 0xa3 }, { 0x7b, 0x14 }, { 0x7c, 0x14 }, 
     3554+       { 0x7d, 0xee }, { 0x86, 0xc0 }, { 0xc4, 0x10 }, { 0xc9, 0x01 }, 
     3555+       { 0xe1, 0x41 }, { 0xe8, 0x14 }, { 0xe9, 0x12 }, { 0xeb, 0xff }, 
     3556+       { 0xf5, 0x0a }, { 0xf8, 0x09 }, { 0xf9, 0xa3 }, { 0x100, 0x14 }, 
     3557+       { 0x101, 0x10 }, { 0x102, 0xee }, { 0x10b, 0xc0 }, { 0x149, 0x10 }, 
     3558+       { 0x14e, 0x01 }, { 0x1b7, 0x05 }, { 0x1c2, 0xa0 }, 
     3559+}; 
    23013560+ 
    23023561+#define RADIOREGS7(r00, r01, r02, r03, r04, r05, r06, r07, r08, r09, \ 
     
    23323591+       .radio_lna5g_tune_core1                 = r27 
    23333592+ 
     3593+#define RADIOREGS7_2G(r00, r01, r02, r03, r04, r05, r06, r07, r08, r09, \ 
     3594+                     r10, r11, r12, r13, r14, r15, r16, r17) \ 
     3595+       .radio_vcocal_countval0                 = r00,  \ 
     3596+       .radio_vcocal_countval1                 = r01,  \ 
     3597+       .radio_rfpll_refmaster_sparextalsize    = r02,  \ 
     3598+       .radio_rfpll_loopfilter_r1              = r03,  \ 
     3599+       .radio_rfpll_loopfilter_c2              = r04,  \ 
     3600+       .radio_rfpll_loopfilter_c1              = r05,  \ 
     3601+       .radio_cp_kpd_idac                      = r06,  \ 
     3602+       .radio_rfpll_mmd0                       = r07,  \ 
     3603+       .radio_rfpll_mmd1                       = r08,  \ 
     3604+       .radio_vcobuf_tune                      = r09,  \ 
     3605+       .radio_logen_mx2g_tune                  = r10,  \ 
     3606+       .radio_logen_indbuf2g_tune              = r11,  \ 
     3607+       .radio_lna2g_tune_core0                 = r12,  \ 
     3608+       .radio_txmix2g_tune_boost_pu_core0      = r13,  \ 
     3609+       .radio_pad2g_tune_pus_core0             = r14,  \ 
     3610+       .radio_lna2g_tune_core1                 = r15,  \ 
     3611+       .radio_txmix2g_tune_boost_pu_core1      = r16,  \ 
     3612+       .radio_pad2g_tune_pus_core1             = r17 
     3613+ 
    23343614+#define PHYREGS(r0, r1, r2, r3, r4, r5)        \ 
    23353615+       .phy_regs.phy_bw1a      = r0,   \ 
     
    23393619+       .phy_regs.phy_bw5       = r4,   \ 
    23403620+       .phy_regs.phy_bw6       = r5 
     3621+ 
     3622+/* Copied from brcmsmac (5.75.11): chan_info_nphyrev8_2057_rev5 */ 
     3623+static const struct b43_nphy_chantabent_rev7_2g b43_nphy_chantab_phy_rev8_radio_rev5[] = { 
     3624+       { 
     3625+               .freq                   = 2412, 
     3626+               RADIOREGS7_2G(0x48, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x6c, 
     3627+                             0x09, 0x0d, 0x08, 0x0e, 0x61, 0x03, 0xff, 0x61, 
     3628+                             0x03, 0xff), 
     3629+               PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443), 
     3630+       }, 
     3631+       { 
     3632+               .freq                   = 2417, 
     3633+               RADIOREGS7_2G(0x4b, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x71, 
     3634+                             0x09, 0x0d, 0x08, 0x0e, 0x61, 0x03, 0xff, 0x61, 
     3635+                             0x03, 0xff), 
     3636+               PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441), 
     3637+       }, 
     3638+       { 
     3639+               .freq                   = 2422, 
     3640+               RADIOREGS7_2G(0x4e, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x76, 
     3641+                             0x09, 0x0d, 0x08, 0x0e, 0x61, 0x03, 0xef, 0x61, 
     3642+                             0x03, 0xef), 
     3643+               PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f), 
     3644+       }, 
     3645+       { 
     3646+               .freq                   = 2427, 
     3647+               RADIOREGS7_2G(0x52, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x7b, 
     3648+                             0x09, 0x0c, 0x08, 0x0e, 0x61, 0x03, 0xdf, 0x61, 
     3649+                             0x03, 0xdf), 
     3650+               PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d), 
     3651+       }, 
     3652+       { 
     3653+               .freq                   = 2432, 
     3654+               RADIOREGS7_2G(0x55, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x80, 
     3655+                             0x09, 0x0c, 0x07, 0x0d, 0x61, 0x03, 0xcf, 0x61, 
     3656+                             0x03, 0xcf), 
     3657+               PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a), 
     3658+       }, 
     3659+       { 
     3660+               .freq                   = 2437, 
     3661+               RADIOREGS7_2G(0x58, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x85, 
     3662+                             0x09, 0x0c, 0x07, 0x0d, 0x61, 0x03, 0xbf, 0x61, 
     3663+                             0x03, 0xbf), 
     3664+               PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438), 
     3665+       }, 
     3666+       { 
     3667+               .freq                   = 2442, 
     3668+               RADIOREGS7_2G(0x5c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8a, 
     3669+                             0x09, 0x0b, 0x07, 0x0d, 0x61, 0x03, 0xaf, 0x61, 
     3670+                             0x03, 0xaf), 
     3671+               PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436), 
     3672+       }, 
     3673+       { 
     3674+               .freq                   = 2447, 
     3675+               RADIOREGS7_2G(0x5f, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8f, 
     3676+                             0x09, 0x0b, 0x07, 0x0d, 0x61, 0x03, 0x9f, 0x61, 
     3677+                             0x03, 0x9f), 
     3678+               PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434), 
     3679+       }, 
     3680+       { 
     3681+               .freq                   = 2452, 
     3682+               RADIOREGS7_2G(0x62, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x94, 
     3683+                             0x09, 0x0b, 0x07, 0x0d, 0x61, 0x03, 0x8f, 0x61, 
     3684+                             0x03, 0x8f), 
     3685+               PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431), 
     3686+       }, 
     3687+       { 
     3688+               .freq                   = 2457, 
     3689+               RADIOREGS7_2G(0x66, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x99, 
     3690+                             0x09, 0x0b, 0x07, 0x0c, 0x61, 0x03, 0x7f, 0x61, 
     3691+                             0x03, 0x7f), 
     3692+               PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f), 
     3693+       }, 
     3694+       { 
     3695+               .freq                   = 2462, 
     3696+               RADIOREGS7_2G(0x69, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x9e, 
     3697+                             0x09, 0x0b, 0x07, 0x0c, 0x61, 0x03, 0x6f, 0x61, 
     3698+                             0x03, 0x6f), 
     3699+               PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d), 
     3700+       }, 
     3701+       { 
     3702+               .freq                   = 2467, 
     3703+               RADIOREGS7_2G(0x6c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xa3, 
     3704+                             0x09, 0x0b, 0x06, 0x0c, 0x61, 0x03, 0x5f, 0x61, 
     3705+                             0x03, 0x5f), 
     3706+               PHYREGS(0x03df, 0x03db, 0x03d7, 0x0422, 0x0427, 0x042b), 
     3707+       }, 
     3708+       { 
     3709+               .freq                   = 2472, 
     3710+               RADIOREGS7_2G(0x70, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xa8, 
     3711+                             0x09, 0x0a, 0x06, 0x0b, 0x61, 0x03, 0x4f, 0x61, 
     3712+                             0x03, 0x4f), 
     3713+               PHYREGS(0x03e1, 0x03dd, 0x03d9, 0x0420, 0x0424, 0x0429), 
     3714+       }, 
     3715+       { 
     3716+               .freq                   = 2484, 
     3717+               RADIOREGS7_2G(0x78, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xb4, 
     3718+                             0x09, 0x0a, 0x06, 0x0b, 0x61, 0x03, 0x3f, 0x61, 
     3719+                             0x03, 0x3f), 
     3720+               PHYREGS(0x03e6, 0x03e2, 0x03de, 0x041b, 0x041f, 0x0424), 
     3721+       } 
     3722+}; 
     3723+ 
     3724+/* Extracted from MMIO dump of 6.30.223.141 */ 
     3725+static const struct b43_nphy_chantabent_rev7 b43_nphy_chantab_phy_rev16_radio_rev9[] = { 
     3726+       { 
     3727+               .freq                   = 2412, 
     3728+               RADIOREGS7(0x48, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x6c, 
     3729+                          0x09, 0x0f, 0x0a, 0x00, 0x0a, 0x00, 0x41, 0x63, 
     3730+                          0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 
     3731+                          0x00, 0x00, 0xf0, 0x00), 
     3732+               PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443), 
     3733+       }, 
     3734+       { 
     3735+               .freq                   = 2417, 
     3736+               RADIOREGS7(0x4b, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x71, 
     3737+                          0x09, 0x0f, 0x0a, 0x00, 0x0a, 0x00, 0x41, 0x63, 
     3738+                          0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 
     3739+                          0x00, 0x00, 0xf0, 0x00), 
     3740+               PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441), 
     3741+       }, 
     3742+       { 
     3743+               .freq                   = 2422, 
     3744+               RADIOREGS7(0x4e, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x76, 
     3745+                          0x09, 0x0f, 0x09, 0x00, 0x09, 0x00, 0x41, 0x63, 
     3746+                          0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 
     3747+                          0x00, 0x00, 0xf0, 0x00), 
     3748+               PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f), 
     3749+       }, 
     3750+       { 
     3751+               .freq                   = 2427, 
     3752+               RADIOREGS7(0x52, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x7b, 
     3753+                          0x09, 0x0f, 0x09, 0x00, 0x09, 0x00, 0x41, 0x63, 
     3754+                          0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 
     3755+                          0x00, 0x00, 0xf0, 0x00), 
     3756+               PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d), 
     3757+       }, 
     3758+       { 
     3759+               .freq                   = 2432, 
     3760+               RADIOREGS7(0x55, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x80, 
     3761+                          0x09, 0x0f, 0x08, 0x00, 0x08, 0x00, 0x41, 0x63, 
     3762+                          0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 
     3763+                          0x00, 0x00, 0xf0, 0x00), 
     3764+               PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a), 
     3765+       }, 
     3766+       { 
     3767+               .freq                   = 2437, 
     3768+               RADIOREGS7(0x58, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x85, 
     3769+                          0x09, 0x0f, 0x08, 0x00, 0x08, 0x00, 0x41, 0x63, 
     3770+                          0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 
     3771+                          0x00, 0x00, 0xf0, 0x00), 
     3772+               PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438), 
     3773+       }, 
     3774+       { 
     3775+               .freq                   = 2442, 
     3776+               RADIOREGS7(0x5c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8a, 
     3777+                          0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x41, 0x63, 
     3778+                          0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 
     3779+                          0x00, 0x00, 0xf0, 0x00), 
     3780+               PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436), 
     3781+       }, 
     3782+       { 
     3783+               .freq                   = 2447, 
     3784+               RADIOREGS7(0x5f, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8f, 
     3785+                          0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x41, 0x63, 
     3786+                          0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 
     3787+                          0x00, 0x00, 0xf0, 0x00), 
     3788+               PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434), 
     3789+       }, 
     3790+       { 
     3791+               .freq                   = 2452, 
     3792+               RADIOREGS7(0x62, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x94, 
     3793+                          0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x41, 0x63, 
     3794+                          0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 
     3795+                          0x00, 0x00, 0xf0, 0x00), 
     3796+               PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431), 
     3797+       }, 
     3798+       { 
     3799+               .freq                   = 2457, 
     3800+               RADIOREGS7(0x66, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x99, 
     3801+                          0x09, 0x0f, 0x06, 0x00, 0x06, 0x00, 0x41, 0x63, 
     3802+                          0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 
     3803+                          0x00, 0x00, 0xf0, 0x00), 
     3804+               PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f), 
     3805+       }, 
     3806+       { 
     3807+               .freq                   = 2462, 
     3808+               RADIOREGS7(0x69, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x9e, 
     3809+                          0x09, 0x0f, 0x06, 0x00, 0x06, 0x00, 0x41, 0x63, 
     3810+                          0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, 
     3811+                          0x00, 0x00, 0xf0, 0x00), 
     3812+               PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d), 
     3813+       }, 
     3814+       { 
     3815+               .freq                   = 5180, 
     3816+               RADIOREGS7(0xbe, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x06, 
     3817+                          0x02, 0x0e, 0x00, 0x0e, 0x00, 0x9e, 0x00, 0x00, 
     3818+                          0x9f, 0x2f, 0xa3, 0x00, 0xfc, 0x00, 0x00, 0x4f, 
     3819+                          0x3a, 0x83, 0x00, 0xfc), 
     3820+               PHYREGS(0x081c, 0x0818, 0x0814, 0x01f9, 0x01fa, 0x01fb), 
     3821+       }, 
     3822+       { 
     3823+               .freq                   = 5200, 
     3824+               RADIOREGS7(0xc5, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x08, 
     3825+                          0x02, 0x0e, 0x00, 0x0e, 0x00, 0x9e, 0x00, 0x00, 
     3826+                          0x7f, 0x2f, 0x83, 0x00, 0xf8, 0x00, 0x00, 0x4c, 
     3827+                          0x4a, 0x83, 0x00, 0xf8), 
     3828+               PHYREGS(0x0824, 0x0820, 0x081c, 0x01f7, 0x01f8, 0x01f9), 
     3829+       }, 
     3830+       { 
     3831+               .freq                   = 5220, 
     3832+               RADIOREGS7(0xcc, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x0a, 
     3833+                          0x02, 0x0e, 0x00, 0x0e, 0x00, 0x9e, 0x00, 0x00, 
     3834+                          0x6d, 0x3d, 0x83, 0x00, 0xf8, 0x00, 0x00, 0x2d, 
     3835+                          0x2a, 0x73, 0x00, 0xf8), 
     3836+               PHYREGS(0x082c, 0x0828, 0x0824, 0x01f5, 0x01f6, 0x01f7), 
     3837+       }, 
     3838+       { 
     3839+               .freq                   = 5240, 
     3840+               RADIOREGS7(0xd2, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x0c, 
     3841+                          0x02, 0x0d, 0x00, 0x0d, 0x00, 0x8d, 0x00, 0x00, 
     3842+                          0x4d, 0x1c, 0x73, 0x00, 0xf8, 0x00, 0x00, 0x4d, 
     3843+                          0x2b, 0x73, 0x00, 0xf8), 
     3844+               PHYREGS(0x0834, 0x0830, 0x082c, 0x01f3, 0x01f4, 0x01f5), 
     3845+       }, 
     3846+       { 
     3847+               .freq                   = 5745, 
     3848+               RADIOREGS7(0x7b, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x7d, 
     3849+                          0x04, 0x08, 0x00, 0x06, 0x00, 0x15, 0x00, 0x00, 
     3850+                          0x08, 0x03, 0x03, 0x00, 0x30, 0x00, 0x00, 0x06, 
     3851+                          0x02, 0x03, 0x00, 0x30), 
     3852+               PHYREGS(0x08fe, 0x08fa, 0x08f6, 0x01c8, 0x01c8, 0x01c9), 
     3853+       }, 
     3854+       { 
     3855+               .freq                   = 5765, 
     3856+               RADIOREGS7(0x81, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x81, 
     3857+                          0x04, 0x08, 0x00, 0x06, 0x00, 0x15, 0x00, 0x00, 
     3858+                          0x06, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 
     3859+                          0x02, 0x03, 0x00, 0x00), 
     3860+               PHYREGS(0x0906, 0x0902, 0x08fe, 0x01c6, 0x01c7, 0x01c8), 
     3861+       }, 
     3862+       { 
     3863+               .freq                   = 5785, 
     3864+               RADIOREGS7(0x88, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x85, 
     3865+                          0x04, 0x08, 0x00, 0x06, 0x00, 0x15, 0x00, 0x00, 
     3866+                          0x08, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, 
     3867+                          0x21, 0x03, 0x00, 0x00), 
     3868+               PHYREGS(0x090e, 0x090a, 0x0906, 0x01c4, 0x01c5, 0x01c6), 
     3869+       }, 
     3870+       { 
     3871+               .freq                   = 5805, 
     3872+               RADIOREGS7(0x8f, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x89, 
     3873+                          0x04, 0x07, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 
     3874+                          0x06, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 
     3875+                          0x00, 0x03, 0x00, 0x00), 
     3876+               PHYREGS(0x0916, 0x0912, 0x090e, 0x01c3, 0x01c4, 0x01c4), 
     3877+       }, 
     3878+       { 
     3879+               .freq                   = 5825, 
     3880+               RADIOREGS7(0x95, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x8d, 
     3881+                          0x04, 0x07, 0x00, 0x05, 0x00, 0x03, 0x00, 0x00, 
     3882+                          0x05, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 
     3883+                          0x00, 0x03, 0x00, 0x00), 
     3884+               PHYREGS(0x091e, 0x091a, 0x0916, 0x01c1, 0x01c2, 0x01c3), 
     3885+       }, 
     3886+}; 
    23413887  
    23423888 void r2057_upload_inittabs(struct b43_wldev *dev) 
    23433889 { 
    2344 @@ -109,33 +151,69 @@ void r2057_upload_inittabs(struct b43_wl 
     3890@@ -109,33 +450,87 @@ void r2057_upload_inittabs(struct b43_wl 
    23453891        u16 *table = NULL; 
    23463892        u16 size, i; 
     
    23783924+               } 
    23793925+               break; 
     3926+       case 16: 
     3927+               if (phy->radio_rev == 9) { 
     3928+                       table = r2057_rev9_init[0]; 
     3929+                       size = ARRAY_SIZE(r2057_rev9_init); 
     3930+               } 
     3931+               break; 
    23803932        } 
    23813933  
     
    24073959+       /* TODO */ 
    24083960+       switch (phy->rev) { 
     3961+       case 8: 
     3962+               if (phy->radio_rev == 5) { 
     3963+                       e_r7_2g = b43_nphy_chantab_phy_rev8_radio_rev5; 
     3964+                       len = ARRAY_SIZE(b43_nphy_chantab_phy_rev8_radio_rev5); 
     3965+               } 
     3966+               break; 
     3967+       case 16: 
     3968+               if (phy->radio_rev == 9) { 
     3969+                       e_r7 = b43_nphy_chantab_phy_rev16_radio_rev9; 
     3970+                       len = ARRAY_SIZE(b43_nphy_chantab_phy_rev16_radio_rev9); 
     3971+               } 
     3972+               break; 
    24093973+       default: 
    24103974+               break; 
     
    24313995--- a/drivers/net/wireless/b43/radio_2057.h 
    24323996+++ b/drivers/net/wireless/b43/radio_2057.h 
    2433 @@ -425,6 +425,72 @@ 
     3997@@ -84,6 +84,8 @@ 
     3998 #define R2057_CMOSBUF_RX_RCCR                  0x04c 
     3999 #define R2057_LOGEN_SEL_PKDET                  0x04d 
     4000 #define R2057_CMOSBUF_SHAREIQ_PTAT             0x04e 
     4001+ 
     4002+/* MISC core 0 */ 
     4003 #define R2057_RXTXBIAS_CONFIG_CORE0            0x04f 
     4004 #define R2057_TXGM_TXRF_PUS_CORE0              0x050 
     4005 #define R2057_TXGM_IDAC_BLEED_CORE0            0x051 
     4006@@ -204,6 +206,8 @@ 
     4007 #define R2057_RXBB_GPAIOSEL_RXLPF_RCCAL_CORE0  0x0d1 
     4008 #define R2057_LPF_GAIN_CORE0                   0x0d2 
     4009 #define R2057_DACBUF_IDACS_BW_CORE0            0x0d3 
     4010+ 
     4011+/* MISC core 1 */ 
     4012 #define R2057_RXTXBIAS_CONFIG_CORE1            0x0d4 
     4013 #define R2057_TXGM_TXRF_PUS_CORE1              0x0d5 
     4014 #define R2057_TXGM_IDAC_BLEED_CORE1            0x0d6 
     4015@@ -324,6 +328,7 @@ 
     4016 #define R2057_RXBB_GPAIOSEL_RXLPF_RCCAL_CORE1  0x156 
     4017 #define R2057_LPF_GAIN_CORE1                   0x157 
     4018 #define R2057_DACBUF_IDACS_BW_CORE1            0x158 
     4019+ 
     4020 #define R2057_DACBUF_VINCM_CORE1               0x159 
     4021 #define R2057_RCCAL_START_R1_Q1_P1             0x15a 
     4022 #define R2057_RCCAL_X1                         0x15b 
     4023@@ -345,6 +350,8 @@ 
     4024 #define R2057_RCCAL_BCAP_VAL                   0x16b 
     4025 #define R2057_RCCAL_HPC_VAL                    0x16c 
     4026 #define R2057_RCCAL_OVERRIDES                  0x16d 
     4027+ 
     4028+/* TX core 0 */ 
     4029 #define R2057_TX0_IQCAL_GAIN_BW                        0x170 
     4030 #define R2057_TX0_LOFT_FINE_I                  0x171 
     4031 #define R2057_TX0_LOFT_FINE_Q                  0x172 
     4032@@ -362,6 +369,8 @@ 
     4033 #define R2057_TX0_TXRXCOUPLE_2G_PWRUP          0x17e 
     4034 #define R2057_TX0_TXRXCOUPLE_5G_ATTEN          0x17f 
     4035 #define R2057_TX0_TXRXCOUPLE_5G_PWRUP          0x180 
     4036+ 
     4037+/* TX core 1 */ 
     4038 #define R2057_TX1_IQCAL_GAIN_BW                        0x190 
     4039 #define R2057_TX1_LOFT_FINE_I                  0x191 
     4040 #define R2057_TX1_LOFT_FINE_Q                  0x192 
     4041@@ -379,6 +388,7 @@ 
     4042 #define R2057_TX1_TXRXCOUPLE_2G_PWRUP          0x19e 
     4043 #define R2057_TX1_TXRXCOUPLE_5G_ATTEN          0x19f 
     4044 #define R2057_TX1_TXRXCOUPLE_5G_PWRUP          0x1a0 
     4045+ 
     4046 #define R2057_AFE_VCM_CAL_MASTER_CORE0         0x1a1 
     4047 #define R2057_AFE_SET_VCM_I_CORE0              0x1a2 
     4048 #define R2057_AFE_SET_VCM_Q_CORE0              0x1a3 
     4049@@ -425,6 +435,72 @@ 
    24344050  
    24354051 #define R2057_VCM_MASK                         0x7 
  • trunk/package/kernel/mac80211/patches/805-b43-gpio-mask-module-option.patch

    r41593 r41668  
    2323 module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444); 
    2424 MODULE_PARM_DESC(bad_frames_preempt, 
    25 @@ -2787,10 +2792,10 @@ static int b43_gpio_init(struct b43_wlde 
     25@@ -2798,10 +2803,10 @@ static int b43_gpio_init(struct b43_wlde 
    2626        u32 mask, set; 
    2727  
  • trunk/package/kernel/mac80211/patches/810-b43_no_pio.patch

    r41593 r41668  
    1212--- a/drivers/net/wireless/b43/main.c 
    1313+++ b/drivers/net/wireless/b43/main.c 
    14 @@ -1913,10 +1913,12 @@ static void b43_do_interrupt_thread(stru 
     14@@ -1924,10 +1924,12 @@ static void b43_do_interrupt_thread(stru 
    1515                        dma_reason[0], dma_reason[1], 
    1616                        dma_reason[2], dma_reason[3], 
  • trunk/package/kernel/mac80211/patches/820-b43-add-antenna-control.patch

    r41593 r41668  
    11--- a/drivers/net/wireless/b43/main.c 
    22+++ b/drivers/net/wireless/b43/main.c 
    3 @@ -1560,7 +1560,7 @@ static void b43_write_beacon_template(st 
     3@@ -1571,7 +1571,7 @@ static void b43_write_beacon_template(st 
    44                                  len, ram_offset, shm_size_offset, rate); 
    55  
     
    1010        ctl = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL); 
    1111        /* We can't send beacons with short preamble. Would get PHY errors. */ 
    12 @@ -3151,8 +3151,8 @@ static int b43_chip_init(struct b43_wlde 
     12@@ -3162,8 +3162,8 @@ static int b43_chip_init(struct b43_wlde 
    1313  
    1414        /* Select the antennae */ 
     
    2121        if (phy->type == B43_PHYTYPE_B) { 
    2222                value16 = b43_read16(dev, 0x005E); 
    23 @@ -3846,7 +3846,6 @@ static int b43_op_config(struct ieee8021 
     23@@ -3857,7 +3857,6 @@ static int b43_op_config(struct ieee8021 
    2424        struct b43_wldev *dev = wl->current_dev; 
    2525        struct b43_phy *phy = &dev->phy; 
     
    2929  
    3030        mutex_lock(&wl->mutex); 
    31 @@ -3886,11 +3885,9 @@ static int b43_op_config(struct ieee8021 
     31@@ -3897,11 +3896,9 @@ static int b43_op_config(struct ieee8021 
    3232        } 
    3333  
     
    4343        if (wl->radio_enabled != phy->radio_on) { 
    4444                if (wl->radio_enabled) { 
    45 @@ -5019,6 +5016,47 @@ static int b43_op_get_survey(struct ieee 
     45@@ -5033,6 +5030,47 @@ static int b43_op_get_survey(struct ieee 
    4646        return 0; 
    4747 } 
     
    9191        .tx                     = b43_op_tx, 
    9292        .conf_tx                = b43_op_conf_tx, 
    93 @@ -5040,6 +5078,8 @@ static const struct ieee80211_ops b43_hw 
     93@@ -5054,6 +5092,8 @@ static const struct ieee80211_ops b43_hw 
    9494        .sw_scan_complete       = b43_op_sw_scan_complete_notifier, 
    9595        .get_survey             = b43_op_get_survey, 
     
    100100  
    101101 /* Hard-reset the chip. Do not call this directly. 
    102 @@ -5330,6 +5370,8 @@ static int b43_one_core_attach(struct b4 
     102@@ -5352,6 +5392,8 @@ static int b43_one_core_attach(struct b4 
    103103        if (!wldev) 
    104104                goto out; 
     
    109109        wldev->dev = dev; 
    110110        wldev->wl = wl; 
    111 @@ -5420,6 +5462,9 @@ static struct b43_wl *b43_wireless_init( 
     111@@ -5442,6 +5484,9 @@ static struct b43_wl *b43_wireless_init( 
    112112  
    113113        hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; 
  • trunk/package/kernel/mac80211/patches/830-b43-workaround-pcie-bcm4716.patch

    r41593 r41668  
    7575--- a/drivers/net/wireless/b43/main.c 
    7676+++ b/drivers/net/wireless/b43/main.c 
    77 @@ -4411,7 +4411,7 @@ static int b43_phy_versioning(struct b43 
     77@@ -4422,7 +4422,7 @@ static int b43_phy_versioning(struct b43 
    7878                u16 radio24[3]; 
    7979  
     
    8484                } 
    8585  
    86 @@ -4430,10 +4430,10 @@ static int b43_phy_versioning(struct b43 
     86@@ -4441,10 +4441,10 @@ static int b43_phy_versioning(struct b43 
    8787                        else 
    8888                                tmp = 0x5205017F; 
     
    200200--- a/drivers/net/wireless/b43/phy_n.c 
    201201+++ b/drivers/net/wireless/b43/phy_n.c 
    202 @@ -5812,14 +5812,14 @@ static inline void check_phyreg(struct b 
     202@@ -6251,14 +6251,14 @@ static inline void check_phyreg(struct b 
    203203 static u16 b43_nphy_op_read(struct b43_wldev *dev, u16 reg) 
    204204 { 
     
    217217 } 
    218218  
    219 @@ -5827,7 +5827,7 @@ static void b43_nphy_op_maskset(struct b 
     219@@ -6266,7 +6266,7 @@ static void b43_nphy_op_maskset(struct b 
    220220                                 u16 set) 
    221221 { 
     
    226226 } 
    227227  
    228 @@ -5841,7 +5841,7 @@ static u16 b43_nphy_op_radio_read(struct 
     228@@ -6280,7 +6280,7 @@ static u16 b43_nphy_op_radio_read(struct 
    229229        else 
    230230                reg |= 0x100; 
     
    235235 } 
    236236  
    237 @@ -5850,7 +5850,7 @@ static void b43_nphy_op_radio_write(stru 
     237@@ -6289,7 +6289,7 @@ static void b43_nphy_op_radio_write(stru 
    238238        /* Register 1 is a 32-bit register. */ 
    239         B43_WARN_ON(reg == 1); 
     239        B43_WARN_ON(dev->phy.rev < 7 && reg == 1); 
    240240  
    241241-       b43_write16(dev, B43_MMIO_RADIO_CONTROL, reg); 
  • trunk/package/kernel/mac80211/patches/845-b43-only-use-gpio-0-1-for-led.patch

    r41593 r41668  
    11--- a/drivers/net/wireless/b43/main.c 
    22+++ b/drivers/net/wireless/b43/main.c 
    3 @@ -2804,6 +2804,14 @@ static int b43_gpio_init(struct b43_wlde 
     3@@ -2815,6 +2815,14 @@ static int b43_gpio_init(struct b43_wlde 
    44        } else if (dev->dev->chip_id == 0x5354) { 
    55                /* Don't allow overtaking buttons GPIOs */ 
Note: See TracChangeset for help on using the changeset viewer.