|
@@ -16,6 +16,7 @@
|
|
#include <linux/if_ether.h>
|
|
#include <linux/if_ether.h>
|
|
#include <linux/workqueue.h>
|
|
#include <linux/workqueue.h>
|
|
#include <linux/average.h>
|
|
#include <linux/average.h>
|
|
|
|
+#include <linux/bitfield.h>
|
|
#include <linux/etherdevice.h>
|
|
#include <linux/etherdevice.h>
|
|
#include <linux/rhashtable.h>
|
|
#include <linux/rhashtable.h>
|
|
#include <linux/u64_stats_sync.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);
|
|
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_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)
|
|
if (s->enc_flags & RX_ENC_FLAG_SHORT_GI)
|
|
- r |= STA_STATS_RATE_SGI;
|
|
|
|
|
|
+ r |= STA_STATS_FIELD(SGI, 1);
|
|
|
|
|
|
switch (s->encoding) {
|
|
switch (s->encoding) {
|
|
case RX_ENC_VHT:
|
|
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;
|
|
break;
|
|
case RX_ENC_HT:
|
|
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;
|
|
break;
|
|
- default:
|
|
|
|
- WARN_ON(1);
|
|
|
|
- /* fall through */
|
|
|
|
case RX_ENC_LEGACY:
|
|
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;
|
|
break;
|
|
|
|
+ default:
|
|
|
|
+ WARN_ON(1);
|
|
|
|
+ return STA_STATS_RATE_INVALID;
|
|
}
|
|
}
|
|
|
|
|
|
return r;
|
|
return r;
|