aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/b43/phy_n.c
diff options
context:
space:
mode:
authorRafał Miłecki <zajec5@gmail.com>2010-01-15 08:45:13 -0500
committerJohn W. Linville <linville@tuxdriver.com>2010-01-15 17:05:35 -0500
commitdfb4aa5dd0a9b61a6eaa64e9209b2f8839c0a256 (patch)
tree0c3354ab7774ebd167c5b57377c21149e6b21ee4 /drivers/net/wireless/b43/phy_n.c
parent3c95627d404e1094313f2dcb87424e2ae462e814 (diff)
b43: N-PHY: add RSSI polling and setting 2055 (radio) VCM
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/phy_n.c')
-rw-r--r--drivers/net/wireless/b43/phy_n.c96
1 files changed, 96 insertions, 0 deletions
diff --git a/drivers/net/wireless/b43/phy_n.c b/drivers/net/wireless/b43/phy_n.c
index 494c95246954..a0e84c428e79 100644
--- a/drivers/net/wireless/b43/phy_n.c
+++ b/drivers/net/wireless/b43/phy_n.c
@@ -586,6 +586,102 @@ static void b43_nphy_rssi_select(struct b43_wldev *dev, u8 code, u8 type)
586 } 586 }
587} 587}
588 588
589/* http://bcm-v4.sipsolutions.net/802.11/PHY/N/SetRssi2055Vcm */
590static void b43_nphy_set_rssi_2055_vcm(struct b43_wldev *dev, u8 type, u8 *buf)
591{
592 int i;
593 for (i = 0; i < 2; i++) {
594 if (type == 2) {
595 if (i == 0) {
596 b43_radio_maskset(dev, B2055_C1_B0NB_RSSIVCM,
597 0xFC, buf[0]);
598 b43_radio_maskset(dev, B2055_C1_RX_BB_RSSICTL5,
599 0xFC, buf[1]);
600 } else {
601 b43_radio_maskset(dev, B2055_C2_B0NB_RSSIVCM,
602 0xFC, buf[2 * i]);
603 b43_radio_maskset(dev, B2055_C2_RX_BB_RSSICTL5,
604 0xFC, buf[2 * i + 1]);
605 }
606 } else {
607 if (i == 0)
608 b43_radio_maskset(dev, B2055_C1_RX_BB_RSSICTL5,
609 0xF3, buf[0] << 2);
610 else
611 b43_radio_maskset(dev, B2055_C2_RX_BB_RSSICTL5,
612 0xF3, buf[2 * i + 1] << 2);
613 }
614 }
615}
616
617/* http://bcm-v4.sipsolutions.net/802.11/PHY/N/PollRssi */
618static int b43_nphy_poll_rssi(struct b43_wldev *dev, u8 type, s32 *buf,
619 u8 nsamp)
620{
621 int i;
622 int out;
623 u16 save_regs_phy[9];
624 u16 s[2];
625
626 if (dev->phy.rev >= 3) {
627 save_regs_phy[0] = b43_phy_read(dev,
628 B43_NPHY_RFCTL_LUT_TRSW_UP1);
629 save_regs_phy[1] = b43_phy_read(dev,
630 B43_NPHY_RFCTL_LUT_TRSW_UP2);
631 save_regs_phy[2] = b43_phy_read(dev, B43_NPHY_AFECTL_C1);
632 save_regs_phy[3] = b43_phy_read(dev, B43_NPHY_AFECTL_C2);
633 save_regs_phy[4] = b43_phy_read(dev, B43_NPHY_AFECTL_OVER1);
634 save_regs_phy[5] = b43_phy_read(dev, B43_NPHY_AFECTL_OVER);
635 save_regs_phy[6] = b43_phy_read(dev, B43_NPHY_TXF_40CO_B1S0);
636 save_regs_phy[7] = b43_phy_read(dev, B43_NPHY_TXF_40CO_B32S1);
637 }
638
639 b43_nphy_rssi_select(dev, 5, type);
640
641 if (dev->phy.rev < 2) {
642 save_regs_phy[8] = b43_phy_read(dev, B43_NPHY_GPIO_SEL);
643 b43_phy_write(dev, B43_NPHY_GPIO_SEL, 5);
644 }
645
646 for (i = 0; i < 4; i++)
647 buf[i] = 0;
648
649 for (i = 0; i < nsamp; i++) {
650 if (dev->phy.rev < 2) {
651 s[0] = b43_phy_read(dev, B43_NPHY_GPIO_LOOUT);
652 s[1] = b43_phy_read(dev, B43_NPHY_GPIO_HIOUT);
653 } else {
654 s[0] = b43_phy_read(dev, B43_NPHY_RSSI1);
655 s[1] = b43_phy_read(dev, B43_NPHY_RSSI2);
656 }
657
658 buf[0] += ((s8)((s[0] & 0x3F) << 2)) >> 2;
659 buf[1] += ((s8)(((s[0] >> 8) & 0x3F) << 2)) >> 2;
660 buf[2] += ((s8)((s[1] & 0x3F) << 2)) >> 2;
661 buf[3] += ((s8)(((s[1] >> 8) & 0x3F) << 2)) >> 2;
662 }
663 out = (buf[0] & 0xFF) << 24 | (buf[1] & 0xFF) << 16 |
664 (buf[2] & 0xFF) << 8 | (buf[3] & 0xFF);
665
666 if (dev->phy.rev < 2)
667 b43_phy_write(dev, B43_NPHY_GPIO_SEL, save_regs_phy[8]);
668
669 if (dev->phy.rev >= 3) {
670 b43_phy_write(dev, B43_NPHY_RFCTL_LUT_TRSW_UP1,
671 save_regs_phy[0]);
672 b43_phy_write(dev, B43_NPHY_RFCTL_LUT_TRSW_UP2,
673 save_regs_phy[1]);
674 b43_phy_write(dev, B43_NPHY_AFECTL_C1, save_regs_phy[2]);
675 b43_phy_write(dev, B43_NPHY_AFECTL_C2, save_regs_phy[3]);
676 b43_phy_write(dev, B43_NPHY_AFECTL_OVER1, save_regs_phy[4]);
677 b43_phy_write(dev, B43_NPHY_AFECTL_OVER, save_regs_phy[5]);
678 b43_phy_write(dev, B43_NPHY_TXF_40CO_B1S0, save_regs_phy[6]);
679 b43_phy_write(dev, B43_NPHY_TXF_40CO_B32S1, save_regs_phy[7]);
680 }
681
682 return out;
683}
684
589/* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RSSICal */ 685/* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RSSICal */
590static void b43_nphy_rev2_rssi_cal(struct b43_wldev *dev, u8 type) 686static void b43_nphy_rev2_rssi_cal(struct b43_wldev *dev, u8 type)
591{ 687{