Changeset 41805


Ignore:
Timestamp:
2014-07-22T23:42:07+02:00 (4 years ago)
Author:
hauke
Message:

mac80211: b43: update b43 to version master-2014-07-22

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

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

Legend:

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

    r41676 r41805  
    346346        if (err) 
    347347                goto err_load; 
    348 @@ -3742,7 +3791,9 @@ static int b43_switch_band(struct b43_wl 
     348@@ -2915,6 +2964,45 @@ void b43_mac_phy_clock_set(struct b43_wl 
     349        } 
     350 } 
     351  
     352+/* brcms_b_switch_macfreq */ 
     353+void b43_mac_switch_freq(struct b43_wldev *dev, u8 spurmode) 
     354+{ 
     355+       u16 chip_id = dev->dev->chip_id; 
     356+ 
     357+       if (chip_id == BCMA_CHIP_ID_BCM43217 || 
     358+           chip_id == BCMA_CHIP_ID_BCM43222 || 
     359+           chip_id == BCMA_CHIP_ID_BCM43224 || 
     360+           chip_id == BCMA_CHIP_ID_BCM43225 || 
     361+           chip_id == BCMA_CHIP_ID_BCM43227 || 
     362+           chip_id == BCMA_CHIP_ID_BCM43228) { 
     363+               switch (spurmode) { 
     364+               case 2: /* 126 Mhz */ 
     365+                       b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0x2082); 
     366+                       b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0x8); 
     367+                       break; 
     368+               case 1: /* 123 Mhz */ 
     369+                       b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0x5341); 
     370+                       b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0x8); 
     371+                       break; 
     372+               default: /* 120 Mhz */ 
     373+                       b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0x8889); 
     374+                       b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0x8); 
     375+                       break; 
     376+               } 
     377+       } else if (dev->phy.type == B43_PHYTYPE_LCN) { 
     378+               switch (spurmode) { 
     379+               case 1: /* 82 Mhz */ 
     380+                       b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0x7CE0); 
     381+                       b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0xC); 
     382+                       break; 
     383+               default: /* 80 Mhz */ 
     384+                       b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0xCCCD); 
     385+                       b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0xC); 
     386+                       break; 
     387+               } 
     388+       } 
     389+} 
     390+ 
     391 static void b43_adjust_opmode(struct b43_wldev *dev) 
     392 { 
     393        struct b43_wl *wl = dev->wl; 
     394@@ -3742,7 +3830,9 @@ static int b43_switch_band(struct b43_wl 
    349395        b43dbg(dev->wl, "Switching to %s GHz band\n", 
    350396               band_to_string(chan->band)); 
     
    357403        phy->gmode = gmode; 
    358404        b43_phy_put_into_reset(dev); 
    359 @@ -3796,38 +3847,29 @@ static void b43_set_retry_limits(struct 
     405@@ -3796,38 +3886,29 @@ static void b43_set_retry_limits(struct 
    360406 static int b43_op_config(struct ieee80211_hw *hw, u32 changed) 
    361407 { 
     
    410456        if (changed & IEEE80211_CONF_CHANGE_RETRY_LIMITS) 
    411457                b43_set_retry_limits(dev, conf->short_frame_max_tx_count, 
    412 @@ -3836,11 +3878,6 @@ static int b43_op_config(struct ieee8021 
     458@@ -3836,11 +3917,6 @@ static int b43_op_config(struct ieee8021 
    413459        if (!changed) 
    414460                goto out_mac_enable; 
     
    422468  
    423469        /* Adjust the desired TX power level. */ 
    424 @@ -3876,12 +3913,8 @@ static int b43_op_config(struct ieee8021 
     470@@ -3876,12 +3952,8 @@ static int b43_op_config(struct ieee8021 
    425471  
    426472 out_mac_enable: 
     
    435481 } 
    436482  
    437 @@ -4307,6 +4340,7 @@ static char *b43_phy_name(struct b43_wld 
     483@@ -4307,13 +4379,15 @@ static char *b43_phy_name(struct b43_wld 
    438484 static int b43_phy_versioning(struct b43_wldev *dev) 
    439485 { 
     
    443489        u8 analog_type; 
    444490        u8 phy_type; 
    445 @@ -4321,23 +4355,23 @@ static int b43_phy_versioning(struct b43 
     491        u8 phy_rev; 
     492        u16 radio_manuf; 
     493-       u16 radio_ver; 
     494+       u16 radio_id; 
     495        u16 radio_rev; 
     496+       u8 radio_ver; 
     497        int unsupported = 0; 
     498  
     499        /* Get PHY versioning */ 
     500@@ -4321,23 +4395,23 @@ static int b43_phy_versioning(struct b43 
    446501        analog_type = (tmp & B43_PHYVER_ANALOG) >> B43_PHYVER_ANALOG_SHIFT; 
    447502        phy_type = (tmp & B43_PHYVER_TYPE) >> B43_PHYVER_TYPE_SHIFT; 
     
    477532                break; 
    478533 #endif 
    479 @@ -4372,7 +4406,15 @@ static int b43_phy_versioning(struct b43 
     534@@ -4372,7 +4446,17 @@ static int b43_phy_versioning(struct b43 
    480535                analog_type, phy_type, b43_phy_name(dev, phy_type), phy_rev); 
    481536  
     
    489544+ 
    490545+               b43_write16(dev, B43_MMIO_RADIO24_CONTROL, 1); 
    491 +               radio_ver = b43_read16(dev, B43_MMIO_RADIO24_DATA); 
     546+               radio_id = b43_read16(dev, B43_MMIO_RADIO24_DATA); 
     547+ 
     548+               radio_ver = 0; /* Is there version somewhere? */ 
    492549+       } else if (core_rev >= 24) { 
    493550                u16 radio24[3]; 
    494551  
    495552                for (tmp = 0; tmp < 3; tmp++) { 
    496 @@ -4428,7 +4470,10 @@ static int b43_phy_versioning(struct b43 
     553@@ -4380,12 +4464,10 @@ static int b43_phy_versioning(struct b43 
     554                        radio24[tmp] = b43_read16(dev, B43_MMIO_RADIO24_DATA); 
     555                } 
     556  
     557-               /* Broadcom uses "id" for our "ver" and has separated "ver" */ 
     558-               /* radio_ver = (radio24[0] & 0xF0) >> 4; */ 
     559- 
     560                radio_manuf = 0x17F; 
     561-               radio_ver = (radio24[2] << 8) | radio24[1]; 
     562+               radio_id = (radio24[2] << 8) | radio24[1]; 
     563                radio_rev = (radio24[0] & 0xF); 
     564+               radio_ver = (radio24[0] & 0xF0) >> 4; 
     565        } else { 
     566                if (dev->dev->chip_id == 0x4317) { 
     567                        if (dev->dev->chip_rev == 0) 
     568@@ -4404,15 +4486,16 @@ static int b43_phy_versioning(struct b43 
     569                                << 16; 
     570                } 
     571                radio_manuf = (tmp & 0x00000FFF); 
     572-               radio_ver = (tmp & 0x0FFFF000) >> 12; 
     573+               radio_id = (tmp & 0x0FFFF000) >> 12; 
     574                radio_rev = (tmp & 0xF0000000) >> 28; 
     575+               radio_ver = 0; /* Probably not available on old hw */ 
     576        } 
     577  
     578        if (radio_manuf != 0x17F /* Broadcom */) 
     579                unsupported = 1; 
     580        switch (phy_type) { 
     581        case B43_PHYTYPE_A: 
     582-               if (radio_ver != 0x2060) 
     583+               if (radio_id != 0x2060) 
     584                        unsupported = 1; 
     585                if (radio_rev != 1) 
     586                        unsupported = 1; 
     587@@ -4420,43 +4503,49 @@ static int b43_phy_versioning(struct b43 
     588                        unsupported = 1; 
     589                break; 
     590        case B43_PHYTYPE_B: 
     591-               if ((radio_ver & 0xFFF0) != 0x2050) 
     592+               if ((radio_id & 0xFFF0) != 0x2050) 
     593                        unsupported = 1; 
     594                break; 
     595        case B43_PHYTYPE_G: 
     596-               if (radio_ver != 0x2050) 
     597+               if (radio_id != 0x2050) 
    497598                        unsupported = 1; 
    498599                break; 
    499600        case B43_PHYTYPE_N: 
    500601-               if (radio_ver != 0x2055 && radio_ver != 0x2056) 
    501 +               if (radio_ver != 0x2055 && radio_ver != 0x2056 && 
    502 +                   radio_ver != 0x2057) 
     602+               if (radio_id != 0x2055 && radio_id != 0x2056 && 
     603+                   radio_id != 0x2057) 
    503604+                       unsupported = 1; 
    504 +               if (radio_ver == 0x2057 && !(radio_rev == 9)) 
     605+               if (radio_id == 0x2057 && 
     606+                   !(radio_rev == 9 || radio_rev == 14)) 
    505607                        unsupported = 1; 
    506608                break; 
    507609        case B43_PHYTYPE_LP: 
    508 @@ -4447,13 +4492,13 @@ static int b43_phy_versioning(struct b43 
     610-               if (radio_ver != 0x2062 && radio_ver != 0x2063) 
     611+               if (radio_id != 0x2062 && radio_id != 0x2063) 
     612                        unsupported = 1; 
     613                break; 
     614        case B43_PHYTYPE_HT: 
     615-               if (radio_ver != 0x2059) 
     616+               if (radio_id != 0x2059) 
     617                        unsupported = 1; 
     618                break; 
     619        case B43_PHYTYPE_LCN: 
     620-               if (radio_ver != 0x2064) 
     621+               if (radio_id != 0x2064) 
     622                        unsupported = 1; 
     623                break; 
     624        default: 
    509625                B43_WARN_ON(1); 
    510626        } 
     
    512628-               b43err(dev->wl, "FOUND UNSUPPORTED RADIO " 
    513629-                      "(Manuf 0x%X, Version 0x%X, Revision %u)\n", 
     630-                      radio_manuf, radio_ver, radio_rev); 
    514631+               b43err(dev->wl, 
    515 +                      "FOUND UNSUPPORTED RADIO (Manuf 0x%X, ID 0x%X, Revision %u)\n", 
    516                        radio_manuf, radio_ver, radio_rev); 
     632+                      "FOUND UNSUPPORTED RADIO (Manuf 0x%X, ID 0x%X, Revision %u, Version %u)\n", 
     633+                      radio_manuf, radio_id, radio_rev, radio_ver); 
    517634                return -EOPNOTSUPP; 
    518635        } 
    519636-       b43dbg(dev->wl, "Found Radio: Manuf 0x%X, Version 0x%X, Revision %u\n", 
    520637-              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   
     638+       b43info(dev->wl, 
     639+               "Found Radio: Manuf 0x%X, ID 0x%X, Revision %u, Version %u\n", 
     640+               radio_manuf, radio_id, radio_rev, radio_ver); 
     641  
     642+       /* FIXME: b43 treats "id" as "ver" and ignores the real "ver" */ 
    524643        phy->radio_manuf = radio_manuf; 
    525         phy->radio_ver = radio_ver; 
    526 @@ -5064,9 +5109,15 @@ static int b43_setup_bands(struct b43_wl 
     644-       phy->radio_ver = radio_ver; 
     645+       phy->radio_ver = radio_id; 
     646        phy->radio_rev = radio_rev; 
     647  
     648        phy->analog = analog_type; 
     649@@ -5064,9 +5153,16 @@ static int b43_setup_bands(struct b43_wl 
    527650                           bool have_2ghz_phy, bool have_5ghz_phy) 
    528651 { 
     
    532655+ 
    533656+       /* We don't support all 2 GHz channels on some devices */ 
    534 +       limited_2g = phy->radio_ver == 0x2057 && phy->radio_rev == 9; 
     657+       limited_2g = phy->radio_ver == 0x2057 && 
     658+                    (phy->radio_rev == 9 || phy->radio_rev == 14); 
    535659  
    536660        if (have_2ghz_phy) 
     
    541665                if (have_5ghz_phy) 
    542666                        hw->wiphy->bands[IEEE80211_BAND_5GHZ] = &b43_band_5GHz_nphy; 
    543 @@ -5164,6 +5215,7 @@ static void b43_supported_bands(struct b 
     667@@ -5164,6 +5260,7 @@ static void b43_supported_bands(struct b 
    544668 static int b43_wireless_core_attach(struct b43_wldev *dev) 
    545669 { 
     
    549673        u32 tmp; 
    550674        bool have_2ghz_phy = false, have_5ghz_phy = false; 
    551 @@ -5181,6 +5233,8 @@ static int b43_wireless_core_attach(stru 
     675@@ -5181,6 +5278,8 @@ static int b43_wireless_core_attach(stru 
    552676                goto out; 
    553677        } 
     
    558682        switch (dev->dev->bus_type) { 
    559683 #ifdef CPTCFG_B43_BCMA 
    560 @@ -5214,14 +5268,16 @@ static int b43_wireless_core_attach(stru 
     684@@ -5214,14 +5313,16 @@ static int b43_wireless_core_attach(stru 
    561685        b43_supported_bands(dev, &have_2ghz_phy, &have_5ghz_phy); 
    562686  
     
    583707  
    584708        if (!have_2ghz_phy && !have_5ghz_phy) { 
     709--- a/drivers/net/wireless/b43/main.h 
     710+++ b/drivers/net/wireless/b43/main.h 
     711@@ -99,6 +99,7 @@ void b43_power_saving_ctl_bits(struct b4 
     712 void b43_mac_suspend(struct b43_wldev *dev); 
     713 void b43_mac_enable(struct b43_wldev *dev); 
     714 void b43_mac_phy_clock_set(struct b43_wldev *dev, bool on); 
     715+void b43_mac_switch_freq(struct b43_wldev *dev, u8 spurmode); 
     716  
     717  
     718 struct b43_request_fw_context; 
    585719--- a/drivers/net/wireless/b43/phy_common.c 
    586720+++ b/drivers/net/wireless/b43/phy_common.c 
     
    725859 void b43_phy_force_clock(struct b43_wldev *dev, bool force); 
    726860  
     861--- a/drivers/net/wireless/b43/phy_lcn.c 
     862+++ b/drivers/net/wireless/b43/phy_lcn.c 
     863@@ -54,39 +54,6 @@ enum lcn_sense_type { 
     864        B43_SENSE_VBAT, 
     865 }; 
     866  
     867-/* In theory it's PHY common function, move if needed */ 
     868-/* brcms_b_switch_macfreq */ 
     869-static void b43_phy_switch_macfreq(struct b43_wldev *dev, u8 spurmode) 
     870-{ 
     871-       if (dev->dev->chip_id == 43224 || dev->dev->chip_id == 43225) { 
     872-               switch (spurmode) { 
     873-               case 2:         /* 126 Mhz */ 
     874-                       b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0x2082); 
     875-                       b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0x8); 
     876-                       break; 
     877-               case 1:         /* 123 Mhz */ 
     878-                       b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0x5341); 
     879-                       b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0x8); 
     880-                       break; 
     881-               default:        /* 120 Mhz */ 
     882-                       b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0x8889); 
     883-                       b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0x8); 
     884-                       break; 
     885-               } 
     886-       } else if (dev->phy.type == B43_PHYTYPE_LCN) { 
     887-               switch (spurmode) { 
     888-               case 1:         /* 82 Mhz */ 
     889-                       b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0x7CE0); 
     890-                       b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0xC); 
     891-                       break; 
     892-               default:        /* 80 Mhz */ 
     893-                       b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0xCCCD); 
     894-                       b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0xC); 
     895-                       break; 
     896-               } 
     897-       } 
     898-} 
     899- 
     900 /************************************************** 
     901  * Radio 2064. 
     902  **************************************************/ 
     903@@ -609,7 +576,7 @@ static void b43_phy_lcn_txrx_spur_avoida 
     904                b43_phy_write(dev, 0x93b, ((0 << 13) + 23)); 
     905                b43_phy_write(dev, 0x93c, ((0 << 13) + 1989)); 
     906        } 
     907-       b43_phy_switch_macfreq(dev, enable); 
     908+       b43_mac_switch_freq(dev, enable); 
     909 } 
     910  
     911 /************************************************** 
    727912--- a/drivers/net/wireless/b43/phy_n.c 
    728913+++ b/drivers/net/wireless/b43/phy_n.c 
     
    8651050 static void b43_nphy_adjust_lna_gain_table(struct b43_wldev *dev) 
    8661051 { 
    867 @@ -590,7 +667,148 @@ static void b43_nphy_set_rf_sequence(str 
     1052@@ -590,44 +667,270 @@ static void b43_nphy_set_rf_sequence(str 
    8681053  * Radio 0x2057 
    8691054  **************************************************/ 
     
    9681153+               } 
    9691154+               break; 
    970 +       /* TODO */ 
     1155+       case 14: /* 2 GHz only */ 
     1156+               b43_radio_write(dev, R2057_RFPLL_LOOPFILTER_R1, 0x1b); 
     1157+               b43_radio_write(dev, R2057_CP_KPD_IDAC, 0x3f); 
     1158+               b43_radio_write(dev, R2057_RFPLL_LOOPFILTER_C1, 0x1f); 
     1159+               b43_radio_write(dev, R2057_RFPLL_LOOPFILTER_C2, 0x1f); 
     1160+               break; 
    9711161+       } 
    9721162+ 
     
    9811171+                               /* TODO */ 
    9821172+                               break; 
     1173+                       case 14: 
     1174+                               txmix2g_tune_boost_pu = 0x21; 
     1175+                               pad2g_tune_pus = 0x23; 
     1176+                               break; 
    9831177+                       } 
    984 +                       /* TODO */ 
    9851178+               } 
    9861179+ 
     
    10151208 { 
    10161209        struct b43_phy *phy = &dev->phy; 
    1017 @@ -603,15 +821,25 @@ static u8 b43_radio_2057_rcal(struct b43 
    1018                 b43_radio_maskset(dev, 0x1ca, ~0x2, 0x1); 
     1210+       u16 saved_regs_phy[12]; 
     1211+       u16 saved_regs_phy_rf[6]; 
     1212+       u16 saved_regs_radio[2] = { }; 
     1213+       static const u16 phy_to_store[] = { 
     1214+               B43_NPHY_RFCTL_RSSIO1, B43_NPHY_RFCTL_RSSIO2, 
     1215+               B43_NPHY_RFCTL_LUT_TRSW_LO1, B43_NPHY_RFCTL_LUT_TRSW_LO2, 
     1216+               B43_NPHY_RFCTL_RXG1, B43_NPHY_RFCTL_RXG2, 
     1217+               B43_NPHY_RFCTL_TXG1, B43_NPHY_RFCTL_TXG2, 
     1218+               B43_NPHY_REV7_RF_CTL_MISC_REG3, B43_NPHY_REV7_RF_CTL_MISC_REG4, 
     1219+               B43_NPHY_REV7_RF_CTL_MISC_REG5, B43_NPHY_REV7_RF_CTL_MISC_REG6, 
     1220+       }; 
     1221+       static const u16 phy_to_store_rf[] = { 
     1222+               B43_NPHY_REV3_RFCTL_OVER0, B43_NPHY_REV3_RFCTL_OVER1, 
     1223+               B43_NPHY_REV7_RF_CTL_OVER3, B43_NPHY_REV7_RF_CTL_OVER4, 
     1224+               B43_NPHY_REV7_RF_CTL_OVER5, B43_NPHY_REV7_RF_CTL_OVER6, 
     1225+       }; 
     1226        u16 tmp; 
     1227+       int i; 
     1228  
     1229-       if (phy->radio_rev == 5) { 
     1230-               b43_phy_mask(dev, 0x342, ~0x2); 
     1231+       /* Save */ 
     1232+       for (i = 0; i < ARRAY_SIZE(phy_to_store); i++) 
     1233+               saved_regs_phy[i] = b43_phy_read(dev, phy_to_store[i]); 
     1234+       for (i = 0; i < ARRAY_SIZE(phy_to_store_rf); i++) 
     1235+               saved_regs_phy_rf[i] = b43_phy_read(dev, phy_to_store_rf[i]); 
     1236+ 
     1237+       /* Set */ 
     1238+       for (i = 0; i < ARRAY_SIZE(phy_to_store); i++) 
     1239+               b43_phy_write(dev, phy_to_store[i], 0); 
     1240+       b43_phy_write(dev, B43_NPHY_REV3_RFCTL_OVER0, 0x07ff); 
     1241+       b43_phy_write(dev, B43_NPHY_REV3_RFCTL_OVER1, 0x07ff); 
     1242+       b43_phy_write(dev, B43_NPHY_REV7_RF_CTL_OVER3, 0x07ff); 
     1243+       b43_phy_write(dev, B43_NPHY_REV7_RF_CTL_OVER4, 0x07ff); 
     1244+       b43_phy_write(dev, B43_NPHY_REV7_RF_CTL_OVER5, 0x007f); 
     1245+       b43_phy_write(dev, B43_NPHY_REV7_RF_CTL_OVER6, 0x007f); 
     1246+ 
     1247+       switch (phy->radio_rev) { 
     1248+       case 5: 
     1249+               b43_phy_mask(dev, B43_NPHY_REV7_RF_CTL_OVER3, ~0x2); 
     1250                udelay(10); 
     1251                b43_radio_set(dev, R2057_IQTEST_SEL_PU, 0x1); 
     1252-               b43_radio_maskset(dev, 0x1ca, ~0x2, 0x1); 
     1253+               b43_radio_maskset(dev, R2057v7_IQTEST_SEL_PU2, ~0x2, 0x1); 
     1254+               break; 
     1255+       case 9: 
     1256+               b43_phy_set(dev, B43_NPHY_REV7_RF_CTL_OVER3, 0x2); 
     1257+               b43_phy_set(dev, B43_NPHY_REV7_RF_CTL_MISC_REG3, 0x2); 
     1258+               saved_regs_radio[0] = b43_radio_read(dev, R2057_IQTEST_SEL_PU); 
     1259+               b43_radio_write(dev, R2057_IQTEST_SEL_PU, 0x11); 
     1260+               break; 
     1261+       case 14: 
     1262+               saved_regs_radio[0] = b43_radio_read(dev, R2057_IQTEST_SEL_PU); 
     1263+               saved_regs_radio[1] = b43_radio_read(dev, R2057v7_IQTEST_SEL_PU2); 
     1264+               b43_phy_set(dev, B43_NPHY_REV7_RF_CTL_MISC_REG3, 0x2); 
     1265+               b43_phy_set(dev, B43_NPHY_REV7_RF_CTL_OVER3, 0x2); 
     1266+               b43_radio_write(dev, R2057v7_IQTEST_SEL_PU2, 0x2); 
     1267+               b43_radio_write(dev, R2057_IQTEST_SEL_PU, 0x1); 
     1268+               break; 
    10191269        } 
    10201270  
     
    10431293        b43_radio_mask(dev, R2057_RCAL_CONFIG, ~0x1); 
    10441294  
    1045         if (phy->radio_rev == 5) { 
    1046 @@ -627,7 +855,9 @@ static u8 b43_radio_2057_rcal(struct b43 
     1295-       if (phy->radio_rev == 5) { 
     1296-               b43_radio_mask(dev, R2057_IPA2G_CASCONV_CORE0, ~0x1); 
     1297-               b43_radio_mask(dev, 0x1ca, ~0x2); 
     1298-       } 
     1299-       if (phy->radio_rev <= 4 || phy->radio_rev == 6) { 
     1300+       /* Restore */ 
     1301+       for (i = 0; i < ARRAY_SIZE(phy_to_store_rf); i++) 
     1302+               b43_phy_write(dev, phy_to_store_rf[i], saved_regs_phy_rf[i]); 
     1303+       for (i = 0; i < ARRAY_SIZE(phy_to_store); i++) 
     1304+               b43_phy_write(dev, phy_to_store[i], saved_regs_phy[i]); 
     1305+ 
     1306+       switch (phy->radio_rev) { 
     1307+       case 0 ... 4: 
     1308+       case 6: 
     1309                b43_radio_maskset(dev, R2057_TEMPSENSE_CONFIG, ~0x3C, tmp); 
     1310                b43_radio_maskset(dev, R2057_BANDGAP_RCAL_TRIM, ~0xF0, 
     1311                                  tmp << 2); 
     1312+               break; 
     1313+       case 5: 
     1314+               b43_radio_mask(dev, R2057_IPA2G_CASCONV_CORE0, ~0x1); 
     1315+               b43_radio_mask(dev, R2057v7_IQTEST_SEL_PU2, ~0x2); 
     1316+               break; 
     1317+       case 9: 
     1318+               b43_radio_write(dev, R2057_IQTEST_SEL_PU, saved_regs_radio[0]); 
     1319+               break; 
     1320+       case 14: 
     1321+               b43_radio_write(dev, R2057_IQTEST_SEL_PU, saved_regs_radio[0]); 
     1322+               b43_radio_write(dev, R2057v7_IQTEST_SEL_PU2, saved_regs_radio[1]); 
     1323+               break; 
     1324        } 
     1325  
    10471326        return tmp & 0x3e; 
    10481327 } 
     
    10551334 { 
    10561335        struct b43_phy *phy = &dev->phy; 
    1057 @@ -635,49 +865,76 @@ static u16 b43_radio_2057_rccal(struct b 
     1336@@ -635,49 +938,76 @@ static u16 b43_radio_2057_rccal(struct b 
    10581337                        phy->radio_rev == 6); 
    10591338        u16 tmp; 
     
    10651344        } else { 
    10661345-               b43_radio_write(dev, 0x1AE, 0x61); 
     1346-               b43_radio_write(dev, R2057_RCCAL_TRC0, 0xE1); 
    10671347+               b43_radio_write(dev, R2057v7_RCCAL_MASTER, 0x61); 
    1068                 b43_radio_write(dev, R2057_RCCAL_TRC0, 0xE1); 
     1348+               b43_radio_write(dev, R2057_RCCAL_TRC0, 0xE9); 
    10691349        } 
    10701350        b43_radio_write(dev, R2057_RCCAL_X1, 0x6E); 
     
    11381418 } 
    11391419  
    1140 @@ -700,13 +957,11 @@ static void b43_radio_2057_init_post(str 
     1420@@ -694,19 +1024,20 @@ static void b43_radio_2057_init_post(str 
     1421 { 
     1422        b43_radio_set(dev, R2057_XTALPUOVR_PINCTRL, 0x1); 
     1423  
     1424+       if (0) /* FIXME: Is this BCM43217 specific? */ 
     1425+               b43_radio_set(dev, R2057_XTALPUOVR_PINCTRL, 0x2); 
     1426+ 
     1427        b43_radio_set(dev, R2057_RFPLL_MISC_CAL_RESETN, 0x78); 
     1428        b43_radio_set(dev, R2057_XTAL_CONFIG2, 0x80); 
     1429        mdelay(2); 
    11411430        b43_radio_mask(dev, R2057_RFPLL_MISC_CAL_RESETN, ~0x78); 
    11421431        b43_radio_mask(dev, R2057_XTAL_CONFIG2, ~0x80); 
     
    11531442  
    11541443 /* http://bcm-v4.sipsolutions.net/802.11/Radio/2057/Init */ 
    1155 @@ -800,6 +1055,7 @@ static void b43_chantab_radio_2056_uploa 
     1444@@ -800,6 +1131,7 @@ static void b43_chantab_radio_2056_uploa 
    11561445 static void b43_radio_2056_setup(struct b43_wldev *dev, 
    11571446                                const struct b43_nphy_channeltab_entry_rev3 *e) 
     
    11611450        enum ieee80211_band band = b43_current_band(dev->wl); 
    11621451        u16 offset; 
    1163 @@ -897,7 +1153,7 @@ static void b43_radio_2056_setup(struct 
     1452@@ -897,7 +1229,7 @@ static void b43_radio_2056_setup(struct 
    11641453                                        offset | B2056_TX_MIXG_BOOST_TUNE, 
    11651454                                        mixg_boost); 
     
    11701459                                        offset | B2056_TX_INTPAG_IMAIN_STAT, 
    11711460                                        bias); 
    1172 @@ -911,7 +1167,7 @@ static void b43_radio_2056_setup(struct 
     1461@@ -911,7 +1243,7 @@ static void b43_radio_2056_setup(struct 
    11731462                        b43_radio_write(dev, offset | B2056_TX_PA_SPARE1, 0xee); 
    11741463                } 
     
    11791468                        paa_boost = 0xA; 
    11801469                        pada_boost = 0x77; 
    1181 @@ -1028,7 +1284,7 @@ static void b43_radio_init2056_post(stru 
     1470@@ -1028,7 +1360,7 @@ static void b43_radio_init2056_post(stru 
    11821471        b43_radio_mask(dev, B2056_SYN_COM_RESET, ~0x2); 
    11831472        b43_radio_mask(dev, B2056_SYN_PLL_MAST2, ~0xFC); 
     
    11881477 } 
    11891478  
    1190 @@ -1041,8 +1297,6 @@ static void b43_radio_init2056(struct b4 
     1479@@ -1041,8 +1373,6 @@ static void b43_radio_init2056(struct b4 
    11911480        b43_radio_init2056_pre(dev); 
    11921481        b2056_upload_inittabs(dev, 0, 0); 
     
    11971486  
    11981487 /************************************************** 
    1199 @@ -1214,8 +1468,7 @@ static u16 b43_nphy_gen_load_samples(str 
     1488@@ -1214,8 +1544,7 @@ static u16 b43_nphy_gen_load_samples(str 
    12001489        u16 bw, len, rot, angle; 
    12011490        struct b43_c32 *samples; 
     
    12071496  
    12081497        if (test) { 
    1209 @@ -1224,7 +1477,7 @@ static u16 b43_nphy_gen_load_samples(str 
     1498@@ -1224,7 +1553,7 @@ static u16 b43_nphy_gen_load_samples(str 
    12101499                else 
    12111500                        bw = 80; 
     
    12161505  
    12171506                len = bw << 1; 
    1218 @@ -1252,8 +1505,10 @@ static u16 b43_nphy_gen_load_samples(str 
     1507@@ -1252,8 +1581,10 @@ static u16 b43_nphy_gen_load_samples(str 
    12191508  
    12201509 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RunSamples */ 
     
    12281517        int i; 
    12291518        u16 seq_mode; 
    1230 @@ -1261,17 +1516,35 @@ static void b43_nphy_run_samples(struct 
     1519@@ -1261,17 +1592,35 @@ static void b43_nphy_run_samples(struct 
    12311520  
    12321521        b43_nphy_stay_in_carrier_search(dev, true); 
     
    12701559        b43_phy_write(dev, B43_NPHY_SAMP_DEPCNT, (samps - 1)); 
    12711560  
    1272 @@ -1289,10 +1562,8 @@ static void b43_nphy_run_samples(struct 
     1561@@ -1289,10 +1638,8 @@ static void b43_nphy_run_samples(struct 
    12731562                b43_phy_mask(dev, B43_NPHY_IQLOCAL_CMDGCTL, 0x7FFF); 
    12741563                b43_phy_set(dev, B43_NPHY_IQLOCAL_CMDGCTL, 0x8000); 
     
    12831572        for (i = 0; i < 100; i++) { 
    12841573                if (!(b43_phy_read(dev, B43_NPHY_RFSEQST) & 1)) { 
    1285 @@ -1392,6 +1663,12 @@ static void b43_nphy_scale_offset_rssi(s 
     1574@@ -1392,6 +1739,12 @@ static void b43_nphy_scale_offset_rssi(s 
    12861575        } 
    12871576 } 
     
    12961585                                      enum n_rssi_type rssi_type) 
    12971586 { 
    1298 @@ -1461,13 +1738,15 @@ static void b43_nphy_rev3_rssi_select(st 
     1587@@ -1461,13 +1814,15 @@ static void b43_nphy_rev3_rssi_select(st 
    12991588                                        enum ieee80211_band band = 
    13001589                                                b43_current_band(dev->wl); 
     
    13191608                                        reg = (i == 0) ? 
    13201609                                                B43_NPHY_AFECTL_OVER1 : 
    1321 @@ -1554,7 +1833,9 @@ static void b43_nphy_rev2_rssi_select(st 
     1610@@ -1554,7 +1909,9 @@ static void b43_nphy_rev2_rssi_select(st 
    13221611 static void b43_nphy_rssi_select(struct b43_wldev *dev, u8 code, 
    13231612                                 enum n_rssi_type type) 
     
    13301619        else 
    13311620                b43_nphy_rev2_rssi_select(dev, code, type); 
    1332 @@ -1598,6 +1879,8 @@ static int b43_nphy_poll_rssi(struct b43 
     1621@@ -1598,6 +1955,8 @@ static int b43_nphy_poll_rssi(struct b43 
    13331622        u16 save_regs_phy[9]; 
    13341623        u16 s[2]; 
     
    13391628                save_regs_phy[0] = b43_phy_read(dev, B43_NPHY_AFECTL_C1); 
    13401629                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 
     1630@@ -1679,6 +2038,7 @@ static int b43_nphy_poll_rssi(struct b43 
    13421631 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RSSICalRev3 */ 
    13431632 static void b43_nphy_rev3_rssi_cal(struct b43_wldev *dev) 
     
    13471636  
    13481637        u16 saved_regs_phy_rfctl[2]; 
    1349 @@ -1696,12 +1980,14 @@ static void b43_nphy_rev3_rssi_cal(struc 
     1638@@ -1696,12 +2056,14 @@ static void b43_nphy_rev3_rssi_cal(struc 
    13501639                B43_NPHY_AFECTL_OVER1, B43_NPHY_AFECTL_OVER, 
    13511640                B43_NPHY_AFECTL_C1, B43_NPHY_AFECTL_C2, 
     
    13641653        }; 
    13651654        u16 *regs_to_store; 
    1366 @@ -1748,9 +2034,24 @@ static void b43_nphy_rev3_rssi_cal(struc 
     1655@@ -1748,9 +2110,24 @@ static void b43_nphy_rev3_rssi_cal(struc 
    13671656        b43_nphy_rf_ctl_intc_override(dev, N_INTC_OVERRIDE_TRSW, 1, 7); 
    13681657  
     
    13901679        } else { 
    13911680                b43_nphy_rf_ctl_override(dev, 0x1, 0, 0, false); 
    1392 @@ -1779,7 +2080,10 @@ static void b43_nphy_rev3_rssi_cal(struc 
     1681@@ -1779,7 +2156,10 @@ static void b43_nphy_rev3_rssi_cal(struc 
    13931682                /* Grab RSSI results for every possible VCM */ 
    13941683                for (vcm = 0; vcm < 8; vcm++) { 
     
    14021691                                b43_radio_maskset(dev, r | B2056_RX_RSSI_MISC, 
    14031692                                                  0xE3, vcm << 2); 
    1404 @@ -1810,7 +2114,10 @@ static void b43_nphy_rev3_rssi_cal(struc 
     1693@@ -1810,7 +2190,10 @@ static void b43_nphy_rev3_rssi_cal(struc 
    14051694  
    14061695                /* Select the best VCM */ 
     
    14141703                        b43_radio_maskset(dev, r | B2056_RX_RSSI_MISC, 
    14151704                                          0xE3, vcm_final << 2); 
    1416 @@ -1880,6 +2187,10 @@ static void b43_nphy_rev3_rssi_cal(struc 
     1705@@ -1880,6 +2263,10 @@ static void b43_nphy_rev3_rssi_cal(struc 
    14171706                rssical_phy_regs = nphy->rssical_cache.rssical_phy_regs_5G; 
    14181707        } 
     
    14251714                rssical_radio_regs[0] = b43_radio_read(dev, B2056_RX0 | 
    14261715                                                       B2056_RX_RSSI_MISC); 
    1427 @@ -1901,9 +2212,9 @@ static void b43_nphy_rev3_rssi_cal(struc 
     1716@@ -1901,9 +2288,9 @@ static void b43_nphy_rev3_rssi_cal(struc 
    14281717  
    14291718        /* Remember for which channel we store configuration */ 
     
    14371726        /* End of calibration, restore configuration */ 
    14381727        b43_nphy_classifier(dev, 7, class); 
    1439 @@ -2080,7 +2391,9 @@ static void b43_nphy_rev2_rssi_cal(struc 
     1728@@ -2080,7 +2467,9 @@ static void b43_nphy_rev2_rssi_cal(struc 
    14401729  */ 
    14411730 static void b43_nphy_rssi_cal(struct b43_wldev *dev) 
     
    14481737        } else { 
    14491738                b43_nphy_rev2_rssi_cal(dev, N_RSSI_NB); 
    1450 @@ -2093,7 +2406,21 @@ static void b43_nphy_rssi_cal(struct b43 
     1739@@ -2093,7 +2482,21 @@ static void b43_nphy_rssi_cal(struct b43 
    14511740  * Workarounds 
    14521741  **************************************************/ 
     
    14711760        struct ssb_sprom *sprom = dev->dev->bus_sprom; 
    14721761  
    1473 @@ -2196,7 +2523,7 @@ static void b43_nphy_gain_ctl_workaround 
     1762@@ -2196,7 +2599,7 @@ static void b43_nphy_gain_ctl_workaround 
    14741763        b43_phy_write(dev, B43_NPHY_C1_NBCLIPTHRES, 0x84); 
    14751764        b43_phy_write(dev, B43_NPHY_C2_NBCLIPTHRES, 0x84); 
     
    14801769                b43_phy_write(dev, B43_NPHY_CLIP1_NBDWELL_LEN, 0x002B); 
    14811770                b43_phy_write(dev, B43_NPHY_CLIP2_NBDWELL_LEN, 0x002B); 
    1482 @@ -2210,7 +2537,7 @@ static void b43_nphy_gain_ctl_workaround 
     1771@@ -2210,7 +2613,7 @@ static void b43_nphy_gain_ctl_workaround 
    14831772        b43_phy_maskset(dev, B43_NPHY_C2_CLIPWBTHRES, 
    14841773                        ~B43_NPHY_C2_CLIPWBTHRES_CLIP2, 21); 
     
    14891778                        ~B43_NPHY_C1_CGAINI_GAINBKOFF, 0x1); 
    14901779                b43_phy_maskset(dev, B43_NPHY_C2_CGAINI, 
    1491 @@ -2225,12 +2552,12 @@ static void b43_nphy_gain_ctl_workaround 
     1780@@ -2225,12 +2628,12 @@ static void b43_nphy_gain_ctl_workaround 
    14921781  
    14931782        if (nphy->gain_boost) { 
     
    15041793  
    15051794        /* Set HPVGA2 index */ 
    1506 @@ -2290,22 +2617,16 @@ static void b43_nphy_gain_ctl_workaround 
     1795@@ -2290,46 +2693,54 @@ static void b43_nphy_gain_ctl_workaround 
    15071796 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/WorkaroundsGainCtrl */ 
    15081797 static void b43_nphy_gain_ctl_workarounds(struct b43_wldev *dev) 
     
    15321821 { 
    15331822        struct ssb_sprom *sprom = dev->dev->bus_sprom; 
    1534 @@ -2375,13 +2696,13 @@ static void b43_nphy_workarounds_rev7plu 
    1535         lpf_40 = b43_nphy_read_lpf_ctl(dev, 0x159); 
    1536         lpf_11b = b43_nphy_read_lpf_ctl(dev, 0x152); 
     1823        struct b43_phy *phy = &dev->phy; 
     1824  
     1825+       /* TX to RX */ 
     1826+       u8 tx2rx_events[7] = { 4, 3, 5, 2, 1, 8, 31, }; 
     1827+       u8 tx2rx_delays[7] = { 8, 4, 4, 4, 4, 6, 1, }; 
     1828+       /* RX to TX */ 
     1829        u8 rx2tx_events_ipa[9] = { 0x0, 0x1, 0x2, 0x8, 0x5, 0x6, 0xF, 0x3, 
     1830                                        0x1F }; 
     1831        u8 rx2tx_delays_ipa[9] = { 8, 6, 6, 4, 4, 16, 43, 1, 1 }; 
     1832  
     1833-       u16 ntab7_15e_16e[] = { 0x10f, 0x10f }; 
     1834+       static const u16 ntab7_15e_16e[] = { 0, 0x10f, 0x10f }; 
     1835        u8 ntab7_138_146[] = { 0x11, 0x11 }; 
     1836        u8 ntab7_133[] = { 0x77, 0x11, 0x11 }; 
     1837  
     1838-       u16 lpf_20, lpf_40, lpf_11b; 
     1839-       u16 bcap_val, bcap_val_11b, bcap_val_11n_20, bcap_val_11n_40; 
     1840-       u16 scap_val, scap_val_11b, scap_val_11n_20, scap_val_11n_40; 
     1841+       u16 lpf_ofdm_20mhz[2], lpf_ofdm_40mhz[2], lpf_11b[2]; 
     1842+       u16 bcap_val; 
     1843+       s16 bcap_val_11b[2], bcap_val_11n_20[2], bcap_val_11n_40[2]; 
     1844+       u16 scap_val; 
     1845+       s16 scap_val_11b[2], scap_val_11n_20[2], scap_val_11n_40[2]; 
     1846        bool rccal_ovrd = false; 
     1847  
     1848-       u16 rx2tx_lut_20_11b, rx2tx_lut_20_11n, rx2tx_lut_40_11n; 
     1849        u16 bias, conv, filt; 
     1850  
     1851+       u32 noise_tbl[2]; 
     1852+ 
     1853        u32 tmp32; 
     1854        u8 core; 
     1855  
     1856+       b43_phy_write(dev, B43_NPHY_PHASETR_A0, 0x0125); 
     1857+       b43_phy_write(dev, B43_NPHY_PHASETR_A1, 0x01b3); 
     1858+       b43_phy_write(dev, B43_NPHY_PHASETR_A2, 0x0105); 
     1859+       b43_phy_write(dev, B43_NPHY_PHASETR_B0, 0x016e); 
     1860+       b43_phy_write(dev, B43_NPHY_PHASETR_B1, 0x00cd); 
     1861+       b43_phy_write(dev, B43_NPHY_PHASETR_B2, 0x0020); 
     1862+ 
     1863        if (phy->rev == 7) { 
     1864                b43_phy_set(dev, B43_NPHY_FINERX2_CGC, 0x10); 
     1865                b43_phy_maskset(dev, B43_NPHY_FREQGAIN0, 0xFF80, 0x0020); 
     1866@@ -2349,11 +2760,18 @@ static void b43_nphy_workarounds_rev7plu 
     1867                b43_phy_maskset(dev, B43_NPHY_FREQGAIN7, 0xFF80, 0x0040); 
     1868                b43_phy_maskset(dev, B43_NPHY_FREQGAIN7, 0x80FF, 0x4000); 
     1869        } 
     1870-       if (phy->rev <= 8) { 
     1871+ 
     1872+       if (phy->rev >= 16) { 
     1873+               b43_phy_write(dev, B43_NPHY_FORCEFRONT0, 0x7ff); 
     1874+               b43_phy_write(dev, B43_NPHY_FORCEFRONT1, 0x7ff); 
     1875+       } else if (phy->rev <= 8) { 
     1876                b43_phy_write(dev, B43_NPHY_FORCEFRONT0, 0x1B0); 
     1877                b43_phy_write(dev, B43_NPHY_FORCEFRONT1, 0x1B0); 
     1878        } 
     1879-       if (phy->rev >= 8) 
     1880+ 
     1881+       if (phy->rev >= 16) 
     1882+               b43_phy_maskset(dev, B43_NPHY_TXTAILCNT, ~0xFF, 0xa0); 
     1883+       else if (phy->rev >= 8) 
     1884                b43_phy_maskset(dev, B43_NPHY_TXTAILCNT, ~0xFF, 0x72); 
     1885  
     1886        b43_ntab_write(dev, B43_NTAB16(8, 0x00), 2); 
     1887@@ -2361,9 +2779,11 @@ static void b43_nphy_workarounds_rev7plu 
     1888        tmp32 = b43_ntab_read(dev, B43_NTAB32(30, 0)); 
     1889        tmp32 &= 0xffffff; 
     1890        b43_ntab_write(dev, B43_NTAB32(30, 0), tmp32); 
     1891-       b43_ntab_write_bulk(dev, B43_NTAB16(7, 0x15e), 2, ntab7_15e_16e); 
     1892-       b43_ntab_write_bulk(dev, B43_NTAB16(7, 0x16e), 2, ntab7_15e_16e); 
     1893+       b43_ntab_write_bulk(dev, B43_NTAB16(7, 0x15d), 3, ntab7_15e_16e); 
     1894+       b43_ntab_write_bulk(dev, B43_NTAB16(7, 0x16d), 3, ntab7_15e_16e); 
     1895  
     1896+       b43_nphy_set_rf_sequence(dev, 1, tx2rx_events, tx2rx_delays, 
     1897+                                ARRAY_SIZE(tx2rx_events)); 
     1898        if (b43_nphy_ipa(dev)) 
     1899                b43_nphy_set_rf_sequence(dev, 0, rx2tx_events_ipa, 
     1900                                rx2tx_delays_ipa, ARRAY_SIZE(rx2tx_events_ipa)); 
     1901@@ -2371,84 +2791,176 @@ static void b43_nphy_workarounds_rev7plu 
     1902        b43_phy_maskset(dev, B43_NPHY_EPS_OVERRIDEI_0, 0x3FFF, 0x4000); 
     1903        b43_phy_maskset(dev, B43_NPHY_EPS_OVERRIDEI_1, 0x3FFF, 0x4000); 
     1904  
     1905-       lpf_20 = b43_nphy_read_lpf_ctl(dev, 0x154); 
     1906-       lpf_40 = b43_nphy_read_lpf_ctl(dev, 0x159); 
     1907-       lpf_11b = b43_nphy_read_lpf_ctl(dev, 0x152); 
     1908+       for (core = 0; core < 2; core++) { 
     1909+               lpf_ofdm_20mhz[core] = b43_nphy_read_lpf_ctl(dev, 0x154 + core * 0x10); 
     1910+               lpf_ofdm_40mhz[core] = b43_nphy_read_lpf_ctl(dev, 0x159 + core * 0x10); 
     1911+               lpf_11b[core] = b43_nphy_read_lpf_ctl(dev, 0x152 + core * 0x10); 
     1912+       } 
     1913+ 
     1914+       bcap_val = b43_radio_read(dev, R2057_RCCAL_BCAP_VAL); 
     1915+       scap_val = b43_radio_read(dev, R2057_RCCAL_SCAP_VAL); 
     1916+ 
    15371917        if (b43_nphy_ipa(dev)) { 
    15381918-               if ((phy->radio_rev == 5 && phy->is_40mhz) || 
    1539 +               if ((phy->radio_rev == 5 && b43_is_40mhz(dev)) || 
    1540                     phy->radio_rev == 7 || phy->radio_rev == 8) { 
    1541                         bcap_val = b43_radio_read(dev, 0x16b); 
    1542                         scap_val = b43_radio_read(dev, 0x16a); 
    1543                         scap_val_11b = scap_val; 
    1544                         bcap_val_11b = bcap_val; 
     1919-                   phy->radio_rev == 7 || phy->radio_rev == 8) { 
     1920-                       bcap_val = b43_radio_read(dev, 0x16b); 
     1921-                       scap_val = b43_radio_read(dev, 0x16a); 
     1922-                       scap_val_11b = scap_val; 
     1923-                       bcap_val_11b = bcap_val; 
    15451924-                       if (phy->radio_rev == 5 && phy->is_40mhz) { 
    1546 +                       if (phy->radio_rev == 5 && b43_is_40mhz(dev)) { 
    1547                                 scap_val_11n_20 = scap_val; 
    1548                                 bcap_val_11n_20 = bcap_val; 
    1549                                 scap_val_11n_40 = bcap_val_11n_40 = 0xc; 
    1550 @@ -2523,7 +2844,7 @@ static void b43_nphy_workarounds_rev7plu 
     1925-                               scap_val_11n_20 = scap_val; 
     1926-                               bcap_val_11n_20 = bcap_val; 
     1927-                               scap_val_11n_40 = bcap_val_11n_40 = 0xc; 
     1928+               bool ghz2 = b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ; 
     1929+ 
     1930+               switch (phy->radio_rev) { 
     1931+               case 5: 
     1932+                       /* Check radio version (to be 0) by PHY rev for now */ 
     1933+                       if (phy->rev == 8 && b43_is_40mhz(dev)) { 
     1934+                               for (core = 0; core < 2; core++) { 
     1935+                                       scap_val_11b[core] = scap_val; 
     1936+                                       bcap_val_11b[core] = bcap_val; 
     1937+                                       scap_val_11n_20[core] = scap_val; 
     1938+                                       bcap_val_11n_20[core] = bcap_val; 
     1939+                                       scap_val_11n_40[core] = 0xc; 
     1940+                                       bcap_val_11n_40[core] = 0xc; 
     1941+                               } 
     1942+ 
     1943                                rccal_ovrd = true; 
     1944-                       } else { /* Rev 7/8 */ 
     1945-                               lpf_20 = 4; 
     1946-                               lpf_11b = 1; 
     1947+                       } 
     1948+                       if (phy->rev == 9) { 
     1949+                               /* TODO: Radio version 1 (e.g. BCM5357B0) */ 
     1950+                       } 
     1951+                       break; 
     1952+               case 7: 
     1953+               case 8: 
     1954+                       for (core = 0; core < 2; core++) { 
     1955+                               scap_val_11b[core] = scap_val; 
     1956+                               bcap_val_11b[core] = bcap_val; 
     1957+                               lpf_ofdm_20mhz[core] = 4; 
     1958+                               lpf_11b[core] = 1; 
     1959                                if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) { 
     1960-                                       scap_val_11n_20 = 0xc; 
     1961-                                       bcap_val_11n_20 = 0xc; 
     1962-                                       scap_val_11n_40 = 0xa; 
     1963-                                       bcap_val_11n_40 = 0xa; 
     1964+                                       scap_val_11n_20[core] = 0xc; 
     1965+                                       bcap_val_11n_20[core] = 0xc; 
     1966+                                       scap_val_11n_40[core] = 0xa; 
     1967+                                       bcap_val_11n_40[core] = 0xa; 
     1968                                } else { 
     1969-                                       scap_val_11n_20 = 0x14; 
     1970-                                       bcap_val_11n_20 = 0x14; 
     1971-                                       scap_val_11n_40 = 0xf; 
     1972-                                       bcap_val_11n_40 = 0xf; 
     1973+                                       scap_val_11n_20[core] = 0x14; 
     1974+                                       bcap_val_11n_20[core] = 0x14; 
     1975+                                       scap_val_11n_40[core] = 0xf; 
     1976+                                       bcap_val_11n_40[core] = 0xf; 
     1977                                } 
     1978-                               rccal_ovrd = true; 
     1979                        } 
     1980+ 
     1981+                       rccal_ovrd = true; 
     1982+                       break; 
     1983+               case 9: 
     1984+                       for (core = 0; core < 2; core++) { 
     1985+                               bcap_val_11b[core] = bcap_val; 
     1986+                               scap_val_11b[core] = scap_val; 
     1987+                               lpf_11b[core] = 1; 
     1988+ 
     1989+                               if (ghz2) { 
     1990+                                       bcap_val_11n_20[core] = bcap_val + 13; 
     1991+                                       scap_val_11n_20[core] = scap_val + 15; 
     1992+                               } else { 
     1993+                                       bcap_val_11n_20[core] = bcap_val + 14; 
     1994+                                       scap_val_11n_20[core] = scap_val + 15; 
     1995+                               } 
     1996+                               lpf_ofdm_20mhz[core] = 4; 
     1997+ 
     1998+                               if (ghz2) { 
     1999+                                       bcap_val_11n_40[core] = bcap_val - 7; 
     2000+                                       scap_val_11n_40[core] = scap_val - 5; 
     2001+                               } else { 
     2002+                                       bcap_val_11n_40[core] = bcap_val + 2; 
     2003+                                       scap_val_11n_40[core] = scap_val + 4; 
     2004+                               } 
     2005+                               lpf_ofdm_40mhz[core] = 4; 
     2006+                       } 
     2007+ 
     2008+                       rccal_ovrd = true; 
     2009+                       break; 
     2010+               case 14: 
     2011+                       for (core = 0; core < 2; core++) { 
     2012+                               bcap_val_11b[core] = bcap_val; 
     2013+                               scap_val_11b[core] = scap_val; 
     2014+                               lpf_11b[core] = 1; 
     2015+                       } 
     2016+ 
     2017+                       bcap_val_11n_20[0] = bcap_val + 20; 
     2018+                       scap_val_11n_20[0] = scap_val + 20; 
     2019+                       lpf_ofdm_20mhz[0] = 3; 
     2020+ 
     2021+                       bcap_val_11n_20[1] = bcap_val + 16; 
     2022+                       scap_val_11n_20[1] = scap_val + 16; 
     2023+                       lpf_ofdm_20mhz[1] = 3; 
     2024+ 
     2025+                       bcap_val_11n_40[0] = bcap_val + 20; 
     2026+                       scap_val_11n_40[0] = scap_val + 20; 
     2027+                       lpf_ofdm_40mhz[0] = 4; 
     2028+ 
     2029+                       bcap_val_11n_40[1] = bcap_val + 10; 
     2030+                       scap_val_11n_40[1] = scap_val + 10; 
     2031+                       lpf_ofdm_40mhz[1] = 4; 
     2032+ 
     2033+                       rccal_ovrd = true; 
     2034+                       break; 
     2035                } 
     2036        } else { 
     2037                if (phy->radio_rev == 5) { 
     2038-                       lpf_20 = 1; 
     2039-                       lpf_40 = 3; 
     2040-                       bcap_val = b43_radio_read(dev, 0x16b); 
     2041-                       scap_val = b43_radio_read(dev, 0x16a); 
     2042-                       scap_val_11b = scap_val; 
     2043-                       bcap_val_11b = bcap_val; 
     2044-                       scap_val_11n_20 = 0x11; 
     2045-                       scap_val_11n_40 = 0x11; 
     2046-                       bcap_val_11n_20 = 0x13; 
     2047-                       bcap_val_11n_40 = 0x13; 
     2048+                       for (core = 0; core < 2; core++) { 
     2049+                               lpf_ofdm_20mhz[core] = 1; 
     2050+                               lpf_ofdm_40mhz[core] = 3; 
     2051+                               scap_val_11b[core] = scap_val; 
     2052+                               bcap_val_11b[core] = bcap_val; 
     2053+                               scap_val_11n_20[core] = 0x11; 
     2054+                               scap_val_11n_40[core] = 0x11; 
     2055+                               bcap_val_11n_20[core] = 0x13; 
     2056+                               bcap_val_11n_40[core] = 0x13; 
     2057+                       } 
     2058+ 
     2059                        rccal_ovrd = true; 
     2060                } 
     2061        } 
     2062        if (rccal_ovrd) { 
     2063-               rx2tx_lut_20_11b = (bcap_val_11b << 8) | 
     2064-                                  (scap_val_11b << 3) | 
     2065-                                  lpf_11b; 
     2066-               rx2tx_lut_20_11n = (bcap_val_11n_20 << 8) | 
     2067-                                  (scap_val_11n_20 << 3) | 
     2068-                                  lpf_20; 
     2069-               rx2tx_lut_40_11n = (bcap_val_11n_40 << 8) | 
     2070-                                  (scap_val_11n_40 << 3) | 
     2071-                                  lpf_40; 
     2072+               u16 rx2tx_lut_20_11b[2], rx2tx_lut_20_11n[2], rx2tx_lut_40_11n[2]; 
     2073+               u8 rx2tx_lut_extra = 1; 
     2074+ 
     2075+               for (core = 0; core < 2; core++) { 
     2076+                       bcap_val_11b[core] = clamp_val(bcap_val_11b[core], 0, 0x1f); 
     2077+                       scap_val_11b[core] = clamp_val(scap_val_11b[core], 0, 0x1f); 
     2078+                       bcap_val_11n_20[core] = clamp_val(bcap_val_11n_20[core], 0, 0x1f); 
     2079+                       scap_val_11n_20[core] = clamp_val(scap_val_11n_20[core], 0, 0x1f); 
     2080+                       bcap_val_11n_40[core] = clamp_val(bcap_val_11n_40[core], 0, 0x1f); 
     2081+                       scap_val_11n_40[core] = clamp_val(scap_val_11n_40[core], 0, 0x1f); 
     2082+ 
     2083+                       rx2tx_lut_20_11b[core] = (rx2tx_lut_extra << 13) | 
     2084+                                                (bcap_val_11b[core] << 8) | 
     2085+                                                (scap_val_11b[core] << 3) | 
     2086+                                                lpf_11b[core]; 
     2087+                       rx2tx_lut_20_11n[core] = (rx2tx_lut_extra << 13) | 
     2088+                                                (bcap_val_11n_20[core] << 8) | 
     2089+                                                (scap_val_11n_20[core] << 3) | 
     2090+                                                lpf_ofdm_20mhz[core]; 
     2091+                       rx2tx_lut_40_11n[core] = (rx2tx_lut_extra << 13) | 
     2092+                                                (bcap_val_11n_40[core] << 8) | 
     2093+                                                (scap_val_11n_40[core] << 3) | 
     2094+                                                lpf_ofdm_40mhz[core]; 
     2095+               } 
     2096+ 
     2097                for (core = 0; core < 2; core++) { 
     2098                        b43_ntab_write(dev, B43_NTAB16(7, 0x152 + core * 16), 
     2099-                                      rx2tx_lut_20_11b); 
     2100+                                      rx2tx_lut_20_11b[core]); 
     2101                        b43_ntab_write(dev, B43_NTAB16(7, 0x153 + core * 16), 
     2102-                                      rx2tx_lut_20_11n); 
     2103+                                      rx2tx_lut_20_11n[core]); 
     2104                        b43_ntab_write(dev, B43_NTAB16(7, 0x154 + core * 16), 
     2105-                                      rx2tx_lut_20_11n); 
     2106+                                      rx2tx_lut_20_11n[core]); 
     2107                        b43_ntab_write(dev, B43_NTAB16(7, 0x155 + core * 16), 
     2108-                                      rx2tx_lut_40_11n); 
     2109+                                      rx2tx_lut_40_11n[core]); 
     2110                        b43_ntab_write(dev, B43_NTAB16(7, 0x156 + core * 16), 
     2111-                                      rx2tx_lut_40_11n); 
     2112+                                      rx2tx_lut_40_11n[core]); 
     2113                        b43_ntab_write(dev, B43_NTAB16(7, 0x157 + core * 16), 
     2114-                                      rx2tx_lut_40_11n); 
     2115+                                      rx2tx_lut_40_11n[core]); 
     2116                        b43_ntab_write(dev, B43_NTAB16(7, 0x158 + core * 16), 
     2117-                                      rx2tx_lut_40_11n); 
     2118+                                      rx2tx_lut_40_11n[core]); 
     2119                        b43_ntab_write(dev, B43_NTAB16(7, 0x159 + core * 16), 
     2120-                                      rx2tx_lut_40_11n); 
     2121+                                      rx2tx_lut_40_11n[core]); 
     2122                } 
     2123-               b43_nphy_rf_ctl_override_rev7(dev, 16, 1, 3, false, 2); 
     2124        } 
     2125+ 
     2126        b43_phy_write(dev, 0x32F, 0x3); 
     2127+ 
     2128        if (phy->radio_rev == 4 || phy->radio_rev == 6) 
     2129                b43_nphy_rf_ctl_override_rev7(dev, 4, 1, 3, false, 0); 
     2130  
     2131@@ -2496,7 +3008,8 @@ static void b43_nphy_workarounds_rev7plu 
     2132                                                                0x7f); 
     2133                                } 
     2134                        } 
     2135-                       if (phy->radio_rev == 3) { 
     2136+                       switch (phy->radio_rev) { 
     2137+                       case 3: 
     2138                                for (core = 0; core < 2; core++) { 
     2139                                        if (core == 0) { 
     2140                                                b43_radio_write(dev, 0x64, 
     2141@@ -2522,17 +3035,34 @@ static void b43_nphy_workarounds_rev7plu 
     2142                                                                0x3E); 
    15512143                                        } 
    15522144                                } 
    1553                         } else if (phy->radio_rev == 7 || phy->radio_rev == 8) { 
     2145-                       } else if (phy->radio_rev == 7 || phy->radio_rev == 8) { 
    15542146-                               if (!phy->is_40mhz) { 
     2147+                               break; 
     2148+                       case 7: 
     2149+                       case 8: 
    15552150+                               if (!b43_is_40mhz(dev)) { 
    15562151                                        b43_radio_write(dev, 0x5F, 0x14); 
    15572152                                        b43_radio_write(dev, 0xE8, 0x12); 
    15582153                                } else { 
    1559 @@ -2532,7 +2853,7 @@ static void b43_nphy_workarounds_rev7plu 
     2154                                        b43_radio_write(dev, 0x5F, 0x16); 
     2155                                        b43_radio_write(dev, 0xE8, 0x16); 
    15602156                                } 
     2157+                               break; 
     2158+                       case 14: 
     2159+                               for (core = 0; core < 2; core++) { 
     2160+                                       int o = core ? 0x85 : 0; 
     2161+ 
     2162+                                       b43_radio_write(dev, o + R2057_IPA2G_CASCONV_CORE0, 0x13); 
     2163+                                       b43_radio_write(dev, o + R2057_TXMIX2G_TUNE_BOOST_PU_CORE0, 0x21); 
     2164+                                       b43_radio_write(dev, o + R2057_IPA2G_BIAS_FILTER_CORE0, 0xff); 
     2165+                                       b43_radio_write(dev, o + R2057_PAD2G_IDACS_CORE0, 0x88); 
     2166+                                       b43_radio_write(dev, o + R2057_PAD2G_TUNE_PUS_CORE0, 0x23); 
     2167+                                       b43_radio_write(dev, o + R2057_IPA2G_IMAIN_CORE0, 0x16); 
     2168+                                       b43_radio_write(dev, o + R2057_PAD_BIAS_FILTER_BWS_CORE0, 0x3e); 
     2169+                                       b43_radio_write(dev, o + R2057_BACKUP1_CORE0, 0x10); 
     2170+                               } 
     2171+                               break; 
    15612172                        } 
    15622173                } else { 
     
    15662177                            (freq >= 5745 && freq <= 5805)) { 
    15672178                                b43_radio_write(dev, 0x7D, 0xFF); 
    1568 @@ -2596,7 +2917,7 @@ static void b43_nphy_workarounds_rev7plu 
     2179@@ -2577,8 +3107,8 @@ static void b43_nphy_workarounds_rev7plu 
     2180                b43_phy_set(dev, B43_NPHY_AFECTL_OVER1, 0x1); 
     2181                b43_phy_mask(dev, B43_NPHY_AFECTL_C2, ~0x1); 
     2182                b43_phy_set(dev, B43_NPHY_AFECTL_OVER, 0x1); 
     2183-               b43_ntab_write(dev, B43_NTAB16(8, 0x05), 0x20); 
     2184-               b43_ntab_write(dev, B43_NTAB16(8, 0x15), 0x20); 
     2185+               b43_ntab_write(dev, B43_NTAB16(8, 0x05), 0); 
     2186+               b43_ntab_write(dev, B43_NTAB16(8, 0x15), 0); 
     2187  
     2188                b43_phy_mask(dev, B43_NPHY_AFECTL_C1, ~0x4); 
     2189                b43_phy_mask(dev, B43_NPHY_AFECTL_OVER1, ~0x4); 
     2190@@ -2589,20 +3119,20 @@ static void b43_nphy_workarounds_rev7plu 
     2191        b43_phy_write(dev, B43_NPHY_ENDROP_TLEN, 0x2); 
     2192  
     2193        b43_ntab_write(dev, B43_NTAB32(16, 0x100), 20); 
     2194-       b43_ntab_write_bulk(dev, B43_NTAB16(7, 0x138), 2, ntab7_138_146); 
     2195+       b43_ntab_write_bulk(dev, B43_NTAB8(7, 0x138), 2, ntab7_138_146); 
     2196        b43_ntab_write(dev, B43_NTAB16(7, 0x141), 0x77); 
     2197-       b43_ntab_write_bulk(dev, B43_NTAB16(7, 0x133), 3, ntab7_133); 
     2198-       b43_ntab_write_bulk(dev, B43_NTAB16(7, 0x146), 2, ntab7_138_146); 
     2199+       b43_ntab_write_bulk(dev, B43_NTAB8(7, 0x133), 3, ntab7_133); 
     2200+       b43_ntab_write_bulk(dev, B43_NTAB8(7, 0x146), 2, ntab7_138_146); 
    15692201        b43_ntab_write(dev, B43_NTAB16(7, 0x123), 0x77); 
    15702202        b43_ntab_write(dev, B43_NTAB16(7, 0x12A), 0x77); 
    15712203  
    15722204-       if (!phy->is_40mhz) { 
    1573 +       if (!b43_is_40mhz(dev)) { 
    1574                 b43_ntab_write(dev, B43_NTAB32(16, 0x03), 0x18D); 
    1575                 b43_ntab_write(dev, B43_NTAB32(16, 0x7F), 0x18D); 
    1576         } else { 
    1577 @@ -2695,7 +3016,7 @@ static void b43_nphy_workarounds_rev3plu 
     2205-               b43_ntab_write(dev, B43_NTAB32(16, 0x03), 0x18D); 
     2206-               b43_ntab_write(dev, B43_NTAB32(16, 0x7F), 0x18D); 
     2207-       } else { 
     2208-               b43_ntab_write(dev, B43_NTAB32(16, 0x03), 0x14D); 
     2209-               b43_ntab_write(dev, B43_NTAB32(16, 0x7F), 0x14D); 
     2210-       } 
     2211+       b43_ntab_read_bulk(dev, B43_NTAB32(16, 0x02), 1, noise_tbl); 
     2212+       noise_tbl[1] = b43_is_40mhz(dev) ? 0x14D : 0x18D; 
     2213+       b43_ntab_write_bulk(dev, B43_NTAB32(16, 0x02), 2, noise_tbl); 
     2214+ 
     2215+       b43_ntab_read_bulk(dev, B43_NTAB32(16, 0x7E), 1, noise_tbl); 
     2216+       noise_tbl[1] = b43_is_40mhz(dev) ? 0x14D : 0x18D; 
     2217+       b43_ntab_write_bulk(dev, B43_NTAB32(16, 0x7E), 2, noise_tbl); 
     2218  
     2219        b43_nphy_gain_ctl_workarounds(dev); 
     2220  
     2221@@ -2695,7 +3225,7 @@ static void b43_nphy_workarounds_rev3plu 
    15782222  
    15792223        b43_phy_maskset(dev, B43_NPHY_SGILTRNOFFSET, 0xF0FF, 0x0700); 
     
    15842228                b43_ntab_write(dev, B43_NTAB32(16, 127), 0x18D); 
    15852229        } else { 
    1586 @@ -2930,6 +3251,7 @@ static void b43_nphy_workarounds(struct 
     2230@@ -2930,6 +3460,7 @@ static void b43_nphy_workarounds(struct 
    15872231        b43_phy_set(dev, B43_NPHY_IQFLIP, 
    15882232                    B43_NPHY_IQFLIP_ADC1 | B43_NPHY_IQFLIP_ADC2); 
     
    15922236                b43_nphy_workarounds_rev7plus(dev); 
    15932237        else if (dev->phy.rev >= 3) 
    1594 @@ -2950,12 +3272,13 @@ static void b43_nphy_workarounds(struct 
     2238@@ -2950,12 +3481,13 @@ static void b43_nphy_workarounds(struct 
    15952239  * http://bcm-v4.sipsolutions.net/802.11/PHY/N/TXTone 
    15962240  */ 
     
    16082252 } 
    16092253  
    1610 @@ -2990,6 +3313,7 @@ static void b43_nphy_update_txrx_chain(s 
     2254@@ -2990,6 +3522,7 @@ static void b43_nphy_update_txrx_chain(s 
    16112255 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/stop-playback */ 
    16122256 static void b43_nphy_stop_playback(struct b43_wldev *dev) 
     
    16162260        u16 tmp; 
    16172261  
    1618 @@ -3010,6 +3334,15 @@ static void b43_nphy_stop_playback(struc 
     2262@@ -3010,6 +3543,15 @@ static void b43_nphy_stop_playback(struc 
    16192263                nphy->bb_mult_save = 0; 
    16202264        } 
     
    16322276                b43_nphy_stay_in_carrier_search(dev, 0); 
    16332277 } 
    1634 @@ -3019,16 +3352,23 @@ static void b43_nphy_iq_cal_gain_params( 
     2278@@ -3019,16 +3561,23 @@ static void b43_nphy_iq_cal_gain_params( 
    16352279                                        struct nphy_txgains target, 
    16362280                                        struct nphy_iqcal_params *params) 
     
    16582302                        params->ncorr[j] = 0x79; 
    16592303        } else { 
    1660 @@ -3069,6 +3409,7 @@ static enum b43_txpwr_result b43_nphy_op 
     2304@@ -3069,6 +3618,7 @@ static enum b43_txpwr_result b43_nphy_op 
    16612305 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/TxPwrCtrlEnable */ 
    16622306 static void b43_nphy_tx_power_ctrl(struct b43_wldev *dev, bool enable) 
     
    16662310        u8 i; 
    16672311        u16 bmask, val, tmp; 
    1668 @@ -3118,7 +3459,7 @@ static void b43_nphy_tx_power_ctrl(struc 
     2312@@ -3118,7 +3668,7 @@ static void b43_nphy_tx_power_ctrl(struc 
    16692313                        b43_phy_maskset(dev, B43_NPHY_BPHY_CTL3, 
    16702314                                ~B43_NPHY_BPHY_CTL3_SCALE, 0x5A); 
     
    16752319        } else { 
    16762320                b43_ntab_write_bulk(dev, B43_NTAB16(26, 64), 84, 
    1677 @@ -3138,12 +3479,25 @@ static void b43_nphy_tx_power_ctrl(struc 
     2321@@ -3138,12 +3688,25 @@ static void b43_nphy_tx_power_ctrl(struc 
    16782322                b43_phy_maskset(dev, B43_NPHY_TXPCTL_CMD, ~(bmask), val); 
    16792323  
     
    17042348  
    17052349                if (dev->phy.rev >= 3) { 
    1706 @@ -3160,6 +3514,10 @@ static void b43_nphy_tx_power_ctrl(struc 
     2350@@ -3160,6 +3723,10 @@ static void b43_nphy_tx_power_ctrl(struc 
    17072351                        } 
    17082352                } 
     
    17152359                        b43_phy_mask(dev, B43_NPHY_AFECTL_OVER1, ~0x100); 
    17162360                        b43_phy_mask(dev, B43_NPHY_AFECTL_OVER, ~0x100); 
    1717 @@ -3172,7 +3530,7 @@ static void b43_nphy_tx_power_ctrl(struc 
     2361@@ -3172,7 +3739,7 @@ static void b43_nphy_tx_power_ctrl(struc 
    17182362                else if (dev->phy.rev < 2) 
    17192363                        b43_phy_maskset(dev, B43_NPHY_BPHY_CTL3, ~0xFF, 0x40); 
     
    17242368  
    17252369                if (b43_nphy_ipa(dev)) { 
    1726 @@ -3188,18 +3546,20 @@ static void b43_nphy_tx_power_ctrl(struc 
     2370@@ -3188,18 +3755,20 @@ static void b43_nphy_tx_power_ctrl(struc 
    17272371 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/TxPwrFix */ 
    17282372 static void b43_nphy_tx_power_fix(struct b43_wldev *dev) 
     
    17462390                txpi[0] = txpi[1] = 30; 
    17472391        } else if (dev->phy.rev >= 3) { 
    1748 @@ -3238,7 +3598,11 @@ static void b43_nphy_tx_power_fix(struct 
     2392@@ -3238,7 +3807,11 @@ static void b43_nphy_tx_power_fix(struct 
    17492393        */ 
    17502394  
     
    17592403                if (dev->phy.rev >= 3) 
    17602404                        radio_gain = (txgain >> 16) & 0x1FFFF; 
    1761 @@ -3298,7 +3662,9 @@ static void b43_nphy_ipa_internal_tssi_s 
     2405@@ -3298,7 +3871,9 @@ static void b43_nphy_ipa_internal_tssi_s 
    17622406        u8 core; 
    17632407        u16 r; /* routing */ 
     
    17702414                        r = core ? 0x190 : 0x170; 
    17712415                        if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) { 
    1772 @@ -3386,24 +3752,32 @@ static void b43_nphy_tx_power_ctl_idle_t 
     2416@@ -3386,24 +3961,32 @@ static void b43_nphy_tx_power_ctl_idle_t 
    17732417        if (b43_nphy_ipa(dev)) 
    17742418                b43_nphy_ipa_internal_tssi_setup(dev); 
     
    18072451                nphy->pwr_ctl_info[1].idle_tssi_5g = (tmp >> 8) & 0xFF; 
    18082452        } else { 
    1809 @@ -3443,21 +3817,21 @@ static void b43_nphy_tx_prepare_adjusted 
     2453@@ -3443,21 +4026,21 @@ static void b43_nphy_tx_prepare_adjusted 
    18102454                delta = 0; 
    18112455                switch (stf_mode) { 
     
    18342478                } 
    18352479  
    1836 @@ -3478,6 +3852,7 @@ static void b43_nphy_tx_prepare_adjusted 
     2480@@ -3478,6 +4061,7 @@ static void b43_nphy_tx_prepare_adjusted 
    18372481 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/TxPwrCtrlSetup */ 
    18382482 static void b43_nphy_tx_power_ctl_setup(struct b43_wldev *dev) 
     
    18422486        struct ssb_sprom *sprom = dev->dev->bus_sprom; 
    18432487  
    1844 @@ -3487,7 +3862,7 @@ static void b43_nphy_tx_power_ctl_setup( 
     2488@@ -3487,7 +4071,7 @@ static void b43_nphy_tx_power_ctl_setup( 
    18452489        s32 num, den, pwr; 
    18462490        u32 regval[64]; 
     
    18512495        u16 r; /* routing */ 
    18522496        u8 i, c; 
    1853 @@ -3594,7 +3969,9 @@ static void b43_nphy_tx_power_ctl_setup( 
     2497@@ -3594,7 +4178,9 @@ static void b43_nphy_tx_power_ctl_setup( 
    18542498                udelay(1); 
    18552499        } 
     
    18622506                                ~B43_NPHY_TXPCTL_CMD_INIT, 0x19); 
    18632507                b43_phy_maskset(dev, B43_NPHY_TXPCTL_INIT, 
    1864 @@ -3651,27 +4028,36 @@ static void b43_nphy_tx_gain_table_uploa 
     2508@@ -3651,27 +4237,36 @@ static void b43_nphy_tx_gain_table_uploa 
    18652509        int i; 
    18662510  
     
    19102554 } 
    19112555  
    1912 @@ -3688,7 +4074,9 @@ static void b43_nphy_pa_override(struct 
     2556@@ -3688,7 +4283,9 @@ static void b43_nphy_pa_override(struct 
    19132557                nphy->rfctrl_intc2_save = b43_phy_read(dev, 
    19142558                                                       B43_NPHY_RFCTL_INTC2); 
     
    19212565                                tmp = 0x600; 
    19222566                        else 
    1923 @@ -3709,21 +4097,28 @@ static void b43_nphy_pa_override(struct 
     2567@@ -3709,21 +4306,28 @@ static void b43_nphy_pa_override(struct 
    19242568        } 
    19252569 } 
     
    19602604 } 
    19612605  
    1962 @@ -3996,7 +4391,7 @@ static void b43_nphy_spur_workaround(str 
     2606@@ -3996,7 +4600,7 @@ static void b43_nphy_spur_workaround(str 
    19632607  
    19642608        if (nphy->gband_spurwar_en) { 
     
    19692613                else 
    19702614                        ; /* TODO: N PHY Adjust Min Noise Var(0, NULL, NULL)*/ 
    1971 @@ -4128,7 +4523,13 @@ static void b43_nphy_restore_rssi_cal(st 
     2615@@ -4128,7 +4732,13 @@ static void b43_nphy_restore_rssi_cal(st 
    19722616                rssical_phy_regs = nphy->rssical_cache.rssical_phy_regs_5G; 
    19732617        } 
     
    19842628                b43_radio_maskset(dev, B2056_RX0 | B2056_RX_RSSI_MISC, 0xE3, 
    19852629                                  rssical_radio_regs[0]); 
    1986 @@ -4152,15 +4553,78 @@ static void b43_nphy_restore_rssi_cal(st 
     2630@@ -4152,15 +4762,78 @@ static void b43_nphy_restore_rssi_cal(st 
    19872631        b43_phy_write(dev, B43_NPHY_RSSIMC_1Q_RSSI_Y, rssical_phy_regs[11]); 
    19882632 } 
     
    20642708                tmp = (i == 0) ? 0x2000 : 0x3000; 
    20652709                offset = i * 11; 
    2066 @@ -4290,7 +4754,7 @@ static void b43_nphy_int_pa_set_tx_dig_f 
    2067                         b43_phy_write(dev, B43_PHY_N(offset[i] + j), 
    2068                                         tbl_tx_filter_coef_rev4[i][j]); 
    2069   
     2710@@ -4269,41 +4942,61 @@ static void b43_nphy_update_tx_cal_ladde 
     2711        } 
     2712 } 
     2713  
     2714+static void b43_nphy_pa_set_tx_dig_filter(struct b43_wldev *dev, u16 offset, 
     2715+                                         const s16 *filter) 
     2716+{ 
     2717+       int i; 
     2718+ 
     2719+       offset = B43_PHY_N(offset); 
     2720+ 
     2721+       for (i = 0; i < 15; i++, offset++) 
     2722+               b43_phy_write(dev, offset, filter[i]); 
     2723+} 
     2724+ 
     2725 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/ExtPaSetTxDigiFilts */ 
     2726 static void b43_nphy_ext_pa_set_tx_dig_filters(struct b43_wldev *dev) 
     2727 { 
     2728-       int i; 
     2729-       for (i = 0; i < 15; i++) 
     2730-               b43_phy_write(dev, B43_PHY_N(0x2C5 + i), 
     2731-                               tbl_tx_filter_coef_rev4[2][i]); 
     2732+       b43_nphy_pa_set_tx_dig_filter(dev, 0x2C5, 
     2733+                                     tbl_tx_filter_coef_rev4[2]); 
     2734 } 
     2735  
     2736 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/IpaSetTxDigiFilts */ 
     2737 static void b43_nphy_int_pa_set_tx_dig_filters(struct b43_wldev *dev) 
     2738 { 
     2739-       int i, j; 
     2740        /* B43_NPHY_TXF_20CO_S0A1, B43_NPHY_TXF_40CO_S0A1, unknown */ 
     2741        static const u16 offset[] = { 0x186, 0x195, 0x2C5 }; 
     2742+       static const s16 dig_filter_phy_rev16[] = { 
     2743+               -375, 136, -407, 208, -1527, 
     2744+               956, 93, 186, 93, 230, 
     2745+               -44, 230, 201, -191, 201, 
     2746+       }; 
     2747+       int i; 
     2748  
     2749        for (i = 0; i < 3; i++) 
     2750-               for (j = 0; j < 15; j++) 
     2751-                       b43_phy_write(dev, B43_PHY_N(offset[i] + j), 
     2752-                                       tbl_tx_filter_coef_rev4[i][j]); 
     2753- 
    20702754-       if (dev->phy.is_40mhz) { 
     2755-               for (j = 0; j < 15; j++) 
     2756-                       b43_phy_write(dev, B43_PHY_N(offset[0] + j), 
     2757-                                       tbl_tx_filter_coef_rev4[3][j]); 
     2758-       } else if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) { 
     2759-               for (j = 0; j < 15; j++) 
     2760-                       b43_phy_write(dev, B43_PHY_N(offset[0] + j), 
     2761-                                       tbl_tx_filter_coef_rev4[5][j]); 
     2762-       } 
     2763- 
     2764-       if (dev->phy.channel == 14) 
     2765-               for (j = 0; j < 15; j++) 
     2766-                       b43_phy_write(dev, B43_PHY_N(offset[0] + j), 
     2767-                                       tbl_tx_filter_coef_rev4[6][j]); 
     2768+               b43_nphy_pa_set_tx_dig_filter(dev, offset[i], 
     2769+                                             tbl_tx_filter_coef_rev4[i]); 
     2770+ 
     2771+       /* Verified with BCM43227 and BCM43228 */ 
     2772+       if (dev->phy.rev == 16) 
     2773+               b43_nphy_pa_set_tx_dig_filter(dev, 0x186, dig_filter_phy_rev16); 
     2774+ 
     2775+       if (dev->dev->chip_id == BCMA_CHIP_ID_BCM43217) { 
     2776+               b43_nphy_pa_set_tx_dig_filter(dev, 0x186, dig_filter_phy_rev16); 
     2777+               b43_nphy_pa_set_tx_dig_filter(dev, 0x195, 
     2778+                                             tbl_tx_filter_coef_rev4[1]); 
     2779+       } 
     2780+ 
    20712781+       if (b43_is_40mhz(dev)) { 
    2072                 for (j = 0; j < 15; j++) 
    2073                         b43_phy_write(dev, B43_PHY_N(offset[0] + j), 
    2074                                         tbl_tx_filter_coef_rev4[3][j]); 
    2075 @@ -4325,7 +4789,13 @@ static struct nphy_txgains b43_nphy_get_ 
     2782+               b43_nphy_pa_set_tx_dig_filter(dev, 0x186, 
     2783+                                             tbl_tx_filter_coef_rev4[3]); 
     2784+       } else { 
     2785+               if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) 
     2786+                       b43_nphy_pa_set_tx_dig_filter(dev, 0x186, 
     2787+                                                     tbl_tx_filter_coef_rev4[5]); 
     2788+               if (dev->phy.channel == 14) 
     2789+                       b43_nphy_pa_set_tx_dig_filter(dev, 0x186, 
     2790+                                                     tbl_tx_filter_coef_rev4[6]); 
     2791+       } 
     2792 } 
     2793  
     2794 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/GetTxGain */ 
     2795@@ -4325,7 +5018,13 @@ static struct nphy_txgains b43_nphy_get_ 
    20762796                        b43_nphy_stay_in_carrier_search(dev, false); 
    20772797  
     
    20882808                                target.pad[i] = (curr_gain[i] & 0x00F0) >> 4; 
    20892809                                target.pga[i] = (curr_gain[i] & 0x0F00) >> 8; 
    2090 @@ -4349,7 +4819,16 @@ static struct nphy_txgains b43_nphy_get_ 
     2810@@ -4349,7 +5048,16 @@ static struct nphy_txgains b43_nphy_get_ 
    20912811  
    20922812                for (i = 0; i < 2; ++i) { 
     
    21062826                                target.pad[i] = (table[index[i]] >> 20) & 0xF; 
    21072827                                target.pga[i] = (table[index[i]] >> 24) & 0xF; 
    2108 @@ -4398,6 +4877,8 @@ static void b43_nphy_tx_cal_phy_cleanup( 
     2828@@ -4398,6 +5106,8 @@ static void b43_nphy_tx_cal_phy_cleanup( 
    21092829 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/TxCalPhySetup */ 
    21102830 static void b43_nphy_tx_cal_phy_setup(struct b43_wldev *dev) 
     
    21152835        u16 tmp; 
    21162836  
    2117 @@ -4429,7 +4910,12 @@ static void b43_nphy_tx_cal_phy_setup(st 
     2837@@ -4429,7 +5139,12 @@ static void b43_nphy_tx_cal_phy_setup(st 
    21182838                regs[7] = b43_phy_read(dev, B43_NPHY_RFCTL_INTC1); 
    21192839                regs[8] = b43_phy_read(dev, B43_NPHY_RFCTL_INTC2); 
     
    21292849                b43_nphy_rf_ctl_intc_override(dev, N_INTC_OVERRIDE_TRSW, 8, 2); 
    21302850  
    2131 @@ -4437,6 +4923,33 @@ static void b43_nphy_tx_cal_phy_setup(st 
     2851@@ -4437,6 +5152,33 @@ static void b43_nphy_tx_cal_phy_setup(st 
    21322852                regs[10] = b43_phy_read(dev, B43_NPHY_PAPD_EN1); 
    21332853                b43_phy_mask(dev, B43_NPHY_PAPD_EN0, ~0x0001); 
     
    21632883                b43_phy_maskset(dev, B43_NPHY_AFECTL_C1, 0x0FFF, 0xA000); 
    21642884                b43_phy_maskset(dev, B43_NPHY_AFECTL_C2, 0x0FFF, 0xA000); 
    2165 @@ -4465,6 +4978,7 @@ static void b43_nphy_tx_cal_phy_setup(st 
     2885@@ -4465,6 +5207,7 @@ static void b43_nphy_tx_cal_phy_setup(st 
    21662886 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/SaveCal */ 
    21672887 static void b43_nphy_save_cal(struct b43_wldev *dev) 
     
    21712891  
    21722892        struct b43_phy_n_iq_comp *rxcal_coeffs = NULL; 
    2173 @@ -4489,7 +5003,26 @@ static void b43_nphy_save_cal(struct b43 
     2893@@ -4489,7 +5232,26 @@ static void b43_nphy_save_cal(struct b43 
    21742894  
    21752895        b43_nphy_rx_iq_coeffs(dev, false, rxcal_coeffs); 
     
    21992919                txcal_radio_regs[1] = b43_radio_read(dev, 0x2022); 
    22002920                txcal_radio_regs[2] = b43_radio_read(dev, 0x3021); 
    2201 @@ -4504,8 +5037,9 @@ static void b43_nphy_save_cal(struct b43 
     2921@@ -4504,8 +5266,9 @@ static void b43_nphy_save_cal(struct b43 
    22022922                txcal_radio_regs[2] = b43_radio_read(dev, 0x8D); 
    22032923                txcal_radio_regs[3] = b43_radio_read(dev, 0xBC); 
     
    22112931  
    22122932        if (nphy->hang_avoid) 
    2213 @@ -4515,6 +5049,7 @@ static void b43_nphy_save_cal(struct b43 
     2933@@ -4515,6 +5278,7 @@ static void b43_nphy_save_cal(struct b43 
    22142934 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RestoreCal */ 
    22152935 static void b43_nphy_restore_cal(struct b43_wldev *dev) 
     
    22192939  
    22202940        u16 coef[4]; 
    2221 @@ -4562,7 +5097,26 @@ static void b43_nphy_restore_cal(struct 
     2941@@ -4562,7 +5326,26 @@ static void b43_nphy_restore_cal(struct 
    22222942        } 
    22232943  
     
    22472967                b43_radio_write(dev, 0x2022, txcal_radio_regs[1]); 
    22482968                b43_radio_write(dev, 0x3021, txcal_radio_regs[2]); 
    2249 @@ -4585,6 +5139,7 @@ static int b43_nphy_cal_tx_iq_lo(struct 
     2969@@ -4585,6 +5368,7 @@ static int b43_nphy_cal_tx_iq_lo(struct 
    22502970                                struct nphy_txgains target, 
    22512971                                bool full, bool mphase) 
     
    22552975        int i; 
    22562976        int error = 0; 
    2257 @@ -4625,7 +5180,7 @@ static int b43_nphy_cal_tx_iq_lo(struct 
     2977@@ -4625,7 +5409,7 @@ static int b43_nphy_cal_tx_iq_lo(struct 
    22582978                (dev->phy.rev == 5 && nphy->ipa2g_on && 
    22592979                b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ); 
     
    22642984                                        tbl_tx_iqlo_cal_loft_ladder_40); 
    22652985                        b43_ntab_write_bulk(dev, B43_NTAB16(15, 32), 18, 
    2266 @@ -4638,18 +5193,24 @@ static int b43_nphy_cal_tx_iq_lo(struct 
     2986@@ -4638,18 +5422,24 @@ static int b43_nphy_cal_tx_iq_lo(struct 
    22672987                } 
    22682988        } 
     
    22943014        if (error == 0) { 
    22953015                if (nphy->mphase_cal_phase_id > 2) { 
    2296 @@ -4777,9 +5338,9 @@ static int b43_nphy_cal_tx_iq_lo(struct 
     3016@@ -4777,9 +5567,9 @@ static int b43_nphy_cal_tx_iq_lo(struct 
    22973017                                                nphy->txiqlocal_bestc); 
    22983018                        nphy->txiqlocal_coeffsvalid = true; 
     
    23063026                        length = 11; 
    23073027                        if (dev->phy.rev < 3) 
    2308 @@ -4815,8 +5376,8 @@ static void b43_nphy_reapply_tx_cal_coef 
     3028@@ -4815,8 +5605,8 @@ static void b43_nphy_reapply_tx_cal_coef 
    23093029        bool equal = true; 
    23103030  
     
    23173037  
    23183038        b43_ntab_read_bulk(dev, B43_NTAB16(15, 80), 7, buffer); 
    2319 @@ -4972,11 +5533,11 @@ static int b43_nphy_rev2_cal_rx_iq(struc 
     3039@@ -4972,11 +5762,11 @@ static int b43_nphy_rev2_cal_rx_iq(struc 
    23203040                        if (playtone) { 
    23213041                                ret = b43_nphy_tx_tone(dev, 4000, 
     
    23323052  
    23333053                        if (ret == 0) { 
    2334 @@ -5032,6 +5593,9 @@ static int b43_nphy_rev3_cal_rx_iq(struc 
     3054@@ -5032,6 +5822,9 @@ static int b43_nphy_rev3_cal_rx_iq(struc 
    23353055 static int b43_nphy_cal_rx_iq(struct b43_wldev *dev, 
    23363056                        struct nphy_txgains target, u8 type, bool debug) 
     
    23423062                return b43_nphy_rev3_cal_rx_iq(dev, target, type, debug); 
    23433063        else 
    2344 @@ -5118,6 +5682,9 @@ static void b43_nphy_bphy_init(struct b4 
     3064@@ -5118,6 +5911,9 @@ static void b43_nphy_bphy_init(struct b4 
    23453065 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/SuperSwitchInit */ 
    23463066 static void b43_nphy_superswitch_init(struct b43_wldev *dev, bool init) 
     
    23523072                if (!init) 
    23533073                        return; 
    2354 @@ -5193,6 +5760,10 @@ static int b43_phy_initn(struct b43_wlde 
     3074@@ -5193,6 +5989,10 @@ static int b43_phy_initn(struct b43_wlde 
    23553075 #endif 
    23563076                } 
     
    23633083        b43_nphy_tables_init(dev); 
    23643084        nphy->crsminpwr_adjusted = false; 
    2365 @@ -5202,6 +5773,16 @@ static int b43_phy_initn(struct b43_wlde 
     3085@@ -5202,6 +6002,16 @@ static int b43_phy_initn(struct b43_wlde 
    23663086        if (dev->phy.rev >= 3) { 
    23673087                b43_phy_write(dev, B43_NPHY_TXF_40CO_B1S1, 0); 
     
    23803100                b43_phy_write(dev, B43_NPHY_TXF_40CO_B32S1, 0); 
    23813101        } else { 
    2382 @@ -5239,7 +5820,9 @@ static int b43_phy_initn(struct b43_wlde 
     3102@@ -5239,7 +6049,9 @@ static int b43_phy_initn(struct b43_wlde 
    23833103        b43_phy_write(dev, B43_NPHY_PLOAD_CSENSE_EXTLEN, 0x50); 
    23843104        b43_phy_write(dev, B43_NPHY_TXRIFS_FRDEL, 0x30); 
     
    23913111  
    23923112        if (phy->rev < 2) { 
    2393 @@ -5271,10 +5854,12 @@ static int b43_phy_initn(struct b43_wlde 
     3113@@ -5271,10 +6083,12 @@ static int b43_phy_initn(struct b43_wlde 
    23943114  
    23953115        b43_mac_phy_clock_set(dev, true); 
     
    24083128        b43_nphy_classifier(dev, 0, 0); 
    24093129        b43_nphy_read_clip_detection(dev, clip); 
    2410 @@ -5348,7 +5933,7 @@ static int b43_phy_initn(struct b43_wlde 
     3130@@ -5348,7 +6162,7 @@ static int b43_phy_initn(struct b43_wlde 
    24113131        b43_phy_write(dev, B43_NPHY_TXMACDELAY, 0x0320); 
    24123132        if (phy->rev >= 3 && phy->rev <= 6) 
     
    24173137                b43_nphy_spur_workaround(dev); 
    24183138  
    2419 @@ -5434,14 +6019,14 @@ static void b43_nphy_channel_setup(struc 
     3139@@ -5397,23 +6211,23 @@ static void b43_nphy_channel_setup(struc 
     3140        struct b43_phy *phy = &dev->phy; 
     3141        struct b43_phy_n *nphy = dev->phy.n; 
     3142        int ch = new_channel->hw_value; 
     3143- 
     3144-       u16 old_band_5ghz; 
     3145        u16 tmp16; 
     3146  
     3147-       old_band_5ghz = 
     3148-               b43_phy_read(dev, B43_NPHY_BANDCTL) & B43_NPHY_BANDCTL_5GHZ; 
     3149-       if (new_channel->band == IEEE80211_BAND_5GHZ && !old_band_5ghz) { 
     3150+       if (new_channel->band == IEEE80211_BAND_5GHZ) { 
     3151                tmp16 = b43_read16(dev, B43_MMIO_PSM_PHY_HDR); 
     3152                b43_write16(dev, B43_MMIO_PSM_PHY_HDR, tmp16 | 4); 
     3153-               b43_phy_set(dev, B43_PHY_B_BBCFG, 0xC000); 
     3154+               /* Put BPHY in the reset */ 
     3155+               b43_phy_set(dev, B43_PHY_B_BBCFG, 
     3156+                           B43_PHY_B_BBCFG_RSTCCA | B43_PHY_B_BBCFG_RSTRX); 
     3157                b43_write16(dev, B43_MMIO_PSM_PHY_HDR, tmp16); 
     3158                b43_phy_set(dev, B43_NPHY_BANDCTL, B43_NPHY_BANDCTL_5GHZ); 
     3159-       } else if (new_channel->band == IEEE80211_BAND_2GHZ && old_band_5ghz) { 
     3160+       } else if (new_channel->band == IEEE80211_BAND_2GHZ) { 
     3161                b43_phy_mask(dev, B43_NPHY_BANDCTL, ~B43_NPHY_BANDCTL_5GHZ); 
     3162                tmp16 = b43_read16(dev, B43_MMIO_PSM_PHY_HDR); 
     3163                b43_write16(dev, B43_MMIO_PSM_PHY_HDR, tmp16 | 4); 
     3164-               b43_phy_mask(dev, B43_PHY_B_BBCFG, 0x3FFF); 
     3165+               /* Take BPHY out of the reset */ 
     3166+               b43_phy_mask(dev, B43_PHY_B_BBCFG, 
     3167+                            (u16)~(B43_PHY_B_BBCFG_RSTCCA | B43_PHY_B_BBCFG_RSTRX)); 
     3168                b43_write16(dev, B43_MMIO_PSM_PHY_HDR, tmp16); 
     3169        } 
     3170  
     3171@@ -5434,35 +6248,49 @@ static void b43_nphy_channel_setup(struc 
    24203172        if (dev->phy.rev < 3) 
    24213173                b43_nphy_adjust_lna_gain_table(dev); 
     
    24263178        if (dev->phy.rev >= 3 && 
    24273179            dev->phy.n->spur_avoid != B43_SPUR_AVOID_DISABLE) { 
    2428                 bool avoid = false; 
     3180-               bool avoid = false; 
     3181+               u8 spuravoid = 0; 
     3182+ 
    24293183                if (dev->phy.n->spur_avoid == B43_SPUR_AVOID_FORCE) { 
    2430                         avoid = true; 
     3184-                       avoid = true; 
    24313185-               } else if (!b43_channel_type_is_40mhz(phy->channel_type)) { 
    2432 +               } else if (!b43_is_40mhz(dev)) { 
    2433                         if ((ch >= 5 && ch <= 8) || ch == 13 || ch == 14) 
    2434                                 avoid = true; 
    2435                 } else { /* 40MHz */ 
    2436 @@ -5488,10 +6073,20 @@ static int b43_nphy_set_channel(struct b 
     3186-                       if ((ch >= 5 && ch <= 8) || ch == 13 || ch == 14) 
     3187-                               avoid = true; 
     3188-               } else { /* 40MHz */ 
     3189-                       if (nphy->aband_spurwar_en && 
     3190-                           (ch == 38 || ch == 102 || ch == 118)) 
     3191-                               avoid = dev->dev->chip_id == 0x4716; 
     3192-               } 
     3193- 
     3194-               b43_nphy_pmu_spur_avoid(dev, avoid); 
     3195- 
     3196-               if (dev->dev->chip_id == 43222 || dev->dev->chip_id == 43224 || 
     3197-                   dev->dev->chip_id == 43225) { 
     3198-                       b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 
     3199-                                   avoid ? 0x5341 : 0x8889); 
     3200-                       b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0x8); 
     3201+                       spuravoid = 1; 
     3202+               } else if (phy->rev >= 19) { 
     3203+                       /* TODO */ 
     3204+               } else if (phy->rev >= 18) { 
     3205+                       /* TODO */ 
     3206+               } else if (phy->rev >= 17) { 
     3207+                       /* TODO: Off for channels 1-11, but check 12-14! */ 
     3208+               } else if (phy->rev >= 16) { 
     3209+                       /* TODO: Off for 2 GHz, but check 5 GHz! */ 
     3210+               } else if (phy->rev >= 7) { 
     3211+                       if (!b43_is_40mhz(dev)) { /* 20MHz */ 
     3212+                               if (ch == 13 || ch == 14 || ch == 153) 
     3213+                                       spuravoid = 1; 
     3214+                       } else { /* 40 MHz */ 
     3215+                               if (ch == 54) 
     3216+                                       spuravoid = 1; 
     3217+                       } 
     3218+               } else { 
     3219+                       if (!b43_is_40mhz(dev)) { /* 20MHz */ 
     3220+                               if ((ch >= 5 && ch <= 8) || ch == 13 || ch == 14) 
     3221+                                       spuravoid = 1; 
     3222+                       } else { /* 40MHz */ 
     3223+                               if (nphy->aband_spurwar_en && 
     3224+                                   (ch == 38 || ch == 102 || ch == 118)) 
     3225+                                       spuravoid = dev->dev->chip_id == 0x4716; 
     3226+                       } 
     3227                } 
     3228  
     3229+               b43_nphy_pmu_spur_avoid(dev, spuravoid); 
     3230+ 
     3231+               b43_mac_switch_freq(dev, spuravoid); 
     3232+ 
     3233                if (dev->phy.rev == 3 || dev->phy.rev == 4) 
     3234                        ; /* TODO: reset PLL */ 
     3235  
     3236-               if (avoid) 
     3237+               if (spuravoid) 
     3238                        b43_phy_set(dev, B43_NPHY_BBCFG, B43_NPHY_BBCFG_RSTRX); 
     3239                else 
     3240                        b43_phy_mask(dev, B43_NPHY_BBCFG, 
     3241@@ -5488,10 +6316,20 @@ static int b43_nphy_set_channel(struct b 
    24373242  
    24383243        const struct b43_nphy_channeltab_entry_rev2 *tabent_r2 = NULL; 
     
    24563261                                                        channel->center_freq); 
    24573262                if (!tabent_r3) 
    2458 @@ -5506,20 +6101,38 @@ static int b43_nphy_set_channel(struct b 
     3263@@ -5506,20 +6344,38 @@ static int b43_nphy_set_channel(struct b 
    24593264        /* Channel is set later in common code, but we need to set it on our 
    24603265           own to let this function's subcalls work properly. */ 
     
    25033308                b43_radio_maskset(dev, 0x08, 0xFFFB, tmp); 
    25043309                b43_radio_2056_setup(dev, tabent_r3); 
    2505 @@ -5561,7 +6174,6 @@ static void b43_nphy_op_prepare_structs( 
     3310@@ -5561,7 +6417,6 @@ static void b43_nphy_op_prepare_structs( 
    25063311        nphy->hang_avoid = (phy->rev == 3 || phy->rev == 4); 
    25073312        nphy->spur_avoid = (phy->rev >= 3) ? 
     
    25113316        nphy->txrx_chain = 2; /* sth different than 0 and 1 for now */ 
    25123317        nphy->phyrxchain = 3; /* to avoid b43_nphy_set_rx_core_state like wl */ 
    2513 @@ -5602,8 +6214,6 @@ static void b43_nphy_op_prepare_structs( 
     3318@@ -5602,8 +6457,6 @@ static void b43_nphy_op_prepare_structs( 
    25143319                nphy->ipa2g_on = sprom->fem.ghz2.extpa_gain == 2; 
    25153320                nphy->ipa5g_on = sprom->fem.ghz5.extpa_gain == 2; 
     
    25203325  
    25213326 static void b43_nphy_op_free(struct b43_wldev *dev) 
    2522 @@ -5663,7 +6273,7 @@ static void b43_nphy_op_maskset(struct b 
     3327@@ -5663,7 +6516,7 @@ static void b43_nphy_op_maskset(struct b 
    25233328 static u16 b43_nphy_op_radio_read(struct b43_wldev *dev, u16 reg) 
    25243329 { 
     
    25293334        if (dev->phy.rev >= 7) 
    25303335                reg |= 0x200; /* Radio 0x2057 */ 
    2531 @@ -5677,7 +6287,7 @@ static u16 b43_nphy_op_radio_read(struct 
     3336@@ -5677,7 +6530,7 @@ static u16 b43_nphy_op_radio_read(struct 
    25323337 static void b43_nphy_op_radio_write(struct b43_wldev *dev, u16 reg, u16 value) 
    25333338 { 
     
    25383343        b43_write16(dev, B43_MMIO_RADIO_CONTROL, reg); 
    25393344        b43_write16(dev, B43_MMIO_RADIO_DATA_LOW, value); 
    2540 @@ -5687,15 +6297,23 @@ static void b43_nphy_op_radio_write(stru 
     3345@@ -5687,15 +6540,23 @@ static void b43_nphy_op_radio_write(stru 
    25413346 static void b43_nphy_op_software_rfkill(struct b43_wldev *dev, 
    25423347                                        bool blocked) 
     
    25663371  
    25673372                        b43_radio_write(dev, 0x204D, 0); 
    2568 @@ -5713,11 +6331,15 @@ static void b43_nphy_op_software_rfkill( 
     3373@@ -5713,11 +6574,15 @@ static void b43_nphy_op_software_rfkill( 
    25693374                        b43_radio_write(dev, 0x3064, 0); 
    25703375                } 
     
    25863391                } else { 
    25873392                        b43_radio_init2055(dev); 
    2588 @@ -5728,10 +6350,13 @@ static void b43_nphy_op_software_rfkill( 
     3393@@ -5728,10 +6593,13 @@ static void b43_nphy_op_software_rfkill( 
    25893394 /* http://bcm-v4.sipsolutions.net/802.11/PHY/Anacore */ 
    25903395 static void b43_nphy_op_switch_analog(struct b43_wldev *dev, bool on) 
     
    26033408--- a/drivers/net/wireless/b43/phy_n.h 
    26043409+++ b/drivers/net/wireless/b43/phy_n.h 
    2605 @@ -857,6 +857,15 @@ 
     3410@@ -366,11 +366,13 @@ 
     3411 #define B43_NPHY_TXF_40CO_B1S0                 B43_PHY_N(0x0E5) /* TX filter 40 coeff B1 stage 0 */ 
     3412 #define B43_NPHY_TXF_40CO_B32S1                        B43_PHY_N(0x0E6) /* TX filter 40 coeff B32 stage 1 */ 
     3413 #define B43_NPHY_TXF_40CO_B1S1                 B43_PHY_N(0x0E7) /* TX filter 40 coeff B1 stage 1 */ 
     3414+#define B43_NPHY_REV3_RFCTL_OVER0              B43_PHY_N(0x0E7) 
     3415 #define B43_NPHY_TXF_40CO_B32S2                        B43_PHY_N(0x0E8) /* TX filter 40 coeff B32 stage 2 */ 
     3416 #define B43_NPHY_TXF_40CO_B1S2                 B43_PHY_N(0x0E9) /* TX filter 40 coeff B1 stage 2 */ 
     3417 #define B43_NPHY_BIST_STAT2                    B43_PHY_N(0x0EA) /* BIST status 2 */ 
     3418 #define B43_NPHY_BIST_STAT3                    B43_PHY_N(0x0EB) /* BIST status 3 */ 
     3419 #define B43_NPHY_RFCTL_OVER                    B43_PHY_N(0x0EC) /* RF control override */ 
     3420+#define B43_NPHY_REV3_RFCTL_OVER1              B43_PHY_N(0x0EC) 
     3421 #define B43_NPHY_MIMOCFG                       B43_PHY_N(0x0ED) /* MIMO config */ 
     3422 #define  B43_NPHY_MIMOCFG_GFMIX                        0x0004 /* Greenfield or mixed mode */ 
     3423 #define  B43_NPHY_MIMOCFG_AUTO                 0x0100 /* Greenfield/mixed mode auto */ 
     3424@@ -857,7 +859,18 @@ 
    26063425 #define B43_NPHY_REV3_C2_CLIP2_GAIN_A          B43_PHY_N(0x2AF) 
    26073426 #define B43_NPHY_REV3_C2_CLIP2_GAIN_B          B43_PHY_N(0x2B0) 
     
    26173436+ 
    26183437 #define B43_PHY_B_BBCFG                                B43_PHY_N_BMODE(0x001) /* BB config */ 
     3438+#define  B43_PHY_B_BBCFG_RSTCCA                        0x4000 /* Reset CCA */ 
     3439+#define  B43_PHY_B_BBCFG_RSTRX                 0x8000 /* Reset RX */ 
    26193440 #define B43_PHY_B_TEST                         B43_PHY_N_BMODE(0x00A) 
    26203441  
    2621 @@ -931,11 +940,12 @@ struct b43_phy_n { 
     3442 struct b43_wldev; 
     3443@@ -931,11 +944,12 @@ struct b43_phy_n { 
    26223444        u16 papd_epsilon_offset[2]; 
    26233445        s32 preamble_override; 
     
    29723794        0x0ff70028, 0x0ff70027, 0x0ff70026, 0x0ff70025, 
    29733795        0x0ef7002d, 0x0ef7002b, 0x0ef7002a, 0x0ef70029, 
    2974 @@ -2427,7 +2692,81 @@ static const u32 txpwrctrl_tx_gain_ipa_r 
     3796@@ -2427,7 +2692,117 @@ static const u32 txpwrctrl_tx_gain_ipa_r 
    29753797        0x00f70028, 0x00f70027, 0x00f70026, 0x00f70025, 
    29763798 }; 
     
    30493871+}; 
    30503872+ 
     3873+/* Extracted from MMIO dump of 6.30.223.248 */ 
     3874+static const u32 b43_ntab_tx_gain_ipa_2057_rev14_2g[] = { 
     3875+       0x50df002e, 0x50cf002d, 0x50bf002c, 0x50b7002b, 
     3876+       0x50af002a, 0x50a70029, 0x509f0029, 0x50970028, 
     3877+       0x508f0027, 0x50870027, 0x507f0027, 0x50770027, 
     3878+       0x506f0027, 0x50670027, 0x505f0028, 0x50570029, 
     3879+       0x504f002b, 0x5047002e, 0x5047002b, 0x50470029, 
     3880+       0x503f002c, 0x503f0029, 0x5037002c, 0x5037002a, 
     3881+       0x50370028, 0x502f002d, 0x502f002b, 0x502f0028, 
     3882+       0x502f0026, 0x5027002d, 0x5027002a, 0x50270028, 
     3883+       0x50270026, 0x50270024, 0x501f002e, 0x501f002b, 
     3884+       0x501f0029, 0x501f0027, 0x501f0024, 0x501f0022, 
     3885+       0x501f0020, 0x501f001f, 0x5017002c, 0x50170029, 
     3886+       0x50170027, 0x50170024, 0x50170022, 0x50170021, 
     3887+       0x5017001f, 0x5017001d, 0x5017001b, 0x5017001a, 
     3888+       0x50170018, 0x50170017, 0x50170015, 0x500f002c, 
     3889+       0x500f002a, 0x500f0027, 0x500f0025, 0x500f0023, 
     3890+       0x500f0022, 0x500f001f, 0x500f001e, 0x500f001c, 
     3891+       0x500f001a, 0x500f0019, 0x500f0018, 0x500f0016, 
     3892+       0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, 
     3893+       0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, 
     3894+       0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, 
     3895+       0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, 
     3896+       0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, 
     3897+       0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, 
     3898+       0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, 
     3899+       0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, 
     3900+       0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, 
     3901+       0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, 
     3902+       0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, 
     3903+       0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, 
     3904+       0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, 
     3905+       0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, 
     3906+       0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, 
     3907+}; 
     3908+ 
    30513909+/* IPA 2 5Hz */ 
    30523910+ 
     
    30553913        0x7ff7002f, 0x7ff7002e, 0x7ff7002d, 0x7ff7002b, 
    30563914        0x7ff7002a, 0x7ff70029, 0x7ff70028, 0x7ff70027, 
    3057 @@ -2462,6 +2801,42 @@ static const u32 txpwrctrl_tx_gain_ipa_5 
     3915@@ -2462,6 +2837,42 @@ static const u32 txpwrctrl_tx_gain_ipa_5 
    30583916        0x70f70021, 0x70f70020, 0x70f70020, 0x70f7001f, 
    30593917 }; 
     
    30983956        -114, -108, -98, -91, -84, -78, -70, -62, 
    30993957        -54, -46, -39, -31, -23, -15, -8, 0 
    3100 @@ -3031,31 +3406,8 @@ void b43_ntab_write_bulk(struct b43_wlde 
     3958@@ -3031,31 +3442,8 @@ void b43_ntab_write_bulk(struct b43_wlde 
    31013959                b43_ntab_write_bulk(dev, offset, ARRAY_SIZE(data), data); \ 
    31023960        } while (0) 
     
    31313989        ntab_upload(dev, B43_NTAB_C1_ESTPLT_R3, b43_ntab_estimatepowerlt1_r3); 
    31323990        ntab_upload(dev, B43_NTAB_C0_ADJPLT_R3, b43_ntab_adjustpower0_r3); 
    3133 @@ -3066,6 +3418,107 @@ static void b43_nphy_tables_init_rev3(st 
     3991@@ -3066,6 +3454,107 @@ static void b43_nphy_tables_init_rev3(st 
    31343992        ntab_upload(dev, B43_NTAB_C1_IQLT_R3, b43_ntab_iqlt1_r3); 
    31353993        ntab_upload(dev, B43_NTAB_C0_LOFEEDTH_R3, b43_ntab_loftlt0_r3); 
     
    32394097        /* Volatile tables */ 
    32404098        if (antswlut < ARRAY_SIZE(b43_ntab_antswctl_r3)) 
    3241 @@ -3078,20 +3531,22 @@ static void b43_nphy_tables_init_rev3(st 
     4099@@ -3078,20 +3567,22 @@ static void b43_nphy_tables_init_rev3(st 
    32424100 static void b43_nphy_tables_init_rev0(struct b43_wldev *dev) 
    32434101 { 
     
    32764134        /* Volatile tables */ 
    32774135        ntab_upload(dev, B43_NTAB_BDI, b43_ntab_bdi); 
    3278 @@ -3111,7 +3566,11 @@ static void b43_nphy_tables_init_rev0(st 
     4136@@ -3111,7 +3602,11 @@ static void b43_nphy_tables_init_rev0(st 
    32794137 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/InitTables */ 
    32804138 void b43_nphy_tables_init(struct b43_wldev *dev) 
     
    32894147        else 
    32904148                b43_nphy_tables_init_rev0(dev); 
    3291 @@ -3120,23 +3579,51 @@ void b43_nphy_tables_init(struct b43_wld 
     4149@@ -3120,23 +3615,55 @@ void b43_nphy_tables_init(struct b43_wld 
    32924150 /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/GetIpaGainTbl */ 
    32934151 static const u32 *b43_nphy_get_ipa_gain_table(struct b43_wldev *dev) 
     
    33054163-                       return txpwrctrl_tx_gain_ipa; 
    33064164+               switch (phy->rev) { 
     4165+               case 17: 
     4166+                       if (phy->radio_rev == 14) 
     4167+                               return b43_ntab_tx_gain_ipa_2057_rev14_2g; 
     4168+                       break; 
    33074169+               case 16: 
    33084170+                       if (phy->radio_rev == 9) 
     
    33504212        struct ssb_sprom *sprom = dev->dev->bus_sprom; 
    33514213  
    3352 @@ -3148,19 +3635,36 @@ const u32 *b43_nphy_get_tx_gain_table(st 
     4214@@ -3148,19 +3675,36 @@ const u32 *b43_nphy_get_tx_gain_table(st 
    33534215            (dev->phy.n->ipa5g_on && band == IEEE80211_BAND_5GHZ)) { 
    33544216                return b43_nphy_get_ipa_gain_table(dev); 
     
    33984260 } 
    33994261  
    3400 @@ -3187,7 +3691,7 @@ struct nphy_gain_ctl_workaround_entry *b 
     4262@@ -3187,7 +3731,7 @@ struct nphy_gain_ctl_workaround_entry *b 
    34014263        /* Some workarounds to the workarounds... */ 
    34024264        if (ghz5 && dev->phy.rev >= 6) { 
     
    35414403        { 0x32, 0x00 }, { 0x33, 0x00 }, { 0x51, 0x70 }, { 0x59, 0x88 }, 
    35424404        { 0x5C, 0x20 }, { 0x62, 0x33 }, { 0x63, 0x0f }, { 0x64, 0x0f }, 
    3543 @@ -102,6 +103,346 @@ static u16 r2057_rev8_init[54][2] = { 
     4405@@ -102,6 +103,436 @@ static u16 r2057_rev8_init[54][2] = { 
    35444406        { 0x1A6, 0x00 }, { 0x1AA, 0x00 }, { 0x1AB, 0x00 }, { 0x1AC, 0x00 }, 
    35454407        { 0x1B7, 0x05 }, { 0x1C2, 0xa0 }, 
     
    35574419+       { 0x101, 0x10 }, { 0x102, 0xee }, { 0x10b, 0xc0 }, { 0x149, 0x10 }, 
    35584420+       { 0x14e, 0x01 }, { 0x1b7, 0x05 }, { 0x1c2, 0xa0 }, 
     4421+}; 
     4422+ 
     4423+/* Extracted from MMIO dump of 6.30.223.248 */ 
     4424+static u16 r2057_rev14_init[][2] = { 
     4425+       { 0x011, 0xfc }, { 0x030, 0x24 }, { 0x040, 0x1c }, { 0x082, 0x08 }, 
     4426+       { 0x0b4, 0x44 }, { 0x0c8, 0x01 }, { 0x0c9, 0x01 }, { 0x107, 0x08 }, 
     4427+       { 0x14d, 0x01 }, { 0x14e, 0x01 }, { 0x1af, 0x40 }, { 0x1b0, 0x40 }, 
     4428+       { 0x1cc, 0x01 }, { 0x1cf, 0x10 }, { 0x1d0, 0x0f }, { 0x1d3, 0x10 }, 
     4429+       { 0x1d4, 0x0f }, 
    35594430+}; 
    35604431+ 
     
    36054476+       .radio_logen_mx2g_tune                  = r10,  \ 
    36064477+       .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 
     4478+       .radio_txmix2g_tune_boost_pu_core0      = r12,  \ 
     4479+       .radio_pad2g_tune_pus_core0             = r13,  \ 
     4480+       .radio_lna2g_tune_core0                 = r14,  \ 
     4481+       .radio_txmix2g_tune_boost_pu_core1      = r15,  \ 
     4482+       .radio_pad2g_tune_pus_core1             = r16,  \ 
     4483+       .radio_lna2g_tune_core1                 = r17 
    36134484+ 
    36144485+#define PHYREGS(r0, r1, r2, r3, r4, r5)        \ 
     
    37204591+               PHYREGS(0x03e6, 0x03e2, 0x03de, 0x041b, 0x041f, 0x0424), 
    37214592+       } 
     4593+}; 
     4594+ 
     4595+/* Extracted from MMIO dump of 6.30.223.248 */ 
     4596+static const struct b43_nphy_chantabent_rev7_2g b43_nphy_chantab_phy_rev17_radio_rev14[] = { 
     4597+       { 
     4598+               .freq                   = 2412, 
     4599+               RADIOREGS7_2G(0x48, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x6c, 
     4600+                             0x09, 0x0d, 0x09, 0x03, 0x21, 0x53, 0xff, 0x21, 
     4601+                             0x53, 0xff), 
     4602+               PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443), 
     4603+       }, 
     4604+       { 
     4605+               .freq                   = 2417, 
     4606+               RADIOREGS7_2G(0x4b, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x71, 
     4607+                             0x09, 0x0d, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21, 
     4608+                             0x53, 0xff), 
     4609+               PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441), 
     4610+       }, 
     4611+       { 
     4612+               .freq                   = 2422, 
     4613+               RADIOREGS7_2G(0x4e, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x76, 
     4614+                             0x09, 0x0d, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21, 
     4615+                             0x53, 0xff), 
     4616+               PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f), 
     4617+       }, 
     4618+       { 
     4619+               .freq                   = 2427, 
     4620+               RADIOREGS7_2G(0x52, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x7b, 
     4621+                             0x09, 0x0c, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21, 
     4622+                             0x53, 0xff), 
     4623+               PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d), 
     4624+       }, 
     4625+       { 
     4626+               .freq                   = 2432, 
     4627+               RADIOREGS7_2G(0x55, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x80, 
     4628+                             0x09, 0x0c, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21, 
     4629+                             0x53, 0xff), 
     4630+               PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a), 
     4631+       }, 
     4632+       { 
     4633+               .freq                   = 2437, 
     4634+               RADIOREGS7_2G(0x58, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x85, 
     4635+                             0x09, 0x0c, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21, 
     4636+                             0x53, 0xff), 
     4637+               PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438), 
     4638+       }, 
     4639+       { 
     4640+               .freq                   = 2442, 
     4641+               RADIOREGS7_2G(0x5c, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x8a, 
     4642+                             0x09, 0x0c, 0x08, 0x03, 0x21, 0x43, 0xff, 0x21, 
     4643+                             0x43, 0xff), 
     4644+               PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436), 
     4645+       }, 
     4646+       { 
     4647+               .freq                   = 2447, 
     4648+               RADIOREGS7_2G(0x5f, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x8f, 
     4649+                             0x09, 0x0c, 0x08, 0x03, 0x21, 0x43, 0xff, 0x21, 
     4650+                             0x43, 0xff), 
     4651+               PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434), 
     4652+       }, 
     4653+       { 
     4654+               .freq                   = 2452, 
     4655+               RADIOREGS7_2G(0x62, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x94, 
     4656+                             0x09, 0x0c, 0x08, 0x03, 0x21, 0x43, 0xff, 0x21, 
     4657+                             0x43, 0xff), 
     4658+               PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431), 
     4659+       }, 
     4660+       { 
     4661+               .freq                   = 2457, 
     4662+               RADIOREGS7_2G(0x66, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x99, 
     4663+                             0x09, 0x0b, 0x07, 0x03, 0x21, 0x43, 0xff, 0x21, 
     4664+                             0x43, 0xff), 
     4665+               PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f), 
     4666+       }, 
     4667+       { 
     4668+               .freq                   = 2462, 
     4669+               RADIOREGS7_2G(0x69, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x9e, 
     4670+                             0x09, 0x0b, 0x07, 0x03, 0x01, 0x43, 0xff, 0x01, 
     4671+                             0x43, 0xff), 
     4672+               PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d), 
     4673+       }, 
    37224674+}; 
    37234675+ 
     
    38884840 void r2057_upload_inittabs(struct b43_wldev *dev) 
    38894841 { 
    3890 @@ -109,33 +450,87 @@ void r2057_upload_inittabs(struct b43_wl 
     4842@@ -109,33 +540,98 @@ void r2057_upload_inittabs(struct b43_wl 
    38914843        u16 *table = NULL; 
    38924844        u16 size, i; 
     
    39304882+               } 
    39314883+               break; 
     4884+       case 17: 
     4885+               if (phy->radio_rev == 14) { 
     4886+                       table = r2057_rev14_init[0]; 
     4887+                       size = ARRAY_SIZE(r2057_rev14_init); 
     4888+               } 
     4889+               break; 
    39324890        } 
    39334891  
     
    39574915+       *tabent_r7_2g = NULL; 
    39584916+ 
    3959 +       /* TODO */ 
    39604917+       switch (phy->rev) { 
    39614918+       case 8: 
     
    39694926+                       e_r7 = b43_nphy_chantab_phy_rev16_radio_rev9; 
    39704927+                       len = ARRAY_SIZE(b43_nphy_chantab_phy_rev16_radio_rev9); 
     4928+               } 
     4929+               break; 
     4930+       case 17: 
     4931+               if (phy->radio_rev == 14) { 
     4932+                       e_r7_2g = b43_nphy_chantab_phy_rev17_radio_rev14; 
     4933+                       len = ARRAY_SIZE(b43_nphy_chantab_phy_rev17_radio_rev14); 
    39714934+               } 
    39724935+               break; 
  • trunk/package/kernel/mac80211/patches/820-b43-add-antenna-control.patch

    r41668 r41805  
    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 @@ -3162,8 +3162,8 @@ static int b43_chip_init(struct b43_wlde 
     12@@ -3201,8 +3201,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 @@ -3857,7 +3857,6 @@ static int b43_op_config(struct ieee8021 
     23@@ -3896,7 +3896,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 @@ -3897,11 +3896,9 @@ static int b43_op_config(struct ieee8021 
     31@@ -3936,11 +3935,9 @@ static int b43_op_config(struct ieee8021 
    3232        } 
    3333  
     
    4343        if (wl->radio_enabled != phy->radio_on) { 
    4444                if (wl->radio_enabled) { 
    45 @@ -5033,6 +5030,47 @@ static int b43_op_get_survey(struct ieee 
     45@@ -5077,6 +5074,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 @@ -5054,6 +5092,8 @@ static const struct ieee80211_ops b43_hw 
     93@@ -5098,6 +5136,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 @@ -5352,6 +5392,8 @@ static int b43_one_core_attach(struct b4 
     102@@ -5397,6 +5437,8 @@ static int b43_one_core_attach(struct b4 
    103103        if (!wldev) 
    104104                goto out; 
     
    109109        wldev->dev = dev; 
    110110        wldev->wl = wl; 
    111 @@ -5442,6 +5484,9 @@ static struct b43_wl *b43_wireless_init( 
     111@@ -5487,6 +5529,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

    r41668 r41805  
    7575--- a/drivers/net/wireless/b43/main.c 
    7676+++ b/drivers/net/wireless/b43/main.c 
    77 @@ -4422,7 +4422,7 @@ static int b43_phy_versioning(struct b43 
     77@@ -4464,7 +4464,7 @@ static int b43_phy_versioning(struct b43 
    7878                u16 radio24[3]; 
    7979  
     
    8484                } 
    8585  
    86 @@ -4441,10 +4441,10 @@ static int b43_phy_versioning(struct b43 
     86@@ -4481,10 +4481,10 @@ static int b43_phy_versioning(struct b43 
    8787                        else 
    8888                                tmp = 0x5205017F; 
     
    157157--- a/drivers/net/wireless/b43/phy_lcn.c 
    158158+++ b/drivers/net/wireless/b43/phy_lcn.c 
    159 @@ -845,20 +845,20 @@ static void b43_phy_lcn_op_adjust_txpowe 
     159@@ -812,20 +812,20 @@ static void b43_phy_lcn_op_adjust_txpowe 
    160160  
    161161 static u16 b43_phy_lcn_op_read(struct b43_wldev *dev, u16 reg) 
     
    181181                    (b43_read16(dev, B43_MMIO_PHY_DATA) & mask) | set); 
    182182 } 
    183 @@ -868,14 +868,14 @@ static u16 b43_phy_lcn_op_radio_read(str 
     183@@ -835,14 +835,14 @@ static u16 b43_phy_lcn_op_radio_read(str 
    184184        /* LCN-PHY needs 0x200 for read access */ 
    185185        reg |= 0x200; 
     
    200200--- a/drivers/net/wireless/b43/phy_n.c 
    201201+++ b/drivers/net/wireless/b43/phy_n.c 
    202 @@ -6251,14 +6251,14 @@ static inline void check_phyreg(struct b 
     202@@ -6494,14 +6494,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 @@ -6266,7 +6266,7 @@ static void b43_nphy_op_maskset(struct b 
     219@@ -6509,7 +6509,7 @@ static void b43_nphy_op_maskset(struct b 
    220220                                 u16 set) 
    221221 { 
     
    226226 } 
    227227  
    228 @@ -6280,7 +6280,7 @@ static u16 b43_nphy_op_radio_read(struct 
     228@@ -6523,7 +6523,7 @@ static u16 b43_nphy_op_radio_read(struct 
    229229        else 
    230230                reg |= 0x100; 
     
    235235 } 
    236236  
    237 @@ -6289,7 +6289,7 @@ static void b43_nphy_op_radio_write(stru 
     237@@ -6532,7 +6532,7 @@ static void b43_nphy_op_radio_write(stru 
    238238        /* Register 1 is a 32-bit register. */ 
    239239        B43_WARN_ON(dev->phy.rev < 7 && reg == 1); 
Note: See TracChangeset for help on using the changeset viewer.