From dd8008aa78bed570c903cc167ba16591f246da78 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Sat, 27 Sep 2014 20:51:43 +0000 Subject: mac80211: update to wireless-testing 2014-09-26 Signed-off-by: Felix Fietkau git-svn-id: svn://svn.openwrt.org/openwrt/trunk@42683 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- ...ts-form-wireless-testing-master-master-20.patch | 5202 -------------------- 1 file changed, 5202 deletions(-) delete mode 100644 package/kernel/mac80211/patches/800-b43-backports-form-wireless-testing-master-master-20.patch (limited to 'package/kernel/mac80211/patches/800-b43-backports-form-wireless-testing-master-master-20.patch') diff --git a/package/kernel/mac80211/patches/800-b43-backports-form-wireless-testing-master-master-20.patch b/package/kernel/mac80211/patches/800-b43-backports-form-wireless-testing-master-master-20.patch deleted file mode 100644 index bf661201f5..0000000000 --- a/package/kernel/mac80211/patches/800-b43-backports-form-wireless-testing-master-master-20.patch +++ /dev/null @@ -1,5202 +0,0 @@ -backport b43 patches from wireless testing - -This brings b43 up to wireless-testing/master master-2014-07-29-1 - ---- a/drivers/net/wireless/b43/main.c -+++ b/drivers/net/wireless/b43/main.c -@@ -122,7 +122,11 @@ static const struct bcma_device_id b43_b - BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x11, BCMA_ANY_CLASS), - BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x17, BCMA_ANY_CLASS), - BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x18, BCMA_ANY_CLASS), -+ BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x1C, BCMA_ANY_CLASS), - BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x1D, BCMA_ANY_CLASS), -+ BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x1E, BCMA_ANY_CLASS), -+ BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x28, BCMA_ANY_CLASS), -+ BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x2A, BCMA_ANY_CLASS), - BCMA_CORETABLE_END - }; - MODULE_DEVICE_TABLE(bcma, b43_bcma_tbl); -@@ -206,6 +210,9 @@ static struct ieee80211_channel b43_2ghz - CHAN2G(13, 2472, 0), - CHAN2G(14, 2484, 0), - }; -+ -+/* No support for the last 3 channels (12, 13, 14) */ -+#define b43_2ghz_chantable_limited_size 11 - #undef CHAN2G - - #define CHAN4G(_channel, _flags) { \ -@@ -283,6 +290,14 @@ static struct ieee80211_channel b43_5ghz - CHAN5G(182, 0), - }; - -+static struct ieee80211_channel b43_5ghz_nphy_chantable_limited[] = { -+ CHAN5G(36, 0), CHAN5G(40, 0), -+ CHAN5G(44, 0), CHAN5G(48, 0), -+ CHAN5G(149, 0), CHAN5G(153, 0), -+ CHAN5G(157, 0), CHAN5G(161, 0), -+ CHAN5G(165, 0), -+}; -+ - static struct ieee80211_channel b43_5ghz_aphy_chantable[] = { - CHAN5G(34, 0), CHAN5G(36, 0), - CHAN5G(38, 0), CHAN5G(40, 0), -@@ -315,6 +330,14 @@ static struct ieee80211_supported_band b - .n_bitrates = b43_a_ratetable_size, - }; - -+static struct ieee80211_supported_band b43_band_5GHz_nphy_limited = { -+ .band = IEEE80211_BAND_5GHZ, -+ .channels = b43_5ghz_nphy_chantable_limited, -+ .n_channels = ARRAY_SIZE(b43_5ghz_nphy_chantable_limited), -+ .bitrates = b43_a_ratetable, -+ .n_bitrates = b43_a_ratetable_size, -+}; -+ - static struct ieee80211_supported_band b43_band_5GHz_aphy = { - .band = IEEE80211_BAND_5GHZ, - .channels = b43_5ghz_aphy_chantable, -@@ -331,6 +354,14 @@ static struct ieee80211_supported_band b - .n_bitrates = b43_g_ratetable_size, - }; - -+static struct ieee80211_supported_band b43_band_2ghz_limited = { -+ .band = IEEE80211_BAND_2GHZ, -+ .channels = b43_2ghz_chantable, -+ .n_channels = b43_2ghz_chantable_limited_size, -+ .bitrates = b43_g_ratetable, -+ .n_bitrates = b43_g_ratetable_size, -+}; -+ - static void b43_wireless_core_exit(struct b43_wldev *dev); - static int b43_wireless_core_init(struct b43_wldev *dev); - static struct b43_wldev * b43_wireless_core_stop(struct b43_wldev *dev); -@@ -2201,52 +2232,82 @@ err_format: - return -EPROTO; - } - -+/* http://bcm-v4.sipsolutions.net/802.11/Init/Firmware */ - static int b43_try_request_fw(struct b43_request_fw_context *ctx) - { - struct b43_wldev *dev = ctx->dev; - struct b43_firmware *fw = &ctx->dev->fw; -+ struct b43_phy *phy = &dev->phy; - const u8 rev = ctx->dev->dev->core_rev; - const char *filename; -- u32 tmshigh; - int err; - -- /* Files for HT and LCN were found by trying one by one */ -- - /* Get microcode */ -- if ((rev >= 5) && (rev <= 10)) { -- filename = "ucode5"; -- } else if ((rev >= 11) && (rev <= 12)) { -- filename = "ucode11"; -- } else if (rev == 13) { -- filename = "ucode13"; -- } else if (rev == 14) { -- filename = "ucode14"; -- } else if (rev == 15) { -+ filename = NULL; -+ switch (rev) { -+ case 42: -+ if (phy->type == B43_PHYTYPE_AC) -+ filename = "ucode42"; -+ break; -+ case 40: -+ if (phy->type == B43_PHYTYPE_AC) -+ filename = "ucode40"; -+ break; -+ case 33: -+ if (phy->type == B43_PHYTYPE_LCN40) -+ filename = "ucode33_lcn40"; -+ break; -+ case 30: -+ if (phy->type == B43_PHYTYPE_N) -+ filename = "ucode30_mimo"; -+ break; -+ case 29: -+ if (phy->type == B43_PHYTYPE_HT) -+ filename = "ucode29_mimo"; -+ break; -+ case 26: -+ if (phy->type == B43_PHYTYPE_HT) -+ filename = "ucode26_mimo"; -+ break; -+ case 28: -+ case 25: -+ if (phy->type == B43_PHYTYPE_N) -+ filename = "ucode25_mimo"; -+ else if (phy->type == B43_PHYTYPE_LCN) -+ filename = "ucode25_lcn"; -+ break; -+ case 24: -+ if (phy->type == B43_PHYTYPE_LCN) -+ filename = "ucode24_lcn"; -+ break; -+ case 23: -+ if (phy->type == B43_PHYTYPE_N) -+ filename = "ucode16_mimo"; -+ break; -+ case 16 ... 19: -+ if (phy->type == B43_PHYTYPE_N) -+ filename = "ucode16_mimo"; -+ else if (phy->type == B43_PHYTYPE_LP) -+ filename = "ucode16_lp"; -+ break; -+ case 15: - filename = "ucode15"; -- } else { -- switch (dev->phy.type) { -- case B43_PHYTYPE_N: -- if (rev >= 16) -- filename = "ucode16_mimo"; -- else -- goto err_no_ucode; -- break; -- case B43_PHYTYPE_HT: -- if (rev == 29) -- filename = "ucode29_mimo"; -- else -- goto err_no_ucode; -- break; -- case B43_PHYTYPE_LCN: -- if (rev == 24) -- filename = "ucode24_mimo"; -- else -- goto err_no_ucode; -- break; -- default: -- goto err_no_ucode; -- } -+ break; -+ case 14: -+ filename = "ucode14"; -+ break; -+ case 13: -+ filename = "ucode13"; -+ break; -+ case 11 ... 12: -+ filename = "ucode11"; -+ break; -+ case 5 ... 10: -+ filename = "ucode5"; -+ break; - } -+ if (!filename) -+ goto err_no_ucode; - err = b43_do_request_fw(ctx, filename, &fw->ucode, true); - if (err) - goto err_load; -@@ -2268,117 +2329,121 @@ static int b43_try_request_fw(struct b43 - goto err_load; - - /* Get initvals */ -+ filename = NULL; - switch (dev->phy.type) { -- case B43_PHYTYPE_A: -- if ((rev >= 5) && (rev <= 10)) { -- tmshigh = ssb_read32(dev->dev->sdev, SSB_TMSHIGH); -- if (tmshigh & B43_TMSHIGH_HAVE_2GHZ_PHY) -- filename = "a0g1initvals5"; -- else -- filename = "a0g0initvals5"; -- } else -- goto err_no_initvals; -- break; - case B43_PHYTYPE_G: -- if ((rev >= 5) && (rev <= 10)) -- filename = "b0g0initvals5"; -- else if (rev >= 13) -+ if (rev == 13) - filename = "b0g0initvals13"; -- else -- goto err_no_initvals; -+ else if (rev >= 5 && rev <= 10) -+ filename = "b0g0initvals5"; - break; - case B43_PHYTYPE_N: -- if (rev >= 16) -+ if (rev == 30) -+ filename = "n16initvals30"; -+ else if (rev == 28 || rev == 25) -+ filename = "n0initvals25"; -+ else if (rev == 24) -+ filename = "n0initvals24"; -+ else if (rev == 23) -+ filename = "n0initvals16"; /* What about n0initvals22? */ -+ else if (rev >= 16 && rev <= 18) - filename = "n0initvals16"; -- else if ((rev >= 11) && (rev <= 12)) -+ else if (rev >= 11 && rev <= 12) - filename = "n0initvals11"; -- else -- goto err_no_initvals; - break; - case B43_PHYTYPE_LP: -- if (rev == 13) -- filename = "lp0initvals13"; -+ if (rev >= 16 && rev <= 18) -+ filename = "lp0initvals16"; -+ else if (rev == 15) -+ filename = "lp0initvals15"; - else if (rev == 14) - filename = "lp0initvals14"; -- else if (rev >= 15) -- filename = "lp0initvals15"; -- else -- goto err_no_initvals; -+ else if (rev == 13) -+ filename = "lp0initvals13"; - break; - case B43_PHYTYPE_HT: - if (rev == 29) - filename = "ht0initvals29"; -- else -- goto err_no_initvals; -+ else if (rev == 26) -+ filename = "ht0initvals26"; - break; - case B43_PHYTYPE_LCN: - if (rev == 24) - filename = "lcn0initvals24"; -- else -- goto err_no_initvals; - break; -- default: -- goto err_no_initvals; -+ case B43_PHYTYPE_LCN40: -+ if (rev == 33) -+ filename = "lcn400initvals33"; -+ break; -+ case B43_PHYTYPE_AC: -+ if (rev == 42) -+ filename = "ac1initvals42"; -+ else if (rev == 40) -+ filename = "ac0initvals40"; -+ break; - } -+ if (!filename) -+ goto err_no_initvals; - err = b43_do_request_fw(ctx, filename, &fw->initvals, false); - if (err) - goto err_load; - - /* Get bandswitch initvals */ -+ filename = NULL; - switch (dev->phy.type) { -- case B43_PHYTYPE_A: -- if ((rev >= 5) && (rev <= 10)) { -- tmshigh = ssb_read32(dev->dev->sdev, SSB_TMSHIGH); -- if (tmshigh & B43_TMSHIGH_HAVE_2GHZ_PHY) -- filename = "a0g1bsinitvals5"; -- else -- filename = "a0g0bsinitvals5"; -- } else if (rev >= 11) -- filename = NULL; -- else -- goto err_no_initvals; -- break; - case B43_PHYTYPE_G: -- if ((rev >= 5) && (rev <= 10)) -+ if (rev == 13) -+ filename = "b0g0bsinitvals13"; -+ else if (rev >= 5 && rev <= 10) - filename = "b0g0bsinitvals5"; -- else if (rev >= 11) -- filename = NULL; -- else -- goto err_no_initvals; - break; - case B43_PHYTYPE_N: -- if (rev >= 16) -+ if (rev == 30) -+ filename = "n16bsinitvals30"; -+ else if (rev == 28 || rev == 25) -+ filename = "n0bsinitvals25"; -+ else if (rev == 24) -+ filename = "n0bsinitvals24"; -+ else if (rev == 23) -+ filename = "n0bsinitvals16"; /* What about n0bsinitvals22? */ -+ else if (rev >= 16 && rev <= 18) - filename = "n0bsinitvals16"; -- else if ((rev >= 11) && (rev <= 12)) -+ else if (rev >= 11 && rev <= 12) - filename = "n0bsinitvals11"; -- else -- goto err_no_initvals; - break; - case B43_PHYTYPE_LP: -- if (rev == 13) -- filename = "lp0bsinitvals13"; -+ if (rev >= 16 && rev <= 18) -+ filename = "lp0bsinitvals16"; -+ else if (rev == 15) -+ filename = "lp0bsinitvals15"; - else if (rev == 14) - filename = "lp0bsinitvals14"; -- else if (rev >= 15) -- filename = "lp0bsinitvals15"; -- else -- goto err_no_initvals; -+ else if (rev == 13) -+ filename = "lp0bsinitvals13"; - break; - case B43_PHYTYPE_HT: - if (rev == 29) - filename = "ht0bsinitvals29"; -- else -- goto err_no_initvals; -+ else if (rev == 26) -+ filename = "ht0bsinitvals26"; - break; - case B43_PHYTYPE_LCN: - if (rev == 24) - filename = "lcn0bsinitvals24"; -- else -- goto err_no_initvals; - break; -- default: -- goto err_no_initvals; -+ case B43_PHYTYPE_LCN40: -+ if (rev == 33) -+ filename = "lcn400bsinitvals33"; -+ break; -+ case B43_PHYTYPE_AC: -+ if (rev == 42) -+ filename = "ac1bsinitvals42"; -+ else if (rev == 40) -+ filename = "ac0bsinitvals40"; -+ break; - } -+ if (!filename) -+ goto err_no_initvals; - err = b43_do_request_fw(ctx, filename, &fw->initvals_band, false); - if (err) - goto err_load; -@@ -2915,6 +2980,46 @@ void b43_mac_phy_clock_set(struct b43_wl - } - } - -+/* brcms_b_switch_macfreq */ -+void b43_mac_switch_freq(struct b43_wldev *dev, u8 spurmode) -+{ -+ u16 chip_id = dev->dev->chip_id; -+ -+ if (chip_id == BCMA_CHIP_ID_BCM43131 || -+ chip_id == BCMA_CHIP_ID_BCM43217 || -+ chip_id == BCMA_CHIP_ID_BCM43222 || -+ chip_id == BCMA_CHIP_ID_BCM43224 || -+ chip_id == BCMA_CHIP_ID_BCM43225 || -+ chip_id == BCMA_CHIP_ID_BCM43227 || -+ chip_id == BCMA_CHIP_ID_BCM43228) { -+ switch (spurmode) { -+ case 2: /* 126 Mhz */ -+ b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0x2082); -+ b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0x8); -+ break; -+ case 1: /* 123 Mhz */ -+ b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0x5341); -+ b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0x8); -+ break; -+ default: /* 120 Mhz */ -+ b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0x8889); -+ b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0x8); -+ break; -+ } -+ } else if (dev->phy.type == B43_PHYTYPE_LCN) { -+ switch (spurmode) { -+ case 1: /* 82 Mhz */ -+ b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0x7CE0); -+ b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0xC); -+ break; -+ default: /* 80 Mhz */ -+ b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0xCCCD); -+ b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0xC); -+ break; -+ } -+ } -+} -+ - static void b43_adjust_opmode(struct b43_wldev *dev) - { - struct b43_wl *wl = dev->wl; -@@ -3742,7 +3847,9 @@ static int b43_switch_band(struct b43_wl - b43dbg(dev->wl, "Switching to %s GHz band\n", - band_to_string(chan->band)); - -- b43_software_rfkill(dev, true); -+ /* Some new devices don't need disabling radio for band switching */ -+ if (!(phy->type == B43_PHYTYPE_N && phy->rev >= 3)) -+ b43_software_rfkill(dev, true); - - phy->gmode = gmode; - b43_phy_put_into_reset(dev); -@@ -3796,38 +3903,29 @@ static void b43_set_retry_limits(struct - static int b43_op_config(struct ieee80211_hw *hw, u32 changed) - { - struct b43_wl *wl = hw_to_b43_wl(hw); -- struct b43_wldev *dev; -- struct b43_phy *phy; -+ struct b43_wldev *dev = wl->current_dev; -+ struct b43_phy *phy = &dev->phy; - struct ieee80211_conf *conf = &hw->conf; - int antenna; - int err = 0; -- bool reload_bss = false; - - mutex_lock(&wl->mutex); -- -- dev = wl->current_dev; -- - b43_mac_suspend(dev); - -- /* Switch the band (if necessary). This might change the active core. */ -- err = b43_switch_band(dev, conf->chandef.chan); -- if (err) -- goto out_unlock_mutex; -+ if (changed & IEEE80211_CONF_CHANGE_CHANNEL) { -+ phy->chandef = &conf->chandef; -+ phy->channel = conf->chandef.chan->hw_value; - -- /* Need to reload all settings if the core changed */ -- if (dev != wl->current_dev) { -- dev = wl->current_dev; -- changed = ~0; -- reload_bss = true; -- } -+ /* Switch the band (if necessary). */ -+ err = b43_switch_band(dev, conf->chandef.chan); -+ if (err) -+ goto out_mac_enable; - -- phy = &dev->phy; -- -- if (conf_is_ht(conf)) -- phy->is_40mhz = -- (conf_is_ht40_minus(conf) || conf_is_ht40_plus(conf)); -- else -- phy->is_40mhz = false; -+ /* Switch to the requested channel. -+ * The firmware takes care of races with the TX handler. -+ */ -+ b43_switch_channel(dev, phy->channel); -+ } - - if (changed & IEEE80211_CONF_CHANGE_RETRY_LIMITS) - b43_set_retry_limits(dev, conf->short_frame_max_tx_count, -@@ -3836,11 +3934,6 @@ static int b43_op_config(struct ieee8021 - if (!changed) - goto out_mac_enable; - -- /* Switch to the requested channel. -- * The firmware takes care of races with the TX handler. */ -- if (conf->chandef.chan->hw_value != phy->channel) -- b43_switch_channel(dev, conf->chandef.chan->hw_value); -- - dev->wl->radiotap_enabled = !!(conf->flags & IEEE80211_CONF_MONITOR); - - /* Adjust the desired TX power level. */ -@@ -3876,12 +3969,8 @@ static int b43_op_config(struct ieee8021 - - out_mac_enable: - b43_mac_enable(dev); --out_unlock_mutex: - mutex_unlock(&wl->mutex); - -- if (wl->vif && reload_bss) -- b43_op_bss_info_changed(hw, wl->vif, &wl->vif->bss_conf, ~0); -- - return err; - } - -@@ -4307,13 +4396,15 @@ static char *b43_phy_name(struct b43_wld - static int b43_phy_versioning(struct b43_wldev *dev) - { - struct b43_phy *phy = &dev->phy; -+ const u8 core_rev = dev->dev->core_rev; - u32 tmp; - u8 analog_type; - u8 phy_type; - u8 phy_rev; - u16 radio_manuf; -- u16 radio_ver; -+ u16 radio_id; - u16 radio_rev; -+ u8 radio_ver; - int unsupported = 0; - - /* Get PHY versioning */ -@@ -4321,23 +4412,23 @@ static int b43_phy_versioning(struct b43 - analog_type = (tmp & B43_PHYVER_ANALOG) >> B43_PHYVER_ANALOG_SHIFT; - phy_type = (tmp & B43_PHYVER_TYPE) >> B43_PHYVER_TYPE_SHIFT; - phy_rev = (tmp & B43_PHYVER_VERSION); -+ -+ /* LCNXN is continuation of N which run out of revisions */ -+ if (phy_type == B43_PHYTYPE_LCNXN) { -+ phy_type = B43_PHYTYPE_N; -+ phy_rev += 16; -+ } -+ - switch (phy_type) { -- case B43_PHYTYPE_A: -- if (phy_rev >= 4) -- unsupported = 1; -- break; -- case B43_PHYTYPE_B: -- if (phy_rev != 2 && phy_rev != 4 && phy_rev != 6 -- && phy_rev != 7) -- unsupported = 1; -- break; -+#ifdef CPTCFG_B43_PHY_G - case B43_PHYTYPE_G: - if (phy_rev > 9) - unsupported = 1; - break; -+#endif - #ifdef CPTCFG_B43_PHY_N - case B43_PHYTYPE_N: -- if (phy_rev > 9) -+ if (phy_rev >= 19) - unsupported = 1; - break; - #endif -@@ -4372,7 +4463,17 @@ static int b43_phy_versioning(struct b43 - analog_type, phy_type, b43_phy_name(dev, phy_type), phy_rev); - - /* Get RADIO versioning */ -- if (dev->dev->core_rev >= 24) { -+ if (core_rev == 40 || core_rev == 42) { -+ radio_manuf = 0x17F; -+ -+ b43_write16(dev, B43_MMIO_RADIO24_CONTROL, 0); -+ radio_rev = b43_read16(dev, B43_MMIO_RADIO24_DATA); -+ -+ b43_write16(dev, B43_MMIO_RADIO24_CONTROL, 1); -+ radio_id = b43_read16(dev, B43_MMIO_RADIO24_DATA); -+ -+ radio_ver = 0; /* Is there version somewhere? */ -+ } else if (core_rev >= 24) { - u16 radio24[3]; - - for (tmp = 0; tmp < 3; tmp++) { -@@ -4380,12 +4481,10 @@ static int b43_phy_versioning(struct b43 - radio24[tmp] = b43_read16(dev, B43_MMIO_RADIO24_DATA); - } - -- /* Broadcom uses "id" for our "ver" and has separated "ver" */ -- /* radio_ver = (radio24[0] & 0xF0) >> 4; */ -- - radio_manuf = 0x17F; -- radio_ver = (radio24[2] << 8) | radio24[1]; -+ radio_id = (radio24[2] << 8) | radio24[1]; - radio_rev = (radio24[0] & 0xF); -+ radio_ver = (radio24[0] & 0xF0) >> 4; - } else { - if (dev->dev->chip_id == 0x4317) { - if (dev->dev->chip_rev == 0) -@@ -4404,15 +4503,16 @@ static int b43_phy_versioning(struct b43 - << 16; - } - radio_manuf = (tmp & 0x00000FFF); -- radio_ver = (tmp & 0x0FFFF000) >> 12; -+ radio_id = (tmp & 0x0FFFF000) >> 12; - radio_rev = (tmp & 0xF0000000) >> 28; -+ radio_ver = 0; /* Probably not available on old hw */ - } - - if (radio_manuf != 0x17F /* Broadcom */) - unsupported = 1; - switch (phy_type) { - case B43_PHYTYPE_A: -- if (radio_ver != 0x2060) -+ if (radio_id != 0x2060) - unsupported = 1; - if (radio_rev != 1) - unsupported = 1; -@@ -4420,43 +4520,49 @@ static int b43_phy_versioning(struct b43 - unsupported = 1; - break; - case B43_PHYTYPE_B: -- if ((radio_ver & 0xFFF0) != 0x2050) -+ if ((radio_id & 0xFFF0) != 0x2050) - unsupported = 1; - break; - case B43_PHYTYPE_G: -- if (radio_ver != 0x2050) -+ if (radio_id != 0x2050) - unsupported = 1; - break; - case B43_PHYTYPE_N: -- if (radio_ver != 0x2055 && radio_ver != 0x2056) -+ if (radio_id != 0x2055 && radio_id != 0x2056 && -+ radio_id != 0x2057) -+ unsupported = 1; -+ if (radio_id == 0x2057 && -+ !(radio_rev == 9 || radio_rev == 14)) - unsupported = 1; - break; - case B43_PHYTYPE_LP: -- if (radio_ver != 0x2062 && radio_ver != 0x2063) -+ if (radio_id != 0x2062 && radio_id != 0x2063) - unsupported = 1; - break; - case B43_PHYTYPE_HT: -- if (radio_ver != 0x2059) -+ if (radio_id != 0x2059) - unsupported = 1; - break; - case B43_PHYTYPE_LCN: -- if (radio_ver != 0x2064) -+ if (radio_id != 0x2064) - unsupported = 1; - break; - default: - B43_WARN_ON(1); - } - if (unsupported) { -- b43err(dev->wl, "FOUND UNSUPPORTED RADIO " -- "(Manuf 0x%X, Version 0x%X, Revision %u)\n", -- radio_manuf, radio_ver, radio_rev); -+ b43err(dev->wl, -+ "FOUND UNSUPPORTED RADIO (Manuf 0x%X, ID 0x%X, Revision %u, Version %u)\n", -+ radio_manuf, radio_id, radio_rev, radio_ver); - return -EOPNOTSUPP; - } -- b43dbg(dev->wl, "Found Radio: Manuf 0x%X, Version 0x%X, Revision %u\n", -- radio_manuf, radio_ver, radio_rev); -+ b43info(dev->wl, -+ "Found Radio: Manuf 0x%X, ID 0x%X, Revision %u, Version %u\n", -+ radio_manuf, radio_id, radio_rev, radio_ver); - -+ /* FIXME: b43 treats "id" as "ver" and ignores the real "ver" */ - phy->radio_manuf = radio_manuf; -- phy->radio_ver = radio_ver; -+ phy->radio_ver = radio_id; - phy->radio_rev = radio_rev; - - phy->analog = analog_type; -@@ -5064,12 +5170,24 @@ static int b43_setup_bands(struct b43_wl - bool have_2ghz_phy, bool have_5ghz_phy) - { - struct ieee80211_hw *hw = dev->wl->hw; -+ struct b43_phy *phy = &dev->phy; -+ bool limited_2g; -+ bool limited_5g; -+ -+ /* We don't support all 2 GHz channels on some devices */ -+ limited_2g = phy->radio_ver == 0x2057 && -+ (phy->radio_rev == 9 || phy->radio_rev == 14); -+ limited_5g = phy->radio_ver == 0x2057 && -+ phy->radio_rev == 9; - - if (have_2ghz_phy) -- hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &b43_band_2GHz; -+ hw->wiphy->bands[IEEE80211_BAND_2GHZ] = limited_2g ? -+ &b43_band_2ghz_limited : &b43_band_2GHz; - if (dev->phy.type == B43_PHYTYPE_N) { - if (have_5ghz_phy) -- hw->wiphy->bands[IEEE80211_BAND_5GHZ] = &b43_band_5GHz_nphy; -+ hw->wiphy->bands[IEEE80211_BAND_5GHZ] = limited_5g ? -+ &b43_band_5GHz_nphy_limited : -+ &b43_band_5GHz_nphy; - } else { - if (have_5ghz_phy) - hw->wiphy->bands[IEEE80211_BAND_5GHZ] = &b43_band_5GHz_aphy; -@@ -5164,6 +5282,7 @@ static void b43_supported_bands(struct b - static int b43_wireless_core_attach(struct b43_wldev *dev) - { - struct b43_wl *wl = dev->wl; -+ struct b43_phy *phy = &dev->phy; - int err; - u32 tmp; - bool have_2ghz_phy = false, have_5ghz_phy = false; -@@ -5181,6 +5300,8 @@ static int b43_wireless_core_attach(stru - goto out; - } - -+ phy->do_full_init = true; -+ - /* Try to guess supported bands for the first init needs */ - switch (dev->dev->bus_type) { - #ifdef CPTCFG_B43_BCMA -@@ -5214,14 +5335,15 @@ static int b43_wireless_core_attach(stru - b43_supported_bands(dev, &have_2ghz_phy, &have_5ghz_phy); - - /* We don't support 5 GHz on some PHYs yet */ -- switch (dev->phy.type) { -- case B43_PHYTYPE_A: -- case B43_PHYTYPE_G: -- case B43_PHYTYPE_N: -- case B43_PHYTYPE_LP: -- case B43_PHYTYPE_HT: -- b43warn(wl, "5 GHz band is unsupported on this PHY\n"); -- have_5ghz_phy = false; -+ if (have_5ghz_phy) { -+ switch (dev->phy.type) { -+ case B43_PHYTYPE_A: -+ case B43_PHYTYPE_G: -+ case B43_PHYTYPE_LP: -+ case B43_PHYTYPE_HT: -+ b43warn(wl, "5 GHz band is unsupported on this PHY\n"); -+ have_5ghz_phy = false; -+ } - } - - if (!have_2ghz_phy && !have_5ghz_phy) { ---- a/drivers/net/wireless/b43/main.h -+++ b/drivers/net/wireless/b43/main.h -@@ -99,6 +99,7 @@ void b43_power_saving_ctl_bits(struct b4 - void b43_mac_suspend(struct b43_wldev *dev); - void b43_mac_enable(struct b43_wldev *dev); - void b43_mac_phy_clock_set(struct b43_wldev *dev, bool on); -+void b43_mac_switch_freq(struct b43_wldev *dev, u8 spurmode); - - - struct b43_request_fw_context; ---- a/drivers/net/wireless/b43/phy_common.c -+++ b/drivers/net/wireless/b43/phy_common.c -@@ -45,11 +45,10 @@ int b43_phy_allocate(struct b43_wldev *d - phy->ops = NULL; - - switch (phy->type) { -- case B43_PHYTYPE_A: -- phy->ops = &b43_phyops_a; -- break; - case B43_PHYTYPE_G: -+#ifdef CPTCFG_B43_PHY_G - phy->ops = &b43_phyops_g; -+#endif - break; - case B43_PHYTYPE_N: - #ifdef CPTCFG_B43_PHY_N -@@ -94,18 +93,25 @@ int b43_phy_init(struct b43_wldev *dev) - const struct b43_phy_operations *ops = phy->ops; - int err; - -- phy->channel = ops->get_default_chan(dev); -+ /* During PHY init we need to use some channel. On the first init this -+ * function is called *before* b43_op_config, so our pointer is NULL. -+ */ -+ if (!phy->chandef) { -+ phy->chandef = &dev->wl->hw->conf.chandef; -+ phy->channel = phy->chandef->chan->hw_value; -+ } - - phy->ops->switch_analog(dev, true); - b43_software_rfkill(dev, false); -+ - err = ops->init(dev); - if (err) { - b43err(dev->wl, "PHY init failed\n"); - goto err_block_rf; - } -- /* Make sure to switch hardware and firmware (SHM) to -- * the default channel. */ -- err = b43_switch_channel(dev, ops->get_default_chan(dev)); -+ phy->do_full_init = false; -+ -+ err = b43_switch_channel(dev, phy->channel); - if (err) { - b43err(dev->wl, "PHY init: Channel switch to default failed\n"); - goto err_phy_exit; -@@ -114,6 +120,7 @@ int b43_phy_init(struct b43_wldev *dev) - return 0; - - err_phy_exit: -+ phy->do_full_init = true; - if (ops->exit) - ops->exit(dev); - err_block_rf: -@@ -127,6 +134,7 @@ void b43_phy_exit(struct b43_wldev *dev) - const struct b43_phy_operations *ops = dev->phy.ops; - - b43_software_rfkill(dev, true); -+ dev->phy.do_full_init = true; - if (ops->exit) - ops->exit(dev); - } -@@ -403,9 +411,6 @@ int b43_switch_channel(struct b43_wldev - u16 channelcookie, savedcookie; - int err; - -- if (new_channel == B43_DEFAULT_CHANNEL) -- new_channel = phy->ops->get_default_chan(dev); -- - /* First we set the channel radio code to prevent the - * firmware from sending ghost packets. - */ -@@ -423,7 +428,6 @@ int b43_switch_channel(struct b43_wldev - if (err) - goto err_restore_cookie; - -- dev->phy.channel = new_channel; - /* Wait for the radio to tune to the channel and stabilize. */ - msleep(8); - -@@ -542,10 +546,9 @@ void b43_phyop_switch_analog_generic(str - } - - --bool b43_channel_type_is_40mhz(enum nl80211_channel_type channel_type) -+bool b43_is_40mhz(struct b43_wldev *dev) - { -- return (channel_type == NL80211_CHAN_HT40MINUS || -- channel_type == NL80211_CHAN_HT40PLUS); -+ return dev->phy.chandef->width == NL80211_CHAN_WIDTH_40; - } - - /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/BmacPhyClkFgc */ ---- a/drivers/net/wireless/b43/phy_common.h -+++ b/drivers/net/wireless/b43/phy_common.h -@@ -228,12 +228,12 @@ struct b43_phy { - bool supports_2ghz; - bool supports_5ghz; - -- /* HT info */ -- bool is_40mhz; -- - /* Is GMODE (2 GHz mode) bit enabled? */ - bool gmode; - -+ /* After power reset full init has to be performed */ -+ bool do_full_init; -+ - /* Analog Type */ - u8 analog; - /* B43_PHYTYPE_ */ -@@ -264,9 +264,8 @@ struct b43_phy { - unsigned long next_txpwr_check_time; - - /* Current channel */ -+ struct cfg80211_chan_def *chandef; - unsigned int channel; -- u16 channel_freq; -- enum nl80211_channel_type channel_type; - - /* PHY TX errors counter. */ - atomic_t txerr_cnt; -@@ -397,10 +396,6 @@ void b43_phy_take_out_of_reset(struct b4 - * b43_switch_channel - Switch to another channel - */ - int b43_switch_channel(struct b43_wldev *dev, unsigned int new_channel); --/** -- * B43_DEFAULT_CHANNEL - Switch to the default channel. -- */ --#define B43_DEFAULT_CHANNEL UINT_MAX - - /** - * b43_software_rfkill - Turn the radio ON or OFF in software. -@@ -451,7 +446,7 @@ int b43_phy_shm_tssi_read(struct b43_wld - */ - void b43_phyop_switch_analog_generic(struct b43_wldev *dev, bool on); - --bool b43_channel_type_is_40mhz(enum nl80211_channel_type channel_type); -+bool b43_is_40mhz(struct b43_wldev *dev); - - void b43_phy_force_clock(struct b43_wldev *dev, bool force); - ---- a/drivers/net/wireless/b43/phy_lcn.c -+++ b/drivers/net/wireless/b43/phy_lcn.c -@@ -54,39 +54,6 @@ enum lcn_sense_type { - B43_SENSE_VBAT, - }; - --/* In theory it's PHY common function, move if needed */ --/* brcms_b_switch_macfreq */ --static void b43_phy_switch_macfreq(struct b43_wldev *dev, u8 spurmode) --{ -- if (dev->dev->chip_id == 43224 || dev->dev->chip_id == 43225) { -- switch (spurmode) { -- case 2: /* 126 Mhz */ -- b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0x2082); -- b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0x8); -- break; -- case 1: /* 123 Mhz */ -- b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0x5341); -- b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0x8); -- break; -- default: /* 120 Mhz */ -- b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0x8889); -- b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0x8); -- break; -- } -- } else if (dev->phy.type == B43_PHYTYPE_LCN) { -- switch (spurmode) { -- case 1: /* 82 Mhz */ -- b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0x7CE0); -- b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0xC); -- break; -- default: /* 80 Mhz */ -- b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, 0xCCCD); -- b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0xC); -- break; -- } -- } --} -- - /************************************************** - * Radio 2064. - **************************************************/ -@@ -609,7 +576,7 @@ static void b43_phy_lcn_txrx_spur_avoida - b43_phy_write(dev, 0x93b, ((0 << 13) + 23)); - b43_phy_write(dev, 0x93c, ((0 << 13) + 1989)); - } -- b43_phy_switch_macfreq(dev, enable); -+ b43_mac_switch_freq(dev, enable); - } - - /************************************************** ---- a/drivers/net/wireless/b43/phy_n.c -+++ b/drivers/net/wireless/b43/phy_n.c -@@ -36,6 +36,7 @@ - #include "main.h" - - struct nphy_txgains { -+ u16 tx_lpf[2]; - u16 txgm[2]; - u16 pga[2]; - u16 pad[2]; -@@ -43,6 +44,7 @@ struct nphy_txgains { - }; - - struct nphy_iqcal_params { -+ u16 tx_lpf; - u16 txgm; - u16 pga; - u16 pad; -@@ -69,6 +71,14 @@ enum b43_nphy_rf_sequence { - B43_RFSEQ_UPDATE_GAINU, - }; - -+enum n_rf_ctl_over_cmd { -+ N_RF_CTL_OVER_CMD_RXRF_PU = 0, -+ N_RF_CTL_OVER_CMD_RX_PU = 1, -+ N_RF_CTL_OVER_CMD_TX_PU = 2, -+ N_RF_CTL_OVER_CMD_RX_GAIN = 3, -+ N_RF_CTL_OVER_CMD_TX_GAIN = 4, -+}; -+ - enum n_intc_override { - N_INTC_OVERRIDE_OFF = 0, - N_INTC_OVERRIDE_TRSW = 1, -@@ -140,11 +150,19 @@ ok: - b43_phy_write(dev, B43_NPHY_RFSEQMODE, seq_mode); - } - -+static void b43_nphy_rf_ctl_override_rev19(struct b43_wldev *dev, u16 field, -+ u16 value, u8 core, bool off, -+ u8 override_id) -+{ -+ /* TODO */ -+} -+ - /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RFCtrlOverrideRev7 */ - static void b43_nphy_rf_ctl_override_rev7(struct b43_wldev *dev, u16 field, - u16 value, u8 core, bool off, - u8 override) - { -+ struct b43_phy *phy = &dev->phy; - const struct nphy_rf_control_override_rev7 *e; - u16 en_addrs[3][2] = { - { 0x0E7, 0x0EC }, { 0x342, 0x343 }, { 0x346, 0x347 } -@@ -154,6 +172,11 @@ static void b43_nphy_rf_ctl_override_rev - u16 val_addr; - u8 i; - -+ if (phy->rev >= 19 || phy->rev < 3) { -+ B43_WARN_ON(1); -+ return; -+ } -+ - /* Remember: we can get NULL! */ - e = b43_nphy_get_rf_ctl_over_rev7(dev, field, override); - -@@ -181,6 +204,50 @@ static void b43_nphy_rf_ctl_override_rev - } - } - -+/* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RFCtrlOverideOneToMany */ -+static void b43_nphy_rf_ctl_override_one_to_many(struct b43_wldev *dev, -+ enum n_rf_ctl_over_cmd cmd, -+ u16 value, u8 core, bool off) -+{ -+ struct b43_phy *phy = &dev->phy; -+ u16 tmp; -+ -+ B43_WARN_ON(phy->rev < 7); -+ -+ switch (cmd) { -+ case N_RF_CTL_OVER_CMD_RXRF_PU: -+ b43_nphy_rf_ctl_override_rev7(dev, 0x20, value, core, off, 1); -+ b43_nphy_rf_ctl_override_rev7(dev, 0x10, value, core, off, 1); -+ b43_nphy_rf_ctl_override_rev7(dev, 0x08, value, core, off, 1); -+ break; -+ case N_RF_CTL_OVER_CMD_RX_PU: -+ b43_nphy_rf_ctl_override_rev7(dev, 0x4, value, core, off, 1); -+ b43_nphy_rf_ctl_override_rev7(dev, 0x2, value, core, off, 1); -+ b43_nphy_rf_ctl_override_rev7(dev, 0x1, value, core, off, 1); -+ b43_nphy_rf_ctl_override_rev7(dev, 0x2, value, core, off, 2); -+ b43_nphy_rf_ctl_override_rev7(dev, 0x0800, 0, core, off, 1); -+ break; -+ case N_RF_CTL_OVER_CMD_TX_PU: -+ b43_nphy_rf_ctl_override_rev7(dev, 0x4, value, core, off, 0); -+ b43_nphy_rf_ctl_override_rev7(dev, 0x2, value, core, off, 1); -+ b43_nphy_rf_ctl_override_rev7(dev, 0x1, value, core, off, 2); -+ b43_nphy_rf_ctl_override_rev7(dev, 0x0800, 1, core, off, 1); -+ break; -+ case N_RF_CTL_OVER_CMD_RX_GAIN: -+ tmp = value & 0xFF; -+ b43_nphy_rf_ctl_override_rev7(dev, 0x0800, tmp, core, off, 0); -+ tmp = value >> 8; -+ b43_nphy_rf_ctl_override_rev7(dev, 0x6000, tmp, core, off, 0); -+ break; -+ case N_RF_CTL_OVER_CMD_TX_GAIN: -+ tmp = value & 0x7FFF; -+ b43_nphy_rf_ctl_override_rev7(dev, 0x1000, tmp, core, off, 0); -+ tmp = value >> 14; -+ b43_nphy_rf_ctl_override_rev7(dev, 0x4000, tmp, core, off, 0); -+ break; -+ } -+} -+ - /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RFCtrlOverride */ - static void b43_nphy_rf_ctl_override(struct b43_wldev *dev, u16 field, - u16 value, u8 core, bool off) -@@ -264,6 +331,8 @@ static void b43_nphy_rf_ctl_intc_overrid - u16 reg, tmp, tmp2, val; - int core; - -+ /* TODO: What about rev19+? Revs 3+ and 7+ are a bit similar */ -+ - for (core = 0; core < 2; core++) { - if ((core_sel == 1 && core != 0) || - (core_sel == 2 && core != 1)) -@@ -274,6 +343,7 @@ static void b43_nphy_rf_ctl_intc_overrid - switch (intc_override) { - case N_INTC_OVERRIDE_OFF: - b43_phy_write(dev, reg, 0); -+ b43_phy_mask(dev, 0x2ff, ~0x2000); - b43_nphy_force_rf_sequence(dev, B43_RFSEQ_RESET2RX); - break; - case N_INTC_OVERRIDE_TRSW: -@@ -505,6 +575,14 @@ static void b43_nphy_stay_in_carrier_sea - } - } - -+/* http://bcm-v4.sipsolutions.net/PHY/N/Read_Lpf_Bw_Ctl */ -+static u16 b43_nphy_read_lpf_ctl(struct b43_wldev *dev, u16 offset) -+{ -+ if (!offset) -+ offset = b43_is_40mhz(dev) ? 0x159 : 0x154; -+ return b43_ntab_read(dev, B43_NTAB16(7, offset)) & 0x7; -+} -+ - /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/AdjustLnaGainTbl */ - static void b43_nphy_adjust_lna_gain_table(struct b43_wldev *dev) - { -@@ -590,44 +668,270 @@ static void b43_nphy_set_rf_sequence(str - * Radio 0x2057 - **************************************************/ - --/* http://bcm-v4.sipsolutions.net/PHY/radio2057_rcal */ -+static void b43_radio_2057_chantab_upload(struct b43_wldev *dev, -+ const struct b43_nphy_chantabent_rev7 *e_r7, -+ const struct b43_nphy_chantabent_rev7_2g *e_r7_2g) -+{ -+ if (e_r7_2g) { -+ b43_radio_write(dev, R2057_VCOCAL_COUNTVAL0, e_r7_2g->radio_vcocal_countval0); -+ b43_radio_write(dev, R2057_VCOCAL_COUNTVAL1, e_r7_2g->radio_vcocal_countval1); -+ b43_radio_write(dev, R2057_RFPLL_REFMASTER_SPAREXTALSIZE, e_r7_2g->radio_rfpll_refmaster_sparextalsize); -+ b43_radio_write(dev, R2057_RFPLL_LOOPFILTER_R1, e_r7_2g->radio_rfpll_loopfilter_r1); -+ b43_radio_write(dev, R2057_RFPLL_LOOPFILTER_C2, e_r7_2g->radio_rfpll_loopfilter_c2); -+ b43_radio_write(dev, R2057_RFPLL_LOOPFILTER_C1, e_r7_2g->radio_rfpll_loopfilter_c1); -+ b43_radio_write(dev, R2057_CP_KPD_IDAC, e_r7_2g->radio_cp_kpd_idac); -+ b43_radio_write(dev, R2057_RFPLL_MMD0, e_r7_2g->radio_rfpll_mmd0); -+ b43_radio_write(dev, R2057_RFPLL_MMD1, e_r7_2g->radio_rfpll_mmd1); -+ b43_radio_write(dev, R2057_VCOBUF_TUNE, e_r7_2g->radio_vcobuf_tune); -+ b43_radio_write(dev, R2057_LOGEN_MX2G_TUNE, e_r7_2g->radio_logen_mx2g_tune); -+ b43_radio_write(dev, R2057_LOGEN_INDBUF2G_TUNE, e_r7_2g->radio_logen_indbuf2g_tune); -+ b43_radio_write(dev, R2057_TXMIX2G_TUNE_BOOST_PU_CORE0, e_r7_2g->radio_txmix2g_tune_boost_pu_core0); -+ b43_radio_write(dev, R2057_PAD2G_TUNE_PUS_CORE0, e_r7_2g->radio_pad2g_tune_pus_core0); -+ b43_radio_write(dev, R2057_LNA2G_TUNE_CORE0, e_r7_2g->radio_lna2g_tune_core0); -+ b43_radio_write(dev, R2057_TXMIX2G_TUNE_BOOST_PU_CORE1, e_r7_2g->radio_txmix2g_tune_boost_pu_core1); -+ b43_radio_write(dev, R2057_PAD2G_TUNE_PUS_CORE1, e_r7_2g->radio_pad2g_tune_pus_core1); -+ b43_radio_write(dev, R2057_LNA2G_TUNE_CORE1, e_r7_2g->radio_lna2g_tune_core1); -+ -+ } else { -+ b43_radio_write(dev, R2057_VCOCAL_COUNTVAL0, e_r7->radio_vcocal_countval0); -+ b43_radio_write(dev, R2057_VCOCAL_COUNTVAL1, e_r7->radio_vcocal_countval1); -+ b43_radio_write(dev, R2057_RFPLL_REFMASTER_SPAREXTALSIZE, e_r7->radio_rfpll_refmaster_sparextalsize); -+ b43_radio_write(dev, R2057_RFPLL_LOOPFILTER_R1, e_r7->radio_rfpll_loopfilter_r1); -+ b43_radio_write(dev, R2057_RFPLL_LOOPFILTER_C2, e_r7->radio_rfpll_loopfilter_c2); -+ b43_radio_write(dev, R2057_RFPLL_LOOPFILTER_C1, e_r7->radio_rfpll_loopfilter_c1); -+ b43_radio_write(dev, R2057_CP_KPD_IDAC, e_r7->radio_cp_kpd_idac); -+ b43_radio_write(dev, R2057_RFPLL_MMD0, e_r7->radio_rfpll_mmd0); -+ b43_radio_write(dev, R2057_RFPLL_MMD1, e_r7->radio_rfpll_mmd1); -+ b43_radio_write(dev, R2057_VCOBUF_TUNE, e_r7->radio_vcobuf_tune); -+ b43_radio_write(dev, R2057_LOGEN_MX2G_TUNE, e_r7->radio_logen_mx2g_tune); -+ b43_radio_write(dev, R2057_LOGEN_MX5G_TUNE, e_r7->radio_logen_mx5g_tune); -+ b43_radio_write(dev, R2057_LOGEN_INDBUF2G_TUNE, e_r7->radio_logen_indbuf2g_tune); -+ b43_radio_write(dev, R2057_LOGEN_INDBUF5G_TUNE, e_r7->radio_logen_indbuf5g_tune); -+ b43_radio_write(dev, R2057_TXMIX2G_TUNE_BOOST_PU_CORE0, e_r7->radio_txmix2g_tune_boost_pu_core0); -+ b43_radio_write(dev, R2057_PAD2G_TUNE_PUS_CORE0, e_r7->radio_pad2g_tune_pus_core0); -+ b43_radio_write(dev, R2057_PGA_BOOST_TUNE_CORE0, e_r7->radio_pga_boost_tune_core0); -+ b43_radio_write(dev, R2057_TXMIX5G_BOOST_TUNE_CORE0, e_r7->radio_txmix5g_boost_tune_core0); -+ b43_radio_write(dev, R2057_PAD5G_TUNE_MISC_PUS_CORE0, e_r7->radio_pad5g_tune_misc_pus_core0); -+ b43_radio_write(dev, R2057_LNA2G_TUNE_CORE0, e_r7->radio_lna2g_tune_core0); -+ b43_radio_write(dev, R2057_LNA5G_TUNE_CORE0, e_r7->radio_lna5g_tune_core0); -+ b43_radio_write(dev, R2057_TXMIX2G_TUNE_BOOST_PU_CORE1, e_r7->radio_txmix2g_tune_boost_pu_core1); -+ b43_radio_write(dev, R2057_PAD2G_TUNE_PUS_CORE1, e_r7->radio_pad2g_tune_pus_core1); -+ b43_radio_write(dev, R2057_PGA_BOOST_TUNE_CORE1, e_r7->radio_pga_boost_tune_core1); -+ b43_radio_write(dev, R2057_TXMIX5G_BOOST_TUNE_CORE1, e_r7->radio_txmix5g_boost_tune_core1); -+ b43_radio_write(dev, R2057_PAD5G_TUNE_MISC_PUS_CORE1, e_r7->radio_pad5g_tune_misc_pus_core1); -+ b43_radio_write(dev, R2057_LNA2G_TUNE_CORE1, e_r7->radio_lna2g_tune_core1); -+ b43_radio_write(dev, R2057_LNA5G_TUNE_CORE1, e_r7->radio_lna5g_tune_core1); -+ } -+} -+ -+static void b43_radio_2057_setup(struct b43_wldev *dev, -+ const struct b43_nphy_chantabent_rev7 *tabent_r7, -+ const struct b43_nphy_chantabent_rev7_2g *tabent_r7_2g) -+{ -+ struct b43_phy *phy = &dev->phy; -+ -+ b43_radio_2057_chantab_upload(dev, tabent_r7, tabent_r7_2g); -+ -+ switch (phy->radio_rev) { -+ case 0 ... 4: -+ case 6: -+ if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) { -+ b43_radio_write(dev, R2057_RFPLL_LOOPFILTER_R1, 0x3f); -+ b43_radio_write(dev, R2057_CP_KPD_IDAC, 0x3f); -+ b43_radio_write(dev, R2057_RFPLL_LOOPFILTER_C1, 0x8); -+ b43_radio_write(dev, R2057_RFPLL_LOOPFILTER_C2, 0x8); -+ } else { -+ b43_radio_write(dev, R2057_RFPLL_LOOPFILTER_R1, 0x1f); -+ b43_radio_write(dev, R2057_CP_KPD_IDAC, 0x3f); -+ b43_radio_write(dev, R2057_RFPLL_LOOPFILTER_C1, 0x8); -+ b43_radio_write(dev, R2057_RFPLL_LOOPFILTER_C2, 0x8); -+ } -+ break; -+ case 9: /* e.g. PHY rev 16 */ -+ b43_radio_write(dev, R2057_LOGEN_PTAT_RESETS, 0x20); -+ b43_radio_write(dev, R2057_VCOBUF_IDACS, 0x18); -+ if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) { -+ b43_radio_write(dev, R2057_LOGEN_PTAT_RESETS, 0x38); -+ b43_radio_write(dev, R2057_VCOBUF_IDACS, 0x0f); -+ -+ if (b43_is_40mhz(dev)) { -+ /* TODO */ -+ } else { -+ b43_radio_write(dev, -+ R2057_PAD_BIAS_FILTER_BWS_CORE0, -+ 0x3c); -+ b43_radio_write(dev, -+ R2057_PAD_BIAS_FILTER_BWS_CORE1, -+ 0x3c); -+ } -+ } -+ break; -+ case 14: /* 2 GHz only */ -+ b43_radio_write(dev, R2057_RFPLL_LOOPFILTER_R1, 0x1b); -+ b43_radio_write(dev, R2057_CP_KPD_IDAC, 0x3f); -+ b43_radio_write(dev, R2057_RFPLL_LOOPFILTER_C1, 0x1f); -+ b43_radio_write(dev, R2057_RFPLL_LOOPFILTER_C2, 0x1f); -+ break; -+ } -+ -+ if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) { -+ u16 txmix2g_tune_boost_pu = 0; -+ u16 pad2g_tune_pus = 0; -+ -+ if (b43_nphy_ipa(dev)) { -+ switch (phy->radio_rev) { -+ case 9: -+ txmix2g_tune_boost_pu = 0x0041; -+ /* TODO */ -+ break; -+ case 14: -+ txmix2g_tune_boost_pu = 0x21; -+ pad2g_tune_pus = 0x23; -+ break; -+ } -+ } -+ -+ if (txmix2g_tune_boost_pu) -+ b43_radio_write(dev, R2057_TXMIX2G_TUNE_BOOST_PU_CORE0, -+ txmix2g_tune_boost_pu); -+ if (pad2g_tune_pus) -+ b43_radio_write(dev, R2057_PAD2G_TUNE_PUS_CORE0, -+ pad2g_tune_pus); -+ if (txmix2g_tune_boost_pu) -+ b43_radio_write(dev, R2057_TXMIX2G_TUNE_BOOST_PU_CORE1, -+ txmix2g_tune_boost_pu); -+ if (pad2g_tune_pus) -+ b43_radio_write(dev, R2057_PAD2G_TUNE_PUS_CORE1, -+ pad2g_tune_pus); -+ } -+ -+ usleep_range(50, 100); -+ -+ /* VCO calibration */ -+ b43_radio_mask(dev, R2057_RFPLL_MISC_EN, ~0x01); -+ b43_radio_mask(dev, R2057_RFPLL_MISC_CAL_RESETN, ~0x04); -+ b43_radio_set(dev, R2057_RFPLL_MISC_CAL_RESETN, 0x4); -+ b43_radio_set(dev, R2057_RFPLL_MISC_EN, 0x01); -+ usleep_range(300, 600); -+} -+ -+/* Calibrate resistors in LPF of PLL? -+ * http://bcm-v4.sipsolutions.net/PHY/radio205x_rcal -+ */ - static u8 b43_radio_2057_rcal(struct b43_wldev *dev) - { - struct b43_phy *phy = &dev->phy; -+ u16 saved_regs_phy[12]; -+ u16 saved_regs_phy_rf[6]; -+ u16 saved_regs_radio[2] = { }; -+ static const u16 phy_to_store[] = { -+ B43_NPHY_RFCTL_RSSIO1, B43_NPHY_RFCTL_RSSIO2, -+ B43_NPHY_RFCTL_LUT_TRSW_LO1, B43_NPHY_RFCTL_LUT_TRSW_LO2, -+ B43_NPHY_RFCTL_RXG1, B43_NPHY_RFCTL_RXG2, -+ B43_NPHY_RFCTL_TXG1, B43_NPHY_RFCTL_TXG2, -+ B43_NPHY_REV7_RF_CTL_MISC_REG3, B43_NPHY_REV7_RF_CTL_MISC_REG4, -+ B43_NPHY_REV7_RF_CTL_MISC_REG5, B43_NPHY_REV7_RF_CTL_MISC_REG6, -+ }; -+ static const u16 phy_to_store_rf[] = { -+ B43_NPHY_REV3_RFCTL_OVER0, B43_NPHY_REV3_RFCTL_OVER1, -+ B43_NPHY_REV7_RF_CTL_OVER3, B43_NPHY_REV7_RF_CTL_OVER4, -+ B43_NPHY_REV7_RF_CTL_OVER5, B43_NPHY_REV7_RF_CTL_OVER6, -+ }; - u16 tmp; -+ int i; - -- if (phy->radio_rev == 5) { -- b43_phy_mask(dev, 0x342, ~0x2); -+ /* Save */ -+ for (i = 0; i < ARRAY_SIZE(phy_to_store); i++) -+ saved_regs_phy[i] = b43_phy_read(dev, phy_to_store[i]); -+ for (i = 0; i < ARRAY_SIZE(phy_to_store_rf); i++) -+ saved_regs_phy_rf[i] = b43_phy_read(dev, phy_to_store_rf[i]); -+ -+ /* Set */ -+ for (i = 0; i < ARRAY_SIZE(phy_to_store); i++) -+ b43_phy_write(dev, phy_to_store[i], 0); -+ b43_phy_write(dev, B43_NPHY_REV3_RFCTL_OVER0, 0x07ff); -+ b43_phy_write(dev, B43_NPHY_REV3_RFCTL_OVER1, 0x07ff); -+ b43_phy_write(dev, B43_NPHY_REV7_RF_CTL_OVER3, 0x07ff); -+ b43_phy_write(dev, B43_NPHY_REV7_RF_CTL_OVER4, 0x07ff); -+ b43_phy_write(dev, B43_NPHY_REV7_RF_CTL_OVER5, 0x007f); -+ b43_phy_write(dev, B43_NPHY_REV7_RF_CTL_OVER6, 0x007f); -+ -+ switch (phy->radio_rev) { -+ case 5: -+ b43_phy_mask(dev, B43_NPHY_REV7_RF_CTL_OVER3, ~0x2); - udelay(10); - b43_radio_set(dev, R2057_IQTEST_SEL_PU, 0x1); -- b43_radio_maskset(dev, 0x1ca, ~0x2, 0x1); -+ b43_radio_maskset(dev, R2057v7_IQTEST_SEL_PU2, ~0x2, 0x1); -+ break; -+ case 9: -+ b43_phy_set(dev, B43_NPHY_REV7_RF_CTL_OVER3, 0x2); -+ b43_phy_set(dev, B43_NPHY_REV7_RF_CTL_MISC_REG3, 0x2); -+ saved_regs_radio[0] = b43_radio_read(dev, R2057_IQTEST_SEL_PU); -+ b43_radio_write(dev, R2057_IQTEST_SEL_PU, 0x11); -+ break; -+ case 14: -+ saved_regs_radio[0] = b43_radio_read(dev, R2057_IQTEST_SEL_PU); -+ saved_regs_radio[1] = b43_radio_read(dev, R2057v7_IQTEST_SEL_PU2); -+ b43_phy_set(dev, B43_NPHY_REV7_RF_CTL_MISC_REG3, 0x2); -+ b43_phy_set(dev, B43_NPHY_REV7_RF_CTL_OVER3, 0x2); -+ b43_radio_write(dev, R2057v7_IQTEST_SEL_PU2, 0x2); -+ b43_radio_write(dev, R2057_IQTEST_SEL_PU, 0x1); -+ break; - } - -+ /* Enable */ - b43_radio_set(dev, R2057_RCAL_CONFIG, 0x1); - udelay(10); -- b43_radio_set(dev, R2057_RCAL_CONFIG, 0x3); -- if (!b43_radio_wait_value(dev, R2057_RCCAL_N1_1, 1, 1, 100, 1000000)) { -+ -+ /* Start */ -+ b43_radio_set(dev, R2057_RCAL_CONFIG, 0x2); -+ usleep_range(100, 200); -+ -+ /* Stop */ -+ b43_radio_mask(dev, R2057_RCAL_CONFIG, ~0x2); -+ -+ /* Wait and check for result */ -+ if (!b43_radio_wait_value(dev, R2057_RCAL_STATUS, 1, 1, 100, 1000000)) { - b43err(dev->wl, "Radio 0x2057 rcal timeout\n"); - return 0; - } -- b43_radio_mask(dev, R2057_RCAL_CONFIG, ~0x2); - tmp = b43_radio_read(dev, R2057_RCAL_STATUS) & 0x3E; -+ -+ /* Disable */ - b43_radio_mask(dev, R2057_RCAL_CONFIG, ~0x1); - -- if (phy->radio_rev == 5) { -- b43_radio_mask(dev, R2057_IPA2G_CASCONV_CORE0, ~0x1); -- b43_radio_mask(dev, 0x1ca, ~0x2); -- } -- if (phy->radio_rev <= 4 || phy->radio_rev == 6) { -+ /* Restore */ -+ for (i = 0; i < ARRAY_SIZE(phy_to_store_rf); i++) -+ b43_phy_write(dev, phy_to_store_rf[i], saved_regs_phy_rf[i]); -+ for (i = 0; i < ARRAY_SIZE(phy_to_store); i++) -+ b43_phy_write(dev, phy_to_store[i], saved_regs_phy[i]); -+ -+ switch (phy->radio_rev) { -+ case 0 ... 4: -+ case 6: - b43_radio_maskset(dev, R2057_TEMPSENSE_CONFIG, ~0x3C, tmp); - b43_radio_maskset(dev, R2057_BANDGAP_RCAL_TRIM, ~0xF0, - tmp << 2); -+ break; -+ case 5: -+ b43_radio_mask(dev, R2057_IPA2G_CASCONV_CORE0, ~0x1); -+ b43_radio_mask(dev, R2057v7_IQTEST_SEL_PU2, ~0x2); -+ break; -+ case 9: -+ b43_radio_write(dev, R2057_IQTEST_SEL_PU, saved_regs_radio[0]); -+ break; -+ case 14: -+ b43_radio_write(dev, R2057_IQTEST_SEL_PU, saved_regs_radio[0]); -+ b43_radio_write(dev, R2057v7_IQTEST_SEL_PU2, saved_regs_radio[1]); -+ break; - } - - return tmp & 0x3e; - } - --/* http://bcm-v4.sipsolutions.net/PHY/radio2057_rccal */ -+/* Calibrate the internal RC oscillator? -+ * http://bcm-v4.sipsolutions.net/PHY/radio2057_rccal -+ */ - static u16 b43_radio_2057_rccal(struct b43_wldev *dev) - { - struct b43_phy *phy = &dev->phy; -@@ -635,49 +939,76 @@ static u16 b43_radio_2057_rccal(struct b - phy->radio_rev == 6); - u16 tmp; - -+ /* Setup cal */ - if (special) { - b43_radio_write(dev, R2057_RCCAL_MASTER, 0x61); - b43_radio_write(dev, R2057_RCCAL_TRC0, 0xC0); - } else { -- b43_radio_write(dev, 0x1AE, 0x61); -- b43_radio_write(dev, R2057_RCCAL_TRC0, 0xE1); -+ b43_radio_write(dev, R2057v7_RCCAL_MASTER, 0x61); -+ b43_radio_write(dev, R2057_RCCAL_TRC0, 0xE9); - } - b43_radio_write(dev, R2057_RCCAL_X1, 0x6E); -+ -+ /* Start, wait, stop */ - b43_radio_write(dev, R2057_RCCAL_START_R1_Q1_P1, 0x55); -- if (!b43_radio_wait_value(dev, R2057_RCCAL_DONE_OSCCAP, 1, 1, 500, -+ if (!b43_radio_wait_value(dev, R2057_RCCAL_DONE_OSCCAP, 2, 2, 500, - 5000000)) - b43dbg(dev->wl, "Radio 0x2057 rccal timeout\n"); -+ usleep_range(35, 70); - b43_radio_write(dev, R2057_RCCAL_START_R1_Q1_P1, 0x15); -+ usleep_range(70, 140); -+ -+ /* Setup cal */ - if (special) { - b43_radio_write(dev, R2057_RCCAL_MASTER, 0x69); - b43_radio_write(dev, R2057_RCCAL_TRC0, 0xB0); - } else { -- b43_radio_write(dev, 0x1AE, 0x69); -+ b43_radio_write(dev, R2057v7_RCCAL_MASTER, 0x69); - b43_radio_write(dev, R2057_RCCAL_TRC0, 0xD5); - } - b43_radio_write(dev, R2057_RCCAL_X1, 0x6E); -+ -+ /* Start, wait, stop */ -+ usleep_range(35, 70); - b43_radio_write(dev, R2057_RCCAL_START_R1_Q1_P1, 0x55); -- if (!b43_radio_wait_value(dev, R2057_RCCAL_DONE_OSCCAP, 1, 1, 500, -+ usleep_range(70, 140); -+ if (!b43_radio_wait_value(dev, R2057_RCCAL_DONE_OSCCAP, 2, 2, 500, - 5000000)) - b43dbg(dev->wl, "Radio 0x2057 rccal timeout\n"); -+ usleep_range(35, 70); - b43_radio_write(dev, R2057_RCCAL_START_R1_Q1_P1, 0x15); -+ usleep_range(70, 140); -+ -+ /* Setup cal */ - if (special) { - b43_radio_write(dev, R2057_RCCAL_MASTER, 0x73); - b43_radio_write(dev, R2057_RCCAL_X1, 0x28); - b43_radio_write(dev, R2057_RCCAL_TRC0, 0xB0); - } else { -- b43_radio_write(dev, 0x1AE, 0x73); -+ b43_radio_write(dev, R2057v7_RCCAL_MASTER, 0x73); - b43_radio_write(dev, R2057_RCCAL_X1, 0x6E); - b43_radio_write(dev, R2057_RCCAL_TRC0, 0x99); - } -+ -+ /* Start, wait, stop */ -+ usleep_range(35, 70); - b43_radio_write(dev, R2057_RCCAL_START_R1_Q1_P1, 0x55); -- if (!b43_radio_wait_value(dev, R2057_RCCAL_DONE_OSCCAP, 1, 1, 500, -+ usleep_range(70, 140); -+ if (!b43_radio_wait_value(dev, R2057_RCCAL_DONE_OSCCAP, 2, 2, 500, - 5000000)) { - b43err(dev->wl, "Radio 0x2057 rcal timeout\n"); - return 0; - } - tmp = b43_radio_read(dev, R2057_RCCAL_DONE_OSCCAP); -+ usleep_range(35, 70); - b43_radio_write(dev, R2057_RCCAL_START_R1_Q1_P1, 0x15); -+ usleep_range(70, 140); -+ -+ if (special) -+ b43_radio_mask(dev, R2057_RCCAL_MASTER, ~0x1); -+ else -+ b43_radio_mask(dev, R2057v7_RCCAL_MASTER, ~0x1); -+ - return tmp; - } - -@@ -694,19 +1025,20 @@ static void b43_radio_2057_init_post(str - { - b43_radio_set(dev, R2057_XTALPUOVR_PINCTRL, 0x1); - -+ if (0) /* FIXME: Is this BCM43217 specific? */ -+ b43_radio_set(dev, R2057_XTALPUOVR_PINCTRL, 0x2); -+ - b43_radio_set(dev, R2057_RFPLL_MISC_CAL_RESETN, 0x78); - b43_radio_set(dev, R2057_XTAL_CONFIG2, 0x80); - mdelay(2); - b43_radio_mask(dev, R2057_RFPLL_MISC_CAL_RESETN, ~0x78); - b43_radio_mask(dev, R2057_XTAL_CONFIG2, ~0x80); - -- if (dev->phy.n->init_por) { -+ if (dev->phy.do_full_init) { - b43_radio_2057_rcal(dev); - b43_radio_2057_rccal(dev); - } - b43_radio_mask(dev, R2057_RFPLL_MASTER, ~0x8); -- -- dev->phy.n->init_por = false; - } - - /* http://bcm-v4.sipsolutions.net/802.11/Radio/2057/Init */ -@@ -800,6 +1132,7 @@ static void b43_chantab_radio_2056_uploa - static void b43_radio_2056_setup(struct b43_wldev *dev, - const struct b43_nphy_channeltab_entry_rev3 *e) - { -+ struct b43_phy *phy = &dev->phy; - struct ssb_sprom *sprom = dev->dev->bus_sprom; - enum ieee80211_band band = b43_current_band(dev->wl); - u16 offset; -@@ -897,7 +1230,7 @@ static void b43_radio_2056_setup(struct - offset | B2056_TX_MIXG_BOOST_TUNE, - mixg_boost); - } else { -- bias = dev->phy.is_40mhz ? 0x40 : 0x20; -+ bias = b43_is_40mhz(dev) ? 0x40 : 0x20; - b43_radio_write(dev, - offset | B2056_TX_INTPAG_IMAIN_STAT, - bias); -@@ -911,7 +1244,7 @@ static void b43_radio_2056_setup(struct - b43_radio_write(dev, offset | B2056_TX_PA_SPARE1, 0xee); - } - } else if (dev->phy.n->ipa5g_on && band == IEEE80211_BAND_5GHZ) { -- u16 freq = dev->phy.channel_freq; -+ u16 freq = phy->chandef->chan->center_freq; - if (freq < 5100) { - paa_boost = 0xA; - pada_boost = 0x77; -@@ -1028,7 +1361,7 @@ static void b43_radio_init2056_post(stru - b43_radio_mask(dev, B2056_SYN_COM_RESET, ~0x2); - b43_radio_mask(dev, B2056_SYN_PLL_MAST2, ~0xFC); - b43_radio_mask(dev, B2056_SYN_RCCAL_CTRL0, ~0x1); -- if (dev->phy.n->init_por) -+ if (dev->phy.do_full_init) - b43_radio_2056_rcal(dev); - } - -@@ -1041,8 +1374,6 @@ static void b43_radio_init2056(struct b4 - b43_radio_init2056_pre(dev); - b2056_upload_inittabs(dev, 0, 0); - b43_radio_init2056_post(dev); -- -- dev->phy.n->init_por = false; - } - - /************************************************** -@@ -1214,8 +1545,7 @@ static u16 b43_nphy_gen_load_samples(str - u16 bw, len, rot, angle; - struct b43_c32 *samples; - -- -- bw = (dev->phy.is_40mhz) ? 40 : 20; -+ bw = b43_is_40mhz(dev) ? 40 : 20; - len = bw << 3; - - if (test) { -@@ -1224,7 +1554,7 @@ static u16 b43_nphy_gen_load_samples(str - else - bw = 80; - -- if (dev->phy.is_40mhz) -+ if (b43_is_40mhz(dev)) - bw <<= 1; - - len = bw << 1; -@@ -1252,8 +1582,10 @@ static u16 b43_nphy_gen_load_samples(str - - /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RunSamples */ - static void b43_nphy_run_samples(struct b43_wldev *dev, u16 samps, u16 loops, -- u16 wait, bool iqmode, bool dac_test) -+ u16 wait, bool iqmode, bool dac_test, -+ bool modify_bbmult) - { -+ struct b43_phy *phy = &dev->phy; - struct b43_phy_n *nphy = dev->phy.n; - int i; - u16 seq_mode; -@@ -1261,17 +1593,35 @@ static void b43_nphy_run_samples(struct - - b43_nphy_stay_in_carrier_search(dev, true); - -+ if (phy->rev >= 7) { -+ bool lpf_bw3, lpf_bw4; -+ -+ lpf_bw3 = b43_phy_read(dev, B43_NPHY_REV7_RF_CTL_OVER3) & 0x80; -+ lpf_bw4 = b43_phy_read(dev, B43_NPHY_REV7_RF_CTL_OVER4) & 0x80; -+ -+ if (lpf_bw3 || lpf_bw4) { -+ /* TODO */ -+ } else { -+ u16 value = b43_nphy_read_lpf_ctl(dev, 0); -+ if (phy->rev >= 19) -+ b43_nphy_rf_ctl_override_rev19(dev, 0x80, value, -+ 0, false, 1); -+ else -+ b43_nphy_rf_ctl_override_rev7(dev, 0x80, value, -+ 0, false, 1); -+ nphy->lpf_bw_overrode_for_sample_play = true; -+ } -+ } -+ - if ((nphy->bb_mult_save & 0x80000000) == 0) { - tmp = b43_ntab_read(dev, B43_NTAB16(15, 87)); - nphy->bb_mult_save = (tmp & 0xFFFF) | 0x80000000; - } - -- /* TODO: add modify_bbmult argument */ -- if (!dev->phy.is_40mhz) -- tmp = 0x6464; -- else -- tmp = 0x4747; -- b43_ntab_write(dev, B43_NTAB16(15, 87), tmp); -+ if (modify_bbmult) { -+ tmp = !b43_is_40mhz(dev) ? 0x6464 : 0x4747; -+ b43_ntab_write(dev, B43_NTAB16(15, 87), tmp); -+ } - - b43_phy_write(dev, B43_NPHY_SAMP_DEPCNT, (samps - 1)); - -@@ -1289,10 +1639,8 @@ static void b43_nphy_run_samples(struct - b43_phy_mask(dev, B43_NPHY_IQLOCAL_CMDGCTL, 0x7FFF); - b43_phy_set(dev, B43_NPHY_IQLOCAL_CMDGCTL, 0x8000); - } else { -- if (dac_test) -- b43_phy_write(dev, B43_NPHY_SAMP_CMD, 5); -- else -- b43_phy_write(dev, B43_NPHY_SAMP_CMD, 1); -+ tmp = dac_test ? 5 : 1; -+ b43_phy_write(dev, B43_NPHY_SAMP_CMD, tmp); - } - for (i = 0; i < 100; i++) { - if (!(b43_phy_read(dev, B43_NPHY_RFSEQST) & 1)) { -@@ -1392,6 +1740,12 @@ static void b43_nphy_scale_offset_rssi(s - } - } - -+static void b43_nphy_rssi_select_rev19(struct b43_wldev *dev, u8 code, -+ enum n_rssi_type rssi_type) -+{ -+ /* TODO */ -+} -+ - static void b43_nphy_rev3_rssi_select(struct b43_wldev *dev, u8 code, - enum n_rssi_type rssi_type) - { -@@ -1461,13 +1815,15 @@ static void b43_nphy_rev3_rssi_select(st - enum ieee80211_band band = - b43_current_band(dev->wl); - -- if (b43_nphy_ipa(dev)) -- val = (band == IEEE80211_BAND_5GHZ) ? 0xC : 0xE; -- else -- val = 0x11; -- reg = (i == 0) ? 0x2000 : 0x3000; -- reg |= B2055_PADDRV; -- b43_radio_write(dev, reg, val); -+ if (dev->phy.rev < 7) { -+ if (b43_nphy_ipa(dev)) -+ val = (band == IEEE80211_BAND_5GHZ) ? 0xC : 0xE; -+ else -+ val = 0x11; -+ reg = (i == 0) ? B2056_TX0 : B2056_TX1; -+ reg |= B2056_TX_TX_SSI_MUX; -+ b43_radio_write(dev, reg, val); -+ } - - reg = (i == 0) ? - B43_NPHY_AFECTL_OVER1 : -@@ -1554,7 +1910,9 @@ static void b43_nphy_rev2_rssi_select(st - static void b43_nphy_rssi_select(struct b43_wldev *dev, u8 code, - enum n_rssi_type type) - { -- if (dev->phy.rev >= 3) -+ if (dev->phy.rev >= 19) -+ b43_nphy_rssi_select_rev19(dev, code, type); -+ else if (dev->phy.rev >= 3) - b43_nphy_rev3_rssi_select(dev, code, type); - else - b43_nphy_rev2_rssi_select(dev, code, type); -@@ -1598,6 +1956,8 @@ static int b43_nphy_poll_rssi(struct b43 - u16 save_regs_phy[9]; - u16 s[2]; - -+ /* TODO: rev7+ is treated like rev3+, what about rev19+? */ -+ - if (dev->phy.rev >= 3) { - save_regs_phy[0] = b43_phy_read(dev, B43_NPHY_AFECTL_C1); - save_regs_phy[1] = b43_phy_read(dev, B43_NPHY_AFECTL_C2); -@@ -1679,6 +2039,7 @@ static int b43_nphy_poll_rssi(struct b43 - /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RSSICalRev3 */ - static void b43_nphy_rev3_rssi_cal(struct b43_wldev *dev) - { -+ struct b43_phy *phy = &dev->phy; - struct b43_phy_n *nphy = dev->phy.n; - - u16 saved_regs_phy_rfctl[2]; -@@ -1696,12 +2057,14 @@ static void b43_nphy_rev3_rssi_cal(struc - B43_NPHY_AFECTL_OVER1, B43_NPHY_AFECTL_OVER, - B43_NPHY_AFECTL_C1, B43_NPHY_AFECTL_C2, - B43_NPHY_TXF_40CO_B1S1, B43_NPHY_RFCTL_OVER, -- 0x342, 0x343, 0x346, 0x347, -+ B43_NPHY_REV7_RF_CTL_OVER3, B43_NPHY_REV7_RF_CTL_OVER4, -+ B43_NPHY_REV7_RF_CTL_OVER5, B43_NPHY_REV7_RF_CTL_OVER6, - 0x2ff, - B43_NPHY_TXF_40CO_B1S0, B43_NPHY_TXF_40CO_B32S1, - B43_NPHY_RFCTL_CMD, - B43_NPHY_RFCTL_LUT_TRSW_UP1, B43_NPHY_RFCTL_LUT_TRSW_UP2, -- 0x340, 0x341, 0x344, 0x345, -+ B43_NPHY_REV7_RF_CTL_MISC_REG3, B43_NPHY_REV7_RF_CTL_MISC_REG4, -+ B43_NPHY_REV7_RF_CTL_MISC_REG5, B43_NPHY_REV7_RF_CTL_MISC_REG6, - B43_NPHY_RFCTL_RSSIO1, B43_NPHY_RFCTL_RSSIO2 - }; - u16 *regs_to_store; -@@ -1748,9 +2111,24 @@ static void b43_nphy_rev3_rssi_cal(struc - b43_nphy_rf_ctl_intc_override(dev, N_INTC_OVERRIDE_TRSW, 1, 7); - - if (dev->phy.rev >= 7) { -- /* TODO */ -+ b43_nphy_rf_ctl_override_one_to_many(dev, -+ N_RF_CTL_OVER_CMD_RXRF_PU, -+ 0, 0, false); -+ b43_nphy_rf_ctl_override_one_to_many(dev, -+ N_RF_CTL_OVER_CMD_RX_PU, -+ 1, 0, false); -+ b43_nphy_rf_ctl_override_rev7(dev, 0x80, 1, 0, false, 0); -+ b43_nphy_rf_ctl_override_rev7(dev, 0x40, 1, 0, false, 0); - if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) { -+ b43_nphy_rf_ctl_override_rev7(dev, 0x20, 0, 0, false, -+ 0); -+ b43_nphy_rf_ctl_override_rev7(dev, 0x10, 1, 0, false, -+ 0); - } else { -+ b43_nphy_rf_ctl_override_rev7(dev, 0x10, 0, 0, false, -+ 0); -+ b43_nphy_rf_ctl_override_rev7(dev, 0x20, 1, 0, false, -+ 0); - } - } else { - b43_nphy_rf_ctl_override(dev, 0x1, 0, 0, false); -@@ -1779,7 +2157,10 @@ static void b43_nphy_rev3_rssi_cal(struc - /* Grab RSSI results for every possible VCM */ - for (vcm = 0; vcm < 8; vcm++) { - if (dev->phy.rev >= 7) -- ; -+ b43_radio_maskset(dev, -+ core ? R2057_NB_MASTER_CORE1 : -+ R2057_NB_MASTER_CORE0, -+ ~R2057_VCM_MASK, vcm); - else - b43_radio_maskset(dev, r | B2056_RX_RSSI_MISC, - 0xE3, vcm << 2); -@@ -1810,7 +2191,10 @@ static void b43_nphy_rev3_rssi_cal(struc - - /* Select the best VCM */ - if (dev->phy.rev >= 7) -- ; -+ b43_radio_maskset(dev, -+ core ? R2057_NB_MASTER_CORE1 : -+ R2057_NB_MASTER_CORE0, -+ ~R2057_VCM_MASK, vcm); - else - b43_radio_maskset(dev, r | B2056_RX_RSSI_MISC, - 0xE3, vcm_final << 2); -@@ -1880,6 +2264,10 @@ static void b43_nphy_rev3_rssi_cal(struc - rssical_phy_regs = nphy->rssical_cache.rssical_phy_regs_5G; - } - if (dev->phy.rev >= 7) { -+ rssical_radio_regs[0] = b43_radio_read(dev, -+ R2057_NB_MASTER_CORE0); -+ rssical_radio_regs[1] = b43_radio_read(dev, -+ R2057_NB_MASTER_CORE1); - } else { - rssical_radio_regs[0] = b43_radio_read(dev, B2056_RX0 | - B2056_RX_RSSI_MISC); -@@ -1901,9 +2289,9 @@ static void b43_nphy_rev3_rssi_cal(struc - - /* Remember for which channel we store configuration */ - if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) -- nphy->rssical_chanspec_2G.center_freq = dev->phy.channel_freq; -+ nphy->rssical_chanspec_2G.center_freq = phy->chandef->chan->center_freq; - else -- nphy->rssical_chanspec_5G.center_freq = dev->phy.channel_freq; -+ nphy->rssical_chanspec_5G.center_freq = phy->chandef->chan->center_freq; - - /* End of calibration, restore configuration */ - b43_nphy_classifier(dev, 7, class); -@@ -2080,7 +2468,9 @@ static void b43_nphy_rev2_rssi_cal(struc - */ - static void b43_nphy_rssi_cal(struct b43_wldev *dev) - { -- if (dev->phy.rev >= 3) { -+ if (dev->phy.rev >= 19) { -+ /* TODO */ -+ } else if (dev->phy.rev >= 3) { - b43_nphy_rev3_rssi_cal(dev); - } else { - b43_nphy_rev2_rssi_cal(dev, N_RSSI_NB); -@@ -2093,7 +2483,21 @@ static void b43_nphy_rssi_cal(struct b43 - * Workarounds - **************************************************/ - --static void b43_nphy_gain_ctl_workarounds_rev3plus(struct b43_wldev *dev) -+static void b43_nphy_gain_ctl_workarounds_rev19(struct b43_wldev *dev) -+{ -+ /* TODO */ -+} -+ -+static void b43_nphy_gain_ctl_workarounds_rev7(struct b43_wldev *dev) -+{ -+ struct b43_phy *phy = &dev->phy; -+ -+ switch (phy->rev) { -+ /* TODO */ -+ } -+} -+ -+static void b43_nphy_gain_ctl_workarounds_rev3(struct b43_wldev *dev) - { - struct ssb_sprom *sprom = dev->dev->bus_sprom; - -@@ -2196,7 +2600,7 @@ static void b43_nphy_gain_ctl_workaround - b43_phy_write(dev, B43_NPHY_C1_NBCLIPTHRES, 0x84); - b43_phy_write(dev, B43_NPHY_C2_NBCLIPTHRES, 0x84); - -- if (!dev->phy.is_40mhz) { -+ if (!b43_is_40mhz(dev)) { - /* Set dwell lengths */ - b43_phy_write(dev, B43_NPHY_CLIP1_NBDWELL_LEN, 0x002B); - b43_phy_write(dev, B43_NPHY_CLIP2_NBDWELL_LEN, 0x002B); -@@ -2210,7 +2614,7 @@ static void b43_nphy_gain_ctl_workaround - b43_phy_maskset(dev, B43_NPHY_C2_CLIPWBTHRES, - ~B43_NPHY_C2_CLIPWBTHRES_CLIP2, 21); - -- if (!dev->phy.is_40mhz) { -+ if (!b43_is_40mhz(dev)) { - b43_phy_maskset(dev, B43_NPHY_C1_CGAINI, - ~B43_NPHY_C1_CGAINI_GAINBKOFF, 0x1); - b43_phy_maskset(dev, B43_NPHY_C2_CGAINI, -@@ -2225,12 +2629,12 @@ static void b43_nphy_gain_ctl_workaround - - if (nphy->gain_boost) { - if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ && -- dev->phy.is_40mhz) -+ b43_is_40mhz(dev)) - code = 4; - else - code = 5; - } else { -- code = dev->phy.is_40mhz ? 6 : 7; -+ code = b43_is_40mhz(dev) ? 6 : 7; - } - - /* Set HPVGA2 index */ -@@ -2290,46 +2694,54 @@ static void b43_nphy_gain_ctl_workaround - /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/WorkaroundsGainCtrl */ - static void b43_nphy_gain_ctl_workarounds(struct b43_wldev *dev) - { -- if (dev->phy.rev >= 7) -- ; /* TODO */ -+ if (dev->phy.rev >= 19) -+ b43_nphy_gain_ctl_workarounds_rev19(dev); -+ else if (dev->phy.rev >= 7) -+ b43_nphy_gain_ctl_workarounds_rev7(dev); - else if (dev->phy.rev >= 3) -- b43_nphy_gain_ctl_workarounds_rev3plus(dev); -+ b43_nphy_gain_ctl_workarounds_rev3(dev); - else - b43_nphy_gain_ctl_workarounds_rev1_2(dev); - } - --/* http://bcm-v4.sipsolutions.net/PHY/N/Read_Lpf_Bw_Ctl */ --static u16 b43_nphy_read_lpf_ctl(struct b43_wldev *dev, u16 offset) --{ -- if (!offset) -- offset = (dev->phy.is_40mhz) ? 0x159 : 0x154; -- return b43_ntab_read(dev, B43_NTAB16(7, offset)) & 0x7; --} -- - static void b43_nphy_workarounds_rev7plus(struct b43_wldev *dev) - { - struct ssb_sprom *sprom = dev->dev->bus_sprom; - struct b43_phy *phy = &dev->phy; - -+ /* TX to RX */ -+ u8 tx2rx_events[7] = { 4, 3, 5, 2, 1, 8, 31, }; -+ u8 tx2rx_delays[7] = { 8, 4, 4, 4, 4, 6, 1, }; -+ /* RX to TX */ - u8 rx2tx_events_ipa[9] = { 0x0, 0x1, 0x2, 0x8, 0x5, 0x6, 0xF, 0x3, - 0x1F }; - u8 rx2tx_delays_ipa[9] = { 8, 6, 6, 4, 4, 16, 43, 1, 1 }; - -- u16 ntab7_15e_16e[] = { 0x10f, 0x10f }; -+ static const u16 ntab7_15e_16e[] = { 0, 0x10f, 0x10f }; - u8 ntab7_138_146[] = { 0x11, 0x11 }; - u8 ntab7_133[] = { 0x77, 0x11, 0x11 }; - -- u16 lpf_20, lpf_40, lpf_11b; -- u16 bcap_val, bcap_val_11b, bcap_val_11n_20, bcap_val_11n_40; -- u16 scap_val, scap_val_11b, scap_val_11n_20, scap_val_11n_40; -+ u16 lpf_ofdm_20mhz[2], lpf_ofdm_40mhz[2], lpf_11b[2]; -+ u16 bcap_val; -+ s16 bcap_val_11b[2], bcap_val_11n_20[2], bcap_val_11n_40[2]; -+ u16 scap_val; -+ s16 scap_val_11b[2], scap_val_11n_20[2], scap_val_11n_40[2]; - bool rccal_ovrd = false; - -- u16 rx2tx_lut_20_11b, rx2tx_lut_20_11n, rx2tx_lut_40_11n; - u16 bias, conv, filt; - -+ u32 noise_tbl[2]; -+ - u32 tmp32; - u8 core; - -+ b43_phy_write(dev, B43_NPHY_PHASETR_A0, 0x0125); -+ b43_phy_write(dev, B43_NPHY_PHASETR_A1, 0x01b3); -+ b43_phy_write(dev, B43_NPHY_PHASETR_A2, 0x0105); -+ b43_phy_write(dev, B43_NPHY_PHASETR_B0, 0x016e); -+ b43_phy_write(dev, B43_NPHY_PHASETR_B1, 0x00cd); -+ b43_phy_write(dev, B43_NPHY_PHASETR_B2, 0x0020); -+ - if (phy->rev == 7) { - b43_phy_set(dev, B43_NPHY_FINERX2_CGC, 0x10); - b43_phy_maskset(dev, B43_NPHY_FREQGAIN0, 0xFF80, 0x0020); -@@ -2349,11 +2761,18 @@ static void b43_nphy_workarounds_rev7plu - b43_phy_maskset(dev, B43_NPHY_FREQGAIN7, 0xFF80, 0x0040); - b43_phy_maskset(dev, B43_NPHY_FREQGAIN7, 0x80FF, 0x4000); - } -- if (phy->rev <= 8) { -+ -+ if (phy->rev >= 16) { -+ b43_phy_write(dev, B43_NPHY_FORCEFRONT0, 0x7ff); -+ b43_phy_write(dev, B43_NPHY_FORCEFRONT1, 0x7ff); -+ } else if (phy->rev <= 8) { - b43_phy_write(dev, B43_NPHY_FORCEFRONT0, 0x1B0); - b43_phy_write(dev, B43_NPHY_FORCEFRONT1, 0x1B0); - } -- if (phy->rev >= 8) -+ -+ if (phy->rev >= 16) -+ b43_phy_maskset(dev, B43_NPHY_TXTAILCNT, ~0xFF, 0xa0); -+ else if (phy->rev >= 8) - b43_phy_maskset(dev, B43_NPHY_TXTAILCNT, ~0xFF, 0x72); - - b43_ntab_write(dev, B43_NTAB16(8, 0x00), 2); -@@ -2361,9 +2780,11 @@ static void b43_nphy_workarounds_rev7plu - tmp32 = b43_ntab_read(dev, B43_NTAB32(30, 0)); - tmp32 &= 0xffffff; - b43_ntab_write(dev, B43_NTAB32(30, 0), tmp32); -- b43_ntab_write_bulk(dev, B43_NTAB16(7, 0x15e), 2, ntab7_15e_16e); -- b43_ntab_write_bulk(dev, B43_NTAB16(7, 0x16e), 2, ntab7_15e_16e); -+ b43_ntab_write_bulk(dev, B43_NTAB16(7, 0x15d), 3, ntab7_15e_16e); -+ b43_ntab_write_bulk(dev, B43_NTAB16(7, 0x16d), 3, ntab7_15e_16e); - -+ b43_nphy_set_rf_sequence(dev, 1, tx2rx_events, tx2rx_delays, -+ ARRAY_SIZE(tx2rx_events)); - if (b43_nphy_ipa(dev)) - b43_nphy_set_rf_sequence(dev, 0, rx2tx_events_ipa, - rx2tx_delays_ipa, ARRAY_SIZE(rx2tx_events_ipa)); -@@ -2371,84 +2792,176 @@ static void b43_nphy_workarounds_rev7plu - b43_phy_maskset(dev, B43_NPHY_EPS_OVERRIDEI_0, 0x3FFF, 0x4000); - b43_phy_maskset(dev, B43_NPHY_EPS_OVERRIDEI_1, 0x3FFF, 0x4000); - -- lpf_20 = b43_nphy_read_lpf_ctl(dev, 0x154); -- lpf_40 = b43_nphy_read_lpf_ctl(dev, 0x159); -- lpf_11b = b43_nphy_read_lpf_ctl(dev, 0x152); -+ for (core = 0; core < 2; core++) { -+ lpf_ofdm_20mhz[core] = b43_nphy_read_lpf_ctl(dev, 0x154 + core * 0x10); -+ lpf_ofdm_40mhz[core] = b43_nphy_read_lpf_ctl(dev, 0x159 + core * 0x10); -+ lpf_11b[core] = b43_nphy_read_lpf_ctl(dev, 0x152 + core * 0x10); -+ } -+ -+ bcap_val = b43_radio_read(dev, R2057_RCCAL_BCAP_VAL); -+ scap_val = b43_radio_read(dev, R2057_RCCAL_SCAP_VAL); -+ - if (b43_nphy_ipa(dev)) { -- if ((phy->radio_rev == 5 && phy->is_40mhz) || -- phy->radio_rev == 7 || phy->radio_rev == 8) { -- bcap_val = b43_radio_read(dev, 0x16b); -- scap_val = b43_radio_read(dev, 0x16a); -- scap_val_11b = scap_val; -- bcap_val_11b = bcap_val; -- if (phy->radio_rev == 5 && phy->is_40mhz) { -- scap_val_11n_20 = scap_val; -- bcap_val_11n_20 = bcap_val; -- scap_val_11n_40 = bcap_val_11n_40 = 0xc; -+ bool ghz2 = b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ; -+ -+ switch (phy->radio_rev) { -+ case 5: -+ /* Check radio version (to be 0) by PHY rev for now */ -+ if (phy->rev == 8 && b43_is_40mhz(dev)) { -+ for (core = 0; core < 2; core++) { -+ scap_val_11b[core] = scap_val; -+ bcap_val_11b[core] = bcap_val; -+ scap_val_11n_20[core] = scap_val; -+ bcap_val_11n_20[core] = bcap_val; -+ scap_val_11n_40[core] = 0xc; -+ bcap_val_11n_40[core] = 0xc; -+ } -+ - rccal_ovrd = true; -- } else { /* Rev 7/8 */ -- lpf_20 = 4; -- lpf_11b = 1; -+ } -+ if (phy->rev == 9) { -+ /* TODO: Radio version 1 (e.g. BCM5357B0) */ -+ } -+ break; -+ case 7: -+ case 8: -+ for (core = 0; core < 2; core++) { -+ scap_val_11b[core] = scap_val; -+ bcap_val_11b[core] = bcap_val; -+ lpf_ofdm_20mhz[core] = 4; -+ lpf_11b[core] = 1; - if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) { -- scap_val_11n_20 = 0xc; -- bcap_val_11n_20 = 0xc; -- scap_val_11n_40 = 0xa; -- bcap_val_11n_40 = 0xa; -+ scap_val_11n_20[core] = 0xc; -+ bcap_val_11n_20[core] = 0xc; -+ scap_val_11n_40[core] = 0xa; -+ bcap_val_11n_40[core] = 0xa; - } else { -- scap_val_11n_20 = 0x14; -- bcap_val_11n_20 = 0x14; -- scap_val_11n_40 = 0xf; -- bcap_val_11n_40 = 0xf; -+ scap_val_11n_20[core] = 0x14; -+ bcap_val_11n_20[core] = 0x14; -+ scap_val_11n_40[core] = 0xf; -+ bcap_val_11n_40[core] = 0xf; - } -- rccal_ovrd = true; - } -+ -+ rccal_ovrd = true; -+ break; -+ case 9: -+ for (core = 0; core < 2; core++) { -+ bcap_val_11b[core] = bcap_val; -+ scap_val_11b[core] = scap_val; -+ lpf_11b[core] = 1; -+ -+ if (ghz2) { -+ bcap_val_11n_20[core] = bcap_val + 13; -+ scap_val_11n_20[core] = scap_val + 15; -+ } else { -+ bcap_val_11n_20[core] = bcap_val + 14; -+ scap_val_11n_20[core] = scap_val + 15; -+ } -+ lpf_ofdm_20mhz[core] = 4; -+ -+ if (ghz2) { -+ bcap_val_11n_40[core] = bcap_val - 7; -+ scap_val_11n_40[core] = scap_val - 5; -+ } else { -+ bcap_val_11n_40[core] = bcap_val + 2; -+ scap_val_11n_40[core] = scap_val + 4; -+ } -+ lpf_ofdm_40mhz[core] = 4; -+ } -+ -+ rccal_ovrd = true; -+ break; -+ case 14: -+ for (core = 0; core < 2; core++) { -+ bcap_val_11b[core] = bcap_val; -+ scap_val_11b[core] = scap_val; -+ lpf_11b[core] = 1; -+ } -+ -+ bcap_val_11n_20[0] = bcap_val + 20; -+ scap_val_11n_20[0] = scap_val + 20; -+ lpf_ofdm_20mhz[0] = 3; -+ -+ bcap_val_11n_20[1] = bcap_val + 16; -+ scap_val_11n_20[1] = scap_val + 16; -+ lpf_ofdm_20mhz[1] = 3; -+ -+ bcap_val_11n_40[0] = bcap_val + 20; -+ scap_val_11n_40[0] = scap_val + 20; -+ lpf_ofdm_40mhz[0] = 4; -+ -+ bcap_val_11n_40[1] = bcap_val + 10; -+ scap_val_11n_40[1] = scap_val + 10; -+ lpf_ofdm_40mhz[1] = 4; -+ -+ rccal_ovrd = true; -+ break; - } - } else { - if (phy->radio_rev == 5) { -- lpf_20 = 1; -- lpf_40 = 3; -- bcap_val = b43_radio_read(dev, 0x16b); -- scap_val = b43_radio_read(dev, 0x16a); -- scap_val_11b = scap_val; -- bcap_val_11b = bcap_val; -- scap_val_11n_20 = 0x11; -- scap_val_11n_40 = 0x11; -- bcap_val_11n_20 = 0x13; -- bcap_val_11n_40 = 0x13; -+ for (core = 0; core < 2; core++) { -+ lpf_ofdm_20mhz[core] = 1; -+ lpf_ofdm_40mhz[core] = 3; -+ scap_val_11b[core] = scap_val; -+ bcap_val_11b[core] = bcap_val; -+ scap_val_11n_20[core] = 0x11; -+ scap_val_11n_40[core] = 0x11; -+ bcap_val_11n_20[core] = 0x13; -+ bcap_val_11n_40[core] = 0x13; -+ } -+ - rccal_ovrd = true; - } - } - if (rccal_ovrd) { -- rx2tx_lut_20_11b = (bcap_val_11b << 8) | -- (scap_val_11b << 3) | -- lpf_11b; -- rx2tx_lut_20_11n = (bcap_val_11n_20 << 8) | -- (scap_val_11n_20 << 3) | -- lpf_20; -- rx2tx_lut_40_11n = (bcap_val_11n_40 << 8) | -- (scap_val_11n_40 << 3) | -- lpf_40; -+ u16 rx2tx_lut_20_11b[2], rx2tx_lut_20_11n[2], rx2tx_lut_40_11n[2]; -+ u8 rx2tx_lut_extra = 1; -+ -+ for (core = 0; core < 2; core++) { -+ bcap_val_11b[core] = clamp_val(bcap_val_11b[core], 0, 0x1f); -+ scap_val_11b[core] = clamp_val(scap_val_11b[core], 0, 0x1f); -+ bcap_val_11n_20[core] = clamp_val(bcap_val_11n_20[core], 0, 0x1f); -+ scap_val_11n_20[core] = clamp_val(scap_val_11n_20[core], 0, 0x1f); -+ bcap_val_11n_40[core] = clamp_val(bcap_val_11n_40[core], 0, 0x1f); -+ scap_val_11n_40[core] = clamp_val(scap_val_11n_40[core], 0, 0x1f); -+ -+ rx2tx_lut_20_11b[core] = (rx2tx_lut_extra << 13) | -+ (bcap_val_11b[core] << 8) | -+ (scap_val_11b[core] << 3) | -+ lpf_11b[core]; -+ rx2tx_lut_20_11n[core] = (rx2tx_lut_extra << 13) | -+ (bcap_val_11n_20[core] << 8) | -+ (scap_val_11n_20[core] << 3) | -+ lpf_ofdm_20mhz[core]; -+ rx2tx_lut_40_11n[core] = (rx2tx_lut_extra << 13) | -+ (bcap_val_11n_40[core] << 8) | -+ (scap_val_11n_40[core] << 3) | -+ lpf_ofdm_40mhz[core]; -+ } -+ - for (core = 0; core < 2; core++) { - b43_ntab_write(dev, B43_NTAB16(7, 0x152 + core * 16), -- rx2tx_lut_20_11b); -+ rx2tx_lut_20_11b[core]); - b43_ntab_write(dev, B43_NTAB16(7, 0x153 + core * 16), -- rx2tx_lut_20_11n); -+ rx2tx_lut_20_11n[core]); - b43_ntab_write(dev, B43_NTAB16(7, 0x154 + core * 16), -- rx2tx_lut_20_11n); -+ rx2tx_lut_20_11n[core]); - b43_ntab_write(dev, B43_NTAB16(7, 0x155 + core * 16), -- rx2tx_lut_40_11n); -+ rx2tx_lut_40_11n[core]); - b43_ntab_write(dev, B43_NTAB16(7, 0x156 + core * 16), -- rx2tx_lut_40_11n); -+ rx2tx_lut_40_11n[core]); - b43_ntab_write(dev, B43_NTAB16(7, 0x157 + core * 16), -- rx2tx_lut_40_11n); -+ rx2tx_lut_40_11n[core]); - b43_ntab_write(dev, B43_NTAB16(7, 0x158 + core * 16), -- rx2tx_lut_40_11n); -+ rx2tx_lut_40_11n[core]); - b43_ntab_write(dev, B43_NTAB16(7, 0x159 + core * 16), -- rx2tx_lut_40_11n); -+ rx2tx_lut_40_11n[core]); - } -- b43_nphy_rf_ctl_override_rev7(dev, 16, 1, 3, false, 2); - } -+ - b43_phy_write(dev, 0x32F, 0x3); -+ - if (phy->radio_rev == 4 || phy->radio_rev == 6) - b43_nphy_rf_ctl_override_rev7(dev, 4, 1, 3, false, 0); - -@@ -2496,7 +3009,8 @@ static void b43_nphy_workarounds_rev7plu - 0x7f); - } - } -- if (phy->radio_rev == 3) { -+ switch (phy->radio_rev) { -+ case 3: - for (core = 0; core < 2; core++) { - if (core == 0) { - b43_radio_write(dev, 0x64, -@@ -2522,17 +3036,34 @@ static void b43_nphy_workarounds_rev7plu - 0x3E); - } - } -- } else if (phy->radio_rev == 7 || phy->radio_rev == 8) { -- if (!phy->is_40mhz) { -+ break; -+ case 7: -+ case 8: -+ if (!b43_is_40mhz(dev)) { - b43_radio_write(dev, 0x5F, 0x14); - b43_radio_write(dev, 0xE8, 0x12); - } else { - b43_radio_write(dev, 0x5F, 0x16); - b43_radio_write(dev, 0xE8, 0x16); - } -+ break; -+ case 14: -+ for (core = 0; core < 2; core++) { -+ int o = core ? 0x85 : 0; -+ -+ b43_radio_write(dev, o + R2057_IPA2G_CASCONV_CORE0, 0x13); -+ b43_radio_write(dev, o + R2057_TXMIX2G_TUNE_BOOST_PU_CORE0, 0x21); -+ b43_radio_write(dev, o + R2057_IPA2G_BIAS_FILTER_CORE0, 0xff); -+ b43_radio_write(dev, o + R2057_PAD2G_IDACS_CORE0, 0x88); -+ b43_radio_write(dev, o + R2057_PAD2G_TUNE_PUS_CORE0, 0x23); -+ b43_radio_write(dev, o + R2057_IPA2G_IMAIN_CORE0, 0x16); -+ b43_radio_write(dev, o + R2057_PAD_BIAS_FILTER_BWS_CORE0, 0x3e); -+ b43_radio_write(dev, o + R2057_BACKUP1_CORE0, 0x10); -+ } -+ break; - } - } else { -- u16 freq = phy->channel_freq; -+ u16 freq = phy->chandef->chan->center_freq; - if ((freq >= 5180 && freq <= 5230) || - (freq >= 5745 && freq <= 5805)) { - b43_radio_write(dev, 0x7D, 0xFF); -@@ -2577,8 +3108,8 @@ static void b43_nphy_workarounds_rev7plu - b43_phy_set(dev, B43_NPHY_AFECTL_OVER1, 0x1); - b43_phy_mask(dev, B43_NPHY_AFECTL_C2, ~0x1); - b43_phy_set(dev, B43_NPHY_AFECTL_OVER, 0x1); -- b43_ntab_write(dev, B43_NTAB16(8, 0x05), 0x20); -- b43_ntab_write(dev, B43_NTAB16(8, 0x15), 0x20); -+ b43_ntab_write(dev, B43_NTAB16(8, 0x05), 0); -+ b43_ntab_write(dev, B43_NTAB16(8, 0x15), 0); - - b43_phy_mask(dev, B43_NPHY_AFECTL_C1, ~0x4); - b43_phy_mask(dev, B43_NPHY_AFECTL_OVER1, ~0x4); -@@ -2589,20 +3120,20 @@ static void b43_nphy_workarounds_rev7plu - b43_phy_write(dev, B43_NPHY_ENDROP_TLEN, 0x2); - - b43_ntab_write(dev, B43_NTAB32(16, 0x100), 20); -- b43_ntab_write_bulk(dev, B43_NTAB16(7, 0x138), 2, ntab7_138_146); -+ b43_ntab_write_bulk(dev, B43_NTAB8(7, 0x138), 2, ntab7_138_146); - b43_ntab_write(dev, B43_NTAB16(7, 0x141), 0x77); -- b43_ntab_write_bulk(dev, B43_NTAB16(7, 0x133), 3, ntab7_133); -- b43_ntab_write_bulk(dev, B43_NTAB16(7, 0x146), 2, ntab7_138_146); -+ b43_ntab_write_bulk(dev, B43_NTAB8(7, 0x133), 3, ntab7_133); -+ b43_ntab_write_bulk(dev, B43_NTAB8(7, 0x146), 2, ntab7_138_146); - b43_ntab_write(dev, B43_NTAB16(7, 0x123), 0x77); - b43_ntab_write(dev, B43_NTAB16(7, 0x12A), 0x77); - -- if (!phy->is_40mhz) { -- b43_ntab_write(dev, B43_NTAB32(16, 0x03), 0x18D); -- b43_ntab_write(dev, B43_NTAB32(16, 0x7F), 0x18D); -- } else { -- b43_ntab_write(dev, B43_NTAB32(16, 0x03), 0x14D); -- b43_ntab_write(dev, B43_NTAB32(16, 0x7F), 0x14D); -- } -+ b43_ntab_read_bulk(dev, B43_NTAB32(16, 0x02), 1, noise_tbl); -+ noise_tbl[1] = b43_is_40mhz(dev) ? 0x14D : 0x18D; -+ b43_ntab_write_bulk(dev, B43_NTAB32(16, 0x02), 2, noise_tbl); -+ -+ b43_ntab_read_bulk(dev, B43_NTAB32(16, 0x7E), 1, noise_tbl); -+ noise_tbl[1] = b43_is_40mhz(dev) ? 0x14D : 0x18D; -+ b43_ntab_write_bulk(dev, B43_NTAB32(16, 0x7E), 2, noise_tbl); - - b43_nphy_gain_ctl_workarounds(dev); - -@@ -2695,7 +3226,7 @@ static void b43_nphy_workarounds_rev3plu - - b43_phy_maskset(dev, B43_NPHY_SGILTRNOFFSET, 0xF0FF, 0x0700); - -- if (!dev->phy.is_40mhz) { -+ if (!b43_is_40mhz(dev)) { - b43_ntab_write(dev, B43_NTAB32(16, 3), 0x18D); - b43_ntab_write(dev, B43_NTAB32(16, 127), 0x18D); - } else { -@@ -2930,6 +3461,7 @@ static void b43_nphy_workarounds(struct - b43_phy_set(dev, B43_NPHY_IQFLIP, - B43_NPHY_IQFLIP_ADC1 | B43_NPHY_IQFLIP_ADC2); - -+ /* TODO: rev19+ */ - if (dev->phy.rev >= 7) - b43_nphy_workarounds_rev7plus(dev); - else if (dev->phy.rev >= 3) -@@ -2950,12 +3482,13 @@ static void b43_nphy_workarounds(struct - * http://bcm-v4.sipsolutions.net/802.11/PHY/N/TXTone - */ - static int b43_nphy_tx_tone(struct b43_wldev *dev, u32 freq, u16 max_val, -- bool iqmode, bool dac_test) -+ bool iqmode, bool dac_test, bool modify_bbmult) - { - u16 samp = b43_nphy_gen_load_samples(dev, freq, max_val, dac_test); - if (samp == 0) - return -1; -- b43_nphy_run_samples(dev, samp, 0xFFFF, 0, iqmode, dac_test); -+ b43_nphy_run_samples(dev, samp, 0xFFFF, 0, iqmode, dac_test, -+ modify_bbmult); - return 0; - } - -@@ -2990,6 +3523,7 @@ static void b43_nphy_update_txrx_chain(s - /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/stop-playback */ - static void b43_nphy_stop_playback(struct b43_wldev *dev) - { -+ struct b43_phy *phy = &dev->phy; - struct b43_phy_n *nphy = dev->phy.n; - u16 tmp; - -@@ -3010,6 +3544,15 @@ static void b43_nphy_stop_playback(struc - nphy->bb_mult_save = 0; - } - -+ if (phy->rev >= 7 && nphy->lpf_bw_overrode_for_sample_play) { -+ if (phy->rev >= 19) -+ b43_nphy_rf_ctl_override_rev19(dev, 0x80, 0, 0, true, -+ 1); -+ else -+ b43_nphy_rf_ctl_override_rev7(dev, 0x80, 0, 0, true, 1); -+ nphy->lpf_bw_overrode_for_sample_play = false; -+ } -+ - if (nphy->hang_avoid) - b43_nphy_stay_in_carrier_search(dev, 0); - } -@@ -3019,16 +3562,23 @@ static void b43_nphy_iq_cal_gain_params( - struct nphy_txgains target, - struct nphy_iqcal_params *params) - { -+ struct b43_phy *phy = &dev->phy; - int i, j, indx; - u16 gain; - - if (dev->phy.rev >= 3) { -+ params->tx_lpf = target.tx_lpf[core]; /* Rev 7+ */ - params->txgm = target.txgm[core]; - params->pga = target.pga[core]; - params->pad = target.pad[core]; - params->ipa = target.ipa[core]; -- params->cal_gain = (params->txgm << 12) | (params->pga << 8) | -- (params->pad << 4) | (params->ipa); -+ if (phy->rev >= 19) { -+ /* TODO */ -+ } else if (phy->rev >= 7) { -+ params->cal_gain = (params->txgm << 12) | (params->pga << 8) | (params->pad << 3) | (params->ipa) | (params->tx_lpf << 15); -+ } else { -+ params->cal_gain = (params->txgm << 12) | (params->pga << 8) | (params->pad << 4) | (params->ipa); -+ } - for (j = 0; j < 5; j++) - params->ncorr[j] = 0x79; - } else { -@@ -3069,6 +3619,7 @@ static enum b43_txpwr_result b43_nphy_op - /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/TxPwrCtrlEnable */ - static void b43_nphy_tx_power_ctrl(struct b43_wldev *dev, bool enable) - { -+ struct b43_phy *phy = &dev->phy; - struct b43_phy_n *nphy = dev->phy.n; - u8 i; - u16 bmask, val, tmp; -@@ -3118,7 +3669,7 @@ static void b43_nphy_tx_power_ctrl(struc - b43_phy_maskset(dev, B43_NPHY_BPHY_CTL3, - ~B43_NPHY_BPHY_CTL3_SCALE, 0x5A); - -- if (dev->phy.rev < 2 && dev->phy.is_40mhz) -+ if (dev->phy.rev < 2 && b43_is_40mhz(dev)) - b43_hf_write(dev, b43_hf_read(dev) | B43_HF_TSSIRPSMW); - } else { - b43_ntab_write_bulk(dev, B43_NTAB16(26, 64), 84, -@@ -3138,12 +3689,25 @@ static void b43_nphy_tx_power_ctrl(struc - b43_phy_maskset(dev, B43_NPHY_TXPCTL_CMD, ~(bmask), val); - - if (band == IEEE80211_BAND_5GHZ) { -- b43_phy_maskset(dev, B43_NPHY_TXPCTL_CMD, -- ~B43_NPHY_TXPCTL_CMD_INIT, 0x64); -- if (dev->phy.rev > 1) -+ if (phy->rev >= 19) { -+ /* TODO */ -+ } else if (phy->rev >= 7) { -+ b43_phy_maskset(dev, B43_NPHY_TXPCTL_CMD, -+ ~B43_NPHY_TXPCTL_CMD_INIT, -+ 0x32); - b43_phy_maskset(dev, B43_NPHY_TXPCTL_INIT, - ~B43_NPHY_TXPCTL_INIT_PIDXI1, -+ 0x32); -+ } else { -+ b43_phy_maskset(dev, B43_NPHY_TXPCTL_CMD, -+ ~B43_NPHY_TXPCTL_CMD_INIT, - 0x64); -+ if (phy->rev > 1) -+ b43_phy_maskset(dev, -+ B43_NPHY_TXPCTL_INIT, -+ ~B43_NPHY_TXPCTL_INIT_PIDXI1, -+ 0x64); -+ } - } - - if (dev->phy.rev >= 3) { -@@ -3160,6 +3724,10 @@ static void b43_nphy_tx_power_ctrl(struc - } - } - -+ if (phy->rev >= 7) { -+ /* TODO */ -+ } -+ - if (dev->phy.rev >= 3) { - b43_phy_mask(dev, B43_NPHY_AFECTL_OVER1, ~0x100); - b43_phy_mask(dev, B43_NPHY_AFECTL_OVER, ~0x100); -@@ -3172,7 +3740,7 @@ static void b43_nphy_tx_power_ctrl(struc - else if (dev->phy.rev < 2) - b43_phy_maskset(dev, B43_NPHY_BPHY_CTL3, ~0xFF, 0x40); - -- if (dev->phy.rev < 2 && dev->phy.is_40mhz) -+ if (dev->phy.rev < 2 && b43_is_40mhz(dev)) - b43_hf_write(dev, b43_hf_read(dev) & ~B43_HF_TSSIRPSMW); - - if (b43_nphy_ipa(dev)) { -@@ -3188,18 +3756,20 @@ static void b43_nphy_tx_power_ctrl(struc - /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/TxPwrFix */ - static void b43_nphy_tx_power_fix(struct b43_wldev *dev) - { -+ struct b43_phy *phy = &dev->phy; - struct b43_phy_n *nphy = dev->phy.n; - struct ssb_sprom *sprom = dev->dev->bus_sprom; - - u8 txpi[2], bbmult, i; - u16 tmp, radio_gain, dac_gain; -- u16 freq = dev->phy.channel_freq; -+ u16 freq = phy->chandef->chan->center_freq; - u32 txgain; - /* u32 gaintbl; rev3+ */ - - if (nphy->hang_avoid) - b43_nphy_stay_in_carrier_search(dev, 1); - -+ /* TODO: rev19+ */ - if (dev->phy.rev >= 7) { - txpi[0] = txpi[1] = 30; - } else if (dev->phy.rev >= 3) { -@@ -3238,7 +3808,11 @@ static void b43_nphy_tx_power_fix(struct - */ - - for (i = 0; i < 2; i++) { -- txgain = *(b43_nphy_get_tx_gain_table(dev) + txpi[i]); -+ const u32 *table = b43_nphy_get_tx_gain_table(dev); -+ -+ if (!table) -+ break; -+ txgain = *(table + txpi[i]); - - if (dev->phy.rev >= 3) - radio_gain = (txgain >> 16) & 0x1FFFF; -@@ -3298,7 +3872,9 @@ static void b43_nphy_ipa_internal_tssi_s - u8 core; - u16 r; /* routing */ - -- if (phy->rev >= 7) { -+ if (phy->rev >= 19) { -+ /* TODO */ -+ } else if (phy->rev >= 7) { - for (core = 0; core < 2; core++) { - r = core ? 0x190 : 0x170; - if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) { -@@ -3381,29 +3957,38 @@ static void b43_nphy_tx_power_ctl_idle_t - u32 tmp; - s32 rssi[4] = { }; - -- /* TODO: check if we can transmit */ -+ if (phy->chandef->chan->flags & IEEE80211_CHAN_NO_IR) -+ return; - - if (b43_nphy_ipa(dev)) - b43_nphy_ipa_internal_tssi_setup(dev); - -- if (phy->rev >= 7) -- b43_nphy_rf_ctl_override_rev7(dev, 0x2000, 0, 3, false, 0); -+ if (phy->rev >= 19) -+ b43_nphy_rf_ctl_override_rev19(dev, 0x1000, 0, 3, false, 0); -+ else if (phy->rev >= 7) -+ b43_nphy_rf_ctl_override_rev7(dev, 0x1000, 0, 3, false, 0); - else if (phy->rev >= 3) - b43_nphy_rf_ctl_override(dev, 0x2000, 0, 3, false); - - b43_nphy_stop_playback(dev); -- b43_nphy_tx_tone(dev, 0xFA0, 0, false, false); -+ b43_nphy_tx_tone(dev, 4000, 0, false, false, false); - udelay(20); - tmp = b43_nphy_poll_rssi(dev, N_RSSI_TSSI_2G, rssi, 1); - b43_nphy_stop_playback(dev); -+ - b43_nphy_rssi_select(dev, 0, N_RSSI_W1); - -- if (phy->rev >= 7) -- b43_nphy_rf_ctl_override_rev7(dev, 0x2000, 0, 3, true, 0); -+ if (phy->rev >= 19) -+ b43_nphy_rf_ctl_override_rev19(dev, 0x1000, 0, 3, true, 0); -+ else if (phy->rev >= 7) -+ b43_nphy_rf_ctl_override_rev7(dev, 0x1000, 0, 3, true, 0); - else if (phy->rev >= 3) - b43_nphy_rf_ctl_override(dev, 0x2000, 0, 3, true); - -- if (phy->rev >= 3) { -+ if (phy->rev >= 19) { -+ /* TODO */ -+ return; -+ } else if (phy->rev >= 3) { - nphy->pwr_ctl_info[0].idle_tssi_5g = (tmp >> 24) & 0xFF; - nphy->pwr_ctl_info[1].idle_tssi_5g = (tmp >> 8) & 0xFF; - } else { -@@ -3443,21 +4028,21 @@ static void b43_nphy_tx_prepare_adjusted - delta = 0; - switch (stf_mode) { - case 0: -- if (dev->phy.is_40mhz && dev->phy.rev >= 5) { -+ if (b43_is_40mhz(dev) && dev->phy.rev >= 5) { - idx = 68; - } else { - delta = 1; -- idx = dev->phy.is_40mhz ? 52 : 4; -+ idx = b43_is_40mhz(dev) ? 52 : 4; - } - break; - case 1: -- idx = dev->phy.is_40mhz ? 76 : 28; -+ idx = b43_is_40mhz(dev) ? 76 : 28; - break; - case 2: -- idx = dev->phy.is_40mhz ? 84 : 36; -+ idx = b43_is_40mhz(dev) ? 84 : 36; - break; - case 3: -- idx = dev->phy.is_40mhz ? 92 : 44; -+ idx = b43_is_40mhz(dev) ? 92 : 44; - break; - } - -@@ -3478,6 +4063,7 @@ static void b43_nphy_tx_prepare_adjusted - /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/TxPwrCtrlSetup */ - static void b43_nphy_tx_power_ctl_setup(struct b43_wldev *dev) - { -+ struct b43_phy *phy = &dev->phy; - struct b43_phy_n *nphy = dev->phy.n; - struct ssb_sprom *sprom = dev->dev->bus_sprom; - -@@ -3487,7 +4073,7 @@ static void b43_nphy_tx_power_ctl_setup( - s32 num, den, pwr; - u32 regval[64]; - -- u16 freq = dev->phy.channel_freq; -+ u16 freq = phy->chandef->chan->center_freq; - u16 tmp; - u16 r; /* routing */ - u8 i, c; -@@ -3594,7 +4180,9 @@ static void b43_nphy_tx_power_ctl_setup( - udelay(1); - } - -- if (dev->phy.rev >= 7) { -+ if (phy->rev >= 19) { -+ /* TODO */ -+ } else if (phy->rev >= 7) { - b43_phy_maskset(dev, B43_NPHY_TXPCTL_CMD, - ~B43_NPHY_TXPCTL_CMD_INIT, 0x19); - b43_phy_maskset(dev, B43_NPHY_TXPCTL_INIT, -@@ -3651,27 +4239,36 @@ static void b43_nphy_tx_gain_table_uploa - int i; - - table = b43_nphy_get_tx_gain_table(dev); -+ if (!table) -+ return; -+ - b43_ntab_write_bulk(dev, B43_NTAB32(26, 192), 128, table); - b43_ntab_write_bulk(dev, B43_NTAB32(27, 192), 128, table); - -- if (phy->rev >= 3) { -+ if (phy->rev < 3) -+ return; -+ - #if 0 -- nphy->gmval = (table[0] >> 16) & 0x7000; -+ nphy->gmval = (table[0] >> 16) & 0x7000; - #endif - -- for (i = 0; i < 128; i++) { -+ for (i = 0; i < 128; i++) { -+ if (phy->rev >= 19) { -+ /* TODO */ -+ return; -+ } else if (phy->rev >= 7) { -+ /* TODO */ -+ return; -+ } else { - pga_gain = (table[i] >> 24) & 0xF; - if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) -- rfpwr_offset = -- b43_ntab_papd_pga_gain_delta_ipa_2g[pga_gain]; -+ rfpwr_offset = b43_ntab_papd_pga_gain_delta_ipa_2g[pga_gain]; - else -- rfpwr_offset = -- 0; /* FIXME */ -- b43_ntab_write(dev, B43_NTAB32(26, 576 + i), -- rfpwr_offset); -- b43_ntab_write(dev, B43_NTAB32(27, 576 + i), -- rfpwr_offset); -+ rfpwr_offset = 0; /* FIXME */ - } -+ -+ b43_ntab_write(dev, B43_NTAB32(26, 576 + i), rfpwr_offset); -+ b43_ntab_write(dev, B43_NTAB32(27, 576 + i), rfpwr_offset); - } - } - -@@ -3688,7 +4285,9 @@ static void b43_nphy_pa_override(struct - nphy->rfctrl_intc2_save = b43_phy_read(dev, - B43_NPHY_RFCTL_INTC2); - band = b43_current_band(dev->wl); -- if (dev->phy.rev >= 3) { -+ if (dev->phy.rev >= 7) { -+ tmp = 0x1480; -+ } else if (dev->phy.rev >= 3) { - if (band == IEEE80211_BAND_5GHZ) - tmp = 0x600; - else -@@ -3709,21 +4308,28 @@ static void b43_nphy_pa_override(struct - } - } - --/* http://bcm-v4.sipsolutions.net/802.11/PHY/N/TxLpFbw */ --static void b43_nphy_tx_lp_fbw(struct b43_wldev *dev) -+/* -+ * TX low-pass filter bandwidth setup -+ * http://bcm-v4.sipsolutions.net/802.11/PHY/N/TxLpFbw -+ */ -+static void b43_nphy_tx_lpf_bw(struct b43_wldev *dev) - { - u16 tmp; - -- if (dev->phy.rev >= 3) { -- if (b43_nphy_ipa(dev)) { -- tmp = 4; -- b43_phy_write(dev, B43_NPHY_TXF_40CO_B32S2, -- (((((tmp << 3) | tmp) << 3) | tmp) << 3) | tmp); -- } -+ if (dev->phy.rev < 3 || dev->phy.rev >= 7) -+ return; -+ -+ if (b43_nphy_ipa(dev)) -+ tmp = b43_is_40mhz(dev) ? 5 : 4; -+ else -+ tmp = b43_is_40mhz(dev) ? 3 : 1; -+ b43_phy_write(dev, B43_NPHY_TXF_40CO_B32S2, -+ (tmp << 9) | (tmp << 6) | (tmp << 3) | tmp); - -- tmp = 1; -+ if (b43_nphy_ipa(dev)) { -+ tmp = b43_is_40mhz(dev) ? 4 : 1; - b43_phy_write(dev, B43_NPHY_TXF_40CO_B1S2, -- (((((tmp << 3) | tmp) << 3) | tmp) << 3) | tmp); -+ (tmp << 9) | (tmp << 6) | (tmp << 3) | tmp); - } - } - -@@ -3996,7 +4602,7 @@ static void b43_nphy_spur_workaround(str - - if (nphy->gband_spurwar_en) { - /* TODO: N PHY Adjust Analog Pfbw (7) */ -- if (channel == 11 && dev->phy.is_40mhz) -+ if (channel == 11 && b43_is_40mhz(dev)) - ; /* TODO: N PHY Adjust Min Noise Var(2, tone, noise)*/ - else - ; /* TODO: N PHY Adjust Min Noise Var(0, NULL, NULL)*/ -@@ -4128,7 +4734,13 @@ static void b43_nphy_restore_rssi_cal(st - rssical_phy_regs = nphy->rssical_cache.rssical_phy_regs_5G; - } - -- if (dev->phy.rev >= 7) { -+ if (dev->phy.rev >= 19) { -+ /* TODO */ -+ } else if (dev->phy.rev >= 7) { -+ b43_radio_maskset(dev, R2057_NB_MASTER_CORE0, ~R2057_VCM_MASK, -+ rssical_radio_regs[0]); -+ b43_radio_maskset(dev, R2057_NB_MASTER_CORE1, ~R2057_VCM_MASK, -+ rssical_radio_regs[1]); - } else { - b43_radio_maskset(dev, B2056_RX0 | B2056_RX_RSSI_MISC, 0xE3, - rssical_radio_regs[0]); -@@ -4152,15 +4764,78 @@ static void b43_nphy_restore_rssi_cal(st - b43_phy_write(dev, B43_NPHY_RSSIMC_1Q_RSSI_Y, rssical_phy_regs[11]); - } - -+static void b43_nphy_tx_cal_radio_setup_rev19(struct b43_wldev *dev) -+{ -+ /* TODO */ -+} -+ -+static void b43_nphy_tx_cal_radio_setup_rev7(struct b43_wldev *dev) -+{ -+ struct b43_phy *phy = &dev->phy; -+ struct b43_phy_n *nphy = dev->phy.n; -+ u16 *save = nphy->tx_rx_cal_radio_saveregs; -+ int core, off; -+ u16 r, tmp; -+ -+ for (core = 0; core < 2; core++) { -+ r = core ? 0x20 : 0; -+ off = core * 11; -+ -+ save[off + 0] = b43_radio_read(dev, r + R2057_TX0_TX_SSI_MASTER); -+ save[off + 1] = b43_radio_read(dev, r + R2057_TX0_IQCAL_VCM_HG); -+ save[off + 2] = b43_radio_read(dev, r + R2057_TX0_IQCAL_IDAC); -+ save[off + 3] = b43_radio_read(dev, r + R2057_TX0_TSSI_VCM); -+ save[off + 4] = 0; -+ save[off + 5] = b43_radio_read(dev, r + R2057_TX0_TX_SSI_MUX); -+ if (phy->radio_rev != 5) -+ save[off + 6] = b43_radio_read(dev, r + R2057_TX0_TSSIA); -+ save[off + 7] = b43_radio_read(dev, r + R2057_TX0_TSSIG); -+ save[off + 8] = b43_radio_read(dev, r + R2057_TX0_TSSI_MISC1); -+ -+ if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) { -+ b43_radio_write(dev, r + R2057_TX0_TX_SSI_MASTER, 0xA); -+ b43_radio_write(dev, r + R2057_TX0_IQCAL_VCM_HG, 0x43); -+ b43_radio_write(dev, r + R2057_TX0_IQCAL_IDAC, 0x55); -+ b43_radio_write(dev, r + R2057_TX0_TSSI_VCM, 0); -+ b43_radio_write(dev, r + R2057_TX0_TSSIG, 0); -+ if (nphy->use_int_tx_iq_lo_cal) { -+ b43_radio_write(dev, r + R2057_TX0_TX_SSI_MUX, 0x4); -+ tmp = true ? 0x31 : 0x21; /* TODO */ -+ b43_radio_write(dev, r + R2057_TX0_TSSIA, tmp); -+ } -+ b43_radio_write(dev, r + R2057_TX0_TSSI_MISC1, 0x00); -+ } else { -+ b43_radio_write(dev, r + R2057_TX0_TX_SSI_MASTER, 0x6); -+ b43_radio_write(dev, r + R2057_TX0_IQCAL_VCM_HG, 0x43); -+ b43_radio_write(dev, r + R2057_TX0_IQCAL_IDAC, 0x55); -+ b43_radio_write(dev, r + R2057_TX0_TSSI_VCM, 0); -+ -+ if (phy->radio_rev != 5) -+ b43_radio_write(dev, r + R2057_TX0_TSSIA, 0); -+ if (nphy->use_int_tx_iq_lo_cal) { -+ b43_radio_write(dev, r + R2057_TX0_TX_SSI_MUX, 0x6); -+ tmp = true ? 0x31 : 0x21; /* TODO */ -+ b43_radio_write(dev, r + R2057_TX0_TSSIG, tmp); -+ } -+ b43_radio_write(dev, r + R2057_TX0_TSSI_MISC1, 0); -+ } -+ } -+} -+ - /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/TxCalRadioSetup */ - static void b43_nphy_tx_cal_radio_setup(struct b43_wldev *dev) - { -+ struct b43_phy *phy = &dev->phy; - struct b43_phy_n *nphy = dev->phy.n; - u16 *save = nphy->tx_rx_cal_radio_saveregs; - u16 tmp; - u8 offset, i; - -- if (dev->phy.rev >= 3) { -+ if (phy->rev >= 19) { -+ b43_nphy_tx_cal_radio_setup_rev19(dev); -+ } else if (phy->rev >= 7) { -+ b43_nphy_tx_cal_radio_setup_rev7(dev); -+ } else if (phy->rev >= 3) { - for (i = 0; i < 2; i++) { - tmp = (i == 0) ? 0x2000 : 0x3000; - offset = i * 11; -@@ -4269,41 +4944,62 @@ static void b43_nphy_update_tx_cal_ladde - } - } - -+static void b43_nphy_pa_set_tx_dig_filter(struct b43_wldev *dev, u16 offset, -+ const s16 *filter) -+{ -+ int i; -+ -+ offset = B43_PHY_N(offset); -+ -+ for (i = 0; i < 15; i++, offset++) -+ b43_phy_write(dev, offset, filter[i]); -+} -+ - /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/ExtPaSetTxDigiFilts */ - static void b43_nphy_ext_pa_set_tx_dig_filters(struct b43_wldev *dev) - { -- int i; -- for (i = 0; i < 15; i++) -- b43_phy_write(dev, B43_PHY_N(0x2C5 + i), -- tbl_tx_filter_coef_rev4[2][i]); -+ b43_nphy_pa_set_tx_dig_filter(dev, 0x2C5, -+ tbl_tx_filter_coef_rev4[2]); - } - - /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/IpaSetTxDigiFilts */ - static void b43_nphy_int_pa_set_tx_dig_filters(struct b43_wldev *dev) - { -- int i, j; - /* B43_NPHY_TXF_20CO_S0A1, B43_NPHY_TXF_40CO_S0A1, unknown */ - static const u16 offset[] = { 0x186, 0x195, 0x2C5 }; -+ static const s16 dig_filter_phy_rev16[] = { -+ -375, 136, -407, 208, -1527, -+ 956, 93, 186, 93, 230, -+ -44, 230, 201, -191, 201, -+ }; -+ int i; - - for (i = 0; i < 3; i++) -- for (j = 0; j < 15; j++) -- b43_phy_write(dev, B43_PHY_N(offset[i] + j), -- tbl_tx_filter_coef_rev4[i][j]); -- -- if (dev->phy.is_40mhz) { -- for (j = 0; j < 15; j++) -- b43_phy_write(dev, B43_PHY_N(offset[0] + j), -- tbl_tx_filter_coef_rev4[3][j]); -- } else if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) { -- for (j = 0; j < 15; j++) -- b43_phy_write(dev, B43_PHY_N(offset[0] + j), -- tbl_tx_filter_coef_rev4[5][j]); -- } -- -- if (dev->phy.channel == 14) -- for (j = 0; j < 15; j++) -- b43_phy_write(dev, B43_PHY_N(offset[0] + j), -- tbl_tx_filter_coef_rev4[6][j]); -+ b43_nphy_pa_set_tx_dig_filter(dev, offset[i], -+ tbl_tx_filter_coef_rev4[i]); -+ -+ /* Verified with BCM43227 and BCM43228 */ -+ if (dev->phy.rev == 16) -+ b43_nphy_pa_set_tx_dig_filter(dev, 0x186, dig_filter_phy_rev16); -+ -+ /* Verified with BCM43131 and BCM43217 */ -+ if (dev->phy.rev == 17) { -+ b43_nphy_pa_set_tx_dig_filter(dev, 0x186, dig_filter_phy_rev16); -+ b43_nphy_pa_set_tx_dig_filter(dev, 0x195, -+ tbl_tx_filter_coef_rev4[1]); -+ } -+ -+ if (b43_is_40mhz(dev)) { -+ b43_nphy_pa_set_tx_dig_filter(dev, 0x186, -+ tbl_tx_filter_coef_rev4[3]); -+ } else { -+ if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) -+ b43_nphy_pa_set_tx_dig_filter(dev, 0x186, -+ tbl_tx_filter_coef_rev4[5]); -+ if (dev->phy.channel == 14) -+ b43_nphy_pa_set_tx_dig_filter(dev, 0x186, -+ tbl_tx_filter_coef_rev4[6]); -+ } - } - - /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/GetTxGain */ -@@ -4325,7 +5021,13 @@ static struct nphy_txgains b43_nphy_get_ - b43_nphy_stay_in_carrier_search(dev, false); - - for (i = 0; i < 2; ++i) { -- if (dev->phy.rev >= 3) { -+ if (dev->phy.rev >= 7) { -+ target.ipa[i] = curr_gain[i] & 0x0007; -+ target.pad[i] = (curr_gain[i] & 0x00F8) >> 3; -+ target.pga[i] = (curr_gain[i] & 0x0F00) >> 8; -+ target.txgm[i] = (curr_gain[i] & 0x7000) >> 12; -+ target.tx_lpf[i] = (curr_gain[i] & 0x8000) >> 15; -+ } else if (dev->phy.rev >= 3) { - target.ipa[i] = curr_gain[i] & 0x000F; - target.pad[i] = (curr_gain[i] & 0x00F0) >> 4; - target.pga[i] = (curr_gain[i] & 0x0F00) >> 8; -@@ -4349,7 +5051,16 @@ static struct nphy_txgains b43_nphy_get_ - - for (i = 0; i < 2; ++i) { - table = b43_nphy_get_tx_gain_table(dev); -- if (dev->phy.rev >= 3) { -+ if (!table) -+ break; -+ -+ if (dev->phy.rev >= 7) { -+ target.ipa[i] = (table[index[i]] >> 16) & 0x7; -+ target.pad[i] = (table[index[i]] >> 19) & 0x1F; -+ target.pga[i] = (table[index[i]] >> 24) & 0xF; -+ target.txgm[i] = (table[index[i]] >> 28) & 0x7; -+ target.tx_lpf[i] = (table[index[i]] >> 31) & 0x1; -+ } else if (dev->phy.rev >= 3) { - target.ipa[i] = (table[index[i]] >> 16) & 0xF; - target.pad[i] = (table[index[i]] >> 20) & 0xF; - target.pga[i] = (table[index[i]] >> 24) & 0xF; -@@ -4398,6 +5109,8 @@ static void b43_nphy_tx_cal_phy_cleanup( - /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/TxCalPhySetup */ - static void b43_nphy_tx_cal_phy_setup(struct b43_wldev *dev) - { -+ struct b43_phy *phy = &dev->phy; -+ struct b43_phy_n *nphy = dev->phy.n; - u16 *regs = dev->phy.n->tx_rx_cal_phy_saveregs; - u16 tmp; - -@@ -4429,7 +5142,12 @@ static void b43_nphy_tx_cal_phy_setup(st - regs[7] = b43_phy_read(dev, B43_NPHY_RFCTL_INTC1); - regs[8] = b43_phy_read(dev, B43_NPHY_RFCTL_INTC2); - -- b43_nphy_rf_ctl_intc_override(dev, N_INTC_OVERRIDE_PA, 1, 3); -+ if (!nphy->use_int_tx_iq_lo_cal) -+ b43_nphy_rf_ctl_intc_override(dev, N_INTC_OVERRIDE_PA, -+ 1, 3); -+ else -+ b43_nphy_rf_ctl_intc_override(dev, N_INTC_OVERRIDE_PA, -+ 0, 3); - b43_nphy_rf_ctl_intc_override(dev, N_INTC_OVERRIDE_TRSW, 2, 1); - b43_nphy_rf_ctl_intc_override(dev, N_INTC_OVERRIDE_TRSW, 8, 2); - -@@ -4437,6 +5155,33 @@ static void b43_nphy_tx_cal_phy_setup(st - regs[10] = b43_phy_read(dev, B43_NPHY_PAPD_EN1); - b43_phy_mask(dev, B43_NPHY_PAPD_EN0, ~0x0001); - b43_phy_mask(dev, B43_NPHY_PAPD_EN1, ~0x0001); -+ -+ tmp = b43_nphy_read_lpf_ctl(dev, 0); -+ if (phy->rev >= 19) -+ b43_nphy_rf_ctl_override_rev19(dev, 0x80, tmp, 0, false, -+ 1); -+ else if (phy->rev >= 7) -+ b43_nphy_rf_ctl_override_rev7(dev, 0x80, tmp, 0, false, -+ 1); -+ -+ if (nphy->use_int_tx_iq_lo_cal && true /* FIXME */) { -+ if (phy->rev >= 19) { -+ b43_nphy_rf_ctl_override_rev19(dev, 0x8, 0, 0x3, -+ false, 0); -+ } else if (phy->rev >= 8) { -+ b43_nphy_rf_ctl_override_rev7(dev, 0x8, 0, 0x3, -+ false, 0); -+ } else if (phy->rev == 7) { -+ b43_radio_maskset(dev, R2057_OVR_REG0, 1 << 4, 1 << 4); -+ if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) { -+ b43_radio_maskset(dev, R2057_PAD2G_TUNE_PUS_CORE0, ~1, 0); -+ b43_radio_maskset(dev, R2057_PAD2G_TUNE_PUS_CORE1, ~1, 0); -+ } else { -+ b43_radio_maskset(dev, R2057_IPA5G_CASCOFFV_PU_CORE0, ~1, 0); -+ b43_radio_maskset(dev, R2057_IPA5G_CASCOFFV_PU_CORE1, ~1, 0); -+ } -+ } -+ } - } else { - b43_phy_maskset(dev, B43_NPHY_AFECTL_C1, 0x0FFF, 0xA000); - b43_phy_maskset(dev, B43_NPHY_AFECTL_C2, 0x0FFF, 0xA000); -@@ -4465,6 +5210,7 @@ static void b43_nphy_tx_cal_phy_setup(st - /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/SaveCal */ - static void b43_nphy_save_cal(struct b43_wldev *dev) - { -+ struct b43_phy *phy = &dev->phy; - struct b43_phy_n *nphy = dev->phy.n; - - struct b43_phy_n_iq_comp *rxcal_coeffs = NULL; -@@ -4489,7 +5235,26 @@ static void b43_nphy_save_cal(struct b43 - - b43_nphy_rx_iq_coeffs(dev, false, rxcal_coeffs); - /* TODO use some definitions */ -- if (dev->phy.rev >= 3) { -+ if (phy->rev >= 19) { -+ /* TODO */ -+ } else if (phy->rev >= 7) { -+ txcal_radio_regs[0] = b43_radio_read(dev, -+ R2057_TX0_LOFT_FINE_I); -+ txcal_radio_regs[1] = b43_radio_read(dev, -+ R2057_TX0_LOFT_FINE_Q); -+ txcal_radio_regs[4] = b43_radio_read(dev, -+ R2057_TX0_LOFT_COARSE_I); -+ txcal_radio_regs[5] = b43_radio_read(dev, -+ R2057_TX0_LOFT_COARSE_Q); -+ txcal_radio_regs[2] = b43_radio_read(dev, -+ R2057_TX1_LOFT_FINE_I); -+ txcal_radio_regs[3] = b43_radio_read(dev, -+ R2057_TX1_LOFT_FINE_Q); -+ txcal_radio_regs[6] = b43_radio_read(dev, -+ R2057_TX1_LOFT_COARSE_I); -+ txcal_radio_regs[7] = b43_radio_read(dev, -+ R2057_TX1_LOFT_COARSE_Q); -+ } else if (phy->rev >= 3) { - txcal_radio_regs[0] = b43_radio_read(dev, 0x2021); - txcal_radio_regs[1] = b43_radio_read(dev, 0x2022); - txcal_radio_regs[2] = b43_radio_read(dev, 0x3021); -@@ -4504,8 +5269,9 @@ static void b43_nphy_save_cal(struct b43 - txcal_radio_regs[2] = b43_radio_read(dev, 0x8D); - txcal_radio_regs[3] = b43_radio_read(dev, 0xBC); - } -- iqcal_chanspec->center_freq = dev->phy.channel_freq; -- iqcal_chanspec->channel_type = dev->phy.channel_type; -+ iqcal_chanspec->center_freq = dev->phy.chandef->chan->center_freq; -+ iqcal_chanspec->channel_type = -+ cfg80211_get_chandef_type(dev->phy.chandef); - b43_ntab_read_bulk(dev, B43_NTAB16(15, 80), 8, table); - - if (nphy->hang_avoid) -@@ -4515,6 +5281,7 @@ static void b43_nphy_save_cal(struct b43 - /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RestoreCal */ - static void b43_nphy_restore_cal(struct b43_wldev *dev) - { -+ struct b43_phy *phy = &dev->phy; - struct b43_phy_n *nphy = dev->phy.n; - - u16 coef[4]; -@@ -4562,7 +5329,26 @@ static void b43_nphy_restore_cal(struct - } - - /* TODO use some definitions */ -- if (dev->phy.rev >= 3) { -+ if (phy->rev >= 19) { -+ /* TODO */ -+ } else if (phy->rev >= 7) { -+ b43_radio_write(dev, R2057_TX0_LOFT_FINE_I, -+ txcal_radio_regs[0]); -+ b43_radio_write(dev, R2057_TX0_LOFT_FINE_Q, -+ txcal_radio_regs[1]); -+ b43_radio_write(dev, R2057_TX0_LOFT_COARSE_I, -+ txcal_radio_regs[4]); -+ b43_radio_write(dev, R2057_TX0_LOFT_COARSE_Q, -+ txcal_radio_regs[5]); -+ b43_radio_write(dev, R2057_TX1_LOFT_FINE_I, -+ txcal_radio_regs[2]); -+ b43_radio_write(dev, R2057_TX1_LOFT_FINE_Q, -+ txcal_radio_regs[3]); -+ b43_radio_write(dev, R2057_TX1_LOFT_COARSE_I, -+ txcal_radio_regs[6]); -+ b43_radio_write(dev, R2057_TX1_LOFT_COARSE_Q, -+ txcal_radio_regs[7]); -+ } else if (phy->rev >= 3) { - b43_radio_write(dev, 0x2021, txcal_radio_regs[0]); - b43_radio_write(dev, 0x2022, txcal_radio_regs[1]); - b43_radio_write(dev, 0x3021, txcal_radio_regs[2]); -@@ -4585,6 +5371,7 @@ static int b43_nphy_cal_tx_iq_lo(struct - struct nphy_txgains target, - bool full, bool mphase) - { -+ struct b43_phy *phy = &dev->phy; - struct b43_phy_n *nphy = dev->phy.n; - int i; - int error = 0; -@@ -4625,7 +5412,7 @@ static int b43_nphy_cal_tx_iq_lo(struct - (dev->phy.rev == 5 && nphy->ipa2g_on && - b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ); - if (phy6or5x) { -- if (dev->phy.is_40mhz) { -+ if (b43_is_40mhz(dev)) { - b43_ntab_write_bulk(dev, B43_NTAB16(15, 0), 18, - tbl_tx_iqlo_cal_loft_ladder_40); - b43_ntab_write_bulk(dev, B43_NTAB16(15, 32), 18, -@@ -4638,18 +5425,24 @@ static int b43_nphy_cal_tx_iq_lo(struct - } - } - -- b43_phy_write(dev, B43_NPHY_IQLOCAL_CMDGCTL, 0x8AA9); -+ if (phy->rev >= 19) { -+ /* TODO */ -+ } else if (phy->rev >= 7) { -+ b43_phy_write(dev, B43_NPHY_IQLOCAL_CMDGCTL, 0x8AD9); -+ } else { -+ b43_phy_write(dev, B43_NPHY_IQLOCAL_CMDGCTL, 0x8AA9); -+ } - -- if (!dev->phy.is_40mhz) -+ if (!b43_is_40mhz(dev)) - freq = 2500; - else - freq = 5000; - - if (nphy->mphase_cal_phase_id > 2) -- b43_nphy_run_samples(dev, (dev->phy.is_40mhz ? 40 : 20) * 8, -- 0xFFFF, 0, true, false); -+ b43_nphy_run_samples(dev, (b43_is_40mhz(dev) ? 40 : 20) * 8, -+ 0xFFFF, 0, true, false, false); - else -- error = b43_nphy_tx_tone(dev, freq, 250, true, false); -+ error = b43_nphy_tx_tone(dev, freq, 250, true, false, false); - - if (error == 0) { - if (nphy->mphase_cal_phase_id > 2) { -@@ -4777,9 +5570,9 @@ static int b43_nphy_cal_tx_iq_lo(struct - nphy->txiqlocal_bestc); - nphy->txiqlocal_coeffsvalid = true; - nphy->txiqlocal_chanspec.center_freq = -- dev->phy.channel_freq; -+ phy->chandef->chan->center_freq; - nphy->txiqlocal_chanspec.channel_type = -- dev->phy.channel_type; -+ cfg80211_get_chandef_type(phy->chandef); - } else { - length = 11; - if (dev->phy.rev < 3) -@@ -4815,8 +5608,8 @@ static void b43_nphy_reapply_tx_cal_coef - bool equal = true; - - if (!nphy->txiqlocal_coeffsvalid || -- nphy->txiqlocal_chanspec.center_freq != dev->phy.channel_freq || -- nphy->txiqlocal_chanspec.channel_type != dev->phy.channel_type) -+ nphy->txiqlocal_chanspec.center_freq != dev->phy.chandef->chan->center_freq || -+ nphy->txiqlocal_chanspec.channel_type != cfg80211_get_chandef_type(dev->phy.chandef)) - return; - - b43_ntab_read_bulk(dev, B43_NTAB16(15, 80), 7, buffer); -@@ -4972,11 +5765,11 @@ static int b43_nphy_rev2_cal_rx_iq(struc - if (playtone) { - ret = b43_nphy_tx_tone(dev, 4000, - (nphy->rxcalparams & 0xFFFF), -- false, false); -+ false, false, true); - playtone = false; - } else { -- b43_nphy_run_samples(dev, 160, 0xFFFF, 0, -- false, false); -+ b43_nphy_run_samples(dev, 160, 0xFFFF, 0, false, -+ false, true); - } - - if (ret == 0) { -@@ -5032,6 +5825,9 @@ static int b43_nphy_rev3_cal_rx_iq(struc - static int b43_nphy_cal_rx_iq(struct b43_wldev *dev, - struct nphy_txgains target, u8 type, bool debug) - { -+ if (dev->phy.rev >= 7) -+ type = 0; -+ - if (dev->phy.rev >= 3) - return b43_nphy_rev3_cal_rx_iq(dev, target, type, debug); - else -@@ -5118,6 +5914,9 @@ static void b43_nphy_bphy_init(struct b4 - /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/SuperSwitchInit */ - static void b43_nphy_superswitch_init(struct b43_wldev *dev, bool init) - { -+ if (dev->phy.rev >= 7) -+ return; -+ - if (dev->phy.rev >= 3) { - if (!init) - return; -@@ -5193,6 +5992,10 @@ static int b43_phy_initn(struct b43_wlde - #endif - } - } -+ nphy->use_int_tx_iq_lo_cal = b43_nphy_ipa(dev) || -+ phy->rev >= 7 || -+ (phy->rev >= 5 && -+ sprom->boardflags2_hi & B43_BFH2_INTERNDET_TXIQCAL); - nphy->deaf_count = 0; - b43_nphy_tables_init(dev); - nphy->crsminpwr_adjusted = false; -@@ -5202,6 +6005,16 @@ static int b43_phy_initn(struct b43_wlde - if (dev->phy.rev >= 3) { - b43_phy_write(dev, B43_NPHY_TXF_40CO_B1S1, 0); - b43_phy_write(dev, B43_NPHY_RFCTL_OVER, 0); -+ if (phy->rev >= 7) { -+ b43_phy_write(dev, B43_NPHY_REV7_RF_CTL_OVER3, 0); -+ b43_phy_write(dev, B43_NPHY_REV7_RF_CTL_OVER4, 0); -+ b43_phy_write(dev, B43_NPHY_REV7_RF_CTL_OVER5, 0); -+ b43_phy_write(dev, B43_NPHY_REV7_RF_CTL_OVER6, 0); -+ } -+ if (phy->rev >= 19) { -+ /* TODO */ -+ } -+ - b43_phy_write(dev, B43_NPHY_TXF_40CO_B1S0, 0); - b43_phy_write(dev, B43_NPHY_TXF_40CO_B32S1, 0); - } else { -@@ -5239,7 +6052,9 @@ static int b43_phy_initn(struct b43_wlde - b43_phy_write(dev, B43_NPHY_PLOAD_CSENSE_EXTLEN, 0x50); - b43_phy_write(dev, B43_NPHY_TXRIFS_FRDEL, 0x30); - -- b43_nphy_update_mimo_config(dev, nphy->preamble_override); -+ if (phy->rev < 8) -+ b43_nphy_update_mimo_config(dev, nphy->preamble_override); -+ - b43_nphy_update_txrx_chain(dev); - - if (phy->rev < 2) { -@@ -5271,10 +6086,12 @@ static int b43_phy_initn(struct b43_wlde - - b43_mac_phy_clock_set(dev, true); - -- b43_nphy_pa_override(dev, false); -- b43_nphy_force_rf_sequence(dev, B43_RFSEQ_RX2TX); -- b43_nphy_force_rf_sequence(dev, B43_RFSEQ_RESET2RX); -- b43_nphy_pa_override(dev, true); -+ if (phy->rev < 7) { -+ b43_nphy_pa_override(dev, false); -+ b43_nphy_force_rf_sequence(dev, B43_RFSEQ_RX2TX); -+ b43_nphy_force_rf_sequence(dev, B43_RFSEQ_RESET2RX); -+ b43_nphy_pa_override(dev, true); -+ } - - b43_nphy_classifier(dev, 0, 0); - b43_nphy_read_clip_detection(dev, clip); -@@ -5348,7 +6165,7 @@ static int b43_phy_initn(struct b43_wlde - b43_phy_write(dev, B43_NPHY_TXMACDELAY, 0x0320); - if (phy->rev >= 3 && phy->rev <= 6) - b43_phy_write(dev, B43_NPHY_PLOAD_CSENSE_EXTLEN, 0x0032); -- b43_nphy_tx_lp_fbw(dev); -+ b43_nphy_tx_lpf_bw(dev); - if (phy->rev >= 3) - b43_nphy_spur_workaround(dev); - -@@ -5397,23 +6214,23 @@ static void b43_nphy_channel_setup(struc - struct b43_phy *phy = &dev->phy; - struct b43_phy_n *nphy = dev->phy.n; - int ch = new_channel->hw_value; -- -- u16 old_band_5ghz; - u16 tmp16; - -- old_band_5ghz = -- b43_phy_read(dev, B43_NPHY_BANDCTL) & B43_NPHY_BANDCTL_5GHZ; -- if (new_channel->band == IEEE80211_BAND_5GHZ && !old_band_5ghz) { -+ if (new_channel->band == IEEE80211_BAND_5GHZ) { - tmp16 = b43_read16(dev, B43_MMIO_PSM_PHY_HDR); - b43_write16(dev, B43_MMIO_PSM_PHY_HDR, tmp16 | 4); -- b43_phy_set(dev, B43_PHY_B_BBCFG, 0xC000); -+ /* Put BPHY in the reset */ -+ b43_phy_set(dev, B43_PHY_B_BBCFG, -+ B43_PHY_B_BBCFG_RSTCCA | B43_PHY_B_BBCFG_RSTRX); - b43_write16(dev, B43_MMIO_PSM_PHY_HDR, tmp16); - b43_phy_set(dev, B43_NPHY_BANDCTL, B43_NPHY_BANDCTL_5GHZ); -- } else if (new_channel->band == IEEE80211_BAND_2GHZ && old_band_5ghz) { -+ } else if (new_channel->band == IEEE80211_BAND_2GHZ) { - b43_phy_mask(dev, B43_NPHY_BANDCTL, ~B43_NPHY_BANDCTL_5GHZ); - tmp16 = b43_read16(dev, B43_MMIO_PSM_PHY_HDR); - b43_write16(dev, B43_MMIO_PSM_PHY_HDR, tmp16 | 4); -- b43_phy_mask(dev, B43_PHY_B_BBCFG, 0x3FFF); -+ /* Take BPHY out of the reset */ -+ b43_phy_mask(dev, B43_PHY_B_BBCFG, -+ (u16)~(B43_PHY_B_BBCFG_RSTCCA | B43_PHY_B_BBCFG_RSTRX)); - b43_write16(dev, B43_MMIO_PSM_PHY_HDR, tmp16); - } - -@@ -5434,35 +6251,49 @@ static void b43_nphy_channel_setup(struc - if (dev->phy.rev < 3) - b43_nphy_adjust_lna_gain_table(dev); - -- b43_nphy_tx_lp_fbw(dev); -+ b43_nphy_tx_lpf_bw(dev); - - if (dev->phy.rev >= 3 && - dev->phy.n->spur_avoid != B43_SPUR_AVOID_DISABLE) { -- bool avoid = false; -+ u8 spuravoid = 0; -+ - if (dev->phy.n->spur_avoid == B43_SPUR_AVOID_FORCE) { -- avoid = true; -- } else if (!b43_channel_type_is_40mhz(phy->channel_type)) { -- if ((ch >= 5 && ch <= 8) || ch == 13 || ch == 14) -- avoid = true; -- } else { /* 40MHz */ -- if (nphy->aband_spurwar_en && -- (ch == 38 || ch == 102 || ch == 118)) -- avoid = dev->dev->chip_id == 0x4716; -- } -- -- b43_nphy_pmu_spur_avoid(dev, avoid); -- -- if (dev->dev->chip_id == 43222 || dev->dev->chip_id == 43224 || -- dev->dev->chip_id == 43225) { -- b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, -- avoid ? 0x5341 : 0x8889); -- b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0x8); -+ spuravoid = 1; -+ } else if (phy->rev >= 19) { -+ /* TODO */ -+ } else if (phy->rev >= 18) { -+ /* TODO */ -+ } else if (phy->rev >= 17) { -+ /* TODO: Off for channels 1-11, but check 12-14! */ -+ } else if (phy->rev >= 16) { -+ /* TODO: Off for 2 GHz, but check 5 GHz! */ -+ } else if (phy->rev >= 7) { -+ if (!b43_is_40mhz(dev)) { /* 20MHz */ -+ if (ch == 13 || ch == 14 || ch == 153) -+ spuravoid = 1; -+ } else { /* 40 MHz */ -+ if (ch == 54) -+ spuravoid = 1; -+ } -+ } else { -+ if (!b43_is_40mhz(dev)) { /* 20MHz */ -+ if ((ch >= 5 && ch <= 8) || ch == 13 || ch == 14) -+ spuravoid = 1; -+ } else { /* 40MHz */ -+ if (nphy->aband_spurwar_en && -+ (ch == 38 || ch == 102 || ch == 118)) -+ spuravoid = dev->dev->chip_id == 0x4716; -+ } - } - -+ b43_nphy_pmu_spur_avoid(dev, spuravoid); -+ -+ b43_mac_switch_freq(dev, spuravoid); -+ - if (dev->phy.rev == 3 || dev->phy.rev == 4) - ; /* TODO: reset PLL */ - -- if (avoid) -+ if (spuravoid) - b43_phy_set(dev, B43_NPHY_BBCFG, B43_NPHY_BBCFG_RSTRX); - else - b43_phy_mask(dev, B43_NPHY_BBCFG, -@@ -5488,10 +6319,20 @@ static int b43_nphy_set_channel(struct b - - const struct b43_nphy_channeltab_entry_rev2 *tabent_r2 = NULL; - const struct b43_nphy_channeltab_entry_rev3 *tabent_r3 = NULL; -+ const struct b43_nphy_chantabent_rev7 *tabent_r7 = NULL; -+ const struct b43_nphy_chantabent_rev7_2g *tabent_r7_2g = NULL; - - u8 tmp; - -- if (dev->phy.rev >= 3) { -+ if (phy->rev >= 19) { -+ return -ESRCH; -+ /* TODO */ -+ } else if (phy->rev >= 7) { -+ r2057_get_chantabent_rev7(dev, channel->center_freq, -+ &tabent_r7, &tabent_r7_2g); -+ if (!tabent_r7 && !tabent_r7_2g) -+ return -ESRCH; -+ } else if (phy->rev >= 3) { - tabent_r3 = b43_nphy_get_chantabent_rev3(dev, - channel->center_freq); - if (!tabent_r3) -@@ -5506,20 +6347,38 @@ static int b43_nphy_set_channel(struct b - /* Channel is set later in common code, but we need to set it on our - own to let this function's subcalls work properly. */ - phy->channel = channel->hw_value; -- phy->channel_freq = channel->center_freq; - -+#if 0 - if (b43_channel_type_is_40mhz(phy->channel_type) != - b43_channel_type_is_40mhz(channel_type)) - ; /* TODO: BMAC BW Set (channel_type) */ -+#endif - -- if (channel_type == NL80211_CHAN_HT40PLUS) -- b43_phy_set(dev, B43_NPHY_RXCTL, -- B43_NPHY_RXCTL_BSELU20); -- else if (channel_type == NL80211_CHAN_HT40MINUS) -- b43_phy_mask(dev, B43_NPHY_RXCTL, -- ~B43_NPHY_RXCTL_BSELU20); -+ if (channel_type == NL80211_CHAN_HT40PLUS) { -+ b43_phy_set(dev, B43_NPHY_RXCTL, B43_NPHY_RXCTL_BSELU20); -+ if (phy->rev >= 7) -+ b43_phy_set(dev, 0x310, 0x8000); -+ } else if (channel_type == NL80211_CHAN_HT40MINUS) { -+ b43_phy_mask(dev, B43_NPHY_RXCTL, ~B43_NPHY_RXCTL_BSELU20); -+ if (phy->rev >= 7) -+ b43_phy_mask(dev, 0x310, (u16)~0x8000); -+ } - -- if (dev->phy.rev >= 3) { -+ if (phy->rev >= 19) { -+ /* TODO */ -+ } else if (phy->rev >= 7) { -+ const struct b43_phy_n_sfo_cfg *phy_regs = tabent_r7 ? -+ &(tabent_r7->phy_regs) : &(tabent_r7_2g->phy_regs); -+ -+ if (phy->radio_rev <= 4 || phy->radio_rev == 6) { -+ tmp = (channel->band == IEEE80211_BAND_5GHZ) ? 2 : 0; -+ b43_radio_maskset(dev, R2057_TIA_CONFIG_CORE0, ~2, tmp); -+ b43_radio_maskset(dev, R2057_TIA_CONFIG_CORE1, ~2, tmp); -+ } -+ -+ b43_radio_2057_setup(dev, tabent_r7, tabent_r7_2g); -+ b43_nphy_channel_setup(dev, phy_regs, channel); -+ } else if (phy->rev >= 3) { - tmp = (channel->band == IEEE80211_BAND_5GHZ) ? 4 : 0; - b43_radio_maskset(dev, 0x08, 0xFFFB, tmp); - b43_radio_2056_setup(dev, tabent_r3); -@@ -5561,7 +6420,6 @@ static void b43_nphy_op_prepare_structs( - nphy->hang_avoid = (phy->rev == 3 || phy->rev == 4); - nphy->spur_avoid = (phy->rev >= 3) ? - B43_SPUR_AVOID_AUTO : B43_SPUR_AVOID_DISABLE; -- nphy->init_por = true; - nphy->gain_boost = true; /* this way we follow wl, assume it is true */ - nphy->txrx_chain = 2; /* sth different than 0 and 1 for now */ - nphy->phyrxchain = 3; /* to avoid b43_nphy_set_rx_core_state like wl */ -@@ -5602,8 +6460,6 @@ static void b43_nphy_op_prepare_structs( - nphy->ipa2g_on = sprom->fem.ghz2.extpa_gain == 2; - nphy->ipa5g_on = sprom->fem.ghz5.extpa_gain == 2; - } -- -- nphy->init_por = true; - } - - static void b43_nphy_op_free(struct b43_wldev *dev) -@@ -5663,7 +6519,7 @@ static void b43_nphy_op_maskset(struct b - static u16 b43_nphy_op_radio_read(struct b43_wldev *dev, u16 reg) - { - /* Register 1 is a 32-bit register. */ -- B43_WARN_ON(reg == 1); -+ B43_WARN_ON(dev->phy.rev < 7 && reg == 1); - - if (dev->phy.rev >= 7) - reg |= 0x200; /* Radio 0x2057 */ -@@ -5677,7 +6533,7 @@ static u16 b43_nphy_op_radio_read(struct - static void b43_nphy_op_radio_write(struct b43_wldev *dev, u16 reg, u16 value) - { - /* Register 1 is a 32-bit register. */ -- B43_WARN_ON(reg == 1); -+ B43_WARN_ON(dev->phy.rev < 7 && reg == 1); - - b43_write16(dev, B43_MMIO_RADIO_CONTROL, reg); - b43_write16(dev, B43_MMIO_RADIO_DATA_LOW, value); -@@ -5687,15 +6543,23 @@ static void b43_nphy_op_radio_write(stru - static void b43_nphy_op_software_rfkill(struct b43_wldev *dev, - bool blocked) - { -+ struct b43_phy *phy = &dev->phy; -+ - if (b43_read32(dev, B43_MMIO_MACCTL) & B43_MACCTL_ENABLED) - b43err(dev->wl, "MAC not suspended\n"); - - if (blocked) { -- b43_phy_mask(dev, B43_NPHY_RFCTL_CMD, -- ~B43_NPHY_RFCTL_CMD_CHIP0PU); -- if (dev->phy.rev >= 7) { -+ if (phy->rev >= 19) { - /* TODO */ -- } else if (dev->phy.rev >= 3) { -+ } else if (phy->rev >= 8) { -+ b43_phy_mask(dev, B43_NPHY_RFCTL_CMD, -+ ~B43_NPHY_RFCTL_CMD_CHIP0PU); -+ } else if (phy->rev >= 7) { -+ /* Nothing needed */ -+ } else if (phy->rev >= 3) { -+ b43_phy_mask(dev, B43_NPHY_RFCTL_CMD, -+ ~B43_NPHY_RFCTL_CMD_CHIP0PU); -+ - b43_radio_mask(dev, 0x09, ~0x2); - - b43_radio_write(dev, 0x204D, 0); -@@ -5713,11 +6577,15 @@ static void b43_nphy_op_software_rfkill( - b43_radio_write(dev, 0x3064, 0); - } - } else { -- if (dev->phy.rev >= 7) { -- b43_radio_2057_init(dev); -+ if (phy->rev >= 19) { -+ /* TODO */ -+ } else if (phy->rev >= 7) { -+ if (!dev->phy.radio_on) -+ b43_radio_2057_init(dev); - b43_switch_channel(dev, dev->phy.channel); -- } else if (dev->phy.rev >= 3) { -- b43_radio_init2056(dev); -+ } else if (phy->rev >= 3) { -+ if (!dev->phy.radio_on) -+ b43_radio_init2056(dev); - b43_switch_channel(dev, dev->phy.channel); - } else { - b43_radio_init2055(dev); -@@ -5728,10 +6596,13 @@ static void b43_nphy_op_software_rfkill( - /* http://bcm-v4.sipsolutions.net/802.11/PHY/Anacore */ - static void b43_nphy_op_switch_analog(struct b43_wldev *dev, bool on) - { -+ struct b43_phy *phy = &dev->phy; - u16 override = on ? 0x0 : 0x7FFF; - u16 core = on ? 0xD : 0x00FD; - -- if (dev->phy.rev >= 3) { -+ if (phy->rev >= 19) { -+ /* TODO */ -+ } else if (phy->rev >= 3) { - if (on) { - b43_phy_write(dev, B43_NPHY_AFECTL_C1, core); - b43_phy_write(dev, B43_NPHY_AFECTL_OVER1, override); ---- a/drivers/net/wireless/b43/phy_n.h -+++ b/drivers/net/wireless/b43/phy_n.h -@@ -366,11 +366,13 @@ - #define B43_NPHY_TXF_40CO_B1S0 B43_PHY_N(0x0E5) /* TX filter 40 coeff B1 stage 0 */ - #define B43_NPHY_TXF_40CO_B32S1 B43_PHY_N(0x0E6) /* TX filter 40 coeff B32 stage 1 */ - #define B43_NPHY_TXF_40CO_B1S1 B43_PHY_N(0x0E7) /* TX filter 40 coeff B1 stage 1 */ -+#define B43_NPHY_REV3_RFCTL_OVER0 B43_PHY_N(0x0E7) - #define B43_NPHY_TXF_40CO_B32S2 B43_PHY_N(0x0E8) /* TX filter 40 coeff B32 stage 2 */ - #define B43_NPHY_TXF_40CO_B1S2 B43_PHY_N(0x0E9) /* TX filter 40 coeff B1 stage 2 */ - #define B43_NPHY_BIST_STAT2 B43_PHY_N(0x0EA) /* BIST status 2 */ - #define B43_NPHY_BIST_STAT3 B43_PHY_N(0x0EB) /* BIST status 3 */ - #define B43_NPHY_RFCTL_OVER B43_PHY_N(0x0EC) /* RF control override */ -+#define B43_NPHY_REV3_RFCTL_OVER1 B43_PHY_N(0x0EC) - #define B43_NPHY_MIMOCFG B43_PHY_N(0x0ED) /* MIMO config */ - #define B43_NPHY_MIMOCFG_GFMIX 0x0004 /* Greenfield or mixed mode */ - #define B43_NPHY_MIMOCFG_AUTO 0x0100 /* Greenfield/mixed mode auto */ -@@ -857,7 +859,18 @@ - #define B43_NPHY_REV3_C2_CLIP2_GAIN_A B43_PHY_N(0x2AF) - #define B43_NPHY_REV3_C2_CLIP2_GAIN_B B43_PHY_N(0x2B0) - -+#define B43_NPHY_REV7_RF_CTL_MISC_REG3 B43_PHY_N(0x340) -+#define B43_NPHY_REV7_RF_CTL_MISC_REG4 B43_PHY_N(0x341) -+#define B43_NPHY_REV7_RF_CTL_OVER3 B43_PHY_N(0x342) -+#define B43_NPHY_REV7_RF_CTL_OVER4 B43_PHY_N(0x343) -+#define B43_NPHY_REV7_RF_CTL_MISC_REG5 B43_PHY_N(0x344) -+#define B43_NPHY_REV7_RF_CTL_MISC_REG6 B43_PHY_N(0x345) -+#define B43_NPHY_REV7_RF_CTL_OVER5 B43_PHY_N(0x346) -+#define B43_NPHY_REV7_RF_CTL_OVER6 B43_PHY_N(0x347) -+ - #define B43_PHY_B_BBCFG B43_PHY_N_BMODE(0x001) /* BB config */ -+#define B43_PHY_B_BBCFG_RSTCCA 0x4000 /* Reset CCA */ -+#define B43_PHY_B_BBCFG_RSTRX 0x8000 /* Reset RX */ - #define B43_PHY_B_TEST B43_PHY_N_BMODE(0x00A) - - struct b43_wldev; -@@ -931,11 +944,12 @@ struct b43_phy_n { - u16 papd_epsilon_offset[2]; - s32 preamble_override; - u32 bb_mult_save; -- bool init_por; - - bool gain_boost; - bool elna_gain_config; - bool band5g_pwrgain; -+ bool use_int_tx_iq_lo_cal; -+ bool lpf_bw_overrode_for_sample_play; - - u8 mphase_cal_phase_id; - u16 mphase_txcal_cmdidx; ---- a/drivers/net/wireless/b43/tables_nphy.c -+++ b/drivers/net/wireless/b43/tables_nphy.c -@@ -2146,7 +2146,196 @@ static const u16 b43_ntab_antswctl_r3[4] - } - }; - --/* TX gain tables */ -+/* static tables, PHY revision >= 7 */ -+ -+/* Copied from brcmsmac (5.75.11) */ -+static const u32 b43_ntab_tmap_r7[] = { -+ 0x8a88aa80, 0x8aaaaa8a, 0x8a8a8aa8, 0x00000888, -+ 0x88000000, 0x8a8a88aa, 0x8aa88888, 0x8888a8a8, -+ 0xf1111110, 0x11111111, 0x11f11111, 0x00000111, -+ 0x11000000, 0x1111f111, 0x11111111, 0x111111f1, -+ 0x8a88aa80, 0x8aaaaa8a, 0x8a8a8aa8, 0x000aa888, -+ 0x88880000, 0x8a8a88aa, 0x8aa88888, 0x8888a8a8, -+ 0xa1111110, 0x11111111, 0x11c11111, 0x00000111, -+ 0x11000000, 0x1111a111, 0x11111111, 0x111111a1, -+ 0xa2222220, 0x22222222, 0x22c22222, 0x00000222, -+ 0x22000000, 0x2222a222, 0x22222222, 0x222222a2, -+ 0xf1111110, 0x11111111, 0x11f11111, 0x00011111, -+ 0x11110000, 0x1111f111, 0x11111111, 0x111111f1, -+ 0xa8aa88a0, 0xa88888a8, 0xa8a8a88a, 0x00088aaa, -+ 0xaaaa0000, 0xa8a8aa88, 0xa88aaaaa, 0xaaaa8a8a, -+ 0xaaa8aaa0, 0x8aaa8aaa, 0xaa8a8a8a, 0x000aaa88, -+ 0x8aaa0000, 0xaaa8a888, 0x8aa88a8a, 0x8a88a888, -+ 0x08080a00, 0x0a08080a, 0x080a0a08, 0x00080808, -+ 0x080a0000, 0x080a0808, 0x080a0808, 0x0a0a0a08, -+ 0xa0a0a0a0, 0x80a0a080, 0x8080a0a0, 0x00008080, -+ 0x80a00000, 0x80a080a0, 0xa080a0a0, 0x8080a0a0, -+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, -+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, -+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, -+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, -+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, -+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, -+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, -+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, -+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, -+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, -+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, -+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, -+ 0x99999000, 0x9b9b99bb, 0x9bb99999, 0x9999b9b9, -+ 0x9b99bb90, 0x9bbbbb9b, 0x9b9b9bb9, 0x00000999, -+ 0x88000000, 0x8a8a88aa, 0x8aa88888, 0x8888a8a8, -+ 0x8a88aa80, 0x8aaaaa8a, 0x8a8a8aa8, 0x00aaa888, -+ 0x22000000, 0x2222b222, 0x22222222, 0x222222b2, -+ 0xb2222220, 0x22222222, 0x22d22222, 0x00000222, -+ 0x11000000, 0x1111a111, 0x11111111, 0x111111a1, -+ 0xa1111110, 0x11111111, 0x11c11111, 0x00000111, -+ 0x33000000, 0x3333b333, 0x33333333, 0x333333b3, -+ 0xb3333330, 0x33333333, 0x33d33333, 0x00000333, -+ 0x22000000, 0x2222a222, 0x22222222, 0x222222a2, -+ 0xa2222220, 0x22222222, 0x22c22222, 0x00000222, -+ 0x99b99b00, 0x9b9b99bb, 0x9bb99999, 0x9999b9b9, -+ 0x9b99bb99, 0x9bbbbb9b, 0x9b9b9bb9, 0x00000999, -+ 0x88000000, 0x8a8a88aa, 0x8aa88888, 0x8888a8a8, -+ 0x8a88aa88, 0x8aaaaa8a, 0x8a8a8aa8, 0x08aaa888, -+ 0x22222200, 0x2222f222, 0x22222222, 0x222222f2, -+ 0x22222222, 0x22222222, 0x22f22222, 0x00000222, -+ 0x11000000, 0x1111f111, 0x11111111, 0x11111111, -+ 0xf1111111, 0x11111111, 0x11f11111, 0x01111111, -+ 0xbb9bb900, 0xb9b9bb99, 0xb99bbbbb, 0xbbbb9b9b, -+ 0xb9bb99bb, 0xb99999b9, 0xb9b9b99b, 0x00000bbb, -+ 0xaa000000, 0xa8a8aa88, 0xa88aaaaa, 0xaaaa8a8a, -+ 0xa8aa88aa, 0xa88888a8, 0xa8a8a88a, 0x0a888aaa, -+ 0xaa000000, 0xa8a8aa88, 0xa88aaaaa, 0xaaaa8a8a, -+ 0xa8aa88a0, 0xa88888a8, 0xa8a8a88a, 0x00000aaa, -+ 0x88000000, 0x8a8a88aa, 0x8aa88888, 0x8888a8a8, -+ 0x8a88aa80, 0x8aaaaa8a, 0x8a8a8aa8, 0x00000888, -+ 0xbbbbbb00, 0x999bbbbb, 0x9bb99b9b, 0xb9b9b9bb, -+ 0xb9b99bbb, 0xb9b9b9bb, 0xb9bb9b99, 0x00000999, -+ 0x8a000000, 0xaa88a888, 0xa88888aa, 0xa88a8a88, -+ 0xa88aa88a, 0x88a8aaaa, 0xa8aa8aaa, 0x0888a88a, -+ 0x0b0b0b00, 0x090b0b0b, 0x0b090b0b, 0x0909090b, -+ 0x09090b0b, 0x09090b0b, 0x09090b09, 0x00000909, -+ 0x0a000000, 0x0a080808, 0x080a080a, 0x080a0a08, -+ 0x080a080a, 0x0808080a, 0x0a0a0a08, 0x0808080a, -+ 0xb0b0b000, 0x9090b0b0, 0x90b09090, 0xb0b0b090, -+ 0xb0b090b0, 0x90b0b0b0, 0xb0b09090, 0x00000090, -+ 0x80000000, 0xa080a080, 0xa08080a0, 0xa0808080, -+ 0xa080a080, 0x80a0a0a0, 0xa0a080a0, 0x00a0a0a0, -+ 0x22000000, 0x2222f222, 0x22222222, 0x222222f2, -+ 0xf2222220, 0x22222222, 0x22f22222, 0x00000222, -+ 0x11000000, 0x1111f111, 0x11111111, 0x111111f1, -+ 0xf1111110, 0x11111111, 0x11f11111, 0x00000111, -+ 0x33000000, 0x3333f333, 0x33333333, 0x333333f3, -+ 0xf3333330, 0x33333333, 0x33f33333, 0x00000333, -+ 0x22000000, 0x2222f222, 0x22222222, 0x222222f2, -+ 0xf2222220, 0x22222222, 0x22f22222, 0x00000222, -+ 0x99000000, 0x9b9b99bb, 0x9bb99999, 0x9999b9b9, -+ 0x9b99bb90, 0x9bbbbb9b, 0x9b9b9bb9, 0x00000999, -+ 0x88000000, 0x8a8a88aa, 0x8aa88888, 0x8888a8a8, -+ 0x8a88aa80, 0x8aaaaa8a, 0x8a8a8aa8, 0x00000888, -+ 0x88888000, 0x8a8a88aa, 0x8aa88888, 0x8888a8a8, -+ 0x8a88aa80, 0x8aaaaa8a, 0x8a8a8aa8, 0x00000888, -+ 0x88000000, 0x8a8a88aa, 0x8aa88888, 0x8888a8a8, -+ 0x8a88aa80, 0x8aaaaa8a, 0x8a8a8aa8, 0x00aaa888, -+ 0x88a88a00, 0x8a8a88aa, 0x8aa88888, 0x8888a8a8, -+ 0x8a88aa88, 0x8aaaaa8a, 0x8a8a8aa8, 0x000aa888, -+ 0x88880000, 0x8a8a88aa, 0x8aa88888, 0x8888a8a8, -+ 0x8a88aa88, 0x8aaaaa8a, 0x8a8a8aa8, 0x08aaa888, -+ 0x11000000, 0x1111a111, 0x11111111, 0x111111a1, -+ 0xa1111110, 0x11111111, 0x11c11111, 0x00000111, -+ 0x11000000, 0x1111a111, 0x11111111, 0x111111a1, -+ 0xa1111110, 0x11111111, 0x11c11111, 0x00000111, -+ 0x88000000, 0x8a8a88aa, 0x8aa88888, 0x8888a8a8, -+ 0x8a88aa80, 0x8aaaaa8a, 0x8a8a8aa8, 0x00000888, -+ 0x88000000, 0x8a8a88aa, 0x8aa88888, 0x8888a8a8, -+ 0x8a88aa80, 0x8aaaaa8a, 0x8a8a8aa8, 0x00000888, -+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, -+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, -+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, -+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, -+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, -+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, -+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, -+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, -+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, -+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, -+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, -+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, -+}; -+ -+/* Extracted from MMIO dump of 6.30.223.141 */ -+static const u32 b43_ntab_noisevar_r7[] = { -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+ 0x020c020c, 0x0000014d, 0x020c020c, 0x0000014d, -+}; -+ -+/************************************************** -+ * TX gain tables -+ **************************************************/ -+ - static const u32 b43_ntab_tx_gain_rev0_1_2[] = { - 0x03cc2b44, 0x03cc2b42, 0x03cc2a44, 0x03cc2a42, - 0x03cc2944, 0x03c82b44, 0x03c82b42, 0x03c82a44, -@@ -2182,7 +2371,9 @@ static const u32 b43_ntab_tx_gain_rev0_1 - 0x03801442, 0x03801344, 0x03801342, 0x00002b00, - }; - --static const u32 b43_ntab_tx_gain_rev3plus_2ghz[] = { -+/* EPA 2 GHz */ -+ -+static const u32 b43_ntab_tx_gain_epa_rev3_2g[] = { - 0x1f410044, 0x1f410042, 0x1f410040, 0x1f41003e, - 0x1f41003c, 0x1f41003b, 0x1f410039, 0x1f410037, - 0x1e410044, 0x1e410042, 0x1e410040, 0x1e41003e, -@@ -2217,7 +2408,44 @@ static const u32 b43_ntab_tx_gain_rev3pl - 0x1041003c, 0x1041003b, 0x10410039, 0x10410037, - }; - --static const u32 b43_ntab_tx_gain_rev3_5ghz[] = { -+static const u32 b43_ntab_tx_gain_epa_rev3_hi_pwr_2g[] = { -+ 0x0f410044, 0x0f410042, 0x0f410040, 0x0f41003e, -+ 0x0f41003c, 0x0f41003b, 0x0f410039, 0x0f410037, -+ 0x0e410044, 0x0e410042, 0x0e410040, 0x0e41003e, -+ 0x0e41003c, 0x0e41003b, 0x0e410039, 0x0e410037, -+ 0x0d410044, 0x0d410042, 0x0d410040, 0x0d41003e, -+ 0x0d41003c, 0x0d41003b, 0x0d410039, 0x0d410037, -+ 0x0c410044, 0x0c410042, 0x0c410040, 0x0c41003e, -+ 0x0c41003c, 0x0c41003b, 0x0c410039, 0x0c410037, -+ 0x0b410044, 0x0b410042, 0x0b410040, 0x0b41003e, -+ 0x0b41003c, 0x0b41003b, 0x0b410039, 0x0b410037, -+ 0x0a410044, 0x0a410042, 0x0a410040, 0x0a41003e, -+ 0x0a41003c, 0x0a41003b, 0x0a410039, 0x0a410037, -+ 0x09410044, 0x09410042, 0x09410040, 0x0941003e, -+ 0x0941003c, 0x0941003b, 0x09410039, 0x09410037, -+ 0x08410044, 0x08410042, 0x08410040, 0x0841003e, -+ 0x0841003c, 0x0841003b, 0x08410039, 0x08410037, -+ 0x07410044, 0x07410042, 0x07410040, 0x0741003e, -+ 0x0741003c, 0x0741003b, 0x07410039, 0x07410037, -+ 0x06410044, 0x06410042, 0x06410040, 0x0641003e, -+ 0x0641003c, 0x0641003b, 0x06410039, 0x06410037, -+ 0x05410044, 0x05410042, 0x05410040, 0x0541003e, -+ 0x0541003c, 0x0541003b, 0x05410039, 0x05410037, -+ 0x04410044, 0x04410042, 0x04410040, 0x0441003e, -+ 0x0441003c, 0x0441003b, 0x04410039, 0x04410037, -+ 0x03410044, 0x03410042, 0x03410040, 0x0341003e, -+ 0x0341003c, 0x0341003b, 0x03410039, 0x03410037, -+ 0x02410044, 0x02410042, 0x02410040, 0x0241003e, -+ 0x0241003c, 0x0241003b, 0x02410039, 0x02410037, -+ 0x01410044, 0x01410042, 0x01410040, 0x0141003e, -+ 0x0141003c, 0x0141003b, 0x01410039, 0x01410037, -+ 0x00410044, 0x00410042, 0x00410040, 0x0041003e, -+ 0x0041003c, 0x0041003b, 0x00410039, 0x00410037 -+}; -+ -+/* EPA 5 GHz */ -+ -+static const u32 b43_ntab_tx_gain_epa_rev3_5g[] = { - 0xcff70044, 0xcff70042, 0xcff70040, 0xcff7003e, - 0xcff7003c, 0xcff7003b, 0xcff70039, 0xcff70037, - 0xcef70044, 0xcef70042, 0xcef70040, 0xcef7003e, -@@ -2252,7 +2480,7 @@ static const u32 b43_ntab_tx_gain_rev3_5 - 0xc0f7003c, 0xc0f7003b, 0xc0f70039, 0xc0f70037, - }; - --static const u32 b43_ntab_tx_gain_rev4_5ghz[] = { -+static const u32 b43_ntab_tx_gain_epa_rev4_5g[] = { - 0x2ff20044, 0x2ff20042, 0x2ff20040, 0x2ff2003e, - 0x2ff2003c, 0x2ff2003b, 0x2ff20039, 0x2ff20037, - 0x2ef20044, 0x2ef20042, 0x2ef20040, 0x2ef2003e, -@@ -2287,7 +2515,42 @@ static const u32 b43_ntab_tx_gain_rev4_5 - 0x20d2003a, 0x20d20038, 0x20d20036, 0x20d20034, - }; - --static const u32 b43_ntab_tx_gain_rev5plus_5ghz[] = { -+static const u32 b43_ntab_tx_gain_epa_rev4_hi_pwr_5g[] = { -+ 0x2ff10044, 0x2ff10042, 0x2ff10040, 0x2ff1003e, -+ 0x2ff1003c, 0x2ff1003b, 0x2ff10039, 0x2ff10037, -+ 0x2ef10044, 0x2ef10042, 0x2ef10040, 0x2ef1003e, -+ 0x2ef1003c, 0x2ef1003b, 0x2ef10039, 0x2ef10037, -+ 0x2df10044, 0x2df10042, 0x2df10040, 0x2df1003e, -+ 0x2df1003c, 0x2df1003b, 0x2df10039, 0x2df10037, -+ 0x2cf10044, 0x2cf10042, 0x2cf10040, 0x2cf1003e, -+ 0x2cf1003c, 0x2cf1003b, 0x2cf10039, 0x2cf10037, -+ 0x2bf10044, 0x2bf10042, 0x2bf10040, 0x2bf1003e, -+ 0x2bf1003c, 0x2bf1003b, 0x2bf10039, 0x2bf10037, -+ 0x2af10044, 0x2af10042, 0x2af10040, 0x2af1003e, -+ 0x2af1003c, 0x2af1003b, 0x2af10039, 0x2af10037, -+ 0x29f10044, 0x29f10042, 0x29f10040, 0x29f1003e, -+ 0x29f1003c, 0x29f1003b, 0x29f10039, 0x29f10037, -+ 0x28f10044, 0x28f10042, 0x28f10040, 0x28f1003e, -+ 0x28f1003c, 0x28f1003b, 0x28f10039, 0x28f10037, -+ 0x27f10044, 0x27f10042, 0x27f10040, 0x27f1003e, -+ 0x27f1003c, 0x27f1003b, 0x27f10039, 0x27f10037, -+ 0x26f10044, 0x26f10042, 0x26f10040, 0x26f1003e, -+ 0x26f1003c, 0x26f1003b, 0x26f10039, 0x26f10037, -+ 0x25f10044, 0x25f10042, 0x25f10040, 0x25f1003e, -+ 0x25f1003c, 0x25f1003b, 0x25f10039, 0x25f10037, -+ 0x24f10044, 0x24f10042, 0x24f10040, 0x24f1003e, -+ 0x24f1003c, 0x24f1003b, 0x24f10039, 0x24f10038, -+ 0x23f10041, 0x23f10040, 0x23f1003f, 0x23f1003e, -+ 0x23f1003c, 0x23f1003b, 0x23f10039, 0x23f10037, -+ 0x22f10044, 0x22f10042, 0x22f10040, 0x22f1003e, -+ 0x22f1003c, 0x22f1003b, 0x22f10039, 0x22f10037, -+ 0x21f10044, 0x21f10042, 0x21f10040, 0x21f1003e, -+ 0x21f1003c, 0x21f1003b, 0x21f10039, 0x21f10037, -+ 0x20d10043, 0x20d10041, 0x20d1003e, 0x20d1003c, -+ 0x20d1003a, 0x20d10038, 0x20d10036, 0x20d10034 -+}; -+ -+static const u32 b43_ntab_tx_gain_epa_rev5_5g[] = { - 0x0f62004a, 0x0f620048, 0x0f620046, 0x0f620044, - 0x0f620042, 0x0f620040, 0x0f62003e, 0x0f62003c, - 0x0e620044, 0x0e620042, 0x0e620040, 0x0e62003e, -@@ -2322,7 +2585,9 @@ static const u32 b43_ntab_tx_gain_rev5pl - 0x0062003b, 0x00620039, 0x00620037, 0x00620035, - }; - --static const u32 txpwrctrl_tx_gain_ipa[] = { -+/* IPA 2 GHz */ -+ -+static const u32 b43_ntab_tx_gain_ipa_rev3_2g[] = { - 0x5ff7002d, 0x5ff7002b, 0x5ff7002a, 0x5ff70029, - 0x5ff70028, 0x5ff70027, 0x5ff70026, 0x5ff70025, - 0x5ef7002d, 0x5ef7002b, 0x5ef7002a, 0x5ef70029, -@@ -2357,7 +2622,7 @@ static const u32 txpwrctrl_tx_gain_ipa[] - 0x50f70028, 0x50f70027, 0x50f70026, 0x50f70025, - }; - --static const u32 txpwrctrl_tx_gain_ipa_rev5[] = { -+static const u32 b43_ntab_tx_gain_ipa_rev5_2g[] = { - 0x1ff7002d, 0x1ff7002b, 0x1ff7002a, 0x1ff70029, - 0x1ff70028, 0x1ff70027, 0x1ff70026, 0x1ff70025, - 0x1ef7002d, 0x1ef7002b, 0x1ef7002a, 0x1ef70029, -@@ -2392,7 +2657,7 @@ static const u32 txpwrctrl_tx_gain_ipa_r - 0x10f70028, 0x10f70027, 0x10f70026, 0x10f70025, - }; - --static const u32 txpwrctrl_tx_gain_ipa_rev6[] = { -+static const u32 b43_ntab_tx_gain_ipa_rev6_2g[] = { - 0x0ff7002d, 0x0ff7002b, 0x0ff7002a, 0x0ff70029, - 0x0ff70028, 0x0ff70027, 0x0ff70026, 0x0ff70025, - 0x0ef7002d, 0x0ef7002b, 0x0ef7002a, 0x0ef70029, -@@ -2427,7 +2692,117 @@ static const u32 txpwrctrl_tx_gain_ipa_r - 0x00f70028, 0x00f70027, 0x00f70026, 0x00f70025, - }; - --static const u32 txpwrctrl_tx_gain_ipa_5g[] = { -+/* Copied from brcmsmac (5.75.11): nphy_tpc_txgain_ipa_2g_2057rev5 */ -+static const u32 b43_ntab_tx_gain_ipa_2057_rev5_2g[] = { -+ 0x30ff0031, 0x30e70031, 0x30e7002e, 0x30cf002e, -+ 0x30bf002e, 0x30af002e, 0x309f002f, 0x307f0033, -+ 0x307f0031, 0x307f002e, 0x3077002e, 0x306f002e, -+ 0x3067002e, 0x305f002f, 0x30570030, 0x3057002d, -+ 0x304f002e, 0x30470031, 0x3047002e, 0x3047002c, -+ 0x30470029, 0x303f002c, 0x303f0029, 0x3037002d, -+ 0x3037002a, 0x30370028, 0x302f002c, 0x302f002a, -+ 0x302f0028, 0x302f0026, 0x3027002c, 0x30270029, -+ 0x30270027, 0x30270025, 0x30270023, 0x301f002c, -+ 0x301f002a, 0x301f0028, 0x301f0025, 0x301f0024, -+ 0x301f0022, 0x301f001f, 0x3017002d, 0x3017002b, -+ 0x30170028, 0x30170026, 0x30170024, 0x30170022, -+ 0x30170020, 0x3017001e, 0x3017001d, 0x3017001b, -+ 0x3017001a, 0x30170018, 0x30170017, 0x30170015, -+ 0x300f002c, 0x300f0029, 0x300f0027, 0x300f0024, -+ 0x300f0022, 0x300f0021, 0x300f001f, 0x300f001d, -+ 0x300f001b, 0x300f001a, 0x300f0018, 0x300f0017, -+ 0x300f0016, 0x300f0015, 0x300f0115, 0x300f0215, -+ 0x300f0315, 0x300f0415, 0x300f0515, 0x300f0615, -+ 0x300f0715, 0x300f0715, 0x300f0715, 0x300f0715, -+ 0x300f0715, 0x300f0715, 0x300f0715, 0x300f0715, -+ 0x300f0715, 0x300f0715, 0x300f0715, 0x300f0715, -+ 0x300f0715, 0x300f0715, 0x300f0715, 0x300f0715, -+ 0x300f0715, 0x300f0715, 0x300f0715, 0x300f0715, -+ 0x300f0715, 0x300f0715, 0x300f0715, 0x300f0715, -+ 0x300f0715, 0x300f0715, 0x300f0715, 0x300f0715, -+ 0x300f0715, 0x300f0715, 0x300f0715, 0x300f0715, -+ 0x300f0715, 0x300f0715, 0x300f0715, 0x300f0715, -+ 0x300f0715, 0x300f0715, 0x300f0715, 0x300f0715, -+ 0x300f0715, 0x300f0715, 0x300f0715, 0x300f0715, -+ 0x300f0715, 0x300f0715, 0x300f0715, 0x300f0715, -+ 0x300f0715, 0x300f0715, 0x300f0715, 0x300f0715, -+}; -+ -+/* Extracted from MMIO dump of 6.30.223.141 */ -+static const u32 b43_ntab_tx_gain_ipa_2057_rev9_2g[] = { -+ 0x60ff0031, 0x60e7002c, 0x60cf002a, 0x60c70029, -+ 0x60b70029, 0x60a70029, 0x609f002a, 0x6097002b, -+ 0x6087002e, 0x60770031, 0x606f0032, 0x60670034, -+ 0x60670031, 0x605f0033, 0x605f0031, 0x60570033, -+ 0x60570030, 0x6057002d, 0x6057002b, 0x604f002d, -+ 0x604f002b, 0x604f0029, 0x604f0026, 0x60470029, -+ 0x60470027, 0x603f0029, 0x603f0027, 0x603f0025, -+ 0x60370029, 0x60370027, 0x60370024, 0x602f002a, -+ 0x602f0028, 0x602f0026, 0x602f0024, 0x6027002a, -+ 0x60270028, 0x60270026, 0x60270024, 0x60270022, -+ 0x601f002b, 0x601f0029, 0x601f0027, 0x601f0024, -+ 0x601f0022, 0x601f0020, 0x601f001f, 0x601f001d, -+ 0x60170029, 0x60170027, 0x60170025, 0x60170023, -+ 0x60170021, 0x6017001f, 0x6017001d, 0x6017001c, -+ 0x6017001a, 0x60170018, 0x60170018, 0x60170016, -+ 0x60170015, 0x600f0029, 0x600f0027, 0x600f0025, -+ 0x600f0023, 0x600f0021, 0x600f001f, 0x600f001d, -+ 0x600f001c, 0x600f001a, 0x600f0019, 0x600f0018, -+ 0x600f0016, 0x600f0015, 0x600f0115, 0x600f0215, -+ 0x600f0315, 0x600f0415, 0x600f0515, 0x600f0615, -+ 0x600f0715, 0x600f0715, 0x600f0715, 0x600f0715, -+ 0x600f0715, 0x600f0715, 0x600f0715, 0x600f0715, -+ 0x600f0715, 0x600f0715, 0x600f0715, 0x600f0715, -+ 0x600f0715, 0x600f0715, 0x600f0715, 0x600f0715, -+ 0x600f0715, 0x600f0715, 0x600f0715, 0x600f0715, -+ 0x600f0715, 0x600f0715, 0x600f0715, 0x600f0715, -+ 0x600f0715, 0x600f0715, 0x600f0715, 0x600f0715, -+ 0x600f0715, 0x600f0715, 0x600f0715, 0x600f0715, -+ 0x600f0715, 0x600f0715, 0x600f0715, 0x600f0715, -+ 0x600f0715, 0x600f0715, 0x600f0715, 0x600f0715, -+ 0x600f0715, 0x600f0715, 0x600f0715, 0x600f0715, -+ 0x600f0715, 0x600f0715, 0x600f0715, 0x600f0715, -+}; -+ -+/* Extracted from MMIO dump of 6.30.223.248 */ -+static const u32 b43_ntab_tx_gain_ipa_2057_rev14_2g[] = { -+ 0x50df002e, 0x50cf002d, 0x50bf002c, 0x50b7002b, -+ 0x50af002a, 0x50a70029, 0x509f0029, 0x50970028, -+ 0x508f0027, 0x50870027, 0x507f0027, 0x50770027, -+ 0x506f0027, 0x50670027, 0x505f0028, 0x50570029, -+ 0x504f002b, 0x5047002e, 0x5047002b, 0x50470029, -+ 0x503f002c, 0x503f0029, 0x5037002c, 0x5037002a, -+ 0x50370028, 0x502f002d, 0x502f002b, 0x502f0028, -+ 0x502f0026, 0x5027002d, 0x5027002a, 0x50270028, -+ 0x50270026, 0x50270024, 0x501f002e, 0x501f002b, -+ 0x501f0029, 0x501f0027, 0x501f0024, 0x501f0022, -+ 0x501f0020, 0x501f001f, 0x5017002c, 0x50170029, -+ 0x50170027, 0x50170024, 0x50170022, 0x50170021, -+ 0x5017001f, 0x5017001d, 0x5017001b, 0x5017001a, -+ 0x50170018, 0x50170017, 0x50170015, 0x500f002c, -+ 0x500f002a, 0x500f0027, 0x500f0025, 0x500f0023, -+ 0x500f0022, 0x500f001f, 0x500f001e, 0x500f001c, -+ 0x500f001a, 0x500f0019, 0x500f0018, 0x500f0016, -+ 0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, -+ 0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, -+ 0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, -+ 0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, -+ 0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, -+ 0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, -+ 0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, -+ 0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, -+ 0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, -+ 0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, -+ 0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, -+ 0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, -+ 0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, -+ 0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, -+ 0x500f0015, 0x500f0015, 0x500f0015, 0x500f0015, -+}; -+ -+/* IPA 2 5Hz */ -+ -+static const u32 b43_ntab_tx_gain_ipa_rev3_5g[] = { - 0x7ff70035, 0x7ff70033, 0x7ff70032, 0x7ff70031, - 0x7ff7002f, 0x7ff7002e, 0x7ff7002d, 0x7ff7002b, - 0x7ff7002a, 0x7ff70029, 0x7ff70028, 0x7ff70027, -@@ -2462,6 +2837,42 @@ static const u32 txpwrctrl_tx_gain_ipa_5 - 0x70f70021, 0x70f70020, 0x70f70020, 0x70f7001f, - }; - -+/* Extracted from MMIO dump of 6.30.223.141 */ -+static const u32 b43_ntab_tx_gain_ipa_2057_rev9_5g[] = { -+ 0x7f7f0053, 0x7f7f004b, 0x7f7f0044, 0x7f7f003f, -+ 0x7f7f0039, 0x7f7f0035, 0x7f7f0032, 0x7f7f0030, -+ 0x7f7f002d, 0x7e7f0030, 0x7e7f002d, 0x7d7f0032, -+ 0x7d7f002f, 0x7d7f002c, 0x7c7f0032, 0x7c7f0030, -+ 0x7c7f002d, 0x7b7f0030, 0x7b7f002e, 0x7b7f002b, -+ 0x7a7f0032, 0x7a7f0030, 0x7a7f002d, 0x7a7f002b, -+ 0x797f0030, 0x797f002e, 0x797f002b, 0x797f0029, -+ 0x787f0030, 0x787f002d, 0x787f002b, 0x777f0032, -+ 0x777f0030, 0x777f002d, 0x777f002b, 0x767f0031, -+ 0x767f002f, 0x767f002c, 0x767f002a, 0x757f0031, -+ 0x757f002f, 0x757f002c, 0x757f002a, 0x747f0030, -+ 0x747f002d, 0x747f002b, 0x737f0032, 0x737f002f, -+ 0x737f002c, 0x737f002a, 0x727f0030, 0x727f002d, -+ 0x727f002b, 0x727f0029, 0x717f0030, 0x717f002d, -+ 0x717f002b, 0x707f0031, 0x707f002f, 0x707f002c, -+ 0x707f002a, 0x707f0027, 0x707f0025, 0x707f0023, -+ 0x707f0021, 0x707f001f, 0x707f001d, 0x707f001c, -+ 0x707f001a, 0x707f0019, 0x707f0017, 0x707f0016, -+ 0x707f0015, 0x707f0014, 0x707f0012, 0x707f0012, -+ 0x707f0011, 0x707f0010, 0x707f000f, 0x707f000e, -+ 0x707f000d, 0x707f000d, 0x707f000c, 0x707f000b, -+ 0x707f000a, 0x707f000a, 0x707f0009, 0x707f0008, -+ 0x707f0008, 0x707f0008, 0x707f0008, 0x707f0007, -+ 0x707f0007, 0x707f0006, 0x707f0006, 0x707f0006, -+ 0x707f0005, 0x707f0005, 0x707f0005, 0x707f0004, -+ 0x707f0004, 0x707f0004, 0x707f0003, 0x707f0003, -+ 0x707f0003, 0x707f0003, 0x707f0003, 0x707f0003, -+ 0x707f0003, 0x707f0003, 0x707f0003, 0x707f0003, -+ 0x707f0002, 0x707f0002, 0x707f0002, 0x707f0002, -+ 0x707f0002, 0x707f0002, 0x707f0002, 0x707f0002, -+ 0x707f0002, 0x707f0001, 0x707f0001, 0x707f0001, -+ 0x707f0001, 0x707f0001, 0x707f0001, 0x707f0001, -+}; -+ - const s8 b43_ntab_papd_pga_gain_delta_ipa_2g[] = { - -114, -108, -98, -91, -84, -78, -70, -62, - -54, -46, -39, -31, -23, -15, -8, 0 -@@ -2698,11 +3109,11 @@ static const struct nphy_rf_control_over - { 0x0010, 0x07A, 0x07D, 0x0010, 4 }, - { 0x0020, 0x07A, 0x07D, 0x0020, 5 }, - { 0x0040, 0x07A, 0x07D, 0x0040, 6 }, -- { 0x0080, 0x0F8, 0x0FA, 0x0080, 7 }, -+ { 0x0080, 0x07A, 0x07D, 0x0080, 7 }, - { 0x0400, 0x0F8, 0x0FA, 0x0070, 4 }, - { 0x0800, 0x07B, 0x07E, 0xFFFF, 0 }, - { 0x1000, 0x07C, 0x07F, 0xFFFF, 0 }, -- { 0x6000, 0x348, 0x349, 0xFFFF, 0 }, -+ { 0x6000, 0x348, 0x349, 0x00FF, 0 }, - { 0x2000, 0x348, 0x349, 0x000F, 0 }, - }; - -@@ -3031,31 +3442,8 @@ void b43_ntab_write_bulk(struct b43_wlde - b43_ntab_write_bulk(dev, offset, ARRAY_SIZE(data), data); \ - } while (0) - --static void b43_nphy_tables_init_rev3(struct b43_wldev *dev) -+static void b43_nphy_tables_init_shared_lut(struct b43_wldev *dev) - { -- struct ssb_sprom *sprom = dev->dev->bus_sprom; -- u8 antswlut; -- -- if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) -- antswlut = sprom->fem.ghz5.antswlut; -- else -- antswlut = sprom->fem.ghz2.antswlut; -- -- /* Static tables */ -- ntab_upload(dev, B43_NTAB_FRAMESTRUCT_R3, b43_ntab_framestruct_r3); -- ntab_upload(dev, B43_NTAB_PILOT_R3, b43_ntab_pilot_r3); -- ntab_upload(dev, B43_NTAB_TMAP_R3, b43_ntab_tmap_r3); -- ntab_upload(dev, B43_NTAB_INTLEVEL_R3, b43_ntab_intlevel_r3); -- ntab_upload(dev, B43_NTAB_TDTRN_R3, b43_ntab_tdtrn_r3); -- ntab_upload(dev, B43_NTAB_NOISEVAR_R3, b43_ntab_noisevar_r3); -- ntab_upload(dev, B43_NTAB_MCS_R3, b43_ntab_mcs_r3); -- ntab_upload(dev, B43_NTAB_TDI20A0_R3, b43_ntab_tdi20a0_r3); -- ntab_upload(dev, B43_NTAB_TDI20A1_R3, b43_ntab_tdi20a1_r3); -- ntab_upload(dev, B43_NTAB_TDI40A0_R3, b43_ntab_tdi40a0_r3); -- ntab_upload(dev, B43_NTAB_TDI40A1_R3, b43_ntab_tdi40a1_r3); -- ntab_upload(dev, B43_NTAB_PILOTLT_R3, b43_ntab_pilotlt_r3); -- ntab_upload(dev, B43_NTAB_CHANEST_R3, b43_ntab_channelest_r3); -- ntab_upload(dev, B43_NTAB_FRAMELT_R3, b43_ntab_framelookup_r3); - ntab_upload(dev, B43_NTAB_C0_ESTPLT_R3, b43_ntab_estimatepowerlt0_r3); - ntab_upload(dev, B43_NTAB_C1_ESTPLT_R3, b43_ntab_estimatepowerlt1_r3); - ntab_upload(dev, B43_NTAB_C0_ADJPLT_R3, b43_ntab_adjustpower0_r3); -@@ -3066,6 +3454,107 @@ static void b43_nphy_tables_init_rev3(st - ntab_upload(dev, B43_NTAB_C1_IQLT_R3, b43_ntab_iqlt1_r3); - ntab_upload(dev, B43_NTAB_C0_LOFEEDTH_R3, b43_ntab_loftlt0_r3); - ntab_upload(dev, B43_NTAB_C1_LOFEEDTH_R3, b43_ntab_loftlt1_r3); -+} -+ -+static void b43_nphy_tables_init_rev7_volatile(struct b43_wldev *dev) -+{ -+ struct ssb_sprom *sprom = dev->dev->bus_sprom; -+ u8 antswlut; -+ int core, offset, i; -+ -+ const int antswlut0_offsets[] = { 0, 4, 8, }; /* Offsets for values */ -+ const u8 antswlut0_values[][3] = { -+ { 0x2, 0x12, 0x8 }, /* Core 0 */ -+ { 0x2, 0x18, 0x2 }, /* Core 1 */ -+ }; -+ -+ if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) -+ antswlut = sprom->fem.ghz5.antswlut; -+ else -+ antswlut = sprom->fem.ghz2.antswlut; -+ -+ switch (antswlut) { -+ case 0: -+ for (core = 0; core < 2; core++) { -+ for (i = 0; i < ARRAY_SIZE(antswlut0_values[0]); i++) { -+ offset = core ? 0x20 : 0x00; -+ offset += antswlut0_offsets[i]; -+ b43_ntab_write(dev, B43_NTAB8(9, offset), -+ antswlut0_values[core][i]); -+ } -+ } -+ break; -+ default: -+ b43err(dev->wl, "Unsupported antswlut: %d\n", antswlut); -+ break; -+ } -+} -+ -+static void b43_nphy_tables_init_rev16(struct b43_wldev *dev) -+{ -+ /* Static tables */ -+ if (dev->phy.do_full_init) { -+ ntab_upload(dev, B43_NTAB_NOISEVAR_R7, b43_ntab_noisevar_r7); -+ b43_nphy_tables_init_shared_lut(dev); -+ } -+ -+ /* Volatile tables */ -+ b43_nphy_tables_init_rev7_volatile(dev); -+} -+ -+static void b43_nphy_tables_init_rev7(struct b43_wldev *dev) -+{ -+ /* Static tables */ -+ if (dev->phy.do_full_init) { -+ ntab_upload(dev, B43_NTAB_FRAMESTRUCT_R3, b43_ntab_framestruct_r3); -+ ntab_upload(dev, B43_NTAB_PILOT_R3, b43_ntab_pilot_r3); -+ ntab_upload(dev, B43_NTAB_TMAP_R7, b43_ntab_tmap_r7); -+ ntab_upload(dev, B43_NTAB_INTLEVEL_R3, b43_ntab_intlevel_r3); -+ ntab_upload(dev, B43_NTAB_TDTRN_R3, b43_ntab_tdtrn_r3); -+ ntab_upload(dev, B43_NTAB_NOISEVAR_R7, b43_ntab_noisevar_r7); -+ ntab_upload(dev, B43_NTAB_MCS_R3, b43_ntab_mcs_r3); -+ ntab_upload(dev, B43_NTAB_TDI20A0_R3, b43_ntab_tdi20a0_r3); -+ ntab_upload(dev, B43_NTAB_TDI20A1_R3, b43_ntab_tdi20a1_r3); -+ ntab_upload(dev, B43_NTAB_TDI40A0_R3, b43_ntab_tdi40a0_r3); -+ ntab_upload(dev, B43_NTAB_TDI40A1_R3, b43_ntab_tdi40a1_r3); -+ ntab_upload(dev, B43_NTAB_PILOTLT_R3, b43_ntab_pilotlt_r3); -+ ntab_upload(dev, B43_NTAB_CHANEST_R3, b43_ntab_channelest_r3); -+ ntab_upload(dev, B43_NTAB_FRAMELT_R3, b43_ntab_framelookup_r3); -+ b43_nphy_tables_init_shared_lut(dev); -+ } -+ -+ /* Volatile tables */ -+ b43_nphy_tables_init_rev7_volatile(dev); -+} -+ -+static void b43_nphy_tables_init_rev3(struct b43_wldev *dev) -+{ -+ struct ssb_sprom *sprom = dev->dev->bus_sprom; -+ u8 antswlut; -+ -+ if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) -+ antswlut = sprom->fem.ghz5.antswlut; -+ else -+ antswlut = sprom->fem.ghz2.antswlut; -+ -+ /* Static tables */ -+ if (dev->phy.do_full_init) { -+ ntab_upload(dev, B43_NTAB_FRAMESTRUCT_R3, b43_ntab_framestruct_r3); -+ ntab_upload(dev, B43_NTAB_PILOT_R3, b43_ntab_pilot_r3); -+ ntab_upload(dev, B43_NTAB_TMAP_R3, b43_ntab_tmap_r3); -+ ntab_upload(dev, B43_NTAB_INTLEVEL_R3, b43_ntab_intlevel_r3); -+ ntab_upload(dev, B43_NTAB_TDTRN_R3, b43_ntab_tdtrn_r3); -+ ntab_upload(dev, B43_NTAB_NOISEVAR_R3, b43_ntab_noisevar_r3); -+ ntab_upload(dev, B43_NTAB_MCS_R3, b43_ntab_mcs_r3); -+ ntab_upload(dev, B43_NTAB_TDI20A0_R3, b43_ntab_tdi20a0_r3); -+ ntab_upload(dev, B43_NTAB_TDI20A1_R3, b43_ntab_tdi20a1_r3); -+ ntab_upload(dev, B43_NTAB_TDI40A0_R3, b43_ntab_tdi40a0_r3); -+ ntab_upload(dev, B43_NTAB_TDI40A1_R3, b43_ntab_tdi40a1_r3); -+ ntab_upload(dev, B43_NTAB_PILOTLT_R3, b43_ntab_pilotlt_r3); -+ ntab_upload(dev, B43_NTAB_CHANEST_R3, b43_ntab_channelest_r3); -+ ntab_upload(dev, B43_NTAB_FRAMELT_R3, b43_ntab_framelookup_r3); -+ b43_nphy_tables_init_shared_lut(dev); -+ } - - /* Volatile tables */ - if (antswlut < ARRAY_SIZE(b43_ntab_antswctl_r3)) -@@ -3078,20 +3567,22 @@ static void b43_nphy_tables_init_rev3(st - static void b43_nphy_tables_init_rev0(struct b43_wldev *dev) - { - /* Static tables */ -- ntab_upload(dev, B43_NTAB_FRAMESTRUCT, b43_ntab_framestruct); -- ntab_upload(dev, B43_NTAB_FRAMELT, b43_ntab_framelookup); -- ntab_upload(dev, B43_NTAB_TMAP, b43_ntab_tmap); -- ntab_upload(dev, B43_NTAB_TDTRN, b43_ntab_tdtrn); -- ntab_upload(dev, B43_NTAB_INTLEVEL, b43_ntab_intlevel); -- ntab_upload(dev, B43_NTAB_PILOT, b43_ntab_pilot); -- ntab_upload(dev, B43_NTAB_TDI20A0, b43_ntab_tdi20a0); -- ntab_upload(dev, B43_NTAB_TDI20A1, b43_ntab_tdi20a1); -- ntab_upload(dev, B43_NTAB_TDI40A0, b43_ntab_tdi40a0); -- ntab_upload(dev, B43_NTAB_TDI40A1, b43_ntab_tdi40a1); -- ntab_upload(dev, B43_NTAB_CHANEST, b43_ntab_channelest); -- ntab_upload(dev, B43_NTAB_MCS, b43_ntab_mcs); -- ntab_upload(dev, B43_NTAB_NOISEVAR10, b43_ntab_noisevar10); -- ntab_upload(dev, B43_NTAB_NOISEVAR11, b43_ntab_noisevar11); -+ if (dev->phy.do_full_init) { -+ ntab_upload(dev, B43_NTAB_FRAMESTRUCT, b43_ntab_framestruct); -+ ntab_upload(dev, B43_NTAB_FRAMELT, b43_ntab_framelookup); -+ ntab_upload(dev, B43_NTAB_TMAP, b43_ntab_tmap); -+ ntab_upload(dev, B43_NTAB_TDTRN, b43_ntab_tdtrn); -+ ntab_upload(dev, B43_NTAB_INTLEVEL, b43_ntab_intlevel); -+ ntab_upload(dev, B43_NTAB_PILOT, b43_ntab_pilot); -+ ntab_upload(dev, B43_NTAB_TDI20A0, b43_ntab_tdi20a0); -+ ntab_upload(dev, B43_NTAB_TDI20A1, b43_ntab_tdi20a1); -+ ntab_upload(dev, B43_NTAB_TDI40A0, b43_ntab_tdi40a0); -+ ntab_upload(dev, B43_NTAB_TDI40A1, b43_ntab_tdi40a1); -+ ntab_upload(dev, B43_NTAB_CHANEST, b43_ntab_channelest); -+ ntab_upload(dev, B43_NTAB_MCS, b43_ntab_mcs); -+ ntab_upload(dev, B43_NTAB_NOISEVAR10, b43_ntab_noisevar10); -+ ntab_upload(dev, B43_NTAB_NOISEVAR11, b43_ntab_noisevar11); -+ } - - /* Volatile tables */ - ntab_upload(dev, B43_NTAB_BDI, b43_ntab_bdi); -@@ -3111,7 +3602,11 @@ static void b43_nphy_tables_init_rev0(st - /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/InitTables */ - void b43_nphy_tables_init(struct b43_wldev *dev) - { -- if (dev->phy.rev >= 3) -+ if (dev->phy.rev >= 16) -+ b43_nphy_tables_init_rev16(dev); -+ else if (dev->phy.rev >= 7) -+ b43_nphy_tables_init_rev7(dev); -+ else if (dev->phy.rev >= 3) - b43_nphy_tables_init_rev3(dev); - else - b43_nphy_tables_init_rev0(dev); -@@ -3120,23 +3615,55 @@ void b43_nphy_tables_init(struct b43_wld - /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/GetIpaGainTbl */ - static const u32 *b43_nphy_get_ipa_gain_table(struct b43_wldev *dev) - { -+ struct b43_phy *phy = &dev->phy; -+ - if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) { -- if (dev->phy.rev >= 6) { -- if (dev->dev->chip_id == 47162) -- return txpwrctrl_tx_gain_ipa_rev5; -- return txpwrctrl_tx_gain_ipa_rev6; -- } else if (dev->phy.rev >= 5) { -- return txpwrctrl_tx_gain_ipa_rev5; -- } else { -- return txpwrctrl_tx_gain_ipa; -+ switch (phy->rev) { -+ case 17: -+ if (phy->radio_rev == 14) -+ return b43_ntab_tx_gain_ipa_2057_rev14_2g; -+ break; -+ case 16: -+ if (phy->radio_rev == 9) -+ return b43_ntab_tx_gain_ipa_2057_rev9_2g; -+ break; -+ case 8: -+ if (phy->radio_rev == 5) -+ return b43_ntab_tx_gain_ipa_2057_rev5_2g; -+ break; -+ case 6: -+ if (dev->dev->chip_id == BCMA_CHIP_ID_BCM47162) -+ return b43_ntab_tx_gain_ipa_rev5_2g; -+ return b43_ntab_tx_gain_ipa_rev6_2g; -+ case 5: -+ return b43_ntab_tx_gain_ipa_rev5_2g; -+ case 4: -+ case 3: -+ return b43_ntab_tx_gain_ipa_rev3_2g; - } -+ -+ b43err(dev->wl, -+ "No 2GHz IPA gain table available for this device\n"); -+ return NULL; - } else { -- return txpwrctrl_tx_gain_ipa_5g; -+ switch (phy->rev) { -+ case 16: -+ if (phy->radio_rev == 9) -+ return b43_ntab_tx_gain_ipa_2057_rev9_5g; -+ break; -+ case 3 ... 6: -+ return b43_ntab_tx_gain_ipa_rev3_5g; -+ } -+ -+ b43err(dev->wl, -+ "No 5GHz IPA gain table available for this device\n"); -+ return NULL; - } - } - - const u32 *b43_nphy_get_tx_gain_table(struct b43_wldev *dev) - { -+ struct b43_phy *phy = &dev->phy; - enum ieee80211_band band = b43_current_band(dev->wl); - struct ssb_sprom *sprom = dev->dev->bus_sprom; - -@@ -3148,19 +3675,36 @@ const u32 *b43_nphy_get_tx_gain_table(st - (dev->phy.n->ipa5g_on && band == IEEE80211_BAND_5GHZ)) { - return b43_nphy_get_ipa_gain_table(dev); - } else if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) { -- if (dev->phy.rev == 3) -- return b43_ntab_tx_gain_rev3_5ghz; -- if (dev->phy.rev == 4) -+ switch (phy->rev) { -+ case 6: -+ case 5: -+ return b43_ntab_tx_gain_epa_rev5_5g; -+ case 4: - return sprom->fem.ghz5.extpa_gain == 3 ? -- b43_ntab_tx_gain_rev4_5ghz : -- b43_ntab_tx_gain_rev4_5ghz; /* FIXME */ -- else -- return b43_ntab_tx_gain_rev5plus_5ghz; -+ b43_ntab_tx_gain_epa_rev4_5g : -+ b43_ntab_tx_gain_epa_rev4_hi_pwr_5g; -+ case 3: -+ return b43_ntab_tx_gain_epa_rev3_5g; -+ default: -+ b43err(dev->wl, -+ "No 5GHz EPA gain table available for this device\n"); -+ return NULL; -+ } - } else { -- if (dev->phy.rev >= 5 && sprom->fem.ghz5.extpa_gain == 3) -- return b43_ntab_tx_gain_rev3plus_2ghz; /* FIXME */ -- else -- return b43_ntab_tx_gain_rev3plus_2ghz; -+ switch (phy->rev) { -+ case 6: -+ case 5: -+ if (sprom->fem.ghz5.extpa_gain == 3) -+ return b43_ntab_tx_gain_epa_rev3_hi_pwr_2g; -+ /* fall through */ -+ case 4: -+ case 3: -+ return b43_ntab_tx_gain_epa_rev3_2g; -+ default: -+ b43err(dev->wl, -+ "No 2GHz EPA gain table available for this device\n"); -+ return NULL; -+ } - } - } - -@@ -3187,7 +3731,7 @@ struct nphy_gain_ctl_workaround_entry *b - /* Some workarounds to the workarounds... */ - if (ghz5 && dev->phy.rev >= 6) { - if (dev->phy.radio_rev == 11 && -- !b43_channel_type_is_40mhz(dev->phy.channel_type)) -+ !b43_is_40mhz(dev)) - e->cliplo_gain = 0x2d; - } else if (!ghz5 && dev->phy.rev >= 5) { - static const int gain_data[] = {0x0062, 0x0064, 0x006a, 0x106a, ---- a/drivers/net/wireless/b43/Kconfig -+++ b/drivers/net/wireless/b43/Kconfig -@@ -37,7 +37,7 @@ config B43_SSB - choice - prompt "Supported bus types" - depends on B43 -- default B43_BCMA_AND_SSB -+ default B43_BUSES_BCMA_AND_SSB - - config B43_BUSES_BCMA_AND_SSB - bool "BCMA and SSB" -@@ -123,6 +123,15 @@ config B43_PIO - select SSB_BLOCKIO - default y - -+config B43_PHY_G -+ bool "Support for G-PHY (802.11g) devices" -+ depends on B43 && B43_SSB -+ default y -+ ---help--- -+ This PHY type can be found in the following chipsets: -+ PCI: BCM4306, BCM4311, BCM4318 -+ SoC: BCM4712, BCM5352E -+ - config B43_PHY_N - bool "Support for 802.11n (N-PHY) devices" - depends on B43 ---- a/drivers/net/wireless/b43/phy_ht.c -+++ b/drivers/net/wireless/b43/phy_ht.c -@@ -596,7 +596,7 @@ static void b43_phy_ht_tx_power_ctl_setu - u8 target[3]; - s16 a1[3], b0[3], b1[3]; - -- u16 freq = dev->phy.channel_freq; -+ u16 freq = dev->phy.chandef->chan->center_freq; - int i, c; - - if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) { ---- a/drivers/net/wireless/b43/phy_a.h -+++ b/drivers/net/wireless/b43/phy_a.h -@@ -123,8 +123,4 @@ struct b43_phy_a { - */ - void b43_phy_inita(struct b43_wldev *dev); - -- --struct b43_phy_operations; --extern const struct b43_phy_operations b43_phyops_a; -- - #endif /* LINUX_B43_PHY_A_H_ */ ---- a/drivers/net/wireless/b43/Makefile -+++ b/drivers/net/wireless/b43/Makefile -@@ -1,13 +1,11 @@ - b43-y += main.o - b43-y += bus.o --b43-y += tables.o -+b43-$(CPTCFG_B43_PHY_G) += phy_a.o phy_g.o tables.o lo.o wa.o - b43-$(CPTCFG_B43_PHY_N) += tables_nphy.o - b43-$(CPTCFG_B43_PHY_N) += radio_2055.o - b43-$(CPTCFG_B43_PHY_N) += radio_2056.o - b43-$(CPTCFG_B43_PHY_N) += radio_2057.o - b43-y += phy_common.o --b43-y += phy_g.o --b43-y += phy_a.o - b43-$(CPTCFG_B43_PHY_N) += phy_n.o - b43-$(CPTCFG_B43_PHY_LP) += phy_lp.o - b43-$(CPTCFG_B43_PHY_LP) += tables_lpphy.o -@@ -17,8 +15,6 @@ b43-$(CPTCFG_B43_PHY_HT) += radio_2059.o - b43-$(CPTCFG_B43_PHY_LCN) += phy_lcn.o tables_phy_lcn.o - b43-y += sysfs.o - b43-y += xmit.o --b43-y += lo.o --b43-y += wa.o - b43-y += dma.o - b43-y += pio.o - b43-y += rfkill.o ---- a/drivers/net/wireless/b43/phy_a.c -+++ b/drivers/net/wireless/b43/phy_a.c -@@ -573,7 +573,7 @@ static void b43_aphy_op_pwork_60sec(stru - {//TODO - } - --const struct b43_phy_operations b43_phyops_a = { -+static const struct b43_phy_operations b43_phyops_a = { - .allocate = b43_aphy_op_allocate, - .free = b43_aphy_op_free, - .prepare_structs = b43_aphy_op_prepare_structs, ---- a/drivers/net/wireless/b43/radio_2057.c -+++ b/drivers/net/wireless/b43/radio_2057.c -@@ -26,7 +26,7 @@ - #include "radio_2057.h" - #include "phy_common.h" - --static u16 r2057_rev4_init[42][2] = { -+static u16 r2057_rev4_init[][2] = { - { 0x0E, 0x20 }, { 0x31, 0x00 }, { 0x32, 0x00 }, { 0x33, 0x00 }, - { 0x35, 0x26 }, { 0x3C, 0xff }, { 0x3D, 0xff }, { 0x3E, 0xff }, - { 0x3F, 0xff }, { 0x62, 0x33 }, { 0x8A, 0xf0 }, { 0x8B, 0x10 }, -@@ -40,7 +40,7 @@ static u16 r2057_rev4_init[42][2] = { - { 0x1AB, 0x00 }, { 0x1AC, 0x00 }, - }; - --static u16 r2057_rev5_init[44][2] = { -+static u16 r2057_rev5_init[][2] = { - { 0x00, 0x00 }, { 0x01, 0x57 }, { 0x02, 0x20 }, { 0x23, 0x6 }, - { 0x31, 0x00 }, { 0x32, 0x00 }, { 0x33, 0x00 }, { 0x51, 0x70 }, - { 0x59, 0x88 }, { 0x5C, 0x20 }, { 0x62, 0x33 }, { 0x63, 0x0f }, -@@ -54,7 +54,7 @@ static u16 r2057_rev5_init[44][2] = { - { 0x1AC, 0x00 }, { 0x1B7, 0x0c }, { 0x1C1, 0x01 }, { 0x1C2, 0x80 }, - }; - --static u16 r2057_rev5a_init[45][2] = { -+static u16 r2057_rev5a_init[][2] = { - { 0x00, 0x15 }, { 0x01, 0x57 }, { 0x02, 0x20 }, { 0x23, 0x6 }, - { 0x31, 0x00 }, { 0x32, 0x00 }, { 0x33, 0x00 }, { 0x51, 0x70 }, - { 0x59, 0x88 }, { 0x5C, 0x20 }, { 0x62, 0x33 }, { 0x63, 0x0f }, -@@ -69,7 +69,7 @@ static u16 r2057_rev5a_init[45][2] = { - { 0x1C2, 0x80 }, - }; - --static u16 r2057_rev7_init[54][2] = { -+static u16 r2057_rev7_init[][2] = { - { 0x00, 0x00 }, { 0x01, 0x57 }, { 0x02, 0x20 }, { 0x31, 0x00 }, - { 0x32, 0x00 }, { 0x33, 0x00 }, { 0x51, 0x70 }, { 0x59, 0x88 }, - { 0x5C, 0x20 }, { 0x62, 0x33 }, { 0x63, 0x0f }, { 0x64, 0x13 }, -@@ -86,7 +86,8 @@ static u16 r2057_rev7_init[54][2] = { - { 0x1B7, 0x05 }, { 0x1C2, 0xa0 }, - }; - --static u16 r2057_rev8_init[54][2] = { -+/* TODO: Which devices should use it? -+static u16 r2057_rev8_init[][2] = { - { 0x00, 0x08 }, { 0x01, 0x57 }, { 0x02, 0x20 }, { 0x31, 0x00 }, - { 0x32, 0x00 }, { 0x33, 0x00 }, { 0x51, 0x70 }, { 0x59, 0x88 }, - { 0x5C, 0x20 }, { 0x62, 0x33 }, { 0x63, 0x0f }, { 0x64, 0x0f }, -@@ -102,6 +103,436 @@ static u16 r2057_rev8_init[54][2] = { - { 0x1A6, 0x00 }, { 0x1AA, 0x00 }, { 0x1AB, 0x00 }, { 0x1AC, 0x00 }, - { 0x1B7, 0x05 }, { 0x1C2, 0xa0 }, - }; -+*/ -+ -+/* Extracted from MMIO dump of 6.30.223.141 */ -+static u16 r2057_rev9_init[][2] = { -+ { 0x27, 0x1f }, { 0x28, 0x0a }, { 0x29, 0x2f }, { 0x42, 0x1f }, -+ { 0x48, 0x3f }, { 0x5c, 0x41 }, { 0x63, 0x14 }, { 0x64, 0x12 }, -+ { 0x66, 0xff }, { 0x74, 0xa3 }, { 0x7b, 0x14 }, { 0x7c, 0x14 }, -+ { 0x7d, 0xee }, { 0x86, 0xc0 }, { 0xc4, 0x10 }, { 0xc9, 0x01 }, -+ { 0xe1, 0x41 }, { 0xe8, 0x14 }, { 0xe9, 0x12 }, { 0xeb, 0xff }, -+ { 0xf5, 0x0a }, { 0xf8, 0x09 }, { 0xf9, 0xa3 }, { 0x100, 0x14 }, -+ { 0x101, 0x10 }, { 0x102, 0xee }, { 0x10b, 0xc0 }, { 0x149, 0x10 }, -+ { 0x14e, 0x01 }, { 0x1b7, 0x05 }, { 0x1c2, 0xa0 }, -+}; -+ -+/* Extracted from MMIO dump of 6.30.223.248 */ -+static u16 r2057_rev14_init[][2] = { -+ { 0x011, 0xfc }, { 0x030, 0x24 }, { 0x040, 0x1c }, { 0x082, 0x08 }, -+ { 0x0b4, 0x44 }, { 0x0c8, 0x01 }, { 0x0c9, 0x01 }, { 0x107, 0x08 }, -+ { 0x14d, 0x01 }, { 0x14e, 0x01 }, { 0x1af, 0x40 }, { 0x1b0, 0x40 }, -+ { 0x1cc, 0x01 }, { 0x1cf, 0x10 }, { 0x1d0, 0x0f }, { 0x1d3, 0x10 }, -+ { 0x1d4, 0x0f }, -+}; -+ -+#define RADIOREGS7(r00, r01, r02, r03, r04, r05, r06, r07, r08, r09, \ -+ r10, r11, r12, r13, r14, r15, r16, r17, r18, r19, \ -+ r20, r21, r22, r23, r24, r25, r26, r27) \ -+ .radio_vcocal_countval0 = r00, \ -+ .radio_vcocal_countval1 = r01, \ -+ .radio_rfpll_refmaster_sparextalsize = r02, \ -+ .radio_rfpll_loopfilter_r1 = r03, \ -+ .radio_rfpll_loopfilter_c2 = r04, \ -+ .radio_rfpll_loopfilter_c1 = r05, \ -+ .radio_cp_kpd_idac = r06, \ -+ .radio_rfpll_mmd0 = r07, \ -+ .radio_rfpll_mmd1 = r08, \ -+ .radio_vcobuf_tune = r09, \ -+ .radio_logen_mx2g_tune = r10, \ -+ .radio_logen_mx5g_tune = r11, \ -+ .radio_logen_indbuf2g_tune = r12, \ -+ .radio_logen_indbuf5g_tune = r13, \ -+ .radio_txmix2g_tune_boost_pu_core0 = r14, \ -+ .radio_pad2g_tune_pus_core0 = r15, \ -+ .radio_pga_boost_tune_core0 = r16, \ -+ .radio_txmix5g_boost_tune_core0 = r17, \ -+ .radio_pad5g_tune_misc_pus_core0 = r18, \ -+ .radio_lna2g_tune_core0 = r19, \ -+ .radio_lna5g_tune_core0 = r20, \ -+ .radio_txmix2g_tune_boost_pu_core1 = r21, \ -+ .radio_pad2g_tune_pus_core1 = r22, \ -+ .radio_pga_boost_tune_core1 = r23, \ -+ .radio_txmix5g_boost_tune_core1 = r24, \ -+ .radio_pad5g_tune_misc_pus_core1 = r25, \ -+ .radio_lna2g_tune_core1 = r26, \ -+ .radio_lna5g_tune_core1 = r27 -+ -+#define RADIOREGS7_2G(r00, r01, r02, r03, r04, r05, r06, r07, r08, r09, \ -+ r10, r11, r12, r13, r14, r15, r16, r17) \ -+ .radio_vcocal_countval0 = r00, \ -+ .radio_vcocal_countval1 = r01, \ -+ .radio_rfpll_refmaster_sparextalsize = r02, \ -+ .radio_rfpll_loopfilter_r1 = r03, \ -+ .radio_rfpll_loopfilter_c2 = r04, \ -+ .radio_rfpll_loopfilter_c1 = r05, \ -+ .radio_cp_kpd_idac = r06, \ -+ .radio_rfpll_mmd0 = r07, \ -+ .radio_rfpll_mmd1 = r08, \ -+ .radio_vcobuf_tune = r09, \ -+ .radio_logen_mx2g_tune = r10, \ -+ .radio_logen_indbuf2g_tune = r11, \ -+ .radio_txmix2g_tune_boost_pu_core0 = r12, \ -+ .radio_pad2g_tune_pus_core0 = r13, \ -+ .radio_lna2g_tune_core0 = r14, \ -+ .radio_txmix2g_tune_boost_pu_core1 = r15, \ -+ .radio_pad2g_tune_pus_core1 = r16, \ -+ .radio_lna2g_tune_core1 = r17 -+ -+#define PHYREGS(r0, r1, r2, r3, r4, r5) \ -+ .phy_regs.phy_bw1a = r0, \ -+ .phy_regs.phy_bw2 = r1, \ -+ .phy_regs.phy_bw3 = r2, \ -+ .phy_regs.phy_bw4 = r3, \ -+ .phy_regs.phy_bw5 = r4, \ -+ .phy_regs.phy_bw6 = r5 -+ -+/* Copied from brcmsmac (5.75.11): chan_info_nphyrev8_2057_rev5 */ -+static const struct b43_nphy_chantabent_rev7_2g b43_nphy_chantab_phy_rev8_radio_rev5[] = { -+ { -+ .freq = 2412, -+ RADIOREGS7_2G(0x48, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x6c, -+ 0x09, 0x0d, 0x08, 0x0e, 0x61, 0x03, 0xff, 0x61, -+ 0x03, 0xff), -+ PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443), -+ }, -+ { -+ .freq = 2417, -+ RADIOREGS7_2G(0x4b, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x71, -+ 0x09, 0x0d, 0x08, 0x0e, 0x61, 0x03, 0xff, 0x61, -+ 0x03, 0xff), -+ PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441), -+ }, -+ { -+ .freq = 2422, -+ RADIOREGS7_2G(0x4e, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x76, -+ 0x09, 0x0d, 0x08, 0x0e, 0x61, 0x03, 0xef, 0x61, -+ 0x03, 0xef), -+ PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f), -+ }, -+ { -+ .freq = 2427, -+ RADIOREGS7_2G(0x52, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x7b, -+ 0x09, 0x0c, 0x08, 0x0e, 0x61, 0x03, 0xdf, 0x61, -+ 0x03, 0xdf), -+ PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d), -+ }, -+ { -+ .freq = 2432, -+ RADIOREGS7_2G(0x55, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x80, -+ 0x09, 0x0c, 0x07, 0x0d, 0x61, 0x03, 0xcf, 0x61, -+ 0x03, 0xcf), -+ PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a), -+ }, -+ { -+ .freq = 2437, -+ RADIOREGS7_2G(0x58, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x85, -+ 0x09, 0x0c, 0x07, 0x0d, 0x61, 0x03, 0xbf, 0x61, -+ 0x03, 0xbf), -+ PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438), -+ }, -+ { -+ .freq = 2442, -+ RADIOREGS7_2G(0x5c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8a, -+ 0x09, 0x0b, 0x07, 0x0d, 0x61, 0x03, 0xaf, 0x61, -+ 0x03, 0xaf), -+ PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436), -+ }, -+ { -+ .freq = 2447, -+ RADIOREGS7_2G(0x5f, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8f, -+ 0x09, 0x0b, 0x07, 0x0d, 0x61, 0x03, 0x9f, 0x61, -+ 0x03, 0x9f), -+ PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434), -+ }, -+ { -+ .freq = 2452, -+ RADIOREGS7_2G(0x62, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x94, -+ 0x09, 0x0b, 0x07, 0x0d, 0x61, 0x03, 0x8f, 0x61, -+ 0x03, 0x8f), -+ PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431), -+ }, -+ { -+ .freq = 2457, -+ RADIOREGS7_2G(0x66, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x99, -+ 0x09, 0x0b, 0x07, 0x0c, 0x61, 0x03, 0x7f, 0x61, -+ 0x03, 0x7f), -+ PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f), -+ }, -+ { -+ .freq = 2462, -+ RADIOREGS7_2G(0x69, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x9e, -+ 0x09, 0x0b, 0x07, 0x0c, 0x61, 0x03, 0x6f, 0x61, -+ 0x03, 0x6f), -+ PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d), -+ }, -+ { -+ .freq = 2467, -+ RADIOREGS7_2G(0x6c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xa3, -+ 0x09, 0x0b, 0x06, 0x0c, 0x61, 0x03, 0x5f, 0x61, -+ 0x03, 0x5f), -+ PHYREGS(0x03df, 0x03db, 0x03d7, 0x0422, 0x0427, 0x042b), -+ }, -+ { -+ .freq = 2472, -+ RADIOREGS7_2G(0x70, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xa8, -+ 0x09, 0x0a, 0x06, 0x0b, 0x61, 0x03, 0x4f, 0x61, -+ 0x03, 0x4f), -+ PHYREGS(0x03e1, 0x03dd, 0x03d9, 0x0420, 0x0424, 0x0429), -+ }, -+ { -+ .freq = 2484, -+ RADIOREGS7_2G(0x78, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xb4, -+ 0x09, 0x0a, 0x06, 0x0b, 0x61, 0x03, 0x3f, 0x61, -+ 0x03, 0x3f), -+ PHYREGS(0x03e6, 0x03e2, 0x03de, 0x041b, 0x041f, 0x0424), -+ } -+}; -+ -+/* Extracted from MMIO dump of 6.30.223.248 */ -+static const struct b43_nphy_chantabent_rev7_2g b43_nphy_chantab_phy_rev17_radio_rev14[] = { -+ { -+ .freq = 2412, -+ RADIOREGS7_2G(0x48, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x6c, -+ 0x09, 0x0d, 0x09, 0x03, 0x21, 0x53, 0xff, 0x21, -+ 0x53, 0xff), -+ PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443), -+ }, -+ { -+ .freq = 2417, -+ RADIOREGS7_2G(0x4b, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x71, -+ 0x09, 0x0d, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21, -+ 0x53, 0xff), -+ PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441), -+ }, -+ { -+ .freq = 2422, -+ RADIOREGS7_2G(0x4e, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x76, -+ 0x09, 0x0d, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21, -+ 0x53, 0xff), -+ PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f), -+ }, -+ { -+ .freq = 2427, -+ RADIOREGS7_2G(0x52, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x7b, -+ 0x09, 0x0c, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21, -+ 0x53, 0xff), -+ PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d), -+ }, -+ { -+ .freq = 2432, -+ RADIOREGS7_2G(0x55, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x80, -+ 0x09, 0x0c, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21, -+ 0x53, 0xff), -+ PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a), -+ }, -+ { -+ .freq = 2437, -+ RADIOREGS7_2G(0x58, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x85, -+ 0x09, 0x0c, 0x08, 0x03, 0x21, 0x53, 0xff, 0x21, -+ 0x53, 0xff), -+ PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438), -+ }, -+ { -+ .freq = 2442, -+ RADIOREGS7_2G(0x5c, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x8a, -+ 0x09, 0x0c, 0x08, 0x03, 0x21, 0x43, 0xff, 0x21, -+ 0x43, 0xff), -+ PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436), -+ }, -+ { -+ .freq = 2447, -+ RADIOREGS7_2G(0x5f, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x8f, -+ 0x09, 0x0c, 0x08, 0x03, 0x21, 0x43, 0xff, 0x21, -+ 0x43, 0xff), -+ PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434), -+ }, -+ { -+ .freq = 2452, -+ RADIOREGS7_2G(0x62, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x94, -+ 0x09, 0x0c, 0x08, 0x03, 0x21, 0x43, 0xff, 0x21, -+ 0x43, 0xff), -+ PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431), -+ }, -+ { -+ .freq = 2457, -+ RADIOREGS7_2G(0x66, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x99, -+ 0x09, 0x0b, 0x07, 0x03, 0x21, 0x43, 0xff, 0x21, -+ 0x43, 0xff), -+ PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f), -+ }, -+ { -+ .freq = 2462, -+ RADIOREGS7_2G(0x69, 0x16, 0x30, 0x2b, 0x1f, 0x1f, 0x30, 0x9e, -+ 0x09, 0x0b, 0x07, 0x03, 0x01, 0x43, 0xff, 0x01, -+ 0x43, 0xff), -+ PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d), -+ }, -+}; -+ -+/* Extracted from MMIO dump of 6.30.223.141 */ -+static const struct b43_nphy_chantabent_rev7 b43_nphy_chantab_phy_rev16_radio_rev9[] = { -+ { -+ .freq = 2412, -+ RADIOREGS7(0x48, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x6c, -+ 0x09, 0x0f, 0x0a, 0x00, 0x0a, 0x00, 0x41, 0x63, -+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, -+ 0x00, 0x00, 0xf0, 0x00), -+ PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443), -+ }, -+ { -+ .freq = 2417, -+ RADIOREGS7(0x4b, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x71, -+ 0x09, 0x0f, 0x0a, 0x00, 0x0a, 0x00, 0x41, 0x63, -+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, -+ 0x00, 0x00, 0xf0, 0x00), -+ PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441), -+ }, -+ { -+ .freq = 2422, -+ RADIOREGS7(0x4e, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x76, -+ 0x09, 0x0f, 0x09, 0x00, 0x09, 0x00, 0x41, 0x63, -+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, -+ 0x00, 0x00, 0xf0, 0x00), -+ PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f), -+ }, -+ { -+ .freq = 2427, -+ RADIOREGS7(0x52, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x7b, -+ 0x09, 0x0f, 0x09, 0x00, 0x09, 0x00, 0x41, 0x63, -+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, -+ 0x00, 0x00, 0xf0, 0x00), -+ PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d), -+ }, -+ { -+ .freq = 2432, -+ RADIOREGS7(0x55, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x80, -+ 0x09, 0x0f, 0x08, 0x00, 0x08, 0x00, 0x41, 0x63, -+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, -+ 0x00, 0x00, 0xf0, 0x00), -+ PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a), -+ }, -+ { -+ .freq = 2437, -+ RADIOREGS7(0x58, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x85, -+ 0x09, 0x0f, 0x08, 0x00, 0x08, 0x00, 0x41, 0x63, -+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, -+ 0x00, 0x00, 0xf0, 0x00), -+ PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438), -+ }, -+ { -+ .freq = 2442, -+ RADIOREGS7(0x5c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8a, -+ 0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x41, 0x63, -+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, -+ 0x00, 0x00, 0xf0, 0x00), -+ PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436), -+ }, -+ { -+ .freq = 2447, -+ RADIOREGS7(0x5f, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8f, -+ 0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x41, 0x63, -+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, -+ 0x00, 0x00, 0xf0, 0x00), -+ PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434), -+ }, -+ { -+ .freq = 2452, -+ RADIOREGS7(0x62, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x94, -+ 0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x41, 0x63, -+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, -+ 0x00, 0x00, 0xf0, 0x00), -+ PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431), -+ }, -+ { -+ .freq = 2457, -+ RADIOREGS7(0x66, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x99, -+ 0x09, 0x0f, 0x06, 0x00, 0x06, 0x00, 0x41, 0x63, -+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, -+ 0x00, 0x00, 0xf0, 0x00), -+ PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f), -+ }, -+ { -+ .freq = 2462, -+ RADIOREGS7(0x69, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x9e, -+ 0x09, 0x0f, 0x06, 0x00, 0x06, 0x00, 0x41, 0x63, -+ 0x00, 0x00, 0x00, 0xf0, 0x00, 0x41, 0x63, 0x00, -+ 0x00, 0x00, 0xf0, 0x00), -+ PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d), -+ }, -+ { -+ .freq = 5180, -+ RADIOREGS7(0xbe, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x06, -+ 0x02, 0x0e, 0x00, 0x0e, 0x00, 0x9e, 0x00, 0x00, -+ 0x9f, 0x2f, 0xa3, 0x00, 0xfc, 0x00, 0x00, 0x4f, -+ 0x3a, 0x83, 0x00, 0xfc), -+ PHYREGS(0x081c, 0x0818, 0x0814, 0x01f9, 0x01fa, 0x01fb), -+ }, -+ { -+ .freq = 5200, -+ RADIOREGS7(0xc5, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x08, -+ 0x02, 0x0e, 0x00, 0x0e, 0x00, 0x9e, 0x00, 0x00, -+ 0x7f, 0x2f, 0x83, 0x00, 0xf8, 0x00, 0x00, 0x4c, -+ 0x4a, 0x83, 0x00, 0xf8), -+ PHYREGS(0x0824, 0x0820, 0x081c, 0x01f7, 0x01f8, 0x01f9), -+ }, -+ { -+ .freq = 5220, -+ RADIOREGS7(0xcc, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x0a, -+ 0x02, 0x0e, 0x00, 0x0e, 0x00, 0x9e, 0x00, 0x00, -+ 0x6d, 0x3d, 0x83, 0x00, 0xf8, 0x00, 0x00, 0x2d, -+ 0x2a, 0x73, 0x00, 0xf8), -+ PHYREGS(0x082c, 0x0828, 0x0824, 0x01f5, 0x01f6, 0x01f7), -+ }, -+ { -+ .freq = 5240, -+ RADIOREGS7(0xd2, 0x16, 0x10, 0x1f, 0x08, 0x08, 0x3f, 0x0c, -+ 0x02, 0x0d, 0x00, 0x0d, 0x00, 0x8d, 0x00, 0x00, -+ 0x4d, 0x1c, 0x73, 0x00, 0xf8, 0x00, 0x00, 0x4d, -+ 0x2b, 0x73, 0x00, 0xf8), -+ PHYREGS(0x0834, 0x0830, 0x082c, 0x01f3, 0x01f4, 0x01f5), -+ }, -+ { -+ .freq = 5745, -+ RADIOREGS7(0x7b, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x7d, -+ 0x04, 0x08, 0x00, 0x06, 0x00, 0x15, 0x00, 0x00, -+ 0x08, 0x03, 0x03, 0x00, 0x30, 0x00, 0x00, 0x06, -+ 0x02, 0x03, 0x00, 0x30), -+ PHYREGS(0x08fe, 0x08fa, 0x08f6, 0x01c8, 0x01c8, 0x01c9), -+ }, -+ { -+ .freq = 5765, -+ RADIOREGS7(0x81, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x81, -+ 0x04, 0x08, 0x00, 0x06, 0x00, 0x15, 0x00, 0x00, -+ 0x06, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, -+ 0x02, 0x03, 0x00, 0x00), -+ PHYREGS(0x0906, 0x0902, 0x08fe, 0x01c6, 0x01c7, 0x01c8), -+ }, -+ { -+ .freq = 5785, -+ RADIOREGS7(0x88, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x85, -+ 0x04, 0x08, 0x00, 0x06, 0x00, 0x15, 0x00, 0x00, -+ 0x08, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x05, -+ 0x21, 0x03, 0x00, 0x00), -+ PHYREGS(0x090e, 0x090a, 0x0906, 0x01c4, 0x01c5, 0x01c6), -+ }, -+ { -+ .freq = 5805, -+ RADIOREGS7(0x8f, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x89, -+ 0x04, 0x07, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, -+ 0x06, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, -+ 0x00, 0x03, 0x00, 0x00), -+ PHYREGS(0x0916, 0x0912, 0x090e, 0x01c3, 0x01c4, 0x01c4), -+ }, -+ { -+ .freq = 5825, -+ RADIOREGS7(0x95, 0x17, 0x20, 0x1f, 0x08, 0x08, 0x3f, 0x8d, -+ 0x04, 0x07, 0x00, 0x05, 0x00, 0x03, 0x00, 0x00, -+ 0x05, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, -+ 0x00, 0x03, 0x00, 0x00), -+ PHYREGS(0x091e, 0x091a, 0x0916, 0x01c1, 0x01c2, 0x01c3), -+ }, -+}; - - void r2057_upload_inittabs(struct b43_wldev *dev) - { -@@ -109,33 +540,98 @@ void r2057_upload_inittabs(struct b43_wl - u16 *table = NULL; - u16 size, i; - -- if (phy->rev == 7) { -+ switch (phy->rev) { -+ case 7: - table = r2057_rev4_init[0]; - size = ARRAY_SIZE(r2057_rev4_init); -- } else if (phy->rev == 8 || phy->rev == 9) { -+ break; -+ case 8: - if (phy->radio_rev == 5) { -- if (phy->radio_rev == 8) { -- table = r2057_rev5_init[0]; -- size = ARRAY_SIZE(r2057_rev5_init); -- } else { -- table = r2057_rev5a_init[0]; -- size = ARRAY_SIZE(r2057_rev5a_init); -- } -+ table = r2057_rev5_init[0]; -+ size = ARRAY_SIZE(r2057_rev5_init); - } else if (phy->radio_rev == 7) { - table = r2057_rev7_init[0]; - size = ARRAY_SIZE(r2057_rev7_init); -- } else if (phy->radio_rev == 9) { -- table = r2057_rev8_init[0]; -- size = ARRAY_SIZE(r2057_rev8_init); - } -+ break; -+ case 9: -+ if (phy->radio_rev == 5) { -+ table = r2057_rev5a_init[0]; -+ size = ARRAY_SIZE(r2057_rev5a_init); -+ } -+ break; -+ case 16: -+ if (phy->radio_rev == 9) { -+ table = r2057_rev9_init[0]; -+ size = ARRAY_SIZE(r2057_rev9_init); -+ } -+ break; -+ case 17: -+ if (phy->radio_rev == 14) { -+ table = r2057_rev14_init[0]; -+ size = ARRAY_SIZE(r2057_rev14_init); -+ } -+ break; - } - -+ B43_WARN_ON(!table); -+ - if (table) { -- for (i = 0; i < 10; i++) { -- pr_info("radio_write 0x%X ", *table); -- table++; -- pr_info("0x%X\n", *table); -- table++; -+ for (i = 0; i < size; i++, table += 2) -+ b43_radio_write(dev, table[0], table[1]); -+ } -+} -+ -+void r2057_get_chantabent_rev7(struct b43_wldev *dev, u16 freq, -+ const struct b43_nphy_chantabent_rev7 **tabent_r7, -+ const struct b43_nphy_chantabent_rev7_2g **tabent_r7_2g) -+{ -+ struct b43_phy *phy = &dev->phy; -+ const struct b43_nphy_chantabent_rev7 *e_r7 = NULL; -+ const struct b43_nphy_chantabent_rev7_2g *e_r7_2g = NULL; -+ unsigned int len, i; -+ -+ *tabent_r7 = NULL; -+ *tabent_r7_2g = NULL; -+ -+ switch (phy->rev) { -+ case 8: -+ if (phy->radio_rev == 5) { -+ e_r7_2g = b43_nphy_chantab_phy_rev8_radio_rev5; -+ len = ARRAY_SIZE(b43_nphy_chantab_phy_rev8_radio_rev5); -+ } -+ break; -+ case 16: -+ if (phy->radio_rev == 9) { -+ e_r7 = b43_nphy_chantab_phy_rev16_radio_rev9; -+ len = ARRAY_SIZE(b43_nphy_chantab_phy_rev16_radio_rev9); -+ } -+ break; -+ case 17: -+ if (phy->radio_rev == 14) { -+ e_r7_2g = b43_nphy_chantab_phy_rev17_radio_rev14; -+ len = ARRAY_SIZE(b43_nphy_chantab_phy_rev17_radio_rev14); -+ } -+ break; -+ default: -+ break; -+ } -+ -+ if (e_r7) { -+ for (i = 0; i < len; i++, e_r7++) { -+ if (e_r7->freq == freq) { -+ *tabent_r7 = e_r7; -+ return; -+ } -+ } -+ } else if (e_r7_2g) { -+ for (i = 0; i < len; i++, e_r7_2g++) { -+ if (e_r7_2g->freq == freq) { -+ *tabent_r7_2g = e_r7_2g; -+ return; -+ } - } -+ } else { -+ B43_WARN_ON(1); - } - } ---- a/drivers/net/wireless/b43/radio_2057.h -+++ b/drivers/net/wireless/b43/radio_2057.h -@@ -84,6 +84,8 @@ - #define R2057_CMOSBUF_RX_RCCR 0x04c - #define R2057_LOGEN_SEL_PKDET 0x04d - #define R2057_CMOSBUF_SHAREIQ_PTAT 0x04e -+ -+/* MISC core 0 */ - #define R2057_RXTXBIAS_CONFIG_CORE0 0x04f - #define R2057_TXGM_TXRF_PUS_CORE0 0x050 - #define R2057_TXGM_IDAC_BLEED_CORE0 0x051 -@@ -204,6 +206,8 @@ - #define R2057_RXBB_GPAIOSEL_RXLPF_RCCAL_CORE0 0x0d1 - #define R2057_LPF_GAIN_CORE0 0x0d2 - #define R2057_DACBUF_IDACS_BW_CORE0 0x0d3 -+ -+/* MISC core 1 */ - #define R2057_RXTXBIAS_CONFIG_CORE1 0x0d4 - #define R2057_TXGM_TXRF_PUS_CORE1 0x0d5 - #define R2057_TXGM_IDAC_BLEED_CORE1 0x0d6 -@@ -324,6 +328,7 @@ - #define R2057_RXBB_GPAIOSEL_RXLPF_RCCAL_CORE1 0x156 - #define R2057_LPF_GAIN_CORE1 0x157 - #define R2057_DACBUF_IDACS_BW_CORE1 0x158 -+ - #define R2057_DACBUF_VINCM_CORE1 0x159 - #define R2057_RCCAL_START_R1_Q1_P1 0x15a - #define R2057_RCCAL_X1 0x15b -@@ -345,6 +350,8 @@ - #define R2057_RCCAL_BCAP_VAL 0x16b - #define R2057_RCCAL_HPC_VAL 0x16c - #define R2057_RCCAL_OVERRIDES 0x16d -+ -+/* TX core 0 */ - #define R2057_TX0_IQCAL_GAIN_BW 0x170 - #define R2057_TX0_LOFT_FINE_I 0x171 - #define R2057_TX0_LOFT_FINE_Q 0x172 -@@ -362,6 +369,8 @@ - #define R2057_TX0_TXRXCOUPLE_2G_PWRUP 0x17e - #define R2057_TX0_TXRXCOUPLE_5G_ATTEN 0x17f - #define R2057_TX0_TXRXCOUPLE_5G_PWRUP 0x180 -+ -+/* TX core 1 */ - #define R2057_TX1_IQCAL_GAIN_BW 0x190 - #define R2057_TX1_LOFT_FINE_I 0x191 - #define R2057_TX1_LOFT_FINE_Q 0x192 -@@ -379,6 +388,7 @@ - #define R2057_TX1_TXRXCOUPLE_2G_PWRUP 0x19e - #define R2057_TX1_TXRXCOUPLE_5G_ATTEN 0x19f - #define R2057_TX1_TXRXCOUPLE_5G_PWRUP 0x1a0 -+ - #define R2057_AFE_VCM_CAL_MASTER_CORE0 0x1a1 - #define R2057_AFE_SET_VCM_I_CORE0 0x1a2 - #define R2057_AFE_SET_VCM_Q_CORE0 0x1a3 -@@ -425,6 +435,72 @@ - - #define R2057_VCM_MASK 0x7 - -+struct b43_nphy_chantabent_rev7 { -+ /* The channel frequency in MHz */ -+ u16 freq; -+ /* Radio regs values on channelswitch */ -+ u8 radio_vcocal_countval0; -+ u8 radio_vcocal_countval1; -+ u8 radio_rfpll_refmaster_sparextalsize; -+ u8 radio_rfpll_loopfilter_r1; -+ u8 radio_rfpll_loopfilter_c2; -+ u8 radio_rfpll_loopfilter_c1; -+ u8 radio_cp_kpd_idac; -+ u8 radio_rfpll_mmd0; -+ u8 radio_rfpll_mmd1; -+ u8 radio_vcobuf_tune; -+ u8 radio_logen_mx2g_tune; -+ u8 radio_logen_mx5g_tune; -+ u8 radio_logen_indbuf2g_tune; -+ u8 radio_logen_indbuf5g_tune; -+ u8 radio_txmix2g_tune_boost_pu_core0; -+ u8 radio_pad2g_tune_pus_core0; -+ u8 radio_pga_boost_tune_core0; -+ u8 radio_txmix5g_boost_tune_core0; -+ u8 radio_pad5g_tune_misc_pus_core0; -+ u8 radio_lna2g_tune_core0; -+ u8 radio_lna5g_tune_core0; -+ u8 radio_txmix2g_tune_boost_pu_core1; -+ u8 radio_pad2g_tune_pus_core1; -+ u8 radio_pga_boost_tune_core1; -+ u8 radio_txmix5g_boost_tune_core1; -+ u8 radio_pad5g_tune_misc_pus_core1; -+ u8 radio_lna2g_tune_core1; -+ u8 radio_lna5g_tune_core1; -+ /* PHY res values on channelswitch */ -+ struct b43_phy_n_sfo_cfg phy_regs; -+}; -+ -+struct b43_nphy_chantabent_rev7_2g { -+ /* The channel frequency in MHz */ -+ u16 freq; -+ /* Radio regs values on channelswitch */ -+ u8 radio_vcocal_countval0; -+ u8 radio_vcocal_countval1; -+ u8 radio_rfpll_refmaster_sparextalsize; -+ u8 radio_rfpll_loopfilter_r1; -+ u8 radio_rfpll_loopfilter_c2; -+ u8 radio_rfpll_loopfilter_c1; -+ u8 radio_cp_kpd_idac; -+ u8 radio_rfpll_mmd0; -+ u8 radio_rfpll_mmd1; -+ u8 radio_vcobuf_tune; -+ u8 radio_logen_mx2g_tune; -+ u8 radio_logen_indbuf2g_tune; -+ u8 radio_txmix2g_tune_boost_pu_core0; -+ u8 radio_pad2g_tune_pus_core0; -+ u8 radio_lna2g_tune_core0; -+ u8 radio_txmix2g_tune_boost_pu_core1; -+ u8 radio_pad2g_tune_pus_core1; -+ u8 radio_lna2g_tune_core1; -+ /* PHY regs values on channelswitch */ -+ struct b43_phy_n_sfo_cfg phy_regs; -+}; -+ - void r2057_upload_inittabs(struct b43_wldev *dev); - -+void r2057_get_chantabent_rev7(struct b43_wldev *dev, u16 freq, -+ const struct b43_nphy_chantabent_rev7 **tabent_r7, -+ const struct b43_nphy_chantabent_rev7_2g **tabent_r7_2g); -+ - #endif /* B43_RADIO_2057_H_ */ ---- a/drivers/net/wireless/b43/tables_nphy.h -+++ b/drivers/net/wireless/b43/tables_nphy.h -@@ -165,6 +165,10 @@ struct nphy_gain_ctl_workaround_entry *b - #define B43_NTAB_C1_LOFEEDTH_R3 B43_NTAB16(27, 448) /* Local Oscillator Feed Through lookup 1 */ - #define B43_NTAB_C1_PAPD_COMP_R3 B43_NTAB16(27, 576) - -+/* Static N-PHY tables, PHY revision >= 7 */ -+#define B43_NTAB_TMAP_R7 B43_NTAB32(12, 0) /* TM AP */ -+#define B43_NTAB_NOISEVAR_R7 B43_NTAB32(16, 0) /* noise variance */ -+ - #define B43_NTAB_TX_IQLO_CAL_LOFT_LADDER_40_SIZE 18 - #define B43_NTAB_TX_IQLO_CAL_LOFT_LADDER_20_SIZE 18 - #define B43_NTAB_TX_IQLO_CAL_IQIMB_LADDER_40_SIZE 18 ---- a/drivers/net/wireless/b43/xmit.c -+++ b/drivers/net/wireless/b43/xmit.c -@@ -80,9 +80,10 @@ static int b43_plcp_get_bitrate_idx_cck( - } - - /* Extract the bitrate index out of an OFDM PLCP header. */ --static int b43_plcp_get_bitrate_idx_ofdm(struct b43_plcp_hdr6 *plcp, bool aphy) -+static int b43_plcp_get_bitrate_idx_ofdm(struct b43_plcp_hdr6 *plcp, bool ghz5) - { -- int base = aphy ? 0 : 4; -+ /* For 2 GHz band first OFDM rate is at index 4, see main.c */ -+ int base = ghz5 ? 0 : 4; - - switch (plcp->raw[0] & 0xF) { - case 0xB: -@@ -767,7 +768,7 @@ void b43_rx(struct b43_wldev *dev, struc - - if (phystat0 & B43_RX_PHYST0_OFDM) - rate_idx = b43_plcp_get_bitrate_idx_ofdm(plcp, -- phytype == B43_PHYTYPE_A); -+ !!(chanstat & B43_RX_CHAN_5GHZ)); - else - rate_idx = b43_plcp_get_bitrate_idx_cck(plcp); - if (unlikely(rate_idx == -1)) { ---- a/.local-symbols -+++ b/.local-symbols -@@ -176,6 +176,7 @@ B43_PCMCIA= - B43_SDIO= - B43_BCMA_PIO= - B43_PIO= -+B43_PHY_G= - B43_PHY_N= - B43_PHY_LP= - B43_PHY_HT= -- cgit v1.2.3