diff options
author | Arend van Spriel <arend@broadcom.com> | 2011-05-09 16:33:27 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-05-10 11:12:36 -0700 |
commit | b8fbc3928cce0c8fa7c01afc33ddef02062504e1 (patch) | |
tree | 80f12b8021d67963732dc3be10a192d463c1e723 /drivers/staging/brcm80211 | |
parent | dc1e961668d148fa5c2784ac51a9a78cb7274cf3 (diff) | |
download | kernel_samsung_smdk4412-b8fbc3928cce0c8fa7c01afc33ddef02062504e1.zip kernel_samsung_smdk4412-b8fbc3928cce0c8fa7c01afc33ddef02062504e1.tar.gz kernel_samsung_smdk4412-b8fbc3928cce0c8fa7c01afc33ddef02062504e1.tar.bz2 |
staging: brcm80211: make use of fls bit operation in wlc_phy_compute_dB
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>
Diffstat (limited to 'drivers/staging/brcm80211')
-rw-r--r-- | drivers/staging/brcm80211/brcmsmac/phy/wlc_phy_cmn.c | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/drivers/staging/brcm80211/brcmsmac/phy/wlc_phy_cmn.c b/drivers/staging/brcm80211/brcmsmac/phy/wlc_phy_cmn.c index 7837c73..9c2ab38 100644 --- a/drivers/staging/brcm80211/brcmsmac/phy/wlc_phy_cmn.c +++ b/drivers/staging/brcm80211/brcmsmac/phy/wlc_phy_cmn.c @@ -18,10 +18,12 @@ #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); } } |