summaryrefslogtreecommitdiffstats
path: root/package/kernel/mac80211/patches/800-b43-backports-form-wireless-testing-master-master-20.patch
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2014-09-27 20:51:43 +0000
committerFelix Fietkau <nbd@openwrt.org>2014-09-27 20:51:43 +0000
commit8be721208dad06c6a3119dee2db81c385a91a336 (patch)
tree70eddd3a592f75ebfb105dc619735d0c5178c471 /package/kernel/mac80211/patches/800-b43-backports-form-wireless-testing-master-master-20.patch
parent54a18b3fe80d6cfe06acda47c7d4d82c0d0e5688 (diff)
downloadmaster-31e0f0ae-8be721208dad06c6a3119dee2db81c385a91a336.tar.gz
master-31e0f0ae-8be721208dad06c6a3119dee2db81c385a91a336.tar.bz2
master-31e0f0ae-8be721208dad06c6a3119dee2db81c385a91a336.zip
mac80211: update to wireless-testing 2014-09-26
Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 42683
Diffstat (limited to 'package/kernel/mac80211/patches/800-b43-backports-form-wireless-testing-master-master-20.patch')
-rw-r--r--package/kernel/mac80211/patches/800-b43-backports-form-wireless-testing-master-master-20.patch5202
1 files changed, 0 insertions, 5202 deletions
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=