diff options
Diffstat (limited to 'drivers/net/wireless/morsemicro/mm81x/mmrc.c')
| -rw-r--r-- | drivers/net/wireless/morsemicro/mm81x/mmrc.c | 34 |
1 files changed, 7 insertions, 27 deletions
diff --git a/drivers/net/wireless/morsemicro/mm81x/mmrc.c b/drivers/net/wireless/morsemicro/mm81x/mmrc.c index fe7e4f501d6c..6bedcdbcb61f 100644 --- a/drivers/net/wireless/morsemicro/mm81x/mmrc.c +++ b/drivers/net/wireless/morsemicro/mm81x/mmrc.c @@ -2,6 +2,8 @@ /* * Copyright (c) 2017-2026 Morse Micro */ +#include <linux/bitops.h> + #include "mmrc.h" /* @@ -199,34 +201,12 @@ static const u32 sym_table[10] = { 24, 36, 48, 72, 96, 144, 192, 216, 256, 288 }; /* - * Calculate which bit is the nth bit set in an integer based flag. - */ -static u8 nth_bit(u16 in, u16 index) -{ - u32 i; - u8 count = 0; - - for (i = 0; count != index + 1; i++) { - if (((1u << i) & in) != 0) - count++; - } - - return i - 1; -} - -/* * Calculate the input bit's index among all the set bits in an integer * based flag. */ static u16 bit_index(u16 in, u32 bit_pos) { - u16 i; - u16 index = 0; - - for (i = 0; i != bit_pos + 1; i++) { - if (((1u << i) & in) != 0) - index++; - } + u16 index = hweight16(in & GENMASK(bit_pos, 0)); if (index == 0) { /* Could not match bit pos to caps */ @@ -291,19 +271,19 @@ static struct mmrc_rate get_rate_row(struct mmrc_table *tb, u16 index) u16 mcs_index = index / rows; u16 mcs_modulo = index % rows; - mcs = nth_bit(tb->caps.rates, mcs_index); + mcs = fns(tb->caps.rates, mcs_index); /* Find our spatial stream */ rows = rows / streams; - streams = nth_bit(tb->caps.spatial_streams, mcs_modulo / rows); + streams = fns(tb->caps.spatial_streams, mcs_modulo / rows); /* Find our bandwidth */ ss_index = index % rows; rows = rows / bw; - bw = nth_bit(tb->caps.bandwidth, ss_index / rows); + bw = fns(tb->caps.bandwidth, ss_index / rows); /* Find our guard */ - guard = nth_bit(tb->caps.guard, index % guard); + guard = fns(tb->caps.guard, index % guard); /* Add range checks to keep scan-build happy */ if (bw >= MMRC_BW_MAX) |
