Search Linux Wireless

[RFC v2 58/96] cl8k: add rates.c

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Viktor Barna <viktor.barna@xxxxxxxxxx>

(Part of the split. Please, take a look at the cover letter for more
details).

Signed-off-by: Viktor Barna <viktor.barna@xxxxxxxxxx>
---
 drivers/net/wireless/celeno/cl8k/rates.c | 1570 ++++++++++++++++++++++
 1 file changed, 1570 insertions(+)
 create mode 100644 drivers/net/wireless/celeno/cl8k/rates.c

diff --git a/drivers/net/wireless/celeno/cl8k/rates.c b/drivers/net/wireless/celeno/cl8k/rates.c
new file mode 100644
index 000000000000..8f21f3d6ff84
--- /dev/null
+++ b/drivers/net/wireless/celeno/cl8k/rates.c
@@ -0,0 +1,1570 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause
+/* Copyright(c) 2019-2022, Celeno Communications Ltd. */
+
+#include "tx.h"
+#include "bf.h"
+#include "utils.h"
+#include "hw.h"
+#include "rates.h"
+
+/*
+ * This table of rates was taken from IEEE 802.11ax Draft v3.3, 28.5. Parameters
+ * for HE-HE_MCSs. The units are 1/10 Mbs. Note that we don't support DCM, so it is
+ * not taken into account in this table.
+ */
+const u16 data_rate_he_x10[CHNL_BW_MAX][WRS_SS_MAX][WRS_MCS_MAX_HE][WRS_GI_MAX_HE] = {
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_0][WRS_GI_LONG]     = 73,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_0][WRS_GI_SHORT]    = 81,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_0][WRS_GI_VSHORT]   = 86,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_1][WRS_GI_LONG]     = 146,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_1][WRS_GI_SHORT]    = 163,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_1][WRS_GI_VSHORT]   = 172,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_2][WRS_GI_LONG]     = 219,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_2][WRS_GI_SHORT]    = 244,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_2][WRS_GI_VSHORT]   = 258,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_3][WRS_GI_LONG]     = 293,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_3][WRS_GI_SHORT]    = 325,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_3][WRS_GI_VSHORT]   = 344,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_4][WRS_GI_LONG]     = 439,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_4][WRS_GI_SHORT]    = 488,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_4][WRS_GI_VSHORT]   = 516,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_5][WRS_GI_LONG]     = 585,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_5][WRS_GI_SHORT]    = 650,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_5][WRS_GI_VSHORT]   = 688,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_6][WRS_GI_LONG]     = 658,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_6][WRS_GI_SHORT]    = 731,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_6][WRS_GI_VSHORT]   = 774,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_7][WRS_GI_LONG]     = 731,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_7][WRS_GI_SHORT]    = 813,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_7][WRS_GI_VSHORT]   = 860,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_8][WRS_GI_LONG]     = 878,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_8][WRS_GI_SHORT]    = 975,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_8][WRS_GI_VSHORT]   = 1032,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_9][WRS_GI_LONG]     = 975,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_9][WRS_GI_SHORT]    = 1083,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_9][WRS_GI_VSHORT]   = 1147,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_10][WRS_GI_LONG]    = 1097,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_10][WRS_GI_SHORT]   = 1219,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_10][WRS_GI_VSHORT]  = 1290,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_11][WRS_GI_LONG]    = 1219,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_11][WRS_GI_SHORT]   = 1354,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_11][WRS_GI_VSHORT]  = 1434,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_0][WRS_GI_LONG]     = 146,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_0][WRS_GI_SHORT]    = 163,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_0][WRS_GI_VSHORT]   = 172,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_1][WRS_GI_LONG]     = 293,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_1][WRS_GI_SHORT]    = 325,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_1][WRS_GI_VSHORT]   = 344,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_2][WRS_GI_LONG]     = 439,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_2][WRS_GI_SHORT]    = 488,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_2][WRS_GI_VSHORT]   = 516,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_3][WRS_GI_LONG]     = 585,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_3][WRS_GI_SHORT]    = 650,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_3][WRS_GI_VSHORT]   = 688,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_4][WRS_GI_LONG]     = 878,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_4][WRS_GI_SHORT]    = 975,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_4][WRS_GI_VSHORT]   = 1032,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_5][WRS_GI_LONG]     = 1170,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_5][WRS_GI_SHORT]    = 1300,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_5][WRS_GI_VSHORT]   = 1376,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_6][WRS_GI_LONG]     = 1316,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_6][WRS_GI_SHORT]    = 1463,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_6][WRS_GI_VSHORT]   = 1549,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_7][WRS_GI_LONG]     = 1463,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_7][WRS_GI_SHORT]    = 1625,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_7][WRS_GI_VSHORT]   = 1721,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_8][WRS_GI_LONG]     = 1755,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_8][WRS_GI_SHORT]    = 1950,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_8][WRS_GI_VSHORT]   = 2065,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_9][WRS_GI_LONG]     = 1950,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_9][WRS_GI_SHORT]    = 2167,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_9][WRS_GI_VSHORT]   = 2294,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_10][WRS_GI_LONG]    = 2194,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_10][WRS_GI_SHORT]   = 2438,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_10][WRS_GI_VSHORT]  = 2581,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_11][WRS_GI_LONG]    = 2438,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_11][WRS_GI_SHORT]   = 2708,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_11][WRS_GI_VSHORT]  = 2868,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_0][WRS_GI_LONG]     = 219,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_0][WRS_GI_SHORT]    = 244,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_0][WRS_GI_VSHORT]   = 258,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_1][WRS_GI_LONG]     = 439,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_1][WRS_GI_SHORT]    = 488,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_1][WRS_GI_VSHORT]   = 516,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_2][WRS_GI_LONG]     = 658,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_2][WRS_GI_SHORT]    = 731,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_2][WRS_GI_VSHORT]   = 774,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_3][WRS_GI_LONG]     = 878,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_3][WRS_GI_SHORT]    = 975,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_3][WRS_GI_VSHORT]   = 1032,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_4][WRS_GI_LONG]     = 1316,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_4][WRS_GI_SHORT]    = 1463,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_4][WRS_GI_VSHORT]   = 1549,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_5][WRS_GI_LONG]     = 1755,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_5][WRS_GI_SHORT]    = 1950,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_5][WRS_GI_VSHORT]   = 2065,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_6][WRS_GI_LONG]     = 1974,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_6][WRS_GI_SHORT]    = 2194,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_6][WRS_GI_VSHORT]   = 2323,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_7][WRS_GI_LONG]     = 2194,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_7][WRS_GI_SHORT]    = 2438,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_7][WRS_GI_VSHORT]   = 2581,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_8][WRS_GI_LONG]     = 2633,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_8][WRS_GI_SHORT]    = 2925,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_8][WRS_GI_VSHORT]   = 3097,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_9][WRS_GI_LONG]     = 2925,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_9][WRS_GI_SHORT]    = 3250,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_9][WRS_GI_VSHORT]   = 3441,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_10][WRS_GI_LONG]    = 3291,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_10][WRS_GI_SHORT]   = 3656,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_10][WRS_GI_VSHORT]  = 3871,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_11][WRS_GI_LONG]    = 3656,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_11][WRS_GI_SHORT]   = 4063,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_11][WRS_GI_VSHORT]  = 4301,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_0][WRS_GI_LONG]     = 293,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_0][WRS_GI_SHORT]    = 325,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_0][WRS_GI_VSHORT]   = 344,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_1][WRS_GI_LONG]     = 585,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_1][WRS_GI_SHORT]    = 650,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_1][WRS_GI_VSHORT]   = 688,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_2][WRS_GI_LONG]     = 878,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_2][WRS_GI_SHORT]    = 975,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_2][WRS_GI_VSHORT]   = 1032,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_3][WRS_GI_LONG]     = 1170,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_3][WRS_GI_SHORT]    = 1300,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_3][WRS_GI_VSHORT]   = 1376,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_4][WRS_GI_LONG]     = 1755,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_4][WRS_GI_SHORT]    = 1950,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_4][WRS_GI_VSHORT]   = 2065,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_5][WRS_GI_LONG]     = 2340,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_5][WRS_GI_SHORT]    = 2600,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_5][WRS_GI_VSHORT]   = 2753,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_6][WRS_GI_LONG]     = 2633,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_6][WRS_GI_SHORT]    = 2925,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_6][WRS_GI_VSHORT]   = 3097,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_7][WRS_GI_LONG]     = 2925,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_7][WRS_GI_SHORT]    = 3250,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_7][WRS_GI_VSHORT]   = 3441,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_8][WRS_GI_LONG]     = 3510,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_8][WRS_GI_SHORT]    = 3900,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_8][WRS_GI_VSHORT]   = 4129,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_9][WRS_GI_LONG]     = 3900,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_9][WRS_GI_SHORT]    = 4333,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_9][WRS_GI_VSHORT]   = 4588,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_10][WRS_GI_LONG]    = 4388,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_10][WRS_GI_SHORT]   = 4875,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_10][WRS_GI_VSHORT]  = 5162,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_11][WRS_GI_LONG]    = 4875,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_11][WRS_GI_SHORT]   = 5417,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_11][WRS_GI_VSHORT]  = 5735,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_0][WRS_GI_LONG]     = 146,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_0][WRS_GI_SHORT]    = 163,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_0][WRS_GI_VSHORT]   = 172,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_1][WRS_GI_LONG]     = 293,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_1][WRS_GI_SHORT]    = 325,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_1][WRS_GI_VSHORT]   = 344,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_2][WRS_GI_LONG]     = 439,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_2][WRS_GI_SHORT]    = 488,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_2][WRS_GI_VSHORT]   = 516,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_3][WRS_GI_LONG]     = 585,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_3][WRS_GI_SHORT]    = 650,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_3][WRS_GI_VSHORT]   = 688,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_4][WRS_GI_LONG]     = 878,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_4][WRS_GI_SHORT]    = 975,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_4][WRS_GI_VSHORT]   = 1032,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_5][WRS_GI_LONG]     = 1170,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_5][WRS_GI_SHORT]    = 1300,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_5][WRS_GI_VSHORT]   = 1376,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_6][WRS_GI_LONG]     = 1316,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_6][WRS_GI_SHORT]    = 1463,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_6][WRS_GI_VSHORT]   = 1549,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_7][WRS_GI_LONG]     = 1463,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_7][WRS_GI_SHORT]    = 1625,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_7][WRS_GI_VSHORT]   = 1721,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_8][WRS_GI_LONG]     = 1755,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_8][WRS_GI_SHORT]    = 1950,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_8][WRS_GI_VSHORT]   = 2065,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_9][WRS_GI_LONG]     = 1950,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_9][WRS_GI_SHORT]    = 2167,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_9][WRS_GI_VSHORT]   = 2294,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_10][WRS_GI_LONG]    = 2194,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_10][WRS_GI_SHORT]   = 2438,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_10][WRS_GI_VSHORT]  = 2581,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_11][WRS_GI_LONG]    = 2438,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_11][WRS_GI_SHORT]   = 2708,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_11][WRS_GI_VSHORT]  = 2868,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_0][WRS_GI_LONG]     = 293,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_0][WRS_GI_SHORT]    = 325,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_0][WRS_GI_VSHORT]   = 344,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_1][WRS_GI_LONG]     = 585,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_1][WRS_GI_SHORT]    = 650,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_1][WRS_GI_VSHORT]   = 688,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_2][WRS_GI_LONG]     = 878,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_2][WRS_GI_SHORT]    = 975,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_2][WRS_GI_VSHORT]   = 1032,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_3][WRS_GI_LONG]     = 1170,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_3][WRS_GI_SHORT]    = 1300,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_3][WRS_GI_VSHORT]   = 1376,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_4][WRS_GI_LONG]     = 1755,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_4][WRS_GI_SHORT]    = 1950,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_4][WRS_GI_VSHORT]   = 2065,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_5][WRS_GI_LONG]     = 2340,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_5][WRS_GI_SHORT]    = 2600,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_5][WRS_GI_VSHORT]   = 2753,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_6][WRS_GI_LONG]     = 2633,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_6][WRS_GI_SHORT]    = 2925,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_6][WRS_GI_VSHORT]   = 3097,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_7][WRS_GI_LONG]     = 2925,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_7][WRS_GI_SHORT]    = 3250,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_7][WRS_GI_VSHORT]   = 3441,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_8][WRS_GI_LONG]     = 3510,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_8][WRS_GI_SHORT]    = 3900,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_8][WRS_GI_VSHORT]   = 4129,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_9][WRS_GI_LONG]     = 3900,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_9][WRS_GI_SHORT]    = 4333,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_9][WRS_GI_VSHORT]   = 4588,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_10][WRS_GI_LONG]    = 4388,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_10][WRS_GI_SHORT]   = 4875,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_10][WRS_GI_VSHORT]  = 5162,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_11][WRS_GI_LONG]    = 4875,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_11][WRS_GI_SHORT]   = 5417,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_11][WRS_GI_VSHORT]  = 5735,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_0][WRS_GI_LONG]     = 439,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_0][WRS_GI_SHORT]    = 488,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_0][WRS_GI_VSHORT]   = 516,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_1][WRS_GI_LONG]     = 878,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_1][WRS_GI_SHORT]    = 975,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_1][WRS_GI_VSHORT]   = 1032,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_2][WRS_GI_LONG]     = 1316,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_2][WRS_GI_SHORT]    = 1463,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_2][WRS_GI_VSHORT]   = 1549,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_3][WRS_GI_LONG]     = 1755,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_3][WRS_GI_SHORT]    = 1950,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_3][WRS_GI_VSHORT]   = 2065,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_4][WRS_GI_LONG]     = 2633,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_4][WRS_GI_SHORT]    = 2925,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_4][WRS_GI_VSHORT]   = 3097,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_5][WRS_GI_LONG]     = 3510,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_5][WRS_GI_SHORT]    = 3900,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_5][WRS_GI_VSHORT]   = 4129,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_6][WRS_GI_LONG]     = 3949,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_6][WRS_GI_SHORT]    = 4388,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_6][WRS_GI_VSHORT]   = 4646,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_7][WRS_GI_LONG]     = 4388,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_7][WRS_GI_SHORT]    = 4875,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_7][WRS_GI_VSHORT]   = 5162,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_8][WRS_GI_LONG]     = 5265,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_8][WRS_GI_SHORT]    = 5850,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_8][WRS_GI_VSHORT]   = 6194,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_9][WRS_GI_LONG]     = 5850,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_9][WRS_GI_SHORT]    = 6500,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_9][WRS_GI_VSHORT]   = 6882,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_10][WRS_GI_LONG]    = 6581,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_10][WRS_GI_SHORT]   = 7313,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_10][WRS_GI_VSHORT]  = 7743,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_11][WRS_GI_LONG]    = 7313,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_11][WRS_GI_SHORT]   = 8125,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_11][WRS_GI_VSHORT]  = 8603,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_0][WRS_GI_LONG]     = 585,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_0][WRS_GI_SHORT]    = 650,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_0][WRS_GI_VSHORT]   = 688,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_1][WRS_GI_LONG]     = 1170,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_1][WRS_GI_SHORT]    = 1300,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_1][WRS_GI_VSHORT]   = 1376,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_2][WRS_GI_LONG]     = 1755,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_2][WRS_GI_SHORT]    = 1950,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_2][WRS_GI_VSHORT]   = 2065,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_3][WRS_GI_LONG]     = 2340,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_3][WRS_GI_SHORT]    = 2600,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_3][WRS_GI_VSHORT]   = 2753,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_4][WRS_GI_LONG]     = 3510,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_4][WRS_GI_SHORT]    = 3900,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_4][WRS_GI_VSHORT]   = 4129,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_5][WRS_GI_LONG]     = 4680,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_5][WRS_GI_SHORT]    = 5200,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_5][WRS_GI_VSHORT]   = 5506,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_6][WRS_GI_LONG]     = 5265,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_6][WRS_GI_SHORT]    = 5850,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_6][WRS_GI_VSHORT]   = 6194,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_7][WRS_GI_LONG]     = 5850,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_7][WRS_GI_SHORT]    = 6500,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_7][WRS_GI_VSHORT]   = 6882,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_8][WRS_GI_LONG]     = 7020,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_8][WRS_GI_SHORT]    = 7800,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_8][WRS_GI_VSHORT]   = 8259,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_9][WRS_GI_LONG]     = 7800,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_9][WRS_GI_SHORT]    = 8667,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_9][WRS_GI_VSHORT]   = 9176,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_10][WRS_GI_LONG]    = 8775,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_10][WRS_GI_SHORT]   = 9750,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_10][WRS_GI_VSHORT]  = 10324,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_11][WRS_GI_LONG]    = 9750,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_11][WRS_GI_SHORT]   = 10833,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_11][WRS_GI_VSHORT]  = 11471,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_0][WRS_GI_LONG]     = 306,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_0][WRS_GI_SHORT]    = 340,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_0][WRS_GI_VSHORT]   = 360,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_1][WRS_GI_LONG]     = 613,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_1][WRS_GI_SHORT]    = 681,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_1][WRS_GI_VSHORT]   = 721,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_2][WRS_GI_LONG]     = 919,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_2][WRS_GI_SHORT]    = 1021,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_2][WRS_GI_VSHORT]   = 1081,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_3][WRS_GI_LONG]     = 1225,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_3][WRS_GI_SHORT]    = 1361,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_3][WRS_GI_VSHORT]   = 1441,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_4][WRS_GI_LONG]     = 1838,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_4][WRS_GI_SHORT]    = 2042,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_4][WRS_GI_VSHORT]   = 2162,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_5][WRS_GI_LONG]     = 2450,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_5][WRS_GI_SHORT]    = 2722,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_5][WRS_GI_VSHORT]   = 2882,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_6][WRS_GI_LONG]     = 2756,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_6][WRS_GI_SHORT]    = 3063,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_6][WRS_GI_VSHORT]   = 3243,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_7][WRS_GI_LONG]     = 3063,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_7][WRS_GI_SHORT]    = 3403,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_7][WRS_GI_VSHORT]   = 3603,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_8][WRS_GI_LONG]     = 3675,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_8][WRS_GI_SHORT]    = 4083,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_8][WRS_GI_VSHORT]   = 4324,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_9][WRS_GI_LONG]     = 4083,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_9][WRS_GI_SHORT]    = 4537,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_9][WRS_GI_VSHORT]   = 4804,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_10][WRS_GI_LONG]    = 4594,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_10][WRS_GI_SHORT]   = 5104,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_10][WRS_GI_VSHORT]  = 5404,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_11][WRS_GI_LONG]    = 5104,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_11][WRS_GI_SHORT]   = 5671,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_11][WRS_GI_VSHORT]  = 6004,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_0][WRS_GI_LONG]     = 613,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_0][WRS_GI_SHORT]    = 681,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_0][WRS_GI_VSHORT]   = 721,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_1][WRS_GI_LONG]     = 1225,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_1][WRS_GI_SHORT]    = 1361,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_1][WRS_GI_VSHORT]   = 1441,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_2][WRS_GI_LONG]     = 1838,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_2][WRS_GI_SHORT]    = 2042,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_2][WRS_GI_VSHORT]   = 2162,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_3][WRS_GI_LONG]     = 2450,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_3][WRS_GI_SHORT]    = 2722,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_3][WRS_GI_VSHORT]   = 2882,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_4][WRS_GI_LONG]     = 3675,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_4][WRS_GI_SHORT]    = 4083,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_4][WRS_GI_VSHORT]   = 4324,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_5][WRS_GI_LONG]     = 4900,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_5][WRS_GI_SHORT]    = 5444,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_5][WRS_GI_VSHORT]   = 5765,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_6][WRS_GI_LONG]     = 5513,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_6][WRS_GI_SHORT]    = 6125,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_6][WRS_GI_VSHORT]   = 6485,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_7][WRS_GI_LONG]     = 6125,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_7][WRS_GI_SHORT]    = 6806,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_7][WRS_GI_VSHORT]   = 7206,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_8][WRS_GI_LONG]     = 7350,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_8][WRS_GI_SHORT]    = 8167,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_8][WRS_GI_VSHORT]   = 8647,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_9][WRS_GI_LONG]     = 8166,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_9][WRS_GI_SHORT]    = 9074,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_9][WRS_GI_VSHORT]   = 9607,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_10][WRS_GI_LONG]    = 9188,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_10][WRS_GI_SHORT]   = 10208,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_10][WRS_GI_VSHORT]  = 10809,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_11][WRS_GI_LONG]    = 10208,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_11][WRS_GI_SHORT]   = 11343,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_11][WRS_GI_VSHORT]  = 12010,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_0][WRS_GI_LONG]     = 919,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_0][WRS_GI_SHORT]    = 1021,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_0][WRS_GI_VSHORT]   = 1081,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_1][WRS_GI_LONG]     = 1838,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_1][WRS_GI_SHORT]    = 2042,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_1][WRS_GI_VSHORT]   = 2162,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_2][WRS_GI_LONG]     = 2756,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_2][WRS_GI_SHORT]    = 3063,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_2][WRS_GI_VSHORT]   = 3243,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_3][WRS_GI_LONG]     = 3675,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_3][WRS_GI_SHORT]    = 4083,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_3][WRS_GI_VSHORT]   = 4324,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_4][WRS_GI_LONG]     = 5513,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_4][WRS_GI_SHORT]    = 6125,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_4][WRS_GI_VSHORT]   = 6485,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_5][WRS_GI_LONG]     = 7350,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_5][WRS_GI_SHORT]    = 8167,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_5][WRS_GI_VSHORT]   = 8647,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_6][WRS_GI_LONG]     = 8269,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_6][WRS_GI_SHORT]    = 9188,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_6][WRS_GI_VSHORT]   = 9728,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_7][WRS_GI_LONG]     = 9188,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_7][WRS_GI_SHORT]    = 10208,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_7][WRS_GI_VSHORT]   = 10809,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_8][WRS_GI_LONG]     = 11025,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_8][WRS_GI_SHORT]    = 12250,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_8][WRS_GI_VSHORT]   = 12971,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_9][WRS_GI_LONG]     = 12250,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_9][WRS_GI_SHORT]    = 13611,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_9][WRS_GI_VSHORT]   = 14412,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_10][WRS_GI_LONG]    = 13781,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_10][WRS_GI_SHORT]   = 15313,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_10][WRS_GI_VSHORT]  = 16213,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_11][WRS_GI_LONG]    = 15313,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_11][WRS_GI_SHORT]   = 17014,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_11][WRS_GI_VSHORT]  = 18015,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_0][WRS_GI_LONG]     = 1225,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_0][WRS_GI_SHORT]    = 1361,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_0][WRS_GI_VSHORT]   = 1441,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_1][WRS_GI_LONG]     = 2450,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_1][WRS_GI_SHORT]    = 2722,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_1][WRS_GI_VSHORT]   = 2882,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_2][WRS_GI_LONG]     = 3675,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_2][WRS_GI_SHORT]    = 4083,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_2][WRS_GI_VSHORT]   = 4324,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_3][WRS_GI_LONG]     = 4900,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_3][WRS_GI_SHORT]    = 5444,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_3][WRS_GI_VSHORT]   = 5765,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_4][WRS_GI_LONG]     = 7350,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_4][WRS_GI_SHORT]    = 8167,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_4][WRS_GI_VSHORT]   = 8647,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_5][WRS_GI_LONG]     = 9800,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_5][WRS_GI_SHORT]    = 10889,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_5][WRS_GI_VSHORT]   = 11529,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_6][WRS_GI_LONG]     = 11025,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_6][WRS_GI_SHORT]    = 12250,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_6][WRS_GI_VSHORT]   = 12971,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_7][WRS_GI_LONG]     = 12250,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_7][WRS_GI_SHORT]    = 13611,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_7][WRS_GI_VSHORT]   = 14412,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_8][WRS_GI_LONG]     = 14700,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_8][WRS_GI_SHORT]    = 16333,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_8][WRS_GI_VSHORT]   = 17294,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_9][WRS_GI_LONG]     = 16333,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_9][WRS_GI_SHORT]    = 18148,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_9][WRS_GI_VSHORT]   = 19215,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_10][WRS_GI_LONG]    = 18375,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_10][WRS_GI_SHORT]   = 20417,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_10][WRS_GI_VSHORT]  = 21618,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_11][WRS_GI_LONG]    = 20416,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_11][WRS_GI_SHORT]   = 22685,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_11][WRS_GI_VSHORT]  = 24019,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_0][WRS_GI_LONG]    = 613,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_0][WRS_GI_SHORT]   = 681,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_0][WRS_GI_VSHORT]  = 721,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_1][WRS_GI_LONG]    = 1225,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_1][WRS_GI_SHORT]   = 1361,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_1][WRS_GI_VSHORT]  = 1441,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_2][WRS_GI_LONG]    = 1838,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_2][WRS_GI_SHORT]   = 2042,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_2][WRS_GI_VSHORT]  = 2162,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_3][WRS_GI_LONG]    = 2450,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_3][WRS_GI_SHORT]   = 2722,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_3][WRS_GI_VSHORT]  = 2882,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_4][WRS_GI_LONG]    = 3675,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_4][WRS_GI_SHORT]   = 4083,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_4][WRS_GI_VSHORT]  = 4324,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_5][WRS_GI_LONG]    = 4900,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_5][WRS_GI_SHORT]   = 5444,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_5][WRS_GI_VSHORT]  = 5765,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_6][WRS_GI_LONG]    = 5513,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_6][WRS_GI_SHORT]   = 6125,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_6][WRS_GI_VSHORT]  = 6485,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_7][WRS_GI_LONG]    = 6125,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_7][WRS_GI_SHORT]   = 6806,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_7][WRS_GI_VSHORT]  = 7206,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_8][WRS_GI_LONG]    = 7350,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_8][WRS_GI_SHORT]   = 8167,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_8][WRS_GI_VSHORT]  = 8647,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_9][WRS_GI_LONG]    = 8166,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_9][WRS_GI_SHORT]   = 9074,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_9][WRS_GI_VSHORT]  = 9607,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_10][WRS_GI_LONG]   = 9188,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_10][WRS_GI_SHORT]  = 10208,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_10][WRS_GI_VSHORT] = 10809,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_11][WRS_GI_LONG]   = 10208,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_11][WRS_GI_SHORT]  = 11342,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_11][WRS_GI_VSHORT] = 12010,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_0][WRS_GI_LONG]    = 1225,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_0][WRS_GI_SHORT]   = 1361,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_0][WRS_GI_VSHORT]  = 1441,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_1][WRS_GI_LONG]    = 2450,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_1][WRS_GI_SHORT]   = 2722,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_1][WRS_GI_VSHORT]  = 2882,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_2][WRS_GI_LONG]    = 3675,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_2][WRS_GI_SHORT]   = 4083,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_2][WRS_GI_VSHORT]  = 4324,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_3][WRS_GI_LONG]    = 4900,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_3][WRS_GI_SHORT]   = 5444,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_3][WRS_GI_VSHORT]  = 5765,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_4][WRS_GI_LONG]    = 7350,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_4][WRS_GI_SHORT]   = 8167,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_4][WRS_GI_VSHORT]  = 8647,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_5][WRS_GI_LONG]    = 9800,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_5][WRS_GI_SHORT]   = 10889,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_5][WRS_GI_VSHORT]  = 11529,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_6][WRS_GI_LONG]    = 11025,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_6][WRS_GI_SHORT]   = 12250,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_6][WRS_GI_VSHORT]  = 12971,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_7][WRS_GI_LONG]    = 12250,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_7][WRS_GI_SHORT]   = 13611,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_7][WRS_GI_VSHORT]  = 14412,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_8][WRS_GI_LONG]    = 14700,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_8][WRS_GI_SHORT]   = 16333,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_8][WRS_GI_VSHORT]  = 17294,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_9][WRS_GI_LONG]    = 16333,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_9][WRS_GI_SHORT]   = 18148,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_9][WRS_GI_VSHORT]  = 19215,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_10][WRS_GI_LONG]   = 18375,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_10][WRS_GI_SHORT]  = 20417,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_10][WRS_GI_VSHORT] = 21618,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_11][WRS_GI_LONG]   = 20416,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_11][WRS_GI_SHORT]  = 22685,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_11][WRS_GI_VSHORT] = 24019,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_0][WRS_GI_LONG]    = 1838,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_0][WRS_GI_SHORT]   = 2042,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_0][WRS_GI_VSHORT]  = 2162,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_1][WRS_GI_LONG]    = 3675,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_1][WRS_GI_SHORT]   = 4083,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_1][WRS_GI_VSHORT]  = 4324,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_2][WRS_GI_LONG]    = 5513,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_2][WRS_GI_SHORT]   = 6125,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_2][WRS_GI_VSHORT]  = 6485,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_3][WRS_GI_LONG]    = 7350,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_3][WRS_GI_SHORT]   = 8167,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_3][WRS_GI_VSHORT]  = 8647,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_4][WRS_GI_LONG]    = 11025,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_4][WRS_GI_SHORT]   = 12250,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_4][WRS_GI_VSHORT]  = 12971,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_5][WRS_GI_LONG]    = 14700,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_5][WRS_GI_SHORT]   = 16333,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_5][WRS_GI_VSHORT]  = 17294,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_6][WRS_GI_LONG]    = 16538,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_6][WRS_GI_SHORT]   = 18375,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_6][WRS_GI_VSHORT]  = 19456,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_7][WRS_GI_LONG]    = 18375,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_7][WRS_GI_SHORT]   = 20417,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_7][WRS_GI_VSHORT]  = 21618,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_8][WRS_GI_LONG]    = 22050,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_8][WRS_GI_SHORT]   = 24500,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_8][WRS_GI_VSHORT]  = 25941,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_9][WRS_GI_LONG]    = 24500,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_9][WRS_GI_SHORT]   = 27222,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_9][WRS_GI_VSHORT]  = 28824,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_10][WRS_GI_LONG]   = 27563,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_10][WRS_GI_SHORT]  = 30625,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_10][WRS_GI_VSHORT] = 32426,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_11][WRS_GI_LONG]   = 30625,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_11][WRS_GI_SHORT]  = 34028,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_11][WRS_GI_VSHORT] = 36029,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_0][WRS_GI_LONG]    = 2450,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_0][WRS_GI_SHORT]   = 2722,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_0][WRS_GI_VSHORT]  = 2882,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_1][WRS_GI_LONG]    = 4900,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_1][WRS_GI_SHORT]   = 5444,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_1][WRS_GI_VSHORT]  = 5765,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_2][WRS_GI_LONG]    = 7350,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_2][WRS_GI_SHORT]   = 8167,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_2][WRS_GI_VSHORT]  = 8647,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_3][WRS_GI_LONG]    = 9800,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_3][WRS_GI_SHORT]   = 10889,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_3][WRS_GI_VSHORT]  = 11529,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_4][WRS_GI_LONG]    = 14700,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_4][WRS_GI_SHORT]   = 16333,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_4][WRS_GI_VSHORT]  = 17294,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_5][WRS_GI_LONG]    = 19600,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_5][WRS_GI_SHORT]   = 21778,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_5][WRS_GI_VSHORT]  = 23059,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_6][WRS_GI_LONG]    = 22050,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_6][WRS_GI_SHORT]   = 24500,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_6][WRS_GI_VSHORT]  = 25941,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_7][WRS_GI_LONG]    = 24500,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_7][WRS_GI_SHORT]   = 27222,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_7][WRS_GI_VSHORT]  = 28824,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_8][WRS_GI_LONG]    = 29400,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_8][WRS_GI_SHORT]   = 32667,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_8][WRS_GI_VSHORT]  = 34588,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_9][WRS_GI_LONG]    = 32666,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_9][WRS_GI_SHORT]   = 36296,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_9][WRS_GI_VSHORT]  = 38431,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_10][WRS_GI_LONG]   = 36750,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_10][WRS_GI_SHORT]  = 40833,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_10][WRS_GI_VSHORT] = 43235,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_11][WRS_GI_LONG]   = 40833,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_11][WRS_GI_SHORT]  = 45370,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_11][WRS_GI_VSHORT] = 48039,
+};
+
+/*
+ * This table of rates was taken from IEEE Std 802.11TM-2016, 21.5 Parameters
+ * for VHT-MCSs. The units are 1/10 Mbs. Invalid combinations are with 0's. Note
+ * that HT data rates are a subset of VHT data rates, so we can use a single
+ * table for both.
+ */
+const u16 data_rate_ht_vht_x10[CHNL_BW_MAX][WRS_SS_MAX][WRS_MCS_MAX_VHT][WRS_GI_MAX_VHT] = {
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_0][WRS_GI_LONG]   = 65,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_0][WRS_GI_SHORT]  = 72,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_1][WRS_GI_LONG]   = 130,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_1][WRS_GI_SHORT]  = 144,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_2][WRS_GI_LONG]   = 195,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_2][WRS_GI_SHORT]  = 217,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_3][WRS_GI_LONG]   = 260,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_3][WRS_GI_SHORT]  = 289,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_4][WRS_GI_LONG]   = 390,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_4][WRS_GI_SHORT]  = 433,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_5][WRS_GI_LONG]   = 520,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_5][WRS_GI_SHORT]  = 578,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_6][WRS_GI_LONG]   = 585,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_6][WRS_GI_SHORT]  = 650,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_7][WRS_GI_LONG]   = 650,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_7][WRS_GI_SHORT]  = 722,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_8][WRS_GI_LONG]   = 780,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_8][WRS_GI_SHORT]  = 867,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_9][WRS_GI_LONG]   = 0,
+	[CHNL_BW_20][WRS_SS_1][WRS_MCS_9][WRS_GI_SHORT]  = 0,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_0][WRS_GI_LONG]   = 130,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_0][WRS_GI_SHORT]  = 144,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_1][WRS_GI_LONG]   = 260,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_1][WRS_GI_SHORT]  = 289,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_2][WRS_GI_LONG]   = 390,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_2][WRS_GI_SHORT]  = 433,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_3][WRS_GI_LONG]   = 520,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_3][WRS_GI_SHORT]  = 578,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_4][WRS_GI_LONG]   = 780,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_4][WRS_GI_SHORT]  = 867,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_5][WRS_GI_LONG]   = 1040,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_5][WRS_GI_SHORT]  = 1156,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_6][WRS_GI_LONG]   = 1170,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_6][WRS_GI_SHORT]  = 1303,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_7][WRS_GI_LONG]   = 1300,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_7][WRS_GI_SHORT]  = 1444,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_8][WRS_GI_LONG]   = 1560,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_8][WRS_GI_SHORT]  = 1733,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_9][WRS_GI_LONG]   = 0,
+	[CHNL_BW_20][WRS_SS_2][WRS_MCS_9][WRS_GI_SHORT]  = 0,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_0][WRS_GI_LONG]   = 195,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_0][WRS_GI_SHORT]  = 217,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_1][WRS_GI_LONG]   = 390,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_1][WRS_GI_SHORT]  = 433,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_2][WRS_GI_LONG]   = 585,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_2][WRS_GI_SHORT]  = 650,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_3][WRS_GI_LONG]   = 780,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_3][WRS_GI_SHORT]  = 867,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_4][WRS_GI_LONG]   = 1170,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_4][WRS_GI_SHORT]  = 1300,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_5][WRS_GI_LONG]   = 1560,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_5][WRS_GI_SHORT]  = 1733,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_6][WRS_GI_LONG]   = 1755,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_6][WRS_GI_SHORT]  = 1950,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_7][WRS_GI_LONG]   = 1950,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_7][WRS_GI_SHORT]  = 2167,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_8][WRS_GI_LONG]   = 2340,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_8][WRS_GI_SHORT]  = 2600,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_9][WRS_GI_LONG]   = 2600,
+	[CHNL_BW_20][WRS_SS_3][WRS_MCS_9][WRS_GI_SHORT]  = 2889,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_0][WRS_GI_LONG]   = 260,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_0][WRS_GI_SHORT]  = 288,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_1][WRS_GI_LONG]   = 520,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_1][WRS_GI_SHORT]  = 576,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_2][WRS_GI_LONG]   = 780,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_2][WRS_GI_SHORT]  = 868,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_3][WRS_GI_LONG]   = 1040,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_3][WRS_GI_SHORT]  = 1156,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_4][WRS_GI_LONG]   = 1560,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_4][WRS_GI_SHORT]  = 1732,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_5][WRS_GI_LONG]   = 2080,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_5][WRS_GI_SHORT]  = 2312,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_6][WRS_GI_LONG]   = 2340,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_6][WRS_GI_SHORT]  = 2600,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_7][WRS_GI_LONG]   = 2600,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_7][WRS_GI_SHORT]  = 2888,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_8][WRS_GI_LONG]   = 3120,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_8][WRS_GI_SHORT]  = 3468,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_9][WRS_GI_LONG]   = 0,
+	[CHNL_BW_20][WRS_SS_4][WRS_MCS_9][WRS_GI_SHORT]  = 0,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_0][WRS_GI_LONG]   = 135,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_0][WRS_GI_SHORT]  = 150,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_1][WRS_GI_LONG]   = 270,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_1][WRS_GI_SHORT]  = 300,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_2][WRS_GI_LONG]   = 405,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_2][WRS_GI_SHORT]  = 450,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_3][WRS_GI_LONG]   = 540,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_3][WRS_GI_SHORT]  = 600,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_4][WRS_GI_LONG]   = 810,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_4][WRS_GI_SHORT]  = 900,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_5][WRS_GI_LONG]   = 1080,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_5][WRS_GI_SHORT]  = 1200,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_6][WRS_GI_LONG]   = 1215,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_6][WRS_GI_SHORT]  = 1350,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_7][WRS_GI_LONG]   = 1350,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_7][WRS_GI_SHORT]  = 1500,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_8][WRS_GI_LONG]   = 1620,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_8][WRS_GI_SHORT]  = 1800,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_9][WRS_GI_LONG]   = 1800,
+	[CHNL_BW_40][WRS_SS_1][WRS_MCS_9][WRS_GI_SHORT]  = 2000,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_0][WRS_GI_LONG]   = 270,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_0][WRS_GI_SHORT]  = 300,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_1][WRS_GI_LONG]   = 540,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_1][WRS_GI_SHORT]  = 600,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_2][WRS_GI_LONG]   = 810,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_2][WRS_GI_SHORT]  = 900,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_3][WRS_GI_LONG]   = 1080,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_3][WRS_GI_SHORT]  = 1200,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_4][WRS_GI_LONG]   = 1620,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_4][WRS_GI_SHORT]  = 1800,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_5][WRS_GI_LONG]   = 2160,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_5][WRS_GI_SHORT]  = 2400,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_6][WRS_GI_LONG]   = 2430,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_6][WRS_GI_SHORT]  = 2700,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_7][WRS_GI_LONG]   = 2700,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_7][WRS_GI_SHORT]  = 3000,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_8][WRS_GI_LONG]   = 3240,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_8][WRS_GI_SHORT]  = 3600,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_9][WRS_GI_LONG]   = 3600,
+	[CHNL_BW_40][WRS_SS_2][WRS_MCS_9][WRS_GI_SHORT]  = 4000,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_0][WRS_GI_LONG]   = 405,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_0][WRS_GI_SHORT]  = 450,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_1][WRS_GI_LONG]   = 810,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_1][WRS_GI_SHORT]  = 900,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_2][WRS_GI_LONG]   = 1215,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_2][WRS_GI_SHORT]  = 1350,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_3][WRS_GI_LONG]   = 1620,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_3][WRS_GI_SHORT]  = 1800,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_4][WRS_GI_LONG]   = 2430,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_4][WRS_GI_SHORT]  = 2700,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_5][WRS_GI_LONG]   = 3240,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_5][WRS_GI_SHORT]  = 3600,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_6][WRS_GI_LONG]   = 3645,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_6][WRS_GI_SHORT]  = 4050,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_7][WRS_GI_LONG]   = 4050,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_7][WRS_GI_SHORT]  = 4500,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_8][WRS_GI_LONG]   = 4860,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_8][WRS_GI_SHORT]  = 5400,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_9][WRS_GI_LONG]   = 5400,
+	[CHNL_BW_40][WRS_SS_3][WRS_MCS_9][WRS_GI_SHORT]  = 6000,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_0][WRS_GI_LONG]   = 540,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_0][WRS_GI_SHORT]  = 600,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_1][WRS_GI_LONG]   = 1080,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_1][WRS_GI_SHORT]  = 1200,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_2][WRS_GI_LONG]   = 1620,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_2][WRS_GI_SHORT]  = 1800,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_3][WRS_GI_LONG]   = 2160,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_3][WRS_GI_SHORT]  = 2400,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_4][WRS_GI_LONG]   = 3240,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_4][WRS_GI_SHORT]  = 3600,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_5][WRS_GI_LONG]   = 4320,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_5][WRS_GI_SHORT]  = 4800,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_6][WRS_GI_LONG]   = 4860,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_6][WRS_GI_SHORT]  = 5400,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_7][WRS_GI_LONG]   = 5400,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_7][WRS_GI_SHORT]  = 6000,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_8][WRS_GI_LONG]   = 6480,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_8][WRS_GI_SHORT]  = 7200,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_9][WRS_GI_LONG]   = 7200,
+	[CHNL_BW_40][WRS_SS_4][WRS_MCS_9][WRS_GI_SHORT]  = 8000,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_0][WRS_GI_LONG]   = 293,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_0][WRS_GI_SHORT]  = 325,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_1][WRS_GI_LONG]   = 585,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_1][WRS_GI_SHORT]  = 650,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_2][WRS_GI_LONG]   = 878,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_2][WRS_GI_SHORT]  = 975,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_3][WRS_GI_LONG]   = 1170,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_3][WRS_GI_SHORT]  = 1300,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_4][WRS_GI_LONG]   = 1755,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_4][WRS_GI_SHORT]  = 1950,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_5][WRS_GI_LONG]   = 2340,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_5][WRS_GI_SHORT]  = 2600,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_6][WRS_GI_LONG]   = 2633,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_6][WRS_GI_SHORT]  = 2925,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_7][WRS_GI_LONG]   = 2925,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_7][WRS_GI_SHORT]  = 3250,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_8][WRS_GI_LONG]   = 3510,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_8][WRS_GI_SHORT]  = 3900,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_9][WRS_GI_LONG]   = 3900,
+	[CHNL_BW_80][WRS_SS_1][WRS_MCS_9][WRS_GI_SHORT]  = 4333,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_0][WRS_GI_LONG]   = 585,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_0][WRS_GI_SHORT]  = 650,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_1][WRS_GI_LONG]   = 1170,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_1][WRS_GI_SHORT]  = 1300,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_2][WRS_GI_LONG]   = 1755,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_2][WRS_GI_SHORT]  = 1950,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_3][WRS_GI_LONG]   = 2340,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_3][WRS_GI_SHORT]  = 2600,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_4][WRS_GI_LONG]   = 3510,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_4][WRS_GI_SHORT]  = 3900,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_5][WRS_GI_LONG]   = 4680,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_5][WRS_GI_SHORT]  = 5200,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_6][WRS_GI_LONG]   = 5265,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_6][WRS_GI_SHORT]  = 5850,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_7][WRS_GI_LONG]   = 5850,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_7][WRS_GI_SHORT]  = 6500,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_8][WRS_GI_LONG]   = 7020,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_8][WRS_GI_SHORT]  = 7800,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_9][WRS_GI_LONG]   = 7800,
+	[CHNL_BW_80][WRS_SS_2][WRS_MCS_9][WRS_GI_SHORT]  = 8667,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_0][WRS_GI_LONG]   = 878,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_0][WRS_GI_SHORT]  = 975,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_1][WRS_GI_LONG]   = 1755,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_1][WRS_GI_SHORT]  = 1950,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_2][WRS_GI_LONG]   = 2633,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_2][WRS_GI_SHORT]  = 2925,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_3][WRS_GI_LONG]   = 3510,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_3][WRS_GI_SHORT]  = 3900,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_4][WRS_GI_LONG]   = 5265,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_4][WRS_GI_SHORT]  = 5850,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_5][WRS_GI_LONG]   = 7020,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_5][WRS_GI_SHORT]  = 7800,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_6][WRS_GI_LONG]   = 0,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_6][WRS_GI_SHORT]  = 0,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_7][WRS_GI_LONG]   = 8775,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_7][WRS_GI_SHORT]  = 9750,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_8][WRS_GI_LONG]   = 10530,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_8][WRS_GI_SHORT]  = 11700,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_9][WRS_GI_LONG]   = 11700,
+	[CHNL_BW_80][WRS_SS_3][WRS_MCS_9][WRS_GI_SHORT]  = 13000,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_0][WRS_GI_LONG]   = 1172,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_0][WRS_GI_SHORT]  = 1300,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_1][WRS_GI_LONG]   = 2340,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_1][WRS_GI_SHORT]  = 2600,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_2][WRS_GI_LONG]   = 3512,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_2][WRS_GI_SHORT]  = 3900,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_3][WRS_GI_LONG]   = 4680,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_3][WRS_GI_SHORT]  = 5200,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_4][WRS_GI_LONG]   = 7020,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_4][WRS_GI_SHORT]  = 7800,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_5][WRS_GI_LONG]   = 9360,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_5][WRS_GI_SHORT]  = 10400,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_6][WRS_GI_LONG]   = 10532,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_6][WRS_GI_SHORT]  = 11700,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_7][WRS_GI_LONG]   = 11700,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_7][WRS_GI_SHORT]  = 13000,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_8][WRS_GI_LONG]   = 14040,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_8][WRS_GI_SHORT]  = 15600,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_9][WRS_GI_LONG]   = 15600,
+	[CHNL_BW_80][WRS_SS_4][WRS_MCS_9][WRS_GI_SHORT]  = 17332,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_0][WRS_GI_LONG]  = 585,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_0][WRS_GI_SHORT] = 650,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_1][WRS_GI_LONG]  = 1170,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_1][WRS_GI_SHORT] = 1300,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_2][WRS_GI_LONG]  = 1755,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_2][WRS_GI_SHORT] = 1950,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_3][WRS_GI_LONG]  = 2340,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_3][WRS_GI_SHORT] = 2600,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_4][WRS_GI_LONG]  = 3510,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_4][WRS_GI_SHORT] = 3900,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_5][WRS_GI_LONG]  = 4680,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_5][WRS_GI_SHORT] = 5200,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_6][WRS_GI_LONG]  = 5265,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_6][WRS_GI_SHORT] = 5850,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_7][WRS_GI_LONG]  = 5850,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_7][WRS_GI_SHORT] = 6500,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_8][WRS_GI_LONG]  = 7020,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_8][WRS_GI_SHORT] = 7800,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_9][WRS_GI_LONG]  = 7800,
+	[CHNL_BW_160][WRS_SS_1][WRS_MCS_9][WRS_GI_SHORT] = 8667,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_0][WRS_GI_LONG]  = 1170,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_0][WRS_GI_SHORT] = 1300,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_1][WRS_GI_LONG]  = 2340,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_1][WRS_GI_SHORT] = 2600,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_2][WRS_GI_LONG]  = 3510,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_2][WRS_GI_SHORT] = 3900,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_3][WRS_GI_LONG]  = 4680,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_3][WRS_GI_SHORT] = 5200,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_4][WRS_GI_LONG]  = 7020,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_4][WRS_GI_SHORT] = 7800,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_5][WRS_GI_LONG]  = 9360,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_5][WRS_GI_SHORT] = 10400,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_6][WRS_GI_LONG]  = 10530,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_6][WRS_GI_SHORT] = 11700,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_7][WRS_GI_LONG]  = 11700,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_7][WRS_GI_SHORT] = 13000,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_8][WRS_GI_LONG]  = 14040,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_8][WRS_GI_SHORT] = 15600,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_9][WRS_GI_LONG]  = 15600,
+	[CHNL_BW_160][WRS_SS_2][WRS_MCS_9][WRS_GI_SHORT] = 17333,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_0][WRS_GI_LONG]  = 1755,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_0][WRS_GI_SHORT] = 1950,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_1][WRS_GI_LONG]  = 3510,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_1][WRS_GI_SHORT] = 3900,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_2][WRS_GI_LONG]  = 5265,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_2][WRS_GI_SHORT] = 5850,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_3][WRS_GI_LONG]  = 7020,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_3][WRS_GI_SHORT] = 7800,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_4][WRS_GI_LONG]  = 10530,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_4][WRS_GI_SHORT] = 11700,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_5][WRS_GI_LONG]  = 14040,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_5][WRS_GI_SHORT] = 15600,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_6][WRS_GI_LONG]  = 15795,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_6][WRS_GI_SHORT] = 17550,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_7][WRS_GI_LONG]  = 17550,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_7][WRS_GI_SHORT] = 19500,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_8][WRS_GI_LONG]  = 21060,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_8][WRS_GI_SHORT] = 23400,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_9][WRS_GI_LONG]  = 0,
+	[CHNL_BW_160][WRS_SS_3][WRS_MCS_9][WRS_GI_SHORT] = 0,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_0][WRS_GI_LONG]  = 2340,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_0][WRS_GI_SHORT] = 2600,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_1][WRS_GI_LONG]  = 4680,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_1][WRS_GI_SHORT] = 5200,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_2][WRS_GI_LONG]  = 7020,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_2][WRS_GI_SHORT] = 7800,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_3][WRS_GI_LONG]  = 9360,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_3][WRS_GI_SHORT] = 10400,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_4][WRS_GI_LONG]  = 10400,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_4][WRS_GI_SHORT] = 15600,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_5][WRS_GI_LONG]  = 18720,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_5][WRS_GI_SHORT] = 20800,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_6][WRS_GI_LONG]  = 21060,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_6][WRS_GI_SHORT] = 23400,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_7][WRS_GI_LONG]  = 23400,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_7][WRS_GI_SHORT] = 26000,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_8][WRS_GI_LONG]  = 28080,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_8][WRS_GI_SHORT] = 31200,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_9][WRS_GI_LONG]  = 31200,
+	[CHNL_BW_160][WRS_SS_4][WRS_MCS_9][WRS_GI_SHORT] = 34667,
+};
+
+/* OFDM Data Rates - (multiplied by 10) */
+const u16 data_rate_ofdm_x10[] = {
+	60,
+	90,
+	120,
+	180,
+	240,
+	360,
+	480,
+	540,
+};
+
+/* CCK Data Rates - (multiplied by 10) */
+const u16 data_rate_cck_x10[] = {
+	10,
+	20,
+	55,
+	110,
+};
+
+struct cl_inverse_data_rate inverse_data_rate;
+
+static u16 cl_data_rates_inverse_he(u8 bw, u8 nss, u8 mcs, u8 gi)
+{
+	return (80 << DATA_RATE_INVERSE_Q) / data_rate_he_x10[bw][nss][mcs][gi];
+}
+
+static u16 cl_data_rates_inverse_vht(u8 bw, u8 nss, u8 mcs, u8 gi)
+{
+	u16 data_rate = data_rate_ht_vht_x10[bw][nss][mcs][gi];
+
+	if (data_rate)
+		return (80 << DATA_RATE_INVERSE_Q) / data_rate;
+
+	return 0;
+}
+
+static u16 cl_data_rates_inverse_ofdm(u8 mcs)
+{
+	return (80 << DATA_RATE_INVERSE_Q) / data_rate_ofdm_x10[mcs];
+}
+
+static u16 cl_data_rates_inverse_cck(u8 mcs)
+{
+	return (80 << DATA_RATE_INVERSE_Q) / data_rate_cck_x10[mcs];
+}
+
+void cl_data_rates_inverse_build(void)
+{
+	/*
+	 * The calculation is: round((2^15[Q] * 8[bits] * 10)/rate[Mbps]) - unit (us * 2^15)
+	 * multiply by 10 because data rates in the above tables are also multiplied by 10
+	 */
+	u8 bw, nss, mcs, gi;
+
+	for (bw = 0; bw < CHNL_BW_MAX; bw++)
+		for (nss = 0; nss < WRS_SS_MAX; nss++) {
+			/* HE */
+			for (mcs = 0; mcs < WRS_MCS_MAX_HE; mcs++)
+				for (gi = 0; gi < WRS_GI_MAX_HE; gi++)
+					inverse_data_rate.he[bw][nss][mcs][gi] =
+						cl_data_rates_inverse_he(bw, nss, mcs, gi);
+
+			/* VHT */
+			for (mcs = 0; mcs < WRS_MCS_MAX_VHT; mcs++)
+				for (gi = 0; gi < WRS_GI_MAX_VHT; gi++)
+					inverse_data_rate.ht_vht[bw][nss][mcs][gi] =
+						cl_data_rates_inverse_vht(bw, nss, mcs, gi);
+		}
+
+	/* OFDM */
+	for (mcs = 0; mcs < WRS_MCS_MAX_OFDM; mcs++)
+		inverse_data_rate.ofdm[mcs] = cl_data_rates_inverse_ofdm(mcs);
+
+	/* CCK */
+	for (mcs = 0; mcs < WRS_MCS_MAX_CCK; mcs++)
+		inverse_data_rate.cck[mcs] = cl_data_rates_inverse_cck(mcs);
+}
+
+u16 cl_data_rates_get(u8 mode, u8 bw, u8 nss, u8 mcs, u8 gi)
+{
+	return cl_data_rates_get_x10(mode, bw, nss, mcs, gi) / 10;
+}
+
+u16 cl_data_rates_get_x10(u8 mode, u8 bw, u8 nss, u8 mcs, u8 gi)
+{
+	switch (mode) {
+	case WRS_MODE_HE:
+		return data_rate_he_x10[bw][nss][mcs][gi];
+	case WRS_MODE_VHT:
+	case WRS_MODE_HT:
+		return data_rate_ht_vht_x10[bw][nss][mcs][gi];
+	case WRS_MODE_OFDM:
+		return data_rate_ofdm_x10[mcs];
+	case WRS_MODE_CCK:
+		return data_rate_cck_x10[mcs];
+	default:
+		return 0;
+	}
+}
+
+u32 cl_rate_ctrl_generate(struct cl_hw *cl_hw, struct cl_sta *cl_sta,
+			  u8 mode, u8 bw, u8 nss, u8 mcs, u8 gi,
+			  bool fallback_en, bool mu_valid)
+{
+	union cl_rate_ctrl_info rate_ctrl_info;
+
+	rate_ctrl_info.word = 0;
+
+	/* Format_mod + mcs_index */
+	if (mode == WRS_MODE_HE) {
+		rate_ctrl_info.field.mcs_index = (nss << 4) | mcs;
+		rate_ctrl_info.field.format_mod = FORMATMOD_HE_SU;
+	} else if (mode == WRS_MODE_VHT) {
+		rate_ctrl_info.field.mcs_index = (nss << 4) | mcs;
+		rate_ctrl_info.field.format_mod = FORMATMOD_VHT;
+	} else if (mode == WRS_MODE_HT) {
+		rate_ctrl_info.field.mcs_index = (nss << 3) | mcs;
+		rate_ctrl_info.field.format_mod = FORMATMOD_HT_MF;
+	} else if (mode == WRS_MODE_OFDM) {
+		rate_ctrl_info.field.mcs_index = mcs + RATE_CTRL_OFFSET_OFDM;
+		rate_ctrl_info.field.format_mod =
+			(bw == CHNL_BW_20) ? FORMATMOD_NON_HT : FORMATMOD_NON_HT_DUP_OFDM;
+	} else { /* WRS_MODE_CCK */
+		rate_ctrl_info.field.mcs_index = mcs;
+		rate_ctrl_info.field.format_mod = FORMATMOD_NON_HT;
+	}
+
+	/* Gi */
+	rate_ctrl_info.field.gi = cl_convert_gi_format_wrs_to_fw(mode, gi);
+
+	/* Bw */
+	rate_ctrl_info.field.bw = bw;
+
+	/* Fallback */
+	rate_ctrl_info.field.fallback = fallback_en;
+
+	/* Tx_bf */
+	if (!mu_valid && cl_sta && cl_bf_is_on(cl_hw, cl_sta, nss))
+		rate_ctrl_info.field.tx_bf = true;
+
+	/* Pre_type/stbc */
+	if (rate_ctrl_info.field.format_mod == FORMATMOD_NON_HT)
+		rate_ctrl_info.field.pre_type_or_stbc = 1;
+
+	return rate_ctrl_info.word;
+}
+
+void cl_rate_ctrl_convert(union cl_rate_ctrl_info *rate_ctrl_info)
+{
+	u32 format_mod = rate_ctrl_info->field.format_mod;
+
+	/*
+	 * Convert gi from firmware format to driver format
+	 * !!! Must be done before converting the format mode !!!
+	 */
+	rate_ctrl_info->field.gi = cl_convert_gi_format_fw_to_wrs(format_mod,
+								  rate_ctrl_info->field.gi);
+
+	/* Convert format_mod from firmware format to WRS format */
+	if (format_mod >= FORMATMOD_HE_SU) {
+		rate_ctrl_info->field.format_mod = WRS_MODE_HE;
+	} else if (format_mod == FORMATMOD_VHT) {
+		rate_ctrl_info->field.format_mod = WRS_MODE_VHT;
+	} else if (format_mod >= FORMATMOD_HT_MF) {
+		rate_ctrl_info->field.format_mod = WRS_MODE_HT;
+	} else if (format_mod == FORMATMOD_NON_HT_DUP_OFDM) {
+		rate_ctrl_info->field.format_mod = WRS_MODE_OFDM;
+	} else {
+		if (rate_ctrl_info->field.mcs_index >= RATE_CTRL_OFFSET_OFDM)
+			rate_ctrl_info->field.format_mod = WRS_MODE_OFDM;
+		else
+			rate_ctrl_info->field.format_mod = WRS_MODE_CCK;
+	}
+}
+
+void cl_rate_ctrl_parse(union cl_rate_ctrl_info *rate_ctrl_info, u8 *nss, u8 *mcs)
+{
+	switch (rate_ctrl_info->field.format_mod) {
+	case WRS_MODE_HE:
+	case WRS_MODE_VHT:
+		*nss = (rate_ctrl_info->field.mcs_index >> 4);
+		*mcs = (rate_ctrl_info->field.mcs_index & 0xF);
+		break;
+	case WRS_MODE_HT:
+		*nss = (rate_ctrl_info->field.mcs_index >> 3);
+		*mcs = (rate_ctrl_info->field.mcs_index & 0x7);
+		break;
+	case WRS_MODE_OFDM:
+		*nss = 0;
+		*mcs = rate_ctrl_info->field.mcs_index - RATE_CTRL_OFFSET_OFDM;
+		break;
+	case WRS_MODE_CCK:
+		*nss = 0;
+		*mcs = rate_ctrl_info->field.mcs_index;
+		break;
+	default:
+		*nss = *mcs = 0;
+	}
+}
+
+void cl_rate_ctrl_set_default(struct cl_hw *cl_hw)
+{
+	u32 rate_ctrl = 0;
+	union cl_rate_ctrl_info_he rate_ctrl_he;
+
+	/* HE default */
+	rate_ctrl_he.word = 0;
+	rate_ctrl_he.field.spatial_conf = RATE_CNTRL_HE_SPATIAL_CONF_DEF;
+	rate_ctrl = cl_rate_ctrl_generate(cl_hw, NULL, WRS_MODE_HE,
+					  0, 0, 0, 0, false, false);
+
+	cl_msg_tx_update_rate_dl(cl_hw, 0xff, rate_ctrl, 0, 0,
+				 RATE_OP_MODE_DEFAULT_HE, 0, 0, LTF_X4, 0, rate_ctrl_he.word);
+
+	/* OFDM default */
+	rate_ctrl = cl_rate_ctrl_generate(cl_hw, NULL, WRS_MODE_OFDM, 0, 0,
+					  cl_hw->conf->ce_default_mcs_ofdm, 0, false, false);
+
+	cl_msg_tx_update_rate_dl(cl_hw, 0xff, rate_ctrl, 0, 0,
+				 RATE_OP_MODE_DEFAULT_OFDM, 0, 0, 0, 0, 0);
+
+	/* CCK default */
+	if (cl_band_is_24g(cl_hw)) {
+		rate_ctrl = cl_rate_ctrl_generate(cl_hw, NULL, WRS_MODE_CCK, 0, 0,
+						  cl_hw->conf->ce_default_mcs_cck, 0, false, false);
+
+		cl_msg_tx_update_rate_dl(cl_hw, 0xff, rate_ctrl, 0, 0,
+					 RATE_OP_MODE_DEFAULT_CCK, 0, 0, 0, 0, 0);
+	}
+}
+
+void cl_rate_ctrl_set_default_per_he_minrate(struct cl_hw *cl_hw, u8 bw,
+					     u8 nss, u8 mcs, u8 gi)
+{
+	union cl_rate_ctrl_info_he rate_ctrl_he;
+	u32 rate_ctrl = 0;
+	u8 ltf = cl_map_gi_to_ltf(WRS_MODE_HE, gi);
+
+	rate_ctrl_he.word = 0;
+	rate_ctrl_he.field.spatial_conf = RATE_CNTRL_HE_SPATIAL_CONF_DEF;
+	rate_ctrl = cl_rate_ctrl_generate(cl_hw, NULL, WRS_MODE_HE, bw,
+					  nss, mcs, gi, false, false);
+
+	cl_msg_tx_update_rate_dl(cl_hw, 0xff, rate_ctrl, 0, 0,
+				 RATE_OP_MODE_DEFAULT_HE, 0, 0, ltf,
+				 0, rate_ctrl_he.word);
+
+	cl_msg_tx_update_rate_dl(cl_hw, 0xff, rate_ctrl, 0, 0,
+				 RATE_OP_MODE_MCAST, 0, 0, ltf, 0, 0);
+
+	cl_msg_tx_update_rate_dl(cl_hw, 0xff, rate_ctrl, 0, 0,
+				 RATE_OP_MODE_BCAST, 0, 0, ltf, 0, 0);
+}
+
+bool cl_rate_ctrl_set_mcast(struct cl_hw *cl_hw, u8 mode, u8 mcs)
+{
+	u32 rate_ctrl_mcast = cl_rate_ctrl_generate(cl_hw, NULL, mode, 0, 0, mcs,
+						    WRS_GI_LONG, false, false);
+	u8 ltf = cl_map_gi_to_ltf(mode, WRS_GI_LONG);
+
+	if (cl_msg_tx_update_rate_dl(cl_hw, 0xff, rate_ctrl_mcast, 0, 0,
+				     RATE_OP_MODE_MCAST, 0, 0, ltf, 0, 0))
+		return false;
+
+	return true;
+}
+
+static u8 cl_rate_ctrl_get_min(struct cl_hw *cl_hw)
+{
+	if (cl_hw->conf->ci_min_he_en &&
+	    cl_hw->wireless_mode == WIRELESS_MODE_HE)
+		return RATE_CTRL_ENTRY_MIN_HE;
+
+	if (cl_hw_mode_is_b_or_bg(cl_hw))
+		return RATE_CTRL_ENTRY_MIN_CCK;
+
+	return RATE_CTRL_ENTRY_MIN_OFDM;
+}
+
+void cl_rate_ctrl_update_desc_single(struct cl_hw *cl_hw, struct tx_host_info *info,
+				     struct cl_sw_txhdr *sw_txhdr)
+{
+	struct ieee80211_hdr *mac_hdr = sw_txhdr->hdr80211;
+	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(sw_txhdr->skb);
+	bool is_data = ieee80211_is_data(sw_txhdr->fc);
+
+	if (sw_txhdr->cl_sta && is_data) {
+		if (cl_tx_ctrl_is_eapol(tx_info)) {
+			info->rate_ctrl_entry = cl_rate_ctrl_get_min(cl_hw);
+		} else {
+			if (cl_hw->entry_fixed_rate)
+				info->rate_ctrl_entry = RATE_CTRL_ENTRY_FIXED_RATE;
+			else
+				info->rate_ctrl_entry = RATE_CTRL_ENTRY_STA;
+		}
+	} else {
+		if (sw_txhdr->is_bcn) {
+			info->rate_ctrl_entry = cl_rate_ctrl_get_min(cl_hw);
+		} else if (is_multicast_ether_addr(mac_hdr->addr1) &&
+			   !is_broadcast_ether_addr(mac_hdr->addr1)) {
+			info->rate_ctrl_entry = RATE_CTRL_ENTRY_MCAST;
+		} else if (is_broadcast_ether_addr(mac_hdr->addr1) &&
+			   !cl_hw->entry_fixed_rate) {
+			info->rate_ctrl_entry = RATE_CTRL_ENTRY_BCAST;
+		} else {
+			if (cl_hw->entry_fixed_rate && is_data)
+				info->rate_ctrl_entry = RATE_CTRL_ENTRY_FIXED_RATE;
+			else
+				info->rate_ctrl_entry = cl_rate_ctrl_get_min(cl_hw);
+		}
+	}
+}
+
+void cl_rate_ctrl_update_desc_agg(struct cl_hw *cl_hw, struct tx_host_info *info)
+{
+	/* For aggregation there are only two options - STA and FIXED_RATE */
+	if (cl_hw->entry_fixed_rate)
+		info->rate_ctrl_entry = RATE_CTRL_ENTRY_FIXED_RATE;
+	else
+		info->rate_ctrl_entry = RATE_CTRL_ENTRY_STA;
+}
+
+#ifdef CONFIG_CL8K_DYN_BCAST_RATE
+
+/*
+ * MIN_MCS | BCAST_MCS
+ * -------------------
+ * 0 - 1   | 0
+ * 2 - 3   | 1
+ * 4 - 5   | 2
+ * 6 - 7   | 3
+ * 8 - 9   | 4
+ * 10 - 11 | 5
+ */
+
+static u8 conv_min_mcs_to_bcast_mcs[WRS_MCS_MAX] = {
+	0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5
+};
+
+static void cl_dyn_bcast_rate_update(struct cl_hw *cl_hw, u8 min_mcs)
+{
+	struct cl_dyn_bcast_rate *dyn_bcast_rate = &cl_hw->dyn_bcast_rate;
+	u8 bcast_mcs = conv_min_mcs_to_bcast_mcs[min_mcs];
+
+	dyn_bcast_rate->sta_min_mcs = min_mcs;
+
+	if (bcast_mcs != dyn_bcast_rate->bcast_mcs)
+		cl_dyn_bcast_rate_set(cl_hw, bcast_mcs);
+}
+
+static struct cl_dyn_bcast_rate cl_dyn_bcast_rate_prepare(struct cl_hw *cl_hw)
+{
+	struct cl_dyn_bcast_rate dyn_bcast_rate;
+
+	memset(&dyn_bcast_rate, 0, sizeof(struct cl_dyn_bcast_rate));
+	dyn_bcast_rate.sta_min_mcs = 0;
+	dyn_bcast_rate.bcast_mcs = conv_min_mcs_to_bcast_mcs[0];
+
+	if (cl_band_is_6g(cl_hw)) {
+		dyn_bcast_rate.wrs_mode = cl_hw->conf->ci_min_he_en ?
+			WRS_MODE_HE : WRS_MODE_OFDM;
+		dyn_bcast_rate.ltf = LTF_X4;
+	} else if (cl_band_is_24g(cl_hw) && cl_hw_mode_is_b_or_bg(cl_hw)) {
+		dyn_bcast_rate.wrs_mode = WRS_MODE_CCK;
+		dyn_bcast_rate.ltf = 0;
+	} else {
+		dyn_bcast_rate.wrs_mode = WRS_MODE_OFDM;
+		dyn_bcast_rate.ltf = 0;
+	}
+
+	return dyn_bcast_rate;
+}
+
+void cl_dyn_bcast_rate_init(struct cl_hw *cl_hw)
+{
+	struct cl_dyn_bcast_rate dyn_bcast_rate;
+
+	dyn_bcast_rate = cl_dyn_bcast_rate_prepare(cl_hw);
+	memcpy(&cl_hw->dyn_bcast_rate, &dyn_bcast_rate, sizeof(struct cl_dyn_bcast_rate));
+}
+
+void cl_dyn_bcast_rate_set(struct cl_hw *cl_hw, u8 bcast_mcs)
+{
+	struct cl_dyn_bcast_rate *dyn_bcast_rate = &cl_hw->dyn_bcast_rate;
+	u8 wrs_mode = dyn_bcast_rate->wrs_mode;
+	u8 ltf = dyn_bcast_rate->ltf;
+	u32 rate_ctrl;
+
+	cl_hw->dyn_bcast_rate.bcast_mcs = bcast_mcs;
+
+	rate_ctrl = cl_rate_ctrl_generate(cl_hw, NULL, wrs_mode, 0, 0, bcast_mcs,
+					  0, false, false);
+	cl_msg_tx_update_rate_dl(cl_hw, U8_MAX, rate_ctrl, 0, 0,
+				 RATE_OP_MODE_BCAST, 0, 0, ltf, 0, 0);
+
+	cl_dbg_info(cl_hw, "Broadcast MCS set to %u\n", bcast_mcs);
+}
+
+void cl_dyn_bcast_update(struct cl_hw *cl_hw)
+{
+	struct cl_dyn_bcast_rate dyn_bcast_rate;
+
+	dyn_bcast_rate = cl_dyn_bcast_rate_prepare(cl_hw);
+	if (cl_hw->dyn_bcast_rate.wrs_mode == dyn_bcast_rate.wrs_mode)
+		return;
+
+	memcpy(&cl_hw->dyn_bcast_rate, &dyn_bcast_rate, sizeof(struct cl_dyn_bcast_rate));
+	cl_dyn_bcast_rate_set(cl_hw, cl_hw->dyn_bcast_rate.bcast_mcs);
+}
+
+void cl_dyn_bcast_rate_recovery(struct cl_hw *cl_hw)
+{
+	cl_dyn_bcast_rate_set(cl_hw, cl_hw->dyn_bcast_rate.bcast_mcs);
+}
+
+void cl_dyn_bcast_rate_change(struct cl_hw *cl_hw, struct cl_sta *cl_sta_change,
+			      u8 old_mcs, u8 new_mcs)
+{
+	struct cl_dyn_bcast_rate *dyn_bcast_rate = &cl_hw->dyn_bcast_rate;
+	struct cl_sta *cl_sta = NULL;
+	u8 min_mcs = WRS_MCS_MAX - 1;
+	u8 sta_mcs = 0;
+
+	if (!cl_hw->conf->ce_dyn_bcast_rate_en)
+		return;
+
+	if (!cl_sta_change->add_complete)
+		return;
+
+	/* Single station */
+	if (cl_sta_num_bh(cl_hw) == 1) {
+		cl_dyn_bcast_rate_update(cl_hw, new_mcs);
+		return;
+	}
+
+	/*
+	 * If this station did not have the minimum mcs,
+	 * and the new rate is now below the minimum mcs there is nothing to do
+	 */
+	if (old_mcs > dyn_bcast_rate->sta_min_mcs &&
+	    new_mcs > dyn_bcast_rate->sta_min_mcs)
+		return;
+
+	/* Multi station - find new minimum MCS of all stations */
+	cl_sta_lock_bh(cl_hw);
+
+	list_for_each_entry(cl_sta, &cl_hw->cl_sta_db.head, list) {
+		sta_mcs = (cl_sta->sta_idx == cl_sta_change->sta_idx) ?
+			new_mcs : cl_sta->wrs_sta.tx_su_params.rate_params.mcs;
+
+		if (sta_mcs < min_mcs) {
+			min_mcs = sta_mcs;
+
+			if (min_mcs == 0)
+				break;
+		}
+	}
+
+	cl_sta_unlock_bh(cl_hw);
+
+	cl_dyn_bcast_rate_update(cl_hw, min_mcs);
+}
+
+void cl_dyn_bcast_rate_update_upon_assoc(struct cl_hw *cl_hw, u8 mcs, u8 num_sta)
+{
+	struct cl_dyn_bcast_rate *dyn_bcast_rate = &cl_hw->dyn_bcast_rate;
+
+	if (!cl_hw->conf->ce_dyn_bcast_rate_en)
+		return;
+
+	if (num_sta == 1 || mcs < dyn_bcast_rate->sta_min_mcs)
+		cl_dyn_bcast_rate_update(cl_hw, mcs);
+}
+
+void cl_dyn_bcast_rate_update_upon_disassoc(struct cl_hw *cl_hw, u8 mcs, u8 num_sta)
+{
+	struct cl_dyn_bcast_rate *dyn_bcast_rate = &cl_hw->dyn_bcast_rate;
+	struct cl_sta *cl_sta = NULL;
+	u8 min_mcs = WRS_MCS_MAX - 1;
+
+	if (!cl_hw->conf->ce_dyn_bcast_rate_en)
+		return;
+
+	/* When the last station disconnects - set bcast back to 0 */
+	if (num_sta == 0) {
+		cl_dyn_bcast_rate_update(cl_hw, 0);
+		return;
+	}
+
+	/* If this station did not have the minimum rate there is nothing to do */
+	if (mcs > dyn_bcast_rate->sta_min_mcs)
+		return;
+
+	/*
+	 * Find new minimum MCS of all station (the disassociating
+	 * station is not in list at this stage)
+	 */
+	cl_sta_lock_bh(cl_hw);
+
+	list_for_each_entry(cl_sta, &cl_hw->cl_sta_db.head, list) {
+		if (cl_sta->wrs_sta.tx_su_params.rate_params.mcs < min_mcs) {
+			min_mcs = cl_sta->wrs_sta.tx_su_params.rate_params.mcs;
+
+			if (min_mcs == 0)
+				break;
+		}
+	}
+
+	cl_sta_unlock_bh(cl_hw);
+
+	cl_dyn_bcast_rate_update(cl_hw, min_mcs);
+}
+#endif /* CONFIG_CL8K_DYN_BCAST_RATE */
+#ifdef CONFIG_CL8K_DYN_MCAST_RATE
+
+static void _cl_dyn_mcast_rate_send(struct cl_hw *cl_hw, u8 wrs_mode_new)
+{
+	struct cl_dyn_mcast_rate *dyn_mcast_rate = &cl_hw->dyn_mcast_rate;
+
+	if (dyn_mcast_rate->wrs_mode_curr == wrs_mode_new)
+		return;
+
+	if (!cl_rate_ctrl_set_mcast(cl_hw, wrs_mode_new, cl_hw->conf->ce_mcast_rate))
+		return;
+
+	dyn_mcast_rate->wrs_mode_curr = wrs_mode_new;
+	cl_dbg_trace(cl_hw, "New multicast mode = %u\n", wrs_mode_new);
+}
+
+static struct cl_dyn_mcast_rate cl_dyn_mcast_rate_prepare(struct cl_hw *cl_hw)
+{
+	struct cl_dyn_mcast_rate dyn_mcast_rate;
+
+	memset(&dyn_mcast_rate, 0, sizeof(struct cl_dyn_mcast_rate));
+	if (cl_hw->conf->ci_min_he_en &&
+	    cl_hw->wireless_mode == WIRELESS_MODE_HE)
+		dyn_mcast_rate.wrs_mode_default = WRS_MODE_HE;
+	else if (cl_band_is_24g(cl_hw) && cl_hw_mode_is_b_or_bg(cl_hw))
+		dyn_mcast_rate.wrs_mode_default = WRS_MODE_CCK;
+	else
+		dyn_mcast_rate.wrs_mode_default = WRS_MODE_OFDM;
+
+	return dyn_mcast_rate;
+}
+
+void cl_dyn_mcast_rate_init(struct cl_hw *cl_hw)
+{
+	struct cl_dyn_mcast_rate dyn_mcast_rate;
+
+	dyn_mcast_rate = cl_dyn_mcast_rate_prepare(cl_hw);
+	cl_hw->dyn_mcast_rate.wrs_mode_default = dyn_mcast_rate.wrs_mode_default;
+
+	cl_dbg_trace(cl_hw, "mode = %u, mcs = %u\n",
+		     dyn_mcast_rate.wrs_mode_default, cl_hw->conf->ce_mcast_rate);
+}
+
+void cl_dyn_mcast_rate_set(struct cl_hw *cl_hw)
+{
+	/*
+	 * Set wrs_mode_curr to 0xff so that the message will be sent to
+	 * firmware when this function is called from cl_ops_start()
+	 */
+	struct cl_dyn_mcast_rate *dyn_mcast_rate = &cl_hw->dyn_mcast_rate;
+
+	dyn_mcast_rate->wrs_mode_curr = U8_MAX;
+
+	_cl_dyn_mcast_rate_send(cl_hw, dyn_mcast_rate->wrs_mode_default);
+}
+
+void cl_dyn_mcast_update(struct cl_hw *cl_hw)
+{
+	struct cl_dyn_mcast_rate dyn_mcast_rate;
+
+	dyn_mcast_rate = cl_dyn_mcast_rate_prepare(cl_hw);
+	if (cl_hw->dyn_mcast_rate.wrs_mode_default == dyn_mcast_rate.wrs_mode_default)
+		return;
+
+	cl_hw->dyn_mcast_rate.wrs_mode_default = dyn_mcast_rate.wrs_mode_default;
+	cl_dyn_mcast_rate_set(cl_hw);
+}
+
+void cl_dyn_mcast_rate_recovery(struct cl_hw *cl_hw)
+{
+	/*
+	 * cl_dyn_mcast_rate_recovery() is called during recovery process().
+	 * Reset wrs_mode_curr so that message will be sent.
+	 */
+	struct cl_dyn_mcast_rate *dyn_mcast_rate = &cl_hw->dyn_mcast_rate;
+	u8 wrs_mode_curr = dyn_mcast_rate->wrs_mode_curr;
+
+	dyn_mcast_rate->wrs_mode_curr = U8_MAX;
+
+	_cl_dyn_mcast_rate_send(cl_hw, wrs_mode_curr);
+}
+
+void cl_dyn_mcast_rate_update_upon_assoc(struct cl_hw *cl_hw, u8 wrs_mode, u8 num_sta)
+{
+	struct cl_dyn_mcast_rate *dyn_mcast_rate = &cl_hw->dyn_mcast_rate;
+
+	if (!cl_hw->conf->ce_dyn_mcast_rate_en)
+		return;
+
+	/*
+	 * If the wrs_mode of the new station is lower than the current multicast
+	 * wrs_mode, or if this is the first station to connect - update multicast mode
+	 */
+	if (wrs_mode < dyn_mcast_rate->wrs_mode_curr || num_sta == 1)
+		_cl_dyn_mcast_rate_send(cl_hw, wrs_mode);
+}
+
+void cl_dyn_mcast_rate_update_upon_disassoc(struct cl_hw *cl_hw, u8 wrs_mode, u8 num_sta)
+{
+	struct cl_dyn_mcast_rate *dyn_mcast_rate = &cl_hw->dyn_mcast_rate;
+	struct cl_sta *cl_sta = NULL;
+	u8 wrs_mode_min = WRS_MODE_HE;
+
+	if (!cl_hw->conf->ce_dyn_mcast_rate_en)
+		return;
+
+	/* When the last station disconnects - set default mcast rate */
+	if (num_sta == 0) {
+		_cl_dyn_mcast_rate_send(cl_hw, dyn_mcast_rate->wrs_mode_default);
+		return;
+	}
+
+	/*
+	 * If wrs_mode of the disassociating station is bigger
+	 * than the current mode then there is nothing to update.
+	 */
+	if (wrs_mode > dyn_mcast_rate->wrs_mode_curr)
+		return;
+
+	/*
+	 * Find minimal wrs_mode among the connected stations (the
+	 * disassociating station is not in list at this stage).
+	 */
+	cl_sta_lock_bh(cl_hw);
+
+	list_for_each_entry(cl_sta, &cl_hw->cl_sta_db.head, list)
+		if (cl_sta->wrs_sta.mode < wrs_mode_min)
+			wrs_mode_min = cl_sta->wrs_sta.mode;
+
+	cl_sta_unlock_bh(cl_hw);
+
+	_cl_dyn_mcast_rate_send(cl_hw, wrs_mode_min);
+}
+#endif /* CONFIG_CL8K_DYN_MCAST_RATE */
-- 
2.36.1




[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux