status->rate_idx, status->nss))
goto drop;
break;
+ case RX_ENC_S1G:
+ if (WARN_ONCE(status->rate_idx > 12 ||
+ !status->nss ||
+ status->nss > 4,
+ "Rate marked as an S1G rate but data is invalid: MCS: %d, NSS: %d\n",
+ status->rate_idx, status->nss))
+ goto drop;
+ break;
default:
WARN_ON_ONCE(1);
fallthrough;
if (STA_STATS_GET(UHR_IM, rate))
rinfo->flags |= RATE_INFO_FLAGS_UHR_IM;
break;
+ case STA_STATS_RATE_TYPE_S1G:
+ rinfo->flags = RATE_INFO_FLAGS_S1G_MCS;
+ rinfo->mcs = STA_STATS_GET(S1G_MCS, rate);
+ rinfo->nss = STA_STATS_GET(S1G_NSS, rate);
+ if (STA_STATS_GET(SGI, rate))
+ rinfo->flags |= RATE_INFO_FLAGS_SHORT_GI;
+ break;
}
}
#define STA_STATS_FIELD_VHT_MCS 0x0000F000
#define STA_STATS_FIELD_VHT_NSS 0x000F0000
-/* HT & VHT */
+/* HT, VHT & S1G */
#define STA_STATS_FIELD_SGI 0x00100000
/* STA_STATS_RATE_TYPE_HE */
#define STA_STATS_FIELD_UHR_ELR 0x08000000
#define STA_STATS_FIELD_UHR_IM 0x10000000
+/* STA_STATS_RATE_TYPE_S1G */
+#define STA_STATS_FIELD_S1G_MCS 0x0000F000
+#define STA_STATS_FIELD_S1G_NSS 0x000F0000
#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)
switch (s->encoding) {
case RX_ENC_HT:
case RX_ENC_VHT:
+ case RX_ENC_S1G:
if (s->enc_flags & RX_ENC_FLAG_SHORT_GI)
r |= STA_STATS_FIELD(SGI, 1);
break;
r |= STA_STATS_FIELD(UHR_ELR, s->uhr.elr);
r |= STA_STATS_FIELD(UHR_IM, s->uhr.im);
break;
+ case RX_ENC_S1G:
+ r |= STA_STATS_FIELD(TYPE, STA_STATS_RATE_TYPE_S1G);
+ r |= STA_STATS_FIELD(S1G_NSS, s->nss);
+ r |= STA_STATS_FIELD(S1G_MCS, s->rate_idx);
+ break;
default:
WARN_ON(1);
return STA_STATS_RATE_INVALID;