diff options
author | Rafał Miłecki <zajec5@gmail.com> | 2011-03-01 15:40:41 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-03-04 14:05:18 -0500 |
commit | ba9a6214539df3e647d8259b101dbc60216ecc31 (patch) | |
tree | ea81c0b657e8acf43a4c68748f55d4cff804154b /drivers | |
parent | 9838985162935a9db12962403808d43f3d225952 (diff) |
b43: N-PHY: rev3+: implement gain ctl workarounds
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/wireless/b43/phy_n.c | 171 |
1 files changed, 162 insertions, 9 deletions
diff --git a/drivers/net/wireless/b43/phy_n.c b/drivers/net/wireless/b43/phy_n.c index 6c9aa5a5850a..8a00f9a95dbb 100644 --- a/drivers/net/wireless/b43/phy_n.c +++ b/drivers/net/wireless/b43/phy_n.c | |||
@@ -1168,23 +1168,98 @@ static void b43_nphy_adjust_lna_gain_table(struct b43_wldev *dev) | |||
1168 | static void b43_nphy_gain_ctrl_workarounds(struct b43_wldev *dev) | 1168 | static void b43_nphy_gain_ctrl_workarounds(struct b43_wldev *dev) |
1169 | { | 1169 | { |
1170 | struct b43_phy_n *nphy = dev->phy.n; | 1170 | struct b43_phy_n *nphy = dev->phy.n; |
1171 | struct ssb_sprom *sprom = &(dev->dev->bus->sprom); | ||
1172 | |||
1173 | /* PHY rev 0, 1, 2 */ | ||
1171 | u8 i, j; | 1174 | u8 i, j; |
1172 | u8 code; | 1175 | u8 code; |
1173 | u16 tmp; | 1176 | u16 tmp; |
1177 | u8 rfseq_events[3] = { 6, 8, 7 }; | ||
1178 | u8 rfseq_delays[3] = { 10, 30, 1 }; | ||
1174 | 1179 | ||
1175 | /* TODO: for PHY >= 3 | 1180 | /* PHY rev >= 3 */ |
1176 | s8 *lna1_gain, *lna2_gain; | 1181 | bool ghz5; |
1177 | u8 *gain_db, *gain_bits; | 1182 | bool ext_lna; |
1178 | u16 *rfseq_init; | 1183 | u16 rssi_gain; |
1184 | struct nphy_gain_ctl_workaround_entry *e; | ||
1179 | u8 lpf_gain[6] = { 0x00, 0x06, 0x0C, 0x12, 0x12, 0x12 }; | 1185 | u8 lpf_gain[6] = { 0x00, 0x06, 0x0C, 0x12, 0x12, 0x12 }; |
1180 | u8 lpf_bits[6] = { 0, 1, 2, 3, 3, 3 }; | 1186 | u8 lpf_bits[6] = { 0, 1, 2, 3, 3, 3 }; |
1181 | */ | ||
1182 | |||
1183 | u8 rfseq_events[3] = { 6, 8, 7 }; | ||
1184 | u8 rfseq_delays[3] = { 10, 30, 1 }; | ||
1185 | 1187 | ||
1186 | if (dev->phy.rev >= 3) { | 1188 | if (dev->phy.rev >= 3) { |
1187 | /* TODO */ | 1189 | /* Prepare values */ |
1190 | ghz5 = b43_phy_read(dev, B43_NPHY_BANDCTL) | ||
1191 | & B43_NPHY_BANDCTL_5GHZ; | ||
1192 | ext_lna = sprom->boardflags_lo & B43_BFL_EXTLNA; | ||
1193 | e = b43_nphy_get_gain_ctl_workaround_ent(dev, ghz5, ext_lna); | ||
1194 | if (ghz5 && dev->phy.rev >= 5) | ||
1195 | rssi_gain = 0x90; | ||
1196 | else | ||
1197 | rssi_gain = 0x50; | ||
1198 | |||
1199 | b43_phy_set(dev, B43_NPHY_RXCTL, 0x0040); | ||
1200 | |||
1201 | /* Set Clip 2 detect */ | ||
1202 | b43_phy_set(dev, B43_NPHY_C1_CGAINI, | ||
1203 | B43_NPHY_C1_CGAINI_CL2DETECT); | ||
1204 | b43_phy_set(dev, B43_NPHY_C2_CGAINI, | ||
1205 | B43_NPHY_C2_CGAINI_CL2DETECT); | ||
1206 | |||
1207 | b43_radio_write(dev, B2056_RX0 | B2056_RX_BIASPOLE_LNAG1_IDAC, | ||
1208 | 0x17); | ||
1209 | b43_radio_write(dev, B2056_RX1 | B2056_RX_BIASPOLE_LNAG1_IDAC, | ||
1210 | 0x17); | ||
1211 | b43_radio_write(dev, B2056_RX0 | B2056_RX_LNAG2_IDAC, 0xF0); | ||
1212 | b43_radio_write(dev, B2056_RX1 | B2056_RX_LNAG2_IDAC, 0xF0); | ||
1213 | b43_radio_write(dev, B2056_RX0 | B2056_RX_RSSI_POLE, 0x00); | ||
1214 | b43_radio_write(dev, B2056_RX1 | B2056_RX_RSSI_POLE, 0x00); | ||
1215 | b43_radio_write(dev, B2056_RX0 | B2056_RX_RSSI_GAIN, | ||
1216 | rssi_gain); | ||
1217 | b43_radio_write(dev, B2056_RX1 | B2056_RX_RSSI_GAIN, | ||
1218 | rssi_gain); | ||
1219 | b43_radio_write(dev, B2056_RX0 | B2056_RX_BIASPOLE_LNAA1_IDAC, | ||
1220 | 0x17); | ||
1221 | b43_radio_write(dev, B2056_RX1 | B2056_RX_BIASPOLE_LNAA1_IDAC, | ||
1222 | 0x17); | ||
1223 | b43_radio_write(dev, B2056_RX0 | B2056_RX_LNAA2_IDAC, 0xFF); | ||
1224 | b43_radio_write(dev, B2056_RX1 | B2056_RX_LNAA2_IDAC, 0xFF); | ||
1225 | |||
1226 | b43_ntab_write_bulk(dev, B43_NTAB8(0, 8), 4, e->lna1_gain); | ||
1227 | b43_ntab_write_bulk(dev, B43_NTAB8(1, 8), 4, e->lna1_gain); | ||
1228 | b43_ntab_write_bulk(dev, B43_NTAB8(0, 16), 4, e->lna2_gain); | ||
1229 | b43_ntab_write_bulk(dev, B43_NTAB8(1, 16), 4, e->lna2_gain); | ||
1230 | b43_ntab_write_bulk(dev, B43_NTAB8(0, 32), 10, e->gain_db); | ||
1231 | b43_ntab_write_bulk(dev, B43_NTAB8(1, 32), 10, e->gain_db); | ||
1232 | b43_ntab_write_bulk(dev, B43_NTAB8(2, 32), 10, e->gain_bits); | ||
1233 | b43_ntab_write_bulk(dev, B43_NTAB8(3, 32), 10, e->gain_bits); | ||
1234 | b43_ntab_write_bulk(dev, B43_NTAB8(0, 0x40), 6, lpf_gain); | ||
1235 | b43_ntab_write_bulk(dev, B43_NTAB8(1, 0x40), 6, lpf_gain); | ||
1236 | b43_ntab_write_bulk(dev, B43_NTAB8(2, 0x40), 6, lpf_bits); | ||
1237 | b43_ntab_write_bulk(dev, B43_NTAB8(3, 0x40), 6, lpf_bits); | ||
1238 | |||
1239 | b43_phy_write(dev, B43_NPHY_C1_INITGAIN, e->init_gain); | ||
1240 | b43_phy_write(dev, 0x2A7, e->init_gain); | ||
1241 | b43_ntab_write_bulk(dev, B43_NTAB16(7, 0x106), 2, | ||
1242 | e->rfseq_init); | ||
1243 | b43_phy_write(dev, B43_NPHY_C1_INITGAIN, e->init_gain); | ||
1244 | |||
1245 | /* TODO: check defines. Do not match variables names */ | ||
1246 | b43_phy_write(dev, B43_NPHY_C1_CLIP1_MEDGAIN, e->cliphi_gain); | ||
1247 | b43_phy_write(dev, 0x2A9, e->cliphi_gain); | ||
1248 | b43_phy_write(dev, B43_NPHY_C1_CLIP2_GAIN, e->clipmd_gain); | ||
1249 | b43_phy_write(dev, 0x2AB, e->clipmd_gain); | ||
1250 | b43_phy_write(dev, B43_NPHY_C2_CLIP1_HIGAIN, e->cliplo_gain); | ||
1251 | b43_phy_write(dev, 0x2AD, e->cliplo_gain); | ||
1252 | |||
1253 | b43_phy_maskset(dev, 0x27D, 0xFF00, e->crsmin); | ||
1254 | b43_phy_maskset(dev, 0x280, 0xFF00, e->crsminl); | ||
1255 | b43_phy_maskset(dev, 0x283, 0xFF00, e->crsminu); | ||
1256 | b43_phy_write(dev, B43_NPHY_C1_NBCLIPTHRES, e->nbclip); | ||
1257 | b43_phy_write(dev, B43_NPHY_C2_NBCLIPTHRES, e->nbclip); | ||
1258 | b43_phy_maskset(dev, B43_NPHY_C1_CLIPWBTHRES, | ||
1259 | ~B43_NPHY_C1_CLIPWBTHRES_CLIP2, e->wlclip); | ||
1260 | b43_phy_maskset(dev, B43_NPHY_C2_CLIPWBTHRES, | ||
1261 | ~B43_NPHY_C2_CLIPWBTHRES_CLIP2, e->wlclip); | ||
1262 | b43_phy_write(dev, B43_NPHY_CCK_SHIFTB_REF, 0x809C); | ||
1188 | } else { | 1263 | } else { |
1189 | /* Set Clip 2 detect */ | 1264 | /* Set Clip 2 detect */ |
1190 | b43_phy_set(dev, B43_NPHY_C1_CGAINI, | 1265 | b43_phy_set(dev, B43_NPHY_C1_CGAINI, |
@@ -1308,6 +1383,9 @@ static void b43_nphy_workarounds(struct b43_wldev *dev) | |||
1308 | u8 events2[7] = { 0x0, 0x3, 0x5, 0x4, 0x2, 0x1, 0x8 }; | 1383 | u8 events2[7] = { 0x0, 0x3, 0x5, 0x4, 0x2, 0x1, 0x8 }; |
1309 | u8 delays2[7] = { 0x8, 0x6, 0x2, 0x4, 0x4, 0x6, 0x1 }; | 1384 | u8 delays2[7] = { 0x8, 0x6, 0x2, 0x4, 0x4, 0x6, 0x1 }; |
1310 | 1385 | ||
1386 | u16 tmp16; | ||
1387 | u32 tmp32; | ||
1388 | |||
1311 | if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) | 1389 | if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) |
1312 | b43_nphy_classifier(dev, 1, 0); | 1390 | b43_nphy_classifier(dev, 1, 0); |
1313 | else | 1391 | else |
@@ -1320,7 +1398,82 @@ static void b43_nphy_workarounds(struct b43_wldev *dev) | |||
1320 | B43_NPHY_IQFLIP_ADC1 | B43_NPHY_IQFLIP_ADC2); | 1398 | B43_NPHY_IQFLIP_ADC1 | B43_NPHY_IQFLIP_ADC2); |
1321 | 1399 | ||
1322 | if (dev->phy.rev >= 3) { | 1400 | if (dev->phy.rev >= 3) { |
1401 | tmp32 = b43_ntab_read(dev, B43_NTAB32(30, 0)); | ||
1402 | tmp32 &= 0xffffff; | ||
1403 | b43_ntab_write(dev, B43_NTAB32(30, 0), tmp32); | ||
1404 | |||
1405 | b43_phy_write(dev, B43_NPHY_PHASETR_A0, 0x0125); | ||
1406 | b43_phy_write(dev, B43_NPHY_PHASETR_A1, 0x01B3); | ||
1407 | b43_phy_write(dev, B43_NPHY_PHASETR_A2, 0x0105); | ||
1408 | b43_phy_write(dev, B43_NPHY_PHASETR_B0, 0x016E); | ||
1409 | b43_phy_write(dev, B43_NPHY_PHASETR_B1, 0x00CD); | ||
1410 | b43_phy_write(dev, B43_NPHY_PHASETR_B2, 0x0020); | ||
1411 | |||
1412 | b43_phy_write(dev, B43_NPHY_C2_CLIP1_MEDGAIN, 0x000C); | ||
1413 | b43_phy_write(dev, 0x2AE, 0x000C); | ||
1414 | |||
1415 | /* TODO */ | ||
1416 | |||
1417 | tmp16 = (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ) ? | ||
1418 | 0x2 : 0x9C40; | ||
1419 | b43_phy_write(dev, B43_NPHY_ENDROP_TLEN, tmp16); | ||
1420 | |||
1421 | b43_phy_maskset(dev, 0x294, 0xF0FF, 0x0700); | ||
1422 | |||
1423 | b43_ntab_write(dev, B43_NTAB32(16, 3), 0x18D); | ||
1424 | b43_ntab_write(dev, B43_NTAB32(16, 127), 0x18D); | ||
1425 | |||
1426 | b43_nphy_gain_ctrl_workarounds(dev); | ||
1427 | |||
1428 | b43_ntab_write(dev, B43_NTAB32(8, 0), 2); | ||
1429 | b43_ntab_write(dev, B43_NTAB32(8, 16), 2); | ||
1430 | |||
1323 | /* TODO */ | 1431 | /* TODO */ |
1432 | |||
1433 | b43_radio_write(dev, B2056_RX0 | B2056_RX_MIXA_MAST_BIAS, 0x00); | ||
1434 | b43_radio_write(dev, B2056_RX1 | B2056_RX_MIXA_MAST_BIAS, 0x00); | ||
1435 | b43_radio_write(dev, B2056_RX0 | B2056_RX_MIXA_BIAS_MAIN, 0x06); | ||
1436 | b43_radio_write(dev, B2056_RX1 | B2056_RX_MIXA_BIAS_MAIN, 0x06); | ||
1437 | b43_radio_write(dev, B2056_RX0 | B2056_RX_MIXA_BIAS_AUX, 0x07); | ||
1438 | b43_radio_write(dev, B2056_RX1 | B2056_RX_MIXA_BIAS_AUX, 0x07); | ||
1439 | b43_radio_write(dev, B2056_RX0 | B2056_RX_MIXA_LOB_BIAS, 0x88); | ||
1440 | b43_radio_write(dev, B2056_RX1 | B2056_RX_MIXA_LOB_BIAS, 0x88); | ||
1441 | b43_radio_write(dev, B2056_RX0 | B2056_RX_MIXG_CMFB_IDAC, 0x00); | ||
1442 | b43_radio_write(dev, B2056_RX1 | B2056_RX_MIXG_CMFB_IDAC, 0x00); | ||
1443 | |||
1444 | /* N PHY WAR TX Chain Update with hw_phytxchain as argument */ | ||
1445 | |||
1446 | if ((bus->sprom.boardflags2_lo & B43_BFL2_APLL_WAR && | ||
1447 | b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) || | ||
1448 | (bus->sprom.boardflags2_lo & B43_BFL2_GPLL_WAR && | ||
1449 | b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ)) | ||
1450 | tmp32 = 0x00088888; | ||
1451 | else | ||
1452 | tmp32 = 0x88888888; | ||
1453 | b43_ntab_write(dev, B43_NTAB32(30, 1), tmp32); | ||
1454 | b43_ntab_write(dev, B43_NTAB32(30, 2), tmp32); | ||
1455 | b43_ntab_write(dev, B43_NTAB32(30, 3), tmp32); | ||
1456 | |||
1457 | if (dev->phy.rev == 4 && | ||
1458 | b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ) { | ||
1459 | b43_radio_write(dev, B2056_TX0 | B2056_TX_GMBB_IDAC, | ||
1460 | 0x70); | ||
1461 | b43_radio_write(dev, B2056_TX1 | B2056_TX_GMBB_IDAC, | ||
1462 | 0x70); | ||
1463 | } | ||
1464 | |||
1465 | b43_phy_write(dev, 0x224, 0x039C); | ||
1466 | b43_phy_write(dev, 0x225, 0x0357); | ||
1467 | b43_phy_write(dev, 0x226, 0x0317); | ||
1468 | b43_phy_write(dev, 0x227, 0x02D7); | ||
1469 | b43_phy_write(dev, 0x228, 0x039C); | ||
1470 | b43_phy_write(dev, 0x229, 0x0357); | ||
1471 | b43_phy_write(dev, 0x22A, 0x0317); | ||
1472 | b43_phy_write(dev, 0x22B, 0x02D7); | ||
1473 | b43_phy_write(dev, 0x22C, 0x039C); | ||
1474 | b43_phy_write(dev, 0x22D, 0x0357); | ||
1475 | b43_phy_write(dev, 0x22E, 0x0317); | ||
1476 | b43_phy_write(dev, 0x22F, 0x02D7); | ||
1324 | } else { | 1477 | } else { |
1325 | if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ && | 1478 | if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ && |
1326 | nphy->band5g_pwrgain) { | 1479 | nphy->band5g_pwrgain) { |