diff options
author | Rafał Miłecki <zajec5@gmail.com> | 2013-03-07 10:47:24 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2013-03-13 14:27:51 -0400 |
commit | 396535e137c969dae91c879b8533d74079bba4c2 (patch) | |
tree | d51e3e1e661e899a298764828cdd9972de8437d2 /drivers/net/wireless/b43 | |
parent | 371ec465a3589b27a81af7e5bf39b614aeab202c (diff) |
b43: HT-PHY: implement playing sample tone
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/b43')
-rw-r--r-- | drivers/net/wireless/b43/phy_ht.c | 69 | ||||
-rw-r--r-- | drivers/net/wireless/b43/phy_ht.h | 5 |
2 files changed, 74 insertions, 0 deletions
diff --git a/drivers/net/wireless/b43/phy_ht.c b/drivers/net/wireless/b43/phy_ht.c index e511f595929c..22fdde613a58 100644 --- a/drivers/net/wireless/b43/phy_ht.c +++ b/drivers/net/wireless/b43/phy_ht.c | |||
@@ -321,6 +321,70 @@ static void b43_phy_ht_stop_playback(struct b43_wldev *dev) | |||
321 | } | 321 | } |
322 | } | 322 | } |
323 | } | 323 | } |
324 | |||
325 | static u16 b43_phy_ht_load_samples(struct b43_wldev *dev) | ||
326 | { | ||
327 | int i; | ||
328 | u16 len = 20 << 3; | ||
329 | |||
330 | b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, 0x4400); | ||
331 | |||
332 | for (i = 0; i < len; i++) { | ||
333 | b43_phy_write(dev, B43_PHY_HT_TABLE_DATAHI, 0); | ||
334 | b43_phy_write(dev, B43_PHY_HT_TABLE_DATALO, 0); | ||
335 | } | ||
336 | |||
337 | return len; | ||
338 | } | ||
339 | |||
340 | static void b43_phy_ht_run_samples(struct b43_wldev *dev, u16 samps, u16 loops, | ||
341 | u16 wait) | ||
342 | { | ||
343 | struct b43_phy_ht *phy_ht = dev->phy.ht; | ||
344 | u16 save_seq_mode; | ||
345 | int i; | ||
346 | |||
347 | for (i = 0; i < 3; i++) { | ||
348 | if (phy_ht->bb_mult_save[i] < 0) | ||
349 | phy_ht->bb_mult_save[i] = b43_httab_read(dev, B43_HTTAB16(13, 0x63 + i * 4)); | ||
350 | } | ||
351 | |||
352 | b43_phy_write(dev, B43_PHY_HT_SAMP_DEP_CNT, samps - 1); | ||
353 | if (loops != 0xFFFF) | ||
354 | loops--; | ||
355 | b43_phy_write(dev, B43_PHY_HT_SAMP_LOOP_CNT, loops); | ||
356 | b43_phy_write(dev, B43_PHY_HT_SAMP_WAIT_CNT, wait); | ||
357 | |||
358 | save_seq_mode = b43_phy_read(dev, B43_PHY_HT_RF_SEQ_MODE); | ||
359 | b43_phy_set(dev, B43_PHY_HT_RF_SEQ_MODE, | ||
360 | B43_PHY_HT_RF_SEQ_MODE_CA_OVER); | ||
361 | |||
362 | /* TODO: find out mask bits! Do we need more function arguments? */ | ||
363 | b43_phy_mask(dev, B43_PHY_HT_SAMP_CMD, ~0); | ||
364 | b43_phy_mask(dev, B43_PHY_HT_SAMP_CMD, ~0); | ||
365 | b43_phy_mask(dev, B43_PHY_HT_IQLOCAL_CMDGCTL, ~0); | ||
366 | b43_phy_set(dev, B43_PHY_HT_SAMP_CMD, 0x1); | ||
367 | |||
368 | for (i = 0; i < 100; i++) { | ||
369 | if (!(b43_phy_read(dev, B43_PHY_HT_RF_SEQ_STATUS) & 1)) { | ||
370 | i = 0; | ||
371 | break; | ||
372 | } | ||
373 | udelay(10); | ||
374 | } | ||
375 | if (i) | ||
376 | b43err(dev->wl, "run samples timeout\n"); | ||
377 | |||
378 | b43_phy_write(dev, B43_PHY_HT_RF_SEQ_MODE, save_seq_mode); | ||
379 | } | ||
380 | |||
381 | static void b43_phy_ht_tx_tone(struct b43_wldev *dev) | ||
382 | { | ||
383 | u16 samp; | ||
384 | |||
385 | samp = b43_phy_ht_load_samples(dev); | ||
386 | b43_phy_ht_run_samples(dev, samp, 0xFFFF, 0); | ||
387 | } | ||
324 | #endif | 388 | #endif |
325 | 389 | ||
326 | /************************************************** | 390 | /************************************************** |
@@ -391,7 +455,12 @@ static void b43_phy_ht_tx_power_ctl(struct b43_wldev *dev, bool enable) | |||
391 | static void b43_phy_ht_tx_power_ctl_idle_tssi(struct b43_wldev *dev) | 455 | static void b43_phy_ht_tx_power_ctl_idle_tssi(struct b43_wldev *dev) |
392 | { | 456 | { |
393 | /* TODO */ | 457 | /* TODO */ |
458 | |||
459 | b43_phy_ht_tx_tone(dev); | ||
460 | udelay(20); | ||
461 | /* TODO: poll RSSI */ | ||
394 | b43_phy_ht_stop_playback(dev); | 462 | b43_phy_ht_stop_playback(dev); |
463 | |||
395 | /* TODO */ | 464 | /* TODO */ |
396 | } | 465 | } |
397 | #endif | 466 | #endif |
diff --git a/drivers/net/wireless/b43/phy_ht.h b/drivers/net/wireless/b43/phy_ht.h index 7ec794b70f03..c51795862b6d 100644 --- a/drivers/net/wireless/b43/phy_ht.h +++ b/drivers/net/wireless/b43/phy_ht.h | |||
@@ -19,6 +19,9 @@ | |||
19 | #define B43_PHY_HT_IQLOCAL_CMDGCTL 0x0C2 /* I/Q LO cal command G control */ | 19 | #define B43_PHY_HT_IQLOCAL_CMDGCTL 0x0C2 /* I/Q LO cal command G control */ |
20 | #define B43_PHY_HT_SAMP_CMD 0x0C3 /* Sample command */ | 20 | #define B43_PHY_HT_SAMP_CMD 0x0C3 /* Sample command */ |
21 | #define B43_PHY_HT_SAMP_CMD_STOP 0x0002 /* Stop */ | 21 | #define B43_PHY_HT_SAMP_CMD_STOP 0x0002 /* Stop */ |
22 | #define B43_PHY_HT_SAMP_LOOP_CNT 0x0C4 /* Sample loop count */ | ||
23 | #define B43_PHY_HT_SAMP_WAIT_CNT 0x0C5 /* Sample wait count */ | ||
24 | #define B43_PHY_HT_SAMP_DEP_CNT 0x0C6 /* Sample depth count */ | ||
22 | #define B43_PHY_HT_SAMP_STAT 0x0C7 /* Sample status */ | 25 | #define B43_PHY_HT_SAMP_STAT 0x0C7 /* Sample status */ |
23 | #define B43_PHY_HT_BW1 0x1CE | 26 | #define B43_PHY_HT_BW1 0x1CE |
24 | #define B43_PHY_HT_BW2 0x1CF | 27 | #define B43_PHY_HT_BW2 0x1CF |
@@ -39,6 +42,8 @@ | |||
39 | #define B43_PHY_HT_C3_CLIP1THRES B43_PHY_OFDM(0x08E) | 42 | #define B43_PHY_HT_C3_CLIP1THRES B43_PHY_OFDM(0x08E) |
40 | 43 | ||
41 | #define B43_PHY_HT_RF_SEQ_MODE B43_PHY_EXTG(0x000) | 44 | #define B43_PHY_HT_RF_SEQ_MODE B43_PHY_EXTG(0x000) |
45 | #define B43_PHY_HT_RF_SEQ_MODE_CA_OVER 0x0001 /* Core active override */ | ||
46 | #define B43_PHY_HT_RF_SEQ_MODE_TR_OVER 0x0002 /* Trigger override */ | ||
42 | #define B43_PHY_HT_RF_SEQ_TRIG B43_PHY_EXTG(0x003) | 47 | #define B43_PHY_HT_RF_SEQ_TRIG B43_PHY_EXTG(0x003) |
43 | #define B43_PHY_HT_RF_SEQ_TRIG_RX2TX 0x0001 /* RX2TX */ | 48 | #define B43_PHY_HT_RF_SEQ_TRIG_RX2TX 0x0001 /* RX2TX */ |
44 | #define B43_PHY_HT_RF_SEQ_TRIG_TX2RX 0x0002 /* TX2RX */ | 49 | #define B43_PHY_HT_RF_SEQ_TRIG_TX2RX 0x0002 /* TX2RX */ |