diff options
author | Rafał Miłecki <zajec5@gmail.com> | 2011-12-17 07:57:22 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-12-19 14:40:48 -0500 |
commit | 8be89535e63422858250f90bc77b3f77a19e820b (patch) | |
tree | 4c68adad3bdc07dbbdef2f7c34f6d76299f12518 | |
parent | 884a5228a26e281b3d6c0bbf1cce0e3523aacae9 (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.c | 266 |
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 */ | ||
785 | static 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 */ | ||
812 | static 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 */ | ||
856 | static 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 */ | ||
2081 | static 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 */ | ||
2108 | static 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 */ | ||
2152 | static 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 |