xref: /linux/drivers/net/wireless/ath/ath12k/wifi7/hal_qcc2072.c (revision 37a93dd5c49b5fda807fd204edf2547c3493319c)
1089e0e74SBaochen Qiang // SPDX-License-Identifier: BSD-3-Clause-Clear
2089e0e74SBaochen Qiang /*
3089e0e74SBaochen Qiang  * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
4089e0e74SBaochen Qiang  */
5089e0e74SBaochen Qiang 
6089e0e74SBaochen Qiang #include "hal_qcc2072.h"
728badc78SBaochen Qiang #include "hal_wcn7850.h"
8089e0e74SBaochen Qiang 
9089e0e74SBaochen Qiang const struct ath12k_hw_regs qcc2072_regs = {
10089e0e74SBaochen Qiang 	/* SW2TCL(x) R0 ring configuration address */
11089e0e74SBaochen Qiang 	.tcl1_ring_id = 0x00000920,
12089e0e74SBaochen Qiang 	.tcl1_ring_misc = 0x00000928,
13089e0e74SBaochen Qiang 	.tcl1_ring_tp_addr_lsb = 0x00000934,
14089e0e74SBaochen Qiang 	.tcl1_ring_tp_addr_msb = 0x00000938,
15089e0e74SBaochen Qiang 	.tcl1_ring_consumer_int_setup_ix0 = 0x00000948,
16089e0e74SBaochen Qiang 	.tcl1_ring_consumer_int_setup_ix1 = 0x0000094c,
17089e0e74SBaochen Qiang 	.tcl1_ring_msi1_base_lsb = 0x00000960,
18089e0e74SBaochen Qiang 	.tcl1_ring_msi1_base_msb = 0x00000964,
19089e0e74SBaochen Qiang 	.tcl1_ring_msi1_data = 0x00000968,
20089e0e74SBaochen Qiang 	.tcl_ring_base_lsb = 0x00000b70,
21089e0e74SBaochen Qiang 	.tcl1_ring_base_lsb = 0x00000918,
22089e0e74SBaochen Qiang 	.tcl1_ring_base_msb = 0x0000091c,
23089e0e74SBaochen Qiang 	.tcl2_ring_base_lsb = 0x00000990,
24089e0e74SBaochen Qiang 
25089e0e74SBaochen Qiang 	/* TCL STATUS ring address */
26089e0e74SBaochen Qiang 	.tcl_status_ring_base_lsb = 0x00000d50,
27089e0e74SBaochen Qiang 
28089e0e74SBaochen Qiang 	.wbm_idle_ring_base_lsb = 0x00000d3c,
29089e0e74SBaochen Qiang 	.wbm_idle_ring_misc_addr = 0x00000d4c,
30089e0e74SBaochen Qiang 	.wbm_r0_idle_list_cntl_addr = 0x00000240,
31089e0e74SBaochen Qiang 	.wbm_r0_idle_list_size_addr = 0x00000244,
32089e0e74SBaochen Qiang 	.wbm_scattered_ring_base_lsb = 0x00000250,
33089e0e74SBaochen Qiang 	.wbm_scattered_ring_base_msb = 0x00000254,
34089e0e74SBaochen Qiang 	.wbm_scattered_desc_head_info_ix0 = 0x00000260,
35089e0e74SBaochen Qiang 	.wbm_scattered_desc_head_info_ix1 = 0x00000264,
36089e0e74SBaochen Qiang 	.wbm_scattered_desc_tail_info_ix0 = 0x00000270,
37089e0e74SBaochen Qiang 	.wbm_scattered_desc_tail_info_ix1 = 0x00000274,
38089e0e74SBaochen Qiang 	.wbm_scattered_desc_ptr_hp_addr = 0x00000027c,
39089e0e74SBaochen Qiang 
40089e0e74SBaochen Qiang 	.wbm_sw_release_ring_base_lsb = 0x0000037c,
41089e0e74SBaochen Qiang 	.wbm_sw1_release_ring_base_lsb = ATH12K_HW_REG_UNDEFINED,
42089e0e74SBaochen Qiang 	.wbm0_release_ring_base_lsb = 0x00000e08,
43089e0e74SBaochen Qiang 	.wbm1_release_ring_base_lsb = 0x00000e80,
44089e0e74SBaochen Qiang 
45089e0e74SBaochen Qiang 	/* PCIe base address */
46089e0e74SBaochen Qiang 	.pcie_qserdes_sysclk_en_sel = 0x01e0c0ac,
47089e0e74SBaochen Qiang 	.pcie_pcs_osc_dtct_config_base = 0x01e0cc58,
48089e0e74SBaochen Qiang 
49089e0e74SBaochen Qiang 	/* PPE release ring address */
50089e0e74SBaochen Qiang 	.ppe_rel_ring_base = 0x0000046c,
51089e0e74SBaochen Qiang 
52089e0e74SBaochen Qiang 	/* REO DEST ring address */
53089e0e74SBaochen Qiang 	.reo2_ring_base = 0x00000578,
54089e0e74SBaochen Qiang 	.reo1_misc_ctrl_addr = 0x00000ba0,
55089e0e74SBaochen Qiang 	.reo1_sw_cookie_cfg0 = 0x0000006c,
56089e0e74SBaochen Qiang 	.reo1_sw_cookie_cfg1 = 0x00000070,
57089e0e74SBaochen Qiang 	.reo1_qdesc_lut_base0 = ATH12K_HW_REG_UNDEFINED,
58089e0e74SBaochen Qiang 	.reo1_qdesc_lut_base1 = ATH12K_HW_REG_UNDEFINED,
59089e0e74SBaochen Qiang 
60089e0e74SBaochen Qiang 	.reo1_ring_base_lsb = 0x00000500,
61089e0e74SBaochen Qiang 	.reo1_ring_base_msb = 0x00000504,
62089e0e74SBaochen Qiang 	.reo1_ring_id = 0x00000508,
63089e0e74SBaochen Qiang 	.reo1_ring_misc = 0x00000510,
64089e0e74SBaochen Qiang 	.reo1_ring_hp_addr_lsb = 0x00000514,
65089e0e74SBaochen Qiang 	.reo1_ring_hp_addr_msb = 0x00000518,
66089e0e74SBaochen Qiang 	.reo1_ring_producer_int_setup = 0x00000524,
67089e0e74SBaochen Qiang 	.reo1_ring_msi1_base_lsb = 0x00000548,
68089e0e74SBaochen Qiang 	.reo1_ring_msi1_base_msb = 0x0000054c,
69089e0e74SBaochen Qiang 	.reo1_ring_msi1_data = 0x00000550,
70089e0e74SBaochen Qiang 	.reo1_aging_thres_ix0 = 0x00000b2c,
71089e0e74SBaochen Qiang 	.reo1_aging_thres_ix1 = 0x00000b30,
72089e0e74SBaochen Qiang 	.reo1_aging_thres_ix2 = 0x00000b34,
73089e0e74SBaochen Qiang 	.reo1_aging_thres_ix3 = 0x00000b38,
74089e0e74SBaochen Qiang 
75089e0e74SBaochen Qiang 	/* REO Exception ring address */
76089e0e74SBaochen Qiang 	.reo2_sw0_ring_base = 0x000008c0,
77089e0e74SBaochen Qiang 
78089e0e74SBaochen Qiang 	/* REO Reinject ring address */
79089e0e74SBaochen Qiang 	.sw2reo_ring_base = 0x00000320,
80089e0e74SBaochen Qiang 	.sw2reo1_ring_base = 0x00000398,
81089e0e74SBaochen Qiang 
82089e0e74SBaochen Qiang 	/* REO cmd ring address */
83089e0e74SBaochen Qiang 	.reo_cmd_ring_base = 0x000002a8,
84089e0e74SBaochen Qiang 
85089e0e74SBaochen Qiang 	/* REO status ring address */
86089e0e74SBaochen Qiang 	.reo_status_ring_base = 0x00000aa0,
87089e0e74SBaochen Qiang 
88089e0e74SBaochen Qiang 	/* CE base address */
89089e0e74SBaochen Qiang 	.umac_ce0_src_reg_base = 0x01b80000,
90089e0e74SBaochen Qiang 	.umac_ce0_dest_reg_base = 0x01b81000,
91089e0e74SBaochen Qiang 	.umac_ce1_src_reg_base = 0x01b82000,
92089e0e74SBaochen Qiang 	.umac_ce1_dest_reg_base = 0x01b83000,
93089e0e74SBaochen Qiang 
94089e0e74SBaochen Qiang 	.gcc_gcc_pcie_hot_rst = 0x1e65304,
95*853deed0SMiaoqing Pan 
96*853deed0SMiaoqing Pan 	.qrtr_node_id = 0x1e03300,
97089e0e74SBaochen Qiang };
9828badc78SBaochen Qiang 
9928badc78SBaochen Qiang static void ath12k_hal_rx_desc_set_msdu_len_qcc2072(struct hal_rx_desc *desc, u16 len)
10028badc78SBaochen Qiang {
10128badc78SBaochen Qiang 	u32 info = __le32_to_cpu(desc->u.qcc2072.msdu_end.info10);
10228badc78SBaochen Qiang 
10328badc78SBaochen Qiang 	info &= ~RX_MSDU_END_INFO10_MSDU_LENGTH;
10428badc78SBaochen Qiang 	info |= u32_encode_bits(len, RX_MSDU_END_INFO10_MSDU_LENGTH);
10528badc78SBaochen Qiang 
10628badc78SBaochen Qiang 	desc->u.qcc2072.msdu_end.info10 = __cpu_to_le32(info);
10728badc78SBaochen Qiang }
10828badc78SBaochen Qiang 
10928badc78SBaochen Qiang static void ath12k_hal_rx_desc_get_dot11_hdr_qcc2072(struct hal_rx_desc *desc,
11028badc78SBaochen Qiang 						     struct ieee80211_hdr *hdr)
11128badc78SBaochen Qiang {
11228badc78SBaochen Qiang 	hdr->frame_control = desc->u.qcc2072.mpdu_start.frame_ctrl;
11328badc78SBaochen Qiang 	hdr->duration_id = desc->u.qcc2072.mpdu_start.duration;
11428badc78SBaochen Qiang 	ether_addr_copy(hdr->addr1, desc->u.qcc2072.mpdu_start.addr1);
11528badc78SBaochen Qiang 	ether_addr_copy(hdr->addr2, desc->u.qcc2072.mpdu_start.addr2);
11628badc78SBaochen Qiang 	ether_addr_copy(hdr->addr3, desc->u.qcc2072.mpdu_start.addr3);
11728badc78SBaochen Qiang 
11828badc78SBaochen Qiang 	if (__le32_to_cpu(desc->u.qcc2072.mpdu_start.info4) &
11928badc78SBaochen Qiang 	    RX_MPDU_START_INFO4_MAC_ADDR4_VALID)
12028badc78SBaochen Qiang 		ether_addr_copy(hdr->addr4, desc->u.qcc2072.mpdu_start.addr4);
12128badc78SBaochen Qiang 
12228badc78SBaochen Qiang 	hdr->seq_ctrl = desc->u.qcc2072.mpdu_start.seq_ctrl;
12328badc78SBaochen Qiang }
12428badc78SBaochen Qiang 
12528badc78SBaochen Qiang static void ath12k_hal_rx_desc_get_crypto_hdr_qcc2072(struct hal_rx_desc *desc,
12628badc78SBaochen Qiang 						      u8 *crypto_hdr,
12728badc78SBaochen Qiang 						      enum hal_encrypt_type enctype)
12828badc78SBaochen Qiang {
12928badc78SBaochen Qiang 	unsigned int key_id;
13028badc78SBaochen Qiang 
13128badc78SBaochen Qiang 	switch (enctype) {
13228badc78SBaochen Qiang 	case HAL_ENCRYPT_TYPE_OPEN:
13328badc78SBaochen Qiang 		return;
13428badc78SBaochen Qiang 	case HAL_ENCRYPT_TYPE_TKIP_NO_MIC:
13528badc78SBaochen Qiang 	case HAL_ENCRYPT_TYPE_TKIP_MIC:
13628badc78SBaochen Qiang 		crypto_hdr[0] =
13728badc78SBaochen Qiang 			HAL_RX_MPDU_INFO_PN_GET_BYTE2(desc->u.qcc2072.mpdu_start.pn[0]);
13828badc78SBaochen Qiang 		crypto_hdr[1] = 0;
13928badc78SBaochen Qiang 		crypto_hdr[2] =
14028badc78SBaochen Qiang 			HAL_RX_MPDU_INFO_PN_GET_BYTE1(desc->u.qcc2072.mpdu_start.pn[0]);
14128badc78SBaochen Qiang 		break;
14228badc78SBaochen Qiang 	case HAL_ENCRYPT_TYPE_CCMP_128:
14328badc78SBaochen Qiang 	case HAL_ENCRYPT_TYPE_CCMP_256:
14428badc78SBaochen Qiang 	case HAL_ENCRYPT_TYPE_GCMP_128:
14528badc78SBaochen Qiang 	case HAL_ENCRYPT_TYPE_AES_GCMP_256:
14628badc78SBaochen Qiang 		crypto_hdr[0] =
14728badc78SBaochen Qiang 			HAL_RX_MPDU_INFO_PN_GET_BYTE1(desc->u.qcc2072.mpdu_start.pn[0]);
14828badc78SBaochen Qiang 		crypto_hdr[1] =
14928badc78SBaochen Qiang 			HAL_RX_MPDU_INFO_PN_GET_BYTE2(desc->u.qcc2072.mpdu_start.pn[0]);
15028badc78SBaochen Qiang 		crypto_hdr[2] = 0;
15128badc78SBaochen Qiang 		break;
15228badc78SBaochen Qiang 	case HAL_ENCRYPT_TYPE_WEP_40:
15328badc78SBaochen Qiang 	case HAL_ENCRYPT_TYPE_WEP_104:
15428badc78SBaochen Qiang 	case HAL_ENCRYPT_TYPE_WEP_128:
15528badc78SBaochen Qiang 	case HAL_ENCRYPT_TYPE_WAPI_GCM_SM4:
15628badc78SBaochen Qiang 	case HAL_ENCRYPT_TYPE_WAPI:
15728badc78SBaochen Qiang 		return;
15828badc78SBaochen Qiang 	}
15928badc78SBaochen Qiang 
16028badc78SBaochen Qiang 	key_id = u32_get_bits(__le32_to_cpu(desc->u.qcc2072.mpdu_start.info5),
16128badc78SBaochen Qiang 			      RX_MPDU_START_INFO5_KEY_ID);
16228badc78SBaochen Qiang 	crypto_hdr[3] = 0x20 | (key_id << 6);
16328badc78SBaochen Qiang 	crypto_hdr[4] = HAL_RX_MPDU_INFO_PN_GET_BYTE3(desc->u.qcc2072.mpdu_start.pn[0]);
16428badc78SBaochen Qiang 	crypto_hdr[5] = HAL_RX_MPDU_INFO_PN_GET_BYTE4(desc->u.qcc2072.mpdu_start.pn[0]);
16528badc78SBaochen Qiang 	crypto_hdr[6] = HAL_RX_MPDU_INFO_PN_GET_BYTE1(desc->u.qcc2072.mpdu_start.pn[1]);
16628badc78SBaochen Qiang 	crypto_hdr[7] = HAL_RX_MPDU_INFO_PN_GET_BYTE2(desc->u.qcc2072.mpdu_start.pn[1]);
16728badc78SBaochen Qiang }
16828badc78SBaochen Qiang 
16928badc78SBaochen Qiang static void ath12k_hal_rx_desc_copy_end_tlv_qcc2072(struct hal_rx_desc *fdesc,
17028badc78SBaochen Qiang 						    struct hal_rx_desc *ldesc)
17128badc78SBaochen Qiang {
17228badc78SBaochen Qiang 	memcpy(&fdesc->u.qcc2072.msdu_end, &ldesc->u.qcc2072.msdu_end,
17328badc78SBaochen Qiang 	       sizeof(struct rx_msdu_end_qcn9274));
17428badc78SBaochen Qiang }
17528badc78SBaochen Qiang 
17628badc78SBaochen Qiang static u8 ath12k_hal_rx_desc_get_msdu_src_link_qcc2072(struct hal_rx_desc *desc)
17728badc78SBaochen Qiang {
17828badc78SBaochen Qiang 	return 0;
17928badc78SBaochen Qiang }
18028badc78SBaochen Qiang 
18128badc78SBaochen Qiang static u8 ath12k_hal_rx_desc_get_l3_pad_bytes_qcc2072(struct hal_rx_desc *desc)
18228badc78SBaochen Qiang {
18328badc78SBaochen Qiang 	return le16_get_bits(desc->u.qcc2072.msdu_end.info5,
18428badc78SBaochen Qiang 			     RX_MSDU_END_INFO5_L3_HDR_PADDING);
18528badc78SBaochen Qiang }
18628badc78SBaochen Qiang 
18728badc78SBaochen Qiang static u32 ath12k_hal_rx_desc_get_mpdu_start_tag_qcc2072(struct hal_rx_desc *desc)
18828badc78SBaochen Qiang {
18928badc78SBaochen Qiang 	return le32_get_bits(desc->u.qcc2072.mpdu_start_tag,
19028badc78SBaochen Qiang 			     HAL_TLV_HDR_TAG);
19128badc78SBaochen Qiang }
19228badc78SBaochen Qiang 
19328badc78SBaochen Qiang static u32 ath12k_hal_rx_desc_get_mpdu_ppdu_id_qcc2072(struct hal_rx_desc *desc)
19428badc78SBaochen Qiang {
19528badc78SBaochen Qiang 	return __le16_to_cpu(desc->u.qcc2072.mpdu_start.phy_ppdu_id);
19628badc78SBaochen Qiang }
19728badc78SBaochen Qiang 
19828badc78SBaochen Qiang static u8 *ath12k_hal_rx_desc_get_msdu_payload_qcc2072(struct hal_rx_desc *desc)
19928badc78SBaochen Qiang {
20028badc78SBaochen Qiang 	return &desc->u.qcc2072.msdu_payload[0];
20128badc78SBaochen Qiang }
20228badc78SBaochen Qiang 
20328badc78SBaochen Qiang static bool ath12k_hal_rx_desc_get_first_msdu_qcc2072(struct hal_rx_desc *desc)
20428badc78SBaochen Qiang {
20528badc78SBaochen Qiang 	return !!le16_get_bits(desc->u.qcc2072.msdu_end.info5,
20628badc78SBaochen Qiang 			       RX_MSDU_END_INFO5_FIRST_MSDU);
20728badc78SBaochen Qiang }
20828badc78SBaochen Qiang 
20928badc78SBaochen Qiang static bool ath12k_hal_rx_desc_get_last_msdu_qcc2072(struct hal_rx_desc *desc)
21028badc78SBaochen Qiang {
21128badc78SBaochen Qiang 	return !!le16_get_bits(desc->u.qcc2072.msdu_end.info5,
21228badc78SBaochen Qiang 			       RX_MSDU_END_INFO5_LAST_MSDU);
21328badc78SBaochen Qiang }
21428badc78SBaochen Qiang 
21528badc78SBaochen Qiang static bool ath12k_hal_rx_desc_encrypt_valid_qcc2072(struct hal_rx_desc *desc)
21628badc78SBaochen Qiang {
21728badc78SBaochen Qiang 	return !!le32_get_bits(desc->u.qcc2072.mpdu_start.info4,
21828badc78SBaochen Qiang 			       RX_MPDU_START_INFO4_ENCRYPT_INFO_VALID);
21928badc78SBaochen Qiang }
22028badc78SBaochen Qiang 
22128badc78SBaochen Qiang static u32 ath12k_hal_rx_desc_get_encrypt_type_qcc2072(struct hal_rx_desc *desc)
22228badc78SBaochen Qiang {
22328badc78SBaochen Qiang 	if (!ath12k_hal_rx_desc_encrypt_valid_qcc2072(desc))
22428badc78SBaochen Qiang 		return HAL_ENCRYPT_TYPE_OPEN;
22528badc78SBaochen Qiang 
22628badc78SBaochen Qiang 	return le32_get_bits(desc->u.qcc2072.mpdu_start.info2,
22728badc78SBaochen Qiang 			     RX_MPDU_START_INFO2_ENC_TYPE);
22828badc78SBaochen Qiang }
22928badc78SBaochen Qiang 
23028badc78SBaochen Qiang static u8 ath12k_hal_rx_desc_get_decap_type_qcc2072(struct hal_rx_desc *desc)
23128badc78SBaochen Qiang {
23228badc78SBaochen Qiang 	return le32_get_bits(desc->u.qcc2072.msdu_end.info11,
23328badc78SBaochen Qiang 			     RX_MSDU_END_INFO11_DECAP_FORMAT);
23428badc78SBaochen Qiang }
23528badc78SBaochen Qiang 
23628badc78SBaochen Qiang static u8 ath12k_hal_rx_desc_get_mesh_ctl_qcc2072(struct hal_rx_desc *desc)
23728badc78SBaochen Qiang {
23828badc78SBaochen Qiang 	return le32_get_bits(desc->u.qcc2072.msdu_end.info11,
23928badc78SBaochen Qiang 			     RX_MSDU_END_INFO11_MESH_CTRL_PRESENT);
24028badc78SBaochen Qiang }
24128badc78SBaochen Qiang 
24228badc78SBaochen Qiang static bool ath12k_hal_rx_desc_get_mpdu_seq_ctl_vld_qcc2072(struct hal_rx_desc *desc)
24328badc78SBaochen Qiang {
24428badc78SBaochen Qiang 	return !!le32_get_bits(desc->u.qcc2072.mpdu_start.info4,
24528badc78SBaochen Qiang 			       RX_MPDU_START_INFO4_MPDU_SEQ_CTRL_VALID);
24628badc78SBaochen Qiang }
24728badc78SBaochen Qiang 
24828badc78SBaochen Qiang static bool ath12k_hal_rx_desc_get_mpdu_fc_valid_qcc2072(struct hal_rx_desc *desc)
24928badc78SBaochen Qiang {
25028badc78SBaochen Qiang 	return !!le32_get_bits(desc->u.qcc2072.mpdu_start.info4,
25128badc78SBaochen Qiang 			       RX_MPDU_START_INFO4_MPDU_FCTRL_VALID);
25228badc78SBaochen Qiang }
25328badc78SBaochen Qiang 
25428badc78SBaochen Qiang static u16 ath12k_hal_rx_desc_get_mpdu_start_seq_no_qcc2072(struct hal_rx_desc *desc)
25528badc78SBaochen Qiang {
25628badc78SBaochen Qiang 	return le32_get_bits(desc->u.qcc2072.mpdu_start.info4,
25728badc78SBaochen Qiang 			     RX_MPDU_START_INFO4_MPDU_SEQ_NUM);
25828badc78SBaochen Qiang }
25928badc78SBaochen Qiang 
26028badc78SBaochen Qiang static u16 ath12k_hal_rx_desc_get_msdu_len_qcc2072(struct hal_rx_desc *desc)
26128badc78SBaochen Qiang {
26228badc78SBaochen Qiang 	return le32_get_bits(desc->u.qcc2072.msdu_end.info10,
26328badc78SBaochen Qiang 			     RX_MSDU_END_INFO10_MSDU_LENGTH);
26428badc78SBaochen Qiang }
26528badc78SBaochen Qiang 
26628badc78SBaochen Qiang static u8 ath12k_hal_rx_desc_get_msdu_sgi_qcc2072(struct hal_rx_desc *desc)
26728badc78SBaochen Qiang {
26828badc78SBaochen Qiang 	return le32_get_bits(desc->u.qcc2072.msdu_end.info12,
26928badc78SBaochen Qiang 			     RX_MSDU_END_INFO12_SGI);
27028badc78SBaochen Qiang }
27128badc78SBaochen Qiang 
27228badc78SBaochen Qiang static u8 ath12k_hal_rx_desc_get_msdu_rate_mcs_qcc2072(struct hal_rx_desc *desc)
27328badc78SBaochen Qiang {
27428badc78SBaochen Qiang 	return le32_get_bits(desc->u.qcc2072.msdu_end.info12,
27528badc78SBaochen Qiang 			     RX_MSDU_END_INFO12_RATE_MCS);
27628badc78SBaochen Qiang }
27728badc78SBaochen Qiang 
27828badc78SBaochen Qiang static u8 ath12k_hal_rx_desc_get_msdu_rx_bw_qcc2072(struct hal_rx_desc *desc)
27928badc78SBaochen Qiang {
28028badc78SBaochen Qiang 	return le32_get_bits(desc->u.qcc2072.msdu_end.info12,
28128badc78SBaochen Qiang 			     RX_MSDU_END_INFO12_RECV_BW);
28228badc78SBaochen Qiang }
28328badc78SBaochen Qiang 
28428badc78SBaochen Qiang static u32 ath12k_hal_rx_desc_get_msdu_freq_qcc2072(struct hal_rx_desc *desc)
28528badc78SBaochen Qiang {
28628badc78SBaochen Qiang 	return __le32_to_cpu(desc->u.qcc2072.msdu_end.phy_meta_data);
28728badc78SBaochen Qiang }
28828badc78SBaochen Qiang 
28928badc78SBaochen Qiang static u8 ath12k_hal_rx_desc_get_msdu_pkt_type_qcc2072(struct hal_rx_desc *desc)
29028badc78SBaochen Qiang {
29128badc78SBaochen Qiang 	return le32_get_bits(desc->u.qcc2072.msdu_end.info12,
29228badc78SBaochen Qiang 			     RX_MSDU_END_INFO12_PKT_TYPE);
29328badc78SBaochen Qiang }
29428badc78SBaochen Qiang 
29528badc78SBaochen Qiang static u8 ath12k_hal_rx_desc_get_msdu_nss_qcc2072(struct hal_rx_desc *desc)
29628badc78SBaochen Qiang {
29728badc78SBaochen Qiang 	return le32_get_bits(desc->u.qcc2072.msdu_end.info12,
29828badc78SBaochen Qiang 			     RX_MSDU_END_INFO12_MIMO_SS_BITMAP);
29928badc78SBaochen Qiang }
30028badc78SBaochen Qiang 
30128badc78SBaochen Qiang static u8 ath12k_hal_rx_desc_get_mpdu_tid_qcc2072(struct hal_rx_desc *desc)
30228badc78SBaochen Qiang {
30328badc78SBaochen Qiang 	return le32_get_bits(desc->u.qcc2072.mpdu_start.info2,
30428badc78SBaochen Qiang 			     RX_MPDU_START_INFO2_TID);
30528badc78SBaochen Qiang }
30628badc78SBaochen Qiang 
30728badc78SBaochen Qiang static u16 ath12k_hal_rx_desc_get_mpdu_peer_id_qcc2072(struct hal_rx_desc *desc)
30828badc78SBaochen Qiang {
30928badc78SBaochen Qiang 	return __le16_to_cpu(desc->u.qcc2072.mpdu_start.sw_peer_id);
31028badc78SBaochen Qiang }
31128badc78SBaochen Qiang 
31228badc78SBaochen Qiang static bool ath12k_hal_rx_desc_mac_addr2_valid_qcc2072(struct hal_rx_desc *desc)
31328badc78SBaochen Qiang {
31428badc78SBaochen Qiang 	return __le32_to_cpu(desc->u.qcc2072.mpdu_start.info4) &
31528badc78SBaochen Qiang 			     RX_MPDU_START_INFO4_MAC_ADDR2_VALID;
31628badc78SBaochen Qiang }
31728badc78SBaochen Qiang 
31828badc78SBaochen Qiang static u8 *ath12k_hal_rx_desc_mpdu_start_addr2_qcc2072(struct hal_rx_desc *desc)
31928badc78SBaochen Qiang {
32028badc78SBaochen Qiang 	return desc->u.qcc2072.mpdu_start.addr2;
32128badc78SBaochen Qiang }
32228badc78SBaochen Qiang 
32328badc78SBaochen Qiang static bool ath12k_hal_rx_desc_is_da_mcbc_qcc2072(struct hal_rx_desc *desc)
32428badc78SBaochen Qiang {
32528badc78SBaochen Qiang 	return __le32_to_cpu(desc->u.qcc2072.msdu_end.info13) &
32628badc78SBaochen Qiang 			     RX_MSDU_END_INFO13_MCAST_BCAST;
32728badc78SBaochen Qiang }
32828badc78SBaochen Qiang 
32928badc78SBaochen Qiang static bool ath12k_hal_rx_h_msdu_done_qcc2072(struct hal_rx_desc *desc)
33028badc78SBaochen Qiang {
33128badc78SBaochen Qiang 	return !!le32_get_bits(desc->u.qcc2072.msdu_end.info14,
33228badc78SBaochen Qiang 			       RX_MSDU_END_INFO14_MSDU_DONE);
33328badc78SBaochen Qiang }
33428badc78SBaochen Qiang 
33528badc78SBaochen Qiang static bool ath12k_hal_rx_h_l4_cksum_fail_qcc2072(struct hal_rx_desc *desc)
33628badc78SBaochen Qiang {
33728badc78SBaochen Qiang 	return !!le32_get_bits(desc->u.qcc2072.msdu_end.info13,
33828badc78SBaochen Qiang 			       RX_MSDU_END_INFO13_TCP_UDP_CKSUM_FAIL);
33928badc78SBaochen Qiang }
34028badc78SBaochen Qiang 
34128badc78SBaochen Qiang static bool ath12k_hal_rx_h_ip_cksum_fail_qcc2072(struct hal_rx_desc *desc)
34228badc78SBaochen Qiang {
34328badc78SBaochen Qiang 	return !!le32_get_bits(desc->u.qcc2072.msdu_end.info13,
34428badc78SBaochen Qiang 			       RX_MSDU_END_INFO13_IP_CKSUM_FAIL);
34528badc78SBaochen Qiang }
34628badc78SBaochen Qiang 
34728badc78SBaochen Qiang static bool ath12k_hal_rx_h_is_decrypted_qcc2072(struct hal_rx_desc *desc)
34828badc78SBaochen Qiang {
34928badc78SBaochen Qiang 	return (le32_get_bits(desc->u.qcc2072.msdu_end.info14,
35028badc78SBaochen Qiang 			      RX_MSDU_END_INFO14_DECRYPT_STATUS_CODE) ==
35128badc78SBaochen Qiang 		RX_DESC_DECRYPT_STATUS_CODE_OK);
35228badc78SBaochen Qiang }
35328badc78SBaochen Qiang 
35428badc78SBaochen Qiang static u32 ath12k_hal_rx_h_mpdu_err_qcc2072(struct hal_rx_desc *desc)
35528badc78SBaochen Qiang {
35628badc78SBaochen Qiang 	u32 info = __le32_to_cpu(desc->u.qcc2072.msdu_end.info13);
35728badc78SBaochen Qiang 	u32 errmap = 0;
35828badc78SBaochen Qiang 
35928badc78SBaochen Qiang 	if (info & RX_MSDU_END_INFO13_FCS_ERR)
36028badc78SBaochen Qiang 		errmap |= HAL_RX_MPDU_ERR_FCS;
36128badc78SBaochen Qiang 
36228badc78SBaochen Qiang 	if (info & RX_MSDU_END_INFO13_DECRYPT_ERR)
36328badc78SBaochen Qiang 		errmap |= HAL_RX_MPDU_ERR_DECRYPT;
36428badc78SBaochen Qiang 
36528badc78SBaochen Qiang 	if (info & RX_MSDU_END_INFO13_TKIP_MIC_ERR)
36628badc78SBaochen Qiang 		errmap |= HAL_RX_MPDU_ERR_TKIP_MIC;
36728badc78SBaochen Qiang 
36828badc78SBaochen Qiang 	if (info & RX_MSDU_END_INFO13_A_MSDU_ERROR)
36928badc78SBaochen Qiang 		errmap |= HAL_RX_MPDU_ERR_AMSDU_ERR;
37028badc78SBaochen Qiang 
37128badc78SBaochen Qiang 	if (info & RX_MSDU_END_INFO13_OVERFLOW_ERR)
37228badc78SBaochen Qiang 		errmap |= HAL_RX_MPDU_ERR_OVERFLOW;
37328badc78SBaochen Qiang 
37428badc78SBaochen Qiang 	if (info & RX_MSDU_END_INFO13_MSDU_LEN_ERR)
37528badc78SBaochen Qiang 		errmap |= HAL_RX_MPDU_ERR_MSDU_LEN;
37628badc78SBaochen Qiang 
37728badc78SBaochen Qiang 	if (info & RX_MSDU_END_INFO13_MPDU_LEN_ERR)
37828badc78SBaochen Qiang 		errmap |= HAL_RX_MPDU_ERR_MPDU_LEN;
37928badc78SBaochen Qiang 
38028badc78SBaochen Qiang 	return errmap;
38128badc78SBaochen Qiang }
38228badc78SBaochen Qiang 
38328badc78SBaochen Qiang static void ath12k_hal_extract_rx_desc_data_qcc2072(struct hal_rx_desc_data *rx_desc_data,
38428badc78SBaochen Qiang 						    struct hal_rx_desc *rx_desc,
38528badc78SBaochen Qiang 						    struct hal_rx_desc *ldesc)
38628badc78SBaochen Qiang {
38728badc78SBaochen Qiang 	rx_desc_data->is_first_msdu = ath12k_hal_rx_desc_get_first_msdu_qcc2072(ldesc);
38828badc78SBaochen Qiang 	rx_desc_data->is_last_msdu = ath12k_hal_rx_desc_get_last_msdu_qcc2072(ldesc);
38928badc78SBaochen Qiang 	rx_desc_data->l3_pad_bytes = ath12k_hal_rx_desc_get_l3_pad_bytes_qcc2072(ldesc);
39028badc78SBaochen Qiang 	rx_desc_data->enctype = ath12k_hal_rx_desc_get_encrypt_type_qcc2072(rx_desc);
39128badc78SBaochen Qiang 	rx_desc_data->decap_type = ath12k_hal_rx_desc_get_decap_type_qcc2072(rx_desc);
39228badc78SBaochen Qiang 	rx_desc_data->mesh_ctrl_present =
39328badc78SBaochen Qiang 				ath12k_hal_rx_desc_get_mesh_ctl_qcc2072(rx_desc);
39428badc78SBaochen Qiang 	rx_desc_data->seq_ctl_valid =
39528badc78SBaochen Qiang 				ath12k_hal_rx_desc_get_mpdu_seq_ctl_vld_qcc2072(rx_desc);
39628badc78SBaochen Qiang 	rx_desc_data->fc_valid = ath12k_hal_rx_desc_get_mpdu_fc_valid_qcc2072(rx_desc);
39728badc78SBaochen Qiang 	rx_desc_data->seq_no = ath12k_hal_rx_desc_get_mpdu_start_seq_no_qcc2072(rx_desc);
39828badc78SBaochen Qiang 	rx_desc_data->msdu_len = ath12k_hal_rx_desc_get_msdu_len_qcc2072(ldesc);
39928badc78SBaochen Qiang 	rx_desc_data->sgi = ath12k_hal_rx_desc_get_msdu_sgi_qcc2072(rx_desc);
40028badc78SBaochen Qiang 	rx_desc_data->rate_mcs = ath12k_hal_rx_desc_get_msdu_rate_mcs_qcc2072(rx_desc);
40128badc78SBaochen Qiang 	rx_desc_data->bw = ath12k_hal_rx_desc_get_msdu_rx_bw_qcc2072(rx_desc);
40228badc78SBaochen Qiang 	rx_desc_data->phy_meta_data = ath12k_hal_rx_desc_get_msdu_freq_qcc2072(rx_desc);
40328badc78SBaochen Qiang 	rx_desc_data->pkt_type = ath12k_hal_rx_desc_get_msdu_pkt_type_qcc2072(rx_desc);
40428badc78SBaochen Qiang 	rx_desc_data->nss = hweight8(ath12k_hal_rx_desc_get_msdu_nss_qcc2072(rx_desc));
40528badc78SBaochen Qiang 	rx_desc_data->tid = ath12k_hal_rx_desc_get_mpdu_tid_qcc2072(rx_desc);
40628badc78SBaochen Qiang 	rx_desc_data->peer_id = ath12k_hal_rx_desc_get_mpdu_peer_id_qcc2072(rx_desc);
40728badc78SBaochen Qiang 	rx_desc_data->addr2_present = ath12k_hal_rx_desc_mac_addr2_valid_qcc2072(rx_desc);
40828badc78SBaochen Qiang 	rx_desc_data->addr2 = ath12k_hal_rx_desc_mpdu_start_addr2_qcc2072(rx_desc);
40928badc78SBaochen Qiang 	rx_desc_data->is_mcbc = ath12k_hal_rx_desc_is_da_mcbc_qcc2072(rx_desc);
41028badc78SBaochen Qiang 	rx_desc_data->msdu_done = ath12k_hal_rx_h_msdu_done_qcc2072(ldesc);
41128badc78SBaochen Qiang 	rx_desc_data->l4_csum_fail = ath12k_hal_rx_h_l4_cksum_fail_qcc2072(rx_desc);
41228badc78SBaochen Qiang 	rx_desc_data->ip_csum_fail = ath12k_hal_rx_h_ip_cksum_fail_qcc2072(rx_desc);
41328badc78SBaochen Qiang 	rx_desc_data->is_decrypted = ath12k_hal_rx_h_is_decrypted_qcc2072(rx_desc);
41428badc78SBaochen Qiang 	rx_desc_data->err_bitmap = ath12k_hal_rx_h_mpdu_err_qcc2072(rx_desc);
41528badc78SBaochen Qiang }
41628badc78SBaochen Qiang 
417b7ffeb0fSBaochen Qiang static int ath12k_hal_srng_create_config_qcc2072(struct ath12k_hal *hal)
418b7ffeb0fSBaochen Qiang {
419b7ffeb0fSBaochen Qiang 	struct hal_srng_config *s;
420b7ffeb0fSBaochen Qiang 	int ret;
421b7ffeb0fSBaochen Qiang 
422b7ffeb0fSBaochen Qiang 	ret = ath12k_hal_srng_create_config_wcn7850(hal);
423b7ffeb0fSBaochen Qiang 	if (ret)
424b7ffeb0fSBaochen Qiang 		return ret;
425b7ffeb0fSBaochen Qiang 
426b7ffeb0fSBaochen Qiang 	s = &hal->srng_config[HAL_REO_CMD];
427b7ffeb0fSBaochen Qiang 	s->entry_size = (sizeof(struct hal_tlv_hdr) +
428b7ffeb0fSBaochen Qiang 			 sizeof(struct hal_reo_get_queue_stats_qcc2072)) >> 2;
429b7ffeb0fSBaochen Qiang 
43037b34a1cSBaochen Qiang 	s = &hal->srng_config[HAL_REO_STATUS];
43137b34a1cSBaochen Qiang 	s->entry_size = (sizeof(struct hal_tlv_hdr) +
43237b34a1cSBaochen Qiang 			 sizeof(struct hal_reo_get_queue_stats_status_qcc2072)) >> 2;
43337b34a1cSBaochen Qiang 
434b7ffeb0fSBaochen Qiang 	return 0;
435b7ffeb0fSBaochen Qiang }
436b7ffeb0fSBaochen Qiang 
43737b34a1cSBaochen Qiang static u16 ath12k_hal_reo_status_dec_tlv_hdr_qcc2072(void *tlv, void **desc)
43837b34a1cSBaochen Qiang {
43937b34a1cSBaochen Qiang 	struct hal_reo_get_queue_stats_status_qcc2072 *status_tlv;
44037b34a1cSBaochen Qiang 	u16 tag;
44137b34a1cSBaochen Qiang 
44237b34a1cSBaochen Qiang 	tag = ath12k_hal_decode_tlv32_hdr(tlv, (void **)&status_tlv);
44337b34a1cSBaochen Qiang 	/*
44437b34a1cSBaochen Qiang 	 * actual desc of REO status entry starts after tlv32_padding,
44537b34a1cSBaochen Qiang 	 * see hal_reo_get_queue_stats_status_qcc2072
44637b34a1cSBaochen Qiang 	 */
44737b34a1cSBaochen Qiang 	*desc = &status_tlv->status;
44837b34a1cSBaochen Qiang 
44937b34a1cSBaochen Qiang 	return tag;
45037b34a1cSBaochen Qiang }
45137b34a1cSBaochen Qiang 
45228badc78SBaochen Qiang const struct hal_ops hal_qcc2072_ops = {
453b7ffeb0fSBaochen Qiang 	.create_srng_config = ath12k_hal_srng_create_config_qcc2072,
45428badc78SBaochen Qiang 	.rx_desc_set_msdu_len = ath12k_hal_rx_desc_set_msdu_len_qcc2072,
45528badc78SBaochen Qiang 	.rx_desc_get_dot11_hdr = ath12k_hal_rx_desc_get_dot11_hdr_qcc2072,
45628badc78SBaochen Qiang 	.rx_desc_get_crypto_header = ath12k_hal_rx_desc_get_crypto_hdr_qcc2072,
45728badc78SBaochen Qiang 	.rx_desc_copy_end_tlv = ath12k_hal_rx_desc_copy_end_tlv_qcc2072,
45828badc78SBaochen Qiang 	.rx_desc_get_msdu_src_link_id = ath12k_hal_rx_desc_get_msdu_src_link_qcc2072,
45928badc78SBaochen Qiang 	.extract_rx_desc_data = ath12k_hal_extract_rx_desc_data_qcc2072,
46028badc78SBaochen Qiang 	.rx_desc_get_l3_pad_bytes = ath12k_hal_rx_desc_get_l3_pad_bytes_qcc2072,
46128badc78SBaochen Qiang 	.rx_desc_get_mpdu_start_tag = ath12k_hal_rx_desc_get_mpdu_start_tag_qcc2072,
46228badc78SBaochen Qiang 	.rx_desc_get_mpdu_ppdu_id = ath12k_hal_rx_desc_get_mpdu_ppdu_id_qcc2072,
46328badc78SBaochen Qiang 	.rx_desc_get_msdu_payload = ath12k_hal_rx_desc_get_msdu_payload_qcc2072,
46428badc78SBaochen Qiang 	.ce_dst_setup = ath12k_wifi7_hal_ce_dst_setup,
46528badc78SBaochen Qiang 	.srng_src_hw_init = ath12k_wifi7_hal_srng_src_hw_init,
46628badc78SBaochen Qiang 	.srng_dst_hw_init = ath12k_wifi7_hal_srng_dst_hw_init,
46728badc78SBaochen Qiang 	.set_umac_srng_ptr_addr = ath12k_wifi7_hal_set_umac_srng_ptr_addr,
46828badc78SBaochen Qiang 	.srng_update_shadow_config = ath12k_wifi7_hal_srng_update_shadow_config,
46928badc78SBaochen Qiang 	.srng_get_ring_id = ath12k_wifi7_hal_srng_get_ring_id,
47028badc78SBaochen Qiang 	.ce_get_desc_size = ath12k_wifi7_hal_ce_get_desc_size,
47128badc78SBaochen Qiang 	.ce_src_set_desc = ath12k_wifi7_hal_ce_src_set_desc,
47228badc78SBaochen Qiang 	.ce_dst_set_desc = ath12k_wifi7_hal_ce_dst_set_desc,
47328badc78SBaochen Qiang 	.ce_dst_status_get_length = ath12k_wifi7_hal_ce_dst_status_get_length,
47428badc78SBaochen Qiang 	.set_link_desc_addr = ath12k_wifi7_hal_set_link_desc_addr,
47528badc78SBaochen Qiang 	.tx_set_dscp_tid_map = ath12k_wifi7_hal_tx_set_dscp_tid_map,
47628badc78SBaochen Qiang 	.tx_configure_bank_register =
47728badc78SBaochen Qiang 				ath12k_wifi7_hal_tx_configure_bank_register,
47828badc78SBaochen Qiang 	.reoq_lut_addr_read_enable = ath12k_wifi7_hal_reoq_lut_addr_read_enable,
47928badc78SBaochen Qiang 	.reoq_lut_set_max_peerid = ath12k_wifi7_hal_reoq_lut_set_max_peerid,
48028badc78SBaochen Qiang 	.write_reoq_lut_addr = ath12k_wifi7_hal_write_reoq_lut_addr,
48128badc78SBaochen Qiang 	.write_ml_reoq_lut_addr = ath12k_wifi7_hal_write_ml_reoq_lut_addr,
48228badc78SBaochen Qiang 	.setup_link_idle_list = ath12k_wifi7_hal_setup_link_idle_list,
483b7ffeb0fSBaochen Qiang 	.reo_init_cmd_ring = ath12k_wifi7_hal_reo_init_cmd_ring_tlv32,
48428badc78SBaochen Qiang 	.reo_hw_setup = ath12k_wifi7_hal_reo_hw_setup,
48528badc78SBaochen Qiang 	.rx_buf_addr_info_set = ath12k_wifi7_hal_rx_buf_addr_info_set,
48628badc78SBaochen Qiang 	.rx_buf_addr_info_get = ath12k_wifi7_hal_rx_buf_addr_info_get,
48728badc78SBaochen Qiang 	.cc_config = ath12k_wifi7_hal_cc_config,
48828badc78SBaochen Qiang 	.get_idle_link_rbm = ath12k_wifi7_hal_get_idle_link_rbm,
48928badc78SBaochen Qiang 	.rx_msdu_list_get = ath12k_wifi7_hal_rx_msdu_list_get,
49028badc78SBaochen Qiang 	.rx_reo_ent_buf_paddr_get = ath12k_wifi7_hal_rx_reo_ent_buf_paddr_get,
491b7ffeb0fSBaochen Qiang 	.reo_cmd_enc_tlv_hdr = ath12k_hal_encode_tlv32_hdr,
49237b34a1cSBaochen Qiang 	.reo_status_dec_tlv_hdr = ath12k_hal_reo_status_dec_tlv_hdr_qcc2072,
49328badc78SBaochen Qiang };
494023ace9fSBaochen Qiang 
495023ace9fSBaochen Qiang u32 ath12k_hal_rx_desc_get_mpdu_start_offset_qcc2072(void)
496023ace9fSBaochen Qiang {
497023ace9fSBaochen Qiang 	return offsetof(struct hal_rx_desc_qcc2072, mpdu_start_tag);
498023ace9fSBaochen Qiang }
499023ace9fSBaochen Qiang 
500023ace9fSBaochen Qiang u32 ath12k_hal_rx_desc_get_msdu_end_offset_qcc2072(void)
501023ace9fSBaochen Qiang {
502023ace9fSBaochen Qiang 	return offsetof(struct hal_rx_desc_qcc2072, msdu_end_tag);
503023ace9fSBaochen Qiang }
504