Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+49 -29
+14 -12
net/mac80211/sta_info.c
··· 2 2 * Copyright 2002-2005, Instant802 Networks, Inc. 3 3 * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> 4 4 * Copyright 2013-2014 Intel Mobile Communications GmbH 5 - * Copyright (C) 2015 - 2016 Intel Deutschland GmbH 5 + * Copyright (C) 2015 - 2017 Intel Deutschland GmbH 6 6 * 7 7 * This program is free software; you can redistribute it and/or modify 8 8 * it under the terms of the GNU General Public License version 2 as ··· 1957 1957 static void sta_stats_decode_rate(struct ieee80211_local *local, u16 rate, 1958 1958 struct rate_info *rinfo) 1959 1959 { 1960 - rinfo->bw = (rate & STA_STATS_RATE_BW_MASK) >> 1961 - STA_STATS_RATE_BW_SHIFT; 1960 + rinfo->bw = STA_STATS_GET(BW, rate); 1962 1961 1963 - switch (rate & STA_STATS_RATE_TYPE_MASK) { 1962 + switch (STA_STATS_GET(TYPE, rate)) { 1964 1963 case STA_STATS_RATE_TYPE_VHT: 1965 1964 rinfo->flags = RATE_INFO_FLAGS_VHT_MCS; 1966 - rinfo->mcs = rate & 0xf; 1967 - rinfo->nss = (rate & 0xf0) >> 4; 1965 + rinfo->mcs = STA_STATS_GET(VHT_MCS, rate); 1966 + rinfo->nss = STA_STATS_GET(VHT_NSS, rate); 1967 + if (STA_STATS_GET(SGI, rate)) 1968 + rinfo->flags |= RATE_INFO_FLAGS_SHORT_GI; 1968 1969 break; 1969 1970 case STA_STATS_RATE_TYPE_HT: 1970 1971 rinfo->flags = RATE_INFO_FLAGS_MCS; 1971 - rinfo->mcs = rate & 0xff; 1972 + rinfo->mcs = STA_STATS_GET(HT_MCS, rate); 1973 + if (STA_STATS_GET(SGI, rate)) 1974 + rinfo->flags |= RATE_INFO_FLAGS_SHORT_GI; 1972 1975 break; 1973 1976 case STA_STATS_RATE_TYPE_LEGACY: { 1974 1977 struct ieee80211_supported_band *sband; 1975 1978 u16 brate; 1976 1979 unsigned int shift; 1980 + int band = STA_STATS_GET(LEGACY_BAND, rate); 1981 + int rate_idx = STA_STATS_GET(LEGACY_IDX, rate); 1977 1982 1978 1983 rinfo->flags = 0; 1979 - sband = local->hw.wiphy->bands[(rate >> 4) & 0xf]; 1980 - brate = sband->bitrates[rate & 0xf].bitrate; 1984 + sband = local->hw.wiphy->bands[band]; 1985 + brate = sband->bitrates[rate_idx].bitrate; 1981 1986 if (rinfo->bw == RATE_INFO_BW_5) 1982 1987 shift = 2; 1983 1988 else if (rinfo->bw == RATE_INFO_BW_10) ··· 1993 1988 break; 1994 1989 } 1995 1990 } 1996 - 1997 - if (rate & STA_STATS_RATE_SGI) 1998 - rinfo->flags |= RATE_INFO_FLAGS_SHORT_GI; 1999 1991 } 2000 1992 2001 1993 static int sta_set_rate_info_rx(struct sta_info *sta, struct rate_info *rinfo)
+35 -17
net/mac80211/sta_info.h
··· 16 16 #include <linux/if_ether.h> 17 17 #include <linux/workqueue.h> 18 18 #include <linux/average.h> 19 + #include <linux/bitfield.h> 19 20 #include <linux/etherdevice.h> 20 21 #include <linux/rhashtable.h> 21 22 #include <linux/u64_stats_sync.h> ··· 728 727 729 728 unsigned long ieee80211_sta_last_active(struct sta_info *sta); 730 729 730 + enum sta_stats_type { 731 + STA_STATS_RATE_TYPE_INVALID = 0, 732 + STA_STATS_RATE_TYPE_LEGACY, 733 + STA_STATS_RATE_TYPE_HT, 734 + STA_STATS_RATE_TYPE_VHT, 735 + }; 736 + 737 + #define STA_STATS_FIELD_HT_MCS GENMASK( 7, 0) 738 + #define STA_STATS_FIELD_LEGACY_IDX GENMASK( 3, 0) 739 + #define STA_STATS_FIELD_LEGACY_BAND GENMASK( 7, 4) 740 + #define STA_STATS_FIELD_VHT_MCS GENMASK( 3, 0) 741 + #define STA_STATS_FIELD_VHT_NSS GENMASK( 7, 4) 742 + #define STA_STATS_FIELD_BW GENMASK(11, 8) 743 + #define STA_STATS_FIELD_SGI GENMASK(12, 12) 744 + #define STA_STATS_FIELD_TYPE GENMASK(15, 13) 745 + 746 + #define STA_STATS_FIELD(_n, _v) FIELD_PREP(STA_STATS_FIELD_ ## _n, _v) 747 + #define STA_STATS_GET(_n, _v) FIELD_GET(STA_STATS_FIELD_ ## _n, _v) 748 + 731 749 #define STA_STATS_RATE_INVALID 0 732 - #define STA_STATS_RATE_TYPE_MASK 0xC000 733 - #define STA_STATS_RATE_TYPE_LEGACY 0x4000 734 - #define STA_STATS_RATE_TYPE_HT 0x8000 735 - #define STA_STATS_RATE_TYPE_VHT 0xC000 736 - #define STA_STATS_RATE_SGI 0x1000 737 - #define STA_STATS_RATE_BW_SHIFT 9 738 - #define STA_STATS_RATE_BW_MASK (0x7 << STA_STATS_RATE_BW_SHIFT) 739 750 740 - static inline u16 sta_stats_encode_rate(struct ieee80211_rx_status *s) 751 + static inline u32 sta_stats_encode_rate(struct ieee80211_rx_status *s) 741 752 { 742 - u16 r = s->rate_idx; 753 + u16 r; 743 754 744 - r |= s->bw << STA_STATS_RATE_BW_SHIFT; 755 + r = STA_STATS_FIELD(BW, s->bw); 745 756 746 757 if (s->enc_flags & RX_ENC_FLAG_SHORT_GI) 747 - r |= STA_STATS_RATE_SGI; 758 + r |= STA_STATS_FIELD(SGI, 1); 748 759 749 760 switch (s->encoding) { 750 761 case RX_ENC_VHT: 751 - r |= STA_STATS_RATE_TYPE_VHT | (s->nss << 4); 762 + r |= STA_STATS_FIELD(TYPE, STA_STATS_RATE_TYPE_VHT); 763 + r |= STA_STATS_FIELD(VHT_NSS, s->nss); 764 + r |= STA_STATS_FIELD(VHT_MCS, s->rate_idx); 752 765 break; 753 766 case RX_ENC_HT: 754 - r |= STA_STATS_RATE_TYPE_HT; 767 + r |= STA_STATS_FIELD(TYPE, STA_STATS_RATE_TYPE_HT); 768 + r |= STA_STATS_FIELD(HT_MCS, s->rate_idx); 769 + break; 770 + case RX_ENC_LEGACY: 771 + r |= STA_STATS_FIELD(TYPE, STA_STATS_RATE_TYPE_LEGACY); 772 + r |= STA_STATS_FIELD(LEGACY_BAND, s->band); 773 + r |= STA_STATS_FIELD(LEGACY_IDX, s->rate_idx); 755 774 break; 756 775 default: 757 776 WARN_ON(1); 758 - /* fall through */ 759 - case RX_ENC_LEGACY: 760 - r |= STA_STATS_RATE_TYPE_LEGACY | (s->band << 4); 761 - break; 777 + return STA_STATS_RATE_INVALID; 762 778 } 763 779 764 780 return r;