diff options
Diffstat (limited to 'drivers/net/wireless/b43/phy_lp.c')
-rw-r--r-- | drivers/net/wireless/b43/phy_lp.c | 52 |
1 files changed, 6 insertions, 46 deletions
diff --git a/drivers/net/wireless/b43/phy_lp.c b/drivers/net/wireless/b43/phy_lp.c index b58d6cf26580..185219e0a552 100644 --- a/drivers/net/wireless/b43/phy_lp.c +++ b/drivers/net/wireless/b43/phy_lp.c | |||
@@ -1767,47 +1767,6 @@ out: | |||
1767 | return ret; | 1767 | return ret; |
1768 | } | 1768 | } |
1769 | 1769 | ||
1770 | /* Complex number using 2 32-bit signed integers */ | ||
1771 | typedef struct {s32 i, q;} lpphy_c32; | ||
1772 | |||
1773 | static lpphy_c32 lpphy_cordic(int theta) | ||
1774 | { | ||
1775 | u32 arctg[] = { 2949120, 1740967, 919879, 466945, 234379, 117304, | ||
1776 | 58666, 29335, 14668, 7334, 3667, 1833, 917, 458, | ||
1777 | 229, 115, 57, 29, }; | ||
1778 | int i, tmp, signx = 1, angle = 0; | ||
1779 | lpphy_c32 ret = { .i = 39797, .q = 0, }; | ||
1780 | |||
1781 | theta = clamp_t(int, theta, -180, 180); | ||
1782 | |||
1783 | if (theta > 90) { | ||
1784 | theta -= 180; | ||
1785 | signx = -1; | ||
1786 | } else if (theta < -90) { | ||
1787 | theta += 180; | ||
1788 | signx = -1; | ||
1789 | } | ||
1790 | |||
1791 | for (i = 0; i <= 17; i++) { | ||
1792 | if (theta > angle) { | ||
1793 | tmp = ret.i - (ret.q >> i); | ||
1794 | ret.q += ret.i >> i; | ||
1795 | ret.i = tmp; | ||
1796 | angle += arctg[i]; | ||
1797 | } else { | ||
1798 | tmp = ret.i + (ret.q >> i); | ||
1799 | ret.q -= ret.i >> i; | ||
1800 | ret.i = tmp; | ||
1801 | angle -= arctg[i]; | ||
1802 | } | ||
1803 | } | ||
1804 | |||
1805 | ret.i *= signx; | ||
1806 | ret.q *= signx; | ||
1807 | |||
1808 | return ret; | ||
1809 | } | ||
1810 | |||
1811 | static void lpphy_run_samples(struct b43_wldev *dev, u16 samples, u16 loops, | 1770 | static void lpphy_run_samples(struct b43_wldev *dev, u16 samples, u16 loops, |
1812 | u16 wait) | 1771 | u16 wait) |
1813 | { | 1772 | { |
@@ -1825,8 +1784,9 @@ static void lpphy_start_tx_tone(struct b43_wldev *dev, s32 freq, u16 max) | |||
1825 | { | 1784 | { |
1826 | struct b43_phy_lp *lpphy = dev->phy.lp; | 1785 | struct b43_phy_lp *lpphy = dev->phy.lp; |
1827 | u16 buf[64]; | 1786 | u16 buf[64]; |
1828 | int i, samples = 0, angle = 0, rotation = (9 * freq) / 500; | 1787 | int i, samples = 0, angle = 0; |
1829 | lpphy_c32 sample; | 1788 | int rotation = (((36 * freq) / 20) << 16) / 100; |
1789 | struct b43_c32 sample; | ||
1830 | 1790 | ||
1831 | lpphy->tx_tone_freq = freq; | 1791 | lpphy->tx_tone_freq = freq; |
1832 | 1792 | ||
@@ -1842,10 +1802,10 @@ static void lpphy_start_tx_tone(struct b43_wldev *dev, s32 freq, u16 max) | |||
1842 | } | 1802 | } |
1843 | 1803 | ||
1844 | for (i = 0; i < samples; i++) { | 1804 | for (i = 0; i < samples; i++) { |
1845 | sample = lpphy_cordic(angle); | 1805 | sample = b43_cordic(angle); |
1846 | angle += rotation; | 1806 | angle += rotation; |
1847 | buf[i] = ((sample.i * max) & 0xFF) << 8; | 1807 | buf[i] = CORDIC_CONVERT((sample.i * max) & 0xFF) << 8; |
1848 | buf[i] |= (sample.q * max) & 0xFF; | 1808 | buf[i] |= CORDIC_CONVERT((sample.q * max) & 0xFF); |
1849 | } | 1809 | } |
1850 | 1810 | ||
1851 | b43_lptab_write_bulk(dev, B43_LPTAB16(5, 0), samples, buf); | 1811 | b43_lptab_write_bulk(dev, B43_LPTAB16(5, 0), samples, buf); |