aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGábor Stefanik <netrolller.3d@gmail.com>2009-08-10 14:57:06 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-08-14 09:13:58 -0400
commita3e14f3d2a55fa1268f64ec8a839b6dfa4ff9ea2 (patch)
treed9535d7ee8aa26ff0fd3acfe3f3958aa8b7ae0f2
parentc65d6fbf91517a0a955de7ce029940bc63ea8203 (diff)
b43: Update LP-PHY rev2+ baseband init to match the specs
The rev2+ BB init spec has changed behind us, and thus the code is no longer up to date. Update the code to match the current specs. Also implement save/restore dig filt state, as required by the new specification. Signed-off-by: Gábor Stefanik <netrolller.3d@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/b43/phy_lp.c73
-rw-r--r--drivers/net/wireless/b43/phy_lp.h3
2 files changed, 72 insertions, 4 deletions
diff --git a/drivers/net/wireless/b43/phy_lp.c b/drivers/net/wireless/b43/phy_lp.c
index 79039c3f60c..6b1989490ae 100644
--- a/drivers/net/wireless/b43/phy_lp.c
+++ b/drivers/net/wireless/b43/phy_lp.c
@@ -195,6 +195,56 @@ static void lpphy_baseband_rev0_1_init(struct b43_wldev *dev)
195 } 195 }
196} 196}
197 197
198static void lpphy_save_dig_flt_state(struct b43_wldev *dev)
199{
200 static const u16 addr[] = {
201 B43_PHY_OFDM(0xC1),
202 B43_PHY_OFDM(0xC2),
203 B43_PHY_OFDM(0xC3),
204 B43_PHY_OFDM(0xC4),
205 B43_PHY_OFDM(0xC5),
206 B43_PHY_OFDM(0xC6),
207 B43_PHY_OFDM(0xC7),
208 B43_PHY_OFDM(0xC8),
209 B43_PHY_OFDM(0xCF),
210 };
211
212 static const u16 coefs[] = {
213 0xDE5E, 0xE832, 0xE331, 0x4D26,
214 0x0026, 0x1420, 0x0020, 0xFE08,
215 0x0008,
216 };
217
218 struct b43_phy_lp *lpphy = dev->phy.lp;
219 int i;
220
221 for (i = 0; i < ARRAY_SIZE(addr); i++) {
222 lpphy->dig_flt_state[i] = b43_phy_read(dev, addr[i]);
223 b43_phy_write(dev, addr[i], coefs[i]);
224 }
225}
226
227static void lpphy_restore_dig_flt_state(struct b43_wldev *dev)
228{
229 static const u16 addr[] = {
230 B43_PHY_OFDM(0xC1),
231 B43_PHY_OFDM(0xC2),
232 B43_PHY_OFDM(0xC3),
233 B43_PHY_OFDM(0xC4),
234 B43_PHY_OFDM(0xC5),
235 B43_PHY_OFDM(0xC6),
236 B43_PHY_OFDM(0xC7),
237 B43_PHY_OFDM(0xC8),
238 B43_PHY_OFDM(0xCF),
239 };
240
241 struct b43_phy_lp *lpphy = dev->phy.lp;
242 int i;
243
244 for (i = 0; i < ARRAY_SIZE(addr); i++)
245 b43_phy_write(dev, addr[i], lpphy->dig_flt_state[i]);
246}
247
198static void lpphy_baseband_rev2plus_init(struct b43_wldev *dev) 248static void lpphy_baseband_rev2plus_init(struct b43_wldev *dev)
199{ 249{
200 struct ssb_bus *bus = dev->dev->bus; 250 struct ssb_bus *bus = dev->dev->bus;
@@ -209,7 +259,7 @@ static void lpphy_baseband_rev2plus_init(struct b43_wldev *dev)
209 b43_phy_write(dev, B43_PHY_OFDM(0xF9), 0); 259 b43_phy_write(dev, B43_PHY_OFDM(0xF9), 0);
210 b43_phy_write(dev, B43_LPPHY_TR_LOOKUP_1, 0); 260 b43_phy_write(dev, B43_LPPHY_TR_LOOKUP_1, 0);
211 b43_phy_set(dev, B43_LPPHY_ADC_COMPENSATION_CTL, 0x10); 261 b43_phy_set(dev, B43_LPPHY_ADC_COMPENSATION_CTL, 0x10);
212 b43_phy_maskset(dev, B43_LPPHY_OFDMSYNCTHRESH0, 0xFF00, 0x78); 262 b43_phy_maskset(dev, B43_LPPHY_OFDMSYNCTHRESH0, 0xFF00, 0xB4);
213 b43_phy_maskset(dev, B43_LPPHY_DCOFFSETTRANSIENT, 0xF8FF, 0x200); 263 b43_phy_maskset(dev, B43_LPPHY_DCOFFSETTRANSIENT, 0xF8FF, 0x200);
214 b43_phy_maskset(dev, B43_LPPHY_DCOFFSETTRANSIENT, 0xFF00, 0x7F); 264 b43_phy_maskset(dev, B43_LPPHY_DCOFFSETTRANSIENT, 0xFF00, 0x7F);
215 b43_phy_maskset(dev, B43_LPPHY_GAINDIRECTMISMATCH, 0xFF0F, 0x40); 265 b43_phy_maskset(dev, B43_LPPHY_GAINDIRECTMISMATCH, 0xFF0F, 0x40);
@@ -217,7 +267,12 @@ static void lpphy_baseband_rev2plus_init(struct b43_wldev *dev)
217 b43_phy_mask(dev, B43_LPPHY_CRSGAIN_CTL, ~0x4000); 267 b43_phy_mask(dev, B43_LPPHY_CRSGAIN_CTL, ~0x4000);
218 b43_phy_mask(dev, B43_LPPHY_CRSGAIN_CTL, ~0x2000); 268 b43_phy_mask(dev, B43_LPPHY_CRSGAIN_CTL, ~0x2000);
219 b43_phy_set(dev, B43_PHY_OFDM(0x10A), 0x1); 269 b43_phy_set(dev, B43_PHY_OFDM(0x10A), 0x1);
220 b43_phy_maskset(dev, B43_PHY_OFDM(0x10A), 0xFF01, 0x10); 270 if (bus->boardinfo.rev >= 0x18) {
271 b43_lptab_write(dev, B43_LPTAB32(17, 65), 0xEC);
272 b43_phy_maskset(dev, B43_PHY_OFDM(0x10A), 0xFF01, 0x14);
273 } else {
274 b43_phy_maskset(dev, B43_PHY_OFDM(0x10A), 0xFF01, 0x10);
275 }
221 b43_phy_maskset(dev, B43_PHY_OFDM(0xDF), 0xFF00, 0xF4); 276 b43_phy_maskset(dev, B43_PHY_OFDM(0xDF), 0xFF00, 0xF4);
222 b43_phy_maskset(dev, B43_PHY_OFDM(0xDF), 0x00FF, 0xF100); 277 b43_phy_maskset(dev, B43_PHY_OFDM(0xDF), 0x00FF, 0xF100);
223 b43_phy_write(dev, B43_LPPHY_CLIPTHRESH, 0x48); 278 b43_phy_write(dev, B43_LPPHY_CLIPTHRESH, 0x48);
@@ -247,8 +302,10 @@ static void lpphy_baseband_rev2plus_init(struct b43_wldev *dev)
247 b43_phy_maskset(dev, B43_LPPHY_CLIPCTRTHRESH, 0xFFE0, 0x12); 302 b43_phy_maskset(dev, B43_LPPHY_CLIPCTRTHRESH, 0xFFE0, 0x12);
248 b43_phy_maskset(dev, B43_LPPHY_GAINMISMATCH, 0x0FFF, 0x9000); 303 b43_phy_maskset(dev, B43_LPPHY_GAINMISMATCH, 0x0FFF, 0x9000);
249 304
250 b43_lptab_write(dev, B43_LPTAB16(0x08, 0x14), 0); 305 if ((bus->chip_id == 0x4325) && (bus->chip_rev == 1)) {
251 b43_lptab_write(dev, B43_LPTAB16(0x08, 0x12), 0x40); 306 b43_lptab_write(dev, B43_LPTAB16(0x08, 0x14), 0);
307 b43_lptab_write(dev, B43_LPTAB16(0x08, 0x12), 0x40);
308 }
252 309
253 if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) { 310 if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) {
254 b43_phy_set(dev, B43_LPPHY_CRSGAIN_CTL, 0x40); 311 b43_phy_set(dev, B43_LPPHY_CRSGAIN_CTL, 0x40);
@@ -268,6 +325,14 @@ static void lpphy_baseband_rev2plus_init(struct b43_wldev *dev)
268 b43_phy_write(dev, B43_LPPHY_AFE_RSSI_CTL_1, 325 b43_phy_write(dev, B43_LPPHY_AFE_RSSI_CTL_1,
269 0x2000 | ((u16)lpphy->rssi_gs << 10) | 326 0x2000 | ((u16)lpphy->rssi_gs << 10) |
270 ((u16)lpphy->rssi_vc << 4) | lpphy->rssi_vf); 327 ((u16)lpphy->rssi_vc << 4) | lpphy->rssi_vf);
328
329 if ((bus->chip_id == 0x4325) && (bus->chip_rev == 0)) {
330 b43_phy_set(dev, B43_LPPHY_AFE_ADC_CTL_0, 0x1C);
331 b43_phy_maskset(dev, B43_LPPHY_AFE_CTL, 0x00FF, 0x8800);
332 b43_phy_maskset(dev, B43_LPPHY_AFE_ADC_CTL_1, 0xFC3C, 0x0400);
333 }
334
335 lpphy_save_dig_flt_state(dev);
271} 336}
272 337
273static void lpphy_baseband_init(struct b43_wldev *dev) 338static void lpphy_baseband_init(struct b43_wldev *dev)
diff --git a/drivers/net/wireless/b43/phy_lp.h b/drivers/net/wireless/b43/phy_lp.h
index 829b2bba3ee..13d89eacaf5 100644
--- a/drivers/net/wireless/b43/phy_lp.h
+++ b/drivers/net/wireless/b43/phy_lp.h
@@ -865,6 +865,9 @@ struct b43_phy_lp {
865 /* Transmit iqlocal best coeffs */ 865 /* Transmit iqlocal best coeffs */
866 bool tx_iqloc_best_coeffs_valid; 866 bool tx_iqloc_best_coeffs_valid;
867 u8 tx_iqloc_best_coeffs[11]; 867 u8 tx_iqloc_best_coeffs[11];
868
869 /* Used for "Save/Restore Dig Filt State" */
870 u16 dig_flt_state[9];
868}; 871};
869 872
870 873