/******************************************************************************
 *
 * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
 * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
 * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
 * Copyright(c) 2018        Intel Corporation
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *  * Neither the name Intel Corporation nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *****************************************************************************/

#include <zircon/syscalls.h>

#include "_rateScaleMng.h"
#include "mvm.h"

#define SHIFT_AND_MASK(val, mask, pos) (((val) >> (pos)) & ((mask) >> (pos)))
#define SEC_TO_USEC(x) ((x) * USEC_PER_SEC)
#define MSEC_TO_USEC(x) ((x) * USEC_PER_MSEC)
#define _memclr(p, s) (memset((p), 0, (s)))
#define DBG_PRINTF(...)
#define NON_SHARED_ANT_RFIC_ID \
	(staInfo->mvm->cfg->non_shared_ant == ANT_A ? 0 : 1)
#define BT_COEX_SHARED_ANT_ID (staInfo->mvm->cfg->non_shared_ant ^ ANT_AB)
#define PWR_IS_SLEEP_ALLOWED (!staInfo->mvm->ps_disabled)

#define MSB2ORD msb2ord
#define LSB2ORD lsb2ord

static inline unsigned long msb2ord(unsigned long x)
{
	return find_last_bit((unsigned int *)&x, BITS_PER_LONG);
}

static inline unsigned long lsb2ord(unsigned long x)
{
	return find_first_bit((unsigned int *)&x, BITS_PER_LONG);
}

uint64_t nonht_rate_to_bit(uint8_t rate_value)
{
	uint64_t rate_bit = 0;
	switch (rate_value) {
	case 1:
		rate_bit = BIT(RS_NON_HT_RATE_CCK_1M);
		break;
	case 2:
		rate_bit = BIT(RS_NON_HT_RATE_CCK_2M);
		break;
	case 11:
		rate_bit = BIT(RS_NON_HT_RATE_CCK_5_5M);
		break;
	case 22:
		rate_bit = BIT(RS_NON_HT_RATE_CCK_11M);
		break;
	case 6:
		rate_bit = BIT(RS_NON_HT_RATE_OFDM_6M);
		break;
	case 9:
		rate_bit = BIT(RS_NON_HT_RATE_OFDM_9M);
		break;
	case 12:
		rate_bit = BIT(RS_NON_HT_RATE_OFDM_12M);
		break;
	case 18:
		rate_bit = BIT(RS_NON_HT_RATE_OFDM_18M);
		break;
	case 24:
		rate_bit = BIT(RS_NON_HT_RATE_OFDM_24M);
		break;
	case 36:
		rate_bit = BIT(RS_NON_HT_RATE_OFDM_36M);
		break;
	case 48:
		rate_bit = BIT(RS_NON_HT_RATE_OFDM_48M);
		break;
	case 54:
		rate_bit = BIT(RS_NON_HT_RATE_OFDM_54M);
		break;
	default:
		IWL_WARN(NULL, "Not non-HT rate: %u", rate_value);
	}
	return rate_bit;
}

// TODO - move to coex.c
static bool btCoexManagerIsAntAvailable(struct iwl_mvm *mvm, uint8_t ant)
{
	if (mvm->cfg->bt_shared_single_ant) {
		return true;
	}

	if (!(ant & ~mvm->cfg->non_shared_ant)) {
		return true;
	}

	return le32_to_cpu(mvm->last_bt_notif.bt_activity_grading) <
	       BT_HIGH_TRAFFIC;
}

static bool btCoexManagerBtOwnsAnt(struct iwl_mvm *mvm)
{
	return le32_to_cpu(mvm->last_bt_notif.bt_activity_grading) >=
	       BT_HIGH_TRAFFIC;
}

typedef struct _TLC_STAT_COMMON_API_S {
	/* @brief number of packets sent
   * txed[0] - rate index 0
   * txed[1] - rate index != 0
   */
	U16 txed[2];
	/**
   * @brief number of packets we got acknowledgment for packet sent
   * acked[0] - rate index 0
   * acked[1] - rate index != 0
   */
	U16 acked[2];
	/* Number of frames we got BA response for (regardless of success) */
	U16 trafficLoad;
	U16 baTxed;
	U16 baAcked;
} TLC_STAT_COMMON_API_S;

static const U08 RS_NON_HT_RATE_TO_API_RATE[] = {
	[RS_NON_HT_RATE_CCK_1M] = R_1M,	    [RS_NON_HT_RATE_CCK_2M] = R_2M,
	[RS_NON_HT_RATE_CCK_5_5M] = R_5_5M, [RS_NON_HT_RATE_CCK_11M] = R_11M,
	[RS_NON_HT_RATE_OFDM_6M] = R_6M,    [RS_NON_HT_RATE_OFDM_9M] = R_9M,
	[RS_NON_HT_RATE_OFDM_12M] = R_12M,  [RS_NON_HT_RATE_OFDM_18M] = R_18M,
	[RS_NON_HT_RATE_OFDM_24M] = R_24M,  [RS_NON_HT_RATE_OFDM_36M] = R_36M,
	[RS_NON_HT_RATE_OFDM_48M] = R_48M,  [RS_NON_HT_RATE_OFDM_54M] = R_54M,
};

#if 0 // NEEDS_PORTING
// TODO(fxbug.dev/36684): Supports VHT (802.11ac)
// This array converts VHT rate configuration to phy rate
// See ieee80211-2016 spec, section 21.4 tabled for reference values
// Note the values are in bps, instead of mbps (i.e. multiplied by 2^20)
// The table access is rsMngVhtRateToBps[BW][MSC].
static const U32 rsMngVhtRateToBps[][10] = {
    [CHANNEL_WIDTH20] = {6815744, 13631488, 20447232, 27262976, 40894464, 54525952, 61341696,
                         68157440, 81788928, 90701824},
    [CHANNEL_WIDTH40] = {14155776, 28311552, 42467328, 56623104, 84934656, 113246208, 127401984,
                         141557760, 169869312, 188743680},
    [CHANNEL_WIDTH80] = {30723277 /*rounded*/, 61341696, 92064973 /*rounded*/, 122683392, 184025088,
                         245366784, 276090061 /*rounded*/, 306708480, 368050176, 408944640},
    [CHANNEL_WIDTH160] = {61341696, 122683392, 184025088, 245366784, 368050176, 490733568,
                          552075264, 613416960, 736100352, 817889280},
};
#endif // NEEDS_PORTING

// The array cell index is the MCS. e.g. - cell 0 - MCS0 6M. etc.
static const U08 downColMcsToLegacy[] = {
	[RS_MCS_0_HE_ER_AND_DCM] = RS_NON_HT_RATE_OFDM_6M,
	[RS_MCS_0] = RS_NON_HT_RATE_OFDM_6M,
	[RS_MCS_1] = RS_NON_HT_RATE_OFDM_12M,
	[RS_MCS_2] = RS_NON_HT_RATE_OFDM_18M,
	[RS_MCS_3] = RS_NON_HT_RATE_OFDM_24M,
	[RS_MCS_4] = RS_NON_HT_RATE_OFDM_36M,
	[RS_MCS_5] = RS_NON_HT_RATE_OFDM_48M,
	[RS_MCS_6] = RS_NON_HT_RATE_OFDM_54M,
	[RS_MCS_7] = RS_NON_HT_RATE_OFDM_54M,
	[RS_MCS_8] = RS_NON_HT_RATE_OFDM_54M,
	[RS_MCS_9] = RS_NON_HT_RATE_OFDM_54M,
	[RS_MCS_10] = RS_NON_HT_RATE_OFDM_54M,
	[RS_MCS_11] = RS_NON_HT_RATE_OFDM_54M,
};

typedef struct _RS_MNG_DYN_BW_STAY {
	RS_MCS_E lowestStayMcs;
	RS_MCS_E highestStayMcs;
} RS_MNG_DYN_BW_STAY;

#define RS_MNG_DYN_BW_STAY_MCS(_bw, _nss1min, _nss1max, _nss2min, _nss2max) \
	[CHANNEL_WIDTH##_bw] = { { .lowestStayMcs = RS_MCS_##_nss1min,      \
				   .highestStayMcs = RS_MCS_##_nss1max },   \
				 { .lowestStayMcs = RS_MCS_##_nss2min,      \
				   .highestStayMcs = RS_MCS_##_nss2max } }

// thresholds above/below which bandwidth will be increase/decreased
static RS_MNG_DYN_BW_STAY g_rsMngDynBwStayMcs[][2] = {
	RS_MNG_DYN_BW_STAY_MCS(20, 0, 1, 0, 1),
	RS_MNG_DYN_BW_STAY_MCS(40, 2, 2, 2, 2),
	RS_MNG_DYN_BW_STAY_MCS(80, 5, 8, 4, 7),
	RS_MNG_DYN_BW_STAY_MCS(160, 7, 9, 6, 9)
};

#if 0 // NEEDS_PORTING
/***********************************************************************/
/*
 * The following tables contain the expected throughput metrics for all rates
 *
 * 1, 2, 5.5, 11, 6, 9, 12, 18, 24, 36, 48, 54, 60 MBits
 *
 * where invalid entries are zeros.
 *
 * CCK rates are only valid in legacy table and will only be used in G
 * (2.4 GHz) band.
 */

static const TPT_BY_RATE_ARR expectedTptNonHt = {
    [RS_NON_HT_RATE_CCK_1M] = 7,     [RS_NON_HT_RATE_CCK_2M] = 12,
    [RS_NON_HT_RATE_CCK_5_5M] = 33,  [RS_NON_HT_RATE_CCK_11M] = 54,
    [RS_NON_HT_RATE_OFDM_6M] = 38,   [RS_NON_HT_RATE_OFDM_9M] = 58,
    [RS_NON_HT_RATE_OFDM_12M] = 76,  [RS_NON_HT_RATE_OFDM_18M] = 108,
    [RS_NON_HT_RATE_OFDM_24M] = 135, [RS_NON_HT_RATE_OFDM_36M] = 176,
    [RS_NON_HT_RATE_OFDM_48M] = 208, [RS_NON_HT_RATE_OFDM_54M] = 221,
};

static const TPT_BY_RATE_ARR expectedTptHtVht[2][MAX_CHANNEL_BW_INDX][2][2] = {
    [RS_MNG_NO_AGG] = {
        [CHANNEL_WIDTH20] = {
            [RS_MNG_NGI] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 49, [RS_MCS_1] = 86, [RS_MCS_2] = 115, [RS_MCS_3] = 140,
                    [RS_MCS_4] = 178, [RS_MCS_5] = 204, [RS_MCS_6] = 215, [RS_MCS_7] = 223,
                    [RS_MCS_8] = 240,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 84, [RS_MCS_1] = 136, [RS_MCS_2] = 173, [RS_MCS_3] = 200,
                    [RS_MCS_4] = 238, [RS_MCS_5] = 260, [RS_MCS_6] = 267, [RS_MCS_7] = 275,
                    [RS_MCS_8] = 289,
                },
            },
            [RS_MNG_SGI] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 53, [RS_MCS_1] = 93, [RS_MCS_2] = 124, [RS_MCS_3] = 149,
                    [RS_MCS_4] = 188, [RS_MCS_5] = 214, [RS_MCS_6] = 225, [RS_MCS_7] = 233,
                    [RS_MCS_8] = 249,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 91, [RS_MCS_1] = 144, [RS_MCS_2] = 182, [RS_MCS_3] = 210,
                    [RS_MCS_4] = 246, [RS_MCS_5] = 267, [RS_MCS_6] = 274, [RS_MCS_7] = 282,
                    [RS_MCS_8] = 295,
                },
            },
        },
        [CHANNEL_WIDTH40] = {
            [RS_MNG_NGI] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 87, [RS_MCS_1] = 140, [RS_MCS_2] = 177, [RS_MCS_3] = 207,
                    [RS_MCS_4] = 245, [RS_MCS_5] = 265, [RS_MCS_6] = 273, [RS_MCS_7] = 281,
                    [RS_MCS_8] = 296, [RS_MCS_9] = 299,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 135, [RS_MCS_1] = 197, [RS_MCS_2] = 234, [RS_MCS_3] = 259,
                    [RS_MCS_4] = 292, [RS_MCS_5] = 304, [RS_MCS_6] = 311, [RS_MCS_7] = 314,
                    [RS_MCS_8] = 321, [RS_MCS_9] = 331,
                },
            },
            [RS_MNG_SGI] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 94, [RS_MCS_1] = 149, [RS_MCS_2] = 187, [RS_MCS_3] = 216,
                    [RS_MCS_4] = 253, [RS_MCS_5] = 273, [RS_MCS_6] = 280, [RS_MCS_7] = 288,
                    [RS_MCS_8] = 302, [RS_MCS_9] = 305,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 144, [RS_MCS_1] = 205, [RS_MCS_2] = 242, [RS_MCS_3] = 266,
                    [RS_MCS_4] = 297, [RS_MCS_5] = 309, [RS_MCS_6] = 315, [RS_MCS_7] = 318,
                    [RS_MCS_8] = 325, [RS_MCS_9] = 335,
                },
            },
        },
        [CHANNEL_WIDTH80] = {
            [RS_MNG_NGI] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 142, [RS_MCS_1] = 205, [RS_MCS_2] = 240, [RS_MCS_3] = 267,
                    [RS_MCS_4] = 299, [RS_MCS_5] = 312, [RS_MCS_6] = 319, [RS_MCS_7] = 323,
                    [RS_MCS_8] = 330, [RS_MCS_9] = 334,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 195, [RS_MCS_1] = 251, [RS_MCS_2] = 283, [RS_MCS_3] = 303,
                    [RS_MCS_4] = 325, [RS_MCS_5] = 333, [RS_MCS_6] = 337, [RS_MCS_7] = 337,
                    [RS_MCS_8] = 341, [RS_MCS_9] = 345,
                },
            },
            [RS_MNG_SGI] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 151, [RS_MCS_1] = 213, [RS_MCS_2] = 248, [RS_MCS_3] = 274,
                    [RS_MCS_4] = 305, [RS_MCS_5] = 317, [RS_MCS_6] = 323, [RS_MCS_7] = 327,
                    [RS_MCS_8] = 334, [RS_MCS_9] = 337,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 203, [RS_MCS_1] = 258, [RS_MCS_2] = 288, [RS_MCS_3] = 308,
                    [RS_MCS_4] = 328, [RS_MCS_5] = 335, [RS_MCS_6] = 339, [RS_MCS_7] = 339,
                    [RS_MCS_8] = 343, [RS_MCS_9] = 346,
                },
            },
        },
        [CHANNEL_WIDTH160] = {
            [RS_MNG_NGI] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 197, [RS_MCS_1] = 254, [RS_MCS_2] = 287, [RS_MCS_3] = 307,
                    [RS_MCS_4] = 330, [RS_MCS_5] = 338, [RS_MCS_6] = 342, [RS_MCS_7] = 342,
                    [RS_MCS_8] = 346, [RS_MCS_9] = 350,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 239, [RS_MCS_1] = 286, [RS_MCS_2] = 311, [RS_MCS_3] = 327,
                    [RS_MCS_4] = 341, [RS_MCS_5] = 345, [RS_MCS_6] = 349, [RS_MCS_7] = 349,
                    [RS_MCS_8] = 349, [RS_MCS_9] = 353,
                },
            },
            [RS_MNG_SGI] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 205, [RS_MCS_1] = 261, [RS_MCS_2] = 292, [RS_MCS_3] = 312,
                    [RS_MCS_4] = 334, [RS_MCS_5] = 341, [RS_MCS_6] = 345, [RS_MCS_7] = 345,
                    [RS_MCS_8] = 348, [RS_MCS_9] = 352,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 245, [RS_MCS_1] = 290, [RS_MCS_2] = 314, [RS_MCS_3] = 330,
                    [RS_MCS_4] = 343, [RS_MCS_5] = 346, [RS_MCS_6] = 350, [RS_MCS_7] = 350,
                    [RS_MCS_8] = 350, [RS_MCS_9] = 354,
                },
            },
        },
    },
    [RS_MNG_AGG] = {
        [CHANNEL_WIDTH20] = {
            [RS_MNG_NGI] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 53, [RS_MCS_1] = 106, [RS_MCS_2] = 159, [RS_MCS_3] = 213,
                    [RS_MCS_4] = 319, [RS_MCS_5] = 426, [RS_MCS_6] = 481, [RS_MCS_7] = 534,
                    [RS_MCS_8] = 641,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 105, [RS_MCS_1] = 211, [RS_MCS_2] = 318, [RS_MCS_3] = 425,
                    [RS_MCS_4] = 640, [RS_MCS_5] = 846, [RS_MCS_6] = 951, [RS_MCS_7] = 1060,
                    [RS_MCS_8] = 1266,
                },
            },
            [RS_MNG_SGI] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 58, [RS_MCS_1] = 116, [RS_MCS_2] = 177, [RS_MCS_3] = 237,
                    [RS_MCS_4] = 356, [RS_MCS_5] = 474, [RS_MCS_6] = 534, [RS_MCS_7] = 593,
                    [RS_MCS_8] = 712,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 116, [RS_MCS_1] = 235, [RS_MCS_2] = 354, [RS_MCS_3] = 472,
                    [RS_MCS_4] = 712, [RS_MCS_5] = 942, [RS_MCS_6] = 1058, [RS_MCS_7] = 1175,
                    [RS_MCS_8] = 1401,
                },
            },
        },
        [CHANNEL_WIDTH40] = {
            [RS_MNG_NGI] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 109, [RS_MCS_1] = 219, [RS_MCS_2] = 331, [RS_MCS_3] = 442,
                    [RS_MCS_4] = 665, [RS_MCS_5] = 882, [RS_MCS_6] = 991, [RS_MCS_7] = 1103,
                    [RS_MCS_8] = 1316, [RS_MCS_9] = 1450,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 222, [RS_MCS_1] = 445, [RS_MCS_2] = 669, [RS_MCS_3] = 892,
                    [RS_MCS_4] = 1334, [RS_MCS_5] = 1725, [RS_MCS_6] = 1907, [RS_MCS_7] = 2085,
                    [RS_MCS_8] = 2422, [RS_MCS_9] = 2637,
                },
            },
            [RS_MNG_SGI] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 120, [RS_MCS_1] = 244, [RS_MCS_2] = 368, [RS_MCS_3] = 492,
                    [RS_MCS_4] = 740, [RS_MCS_5] = 978, [RS_MCS_6] = 1101, [RS_MCS_7] = 1222,
                    [RS_MCS_8] = 1456, [RS_MCS_9] = 1601,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 246, [RS_MCS_1] = 494, [RS_MCS_2] = 742, [RS_MCS_3] = 991,
                    [RS_MCS_4] = 1470, [RS_MCS_5] = 1888, [RS_MCS_6] = 2085, [RS_MCS_7] = 2276,
                    [RS_MCS_8] = 2636, [RS_MCS_9] = 2865,
                },
            },
        },
        [CHANNEL_WIDTH80] = {
            [RS_MNG_NGI] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 237, [RS_MCS_1] = 478, [RS_MCS_2] = 718, [RS_MCS_3] = 959,
                    [RS_MCS_4] = 1427, [RS_MCS_5] = 1849, [RS_MCS_6] = 2043, [RS_MCS_7] = 2232,
                    [RS_MCS_8] = 2589, [RS_MCS_9] = 2813,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 475, [RS_MCS_1] = 953, [RS_MCS_2] = 1420, [RS_MCS_3] = 1843,
                    [RS_MCS_4] = 2584, [RS_MCS_5] = 3229, [RS_MCS_6] = 3522, [RS_MCS_7] = 3799,
                    [RS_MCS_8] = 4303, [RS_MCS_9] = 4603,
                },
            },
            [RS_MNG_SGI] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 263, [RS_MCS_1] = 531, [RS_MCS_2] = 797, [RS_MCS_3] = 1065,
                    [RS_MCS_4] = 1577, [RS_MCS_5] = 2022, [RS_MCS_6] = 2231, [RS_MCS_7] = 2434,
                    [RS_MCS_8] = 2814, [RS_MCS_9] = 3052,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 528, [RS_MCS_1] = 1058, [RS_MCS_2] = 1569, [RS_MCS_3] = 2016,
                    [RS_MCS_4] = 2808, [RS_MCS_5] = 3490, [RS_MCS_6] = 3798, [RS_MCS_7] = 4087,
                    [RS_MCS_8] = 4610, [RS_MCS_9] = 4919,
                },
            },
        },
        [CHANNEL_WIDTH160] = {
            [RS_MNG_NGI] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 476, [RS_MCS_1] = 954, [RS_MCS_2] = 1422, [RS_MCS_3] = 1846,
                    [RS_MCS_4] = 2589, [RS_MCS_5] = 3237, [RS_MCS_6] = 3531, [RS_MCS_7] = 3810,
                    [RS_MCS_8] = 4317, [RS_MCS_9] = 4619,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 948, [RS_MCS_1] = 1833, [RS_MCS_2] = 2569, [RS_MCS_3] = 3221,
                    [RS_MCS_4] = 4303, [RS_MCS_5] = 5162, [RS_MCS_6] = 5530, [RS_MCS_7] = 5856,
                    [RS_MCS_8] = 6449, [RS_MCS_9] = 6767,
                },
            },
            [RS_MNG_SGI] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 529, [RS_MCS_1] = 1060, [RS_MCS_2] = 1571, [RS_MCS_3] = 2019,
                    [RS_MCS_4] = 2814, [RS_MCS_5] = 3499, [RS_MCS_6] = 3808, [RS_MCS_7] = 4100,
                    [RS_MCS_8] = 4626, [RS_MCS_9] = 4937,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 1053, [RS_MCS_1] = 2004, [RS_MCS_2] = 2790, [RS_MCS_3] = 3481,
                    [RS_MCS_4] = 4610, [RS_MCS_5] = 5491, [RS_MCS_6] = 5864, [RS_MCS_7] = 6194,
                    [RS_MCS_8] = 6787, [RS_MCS_9] = 7103,
                },
            },
        },
    },
};

static const TPT_BY_RATE_ARR expectedTptHe[2][MAX_CHANNEL_BW_INDX][3][2] = {
    [RS_MNG_NO_AGG] = {
        [CHANNEL_WIDTH20] = {
            [RS_MNG_GI_3_2] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 30, [RS_MCS_1] = 61, [RS_MCS_2] = 92, [RS_MCS_3] = 122,
                    [RS_MCS_4] = 184, [RS_MCS_5] = 245, [RS_MCS_6] = 276, [RS_MCS_7] = 307,
                    [RS_MCS_8] = 368, [RS_MCS_9] = 409, [RS_MCS_10] = 460, [RS_MCS_11] = 511,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 61, [RS_MCS_1] = 122, [RS_MCS_2] = 184, [RS_MCS_3] = 245,
                    [RS_MCS_4] = 368, [RS_MCS_5] = 491, [RS_MCS_6] = 552, [RS_MCS_7] = 614,
                    [RS_MCS_8] = 737, [RS_MCS_9] = 819, [RS_MCS_10] = 921, [RS_MCS_11] = 1023,
                },
            },
            [RS_MNG_GI_1_6] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 34, [RS_MCS_1] = 68, [RS_MCS_2] = 102, [RS_MCS_3] = 136,
                    [RS_MCS_4] = 204, [RS_MCS_5] = 273, [RS_MCS_6] = 307, [RS_MCS_7] = 341,
                    [RS_MCS_8] = 409, [RS_MCS_9] = 455, [RS_MCS_10] = 511, [RS_MCS_11] = 568,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 68, [RS_MCS_1] = 136, [RS_MCS_2] = 204, [RS_MCS_3] = 273,
                    [RS_MCS_4] = 409, [RS_MCS_5] = 546, [RS_MCS_6] = 614, [RS_MCS_7] = 682,
                    [RS_MCS_8] = 819, [RS_MCS_9] = 910, [RS_MCS_10] = 1023, [RS_MCS_11] = 1137,
                },
            },
            [RS_MNG_GI_0_8] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 36, [RS_MCS_1] = 72, [RS_MCS_2] = 108, [RS_MCS_3] = 144,
                    [RS_MCS_4] = 216, [RS_MCS_5] = 289, [RS_MCS_6] = 325, [RS_MCS_7] = 361,
                    [RS_MCS_8] = 433, [RS_MCS_9] = 481, [RS_MCS_10] = 541, [RS_MCS_11] = 602,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 72, [RS_MCS_1] = 144, [RS_MCS_2] = 216, [RS_MCS_3] = 289,
                    [RS_MCS_4] = 433, [RS_MCS_5] = 578, [RS_MCS_6] = 650, [RS_MCS_7] = 722,
                    [RS_MCS_8] = 867, [RS_MCS_9] = 963, [RS_MCS_10] = 1083, [RS_MCS_11] = 1204,
                },
            },
        },
        [CHANNEL_WIDTH40] = {
            [RS_MNG_GI_3_2] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 61, [RS_MCS_1] = 122, [RS_MCS_2] = 184, [RS_MCS_3] = 245,
                    [RS_MCS_4] = 368, [RS_MCS_5] = 491, [RS_MCS_6] = 552, [RS_MCS_7] = 614,
                    [RS_MCS_8] = 737, [RS_MCS_9] = 819, [RS_MCS_10] = 921, [RS_MCS_11] = 1023,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 122, [RS_MCS_1] = 245, [RS_MCS_2] = 368, [RS_MCS_3] = 491,
                    [RS_MCS_4] = 737, [RS_MCS_5] = 982, [RS_MCS_6] = 1105, [RS_MCS_7] = 1228,
                    [RS_MCS_8] = 1474, [RS_MCS_9] = 1638, [RS_MCS_10] = 1842, [RS_MCS_11] = 2047,
                },
            },
            [RS_MNG_GI_1_6] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 68, [RS_MCS_1] = 136, [RS_MCS_2] = 204, [RS_MCS_3] = 273,
                    [RS_MCS_4] = 409, [RS_MCS_5] = 546, [RS_MCS_6] = 614, [RS_MCS_7] = 682,
                    [RS_MCS_8] = 819, [RS_MCS_9] = 910, [RS_MCS_10] = 1023, [RS_MCS_11] = 1137,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 136, [RS_MCS_1] = 273, [RS_MCS_2] = 409, [RS_MCS_3] = 546,
                    [RS_MCS_4] = 819, [RS_MCS_5] = 1092, [RS_MCS_6] = 1228, [RS_MCS_7] = 1365,
                    [RS_MCS_8] = 1638, [RS_MCS_9] = 1820, [RS_MCS_10] = 2047, [RS_MCS_11] = 2275,
                },
            },
            [RS_MNG_GI_0_8] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 72, [RS_MCS_1] = 144, [RS_MCS_2] = 216, [RS_MCS_3] = 289,
                    [RS_MCS_4] = 433, [RS_MCS_5] = 578, [RS_MCS_6] = 650, [RS_MCS_7] = 722,
                    [RS_MCS_8] = 867, [RS_MCS_9] = 963, [RS_MCS_10] = 1083, [RS_MCS_11] = 1204,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 144, [RS_MCS_1] = 289, [RS_MCS_2] = 433, [RS_MCS_3] = 578,
                    [RS_MCS_4] = 867, [RS_MCS_5] = 1156, [RS_MCS_6] = 1300, [RS_MCS_7] = 1445,
                    [RS_MCS_8] = 1734, [RS_MCS_9] = 1927, [RS_MCS_10] = 2167, [RS_MCS_11] = 2408,
                },
            },
        },
        [CHANNEL_WIDTH80] = {
            [RS_MNG_GI_3_2] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 128, [RS_MCS_1] = 257, [RS_MCS_2] = 385, [RS_MCS_3] = 514,
                    [RS_MCS_4] = 771, [RS_MCS_5] = 1029, [RS_MCS_6] = 1157, [RS_MCS_7] = 1286,
                    [RS_MCS_8] = 1543, [RS_MCS_9] = 1715, [RS_MCS_10] = 1929, [RS_MCS_11] = 2143,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 257, [RS_MCS_1] = 514, [RS_MCS_2] = 771, [RS_MCS_3] = 1029,
                    [RS_MCS_4] = 1543, [RS_MCS_5] = 2058, [RS_MCS_6] = 2315, [RS_MCS_7] = 2572,
                    [RS_MCS_8] = 3087, [RS_MCS_9] = 3430, [RS_MCS_10] = 3858, [RS_MCS_11] = 4287,
                },
            },
            [RS_MNG_GI_1_6] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 142, [RS_MCS_1] = 285, [RS_MCS_2] = 428, [RS_MCS_3] = 571,
                    [RS_MCS_4] = 857, [RS_MCS_5] = 1143, [RS_MCS_6] = 1286, [RS_MCS_7] = 1429,
                    [RS_MCS_8] = 1715, [RS_MCS_9] = 1905, [RS_MCS_10] = 2143, [RS_MCS_11] = 2381,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 285, [RS_MCS_1] = 571, [RS_MCS_2] = 857, [RS_MCS_3] = 1143,
                    [RS_MCS_4] = 1715, [RS_MCS_5] = 2286, [RS_MCS_6] = 2572, [RS_MCS_7] = 2858,
                    [RS_MCS_8] = 3430, [RS_MCS_9] = 3811, [RS_MCS_10] = 4287, [RS_MCS_11] = 4763,
                },
            },
            [RS_MNG_GI_0_8] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 151, [RS_MCS_1] = 302, [RS_MCS_2] = 453, [RS_MCS_3] = 605,
                    [RS_MCS_4] = 907, [RS_MCS_5] = 1210, [RS_MCS_6] = 1361, [RS_MCS_7] = 1513,
                    [RS_MCS_8] = 1815, [RS_MCS_9] = 2017, [RS_MCS_10] = 2269, [RS_MCS_11] = 2522,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 302, [RS_MCS_1] = 605, [RS_MCS_2] = 907, [RS_MCS_3] = 1210,
                    [RS_MCS_4] = 1815, [RS_MCS_5] = 2421, [RS_MCS_6] = 2723, [RS_MCS_7] = 3026,
                    [RS_MCS_8] = 3631, [RS_MCS_9] = 4035, [RS_MCS_10] = 4539, [RS_MCS_11] = 5044,
                },
            },
        },
        [CHANNEL_WIDTH160] = {
            [RS_MNG_GI_3_2] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 257, [RS_MCS_1] = 514, [RS_MCS_2] = 771, [RS_MCS_3] = 1029,
                    [RS_MCS_4] = 1543, [RS_MCS_5] = 2058, [RS_MCS_6] = 2315, [RS_MCS_7] = 2572,
                    [RS_MCS_8] = 3087, [RS_MCS_9] = 3430, [RS_MCS_10] = 3858, [RS_MCS_11] = 4287,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 514, [RS_MCS_1] = 1029, [RS_MCS_2] = 1543, [RS_MCS_3] = 2058,
                    [RS_MCS_4] = 3087, [RS_MCS_5] = 4116, [RS_MCS_6] = 4630, [RS_MCS_7] = 5145,
                    [RS_MCS_8] = 6174, [RS_MCS_9] = 6860, [RS_MCS_10] = 7717, [RS_MCS_11] = 8575,
                },
            },
            [RS_MNG_GI_1_6] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 285, [RS_MCS_1] = 571, [RS_MCS_2] = 857, [RS_MCS_3] = 1143,
                    [RS_MCS_4] = 1715, [RS_MCS_5] = 2286, [RS_MCS_6] = 2572, [RS_MCS_7] = 2858,
                    [RS_MCS_8] = 3430, [RS_MCS_9] = 3811, [RS_MCS_10] = 4287, [RS_MCS_11] = 4763,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 571, [RS_MCS_1] = 1143, [RS_MCS_2] = 1715, [RS_MCS_3] = 2286,
                    [RS_MCS_4] = 3430, [RS_MCS_5] = 4573, [RS_MCS_6] = 5145, [RS_MCS_7] = 5716,
                    [RS_MCS_8] = 6860, [RS_MCS_9] = 7622, [RS_MCS_10] = 8575, [RS_MCS_11] = 9527,
                },
            },
            [RS_MNG_GI_0_8] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 302, [RS_MCS_1] = 605, [RS_MCS_2] = 907, [RS_MCS_3] = 1210,
                    [RS_MCS_4] = 1815, [RS_MCS_5] = 2421, [RS_MCS_6] = 2723, [RS_MCS_7] = 3026,
                    [RS_MCS_8] = 3631, [RS_MCS_9] = 4035, [RS_MCS_10] = 4539, [RS_MCS_11] = 5044,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 605, [RS_MCS_1] = 1210, [RS_MCS_2] = 1815, [RS_MCS_3] = 2421,
                    [RS_MCS_4] = 3631, [RS_MCS_5] = 4842, [RS_MCS_6] = 5447, [RS_MCS_7] = 6052,
                    [RS_MCS_8] = 7263, [RS_MCS_9] = 8070, [RS_MCS_10] = 9079, [RS_MCS_11] = 10088,
                },
            },
        },
    },
    [RS_MNG_AGG] = {
        [CHANNEL_WIDTH20] = {
            [RS_MNG_GI_3_2] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 62, [RS_MCS_1] = 124, [RS_MCS_2] = 186, [RS_MCS_3] = 248,
                    [RS_MCS_4] = 372, [RS_MCS_5] = 497, [RS_MCS_6] = 559, [RS_MCS_7] = 621,
                    [RS_MCS_8] = 745, [RS_MCS_9] = 828, [RS_MCS_10] = 932, [RS_MCS_11] = 1035,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 124, [RS_MCS_1] = 248, [RS_MCS_2] = 372, [RS_MCS_3] = 497,
                    [RS_MCS_4] = 745, [RS_MCS_5] = 994, [RS_MCS_6] = 1118, [RS_MCS_7] = 1243,
                    [RS_MCS_8] = 1491, [RS_MCS_9] = 1657, [RS_MCS_10] = 1864, [RS_MCS_11] = 2071,
                },
            },
            [RS_MNG_GI_1_6] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 69, [RS_MCS_1] = 138, [RS_MCS_2] = 207, [RS_MCS_3] = 276,
                    [RS_MCS_4] = 414, [RS_MCS_5] = 552, [RS_MCS_6] = 621, [RS_MCS_7] = 690,
                    [RS_MCS_8] = 828, [RS_MCS_9] = 920, [RS_MCS_10] = 1035, [RS_MCS_11] = 1151,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 138, [RS_MCS_1] = 276, [RS_MCS_2] = 414, [RS_MCS_3] = 552,
                    [RS_MCS_4] = 828, [RS_MCS_5] = 1105, [RS_MCS_6] = 1243, [RS_MCS_7] = 1381,
                    [RS_MCS_8] = 1657, [RS_MCS_9] = 1841, [RS_MCS_10] = 2071, [RS_MCS_11] = 2302,
                },
            },
            [RS_MNG_GI_0_8] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 73, [RS_MCS_1] = 146, [RS_MCS_2] = 219, [RS_MCS_3] = 292,
                    [RS_MCS_4] = 438, [RS_MCS_5] = 585, [RS_MCS_6] = 658, [RS_MCS_7] = 731,
                    [RS_MCS_8] = 877, [RS_MCS_9] = 975, [RS_MCS_10] = 1096, [RS_MCS_11] = 1218,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 146, [RS_MCS_1] = 292, [RS_MCS_2] = 438, [RS_MCS_3] = 585,
                    [RS_MCS_4] = 877, [RS_MCS_5] = 1170, [RS_MCS_6] = 1316, [RS_MCS_7] = 1462,
                    [RS_MCS_8] = 1755, [RS_MCS_9] = 1950, [RS_MCS_10] = 2193, [RS_MCS_11] = 2437,
                },
            },
        },
        [CHANNEL_WIDTH40] = {
            [RS_MNG_GI_3_2] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 124, [RS_MCS_1] = 248, [RS_MCS_2] = 372, [RS_MCS_3] = 497,
                    [RS_MCS_4] = 745, [RS_MCS_5] = 994, [RS_MCS_6] = 1118, [RS_MCS_7] = 1243,
                    [RS_MCS_8] = 1491, [RS_MCS_9] = 1657, [RS_MCS_10] = 1864, [RS_MCS_11] = 2071,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 248, [RS_MCS_1] = 497, [RS_MCS_2] = 745, [RS_MCS_3] = 994,
                    [RS_MCS_4] = 1491, [RS_MCS_5] = 1989, [RS_MCS_6] = 2237, [RS_MCS_7] = 2486,
                    [RS_MCS_8] = 2983, [RS_MCS_9] = 3315, [RS_MCS_10] = 3729, [RS_MCS_11] = 4143,
                },
            },
            [RS_MNG_GI_1_6] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 138, [RS_MCS_1] = 276, [RS_MCS_2] = 414, [RS_MCS_3] = 552,
                    [RS_MCS_4] = 828, [RS_MCS_5] = 1105, [RS_MCS_6] = 1243, [RS_MCS_7] = 1381,
                    [RS_MCS_8] = 1657, [RS_MCS_9] = 1841, [RS_MCS_10] = 2071, [RS_MCS_11] = 2302,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 276, [RS_MCS_1] = 552, [RS_MCS_2] = 828, [RS_MCS_3] = 1105,
                    [RS_MCS_4] = 1657, [RS_MCS_5] = 2210, [RS_MCS_6] = 2486, [RS_MCS_7] = 2762,
                    [RS_MCS_8] = 3315, [RS_MCS_9] = 3683, [RS_MCS_10] = 4143, [RS_MCS_11] = 4604,
                },
            },
            [RS_MNG_GI_0_8] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 146, [RS_MCS_1] = 292, [RS_MCS_2] = 438, [RS_MCS_3] = 585,
                    [RS_MCS_4] = 877, [RS_MCS_5] = 1170, [RS_MCS_6] = 1316, [RS_MCS_7] = 1462,
                    [RS_MCS_8] = 1755, [RS_MCS_9] = 1950, [RS_MCS_10] = 2193, [RS_MCS_11] = 2437,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 292, [RS_MCS_1] = 585, [RS_MCS_2] = 877, [RS_MCS_3] = 1170,
                    [RS_MCS_4] = 1755, [RS_MCS_5] = 2340, [RS_MCS_6] = 2632, [RS_MCS_7] = 2925,
                    [RS_MCS_8] = 3510, [RS_MCS_9] = 3900, [RS_MCS_10] = 4387, [RS_MCS_11] = 4875,
                },
            },
        },
        [CHANNEL_WIDTH80] = {
            [RS_MNG_GI_3_2] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 260, [RS_MCS_1] = 520, [RS_MCS_2] = 780, [RS_MCS_3] = 1041,
                    [RS_MCS_4] = 1561, [RS_MCS_5] = 2082, [RS_MCS_6] = 2342, [RS_MCS_7] = 2603,
                    [RS_MCS_8] = 3123, [RS_MCS_9] = 3470, [RS_MCS_10] = 3904, [RS_MCS_11] = 4338,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 520, [RS_MCS_1] = 1041, [RS_MCS_2] = 1561, [RS_MCS_3] = 2082,
                    [RS_MCS_4] = 3123, [RS_MCS_5] = 4165, [RS_MCS_6] = 4685, [RS_MCS_7] = 5206,
                    [RS_MCS_8] = 6247, [RS_MCS_9] = 6941, [RS_MCS_10] = 7809, [RS_MCS_11] = 8677,
                },
            },
            [RS_MNG_GI_1_6] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 289, [RS_MCS_1] = 578, [RS_MCS_2] = 867, [RS_MCS_3] = 1156,
                    [RS_MCS_4] = 1735, [RS_MCS_5] = 2313, [RS_MCS_6] = 2603, [RS_MCS_7] = 2892,
                    [RS_MCS_8] = 3470, [RS_MCS_9] = 3856, [RS_MCS_10] = 4338, [RS_MCS_11] = 4820,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 578, [RS_MCS_1] = 1156, [RS_MCS_2] = 1735, [RS_MCS_3] = 2313,
                    [RS_MCS_4] = 3470, [RS_MCS_5] = 4627, [RS_MCS_6] = 5206, [RS_MCS_7] = 5784,
                    [RS_MCS_8] = 6941, [RS_MCS_9] = 7712, [RS_MCS_10] = 8677, [RS_MCS_11] = 9641,
                },
            },
            [RS_MNG_GI_0_8] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 306, [RS_MCS_1] = 612, [RS_MCS_2] = 918, [RS_MCS_3] = 1225,
                    [RS_MCS_4] = 1837, [RS_MCS_5] = 2450, [RS_MCS_6] = 2756, [RS_MCS_7] = 3062,
                    [RS_MCS_8] = 3675, [RS_MCS_9] = 4083, [RS_MCS_10] = 4593, [RS_MCS_11] = 5104,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 612, [RS_MCS_1] = 1225, [RS_MCS_2] = 1837, [RS_MCS_3] = 2450,
                    [RS_MCS_4] = 3675, [RS_MCS_5] = 4900, [RS_MCS_6] = 5512, [RS_MCS_7] = 6125,
                    [RS_MCS_8] = 7350, [RS_MCS_9] = 8166, [RS_MCS_10] = 9187, [RS_MCS_11] = 10208,
                },
            },
        },
        [CHANNEL_WIDTH160] = {
            [RS_MNG_GI_3_2] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 520, [RS_MCS_1] = 1041, [RS_MCS_2] = 1561, [RS_MCS_3] = 2082,
                    [RS_MCS_4] = 3123, [RS_MCS_5] = 4165, [RS_MCS_6] = 4685, [RS_MCS_7] = 5206,
                    [RS_MCS_8] = 6247, [RS_MCS_9] = 6941, [RS_MCS_10] = 7809, [RS_MCS_11] = 8677,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 1041, [RS_MCS_1] = 2082, [RS_MCS_2] = 3123, [RS_MCS_3] = 4165,
                    [RS_MCS_4] = 6247, [RS_MCS_5] = 8330, [RS_MCS_6] = 9371, [RS_MCS_7] = 10412,
                    [RS_MCS_8] = 12495, [RS_MCS_9] = 13883, [RS_MCS_10] = 15618, [RS_MCS_11] = 17354,
                },
            },
            [RS_MNG_GI_1_6] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 578, [RS_MCS_1] = 1156, [RS_MCS_2] = 1735, [RS_MCS_3] = 2313,
                    [RS_MCS_4] = 3470, [RS_MCS_5] = 4627, [RS_MCS_6] = 5206, [RS_MCS_7] = 5784,
                    [RS_MCS_8] = 6941, [RS_MCS_9] = 7712, [RS_MCS_10] = 8677, [RS_MCS_11] = 9641,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 1156, [RS_MCS_1] = 2313, [RS_MCS_2] = 3470, [RS_MCS_3] = 4627,
                    [RS_MCS_4] = 6941, [RS_MCS_5] = 9255, [RS_MCS_6] = 10412, [RS_MCS_7] = 11569,
                    [RS_MCS_8] = 13883, [RS_MCS_9] = 15425, [RS_MCS_10] = 17354, [RS_MCS_11] = 19282,
                },
            },
            [RS_MNG_GI_0_8] = {
                [RS_MNG_SISO] = {
                    [RS_MCS_0] = 612, [RS_MCS_1] = 1225, [RS_MCS_2] = 1837, [RS_MCS_3] = 2450,
                    [RS_MCS_4] = 3675, [RS_MCS_5] = 4900, [RS_MCS_6] = 5512, [RS_MCS_7] = 6125,
                    [RS_MCS_8] = 7350, [RS_MCS_9] = 8166, [RS_MCS_10] = 9187, [RS_MCS_11] = 10208,
                },
                [RS_MNG_MIMO] = {
                    [RS_MCS_0] = 1225, [RS_MCS_1] = 2450, [RS_MCS_2] = 3675, [RS_MCS_3] = 4900,
                    [RS_MCS_4] = 7350, [RS_MCS_5] = 9800, [RS_MCS_6] = 11025, [RS_MCS_7] = 12250,
                    [RS_MCS_8] = 14700, [RS_MCS_9] = 16333, [RS_MCS_10] = 18375, [RS_MCS_11] = 20416,
                },
            },
        },
    },
};
#endif // NEEDS_PORTING

/*******************************************************************************/

/************************************************************************************/
/************************       Aggergation          ********************************/
/************************************************************************************/
// Default values for Aggregation Params
// info about the relevant fields can be found for LINK_QUAL_AGG_PARAMS_API_S
#define RS_MNG_AGG_DISABLE_START_TH 3

#if 0 // TODO(fxbug.dev/36684): Supports VHT (802.11ac)
/*******************************************************************************/
static const RS_MNG_STA_LIMITS_S g_rsMngStaModLimits[] = {
    {
        // HT/VHT/HE
        .successFramesLimit = RS_MNG_NON_LEGACY_SUCCESS_LIMIT,
        .failedFramesLimit = RS_MNG_NON_LEGACY_FAILURE_LIMIT,
        .statsFlushTimeLimit = RS_MNG_STATS_FLUSH_TIME_LIMIT,
        .clearTblWindowsLimit = RS_MNG_NON_LEGACY_MOD_COUNTER_LIMIT,
    },
    {
        // non-HT
        .successFramesLimit = RS_MNG_LEGACY_SUCCESS_LIMIT,
        .failedFramesLimit = RS_MNG_LEGACY_FAILURE_LIMIT,
        .statsFlushTimeLimit = RS_MNG_STATS_FLUSH_TIME_LIMIT,
        .clearTblWindowsLimit = RS_MNG_LEGACY_MOD_COUNTER_LIMIT,
    }};
#endif // NEEDS_PORTING

static bool _allowColAnt(const RS_MNG_STA_INFO_S *staInfo, U32 bw,
			 const RS_MNG_COL_ELEM_S *nextCol);
static bool _allowColMimo(const RS_MNG_STA_INFO_S *staInfo, U32 bw,
			  const RS_MNG_COL_ELEM_S *nextCol);
static bool _allowColSiso(const RS_MNG_STA_INFO_S *staInfo, U32 bw,
			  const RS_MNG_COL_ELEM_S *nextCol);
static bool _allowColSgi(const RS_MNG_STA_INFO_S *staInfo, U32 bw,
			 const RS_MNG_COL_ELEM_S *nextCol);
static bool _alloCol2xLTF(const RS_MNG_STA_INFO_S *staInfo, U32 bw,
			  const RS_MNG_COL_ELEM_S *nextCol);
static bool _allowColHe(const RS_MNG_STA_INFO_S *staInfo, U32 bw,
			const RS_MNG_COL_ELEM_S *nextCol);
static bool _allowColHtVht(const RS_MNG_STA_INFO_S *staInfo, U32 bw,
			   const RS_MNG_COL_ELEM_S *nextCol);

static const RS_MNG_COL_ELEM_S rsMngColumns[] = {
    [RS_MNG_COL_NON_HT_ANT_A] =
        {
            .mode = RS_MNG_MODUL_LEGACY,
            .ant = TLC_MNG_CHAIN_A_MSK,
            .nextCols = {RS_MNG_COL_NON_HT_ANT_B, RS_MNG_COL_SISO_ANT_A, RS_MNG_COL_MIMO2,
                         RS_MNG_COL_HE_3_2_SISO_ANT_A, RS_MNG_COL_HE_3_2_MIMO, RS_MNG_COL_INVALID,
                         RS_MNG_COL_INVALID},
            .checks = {_allowColAnt},
        },
    [RS_MNG_COL_NON_HT_ANT_B] =
        {
            .mode = RS_MNG_MODUL_LEGACY,
            .ant = TLC_MNG_CHAIN_B_MSK,
            .nextCols = {RS_MNG_COL_NON_HT_ANT_A, RS_MNG_COL_SISO_ANT_B, RS_MNG_COL_MIMO2,
                         RS_MNG_COL_HE_3_2_SISO_ANT_B, RS_MNG_COL_HE_3_2_MIMO, RS_MNG_COL_INVALID,
                         RS_MNG_COL_INVALID},
            .checks = {_allowColAnt},
        },
    [RS_MNG_COL_SISO_ANT_A] =
        {
            .mode = RS_MNG_MODUL_SISO,
            .ant = TLC_MNG_CHAIN_A_MSK,
            .nextCols = {RS_MNG_COL_SISO_ANT_B, RS_MNG_COL_MIMO2, RS_MNG_COL_SISO_ANT_A_SGI,
                         RS_MNG_COL_NON_HT_ANT_A, RS_MNG_COL_NON_HT_ANT_B, RS_MNG_COL_INVALID,
                         RS_MNG_COL_INVALID},
            .checks = {_allowColHtVht, _allowColSiso, _allowColAnt},
        },
    [RS_MNG_COL_SISO_ANT_B] =
        {
            .mode = RS_MNG_MODUL_SISO,
            .ant = TLC_MNG_CHAIN_B_MSK,
            .nextCols = {RS_MNG_COL_SISO_ANT_A, RS_MNG_COL_MIMO2, RS_MNG_COL_SISO_ANT_B_SGI,
                         RS_MNG_COL_NON_HT_ANT_A, RS_MNG_COL_NON_HT_ANT_B, RS_MNG_COL_INVALID,
                         RS_MNG_COL_INVALID},
            .checks = {_allowColHtVht, _allowColSiso, _allowColAnt},
        },
    [RS_MNG_COL_SISO_ANT_A_SGI] =
        {
            .mode = RS_MNG_MODUL_SISO,
            .ant = TLC_MNG_CHAIN_A_MSK,
            .gi = HT_VHT_SGI,
            .nextCols = {RS_MNG_COL_SISO_ANT_B_SGI, RS_MNG_COL_MIMO2_SGI, RS_MNG_COL_SISO_ANT_A,
                         RS_MNG_COL_NON_HT_ANT_A, RS_MNG_COL_NON_HT_ANT_B, RS_MNG_COL_INVALID,
                         RS_MNG_COL_INVALID},
            .checks = {_allowColHtVht, _allowColSiso, _allowColAnt, _allowColSgi},
        },
    [RS_MNG_COL_SISO_ANT_B_SGI] =
        {
            .mode = RS_MNG_MODUL_SISO,
            .ant = TLC_MNG_CHAIN_B_MSK,
            .gi = HT_VHT_SGI,
            .nextCols = {RS_MNG_COL_SISO_ANT_A_SGI, RS_MNG_COL_MIMO2_SGI, RS_MNG_COL_SISO_ANT_B,
                         RS_MNG_COL_NON_HT_ANT_A, RS_MNG_COL_NON_HT_ANT_B, RS_MNG_COL_INVALID,
                         RS_MNG_COL_INVALID},
            .checks = {_allowColHtVht, _allowColSiso, _allowColAnt, _allowColSgi},
        },
    [RS_MNG_COL_MIMO2] =
        {
            .mode = RS_MNG_MODUL_MIMO2,
            .ant = TLC_MNG_CHAIN_A_MSK | TLC_MNG_CHAIN_B_MSK,
            .nextCols =
                {RS_MNG_COL_SISO_ANT_A,  // + NON_SHARED_ANT_RFIC_ID (see _rsMngGetNextColId)
                 RS_MNG_COL_MIMO2_SGI, RS_MNG_COL_NON_HT_ANT_A, RS_MNG_COL_NON_HT_ANT_B,
                 RS_MNG_COL_INVALID, RS_MNG_COL_INVALID, RS_MNG_COL_INVALID},
            .checks = {_allowColHtVht, _allowColMimo},
        },
    [RS_MNG_COL_MIMO2_SGI] =
        {
            .mode = RS_MNG_MODUL_MIMO2,
            .ant = TLC_MNG_CHAIN_A_MSK | TLC_MNG_CHAIN_B_MSK,
            .gi = HT_VHT_SGI,
            .nextCols =
                {RS_MNG_COL_SISO_ANT_A_SGI,  // + NON_SHARED_ANT_RFIC_ID (see _rsMngGetNextColId)
                 RS_MNG_COL_MIMO2, RS_MNG_COL_NON_HT_ANT_A, RS_MNG_COL_NON_HT_ANT_B,
                 RS_MNG_COL_INVALID, RS_MNG_COL_INVALID, RS_MNG_COL_INVALID},
            .checks = {_allowColHtVht, _allowColMimo, _allowColSgi},
        },
    [RS_MNG_COL_HE_3_2_SISO_ANT_A] =
        {
            .mode = RS_MNG_MODUL_SISO,
            .ant = TLC_MNG_CHAIN_A_MSK,
            .gi = HE_3_2_GI,
            .nextCols = {RS_MNG_COL_HE_3_2_SISO_ANT_B, RS_MNG_COL_HE_3_2_MIMO,
                         RS_MNG_COL_HE_1_6_SISO_ANT_A, RS_MNG_COL_NON_HT_ANT_A,
                         RS_MNG_COL_NON_HT_ANT_B, RS_MNG_COL_INVALID, RS_MNG_COL_INVALID},
            .checks = {_allowColHe, _allowColSiso, _allowColAnt},
        },
    [RS_MNG_COL_HE_1_6_SISO_ANT_A] =
        {
            .mode = RS_MNG_MODUL_SISO,
            .ant = TLC_MNG_CHAIN_A_MSK,
            .gi = HE_1_6_GI,
            .nextCols = {RS_MNG_COL_HE_1_6_SISO_ANT_B, RS_MNG_COL_HE_1_6_MIMO,
                         RS_MNG_COL_HE_0_8_SISO_ANT_A, RS_MNG_COL_HE_3_2_SISO_ANT_A,
                         RS_MNG_COL_NON_HT_ANT_A, RS_MNG_COL_NON_HT_ANT_B, RS_MNG_COL_INVALID},
            .checks = {_allowColHe, _allowColSiso, _allowColAnt, _alloCol2xLTF},
        },
    [RS_MNG_COL_HE_0_8_SISO_ANT_A] =
        {
            .mode = RS_MNG_MODUL_SISO,
            .ant = TLC_MNG_CHAIN_A_MSK,
            .gi = HE_0_8_GI,
            .nextCols = {RS_MNG_COL_HE_0_8_SISO_ANT_B, RS_MNG_COL_HE_0_8_MIMO,
                         RS_MNG_COL_HE_1_6_SISO_ANT_A, RS_MNG_COL_NON_HT_ANT_A,
                         RS_MNG_COL_NON_HT_ANT_B, RS_MNG_COL_INVALID, RS_MNG_COL_INVALID},
            .checks = {_allowColHe, _allowColSiso, _allowColAnt, _alloCol2xLTF},
        },
    [RS_MNG_COL_HE_3_2_SISO_ANT_B] =
        {
            .mode = RS_MNG_MODUL_SISO,
            .ant = TLC_MNG_CHAIN_B_MSK,
            .gi = HE_3_2_GI,
            .nextCols = {RS_MNG_COL_HE_3_2_SISO_ANT_A, RS_MNG_COL_HE_3_2_MIMO,
                         RS_MNG_COL_HE_1_6_SISO_ANT_B, RS_MNG_COL_NON_HT_ANT_A,
                         RS_MNG_COL_NON_HT_ANT_B, RS_MNG_COL_INVALID, RS_MNG_COL_INVALID},
            .checks = {_allowColHe, _allowColSiso, _allowColAnt},
        },
    [RS_MNG_COL_HE_1_6_SISO_ANT_B] =
        {
            .mode = RS_MNG_MODUL_SISO,
            .ant = TLC_MNG_CHAIN_B_MSK,
            .gi = HE_1_6_GI,
            .nextCols = {RS_MNG_COL_HE_1_6_SISO_ANT_A, RS_MNG_COL_HE_1_6_MIMO,
                         RS_MNG_COL_HE_0_8_SISO_ANT_B, RS_MNG_COL_HE_3_2_SISO_ANT_B,
                         RS_MNG_COL_NON_HT_ANT_A, RS_MNG_COL_NON_HT_ANT_B, RS_MNG_COL_INVALID},
            .checks = {_allowColHe, _allowColSiso, _allowColAnt, _alloCol2xLTF},
        },
    [RS_MNG_COL_HE_0_8_SISO_ANT_B] =
        {
            .mode = RS_MNG_MODUL_SISO,
            .ant = TLC_MNG_CHAIN_B_MSK,
            .gi = HE_0_8_GI,
            .nextCols = {RS_MNG_COL_HE_0_8_SISO_ANT_A, RS_MNG_COL_HE_0_8_MIMO,
                         RS_MNG_COL_HE_1_6_SISO_ANT_B, RS_MNG_COL_NON_HT_ANT_A,
                         RS_MNG_COL_NON_HT_ANT_B, RS_MNG_COL_INVALID, RS_MNG_COL_INVALID},
            .checks = {_allowColHe, _allowColSiso, _allowColAnt, _alloCol2xLTF},
        },
    [RS_MNG_COL_HE_3_2_MIMO] =
        {
            .mode = RS_MNG_MODUL_MIMO2,
            .ant = TLC_MNG_CHAIN_A_MSK | TLC_MNG_CHAIN_B_MSK,
            .gi = HE_3_2_GI,
            .nextCols =
                {RS_MNG_COL_HE_3_2_SISO_ANT_A,  // + NON_SHARED_ANT_RFIC_ID (see _rsMngGetNextColId)
                 RS_MNG_COL_HE_1_6_MIMO, RS_MNG_COL_NON_HT_ANT_A, RS_MNG_COL_NON_HT_ANT_B,
                 RS_MNG_COL_INVALID, RS_MNG_COL_INVALID, RS_MNG_COL_INVALID},
            .checks = {_allowColHe, _allowColMimo},
        },
    [RS_MNG_COL_HE_1_6_MIMO] =
        {
            .mode = RS_MNG_MODUL_MIMO2,
            .ant = TLC_MNG_CHAIN_A_MSK | TLC_MNG_CHAIN_B_MSK,
            .gi = HE_1_6_GI,
            .nextCols =
                {RS_MNG_COL_HE_1_6_SISO_ANT_A,  // + NON_SHARED_ANT_RFIC_ID (see _rsMngGetNextColId)
                 RS_MNG_COL_HE_0_8_MIMO, RS_MNG_COL_HE_3_2_MIMO, RS_MNG_COL_NON_HT_ANT_A,
                 RS_MNG_COL_NON_HT_ANT_B, RS_MNG_COL_INVALID, RS_MNG_COL_INVALID},
            .checks = {_allowColHe, _allowColMimo, _alloCol2xLTF},
        },
    [RS_MNG_COL_HE_0_8_MIMO] =
        {
            .mode = RS_MNG_MODUL_MIMO2,
            .ant = TLC_MNG_CHAIN_A_MSK | TLC_MNG_CHAIN_B_MSK,
            .gi = HE_0_8_GI,
            .nextCols =
                {RS_MNG_COL_HE_0_8_SISO_ANT_A,  // + NON_SHARED_ANT_RFIC_ID (see _rsMngGetNextColId)
                 RS_MNG_COL_HE_1_6_MIMO, RS_MNG_COL_NON_HT_ANT_A, RS_MNG_COL_NON_HT_ANT_B,
                 RS_MNG_COL_INVALID, RS_MNG_COL_INVALID, RS_MNG_COL_INVALID},
            .checks = {_allowColHe, _allowColMimo, _alloCol2xLTF},
        },

};
/*******************************************************************************/

/*******************************************************************************/
/*        General Helper functions                                             */
/*******************************************************************************/

static void _rsMngRateCheckSet(const RS_MNG_RATE_S *rsMngRate,
			       RS_MNG_RATE_SETTING_BITMAP_E setting)
{
	WARN_ON(rsMngRate->unset & setting);
}

static RS_MNG_MODULATION_E
_rsMngRateGetModulation(const RS_MNG_RATE_S *rsMngRate)
{
	RS_MNG_MODULATION_E modulation;

	if (IS_RATE_OFDM_VHT_API_M(rsMngRate->rate) ||
	    IS_RATE_OFDM_HT_API_M(rsMngRate->rate) ||
	    IS_RATE_OFDM_HE_API_M(rsMngRate->rate)) {
		if (GET_MIMO_INDEX_API_M(rsMngRate->rate) == SISO_INDX) {
			modulation = RS_MNG_MODUL_SISO;
		} else {
			modulation = RS_MNG_MODUL_MIMO2;
		}
	} else {
		modulation = RS_MNG_MODUL_LEGACY;
	}

	_rsMngRateCheckSet(rsMngRate, RS_MNG_RATE_MODULATION);
	return modulation;
}

static void _rsMngRateSetModulation(RS_MNG_RATE_S *rsMngRate,
				    RS_MNG_MODULATION_E mod)
{
	if (mod == RS_MNG_MODUL_MIMO2) {
		if (IS_RATE_OFDM_VHT_API_M(rsMngRate->rate) ||
		    IS_RATE_OFDM_HE_API_M(rsMngRate->rate)) {
			rsMngRate->rate.rate_n_flags |= RATE_MCS_VHT_MIMO2;
		} else {
			rsMngRate->rate.rate_n_flags |= RATE_MCS_HT_MIMO2_MSK;
		}
	}

	if (mod == RS_MNG_MODUL_SISO) {
		if (IS_RATE_OFDM_VHT_API_M(rsMngRate->rate) ||
		    IS_RATE_OFDM_HE_API_M(rsMngRate->rate)) {
			rsMngRate->rate.rate_n_flags &= ~RATE_MCS_VHT_MIMO2;
		} else {
			rsMngRate->rate.rate_n_flags &= ~RATE_MCS_HT_MIMO2_MSK;
		}
	}

	rsMngRate->unset &= ~RS_MNG_RATE_MODULATION;
	rsMngRate->unset |= RS_MNG_RATE_STBC;
}

static TLC_MNG_MODE_E _rsMngRateGetMode(const RS_MNG_RATE_S *rsMngRate)
{
	TLC_MNG_MODE_E rateMode;

	_rsMngRateCheckSet(rsMngRate, RS_MNG_RATE_MODE);

	if (IS_RATE_OFDM_HE_API_M(rsMngRate->rate)) {
		rateMode = TLC_MNG_MODE_HE;
	} else if (IS_RATE_OFDM_VHT_API_M(rsMngRate->rate)) {
		rateMode = TLC_MNG_MODE_VHT;
	} else if (IS_RATE_OFDM_HT_API_M(rsMngRate->rate)) {
		rateMode = TLC_MNG_MODE_HT;
	} else {
		rateMode = TLC_MNG_MODE_LEGACY;
	}

	return rateMode;
}

static void _rsMngRateSetMode(RS_MNG_RATE_S *rsMngRate, TLC_MNG_MODE_E mode)
{
	/* This resets the rate completely */
	rsMngRate->rate.rate_n_flags = 0;
	/* We don't really use bfer, so don't mark it as reset */
	rsMngRate->unset = RS_MNG_RATE_SET_ALL &
			   ~(RS_MNG_RATE_MODE | RS_MNG_RATE_BFER);

	switch (mode) {
	case TLC_MNG_MODE_LEGACY:
		break;
	case TLC_MNG_MODE_HT:
		rsMngRate->rate.rate_n_flags |= RATE_MCS_HT_MSK;
		break;
	case TLC_MNG_MODE_VHT:
		rsMngRate->rate.rate_n_flags |= RATE_MCS_VHT_MSK;
		break;
	case TLC_MNG_MODE_HE:
		rsMngRate->rate.rate_n_flags |= RATE_MCS_HE_MSK;
		break;
	default:
		break;
	}
}

static U32 _rsMngRateGetBw(const RS_MNG_RATE_S *rsMngRate)
{
	U32 bw = GET_BW_INDEX_API_M(rsMngRate->rate);

	_rsMngRateCheckSet(rsMngRate, RS_MNG_RATE_BW);
	return bw;
}

static void _rsMngRateSetBw(RS_MNG_RATE_S *rsMngRate, U32 bw)
{
	rsMngRate->rate.rate_n_flags &= ~RATE_MCS_FAT_MSK_API_D;
	rsMngRate->rate.rate_n_flags |= bw << RATE_MCS_FAT_POS;
	rsMngRate->unset &= ~RS_MNG_RATE_BW;
}

static RS_MNG_GI_E _rsMngRateGetGi(const RS_MNG_RATE_S *rsMngRate)
{
	_rsMngRateCheckSet(rsMngRate, RS_MNG_RATE_GI);

	if (_rsMngRateGetMode(rsMngRate) != TLC_MNG_MODE_HE) {
		return (rsMngRate->rate.rate_n_flags & RATE_MCS_SGI_MSK) ?
			       HT_VHT_SGI :
			       HT_VHT_NGI;
	}

	switch (GET_OFDM_HE_GI_LTF_INDX_API_M(rsMngRate->rate)) {
	case 0:
	case 1:
		return HE_0_8_GI;
	case 2:
		return HE_1_6_GI;
	case 3:
		return HE_3_2_GI;
	}

	return HT_VHT_NGI; // impossible
}

static void _rsMngRateSetGi(RS_MNG_RATE_S *rsMngRate, RS_MNG_GI_E gi)
{
	if (_rsMngRateGetMode(rsMngRate) != TLC_MNG_MODE_HE) {
		WARN_ON(!(gi == HT_VHT_NGI || gi == HT_VHT_SGI));
		rsMngRate->rate.rate_n_flags &= ~RATE_MCS_SGI_MSK;
		rsMngRate->rate.rate_n_flags |= (gi == HT_VHT_SGI)
						<< RATE_MCS_SGI_POS;
	} else {
		rsMngRate->rate.rate_n_flags &= ~RATE_MCS_HE_GI_LTF_MSK;
		switch (gi) {
		case HT_VHT_NGI:
		case HT_VHT_SGI:
			WARN_ON(1);
			break;
		case HE_0_8_GI:
			// 2xLTF
			rsMngRate->rate.rate_n_flags |=
				1 << RATE_MCS_HE_GI_LTF_POS;
			break;
		case HE_1_6_GI:
			// 2xLTF
			rsMngRate->rate.rate_n_flags |=
				2 << RATE_MCS_HE_GI_LTF_POS;
			break;
		case HE_3_2_GI:
			// 4xLTF
			rsMngRate->rate.rate_n_flags |=
				3 << RATE_MCS_HE_GI_LTF_POS;
			break;
		}
	}

	rsMngRate->unset &= ~RS_MNG_RATE_GI;
}

static void _rsMngRateSetLdpc(RS_MNG_RATE_S *rsMngRate, bool ldpc)
{
	rsMngRate->rate.rate_n_flags &= ~RATE_MCS_LDPC_MSK;
	rsMngRate->rate.rate_n_flags |= (!!ldpc) << RATE_MCS_LDPC_POS;
	rsMngRate->unset &= ~RS_MNG_RATE_LDPC;
}

#if 0 // NEEDS_PORTING
static BOOLEAN _rsMngRateGetStbc(const RS_MNG_RATE_S* rsMngRate) {
  _rsMngRateCheckSet(rsMngRate, RS_MNG_RATE_STBC);
  return !!(rsMngRate->rate.rate_n_flags & RATE_MCS_STBC_MSK);
}
#endif // NEEDS_PORTING

static void _rsMngRateSetStbc(RS_MNG_RATE_S *rsMngRate, bool stbc)
{
	WARN_ON(!(!stbc ||
		  !(rsMngRate->rate.rate_n_flags & RATE_MCS_HE_DCM_MSK)));

	rsMngRate->rate.rate_n_flags &= ~RATE_MCS_STBC_MSK;
	rsMngRate->rate.rate_n_flags |= (!!stbc) << RATE_MCS_STBC_POS;
	rsMngRate->unset &= ~RS_MNG_RATE_STBC;
	rsMngRate->unset |= RS_MNG_RATE_ANT;
}

static void _rsMngRateSetBfer(RS_MNG_RATE_S *rsMngRate, bool bfer)
{
	rsMngRate->rate.rate_n_flags &= ~RATE_MCS_BF_MSK;
	rsMngRate->rate.rate_n_flags |= (!!bfer) << RATE_MCS_BF_POS;
	rsMngRate->unset &= ~RS_MNG_RATE_BFER;
}

static U08 _rsMngRateGetAnt(const RS_MNG_RATE_S *rsMngRate)
{
	_rsMngRateCheckSet(rsMngRate, RS_MNG_RATE_ANT);
	return (U08)GET_ANT_CHAIN_API_M(rsMngRate->rate);
	;
}

static void _rsMngRateSetAnt(RS_MNG_RATE_S *rsMngRate, U08 ant)
{
	// compilation asserts to make sure tlc offload api and rate api agree
	BUILD_BUG_ON(!(TLC_MNG_CHAIN_A_MSK ==
		       SHIFT_AND_MASK(RATE_MCS_ANT_A_MSK, RATE_MCS_ANT_ABC_MSK,
				      RATE_MCS_ANT_A_POS)));
	BUILD_BUG_ON(!(TLC_MNG_CHAIN_B_MSK ==
		       SHIFT_AND_MASK(RATE_MCS_ANT_B_MSK, RATE_MCS_ANT_ABC_MSK,
				      RATE_MCS_ANT_A_POS)));

	rsMngRate->rate.rate_n_flags &= ~RATE_MCS_ANT_ABC_MSK;
	rsMngRate->rate.rate_n_flags |= ant << RATE_MCS_ANT_A_POS;

	rsMngRate->unset &= ~RS_MNG_RATE_ANT;
}

static U08 _rsMngRateGetIdx(const RS_MNG_RATE_S *rsMngRate)
{
	return rsMngRate->idx.idx;
}

static void _rsMngRateSetIdx(RS_MNG_RATE_S *rsMngRate, U08 idx)
{
	rsMngRate->idx.idx = idx;

	// DCM and STBC can't coexist. Since DCM is set here, make sure stbc has been set before setting
	// the index, so the stbc setting could be overriden here without issue
	_rsMngRateCheckSet(rsMngRate, RS_MNG_RATE_STBC);

	switch (_rsMngRateGetMode(rsMngRate)) {
	case TLC_MNG_MODE_HE:
		rsMngRate->rate.rate_n_flags &= ~RATE_MCS_VHT_RATE_CODE_MSK;
		if (idx == RS_MCS_0_HE_ER_AND_DCM) {
			rsMngRate->rate.rate_n_flags |=
				RATE_MCS_HE_DCM_MSK |
				(RATE_MCS_HE_EXT_RANGE
				 << RATE_MCS_VHT_HE_TYPE_POS);
			rsMngRate->rate.rate_n_flags &= ~RATE_MCS_STBC_MSK;
		} else {
			rsMngRate->rate.rate_n_flags &= ~(
				RATE_MCS_HE_DCM_MSK | RATE_MCS_VHT_HE_TYPE_MSK);
			rsMngRate->rate.rate_n_flags |= idx;
		}
		break;
	case TLC_MNG_MODE_VHT:
		rsMngRate->rate.rate_n_flags &= ~RATE_MCS_VHT_RATE_CODE_MSK;
		rsMngRate->rate.rate_n_flags |= idx;
		break;
	case TLC_MNG_MODE_HT:
		rsMngRate->rate.rate_n_flags &= ~RATE_MCS_HT_RATE_CODE_MSK;
		rsMngRate->rate.rate_n_flags |= idx;
		break;
	case TLC_MNG_MODE_LEGACY: {
		RS_NON_HT_RATES_E nonHtIdx = (RS_NON_HT_RATES_E)idx;

		rsMngRate->rate.rate_n_flags &= ~0xff;
		rsMngRate->rate.rate_n_flags |=
			RS_NON_HT_RATE_TO_API_RATE[nonHtIdx];
		if (nonHtIdx <= RS_NON_HT_RATE_CCK_LAST) {
			rsMngRate->rate.rate_n_flags |= RATE_MCS_CCK_MSK;
		} else {
			rsMngRate->rate.rate_n_flags &= ~RATE_MCS_CCK_MSK;
		}
		break;
	}
	default:
		// shouldn't happen. return now so the index remains unset and an assert will be hit when
		// trying to build the rate table with this rate
		return;
	}

	rsMngRate->unset &= ~RS_MNG_RATE_U_IDX;
}

static void _rsMngRateInvalidate(RS_MNG_RATE_S *rsMngRate)
{
	rsMngRate->unset = RS_MNG_RATE_SET_ALL;
}

static U16 _rsMngGetSupportedRatesByModeAndBw(const RS_MNG_STA_INFO_S *staInfo,
					      RS_MNG_MODULATION_E modulation,
					      TLC_MNG_CH_WIDTH_E bw)
{
	bool isBw160;
	U32 supportedRates;

	if (modulation == RS_MNG_MODUL_LEGACY) {
		return staInfo->config.nonHt;
	}

	isBw160 = (bw == TLC_MNG_CH_WIDTH_160MHZ);
	supportedRates = (modulation == RS_MNG_MODUL_SISO ?
				  staInfo->config.mcs[TLC_MNG_NSS_1][isBw160] :
				  staInfo->config.mcs[TLC_MNG_NSS_2][isBw160]);

	if (staInfo->config.bestSuppMode == TLC_MNG_MODE_VHT &&
	    bw == CHANNEL_WIDTH20) {
		// In VHT, mcs 9 is never posible at 20mhz bandwidth
		supportedRates &= ~BIT(RS_MCS_9);
	}

	return (U16)supportedRates;
}

static U16 _rsMngGetSuppRatesSameMode(const RS_MNG_STA_INFO_S *staInfo,
				      const RS_MNG_RATE_S *rsMngRate)
{
	return _rsMngGetSupportedRatesByModeAndBw(
		staInfo, _rsMngRateGetModulation(rsMngRate),
		_rsMngRateGetBw(rsMngRate));
}

static TLC_MNG_CH_WIDTH_E _rsMngGetMaxChWidth(const RS_MNG_STA_INFO_S *staInfo)
{
	return (TLC_MNG_CH_WIDTH_E)staInfo->config.maxChWidth;
}

#if 0 // NEEDS_PORTING
static BOOLEAN _rsMngAreAggsSupported(TLC_MNG_MODE_E bestSuppMode) {
  return bestSuppMode > TLC_MNG_MODE_LEGACY;
}
#endif // NEEDS_PORTING

static bool _rsMngIsDcmSupported(const RS_MNG_STA_INFO_S *staInfo, bool isMimo)
{
	if (isMimo) {
		return !!(staInfo->config.configFlags &
			  TLC_MNG_CONFIG_FLAGS_HE_DCM_NSS_2_MSK);
	}

	return !!(staInfo->config.configFlags &
		  TLC_MNG_CONFIG_FLAGS_HE_DCM_NSS_1_MSK);
}

#if 0 // NEEDS_PORTING
static BOOLEAN _rsMngRateIsOptimal(const RS_MNG_STA_INFO_S* staInfo,
                                   const RS_MNG_RATE_S* rsMngRate) {
  U32 bw = _rsMngRateGetBw(rsMngRate);
  BOOLEAN mimoAllowed = staInfo->config.mcs[TLC_MNG_NSS_2][bw == CHANNEL_WIDTH160];

  if (_rsMngRateGetMode(rsMngRate) != staInfo->config.bestSuppMode) {
    return FALSE;
  }

  if (_rsMngRateGetIdx(rsMngRate) != MSB2ORD(_rsMngGetSuppRatesSameMode(staInfo, rsMngRate))) {
    return FALSE;
  }

  // TODO: check for best ltf/gi in HE. This condition currently means that tpc won't be enabled
  // in HE.
  if ((staInfo->config.sgiChWidthSupport & BIT(bw)) && _rsMngRateGetGi(rsMngRate) != HT_VHT_SGI) {
    return FALSE;
  }

  if (mimoAllowed && _rsMngRateGetModulation(rsMngRate) != RS_MNG_MODUL_MIMO2) {
    return FALSE;
  }

  if (bw != _rsMngGetMaxChWidth(staInfo)) {
    return FALSE;
  }

  return TRUE;
}
#endif // NEEDS_PORTING

static U08 _rsMngGetHigherRateIdx(U08 initRateIdx, U32 supportedRatesMsk)
{
	U32 tmpRateMsk;

	if (initRateIdx == RS_MCS_0_HE_ER_AND_DCM) {
		return (U08)LSB2ORD(supportedRatesMsk);
	}

	tmpRateMsk = supportedRatesMsk & (0xFFFFFFFF << (initRateIdx + 1));

	return (U08)(tmpRateMsk == 0 ? RS_MNG_INVALID_RATE_IDX :
				       LSB2ORD(tmpRateMsk));
}

static U08 _rsMngGetLowerRateIdx(const RS_MNG_STA_INFO_S *staInfo,
				 const RS_MNG_RATE_S *rate,
				 U32 supportedRatesMsk)
{
	U08 idx = _rsMngRateGetIdx(rate);
	U32 tmpRateMsk = (supportedRatesMsk & ((1 << idx) - 1));

	if (idx == RS_MCS_0_HE_ER_AND_DCM) {
		return RS_MNG_INVALID_RATE_IDX;
	}

	if (tmpRateMsk == 0) {
		if (_rsMngRateGetMode(rate) == TLC_MNG_MODE_HE &&
		    _rsMngRateGetBw(rate) == CHANNEL_WIDTH20 &&
		    _rsMngIsDcmSupported(staInfo,
					 _rsMngRateGetModulation(rate) ==
						 RS_MNG_MODUL_MIMO2)) {
			return RS_MCS_0_HE_ER_AND_DCM;
		}

		return RS_MNG_INVALID_RATE_IDX;
	}

	return (U08)MSB2ORD(tmpRateMsk);
}

// rs_get_adjacent_rate
// get adjacent supported rate
// suppRateDir : use GET_HIGHER_SUPPORTED_RATE or GET_LOWER_SUPPORTED_RATE
static U08 _rsMngGetAdjacentRateIdx(const RS_MNG_STA_INFO_S *staInfo,
				    const RS_MNG_RATE_S *initRate,
				    U08 suppRateDir)
{
	U08 initRateIdx = _rsMngRateGetIdx(initRate);
	U32 supportedRatesMsk = _rsMngGetSuppRatesSameMode(staInfo, initRate);

	return (U08)(suppRateDir == GET_LOWER_SUPPORTED_RATE ?
			     _rsMngGetLowerRateIdx(staInfo, initRate,
						   supportedRatesMsk) :
			     _rsMngGetHigherRateIdx(initRateIdx,
						    supportedRatesMsk));
}

// TODO - check. what if bt doesn't allow?
static bool _rsMngIsStbcSupported(const RS_MNG_STA_INFO_S *staInfo)
{
	return !!(staInfo->config.configFlags & TLC_MNG_CONFIG_FLAGS_STBC_MSK);
}

static bool _rsMngIsStbcAllowed(const RS_MNG_STA_INFO_S *staInfo,
				const RS_MNG_RATE_S *rate)
{
	if ((iwl_mvm_get_valid_tx_ant(staInfo->mvm) & rsMngGetDualAntMsk()) !=
	    rsMngGetDualAntMsk()) {
		return false;
	}
	return _rsMngIsStbcSupported(staInfo) &&
	       !(rate->rate.rate_n_flags & RATE_MCS_HE_DCM_MSK);
}

static bool _rsMngCoexIsLongAggAllowed(const RS_MNG_STA_INFO_S *staInfo)
{
	if (staInfo->config.band != WLAN_BAND_TWO_GHZ) {
		return true;
	}

	if (btCoexManagerBtOwnsAnt(staInfo->mvm)) {
		return false;
	}

	return true;
}

static bool _rsMngIsLdpcAllowed(const RS_MNG_STA_INFO_S *staInfo)
{
	return !!(staInfo->config.configFlags & TLC_MNG_CONFIG_FLAGS_LDPC_MSK);
}

static bool _rsMngIsAntSupported(const RS_MNG_STA_INFO_S *staInfo, U08 ant)
{
	return (ant & staInfo->config.chainsEnabled) == ant &&
	       (iwl_mvm_get_valid_tx_ant(staInfo->mvm) & ant) == ant;
}
/*******************************************************************************/

/************************************************************************************/
/*                            allowColFuncs                                         */
/************************************************************************************/

static bool _allowColAnt(const RS_MNG_STA_INFO_S *staInfo, U32 bw,
			 const RS_MNG_COL_ELEM_S *nextCol)
{
	if (!_rsMngIsAntSupported(staInfo, nextCol->ant)) {
		return false;
	}

	if (!_rsMngIsAntSupported(staInfo,
				  (U08)(nextCol->ant ^ rsMngGetDualAntMsk()))) {
		// If the other antenna is disabled for some reason, this antenna is the only one allowed so
		// we must ignore possible BT-Coex restrictions. Also note that this function is only called
		// for siso columns, so nextCol->ant always has just one bit set so the xor makes sense.
		return true;
	}

	if (staInfo->config.band != WLAN_BAND_TWO_GHZ) {
		return true;
	}

	if (btCoexManagerIsAntAvailable(staInfo->mvm, nextCol->ant)) {
		return true;
	}

	return false;
}

static U16 _rsMngGetAggTimeLimit(RS_MNG_STA_INFO_S *staInfo)
{
	// Someone configured debug values, use them no matter what
	if (staInfo->aggDurationLimit != RS_MNG_AGG_DURATION_LIMIT) {
		return staInfo->aggDurationLimit;
	}

	if (_rsMngCoexIsLongAggAllowed(staInfo)) {
		staInfo->longAggEnabled = true;
		return RS_MNG_AGG_DURATION_LIMIT;
	}

	staInfo->longAggEnabled = false;
	return RS_MNG_AGG_DURATION_LIMIT_SHORT;
}

static bool _allowColMimo(const RS_MNG_STA_INFO_S *staInfo, U32 bw,
			  const RS_MNG_COL_ELEM_S *nextCol)
{
	bool isBw160 = (bw == TLC_MNG_CH_WIDTH_160MHZ);

	// TODO - check if ht/vht supported? redundent
	// if no mimo rate is supported
	if (!(staInfo->config.mcs[TLC_MNG_NSS_2][isBw160])) {
		return false;
	}

	if (staInfo->config.chainsEnabled != rsMngGetDualAntMsk()) {
		return false;
	}

	if (iwl_mvm_get_valid_tx_ant(staInfo->mvm) != rsMngGetDualAntMsk()) {
		return false;
	}

	return true;
}

static bool _allowColSiso(const RS_MNG_STA_INFO_S *staInfo, U32 bw,
			  const RS_MNG_COL_ELEM_S *nextCol)
{
	bool isBw160 = (bw == TLC_MNG_CH_WIDTH_160MHZ);

	// if there are supported SISO rates - return true. else - return false
	return (!!(staInfo->config.mcs[TLC_MNG_NSS_1][isBw160]));
}

static bool _allowColHe(const RS_MNG_STA_INFO_S *staInfo, U32 bw,
			const RS_MNG_COL_ELEM_S *nextCol)
{
	return !!(staInfo->config.bestSuppMode == TLC_MNG_MODE_HE);
}

static bool _allowColHtVht(const RS_MNG_STA_INFO_S *staInfo, U32 bw,
			   const RS_MNG_COL_ELEM_S *nextCol)
{
	return !!(staInfo->config.bestSuppMode == TLC_MNG_MODE_HT ||
		  staInfo->config.bestSuppMode == TLC_MNG_MODE_VHT);
}

static bool _allowColSgi(const RS_MNG_STA_INFO_S *staInfo, U32 bw,
			 const RS_MNG_COL_ELEM_S *nextCol)
{
	U08 sgiChWidthSupport = staInfo->config.sgiChWidthSupport;

	return !!(sgiChWidthSupport & BIT(bw));
}

static bool _alloCol2xLTF(const RS_MNG_STA_INFO_S *staInfo, U32 bw,
			  const RS_MNG_COL_ELEM_S *nextCol)
{
	return !(staInfo->config.configFlags &
		 TLC_MNG_CONFIG_FLAGS_HE_BLOCK_2X_LTF_MSK);
}

/***************************************************************/

static bool _rsMngTpcIsActive(const RS_MNG_STA_INFO_S *staInfo)
{
	// There are 2 values for currStep that mean tpc isn't working currently - RS_MNG_TPC_INACTIVE
	// and RS_MNG_TPC_DISABLED.
	return staInfo->tpcTable.currStep < RS_MNG_TPC_NUM_STEPS;
}
static bool _rsMngIsTestWindow(const RS_MNG_STA_INFO_S *staInfo)
{
	return staInfo->tryingRateUpscale || staInfo->searchBetterTbl ||
	       staInfo->tpcTable.testing;
}

static void _rsMngFillAggParamsLQCmd(RS_MNG_STA_INFO_S *staInfo,
				     struct iwl_lq_cmd *lqCmd)
{
	lqCmd->agg_time_limit = cpu_to_le16(_rsMngGetAggTimeLimit(staInfo));
	lqCmd->agg_disable_start_th = RS_MNG_AGG_DISABLE_START_TH;

#if 0 // NEEDS_PORTING
  // TODO(fxbug.dev/79993): AMPDU Support
  // W/A for a HW bug that causes it to not prepare a second burst if the first one uses
  // all frames in the Fifo. W/A this by making sure there's always at least one frame left.
  lqCmd->agg_frame_cnt_limit = (U08)(staInfo->staBuffSize - 1);
#else // NEEDS_PORTING
	lqCmd->agg_frame_cnt_limit = 1;
#endif
}

// Get the next supported lower rate in the current column.
// return:
// the found rate index, or
// RS_MNG_INVALID_RATE_IDX if no such rate exists
static U08 _rsMngSetLowerRate(const RS_MNG_STA_INFO_S *staInfo,
			      RS_MNG_RATE_S *rsMngRate)
{
	U08 lowerSuppRateIdx = _rsMngGetAdjacentRateIdx(
		staInfo, rsMngRate, GET_LOWER_SUPPORTED_RATE);

	// if this is the lowest rate possible and this is not legacy rate - break;
	if (RS_MNG_INVALID_RATE_IDX != lowerSuppRateIdx) {
		_rsMngRateSetIdx(rsMngRate, lowerSuppRateIdx);
	}

	return lowerSuppRateIdx;
}

#if 0 // NNEDS_PORTING
// TODO(fxbug.dev/51295): Supports A-MSDU
static void tlcMngNotifyAmsdu(const RS_MNG_STA_INFO_S* staInfo, U16 amsduSize, U16 tidBitmap) {
  int i;

  staInfo->mvmsta->amsdu_enabled = tidBitmap;
  staInfo->mvmsta->max_amsdu_len = amsduSize;
  staInfo->sta->max_rc_amsdu_len = staInfo->mvmsta->max_amsdu_len;

  for (i = 0; i < IWL_MAX_TID_COUNT; i++) {
    if (staInfo->mvmsta->amsdu_enabled & BIT(i))
      staInfo->sta->max_tid_amsdu_len[i] = iwl_mvm_max_amsdu_size(staInfo->mvm, staInfo->sta, i);
    else
    /*
     * Not so elegant, but this will effectively
     * prevent AMSDU on this TID
     */
    {
      staInfo->sta->max_tid_amsdu_len[i] = 1;
    }
  }
}
#endif // NEEDS_PORTING

static void _rsMngFillNonHtRates(const RS_MNG_STA_INFO_S *staInfo,
				 struct iwl_lq_cmd *lqCmd, U08 i,
				 RS_MNG_RATE_S *rsMngRate)
{
	bool togglingPossible =
		_rsMngIsAntSupported(staInfo, rsMngGetDualAntMsk()) &&
		btCoexManagerIsAntAvailable(staInfo->mvm,
					    BT_COEX_SHARED_ANT_ID);

	if (_rsMngRateGetMode(rsMngRate) != TLC_MNG_MODE_LEGACY) {
		U08 currIdx = _rsMngRateGetIdx(rsMngRate);

		_rsMngRateSetMode(rsMngRate, TLC_MNG_MODE_LEGACY);
		_rsMngRateSetModulation(rsMngRate, RS_MNG_MODUL_LEGACY);
		_rsMngRateSetBw(rsMngRate, CHANNEL_WIDTH20);
		_rsMngRateSetLdpc(rsMngRate, false);
		_rsMngRateSetStbc(rsMngRate, false);

		// Always start with the non-shared antenna if it's available. If there's toggling, it
		// doesn't make much difference, and if there's no toggling due to bt-coex it promises we'll
		// stay on the non-shared antenna.
		_rsMngRateSetAnt(
			rsMngRate,
			rsMngGetSingleAntMsk(staInfo->config.chainsEnabled));
		_rsMngRateSetIdx(rsMngRate, downColMcsToLegacy[currIdx]);
	} else {
		_rsMngSetLowerRate(staInfo, rsMngRate);
	}

	for (; i < LQ_MAX_RETRY_NUM; i++) {
		lqCmd->rs_table[i] = cpu_to_le32(rsMngRate->rate.rate_n_flags);

		_rsMngSetLowerRate(staInfo, rsMngRate);

		if (togglingPossible) {
			_rsMngRateSetAnt(rsMngRate,
					 (U08)(_rsMngRateGetAnt(rsMngRate) ^
					       rsMngGetDualAntMsk()));
		}
	}
}

static void _rsMngBuildRatesTbl(const RS_MNG_STA_INFO_S *staInfo,
				struct iwl_lq_cmd *lqCmd)
{
	RS_MNG_RATE_S rsMngRate;
	U08 i = 0;
	U08 j;

	memcpy(&rsMngRate, &staInfo->rateTblInfo.rsMngRate, sizeof(rsMngRate));

	if (staInfo->searchBetterTbl) {
		// When trying a new column, only the initial rate should be of that column. The rest of the
		// table is constructed from the "stable" column.
		lqCmd->rs_table[0] = cpu_to_le32(
			staInfo->searchColData.rsMngRate.rate.rate_n_flags);
		i++;
	} else if (staInfo->tryingRateUpscale) {
		// When trying a higher mcs, try it only once. The next retries will be from the previous
		// mcs which is known to be good (otherwise wouldn't be trying a higher one).
		lqCmd->rs_table[0] = cpu_to_le32(
			staInfo->rateTblInfo.rsMngRate.rate.rate_n_flags);
		i++;
		_rsMngSetLowerRate(staInfo, &rsMngRate);
	}

	// Fill RS_MNG_RETRY_TABLE_INITIAL_RATE_NUM copies of the best known stable rate
	for (j = 0; j < RS_MNG_RETRY_TABLE_INITIAL_RATE_NUM; j++) {
		lqCmd->rs_table[i + j] =
			cpu_to_le32(rsMngRate.rate.rate_n_flags);
	}
	i += j;

	if (!(staInfo->searchBetterTbl || staInfo->tryingRateUpscale) &&
	    _rsMngSetLowerRate(staInfo, &rsMngRate) !=
		    RS_MNG_INVALID_RATE_IDX) {
		// In case the first rate is not a test rate, put here RS_MNG_RETRY_TABLE_SECONDARY_RATE_NUM
		// copies of the initial rate but mcs-1
		// Note that a tpc test window is not treated as a test rate for the purpose of construction
		// of the retry table.
		for (j = 0; j < RS_MNG_RETRY_TABLE_SECONDARY_RATE_NUM; j++) {
			lqCmd->rs_table[i + j] =
				cpu_to_le32(rsMngRate.rate.rate_n_flags);
		}
		i += j;

		// Now put RS_MNG_RETRY_TABLE_SECONDARY_RATE_20MHZ_NUM copies of the secondary rate with
		// 20mhz bandwidth.
		_rsMngRateSetBw(&rsMngRate, CHANNEL_WIDTH20);
		for (j = 0; j < RS_MNG_RETRY_TABLE_SECONDARY_RATE_20MHZ_NUM;
		     j++) {
			lqCmd->rs_table[i + j] =
				cpu_to_le32(rsMngRate.rate.rate_n_flags);
		}
		i += j;
	}

	// Fill the rest of the retry table with non-ht rates
	_rsMngFillNonHtRates(staInfo, lqCmd, i, &rsMngRate);
}

static void _rsMngFillLQCmd(RS_MNG_STA_INFO_S *staInfo)
{
	int i;
	struct iwl_lq_cmd *lqCmd = &staInfo->mvmsta->lq_sta.rs_drv.lq;

	memset(lqCmd, 0, sizeof(*lqCmd));
	lqCmd->sta_id = staInfo->mvmsta->sta_id;

	if (_rsMngTpcIsActive(staInfo)) {
		// reduce Tx power in steps of 3db. Note that currStep == 0 means reduce 3db, hence the '+1'
		lqCmd->reduced_tpc = (U08)(RS_MNG_TPC_STEP_SIZE *
					   (staInfo->tpcTable.currStep + 1));
		DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
			   "_rsMngFillLQCmd: reducing tx power by %d db",
			   lqCmd->reduced_tpc);
	}

	_rsMngFillAggParamsLQCmd(staInfo, lqCmd);

	_rsMngBuildRatesTbl(staInfo, lqCmd);

	lqCmd->single_stream_ant_msk =
		rsMngGetSingleAntMsk(staInfo->config.chainsEnabled);
	lqCmd->dual_stream_ant_msk = rsMngGetDualAntMsk();

	if (_rsMngIsTestWindow(staInfo)) {
		if (IS_RATE_OFDM_HT_VHT_HE_API_M(
			    le32_to_cpu(lqCmd->rs_table[0]))) {
			// For 11a/b/g rates, where there are no aggregations anyway, RTS protection just hurts
			// the tpt.
			lqCmd->rs_table[0] |=
				cpu_to_le32(RATE_MCS_RTS_REQUIRED_MSK);
			// TODO: lqCmd->agg_params.uAggFrameCntInTestWin = RS_MNG_UPSCALE_AGG_FRAME_COUNT;
		}
		// TODO: lqCmd->general_params.flags |= LINK_QUAL_FLAGS_TEST_WINDOWS_MSK;
	}

	if (staInfo->mvmsta->tx_protection) {
		lqCmd->flags |= LQ_FLAG_USE_RTS_MSK;
	}

	// When Amsdu's are enabled, enable RTS protection for all rates that use A-MPDUs, since in this
	// case there could be really long frames and this should help reduce collisions.
	if (staInfo->amsduEnabledSize != RS_MNG_AMSDU_INVALID) {
		for (i = 0; i < RS_MNG_AGG_DISABLE_START_TH; i++) {
			lqCmd->rs_table[i] |=
				cpu_to_le32(RATE_MCS_RTS_REQUIRED_MSK);
		}
	}

	DBG_PRINTF(
		UT, TLC_OFFLOAD_DBG, INFO,
		"---------\nLQ cmd data\nsta_id: %02x\ntpc: %02x\nflags: %02x\nmimo_delim: %02x\nssam: "
		"%02x\ndsam: %02x\ninit_rate_idx: %02x %02x %02x %02x\nagg_time_limit: %04x\nadsh: "
		"%02x\nafcl: %02x\nreserved2: %08x\nrs_table first: %08x\nss_params: "
		"%08x\n-----------",
		lqCmd->sta_id, lqCmd->reduced_tpc, lqCmd->flags,
		lqCmd->mimo_delim, lqCmd->single_stream_ant_msk,
		lqCmd->dual_stream_ant_msk, lqCmd->initial_rate_index[0],
		lqCmd->initial_rate_index[1], lqCmd->initial_rate_index[2],
		lqCmd->initial_rate_index[3], lqCmd->agg_time_limit,
		lqCmd->agg_disable_start_th, lqCmd->agg_frame_cnt_limit,
		lqCmd->reserved2, cpu_to_le32(lqCmd->rs_table[0]),
		lqCmd->ss_params);
}

// rs_update_rate_tbl
static void _rsMngUpdateRateTbl(RS_MNG_STA_INFO_S *staInfo)
{
	_rsMngFillLQCmd(staInfo);
	iwl_mvm_send_lq_cmd(staInfo->mvm, &staInfo->mvmsta->lq_sta.rs_drv.lq,
			    !staInfo->enabled);
}

static void _rsMngClearWinArr(RS_MNG_WIN_STAT_S *winArr, U08 numWin)
{
	U08 i;

	_memclr(winArr, (sizeof(*winArr) * numWin));

	for (i = 0; i < numWin; i++) {
		winArr[i].successRatio = RS_MNG_INVALID_VAL;
		winArr[i].averageTpt = RS_MNG_INVALID_VAL;
	}
}

static void _rsMngClearTblWindows(RS_MNG_STA_INFO_S *staInfo)
{
	_rsMngClearWinArr(staInfo->rateTblInfo.win, RS_MNG_MAX_RATES_NUM);

	_rsMngClearWinArr(staInfo->tpcTable.windows, RS_MNG_TPC_NUM_STEPS);
}

static void _rsMngSetVisitedColumn(RS_MNG_STA_INFO_S *staInfo,
				   RS_MNG_COLUMN_DESC_E colId)
{
	// to make the code for setting both siso columns in case of stbc simpler, make sure that each
	// such pair of columns has only bit 0 different.
	BUILD_BUG_ON(!((RS_MNG_COL_SISO_ANT_A ^ RS_MNG_COL_SISO_ANT_B) == 1));
	BUILD_BUG_ON(!(
		(RS_MNG_COL_SISO_ANT_A_SGI ^ RS_MNG_COL_SISO_ANT_B_SGI) == 1));
	BUILD_BUG_ON(!((RS_MNG_COL_HE_3_2_SISO_ANT_A ^
			RS_MNG_COL_HE_3_2_SISO_ANT_B) == 1));
	BUILD_BUG_ON(!((RS_MNG_COL_HE_1_6_SISO_ANT_A ^
			RS_MNG_COL_HE_1_6_SISO_ANT_B) == 1));
	BUILD_BUG_ON(!((RS_MNG_COL_HE_0_8_SISO_ANT_A ^
			RS_MNG_COL_HE_0_8_SISO_ANT_B) == 1));

	IWL_DEBUG_RATE(
		NULL,
		"_rsMngSetVisitedColumn: colId %d, stbc allowed %d, visited columns 0x%x",
		colId, _rsMngIsStbcSupported(staInfo), staInfo->visitedColumns);

	staInfo->visitedColumns |= BIT(colId);
	if (rsMngColumns[colId].mode == RS_MNG_MODUL_SISO &&
	    _rsMngIsStbcSupported(staInfo)) {
		staInfo->visitedColumns |= BIT(colId ^ 1);
	}

	DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
		   "_rsMngSetVisitedColumn: visited columns 0x%x",
		   staInfo->visitedColumns);
}

#if 0 // NEEDS_PORTING
static U32 _rsMngVhtRateToPhyRate(U32 bw, RS_MCS_E mcs, RS_MNG_GI_E gi, RS_MNG_MODULATION_E nss) {
  U32 bitrate;

  if (WARN_ON(!(mcs < 10 && bw < MAX_CHANNEL_BW_INDX && nss >= RS_MNG_MODUL_SISO))) {
    return 1;
  }

  bitrate = rsMngVhtRateToBps[bw][mcs];

  DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO, "_rsMngAmsduRate: bw %d, mcs %d sgi %d nss %d", bw, mcs, gi,
             nss);

  if (nss == RS_MNG_MODUL_MIMO2) {
    bitrate *= 2;
  }

  if (gi == HT_VHT_SGI) {
    bitrate = bitrate + (bitrate / 9);
  }

  return bitrate >> 20;
}

static U32 _rsMngHeRateToPhyRate(U32 bw, RS_MCS_E mcs, RS_MNG_GI_E gi, RS_MNG_MODULATION_E nss) {
#define RATIO_SCALE 2048
#define MBPS_X_10_TO_KBPS(x) (((x) << 10) / 10)
  static const U16 mcsRatios[12] = {
      34133, /* 16.666666... */
      17067, /*  8.333333... */
      11378, /*  5.555555... */
      8533,  /*  4.166666... */
      5689,  /*  2.777777... */
      4267,  /*  2.083333... */
      3923,  /*  1.851851... */
      3413,  /*  1.666666... */
      2844,  /*  1.388888... */
      2560,  /*  1.250000... */
      2276,  /*  1.111111... */
      2048,  /*  1.000000... */
  };
  static const U32 ratesPerGi[][3] = {
      // phy rate in kbps per GI for mcs 11 with 2 ss
      //                     HE_3_2_GI                  HE_1_6_GI                 HE_0_8_GI
      [CHANNEL_WIDTH20] = {MBPS_X_10_TO_KBPS(2438), MBPS_X_10_TO_KBPS(2708),
                           MBPS_X_10_TO_KBPS(2868)},
      [CHANNEL_WIDTH40] = {MBPS_X_10_TO_KBPS(4875), MBPS_X_10_TO_KBPS(5417),
                           MBPS_X_10_TO_KBPS(5735)},
      [CHANNEL_WIDTH80] = {MBPS_X_10_TO_KBPS(10208), MBPS_X_10_TO_KBPS(11343),
                           MBPS_X_10_TO_KBPS(12010)},
      [CHANNEL_WIDTH160] = {MBPS_X_10_TO_KBPS(20416), MBPS_X_10_TO_KBPS(22685),
                            MBPS_X_10_TO_KBPS(24019)},
  };
  U64 tmp;
  U32 bitrate;
  BOOLEAN isDcm = FALSE;

  if (mcs == RS_MCS_0_HE_ER_AND_DCM) {
    isDcm = TRUE;
    mcs = RS_MCS_0;
  }

  if (WARN_ON(!(mcs < 12 && bw < MAX_CHANNEL_BW_INDX && gi >= HE_FIRST_GI &&
                nss >= RS_MNG_MODUL_SISO))) {
    return 1;
  }

  bitrate = ratesPerGi[bw][gi - HE_FIRST_GI];
  tmp = bitrate;
  tmp *= RATIO_SCALE;
  tmp /= mcsRatios[mcs];
  bitrate = (U32)tmp;

  if (nss == RS_MNG_MODUL_SISO) {
    bitrate /= 2;
  }

  if (isDcm) {
    bitrate /= 2;
  }

  return bitrate >> 10;
}

static U32 _rsMngRateToPhyRate(TLC_MNG_MODE_E mode, U32 bw, RS_MCS_E mcs, RS_MNG_GI_E gi,
                               RS_MNG_MODULATION_E nss) {
  if (mode == TLC_MNG_MODE_VHT) {
    return _rsMngVhtRateToPhyRate(bw, mcs, gi, nss);
  }
  if (mode == TLC_MNG_MODE_HE) {
    return _rsMngHeRateToPhyRate(bw, mcs, gi, nss);
  }

  return 0;
}


static RS_MNG_TX_AMSDU_SIZE_E _rsMngAmsduSize(const RS_MNG_STA_INFO_S* staInfo, TLC_MNG_MODE_E mode,
                                              U32 bw, RS_MCS_E mcs, RS_MNG_GI_E gi,
                                              RS_MNG_MODULATION_E nss) {
  RS_MNG_TX_AMSDU_SIZE_E amsdu_3k, amsdu_5k, amsdu_6k, amsdu_8k;
  U32 phyRate = _rsMngRateToPhyRate(mode, bw, mcs, gi, nss);

  DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
             "_rsMngAmsduRate: sta %d, phyRate %d, blacklist bitmap 0x%X",
             _rsMngStaInfoToStaId(staInfo), phyRate, staInfo->amsduBlacklist);

  amsdu_3k = RS_MNG_AMSDU_3500B;
  amsdu_5k = RS_MNG_AMSDU_5000B;

  if (staInfo->amsduBlacklist) {
    // If we disabled 3k AMSDU - don't use it at all
    if (staInfo->amsduBlacklist & BIT(RS_MNG_AMSDU_3500B)) {
      amsdu_3k = RS_MNG_AMSDU_INVALID;
    }

    // If we disabled some amsdu size, use a smaller size.
    // Note that smaller sizes that are blacklisted as well will still not be used.
    if (staInfo->amsduBlacklist & BIT(RS_MNG_AMSDU_5000B)) {
      amsdu_5k = amsdu_3k;
    }
  }

  if (mode == TLC_MNG_MODE_HE) {
    amsdu_6k = RS_MNG_AMSDU_6500B;
    amsdu_8k = RS_MNG_AMSDU_8000B;

    if (staInfo->amsduBlacklist & BIT(RS_MNG_AMSDU_6500B)) {
      amsdu_6k = amsdu_5k;
    }

    if (staInfo->amsduBlacklist & BIT(RS_MNG_AMSDU_8000B)) {
      amsdu_8k = amsdu_6k;
    }

    if (phyRate > RS_MNG_AMSDU_HE_8K_THRESHOLD) {
      return amsdu_8k;
    }

    if (phyRate > RS_MNG_AMSDU_HE_6K_THRESHOLD) {
      return amsdu_6k;
    }
  }

  if (phyRate > RS_MNG_AMSDU_5K_THRESHOLD) {
    return amsdu_5k;
  }

  if (phyRate > RS_MNG_AMSDU_3K_THRESHOLD) {
    return amsdu_3k;
  }

  return RS_MNG_AMSDU_INVALID;
}

static const TPT_BY_RATE_ARR* _rsMngGetExpectedTptTable(const RS_MNG_COL_ELEM_S* col,
                                                        TLC_MNG_CH_WIDTH_E bw, BOOLEAN isAgg) {
  U32 nss;
  U32 gi;

  if (col->mode == RS_MNG_MODUL_LEGACY) {
    return &expectedTptNonHt;
  }

  nss = col->mode == RS_MNG_MODUL_SISO ? RS_MNG_SISO : RS_MNG_MIMO;

  switch (col->gi) {
    case HT_VHT_NGI:
      gi = RS_MNG_NGI;
      break;
    case HT_VHT_SGI:
      gi = RS_MNG_SGI;
      break;
    case HE_3_2_GI:
      gi = RS_MNG_GI_3_2;
      break;
    case HE_1_6_GI:
      gi = RS_MNG_GI_1_6;
      break;
    case HE_0_8_GI:
      gi = RS_MNG_GI_0_8;
      break;
    default:
      WARN_ON(1);
      gi = 0;
  }

  DBG_PRINTF(
      UT, TLC_OFFLOAD_DBG, INFO,
      "_rsMngGetExpectedTptTable: expected Tpt table - isHE %d, isAgg %d, BW %d, GI %d, NSS %d",
      col->gi >= HE_FIRST_GI, isAgg, bw, gi, nss);

  if (col->gi < HE_FIRST_GI) {
    return &expectedTptHtVht[isAgg][bw][gi][nss];
  }

  return &expectedTptHe[isAgg][bw][gi][nss];
}

static U32 _rsMngGetExpectedTpt(const RS_MNG_STA_INFO_S* staInfo, const RS_MNG_COL_ELEM_S* col,
                                TLC_MNG_CH_WIDTH_E bw, BOOLEAN isAgg, RS_MCS_E rateIdx) {
  const TPT_BY_RATE_ARR* expectedTptTable = _rsMngGetExpectedTptTable(col, bw, isAgg);
  U32 ret;

  if (expectedTptTable == &expectedTptNonHt) {
    return (*expectedTptTable)[rateIdx];
  }
  if (rateIdx == RS_MCS_0_HE_ER_AND_DCM) {
    // rateIdx == RS_MCS_0_HE_ER_AND_DCM. DCM cuts expected tpt in half.
    // TODO: add an additional small penalty for ER
    return (*expectedTptTable)[RS_MCS_0] / 2;
  }

  ret = (*expectedTptTable)[rateIdx];

  if (staInfo->amsduSupport && staInfo->mvmsta->agg_tids && staInfo->amsduInAmpdu) {
    switch (staInfo->amsduEnabledSize) {
      case RS_MNG_AMSDU_8000B:
        DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
                   "_rsMngGetExpectedTpt: adding 50%% thanks to 8k amsdu");
        ret += (ret / 2);
        break;
      case RS_MNG_AMSDU_6500B:
        DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
                   "_rsMngGetExpectedTpt: adding 37.5%% thanks to 6.5k amsdu");
        ret += (ret / 4) + (ret / 8);
        break;
      case RS_MNG_AMSDU_5000B:
        DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
                   "_rsMngGetExpectedTpt: adding 25%% thanks to 5k amsdu");
        ret += (ret / 4);
        break;
      case RS_MNG_AMSDU_3500B:
        DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
                   "_rsMngGetExpectedTpt: adding 12.5%% thanks to 3.5k amsdu");
        ret += (ret / 8);
        break;
      default:
        break;
    }
  }

  return ret;
}

static BOOLEAN _isAvgTptCalcPossible(RS_MNG_WIN_STAT_S* win) {
  return ((win->successCounter >= RS_MNG_RATE_MIN_SUCCESS_TH) ||
          ((win->framesCounter - win->successCounter) >= RS_MNG_RATE_MIN_FAILURE_TH));
}

// rs_get_rate_action
//
// return after every if. so the 'strength' of the conditions are as follows :
//
// Downscale if:
// - the current window success ratio <= 15% || avg tpt for this window is 0
// Upscale if:
// - low and high tpt (tpt for the next/prev rates) are invalid *but* the next rate is valid
// - low_tpt < current_tpt (tpt for prev rate < avg tpt in current window ) *and*
//   next rate is valid although it's tpt isn't
// - high tpt > current tpt
// Stay if:
// - low and high tpt < current tpt
//----- but if none of the above conditions are met. for example - due to invalid high/low tpt :
// if low_tpt > current tpt or low tpt is invalid, but the lower index entry is :
// - if low is valid:
//   Stay if:
//     - the current suceess rate is >= 85% (good enough)
//     - current tpt > expected tpt at [low] (was supposed to do downscale, but current tpt is good
//     enough although the success rate isn't. so we are optomistics)
//   Downscale:
//     - both above are not met
//    - low is invalid
static RS_MNG_ACTION_E _rsMngGetScaleAction(const RS_MNG_STA_INFO_S* staInfo,
                                            const RS_MNG_WIN_STAT_S* currWin, U32 lowerRateIdx,
                                            U32 higherRateIdx) {
  const RS_MNG_TBL_INFO_S* tblInfo = &staInfo->rateTblInfo;
  U32 currTpt;
  U32 lowTpt;
  U32 highTpt;
  RS_MNG_ACTION_E action = RS_MNG_ACTION_STAY;
  enum {
    RS_MNG_SCALE_REASON_BELOW_FORCE_DECREASE,
    RS_MNG_SCALE_REASON_NO_DATA_ON_HIGHER_RATE,
    RS_MNG_SCALE_REASON_HIGHER_RATE_HAS_HIGHER_TPT,
    RS_MNG_SCALE_REASON_CURRENT_RATE_HAS_HIGHEST_TPT,
    RS_MNG_SCALE_REASON_SR_ABOVE_NO_DECREASE_THRESHOLD,
    RS_MNG_SCALE_REASON_LOWER_RATE_TPT_UNKOWN_OR_BETTER,
    RS_MNG_SCALE_REASON_DEFAULT,
  };

  currTpt = currWin->averageTpt;
  lowTpt = ((lowerRateIdx == RS_MNG_INVALID_RATE_IDX) ? RS_MNG_INVALID_VAL
                                                      : tblInfo->win[lowerRateIdx].averageTpt);
  highTpt = ((higherRateIdx == RS_MNG_INVALID_RATE_IDX) ? RS_MNG_INVALID_VAL
                                                        : tblInfo->win[higherRateIdx].averageTpt);

  DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
             "_rsMngGetScaleAction:\ncurrTpt: %d, successRatio: %d,\nlowerRateIdx: %d, lowTpt: "
             "%d,\nhigherRateIdx: %d, highTpt: %d",
             currTpt, currWin->successRatio, lowerRateIdx, lowTpt, higherRateIdx, highTpt);

  // current Success ratio is insufficient or Tpt for the current window is 0 => downscale
  if ((currWin->successRatio <= RS_MNG_PERCENT(RS_MNG_SR_FORCE_DECREASE)) || (0 == currTpt)) {
    DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
               "_rsMngGetScaleAction: DOWNSCALE due to insufficient success ratio or 0 tpt");
    action = RS_MNG_ACTION_DOWNSCALE;
    goto out;
  }

  // No Tpt data about high/low rate => upscale
  if ((RS_MNG_INVALID_VAL == lowTpt) && (RS_MNG_INVALID_VAL == highTpt) &&
      (RS_MNG_INVALID_RATE_IDX != higherRateIdx)) {
    DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
               "_rsMngGetScaleAction: UPSCALE due to no data about higher or lower rates");
    action = RS_MNG_ACTION_UPSCALE;
    goto out;
  }

  // if there's no Tpt data about the higerRateIdx but the Tpt for the lowerRateIdx is worse then
  // the curr tpt => Upscale
  if (((RS_MNG_INVALID_VAL == highTpt) && (RS_MNG_INVALID_RATE_IDX != higherRateIdx)) &&
      ((RS_MNG_INVALID_VAL != lowTpt) && (lowTpt < currTpt))) {
    DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
               "_rsMngGetScaleAction: UPSCALE due to no data on higher rate and lower rate has "
               "worse tpt");
    action = RS_MNG_ACTION_UPSCALE;
    goto out;
  }

  // if higherRateIdx tpt > currTpt => upscale
  if ((RS_MNG_INVALID_VAL != highTpt) && (highTpt > currTpt)) {
    DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
               "_rsMngGetScaleAction: UPSCALE due to higher rate having higher tpt");
    action = RS_MNG_ACTION_UPSCALE;
    goto out;
  }

  // if Tpt for the higherRateIdx and for LowerRateIdx are both worse then the current Tpt => stay
  if (((RS_MNG_INVALID_VAL != highTpt) && (highTpt < currTpt)) &&
      ((RS_MNG_INVALID_VAL != lowTpt) && (lowTpt < currTpt))) {
    DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
               "_rsMngGetScaleAction: STAY due to current rate having better tpt that both "
               "higher and lower rates");
    action = RS_MNG_ACTION_STAY;
    goto out;
  }

  // If Tpt for LowerRateIdx > currTpt, or it is unknown but lowerRateIdx is valid
  if (((RS_MNG_INVALID_VAL != lowTpt) && (lowTpt > currTpt)) ||
      ((RS_MNG_INVALID_VAL == lowTpt) && (RS_MNG_INVALID_RATE_IDX != lowerRateIdx))) {
    U32 lowerRateExpectedTpt = _rsMngGetExpectedTpt(staInfo, &rsMngColumns[tblInfo->column],
                                                    _rsMngRateGetBw(&tblInfo->rsMngRate),
                                                    !!(staInfo->mvmsta->agg_tids), lowerRateIdx);

    // if CurrWin success ratio reached the no decrease TH, or currTpt is higher then expected
    // Tpt => stay
    if ((RS_MNG_INVALID_RATE_IDX != lowerRateIdx) &&
        ((currWin->successRatio >= RS_MNG_PERCENT(RS_MNG_SR_NO_DECREASE)) ||
         (currTpt > lowerRateExpectedTpt))) {
      DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
                 "_rsMngGetScaleAction: STAY due to lower rate having expected tpt lower "
                 "than current tpt or current success ratio is above the 'no-decrease' "
                 "threshold. lower rate expected tpt: %d",
                 lowerRateExpectedTpt);
      action = RS_MNG_ACTION_STAY;
      goto out;
    }
    // curr SR is insufficient and either lowTpt is valid and > currTpt or lowerRateIdx is valid
    // => downscale
    else {
      DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
                 "_rsMngGetScaleAction: DOWNSCALE due to low success ratio or lower rate "
                 "having higher tpt than current rate. lower rate expected tpt: %d",
                 lowerRateExpectedTpt);
      action = RS_MNG_ACTION_DOWNSCALE;
      goto out;
    }
  }

  DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO, "_rsMngGetScaleAction: STAY (default)");
  action = RS_MNG_ACTION_STAY;

out:
  return action;
}

// return: TRUE if there is a better start rate, so need to send LQ command
// newIdx: valid only if the return value is TRUE
//        RS_MNG_INVALID_RATE_IDX - if need to keep using the current index
//        new index to use        - if there is another rate that will provide better tpt / tpc
static RS_MNG_ACTION_E _rsMngSearchBetterStartRate(const RS_MNG_STA_INFO_S* staInfo,
                                                   RS_MNG_WIN_STAT_S* currWin,
                                                   const RS_MNG_RATE_S* currRate, U08* newIdx) {
  U08 lowerSuppRateIdx;
  U08 higherSuppRateIdx;
  RS_MNG_ACTION_E scaleAction;

  lowerSuppRateIdx = _rsMngGetAdjacentRateIdx(staInfo, currRate, GET_LOWER_SUPPORTED_RATE);
  higherSuppRateIdx = _rsMngGetAdjacentRateIdx(staInfo, currRate, GET_HIGHER_SUPPORTED_RATE);

  DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
             "_rsMngSearchBetterStartRate: curr rate idx: %d, lower: %d, higher: %d. supported "
             "rates mask: 0x%x",
             _rsMngRateGetIdx(currRate), lowerSuppRateIdx, higherSuppRateIdx, supportedRatesMsk);

  scaleAction = _rsMngGetScaleAction(staInfo, currWin, lowerSuppRateIdx, higherSuppRateIdx);

  // FMAC TODO - add 'fix' in case we are in MIMO and BT doesn't 'allow' MIMO ? (currently a dead
  // code in fmac)

  // Set the new rate index + tx power reduction, if needed
  switch (scaleAction) {
    case RS_MNG_ACTION_STAY:
      if (staInfo->rsMngState == RS_MNG_STATE_STAY_IN_COLUMN) {
        // TODO - add tpc support
        // rs_tpc_perform(sta, lq_sta, tbl);
      }
      break;
    case RS_MNG_ACTION_DOWNSCALE:
      if (RS_MNG_INVALID_RATE_IDX != lowerSuppRateIdx) {
        // TODO - add tpc
        *newIdx = lowerSuppRateIdx;
      }
      // else - already at the lowest possible rate -> can't downscale
      else {
        scaleAction = RS_MNG_ACTION_STAY;
      }
      break;
    case RS_MNG_ACTION_UPSCALE:
      if (RS_MNG_INVALID_RATE_IDX != higherSuppRateIdx) {
        // TODO - add tpc
        *newIdx = higherSuppRateIdx;
      }
      // else - already at the highest possible rate -> can't upscale
      else {
        scaleAction = RS_MNG_ACTION_STAY;
      }
      break;
    default:
      // TODO add assert?
      break;
  }

  return scaleAction;
}

static U08 _rsMngGetLowestSupportedRate(const RS_MNG_STA_INFO_S* staInfo,
                                        RS_MNG_MODULATION_E modulation, U32 bw,
                                        U16 supportedRates) {
  if (modulation != RS_MNG_MODUL_LEGACY && staInfo->config.bestSuppMode == TLC_MNG_MODE_HE &&
      bw == CHANNEL_WIDTH20 && _rsMngIsDcmSupported(staInfo, modulation == RS_MNG_MODUL_MIMO2)) {
    return RS_MCS_0_HE_ER_AND_DCM;
  }

  return (U08)LSB2ORD(supportedRates);
}
//
// Returns the index of the lowest rate in the given column with expected tpt higher
// than the target tpt.
//
static U08 _rsMngGetBestRate(const RS_MNG_STA_INFO_S* staInfo, const RS_MNG_TBL_INFO_S* activeTbl,
                             const RS_MNG_COL_ELEM_S* col, U32 bw, U32 targetTpt) {
  U16 supportedRates = _rsMngGetSupportedRatesByModeAndBw(staInfo, col->mode, bw);
  U08 rateIdx = _rsMngGetLowestSupportedRate(staInfo, col->mode, bw, supportedRates);
  U32 expectedTpt = 0;

  while (rateIdx != RS_MNG_INVALID_RATE_IDX) {
    expectedTpt = _rsMngGetExpectedTpt(staInfo, col, bw, !!staInfo->mvmsta->agg_tids, rateIdx);

    if (targetTpt <= expectedTpt) {
      break;
    }

    rateIdx = _rsMngGetHigherRateIdx(rateIdx, supportedRates);
  }

  DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
             "_rsMngGetBestRate: best rateIdx %d. targetTpt: %d, new expected tpt: %d", rateIdx,
             targetTpt, expectedTpt);

  return rateIdx;
}

static BOOLEAN _rsMngIsColAllowed(const RS_MNG_STA_INFO_S* staInfo, U32 bw,
                                  const RS_MNG_COL_ELEM_S* nextCol) {
  int i;

  for (i = 0; i < MAX_COLUMN_CHECKS; i++) {
    ALLOW_COL_FUNC_F allowColFunc = nextCol->checks[i];

    if (allowColFunc && !allowColFunc(staInfo, bw, nextCol)) {
      DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO, "_rsMngIsColAllowed: Function[%d] check failed", i);
      return FALSE;
    }
  }

  return TRUE;
}

// rs_get_next_column
// return column with expected better tpt
// or invalid column if such doesn't exist
//
// flow:
// get next column according to  rs_tx_columns [index].next_columns[].
// if the next column is invalid - continue to next column in the next_columns list
// if already visited the next column - continue to next column in the next_columns list
// if the chosen antenna is not supported - continue to next column in the next_columns list
// if one of the function checks failed - continue to next column in the next_columns list
// if there is no expected throughput in the table - continue to next column in the next_columns
// list

// now we have the next column.
// get expected tpt table according to siso/mimo + BW + /GI/SGI/AGG/SGI+AGG / legacy (one table)
// compare the current tpt with max expected tpt in this table.
// if current tpt >= max.  => continue to next column
//
// else - return the found column id.
//
static RS_MNG_COLUMN_DESC_E _rsMngGetNextColId(const RS_MNG_STA_INFO_S* staInfo,
                                               const RS_MNG_TBL_INFO_S* tblInfo, U32 targetTpt,
                                               U32* bw, U08* rateIdx) {
  const RS_MNG_COL_ELEM_S* currCol = &rsMngColumns[tblInfo->column];
  const RS_MNG_COL_ELEM_S* nextCol;
  RS_MNG_COLUMN_DESC_E nextColId = RS_MNG_COL_INVALID;  // for compilation. won't be used
  int i;

  // Check that the defines' value allow to assume that we can add NON_SHARED_ANT_RFIC_ID to
  // RS_MNG_COL_SISO_ANT_A to get the shared antenna
  BUILD_BUG_ON(!(RS_MNG_COL_SISO_ANT_A + 1 == RS_MNG_COL_SISO_ANT_B));
  BUILD_BUG_ON(!(RS_MNG_COL_SISO_ANT_A_SGI + 1 == RS_MNG_COL_SISO_ANT_B_SGI));
  BUILD_BUG_ON(!(RS_MNG_COL_HE_3_2_SISO_ANT_A + 1 == RS_MNG_COL_HE_3_2_SISO_ANT_B));
  BUILD_BUG_ON(!(RS_MNG_COL_HE_1_6_SISO_ANT_A + 1 == RS_MNG_COL_HE_1_6_SISO_ANT_B));
  BUILD_BUG_ON(!(RS_MNG_COL_HE_0_8_SISO_ANT_A + 1 == RS_MNG_COL_HE_0_8_SISO_ANT_B));

  for (i = 0; i < MAX_NEXT_COLUMNS; i++) {
    nextColId = currCol->nextCols[i];

    DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO, "_rsMngGetNextColId: Checking nextCol %d (column id %d)",
               i, nextColId);

    if (RS_MNG_COL_INVALID == nextColId) {
      DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
                 "_rsMngGetNextColId: invalid column. next columns are also invalid, so break");
      break;  // if column is invalid, all the following ones will be invalid as well
    }

    if (0 == i && RS_MNG_MODUL_MIMO2 == currCol->mode) {
      nextColId += NON_SHARED_ANT_RFIC_ID;
    }

    if (staInfo->visitedColumns & BIT(nextColId)) {
      DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
                 "_rsMngGetNextColId: This column was already visited. continue");
      continue;
    }

    nextCol = &rsMngColumns[nextColId];
    // when moving to a new column, if it's a non-HT column the bw must be 20. If attempting to
    // leave non-HT, jump to the highest available width, otherwise keep the current bw (bw
    // changes are handled separately)
    *bw = (nextCol->mode == RS_MNG_MODUL_LEGACY
               ? CHANNEL_WIDTH20
               : (currCol->mode == RS_MNG_MODUL_LEGACY ? _rsMngGetMaxChWidth(staInfo)
                                                       : _rsMngRateGetBw(&tblInfo->rsMngRate)));

    if (!_rsMngIsColAllowed(staInfo, *bw, nextCol)) {
      DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO, "_rsMngGetNextColId: column not allowed. continue");
      continue;
    }

    if ((*rateIdx = _rsMngGetBestRate(staInfo, tblInfo, nextCol, *bw, targetTpt)) ==
        RS_MNG_INVALID_RATE_IDX) {
      DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
                 "_rsMngGetNextColId: currTpt >= maxTpt of potential column. continue");
      continue;
    }

    DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
               "_rsMngGetNextColId: Found potential column %d, with chosen bw %d and potential "
               "rateIdx %d",
               nextColId, *bw, *rateIdx);

    // Found potential column.
    break;
  }

  if (MAX_NEXT_COLUMNS == i) {
    DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
               "_rsMngGetNextColId: Couldn't find a better column, staying in this one");
    return RS_MNG_COL_INVALID;
  }

  return nextColId;
}

// rs_switch_to_column
static void _rsMngSetUpSearchColData(RS_MNG_STA_INFO_S* staInfo, RS_MNG_COLUMN_DESC_E nextColId,
                                     U32 bw, U08 rateIdx) {
  RS_MNG_SEARCH_COL_DATA* searchData = &staInfo->searchColData;
  RS_MNG_RATE_S* rsMngRate = &searchData->rsMngRate;
  const RS_MNG_COL_ELEM_S* nextCol = &rsMngColumns[nextColId];

  switch (nextCol->mode) {
    case RS_MNG_MODUL_LEGACY:
      _rsMngRateSetMode(rsMngRate, TLC_MNG_MODE_LEGACY);
      _rsMngRateSetLdpc(rsMngRate, FALSE);
      _rsMngRateSetModulation(rsMngRate, RS_MNG_MODUL_LEGACY);
      break;
    case RS_MNG_MODUL_SISO:
      _rsMngRateSetMode(rsMngRate, staInfo->config.bestSuppMode);
      _rsMngRateSetModulation(rsMngRate, RS_MNG_MODUL_SISO);
      break;
    case RS_MNG_MODUL_MIMO2:
      _rsMngRateSetMode(rsMngRate, staInfo->config.bestSuppMode);
      _rsMngRateSetModulation(rsMngRate, RS_MNG_MODUL_MIMO2);
      break;
    default:
      WARN_ON(1);
  }

  if (nextCol->mode != RS_MNG_MODUL_LEGACY) {
    _rsMngRateSetLdpc(rsMngRate, _rsMngIsLdpcAllowed(staInfo));
  }

  _rsMngRateSetBw(rsMngRate, bw);
  // Set the search rate according to the new column and station info
  _rsMngRateSetGi(rsMngRate, nextCol->gi);
  if (nextCol->mode == RS_MNG_MODUL_SISO && _rsMngIsStbcAllowed(staInfo, rsMngRate)) {
    _rsMngRateSetStbc(rsMngRate, TRUE);
    _rsMngRateSetAnt(rsMngRate, TLC_MNG_CHAIN_A_MSK | TLC_MNG_CHAIN_B_MSK);
  } else {
    _rsMngRateSetStbc(rsMngRate, FALSE);
    _rsMngRateSetAnt(rsMngRate, nextCol->ant);
  }
  _rsMngRateSetIdx(rsMngRate, rateIdx);

  _memclr(&searchData->win, sizeof(searchData->win));
  searchData->column = nextColId;
  searchData->expectedTpt = _rsMngGetExpectedTpt(staInfo, &rsMngColumns[nextColId], bw,
                                                 !!staInfo->mvmsta->agg_tids, rateIdx);
  _rsMngSetVisitedColumn(staInfo, nextColId);

  DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
             "_rsMngSetUpSearchColData: starting new col at rate index %d (visited columns: 0x%X)",
             _rsMngRateGetIdx(rsMngRate), staInfo->visitedColumns);
}

static RS_MNG_COLUMN_DESC_E _rsMngGetMatchingMimoColumn(RS_MNG_COLUMN_DESC_E col) {
  switch (col) {
    case RS_MNG_COL_SISO_ANT_A:
    case RS_MNG_COL_SISO_ANT_B:
      return RS_MNG_COL_MIMO2;
    case RS_MNG_COL_SISO_ANT_A_SGI:
    case RS_MNG_COL_SISO_ANT_B_SGI:
      return RS_MNG_COL_MIMO2_SGI;
    case RS_MNG_COL_HE_3_2_SISO_ANT_A:
    case RS_MNG_COL_HE_3_2_SISO_ANT_B:
      return RS_MNG_COL_HE_3_2_MIMO;
    case RS_MNG_COL_HE_1_6_SISO_ANT_A:
    case RS_MNG_COL_HE_1_6_SISO_ANT_B:
      return RS_MNG_COL_HE_1_6_MIMO;
    case RS_MNG_COL_HE_0_8_SISO_ANT_A:
    case RS_MNG_COL_HE_0_8_SISO_ANT_B:
      return RS_MNG_COL_HE_0_8_MIMO;
    default:
      return RS_MNG_COL_INVALID;
  }
}

static BOOLEAN _rsMngSearchBetterCol(RS_MNG_STA_INFO_S* staInfo, const RS_MNG_TBL_INFO_S* tblInfo,
                                     U32 currTpt) {
  BOOLEAN ret = FALSE;
  RS_MNG_COLUMN_DESC_E nextColId;
  RS_MNG_COLUMN_DESC_E mimoCol;
  U08 currRateIdx = _rsMngRateGetIdx(&tblInfo->rsMngRate);
  U32 successRatio = tblInfo->win[currRateIdx].successRatio;
  // set target_tpt:
  // - if the current success ratio >= 85% -> keep the expected_tpt for this idx
  // - if the success ratio is too low     -> revert to last_tpt (current ?)
  U32 targetTpt = (successRatio <= RS_MNG_PERCENT(RS_MNG_SR_NO_DECREASE))
                      ? currTpt
                      : _rsMngGetExpectedTpt(staInfo, &rsMngColumns[tblInfo->column],
                                             _rsMngRateGetBw(&tblInfo->rsMngRate),
                                             !!(staInfo->mvmsta->agg_tids), currRateIdx);
  U32 bw;
  U08 rateIdx;

  DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
             "_rsMngSearchBetterCol: starting search. currTpt=%d targetTpt=%d", currTpt, targetTpt);

  // return column with expected better throughput, or invalid column if such doesn't exist
  nextColId = _rsMngGetNextColId(staInfo, tblInfo, targetTpt, &bw, &rateIdx);
  if (RS_MNG_COL_INVALID != nextColId) {
    _rsMngSetUpSearchColData(staInfo, nextColId, bw, rateIdx);
    ret = TRUE;
  } else if (staInfo->searchBw != MAX_CHANNEL_BW_INDX) {
    DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
               "_rsMngSearchBetterCol: checking if bw change could help. new bw %d",
               staInfo->searchBw);

    if ((rateIdx = _rsMngGetBestRate(staInfo, tblInfo, &rsMngColumns[staInfo->stableColumn],
                                     staInfo->searchBw, targetTpt)) != RS_MNG_INVALID_RATE_IDX) {
      nextColId = staInfo->stableColumn;
    } else if ((mimoCol = _rsMngGetMatchingMimoColumn(staInfo->stableColumn)) !=
                   RS_MNG_COL_INVALID &&
               (rateIdx = _rsMngGetBestRate(staInfo, tblInfo, &rsMngColumns[mimoCol],
                                            staInfo->searchBw, targetTpt)) !=
                   RS_MNG_INVALID_RATE_IDX) {
      nextColId = mimoCol;
    }

    if (nextColId != RS_MNG_COL_INVALID &&
        _rsMngIsColAllowed(staInfo, staInfo->searchBw, &rsMngColumns[nextColId])) {
      _rsMngSetUpSearchColData(staInfo, nextColId, staInfo->searchBw, rateIdx);
      ret = TRUE;
      DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO, "_rsMngSearchBetterCol: trying col %d with the new bw",
                 nextColId);
    } else {
      DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
                 "_rsMngSearchBetterCol: New bw can't improve tpt or isn't allowed, so not trying "
                 "it. col %d, allowed: %d",
                 nextColId,
                 nextColId == RS_MNG_COL_INVALID
                     ? 0
                     : _rsMngIsColAllowed(staInfo, staInfo->searchBw, &rsMngColumns[nextColId]));
    }
  }

  return ret;
}

static BOOLEAN _rsMngShouldStartUpscaleSearchCycle(const RS_MNG_STA_INFO_S* staInfo,
                                                   const RS_MNG_STA_LIMITS_S* staLimits,
                                                   unsigned long timeLastSearch) {
  // isUpscaleSearchCycle here is referring to the type of the previous search cycle.
  // This is here to prevent two consecutive upscale search cycles (i.e. started because of
  // passing the successFramesLimit threshold) within too short a time.
  zx_time_t cur_time = zx::clock::get_monotonic().get();
  return staInfo->totalFramesSuccess > staLimits->successFramesLimit &&
         (!staInfo->isUpscaleSearchCycle ||
          time_after(jiffies,
                     timeLastSearch + usecs_to_jiffies(RS_MNG_UPSCALE_SEARCH_CYCLE_MAX_FREQ)));
}

static BOOLEAN _rsMngShouldStartDownscaleSearchCycle(const RS_MNG_STA_INFO_S* staInfo,
                                                     const RS_MNG_STA_LIMITS_S* staLimits,
                                                     unsigned long timeLastSearch) {
  return time_after(jiffies, timeLastSearch + usecs_to_jiffies(staLimits->statsFlushTimeLimit)) ||
         staInfo->totalFramesFailed > staLimits->failedFramesLimit;
}

static BOOLEAN _rsMngShouldStartSearchCycle(const RS_MNG_STA_INFO_S* staInfo,
                                            BOOLEAN* isUpscaleSearchCycle) {
  const RS_MNG_RATE_S* rsMngRate = &staInfo->rateTblInfo.rsMngRate;
  BOOLEAN isNonHt = _rsMngRateGetMode(rsMngRate) == TLC_MNG_MODE_LEGACY;
  const RS_MNG_STA_LIMITS_S* staLimits = &g_rsMngStaModLimits[isNonHt];
  unsigned long timeLastSearch = staInfo->lastSearchCycleEndTimeJiffies;

  if (_rsMngShouldStartUpscaleSearchCycle(staInfo, staLimits, timeLastSearch)) {
    *isUpscaleSearchCycle = TRUE;
    return TRUE;
  }

  if (_rsMngShouldStartDownscaleSearchCycle(staInfo, staLimits, timeLastSearch)) {
    *isUpscaleSearchCycle = FALSE;
    return TRUE;
  }

  return FALSE;
}
#endif // NEEDS_PORTING

static void _rsMngPrepareForBwChangeAttempt(RS_MNG_STA_INFO_S *staInfo,
					    const RS_MNG_RATE_S *rsMngRate)
{
	bool isNonHt = _rsMngRateGetMode(rsMngRate) == TLC_MNG_MODE_LEGACY;
	RS_MCS_E mcs;
	U32 bw;
	U32 isMimo;

	staInfo->searchBw = MAX_CHANNEL_BW_INDX;
	if (isNonHt) {
		return;
	}

	mcs = _rsMngRateGetIdx(rsMngRate);
	bw = _rsMngRateGetBw(rsMngRate);
	isMimo = _rsMngRateGetModulation(rsMngRate) == RS_MNG_MODUL_MIMO2;

	if (mcs > g_rsMngDynBwStayMcs[bw][isMimo].highestStayMcs &&
	    _rsMngGetMaxChWidth(staInfo) > bw) {
		DBG_PRINTF(
			UT, TLC_OFFLOAD_DBG, INFO,
			"_rsMngPrepareForBwChangeAttempt: will try higher bandwidth (mcs %d, isMimo %d, "
			"bw %d->%d)",
			mcs, isMimo, bw, bw + 1);
		staInfo->searchBw = bw + 1;
	} else if (mcs < g_rsMngDynBwStayMcs[bw][isMimo].lowestStayMcs) {
		DBG_PRINTF(
			UT, TLC_OFFLOAD_DBG, INFO,
			"_rsMngPrepareForBwChangeAttempt: will try lower bandwidth (mcs %d, isMimo %d, "
			"bw %d->%d)",
			mcs, isMimo, bw, bw - 1);
		staInfo->searchBw = bw - 1;
	}
}

#if 0 // NEEDS_PORTING
static void _rsMngSetStayInCol(RS_MNG_STA_INFO_S* staInfo) {
  staInfo->rsMngState = RS_MNG_STATE_STAY_IN_COLUMN;
  staInfo->stableColumn = staInfo->rateTblInfo.column;

  staInfo->totalFramesFailed = 0;
  staInfo->totalFramesSuccess = 0;
  staInfo->lastSearchCycleEndTimeJiffies = jiffies;
  staInfo->txedFrames = 0;
  staInfo->visitedColumns = 0;
}

static BOOLEAN _rsMngTryColumnSwitch(RS_MNG_STA_INFO_S* staInfo, U32 currTpt, BOOLEAN* updateHost) {
  const RS_MNG_TBL_INFO_S* tblInfo = &staInfo->rateTblInfo;

  if (_rsMngSearchBetterCol(staInfo, tblInfo, currTpt)) {
    staInfo->searchBetterTbl = TRUE;
    *updateHost = FALSE;

    return TRUE;
  } else {
    DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
               "_rsMngTryColumnSwitch: No potential column found, change state to "
               "RS_MNG_STATE_STAY_IN_COLUMN");
    _rsMngSetStayInCol(staInfo);
    *updateHost = TRUE;

    return FALSE;
  }
}

static BOOLEAN _rsMngStartSearchCycle(RS_MNG_STA_INFO_S* staInfo, U32 currTpt,
                                      BOOLEAN* updateHost) {
  RS_MNG_TBL_INFO_S* tblInfo = &staInfo->rateTblInfo;
  RS_MNG_RATE_S* rsMngRate = &staInfo->rateTblInfo.rsMngRate;

  staInfo->rsMngState = RS_MNG_STATE_SEARCH_CYCLE_STARTED;
  _rsMngSetVisitedColumn(staInfo, tblInfo->column);

  DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
             "_rsMngStartSearchCycle: Moving to state SEARCH_CYCLE_STARTED, upscale search cycle "
             "%d, visited cols bitmask: 0x%X, curr rate: 0x%X",
             staInfo->isUpscaleSearchCycle, staInfo->visitedColumns, rsMngRate->rate.rate_n_flags);

  // If we're in HT/VHT/HE, we may want to test a different bandwidth during the search cycle.
  // According to requirements, this is decided based on the reason the search cycle started
  // (upscale or downscale) and the configuration and mcs when the sycle begins.
  // The new bandwidth will be tested on the column from the start of the search cycle.
  // Do that logic now.
  _rsMngPrepareForBwChangeAttempt(staInfo, rsMngRate);

  return _rsMngTryColumnSwitch(staInfo, currTpt, updateHost);
}

static void _rsMngSwitchToSearchCol(RS_MNG_STA_INFO_S* staInfo) {
  RS_MNG_TBL_INFO_S* tblInfo = &staInfo->rateTblInfo;
  RS_MNG_SEARCH_COL_DATA* searchData = &staInfo->searchColData;

  tblInfo->rsMngRate = searchData->rsMngRate;
  _rsMngClearTblWindows(staInfo);
  tblInfo->win[_rsMngRateGetIdx(&searchData->rsMngRate)] = searchData->win;
  tblInfo->column = searchData->column;
}

static BOOLEAN _rsMngTryScaleWithinColumn(RS_MNG_STA_INFO_S* staInfo, RS_MNG_WIN_STAT_S* currWin,
                                          BOOLEAN* updateHost) {
  RS_MNG_TBL_INFO_S* tblInfo = &staInfo->rateTblInfo;
  RS_MNG_ACTION_E action;
  U08 newIdx = RS_MNG_INVALID_RATE_IDX;

  action = _rsMngSearchBetterStartRate(staInfo, currWin, &tblInfo->rsMngRate, &newIdx);
  if (action == RS_MNG_ACTION_UPSCALE) {
    if (staInfo->rsMngState == RS_MNG_STATE_SEARCH_CYCLE_STARTED ||
        time_after(jiffies, staInfo->lastRateUpscaleTimeJiffies +
                                usecs_to_jiffies(RS_MNG_UPSCALE_MAX_FREQUENCY))) {
      // Rate upscaling could happen both during a search cycle and while in STAY_IN_COLUMN
      // state. When in stay in column the upscaling frequency is limited to no more than once
      // per 100ms. When in search cycle there is no limit because search cycles need to be as
      // short as possible.
      staInfo->lastRateUpscaleTimeJiffies = jiffies;
    } else {
      DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
                 "_rsMngTryScaleWithinColumn: not upscaling because not enough time passed "
                 "since last upscale (%d usec)",
                 systemTimeGetUsecDiffTime(staInfo->lastRateUpscaleTimeJiffies));
      action = RS_MNG_ACTION_STAY;
    }
  }

  staInfo->tryingRateUpscale = (U08)(action == RS_MNG_ACTION_UPSCALE);

  if (action != RS_MNG_ACTION_STAY) {
    _rsMngRateSetIdx(&tblInfo->rsMngRate, newIdx);
    return TRUE;
  }

  return FALSE;
}

static void _rsMngLookForNextSearchRate(RS_MNG_STA_INFO_S* staInfo, RS_MNG_WIN_STAT_S* currWin,
                                        BOOLEAN* updateHost) {
  // During a search cycle first search for the optimal rate within the current column, and once
  // that is found (i.e. _rsMngTryScaleWithinColumn returns FALSE), search for a better column to
  // switch to.
  if (!_rsMngTryScaleWithinColumn(staInfo, currWin, updateHost)) {
    _rsMngTryColumnSwitch(staInfo, currWin->averageTpt, updateHost);
  }
}

typedef enum _RS_MNG_TPC_ALLOWED_REASON_E {
  RS_MNG_TPC_DISALLOWED_DEBUG_HOOK,
  RS_MNG_TPC_DISALLOWED_SLEEP_DISALLOWED,
  RS_MNG_TPC_DISALLOWED_IN_SEARCH_CYCLE,
  RS_MNG_TPC_DISALLOWED_RATE_IS_NON_HT,
  RS_MNG_TPC_DISALLOWED_RATE_IS_NOT_OPTIMAL,
  RS_MNG_TPC_DISALLOWED_TEST_RATE,
  RS_MNG_TPC_DISALLOWED_AMSDU_INACTIVE,
  RS_MNG_TPC_DISALLOWED_AMSDU_TIME_LIMIT,
  RS_MNG_TPC_ALLOWED,
} RS_MNG_TPC_ALLOWED_REASON_E;

static RS_MNG_TPC_ALLOWED_REASON_E _rsMngTpcAllowed(const RS_MNG_STA_INFO_S* staInfo,
                                                    U32* tpcAllowedData) {
  const RS_MNG_RATE_S* rsMngRate = &staInfo->rateTblInfo.rsMngRate;
  TLC_MNG_MODE_E mode;
  RS_MNG_TX_AMSDU_SIZE_E amsduSize;

  if (!PWR_IS_SLEEP_ALLOWED) {
    DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
               "_rsMngTpcAllowed: TPC disallowed because sleep disallowed");
    return RS_MNG_TPC_DISALLOWED_SLEEP_DISALLOWED;
  }

  if (staInfo->rsMngState == RS_MNG_STATE_SEARCH_CYCLE_STARTED) {
    DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
               "_rsMngTpcAllowed: TPC disallowed because in search cycle");
    return RS_MNG_TPC_DISALLOWED_IN_SEARCH_CYCLE;
  }

  mode = _rsMngRateGetMode(rsMngRate);
  if (mode == TLC_MNG_MODE_LEGACY) {
    DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
               "_rsMngTpcAllowed: TPC disallowed because in non-HT rate");
    return RS_MNG_TPC_DISALLOWED_RATE_IS_NON_HT;
  }

  if (!_rsMngRateIsOptimal(staInfo, rsMngRate)) {
    DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
               "_rsMngTpcAllowed: TPC disallowed because rate is not optimal");
    *tpcAllowedData = rsMngRate->rate.rate_n_flags;
    return RS_MNG_TPC_DISALLOWED_RATE_IS_NOT_OPTIMAL;
  }

  if (staInfo->tryingRateUpscale) {
    DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
               "_rsMngTpcAllowed: TPC disallowed because current rate is test rate");
    return RS_MNG_TPC_DISALLOWED_TEST_RATE;
  }

  amsduSize =
      _rsMngAmsduSize(staInfo, mode, _rsMngRateGetBw(rsMngRate), _rsMngRateGetIdx(rsMngRate),
                      _rsMngRateGetGi(rsMngRate), _rsMngRateGetModulation(rsMngRate));
  if (staInfo->amsduSupport && amsduSize != RS_MNG_AMSDU_INVALID) {
    // amsdu is supported in general, and specifically for this rate (i.e. the phy rate of the
    // optimal rate is above the amsdu min phy rate threshold)
    if (staInfo->amsduEnabledSize == RS_MNG_AMSDU_INVALID) {
      DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
                 "_rsMngTpcAllowed: TPC disallowed because amsdu is not yet active");
      return RS_MNG_TPC_DISALLOWED_AMSDU_INACTIVE;
    }
    if (time_before(jiffies,
                    staInfo->lastEnableJiffies + usecs_to_jiffies(RS_MNG_TPC_AMSDU_ENABLE))) {
      DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
                 "_rsMngTpcAllowed: TPC disallowed because not enough time elapsed since "
                 "amsdu enablement. time elapsed: %u",
                 time);
      return RS_MNG_TPC_DISALLOWED_AMSDU_TIME_LIMIT;
    }
  }

  DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO, "_rsMngTpcAllowed: TPC is allowed");
  return RS_MNG_TPC_ALLOWED;
}

typedef enum _RS_MNG_TPC_ACTION {
  RS_MNG_TPC_ACTION_STAY,
  RS_MNG_TPC_ACTION_INCREASE,
  RS_MNG_TPC_ACTION_DECREASE,
  RS_MNG_TPC_ACTION_DISABLE,
} RS_MNG_TPC_ACTION;

static RS_MNG_TPC_ACTION _rsMngTpcGetAction(const RS_MNG_STA_INFO_S* staInfo) {
  const RS_MNG_TPC_TBL_S* tpcTbl = &staInfo->tpcTable;
  U32 currStepSR;
  U08 currStep = tpcTbl->currStep;
  BOOLEAN tpcInactive = currStep == RS_MNG_TPC_INACTIVE;

  if (WARN_ON(!(currStep < RS_MNG_TPC_DISABLED))) {
    return RS_MNG_TPC_ACTION_STAY;
  }

  if (!tpcInactive) {
    currStepSR = tpcTbl->windows[currStep].successRatio;
  } else {
    currStepSR =
        staInfo->rateTblInfo.win[_rsMngRateGetIdx(&staInfo->rateTblInfo.rsMngRate)].successRatio;
  }

  if (!tpcInactive) {
    // if testing is TRUE, then we are now operating on results from a tpc_action_increase test
    // window. In this case we don't want to completely disable tpc even if the current SR is
    // relatively bad. Instead we will just decrease back to the last good step.
    if (currStepSR <= RS_MNG_TPC_SR_DISABLE && !tpcTbl->testing) {
      DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
                 "_rsMngTpcGetAction: DISABLING tpc. currStep = %d, currStepSR = %d", currStep,
                 currStepSR);
      return RS_MNG_TPC_ACTION_DISABLE;
    }
    if (currStepSR <= RS_MNG_TPC_SR_DECREASE) {
      DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
                 "_rsMngTpcGetAction: DECREASING tpc. currStep = %d, currStepSR = %d", currStep,
                 currStepSR);
      return RS_MNG_TPC_ACTION_DECREASE;
    }
  }

  if (tpcInactive || currStep < RS_MNG_TPC_NUM_STEPS - 1) {
    U08 higherStep = (U08)(tpcInactive ? 0 : currStep + 1);
    U32 higherStepSR = tpcTbl->windows[higherStep].successRatio;

    // only attempt to increase power reduction if this hasn't been tried since the last time
    // statistics for the higher step were cleared
    if (currStepSR >= RS_MNG_TPC_SR_INCREASE && higherStepSR == RS_MNG_INVALID_VAL) {
      DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
                 "_rsMngTpcGetAction: INCREASING tpc. currStep = %d, currStepSR = %d", currStep,
                 currStepSR);
      return RS_MNG_TPC_ACTION_INCREASE;
    }
  }

  DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
             "_rsMngTpcGetAction: STAY tpc. currStep = %d, currStepSR = %d", currStep, currStepSR);
  return RS_MNG_TPC_ACTION_STAY;
}

static void _rsMngTpcDoAction(RS_MNG_STA_INFO_S* staInfo, RS_MNG_TPC_ACTION action) {
  RS_MNG_TPC_TBL_S* tpcTbl = &staInfo->tpcTable;

  switch (action) {
    case RS_MNG_TPC_ACTION_INCREASE:
      if (tpcTbl->currStep == RS_MNG_TPC_INACTIVE) {
        tpcTbl->currStep = 0;
      } else {
        tpcTbl->currStep++;
      }
      tpcTbl->testing = TRUE;
      break;
    case RS_MNG_TPC_ACTION_DECREASE:
      if (tpcTbl->currStep > 0) {
        tpcTbl->currStep--;
      } else {
        tpcTbl->currStep = RS_MNG_TPC_INACTIVE;
      }
      tpcTbl->testing = FALSE;
      break;
    case RS_MNG_TPC_ACTION_DISABLE:
      tpcTbl->currStep = RS_MNG_TPC_INACTIVE;
    /* fall through */
    case RS_MNG_TPC_ACTION_STAY:
    /* fall through */
    default:
      tpcTbl->testing = FALSE;
      break;
  }
}

static void _rsMngHandleBwChange(RS_MNG_STA_INFO_S* staInfo) {
  RS_MNG_SEARCH_COL_DATA* searchData = &staInfo->searchColData;
  RS_MNG_RATE_S* prevRate = &staInfo->rateTblInfo.rsMngRate;

  // check if this was a bandwidth search
  if (_rsMngRateGetModulation(&searchData->rsMngRate) != RS_MNG_MODUL_LEGACY &&
      staInfo->stableColumn >= RS_MNG_COL_FIRST_HT_VHT &&
      _rsMngRateGetBw(&searchData->rsMngRate) != _rsMngRateGetBw(prevRate)) {
    staInfo->searchBw = MAX_CHANNEL_BW_INDX;

    // attempting a bandwidth change is always the very last configuration change attempt in a
    // search cycle. mark all columns as visited in order to make sure the search cycle will
    // end.
    staInfo->visitedColumns = (U32)-1;
  }
}

static BOOLEAN _rsMngHandleBtCoex(const RS_MNG_STA_INFO_S* staInfo, RS_MNG_RATE_S* rate,
                                  RS_MNG_COLUMN_DESC_E* col) {
  /*
   * BT-Coex only restricts use of the shared antenna if the rate is a SISO non-STBC rate. In case
   * of MIMO (or SISO with STBC) nothing needs to be done.
   * So check here only if the column uses only the shared antenna.
   */
  if (rsMngColumns[*col].ant != BT_COEX_SHARED_ANT_ID) {
    return FALSE;
  }

  if (!_rsMngRateGetStbc(rate)) {
    U08 singleAnt = rsMngGetSingleAntMsk(staInfo->config.chainsEnabled);

    /*
     * Set the antenna to the non-shared one if possible.
     * In case of SAR limitation, for example, it may be that BT is in a high activity grading
     * and would prefer that wifi use the other antenna, but due to the SAR restriction this is
     * not possible. Because rsMngGetSingleAntMsk always returns the non-shared antenna if it's
     * available (i.e. enabled by configuration and not restricted due to SAR limitation), using
     * the antenna returned by that function handles this type of case too.
     */
    if (_rsMngRateGetAnt(rate) == singleAnt) {
      return FALSE;
    }

    _rsMngRateSetAnt(rate, singleAnt);
    *col ^= 1;
    return TRUE;
  }

  /*
   * Just to avoid reaching here again the next time around, set the column to the non-shared-ant
   * one. In reality there's no difference because with STBC both antennas are used in any case.
   * The xor here does the trick thanks to the compilation asserts near _rsMngSetVisitedColumn.
   */
  *col ^= 1;

  return FALSE;
}

static void _rsMngRateScalePerform(RS_MNG_STA_INFO_S* staInfo, BOOLEAN forceUpdate) {
  RS_MNG_TBL_INFO_S* tblInfo = &staInfo->rateTblInfo;
  RS_MNG_WIN_STAT_S* currWin;
  BOOLEAN updateLmac = forceUpdate, updateHost = FALSE;
  RS_MNG_TPC_ALLOWED_REASON_E tpcAllowed;
  U32 tpcAllowedData = 0;

  if (_rsMngCoexIsLongAggAllowed(staInfo) != staInfo->longAggEnabled) {
    updateLmac = TRUE;
  }

  if (btCoexManagerBtOwnsAnt(staInfo->mvm)) {
    updateLmac |= _rsMngHandleBtCoex(staInfo, &tblInfo->rsMngRate, &tblInfo->column);

    /*
     * If these stats are on a search rate, and that rate just happens to be siso on the shared
     * antenna, change it to the non-shared one too.
     */
    if (staInfo->rsMngState == RS_MNG_STATE_SEARCH_CYCLE_STARTED && staInfo->searchBetterTbl) {
      _rsMngHandleBtCoex(staInfo, &staInfo->searchColData.rsMngRate,
                         &staInfo->searchColData.column);
    }
  }

  if (staInfo->rsMngState == RS_MNG_STATE_SEARCH_CYCLE_STARTED) {
    updateLmac = TRUE;

    if (staInfo->searchBetterTbl) {
      // Last rate sent to lmac was of a test for a new column. Check if it's any good.
      U32 stableRateTpt = tblInfo->win[_rsMngRateGetIdx(&tblInfo->rsMngRate)].averageTpt;

      staInfo->searchBetterTbl = FALSE;
      currWin = &staInfo->searchColData.win;

      _rsMngHandleBwChange(staInfo);

      if (currWin->averageTpt >= stableRateTpt) {
        // Yay! The search column is better! switch over to it.
        DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
                   "_rsMngRateScalePerform: search col Tpt %d > lastTpt %d. swapping to "
                   "the search table",
                   currWin->averageTpt, stableRateTpt);

        _rsMngSwitchToSearchCol(staInfo);

        _rsMngLookForNextSearchRate(staInfo, currWin, &updateHost);
      } else {
        // The search col didn't turn out to improve tpt, so search for another new column.
        DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
                   "_rsMngRateScalePerform: search col Tpt %d <= lastTpt %d. Searching for "
                   "another column",
                   currWin->averageTpt, stableRateTpt);

        _rsMngTryColumnSwitch(staInfo, stableRateTpt, &updateHost);
      }
    } else {
      // In the middle of searching for an optimal rate within a column. Continue this effort.
      currWin = &tblInfo->win[_rsMngRateGetIdx(&tblInfo->rsMngRate)];

      _rsMngLookForNextSearchRate(staInfo, currWin, &updateHost);
    }
  } else {
    // Not in a search cycle.

    if (!_rsMngTpcIsActive(staInfo)) {
      // If TPC is active (i.e. actually reducing Tx power), we don't try to scale within the
      // column, will only do tpc scaling farther down in this function.

      // If previous rate was an upscale test, need to update lmac regardless of the next rate
      // because even if it's the same rate again, need to send the lq command without the
      // test-rate bit set.
      updateLmac |= staInfo->tryingRateUpscale;

      currWin = &tblInfo->win[_rsMngRateGetIdx(&tblInfo->rsMngRate)];

      // Check if to try changing rate within the column. If so - update lmac. Otherwise -
      // check if it's time to start a new search cycle and act upon that decision
      if (_rsMngTryScaleWithinColumn(staInfo, currWin, &updateHost)) {
        updateLmac = TRUE;
      } else if (_rsMngShouldStartSearchCycle(staInfo, &staInfo->isUpscaleSearchCycle)) {
        updateLmac |= _rsMngStartSearchCycle(staInfo, currWin->averageTpt, &updateHost);
      } else {
        // Note that if the rate didn't really change the host-update function will not send
        // a notification to host regadless of the value of this BOOLEAN.
        updateHost = TRUE;
      }
    }
  }

  tpcAllowed = _rsMngTpcAllowed(staInfo, &tpcAllowedData);
  if (tpcAllowed == RS_MNG_TPC_ALLOWED) {
    RS_MNG_TPC_ACTION action;

    if (staInfo->tpcTable.currStep == RS_MNG_TPC_DISABLED) {
      // First time tpc is allowed, start a tpc search cycle (quick movement between tpc
      // steps)
      _rsMngClearWinArr(staInfo->tpcTable.windows, RS_MNG_TPC_NUM_STEPS);
      staInfo->tpcTable.currStep = RS_MNG_TPC_INACTIVE;
      staInfo->rsMngState = RS_MNG_STATE_TPC_SEARCH;

      DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO, "_rsMngRateScalePerform: starting tpc search");
    }

    action = _rsMngTpcGetAction(staInfo);

    updateLmac |= staInfo->tpcTable.testing;

    if (staInfo->rsMngState == RS_MNG_STATE_TPC_SEARCH) {
      if (action == RS_MNG_TPC_ACTION_STAY) {
        DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
                   "_rsMngRateScalePerform: change state to RS_MNG_STATE_STAY_IN_COLUMN");

        staInfo->rsMngState = RS_MNG_STATE_STAY_IN_COLUMN;
        updateHost = TRUE;
      }
    } else {
      if (action == RS_MNG_TPC_ACTION_INCREASE) {
        if (time_after(jiffies, staInfo->lastRateUpscaleTimeJiffies +
                                    usecs_to_jiffies(RS_MNG_UPSCALE_MAX_FREQUENCY))) {
          staInfo->lastRateUpscaleTimeJiffies = jiffies;
        } else {
          DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
                     "_rsMngTryScaleWithinColumn: overriding tpc increase. time since "
                     "last increase %dusec",
                     systemTimeGetUsecDiffTime(staInfo->lastRateUpscaleTimeJiffies));
          action = RS_MNG_TPC_ACTION_STAY;
        }
      }
    }

    _rsMngTpcDoAction(staInfo, action);
    updateLmac |= (action != RS_MNG_TPC_ACTION_STAY);
  } else if (staInfo->tpcTable.currStep != RS_MNG_TPC_DISABLED) {
    // TPC was just disallowed. Reset tpc state.

    // If TPC was active or was testing a new step, need to resend an lq with no power reduction
    // and no test-window bit.
    updateLmac |= (_rsMngTpcIsActive(staInfo) || staInfo->tpcTable.testing);

    staInfo->tpcTable.testing = FALSE;
    staInfo->tpcTable.currStep = RS_MNG_TPC_DISABLED;

    if (staInfo->rsMngState == RS_MNG_STATE_TPC_SEARCH) {
      staInfo->rsMngState = RS_MNG_STATE_STAY_IN_COLUMN;
      updateHost = TRUE;
    }
  }

  if (updateLmac) {
    _rsMngUpdateRateTbl(staInfo, staInfo->rsMngState == RS_MNG_STATE_STAY_IN_COLUMN && updateHost);
  }
}

static void rsMngInitAmsdu(RS_MNG_STA_INFO_S* staInfo) {
  if (staInfo->config.amsduSupported && staInfo->config.bestSuppMode >= TLC_MNG_MODE_VHT &&
      _rsMngGetMaxChWidth(staInfo) >= TLC_MNG_CH_WIDTH_40MHZ) {
    staInfo->amsduSupport = TRUE;
  } else {
    staInfo->amsduSupport = FALSE;
  }

  staInfo->amsduEnabledSize = RS_MNG_AMSDU_INVALID;
  DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO, "rsMngInitAmsdu: sta %d, AMSDU support %d",
             _rsMngStaInfoToStaId(staInfo), staInfo->amsduSupport);

  staInfo->lastTrafficLoadStatJiffies = jiffies;
}

static U16 _rsMngAmsduEnumToSize(RS_MNG_TX_AMSDU_SIZE_E value) {
  switch (value) {
    case RS_MNG_AMSDU_3500B:
      return 3500;
    case RS_MNG_AMSDU_5000B:
      return 5000;
    case RS_MNG_AMSDU_6500B:
      return 6500;
    case RS_MNG_AMSDU_8000B:
      return 8000;
    default:
      return 0;
  }
}

static void _rsMngNotifAmsdu(RS_MNG_STA_INFO_S* staInfo, U32 successRatio, U32 trafficLoadPerSec) {
  U16 bitmap = 0;
  U16 size = 0;

  if (staInfo->amsduEnabledSize != RS_MNG_AMSDU_INVALID) {
    // Check which TIDs are not low latency and have an AMSDU in AMPDU session.
    // We activate AMSDU only for those.
    bitmap = (U16)(RS_MNG_AMSDU_VALID_TIDS_MSK & staInfo->mvmsta->agg_tids & staInfo->amsduInAmpdu);
    size = _rsMngAmsduEnumToSize(staInfo->amsduEnabledSize);
    if (size > staInfo->config.maxMpduLen) {
      size = staInfo->config.maxMpduLen;
    }
  }

  DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
             "_rsMngNotifAmsdu: sta %d AMSDU enabled ? %u. bitmap %x, size %d",
             _rsMngStaInfoToStaId(staInfo), staInfo->amsduEnabledSize != RS_MNG_AMSDU_INVALID,
             bitmap, size);

  tlcMngNotifyAmsdu(staInfo, size, bitmap);
}

// Activate fail safe mechanism:
// We may have interoperability issues, where the peer cannot receive correctly
// AMSDUs, in which case we will constantly try to enable AMSDU, and will fall
// back to disabling it.
// In case we consecutively toggle to disable within a FAIL_TIME_THRESHOLD from
// enablement FAIL_CONSEC_THRESHOLD times - blacklist this AMSDU size permanently.
static void _rsMngAmsduFailSafe(RS_MNG_STA_INFO_S* staInfo, unsigned long currentTime) {
  // Since traffic load 1 sec window is not exactly one sec, check to see if we
  // are within its window by comparing the update of the stat timestamp with
  // the enable event.
  // If the "1 sec" window has passed, then the timestamp was updated.
  if (time_before(currentTime, staInfo->lastEnableJiffies +
                                   usecs_to_jiffies(RS_MNG_AMSDU_FAIL_TIME_THRESHOLD)) ||
      staInfo->lastEnableJiffies == staInfo->lastTrafficLoadStatJiffies) {
    staInfo->failSafeCounter++;
    DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
               "_rsMngAmsduFailSafe: Sta %d IOP counter incremented to %d",
               _rsMngStaInfoToStaId(staInfo), staInfo->failSafeCounter);
  } else {
    staInfo->failSafeCounter = 0;
  }

  if (staInfo->failSafeCounter >= RS_MNG_AMSDU_FAIL_CONSEC_THRESHOLD) {
    // disable AMSDU permanently for this AMSDU size
    staInfo->amsduBlacklist |= BIT(staInfo->amsduEnabledSize);
    staInfo->failSafeCounter = 0;
    DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO, "_rsMngAmsduFailSafe: sta %d, blacklisted size %d",
               _rsMngStaInfoToStaId(staInfo), staInfo->amsduEnabledSize);

    // if all disabled - save some future processing
    if (staInfo->amsduBlacklist == RS_MNG_AMSDU_SIZE_ALL) {
      staInfo->amsduSupport = FALSE;
    }
  }
}

static void _rsMngAmsduChanged(RS_MNG_STA_INFO_S* staInfo, RS_MNG_TX_AMSDU_SIZE_E size,
                               unsigned long time, U32 successRatio, U32 trafficLoadPerSec) {
  if (size < staInfo->amsduEnabledSize) {
    _rsMngAmsduFailSafe(staInfo, time);
  }
  staInfo->amsduEnabledSize = size;
  if (size != RS_MNG_AMSDU_INVALID) {
    staInfo->lastEnableJiffies = time;
  }
  _rsMngNotifAmsdu(staInfo, successRatio, trafficLoadPerSec);
}

/*
 * Returns whether amsdu state changed from enabled to disabled or vice-versa (size changes are not
 * considered a state change in this respect)
 */
static BOOLEAN _rsMngCollectAmsduTlcData(RS_MNG_STA_INFO_S* staInfo, U32 baTxed, U32 baAcked,
                                         U16 trafficLoad) {
  RS_MNG_TX_AMSDU_SIZE_E size;
  unsigned long elapsedTime, currentTime, trafficLoadPerSec, successRatio;
  BOOLEAN ret = FALSE;
  const U32 baTxedUnnormalized = baTxed;
  RS_MNG_RATE_S* rsMngRate = &staInfo->rateTblInfo.rsMngRate;

  currentTime = jiffies;
  elapsedTime = jiffies_to_usecs(currentTime - staInfo->lastTrafficLoadStatJiffies) >> 10;
  elapsedTime = elapsedTime ?: 1;

  staInfo->trafficLoad += trafficLoad;
  size = _rsMngAmsduSize(staInfo, _rsMngRateGetMode(rsMngRate), _rsMngRateGetBw(rsMngRate),
                         _rsMngRateGetIdx(rsMngRate), _rsMngRateGetGi(rsMngRate),
                         _rsMngRateGetModulation(rsMngRate));

  DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
             "_rsMngCollectAmsduTlcData: baTxed %d, baAcked %d, new trafficLoad %d, time from "
             "last traffic load check %d, trafficLoad %d potential size %d",
             baTxed, baAcked, trafficLoad, elapsedTime, staInfo->trafficLoad, size);

  // Normalize the baTxed to be able to divide by it without explicit zero check
  // baAcked is zero as well in this case, so it has no functionality impact
  baTxed = baTxed ?: 1;

  if (staInfo->amsduEnabledSize == RS_MNG_AMSDU_INVALID) {
    // AMSDU TLC traffic load works in a window of 1 second
    if (elapsedTime < 1000) {
      DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
                 "_rsMngCollectAmsduTlcData: amsdu disabled, but elapsedTime less than one second");
      return FALSE;
    }

    // This div will only be done 1 time in a second, if AMSDU is supported - not that expensive
    successRatio = (baAcked * 128) / baTxed;
    // normalize the traffic load to a 1 second window
    trafficLoadPerSec = (staInfo->trafficLoad << 10) / elapsedTime;

    DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
               "_rsMngCollectAmsduTlcData: amsdu disabled. successRatio %d, trafficLoadPerSec %d",
               successRatio, trafficLoadPerSec);

    if (successRatio > RS_MNG_AMSDU_SR_ENABLE_THRESHOLD &&
        trafficLoadPerSec > RS_MNG_AMSDU_TL_ENABLE_THRESHOLD && size != RS_MNG_AMSDU_INVALID) {
      // AMSDU is disabled and should be enabled
      _rsMngAmsduChanged(staInfo, size, currentTime, successRatio, trafficLoadPerSec);
      ret = TRUE;
    }
  } else {
    successRatio = (baAcked * 128) / baTxed;
    // normalize the traffic load to a 1 second window
    trafficLoadPerSec = (staInfo->trafficLoad << 10) / elapsedTime;

    DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
               "_rsMngCollectAmsduTlcData: amsdu is enabled with size %d, successRatio %d, "
               "trafficLoadPerSec  %d",
               staInfo->amsduEnabledSize, successRatio, trafficLoadPerSec);

    // AMSDU is enabled - check if we should disable or up/down-grade.
    // Note that we upgrade here without waiting for a second to pass since the last change in
    // order to recover as fast as possible from a momentary rate reduction (at the price of
    // perhaps triggering the failsafe mechanism too early).
    if (size != staInfo->amsduEnabledSize) {
      DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
                 "_rsMngCollectAmsduTlcData: new size is different than current size. updating");
      _rsMngAmsduChanged(staInfo, size, currentTime, successRatio, trafficLoadPerSec);
      return size == RS_MNG_AMSDU_INVALID;
    }

    if (successRatio < RS_MNG_AMSDU_SR_DISABLE_THRESHOLD && baTxedUnnormalized) {
      DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
                 "_rsMngCollectAmsduTlcData: success ratio too low. Disabling amsdu");
      _rsMngAmsduChanged(staInfo, RS_MNG_AMSDU_INVALID, currentTime, successRatio,
                         trafficLoadPerSec);
      return TRUE;
    }

    // AMSDU TLC traffic load works in a window of 1 second
    if (elapsedTime < 1000) {
      DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
                 "_rsMngCollectAmsduTlcData: elapsed time less than a second, skipping TL check");
      return FALSE;
    }

    if (trafficLoadPerSec < RS_MNG_AMSDU_TL_DISABLE_THRESHOLD) {
      staInfo->trafficLoad = trafficLoadPerSec;
      _rsMngAmsduChanged(staInfo, RS_MNG_AMSDU_INVALID, currentTime, successRatio,
                         trafficLoadPerSec);
      ret = TRUE;
    }
  }

  DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO, "_rsMngCollectAmsduTlcData: resetting trafficLoad counter");

  staInfo->trafficLoad = 0;
  staInfo->lastTrafficLoadStatJiffies = currentTime;

  return ret;
}

/**
 * Update the success/failure sliding window
 *
 * We keep a sliding window of the last 64 packets transmitted
 * at this rate.  window->data contains the bitmask of
 * successful packets.
 */
// TODO - handle the position of the acks/fails in the window. for now - we only care about the
// counters (how many failed/succeeded regardless of when)
static BOOLEAN _rsMngCollectTlcData(RS_MNG_STA_INFO_S* staInfo, int attempts, int successes) {
  RS_MNG_WIN_STAT_S* window;
  const RS_MNG_RATE_S* rsMngRate = &staInfo->rateTblInfo.rsMngRate;
  U32 expectedTpt;
  U32 tmpSumFrames = attempts;
  U32 tmpExtraFrames;
  U32 windowSize;
  BOOLEAN ret = TRUE;

  if (staInfo->searchBetterTbl) {
    RS_MNG_SEARCH_COL_DATA* searchData = &staInfo->searchColData;

    window = &searchData->win;
    expectedTpt = searchData->expectedTpt;
    rsMngRate = &searchData->rsMngRate;
  } else if (_rsMngTpcIsActive(staInfo)) {
    window = &staInfo->tpcTable.windows[staInfo->tpcTable.currStep];
    // In TPC we don't care about expected/average tpt, only about success ratio. Initialize
    // this var here anyways so the compiler won't complain.
    expectedTpt = 0;
  } else {
    RS_MNG_TBL_INFO_S* tblInfo = &staInfo->rateTblInfo;
    U32 rateIdx = _rsMngRateGetIdx(&tblInfo->rsMngRate);

    window = &tblInfo->win[rateIdx];
    expectedTpt = _rsMngGetExpectedTpt(staInfo, &rsMngColumns[tblInfo->column],
                                       _rsMngRateGetBw(&tblInfo->rsMngRate),
                                       !!(staInfo->mvmsta->agg_tids), rateIdx);
  }

  windowSize = _rsMngRateGetMode(rsMngRate) != TLC_MNG_MODE_LEGACY ? RS_MNG_MAX_WINDOW_SIZE
                                                                   : RS_MNG_MAX_WINDOW_SIZE_NON_HT;

  tmpSumFrames += window->framesCounter;

  DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO, "_rsMngCollectTlcData: old data: frames: %d, success: %d",
             window->framesCounter, window->successCounter);

  if (attempts >= windowSize) {
    window->successCounter = (windowSize * successes) / attempts;
    window->framesCounter = windowSize;
  } else if (tmpSumFrames > windowSize) {
    /***** Calculate window->successCounter *****/
    // TODO - replace with good algorithem. for now this is a workaround
    tmpExtraFrames = (tmpSumFrames - windowSize);

    // 1. calculated the ratio of window->successCounter in window->framesCounter and substruct
    // the matching part of the frames substructed
    //    to avoid exceeding the MAX window size.
    window->successCounter -=
        (tmpExtraFrames * window->successCounter) / MAX(1, window->framesCounter);

    // 2. add the successes to window->successCounter, as long as it dosn't exceed the max
    // window size
    window->successCounter = min_t(U32, (window->successCounter + successes), windowSize);

    window->framesCounter = windowSize;
  } else {
    if (!WARN_ON(!((window->successCounter + successes) <= windowSize))) {
      window->successCounter += successes;
      window->framesCounter += attempts;
    }
  }

  // Calculate current success ratio
  if (window->framesCounter > 0) {
    window->successRatio = (128 * window->successCounter) / window->framesCounter;

    // Calculate average throughput, if we have enough history.
    if (_isAvgTptCalcPossible(window)) {
      window->averageTpt = ((window->successRatio * expectedTpt) + 64) / 128;
    } else {
      window->averageTpt = RS_MNG_INVALID_VAL;
      ret = FALSE;
    }
  } else {
    window->successRatio = RS_MNG_INVALID_VAL;
    window->averageTpt = RS_MNG_INVALID_VAL;
    ret = FALSE;
  }

  DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
             "_rsMngCollectTlcData: new data: framesCounter: %d, successCounter: %d, "
             "successRatio: %d/128, avg Tpt: %d, expected Tpt: %d",
             window->framesCounter, window->successCounter, window->successRatio,
             window->averageTpt, expectedTpt);

  return ret;
}

static U16 _rsMngGetCurrentThreshold(const RS_MNG_STA_INFO_S* staInfo) {
  return (U16)(_rsMngIsTestWindow(staInfo) ? RS_MNG_UPSCALE_AGG_FRAME_COUNT : RS_STAT_THOLD);
}

static BOOLEAN _rsMngUpdateGlobalStats(RS_MNG_STA_INFO_S* staInfo, TLC_STAT_COMMON_API_S* stats) {
  DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
             "_rsMngUpdateGlobalStats: tpc stats: no-tpc %u, step1 %u, step2 %u, step3 %u, step4 "
             "%u, step5 %u",
             g_rsMngTpcStats.noTpc, g_rsMngTpcStats.step[0], g_rsMngTpcStats.step[1],
             g_rsMngTpcStats.step[2], g_rsMngTpcStats.step[3], g_rsMngTpcStats.step[4]);

  if (staInfo->rsMngState == RS_MNG_STATE_STAY_IN_COLUMN && !_rsMngIsTestWindow(staInfo)) {
    BOOLEAN isNonHt = _rsMngRateGetMode(&staInfo->rateTblInfo.rsMngRate) == TLC_MNG_MODE_LEGACY;

    staInfo->totalFramesSuccess += stats->acked[0] + stats->acked[1];
    staInfo->totalFramesFailed +=
        stats->txed[0] - stats->acked[0] + stats->txed[1] - stats->acked[1];
    staInfo->txedFrames += stats->txed[0] + stats->txed[1];

    DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO, "Total frames succeeded: %d, total frames failed: %d",
               staInfo->totalFramesSuccess, staInfo->totalFramesFailed);

    // If we have been in this column long enough (regardless of the fail/success rate or time
    // elapsed) - start the statistics calculation from scratch
    if (staInfo->txedFrames >= g_rsMngStaModLimits[isNonHt].clearTblWindowsLimit) {
      DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
                 "_rsMngUpdateGlobalStats: Stayed in same column for a long time. Clear "
                 "table windows. modulation counter was %d",
                 staInfo->txedFrames);

      staInfo->txedFrames = 0;
      _rsMngClearTblWindows(staInfo);
    }
  }

  staInfo->framesSinceLastRun += stats->txed[0] + stats->txed[1];
  if (staInfo->framesSinceLastRun >= _rsMngGetCurrentThreshold(staInfo)) {
    staInfo->framesSinceLastRun = 0;
    return TRUE;
  }

  return FALSE;
}

// TODO(fxbug.dev/84605): Rate Selection
static void tlcStatUpdateHandler(RS_MNG_STA_INFO_S* staInfo, TLC_STAT_COMMON_API_S* stats,
                                 struct iwl_mvm* mvm, struct ieee80211_sta* sta, int tid,
                                 BOOLEAN is_ndp) {
  BOOLEAN forceLmacUpdate = FALSE;
  int i;

  if (!staInfo->enabled) {
    // Could happen if statistics from lmac were sent while umac was handling remove station.
    DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
               "tlcStatUpdateHandler: received stats for invalid station %d. Ignoring", i);
    return;
  }

  if (!(stats->txed[0] || stats->txed[1])) {
    DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
               "tlcStatUpdateHandler: no new info for station %u, skipping it", i);
    return;
  }

  // TODO: optimize, no need for array
  staInfo->amsduInAmpdu = 0;
  for (i = 0; i < IWL_MAX_TID_COUNT; i++)
    if (staInfo->mvmsta->tid_data[i].amsdu_in_ampdu_allowed) {
      staInfo->amsduInAmpdu |= BIT(i);
    }

  if (!_rsMngIsTestWindow(staInfo) && staInfo->amsduSupport && staInfo->mvmsta->agg_tids &&
      staInfo->amsduInAmpdu) {
    forceLmacUpdate =
        _rsMngCollectAmsduTlcData(staInfo, stats->baTxed, stats->baAcked, stats->trafficLoad);
  }

  if (_rsMngAreAggsSupported(staInfo->config.bestSuppMode)) {
    // find all tids such that data was sent on them but aggregations weren't opened for them
    // yet
    if (tid < IWL_MAX_TID_COUNT && !is_ndp) {
      iwl_start_agg(mvm, sta, tid);
    }
  }

  DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
             "tlcStatUpdateHandler: Received statistics for sta %d, txed[0]: %d, acked[0]: %d, "
             "tids: 0x%x",
             i, stats->txed[0], stats->acked[0], stats->tids);

  if (!staInfo->ignoreNextTlcNotif && !staInfo->fixedRate) {
    BOOLEAN doRateScale = _rsMngUpdateGlobalStats(staInfo, stats);
    doRateScale &= _rsMngCollectTlcData(staInfo, stats->txed[0], stats->acked[0]);

    if (doRateScale) {
      _rsMngRateScalePerform(staInfo, forceLmacUpdate);
    } else {
      DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
                 "tlcStatUpdateHandler: not performing rate scaling. #frames since last rate "
                 "scale perform: %d",
                 staInfo->framesSinceLastRun);
    }
  } else {
    DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
               "tlcStatUpdateHandler: ignoring notification. fixed rate: 0x%x", staInfo->fixedRate);
    staInfo->ignoreNextTlcNotif = FALSE;
  }
}

#endif // NEEDS_PORTING

/*********************************************************************/
/*      External Functions + funcs used by them                      */
/*********************************************************************/

static RS_MNG_COLUMN_DESC_E _rsMngGetColByRate(RS_MNG_RATE_S *rsMngRate)
{
	RS_MNG_GI_E gi = _rsMngRateGetGi(rsMngRate);
	U08 ant = _rsMngRateGetAnt(rsMngRate);
	RS_MNG_COLUMN_DESC_E colId = RS_MNG_COL_INVALID;

	switch (_rsMngRateGetModulation(rsMngRate)) {
	case RS_MNG_MODUL_LEGACY:
		switch (ant) {
		case TLC_MNG_CHAIN_A_MSK:
			colId = RS_MNG_COL_NON_HT_ANT_A;
			break;
		case TLC_MNG_CHAIN_B_MSK:
			colId = RS_MNG_COL_NON_HT_ANT_B;
			break;
		default:
			DBG_PRINTF(UT, TLC_OFFLOAD_DBG, ERROR,
				   "invalid antenna Msk 0x%x for legacy rate",
				   _rsMngRateGetAnt(rsMngRate));
			break;
		}
		break;
	case RS_MNG_MODUL_SISO:
		switch (gi) {
		case HT_VHT_NGI:
			colId = RS_MNG_COL_SISO_ANT_A;
			break;
		case HT_VHT_SGI:
			colId = RS_MNG_COL_SISO_ANT_A_SGI;
			break;
		case HE_3_2_GI:
			colId = RS_MNG_COL_HE_3_2_SISO_ANT_A;
			break;
		case HE_1_6_GI:
			colId = RS_MNG_COL_HE_1_6_SISO_ANT_A;
			break;
		case HE_0_8_GI:
			colId = RS_MNG_COL_HE_0_8_SISO_ANT_A;
			break;
		}

		if (ant == TLC_MNG_CHAIN_B_MSK) {
			// This works thanks to the compilation asserts near _rsMngSetVisitedColumn
			colId ^= 1;
		}
		break;
	case RS_MNG_MODUL_MIMO2:
		switch (gi) {
		case HT_VHT_NGI:
			colId = RS_MNG_COL_MIMO2;
			break;
		case HT_VHT_SGI:
			colId = RS_MNG_COL_MIMO2_SGI;
			break;
		case HE_3_2_GI:
			colId = RS_MNG_COL_HE_3_2_MIMO;
			break;
		case HE_1_6_GI:
			colId = RS_MNG_COL_HE_1_6_MIMO;
			break;
		case HE_0_8_GI:
			colId = RS_MNG_COL_HE_0_8_MIMO;
			break;
		}
		break;
	default:
		DBG_PRINTF(UT, TLC_OFFLOAD_DBG, ERROR, "invalid modulation %d",
			   _rsMngRateGetModulation(rsMngRate));
	}

	return colId;
}

static void _rsMngSetInitRate(RS_MNG_STA_INFO_S *staInfo,
			      RS_MNG_RATE_S *rsMngRate)
{
	U16 nonHtRates = staInfo->config.nonHt;
	TLC_MNG_MODE_E mode = staInfo->config.bestSuppMode;

	_rsMngRateSetMode(rsMngRate, mode);
	if (mode == TLC_MNG_MODE_LEGACY) {
		_rsMngRateSetModulation(rsMngRate, RS_MNG_MODUL_LEGACY);
		_rsMngRateSetLdpc(rsMngRate, false);
	} else {
		_rsMngRateSetModulation(rsMngRate, RS_MNG_MODUL_SISO);
		_rsMngRateSetLdpc(rsMngRate, _rsMngIsLdpcAllowed(staInfo));
	}

	_rsMngRateSetBw(rsMngRate, CHANNEL_WIDTH20);

	if (mode == TLC_MNG_MODE_HE) {
		_rsMngRateSetGi(rsMngRate, HE_3_2_GI);
	} else {
		_rsMngRateSetGi(rsMngRate, HT_VHT_NGI);
	}
	_rsMngRateSetBfer(rsMngRate, false);

	if (mode > TLC_MNG_MODE_LEGACY &&
	    _rsMngIsStbcAllowed(staInfo, rsMngRate)) {
		_rsMngRateSetStbc(rsMngRate, true);
		_rsMngRateSetAnt(rsMngRate, rsMngGetDualAntMsk());
	} else {
		_rsMngRateSetStbc(rsMngRate, false);
		_rsMngRateSetAnt(
			rsMngRate,
			rsMngGetSingleAntMsk(staInfo->config.chainsEnabled));
	}

	if (mode > TLC_MNG_MODE_LEGACY) {
		U08 idx = (U08)(_rsMngGetSuppRatesSameMode(staInfo, rsMngRate) &
						BIT(RS_MCS_3) ?
					RS_MCS_3 :
					RS_MCS_0);
		_rsMngRateSetIdx(rsMngRate, idx);
	} else {
		if (LSB2ORD(nonHtRates) > RS_NON_HT_RATE_CCK_LAST) {
			// 11a
			_rsMngRateSetIdx(rsMngRate, RS_NON_HT_RATE_OFDM_24M);
		} else if (MSB2ORD(nonHtRates) > RS_NON_HT_RATE_CCK_LAST) {
			// 11g
			_rsMngRateSetIdx(rsMngRate, RS_NON_HT_RATE_OFDM_18M);
		} else {
			// 11b
			_rsMngRateSetIdx(rsMngRate, RS_NON_HT_RATE_CCK_5_5M);
		}

		if (!(BIT(_rsMngRateGetIdx(rsMngRate)) & nonHtRates)) {
			// we don't support the mean rate as defined in the SAS,
			// so just start from the lowest supported rate.
			_rsMngRateSetIdx(rsMngRate, (U08)LSB2ORD(nonHtRates));
		}
	}
}

static void rsMngInitTlcTbl(RS_MNG_STA_INFO_S *staInfo,
			    RS_MNG_TBL_INFO_S *tblInfo)
{
	_rsMngSetInitRate(staInfo, &tblInfo->rsMngRate);

	tblInfo->column = _rsMngGetColByRate(&(tblInfo->rsMngRate));
	staInfo->stableColumn = tblInfo->column;

	_rsMngUpdateRateTbl(staInfo);
}

static void rsMngResetStaInfo(struct iwl_mvm *mvm, struct iwl_mvm_sta *mvmsta,
			      RS_MNG_STA_INFO_S *staInfo, bool reconfigure)
{
	U32 fixedRate = staInfo->fixedRate;
	U16 aggDurationLimit = staInfo->aggDurationLimit;
	U08 amsduInAmpdu = staInfo->amsduInAmpdu;
	bool longAggEnabled = staInfo->longAggEnabled;

	_memclr(staInfo, sizeof(*staInfo));

	zx_time_t cur_time = zx_clock_get_monotonic();
	staInfo->mvm = mvm;
	// staInfo->sta = sta;
	staInfo->mvmsta = mvmsta;
	staInfo->lastSearchCycleEndTimestamp = cur_time;
	staInfo->lastRateUpscaleTimestamp = cur_time;
	staInfo->lastEnableTimestamp = cur_time;

	if (reconfigure) {
		staInfo->fixedRate = fixedRate;
		staInfo->amsduInAmpdu = amsduInAmpdu;
		staInfo->longAggEnabled = longAggEnabled;
		staInfo->aggDurationLimit = aggDurationLimit;
	} else {
		staInfo->aggDurationLimit = RS_MNG_AGG_DURATION_LIMIT;
	}

	// aggState IDLE is 0. so memclear sets it
	staInfo->rsMngState = RS_MNG_STATE_STAY_IN_COLUMN;

	_rsMngRateInvalidate(&staInfo->rateTblInfo.rsMngRate);
	_rsMngClearTblWindows(staInfo);
	_rsMngClearWinArr(staInfo->tpcTable.windows, RS_MNG_TPC_NUM_STEPS);

	staInfo->tpcTable.currStep = RS_MNG_TPC_DISABLED;
	staInfo->staBuffSize = RS_MNG_AGG_FRAME_CNT_LIMIT;
	staInfo->amsduEnabledSize = RS_MNG_AMSDU_INVALID;
	staInfo->amsduSupport = false;
	staInfo->failSafeCounter = 0;
	staInfo->amsduBlacklist = 0;
}

static bool _tlcMngConfigValid(TLC_MNG_CONFIG_PARAMS_CMD_API_S *params)
{
	U08 chainsEnabled = params->chainsEnabled;

	// no valid chain is selected
	if (WARN_ON(!(chainsEnabled && (chainsEnabled & rsMngGetDualAntMsk()) ==
					       chainsEnabled))) {
		return false;
	}

	// at least one non-HT rate MUST be valid
	if (WARN_ON(!params->nonHt)) {
		return false;
	}

	if (params->bestSuppMode == TLC_MNG_MODE_LEGACY) {
		// check that the no non-HT rates are set
		if (WARN_ON(params->mcs[TLC_MNG_NSS_1][0] ||
			    params->mcs[TLC_MNG_NSS_1][1] ||
			    params->mcs[TLC_MNG_NSS_2][0] ||
			    params->mcs[TLC_MNG_NSS_2][1])) {
			return false;
		}

		// all config flags make sense only in HT/VHT/HE scenarios, and non-ht rates can only
		// support 20MHz bandwidth
		if (WARN_ON(!(!params->configFlags &&
			      params->maxChWidth == TLC_MNG_CH_WIDTH_20MHZ))) {
			return false;
		}
	} else { // HT/VHT/HE
		// check that there are valid rates for the best supported mode
		if (WARN_ON(!(params->mcs[TLC_MNG_NSS_1][0]))) {
			return false;
		}

		if (chainsEnabled != rsMngGetDualAntMsk()) {
			// the following flags all require 2 antennas to be used
			if (WARN_ON(params->configFlags &
				    (TLC_MNG_CONFIG_FLAGS_STBC_MSK |
				     TLC_MNG_CONFIG_FLAGS_HE_STBC_160MHZ_MSK |
				     TLC_MNG_CONFIG_FLAGS_HE_DCM_NSS_2_MSK))) {
				return false;
			}

			// only one chain => can't do mimo
			if (WARN_ON(params->mcs[TLC_MNG_NSS_2][0] ||
				    params->mcs[TLC_MNG_NSS_2][1])) {
				return false;
			}
		}

		if (params->bestSuppMode == TLC_MNG_MODE_HT) {
			if (WARN_ON(!((params->bestSuppMode == TLC_MNG_MODE_HT &&
				       params->maxChWidth <=
					       TLC_MNG_CH_WIDTH_40MHZ) ||
				      params->maxChWidth <
					      TLC_MNG_CH_WIDTH_MAX))) {
				return false;
			}
		}

		if (params->bestSuppMode < TLC_MNG_MODE_HE) {
			// the following flags are for HE only
			if (WARN_ON(params->configFlags &
				    (TLC_MNG_CONFIG_FLAGS_HE_STBC_160MHZ_MSK |
				     TLC_MNG_CONFIG_FLAGS_HE_DCM_NSS_1_MSK |
				     TLC_MNG_CONFIG_FLAGS_HE_DCM_NSS_2_MSK |
				     TLC_MNG_CONFIG_FLAGS_HE_BLOCK_2X_LTF_MSK))) {
				return false;
			}
		} else {
			if (WARN_ON(params->sgiChWidthSupport)) {
				return false;
			}
		}
	}

	if (WARN_ON(!(params->amsduSupported <= TLC_AMSDU_SUPPORTED))) {
		return false;
	}

	return true;
}

// rs_initialize_lq
//
// Initialize a station's hardware rate table
// The uCode's station table contains a table of fallback rates
// for automatic fallback during transmission.
//
// NOTE: This sets up a default set of values.  These will be replaced later
static void _rsMngTlcInit(RS_MNG_STA_INFO_S *staInfo)
{
	RS_MNG_TBL_INFO_S *tblInfo = &staInfo->rateTblInfo;

	rsMngInitTlcTbl(staInfo, tblInfo);

	// Start in search cycle state in order allow quick convergence on the optimal rate.
	staInfo->rsMngState = RS_MNG_STATE_SEARCH_CYCLE_STARTED;
	_rsMngSetVisitedColumn(staInfo, tblInfo->column);
	_rsMngPrepareForBwChangeAttempt(staInfo,
					&staInfo->rateTblInfo.rsMngRate);
	DBG_PRINTF(UT, TLC_OFFLOAD_DBG, INFO,
		   "_rsMngTlcInit: starting at column %d", tblInfo->column);
}

/**********************************************************************/
/*                        Cmd Handlers                                */
/**********************************************************************/

void cmdHandlerTlcMngConfig(struct iwl_mvm *mvm, struct iwl_mvm_sta *mvmsta,
			    RS_MNG_STA_INFO_S *staInfo,
			    TLC_MNG_CONFIG_PARAMS_CMD_API_S *config,
			    bool reconfigure)
{
	if (!_tlcMngConfigValid(config)) {
		return;
	}

	// Check if this a reconfiguration of an existing station
	if (staInfo->enabled && reconfigure) {
		// Switching between non-HT/HT/VHT/HE requires completely de-associating before
		// reassociating with the new mode. That being said, windows driver always sends a tlc
		// config command with only non-HT mode when first adding a station, and then updates it to
		// the correct mode after association. Since the switch from non-HT to HT/VHT/HE doesn't
		// require any extra processing here (no aggregation state to possibly change etc.), this is
		// allowed even though it's weird.
		if (WARN_ON(!(config->bestSuppMode >=
			      staInfo->config.bestSuppMode))) {
			return;
		}
	}

	rsMngResetStaInfo(mvm, mvmsta, staInfo,
			  staInfo->enabled && reconfigure);
	BUILD_BUG_ON(sizeof(staInfo->config) != sizeof(*config));
	memcpy(&staInfo->config, config, sizeof(staInfo->config));

	// TODO(fxbug.dev/51295): Supports A-MSDU
	// rsMngInitAmsdu(staInfo);

	// send LQ command with basic rates table
	_rsMngTlcInit(staInfo);

	staInfo->enabled = true;
}
