aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/b43
diff options
context:
space:
mode:
authorRafał Miłecki <zajec5@gmail.com>2013-03-07 10:47:24 -0500
committerJohn W. Linville <linville@tuxdriver.com>2013-03-13 14:27:51 -0400
commit396535e137c969dae91c879b8533d74079bba4c2 (patch)
treed51e3e1e661e899a298764828cdd9972de8437d2 /drivers/net/wireless/b43
parent371ec465a3589b27a81af7e5bf39b614aeab202c (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.c69
-rw-r--r--drivers/net/wireless/b43/phy_ht.h5
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
325static 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
340static 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
381static 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)
391static void b43_phy_ht_tx_power_ctl_idle_tssi(struct b43_wldev *dev) 455static 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 */