aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/sta_info.h
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2017-04-26 14:51:20 +0200
committerJohannes Berg <johannes.berg@intel.com>2017-04-28 10:41:58 +0200
commitdcba665b1f4a5e986f22ac4230d536341d3ea5da (patch)
tree8bb2a1b93cb7d5c41fa9a7a0cdd65120dcb713fe /net/mac80211/sta_info.h
parentmac80211: rename ieee80211_rx_status::vht_nss to just nss (diff)
downloadlinux-dev-dcba665b1f4a5e986f22ac4230d536341d3ea5da.tar.xz
linux-dev-dcba665b1f4a5e986f22ac4230d536341d3ea5da.zip
mac80211: use bitfield macros for encoded rate
Instead of hand-coding the bit manipulations, use the bitfield macros to generate the code for the encoded bitrate. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211/sta_info.h')
-rw-r--r--net/mac80211/sta_info.h54
1 files changed, 36 insertions, 18 deletions
diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h
index 150f478c7c63..5609cacb20d5 100644
--- a/net/mac80211/sta_info.h
+++ b/net/mac80211/sta_info.h
@@ -16,6 +16,7 @@
#include <linux/if_ether.h>
#include <linux/workqueue.h>
#include <linux/average.h>
+#include <linux/bitfield.h>
#include <linux/etherdevice.h>
#include <linux/rhashtable.h>
#include <linux/u64_stats_sync.h>
@@ -727,37 +728,54 @@ void ieee80211_sta_ps_deliver_uapsd(struct sta_info *sta);
unsigned long ieee80211_sta_last_active(struct sta_info *sta);
+enum sta_stats_type {
+ STA_STATS_RATE_TYPE_INVALID = 0,
+ STA_STATS_RATE_TYPE_LEGACY,
+ STA_STATS_RATE_TYPE_HT,
+ STA_STATS_RATE_TYPE_VHT,
+};
+
+#define STA_STATS_FIELD_HT_MCS GENMASK( 7, 0)
+#define STA_STATS_FIELD_LEGACY_IDX GENMASK( 3, 0)
+#define STA_STATS_FIELD_LEGACY_BAND GENMASK( 7, 4)
+#define STA_STATS_FIELD_VHT_MCS GENMASK( 3, 0)
+#define STA_STATS_FIELD_VHT_NSS GENMASK( 7, 4)
+#define STA_STATS_FIELD_BW GENMASK(11, 8)
+#define STA_STATS_FIELD_SGI GENMASK(12, 12)
+#define STA_STATS_FIELD_TYPE GENMASK(15, 13)
+
+#define STA_STATS_FIELD(_n, _v) FIELD_PREP(STA_STATS_FIELD_ ## _n, _v)
+#define STA_STATS_GET(_n, _v) FIELD_GET(STA_STATS_FIELD_ ## _n, _v)
+
#define STA_STATS_RATE_INVALID 0
-#define STA_STATS_RATE_TYPE_MASK 0xC000
-#define STA_STATS_RATE_TYPE_LEGACY 0x4000
-#define STA_STATS_RATE_TYPE_HT 0x8000
-#define STA_STATS_RATE_TYPE_VHT 0xC000
-#define STA_STATS_RATE_SGI 0x1000
-#define STA_STATS_RATE_BW_SHIFT 9
-#define STA_STATS_RATE_BW_MASK (0x7 << STA_STATS_RATE_BW_SHIFT)
-
-static inline u16 sta_stats_encode_rate(struct ieee80211_rx_status *s)
+
+static inline u32 sta_stats_encode_rate(struct ieee80211_rx_status *s)
{
- u16 r = s->rate_idx;
+ u16 r;
- r |= s->bw << STA_STATS_RATE_BW_SHIFT;
+ r = STA_STATS_FIELD(BW, s->bw);
if (s->enc_flags & RX_ENC_FLAG_SHORT_GI)
- r |= STA_STATS_RATE_SGI;
+ r |= STA_STATS_FIELD(SGI, 1);
switch (s->encoding) {
case RX_ENC_VHT:
- r |= STA_STATS_RATE_TYPE_VHT | (s->nss << 4);
+ r |= STA_STATS_FIELD(TYPE, STA_STATS_RATE_TYPE_VHT);
+ r |= STA_STATS_FIELD(VHT_NSS, s->nss);
+ r |= STA_STATS_FIELD(VHT_MCS, s->rate_idx);
break;
case RX_ENC_HT:
- r |= STA_STATS_RATE_TYPE_HT;
+ r |= STA_STATS_FIELD(TYPE, STA_STATS_RATE_TYPE_HT);
+ r |= STA_STATS_FIELD(HT_MCS, s->rate_idx);
break;
- default:
- WARN_ON(1);
- /* fall through */
case RX_ENC_LEGACY:
- r |= STA_STATS_RATE_TYPE_LEGACY | (s->band << 4);
+ r |= STA_STATS_FIELD(TYPE, STA_STATS_RATE_TYPE_LEGACY);
+ r |= STA_STATS_FIELD(LEGACY_BAND, s->band);
+ r |= STA_STATS_FIELD(LEGACY_IDX, s->rate_idx);
break;
+ default:
+ WARN_ON(1);
+ return STA_STATS_RATE_INVALID;
}
return r;