aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafał Miłecki <zajec5@gmail.com>2011-12-17 07:57:22 -0500
committerJohn W. Linville <linville@tuxdriver.com>2011-12-19 14:40:48 -0500
commit8be89535e63422858250f90bc77b3f77a19e820b (patch)
tree4c68adad3bdc07dbbdef2f7c34f6d76299f12518
parent884a5228a26e281b3d6c0bbf1cce0e3523aacae9 (diff)
b43: N-PHY: reorder functions: collect samples ones
Signed-off-by: Rafał Miłecki <zajec5@gmail.com> Acked-by: Larry Finger <Larry.Finger@lwfinger.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/b43/phy_n.c266
1 files changed, 135 insertions, 131 deletions
diff --git a/drivers/net/wireless/b43/phy_n.c b/drivers/net/wireless/b43/phy_n.c
index 29ab4322e906..3140b6082d0d 100644
--- a/drivers/net/wireless/b43/phy_n.c
+++ b/drivers/net/wireless/b43/phy_n.c
@@ -778,6 +778,141 @@ static void b43_radio_init2055(struct b43_wldev *dev)
778} 778}
779 779
780/************************************************** 780/**************************************************
781 * Samples
782 **************************************************/
783
784/* http://bcm-v4.sipsolutions.net/802.11/PHY/N/LoadSampleTable */
785static int b43_nphy_load_samples(struct b43_wldev *dev,
786 struct b43_c32 *samples, u16 len) {
787 struct b43_phy_n *nphy = dev->phy.n;
788 u16 i;
789 u32 *data;
790
791 data = kzalloc(len * sizeof(u32), GFP_KERNEL);
792 if (!data) {
793 b43err(dev->wl, "allocation for samples loading failed\n");
794 return -ENOMEM;
795 }
796 if (nphy->hang_avoid)
797 b43_nphy_stay_in_carrier_search(dev, 1);
798
799 for (i = 0; i < len; i++) {
800 data[i] = (samples[i].i & 0x3FF << 10);
801 data[i] |= samples[i].q & 0x3FF;
802 }
803 b43_ntab_write_bulk(dev, B43_NTAB32(17, 0), len, data);
804
805 kfree(data);
806 if (nphy->hang_avoid)
807 b43_nphy_stay_in_carrier_search(dev, 0);
808 return 0;
809}
810
811/* http://bcm-v4.sipsolutions.net/802.11/PHY/N/GenLoadSamples */
812static u16 b43_nphy_gen_load_samples(struct b43_wldev *dev, u32 freq, u16 max,
813 bool test)
814{
815 int i;
816 u16 bw, len, rot, angle;
817 struct b43_c32 *samples;
818
819
820 bw = (dev->phy.is_40mhz) ? 40 : 20;
821 len = bw << 3;
822
823 if (test) {
824 if (b43_phy_read(dev, B43_NPHY_BBCFG) & B43_NPHY_BBCFG_RSTRX)
825 bw = 82;
826 else
827 bw = 80;
828
829 if (dev->phy.is_40mhz)
830 bw <<= 1;
831
832 len = bw << 1;
833 }
834
835 samples = kcalloc(len, sizeof(struct b43_c32), GFP_KERNEL);
836 if (!samples) {
837 b43err(dev->wl, "allocation for samples generation failed\n");
838 return 0;
839 }
840 rot = (((freq * 36) / bw) << 16) / 100;
841 angle = 0;
842
843 for (i = 0; i < len; i++) {
844 samples[i] = b43_cordic(angle);
845 angle += rot;
846 samples[i].q = CORDIC_CONVERT(samples[i].q * max);
847 samples[i].i = CORDIC_CONVERT(samples[i].i * max);
848 }
849
850 i = b43_nphy_load_samples(dev, samples, len);
851 kfree(samples);
852 return (i < 0) ? 0 : len;
853}
854
855/* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RunSamples */
856static void b43_nphy_run_samples(struct b43_wldev *dev, u16 samps, u16 loops,
857 u16 wait, bool iqmode, bool dac_test)
858{
859 struct b43_phy_n *nphy = dev->phy.n;
860 int i;
861 u16 seq_mode;
862 u32 tmp;
863
864 if (nphy->hang_avoid)
865 b43_nphy_stay_in_carrier_search(dev, true);
866
867 if ((nphy->bb_mult_save & 0x80000000) == 0) {
868 tmp = b43_ntab_read(dev, B43_NTAB16(15, 87));
869 nphy->bb_mult_save = (tmp & 0xFFFF) | 0x80000000;
870 }
871
872 if (!dev->phy.is_40mhz)
873 tmp = 0x6464;
874 else
875 tmp = 0x4747;
876 b43_ntab_write(dev, B43_NTAB16(15, 87), tmp);
877
878 if (nphy->hang_avoid)
879 b43_nphy_stay_in_carrier_search(dev, false);
880
881 b43_phy_write(dev, B43_NPHY_SAMP_DEPCNT, (samps - 1));
882
883 if (loops != 0xFFFF)
884 b43_phy_write(dev, B43_NPHY_SAMP_LOOPCNT, (loops - 1));
885 else
886 b43_phy_write(dev, B43_NPHY_SAMP_LOOPCNT, loops);
887
888 b43_phy_write(dev, B43_NPHY_SAMP_WAITCNT, wait);
889
890 seq_mode = b43_phy_read(dev, B43_NPHY_RFSEQMODE);
891
892 b43_phy_set(dev, B43_NPHY_RFSEQMODE, B43_NPHY_RFSEQMODE_CAOVER);
893 if (iqmode) {
894 b43_phy_mask(dev, B43_NPHY_IQLOCAL_CMDGCTL, 0x7FFF);
895 b43_phy_set(dev, B43_NPHY_IQLOCAL_CMDGCTL, 0x8000);
896 } else {
897 if (dac_test)
898 b43_phy_write(dev, B43_NPHY_SAMP_CMD, 5);
899 else
900 b43_phy_write(dev, B43_NPHY_SAMP_CMD, 1);
901 }
902 for (i = 0; i < 100; i++) {
903 if (b43_phy_read(dev, B43_NPHY_RFSEQST) & 1) {
904 i = 0;
905 break;
906 }
907 udelay(10);
908 }
909 if (i)
910 b43err(dev->wl, "run samples timeout\n");
911
912 b43_phy_write(dev, B43_NPHY_RFSEQMODE, seq_mode);
913}
914
915/**************************************************
781 * Others 916 * Others
782 **************************************************/ 917 **************************************************/
783 918
@@ -2077,137 +2212,6 @@ static void b43_nphy_workarounds(struct b43_wldev *dev)
2077 b43_nphy_stay_in_carrier_search(dev, 0); 2212 b43_nphy_stay_in_carrier_search(dev, 0);
2078} 2213}
2079 2214
2080/* http://bcm-v4.sipsolutions.net/802.11/PHY/N/LoadSampleTable */
2081static int b43_nphy_load_samples(struct b43_wldev *dev,
2082 struct b43_c32 *samples, u16 len) {
2083 struct b43_phy_n *nphy = dev->phy.n;
2084 u16 i;
2085 u32 *data;
2086
2087 data = kzalloc(len * sizeof(u32), GFP_KERNEL);
2088 if (!data) {
2089 b43err(dev->wl, "allocation for samples loading failed\n");
2090 return -ENOMEM;
2091 }
2092 if (nphy->hang_avoid)
2093 b43_nphy_stay_in_carrier_search(dev, 1);
2094
2095 for (i = 0; i < len; i++) {
2096 data[i] = (samples[i].i & 0x3FF << 10);
2097 data[i] |= samples[i].q & 0x3FF;
2098 }
2099 b43_ntab_write_bulk(dev, B43_NTAB32(17, 0), len, data);
2100
2101 kfree(data);
2102 if (nphy->hang_avoid)
2103 b43_nphy_stay_in_carrier_search(dev, 0);
2104 return 0;
2105}
2106
2107/* http://bcm-v4.sipsolutions.net/802.11/PHY/N/GenLoadSamples */
2108static u16 b43_nphy_gen_load_samples(struct b43_wldev *dev, u32 freq, u16 max,
2109 bool test)
2110{
2111 int i;
2112 u16 bw, len, rot, angle;
2113 struct b43_c32 *samples;
2114
2115
2116 bw = (dev->phy.is_40mhz) ? 40 : 20;
2117 len = bw << 3;
2118
2119 if (test) {
2120 if (b43_phy_read(dev, B43_NPHY_BBCFG) & B43_NPHY_BBCFG_RSTRX)
2121 bw = 82;
2122 else
2123 bw = 80;
2124
2125 if (dev->phy.is_40mhz)
2126 bw <<= 1;
2127
2128 len = bw << 1;
2129 }
2130
2131 samples = kcalloc(len, sizeof(struct b43_c32), GFP_KERNEL);
2132 if (!samples) {
2133 b43err(dev->wl, "allocation for samples generation failed\n");
2134 return 0;
2135 }
2136 rot = (((freq * 36) / bw) << 16) / 100;
2137 angle = 0;
2138
2139 for (i = 0; i < len; i++) {
2140 samples[i] = b43_cordic(angle);
2141 angle += rot;
2142 samples[i].q = CORDIC_CONVERT(samples[i].q * max);
2143 samples[i].i = CORDIC_CONVERT(samples[i].i * max);
2144 }
2145
2146 i = b43_nphy_load_samples(dev, samples, len);
2147 kfree(samples);
2148 return (i < 0) ? 0 : len;
2149}
2150
2151/* http://bcm-v4.sipsolutions.net/802.11/PHY/N/RunSamples */
2152static void b43_nphy_run_samples(struct b43_wldev *dev, u16 samps, u16 loops,
2153 u16 wait, bool iqmode, bool dac_test)
2154{
2155 struct b43_phy_n *nphy = dev->phy.n;
2156 int i;
2157 u16 seq_mode;
2158 u32 tmp;
2159
2160 if (nphy->hang_avoid)
2161 b43_nphy_stay_in_carrier_search(dev, true);
2162
2163 if ((nphy->bb_mult_save & 0x80000000) == 0) {
2164 tmp = b43_ntab_read(dev, B43_NTAB16(15, 87));
2165 nphy->bb_mult_save = (tmp & 0xFFFF) | 0x80000000;
2166 }
2167
2168 if (!dev->phy.is_40mhz)
2169 tmp = 0x6464;
2170 else
2171 tmp = 0x4747;
2172 b43_ntab_write(dev, B43_NTAB16(15, 87), tmp);
2173
2174 if (nphy->hang_avoid)
2175 b43_nphy_stay_in_carrier_search(dev, false);
2176
2177 b43_phy_write(dev, B43_NPHY_SAMP_DEPCNT, (samps - 1));
2178
2179 if (loops != 0xFFFF)
2180 b43_phy_write(dev, B43_NPHY_SAMP_LOOPCNT, (loops - 1));
2181 else
2182 b43_phy_write(dev, B43_NPHY_SAMP_LOOPCNT, loops);
2183
2184 b43_phy_write(dev, B43_NPHY_SAMP_WAITCNT, wait);
2185
2186 seq_mode = b43_phy_read(dev, B43_NPHY_RFSEQMODE);
2187
2188 b43_phy_set(dev, B43_NPHY_RFSEQMODE, B43_NPHY_RFSEQMODE_CAOVER);
2189 if (iqmode) {
2190 b43_phy_mask(dev, B43_NPHY_IQLOCAL_CMDGCTL, 0x7FFF);
2191 b43_phy_set(dev, B43_NPHY_IQLOCAL_CMDGCTL, 0x8000);
2192 } else {
2193 if (dac_test)
2194 b43_phy_write(dev, B43_NPHY_SAMP_CMD, 5);
2195 else
2196 b43_phy_write(dev, B43_NPHY_SAMP_CMD, 1);
2197 }
2198 for (i = 0; i < 100; i++) {
2199 if (b43_phy_read(dev, B43_NPHY_RFSEQST) & 1) {
2200 i = 0;
2201 break;
2202 }
2203 udelay(10);
2204 }
2205 if (i)
2206 b43err(dev->wl, "run samples timeout\n");
2207
2208 b43_phy_write(dev, B43_NPHY_RFSEQMODE, seq_mode);
2209}
2210
2211/* 2215/*
2212 * Transmits a known value for LO calibration 2216 * Transmits a known value for LO calibration
2213 * http://bcm-v4.sipsolutions.net/802.11/PHY/N/TXTone 2217 * http://bcm-v4.sipsolutions.net/802.11/PHY/N/TXTone