diff options
author | Rafał Miłecki <zajec5@gmail.com> | 2010-01-15 08:45:13 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-01-15 17:05:35 -0500 |
commit | dfb4aa5dd0a9b61a6eaa64e9209b2f8839c0a256 (patch) | |
tree | 0c3354ab7774ebd167c5b57377c21149e6b21ee4 /drivers/net/wireless/b43/phy_n.c | |
parent | 3c95627d404e1094313f2dcb87424e2ae462e814 (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.c | 96 |
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 */ | ||
590 | static 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 */ | ||
618 | static 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 */ |
590 | static void b43_nphy_rev2_rssi_cal(struct b43_wldev *dev, u8 type) | 686 | static void b43_nphy_rev2_rssi_cal(struct b43_wldev *dev, u8 type) |
591 | { | 687 | { |