staging: brcm80211: make use of fls bit operation in wlc_phy_compute_dB
authorArend van Spriel <arend@broadcom.com>
Mon, 9 May 2011 14:33:27 +0000 (16:33 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 10 May 2011 18:12:36 +0000 (11:12 -0700)
wlc_phy_compute_dB converts absolute power value to dB implementing
a fixed point calculation for 10*log10(x). It does this by determining
the most significant bit for value x. This can be done using the fls()
bit operation, which has arch specific and possibly more efficient
implementation.

Cc: devel@linuxdriverproject.org
Cc: linux-wireless@vger.kernel.org
Reviewed-by: Roland Vossen <rvossen@broadcoom.com>
Reviewed-by: Henry Ptasinski <henryp@broadcom.com>
Reviewed-by: Brett Rudley <brudley@broadcom.com>
Signed-off-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/brcm80211/brcmsmac/phy/wlc_phy_cmn.c

index 7837c73..9c2ab38 100644 (file)
 
 #include <linux/kernel.h>
 #include <linux/string.h>
-#include <bcmdefs.h>
+#include <linux/bitops.h>
 #include <linux/delay.h>
 #include <linux/module.h>
 #include <linux/pci.h>
+
+#include <bcmdefs.h>
 #include <bcmnvram.h>
 #include <sbchipc.h>
 #include <bcmdevs.h>
@@ -2746,20 +2748,15 @@ s8 lcnphy_gain_index_offset_for_pkt_rssi[] = {
 
 void wlc_phy_compute_dB(u32 *cmplx_pwr, s8 *p_cmplx_pwr_dB, u8 core)
 {
-       u8 shift_ct, lsb, msb, secondmsb, i;
+       u8 msb, secondmsb, i;
        u32 tmp;
 
        for (i = 0; i < core; i++) {
+               secondmsb = 0;
                tmp = cmplx_pwr[i];
-               shift_ct = msb = secondmsb = 0;
-               while (tmp != 0) {
-                       tmp = tmp >> 1;
-                       shift_ct++;
-                       lsb = (u8) (tmp & 1);
-                       if (lsb == 1)
-                               msb = shift_ct;
-               }
-               secondmsb = (u8) ((cmplx_pwr[i] >> (msb - 1)) & 1);
+               msb = fls(tmp);
+               if (msb)
+                       secondmsb = (u8) ((tmp >> (--msb - 1)) & 1);
                p_cmplx_pwr_dB[i] = (s8) (3 * msb + 2 * secondmsb);
        }
 }