aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/b43/phy_common.c27
-rw-r--r--drivers/net/wireless/b43/phy_common.h3
-rw-r--r--drivers/net/wireless/b43/phy_lp.c91
-rw-r--r--drivers/net/wireless/b43/phy_lp.h3
-rw-r--r--drivers/net/wireless/b43/tables_lpphy.c79
5 files changed, 122 insertions, 81 deletions
diff --git a/drivers/net/wireless/b43/phy_common.c b/drivers/net/wireless/b43/phy_common.c
index 51686ec96984..6e704becda6f 100644
--- a/drivers/net/wireless/b43/phy_common.c
+++ b/drivers/net/wireless/b43/phy_common.c
@@ -249,20 +249,35 @@ void b43_phy_copy(struct b43_wldev *dev, u16 destreg, u16 srcreg)
249 249
250void b43_phy_mask(struct b43_wldev *dev, u16 offset, u16 mask) 250void b43_phy_mask(struct b43_wldev *dev, u16 offset, u16 mask)
251{ 251{
252 b43_phy_write(dev, offset, 252 if (dev->phy.ops->phy_maskset) {
253 b43_phy_read(dev, offset) & mask); 253 assert_mac_suspended(dev);
254 dev->phy.ops->phy_maskset(dev, offset, mask, 0);
255 } else {
256 b43_phy_write(dev, offset,
257 b43_phy_read(dev, offset) & mask);
258 }
254} 259}
255 260
256void b43_phy_set(struct b43_wldev *dev, u16 offset, u16 set) 261void b43_phy_set(struct b43_wldev *dev, u16 offset, u16 set)
257{ 262{
258 b43_phy_write(dev, offset, 263 if (dev->phy.ops->phy_maskset) {
259 b43_phy_read(dev, offset) | set); 264 assert_mac_suspended(dev);
265 dev->phy.ops->phy_maskset(dev, offset, 0xFFFF, set);
266 } else {
267 b43_phy_write(dev, offset,
268 b43_phy_read(dev, offset) | set);
269 }
260} 270}
261 271
262void b43_phy_maskset(struct b43_wldev *dev, u16 offset, u16 mask, u16 set) 272void b43_phy_maskset(struct b43_wldev *dev, u16 offset, u16 mask, u16 set)
263{ 273{
264 b43_phy_write(dev, offset, 274 if (dev->phy.ops->phy_maskset) {
265 (b43_phy_read(dev, offset) & mask) | set); 275 assert_mac_suspended(dev);
276 dev->phy.ops->phy_maskset(dev, offset, mask, set);
277 } else {
278 b43_phy_write(dev, offset,
279 (b43_phy_read(dev, offset) & mask) | set);
280 }
266} 281}
267 282
268int b43_switch_channel(struct b43_wldev *dev, unsigned int new_channel) 283int b43_switch_channel(struct b43_wldev *dev, unsigned int new_channel)
diff --git a/drivers/net/wireless/b43/phy_common.h b/drivers/net/wireless/b43/phy_common.h
index 9f9f23cab72a..b47a0f55c0b6 100644
--- a/drivers/net/wireless/b43/phy_common.h
+++ b/drivers/net/wireless/b43/phy_common.h
@@ -95,6 +95,8 @@ enum b43_txpwr_result {
95 * Must not be NULL. 95 * Must not be NULL.
96 * @phy_write: Write to a PHY register. 96 * @phy_write: Write to a PHY register.
97 * Must not be NULL. 97 * Must not be NULL.
98 * @phy_maskset: Maskset a PHY register, taking shortcuts.
99 * If it is NULL, a generic algorithm is used.
98 * @radio_read: Read from a Radio register. 100 * @radio_read: Read from a Radio register.
99 * Must not be NULL. 101 * Must not be NULL.
100 * @radio_write: Write to a Radio register. 102 * @radio_write: Write to a Radio register.
@@ -154,6 +156,7 @@ struct b43_phy_operations {
154 /* Register access */ 156 /* Register access */
155 u16 (*phy_read)(struct b43_wldev *dev, u16 reg); 157 u16 (*phy_read)(struct b43_wldev *dev, u16 reg);
156 void (*phy_write)(struct b43_wldev *dev, u16 reg, u16 value); 158 void (*phy_write)(struct b43_wldev *dev, u16 reg, u16 value);
159 void (*phy_maskset)(struct b43_wldev *dev, u16 reg, u16 mask, u16 set);
157 u16 (*radio_read)(struct b43_wldev *dev, u16 reg); 160 u16 (*radio_read)(struct b43_wldev *dev, u16 reg);
158 void (*radio_write)(struct b43_wldev *dev, u16 reg, u16 value); 161 void (*radio_write)(struct b43_wldev *dev, u16 reg, u16 value);
159 162
diff --git a/drivers/net/wireless/b43/phy_lp.c b/drivers/net/wireless/b43/phy_lp.c
index 5306f2c66b34..1a57d3390e92 100644
--- a/drivers/net/wireless/b43/phy_lp.c
+++ b/drivers/net/wireless/b43/phy_lp.c
@@ -44,7 +44,7 @@ static inline u16 channel2freq_lp(u8 channel)
44static unsigned int b43_lpphy_op_get_default_chan(struct b43_wldev *dev) 44static unsigned int b43_lpphy_op_get_default_chan(struct b43_wldev *dev)
45{ 45{
46 if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) 46 if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ)
47 return 7; //FIXME temporary - channel 1 is broken 47 return 1;
48 return 36; 48 return 36;
49} 49}
50 50
@@ -182,8 +182,8 @@ static void lpphy_adjust_gain_table(struct b43_wldev *dev, u32 freq)
182 temp[1] = temp[0] + 0x1000; 182 temp[1] = temp[0] + 0x1000;
183 temp[2] = temp[0] + 0x2000; 183 temp[2] = temp[0] + 0x2000;
184 184
185 b43_lptab_write_bulk(dev, B43_LPTAB16(12, 0), 3, temp);
186 b43_lptab_write_bulk(dev, B43_LPTAB16(13, 0), 3, temp); 185 b43_lptab_write_bulk(dev, B43_LPTAB16(13, 0), 3, temp);
186 b43_lptab_write_bulk(dev, B43_LPTAB16(12, 0), 3, temp);
187} 187}
188 188
189static void lpphy_table_init(struct b43_wldev *dev) 189static void lpphy_table_init(struct b43_wldev *dev)
@@ -223,8 +223,8 @@ static void lpphy_baseband_rev0_1_init(struct b43_wldev *dev)
223 b43_phy_maskset(dev, B43_LPPHY_VERYLOWGAINDB, 0xFF00, 0x0006); 223 b43_phy_maskset(dev, B43_LPPHY_VERYLOWGAINDB, 0xFF00, 0x0006);
224 b43_phy_mask(dev, B43_LPPHY_RX_RADIO_CTL, 0xFFFE); 224 b43_phy_mask(dev, B43_LPPHY_RX_RADIO_CTL, 0xFFFE);
225 b43_phy_maskset(dev, B43_LPPHY_CLIPCTRTHRESH, 0xFFE0, 0x0005); 225 b43_phy_maskset(dev, B43_LPPHY_CLIPCTRTHRESH, 0xFFE0, 0x0005);
226 b43_phy_maskset(dev, B43_LPPHY_CLIPCTRTHRESH, 0xFC10, 0x0180); 226 b43_phy_maskset(dev, B43_LPPHY_CLIPCTRTHRESH, 0xFC1F, 0x0180);
227 b43_phy_maskset(dev, B43_LPPHY_CLIPCTRTHRESH, 0x83FF, 0x3800); 227 b43_phy_maskset(dev, B43_LPPHY_CLIPCTRTHRESH, 0x83FF, 0x3C00);
228 b43_phy_maskset(dev, B43_LPPHY_GAINDIRECTMISMATCH, 0xFFF0, 0x0005); 228 b43_phy_maskset(dev, B43_LPPHY_GAINDIRECTMISMATCH, 0xFFF0, 0x0005);
229 b43_phy_maskset(dev, B43_LPPHY_GAIN_MISMATCH_LIMIT, 0xFFC0, 0x001A); 229 b43_phy_maskset(dev, B43_LPPHY_GAIN_MISMATCH_LIMIT, 0xFFC0, 0x001A);
230 b43_phy_maskset(dev, B43_LPPHY_CRS_ED_THRESH, 0xFF00, 0x00B3); 230 b43_phy_maskset(dev, B43_LPPHY_CRS_ED_THRESH, 0xFF00, 0x00B3);
@@ -237,7 +237,7 @@ static void lpphy_baseband_rev0_1_init(struct b43_wldev *dev)
237 /* TODO: 237 /* TODO:
238 * Set the LDO voltage to 0x0028 - FIXME: What is this? 238 * Set the LDO voltage to 0x0028 - FIXME: What is this?
239 * Call sb_pmu_set_ldo_voltage with 4 and the LDO voltage 239 * Call sb_pmu_set_ldo_voltage with 4 and the LDO voltage
240 * as arguments 240 * as arguments
241 * Call sb_pmu_paref_ldo_enable with argument TRUE 241 * Call sb_pmu_paref_ldo_enable with argument TRUE
242 */ 242 */
243 if (dev->phy.rev == 0) { 243 if (dev->phy.rev == 0) {
@@ -340,11 +340,11 @@ static void lpphy_baseband_rev0_1_init(struct b43_wldev *dev)
340 if (dev->phy.rev == 1) { 340 if (dev->phy.rev == 1) {
341 tmp = b43_phy_read(dev, B43_LPPHY_CLIPCTRTHRESH); 341 tmp = b43_phy_read(dev, B43_LPPHY_CLIPCTRTHRESH);
342 tmp2 = (tmp & 0x03E0) >> 5; 342 tmp2 = (tmp & 0x03E0) >> 5;
343 tmp2 |= tmp << 5; 343 tmp2 |= tmp2 << 5;
344 b43_phy_write(dev, B43_LPPHY_4C3, tmp2); 344 b43_phy_write(dev, B43_LPPHY_4C3, tmp2);
345 tmp = b43_phy_read(dev, B43_LPPHY_OFDMSYNCTHRESH0); 345 tmp = b43_phy_read(dev, B43_LPPHY_GAINDIRECTMISMATCH);
346 tmp2 = (tmp & 0x1F00) >> 8; 346 tmp2 = (tmp & 0x1F00) >> 8;
347 tmp2 |= tmp << 5; 347 tmp2 |= tmp2 << 5;
348 b43_phy_write(dev, B43_LPPHY_4C4, tmp2); 348 b43_phy_write(dev, B43_LPPHY_4C4, tmp2);
349 tmp = b43_phy_read(dev, B43_LPPHY_VERYLOWGAINDB); 349 tmp = b43_phy_read(dev, B43_LPPHY_VERYLOWGAINDB);
350 tmp2 = tmp & 0x00FF; 350 tmp2 = tmp & 0x00FF;
@@ -761,7 +761,7 @@ static void lpphy_disable_crs(struct b43_wldev *dev, bool user)
761 b43_phy_set(dev, B43_LPPHY_RF_OVERRIDE_0, 0x3); 761 b43_phy_set(dev, B43_LPPHY_RF_OVERRIDE_0, 0x3);
762 b43_phy_mask(dev, B43_LPPHY_RF_OVERRIDE_VAL_0, 0xFFFB); 762 b43_phy_mask(dev, B43_LPPHY_RF_OVERRIDE_VAL_0, 0xFFFB);
763 b43_phy_set(dev, B43_LPPHY_RF_OVERRIDE_0, 0x4); 763 b43_phy_set(dev, B43_LPPHY_RF_OVERRIDE_0, 0x4);
764 b43_phy_mask(dev, B43_LPPHY_RF_OVERRIDE_0, 0xFFF7); 764 b43_phy_mask(dev, B43_LPPHY_RF_OVERRIDE_VAL_0, 0xFFF7);
765 b43_phy_set(dev, B43_LPPHY_RF_OVERRIDE_0, 0x8); 765 b43_phy_set(dev, B43_LPPHY_RF_OVERRIDE_0, 0x8);
766 b43_phy_set(dev, B43_LPPHY_RF_OVERRIDE_VAL_0, 0x10); 766 b43_phy_set(dev, B43_LPPHY_RF_OVERRIDE_VAL_0, 0x10);
767 b43_phy_set(dev, B43_LPPHY_RF_OVERRIDE_0, 0x10); 767 b43_phy_set(dev, B43_LPPHY_RF_OVERRIDE_0, 0x10);
@@ -956,7 +956,7 @@ static void lpphy_run_ddfs(struct b43_wldev *dev, int i_on, int q_on,
956 b43_phy_maskset(dev, B43_LPPHY_AFE_DDFS, 0xFF9F, scale_idx << 5); 956 b43_phy_maskset(dev, B43_LPPHY_AFE_DDFS, 0xFF9F, scale_idx << 5);
957 b43_phy_mask(dev, B43_LPPHY_AFE_DDFS, 0xFFFB); 957 b43_phy_mask(dev, B43_LPPHY_AFE_DDFS, 0xFFFB);
958 b43_phy_set(dev, B43_LPPHY_AFE_DDFS, 0x2); 958 b43_phy_set(dev, B43_LPPHY_AFE_DDFS, 0x2);
959 b43_phy_set(dev, B43_LPPHY_AFE_DDFS, 0x20); 959 b43_phy_set(dev, B43_LPPHY_LP_PHY_CTL, 0x20);
960} 960}
961 961
962static bool lpphy_rx_iq_est(struct b43_wldev *dev, u16 samples, u8 time, 962static bool lpphy_rx_iq_est(struct b43_wldev *dev, u16 samples, u8 time,
@@ -968,7 +968,7 @@ static bool lpphy_rx_iq_est(struct b43_wldev *dev, u16 samples, u8 time,
968 b43_phy_write(dev, B43_LPPHY_IQ_NUM_SMPLS_ADDR, samples); 968 b43_phy_write(dev, B43_LPPHY_IQ_NUM_SMPLS_ADDR, samples);
969 b43_phy_maskset(dev, B43_LPPHY_IQ_ENABLE_WAIT_TIME_ADDR, 0xFF00, time); 969 b43_phy_maskset(dev, B43_LPPHY_IQ_ENABLE_WAIT_TIME_ADDR, 0xFF00, time);
970 b43_phy_mask(dev, B43_LPPHY_IQ_ENABLE_WAIT_TIME_ADDR, 0xFEFF); 970 b43_phy_mask(dev, B43_LPPHY_IQ_ENABLE_WAIT_TIME_ADDR, 0xFEFF);
971 b43_phy_set(dev, B43_LPPHY_IQ_ENABLE_WAIT_TIME_ADDR, 0xFDFF); 971 b43_phy_set(dev, B43_LPPHY_IQ_ENABLE_WAIT_TIME_ADDR, 0x200);
972 972
973 for (i = 0; i < 500; i++) { 973 for (i = 0; i < 500; i++) {
974 if (!(b43_phy_read(dev, 974 if (!(b43_phy_read(dev,
@@ -1135,9 +1135,9 @@ static void lpphy_set_tx_power_control(struct b43_wldev *dev,
1135 } 1135 }
1136 if (dev->phy.rev >= 2) { 1136 if (dev->phy.rev >= 2) {
1137 if (mode == B43_LPPHY_TXPCTL_HW) 1137 if (mode == B43_LPPHY_TXPCTL_HW)
1138 b43_phy_maskset(dev, B43_PHY_OFDM(0xD0), 0xFD, 0x2); 1138 b43_phy_set(dev, B43_PHY_OFDM(0xD0), 0x2);
1139 else 1139 else
1140 b43_phy_maskset(dev, B43_PHY_OFDM(0xD0), 0xFD, 0); 1140 b43_phy_mask(dev, B43_PHY_OFDM(0xD0), 0xFFFD);
1141 } 1141 }
1142 lpphy_write_tx_pctl_mode_to_hardware(dev); 1142 lpphy_write_tx_pctl_mode_to_hardware(dev);
1143} 1143}
@@ -1169,7 +1169,7 @@ static void lpphy_rev0_1_rc_calib(struct b43_wldev *dev)
1169 err = b43_lpphy_op_switch_channel(dev, 7); 1169 err = b43_lpphy_op_switch_channel(dev, 7);
1170 if (err) { 1170 if (err) {
1171 b43dbg(dev->wl, 1171 b43dbg(dev->wl,
1172 "RC calib: Failed to switch to channel 7, error = %d", 1172 "RC calib: Failed to switch to channel 7, error = %d\n",
1173 err); 1173 err);
1174 } 1174 }
1175 old_txg_ovr = !!(b43_phy_read(dev, B43_LPPHY_AFE_CTL_OVR) & 0x40); 1175 old_txg_ovr = !!(b43_phy_read(dev, B43_LPPHY_AFE_CTL_OVR) & 0x40);
@@ -1500,8 +1500,15 @@ static u16 b43_lpphy_op_read(struct b43_wldev *dev, u16 reg)
1500 1500
1501static void b43_lpphy_op_write(struct b43_wldev *dev, u16 reg, u16 value) 1501static void b43_lpphy_op_write(struct b43_wldev *dev, u16 reg, u16 value)
1502{ 1502{
1503 b43_write32(dev, B43_MMIO_PHY_CONTROL, ((u32)value << 16) | reg);
1504}
1505
1506static void b43_lpphy_op_maskset(struct b43_wldev *dev, u16 reg, u16 mask,
1507 u16 set)
1508{
1503 b43_write16(dev, B43_MMIO_PHY_CONTROL, reg); 1509 b43_write16(dev, B43_MMIO_PHY_CONTROL, reg);
1504 b43_write16(dev, B43_MMIO_PHY_DATA, value); 1510 b43_write16(dev, B43_MMIO_PHY_DATA,
1511 (b43_read16(dev, B43_MMIO_PHY_DATA) & mask) | set);
1505} 1512}
1506 1513
1507static u16 b43_lpphy_op_radio_read(struct b43_wldev *dev, u16 reg) 1514static u16 b43_lpphy_op_radio_read(struct b43_wldev *dev, u16 reg)
@@ -1920,8 +1927,8 @@ static void lpphy_b2062_reset_pll_bias(struct b43_wldev *dev)
1920 1927
1921static void lpphy_b2062_vco_calib(struct b43_wldev *dev) 1928static void lpphy_b2062_vco_calib(struct b43_wldev *dev)
1922{ 1929{
1923 b43_phy_write(dev, B2062_S_RFPLL_CTL21, 0x42); 1930 b43_radio_write(dev, B2062_S_RFPLL_CTL21, 0x42);
1924 b43_phy_write(dev, B2062_S_RFPLL_CTL21, 0x62); 1931 b43_radio_write(dev, B2062_S_RFPLL_CTL21, 0x62);
1925 udelay(200); 1932 udelay(200);
1926} 1933}
1927 1934
@@ -1980,7 +1987,7 @@ static int lpphy_b2062_tune(struct b43_wldev *dev,
1980 tmp6 = tmp5 / tmp4; 1987 tmp6 = tmp5 / tmp4;
1981 tmp7 = tmp5 % tmp4; 1988 tmp7 = tmp5 % tmp4;
1982 b43_radio_write(dev, B2062_S_RFPLL_CTL29, tmp6 + ((2 * tmp7) / tmp4)); 1989 b43_radio_write(dev, B2062_S_RFPLL_CTL29, tmp6 + ((2 * tmp7) / tmp4));
1983 tmp8 = b43_phy_read(dev, B2062_S_RFPLL_CTL19); 1990 tmp8 = b43_radio_read(dev, B2062_S_RFPLL_CTL19);
1984 tmp9 = ((2 * tmp3 * (tmp8 + 1)) + (3 * tmp1)) / (6 * tmp1); 1991 tmp9 = ((2 * tmp3 * (tmp8 + 1)) + (3 * tmp1)) / (6 * tmp1);
1985 b43_radio_write(dev, B2062_S_RFPLL_CTL23, (tmp9 >> 8) + 16); 1992 b43_radio_write(dev, B2062_S_RFPLL_CTL23, (tmp9 >> 8) + 16);
1986 b43_radio_write(dev, B2062_S_RFPLL_CTL24, tmp9 & 0xFF); 1993 b43_radio_write(dev, B2062_S_RFPLL_CTL24, tmp9 & 0xFF);
@@ -2019,17 +2026,17 @@ static void lpphy_b2063_vco_calib(struct b43_wldev *dev)
2019{ 2026{
2020 u16 tmp; 2027 u16 tmp;
2021 2028
2022 b43_phy_mask(dev, B2063_PLL_SP1, ~0x40); 2029 b43_radio_mask(dev, B2063_PLL_SP1, ~0x40);
2023 tmp = b43_phy_read(dev, B2063_PLL_JTAG_CALNRST) & 0xF8; 2030 tmp = b43_radio_read(dev, B2063_PLL_JTAG_CALNRST) & 0xF8;
2024 b43_phy_write(dev, B2063_PLL_JTAG_CALNRST, tmp); 2031 b43_radio_write(dev, B2063_PLL_JTAG_CALNRST, tmp);
2025 udelay(1); 2032 udelay(1);
2026 b43_phy_write(dev, B2063_PLL_JTAG_CALNRST, tmp | 0x4); 2033 b43_radio_write(dev, B2063_PLL_JTAG_CALNRST, tmp | 0x4);
2027 udelay(1); 2034 udelay(1);
2028 b43_phy_write(dev, B2063_PLL_JTAG_CALNRST, tmp | 0x6); 2035 b43_radio_write(dev, B2063_PLL_JTAG_CALNRST, tmp | 0x6);
2029 udelay(1); 2036 udelay(1);
2030 b43_phy_write(dev, B2063_PLL_JTAG_CALNRST, tmp | 0x7); 2037 b43_radio_write(dev, B2063_PLL_JTAG_CALNRST, tmp | 0x7);
2031 udelay(300); 2038 udelay(300);
2032 b43_phy_set(dev, B2063_PLL_SP1, 0x40); 2039 b43_radio_set(dev, B2063_PLL_SP1, 0x40);
2033} 2040}
2034 2041
2035static int lpphy_b2063_tune(struct b43_wldev *dev, 2042static int lpphy_b2063_tune(struct b43_wldev *dev,
@@ -2124,31 +2131,31 @@ static int lpphy_b2063_tune(struct b43_wldev *dev,
2124 scale = 0; 2131 scale = 0;
2125 tmp5 = ((tmp4 + (tmp3 >> 1)) / tmp3) - 8; 2132 tmp5 = ((tmp4 + (tmp3 >> 1)) / tmp3) - 8;
2126 } 2133 }
2127 b43_phy_maskset(dev, B2063_PLL_JTAG_PLL_CP2, 0xFFC0, tmp5); 2134 b43_radio_maskset(dev, B2063_PLL_JTAG_PLL_CP2, 0xFFC0, tmp5);
2128 b43_phy_maskset(dev, B2063_PLL_JTAG_PLL_CP2, 0xFFBF, scale << 6); 2135 b43_radio_maskset(dev, B2063_PLL_JTAG_PLL_CP2, 0xFFBF, scale << 6);
2129 2136
2130 tmp6 = lpphy_qdiv_roundup(100 * val1, val3, 16); 2137 tmp6 = lpphy_qdiv_roundup(100 * val1, val3, 16);
2131 tmp6 *= (tmp5 * 8) * (scale + 1); 2138 tmp6 *= (tmp5 * 8) * (scale + 1);
2132 if (tmp6 > 150) 2139 if (tmp6 > 150)
2133 tmp6 = 0; 2140 tmp6 = 0;
2134 2141
2135 b43_phy_maskset(dev, B2063_PLL_JTAG_PLL_CP3, 0xFFE0, tmp6); 2142 b43_radio_maskset(dev, B2063_PLL_JTAG_PLL_CP3, 0xFFE0, tmp6);
2136 b43_phy_maskset(dev, B2063_PLL_JTAG_PLL_CP3, 0xFFDF, scale << 5); 2143 b43_radio_maskset(dev, B2063_PLL_JTAG_PLL_CP3, 0xFFDF, scale << 5);
2137 2144
2138 b43_phy_maskset(dev, B2063_PLL_JTAG_PLL_XTAL_12, 0xFFFB, 0x4); 2145 b43_radio_maskset(dev, B2063_PLL_JTAG_PLL_XTAL_12, 0xFFFB, 0x4);
2139 if (crystal_freq > 26000000) 2146 if (crystal_freq > 26000000)
2140 b43_phy_set(dev, B2063_PLL_JTAG_PLL_XTAL_12, 0x2); 2147 b43_radio_set(dev, B2063_PLL_JTAG_PLL_XTAL_12, 0x2);
2141 else 2148 else
2142 b43_phy_mask(dev, B2063_PLL_JTAG_PLL_XTAL_12, 0xFD); 2149 b43_radio_mask(dev, B2063_PLL_JTAG_PLL_XTAL_12, 0xFD);
2143 2150
2144 if (val1 == 45) 2151 if (val1 == 45)
2145 b43_phy_set(dev, B2063_PLL_JTAG_PLL_VCO1, 0x2); 2152 b43_radio_set(dev, B2063_PLL_JTAG_PLL_VCO1, 0x2);
2146 else 2153 else
2147 b43_phy_mask(dev, B2063_PLL_JTAG_PLL_VCO1, 0xFD); 2154 b43_radio_mask(dev, B2063_PLL_JTAG_PLL_VCO1, 0xFD);
2148 2155
2149 b43_phy_set(dev, B2063_PLL_SP2, 0x3); 2156 b43_radio_set(dev, B2063_PLL_SP2, 0x3);
2150 udelay(1); 2157 udelay(1);
2151 b43_phy_mask(dev, B2063_PLL_SP2, 0xFFFC); 2158 b43_radio_mask(dev, B2063_PLL_SP2, 0xFFFC);
2152 lpphy_b2063_vco_calib(dev); 2159 lpphy_b2063_vco_calib(dev);
2153 b43_radio_write(dev, B2063_COMM15, old_comm15); 2160 b43_radio_write(dev, B2063_COMM15, old_comm15);
2154 2161
@@ -2158,10 +2165,9 @@ static int lpphy_b2063_tune(struct b43_wldev *dev,
2158static int b43_lpphy_op_switch_channel(struct b43_wldev *dev, 2165static int b43_lpphy_op_switch_channel(struct b43_wldev *dev,
2159 unsigned int new_channel) 2166 unsigned int new_channel)
2160{ 2167{
2168 struct b43_phy_lp *lpphy = dev->phy.lp;
2161 int err; 2169 int err;
2162 2170
2163 b43_write16(dev, B43_MMIO_CHANNEL, new_channel);
2164
2165 if (dev->phy.radio_ver == 0x2063) { 2171 if (dev->phy.radio_ver == 0x2063) {
2166 err = lpphy_b2063_tune(dev, new_channel); 2172 err = lpphy_b2063_tune(dev, new_channel);
2167 if (err) 2173 if (err)
@@ -2174,6 +2180,9 @@ static int b43_lpphy_op_switch_channel(struct b43_wldev *dev,
2174 lpphy_adjust_gain_table(dev, channel2freq_lp(new_channel)); 2180 lpphy_adjust_gain_table(dev, channel2freq_lp(new_channel));
2175 } 2181 }
2176 2182
2183 lpphy->channel = new_channel;
2184 b43_write16(dev, B43_MMIO_CHANNEL, new_channel);
2185
2177 return 0; 2186 return 0;
2178} 2187}
2179 2188
@@ -2185,10 +2194,9 @@ static int b43_lpphy_op_init(struct b43_wldev *dev)
2185 lpphy_baseband_init(dev); 2194 lpphy_baseband_init(dev);
2186 lpphy_radio_init(dev); 2195 lpphy_radio_init(dev);
2187 lpphy_calibrate_rc(dev); 2196 lpphy_calibrate_rc(dev);
2188 err = b43_lpphy_op_switch_channel(dev, 2197 err = b43_lpphy_op_switch_channel(dev, 7);
2189 b43_lpphy_op_get_default_chan(dev));
2190 if (err) { 2198 if (err) {
2191 b43dbg(dev->wl, "Switch to init channel failed, error = %d.\n", 2199 b43dbg(dev->wl, "Switch to channel 7 failed, error = %d.\n",
2192 err); 2200 err);
2193 } 2201 }
2194 lpphy_tx_pctl_init(dev); 2202 lpphy_tx_pctl_init(dev);
@@ -2222,6 +2230,7 @@ const struct b43_phy_operations b43_phyops_lp = {
2222 .init = b43_lpphy_op_init, 2230 .init = b43_lpphy_op_init,
2223 .phy_read = b43_lpphy_op_read, 2231 .phy_read = b43_lpphy_op_read,
2224 .phy_write = b43_lpphy_op_write, 2232 .phy_write = b43_lpphy_op_write,
2233 .phy_maskset = b43_lpphy_op_maskset,
2225 .radio_read = b43_lpphy_op_radio_read, 2234 .radio_read = b43_lpphy_op_radio_read,
2226 .radio_write = b43_lpphy_op_radio_write, 2235 .radio_write = b43_lpphy_op_radio_write,
2227 .software_rfkill = b43_lpphy_op_software_rfkill, 2236 .software_rfkill = b43_lpphy_op_software_rfkill,
diff --git a/drivers/net/wireless/b43/phy_lp.h b/drivers/net/wireless/b43/phy_lp.h
index e158d1f66c0e..c3232c17b60a 100644
--- a/drivers/net/wireless/b43/phy_lp.h
+++ b/drivers/net/wireless/b43/phy_lp.h
@@ -888,6 +888,9 @@ struct b43_phy_lp {
888 bool crs_usr_disable, crs_sys_disable; 888 bool crs_usr_disable, crs_sys_disable;
889 889
890 unsigned int pdiv; 890 unsigned int pdiv;
891
892 /* The channel we are tuned to */
893 u8 channel;
891}; 894};
892 895
893enum tssi_mux_mode { 896enum tssi_mux_mode {
diff --git a/drivers/net/wireless/b43/tables_lpphy.c b/drivers/net/wireless/b43/tables_lpphy.c
index 60d472f285af..c784def19b19 100644
--- a/drivers/net/wireless/b43/tables_lpphy.c
+++ b/drivers/net/wireless/b43/tables_lpphy.c
@@ -624,30 +624,35 @@ u32 b43_lptab_read(struct b43_wldev *dev, u32 offset)
624void b43_lptab_read_bulk(struct b43_wldev *dev, u32 offset, 624void b43_lptab_read_bulk(struct b43_wldev *dev, u32 offset,
625 unsigned int nr_elements, void *_data) 625 unsigned int nr_elements, void *_data)
626{ 626{
627 u32 type, value; 627 u32 type;
628 u8 *data = _data; 628 u8 *data = _data;
629 unsigned int i; 629 unsigned int i;
630 630
631 type = offset & B43_LPTAB_TYPEMASK; 631 type = offset & B43_LPTAB_TYPEMASK;
632 offset &= ~B43_LPTAB_TYPEMASK;
633 B43_WARN_ON(offset > 0xFFFF);
634
635 b43_phy_write(dev, B43_LPPHY_TABLE_ADDR, offset);
636
632 for (i = 0; i < nr_elements; i++) { 637 for (i = 0; i < nr_elements; i++) {
633 value = b43_lptab_read(dev, offset);
634 switch (type) { 638 switch (type) {
635 case B43_LPTAB_8BIT: 639 case B43_LPTAB_8BIT:
636 *data = value; 640 *data = b43_phy_read(dev, B43_LPPHY_TABLEDATALO) & 0xFF;
637 data++; 641 data++;
638 break; 642 break;
639 case B43_LPTAB_16BIT: 643 case B43_LPTAB_16BIT:
640 *((u16 *)data) = value; 644 *((u16 *)data) = b43_phy_read(dev, B43_LPPHY_TABLEDATALO);
641 data += 2; 645 data += 2;
642 break; 646 break;
643 case B43_LPTAB_32BIT: 647 case B43_LPTAB_32BIT:
644 *((u32 *)data) = value; 648 *((u32 *)data) = b43_phy_read(dev, B43_LPPHY_TABLEDATAHI);
649 *((u32 *)data) <<= 16;
650 *((u32 *)data) |= b43_phy_read(dev, B43_LPPHY_TABLEDATALO);
645 data += 4; 651 data += 4;
646 break; 652 break;
647 default: 653 default:
648 B43_WARN_ON(1); 654 B43_WARN_ON(1);
649 } 655 }
650 offset++;
651 } 656 }
652} 657}
653 658
@@ -688,26 +693,34 @@ void b43_lptab_write_bulk(struct b43_wldev *dev, u32 offset,
688 unsigned int i; 693 unsigned int i;
689 694
690 type = offset & B43_LPTAB_TYPEMASK; 695 type = offset & B43_LPTAB_TYPEMASK;
696 offset &= ~B43_LPTAB_TYPEMASK;
697 B43_WARN_ON(offset > 0xFFFF);
698
699 b43_phy_write(dev, B43_LPPHY_TABLE_ADDR, offset);
700
691 for (i = 0; i < nr_elements; i++) { 701 for (i = 0; i < nr_elements; i++) {
692 switch (type) { 702 switch (type) {
693 case B43_LPTAB_8BIT: 703 case B43_LPTAB_8BIT:
694 value = *data; 704 value = *data;
695 data++; 705 data++;
706 B43_WARN_ON(value & ~0xFF);
707 b43_phy_write(dev, B43_LPPHY_TABLEDATALO, value);
696 break; 708 break;
697 case B43_LPTAB_16BIT: 709 case B43_LPTAB_16BIT:
698 value = *((u16 *)data); 710 value = *((u16 *)data);
699 data += 2; 711 data += 2;
712 B43_WARN_ON(value & ~0xFFFF);
713 b43_phy_write(dev, B43_LPPHY_TABLEDATALO, value);
700 break; 714 break;
701 case B43_LPTAB_32BIT: 715 case B43_LPTAB_32BIT:
702 value = *((u32 *)data); 716 value = *((u32 *)data);
703 data += 4; 717 data += 4;
718 b43_phy_write(dev, B43_LPPHY_TABLEDATAHI, value >> 16);
719 b43_phy_write(dev, B43_LPPHY_TABLEDATALO, value);
704 break; 720 break;
705 default: 721 default:
706 B43_WARN_ON(1); 722 B43_WARN_ON(1);
707 value = 0;
708 } 723 }
709 b43_lptab_write(dev, offset, value);
710 offset++;
711 } 724 }
712} 725}
713 726
@@ -777,7 +790,7 @@ static const u8 lpphy_pll_fraction_table[] = {
777 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 790 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
778}; 791};
779 792
780static const u16 lpphy_iq_local_table[] = { 793static const u16 lpphy_iqlo_cal_table[] = {
781 0x0200, 0x0300, 0x0400, 0x0600, 0x0800, 0x0b00, 0x1000, 0x1001, 0x1002, 794 0x0200, 0x0300, 0x0400, 0x0600, 0x0800, 0x0b00, 0x1000, 0x1001, 0x1002,
782 0x1003, 0x1004, 0x1005, 0x1006, 0x1007, 0x1707, 0x2007, 0x2d07, 0x4007, 795 0x1003, 0x1004, 0x1005, 0x1006, 0x1007, 0x1707, 0x2007, 0x2d07, 0x4007,
783 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 796 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@@ -789,10 +802,17 @@ static const u16 lpphy_iq_local_table[] = {
789 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 802 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
790 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000, 803 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4000, 0x0000, 0x0000,
791 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 804 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
792 0x0000, 0x0000, 805 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
793}; 806};
794 807
795static const u16 lpphy_ofdm_cck_gain_table[] = { 808static const u16 lpphy_rev0_ofdm_cck_gain_table[] = {
809 0x0001, 0x0001, 0x0001, 0x0001, 0x1001, 0x2001, 0x3001, 0x4001, 0x5001,
810 0x6001, 0x7001, 0x7011, 0x7021, 0x2035, 0x2045, 0x2055, 0x2065, 0x2075,
811 0x006d, 0x007d, 0x014d, 0x015d, 0x115d, 0x035d, 0x135d, 0x055d, 0x155d,
812 0x0d5d, 0x1d5d, 0x2d5d, 0x555d, 0x655d, 0x755d,
813};
814
815static const u16 lpphy_rev1_ofdm_cck_gain_table[] = {
796 0x5000, 0x6000, 0x7000, 0x0001, 0x1001, 0x2001, 0x3001, 0x4001, 0x5001, 816 0x5000, 0x6000, 0x7000, 0x0001, 0x1001, 0x2001, 0x3001, 0x4001, 0x5001,
797 0x6001, 0x7001, 0x7011, 0x7021, 0x2035, 0x2045, 0x2055, 0x2065, 0x2075, 817 0x6001, 0x7001, 0x7011, 0x7021, 0x2035, 0x2045, 0x2055, 0x2065, 0x2075,
798 0x006d, 0x007d, 0x014d, 0x015d, 0x115d, 0x035d, 0x135d, 0x055d, 0x155d, 818 0x006d, 0x007d, 0x014d, 0x015d, 0x115d, 0x035d, 0x135d, 0x055d, 0x155d,
@@ -2263,11 +2283,18 @@ void lpphy_rev0_1_table_init(struct b43_wldev *dev)
2263 b43_lptab_write_bulk(dev, B43_LPTAB8(6, 0), 2283 b43_lptab_write_bulk(dev, B43_LPTAB8(6, 0),
2264 ARRAY_SIZE(lpphy_pll_fraction_table), lpphy_pll_fraction_table); 2284 ARRAY_SIZE(lpphy_pll_fraction_table), lpphy_pll_fraction_table);
2265 b43_lptab_write_bulk(dev, B43_LPTAB16(0, 0), 2285 b43_lptab_write_bulk(dev, B43_LPTAB16(0, 0),
2266 ARRAY_SIZE(lpphy_iq_local_table), lpphy_iq_local_table); 2286 ARRAY_SIZE(lpphy_iqlo_cal_table), lpphy_iqlo_cal_table);
2267 b43_lptab_write_bulk(dev, B43_LPTAB16(13, 0), 2287 if (dev->phy.rev == 0) {
2268 ARRAY_SIZE(lpphy_ofdm_cck_gain_table), lpphy_ofdm_cck_gain_table); 2288 b43_lptab_write_bulk(dev, B43_LPTAB16(13, 0),
2269 b43_lptab_write_bulk(dev, B43_LPTAB16(12, 0), 2289 ARRAY_SIZE(lpphy_rev0_ofdm_cck_gain_table), lpphy_rev0_ofdm_cck_gain_table);
2270 ARRAY_SIZE(lpphy_ofdm_cck_gain_table), lpphy_ofdm_cck_gain_table); 2290 b43_lptab_write_bulk(dev, B43_LPTAB16(12, 0),
2291 ARRAY_SIZE(lpphy_rev0_ofdm_cck_gain_table), lpphy_rev0_ofdm_cck_gain_table);
2292 } else {
2293 b43_lptab_write_bulk(dev, B43_LPTAB16(13, 0),
2294 ARRAY_SIZE(lpphy_rev1_ofdm_cck_gain_table), lpphy_rev1_ofdm_cck_gain_table);
2295 b43_lptab_write_bulk(dev, B43_LPTAB16(12, 0),
2296 ARRAY_SIZE(lpphy_rev1_ofdm_cck_gain_table), lpphy_rev1_ofdm_cck_gain_table);
2297}
2271 b43_lptab_write_bulk(dev, B43_LPTAB16(15, 0), 2298 b43_lptab_write_bulk(dev, B43_LPTAB16(15, 0),
2272 ARRAY_SIZE(lpphy_gain_delta_table), lpphy_gain_delta_table); 2299 ARRAY_SIZE(lpphy_gain_delta_table), lpphy_gain_delta_table);
2273 b43_lptab_write_bulk(dev, B43_LPTAB32(10, 0), 2300 b43_lptab_write_bulk(dev, B43_LPTAB32(10, 0),
@@ -2281,22 +2308,6 @@ void lpphy_rev2plus_table_init(struct b43_wldev *dev)
2281 2308
2282 B43_WARN_ON(dev->phy.rev < 2); 2309 B43_WARN_ON(dev->phy.rev < 2);
2283 2310
2284 /*
2285 * FIXME This code follows the specs, but it looks wrong:
2286 * In each pass, it writes 4 bytes to an offset in table ID 7,
2287 * then increments the offset by 1 for the next pass. This results
2288 * in the first 3 bytes of each pass except the first one getting
2289 * written to a location that has already been zeroed in the previous
2290 * pass.
2291 * This is what the vendor driver does, but it still looks suspicious.
2292 *
2293 * This should probably suffice:
2294 *
2295 * for (i = 0; i < 704; i+=4)
2296 * b43_lptab_write(dev, B43_LPTAB32(7, i), 0)
2297 *
2298 * This should be tested once the code is functional.
2299 */
2300 for (i = 0; i < 704; i++) 2311 for (i = 0; i < 704; i++)
2301 b43_lptab_write(dev, B43_LPTAB32(7, i), 0); 2312 b43_lptab_write(dev, B43_LPTAB32(7, i), 0);
2302 2313
@@ -2323,7 +2334,7 @@ void lpphy_rev2plus_table_init(struct b43_wldev *dev)
2323 b43_lptab_write_bulk(dev, B43_LPTAB8(6, 0), 2334 b43_lptab_write_bulk(dev, B43_LPTAB8(6, 0),
2324 ARRAY_SIZE(lpphy_pll_fraction_table), lpphy_pll_fraction_table); 2335 ARRAY_SIZE(lpphy_pll_fraction_table), lpphy_pll_fraction_table);
2325 b43_lptab_write_bulk(dev, B43_LPTAB16(0, 0), 2336 b43_lptab_write_bulk(dev, B43_LPTAB16(0, 0),
2326 ARRAY_SIZE(lpphy_iq_local_table), lpphy_iq_local_table); 2337 ARRAY_SIZE(lpphy_iqlo_cal_table), lpphy_iqlo_cal_table);
2327 b43_lptab_write_bulk(dev, B43_LPTAB32(9, 0), 2338 b43_lptab_write_bulk(dev, B43_LPTAB32(9, 0),
2328 ARRAY_SIZE(lpphy_papd_eps_table), lpphy_papd_eps_table); 2339 ARRAY_SIZE(lpphy_papd_eps_table), lpphy_papd_eps_table);
2329 b43_lptab_write_bulk(dev, B43_LPTAB32(10, 0), 2340 b43_lptab_write_bulk(dev, B43_LPTAB32(10, 0),