]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/net/wireless/b43/phy_lp.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit...
[mv-sheeva.git] / drivers / net / wireless / b43 / phy_lp.c
index 3e046ec1ff869a7898495f0ab67a20b3214b5295..c6afe9d94590f2e15cf66db6d908ded47d94ac92 100644 (file)
@@ -23,6 +23,8 @@
 
 */
 
+#include <linux/slab.h>
+
 #include "b43.h"
 #include "main.h"
 #include "phy_lp.h"
@@ -80,6 +82,7 @@ static void b43_lpphy_op_free(struct b43_wldev *dev)
        dev->phy.lp = NULL;
 }
 
+/* http://bcm-v4.sipsolutions.net/802.11/PHY/LP/ReadBandSrom */
 static void lpphy_read_band_sprom(struct b43_wldev *dev)
 {
        struct b43_phy_lp *lpphy = dev->phy.lp;
@@ -101,6 +104,12 @@ static void lpphy_read_band_sprom(struct b43_wldev *dev)
                maxpwr = bus->sprom.maxpwr_bg;
                lpphy->max_tx_pwr_med_band = maxpwr;
                cckpo = bus->sprom.cck2gpo;
+               /*
+                * We don't read SPROM's opo as specs say. On rev8 SPROMs
+                * opo == ofdm2gpo and we don't know any SSB with LP-PHY
+                * and SPROM rev below 8.
+                */
+               B43_WARN_ON(bus->sprom.revision < 8);
                ofdmpo = bus->sprom.ofdm2gpo;
                if (cckpo) {
                        for (i = 0; i < 4; i++) {
@@ -1703,19 +1712,6 @@ static const struct lpphy_rx_iq_comp lpphy_rev2plus_iq_comp = {
        .c0 = 0,
 };
 
-static u8 lpphy_nbits(s32 val)
-{
-       u32 tmp = abs(val);
-       u8 nbits = 0;
-
-       while (tmp != 0) {
-               nbits++;
-               tmp >>= 1;
-       }
-
-       return nbits;
-}
-
 static int lpphy_calc_rx_iq_comp(struct b43_wldev *dev, u16 samples)
 {
        struct lpphy_iq_est iq_est;
@@ -1742,8 +1738,8 @@ static int lpphy_calc_rx_iq_comp(struct b43_wldev *dev, u16 samples)
                goto out;
        }
 
-       prod_msb = lpphy_nbits(prod);
-       q_msb = lpphy_nbits(qpwr);
+       prod_msb = fls(abs(prod));
+       q_msb = fls(abs(qpwr));
        tmp1 = prod_msb - 20;
 
        if (tmp1 >= 0) {
@@ -1773,47 +1769,6 @@ out:
        return ret;
 }
 
-/* Complex number using 2 32-bit signed integers */
-typedef struct {s32 i, q;} lpphy_c32;
-
-static lpphy_c32 lpphy_cordic(int theta)
-{
-       u32 arctg[] = { 2949120, 1740967, 919879, 466945, 234379, 117304,
-                     58666, 29335, 14668, 7334, 3667, 1833, 917, 458,
-                     229, 115, 57, 29, };
-       int i, tmp, signx = 1, angle = 0;
-       lpphy_c32 ret = { .i = 39797, .q = 0, };
-
-       theta = clamp_t(int, theta, -180, 180);
-
-       if (theta > 90) {
-               theta -= 180;
-               signx = -1;
-       } else if (theta < -90) {
-               theta += 180;
-               signx = -1;
-       }
-
-       for (i = 0; i <= 17; i++) {
-               if (theta > angle) {
-                       tmp = ret.i - (ret.q >> i);
-                       ret.q += ret.i >> i;
-                       ret.i = tmp;
-                       angle += arctg[i];
-               } else {
-                       tmp = ret.i + (ret.q >> i);
-                       ret.q -= ret.i >> i;
-                       ret.i = tmp;
-                       angle -= arctg[i];
-               }
-       }
-
-       ret.i *= signx;
-       ret.q *= signx;
-
-       return ret;
-}
-
 static void lpphy_run_samples(struct b43_wldev *dev, u16 samples, u16 loops,
                              u16 wait)
 {
@@ -1831,8 +1786,9 @@ static void lpphy_start_tx_tone(struct b43_wldev *dev, s32 freq, u16 max)
 {
        struct b43_phy_lp *lpphy = dev->phy.lp;
        u16 buf[64];
-       int i, samples = 0, angle = 0, rotation = (9 * freq) / 500;
-       lpphy_c32 sample;
+       int i, samples = 0, angle = 0;
+       int rotation = (((36 * freq) / 20) << 16) / 100;
+       struct b43_c32 sample;
 
        lpphy->tx_tone_freq = freq;
 
@@ -1848,10 +1804,10 @@ static void lpphy_start_tx_tone(struct b43_wldev *dev, s32 freq, u16 max)
        }
 
        for (i = 0; i < samples; i++) {
-               sample = lpphy_cordic(angle);
+               sample = b43_cordic(angle);
                angle += rotation;
-               buf[i] = ((sample.i * max) & 0xFF) << 8;
-               buf[i] |= (sample.q * max) & 0xFF;
+               buf[i] = CORDIC_CONVERT((sample.i * max) & 0xFF) << 8;
+               buf[i] |= CORDIC_CONVERT((sample.q * max) & 0xFF);
        }
 
        b43_lptab_write_bulk(dev, B43_LPTAB16(5, 0), samples, buf);