aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/rtwn/if_rtwn_ridx.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/rtwn/if_rtwn_ridx.h')
-rw-r--r--sys/dev/rtwn/if_rtwn_ridx.h80
1 files changed, 60 insertions, 20 deletions
diff --git a/sys/dev/rtwn/if_rtwn_ridx.h b/sys/dev/rtwn/if_rtwn_ridx.h
index dd93f2db4ccf..616ba8d6d724 100644
--- a/sys/dev/rtwn/if_rtwn_ridx.h
+++ b/sys/dev/rtwn/if_rtwn_ridx.h
@@ -22,6 +22,11 @@
#define IF_RTWN_RIDX_H
/* HW rate indices. */
+
+/*
+ * Note - these are also used as offsets into the TX power table
+ * array.
+ */
#define RTWN_RIDX_CCK1 0
#define RTWN_RIDX_CCK2 1
#define RTWN_RIDX_CCK55 2
@@ -37,13 +42,34 @@
#define RTWN_RIDX_HT_MCS_SHIFT 12
#define RTWN_RIDX_HT_MCS(i) (RTWN_RIDX_HT_MCS_SHIFT + (i))
+#define RTWN_RIDX_TO_MCS(ridx) ((ridx) - RTWN_RIDX_HT_MCS_SHIFT)
+
+/* HT supports up to MCS31, so goes from 12 -> 43 */
+
+#define RTWN_RIDX_LEGACY_HT_COUNT 44
+
+/*
+ * VHT supports MCS0..9 for up to 4 spatial streams, so
+ * goes from 44 -> 83.
+ */
+#define RTWN_RIDX_VHT_MCS_SHIFT 44
+#define RTWN_RIDX_VHT_MCS(s, i) (RTWN_RIDX_VHT_MCS_SHIFT + ((10*(s)) + (i)))
+
+/*
+ * The total amount of rate indexes, CCK, OFDM, HT MCS0..31,
+ * VHT MCS0..9 for 1-4 streams.
+ */
+#define RTWN_RIDX_COUNT 84
-#define RTWN_RIDX_COUNT 28
#define RTWN_RIDX_UNKNOWN (uint8_t)-1
-#define RTWN_RATE_IS_CCK(rate) ((rate) <= RTWN_RIDX_CCK11)
+#define RTWN_RATE_IS_CCK(rate) ((rate) <= RTWN_RIDX_CCK11)
#define RTWN_RATE_IS_OFDM(rate) \
- ((rate) >= RTWN_RIDX_OFDM6 && (rate) != RTWN_RIDX_UNKNOWN)
+ ((rate) >= RTWN_RIDX_OFDM6 && (rate) <= RTWN_RIDX_OFDM54)
+#define RTWN_RATE_IS_HT(rate) \
+ ((rate) >= RTWN_RIDX_HT_MCS_SHIFT && (rate) < RTWN_RIDX_VHT_MCS_SHIFT)
+#define RTWN_RATE_IS_VHT(rate) \
+ ((rate) >= RTWN_RIDX_VHT_MCS_SHIFT && (rate) <= RTWN_RIDX_COUNT)
static const uint8_t ridx2rate[] =
{ 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108 };
@@ -56,20 +82,22 @@ rate2ridx(uint8_t rate)
}
switch (rate) {
/* 11g */
- case 12: return 4;
- case 18: return 5;
- case 24: return 6;
- case 36: return 7;
- case 48: return 8;
- case 72: return 9;
- case 96: return 10;
- case 108: return 11;
+ case 12: return (RTWN_RIDX_OFDM6);
+ case 18: return (RTWN_RIDX_OFDM9);
+ case 24: return (RTWN_RIDX_OFDM12);
+ case 36: return (RTWN_RIDX_OFDM18);
+ case 48: return (RTWN_RIDX_OFDM24);
+ case 72: return (RTWN_RIDX_OFDM36);
+ case 96: return (RTWN_RIDX_OFDM48);
+ case 108: return (RTWN_RIDX_OFDM54);
/* 11b */
- case 2: return 0;
- case 4: return 1;
- case 11: return 2;
- case 22: return 3;
- default: return RTWN_RIDX_UNKNOWN;
+ case 2: return (RTWN_RIDX_CCK1);
+ case 4: return (RTWN_RIDX_CCK2);
+ case 11: return (RTWN_RIDX_CCK55);
+ case 22: return (RTWN_RIDX_CCK11);
+ default:
+ printf("%s: called; unknown rate (%d)\n", __func__, rate);
+ return (RTWN_RIDX_UNKNOWN);
}
}
@@ -80,13 +108,25 @@ rtwn_ctl_mcsrate(const struct ieee80211_rate_table *rt, uint8_t ridx)
uint8_t cix, rate;
/* Check if we are using MCS rate. */
- KASSERT(ridx >= RTWN_RIDX_HT_MCS(0) && ridx != RTWN_RIDX_UNKNOWN,
- ("bad mcs rate index %d", ridx));
+ KASSERT(RTWN_RATE_IS_HT(ridx), ("bad mcs rate index %d", ridx));
- rate = (ridx - RTWN_RIDX_HT_MCS(0)) | IEEE80211_RATE_MCS;
+ rate = RTWN_RIDX_TO_MCS(ridx) | IEEE80211_RATE_MCS;
cix = rt->info[rt->rateCodeToIndex[rate]].ctlRateIndex;
KASSERT(cix != (uint8_t)-1, ("rate %d (%d) has no info", rate, ridx));
- return rt->info[cix].dot11Rate;
+ return (rt->info[cix].dot11Rate);
+}
+
+/* VHT version of rtwn_ctl_mcsrate */
+/* XXX TODO: also should move this to net80211 */
+static __inline__ uint8_t
+rtwn_ctl_vhtrate(const struct ieee80211_rate_table *rt, uint8_t ridx)
+{
+
+ /* Check if we are using VHT MCS rate. */
+ KASSERT(RTWN_RATE_IS_VHT(ridx), ("bad mcs rate index %d", ridx));
+
+ /* TODO: there's no VHT tables, so for now just stick to OFDM12 */
+ return (24);
}
#endif /* IF_RTWN_RIDX_H */