diff options
Diffstat (limited to 'drivers/net/wireless/b43')
| -rw-r--r-- | drivers/net/wireless/b43/Kconfig | 6 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/b43.h | 10 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/dma.c | 9 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/main.c | 38 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/phy_ht.c | 706 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/phy_ht.h | 83 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/phy_lcn.c | 5 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/phy_lp.c | 16 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/phy_n.c | 714 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/phy_n.h | 146 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/radio_2056.c | 6 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/radio_2059.c | 39 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/radio_2059.h | 14 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/sdio.h | 4 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/tables_nphy.c | 101 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/tables_nphy.h | 29 | ||||
| -rw-r--r-- | drivers/net/wireless/b43/tables_phy_lcn.c | 6 | 
17 files changed, 1325 insertions, 607 deletions
diff --git a/drivers/net/wireless/b43/Kconfig b/drivers/net/wireless/b43/Kconfig index 287c6b670a3..078e6f3477a 100644 --- a/drivers/net/wireless/b43/Kconfig +++ b/drivers/net/wireless/b43/Kconfig @@ -131,7 +131,7 @@ config B43_PHY_LP  config B43_PHY_HT  	bool "Support for HT-PHY (high throughput) devices" -	depends on B43 +	depends on B43 && B43_BCMA  	---help---  	  Support for the HT-PHY. @@ -166,8 +166,8 @@ config B43_DEBUG  	  Broadcom 43xx debugging.  	  This adds additional runtime sanity checks and statistics to the driver. -	  These checks and statistics might me expensive and hurt runtime performance -	  of your system. +	  These checks and statistics might be expensive and hurt the runtime +	  performance of your system.  	  This also adds the b43 debugfs interface.  	  Do not enable this, unless you are debugging the driver. diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h index 10e288d470e..7f3d461f7e8 100644 --- a/drivers/net/wireless/b43/b43.h +++ b/drivers/net/wireless/b43/b43.h @@ -285,7 +285,9 @@ enum {  #define B43_SHM_SH_DTIMPER		0x0012	/* DTIM period */  #define B43_SHM_SH_NOSLPZNATDTIM	0x004C	/* NOSLPZNAT DTIM */  /* SHM_SHARED beacon/AP variables */ +#define B43_SHM_SH_BT_BASE0		0x0068	/* Beacon template base 0 */  #define B43_SHM_SH_BTL0			0x0018	/* Beacon template length 0 */ +#define B43_SHM_SH_BT_BASE1		0x0468	/* Beacon template base 1 */  #define B43_SHM_SH_BTL1			0x001A	/* Beacon template length 1 */  #define B43_SHM_SH_BTSFOFF		0x001C	/* Beacon TSF offset */  #define B43_SHM_SH_TIMBPOS		0x001E	/* TIM B position in beacon */ @@ -473,6 +475,12 @@ enum {  #define B43_MACCMD_CCA			0x00000008	/* Clear channel assessment */  #define B43_MACCMD_BGNOISE		0x00000010	/* Background noise */ +/* See BCMA_CLKCTLST_EXTRESREQ and BCMA_CLKCTLST_EXTRESST */ +#define B43_BCMA_CLKCTLST_80211_PLL_REQ	0x00000100 +#define B43_BCMA_CLKCTLST_PHY_PLL_REQ	0x00000200 +#define B43_BCMA_CLKCTLST_80211_PLL_ST	0x01000000 +#define B43_BCMA_CLKCTLST_PHY_PLL_ST	0x02000000 +  /* BCMA 802.11 core specific IO Control (BCMA_IOCTL) flags */  #define B43_BCMA_IOCTL_PHY_CLKEN	0x00000004	/* PHY Clock Enable */  #define B43_BCMA_IOCTL_PHY_RESET	0x00000008	/* PHY Reset */ @@ -972,7 +980,7 @@ static inline int b43_is_mode(struct b43_wl *wl, int type)   */  static inline enum ieee80211_band b43_current_band(struct b43_wl *wl)  { -	return wl->hw->conf.channel->band; +	return wl->hw->conf.chandef.chan->band;  }  static inline int b43_bus_may_powerdown(struct b43_wldev *wldev) diff --git a/drivers/net/wireless/b43/dma.c b/drivers/net/wireless/b43/dma.c index 122146943bf..523355b8765 100644 --- a/drivers/net/wireless/b43/dma.c +++ b/drivers/net/wireless/b43/dma.c @@ -419,8 +419,6 @@ static inline  static int alloc_ringmemory(struct b43_dmaring *ring)  { -	gfp_t flags = GFP_KERNEL; -  	/* The specs call for 4K buffers for 30- and 32-bit DMA with 4K  	 * alignment and 8K buffers for 64-bit DMA with 8K alignment.  	 * In practice we could use smaller buffers for the latter, but the @@ -435,12 +433,9 @@ static int alloc_ringmemory(struct b43_dmaring *ring)  	ring->descbase = dma_alloc_coherent(ring->dev->dev->dma_dev,  					    ring_mem_size, &(ring->dmabase), -					    flags); -	if (!ring->descbase) { -		b43err(ring->dev->wl, "DMA ringmemory allocation failed\n"); +					    GFP_KERNEL | __GFP_ZERO); +	if (!ring->descbase)  		return -ENOMEM; -	} -	memset(ring->descbase, 0, ring_mem_size);  	return 0;  } diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index 05682736e46..d377f77d30b 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c @@ -1189,10 +1189,15 @@ static void b43_bcma_phy_reset(struct b43_wldev *dev)  static void b43_bcma_wireless_core_reset(struct b43_wldev *dev, bool gmode)  { +	u32 req = B43_BCMA_CLKCTLST_80211_PLL_REQ | +		  B43_BCMA_CLKCTLST_PHY_PLL_REQ; +	u32 status = B43_BCMA_CLKCTLST_80211_PLL_ST | +		     B43_BCMA_CLKCTLST_PHY_PLL_ST; +  	b43_device_enable(dev, B43_BCMA_IOCTL_PHY_CLKEN);  	bcma_core_set_clockmode(dev->dev->bdev, BCMA_CLKMODE_FAST);  	b43_bcma_phy_reset(dev); -	bcma_core_pll_ctl(dev->dev->bdev, 0x300, 0x3000000, true); +	bcma_core_pll_ctl(dev->dev->bdev, req, status, true);  }  #endif @@ -1305,17 +1310,19 @@ static u32 b43_jssi_read(struct b43_wldev *dev)  {  	u32 val = 0; -	val = b43_shm_read16(dev, B43_SHM_SHARED, 0x08A); +	val = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_JSSI1);  	val <<= 16; -	val |= b43_shm_read16(dev, B43_SHM_SHARED, 0x088); +	val |= b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_JSSI0);  	return val;  }  static void b43_jssi_write(struct b43_wldev *dev, u32 jssi)  { -	b43_shm_write16(dev, B43_SHM_SHARED, 0x088, (jssi & 0x0000FFFF)); -	b43_shm_write16(dev, B43_SHM_SHARED, 0x08A, (jssi & 0xFFFF0000) >> 16); +	b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_JSSI0, +			(jssi & 0x0000FFFF)); +	b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_JSSI1, +			(jssi & 0xFFFF0000) >> 16);  }  static void b43_generate_noise_sample(struct b43_wldev *dev) @@ -1618,7 +1625,7 @@ static void b43_upload_beacon0(struct b43_wldev *dev)  	if (wl->beacon0_uploaded)  		return; -	b43_write_beacon_template(dev, 0x68, 0x18); +	b43_write_beacon_template(dev, B43_SHM_SH_BT_BASE0, B43_SHM_SH_BTL0);  	wl->beacon0_uploaded = true;  } @@ -1628,7 +1635,7 @@ static void b43_upload_beacon1(struct b43_wldev *dev)  	if (wl->beacon1_uploaded)  		return; -	b43_write_beacon_template(dev, 0x468, 0x1A); +	b43_write_beacon_template(dev, B43_SHM_SH_BT_BASE1, B43_SHM_SH_BTL1);  	wl->beacon1_uploaded = true;  } @@ -2775,9 +2782,7 @@ static int b43_gpio_init(struct b43_wldev *dev)  	switch (dev->dev->bus_type) {  #ifdef CONFIG_B43_BCMA  	case B43_BUS_BCMA: -		bcma_cc_write32(&dev->dev->bdev->bus->drv_cc, BCMA_CC_GPIOCTL, -				(bcma_cc_read32(&dev->dev->bdev->bus->drv_cc, -					BCMA_CC_GPIOCTL) & ~mask) | set); +		bcma_chipco_gpio_control(&dev->dev->bdev->bus->drv_cc, mask, set);  		break;  #endif  #ifdef CONFIG_B43_SSB @@ -2802,8 +2807,7 @@ static void b43_gpio_cleanup(struct b43_wldev *dev)  	switch (dev->dev->bus_type) {  #ifdef CONFIG_B43_BCMA  	case B43_BUS_BCMA: -		bcma_cc_write32(&dev->dev->bdev->bus->drv_cc, BCMA_CC_GPIOCTL, -				0); +		bcma_chipco_gpio_control(&dev->dev->bdev->bus->drv_cc, ~0, 0);  		break;  #endif  #ifdef CONFIG_B43_SSB @@ -3111,7 +3115,7 @@ static int b43_chip_init(struct b43_wldev *dev)  	/* Probe Response Timeout value */  	/* FIXME: Default to 0, has to be set by ioctl probably... :-/ */ -	b43_shm_write16(dev, B43_SHM_SHARED, 0x0074, 0x0000); +	b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_PRMAXTIME, 0);  	/* Initially set the wireless operation mode. */  	b43_adjust_opmode(dev); @@ -3848,7 +3852,7 @@ static int b43_op_config(struct ieee80211_hw *hw, u32 changed)  	dev = wl->current_dev;  	/* Switch the band (if necessary). This might change the active core. */ -	err = b43_switch_band(wl, conf->channel); +	err = b43_switch_band(wl, conf->chandef.chan);  	if (err)  		goto out_unlock_mutex; @@ -3878,8 +3882,8 @@ static int b43_op_config(struct ieee80211_hw *hw, u32 changed)  	/* Switch to the requested channel.  	 * The firmware takes care of races with the TX handler. */ -	if (conf->channel->hw_value != phy->channel) -		b43_switch_channel(dev, conf->channel->hw_value); +	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); @@ -5002,7 +5006,7 @@ static int b43_op_get_survey(struct ieee80211_hw *hw, int idx,  	if (idx != 0)  		return -ENOENT; -	survey->channel = conf->channel; +	survey->channel = conf->chandef.chan;  	survey->filled = SURVEY_INFO_NOISE_DBM;  	survey->noise = dev->stats.link_noise; diff --git a/drivers/net/wireless/b43/phy_ht.c b/drivers/net/wireless/b43/phy_ht.c index 7416c5e9154..5d6833f1849 100644 --- a/drivers/net/wireless/b43/phy_ht.c +++ b/drivers/net/wireless/b43/phy_ht.c @@ -30,6 +30,17 @@  #include "radio_2059.h"  #include "main.h" +/* Force values to keep compatibility with wl */ +enum ht_rssi_type { +	HT_RSSI_W1 = 0, +	HT_RSSI_W2 = 1, +	HT_RSSI_NB = 2, +	HT_RSSI_IQ = 3, +	HT_RSSI_TSSI_2G = 4, +	HT_RSSI_TSSI_5G = 5, +	HT_RSSI_TBD = 6, +}; +  /**************************************************   * Radio 2059.   **************************************************/ @@ -37,8 +48,9 @@  static void b43_radio_2059_channel_setup(struct b43_wldev *dev,  			const struct b43_phy_ht_channeltab_e_radio2059 *e)  { -	u8 i; -	u16 routing; +	static const u16 routing[] = { R2059_C1, R2059_C2, R2059_C3, }; +	u16 r; +	int core;  	b43_radio_write(dev, 0x16, e->radio_syn16);  	b43_radio_write(dev, 0x17, e->radio_syn17); @@ -53,25 +65,17 @@ static void b43_radio_2059_channel_setup(struct b43_wldev *dev,  	b43_radio_write(dev, 0x41, e->radio_syn41);  	b43_radio_write(dev, 0x43, e->radio_syn43);  	b43_radio_write(dev, 0x47, e->radio_syn47); -	b43_radio_write(dev, 0x4a, e->radio_syn4a); -	b43_radio_write(dev, 0x58, e->radio_syn58); -	b43_radio_write(dev, 0x5a, e->radio_syn5a); -	b43_radio_write(dev, 0x6a, e->radio_syn6a); -	b43_radio_write(dev, 0x6d, e->radio_syn6d); -	b43_radio_write(dev, 0x6e, e->radio_syn6e); -	b43_radio_write(dev, 0x92, e->radio_syn92); -	b43_radio_write(dev, 0x98, e->radio_syn98); -	for (i = 0; i < 2; i++) { -		routing = i ? R2059_RXRX1 : R2059_TXRX0; -		b43_radio_write(dev, routing | 0x4a, e->radio_rxtx4a); -		b43_radio_write(dev, routing | 0x58, e->radio_rxtx58); -		b43_radio_write(dev, routing | 0x5a, e->radio_rxtx5a); -		b43_radio_write(dev, routing | 0x6a, e->radio_rxtx6a); -		b43_radio_write(dev, routing | 0x6d, e->radio_rxtx6d); -		b43_radio_write(dev, routing | 0x6e, e->radio_rxtx6e); -		b43_radio_write(dev, routing | 0x92, e->radio_rxtx92); -		b43_radio_write(dev, routing | 0x98, e->radio_rxtx98); +	for (core = 0; core < 3; core++) { +		r = routing[core]; +		b43_radio_write(dev, r | 0x4a, e->radio_rxtx4a); +		b43_radio_write(dev, r | 0x58, e->radio_rxtx58); +		b43_radio_write(dev, r | 0x5a, e->radio_rxtx5a); +		b43_radio_write(dev, r | 0x6a, e->radio_rxtx6a); +		b43_radio_write(dev, r | 0x6d, e->radio_rxtx6d); +		b43_radio_write(dev, r | 0x6e, e->radio_rxtx6e); +		b43_radio_write(dev, r | 0x92, e->radio_rxtx92); +		b43_radio_write(dev, r | 0x98, e->radio_rxtx98);  	}  	udelay(50); @@ -87,7 +91,7 @@ static void b43_radio_2059_channel_setup(struct b43_wldev *dev,  static void b43_radio_2059_init(struct b43_wldev *dev)  { -	const u16 routing[] = { R2059_SYN, R2059_TXRX0, R2059_RXRX1 }; +	const u16 routing[] = { R2059_C1, R2059_C2, R2059_C3 };  	const u16 radio_values[3][2] = {  		{ 0x61, 0xE9 }, { 0x69, 0xD5 }, { 0x73, 0x99 },  	}; @@ -106,17 +110,17 @@ static void b43_radio_2059_init(struct b43_wldev *dev)  	b43_radio_mask(dev, 0xc0, ~0x0080);  	if (1) { /* FIXME */ -		b43_radio_set(dev, R2059_RXRX1 | 0x4, 0x1); +		b43_radio_set(dev, R2059_C3 | 0x4, 0x1);  		udelay(10); -		b43_radio_set(dev, R2059_RXRX1 | 0x0BF, 0x1); -		b43_radio_maskset(dev, R2059_RXRX1 | 0x19B, 0x3, 0x2); +		b43_radio_set(dev, R2059_C3 | 0x0BF, 0x1); +		b43_radio_maskset(dev, R2059_C3 | 0x19B, 0x3, 0x2); -		b43_radio_set(dev, R2059_RXRX1 | 0x4, 0x2); +		b43_radio_set(dev, R2059_C3 | 0x4, 0x2);  		udelay(100); -		b43_radio_mask(dev, R2059_RXRX1 | 0x4, ~0x2); +		b43_radio_mask(dev, R2059_C3 | 0x4, ~0x2);  		for (i = 0; i < 10000; i++) { -			if (b43_radio_read(dev, R2059_RXRX1 | 0x145) & 1) { +			if (b43_radio_read(dev, R2059_C3 | 0x145) & 1) {  				i = 0;  				break;  			} @@ -125,7 +129,7 @@ static void b43_radio_2059_init(struct b43_wldev *dev)  		if (i)  			b43err(dev->wl, "radio 0x945 timeout\n"); -		b43_radio_mask(dev, R2059_RXRX1 | 0x4, ~0x1); +		b43_radio_mask(dev, R2059_C3 | 0x4, ~0x1);  		b43_radio_set(dev, 0xa, 0x60);  		for (i = 0; i < 3; i++) { @@ -154,9 +158,84 @@ static void b43_radio_2059_init(struct b43_wldev *dev)  }  /************************************************** + * RF + **************************************************/ + +static void b43_phy_ht_force_rf_sequence(struct b43_wldev *dev, u16 rf_seq) +{ +	u8 i; + +	u16 save_seq_mode = b43_phy_read(dev, B43_PHY_HT_RF_SEQ_MODE); +	b43_phy_set(dev, B43_PHY_HT_RF_SEQ_MODE, 0x3); + +	b43_phy_set(dev, B43_PHY_HT_RF_SEQ_TRIG, rf_seq); +	for (i = 0; i < 200; i++) { +		if (!(b43_phy_read(dev, B43_PHY_HT_RF_SEQ_STATUS) & rf_seq)) { +			i = 0; +			break; +		} +		msleep(1); +	} +	if (i) +		b43err(dev->wl, "Forcing RF sequence timeout\n"); + +	b43_phy_write(dev, B43_PHY_HT_RF_SEQ_MODE, save_seq_mode); +} + +static void b43_phy_ht_pa_override(struct b43_wldev *dev, bool enable) +{ +	struct b43_phy_ht *htphy = dev->phy.ht; +	static const u16 regs[3] = { B43_PHY_HT_RF_CTL_INT_C1, +				     B43_PHY_HT_RF_CTL_INT_C2, +				     B43_PHY_HT_RF_CTL_INT_C3 }; +	int i; + +	if (enable) { +		for (i = 0; i < 3; i++) +			b43_phy_write(dev, regs[i], htphy->rf_ctl_int_save[i]); +	} else { +		for (i = 0; i < 3; i++) +			htphy->rf_ctl_int_save[i] = b43_phy_read(dev, regs[i]); +		/* TODO: Does 5GHz band use different value (not 0x0400)? */ +		for (i = 0; i < 3; i++) +			b43_phy_write(dev, regs[i], 0x0400); +	} +} + +/**************************************************   * Various PHY ops   **************************************************/ +static u16 b43_phy_ht_classifier(struct b43_wldev *dev, u16 mask, u16 val) +{ +	u16 tmp; +	u16 allowed = B43_PHY_HT_CLASS_CTL_CCK_EN | +		      B43_PHY_HT_CLASS_CTL_OFDM_EN | +		      B43_PHY_HT_CLASS_CTL_WAITED_EN; + +	tmp = b43_phy_read(dev, B43_PHY_HT_CLASS_CTL); +	tmp &= allowed; +	tmp &= ~mask; +	tmp |= (val & mask); +	b43_phy_maskset(dev, B43_PHY_HT_CLASS_CTL, ~allowed, tmp); + +	return tmp; +} + +static void b43_phy_ht_reset_cca(struct b43_wldev *dev) +{ +	u16 bbcfg; + +	b43_phy_force_clock(dev, true); +	bbcfg = b43_phy_read(dev, B43_PHY_HT_BBCFG); +	b43_phy_write(dev, B43_PHY_HT_BBCFG, bbcfg | B43_PHY_HT_BBCFG_RSTCCA); +	udelay(1); +	b43_phy_write(dev, B43_PHY_HT_BBCFG, bbcfg & ~B43_PHY_HT_BBCFG_RSTCCA); +	b43_phy_force_clock(dev, false); + +	b43_phy_ht_force_rf_sequence(dev, B43_PHY_HT_RF_SEQ_TRIG_RST2RX); +} +  static void b43_phy_ht_zero_extg(struct b43_wldev *dev)  {  	u8 i, j; @@ -176,10 +255,10 @@ static void b43_phy_ht_afe_unk1(struct b43_wldev *dev)  {  	u8 i; -	const u16 ctl_regs[3][2] = { -		{ B43_PHY_HT_AFE_CTL1, B43_PHY_HT_AFE_CTL2 }, -		{ B43_PHY_HT_AFE_CTL3, B43_PHY_HT_AFE_CTL4 }, -		{ B43_PHY_HT_AFE_CTL5, B43_PHY_HT_AFE_CTL6}, +	static const u16 ctl_regs[3][2] = { +		{ B43_PHY_HT_AFE_C1_OVER, B43_PHY_HT_AFE_C1 }, +		{ B43_PHY_HT_AFE_C2_OVER, B43_PHY_HT_AFE_C2 }, +		{ B43_PHY_HT_AFE_C3_OVER, B43_PHY_HT_AFE_C3},  	};  	for (i = 0; i < 3; i++) { @@ -193,27 +272,6 @@ static void b43_phy_ht_afe_unk1(struct b43_wldev *dev)  	}  } -static void b43_phy_ht_force_rf_sequence(struct b43_wldev *dev, u16 rf_seq) -{ -	u8 i; - -	u16 save_seq_mode = b43_phy_read(dev, B43_PHY_HT_RF_SEQ_MODE); -	b43_phy_set(dev, B43_PHY_HT_RF_SEQ_MODE, 0x3); - -	b43_phy_set(dev, B43_PHY_HT_RF_SEQ_TRIG, rf_seq); -	for (i = 0; i < 200; i++) { -		if (!(b43_phy_read(dev, B43_PHY_HT_RF_SEQ_STATUS) & rf_seq)) { -			i = 0; -			break; -		} -		msleep(1); -	} -	if (i) -		b43err(dev->wl, "Forcing RF sequence timeout\n"); - -	b43_phy_write(dev, B43_PHY_HT_RF_SEQ_MODE, save_seq_mode); -} -  static void b43_phy_ht_read_clip_detection(struct b43_wldev *dev, u16 *clip_st)  {  	clip_st[0] = b43_phy_read(dev, B43_PHY_HT_C1_CLIP1THRES); @@ -240,15 +298,456 @@ static void b43_phy_ht_bphy_init(struct b43_wldev *dev)  }  /************************************************** + * Samples + **************************************************/ + +static void b43_phy_ht_stop_playback(struct b43_wldev *dev) +{ +	struct b43_phy_ht *phy_ht = dev->phy.ht; +	u16 tmp; +	int i; + +	tmp = b43_phy_read(dev, B43_PHY_HT_SAMP_STAT); +	if (tmp & 0x1) +		b43_phy_set(dev, B43_PHY_HT_SAMP_CMD, B43_PHY_HT_SAMP_CMD_STOP); +	else if (tmp & 0x2) +		b43_phy_mask(dev, B43_PHY_HT_IQLOCAL_CMDGCTL, 0x7FFF); + +	b43_phy_mask(dev, B43_PHY_HT_SAMP_CMD, ~0x0004); + +	for (i = 0; i < 3; i++) { +		if (phy_ht->bb_mult_save[i] >= 0) { +			b43_httab_write(dev, B43_HTTAB16(13, 0x63 + i * 4), +					phy_ht->bb_mult_save[i]); +			b43_httab_write(dev, B43_HTTAB16(13, 0x67 + i * 4), +					phy_ht->bb_mult_save[i]); +		} +	} +} + +static u16 b43_phy_ht_load_samples(struct b43_wldev *dev) +{ +	int i; +	u16 len = 20 << 3; + +	b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, 0x4400); + +	for (i = 0; i < len; i++) { +		b43_phy_write(dev, B43_PHY_HT_TABLE_DATAHI, 0); +		b43_phy_write(dev, B43_PHY_HT_TABLE_DATALO, 0); +	} + +	return len; +} + +static void b43_phy_ht_run_samples(struct b43_wldev *dev, u16 samps, u16 loops, +				   u16 wait) +{ +	struct b43_phy_ht *phy_ht = dev->phy.ht; +	u16 save_seq_mode; +	int i; + +	for (i = 0; i < 3; i++) { +		if (phy_ht->bb_mult_save[i] < 0) +			phy_ht->bb_mult_save[i] = b43_httab_read(dev, B43_HTTAB16(13, 0x63 + i * 4)); +	} + +	b43_phy_write(dev, B43_PHY_HT_SAMP_DEP_CNT, samps - 1); +	if (loops != 0xFFFF) +		loops--; +	b43_phy_write(dev, B43_PHY_HT_SAMP_LOOP_CNT, loops); +	b43_phy_write(dev, B43_PHY_HT_SAMP_WAIT_CNT, wait); + +	save_seq_mode = b43_phy_read(dev, B43_PHY_HT_RF_SEQ_MODE); +	b43_phy_set(dev, B43_PHY_HT_RF_SEQ_MODE, +		    B43_PHY_HT_RF_SEQ_MODE_CA_OVER); + +	/* TODO: find out mask bits! Do we need more function arguments? */ +	b43_phy_mask(dev, B43_PHY_HT_SAMP_CMD, ~0); +	b43_phy_mask(dev, B43_PHY_HT_SAMP_CMD, ~0); +	b43_phy_mask(dev, B43_PHY_HT_IQLOCAL_CMDGCTL, ~0); +	b43_phy_set(dev, B43_PHY_HT_SAMP_CMD, 0x1); + +	for (i = 0; i < 100; i++) { +		if (!(b43_phy_read(dev, B43_PHY_HT_RF_SEQ_STATUS) & 1)) { +			i = 0; +			break; +		} +		udelay(10); +	} +	if (i) +		b43err(dev->wl, "run samples timeout\n"); + +	b43_phy_write(dev, B43_PHY_HT_RF_SEQ_MODE, save_seq_mode); +} + +static void b43_phy_ht_tx_tone(struct b43_wldev *dev) +{ +	u16 samp; + +	samp = b43_phy_ht_load_samples(dev); +	b43_phy_ht_run_samples(dev, samp, 0xFFFF, 0); +} + +/************************************************** + * RSSI + **************************************************/ + +static void b43_phy_ht_rssi_select(struct b43_wldev *dev, u8 core_sel, +				   enum ht_rssi_type rssi_type) +{ +	static const u16 ctl_regs[3][2] = { +		{ B43_PHY_HT_AFE_C1, B43_PHY_HT_AFE_C1_OVER, }, +		{ B43_PHY_HT_AFE_C2, B43_PHY_HT_AFE_C2_OVER, }, +		{ B43_PHY_HT_AFE_C3, B43_PHY_HT_AFE_C3_OVER, }, +	}; +	static const u16 radio_r[] = { R2059_C1, R2059_C2, R2059_C3, }; +	int core; + +	if (core_sel == 0) { +		b43err(dev->wl, "RSSI selection for core off not implemented yet\n"); +	} else { +		for (core = 0; core < 3; core++) { +			/* Check if caller requested a one specific core */ +			if ((core_sel == 1 && core != 0) || +			    (core_sel == 2 && core != 1) || +			    (core_sel == 3 && core != 2)) +				continue; + +			switch (rssi_type) { +			case HT_RSSI_TSSI_2G: +				b43_phy_set(dev, ctl_regs[core][0], 0x3 << 8); +				b43_phy_set(dev, ctl_regs[core][0], 0x3 << 10); +				b43_phy_set(dev, ctl_regs[core][1], 0x1 << 9); +				b43_phy_set(dev, ctl_regs[core][1], 0x1 << 10); + +				b43_radio_set(dev, R2059_C3 | 0xbf, 0x1); +				b43_radio_write(dev, radio_r[core] | 0x159, +						0x11); +				break; +			default: +				b43err(dev->wl, "RSSI selection for type %d not implemented yet\n", +				       rssi_type); +			} +		} +	} +} + +static void b43_phy_ht_poll_rssi(struct b43_wldev *dev, enum ht_rssi_type type, +				 s32 *buf, u8 nsamp) +{ +	u16 phy_regs_values[12]; +	static const u16 phy_regs_to_save[] = { +		B43_PHY_HT_AFE_C1, B43_PHY_HT_AFE_C1_OVER, +		0x848, 0x841, +		B43_PHY_HT_AFE_C2, B43_PHY_HT_AFE_C2_OVER, +		0x868, 0x861, +		B43_PHY_HT_AFE_C3, B43_PHY_HT_AFE_C3_OVER, +		0x888, 0x881, +	}; +	u16 tmp[3]; +	int i; + +	for (i = 0; i < 12; i++) +		phy_regs_values[i] = b43_phy_read(dev, phy_regs_to_save[i]); + +	b43_phy_ht_rssi_select(dev, 5, type); + +	for (i = 0; i < 6; i++) +		buf[i] = 0; + +	for (i = 0; i < nsamp; i++) { +		tmp[0] = b43_phy_read(dev, B43_PHY_HT_RSSI_C1); +		tmp[1] = b43_phy_read(dev, B43_PHY_HT_RSSI_C2); +		tmp[2] = b43_phy_read(dev, B43_PHY_HT_RSSI_C3); + +		buf[0] += ((s8)((tmp[0] & 0x3F) << 2)) >> 2; +		buf[1] += ((s8)(((tmp[0] >> 8) & 0x3F) << 2)) >> 2; +		buf[2] += ((s8)((tmp[1] & 0x3F) << 2)) >> 2; +		buf[3] += ((s8)(((tmp[1] >> 8) & 0x3F) << 2)) >> 2; +		buf[4] += ((s8)((tmp[2] & 0x3F) << 2)) >> 2; +		buf[5] += ((s8)(((tmp[2] >> 8) & 0x3F) << 2)) >> 2; +	} + +	for (i = 0; i < 12; i++) +		b43_phy_write(dev, phy_regs_to_save[i], phy_regs_values[i]); +} + +/************************************************** + * Tx/Rx + **************************************************/ + +static void b43_phy_ht_tx_power_fix(struct b43_wldev *dev) +{ +	int i; + +	for (i = 0; i < 3; i++) { +		u16 mask; +		u32 tmp = b43_httab_read(dev, B43_HTTAB32(26, 0xE8)); + +		if (0) /* FIXME */ +			mask = 0x2 << (i * 4); +		else +			mask = 0; +		b43_phy_mask(dev, B43_PHY_EXTG(0x108), mask); + +		b43_httab_write(dev, B43_HTTAB16(7, 0x110 + i), tmp >> 16); +		b43_httab_write(dev, B43_HTTAB8(13, 0x63 + (i * 4)), +				tmp & 0xFF); +		b43_httab_write(dev, B43_HTTAB8(13, 0x73 + (i * 4)), +				tmp & 0xFF); +	} +} + +static void b43_phy_ht_tx_power_ctl(struct b43_wldev *dev, bool enable) +{ +	struct b43_phy_ht *phy_ht = dev->phy.ht; +	u16 en_bits = B43_PHY_HT_TXPCTL_CMD_C1_COEFF | +		      B43_PHY_HT_TXPCTL_CMD_C1_HWPCTLEN | +		      B43_PHY_HT_TXPCTL_CMD_C1_PCTLEN; +	static const u16 cmd_regs[3] = { B43_PHY_HT_TXPCTL_CMD_C1, +					 B43_PHY_HT_TXPCTL_CMD_C2, +					 B43_PHY_HT_TXPCTL_CMD_C3 }; +	static const u16 status_regs[3] = { B43_PHY_HT_TX_PCTL_STATUS_C1, +					    B43_PHY_HT_TX_PCTL_STATUS_C2, +					    B43_PHY_HT_TX_PCTL_STATUS_C3 }; +	int i; + +	if (!enable) { +		if (b43_phy_read(dev, B43_PHY_HT_TXPCTL_CMD_C1) & en_bits) { +			/* We disable enabled TX pwr ctl, save it's state */ +			for (i = 0; i < 3; i++) +				phy_ht->tx_pwr_idx[i] = +					b43_phy_read(dev, status_regs[i]); +		} +		b43_phy_mask(dev, B43_PHY_HT_TXPCTL_CMD_C1, ~en_bits); +	} else { +		b43_phy_set(dev, B43_PHY_HT_TXPCTL_CMD_C1, en_bits); + +		if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) { +			for (i = 0; i < 3; i++) +				b43_phy_write(dev, cmd_regs[i], 0x32); +		} + +		for (i = 0; i < 3; i++) +			if (phy_ht->tx_pwr_idx[i] <= +			    B43_PHY_HT_TXPCTL_CMD_C1_INIT) +				b43_phy_write(dev, cmd_regs[i], +					      phy_ht->tx_pwr_idx[i]); +	} + +	phy_ht->tx_pwr_ctl = enable; +} + +static void b43_phy_ht_tx_power_ctl_idle_tssi(struct b43_wldev *dev) +{ +	struct b43_phy_ht *phy_ht = dev->phy.ht; +	static const u16 base[] = { 0x840, 0x860, 0x880 }; +	u16 save_regs[3][3]; +	s32 rssi_buf[6]; +	int core; + +	for (core = 0; core < 3; core++) { +		save_regs[core][1] = b43_phy_read(dev, base[core] + 6); +		save_regs[core][2] = b43_phy_read(dev, base[core] + 7); +		save_regs[core][0] = b43_phy_read(dev, base[core] + 0); + +		b43_phy_write(dev, base[core] + 6, 0); +		b43_phy_mask(dev, base[core] + 7, ~0xF); /* 0xF? Or just 0x6? */ +		b43_phy_set(dev, base[core] + 0, 0x0400); +		b43_phy_set(dev, base[core] + 0, 0x1000); +	} + +	b43_phy_ht_tx_tone(dev); +	udelay(20); +	b43_phy_ht_poll_rssi(dev, HT_RSSI_TSSI_2G, rssi_buf, 1); +	b43_phy_ht_stop_playback(dev); +	b43_phy_ht_reset_cca(dev); + +	phy_ht->idle_tssi[0] = rssi_buf[0] & 0xff; +	phy_ht->idle_tssi[1] = rssi_buf[2] & 0xff; +	phy_ht->idle_tssi[2] = rssi_buf[4] & 0xff; + +	for (core = 0; core < 3; core++) { +		b43_phy_write(dev, base[core] + 0, save_regs[core][0]); +		b43_phy_write(dev, base[core] + 6, save_regs[core][1]); +		b43_phy_write(dev, base[core] + 7, save_regs[core][2]); +	} +} + +static void b43_phy_ht_tssi_setup(struct b43_wldev *dev) +{ +	static const u16 routing[] = { R2059_C1, R2059_C2, R2059_C3, }; +	int core; + +	/* 0x159 is probably TX_SSI_MUX or TSSIG (by comparing to N-PHY) */ +	for (core = 0; core < 3; core++) { +		b43_radio_set(dev, 0x8bf, 0x1); +		b43_radio_write(dev, routing[core] | 0x0159, 0x0011); +	} +} + +static void b43_phy_ht_tx_power_ctl_setup(struct b43_wldev *dev) +{ +	struct b43_phy_ht *phy_ht = dev->phy.ht; +	struct ssb_sprom *sprom = dev->dev->bus_sprom; + +	u8 *idle = phy_ht->idle_tssi; +	u8 target[3]; +	s16 a1[3], b0[3], b1[3]; + +	u16 freq = dev->phy.channel_freq; +	int i, c; + +	if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) { +		for (c = 0; c < 3; c++) { +			target[c] = sprom->core_pwr_info[c].maxpwr_2g; +			a1[c] = sprom->core_pwr_info[c].pa_2g[0]; +			b0[c] = sprom->core_pwr_info[c].pa_2g[1]; +			b1[c] = sprom->core_pwr_info[c].pa_2g[2]; +		} +	} else if (freq >= 4900 && freq < 5100) { +		for (c = 0; c < 3; c++) { +			target[c] = sprom->core_pwr_info[c].maxpwr_5gl; +			a1[c] = sprom->core_pwr_info[c].pa_5gl[0]; +			b0[c] = sprom->core_pwr_info[c].pa_5gl[1]; +			b1[c] = sprom->core_pwr_info[c].pa_5gl[2]; +		} +	} else if (freq >= 5100 && freq < 5500) { +		for (c = 0; c < 3; c++) { +			target[c] = sprom->core_pwr_info[c].maxpwr_5g; +			a1[c] = sprom->core_pwr_info[c].pa_5g[0]; +			b0[c] = sprom->core_pwr_info[c].pa_5g[1]; +			b1[c] = sprom->core_pwr_info[c].pa_5g[2]; +		} +	} else if (freq >= 5500) { +		for (c = 0; c < 3; c++) { +			target[c] = sprom->core_pwr_info[c].maxpwr_5gh; +			a1[c] = sprom->core_pwr_info[c].pa_5gh[0]; +			b0[c] = sprom->core_pwr_info[c].pa_5gh[1]; +			b1[c] = sprom->core_pwr_info[c].pa_5gh[2]; +		} +	} else { +		target[0] = target[1] = target[2] = 52; +		a1[0] = a1[1] = a1[2] = -424; +		b0[0] = b0[1] = b0[2] = 5612; +		b1[0] = b1[1] = b1[2] = -1393; +	} + +	b43_phy_set(dev, B43_PHY_HT_TSSIMODE, B43_PHY_HT_TSSIMODE_EN); +	b43_phy_mask(dev, B43_PHY_HT_TXPCTL_CMD_C1, +		     ~B43_PHY_HT_TXPCTL_CMD_C1_PCTLEN & 0xFFFF); + +	/* TODO: Does it depend on sprom->fem.ghz2.tssipos? */ +	b43_phy_set(dev, B43_PHY_HT_TXPCTL_IDLE_TSSI, 0x4000); + +	b43_phy_maskset(dev, B43_PHY_HT_TXPCTL_CMD_C1, +			~B43_PHY_HT_TXPCTL_CMD_C1_INIT, 0x19); +	b43_phy_maskset(dev, B43_PHY_HT_TXPCTL_CMD_C2, +			~B43_PHY_HT_TXPCTL_CMD_C2_INIT, 0x19); +	b43_phy_maskset(dev, B43_PHY_HT_TXPCTL_CMD_C3, +			~B43_PHY_HT_TXPCTL_CMD_C3_INIT, 0x19); + +	b43_phy_set(dev, B43_PHY_HT_TXPCTL_IDLE_TSSI, +		    B43_PHY_HT_TXPCTL_IDLE_TSSI_BINF); + +	b43_phy_maskset(dev, B43_PHY_HT_TXPCTL_IDLE_TSSI, +			~B43_PHY_HT_TXPCTL_IDLE_TSSI_C1, +			idle[0] << B43_PHY_HT_TXPCTL_IDLE_TSSI_C1_SHIFT); +	b43_phy_maskset(dev, B43_PHY_HT_TXPCTL_IDLE_TSSI, +			~B43_PHY_HT_TXPCTL_IDLE_TSSI_C2, +			idle[1] << B43_PHY_HT_TXPCTL_IDLE_TSSI_C2_SHIFT); +	b43_phy_maskset(dev, B43_PHY_HT_TXPCTL_IDLE_TSSI2, +			~B43_PHY_HT_TXPCTL_IDLE_TSSI2_C3, +			idle[2] << B43_PHY_HT_TXPCTL_IDLE_TSSI2_C3_SHIFT); + +	b43_phy_maskset(dev, B43_PHY_HT_TXPCTL_N, ~B43_PHY_HT_TXPCTL_N_TSSID, +			0xf0); +	b43_phy_maskset(dev, B43_PHY_HT_TXPCTL_N, ~B43_PHY_HT_TXPCTL_N_NPTIL2, +			0x3 << B43_PHY_HT_TXPCTL_N_NPTIL2_SHIFT); +#if 0 +	/* TODO: what to mask/set? */ +	b43_phy_maskset(dev, B43_PHY_HT_TXPCTL_CMD_C1, 0x800, 0) +	b43_phy_maskset(dev, B43_PHY_HT_TXPCTL_CMD_C1, 0x400, 0) +#endif + +	b43_phy_maskset(dev, B43_PHY_HT_TXPCTL_TARG_PWR, +			~B43_PHY_HT_TXPCTL_TARG_PWR_C1, +			target[0] << B43_PHY_HT_TXPCTL_TARG_PWR_C1_SHIFT); +	b43_phy_maskset(dev, B43_PHY_HT_TXPCTL_TARG_PWR, +			~B43_PHY_HT_TXPCTL_TARG_PWR_C2 & 0xFFFF, +			target[1] << B43_PHY_HT_TXPCTL_TARG_PWR_C2_SHIFT); +	b43_phy_maskset(dev, B43_PHY_HT_TXPCTL_TARG_PWR2, +			~B43_PHY_HT_TXPCTL_TARG_PWR2_C3, +			target[2] << B43_PHY_HT_TXPCTL_TARG_PWR2_C3_SHIFT); + +	for (c = 0; c < 3; c++) { +		s32 num, den, pwr; +		u32 regval[64]; + +		for (i = 0; i < 64; i++) { +			num = 8 * (16 * b0[c] + b1[c] * i); +			den = 32768 + a1[c] * i; +			pwr = max((4 * num + den / 2) / den, -8); +			regval[i] = pwr; +		} +		b43_httab_write_bulk(dev, B43_HTTAB16(26 + c, 0), 64, regval); +	} +} + +/**************************************************   * Channel switching ops.   **************************************************/ +static void b43_phy_ht_spur_avoid(struct b43_wldev *dev, +				  struct ieee80211_channel *new_channel) +{ +	struct bcma_device *core = dev->dev->bdev; +	int spuravoid = 0; +	u16 tmp; + +	/* Check for 13 and 14 is just a guess, we don't have enough logs. */ +	if (new_channel->hw_value == 13 || new_channel->hw_value == 14) +		spuravoid = 1; +	bcma_core_pll_ctl(core, B43_BCMA_CLKCTLST_PHY_PLL_REQ, 0, false); +	bcma_pmu_spuravoid_pllupdate(&core->bus->drv_cc, spuravoid); +	bcma_core_pll_ctl(core, +			  B43_BCMA_CLKCTLST_80211_PLL_REQ | +			  B43_BCMA_CLKCTLST_PHY_PLL_REQ, +			  B43_BCMA_CLKCTLST_80211_PLL_ST | +			  B43_BCMA_CLKCTLST_PHY_PLL_ST, false); + +	/* Values has been taken from wlc_bmac_switch_macfreq comments */ +	switch (spuravoid) { +	case 2: /* 126MHz */ +		tmp = 0x2082; +		break; +	case 1: /* 123MHz */ +		tmp = 0x5341; +		break; +	default: /* 120MHz */ +		tmp = 0x8889; +	} + +	b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_LOW, tmp); +	b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0x8); + +	/* TODO: reset PLL */ + +	if (spuravoid) +		b43_phy_set(dev, B43_PHY_HT_BBCFG, B43_PHY_HT_BBCFG_RSTRX); +	else +		b43_phy_mask(dev, B43_PHY_HT_BBCFG, +				~B43_PHY_HT_BBCFG_RSTRX & 0xFFFF); + +	b43_phy_ht_reset_cca(dev); +} +  static void b43_phy_ht_channel_setup(struct b43_wldev *dev,  				const struct b43_phy_ht_channeltab_e_phy *e,  				struct ieee80211_channel *new_channel)  {  	bool old_band_5ghz; -	u8 i;  	old_band_5ghz = b43_phy_read(dev, B43_PHY_HT_BANDCTL) & 0; /* FIXME */  	if (new_channel->band == IEEE80211_BAND_5GHZ && !old_band_5ghz) { @@ -264,25 +763,20 @@ static void b43_phy_ht_channel_setup(struct b43_wldev *dev,  	b43_phy_write(dev, B43_PHY_HT_BW5, e->bw5);  	b43_phy_write(dev, B43_PHY_HT_BW6, e->bw6); -	/* TODO: some ops on PHY regs 0x0B0 and 0xC0A */ - -	/* TODO: separated function? */ -	for (i = 0; i < 3; i++) { -		u16 mask; -		u32 tmp = b43_httab_read(dev, B43_HTTAB32(26, 0xE8)); +	if (new_channel->hw_value == 14) { +		b43_phy_ht_classifier(dev, B43_PHY_HT_CLASS_CTL_OFDM_EN, 0); +		b43_phy_set(dev, B43_PHY_HT_TEST, 0x0800); +	} else { +		b43_phy_ht_classifier(dev, B43_PHY_HT_CLASS_CTL_OFDM_EN, +				      B43_PHY_HT_CLASS_CTL_OFDM_EN); +		if (new_channel->band == IEEE80211_BAND_2GHZ) +			b43_phy_mask(dev, B43_PHY_HT_TEST, ~0x840); +	} -		if (0) /* FIXME */ -			mask = 0x2 << (i * 4); -		else -			mask = 0; -		b43_phy_mask(dev, B43_PHY_EXTG(0x108), mask); +	if (1) /* TODO: On N it's for early devices only, what about HT? */ +		b43_phy_ht_tx_power_fix(dev); -		b43_httab_write(dev, B43_HTTAB16(7, 0x110 + i), tmp >> 16); -		b43_httab_write(dev, B43_HTTAB8(13, 0x63 + (i * 4)), -				tmp & 0xFF); -		b43_httab_write(dev, B43_HTTAB8(13, 0x73 + (i * 4)), -				tmp & 0xFF); -	} +	b43_phy_ht_spur_avoid(dev, new_channel);  	b43_phy_write(dev, 0x017e, 0x3830);  } @@ -337,14 +831,29 @@ static void b43_phy_ht_op_prepare_structs(struct b43_wldev *dev)  {  	struct b43_phy *phy = &dev->phy;  	struct b43_phy_ht *phy_ht = phy->ht; +	int i;  	memset(phy_ht, 0, sizeof(*phy_ht)); + +	phy_ht->tx_pwr_ctl = true; +	for (i = 0; i < 3; i++) +		phy_ht->tx_pwr_idx[i] = B43_PHY_HT_TXPCTL_CMD_C1_INIT + 1; + +	for (i = 0; i < 3; i++) +		phy_ht->bb_mult_save[i] = -1;  }  static int b43_phy_ht_op_init(struct b43_wldev *dev)  { +	struct b43_phy_ht *phy_ht = dev->phy.ht;  	u16 tmp;  	u16 clip_state[3]; +	bool saved_tx_pwr_ctl; + +	if (dev->dev->bus_type != B43_BUS_BCMA) { +		b43err(dev->wl, "HT-PHY is supported only on BCMA bus!\n"); +		return -EOPNOTSUPP; +	}  	b43_phy_ht_tables_init(dev); @@ -357,9 +866,9 @@ static int b43_phy_ht_op_init(struct b43_wldev *dev)  	b43_phy_mask(dev, B43_PHY_EXTG(0), ~0x3); -	b43_phy_write(dev, B43_PHY_HT_AFE_CTL1, 0); -	b43_phy_write(dev, B43_PHY_HT_AFE_CTL3, 0); -	b43_phy_write(dev, B43_PHY_HT_AFE_CTL5, 0); +	b43_phy_write(dev, B43_PHY_HT_AFE_C1_OVER, 0); +	b43_phy_write(dev, B43_PHY_HT_AFE_C2_OVER, 0); +	b43_phy_write(dev, B43_PHY_HT_AFE_C3_OVER, 0);  	b43_phy_write(dev, B43_PHY_EXTG(0x103), 0x20);  	b43_phy_write(dev, B43_PHY_EXTG(0x101), 0x20); @@ -371,8 +880,11 @@ static int b43_phy_ht_op_init(struct b43_wldev *dev)  	if (0) /* TODO: condition */  		; /* TODO: PHY op on reg 0x217 */ -	b43_phy_read(dev, 0xb0); /* TODO: what for? */ -	b43_phy_set(dev, 0xb0, 0x1); +	if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) +		b43_phy_ht_classifier(dev, B43_PHY_HT_CLASS_CTL_CCK_EN, 0); +	else +		b43_phy_ht_classifier(dev, B43_PHY_HT_CLASS_CTL_CCK_EN, +				      B43_PHY_HT_CLASS_CTL_CCK_EN);  	b43_phy_set(dev, 0xb1, 0x91);  	b43_phy_write(dev, 0x32f, 0x0003); @@ -448,12 +960,13 @@ static int b43_phy_ht_op_init(struct b43_wldev *dev)  	b43_mac_phy_clock_set(dev, true); +	b43_phy_ht_pa_override(dev, false);  	b43_phy_ht_force_rf_sequence(dev, B43_PHY_HT_RF_SEQ_TRIG_RX2TX);  	b43_phy_ht_force_rf_sequence(dev, B43_PHY_HT_RF_SEQ_TRIG_RST2RX); - -	/* TODO: PHY op on reg 0xb0 */ +	b43_phy_ht_pa_override(dev, true);  	/* TODO: Should we restore it? Or store it in global PHY info? */ +	b43_phy_ht_classifier(dev, 0, 0);  	b43_phy_ht_read_clip_detection(dev, clip_state);  	if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) @@ -462,6 +975,14 @@ static int b43_phy_ht_op_init(struct b43_wldev *dev)  	b43_httab_write_bulk(dev, B43_HTTAB32(0x1a, 0xc0),  			B43_HTTAB_1A_C0_LATE_SIZE, b43_httab_0x1a_0xc0_late); +	saved_tx_pwr_ctl = phy_ht->tx_pwr_ctl; +	b43_phy_ht_tx_power_fix(dev); +	b43_phy_ht_tx_power_ctl(dev, false); +	b43_phy_ht_tx_power_ctl_idle_tssi(dev); +	b43_phy_ht_tx_power_ctl_setup(dev); +	b43_phy_ht_tssi_setup(dev); +	b43_phy_ht_tx_power_ctl(dev, saved_tx_pwr_ctl); +  	return 0;  } @@ -506,27 +1027,28 @@ static void b43_phy_ht_op_software_rfkill(struct b43_wldev *dev,  static void b43_phy_ht_op_switch_analog(struct b43_wldev *dev, bool on)  {  	if (on) { -		b43_phy_write(dev, B43_PHY_HT_AFE_CTL2, 0x00cd); -		b43_phy_write(dev, B43_PHY_HT_AFE_CTL1, 0x0000); -		b43_phy_write(dev, B43_PHY_HT_AFE_CTL4, 0x00cd); -		b43_phy_write(dev, B43_PHY_HT_AFE_CTL3, 0x0000); -		b43_phy_write(dev, B43_PHY_HT_AFE_CTL6, 0x00cd); -		b43_phy_write(dev, B43_PHY_HT_AFE_CTL5, 0x0000); +		b43_phy_write(dev, B43_PHY_HT_AFE_C1, 0x00cd); +		b43_phy_write(dev, B43_PHY_HT_AFE_C1_OVER, 0x0000); +		b43_phy_write(dev, B43_PHY_HT_AFE_C2, 0x00cd); +		b43_phy_write(dev, B43_PHY_HT_AFE_C2_OVER, 0x0000); +		b43_phy_write(dev, B43_PHY_HT_AFE_C3, 0x00cd); +		b43_phy_write(dev, B43_PHY_HT_AFE_C3_OVER, 0x0000);  	} else { -		b43_phy_write(dev, B43_PHY_HT_AFE_CTL1, 0x07ff); -		b43_phy_write(dev, B43_PHY_HT_AFE_CTL2, 0x00fd); -		b43_phy_write(dev, B43_PHY_HT_AFE_CTL3, 0x07ff); -		b43_phy_write(dev, B43_PHY_HT_AFE_CTL4, 0x00fd); -		b43_phy_write(dev, B43_PHY_HT_AFE_CTL5, 0x07ff); -		b43_phy_write(dev, B43_PHY_HT_AFE_CTL6, 0x00fd); +		b43_phy_write(dev, B43_PHY_HT_AFE_C1_OVER, 0x07ff); +		b43_phy_write(dev, B43_PHY_HT_AFE_C1, 0x00fd); +		b43_phy_write(dev, B43_PHY_HT_AFE_C2_OVER, 0x07ff); +		b43_phy_write(dev, B43_PHY_HT_AFE_C2, 0x00fd); +		b43_phy_write(dev, B43_PHY_HT_AFE_C3_OVER, 0x07ff); +		b43_phy_write(dev, B43_PHY_HT_AFE_C3, 0x00fd);  	}  }  static int b43_phy_ht_op_switch_channel(struct b43_wldev *dev,  					unsigned int new_channel)  { -	struct ieee80211_channel *channel = dev->wl->hw->conf.channel; -	enum nl80211_channel_type channel_type = dev->wl->hw->conf.channel_type; +	struct ieee80211_channel *channel = dev->wl->hw->conf.chandef.chan; +	enum nl80211_channel_type channel_type = +		cfg80211_get_chandef_type(&dev->wl->hw->conf.chandef);  	if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) {  		if ((new_channel < 1) || (new_channel > 14)) diff --git a/drivers/net/wireless/b43/phy_ht.h b/drivers/net/wireless/b43/phy_ht.h index 6544c4293b3..6cae370d101 100644 --- a/drivers/net/wireless/b43/phy_ht.h +++ b/drivers/net/wireless/b43/phy_ht.h @@ -12,18 +12,65 @@  #define B43_PHY_HT_TABLE_ADDR			0x072 /* Table address */  #define B43_PHY_HT_TABLE_DATALO			0x073 /* Table data low */  #define B43_PHY_HT_TABLE_DATAHI			0x074 /* Table data high */ +#define B43_PHY_HT_CLASS_CTL			0x0B0 /* Classifier control */ +#define  B43_PHY_HT_CLASS_CTL_CCK_EN		0x0001 /* CCK enable */ +#define  B43_PHY_HT_CLASS_CTL_OFDM_EN		0x0002 /* OFDM enable */ +#define  B43_PHY_HT_CLASS_CTL_WAITED_EN		0x0004 /* Waited enable */ +#define B43_PHY_HT_IQLOCAL_CMDGCTL		0x0C2	/* I/Q LO cal command G control */ +#define B43_PHY_HT_SAMP_CMD			0x0C3	/* Sample command */ +#define  B43_PHY_HT_SAMP_CMD_STOP		0x0002	/* Stop */ +#define B43_PHY_HT_SAMP_LOOP_CNT		0x0C4	/* Sample loop count */ +#define B43_PHY_HT_SAMP_WAIT_CNT		0x0C5	/* Sample wait count */ +#define B43_PHY_HT_SAMP_DEP_CNT			0x0C6	/* Sample depth count */ +#define B43_PHY_HT_SAMP_STAT			0x0C7	/* Sample status */ +#define B43_PHY_HT_EST_PWR_C1			0x118 +#define B43_PHY_HT_EST_PWR_C2			0x119 +#define B43_PHY_HT_EST_PWR_C3			0x11A +#define B43_PHY_HT_TSSIMODE			0x122	/* TSSI mode */ +#define  B43_PHY_HT_TSSIMODE_EN			0x0001	/* TSSI enable */ +#define  B43_PHY_HT_TSSIMODE_PDEN		0x0002	/* Power det enable */  #define B43_PHY_HT_BW1				0x1CE  #define B43_PHY_HT_BW2				0x1CF  #define B43_PHY_HT_BW3				0x1D0  #define B43_PHY_HT_BW4				0x1D1  #define B43_PHY_HT_BW5				0x1D2  #define B43_PHY_HT_BW6				0x1D3 +#define B43_PHY_HT_TXPCTL_CMD_C1		0x1E7	/* TX power control command */ +#define  B43_PHY_HT_TXPCTL_CMD_C1_INIT		0x007F	/* Init */ +#define  B43_PHY_HT_TXPCTL_CMD_C1_COEFF		0x2000	/* Power control coefficients */ +#define  B43_PHY_HT_TXPCTL_CMD_C1_HWPCTLEN	0x4000	/* Hardware TX power control enable */ +#define  B43_PHY_HT_TXPCTL_CMD_C1_PCTLEN	0x8000	/* TX power control enable */ +#define B43_PHY_HT_TXPCTL_N			0x1E8	/* TX power control N num */ +#define  B43_PHY_HT_TXPCTL_N_TSSID		0x00FF	/* N TSSI delay */ +#define  B43_PHY_HT_TXPCTL_N_TSSID_SHIFT	0 +#define  B43_PHY_HT_TXPCTL_N_NPTIL2		0x0700	/* N PT integer log2 */ +#define  B43_PHY_HT_TXPCTL_N_NPTIL2_SHIFT	8 +#define B43_PHY_HT_TXPCTL_IDLE_TSSI		0x1E9	/* TX power control idle TSSI */ +#define  B43_PHY_HT_TXPCTL_IDLE_TSSI_C1		0x003F +#define  B43_PHY_HT_TXPCTL_IDLE_TSSI_C1_SHIFT	0 +#define  B43_PHY_HT_TXPCTL_IDLE_TSSI_C2		0x3F00 +#define  B43_PHY_HT_TXPCTL_IDLE_TSSI_C2_SHIFT	8 +#define  B43_PHY_HT_TXPCTL_IDLE_TSSI_BINF	0x8000	/* Raw TSSI offset bin format */ +#define B43_PHY_HT_TXPCTL_TARG_PWR		0x1EA	/* TX power control target power */ +#define  B43_PHY_HT_TXPCTL_TARG_PWR_C1		0x00FF	/* Power 0 */ +#define  B43_PHY_HT_TXPCTL_TARG_PWR_C1_SHIFT	0 +#define  B43_PHY_HT_TXPCTL_TARG_PWR_C2		0xFF00	/* Power 1 */ +#define  B43_PHY_HT_TXPCTL_TARG_PWR_C2_SHIFT	8 +#define B43_PHY_HT_TX_PCTL_STATUS_C1		0x1ED +#define B43_PHY_HT_TX_PCTL_STATUS_C2		0x1EE +#define B43_PHY_HT_TXPCTL_CMD_C2		0x222 +#define  B43_PHY_HT_TXPCTL_CMD_C2_INIT		0x007F +#define B43_PHY_HT_RSSI_C1			0x219 +#define B43_PHY_HT_RSSI_C2			0x21A +#define B43_PHY_HT_RSSI_C3			0x21B  #define B43_PHY_HT_C1_CLIP1THRES		B43_PHY_OFDM(0x00E)  #define B43_PHY_HT_C2_CLIP1THRES		B43_PHY_OFDM(0x04E)  #define B43_PHY_HT_C3_CLIP1THRES		B43_PHY_OFDM(0x08E)  #define B43_PHY_HT_RF_SEQ_MODE			B43_PHY_EXTG(0x000) +#define  B43_PHY_HT_RF_SEQ_MODE_CA_OVER		0x0001	/* Core active override */ +#define  B43_PHY_HT_RF_SEQ_MODE_TR_OVER		0x0002	/* Trigger override */  #define B43_PHY_HT_RF_SEQ_TRIG			B43_PHY_EXTG(0x003)  #define  B43_PHY_HT_RF_SEQ_TRIG_RX2TX		0x0001 /* RX2TX */  #define  B43_PHY_HT_RF_SEQ_TRIG_TX2RX		0x0002 /* TX2RX */ @@ -36,12 +83,28 @@  #define B43_PHY_HT_RF_CTL1			B43_PHY_EXTG(0x010) -#define B43_PHY_HT_AFE_CTL1			B43_PHY_EXTG(0x110) -#define B43_PHY_HT_AFE_CTL2			B43_PHY_EXTG(0x111) -#define B43_PHY_HT_AFE_CTL3			B43_PHY_EXTG(0x114) -#define B43_PHY_HT_AFE_CTL4			B43_PHY_EXTG(0x115) -#define B43_PHY_HT_AFE_CTL5			B43_PHY_EXTG(0x118) -#define B43_PHY_HT_AFE_CTL6			B43_PHY_EXTG(0x119) +#define B43_PHY_HT_RF_CTL_INT_C1		B43_PHY_EXTG(0x04c) +#define B43_PHY_HT_RF_CTL_INT_C2		B43_PHY_EXTG(0x06c) +#define B43_PHY_HT_RF_CTL_INT_C3		B43_PHY_EXTG(0x08c) + +#define B43_PHY_HT_AFE_C1_OVER			B43_PHY_EXTG(0x110) +#define B43_PHY_HT_AFE_C1			B43_PHY_EXTG(0x111) +#define B43_PHY_HT_AFE_C2_OVER			B43_PHY_EXTG(0x114) +#define B43_PHY_HT_AFE_C2			B43_PHY_EXTG(0x115) +#define B43_PHY_HT_AFE_C3_OVER			B43_PHY_EXTG(0x118) +#define B43_PHY_HT_AFE_C3			B43_PHY_EXTG(0x119) + +#define B43_PHY_HT_TXPCTL_CMD_C3		B43_PHY_EXTG(0x164) +#define  B43_PHY_HT_TXPCTL_CMD_C3_INIT		0x007F +#define B43_PHY_HT_TXPCTL_IDLE_TSSI2		B43_PHY_EXTG(0x165)	/* TX power control idle TSSI */ +#define  B43_PHY_HT_TXPCTL_IDLE_TSSI2_C3	0x003F +#define  B43_PHY_HT_TXPCTL_IDLE_TSSI2_C3_SHIFT	0 +#define B43_PHY_HT_TXPCTL_TARG_PWR2		B43_PHY_EXTG(0x166)	/* TX power control target power */ +#define  B43_PHY_HT_TXPCTL_TARG_PWR2_C3		0x00FF +#define  B43_PHY_HT_TXPCTL_TARG_PWR2_C3_SHIFT	0 +#define B43_PHY_HT_TX_PCTL_STATUS_C3		B43_PHY_EXTG(0x169) + +#define B43_PHY_HT_TEST				B43_PHY_N_BMODE(0x00A)  /* Values for PHY registers used on channel switching */ @@ -56,6 +119,14 @@ struct b43_phy_ht_channeltab_e_phy {  struct b43_phy_ht { +	u16 rf_ctl_int_save[3]; + +	bool tx_pwr_ctl; +	u8 tx_pwr_idx[3]; + +	s32 bb_mult_save[3]; + +	u8 idle_tssi[3];  }; diff --git a/drivers/net/wireless/b43/phy_lcn.c b/drivers/net/wireless/b43/phy_lcn.c index a13e28ef624..0bafa3b1703 100644 --- a/drivers/net/wireless/b43/phy_lcn.c +++ b/drivers/net/wireless/b43/phy_lcn.c @@ -808,8 +808,9 @@ static void b43_phy_lcn_op_switch_analog(struct b43_wldev *dev, bool on)  static int b43_phy_lcn_op_switch_channel(struct b43_wldev *dev,  					unsigned int new_channel)  { -	struct ieee80211_channel *channel = dev->wl->hw->conf.channel; -	enum nl80211_channel_type channel_type = dev->wl->hw->conf.channel_type; +	struct ieee80211_channel *channel = dev->wl->hw->conf.chandef.chan; +	enum nl80211_channel_type channel_type = +		cfg80211_get_chandef_type(&dev->wl->hw->conf.chandef);  	if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) {  		if ((new_channel < 1) || (new_channel > 14)) diff --git a/drivers/net/wireless/b43/phy_lp.c b/drivers/net/wireless/b43/phy_lp.c index 3ae28561f7a..92190dacf68 100644 --- a/drivers/net/wireless/b43/phy_lp.c +++ b/drivers/net/wireless/b43/phy_lp.c @@ -104,14 +104,8 @@ static void lpphy_read_band_sprom(struct b43_wldev *dev)  		maxpwr = sprom->maxpwr_bg;  		lpphy->max_tx_pwr_med_band = maxpwr;  		cckpo = sprom->cck2gpo; -		/* -		 * We don't read SPROM's opo as specs say. On rev8 SPROMs -		 * opo == ofdm2gpo and we don't know any SSB with LP-PHY -		 * and SPROM rev below 8. -		 */ -		B43_WARN_ON(sprom->revision < 8); -		ofdmpo = sprom->ofdm2gpo;  		if (cckpo) { +			ofdmpo = sprom->ofdm2gpo;  			for (i = 0; i < 4; i++) {  				lpphy->tx_max_rate[i] =  					maxpwr - (ofdmpo & 0xF) * 2; @@ -124,11 +118,11 @@ static void lpphy_read_band_sprom(struct b43_wldev *dev)  				ofdmpo >>= 4;  			}  		} else { -			ofdmpo &= 0xFF; +			u8 opo = sprom->opo;  			for (i = 0; i < 4; i++)  				lpphy->tx_max_rate[i] = maxpwr;  			for (i = 4; i < 15; i++) -				lpphy->tx_max_rate[i] = maxpwr - ofdmpo; +				lpphy->tx_max_rate[i] = maxpwr - opo;  		}  	} else { /* 5GHz */  		lpphy->tx_isolation_low_band = sprom->tri5gl; @@ -287,8 +281,8 @@ static void lpphy_baseband_rev0_1_init(struct b43_wldev *dev)  		b43_phy_maskset(dev, B43_LPPHY_TR_LOOKUP_8, 0xFFC0, 0x000A);  		b43_phy_maskset(dev, B43_LPPHY_TR_LOOKUP_8, 0xC0FF, 0x0B00);  	} else if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ || -		  (dev->dev->board_type == 0x048A) || ((dev->phy.rev == 0) && -		  (sprom->boardflags_lo & B43_BFL_FEM))) { +		   (dev->dev->board_type == SSB_BOARD_BU4312) || +		   (dev->phy.rev == 0 && (sprom->boardflags_lo & B43_BFL_FEM))) {  		b43_phy_maskset(dev, B43_LPPHY_TR_LOOKUP_1, 0xFFC0, 0x0001);  		b43_phy_maskset(dev, B43_LPPHY_TR_LOOKUP_1, 0xC0FF, 0x0400);  		b43_phy_maskset(dev, B43_LPPHY_TR_LOOKUP_2, 0xFFC0, 0x0001); diff --git a/drivers/net/wireless/b43/phy_n.c b/drivers/net/wireless/b43/phy_n.c index b70f220bc4b..7c970d3ae35 100644 --- a/drivers/net/wireless/b43/phy_n.c +++ b/drivers/net/wireless/b43/phy_n.c @@ -69,14 +69,27 @@ enum b43_nphy_rf_sequence {  	B43_RFSEQ_UPDATE_GAINU,  }; -enum b43_nphy_rssi_type { -	B43_NPHY_RSSI_X = 0, -	B43_NPHY_RSSI_Y, -	B43_NPHY_RSSI_Z, -	B43_NPHY_RSSI_PWRDET, -	B43_NPHY_RSSI_TSSI_I, -	B43_NPHY_RSSI_TSSI_Q, -	B43_NPHY_RSSI_TBD, +enum n_intc_override { +	N_INTC_OVERRIDE_OFF = 0, +	N_INTC_OVERRIDE_TRSW = 1, +	N_INTC_OVERRIDE_PA = 2, +	N_INTC_OVERRIDE_EXT_LNA_PU = 3, +	N_INTC_OVERRIDE_EXT_LNA_GAIN = 4, +}; + +enum n_rssi_type { +	N_RSSI_W1 = 0, +	N_RSSI_W2, +	N_RSSI_NB, +	N_RSSI_IQ, +	N_RSSI_TSSI_2G, +	N_RSSI_TSSI_5G, +	N_RSSI_TBD, +}; + +enum n_rail_type { +	N_RAIL_I = 0, +	N_RAIL_Q = 1,  };  static inline bool b43_nphy_ipa(struct b43_wldev *dev) @@ -94,7 +107,7 @@ static u8 b43_nphy_get_rx_core_state(struct b43_wldev *dev)  }  /************************************************** - * RF (just without b43_nphy_rf_control_intc_override) + * RF (just without b43_nphy_rf_ctl_intc_override)   **************************************************/  /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/ForceRFSeq */ @@ -128,9 +141,9 @@ ok:  }  /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RFCtrlOverrideRev7 */ -static void b43_nphy_rf_control_override_rev7(struct b43_wldev *dev, u16 field, -					      u16 value, u8 core, bool off, -					      u8 override) +static void b43_nphy_rf_ctl_override_rev7(struct b43_wldev *dev, u16 field, +					  u16 value, u8 core, bool off, +					  u8 override)  {  	const struct nphy_rf_control_override_rev7 *e;  	u16 en_addrs[3][2] = { @@ -168,8 +181,8 @@ static void b43_nphy_rf_control_override_rev7(struct b43_wldev *dev, u16 field,  }  /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RFCtrlOverride */ -static void b43_nphy_rf_control_override(struct b43_wldev *dev, u16 field, -						u16 value, u8 core, bool off) +static void b43_nphy_rf_ctl_override(struct b43_wldev *dev, u16 field, +				     u16 value, u8 core, bool off)  {  	int i;  	u8 index = fls(field); @@ -244,14 +257,14 @@ static void b43_nphy_rf_control_override(struct b43_wldev *dev, u16 field,  }  /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RFCtrlIntcOverride */ -static void b43_nphy_rf_control_intc_override(struct b43_wldev *dev, u8 field, -						u16 value, u8 core) +static void b43_nphy_rf_ctl_intc_override(struct b43_wldev *dev, +					  enum n_intc_override intc_override, +					  u16 value, u8 core)  {  	u8 i, j;  	u16 reg, tmp, val;  	B43_WARN_ON(dev->phy.rev < 3); -	B43_WARN_ON(field > 4);  	for (i = 0; i < 2; i++) {  		if ((core == 1 && i == 1) || (core == 2 && !i)) @@ -261,12 +274,12 @@ static void b43_nphy_rf_control_intc_override(struct b43_wldev *dev, u8 field,  			B43_NPHY_RFCTL_INTC1 : B43_NPHY_RFCTL_INTC2;  		b43_phy_set(dev, reg, 0x400); -		switch (field) { -		case 0: +		switch (intc_override) { +		case N_INTC_OVERRIDE_OFF:  			b43_phy_write(dev, reg, 0);  			b43_nphy_force_rf_sequence(dev, B43_RFSEQ_RESET2RX);  			break; -		case 1: +		case N_INTC_OVERRIDE_TRSW:  			if (!i) {  				b43_phy_maskset(dev, B43_NPHY_RFCTL_INTC1,  						0xFC3F, (value << 6)); @@ -307,7 +320,7 @@ static void b43_nphy_rf_control_intc_override(struct b43_wldev *dev, u8 field,  						0xFFFE);  			}  			break; -		case 2: +		case N_INTC_OVERRIDE_PA:  			if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) {  				tmp = 0x0020;  				val = value << 5; @@ -317,7 +330,7 @@ static void b43_nphy_rf_control_intc_override(struct b43_wldev *dev, u8 field,  			}  			b43_phy_maskset(dev, reg, ~tmp, val);  			break; -		case 3: +		case N_INTC_OVERRIDE_EXT_LNA_PU:  			if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) {  				tmp = 0x0001;  				val = value; @@ -327,7 +340,7 @@ static void b43_nphy_rf_control_intc_override(struct b43_wldev *dev, u8 field,  			}  			b43_phy_maskset(dev, reg, ~tmp, val);  			break; -		case 4: +		case N_INTC_OVERRIDE_EXT_LNA_GAIN:  			if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) {  				tmp = 0x0002;  				val = value << 1; @@ -1011,7 +1024,7 @@ static void b43_radio_init2055_post(struct b43_wldev *dev)  	if (sprom->revision < 4)  		workaround = (dev->dev->board_vendor != PCI_VENDOR_ID_BROADCOM -			      && dev->dev->board_type == 0x46D +			      && dev->dev->board_type == SSB_BOARD_CB2_4321  			      && dev->dev->board_rev >= 0x41);  	else  		workaround = @@ -1207,8 +1220,9 @@ static void b43_nphy_run_samples(struct b43_wldev *dev, u16 samps, u16 loops,  /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/ScaleOffsetRssi */  static void b43_nphy_scale_offset_rssi(struct b43_wldev *dev, u16 scale, -					s8 offset, u8 core, u8 rail, -					enum b43_nphy_rssi_type type) +					s8 offset, u8 core, +					enum n_rail_type rail, +					enum n_rssi_type rssi_type)  {  	u16 tmp;  	bool core1or5 = (core == 1) || (core == 5); @@ -1217,63 +1231,74 @@ static void b43_nphy_scale_offset_rssi(struct b43_wldev *dev, u16 scale,  	offset = clamp_val(offset, -32, 31);  	tmp = ((scale & 0x3F) << 8) | (offset & 0x3F); -	if (core1or5 && (rail == 0) && (type == B43_NPHY_RSSI_Z)) -		b43_phy_write(dev, B43_NPHY_RSSIMC_0I_RSSI_Z, tmp); -	if (core1or5 && (rail == 1) && (type == B43_NPHY_RSSI_Z)) -		b43_phy_write(dev, B43_NPHY_RSSIMC_0Q_RSSI_Z, tmp); -	if (core2or5 && (rail == 0) && (type == B43_NPHY_RSSI_Z)) -		b43_phy_write(dev, B43_NPHY_RSSIMC_1I_RSSI_Z, tmp); -	if (core2or5 && (rail == 1) && (type == B43_NPHY_RSSI_Z)) -		b43_phy_write(dev, B43_NPHY_RSSIMC_1Q_RSSI_Z, tmp); - -	if (core1or5 && (rail == 0) && (type == B43_NPHY_RSSI_X)) -		b43_phy_write(dev, B43_NPHY_RSSIMC_0I_RSSI_X, tmp); -	if (core1or5 && (rail == 1) && (type == B43_NPHY_RSSI_X)) -		b43_phy_write(dev, B43_NPHY_RSSIMC_0Q_RSSI_X, tmp); -	if (core2or5 && (rail == 0) && (type == B43_NPHY_RSSI_X)) -		b43_phy_write(dev, B43_NPHY_RSSIMC_1I_RSSI_X, tmp); -	if (core2or5 && (rail == 1) && (type == B43_NPHY_RSSI_X)) -		b43_phy_write(dev, B43_NPHY_RSSIMC_1Q_RSSI_X, tmp); - -	if (core1or5 && (rail == 0) && (type == B43_NPHY_RSSI_Y)) -		b43_phy_write(dev, B43_NPHY_RSSIMC_0I_RSSI_Y, tmp); -	if (core1or5 && (rail == 1) && (type == B43_NPHY_RSSI_Y)) -		b43_phy_write(dev, B43_NPHY_RSSIMC_0Q_RSSI_Y, tmp); -	if (core2or5 && (rail == 0) && (type == B43_NPHY_RSSI_Y)) -		b43_phy_write(dev, B43_NPHY_RSSIMC_1I_RSSI_Y, tmp); -	if (core2or5 && (rail == 1) && (type == B43_NPHY_RSSI_Y)) -		b43_phy_write(dev, B43_NPHY_RSSIMC_1Q_RSSI_Y, tmp); - -	if (core1or5 && (rail == 0) && (type == B43_NPHY_RSSI_TBD)) -		b43_phy_write(dev, B43_NPHY_RSSIMC_0I_TBD, tmp); -	if (core1or5 && (rail == 1) && (type == B43_NPHY_RSSI_TBD)) -		b43_phy_write(dev, B43_NPHY_RSSIMC_0Q_TBD, tmp); -	if (core2or5 && (rail == 0) && (type == B43_NPHY_RSSI_TBD)) -		b43_phy_write(dev, B43_NPHY_RSSIMC_1I_TBD, tmp); -	if (core2or5 && (rail == 1) && (type == B43_NPHY_RSSI_TBD)) -		b43_phy_write(dev, B43_NPHY_RSSIMC_1Q_TBD, tmp); - -	if (core1or5 && (rail == 0) && (type == B43_NPHY_RSSI_PWRDET)) -		b43_phy_write(dev, B43_NPHY_RSSIMC_0I_PWRDET, tmp); -	if (core1or5 && (rail == 1) && (type == B43_NPHY_RSSI_PWRDET)) -		b43_phy_write(dev, B43_NPHY_RSSIMC_0Q_PWRDET, tmp); -	if (core2or5 && (rail == 0) && (type == B43_NPHY_RSSI_PWRDET)) -		b43_phy_write(dev, B43_NPHY_RSSIMC_1I_PWRDET, tmp); -	if (core2or5 && (rail == 1) && (type == B43_NPHY_RSSI_PWRDET)) -		b43_phy_write(dev, B43_NPHY_RSSIMC_1Q_PWRDET, tmp); - -	if (core1or5 && (type == B43_NPHY_RSSI_TSSI_I)) -		b43_phy_write(dev, B43_NPHY_RSSIMC_0I_TSSI, tmp); -	if (core2or5 && (type == B43_NPHY_RSSI_TSSI_I)) -		b43_phy_write(dev, B43_NPHY_RSSIMC_1I_TSSI, tmp); - -	if (core1or5 && (type == B43_NPHY_RSSI_TSSI_Q)) -		b43_phy_write(dev, B43_NPHY_RSSIMC_0Q_TSSI, tmp); -	if (core2or5 && (type == B43_NPHY_RSSI_TSSI_Q)) -		b43_phy_write(dev, B43_NPHY_RSSIMC_1Q_TSSI, tmp); +	switch (rssi_type) { +	case N_RSSI_NB: +		if (core1or5 && rail == N_RAIL_I) +			b43_phy_write(dev, B43_NPHY_RSSIMC_0I_RSSI_Z, tmp); +		if (core1or5 && rail == N_RAIL_Q) +			b43_phy_write(dev, B43_NPHY_RSSIMC_0Q_RSSI_Z, tmp); +		if (core2or5 && rail == N_RAIL_I) +			b43_phy_write(dev, B43_NPHY_RSSIMC_1I_RSSI_Z, tmp); +		if (core2or5 && rail == N_RAIL_Q) +			b43_phy_write(dev, B43_NPHY_RSSIMC_1Q_RSSI_Z, tmp); +		break; +	case N_RSSI_W1: +		if (core1or5 && rail == N_RAIL_I) +			b43_phy_write(dev, B43_NPHY_RSSIMC_0I_RSSI_X, tmp); +		if (core1or5 && rail == N_RAIL_Q) +			b43_phy_write(dev, B43_NPHY_RSSIMC_0Q_RSSI_X, tmp); +		if (core2or5 && rail == N_RAIL_I) +			b43_phy_write(dev, B43_NPHY_RSSIMC_1I_RSSI_X, tmp); +		if (core2or5 && rail == N_RAIL_Q) +			b43_phy_write(dev, B43_NPHY_RSSIMC_1Q_RSSI_X, tmp); +		break; +	case N_RSSI_W2: +		if (core1or5 && rail == N_RAIL_I) +			b43_phy_write(dev, B43_NPHY_RSSIMC_0I_RSSI_Y, tmp); +		if (core1or5 && rail == N_RAIL_Q) +			b43_phy_write(dev, B43_NPHY_RSSIMC_0Q_RSSI_Y, tmp); +		if (core2or5 && rail == N_RAIL_I) +			b43_phy_write(dev, B43_NPHY_RSSIMC_1I_RSSI_Y, tmp); +		if (core2or5 && rail == N_RAIL_Q) +			b43_phy_write(dev, B43_NPHY_RSSIMC_1Q_RSSI_Y, tmp); +		break; +	case N_RSSI_TBD: +		if (core1or5 && rail == N_RAIL_I) +			b43_phy_write(dev, B43_NPHY_RSSIMC_0I_TBD, tmp); +		if (core1or5 && rail == N_RAIL_Q) +			b43_phy_write(dev, B43_NPHY_RSSIMC_0Q_TBD, tmp); +		if (core2or5 && rail == N_RAIL_I) +			b43_phy_write(dev, B43_NPHY_RSSIMC_1I_TBD, tmp); +		if (core2or5 && rail == N_RAIL_Q) +			b43_phy_write(dev, B43_NPHY_RSSIMC_1Q_TBD, tmp); +		break; +	case N_RSSI_IQ: +		if (core1or5 && rail == N_RAIL_I) +			b43_phy_write(dev, B43_NPHY_RSSIMC_0I_PWRDET, tmp); +		if (core1or5 && rail == N_RAIL_Q) +			b43_phy_write(dev, B43_NPHY_RSSIMC_0Q_PWRDET, tmp); +		if (core2or5 && rail == N_RAIL_I) +			b43_phy_write(dev, B43_NPHY_RSSIMC_1I_PWRDET, tmp); +		if (core2or5 && rail == N_RAIL_Q) +			b43_phy_write(dev, B43_NPHY_RSSIMC_1Q_PWRDET, tmp); +		break; +	case N_RSSI_TSSI_2G: +		if (core1or5) +			b43_phy_write(dev, B43_NPHY_RSSIMC_0I_TSSI, tmp); +		if (core2or5) +			b43_phy_write(dev, B43_NPHY_RSSIMC_1I_TSSI, tmp); +		break; +	case N_RSSI_TSSI_5G: +		if (core1or5) +			b43_phy_write(dev, B43_NPHY_RSSIMC_0Q_TSSI, tmp); +		if (core2or5) +			b43_phy_write(dev, B43_NPHY_RSSIMC_1Q_TSSI, tmp); +		break; +	}  } -static void b43_nphy_rev3_rssi_select(struct b43_wldev *dev, u8 code, u8 type) +static void b43_nphy_rev3_rssi_select(struct b43_wldev *dev, u8 code, +				      enum n_rssi_type rssi_type)  {  	u8 i;  	u16 reg, val; @@ -1296,7 +1321,9 @@ static void b43_nphy_rev3_rssi_select(struct b43_wldev *dev, u8 code, u8 type)  				B43_NPHY_AFECTL_OVER1 : B43_NPHY_AFECTL_OVER;  			b43_phy_maskset(dev, reg, 0xFDFF, 0x0200); -			if (type < 3) { +			if (rssi_type == N_RSSI_W1 || +			    rssi_type == N_RSSI_W2 || +			    rssi_type == N_RSSI_NB) {  				reg = (i == 0) ?  					B43_NPHY_AFECTL_C1 :  					B43_NPHY_AFECTL_C2; @@ -1307,9 +1334,9 @@ static void b43_nphy_rev3_rssi_select(struct b43_wldev *dev, u8 code, u8 type)  					B43_NPHY_RFCTL_LUT_TRSW_UP2;  				b43_phy_maskset(dev, reg, 0xFFC3, 0); -				if (type == 0) +				if (rssi_type == N_RSSI_W1)  					val = (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) ? 4 : 8; -				else if (type == 1) +				else if (rssi_type == N_RSSI_W2)  					val = 16;  				else  					val = 32; @@ -1320,9 +1347,9 @@ static void b43_nphy_rev3_rssi_select(struct b43_wldev *dev, u8 code, u8 type)  					B43_NPHY_TXF_40CO_B32S1;  				b43_phy_set(dev, reg, 0x0020);  			} else { -				if (type == 6) +				if (rssi_type == N_RSSI_TBD)  					val = 0x0100; -				else if (type == 3) +				else if (rssi_type == N_RSSI_IQ)  					val = 0x0200;  				else  					val = 0x0300; @@ -1334,7 +1361,8 @@ static void b43_nphy_rev3_rssi_select(struct b43_wldev *dev, u8 code, u8 type)  				b43_phy_maskset(dev, reg, 0xFCFF, val);  				b43_phy_maskset(dev, reg, 0xF3FF, val << 2); -				if (type != 3 && type != 6) { +				if (rssi_type != N_RSSI_IQ && +				    rssi_type != N_RSSI_TBD) {  					enum ieee80211_band band =  						b43_current_band(dev->wl); @@ -1344,7 +1372,7 @@ static void b43_nphy_rev3_rssi_select(struct b43_wldev *dev, u8 code, u8 type)  						val = 0x11;  					reg = (i == 0) ? 0x2000 : 0x3000;  					reg |= B2055_PADDRV; -					b43_radio_write16(dev, reg, val); +					b43_radio_write(dev, reg, val);  					reg = (i == 0) ?  						B43_NPHY_AFECTL_OVER1 : @@ -1356,33 +1384,43 @@ static void b43_nphy_rev3_rssi_select(struct b43_wldev *dev, u8 code, u8 type)  	}  } -static void b43_nphy_rev2_rssi_select(struct b43_wldev *dev, u8 code, u8 type) +static void b43_nphy_rev2_rssi_select(struct b43_wldev *dev, u8 code, +				      enum n_rssi_type rssi_type)  {  	u16 val; +	bool rssi_w1_w2_nb = false; -	if (type < 3) +	switch (rssi_type) { +	case N_RSSI_W1: +	case N_RSSI_W2: +	case N_RSSI_NB:  		val = 0; -	else if (type == 6) +		rssi_w1_w2_nb = true; +		break; +	case N_RSSI_TBD:  		val = 1; -	else if (type == 3) +		break; +	case N_RSSI_IQ:  		val = 2; -	else +		break; +	default:  		val = 3; +	}  	val = (val << 12) | (val << 14);  	b43_phy_maskset(dev, B43_NPHY_AFECTL_C1, 0x0FFF, val);  	b43_phy_maskset(dev, B43_NPHY_AFECTL_C2, 0x0FFF, val); -	if (type < 3) { +	if (rssi_w1_w2_nb) {  		b43_phy_maskset(dev, B43_NPHY_RFCTL_RSSIO1, 0xFFCF, -				(type + 1) << 4); +				(rssi_type + 1) << 4);  		b43_phy_maskset(dev, B43_NPHY_RFCTL_RSSIO2, 0xFFCF, -				(type + 1) << 4); +				(rssi_type + 1) << 4);  	}  	if (code == 0) {  		b43_phy_mask(dev, B43_NPHY_AFECTL_OVER, ~0x3000); -		if (type < 3) { +		if (rssi_w1_w2_nb) {  			b43_phy_mask(dev, B43_NPHY_RFCTL_CMD,  				~(B43_NPHY_RFCTL_CMD_RXEN |  				  B43_NPHY_RFCTL_CMD_CORESEL)); @@ -1398,7 +1436,7 @@ static void b43_nphy_rev2_rssi_select(struct b43_wldev *dev, u8 code, u8 type)  		}  	} else {  		b43_phy_set(dev, B43_NPHY_AFECTL_OVER, 0x3000); -		if (type < 3) { +		if (rssi_w1_w2_nb) {  			b43_phy_maskset(dev, B43_NPHY_RFCTL_CMD,  				~(B43_NPHY_RFCTL_CMD_RXEN |  				  B43_NPHY_RFCTL_CMD_CORESEL), @@ -1418,7 +1456,8 @@ static void b43_nphy_rev2_rssi_select(struct b43_wldev *dev, u8 code, u8 type)  }  /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RSSISel */ -static void b43_nphy_rssi_select(struct b43_wldev *dev, u8 code, u8 type) +static void b43_nphy_rssi_select(struct b43_wldev *dev, u8 code, +				 enum n_rssi_type type)  {  	if (dev->phy.rev >= 3)  		b43_nphy_rev3_rssi_select(dev, code, type); @@ -1427,11 +1466,12 @@ static void b43_nphy_rssi_select(struct b43_wldev *dev, u8 code, u8 type)  }  /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/SetRssi2055Vcm */ -static void b43_nphy_set_rssi_2055_vcm(struct b43_wldev *dev, u8 type, u8 *buf) +static void b43_nphy_set_rssi_2055_vcm(struct b43_wldev *dev, +				       enum n_rssi_type rssi_type, u8 *buf)  {  	int i;  	for (i = 0; i < 2; i++) { -		if (type == 2) { +		if (rssi_type == N_RSSI_NB) {  			if (i == 0) {  				b43_radio_maskset(dev, B2055_C1_B0NB_RSSIVCM,  						  0xFC, buf[0]); @@ -1455,8 +1495,8 @@ static void b43_nphy_set_rssi_2055_vcm(struct b43_wldev *dev, u8 type, u8 *buf)  }  /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/PollRssi */ -static int b43_nphy_poll_rssi(struct b43_wldev *dev, u8 type, s32 *buf, -				u8 nsamp) +static int b43_nphy_poll_rssi(struct b43_wldev *dev, enum n_rssi_type rssi_type, +			      s32 *buf, u8 nsamp)  {  	int i;  	int out; @@ -1487,7 +1527,7 @@ static int b43_nphy_poll_rssi(struct b43_wldev *dev, u8 type, s32 *buf,  		save_regs_phy[8] = 0;  	} -	b43_nphy_rssi_select(dev, 5, type); +	b43_nphy_rssi_select(dev, 5, rssi_type);  	if (dev->phy.rev < 2) {  		save_regs_phy[8] = b43_phy_read(dev, B43_NPHY_GPIO_SEL); @@ -1574,7 +1614,7 @@ static void b43_nphy_rev3_rssi_cal(struct b43_wldev *dev)  	u16 r; /* routing */  	u8 rx_core_state; -	u8 core, i, j; +	int core, i, j, vcm;  	class = b43_nphy_classifier(dev, 0, 0);  	b43_nphy_classifier(dev, 7, 4); @@ -1586,19 +1626,19 @@ static void b43_nphy_rev3_rssi_cal(struct b43_wldev *dev)  	for (i = 0; i < ARRAY_SIZE(regs_to_store); i++)  		saved_regs_phy[i] = b43_phy_read(dev, regs_to_store[i]); -	b43_nphy_rf_control_intc_override(dev, 0, 0, 7); -	b43_nphy_rf_control_intc_override(dev, 1, 1, 7); -	b43_nphy_rf_control_override(dev, 0x1, 0, 0, false); -	b43_nphy_rf_control_override(dev, 0x2, 1, 0, false); -	b43_nphy_rf_control_override(dev, 0x80, 1, 0, false); -	b43_nphy_rf_control_override(dev, 0x40, 1, 0, false); +	b43_nphy_rf_ctl_intc_override(dev, N_INTC_OVERRIDE_OFF, 0, 7); +	b43_nphy_rf_ctl_intc_override(dev, N_INTC_OVERRIDE_TRSW, 1, 7); +	b43_nphy_rf_ctl_override(dev, 0x1, 0, 0, false); +	b43_nphy_rf_ctl_override(dev, 0x2, 1, 0, false); +	b43_nphy_rf_ctl_override(dev, 0x80, 1, 0, false); +	b43_nphy_rf_ctl_override(dev, 0x40, 1, 0, false);  	if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) { -		b43_nphy_rf_control_override(dev, 0x20, 0, 0, false); -		b43_nphy_rf_control_override(dev, 0x10, 1, 0, false); +		b43_nphy_rf_ctl_override(dev, 0x20, 0, 0, false); +		b43_nphy_rf_ctl_override(dev, 0x10, 1, 0, false);  	} else { -		b43_nphy_rf_control_override(dev, 0x10, 0, 0, false); -		b43_nphy_rf_control_override(dev, 0x20, 1, 0, false); +		b43_nphy_rf_ctl_override(dev, 0x10, 0, 0, false); +		b43_nphy_rf_ctl_override(dev, 0x20, 1, 0, false);  	}  	rx_core_state = b43_nphy_get_rx_core_state(dev); @@ -1606,35 +1646,44 @@ static void b43_nphy_rev3_rssi_cal(struct b43_wldev *dev)  		if (!(rx_core_state & (1 << core)))  			continue;  		r = core ? B2056_RX1 : B2056_RX0; -		b43_nphy_scale_offset_rssi(dev, 0, 0, core + 1, 0, 2); -		b43_nphy_scale_offset_rssi(dev, 0, 0, core + 1, 1, 2); -		for (i = 0; i < 8; i++) { +		b43_nphy_scale_offset_rssi(dev, 0, 0, core + 1, N_RAIL_I, +					   N_RSSI_NB); +		b43_nphy_scale_offset_rssi(dev, 0, 0, core + 1, N_RAIL_Q, +					   N_RSSI_NB); + +		/* Grab RSSI results for every possible VCM */ +		for (vcm = 0; vcm < 8; vcm++) {  			b43_radio_maskset(dev, r | B2056_RX_RSSI_MISC, 0xE3, -					i << 2); -			b43_nphy_poll_rssi(dev, 2, results[i], 8); +					vcm << 2); +			b43_nphy_poll_rssi(dev, N_RSSI_NB, results[vcm], 8);  		} + +		/* Find out which VCM got the best results */  		for (i = 0; i < 4; i += 2) { -			s32 curr; +			s32 currd;  			s32 mind = 0x100000;  			s32 minpoll = 249;  			u8 minvcm = 0;  			if (2 * core != i)  				continue; -			for (j = 0; j < 8; j++) { -				curr = results[j][i] * results[j][i] + -					results[j][i + 1] * results[j][i]; -				if (curr < mind) { -					mind = curr; -					minvcm = j; +			for (vcm = 0; vcm < 8; vcm++) { +				currd = results[vcm][i] * results[vcm][i] + +					results[vcm][i + 1] * results[vcm][i]; +				if (currd < mind) { +					mind = currd; +					minvcm = vcm;  				} -				if (results[j][i] < minpoll) -					minpoll = results[j][i]; +				if (results[vcm][i] < minpoll) +					minpoll = results[vcm][i];  			}  			vcm_final = minvcm;  			results_min[i] = minpoll;  		} + +		/* Select the best VCM */  		b43_radio_maskset(dev, r | B2056_RX_RSSI_MISC, 0xE3,  				  vcm_final << 2); +  		for (i = 0; i < 4; i++) {  			if (core != i / 2)  				continue; @@ -1647,16 +1696,19 @@ static void b43_nphy_rev3_rssi_cal(struct b43_wldev *dev)  				offset[i] = -32;  			b43_nphy_scale_offset_rssi(dev, 0, offset[i],  						   (i / 2 == 0) ? 1 : 2, -						   (i % 2 == 0) ? 0 : 1, -						   2); +						   (i % 2 == 0) ? N_RAIL_I : N_RAIL_Q, +						   N_RSSI_NB);  		}  	} +  	for (core = 0; core < 2; core++) {  		if (!(rx_core_state & (1 << core)))  			continue;  		for (i = 0; i < 2; i++) { -			b43_nphy_scale_offset_rssi(dev, 0, 0, core + 1, 0, i); -			b43_nphy_scale_offset_rssi(dev, 0, 0, core + 1, 1, i); +			b43_nphy_scale_offset_rssi(dev, 0, 0, core + 1, +						   N_RAIL_I, i); +			b43_nphy_scale_offset_rssi(dev, 0, 0, core + 1, +						   N_RAIL_Q, i);  			b43_nphy_poll_rssi(dev, i, poll_results, 8);  			for (j = 0; j < 4; j++) {  				if (j / 2 == core) { @@ -1696,8 +1748,13 @@ static void b43_nphy_rev3_rssi_cal(struct b43_wldev *dev)  		rssical_radio_regs = nphy->rssical_cache.rssical_radio_regs_5G;  		rssical_phy_regs = nphy->rssical_cache.rssical_phy_regs_5G;  	} -	rssical_radio_regs[0] = b43_radio_read(dev, 0x602B); -	rssical_radio_regs[0] = b43_radio_read(dev, 0x702B); +	if (dev->phy.rev >= 7) { +	} else { +		rssical_radio_regs[0] = b43_radio_read(dev, B2056_RX0 | +						       B2056_RX_RSSI_MISC); +		rssical_radio_regs[1] = b43_radio_read(dev, B2056_RX1 | +						       B2056_RX_RSSI_MISC); +	}  	rssical_phy_regs[0] = b43_phy_read(dev, B43_NPHY_RSSIMC_0I_RSSI_Z);  	rssical_phy_regs[1] = b43_phy_read(dev, B43_NPHY_RSSIMC_0Q_RSSI_Z);  	rssical_phy_regs[2] = b43_phy_read(dev, B43_NPHY_RSSIMC_1I_RSSI_Z); @@ -1723,9 +1780,9 @@ static void b43_nphy_rev3_rssi_cal(struct b43_wldev *dev)  }  /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RSSICal */ -static void b43_nphy_rev2_rssi_cal(struct b43_wldev *dev, u8 type) +static void b43_nphy_rev2_rssi_cal(struct b43_wldev *dev, enum n_rssi_type type)  { -	int i, j; +	int i, j, vcm;  	u8 state[4];  	u8 code, val;  	u16 class, override; @@ -1743,10 +1800,10 @@ static void b43_nphy_rev2_rssi_cal(struct b43_wldev *dev, u8 type)  	s32 results[4][4] = { };  	s32 miniq[4][2] = { }; -	if (type == 2) { +	if (type == N_RSSI_NB) {  		code = 0;  		val = 6; -	} else if (type < 2) { +	} else if (type == N_RSSI_W1 || type == N_RSSI_W2) {  		code = 25;  		val = 4;  	} else { @@ -1765,63 +1822,63 @@ static void b43_nphy_rev2_rssi_cal(struct b43_wldev *dev, u8 type)  		override = 0x110;  	regs_save_phy[0] = b43_phy_read(dev, B43_NPHY_RFCTL_INTC1); -	regs_save_radio[0] = b43_radio_read16(dev, B2055_C1_PD_RXTX); +	regs_save_radio[0] = b43_radio_read(dev, B2055_C1_PD_RXTX);  	b43_phy_write(dev, B43_NPHY_RFCTL_INTC1, override); -	b43_radio_write16(dev, B2055_C1_PD_RXTX, val); +	b43_radio_write(dev, B2055_C1_PD_RXTX, val);  	regs_save_phy[1] = b43_phy_read(dev, B43_NPHY_RFCTL_INTC2); -	regs_save_radio[1] = b43_radio_read16(dev, B2055_C2_PD_RXTX); +	regs_save_radio[1] = b43_radio_read(dev, B2055_C2_PD_RXTX);  	b43_phy_write(dev, B43_NPHY_RFCTL_INTC2, override); -	b43_radio_write16(dev, B2055_C2_PD_RXTX, val); +	b43_radio_write(dev, B2055_C2_PD_RXTX, val); -	state[0] = b43_radio_read16(dev, B2055_C1_PD_RSSIMISC) & 0x07; -	state[1] = b43_radio_read16(dev, B2055_C2_PD_RSSIMISC) & 0x07; +	state[0] = b43_radio_read(dev, B2055_C1_PD_RSSIMISC) & 0x07; +	state[1] = b43_radio_read(dev, B2055_C2_PD_RSSIMISC) & 0x07;  	b43_radio_mask(dev, B2055_C1_PD_RSSIMISC, 0xF8);  	b43_radio_mask(dev, B2055_C2_PD_RSSIMISC, 0xF8); -	state[2] = b43_radio_read16(dev, B2055_C1_SP_RSSI) & 0x07; -	state[3] = b43_radio_read16(dev, B2055_C2_SP_RSSI) & 0x07; +	state[2] = b43_radio_read(dev, B2055_C1_SP_RSSI) & 0x07; +	state[3] = b43_radio_read(dev, B2055_C2_SP_RSSI) & 0x07;  	b43_nphy_rssi_select(dev, 5, type); -	b43_nphy_scale_offset_rssi(dev, 0, 0, 5, 0, type); -	b43_nphy_scale_offset_rssi(dev, 0, 0, 5, 1, type); +	b43_nphy_scale_offset_rssi(dev, 0, 0, 5, N_RAIL_I, type); +	b43_nphy_scale_offset_rssi(dev, 0, 0, 5, N_RAIL_Q, type); -	for (i = 0; i < 4; i++) { +	for (vcm = 0; vcm < 4; vcm++) {  		u8 tmp[4];  		for (j = 0; j < 4; j++) -			tmp[j] = i; -		if (type != 1) +			tmp[j] = vcm; +		if (type != N_RSSI_W2)  			b43_nphy_set_rssi_2055_vcm(dev, type, tmp); -		b43_nphy_poll_rssi(dev, type, results[i], 8); -		if (type < 2) +		b43_nphy_poll_rssi(dev, type, results[vcm], 8); +		if (type == N_RSSI_W1 || type == N_RSSI_W2)  			for (j = 0; j < 2; j++) -				miniq[i][j] = min(results[i][2 * j], -						results[i][2 * j + 1]); +				miniq[vcm][j] = min(results[vcm][2 * j], +						    results[vcm][2 * j + 1]);  	}  	for (i = 0; i < 4; i++) {  		s32 mind = 0x100000;  		u8 minvcm = 0;  		s32 minpoll = 249; -		s32 curr; -		for (j = 0; j < 4; j++) { -			if (type == 2) -				curr = abs(results[j][i]); +		s32 currd; +		for (vcm = 0; vcm < 4; vcm++) { +			if (type == N_RSSI_NB) +				currd = abs(results[vcm][i] - code * 8);  			else -				curr = abs(miniq[j][i / 2] - code * 8); +				currd = abs(miniq[vcm][i / 2] - code * 8); -			if (curr < mind) { -				mind = curr; -				minvcm = j; +			if (currd < mind) { +				mind = currd; +				minvcm = vcm;  			} -			if (results[j][i] < minpoll) -				minpoll = results[j][i]; +			if (results[vcm][i] < minpoll) +				minpoll = results[vcm][i];  		}  		results_min[i] = minpoll;  		vcm_final[i] = minvcm;  	} -	if (type != 1) +	if (type != N_RSSI_W2)  		b43_nphy_set_rssi_2055_vcm(dev, type, vcm_final);  	for (i = 0; i < 4; i++) { @@ -1836,7 +1893,7 @@ static void b43_nphy_rev2_rssi_cal(struct b43_wldev *dev, u8 type)  			offset[i] = code - 32;  		core = (i / 2) ? 2 : 1; -		rail = (i % 2) ? 1 : 0; +		rail = (i % 2) ? N_RAIL_Q : N_RAIL_I;  		b43_nphy_scale_offset_rssi(dev, 0, offset[i], core, rail,  						type); @@ -1847,37 +1904,37 @@ static void b43_nphy_rev2_rssi_cal(struct b43_wldev *dev, u8 type)  	switch (state[2]) {  	case 1: -		b43_nphy_rssi_select(dev, 1, 2); +		b43_nphy_rssi_select(dev, 1, N_RSSI_NB);  		break;  	case 4: -		b43_nphy_rssi_select(dev, 1, 0); +		b43_nphy_rssi_select(dev, 1, N_RSSI_W1);  		break;  	case 2: -		b43_nphy_rssi_select(dev, 1, 1); +		b43_nphy_rssi_select(dev, 1, N_RSSI_W2);  		break;  	default: -		b43_nphy_rssi_select(dev, 1, 1); +		b43_nphy_rssi_select(dev, 1, N_RSSI_W2);  		break;  	}  	switch (state[3]) {  	case 1: -		b43_nphy_rssi_select(dev, 2, 2); +		b43_nphy_rssi_select(dev, 2, N_RSSI_NB);  		break;  	case 4: -		b43_nphy_rssi_select(dev, 2, 0); +		b43_nphy_rssi_select(dev, 2, N_RSSI_W1);  		break;  	default: -		b43_nphy_rssi_select(dev, 2, 1); +		b43_nphy_rssi_select(dev, 2, N_RSSI_W2);  		break;  	}  	b43_nphy_rssi_select(dev, 0, type);  	b43_phy_write(dev, B43_NPHY_RFCTL_INTC1, regs_save_phy[0]); -	b43_radio_write16(dev, B2055_C1_PD_RXTX, regs_save_radio[0]); +	b43_radio_write(dev, B2055_C1_PD_RXTX, regs_save_radio[0]);  	b43_phy_write(dev, B43_NPHY_RFCTL_INTC2, regs_save_phy[1]); -	b43_radio_write16(dev, B2055_C2_PD_RXTX, regs_save_radio[1]); +	b43_radio_write(dev, B2055_C2_PD_RXTX, regs_save_radio[1]);  	b43_nphy_classifier(dev, 7, class);  	b43_nphy_write_clip_detection(dev, clip_state); @@ -1895,9 +1952,9 @@ static void b43_nphy_rssi_cal(struct b43_wldev *dev)  	if (dev->phy.rev >= 3) {  		b43_nphy_rev3_rssi_cal(dev);  	} else { -		b43_nphy_rev2_rssi_cal(dev, B43_NPHY_RSSI_Z); -		b43_nphy_rev2_rssi_cal(dev, B43_NPHY_RSSI_X); -		b43_nphy_rev2_rssi_cal(dev, B43_NPHY_RSSI_Y); +		b43_nphy_rev2_rssi_cal(dev, N_RSSI_NB); +		b43_nphy_rev2_rssi_cal(dev, N_RSSI_W1); +		b43_nphy_rev2_rssi_cal(dev, N_RSSI_W2);  	}  } @@ -1930,10 +1987,8 @@ static void b43_nphy_gain_ctl_workarounds_rev3plus(struct b43_wldev *dev)  	b43_phy_set(dev, B43_NPHY_RXCTL, 0x0040);  	/* Set Clip 2 detect */ -	b43_phy_set(dev, B43_NPHY_C1_CGAINI, -			B43_NPHY_C1_CGAINI_CL2DETECT); -	b43_phy_set(dev, B43_NPHY_C2_CGAINI, -			B43_NPHY_C2_CGAINI_CL2DETECT); +	b43_phy_set(dev, B43_NPHY_C1_CGAINI, B43_NPHY_C1_CGAINI_CL2DETECT); +	b43_phy_set(dev, B43_NPHY_C2_CGAINI, B43_NPHY_C2_CGAINI_CL2DETECT);  	b43_radio_write(dev, B2056_RX0 | B2056_RX_BIASPOLE_LNAG1_IDAC,  			0x17); @@ -1967,22 +2022,22 @@ static void b43_nphy_gain_ctl_workarounds_rev3plus(struct b43_wldev *dev)  	b43_ntab_write_bulk(dev, B43_NTAB8(2, 0x40), 6, lpf_bits);  	b43_ntab_write_bulk(dev, B43_NTAB8(3, 0x40), 6, lpf_bits); -	b43_phy_write(dev, B43_NPHY_C1_INITGAIN, e->init_gain); -	b43_phy_write(dev, 0x2A7, e->init_gain); +	b43_phy_write(dev, B43_NPHY_REV3_C1_INITGAIN_A, e->init_gain); +	b43_phy_write(dev, B43_NPHY_REV3_C2_INITGAIN_A, e->init_gain); +  	b43_ntab_write_bulk(dev, B43_NTAB16(7, 0x106), 2,  				e->rfseq_init); -	/* TODO: check defines. Do not match variables names */ -	b43_phy_write(dev, B43_NPHY_C1_CLIP1_MEDGAIN, e->cliphi_gain); -	b43_phy_write(dev, 0x2A9, e->cliphi_gain); -	b43_phy_write(dev, B43_NPHY_C1_CLIP2_GAIN, e->clipmd_gain); -	b43_phy_write(dev, 0x2AB, e->clipmd_gain); -	b43_phy_write(dev, B43_NPHY_C2_CLIP1_HIGAIN, e->cliplo_gain); -	b43_phy_write(dev, 0x2AD, e->cliplo_gain); +	b43_phy_write(dev, B43_NPHY_REV3_C1_CLIP_HIGAIN_A, e->cliphi_gain); +	b43_phy_write(dev, B43_NPHY_REV3_C2_CLIP_HIGAIN_A, e->cliphi_gain); +	b43_phy_write(dev, B43_NPHY_REV3_C1_CLIP_MEDGAIN_A, e->clipmd_gain); +	b43_phy_write(dev, B43_NPHY_REV3_C2_CLIP_MEDGAIN_A, e->clipmd_gain); +	b43_phy_write(dev, B43_NPHY_REV3_C1_CLIP_LOGAIN_A, e->cliplo_gain); +	b43_phy_write(dev, B43_NPHY_REV3_C2_CLIP_LOGAIN_A, e->cliplo_gain); -	b43_phy_maskset(dev, 0x27D, 0xFF00, e->crsmin); -	b43_phy_maskset(dev, 0x280, 0xFF00, e->crsminl); -	b43_phy_maskset(dev, 0x283, 0xFF00, e->crsminu); +	b43_phy_maskset(dev, B43_NPHY_CRSMINPOWER0, 0xFF00, e->crsmin); +	b43_phy_maskset(dev, B43_NPHY_CRSMINPOWERL0, 0xFF00, e->crsminl); +	b43_phy_maskset(dev, B43_NPHY_CRSMINPOWERU0, 0xFF00, e->crsminu);  	b43_phy_write(dev, B43_NPHY_C1_NBCLIPTHRES, e->nbclip);  	b43_phy_write(dev, B43_NPHY_C2_NBCLIPTHRES, e->nbclip);  	b43_phy_maskset(dev, B43_NPHY_C1_CLIPWBTHRES, @@ -2164,8 +2219,8 @@ static void b43_nphy_workarounds_rev7plus(struct b43_wldev *dev)  		b43_phy_maskset(dev, B43_NPHY_FREQGAIN7, 0x80FF, 0x4000);  	}  	if (phy->rev <= 8) { -		b43_phy_write(dev, 0x23F, 0x1B0); -		b43_phy_write(dev, 0x240, 0x1B0); +		b43_phy_write(dev, B43_NPHY_FORCEFRONT0, 0x1B0); +		b43_phy_write(dev, B43_NPHY_FORCEFRONT1, 0x1B0);  	}  	if (phy->rev >= 8)  		b43_phy_maskset(dev, B43_NPHY_TXTAILCNT, ~0xFF, 0x72); @@ -2182,8 +2237,8 @@ static void b43_nphy_workarounds_rev7plus(struct b43_wldev *dev)  		b43_nphy_set_rf_sequence(dev, 0, rx2tx_events_ipa,  				rx2tx_delays_ipa, ARRAY_SIZE(rx2tx_events_ipa)); -	b43_phy_maskset(dev, 0x299, 0x3FFF, 0x4000); -	b43_phy_maskset(dev, 0x29D, 0x3FFF, 0x4000); +	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); @@ -2260,11 +2315,11 @@ static void b43_nphy_workarounds_rev7plus(struct b43_wldev *dev)  			b43_ntab_write(dev, B43_NTAB16(7, 0x159 + core * 16),  				       rx2tx_lut_40_11n);  		} -		b43_nphy_rf_control_override_rev7(dev, 16, 1, 3, false, 2); +		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_control_override_rev7(dev, 4, 1, 3, false, 0); +		b43_nphy_rf_ctl_override_rev7(dev, 4, 1, 3, false, 0);  	if (phy->radio_rev == 3 || phy->radio_rev == 4 || phy->radio_rev == 6) {  		if (sprom->revision && @@ -2450,8 +2505,8 @@ static void b43_nphy_workarounds_rev3plus(struct b43_wldev *dev)  	u16 tmp16;  	u32 tmp32; -	b43_phy_write(dev, 0x23f, 0x1f8); -	b43_phy_write(dev, 0x240, 0x1f8); +	b43_phy_write(dev, B43_NPHY_FORCEFRONT0, 0x1f8); +	b43_phy_write(dev, B43_NPHY_FORCEFRONT1, 0x1f8);  	tmp32 = b43_ntab_read(dev, B43_NTAB32(30, 0));  	tmp32 &= 0xffffff; @@ -2464,8 +2519,8 @@ static void b43_nphy_workarounds_rev3plus(struct b43_wldev *dev)  	b43_phy_write(dev, B43_NPHY_PHASETR_B1, 0x00CD);  	b43_phy_write(dev, B43_NPHY_PHASETR_B2, 0x0020); -	b43_phy_write(dev, B43_NPHY_C2_CLIP1_MEDGAIN, 0x000C); -	b43_phy_write(dev, 0x2AE, 0x000C); +	b43_phy_write(dev, B43_NPHY_REV3_C1_CLIP_LOGAIN_B, 0x000C); +	b43_phy_write(dev, B43_NPHY_REV3_C2_CLIP_LOGAIN_B, 0x000C);  	/* TX to RX */  	b43_nphy_set_rf_sequence(dev, 1, tx2rx_events, tx2rx_delays, @@ -2490,7 +2545,7 @@ static void b43_nphy_workarounds_rev3plus(struct b43_wldev *dev)  		0x2 : 0x9C40;  	b43_phy_write(dev, B43_NPHY_ENDROP_TLEN, tmp16); -	b43_phy_maskset(dev, 0x294, 0xF0FF, 0x0700); +	b43_phy_maskset(dev, B43_NPHY_SGILTRNOFFSET, 0xF0FF, 0x0700);  	if (!dev->phy.is_40mhz) {  		b43_ntab_write(dev, B43_NTAB32(16, 3), 0x18D); @@ -2542,18 +2597,18 @@ static void b43_nphy_workarounds_rev3plus(struct b43_wldev *dev)  	}  	/* Dropped probably-always-true condition */ -	b43_phy_write(dev, 0x224, 0x03eb); -	b43_phy_write(dev, 0x225, 0x03eb); -	b43_phy_write(dev, 0x226, 0x0341); -	b43_phy_write(dev, 0x227, 0x0341); -	b43_phy_write(dev, 0x228, 0x042b); -	b43_phy_write(dev, 0x229, 0x042b); -	b43_phy_write(dev, 0x22a, 0x0381); -	b43_phy_write(dev, 0x22b, 0x0381); -	b43_phy_write(dev, 0x22c, 0x042b); -	b43_phy_write(dev, 0x22d, 0x042b); -	b43_phy_write(dev, 0x22e, 0x0381); -	b43_phy_write(dev, 0x22f, 0x0381); +	b43_phy_write(dev, B43_NPHY_ED_CRS40ASSERTTHRESH0, 0x03eb); +	b43_phy_write(dev, B43_NPHY_ED_CRS40ASSERTTHRESH1, 0x03eb); +	b43_phy_write(dev, B43_NPHY_ED_CRS40DEASSERTTHRESH1, 0x0341); +	b43_phy_write(dev, B43_NPHY_ED_CRS40DEASSERTTHRESH1, 0x0341); +	b43_phy_write(dev, B43_NPHY_ED_CRS20LASSERTTHRESH0, 0x042b); +	b43_phy_write(dev, B43_NPHY_ED_CRS20LASSERTTHRESH1, 0x042b); +	b43_phy_write(dev, B43_NPHY_ED_CRS20LDEASSERTTHRESH0, 0x0381); +	b43_phy_write(dev, B43_NPHY_ED_CRS20LDEASSERTTHRESH1, 0x0381); +	b43_phy_write(dev, B43_NPHY_ED_CRS20UASSERTTHRESH0, 0x042b); +	b43_phy_write(dev, B43_NPHY_ED_CRS20UASSERTTHRESH1, 0x042b); +	b43_phy_write(dev, B43_NPHY_ED_CRS20UDEASSERTTHRESH0, 0x0381); +	b43_phy_write(dev, B43_NPHY_ED_CRS20UDEASSERTTHRESH1, 0x0381);  	if (dev->phy.rev >= 6 && sprom->boardflags2_lo & B43_BFL2_SINGLEANT_CCK)  		; /* TODO: 0x0080000000000000 HF */ @@ -2572,7 +2627,7 @@ static void b43_nphy_workarounds_rev1_2(struct b43_wldev *dev)  	u8 delays2[7] = { 0x8, 0x6, 0x2, 0x4, 0x4, 0x6, 0x1 };  	if (sprom->boardflags2_lo & B43_BFL2_SKWRKFEM_BRD || -	    dev->dev->board_type == 0x8B) { +	    dev->dev->board_type == BCMA_BOARD_TYPE_BCM943224M93) {  		delays1[0] = 0x1;  		delays1[5] = 0x14;  	} @@ -2789,10 +2844,6 @@ static void b43_nphy_iq_cal_gain_params(struct b43_wldev *dev, u16 core,   * Tx and Rx   **************************************************/ -void b43_nphy_set_rxantenna(struct b43_wldev *dev, int antenna) -{//TODO -} -  static void b43_nphy_op_adjust_txpower(struct b43_wldev *dev)  {//TODO  } @@ -3124,21 +3175,21 @@ static void b43_nphy_tx_power_ctl_idle_tssi(struct b43_wldev *dev)  		b43_nphy_ipa_internal_tssi_setup(dev);  	if (phy->rev >= 7) -		b43_nphy_rf_control_override_rev7(dev, 0x2000, 0, 3, false, 0); +		b43_nphy_rf_ctl_override_rev7(dev, 0x2000, 0, 3, false, 0);  	else if (phy->rev >= 3) -		b43_nphy_rf_control_override(dev, 0x2000, 0, 3, false); +		b43_nphy_rf_ctl_override(dev, 0x2000, 0, 3, false);  	b43_nphy_stop_playback(dev);  	b43_nphy_tx_tone(dev, 0xFA0, 0, false, false);  	udelay(20); -	tmp = b43_nphy_poll_rssi(dev, 4, rssi, 1); +	tmp = b43_nphy_poll_rssi(dev, N_RSSI_TSSI_2G, rssi, 1);  	b43_nphy_stop_playback(dev); -	b43_nphy_rssi_select(dev, 0, 0); +	b43_nphy_rssi_select(dev, 0, N_RSSI_W1);  	if (phy->rev >= 7) -		b43_nphy_rf_control_override_rev7(dev, 0x2000, 0, 3, true, 0); +		b43_nphy_rf_ctl_override_rev7(dev, 0x2000, 0, 3, true, 0);  	else if (phy->rev >= 3) -		b43_nphy_rf_control_override(dev, 0x2000, 0, 3, true); +		b43_nphy_rf_ctl_override(dev, 0x2000, 0, 3, true);  	if (phy->rev >= 3) {  		nphy->pwr_ctl_info[0].idle_tssi_5g = (tmp >> 24) & 0xFF; @@ -3577,8 +3628,8 @@ static void b43_nphy_rx_cal_phy_setup(struct b43_wldev *dev, u8 core)  		b43_phy_set(dev, B43_NPHY_AFECTL_OVER, 0x0007);  	} -	b43_nphy_rf_control_intc_override(dev, 2, 0, 3); -	b43_nphy_rf_control_override(dev, 8, 0, 3, false); +	b43_nphy_rf_ctl_intc_override(dev, N_INTC_OVERRIDE_PA, 0, 3); +	b43_nphy_rf_ctl_override(dev, 8, 0, 3, false);  	b43_nphy_force_rf_sequence(dev, B43_RFSEQ_RX2TX);  	if (core == 0) { @@ -3588,8 +3639,10 @@ static void b43_nphy_rx_cal_phy_setup(struct b43_wldev *dev, u8 core)  		rxval = 4;  		txval = 2;  	} -	b43_nphy_rf_control_intc_override(dev, 1, rxval, (core + 1)); -	b43_nphy_rf_control_intc_override(dev, 1, txval, (2 - core)); +	b43_nphy_rf_ctl_intc_override(dev, N_INTC_OVERRIDE_TRSW, rxval, +				      core + 1); +	b43_nphy_rf_ctl_intc_override(dev, N_INTC_OVERRIDE_TRSW, txval, +				      2 - core);  }  #endif @@ -3851,9 +3904,13 @@ static void b43_nphy_restore_rssi_cal(struct b43_wldev *dev)  		rssical_phy_regs = nphy->rssical_cache.rssical_phy_regs_5G;  	} -	/* TODO use some definitions */ -	b43_radio_maskset(dev, 0x602B, 0xE3, rssical_radio_regs[0]); -	b43_radio_maskset(dev, 0x702B, 0xE3, rssical_radio_regs[1]); +	if (dev->phy.rev >= 7) { +	} else { +		b43_radio_maskset(dev, B2056_RX0 | B2056_RX_RSSI_MISC, 0xE3, +				  rssical_radio_regs[0]); +		b43_radio_maskset(dev, B2056_RX1 | B2056_RX_RSSI_MISC, 0xE3, +				  rssical_radio_regs[1]); +	}  	b43_phy_write(dev, B43_NPHY_RSSIMC_0I_RSSI_Z, rssical_phy_regs[0]);  	b43_phy_write(dev, B43_NPHY_RSSIMC_0Q_RSSI_Z, rssical_phy_regs[1]); @@ -3884,75 +3941,75 @@ static void b43_nphy_tx_cal_radio_setup(struct b43_wldev *dev)  		tmp = (i == 0) ? 0x2000 : 0x3000;  		offset = i * 11; -		save[offset + 0] = b43_radio_read16(dev, B2055_CAL_RVARCTL); -		save[offset + 1] = b43_radio_read16(dev, B2055_CAL_LPOCTL); -		save[offset + 2] = b43_radio_read16(dev, B2055_CAL_TS); -		save[offset + 3] = b43_radio_read16(dev, B2055_CAL_RCCALRTS); -		save[offset + 4] = b43_radio_read16(dev, B2055_CAL_RCALRTS); -		save[offset + 5] = b43_radio_read16(dev, B2055_PADDRV); -		save[offset + 6] = b43_radio_read16(dev, B2055_XOCTL1); -		save[offset + 7] = b43_radio_read16(dev, B2055_XOCTL2); -		save[offset + 8] = b43_radio_read16(dev, B2055_XOREGUL); -		save[offset + 9] = b43_radio_read16(dev, B2055_XOMISC); -		save[offset + 10] = b43_radio_read16(dev, B2055_PLL_LFC1); +		save[offset + 0] = b43_radio_read(dev, B2055_CAL_RVARCTL); +		save[offset + 1] = b43_radio_read(dev, B2055_CAL_LPOCTL); +		save[offset + 2] = b43_radio_read(dev, B2055_CAL_TS); +		save[offset + 3] = b43_radio_read(dev, B2055_CAL_RCCALRTS); +		save[offset + 4] = b43_radio_read(dev, B2055_CAL_RCALRTS); +		save[offset + 5] = b43_radio_read(dev, B2055_PADDRV); +		save[offset + 6] = b43_radio_read(dev, B2055_XOCTL1); +		save[offset + 7] = b43_radio_read(dev, B2055_XOCTL2); +		save[offset + 8] = b43_radio_read(dev, B2055_XOREGUL); +		save[offset + 9] = b43_radio_read(dev, B2055_XOMISC); +		save[offset + 10] = b43_radio_read(dev, B2055_PLL_LFC1);  		if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) { -			b43_radio_write16(dev, tmp | B2055_CAL_RVARCTL, 0x0A); -			b43_radio_write16(dev, tmp | B2055_CAL_LPOCTL, 0x40); -			b43_radio_write16(dev, tmp | B2055_CAL_TS, 0x55); -			b43_radio_write16(dev, tmp | B2055_CAL_RCCALRTS, 0); -			b43_radio_write16(dev, tmp | B2055_CAL_RCALRTS, 0); +			b43_radio_write(dev, tmp | B2055_CAL_RVARCTL, 0x0A); +			b43_radio_write(dev, tmp | B2055_CAL_LPOCTL, 0x40); +			b43_radio_write(dev, tmp | B2055_CAL_TS, 0x55); +			b43_radio_write(dev, tmp | B2055_CAL_RCCALRTS, 0); +			b43_radio_write(dev, tmp | B2055_CAL_RCALRTS, 0);  			if (nphy->ipa5g_on) { -				b43_radio_write16(dev, tmp | B2055_PADDRV, 4); -				b43_radio_write16(dev, tmp | B2055_XOCTL1, 1); +				b43_radio_write(dev, tmp | B2055_PADDRV, 4); +				b43_radio_write(dev, tmp | B2055_XOCTL1, 1);  			} else { -				b43_radio_write16(dev, tmp | B2055_PADDRV, 0); -				b43_radio_write16(dev, tmp | B2055_XOCTL1, 0x2F); +				b43_radio_write(dev, tmp | B2055_PADDRV, 0); +				b43_radio_write(dev, tmp | B2055_XOCTL1, 0x2F);  			} -			b43_radio_write16(dev, tmp | B2055_XOCTL2, 0); +			b43_radio_write(dev, tmp | B2055_XOCTL2, 0);  		} else { -			b43_radio_write16(dev, tmp | B2055_CAL_RVARCTL, 0x06); -			b43_radio_write16(dev, tmp | B2055_CAL_LPOCTL, 0x40); -			b43_radio_write16(dev, tmp | B2055_CAL_TS, 0x55); -			b43_radio_write16(dev, tmp | B2055_CAL_RCCALRTS, 0); -			b43_radio_write16(dev, tmp | B2055_CAL_RCALRTS, 0); -			b43_radio_write16(dev, tmp | B2055_XOCTL1, 0); +			b43_radio_write(dev, tmp | B2055_CAL_RVARCTL, 0x06); +			b43_radio_write(dev, tmp | B2055_CAL_LPOCTL, 0x40); +			b43_radio_write(dev, tmp | B2055_CAL_TS, 0x55); +			b43_radio_write(dev, tmp | B2055_CAL_RCCALRTS, 0); +			b43_radio_write(dev, tmp | B2055_CAL_RCALRTS, 0); +			b43_radio_write(dev, tmp | B2055_XOCTL1, 0);  			if (nphy->ipa2g_on) { -				b43_radio_write16(dev, tmp | B2055_PADDRV, 6); -				b43_radio_write16(dev, tmp | B2055_XOCTL2, +				b43_radio_write(dev, tmp | B2055_PADDRV, 6); +				b43_radio_write(dev, tmp | B2055_XOCTL2,  					(dev->phy.rev < 5) ? 0x11 : 0x01);  			} else { -				b43_radio_write16(dev, tmp | B2055_PADDRV, 0); -				b43_radio_write16(dev, tmp | B2055_XOCTL2, 0); +				b43_radio_write(dev, tmp | B2055_PADDRV, 0); +				b43_radio_write(dev, tmp | B2055_XOCTL2, 0);  			}  		} -		b43_radio_write16(dev, tmp | B2055_XOREGUL, 0); -		b43_radio_write16(dev, tmp | B2055_XOMISC, 0); -		b43_radio_write16(dev, tmp | B2055_PLL_LFC1, 0); +		b43_radio_write(dev, tmp | B2055_XOREGUL, 0); +		b43_radio_write(dev, tmp | B2055_XOMISC, 0); +		b43_radio_write(dev, tmp | B2055_PLL_LFC1, 0);  	    }  	} else { -		save[0] = b43_radio_read16(dev, B2055_C1_TX_RF_IQCAL1); -		b43_radio_write16(dev, B2055_C1_TX_RF_IQCAL1, 0x29); +		save[0] = b43_radio_read(dev, B2055_C1_TX_RF_IQCAL1); +		b43_radio_write(dev, B2055_C1_TX_RF_IQCAL1, 0x29); -		save[1] = b43_radio_read16(dev, B2055_C1_TX_RF_IQCAL2); -		b43_radio_write16(dev, B2055_C1_TX_RF_IQCAL2, 0x54); +		save[1] = b43_radio_read(dev, B2055_C1_TX_RF_IQCAL2); +		b43_radio_write(dev, B2055_C1_TX_RF_IQCAL2, 0x54); -		save[2] = b43_radio_read16(dev, B2055_C2_TX_RF_IQCAL1); -		b43_radio_write16(dev, B2055_C2_TX_RF_IQCAL1, 0x29); +		save[2] = b43_radio_read(dev, B2055_C2_TX_RF_IQCAL1); +		b43_radio_write(dev, B2055_C2_TX_RF_IQCAL1, 0x29); -		save[3] = b43_radio_read16(dev, B2055_C2_TX_RF_IQCAL2); -		b43_radio_write16(dev, B2055_C2_TX_RF_IQCAL2, 0x54); +		save[3] = b43_radio_read(dev, B2055_C2_TX_RF_IQCAL2); +		b43_radio_write(dev, B2055_C2_TX_RF_IQCAL2, 0x54); -		save[3] = b43_radio_read16(dev, B2055_C1_PWRDET_RXTX); -		save[4] = b43_radio_read16(dev, B2055_C2_PWRDET_RXTX); +		save[3] = b43_radio_read(dev, B2055_C1_PWRDET_RXTX); +		save[4] = b43_radio_read(dev, B2055_C2_PWRDET_RXTX);  		if (!(b43_phy_read(dev, B43_NPHY_BANDCTL) &  		    B43_NPHY_BANDCTL_5GHZ)) { -			b43_radio_write16(dev, B2055_C1_PWRDET_RXTX, 0x04); -			b43_radio_write16(dev, B2055_C2_PWRDET_RXTX, 0x04); +			b43_radio_write(dev, B2055_C1_PWRDET_RXTX, 0x04); +			b43_radio_write(dev, B2055_C2_PWRDET_RXTX, 0x04);  		} else { -			b43_radio_write16(dev, B2055_C1_PWRDET_RXTX, 0x20); -			b43_radio_write16(dev, B2055_C2_PWRDET_RXTX, 0x20); +			b43_radio_write(dev, B2055_C1_PWRDET_RXTX, 0x20); +			b43_radio_write(dev, B2055_C2_PWRDET_RXTX, 0x20);  		}  		if (dev->phy.rev < 2) { @@ -4148,9 +4205,9 @@ static void b43_nphy_tx_cal_phy_setup(struct b43_wldev *dev)  		regs[7] = b43_phy_read(dev, B43_NPHY_RFCTL_INTC1);  		regs[8] = b43_phy_read(dev, B43_NPHY_RFCTL_INTC2); -		b43_nphy_rf_control_intc_override(dev, 2, 1, 3); -		b43_nphy_rf_control_intc_override(dev, 1, 2, 1); -		b43_nphy_rf_control_intc_override(dev, 1, 8, 2); +		b43_nphy_rf_ctl_intc_override(dev, N_INTC_OVERRIDE_PA, 1, 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);  		regs[9] = b43_phy_read(dev, B43_NPHY_PAPD_EN0);  		regs[10] = b43_phy_read(dev, B43_NPHY_PAPD_EN1); @@ -4683,7 +4740,7 @@ static int b43_nphy_rev2_cal_rx_iq(struct b43_wldev *dev,  			tmp[0] = ((cur_hpf2 << 8) | (cur_hpf1 << 4) |  					(cur_lna << 2)); -			b43_nphy_rf_control_override(dev, 0x400, tmp[0], 3, +			b43_nphy_rf_ctl_override(dev, 0x400, tmp[0], 3,  									false);  			b43_nphy_force_rf_sequence(dev, B43_RFSEQ_RESET2RX);  			b43_nphy_stop_playback(dev); @@ -4732,7 +4789,7 @@ static int b43_nphy_rev2_cal_rx_iq(struct b43_wldev *dev,  			break;  	} -	b43_nphy_rf_control_override(dev, 0x400, 0, 3, true); +	b43_nphy_rf_ctl_override(dev, 0x400, 0, 3, true);  	b43_nphy_force_rf_sequence(dev, B43_RFSEQ_RESET2RX);  	b43_ntab_write_bulk(dev, B43_NTAB16(7, 0x110), 2, gain_save); @@ -4801,18 +4858,6 @@ static void b43_nphy_set_rx_core_state(struct b43_wldev *dev, u8 mask)   * N-PHY init   **************************************************/ -/* - * Upload the N-PHY tables. - * http://bcm-v4.sipsolutions.net/802.11/PHY/N/InitTables - */ -static void b43_nphy_tables_init(struct b43_wldev *dev) -{ -	if (dev->phy.rev < 3) -		b43_nphy_rev0_1_2_tables_init(dev); -	else -		b43_nphy_rev3plus_tables_init(dev); -} -  /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/MIMOConfig */  static void b43_nphy_update_mimo_config(struct b43_wldev *dev, s32 preamble)  { @@ -4892,7 +4937,7 @@ static void b43_nphy_superswitch_init(struct b43_wldev *dev, bool init)  }  /* http://bcm-v4.sipsolutions.net/802.11/PHY/Init/N */ -int b43_phy_initn(struct b43_wldev *dev) +static int b43_phy_initn(struct b43_wldev *dev)  {  	struct ssb_sprom *sprom = dev->dev->bus_sprom;  	struct b43_phy *phy = &dev->phy; @@ -4962,7 +5007,7 @@ int b43_phy_initn(struct b43_wldev *dev)  	if (sprom->boardflags2_lo & B43_BFL2_SKWRKFEM_BRD ||  	    (dev->dev->board_vendor == PCI_VENDOR_ID_APPLE && -	     dev->dev->board_type == 0x8B)) +	     dev->dev->board_type == BCMA_BOARD_TYPE_BCM943224M93))  		b43_phy_write(dev, B43_NPHY_TXREALFD, 0xA0);  	else  		b43_phy_write(dev, B43_NPHY_TXREALFD, 0xB8); @@ -5104,63 +5149,11 @@ static void b43_chantab_phy_upload(struct b43_wldev *dev,  /* http://bcm-v4.sipsolutions.net/802.11/PmuSpurAvoid */  static void b43_nphy_pmu_spur_avoid(struct b43_wldev *dev, bool avoid)  { -	struct bcma_drv_cc __maybe_unused *cc; -	u32 __maybe_unused pmu_ctl; -  	switch (dev->dev->bus_type) {  #ifdef CONFIG_B43_BCMA  	case B43_BUS_BCMA: -		cc = &dev->dev->bdev->bus->drv_cc; -		if (dev->dev->chip_id == 43224 || dev->dev->chip_id == 43225) { -			if (avoid) { -				bcma_chipco_pll_write(cc, 0x0, 0x11500010); -				bcma_chipco_pll_write(cc, 0x1, 0x000C0C06); -				bcma_chipco_pll_write(cc, 0x2, 0x0F600a08); -				bcma_chipco_pll_write(cc, 0x3, 0x00000000); -				bcma_chipco_pll_write(cc, 0x4, 0x2001E920); -				bcma_chipco_pll_write(cc, 0x5, 0x88888815); -			} else { -				bcma_chipco_pll_write(cc, 0x0, 0x11100010); -				bcma_chipco_pll_write(cc, 0x1, 0x000c0c06); -				bcma_chipco_pll_write(cc, 0x2, 0x03000a08); -				bcma_chipco_pll_write(cc, 0x3, 0x00000000); -				bcma_chipco_pll_write(cc, 0x4, 0x200005c0); -				bcma_chipco_pll_write(cc, 0x5, 0x88888815); -			} -			pmu_ctl = BCMA_CC_PMU_CTL_PLL_UPD; -		} else if (dev->dev->chip_id == 0x4716) { -			if (avoid) { -				bcma_chipco_pll_write(cc, 0x0, 0x11500060); -				bcma_chipco_pll_write(cc, 0x1, 0x080C0C06); -				bcma_chipco_pll_write(cc, 0x2, 0x0F600000); -				bcma_chipco_pll_write(cc, 0x3, 0x00000000); -				bcma_chipco_pll_write(cc, 0x4, 0x2001E924); -				bcma_chipco_pll_write(cc, 0x5, 0x88888815); -			} else { -				bcma_chipco_pll_write(cc, 0x0, 0x11100060); -				bcma_chipco_pll_write(cc, 0x1, 0x080c0c06); -				bcma_chipco_pll_write(cc, 0x2, 0x03000000); -				bcma_chipco_pll_write(cc, 0x3, 0x00000000); -				bcma_chipco_pll_write(cc, 0x4, 0x200005c0); -				bcma_chipco_pll_write(cc, 0x5, 0x88888815); -			} -			pmu_ctl = BCMA_CC_PMU_CTL_PLL_UPD | -				  BCMA_CC_PMU_CTL_NOILPONW; -		} else if (dev->dev->chip_id == 0x4322 || -			   dev->dev->chip_id == 0x4340 || -			   dev->dev->chip_id == 0x4341) { -			bcma_chipco_pll_write(cc, 0x0, 0x11100070); -			bcma_chipco_pll_write(cc, 0x1, 0x1014140a); -			bcma_chipco_pll_write(cc, 0x5, 0x88888854); -			if (avoid) -				bcma_chipco_pll_write(cc, 0x2, 0x05201828); -			else -				bcma_chipco_pll_write(cc, 0x2, 0x05001828); -			pmu_ctl = BCMA_CC_PMU_CTL_PLL_UPD; -		} else { -			return; -		} -		bcma_cc_set32(cc, BCMA_CC_PMU_CTL, pmu_ctl); +		bcma_pmu_spuravoid_pllupdate(&dev->dev->bdev->bus->drv_cc, +					     avoid);  		break;  #endif  #ifdef CONFIG_B43_SSB @@ -5531,8 +5524,9 @@ static void b43_nphy_op_switch_analog(struct b43_wldev *dev, bool on)  static int b43_nphy_op_switch_channel(struct b43_wldev *dev,  				      unsigned int new_channel)  { -	struct ieee80211_channel *channel = dev->wl->hw->conf.channel; -	enum nl80211_channel_type channel_type = dev->wl->hw->conf.channel_type; +	struct ieee80211_channel *channel = dev->wl->hw->conf.chandef.chan; +	enum nl80211_channel_type channel_type = +		cfg80211_get_chandef_type(&dev->wl->hw->conf.chandef);  	if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) {  		if ((new_channel < 1) || (new_channel > 14)) diff --git a/drivers/net/wireless/b43/phy_n.h b/drivers/net/wireless/b43/phy_n.h index 092c0140c24..9a5b6bc27d2 100644 --- a/drivers/net/wireless/b43/phy_n.h +++ b/drivers/net/wireless/b43/phy_n.h @@ -54,10 +54,15 @@  #define  B43_NPHY_C1_INITGAIN_HPVGA2_SHIFT	7  #define  B43_NPHY_C1_INITGAIN_TRRX		0x1000 /* TR RX index */  #define  B43_NPHY_C1_INITGAIN_TRTX		0x2000 /* TR TX index */ +#define B43_NPHY_REV3_C1_INITGAIN_A		B43_PHY_N(0x020)  #define B43_NPHY_C1_CLIP1_HIGAIN		B43_PHY_N(0x021) /* Core 1 clip1 high gain code */ +#define B43_NPHY_REV3_C1_INITGAIN_B		B43_PHY_N(0x021)  #define B43_NPHY_C1_CLIP1_MEDGAIN		B43_PHY_N(0x022) /* Core 1 clip1 medium gain code */ +#define B43_NPHY_REV3_C1_CLIP_HIGAIN_A		B43_PHY_N(0x022)  #define B43_NPHY_C1_CLIP1_LOGAIN		B43_PHY_N(0x023) /* Core 1 clip1 low gain code */ +#define B43_NPHY_REV3_C1_CLIP_HIGAIN_B		B43_PHY_N(0x023)  #define B43_NPHY_C1_CLIP2_GAIN			B43_PHY_N(0x024) /* Core 1 clip2 gain code */ +#define B43_NPHY_REV3_C1_CLIP_MEDGAIN_A		B43_PHY_N(0x024)  #define B43_NPHY_C1_FILTERGAIN			B43_PHY_N(0x025) /* Core 1 filter gain */  #define B43_NPHY_C1_LPF_QHPF_BW			B43_PHY_N(0x026) /* Core 1 LPF Q HP F bandwidth */  #define B43_NPHY_C1_CLIPWBTHRES			B43_PHY_N(0x027) /* Core 1 clip wideband threshold */ @@ -107,10 +112,15 @@  #define  B43_NPHY_C2_INITGAIN_HPVGA2_SHIFT	7  #define  B43_NPHY_C2_INITGAIN_TRRX		0x1000 /* TR RX index */  #define  B43_NPHY_C2_INITGAIN_TRTX		0x2000 /* TR TX index */ +#define B43_NPHY_REV3_C1_CLIP_MEDGAIN_B		B43_PHY_N(0x036)  #define B43_NPHY_C2_CLIP1_HIGAIN		B43_PHY_N(0x037) /* Core 2 clip1 high gain code */ +#define B43_NPHY_REV3_C1_CLIP_LOGAIN_A		B43_PHY_N(0x037)  #define B43_NPHY_C2_CLIP1_MEDGAIN		B43_PHY_N(0x038) /* Core 2 clip1 medium gain code */ +#define B43_NPHY_REV3_C1_CLIP_LOGAIN_B		B43_PHY_N(0x038)  #define B43_NPHY_C2_CLIP1_LOGAIN		B43_PHY_N(0x039) /* Core 2 clip1 low gain code */ +#define B43_NPHY_REV3_C1_CLIP2_GAIN_A		B43_PHY_N(0x039)  #define B43_NPHY_C2_CLIP2_GAIN			B43_PHY_N(0x03A) /* Core 2 clip2 gain code */ +#define B43_NPHY_REV3_C1_CLIP2_GAIN_B		B43_PHY_N(0x03A)  #define B43_NPHY_C2_FILTERGAIN			B43_PHY_N(0x03B) /* Core 2 filter gain */  #define B43_NPHY_C2_LPF_QHPF_BW			B43_PHY_N(0x03C) /* Core 2 LPF Q HP F bandwidth */  #define B43_NPHY_C2_CLIPWBTHRES			B43_PHY_N(0x03D) /* Core 2 clip wideband threshold */ @@ -706,10 +716,146 @@  #define B43_NPHY_TXPCTL_INIT			B43_PHY_N(0x222) /* TX power control init */  #define  B43_NPHY_TXPCTL_INIT_PIDXI1		0x00FF /* Power index init 1 */  #define  B43_NPHY_TXPCTL_INIT_PIDXI1_SHIFT	0 +#define B43_NPHY_ED_CRSEN			B43_PHY_N(0x223) +#define B43_NPHY_ED_CRS40ASSERTTHRESH0		B43_PHY_N(0x224) +#define B43_NPHY_ED_CRS40ASSERTTHRESH1		B43_PHY_N(0x225) +#define B43_NPHY_ED_CRS40DEASSERTTHRESH0	B43_PHY_N(0x226) +#define B43_NPHY_ED_CRS40DEASSERTTHRESH1	B43_PHY_N(0x227) +#define B43_NPHY_ED_CRS20LASSERTTHRESH0		B43_PHY_N(0x228) +#define B43_NPHY_ED_CRS20LASSERTTHRESH1		B43_PHY_N(0x229) +#define B43_NPHY_ED_CRS20LDEASSERTTHRESH0	B43_PHY_N(0x22A) +#define B43_NPHY_ED_CRS20LDEASSERTTHRESH1	B43_PHY_N(0x22B) +#define B43_NPHY_ED_CRS20UASSERTTHRESH0		B43_PHY_N(0x22C) +#define B43_NPHY_ED_CRS20UASSERTTHRESH1		B43_PHY_N(0x22D) +#define B43_NPHY_ED_CRS20UDEASSERTTHRESH0	B43_PHY_N(0x22E) +#define B43_NPHY_ED_CRS20UDEASSERTTHRESH1	B43_PHY_N(0x22F) +#define B43_NPHY_ED_CRS				B43_PHY_N(0x230) +#define B43_NPHY_TIMEOUTEN			B43_PHY_N(0x231) +#define B43_NPHY_OFDMPAYDECODETIMEOUTLEN	B43_PHY_N(0x232) +#define B43_NPHY_CCKPAYDECODETIMEOUTLEN		B43_PHY_N(0x233) +#define B43_NPHY_NONPAYDECODETIMEOUTLEN		B43_PHY_N(0x234) +#define B43_NPHY_TIMEOUTSTATUS			B43_PHY_N(0x235) +#define B43_NPHY_RFCTRLCORE0GPIO0		B43_PHY_N(0x236) +#define B43_NPHY_RFCTRLCORE0GPIO1		B43_PHY_N(0x237) +#define B43_NPHY_RFCTRLCORE0GPIO2		B43_PHY_N(0x238) +#define B43_NPHY_RFCTRLCORE0GPIO3		B43_PHY_N(0x239) +#define B43_NPHY_RFCTRLCORE1GPIO0		B43_PHY_N(0x23A) +#define B43_NPHY_RFCTRLCORE1GPIO1		B43_PHY_N(0x23B) +#define B43_NPHY_RFCTRLCORE1GPIO2		B43_PHY_N(0x23C) +#define B43_NPHY_RFCTRLCORE1GPIO3		B43_PHY_N(0x23D) +#define B43_NPHY_BPHYTESTCONTROL		B43_PHY_N(0x23E) +/* REV3+ */ +#define B43_NPHY_FORCEFRONT0			B43_PHY_N(0x23F) +#define B43_NPHY_FORCEFRONT1			B43_PHY_N(0x240) +#define B43_NPHY_NORMVARHYSTTH			B43_PHY_N(0x241) +#define B43_NPHY_TXCCKERROR			B43_PHY_N(0x242) +#define B43_NPHY_AFESEQINITDACGAIN		B43_PHY_N(0x243) +#define B43_NPHY_TXANTSWLUT			B43_PHY_N(0x244) +#define B43_NPHY_CORECONFIG			B43_PHY_N(0x245) +#define B43_NPHY_ANTENNADIVDWELLTIME		B43_PHY_N(0x246) +#define B43_NPHY_ANTENNACCKDIVDWELLTIME		B43_PHY_N(0x247) +#define B43_NPHY_ANTENNADIVBACKOFFGAIN		B43_PHY_N(0x248) +#define B43_NPHY_ANTENNADIVMINGAIN		B43_PHY_N(0x249) +#define B43_NPHY_BRDSEL_NORMVARHYSTTH		B43_PHY_N(0x24A) +#define B43_NPHY_RXANTSWITCHCTRL		B43_PHY_N(0x24B) +#define B43_NPHY_ENERGYDROPTIMEOUTLEN2		B43_PHY_N(0x24C) +#define B43_NPHY_ML_LOG_TXEVM0			B43_PHY_N(0x250) +#define B43_NPHY_ML_LOG_TXEVM1			B43_PHY_N(0x251) +#define B43_NPHY_ML_LOG_TXEVM2			B43_PHY_N(0x252) +#define B43_NPHY_ML_LOG_TXEVM3			B43_PHY_N(0x253) +#define B43_NPHY_ML_LOG_TXEVM4			B43_PHY_N(0x254) +#define B43_NPHY_ML_LOG_TXEVM5			B43_PHY_N(0x255) +#define B43_NPHY_ML_LOG_TXEVM6			B43_PHY_N(0x256) +#define B43_NPHY_ML_LOG_TXEVM7			B43_PHY_N(0x257) +#define B43_NPHY_ML_SCALE_TWEAK			B43_PHY_N(0x258) +#define B43_NPHY_MLUA				B43_PHY_N(0x259) +#define B43_NPHY_ZFUA				B43_PHY_N(0x25A) +#define B43_NPHY_CHANUPSYM01			B43_PHY_N(0x25B) +#define B43_NPHY_CHANUPSYM2			B43_PHY_N(0x25C) +#define B43_NPHY_RXSTRNFILT20NUM00		B43_PHY_N(0x25D) +#define B43_NPHY_RXSTRNFILT20NUM01		B43_PHY_N(0x25E) +#define B43_NPHY_RXSTRNFILT20NUM02		B43_PHY_N(0x25F) +#define B43_NPHY_RXSTRNFILT20DEN00		B43_PHY_N(0x260) +#define B43_NPHY_RXSTRNFILT20DEN01		B43_PHY_N(0x261) +#define B43_NPHY_RXSTRNFILT20NUM10		B43_PHY_N(0x262) +#define B43_NPHY_RXSTRNFILT20NUM11		B43_PHY_N(0x263) +#define B43_NPHY_RXSTRNFILT20NUM12		B43_PHY_N(0x264) +#define B43_NPHY_RXSTRNFILT20DEN10		B43_PHY_N(0x265) +#define B43_NPHY_RXSTRNFILT20DEN11		B43_PHY_N(0x266) +#define B43_NPHY_RXSTRNFILT40NUM00		B43_PHY_N(0x267) +#define B43_NPHY_RXSTRNFILT40NUM01		B43_PHY_N(0x268) +#define B43_NPHY_RXSTRNFILT40NUM02		B43_PHY_N(0x269) +#define B43_NPHY_RXSTRNFILT40DEN00		B43_PHY_N(0x26A) +#define B43_NPHY_RXSTRNFILT40DEN01		B43_PHY_N(0x26B) +#define B43_NPHY_RXSTRNFILT40NUM10		B43_PHY_N(0x26C) +#define B43_NPHY_RXSTRNFILT40NUM11		B43_PHY_N(0x26D) +#define B43_NPHY_RXSTRNFILT40NUM12		B43_PHY_N(0x26E) +#define B43_NPHY_RXSTRNFILT40DEN10		B43_PHY_N(0x26F) +#define B43_NPHY_RXSTRNFILT40DEN11		B43_PHY_N(0x270) +#define B43_NPHY_CRSHIGHPOWTHRESHOLD1		B43_PHY_N(0x271) +#define B43_NPHY_CRSHIGHPOWTHRESHOLD2		B43_PHY_N(0x272) +#define B43_NPHY_CRSHIGHLOWPOWTHRESHOLD		B43_PHY_N(0x273) +#define B43_NPHY_CRSHIGHPOWTHRESHOLD1L		B43_PHY_N(0x274) +#define B43_NPHY_CRSHIGHPOWTHRESHOLD2L		B43_PHY_N(0x275) +#define B43_NPHY_CRSHIGHLOWPOWTHRESHOLDL	B43_PHY_N(0x276) +#define B43_NPHY_CRSHIGHPOWTHRESHOLD1U		B43_PHY_N(0x277) +#define B43_NPHY_CRSHIGHPOWTHRESHOLD2U		B43_PHY_N(0x278) +#define B43_NPHY_CRSHIGHLOWPOWTHRESHOLDU	B43_PHY_N(0x279) +#define B43_NPHY_CRSACIDETECTTHRESH		B43_PHY_N(0x27A) +#define B43_NPHY_CRSACIDETECTTHRESHL		B43_PHY_N(0x27B) +#define B43_NPHY_CRSACIDETECTTHRESHU		B43_PHY_N(0x27C) +#define B43_NPHY_CRSMINPOWER0			B43_PHY_N(0x27D) +#define B43_NPHY_CRSMINPOWER1			B43_PHY_N(0x27E) +#define B43_NPHY_CRSMINPOWER2			B43_PHY_N(0x27F) +#define B43_NPHY_CRSMINPOWERL0			B43_PHY_N(0x280) +#define B43_NPHY_CRSMINPOWERL1			B43_PHY_N(0x281) +#define B43_NPHY_CRSMINPOWERL2			B43_PHY_N(0x282) +#define B43_NPHY_CRSMINPOWERU0			B43_PHY_N(0x283) +#define B43_NPHY_CRSMINPOWERU1			B43_PHY_N(0x284) +#define B43_NPHY_CRSMINPOWERU2			B43_PHY_N(0x285) +#define B43_NPHY_STRPARAM			B43_PHY_N(0x286) +#define B43_NPHY_STRPARAML			B43_PHY_N(0x287) +#define B43_NPHY_STRPARAMU			B43_PHY_N(0x288) +#define B43_NPHY_BPHYCRSMINPOWER0		B43_PHY_N(0x289) +#define B43_NPHY_BPHYCRSMINPOWER1		B43_PHY_N(0x28A) +#define B43_NPHY_BPHYCRSMINPOWER2		B43_PHY_N(0x28B) +#define B43_NPHY_BPHYFILTDEN0COEF		B43_PHY_N(0x28C) +#define B43_NPHY_BPHYFILTDEN1COEF		B43_PHY_N(0x28D) +#define B43_NPHY_BPHYFILTDEN2COEF		B43_PHY_N(0x28E) +#define B43_NPHY_BPHYFILTNUM0COEF		B43_PHY_N(0x28F) +#define B43_NPHY_BPHYFILTNUM1COEF		B43_PHY_N(0x290) +#define B43_NPHY_BPHYFILTNUM2COEF		B43_PHY_N(0x291) +#define B43_NPHY_BPHYFILTNUM01COEF2		B43_PHY_N(0x292) +#define B43_NPHY_BPHYFILTBYPASS			B43_PHY_N(0x293) +#define B43_NPHY_SGILTRNOFFSET			B43_PHY_N(0x294) +#define B43_NPHY_RADAR_T2_MIN			B43_PHY_N(0x295) +#define B43_NPHY_TXPWRCTRLDAMPING		B43_PHY_N(0x296)  #define B43_NPHY_PAPD_EN0			B43_PHY_N(0x297) /* PAPD Enable0 TBD */  #define B43_NPHY_EPS_TABLE_ADJ0			B43_PHY_N(0x298) /* EPS Table Adj0 TBD */ +#define B43_NPHY_EPS_OVERRIDEI_0		B43_PHY_N(0x299) +#define B43_NPHY_EPS_OVERRIDEQ_0		B43_PHY_N(0x29A)  #define B43_NPHY_PAPD_EN1			B43_PHY_N(0x29B) /* PAPD Enable1 TBD */  #define B43_NPHY_EPS_TABLE_ADJ1			B43_PHY_N(0x29C) /* EPS Table Adj1 TBD */ +#define B43_NPHY_EPS_OVERRIDEI_1		B43_PHY_N(0x29D) +#define B43_NPHY_EPS_OVERRIDEQ_1		B43_PHY_N(0x29E) +#define B43_NPHY_PAPD_CAL_ADDRESS		B43_PHY_N(0x29F) +#define B43_NPHY_PAPD_CAL_YREFEPSILON		B43_PHY_N(0x2A0) +#define B43_NPHY_PAPD_CAL_SETTLE		B43_PHY_N(0x2A1) +#define B43_NPHY_PAPD_CAL_CORRELATE		B43_PHY_N(0x2A2) +#define B43_NPHY_PAPD_CAL_SHIFTS0		B43_PHY_N(0x2A3) +#define B43_NPHY_PAPD_CAL_SHIFTS1		B43_PHY_N(0x2A4) +#define B43_NPHY_SAMPLE_START_ADDR		B43_PHY_N(0x2A5) +#define B43_NPHY_RADAR_ADC_TO_DBM		B43_PHY_N(0x2A6) +#define B43_NPHY_REV3_C2_INITGAIN_A		B43_PHY_N(0x2A7) +#define B43_NPHY_REV3_C2_INITGAIN_B		B43_PHY_N(0x2A8) +#define B43_NPHY_REV3_C2_CLIP_HIGAIN_A		B43_PHY_N(0x2A9) +#define B43_NPHY_REV3_C2_CLIP_HIGAIN_B		B43_PHY_N(0x2AA) +#define B43_NPHY_REV3_C2_CLIP_MEDGAIN_A		B43_PHY_N(0x2AB) +#define B43_NPHY_REV3_C2_CLIP_MEDGAIN_B		B43_PHY_N(0x2AC) +#define B43_NPHY_REV3_C2_CLIP_LOGAIN_A		B43_PHY_N(0x2AD) +#define B43_NPHY_REV3_C2_CLIP_LOGAIN_B		B43_PHY_N(0x2AE) +#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_PHY_B_BBCFG				B43_PHY_N_BMODE(0x001) /* BB config */  #define B43_PHY_B_TEST				B43_PHY_N_BMODE(0x00A) diff --git a/drivers/net/wireless/b43/radio_2056.c b/drivers/net/wireless/b43/radio_2056.c index ce037fb6789..b4fd9345d67 100644 --- a/drivers/net/wireless/b43/radio_2056.c +++ b/drivers/net/wireless/b43/radio_2056.c @@ -2980,7 +2980,7 @@ static const struct b2056_inittab_entry b2056_inittab_rev8_rx[] = {  	.rx		= prefix##_rx,			\  	.rx_length	= ARRAY_SIZE(prefix##_rx) -struct b2056_inittabs_pts b2056_inittabs[] = { +static const struct b2056_inittabs_pts b2056_inittabs[] = {  	[3] = { INITTABSPTS(b2056_inittab_rev3) },  	[4] = { INITTABSPTS(b2056_inittab_rev4) },  	[5] = { INITTABSPTS(b2056_inittab_rev5) }, @@ -9035,7 +9035,7 @@ static void b2056_upload_inittab(struct b43_wldev *dev, bool ghz5,  void b2056_upload_inittabs(struct b43_wldev *dev,  			   bool ghz5, bool ignore_uploadflag)  { -	struct b2056_inittabs_pts *pts; +	const struct b2056_inittabs_pts *pts;  	if (dev->phy.rev >= ARRAY_SIZE(b2056_inittabs)) {  		B43_WARN_ON(1); @@ -9057,7 +9057,7 @@ void b2056_upload_inittabs(struct b43_wldev *dev,  void b2056_upload_syn_pll_cp2(struct b43_wldev *dev, bool ghz5)  { -	struct b2056_inittabs_pts *pts; +	const struct b2056_inittabs_pts *pts;  	const struct b2056_inittab_entry *e;  	if (dev->phy.rev >= ARRAY_SIZE(b2056_inittabs)) { diff --git a/drivers/net/wireless/b43/radio_2059.c b/drivers/net/wireless/b43/radio_2059.c index d4ce8a12ff9..38e31d857e3 100644 --- a/drivers/net/wireless/b43/radio_2059.c +++ b/drivers/net/wireless/b43/radio_2059.c @@ -27,7 +27,7 @@  #define RADIOREGS(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, r28) \ +		  r20) \  	.radio_syn16			= r00,	\  	.radio_syn17			= r01,	\  	.radio_syn22			= r02,	\ @@ -41,22 +41,14 @@  	.radio_syn41			= r10,	\  	.radio_syn43			= r11,	\  	.radio_syn47			= r12,	\ -	.radio_syn4a			= r13,	\ -	.radio_syn58			= r14,	\ -	.radio_syn5a			= r15,	\ -	.radio_syn6a			= r16,	\ -	.radio_syn6d			= r17,	\ -	.radio_syn6e			= r18,	\ -	.radio_syn92			= r19,	\ -	.radio_syn98			= r20,	\ -	.radio_rxtx4a			= r21,	\ -	.radio_rxtx58			= r22,	\ -	.radio_rxtx5a			= r23,	\ -	.radio_rxtx6a			= r24,	\ -	.radio_rxtx6d			= r25,	\ -	.radio_rxtx6e			= r26,	\ -	.radio_rxtx92			= r27,	\ -	.radio_rxtx98			= r28 +	.radio_rxtx4a			= r13,	\ +	.radio_rxtx58			= r14,	\ +	.radio_rxtx5a			= r15,	\ +	.radio_rxtx6a			= r16,	\ +	.radio_rxtx6d			= r17,	\ +	.radio_rxtx6e			= r18,	\ +	.radio_rxtx92			= r19,	\ +	.radio_rxtx98			= r20  #define PHYREGS(r0, r1, r2, r3, r4, r5)	\  	.phy_regs.bw1	= r0,	\ @@ -70,91 +62,78 @@ static const struct b43_phy_ht_channeltab_e_radio2059 b43_phy_ht_channeltab_radi    {	.freq			= 2412,  	RADIOREGS(0x48, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x6c,  		  0x09, 0x0f, 0x0a, 0x00, 0x0a, 0x00, 0x61, 0x03, -		  0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x61, 0x03,  		  0x00, 0x00, 0x00, 0xf0, 0x00),  	PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443),    },    {	.freq			= 2417,  	RADIOREGS(0x4b, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x71,  		  0x09, 0x0f, 0x0a, 0x00, 0x0a, 0x00, 0x61, 0x03, -		  0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x61, 0x03,  		  0x00, 0x00, 0x00, 0xf0, 0x00),  	PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441),    },    {	.freq			= 2422,  	RADIOREGS(0x4e, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x76,  		  0x09, 0x0f, 0x09, 0x00, 0x09, 0x00, 0x61, 0x03, -		  0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x61, 0x03,  		  0x00, 0x00, 0x00, 0xf0, 0x00),  	PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f),    },    {	.freq			= 2427,  	RADIOREGS(0x52, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x7b,  		  0x09, 0x0f, 0x09, 0x00, 0x09, 0x00, 0x61, 0x03, -		  0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x61, 0x03,  		  0x00, 0x00, 0x00, 0xf0, 0x00),  	PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d),    },    {	.freq			= 2432,  	RADIOREGS(0x55, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x80,  		  0x09, 0x0f, 0x08, 0x00, 0x08, 0x00, 0x61, 0x03, -		  0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x61, 0x03,  		  0x00, 0x00, 0x00, 0xf0, 0x00),  	PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a),    },    {	.freq			= 2437,  	RADIOREGS(0x58, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x85,  		  0x09, 0x0f, 0x08, 0x00, 0x08, 0x00, 0x61, 0x03, -		  0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x61, 0x03,  		  0x00, 0x00, 0x00, 0xf0, 0x00),  	PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438),    },    {	.freq			= 2442,  	RADIOREGS(0x5c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8a,  		  0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x61, 0x03, -		  0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x61, 0x03,  		  0x00, 0x00, 0x00, 0xf0, 0x00),  	PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436),    },    {	.freq			= 2447,  	RADIOREGS(0x5f, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8f,  		  0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x61, 0x03, -		  0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x61, 0x03,  		  0x00, 0x00, 0x00, 0xf0, 0x00),  	PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434),    },    {	.freq			= 2452,  	RADIOREGS(0x62, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x94,  		  0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x61, 0x03, -		  0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x61, 0x03,  		  0x00, 0x00, 0x00, 0xf0, 0x00),  	PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431),    },    {	.freq			= 2457,  	RADIOREGS(0x66, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x99,  		  0x09, 0x0f, 0x06, 0x00, 0x06, 0x00, 0x61, 0x03, -		  0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x61, 0x03,  		  0x00, 0x00, 0x00, 0xf0, 0x00),  	PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f),    },    {	.freq			= 2462,  	RADIOREGS(0x69, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x9e,  		  0x09, 0x0f, 0x06, 0x00, 0x06, 0x00, 0x61, 0x03, -		  0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x61, 0x03,  		  0x00, 0x00, 0x00, 0xf0, 0x00),  	PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d),    },    {	.freq			= 2467,  	RADIOREGS(0x6c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xa3,  		  0x09, 0x0f, 0x05, 0x00, 0x05, 0x00, 0x61, 0x03, -		  0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x61, 0x03,  		  0x00, 0x00, 0x00, 0xf0, 0x00),  	PHYREGS(0x03df, 0x03db, 0x03d7, 0x0422, 0x0427, 0x042b),    },    {	.freq			= 2472,  	RADIOREGS(0x70, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xa8,  		  0x09, 0x0f, 0x05, 0x00, 0x05, 0x00, 0x61, 0x03, -		  0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x61, 0x03,  		  0x00, 0x00, 0x00, 0xf0, 0x00),  	PHYREGS(0x03e1, 0x03dd, 0x03d9, 0x0420, 0x0424, 0x0429),    }, diff --git a/drivers/net/wireless/b43/radio_2059.h b/drivers/net/wireless/b43/radio_2059.h index e4d69e55e9f..40a82d7f510 100644 --- a/drivers/net/wireless/b43/radio_2059.h +++ b/drivers/net/wireless/b43/radio_2059.h @@ -5,9 +5,9 @@  #include "phy_ht.h" -#define R2059_SYN			0x000 -#define R2059_TXRX0			0x400 -#define R2059_RXRX1			0x800 +#define R2059_C1			0x000 +#define R2059_C2			0x400 +#define R2059_C3			0x800  #define R2059_ALL			0xC00  /* Values for various registers uploaded on channel switching */ @@ -28,14 +28,6 @@ struct b43_phy_ht_channeltab_e_radio2059 {  	u8 radio_syn41;  	u8 radio_syn43;  	u8 radio_syn47; -	u8 radio_syn4a; -	u8 radio_syn58; -	u8 radio_syn5a; -	u8 radio_syn6a; -	u8 radio_syn6d; -	u8 radio_syn6e; -	u8 radio_syn92; -	u8 radio_syn98;  	u8 radio_rxtx4a;  	u8 radio_rxtx58;  	u8 radio_rxtx5a; diff --git a/drivers/net/wireless/b43/sdio.h b/drivers/net/wireless/b43/sdio.h index fb633094403..1e93926f388 100644 --- a/drivers/net/wireless/b43/sdio.h +++ b/drivers/net/wireless/b43/sdio.h @@ -25,12 +25,12 @@ void b43_sdio_exit(void);  #else /* CONFIG_B43_SDIO */ -int b43_sdio_request_irq(struct b43_wldev *dev, +static inline int b43_sdio_request_irq(struct b43_wldev *dev,  			 void (*handler)(struct b43_wldev *dev))  {  	return -ENODEV;  } -void b43_sdio_free_irq(struct b43_wldev *dev) +static inline void b43_sdio_free_irq(struct b43_wldev *dev)  {  }  static inline int b43_sdio_init(void) diff --git a/drivers/net/wireless/b43/tables_nphy.c b/drivers/net/wireless/b43/tables_nphy.c index aaca60c6f57..94c755fdda1 100644 --- a/drivers/net/wireless/b43/tables_nphy.c +++ b/drivers/net/wireless/b43/tables_nphy.c @@ -2174,7 +2174,7 @@ static const u16 b43_ntab_loftlt1_r3[] = {  /* volatile  tables, PHY revision >= 3 */  /* indexed by antswctl2g */ -static const u16 b43_ntab_antswctl2g_r3[4][32] = { +static const u16 b43_ntab_antswctl_r3[4][32] = {  	{  		0x0082, 0x0082, 0x0211, 0x0222, 0x0328,  		0x0000, 0x0000, 0x0000, 0x0144, 0x0000, @@ -2800,7 +2800,7 @@ static const struct nphy_rf_control_override_rev7  	{ 0x0010, 0x344, 0x345, 0x0010, 4 },  }; -struct nphy_gain_ctl_workaround_entry nphy_gain_ctl_wa_phy6_radio11_ghz2 = { +static struct nphy_gain_ctl_workaround_entry nphy_gain_ctl_wa_phy6_radio11_ghz2 = {  	{ 10, 14, 19, 27 },  	{ -5, 6, 10, 15 },  	{ 0xA, 0xA, 0xA, 0xA, 0xA, 0xA, 0xA, 0xA, 0xA, 0xA }, @@ -2811,7 +2811,7 @@ struct nphy_gain_ctl_workaround_entry nphy_gain_ctl_wa_phy6_radio11_ghz2 = {  	0x18, 0x18, 0x18,  	0x01D0, 0x5,  }; -struct nphy_gain_ctl_workaround_entry nphy_gain_ctl_workaround[2][4] = { +static struct nphy_gain_ctl_workaround_entry nphy_gain_ctl_workaround[2][4] = {  	{ /* 2GHz */  		{ /* PHY rev 3 */  			{ 7, 11, 16, 23 }, @@ -3095,9 +3095,55 @@ void b43_ntab_write_bulk(struct b43_wldev *dev, u32 offset,  }  #define ntab_upload(dev, offset, data) do { \ -		b43_ntab_write_bulk(dev, offset, offset##_SIZE, data);	\ +		b43_ntab_write_bulk(dev, offset, ARRAY_SIZE(data), data); \  	} while (0) -void b43_nphy_rev0_1_2_tables_init(struct b43_wldev *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 */ +	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_NOISEVAR0_R3, b43_ntab_noisevar0_r3); +	ntab_upload(dev, B43_NTAB_NOISEVAR1_R3, b43_ntab_noisevar1_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); +	ntab_upload(dev, B43_NTAB_C1_ADJPLT_R3, b43_ntab_adjustpower1_r3); +	ntab_upload(dev, B43_NTAB_C0_GAINCTL_R3, b43_ntab_gainctl0_r3); +	ntab_upload(dev, B43_NTAB_C1_GAINCTL_R3, b43_ntab_gainctl1_r3); +	ntab_upload(dev, B43_NTAB_C0_IQLT_R3, b43_ntab_iqlt0_r3); +	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); + +	/* Volatile tables */ +	if (antswlut < ARRAY_SIZE(b43_ntab_antswctl_r3)) +		ntab_upload(dev, B43_NTAB_ANT_SW_CTL_R3, +			    b43_ntab_antswctl_r3[antswlut]); +	else +		B43_WARN_ON(1); +} + +static void b43_nphy_tables_init_rev0(struct b43_wldev *dev)  {  	/* Static tables */  	ntab_upload(dev, B43_NTAB_FRAMESTRUCT, b43_ntab_framestruct); @@ -3130,48 +3176,13 @@ void b43_nphy_rev0_1_2_tables_init(struct b43_wldev *dev)  	ntab_upload(dev, B43_NTAB_C1_LOFEEDTH, b43_ntab_loftlt1);  } -#define ntab_upload_r3(dev, offset, data) do { \ -		b43_ntab_write_bulk(dev, offset, ARRAY_SIZE(data), data); \ -	} while (0) -void b43_nphy_rev3plus_tables_init(struct b43_wldev *dev) +/* http://bcm-v4.sipsolutions.net/802.11/PHY/N/InitTables */ +void b43_nphy_tables_init(struct b43_wldev *dev)  { -	struct ssb_sprom *sprom = dev->dev->bus_sprom; - -	/* Static tables */ -	ntab_upload_r3(dev, B43_NTAB_FRAMESTRUCT_R3, b43_ntab_framestruct_r3); -	ntab_upload_r3(dev, B43_NTAB_PILOT_R3, b43_ntab_pilot_r3); -	ntab_upload_r3(dev, B43_NTAB_TMAP_R3, b43_ntab_tmap_r3); -	ntab_upload_r3(dev, B43_NTAB_INTLEVEL_R3, b43_ntab_intlevel_r3); -	ntab_upload_r3(dev, B43_NTAB_TDTRN_R3, b43_ntab_tdtrn_r3); -	ntab_upload_r3(dev, B43_NTAB_NOISEVAR0_R3, b43_ntab_noisevar0_r3); -	ntab_upload_r3(dev, B43_NTAB_NOISEVAR1_R3, b43_ntab_noisevar1_r3); -	ntab_upload_r3(dev, B43_NTAB_MCS_R3, b43_ntab_mcs_r3); -	ntab_upload_r3(dev, B43_NTAB_TDI20A0_R3, b43_ntab_tdi20a0_r3); -	ntab_upload_r3(dev, B43_NTAB_TDI20A1_R3, b43_ntab_tdi20a1_r3); -	ntab_upload_r3(dev, B43_NTAB_TDI40A0_R3, b43_ntab_tdi40a0_r3); -	ntab_upload_r3(dev, B43_NTAB_TDI40A1_R3, b43_ntab_tdi40a1_r3); -	ntab_upload_r3(dev, B43_NTAB_PILOTLT_R3, b43_ntab_pilotlt_r3); -	ntab_upload_r3(dev, B43_NTAB_CHANEST_R3, b43_ntab_channelest_r3); -	ntab_upload_r3(dev, B43_NTAB_FRAMELT_R3, b43_ntab_framelookup_r3); -	ntab_upload_r3(dev, B43_NTAB_C0_ESTPLT_R3, -		       b43_ntab_estimatepowerlt0_r3); -	ntab_upload_r3(dev, B43_NTAB_C1_ESTPLT_R3, -		       b43_ntab_estimatepowerlt1_r3); -	ntab_upload_r3(dev, B43_NTAB_C0_ADJPLT_R3, b43_ntab_adjustpower0_r3); -	ntab_upload_r3(dev, B43_NTAB_C1_ADJPLT_R3, b43_ntab_adjustpower1_r3); -	ntab_upload_r3(dev, B43_NTAB_C0_GAINCTL_R3, b43_ntab_gainctl0_r3); -	ntab_upload_r3(dev, B43_NTAB_C1_GAINCTL_R3, b43_ntab_gainctl1_r3); -	ntab_upload_r3(dev, B43_NTAB_C0_IQLT_R3, b43_ntab_iqlt0_r3); -	ntab_upload_r3(dev, B43_NTAB_C1_IQLT_R3, b43_ntab_iqlt1_r3); -	ntab_upload_r3(dev, B43_NTAB_C0_LOFEEDTH_R3, b43_ntab_loftlt0_r3); -	ntab_upload_r3(dev, B43_NTAB_C1_LOFEEDTH_R3, b43_ntab_loftlt1_r3); - -	/* Volatile tables */ -	if (sprom->fem.ghz2.antswlut < ARRAY_SIZE(b43_ntab_antswctl2g_r3)) -		ntab_upload_r3(dev, B43_NTAB_ANT_SW_CTL_R3, -			       b43_ntab_antswctl2g_r3[sprom->fem.ghz2.antswlut]); +	if (dev->phy.rev >= 3) +		b43_nphy_tables_init_rev3(dev);  	else -		B43_WARN_ON(1); +		b43_nphy_tables_init_rev0(dev);  }  /* http://bcm-v4.sipsolutions.net/802.11/PHY/N/GetIpaGainTbl */ diff --git a/drivers/net/wireless/b43/tables_nphy.h b/drivers/net/wireless/b43/tables_nphy.h index c600700ceed..9ff33adcff8 100644 --- a/drivers/net/wireless/b43/tables_nphy.h +++ b/drivers/net/wireless/b43/tables_nphy.h @@ -115,22 +115,22 @@ struct nphy_gain_ctl_workaround_entry *b43_nphy_get_gain_ctl_workaround_ent(  #define B43_NTAB_NOISEVAR11_SIZE	256  #define B43_NTAB_C0_ESTPLT		B43_NTAB8 (0x1A, 0x000) /* Estimate Power Lookup Table Core 0 */  #define B43_NTAB_C0_ESTPLT_SIZE		64 -#define B43_NTAB_C1_ESTPLT		B43_NTAB8 (0x1B, 0x000) /* Estimate Power Lookup Table Core 1 */ -#define B43_NTAB_C1_ESTPLT_SIZE		64  #define B43_NTAB_C0_ADJPLT		B43_NTAB8 (0x1A, 0x040) /* Adjust Power Lookup Table Core 0 */  #define B43_NTAB_C0_ADJPLT_SIZE		128 -#define B43_NTAB_C1_ADJPLT		B43_NTAB8 (0x1B, 0x040) /* Adjust Power Lookup Table Core 1 */ -#define B43_NTAB_C1_ADJPLT_SIZE		128  #define B43_NTAB_C0_GAINCTL		B43_NTAB32(0x1A, 0x0C0) /* Gain Control Lookup Table Core 0 */  #define B43_NTAB_C0_GAINCTL_SIZE	128 -#define B43_NTAB_C1_GAINCTL		B43_NTAB32(0x1B, 0x0C0) /* Gain Control Lookup Table Core 1 */ -#define B43_NTAB_C1_GAINCTL_SIZE	128  #define B43_NTAB_C0_IQLT		B43_NTAB32(0x1A, 0x140) /* IQ Lookup Table Core 0 */  #define B43_NTAB_C0_IQLT_SIZE		128 -#define B43_NTAB_C1_IQLT		B43_NTAB32(0x1B, 0x140) /* IQ Lookup Table Core 1 */ -#define B43_NTAB_C1_IQLT_SIZE		128  #define B43_NTAB_C0_LOFEEDTH		B43_NTAB16(0x1A, 0x1C0) /* Local Oscillator Feed Through Lookup Table Core 0 */  #define B43_NTAB_C0_LOFEEDTH_SIZE	128 +#define B43_NTAB_C1_ESTPLT		B43_NTAB8 (0x1B, 0x000) /* Estimate Power Lookup Table Core 1 */ +#define B43_NTAB_C1_ESTPLT_SIZE		64 +#define B43_NTAB_C1_ADJPLT		B43_NTAB8 (0x1B, 0x040) /* Adjust Power Lookup Table Core 1 */ +#define B43_NTAB_C1_ADJPLT_SIZE		128 +#define B43_NTAB_C1_GAINCTL		B43_NTAB32(0x1B, 0x0C0) /* Gain Control Lookup Table Core 1 */ +#define B43_NTAB_C1_GAINCTL_SIZE	128 +#define B43_NTAB_C1_IQLT		B43_NTAB32(0x1B, 0x140) /* IQ Lookup Table Core 1 */ +#define B43_NTAB_C1_IQLT_SIZE		128  #define B43_NTAB_C1_LOFEEDTH		B43_NTAB16(0x1B, 0x1C0) /* Local Oscillator Feed Through Lookup Table Core 1 */  #define B43_NTAB_C1_LOFEEDTH_SIZE	128 @@ -154,15 +154,17 @@ struct nphy_gain_ctl_workaround_entry *b43_nphy_get_gain_ctl_workaround_ent(  #define B43_NTAB_CHANEST_R3		B43_NTAB32(22,   0) /* channel estimate  */  #define B43_NTAB_FRAMELT_R3		 B43_NTAB8(24,   0) /* frame lookup  */  #define B43_NTAB_C0_ESTPLT_R3		 B43_NTAB8(26,   0) /* estimated power lookup 0  */ -#define B43_NTAB_C1_ESTPLT_R3		 B43_NTAB8(27,   0) /* estimated power lookup 1  */  #define B43_NTAB_C0_ADJPLT_R3		 B43_NTAB8(26,  64) /* adjusted power lookup 0  */ -#define B43_NTAB_C1_ADJPLT_R3		 B43_NTAB8(27,  64) /* adjusted power lookup 1  */  #define B43_NTAB_C0_GAINCTL_R3		B43_NTAB32(26, 192) /* gain control lookup 0  */ -#define B43_NTAB_C1_GAINCTL_R3		B43_NTAB32(27, 192) /* gain control lookup 1  */  #define B43_NTAB_C0_IQLT_R3		B43_NTAB32(26, 320) /* I/Q lookup 0  */ -#define B43_NTAB_C1_IQLT_R3		B43_NTAB32(27, 320) /* I/Q lookup 1  */  #define B43_NTAB_C0_LOFEEDTH_R3		B43_NTAB16(26, 448) /* Local Oscillator Feed Through lookup 0  */ +#define B43_NTAB_C0_PAPD_COMP_R3	B43_NTAB16(26, 576) +#define B43_NTAB_C1_ESTPLT_R3		 B43_NTAB8(27,   0) /* estimated power lookup 1  */ +#define B43_NTAB_C1_ADJPLT_R3		 B43_NTAB8(27,  64) /* adjusted power lookup 1  */ +#define B43_NTAB_C1_GAINCTL_R3		B43_NTAB32(27, 192) /* gain control lookup 1  */ +#define B43_NTAB_C1_IQLT_R3		B43_NTAB32(27, 320) /* I/Q lookup 1  */  #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)  #define B43_NTAB_TX_IQLO_CAL_LOFT_LADDER_40_SIZE	18  #define B43_NTAB_TX_IQLO_CAL_LOFT_LADDER_20_SIZE	18 @@ -182,8 +184,7 @@ void b43_ntab_write(struct b43_wldev *dev, u32 offset, u32 value);  void b43_ntab_write_bulk(struct b43_wldev *dev, u32 offset,  			  unsigned int nr_elements, const void *_data); -void b43_nphy_rev0_1_2_tables_init(struct b43_wldev *dev); -void b43_nphy_rev3plus_tables_init(struct b43_wldev *dev); +void b43_nphy_tables_init(struct b43_wldev *dev);  const u32 *b43_nphy_get_tx_gain_table(struct b43_wldev *dev); diff --git a/drivers/net/wireless/b43/tables_phy_lcn.c b/drivers/net/wireless/b43/tables_phy_lcn.c index 5176363cadf..e347b8d80ea 100644 --- a/drivers/net/wireless/b43/tables_phy_lcn.c +++ b/drivers/net/wireless/b43/tables_phy_lcn.c @@ -313,7 +313,7 @@ static const u32 b43_lcntab_0x18[] = {   * TX gain.   **************************************************/ -const struct b43_lcntab_tx_gain_tbl_entry +static const struct b43_lcntab_tx_gain_tbl_entry  	b43_lcntab_tx_gain_tbl_2ghz_ext_pa_rev0[B43_LCNTAB_TX_GAIN_SIZE] = {  	{ 0x03, 0x00, 0x1f, 0x0, 0x48 },  	{ 0x03, 0x00, 0x1f, 0x0, 0x46 }, @@ -449,7 +449,7 @@ const struct b43_lcntab_tx_gain_tbl_entry   * SW control.   **************************************************/ -const u16 b43_lcntab_sw_ctl_4313_epa_rev0[] = { +static const u16 b43_lcntab_sw_ctl_4313_epa_rev0[] = {  	0x0002, 0x0008, 0x0004, 0x0001, 0x0002, 0x0008,  	0x0004, 0x0001, 0x0002, 0x0008, 0x0004, 0x0001,  	0x0002, 0x0008, 0x0004, 0x0001, 0x0002, 0x0008, @@ -631,7 +631,7 @@ static void b43_phy_lcn_upload_static_tables(struct b43_wldev *dev)  	lcntab_upload(dev, B43_LCNTAB32(0x18, 0), b43_lcntab_0x18);  } -void b43_phy_lcn_load_tx_gain_tab(struct b43_wldev *dev, +static void b43_phy_lcn_load_tx_gain_tab(struct b43_wldev *dev,  			const struct b43_lcntab_tx_gain_tbl_entry *gain_table)  {  	u32 i;  |