[][MAC80211][app][Add HQADLL support in eagle testmode]

[Description]
Add HQADLL support in eagle testmode

[Release-log]
N/A

Change-Id: I5589826c264dbabcf7ca25581ec217d3a1fcea54
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/7488681
diff --git a/feed/atenl/files/iwpriv.sh b/feed/atenl/files/iwpriv.sh
index 7046d71..183b079 100755
--- a/feed/atenl/files/iwpriv.sh
+++ b/feed/atenl/files/iwpriv.sh
@@ -803,6 +803,9 @@
             new_cmd="stop_sounding"
             new_param="0"
             ;;
+        "TxBfTxCmd")
+            new_cmd="txcmd"
+            ;;
         "ATEConTxETxBfGdProc")
             local tx_rate_mode=$(convert_tx_mode ${new_param:0:2})
             local tx_rate_idx=${new_param:3:2}
@@ -830,10 +833,10 @@
             local tx_rate_nss=${new_param:9:2}
             local tx_stream=${new_param:12:2}
             local tx_power=${new_param:15:2}
-            local channel=${new_param:18:3}
+            local channel=$(echo ${new_param:18:3} | sed 's/^0//')
             local channel2=${new_param:22:3}
             local band=${new_param:26:1}
-            local tx_length=${new_param:28:5}
+            local tx_length=$(echo ${new_param:28:5} | sed 's/^0//')
 
             new_cmd="ebf_init"
             do_ate_work "ATESTART"
@@ -1249,7 +1252,7 @@
             ;;
         "ATETxBfInit"|"ATETxBfGdInit"|"ATEIBFPhaseComp"|"ATEEBfProfileConfig"|"ATEIBfProfileConfig"| \
         "TxBfTxApply"|"ATETxPacketWithBf"|"TxBfProfileData20MAllWrite"|"ATEIBfInstCal"| \
-        "ATEIBfGdCal"|"ATEIBFPhaseE2pUpdate"|"TriggerSounding"|"StopSounding"| \
+        "ATEIBfGdCal"|"ATEIBFPhaseE2pUpdate"|"TriggerSounding"|"StopSounding"|"TxBfTxCmd"| \
         "StaRecBfRead"|"TxBfProfileTagInValid"|"TxBfProfileTagWrite"|"TxBfProfileTagRead"| \
         "ATEIBFPhaseVerify"|"ATEConTxETxBfGdProc"|"ATEConTxETxBfInitProc")
             convert_ibf ${cmd} ${param}
diff --git a/feed/atenl/src/atenl.h b/feed/atenl/src/atenl.h
index 9f8b796..1286c55 100644
--- a/feed/atenl/src/atenl.h
+++ b/feed/atenl/src/atenl.h
@@ -233,6 +233,9 @@
 	ATENL_PHY_TYPE_HE_EXT_SU,
 	ATENL_PHY_TYPE_HE_TB,
 	ATENL_PHY_TYPE_HE_MU,
+	ATENL_PHY_TYPE_EHT_SU = 13,
+	ATENL_PHY_TYPE_EHT_TRIG,
+	ATENL_PHY_TYPE_EHT_MU,
 };
 
 enum atenl_e2p_mode {
@@ -306,8 +309,9 @@
 	TEST_CBW_5MHZ,
 	TEST_CBW_160MHZ,
 	TEST_CBW_8080MHZ,
+	TEST_CBW_320MHZ = 12,
 
-	TEST_CBW_MAX = TEST_CBW_8080MHZ - 1,
+	TEST_CBW_MAX = TEST_CBW_320MHZ,
 };
 
 struct atenl_rx_info_hdr {
diff --git a/feed/atenl/src/eeprom.c b/feed/atenl/src/eeprom.c
index f63bc9e..0182187 100644
--- a/feed/atenl/src/eeprom.c
+++ b/feed/atenl/src/eeprom.c
@@ -329,6 +329,9 @@
 	if (get_band_val(an, 1, valid))
 		set_band_val(an, 1, phy_idx, phy_idx + 1);
 
+	if (get_band_val(an, 2, valid))
+		set_band_val(an, 2, phy_idx, phy_idx + 2);
+
 	return 0;
 }
 
diff --git a/feed/atenl/src/hqa.c b/feed/atenl/src/hqa.c
index eabfce5..2f25043 100644
--- a/feed/atenl/src/hqa.c
+++ b/feed/atenl/src/hqa.c
@@ -16,6 +16,8 @@
 	/* center ch */
 	u16 ch_80;
 	u16 ch_160;
+	u16 ch_320_1;
+	u16 ch_320_2;
 	/* only use for channels that don't have 80 but has 40 */
 	u16 ch_40;
 };
@@ -72,65 +74,65 @@
 
 static const struct atenl_channel atenl_channels_6ghz[] = {
 	/* UNII-5 */
-	CHAN(1, 5955, 7, 15),
-	CHAN(5, 5975, 7, 15),
-	CHAN(9, 5995, 7, 15),
-	CHAN(13, 6015, 7, 15),
-	CHAN(17, 6035, 23, 15),
-	CHAN(21, 6055, 23, 15),
-	CHAN(25, 6075, 23, 15),
-	CHAN(29, 6095, 23, 15),
-	CHAN(33, 6115, 39, 47),
-	CHAN(37, 6135, 39, 47),
-	CHAN(41, 6155, 39, 47),
-	CHAN(45, 6175, 39, 47),
-	CHAN(49, 6195, 55, 47),
-	CHAN(53, 6215, 55, 47),
-	CHAN(57, 6235, 55, 47),
-	CHAN(61, 6255, 55, 47),
-	CHAN(65, 6275, 71, 79),
-	CHAN(69, 6295, 71, 79),
-	CHAN(73, 6315, 71, 79),
-	CHAN(77, 6335, 71, 79),
-	CHAN(81, 6355, 87, 79),
-	CHAN(85, 6375, 87, 79),
-	CHAN(89, 6395, 87, 79),
-	CHAN(93, 6415, 87, 79),
+	CHAN(1, 5955, 7, 15, .ch_320_1 = 31),
+	CHAN(5, 5975, 7, 15, .ch_320_1 = 31),
+	CHAN(9, 5995, 7, 15, .ch_320_1 = 31),
+	CHAN(13, 6015, 7, 15, .ch_320_1 = 31),
+	CHAN(17, 6035, 23, 15, .ch_320_1 = 31),
+	CHAN(21, 6055, 23, 15, .ch_320_1 = 31),
+	CHAN(25, 6075, 23, 15, .ch_320_1 = 31),
+	CHAN(29, 6095, 23, 15, .ch_320_1 = 31),
+	CHAN(33, 6115, 39, 47, .ch_320_1 = 31, .ch_320_2 = 63),
+	CHAN(37, 6135, 39, 47, .ch_320_1 = 31, .ch_320_2 = 63),
+	CHAN(41, 6155, 39, 47, .ch_320_1 = 31, .ch_320_2 = 63),
+	CHAN(45, 6175, 39, 47, .ch_320_1 = 31, .ch_320_2 = 63),
+	CHAN(49, 6195, 55, 47, .ch_320_1 = 31, .ch_320_2 = 63),
+	CHAN(53, 6215, 55, 47, .ch_320_1 = 31, .ch_320_2 = 63),
+	CHAN(57, 6235, 55, 47, .ch_320_1 = 31, .ch_320_2 = 63),
+	CHAN(61, 6255, 55, 47, .ch_320_1 = 31, .ch_320_2 = 63),
+	CHAN(65, 6275, 71, 79, .ch_320_1 = 95, .ch_320_2 = 63),
+	CHAN(69, 6295, 71, 79, .ch_320_1 = 95, .ch_320_2 = 63),
+	CHAN(73, 6315, 71, 79, .ch_320_1 = 95, .ch_320_2 = 63),
+	CHAN(77, 6335, 71, 79, .ch_320_1 = 95, .ch_320_2 = 63),
+	CHAN(81, 6355, 87, 79, .ch_320_1 = 95, .ch_320_2 = 63),
+	CHAN(85, 6375, 87, 79, .ch_320_1 = 95, .ch_320_2 = 63),
+	CHAN(89, 6395, 87, 79, .ch_320_1 = 95, .ch_320_2 = 63),
+	CHAN(93, 6415, 87, 79, .ch_320_1 = 95, .ch_320_2 = 63),
 	/* UNII-6 */
-	CHAN(97, 6435, 103, 111),
-	CHAN(101, 6455, 103, 111),
-	CHAN(105, 6475, 103, 111),
-	CHAN(109, 6495, 103, 111),
-	CHAN(113, 6515, 119, 111),
-	CHAN(117, 6535, 119, 111),
+	CHAN(97, 6435, 103, 111, .ch_320_1 = 95, .ch_320_2 = 127),
+	CHAN(101, 6455, 103, 111, .ch_320_1 = 95, .ch_320_2 = 127),
+	CHAN(105, 6475, 103, 111, .ch_320_1 = 95, .ch_320_2 = 127),
+	CHAN(109, 6495, 103, 111, .ch_320_1 = 95, .ch_320_2 = 127),
+	CHAN(113, 6515, 119, 111, .ch_320_1 = 95, .ch_320_2 = 127),
+	CHAN(117, 6535, 119, 111, .ch_320_1 = 95, .ch_320_2 = 127),
 	/* UNII-7 */
-	CHAN(121, 6555, 119, 111),
-	CHAN(125, 6575, 119, 111),
-	CHAN(129, 6595, 135, 143),
-	CHAN(133, 6615, 135, 143),
-	CHAN(137, 6635, 135, 143),
-	CHAN(141, 6655, 135, 143),
-	CHAN(145, 6675, 151, 143),
-	CHAN(149, 6695, 151, 143),
-	CHAN(153, 6715, 151, 143),
-	CHAN(157, 6735, 151, 143),
-	CHAN(161, 6755, 167, 175),
-	CHAN(165, 6775, 167, 175),
-	CHAN(169, 6795, 167, 175),
-	CHAN(173, 6815, 167, 175),
-	CHAN(177, 6835, 183, 175),
-	CHAN(181, 6855, 183, 175),
-	CHAN(185, 6875, 183, 175),
+	CHAN(121, 6555, 119, 111, .ch_320_1 = 95, .ch_320_2 = 127),
+	CHAN(125, 6575, 119, 111, .ch_320_1 = 95, .ch_320_2 = 127),
+	CHAN(129, 6595, 135, 143, .ch_320_1 = 159, .ch_320_2 = 127),
+	CHAN(133, 6615, 135, 143, .ch_320_1 = 159, .ch_320_2 = 127),
+	CHAN(137, 6635, 135, 143, .ch_320_1 = 159, .ch_320_2 = 127),
+	CHAN(141, 6655, 135, 143, .ch_320_1 = 159, .ch_320_2 = 127),
+	CHAN(145, 6675, 151, 143, .ch_320_1 = 159, .ch_320_2 = 127),
+	CHAN(149, 6695, 151, 143, .ch_320_1 = 159, .ch_320_2 = 127),
+	CHAN(153, 6715, 151, 143, .ch_320_1 = 159, .ch_320_2 = 127),
+	CHAN(157, 6735, 151, 143, .ch_320_1 = 159, .ch_320_2 = 127),
+	CHAN(161, 6755, 167, 175, .ch_320_1 = 159, .ch_320_2 = 191),
+	CHAN(165, 6775, 167, 175, .ch_320_1 = 159, .ch_320_2 = 191),
+	CHAN(169, 6795, 167, 175, .ch_320_1 = 159, .ch_320_2 = 191),
+	CHAN(173, 6815, 167, 175, .ch_320_1 = 159, .ch_320_2 = 191),
+	CHAN(177, 6835, 183, 175, .ch_320_1 = 159, .ch_320_2 = 191),
+	CHAN(181, 6855, 183, 175, .ch_320_1 = 159, .ch_320_2 = 191),
+	CHAN(185, 6875, 183, 175, .ch_320_1 = 159, .ch_320_2 = 191),
 	/* UNII-8 */
-	CHAN(189, 6895, 183, 175),
-	CHAN(193, 6915, 199, 207),
-	CHAN(197, 6935, 199, 207),
-	CHAN(201, 6955, 199, 207),
-	CHAN(205, 6975, 199, 207),
-	CHAN(209, 6995, 215, 207),
-	CHAN(213, 7015, 215, 207),
-	CHAN(217, 7035, 215, 207),
-	CHAN(221, 7055, 215, 207),
+	CHAN(189, 6895, 183, 175, .ch_320_1 = 159, .ch_320_2 = 191),
+	CHAN(193, 6915, 199, 207, .ch_320_2 = 191),
+	CHAN(197, 6935, 199, 207, .ch_320_2 = 191),
+	CHAN(201, 6955, 199, 207, .ch_320_2 = 191),
+	CHAN(205, 6975, 199, 207, .ch_320_2 = 191),
+	CHAN(209, 6995, 215, 207, .ch_320_2 = 191),
+	CHAN(213, 7015, 215, 207, .ch_320_2 = 191),
+	CHAN(217, 7035, 215, 207, .ch_320_2 = 191),
+	CHAN(221, 7055, 215, 207, .ch_320_2 = 191),
 	CHAN(225, 7075, 0, 0, .ch_40 = 227),
 	CHAN(229, 7095, 0, 0, .ch_40 = 227),
 	CHAN(233, 7115, 0, 0),
@@ -158,7 +160,6 @@
 			/* set a special-defined country */
 			sprintf(cmd, "iw reg set VV");
 			system(cmd);
-			atenl_nl_set_state(an, i, MT76_TM_STATE_IDLE);
 		} else {
 			atenl_nl_set_state(an, i, MT76_TM_STATE_OFF);
 			sprintf(cmd, "iw reg set 00");
@@ -170,6 +171,9 @@
 		}
 	}
 
+	for (i = 0; i < MAX_BAND_NUM; i++)
+		atenl_nl_set_state(an, i, MT76_TM_STATE_IDLE);
+
 	return 0;
 }
 
@@ -566,6 +570,9 @@
 static void atenl_get_bw_string(u8 bw, char *buf)
 {
 	switch (bw) {
+	case TEST_CBW_320MHZ:
+		sprintf(buf, "320");
+		break;
 	case TEST_CBW_160MHZ:
 		sprintf(buf, "160");
 		break;
@@ -627,7 +634,8 @@
 	if (band >= MAX_BAND_NUM)
 		return -EINVAL;
 
-	if ((bw == TEST_CBW_160MHZ && pri_sel > 7) ||
+	if ((bw == TEST_CBW_320MHZ && pri_sel > 15) ||
+	    (bw == TEST_CBW_160MHZ && pri_sel > 7) ||
 	    (bw == TEST_CBW_80MHZ && pri_sel > 3) ||
 	    (bw == TEST_CBW_40MHZ && pri_sel > 1)) {
 		atenl_err("%s: ctrl channel select error\n", __func__);
@@ -664,7 +672,17 @@
 			ch_num = ARRAY_SIZE(atenl_channels_5ghz);
 		}
 
-		if (bw == TEST_CBW_160MHZ) {
+		if (bw == TEST_CBW_320MHZ) {
+			for (i = 0; i < ch_num; i++) {
+				if (ch1 == ch_list[i].ch_320_1) {
+					chan = &ch_list[i];
+					break;
+				} else if (ch1 == ch_list[i].ch_320_2) {
+					chan = &ch_list[i];
+					break;
+				}
+			}
+		} else if (bw == TEST_CBW_160MHZ) {
 			for (i = 0; i < ch_num; i++) {
 				if (ch1 == ch_list[i].ch_160) {
 					chan = &ch_list[i];
diff --git a/feed/atenl/src/nl.c b/feed/atenl/src/nl.c
index a8e2ea9..def663f 100644
--- a/feed/atenl/src/nl.c
+++ b/feed/atenl/src/nl.c
@@ -101,6 +101,9 @@
 		[ATENL_PHY_TYPE_HE_EXT_SU] = MT76_TM_TX_MODE_HE_EXT_SU,
 		[ATENL_PHY_TYPE_HE_TB] = MT76_TM_TX_MODE_HE_TB,
 		[ATENL_PHY_TYPE_HE_MU] = MT76_TM_TX_MODE_HE_MU,
+		[ATENL_PHY_TYPE_EHT_SU] = MT76_TM_TX_MODE_EHT_SU,
+		[ATENL_PHY_TYPE_EHT_TRIG] = MT76_TM_TX_MODE_EHT_TRIG,
+		[ATENL_PHY_TYPE_EHT_MU] = MT76_TM_TX_MODE_EHT_MU,
 	};
 
 	if (phy_type >= ARRAY_SIZE(phy_type_to_attr))
@@ -287,7 +290,7 @@
 		if (get_band_val(an, band, use_tx_time))
 			nla_put_u32(msg, MT76_TM_ATTR_TX_TIME,
 				    get_band_val(an, band, tx_time));
-		else
+		else if (get_band_val(an, band, tx_mpdu_len))
 			nla_put_u32(msg, MT76_TM_ATTR_TX_LENGTH,
 				    get_band_val(an, band, tx_mpdu_len));
 
@@ -304,7 +307,7 @@
 			atenl_set_attr_antenna(an, msg, tx_antenna);
 		}
 
-		if (tx_rate_mode >= MT76_TM_TX_MODE_HE_SU) {
+		if (!is_mt7996(an) && tx_rate_mode >= MT76_TM_TX_MODE_HE_SU) {
 			u8 ofs = sgi;
 			size_t i;
 
@@ -364,7 +367,14 @@
 		v = (u32 *)(hdr->data + 18);
 
 		atenl_set_attr_antenna(an, msg, ntohl(v[0]));
-		nla_put_u8(msg, MT76_TM_ATTR_AID, ntohl(v[1]));
+		if (is_mt7996(an)) {
+			nla_put_u8(msg, MT76_TM_ATTR_TX_RATE_MODE,
+				   phy_type_to_attr(ntohl(v[2])));
+			nla_put_u8(msg, MT76_TM_ATTR_TX_RATE_SGI, ntohl(v[3]));
+			nla_put_u8(msg, MT76_TM_ATTR_AID, ntohl(v[4]));
+		} else {
+			nla_put_u8(msg, MT76_TM_ATTR_AID, ntohl(v[1]));
+		}
 		atenl_set_attr_state(an, msg, band, MT76_TM_STATE_RX_FRAMES);
 
 		anb->reset_rx_cnt = false;
@@ -901,7 +911,10 @@
 	case TXBF_ACT_TX_PKT:
 		nla_put_u8(msg, MT76_TM_ATTR_AID, val[1]);
 		nla_put_u8(msg, MT76_TM_ATTR_TXBF_ACT, MT76_TM_TXBF_ACT_TX_PREP);
-		nla_put_u32(msg, MT76_TM_ATTR_TX_COUNT, 10000000);
+		if (!val[2])
+			nla_put_u32(msg, MT76_TM_ATTR_TX_COUNT, 0xFFFFFFFF);
+		else
+			nla_put_u32(msg, MT76_TM_ATTR_TX_COUNT, val[2]);
 		nla_put_u32(msg, MT76_TM_ATTR_TX_LENGTH, 1024);
 		a = nla_nest_start(msg, MT76_TM_ATTR_TXBF_PARAM);
 		if (!a)
diff --git a/feed/atenl/src/nl.h b/feed/atenl/src/nl.h
index b76abfe..bfd8fb8 100644
--- a/feed/atenl/src/nl.h
+++ b/feed/atenl/src/nl.h
@@ -241,6 +241,9 @@
 	MT76_TM_TX_MODE_HE_EXT_SU,
 	MT76_TM_TX_MODE_HE_TB,
 	MT76_TM_TX_MODE_HE_MU,
+	MT76_TM_TX_MODE_EHT_SU,
+	MT76_TM_TX_MODE_EHT_TRIG,
+	MT76_TM_TX_MODE_EHT_MU,
 
 	/* keep last */
 	NUM_MT76_TM_TX_MODES,