Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
   1// SPDX-License-Identifier: BSD-3-Clause-Clear
   2/*
   3 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
   4 * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
   5 */
   6#include <linux/dma-mapping.h>
   7#include "hal_tx.h"
   8#include "hal_rx.h"
   9#include "debug.h"
  10#include "hal_desc.h"
  11#include "hif.h"
  12
  13static const struct hal_srng_config hw_srng_config_template[] = {
  14	/* TODO: max_rings can populated by querying HW capabilities */
  15	[HAL_REO_DST] = {
  16		.start_ring_id = HAL_SRNG_RING_ID_REO2SW1,
  17		.max_rings = 8,
  18		.entry_size = sizeof(struct hal_reo_dest_ring) >> 2,
  19		.mac_type = ATH12K_HAL_SRNG_UMAC,
  20		.ring_dir = HAL_SRNG_DIR_DST,
  21		.max_size = HAL_REO_REO2SW1_RING_BASE_MSB_RING_SIZE,
  22	},
  23	[HAL_REO_EXCEPTION] = {
  24		/* Designating REO2SW0 ring as exception ring.
  25		 * Any of theREO2SW rings can be used as exception ring.
  26		 */
  27		.start_ring_id = HAL_SRNG_RING_ID_REO2SW0,
  28		.max_rings = 1,
  29		.entry_size = sizeof(struct hal_reo_dest_ring) >> 2,
  30		.mac_type = ATH12K_HAL_SRNG_UMAC,
  31		.ring_dir = HAL_SRNG_DIR_DST,
  32		.max_size = HAL_REO_REO2SW0_RING_BASE_MSB_RING_SIZE,
  33	},
  34	[HAL_REO_REINJECT] = {
  35		.start_ring_id = HAL_SRNG_RING_ID_SW2REO,
  36		.max_rings = 4,
  37		.entry_size = sizeof(struct hal_reo_entrance_ring) >> 2,
  38		.mac_type = ATH12K_HAL_SRNG_UMAC,
  39		.ring_dir = HAL_SRNG_DIR_SRC,
  40		.max_size = HAL_REO_SW2REO_RING_BASE_MSB_RING_SIZE,
  41	},
  42	[HAL_REO_CMD] = {
  43		.start_ring_id = HAL_SRNG_RING_ID_REO_CMD,
  44		.max_rings = 1,
  45		.entry_size = (sizeof(struct hal_tlv_64_hdr) +
  46			sizeof(struct hal_reo_get_queue_stats)) >> 2,
  47		.mac_type = ATH12K_HAL_SRNG_UMAC,
  48		.ring_dir = HAL_SRNG_DIR_SRC,
  49		.max_size = HAL_REO_CMD_RING_BASE_MSB_RING_SIZE,
  50	},
  51	[HAL_REO_STATUS] = {
  52		.start_ring_id = HAL_SRNG_RING_ID_REO_STATUS,
  53		.max_rings = 1,
  54		.entry_size = (sizeof(struct hal_tlv_64_hdr) +
  55			sizeof(struct hal_reo_get_queue_stats_status)) >> 2,
  56		.mac_type = ATH12K_HAL_SRNG_UMAC,
  57		.ring_dir = HAL_SRNG_DIR_DST,
  58		.max_size = HAL_REO_STATUS_RING_BASE_MSB_RING_SIZE,
  59	},
  60	[HAL_TCL_DATA] = {
  61		.start_ring_id = HAL_SRNG_RING_ID_SW2TCL1,
  62		.max_rings = 6,
  63		.entry_size = sizeof(struct hal_tcl_data_cmd) >> 2,
  64		.mac_type = ATH12K_HAL_SRNG_UMAC,
  65		.ring_dir = HAL_SRNG_DIR_SRC,
  66		.max_size = HAL_SW2TCL1_RING_BASE_MSB_RING_SIZE,
  67	},
  68	[HAL_TCL_CMD] = {
  69		.start_ring_id = HAL_SRNG_RING_ID_SW2TCL_CMD,
  70		.max_rings = 1,
  71		.entry_size = sizeof(struct hal_tcl_gse_cmd) >> 2,
  72		.mac_type = ATH12K_HAL_SRNG_UMAC,
  73		.ring_dir = HAL_SRNG_DIR_SRC,
  74		.max_size = HAL_SW2TCL1_CMD_RING_BASE_MSB_RING_SIZE,
  75	},
  76	[HAL_TCL_STATUS] = {
  77		.start_ring_id = HAL_SRNG_RING_ID_TCL_STATUS,
  78		.max_rings = 1,
  79		.entry_size = (sizeof(struct hal_tlv_hdr) +
  80			     sizeof(struct hal_tcl_status_ring)) >> 2,
  81		.mac_type = ATH12K_HAL_SRNG_UMAC,
  82		.ring_dir = HAL_SRNG_DIR_DST,
  83		.max_size = HAL_TCL_STATUS_RING_BASE_MSB_RING_SIZE,
  84	},
  85	[HAL_CE_SRC] = {
  86		.start_ring_id = HAL_SRNG_RING_ID_CE0_SRC,
  87		.max_rings = 16,
  88		.entry_size = sizeof(struct hal_ce_srng_src_desc) >> 2,
  89		.mac_type = ATH12K_HAL_SRNG_UMAC,
  90		.ring_dir = HAL_SRNG_DIR_SRC,
  91		.max_size = HAL_CE_SRC_RING_BASE_MSB_RING_SIZE,
  92	},
  93	[HAL_CE_DST] = {
  94		.start_ring_id = HAL_SRNG_RING_ID_CE0_DST,
  95		.max_rings = 16,
  96		.entry_size = sizeof(struct hal_ce_srng_dest_desc) >> 2,
  97		.mac_type = ATH12K_HAL_SRNG_UMAC,
  98		.ring_dir = HAL_SRNG_DIR_SRC,
  99		.max_size = HAL_CE_DST_RING_BASE_MSB_RING_SIZE,
 100	},
 101	[HAL_CE_DST_STATUS] = {
 102		.start_ring_id = HAL_SRNG_RING_ID_CE0_DST_STATUS,
 103		.max_rings = 16,
 104		.entry_size = sizeof(struct hal_ce_srng_dst_status_desc) >> 2,
 105		.mac_type = ATH12K_HAL_SRNG_UMAC,
 106		.ring_dir = HAL_SRNG_DIR_DST,
 107		.max_size = HAL_CE_DST_STATUS_RING_BASE_MSB_RING_SIZE,
 108	},
 109	[HAL_WBM_IDLE_LINK] = {
 110		.start_ring_id = HAL_SRNG_RING_ID_WBM_IDLE_LINK,
 111		.max_rings = 1,
 112		.entry_size = sizeof(struct hal_wbm_link_desc) >> 2,
 113		.mac_type = ATH12K_HAL_SRNG_UMAC,
 114		.ring_dir = HAL_SRNG_DIR_SRC,
 115		.max_size = HAL_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE,
 116	},
 117	[HAL_SW2WBM_RELEASE] = {
 118		.start_ring_id = HAL_SRNG_RING_ID_WBM_SW0_RELEASE,
 119		.max_rings = 2,
 120		.entry_size = sizeof(struct hal_wbm_release_ring) >> 2,
 121		.mac_type = ATH12K_HAL_SRNG_UMAC,
 122		.ring_dir = HAL_SRNG_DIR_SRC,
 123		.max_size = HAL_SW2WBM_RELEASE_RING_BASE_MSB_RING_SIZE,
 124	},
 125	[HAL_WBM2SW_RELEASE] = {
 126		.start_ring_id = HAL_SRNG_RING_ID_WBM2SW0_RELEASE,
 127		.max_rings = 8,
 128		.entry_size = sizeof(struct hal_wbm_release_ring) >> 2,
 129		.mac_type = ATH12K_HAL_SRNG_UMAC,
 130		.ring_dir = HAL_SRNG_DIR_DST,
 131		.max_size = HAL_WBM2SW_RELEASE_RING_BASE_MSB_RING_SIZE,
 132	},
 133	[HAL_RXDMA_BUF] = {
 134		.start_ring_id = HAL_SRNG_SW2RXDMA_BUF0,
 135		.max_rings = 1,
 136		.entry_size = sizeof(struct hal_wbm_buffer_ring) >> 2,
 137		.mac_type = ATH12K_HAL_SRNG_DMAC,
 138		.ring_dir = HAL_SRNG_DIR_SRC,
 139		.max_size = HAL_RXDMA_RING_MAX_SIZE_BE,
 140	},
 141	[HAL_RXDMA_DST] = {
 142		.start_ring_id = HAL_SRNG_RING_ID_WMAC1_RXDMA2SW0,
 143		.max_rings = 0,
 144		.entry_size = 0,
 145		.mac_type = ATH12K_HAL_SRNG_PMAC,
 146		.ring_dir = HAL_SRNG_DIR_DST,
 147		.max_size = HAL_RXDMA_RING_MAX_SIZE_BE,
 148	},
 149	[HAL_RXDMA_MONITOR_BUF] = {
 150		.start_ring_id = HAL_SRNG_SW2RXMON_BUF0,
 151		.max_rings = 1,
 152		.entry_size = sizeof(struct hal_mon_buf_ring) >> 2,
 153		.mac_type = ATH12K_HAL_SRNG_PMAC,
 154		.ring_dir = HAL_SRNG_DIR_SRC,
 155		.max_size = HAL_RXDMA_RING_MAX_SIZE_BE,
 156	},
 157	[HAL_RXDMA_MONITOR_STATUS] = { 0, },
 158	[HAL_RXDMA_MONITOR_DESC] = { 0, },
 159	[HAL_RXDMA_DIR_BUF] = {
 160		.start_ring_id = HAL_SRNG_RING_ID_RXDMA_DIR_BUF,
 161		.max_rings = 2,
 162		.entry_size = 8 >> 2, /* TODO: Define the struct */
 163		.mac_type = ATH12K_HAL_SRNG_PMAC,
 164		.ring_dir = HAL_SRNG_DIR_SRC,
 165		.max_size = HAL_RXDMA_RING_MAX_SIZE_BE,
 166	},
 167	[HAL_PPE2TCL] = {
 168		.start_ring_id = HAL_SRNG_RING_ID_PPE2TCL1,
 169		.max_rings = 1,
 170		.entry_size = sizeof(struct hal_tcl_entrance_from_ppe_ring) >> 2,
 171		.mac_type = ATH12K_HAL_SRNG_PMAC,
 172		.ring_dir = HAL_SRNG_DIR_SRC,
 173		.max_size = HAL_SW2TCL1_RING_BASE_MSB_RING_SIZE,
 174	},
 175	[HAL_PPE_RELEASE] = {
 176		.start_ring_id = HAL_SRNG_RING_ID_WBM_PPE_RELEASE,
 177		.max_rings = 1,
 178		.entry_size = sizeof(struct hal_wbm_release_ring) >> 2,
 179		.mac_type = ATH12K_HAL_SRNG_PMAC,
 180		.ring_dir = HAL_SRNG_DIR_SRC,
 181		.max_size = HAL_WBM2PPE_RELEASE_RING_BASE_MSB_RING_SIZE,
 182	},
 183	[HAL_TX_MONITOR_BUF] = {
 184		.start_ring_id = HAL_SRNG_SW2TXMON_BUF0,
 185		.max_rings = 1,
 186		.entry_size = sizeof(struct hal_mon_buf_ring) >> 2,
 187		.mac_type = ATH12K_HAL_SRNG_PMAC,
 188		.ring_dir = HAL_SRNG_DIR_SRC,
 189		.max_size = HAL_RXDMA_RING_MAX_SIZE_BE,
 190	},
 191	[HAL_RXDMA_MONITOR_DST] = {
 192		.start_ring_id = HAL_SRNG_RING_ID_WMAC1_SW2RXMON_BUF0,
 193		.max_rings = 1,
 194		.entry_size = sizeof(struct hal_mon_dest_desc) >> 2,
 195		.mac_type = ATH12K_HAL_SRNG_PMAC,
 196		.ring_dir = HAL_SRNG_DIR_DST,
 197		.max_size = HAL_RXDMA_RING_MAX_SIZE_BE,
 198	},
 199	[HAL_TX_MONITOR_DST] = {
 200		.start_ring_id = HAL_SRNG_RING_ID_WMAC1_TXMON2SW0_BUF0,
 201		.max_rings = 1,
 202		.entry_size = sizeof(struct hal_mon_dest_desc) >> 2,
 203		.mac_type = ATH12K_HAL_SRNG_PMAC,
 204		.ring_dir = HAL_SRNG_DIR_DST,
 205		.max_size = HAL_RXDMA_RING_MAX_SIZE_BE,
 206	}
 207};
 208
 209static const struct ath12k_hal_tcl_to_wbm_rbm_map
 210ath12k_hal_qcn9274_tcl_to_wbm_rbm_map[DP_TCL_NUM_RING_MAX] = {
 211	{
 212		.wbm_ring_num = 0,
 213		.rbm_id = HAL_RX_BUF_RBM_SW0_BM,
 214	},
 215	{
 216		.wbm_ring_num = 1,
 217		.rbm_id = HAL_RX_BUF_RBM_SW1_BM,
 218	},
 219	{
 220		.wbm_ring_num = 2,
 221		.rbm_id = HAL_RX_BUF_RBM_SW2_BM,
 222	},
 223	{
 224		.wbm_ring_num = 4,
 225		.rbm_id = HAL_RX_BUF_RBM_SW4_BM,
 226	}
 227};
 228
 229static const struct ath12k_hal_tcl_to_wbm_rbm_map
 230ath12k_hal_wcn7850_tcl_to_wbm_rbm_map[DP_TCL_NUM_RING_MAX] = {
 231	{
 232		.wbm_ring_num = 0,
 233		.rbm_id = HAL_RX_BUF_RBM_SW0_BM,
 234	},
 235	{
 236		.wbm_ring_num = 2,
 237		.rbm_id = HAL_RX_BUF_RBM_SW2_BM,
 238	},
 239	{
 240		.wbm_ring_num = 4,
 241		.rbm_id = HAL_RX_BUF_RBM_SW4_BM,
 242	},
 243};
 244
 245static unsigned int ath12k_hal_reo1_ring_id_offset(struct ath12k_base *ab)
 246{
 247	return HAL_REO1_RING_ID(ab) - HAL_REO1_RING_BASE_LSB(ab);
 248}
 249
 250static unsigned int ath12k_hal_reo1_ring_msi1_base_lsb_offset(struct ath12k_base *ab)
 251{
 252	return HAL_REO1_RING_MSI1_BASE_LSB(ab) - HAL_REO1_RING_BASE_LSB(ab);
 253}
 254
 255static unsigned int ath12k_hal_reo1_ring_msi1_base_msb_offset(struct ath12k_base *ab)
 256{
 257	return HAL_REO1_RING_MSI1_BASE_MSB(ab) - HAL_REO1_RING_BASE_LSB(ab);
 258}
 259
 260static unsigned int ath12k_hal_reo1_ring_msi1_data_offset(struct ath12k_base *ab)
 261{
 262	return HAL_REO1_RING_MSI1_DATA(ab) - HAL_REO1_RING_BASE_LSB(ab);
 263}
 264
 265static unsigned int ath12k_hal_reo1_ring_base_msb_offset(struct ath12k_base *ab)
 266{
 267	return HAL_REO1_RING_BASE_MSB(ab) - HAL_REO1_RING_BASE_LSB(ab);
 268}
 269
 270static unsigned int ath12k_hal_reo1_ring_producer_int_setup_offset(struct ath12k_base *ab)
 271{
 272	return HAL_REO1_RING_PRODUCER_INT_SETUP(ab) - HAL_REO1_RING_BASE_LSB(ab);
 273}
 274
 275static unsigned int ath12k_hal_reo1_ring_hp_addr_lsb_offset(struct ath12k_base *ab)
 276{
 277	return HAL_REO1_RING_HP_ADDR_LSB(ab) - HAL_REO1_RING_BASE_LSB(ab);
 278}
 279
 280static unsigned int ath12k_hal_reo1_ring_hp_addr_msb_offset(struct ath12k_base *ab)
 281{
 282	return HAL_REO1_RING_HP_ADDR_MSB(ab) - HAL_REO1_RING_BASE_LSB(ab);
 283}
 284
 285static unsigned int ath12k_hal_reo1_ring_misc_offset(struct ath12k_base *ab)
 286{
 287	return HAL_REO1_RING_MISC(ab) - HAL_REO1_RING_BASE_LSB(ab);
 288}
 289
 290static bool ath12k_hw_qcn9274_rx_desc_get_first_msdu(struct hal_rx_desc *desc)
 291{
 292	return !!le16_get_bits(desc->u.qcn9274.msdu_end.info5,
 293			       RX_MSDU_END_INFO5_FIRST_MSDU);
 294}
 295
 296static bool ath12k_hw_qcn9274_rx_desc_get_last_msdu(struct hal_rx_desc *desc)
 297{
 298	return !!le16_get_bits(desc->u.qcn9274.msdu_end.info5,
 299			       RX_MSDU_END_INFO5_LAST_MSDU);
 300}
 301
 302static u8 ath12k_hw_qcn9274_rx_desc_get_l3_pad_bytes(struct hal_rx_desc *desc)
 303{
 304	return le16_get_bits(desc->u.qcn9274.msdu_end.info5,
 305			     RX_MSDU_END_INFO5_L3_HDR_PADDING);
 306}
 307
 308static bool ath12k_hw_qcn9274_rx_desc_encrypt_valid(struct hal_rx_desc *desc)
 309{
 310	return !!le32_get_bits(desc->u.qcn9274.mpdu_start.info4,
 311			       RX_MPDU_START_INFO4_ENCRYPT_INFO_VALID);
 312}
 313
 314static u32 ath12k_hw_qcn9274_rx_desc_get_encrypt_type(struct hal_rx_desc *desc)
 315{
 316	return le32_get_bits(desc->u.qcn9274.mpdu_start.info2,
 317			     RX_MPDU_START_INFO2_ENC_TYPE);
 318}
 319
 320static u8 ath12k_hw_qcn9274_rx_desc_get_decap_type(struct hal_rx_desc *desc)
 321{
 322	return le32_get_bits(desc->u.qcn9274.msdu_end.info11,
 323			     RX_MSDU_END_INFO11_DECAP_FORMAT);
 324}
 325
 326static u8 ath12k_hw_qcn9274_rx_desc_get_mesh_ctl(struct hal_rx_desc *desc)
 327{
 328	return le32_get_bits(desc->u.qcn9274.msdu_end.info11,
 329			     RX_MSDU_END_INFO11_MESH_CTRL_PRESENT);
 330}
 331
 332static bool ath12k_hw_qcn9274_rx_desc_get_mpdu_seq_ctl_vld(struct hal_rx_desc *desc)
 333{
 334	return !!le32_get_bits(desc->u.qcn9274.mpdu_start.info4,
 335			       RX_MPDU_START_INFO4_MPDU_SEQ_CTRL_VALID);
 336}
 337
 338static bool ath12k_hw_qcn9274_rx_desc_get_mpdu_fc_valid(struct hal_rx_desc *desc)
 339{
 340	return !!le32_get_bits(desc->u.qcn9274.mpdu_start.info4,
 341			       RX_MPDU_START_INFO4_MPDU_FCTRL_VALID);
 342}
 343
 344static u16 ath12k_hw_qcn9274_rx_desc_get_mpdu_start_seq_no(struct hal_rx_desc *desc)
 345{
 346	return le32_get_bits(desc->u.qcn9274.mpdu_start.info4,
 347			     RX_MPDU_START_INFO4_MPDU_SEQ_NUM);
 348}
 349
 350static u16 ath12k_hw_qcn9274_rx_desc_get_msdu_len(struct hal_rx_desc *desc)
 351{
 352	return le32_get_bits(desc->u.qcn9274.msdu_end.info10,
 353			     RX_MSDU_END_INFO10_MSDU_LENGTH);
 354}
 355
 356static u8 ath12k_hw_qcn9274_rx_desc_get_msdu_sgi(struct hal_rx_desc *desc)
 357{
 358	return le32_get_bits(desc->u.qcn9274.msdu_end.info12,
 359			     RX_MSDU_END_INFO12_SGI);
 360}
 361
 362static u8 ath12k_hw_qcn9274_rx_desc_get_msdu_rate_mcs(struct hal_rx_desc *desc)
 363{
 364	return le32_get_bits(desc->u.qcn9274.msdu_end.info12,
 365			     RX_MSDU_END_INFO12_RATE_MCS);
 366}
 367
 368static u8 ath12k_hw_qcn9274_rx_desc_get_msdu_rx_bw(struct hal_rx_desc *desc)
 369{
 370	return le32_get_bits(desc->u.qcn9274.msdu_end.info12,
 371			     RX_MSDU_END_INFO12_RECV_BW);
 372}
 373
 374static u32 ath12k_hw_qcn9274_rx_desc_get_msdu_freq(struct hal_rx_desc *desc)
 375{
 376	return __le32_to_cpu(desc->u.qcn9274.msdu_end.phy_meta_data);
 377}
 378
 379static u8 ath12k_hw_qcn9274_rx_desc_get_msdu_pkt_type(struct hal_rx_desc *desc)
 380{
 381	return le32_get_bits(desc->u.qcn9274.msdu_end.info12,
 382			     RX_MSDU_END_INFO12_PKT_TYPE);
 383}
 384
 385static u8 ath12k_hw_qcn9274_rx_desc_get_msdu_nss(struct hal_rx_desc *desc)
 386{
 387	return le32_get_bits(desc->u.qcn9274.msdu_end.info12,
 388			     RX_MSDU_END_INFO12_MIMO_SS_BITMAP);
 389}
 390
 391static u8 ath12k_hw_qcn9274_rx_desc_get_mpdu_tid(struct hal_rx_desc *desc)
 392{
 393	return le16_get_bits(desc->u.qcn9274.msdu_end.info5,
 394			    RX_MSDU_END_INFO5_TID);
 395}
 396
 397static u16 ath12k_hw_qcn9274_rx_desc_get_mpdu_peer_id(struct hal_rx_desc *desc)
 398{
 399	return __le16_to_cpu(desc->u.qcn9274.mpdu_start.sw_peer_id);
 400}
 401
 402static void ath12k_hw_qcn9274_rx_desc_copy_end_tlv(struct hal_rx_desc *fdesc,
 403						   struct hal_rx_desc *ldesc)
 404{
 405	memcpy(&fdesc->u.qcn9274.msdu_end, &ldesc->u.qcn9274.msdu_end,
 406	       sizeof(struct rx_msdu_end_qcn9274));
 407}
 408
 409static u32 ath12k_hw_qcn9274_rx_desc_get_mpdu_ppdu_id(struct hal_rx_desc *desc)
 410{
 411	return __le16_to_cpu(desc->u.qcn9274.mpdu_start.phy_ppdu_id);
 412}
 413
 414static void ath12k_hw_qcn9274_rx_desc_set_msdu_len(struct hal_rx_desc *desc, u16 len)
 415{
 416	u32 info = __le32_to_cpu(desc->u.qcn9274.msdu_end.info10);
 417
 418	info &= ~RX_MSDU_END_INFO10_MSDU_LENGTH;
 419	info |= u32_encode_bits(len, RX_MSDU_END_INFO10_MSDU_LENGTH);
 420
 421	desc->u.qcn9274.msdu_end.info10 = __cpu_to_le32(info);
 422}
 423
 424static u8 *ath12k_hw_qcn9274_rx_desc_get_msdu_payload(struct hal_rx_desc *desc)
 425{
 426	return &desc->u.qcn9274.msdu_payload[0];
 427}
 428
 429static u32 ath12k_hw_qcn9274_rx_desc_get_mpdu_start_offset(void)
 430{
 431	return offsetof(struct hal_rx_desc_qcn9274, mpdu_start);
 432}
 433
 434static u32 ath12k_hw_qcn9274_rx_desc_get_msdu_end_offset(void)
 435{
 436	return offsetof(struct hal_rx_desc_qcn9274, msdu_end);
 437}
 438
 439static bool ath12k_hw_qcn9274_rx_desc_mac_addr2_valid(struct hal_rx_desc *desc)
 440{
 441	return __le32_to_cpu(desc->u.qcn9274.mpdu_start.info4) &
 442	       RX_MPDU_START_INFO4_MAC_ADDR2_VALID;
 443}
 444
 445static u8 *ath12k_hw_qcn9274_rx_desc_mpdu_start_addr2(struct hal_rx_desc *desc)
 446{
 447	return desc->u.qcn9274.mpdu_start.addr2;
 448}
 449
 450static bool ath12k_hw_qcn9274_rx_desc_is_da_mcbc(struct hal_rx_desc *desc)
 451{
 452	return __le32_to_cpu(desc->u.qcn9274.mpdu_start.info6) &
 453	       RX_MPDU_START_INFO6_MCAST_BCAST;
 454}
 455
 456static void ath12k_hw_qcn9274_rx_desc_get_dot11_hdr(struct hal_rx_desc *desc,
 457						    struct ieee80211_hdr *hdr)
 458{
 459	hdr->frame_control = desc->u.qcn9274.mpdu_start.frame_ctrl;
 460	hdr->duration_id = desc->u.qcn9274.mpdu_start.duration;
 461	ether_addr_copy(hdr->addr1, desc->u.qcn9274.mpdu_start.addr1);
 462	ether_addr_copy(hdr->addr2, desc->u.qcn9274.mpdu_start.addr2);
 463	ether_addr_copy(hdr->addr3, desc->u.qcn9274.mpdu_start.addr3);
 464	if (__le32_to_cpu(desc->u.qcn9274.mpdu_start.info4) &
 465			RX_MPDU_START_INFO4_MAC_ADDR4_VALID) {
 466		ether_addr_copy(hdr->addr4, desc->u.qcn9274.mpdu_start.addr4);
 467	}
 468	hdr->seq_ctrl = desc->u.qcn9274.mpdu_start.seq_ctrl;
 469}
 470
 471static void ath12k_hw_qcn9274_rx_desc_get_crypto_hdr(struct hal_rx_desc *desc,
 472						     u8 *crypto_hdr,
 473						     enum hal_encrypt_type enctype)
 474{
 475	unsigned int key_id;
 476
 477	switch (enctype) {
 478	case HAL_ENCRYPT_TYPE_OPEN:
 479		return;
 480	case HAL_ENCRYPT_TYPE_TKIP_NO_MIC:
 481	case HAL_ENCRYPT_TYPE_TKIP_MIC:
 482		crypto_hdr[0] =
 483			HAL_RX_MPDU_INFO_PN_GET_BYTE2(desc->u.qcn9274.mpdu_start.pn[0]);
 484		crypto_hdr[1] = 0;
 485		crypto_hdr[2] =
 486			HAL_RX_MPDU_INFO_PN_GET_BYTE1(desc->u.qcn9274.mpdu_start.pn[0]);
 487		break;
 488	case HAL_ENCRYPT_TYPE_CCMP_128:
 489	case HAL_ENCRYPT_TYPE_CCMP_256:
 490	case HAL_ENCRYPT_TYPE_GCMP_128:
 491	case HAL_ENCRYPT_TYPE_AES_GCMP_256:
 492		crypto_hdr[0] =
 493			HAL_RX_MPDU_INFO_PN_GET_BYTE1(desc->u.qcn9274.mpdu_start.pn[0]);
 494		crypto_hdr[1] =
 495			HAL_RX_MPDU_INFO_PN_GET_BYTE2(desc->u.qcn9274.mpdu_start.pn[0]);
 496		crypto_hdr[2] = 0;
 497		break;
 498	case HAL_ENCRYPT_TYPE_WEP_40:
 499	case HAL_ENCRYPT_TYPE_WEP_104:
 500	case HAL_ENCRYPT_TYPE_WEP_128:
 501	case HAL_ENCRYPT_TYPE_WAPI_GCM_SM4:
 502	case HAL_ENCRYPT_TYPE_WAPI:
 503		return;
 504	}
 505	key_id = le32_get_bits(desc->u.qcn9274.mpdu_start.info5,
 506			       RX_MPDU_START_INFO5_KEY_ID);
 507	crypto_hdr[3] = 0x20 | (key_id << 6);
 508	crypto_hdr[4] = HAL_RX_MPDU_INFO_PN_GET_BYTE3(desc->u.qcn9274.mpdu_start.pn[0]);
 509	crypto_hdr[5] = HAL_RX_MPDU_INFO_PN_GET_BYTE4(desc->u.qcn9274.mpdu_start.pn[0]);
 510	crypto_hdr[6] = HAL_RX_MPDU_INFO_PN_GET_BYTE1(desc->u.qcn9274.mpdu_start.pn[1]);
 511	crypto_hdr[7] = HAL_RX_MPDU_INFO_PN_GET_BYTE2(desc->u.qcn9274.mpdu_start.pn[1]);
 512}
 513
 514static u16 ath12k_hw_qcn9274_rx_desc_get_mpdu_frame_ctl(struct hal_rx_desc *desc)
 515{
 516	return __le16_to_cpu(desc->u.qcn9274.mpdu_start.frame_ctrl);
 517}
 518
 519static int ath12k_hal_srng_create_config_qcn9274(struct ath12k_base *ab)
 520{
 521	struct ath12k_hal *hal = &ab->hal;
 522	struct hal_srng_config *s;
 523
 524	hal->srng_config = kmemdup(hw_srng_config_template,
 525				   sizeof(hw_srng_config_template),
 526				   GFP_KERNEL);
 527	if (!hal->srng_config)
 528		return -ENOMEM;
 529
 530	s = &hal->srng_config[HAL_REO_DST];
 531	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO1_RING_BASE_LSB(ab);
 532	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO1_RING_HP;
 533	s->reg_size[0] = HAL_REO2_RING_BASE_LSB(ab) - HAL_REO1_RING_BASE_LSB(ab);
 534	s->reg_size[1] = HAL_REO2_RING_HP - HAL_REO1_RING_HP;
 535
 536	s = &hal->srng_config[HAL_REO_EXCEPTION];
 537	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_SW0_RING_BASE_LSB(ab);
 538	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_SW0_RING_HP;
 539
 540	s = &hal->srng_config[HAL_REO_REINJECT];
 541	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_SW2REO_RING_BASE_LSB(ab);
 542	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_SW2REO_RING_HP;
 543	s->reg_size[0] = HAL_SW2REO1_RING_BASE_LSB(ab) - HAL_SW2REO_RING_BASE_LSB(ab);
 544	s->reg_size[1] = HAL_SW2REO1_RING_HP - HAL_SW2REO_RING_HP;
 545
 546	s = &hal->srng_config[HAL_REO_CMD];
 547	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_CMD_RING_BASE_LSB(ab);
 548	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_CMD_HP;
 549
 550	s = &hal->srng_config[HAL_REO_STATUS];
 551	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_STATUS_RING_BASE_LSB(ab);
 552	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_STATUS_HP;
 553
 554	s = &hal->srng_config[HAL_TCL_DATA];
 555	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL1_RING_BASE_LSB;
 556	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL1_RING_HP;
 557	s->reg_size[0] = HAL_TCL2_RING_BASE_LSB - HAL_TCL1_RING_BASE_LSB;
 558	s->reg_size[1] = HAL_TCL2_RING_HP - HAL_TCL1_RING_HP;
 559
 560	s = &hal->srng_config[HAL_TCL_CMD];
 561	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL_RING_BASE_LSB(ab);
 562	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL_RING_HP;
 563
 564	s = &hal->srng_config[HAL_TCL_STATUS];
 565	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL_STATUS_RING_BASE_LSB(ab);
 566	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL_STATUS_RING_HP;
 567
 568	s = &hal->srng_config[HAL_CE_SRC];
 569	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG + HAL_CE_DST_RING_BASE_LSB;
 570	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG + HAL_CE_DST_RING_HP;
 571	s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_SRC_REG -
 572		HAL_SEQ_WCSS_UMAC_CE0_SRC_REG;
 573	s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_SRC_REG -
 574		HAL_SEQ_WCSS_UMAC_CE0_SRC_REG;
 575
 576	s = &hal->srng_config[HAL_CE_DST];
 577	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG + HAL_CE_DST_RING_BASE_LSB;
 578	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG + HAL_CE_DST_RING_HP;
 579	s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG -
 580		HAL_SEQ_WCSS_UMAC_CE0_DST_REG;
 581	s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG -
 582		HAL_SEQ_WCSS_UMAC_CE0_DST_REG;
 583
 584	s = &hal->srng_config[HAL_CE_DST_STATUS];
 585	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG +
 586		HAL_CE_DST_STATUS_RING_BASE_LSB;
 587	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG + HAL_CE_DST_STATUS_RING_HP;
 588	s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG -
 589		HAL_SEQ_WCSS_UMAC_CE0_DST_REG;
 590	s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG -
 591		HAL_SEQ_WCSS_UMAC_CE0_DST_REG;
 592
 593	s = &hal->srng_config[HAL_WBM_IDLE_LINK];
 594	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_WBM_REG + HAL_WBM_IDLE_LINK_RING_BASE_LSB(ab);
 595	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_WBM_REG + HAL_WBM_IDLE_LINK_RING_HP;
 596
 597	s = &hal->srng_config[HAL_SW2WBM_RELEASE];
 598	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_WBM_REG +
 599		HAL_WBM_SW_RELEASE_RING_BASE_LSB(ab);
 600	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_WBM_REG + HAL_WBM_SW_RELEASE_RING_HP;
 601	s->reg_size[0] = HAL_WBM_SW1_RELEASE_RING_BASE_LSB(ab) -
 602			 HAL_WBM_SW_RELEASE_RING_BASE_LSB(ab);
 603	s->reg_size[1] = HAL_WBM_SW1_RELEASE_RING_HP - HAL_WBM_SW_RELEASE_RING_HP;
 604
 605	s = &hal->srng_config[HAL_WBM2SW_RELEASE];
 606	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_WBM_REG + HAL_WBM0_RELEASE_RING_BASE_LSB(ab);
 607	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_WBM_REG + HAL_WBM0_RELEASE_RING_HP;
 608	s->reg_size[0] = HAL_WBM1_RELEASE_RING_BASE_LSB(ab) -
 609		HAL_WBM0_RELEASE_RING_BASE_LSB(ab);
 610	s->reg_size[1] = HAL_WBM1_RELEASE_RING_HP - HAL_WBM0_RELEASE_RING_HP;
 611
 612	/* Some LMAC rings are not accessed from the host:
 613	 * RXDMA_BUG, RXDMA_DST, RXDMA_MONITOR_BUF, RXDMA_MONITOR_STATUS,
 614	 * RXDMA_MONITOR_DST, RXDMA_MONITOR_DESC, RXDMA_DIR_BUF_SRC,
 615	 * RXDMA_RX_MONITOR_BUF, TX_MONITOR_BUF, TX_MONITOR_DST, SW2RXDMA
 616	 */
 617	s = &hal->srng_config[HAL_PPE2TCL];
 618	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL_PPE2TCL1_RING_BASE_LSB;
 619	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL_PPE2TCL1_RING_HP;
 620
 621	s = &hal->srng_config[HAL_PPE_RELEASE];
 622	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_WBM_REG +
 623				HAL_WBM_PPE_RELEASE_RING_BASE_LSB(ab);
 624	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_WBM_REG + HAL_WBM_PPE_RELEASE_RING_HP;
 625
 626	return 0;
 627}
 628
 629static u16 ath12k_hal_qcn9274_rx_mpdu_start_wmask_get(void)
 630{
 631	return QCN9274_MPDU_START_WMASK;
 632}
 633
 634static u32 ath12k_hal_qcn9274_rx_msdu_end_wmask_get(void)
 635{
 636	return QCN9274_MSDU_END_WMASK;
 637}
 638
 639static const struct hal_rx_ops *ath12k_hal_qcn9274_get_hal_rx_compact_ops(void)
 640{
 641	return &hal_rx_qcn9274_compact_ops;
 642}
 643
 644static bool ath12k_hw_qcn9274_dp_rx_h_msdu_done(struct hal_rx_desc *desc)
 645{
 646	return !!le32_get_bits(desc->u.qcn9274.msdu_end.info14,
 647			       RX_MSDU_END_INFO14_MSDU_DONE);
 648}
 649
 650static bool ath12k_hw_qcn9274_dp_rx_h_l4_cksum_fail(struct hal_rx_desc *desc)
 651{
 652	return !!le32_get_bits(desc->u.qcn9274.msdu_end.info13,
 653			       RX_MSDU_END_INFO13_TCP_UDP_CKSUM_FAIL);
 654}
 655
 656static bool ath12k_hw_qcn9274_dp_rx_h_ip_cksum_fail(struct hal_rx_desc *desc)
 657{
 658	return !!le32_get_bits(desc->u.qcn9274.msdu_end.info13,
 659			       RX_MSDU_END_INFO13_IP_CKSUM_FAIL);
 660}
 661
 662static bool ath12k_hw_qcn9274_dp_rx_h_is_decrypted(struct hal_rx_desc *desc)
 663{
 664	return (le32_get_bits(desc->u.qcn9274.msdu_end.info14,
 665			      RX_MSDU_END_INFO14_DECRYPT_STATUS_CODE) ==
 666			      RX_DESC_DECRYPT_STATUS_CODE_OK);
 667}
 668
 669static u32 ath12k_hw_qcn9274_dp_rx_h_mpdu_err(struct hal_rx_desc *desc)
 670{
 671	u32 info = __le32_to_cpu(desc->u.qcn9274.msdu_end.info13);
 672	u32 errmap = 0;
 673
 674	if (info & RX_MSDU_END_INFO13_FCS_ERR)
 675		errmap |= HAL_RX_MPDU_ERR_FCS;
 676
 677	if (info & RX_MSDU_END_INFO13_DECRYPT_ERR)
 678		errmap |= HAL_RX_MPDU_ERR_DECRYPT;
 679
 680	if (info & RX_MSDU_END_INFO13_TKIP_MIC_ERR)
 681		errmap |= HAL_RX_MPDU_ERR_TKIP_MIC;
 682
 683	if (info & RX_MSDU_END_INFO13_A_MSDU_ERROR)
 684		errmap |= HAL_RX_MPDU_ERR_AMSDU_ERR;
 685
 686	if (info & RX_MSDU_END_INFO13_OVERFLOW_ERR)
 687		errmap |= HAL_RX_MPDU_ERR_OVERFLOW;
 688
 689	if (info & RX_MSDU_END_INFO13_MSDU_LEN_ERR)
 690		errmap |= HAL_RX_MPDU_ERR_MSDU_LEN;
 691
 692	if (info & RX_MSDU_END_INFO13_MPDU_LEN_ERR)
 693		errmap |= HAL_RX_MPDU_ERR_MPDU_LEN;
 694
 695	return errmap;
 696}
 697
 698static u32 ath12k_hw_qcn9274_get_rx_desc_size(void)
 699{
 700	return sizeof(struct hal_rx_desc_qcn9274);
 701}
 702
 703static u8 ath12k_hw_qcn9274_rx_desc_get_msdu_src_link(struct hal_rx_desc *desc)
 704{
 705	return 0;
 706}
 707
 708const struct hal_rx_ops hal_rx_qcn9274_ops = {
 709	.rx_desc_get_first_msdu = ath12k_hw_qcn9274_rx_desc_get_first_msdu,
 710	.rx_desc_get_last_msdu = ath12k_hw_qcn9274_rx_desc_get_last_msdu,
 711	.rx_desc_get_l3_pad_bytes = ath12k_hw_qcn9274_rx_desc_get_l3_pad_bytes,
 712	.rx_desc_encrypt_valid = ath12k_hw_qcn9274_rx_desc_encrypt_valid,
 713	.rx_desc_get_encrypt_type = ath12k_hw_qcn9274_rx_desc_get_encrypt_type,
 714	.rx_desc_get_decap_type = ath12k_hw_qcn9274_rx_desc_get_decap_type,
 715	.rx_desc_get_mesh_ctl = ath12k_hw_qcn9274_rx_desc_get_mesh_ctl,
 716	.rx_desc_get_mpdu_seq_ctl_vld = ath12k_hw_qcn9274_rx_desc_get_mpdu_seq_ctl_vld,
 717	.rx_desc_get_mpdu_fc_valid = ath12k_hw_qcn9274_rx_desc_get_mpdu_fc_valid,
 718	.rx_desc_get_mpdu_start_seq_no = ath12k_hw_qcn9274_rx_desc_get_mpdu_start_seq_no,
 719	.rx_desc_get_msdu_len = ath12k_hw_qcn9274_rx_desc_get_msdu_len,
 720	.rx_desc_get_msdu_sgi = ath12k_hw_qcn9274_rx_desc_get_msdu_sgi,
 721	.rx_desc_get_msdu_rate_mcs = ath12k_hw_qcn9274_rx_desc_get_msdu_rate_mcs,
 722	.rx_desc_get_msdu_rx_bw = ath12k_hw_qcn9274_rx_desc_get_msdu_rx_bw,
 723	.rx_desc_get_msdu_freq = ath12k_hw_qcn9274_rx_desc_get_msdu_freq,
 724	.rx_desc_get_msdu_pkt_type = ath12k_hw_qcn9274_rx_desc_get_msdu_pkt_type,
 725	.rx_desc_get_msdu_nss = ath12k_hw_qcn9274_rx_desc_get_msdu_nss,
 726	.rx_desc_get_mpdu_tid = ath12k_hw_qcn9274_rx_desc_get_mpdu_tid,
 727	.rx_desc_get_mpdu_peer_id = ath12k_hw_qcn9274_rx_desc_get_mpdu_peer_id,
 728	.rx_desc_copy_end_tlv = ath12k_hw_qcn9274_rx_desc_copy_end_tlv,
 729	.rx_desc_get_mpdu_ppdu_id = ath12k_hw_qcn9274_rx_desc_get_mpdu_ppdu_id,
 730	.rx_desc_set_msdu_len = ath12k_hw_qcn9274_rx_desc_set_msdu_len,
 731	.rx_desc_get_msdu_payload = ath12k_hw_qcn9274_rx_desc_get_msdu_payload,
 732	.rx_desc_get_mpdu_start_offset = ath12k_hw_qcn9274_rx_desc_get_mpdu_start_offset,
 733	.rx_desc_get_msdu_end_offset = ath12k_hw_qcn9274_rx_desc_get_msdu_end_offset,
 734	.rx_desc_mac_addr2_valid = ath12k_hw_qcn9274_rx_desc_mac_addr2_valid,
 735	.rx_desc_mpdu_start_addr2 = ath12k_hw_qcn9274_rx_desc_mpdu_start_addr2,
 736	.rx_desc_is_da_mcbc = ath12k_hw_qcn9274_rx_desc_is_da_mcbc,
 737	.rx_desc_get_dot11_hdr = ath12k_hw_qcn9274_rx_desc_get_dot11_hdr,
 738	.rx_desc_get_crypto_header = ath12k_hw_qcn9274_rx_desc_get_crypto_hdr,
 739	.rx_desc_get_mpdu_frame_ctl = ath12k_hw_qcn9274_rx_desc_get_mpdu_frame_ctl,
 740	.dp_rx_h_msdu_done = ath12k_hw_qcn9274_dp_rx_h_msdu_done,
 741	.dp_rx_h_l4_cksum_fail = ath12k_hw_qcn9274_dp_rx_h_l4_cksum_fail,
 742	.dp_rx_h_ip_cksum_fail = ath12k_hw_qcn9274_dp_rx_h_ip_cksum_fail,
 743	.dp_rx_h_is_decrypted = ath12k_hw_qcn9274_dp_rx_h_is_decrypted,
 744	.dp_rx_h_mpdu_err = ath12k_hw_qcn9274_dp_rx_h_mpdu_err,
 745	.rx_desc_get_desc_size = ath12k_hw_qcn9274_get_rx_desc_size,
 746	.rx_desc_get_msdu_src_link_id = ath12k_hw_qcn9274_rx_desc_get_msdu_src_link,
 747};
 748
 749static bool ath12k_hw_qcn9274_compact_rx_desc_get_first_msdu(struct hal_rx_desc *desc)
 750{
 751	return !!le16_get_bits(desc->u.qcn9274_compact.msdu_end.info5,
 752			       RX_MSDU_END_INFO5_FIRST_MSDU);
 753}
 754
 755static bool ath12k_hw_qcn9274_compact_rx_desc_get_last_msdu(struct hal_rx_desc *desc)
 756{
 757	return !!le16_get_bits(desc->u.qcn9274_compact.msdu_end.info5,
 758			       RX_MSDU_END_INFO5_LAST_MSDU);
 759}
 760
 761static u8 ath12k_hw_qcn9274_compact_rx_desc_get_l3_pad_bytes(struct hal_rx_desc *desc)
 762{
 763	return le16_get_bits(desc->u.qcn9274_compact.msdu_end.info5,
 764			     RX_MSDU_END_INFO5_L3_HDR_PADDING);
 765}
 766
 767static bool ath12k_hw_qcn9274_compact_rx_desc_encrypt_valid(struct hal_rx_desc *desc)
 768{
 769	return !!le32_get_bits(desc->u.qcn9274_compact.mpdu_start.info4,
 770			       RX_MPDU_START_INFO4_ENCRYPT_INFO_VALID);
 771}
 772
 773static u32 ath12k_hw_qcn9274_compact_rx_desc_get_encrypt_type(struct hal_rx_desc *desc)
 774{
 775	return le32_get_bits(desc->u.qcn9274_compact.mpdu_start.info2,
 776			     RX_MPDU_START_INFO2_ENC_TYPE);
 777}
 778
 779static u8 ath12k_hw_qcn9274_compact_rx_desc_get_decap_type(struct hal_rx_desc *desc)
 780{
 781	return le32_get_bits(desc->u.qcn9274_compact.msdu_end.info11,
 782			     RX_MSDU_END_INFO11_DECAP_FORMAT);
 783}
 784
 785static u8 ath12k_hw_qcn9274_compact_rx_desc_get_mesh_ctl(struct hal_rx_desc *desc)
 786{
 787	return le32_get_bits(desc->u.qcn9274.msdu_end.info11,
 788			     RX_MSDU_END_INFO11_MESH_CTRL_PRESENT);
 789}
 790
 791static bool
 792ath12k_hw_qcn9274_compact_rx_desc_get_mpdu_seq_ctl_vld(struct hal_rx_desc *desc)
 793{
 794	return !!le32_get_bits(desc->u.qcn9274_compact.mpdu_start.info4,
 795			       RX_MPDU_START_INFO4_MPDU_SEQ_CTRL_VALID);
 796}
 797
 798static bool ath12k_hw_qcn9274_compact_rx_desc_get_mpdu_fc_valid(struct hal_rx_desc *desc)
 799{
 800	return !!le32_get_bits(desc->u.qcn9274_compact.mpdu_start.info4,
 801			       RX_MPDU_START_INFO4_MPDU_FCTRL_VALID);
 802}
 803
 804static u16
 805ath12k_hw_qcn9274_compact_rx_desc_get_mpdu_start_seq_no(struct hal_rx_desc *desc)
 806{
 807	return le32_get_bits(desc->u.qcn9274_compact.mpdu_start.info4,
 808			     RX_MPDU_START_INFO4_MPDU_SEQ_NUM);
 809}
 810
 811static u16 ath12k_hw_qcn9274_compact_rx_desc_get_msdu_len(struct hal_rx_desc *desc)
 812{
 813	return le32_get_bits(desc->u.qcn9274_compact.msdu_end.info10,
 814			     RX_MSDU_END_INFO10_MSDU_LENGTH);
 815}
 816
 817static u8 ath12k_hw_qcn9274_compact_rx_desc_get_msdu_sgi(struct hal_rx_desc *desc)
 818{
 819	return le32_get_bits(desc->u.qcn9274_compact.msdu_end.info12,
 820			     RX_MSDU_END_INFO12_SGI);
 821}
 822
 823static u8 ath12k_hw_qcn9274_compact_rx_desc_get_msdu_rate_mcs(struct hal_rx_desc *desc)
 824{
 825	return le32_get_bits(desc->u.qcn9274_compact.msdu_end.info12,
 826			     RX_MSDU_END_INFO12_RATE_MCS);
 827}
 828
 829static u8 ath12k_hw_qcn9274_compact_rx_desc_get_msdu_rx_bw(struct hal_rx_desc *desc)
 830{
 831	return le32_get_bits(desc->u.qcn9274_compact.msdu_end.info12,
 832			     RX_MSDU_END_INFO12_RECV_BW);
 833}
 834
 835static u32 ath12k_hw_qcn9274_compact_rx_desc_get_msdu_freq(struct hal_rx_desc *desc)
 836{
 837	return __le32_to_cpu(desc->u.qcn9274_compact.msdu_end.phy_meta_data);
 838}
 839
 840static u8 ath12k_hw_qcn9274_compact_rx_desc_get_msdu_pkt_type(struct hal_rx_desc *desc)
 841{
 842	return le32_get_bits(desc->u.qcn9274_compact.msdu_end.info12,
 843			     RX_MSDU_END_INFO12_PKT_TYPE);
 844}
 845
 846static u8 ath12k_hw_qcn9274_compact_rx_desc_get_msdu_nss(struct hal_rx_desc *desc)
 847{
 848	return le32_get_bits(desc->u.qcn9274_compact.msdu_end.info12,
 849			     RX_MSDU_END_INFO12_MIMO_SS_BITMAP);
 850}
 851
 852static u8 ath12k_hw_qcn9274_compact_rx_desc_get_mpdu_tid(struct hal_rx_desc *desc)
 853{
 854	return le16_get_bits(desc->u.qcn9274_compact.msdu_end.info5,
 855			     RX_MSDU_END_INFO5_TID);
 856}
 857
 858static u16 ath12k_hw_qcn9274_compact_rx_desc_get_mpdu_peer_id(struct hal_rx_desc *desc)
 859{
 860	return __le16_to_cpu(desc->u.qcn9274_compact.mpdu_start.sw_peer_id);
 861}
 862
 863static void ath12k_hw_qcn9274_compact_rx_desc_copy_end_tlv(struct hal_rx_desc *fdesc,
 864							   struct hal_rx_desc *ldesc)
 865{
 866	fdesc->u.qcn9274_compact.msdu_end = ldesc->u.qcn9274_compact.msdu_end;
 867}
 868
 869static u32 ath12k_hw_qcn9274_compact_rx_desc_get_mpdu_ppdu_id(struct hal_rx_desc *desc)
 870{
 871	return __le16_to_cpu(desc->u.qcn9274_compact.mpdu_start.phy_ppdu_id);
 872}
 873
 874static void
 875ath12k_hw_qcn9274_compact_rx_desc_set_msdu_len(struct hal_rx_desc *desc, u16 len)
 876{
 877	u32 info = __le32_to_cpu(desc->u.qcn9274_compact.msdu_end.info10);
 878
 879	info = u32_replace_bits(info, len, RX_MSDU_END_INFO10_MSDU_LENGTH);
 880	desc->u.qcn9274_compact.msdu_end.info10 = __cpu_to_le32(info);
 881}
 882
 883static u8 *ath12k_hw_qcn9274_compact_rx_desc_get_msdu_payload(struct hal_rx_desc *desc)
 884{
 885	return &desc->u.qcn9274_compact.msdu_payload[0];
 886}
 887
 888static u32 ath12k_hw_qcn9274_compact_rx_desc_get_mpdu_start_offset(void)
 889{
 890	return offsetof(struct hal_rx_desc_qcn9274_compact, mpdu_start);
 891}
 892
 893static u32 ath12k_hw_qcn9274_compact_rx_desc_get_msdu_end_offset(void)
 894{
 895	return offsetof(struct hal_rx_desc_qcn9274_compact, msdu_end);
 896}
 897
 898static bool ath12k_hw_qcn9274_compact_rx_desc_mac_addr2_valid(struct hal_rx_desc *desc)
 899{
 900	return __le32_to_cpu(desc->u.qcn9274_compact.mpdu_start.info4) &
 901			     RX_MPDU_START_INFO4_MAC_ADDR2_VALID;
 902}
 903
 904static u8 *ath12k_hw_qcn9274_compact_rx_desc_mpdu_start_addr2(struct hal_rx_desc *desc)
 905{
 906	return desc->u.qcn9274_compact.mpdu_start.addr2;
 907}
 908
 909static bool ath12k_hw_qcn9274_compact_rx_desc_is_da_mcbc(struct hal_rx_desc *desc)
 910{
 911	return __le32_to_cpu(desc->u.qcn9274_compact.mpdu_start.info6) &
 912	       RX_MPDU_START_INFO6_MCAST_BCAST;
 913}
 914
 915static void ath12k_hw_qcn9274_compact_rx_desc_get_dot11_hdr(struct hal_rx_desc *desc,
 916							    struct ieee80211_hdr *hdr)
 917{
 918	hdr->frame_control = desc->u.qcn9274_compact.mpdu_start.frame_ctrl;
 919	hdr->duration_id = desc->u.qcn9274_compact.mpdu_start.duration;
 920	ether_addr_copy(hdr->addr1, desc->u.qcn9274_compact.mpdu_start.addr1);
 921	ether_addr_copy(hdr->addr2, desc->u.qcn9274_compact.mpdu_start.addr2);
 922	ether_addr_copy(hdr->addr3, desc->u.qcn9274_compact.mpdu_start.addr3);
 923	if (__le32_to_cpu(desc->u.qcn9274_compact.mpdu_start.info4) &
 924			RX_MPDU_START_INFO4_MAC_ADDR4_VALID) {
 925		ether_addr_copy(hdr->addr4, desc->u.qcn9274_compact.mpdu_start.addr4);
 926	}
 927	hdr->seq_ctrl = desc->u.qcn9274_compact.mpdu_start.seq_ctrl;
 928}
 929
 930static void
 931ath12k_hw_qcn9274_compact_rx_desc_get_crypto_hdr(struct hal_rx_desc *desc,
 932						 u8 *crypto_hdr,
 933						 enum hal_encrypt_type enctype)
 934{
 935	unsigned int key_id;
 936
 937	switch (enctype) {
 938	case HAL_ENCRYPT_TYPE_OPEN:
 939		return;
 940	case HAL_ENCRYPT_TYPE_TKIP_NO_MIC:
 941	case HAL_ENCRYPT_TYPE_TKIP_MIC:
 942		crypto_hdr[0] =
 943		HAL_RX_MPDU_INFO_PN_GET_BYTE2(desc->u.qcn9274_compact.mpdu_start.pn[0]);
 944		crypto_hdr[1] = 0;
 945		crypto_hdr[2] =
 946		HAL_RX_MPDU_INFO_PN_GET_BYTE1(desc->u.qcn9274_compact.mpdu_start.pn[0]);
 947		break;
 948	case HAL_ENCRYPT_TYPE_CCMP_128:
 949	case HAL_ENCRYPT_TYPE_CCMP_256:
 950	case HAL_ENCRYPT_TYPE_GCMP_128:
 951	case HAL_ENCRYPT_TYPE_AES_GCMP_256:
 952		crypto_hdr[0] =
 953		HAL_RX_MPDU_INFO_PN_GET_BYTE1(desc->u.qcn9274_compact.mpdu_start.pn[0]);
 954		crypto_hdr[1] =
 955		HAL_RX_MPDU_INFO_PN_GET_BYTE2(desc->u.qcn9274_compact.mpdu_start.pn[0]);
 956		crypto_hdr[2] = 0;
 957		break;
 958	case HAL_ENCRYPT_TYPE_WEP_40:
 959	case HAL_ENCRYPT_TYPE_WEP_104:
 960	case HAL_ENCRYPT_TYPE_WEP_128:
 961	case HAL_ENCRYPT_TYPE_WAPI_GCM_SM4:
 962	case HAL_ENCRYPT_TYPE_WAPI:
 963		return;
 964	}
 965	key_id = le32_get_bits(desc->u.qcn9274_compact.mpdu_start.info5,
 966			       RX_MPDU_START_INFO5_KEY_ID);
 967	crypto_hdr[3] = 0x20 | (key_id << 6);
 968	crypto_hdr[4] =
 969		HAL_RX_MPDU_INFO_PN_GET_BYTE3(desc->u.qcn9274_compact.mpdu_start.pn[0]);
 970	crypto_hdr[5] =
 971		HAL_RX_MPDU_INFO_PN_GET_BYTE4(desc->u.qcn9274_compact.mpdu_start.pn[0]);
 972	crypto_hdr[6] =
 973		HAL_RX_MPDU_INFO_PN_GET_BYTE1(desc->u.qcn9274_compact.mpdu_start.pn[1]);
 974	crypto_hdr[7] =
 975		HAL_RX_MPDU_INFO_PN_GET_BYTE2(desc->u.qcn9274_compact.mpdu_start.pn[1]);
 976}
 977
 978static u16 ath12k_hw_qcn9274_compact_rx_desc_get_mpdu_frame_ctl(struct hal_rx_desc *desc)
 979{
 980	return __le16_to_cpu(desc->u.qcn9274_compact.mpdu_start.frame_ctrl);
 981}
 982
 983static bool ath12k_hw_qcn9274_compact_dp_rx_h_msdu_done(struct hal_rx_desc *desc)
 984{
 985	return !!le32_get_bits(desc->u.qcn9274_compact.msdu_end.info14,
 986			       RX_MSDU_END_INFO14_MSDU_DONE);
 987}
 988
 989static bool ath12k_hw_qcn9274_compact_dp_rx_h_l4_cksum_fail(struct hal_rx_desc *desc)
 990{
 991	return !!le32_get_bits(desc->u.qcn9274_compact.msdu_end.info13,
 992			       RX_MSDU_END_INFO13_TCP_UDP_CKSUM_FAIL);
 993}
 994
 995static bool ath12k_hw_qcn9274_compact_dp_rx_h_ip_cksum_fail(struct hal_rx_desc *desc)
 996{
 997	return !!le32_get_bits(desc->u.qcn9274_compact.msdu_end.info13,
 998			       RX_MSDU_END_INFO13_IP_CKSUM_FAIL);
 999}
1000
1001static bool ath12k_hw_qcn9274_compact_dp_rx_h_is_decrypted(struct hal_rx_desc *desc)
1002{
1003	return (le32_get_bits(desc->u.qcn9274_compact.msdu_end.info14,
1004			      RX_MSDU_END_INFO14_DECRYPT_STATUS_CODE) ==
1005			RX_DESC_DECRYPT_STATUS_CODE_OK);
1006}
1007
1008static u32 ath12k_hw_qcn9274_compact_dp_rx_h_mpdu_err(struct hal_rx_desc *desc)
1009{
1010	u32 info = __le32_to_cpu(desc->u.qcn9274_compact.msdu_end.info13);
1011	u32 errmap = 0;
1012
1013	if (info & RX_MSDU_END_INFO13_FCS_ERR)
1014		errmap |= HAL_RX_MPDU_ERR_FCS;
1015
1016	if (info & RX_MSDU_END_INFO13_DECRYPT_ERR)
1017		errmap |= HAL_RX_MPDU_ERR_DECRYPT;
1018
1019	if (info & RX_MSDU_END_INFO13_TKIP_MIC_ERR)
1020		errmap |= HAL_RX_MPDU_ERR_TKIP_MIC;
1021
1022	if (info & RX_MSDU_END_INFO13_A_MSDU_ERROR)
1023		errmap |= HAL_RX_MPDU_ERR_AMSDU_ERR;
1024
1025	if (info & RX_MSDU_END_INFO13_OVERFLOW_ERR)
1026		errmap |= HAL_RX_MPDU_ERR_OVERFLOW;
1027
1028	if (info & RX_MSDU_END_INFO13_MSDU_LEN_ERR)
1029		errmap |= HAL_RX_MPDU_ERR_MSDU_LEN;
1030
1031	if (info & RX_MSDU_END_INFO13_MPDU_LEN_ERR)
1032		errmap |= HAL_RX_MPDU_ERR_MPDU_LEN;
1033
1034	return errmap;
1035}
1036
1037static u32 ath12k_hw_qcn9274_compact_get_rx_desc_size(void)
1038{
1039	return sizeof(struct hal_rx_desc_qcn9274_compact);
1040}
1041
1042static u8 ath12k_hw_qcn9274_compact_rx_desc_get_msdu_src_link(struct hal_rx_desc *desc)
1043{
1044	return le64_get_bits(desc->u.qcn9274_compact.msdu_end.msdu_end_tag,
1045			     RX_MSDU_END_64_TLV_SRC_LINK_ID);
1046}
1047
1048const struct hal_rx_ops hal_rx_qcn9274_compact_ops = {
1049	.rx_desc_get_first_msdu = ath12k_hw_qcn9274_compact_rx_desc_get_first_msdu,
1050	.rx_desc_get_last_msdu = ath12k_hw_qcn9274_compact_rx_desc_get_last_msdu,
1051	.rx_desc_get_l3_pad_bytes = ath12k_hw_qcn9274_compact_rx_desc_get_l3_pad_bytes,
1052	.rx_desc_encrypt_valid = ath12k_hw_qcn9274_compact_rx_desc_encrypt_valid,
1053	.rx_desc_get_encrypt_type = ath12k_hw_qcn9274_compact_rx_desc_get_encrypt_type,
1054	.rx_desc_get_decap_type = ath12k_hw_qcn9274_compact_rx_desc_get_decap_type,
1055	.rx_desc_get_mesh_ctl = ath12k_hw_qcn9274_compact_rx_desc_get_mesh_ctl,
1056	.rx_desc_get_mpdu_seq_ctl_vld =
1057		ath12k_hw_qcn9274_compact_rx_desc_get_mpdu_seq_ctl_vld,
1058	.rx_desc_get_mpdu_fc_valid = ath12k_hw_qcn9274_compact_rx_desc_get_mpdu_fc_valid,
1059	.rx_desc_get_mpdu_start_seq_no =
1060		ath12k_hw_qcn9274_compact_rx_desc_get_mpdu_start_seq_no,
1061	.rx_desc_get_msdu_len = ath12k_hw_qcn9274_compact_rx_desc_get_msdu_len,
1062	.rx_desc_get_msdu_sgi = ath12k_hw_qcn9274_compact_rx_desc_get_msdu_sgi,
1063	.rx_desc_get_msdu_rate_mcs = ath12k_hw_qcn9274_compact_rx_desc_get_msdu_rate_mcs,
1064	.rx_desc_get_msdu_rx_bw = ath12k_hw_qcn9274_compact_rx_desc_get_msdu_rx_bw,
1065	.rx_desc_get_msdu_freq = ath12k_hw_qcn9274_compact_rx_desc_get_msdu_freq,
1066	.rx_desc_get_msdu_pkt_type = ath12k_hw_qcn9274_compact_rx_desc_get_msdu_pkt_type,
1067	.rx_desc_get_msdu_nss = ath12k_hw_qcn9274_compact_rx_desc_get_msdu_nss,
1068	.rx_desc_get_mpdu_tid = ath12k_hw_qcn9274_compact_rx_desc_get_mpdu_tid,
1069	.rx_desc_get_mpdu_peer_id = ath12k_hw_qcn9274_compact_rx_desc_get_mpdu_peer_id,
1070	.rx_desc_copy_end_tlv = ath12k_hw_qcn9274_compact_rx_desc_copy_end_tlv,
1071	.rx_desc_get_mpdu_ppdu_id = ath12k_hw_qcn9274_compact_rx_desc_get_mpdu_ppdu_id,
1072	.rx_desc_set_msdu_len = ath12k_hw_qcn9274_compact_rx_desc_set_msdu_len,
1073	.rx_desc_get_msdu_payload = ath12k_hw_qcn9274_compact_rx_desc_get_msdu_payload,
1074	.rx_desc_get_mpdu_start_offset =
1075		ath12k_hw_qcn9274_compact_rx_desc_get_mpdu_start_offset,
1076	.rx_desc_get_msdu_end_offset =
1077		ath12k_hw_qcn9274_compact_rx_desc_get_msdu_end_offset,
1078	.rx_desc_mac_addr2_valid = ath12k_hw_qcn9274_compact_rx_desc_mac_addr2_valid,
1079	.rx_desc_mpdu_start_addr2 = ath12k_hw_qcn9274_compact_rx_desc_mpdu_start_addr2,
1080	.rx_desc_is_da_mcbc = ath12k_hw_qcn9274_compact_rx_desc_is_da_mcbc,
1081	.rx_desc_get_dot11_hdr = ath12k_hw_qcn9274_compact_rx_desc_get_dot11_hdr,
1082	.rx_desc_get_crypto_header = ath12k_hw_qcn9274_compact_rx_desc_get_crypto_hdr,
1083	.rx_desc_get_mpdu_frame_ctl =
1084		ath12k_hw_qcn9274_compact_rx_desc_get_mpdu_frame_ctl,
1085	.dp_rx_h_msdu_done = ath12k_hw_qcn9274_compact_dp_rx_h_msdu_done,
1086	.dp_rx_h_l4_cksum_fail = ath12k_hw_qcn9274_compact_dp_rx_h_l4_cksum_fail,
1087	.dp_rx_h_ip_cksum_fail = ath12k_hw_qcn9274_compact_dp_rx_h_ip_cksum_fail,
1088	.dp_rx_h_is_decrypted = ath12k_hw_qcn9274_compact_dp_rx_h_is_decrypted,
1089	.dp_rx_h_mpdu_err = ath12k_hw_qcn9274_compact_dp_rx_h_mpdu_err,
1090	.rx_desc_get_desc_size = ath12k_hw_qcn9274_compact_get_rx_desc_size,
1091	.rx_desc_get_msdu_src_link_id =
1092		ath12k_hw_qcn9274_compact_rx_desc_get_msdu_src_link,
1093};
1094
1095const struct hal_ops hal_qcn9274_ops = {
1096	.create_srng_config = ath12k_hal_srng_create_config_qcn9274,
1097	.tcl_to_wbm_rbm_map = ath12k_hal_qcn9274_tcl_to_wbm_rbm_map,
1098	.rxdma_ring_wmask_rx_mpdu_start = ath12k_hal_qcn9274_rx_mpdu_start_wmask_get,
1099	.rxdma_ring_wmask_rx_msdu_end = ath12k_hal_qcn9274_rx_msdu_end_wmask_get,
1100	.get_hal_rx_compact_ops = ath12k_hal_qcn9274_get_hal_rx_compact_ops,
1101};
1102
1103static bool ath12k_hw_wcn7850_rx_desc_get_first_msdu(struct hal_rx_desc *desc)
1104{
1105	return !!le16_get_bits(desc->u.wcn7850.msdu_end.info5,
1106			       RX_MSDU_END_INFO5_FIRST_MSDU);
1107}
1108
1109static bool ath12k_hw_wcn7850_rx_desc_get_last_msdu(struct hal_rx_desc *desc)
1110{
1111	return !!le16_get_bits(desc->u.wcn7850.msdu_end.info5,
1112			       RX_MSDU_END_INFO5_LAST_MSDU);
1113}
1114
1115static u8 ath12k_hw_wcn7850_rx_desc_get_l3_pad_bytes(struct hal_rx_desc *desc)
1116{
1117	return le16_get_bits(desc->u.wcn7850.msdu_end.info5,
1118			    RX_MSDU_END_INFO5_L3_HDR_PADDING);
1119}
1120
1121static bool ath12k_hw_wcn7850_rx_desc_encrypt_valid(struct hal_rx_desc *desc)
1122{
1123	return !!le32_get_bits(desc->u.wcn7850.mpdu_start.info4,
1124			       RX_MPDU_START_INFO4_ENCRYPT_INFO_VALID);
1125}
1126
1127static u32 ath12k_hw_wcn7850_rx_desc_get_encrypt_type(struct hal_rx_desc *desc)
1128{
1129	return le32_get_bits(desc->u.wcn7850.mpdu_start.info2,
1130			     RX_MPDU_START_INFO2_ENC_TYPE);
1131}
1132
1133static u8 ath12k_hw_wcn7850_rx_desc_get_decap_type(struct hal_rx_desc *desc)
1134{
1135	return le32_get_bits(desc->u.wcn7850.msdu_end.info11,
1136			     RX_MSDU_END_INFO11_DECAP_FORMAT);
1137}
1138
1139static u8 ath12k_hw_wcn7850_rx_desc_get_mesh_ctl(struct hal_rx_desc *desc)
1140{
1141	return le32_get_bits(desc->u.wcn7850.msdu_end.info11,
1142			     RX_MSDU_END_INFO11_MESH_CTRL_PRESENT);
1143}
1144
1145static bool ath12k_hw_wcn7850_rx_desc_get_mpdu_seq_ctl_vld(struct hal_rx_desc *desc)
1146{
1147	return !!le32_get_bits(desc->u.wcn7850.mpdu_start.info4,
1148			       RX_MPDU_START_INFO4_MPDU_SEQ_CTRL_VALID);
1149}
1150
1151static bool ath12k_hw_wcn7850_rx_desc_get_mpdu_fc_valid(struct hal_rx_desc *desc)
1152{
1153	return !!le32_get_bits(desc->u.wcn7850.mpdu_start.info4,
1154			       RX_MPDU_START_INFO4_MPDU_FCTRL_VALID);
1155}
1156
1157static u16 ath12k_hw_wcn7850_rx_desc_get_mpdu_start_seq_no(struct hal_rx_desc *desc)
1158{
1159	return le32_get_bits(desc->u.wcn7850.mpdu_start.info4,
1160			     RX_MPDU_START_INFO4_MPDU_SEQ_NUM);
1161}
1162
1163static u16 ath12k_hw_wcn7850_rx_desc_get_msdu_len(struct hal_rx_desc *desc)
1164{
1165	return le32_get_bits(desc->u.wcn7850.msdu_end.info10,
1166			     RX_MSDU_END_INFO10_MSDU_LENGTH);
1167}
1168
1169static u8 ath12k_hw_wcn7850_rx_desc_get_msdu_sgi(struct hal_rx_desc *desc)
1170{
1171	return le32_get_bits(desc->u.wcn7850.msdu_end.info12,
1172			     RX_MSDU_END_INFO12_SGI);
1173}
1174
1175static u8 ath12k_hw_wcn7850_rx_desc_get_msdu_rate_mcs(struct hal_rx_desc *desc)
1176{
1177	return le32_get_bits(desc->u.wcn7850.msdu_end.info12,
1178			     RX_MSDU_END_INFO12_RATE_MCS);
1179}
1180
1181static u8 ath12k_hw_wcn7850_rx_desc_get_msdu_rx_bw(struct hal_rx_desc *desc)
1182{
1183	return le32_get_bits(desc->u.wcn7850.msdu_end.info12,
1184			     RX_MSDU_END_INFO12_RECV_BW);
1185}
1186
1187static u32 ath12k_hw_wcn7850_rx_desc_get_msdu_freq(struct hal_rx_desc *desc)
1188{
1189	return __le32_to_cpu(desc->u.wcn7850.msdu_end.phy_meta_data);
1190}
1191
1192static u8 ath12k_hw_wcn7850_rx_desc_get_msdu_pkt_type(struct hal_rx_desc *desc)
1193{
1194	return le32_get_bits(desc->u.wcn7850.msdu_end.info12,
1195			     RX_MSDU_END_INFO12_PKT_TYPE);
1196}
1197
1198static u8 ath12k_hw_wcn7850_rx_desc_get_msdu_nss(struct hal_rx_desc *desc)
1199{
1200	return le32_get_bits(desc->u.wcn7850.msdu_end.info12,
1201			     RX_MSDU_END_INFO12_MIMO_SS_BITMAP);
1202}
1203
1204static u8 ath12k_hw_wcn7850_rx_desc_get_mpdu_tid(struct hal_rx_desc *desc)
1205{
1206	return le32_get_bits(desc->u.wcn7850.mpdu_start.info2,
1207			     RX_MPDU_START_INFO2_TID);
1208}
1209
1210static u16 ath12k_hw_wcn7850_rx_desc_get_mpdu_peer_id(struct hal_rx_desc *desc)
1211{
1212	return __le16_to_cpu(desc->u.wcn7850.mpdu_start.sw_peer_id);
1213}
1214
1215static void ath12k_hw_wcn7850_rx_desc_copy_end_tlv(struct hal_rx_desc *fdesc,
1216						   struct hal_rx_desc *ldesc)
1217{
1218	memcpy(&fdesc->u.wcn7850.msdu_end, &ldesc->u.wcn7850.msdu_end,
1219	       sizeof(struct rx_msdu_end_qcn9274));
1220}
1221
1222static u32 ath12k_hw_wcn7850_rx_desc_get_mpdu_start_tag(struct hal_rx_desc *desc)
1223{
1224	return le64_get_bits(desc->u.wcn7850.mpdu_start_tag,
1225			    HAL_TLV_HDR_TAG);
1226}
1227
1228static u32 ath12k_hw_wcn7850_rx_desc_get_mpdu_ppdu_id(struct hal_rx_desc *desc)
1229{
1230	return __le16_to_cpu(desc->u.wcn7850.mpdu_start.phy_ppdu_id);
1231}
1232
1233static void ath12k_hw_wcn7850_rx_desc_set_msdu_len(struct hal_rx_desc *desc, u16 len)
1234{
1235	u32 info = __le32_to_cpu(desc->u.wcn7850.msdu_end.info10);
1236
1237	info &= ~RX_MSDU_END_INFO10_MSDU_LENGTH;
1238	info |= u32_encode_bits(len, RX_MSDU_END_INFO10_MSDU_LENGTH);
1239
1240	desc->u.wcn7850.msdu_end.info10 = __cpu_to_le32(info);
1241}
1242
1243static u8 *ath12k_hw_wcn7850_rx_desc_get_msdu_payload(struct hal_rx_desc *desc)
1244{
1245	return &desc->u.wcn7850.msdu_payload[0];
1246}
1247
1248static u32 ath12k_hw_wcn7850_rx_desc_get_mpdu_start_offset(void)
1249{
1250	return offsetof(struct hal_rx_desc_wcn7850, mpdu_start_tag);
1251}
1252
1253static u32 ath12k_hw_wcn7850_rx_desc_get_msdu_end_offset(void)
1254{
1255	return offsetof(struct hal_rx_desc_wcn7850, msdu_end_tag);
1256}
1257
1258static bool ath12k_hw_wcn7850_rx_desc_mac_addr2_valid(struct hal_rx_desc *desc)
1259{
1260	return __le32_to_cpu(desc->u.wcn7850.mpdu_start.info4) &
1261	       RX_MPDU_START_INFO4_MAC_ADDR2_VALID;
1262}
1263
1264static u8 *ath12k_hw_wcn7850_rx_desc_mpdu_start_addr2(struct hal_rx_desc *desc)
1265{
1266	return desc->u.wcn7850.mpdu_start.addr2;
1267}
1268
1269static bool ath12k_hw_wcn7850_rx_desc_is_da_mcbc(struct hal_rx_desc *desc)
1270{
1271	return __le32_to_cpu(desc->u.wcn7850.msdu_end.info13) &
1272	       RX_MSDU_END_INFO13_MCAST_BCAST;
1273}
1274
1275static void ath12k_hw_wcn7850_rx_desc_get_dot11_hdr(struct hal_rx_desc *desc,
1276						    struct ieee80211_hdr *hdr)
1277{
1278	hdr->frame_control = desc->u.wcn7850.mpdu_start.frame_ctrl;
1279	hdr->duration_id = desc->u.wcn7850.mpdu_start.duration;
1280	ether_addr_copy(hdr->addr1, desc->u.wcn7850.mpdu_start.addr1);
1281	ether_addr_copy(hdr->addr2, desc->u.wcn7850.mpdu_start.addr2);
1282	ether_addr_copy(hdr->addr3, desc->u.wcn7850.mpdu_start.addr3);
1283	if (__le32_to_cpu(desc->u.wcn7850.mpdu_start.info4) &
1284			RX_MPDU_START_INFO4_MAC_ADDR4_VALID) {
1285		ether_addr_copy(hdr->addr4, desc->u.wcn7850.mpdu_start.addr4);
1286	}
1287	hdr->seq_ctrl = desc->u.wcn7850.mpdu_start.seq_ctrl;
1288}
1289
1290static void ath12k_hw_wcn7850_rx_desc_get_crypto_hdr(struct hal_rx_desc *desc,
1291						     u8 *crypto_hdr,
1292						     enum hal_encrypt_type enctype)
1293{
1294	unsigned int key_id;
1295
1296	switch (enctype) {
1297	case HAL_ENCRYPT_TYPE_OPEN:
1298		return;
1299	case HAL_ENCRYPT_TYPE_TKIP_NO_MIC:
1300	case HAL_ENCRYPT_TYPE_TKIP_MIC:
1301		crypto_hdr[0] =
1302			HAL_RX_MPDU_INFO_PN_GET_BYTE2(desc->u.wcn7850.mpdu_start.pn[0]);
1303		crypto_hdr[1] = 0;
1304		crypto_hdr[2] =
1305			HAL_RX_MPDU_INFO_PN_GET_BYTE1(desc->u.wcn7850.mpdu_start.pn[0]);
1306		break;
1307	case HAL_ENCRYPT_TYPE_CCMP_128:
1308	case HAL_ENCRYPT_TYPE_CCMP_256:
1309	case HAL_ENCRYPT_TYPE_GCMP_128:
1310	case HAL_ENCRYPT_TYPE_AES_GCMP_256:
1311		crypto_hdr[0] =
1312			HAL_RX_MPDU_INFO_PN_GET_BYTE1(desc->u.wcn7850.mpdu_start.pn[0]);
1313		crypto_hdr[1] =
1314			HAL_RX_MPDU_INFO_PN_GET_BYTE2(desc->u.wcn7850.mpdu_start.pn[0]);
1315		crypto_hdr[2] = 0;
1316		break;
1317	case HAL_ENCRYPT_TYPE_WEP_40:
1318	case HAL_ENCRYPT_TYPE_WEP_104:
1319	case HAL_ENCRYPT_TYPE_WEP_128:
1320	case HAL_ENCRYPT_TYPE_WAPI_GCM_SM4:
1321	case HAL_ENCRYPT_TYPE_WAPI:
1322		return;
1323	}
1324	key_id = u32_get_bits(__le32_to_cpu(desc->u.wcn7850.mpdu_start.info5),
1325			      RX_MPDU_START_INFO5_KEY_ID);
1326	crypto_hdr[3] = 0x20 | (key_id << 6);
1327	crypto_hdr[4] = HAL_RX_MPDU_INFO_PN_GET_BYTE3(desc->u.wcn7850.mpdu_start.pn[0]);
1328	crypto_hdr[5] = HAL_RX_MPDU_INFO_PN_GET_BYTE4(desc->u.wcn7850.mpdu_start.pn[0]);
1329	crypto_hdr[6] = HAL_RX_MPDU_INFO_PN_GET_BYTE1(desc->u.wcn7850.mpdu_start.pn[1]);
1330	crypto_hdr[7] = HAL_RX_MPDU_INFO_PN_GET_BYTE2(desc->u.wcn7850.mpdu_start.pn[1]);
1331}
1332
1333static u16 ath12k_hw_wcn7850_rx_desc_get_mpdu_frame_ctl(struct hal_rx_desc *desc)
1334{
1335	return __le16_to_cpu(desc->u.wcn7850.mpdu_start.frame_ctrl);
1336}
1337
1338static int ath12k_hal_srng_create_config_wcn7850(struct ath12k_base *ab)
1339{
1340	struct ath12k_hal *hal = &ab->hal;
1341	struct hal_srng_config *s;
1342
1343	hal->srng_config = kmemdup(hw_srng_config_template,
1344				   sizeof(hw_srng_config_template),
1345				   GFP_KERNEL);
1346	if (!hal->srng_config)
1347		return -ENOMEM;
1348
1349	s = &hal->srng_config[HAL_REO_DST];
1350	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO1_RING_BASE_LSB(ab);
1351	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO1_RING_HP;
1352	s->reg_size[0] = HAL_REO2_RING_BASE_LSB(ab) - HAL_REO1_RING_BASE_LSB(ab);
1353	s->reg_size[1] = HAL_REO2_RING_HP - HAL_REO1_RING_HP;
1354
1355	s = &hal->srng_config[HAL_REO_EXCEPTION];
1356	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_SW0_RING_BASE_LSB(ab);
1357	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_SW0_RING_HP;
1358
1359	s = &hal->srng_config[HAL_REO_REINJECT];
1360	s->max_rings = 1;
1361	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_SW2REO_RING_BASE_LSB(ab);
1362	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_SW2REO_RING_HP;
1363
1364	s = &hal->srng_config[HAL_REO_CMD];
1365	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_CMD_RING_BASE_LSB(ab);
1366	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_CMD_HP;
1367
1368	s = &hal->srng_config[HAL_REO_STATUS];
1369	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_STATUS_RING_BASE_LSB(ab);
1370	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_REO_REG + HAL_REO_STATUS_HP;
1371
1372	s = &hal->srng_config[HAL_TCL_DATA];
1373	s->max_rings = 5;
1374	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL1_RING_BASE_LSB;
1375	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL1_RING_HP;
1376	s->reg_size[0] = HAL_TCL2_RING_BASE_LSB - HAL_TCL1_RING_BASE_LSB;
1377	s->reg_size[1] = HAL_TCL2_RING_HP - HAL_TCL1_RING_HP;
1378
1379	s = &hal->srng_config[HAL_TCL_CMD];
1380	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL_RING_BASE_LSB(ab);
1381	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL_RING_HP;
1382
1383	s = &hal->srng_config[HAL_TCL_STATUS];
1384	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL_STATUS_RING_BASE_LSB(ab);
1385	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_TCL_REG + HAL_TCL_STATUS_RING_HP;
1386
1387	s = &hal->srng_config[HAL_CE_SRC];
1388	s->max_rings = 12;
1389	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG + HAL_CE_DST_RING_BASE_LSB;
1390	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_SRC_REG + HAL_CE_DST_RING_HP;
1391	s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_SRC_REG -
1392		HAL_SEQ_WCSS_UMAC_CE0_SRC_REG;
1393	s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_SRC_REG -
1394		HAL_SEQ_WCSS_UMAC_CE0_SRC_REG;
1395
1396	s = &hal->srng_config[HAL_CE_DST];
1397	s->max_rings = 12;
1398	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG + HAL_CE_DST_RING_BASE_LSB;
1399	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG + HAL_CE_DST_RING_HP;
1400	s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG -
1401		HAL_SEQ_WCSS_UMAC_CE0_DST_REG;
1402	s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG -
1403		HAL_SEQ_WCSS_UMAC_CE0_DST_REG;
1404
1405	s = &hal->srng_config[HAL_CE_DST_STATUS];
1406	s->max_rings = 12;
1407	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG +
1408		HAL_CE_DST_STATUS_RING_BASE_LSB;
1409	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_CE0_DST_REG + HAL_CE_DST_STATUS_RING_HP;
1410	s->reg_size[0] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG -
1411		HAL_SEQ_WCSS_UMAC_CE0_DST_REG;
1412	s->reg_size[1] = HAL_SEQ_WCSS_UMAC_CE1_DST_REG -
1413		HAL_SEQ_WCSS_UMAC_CE0_DST_REG;
1414
1415	s = &hal->srng_config[HAL_WBM_IDLE_LINK];
1416	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_WBM_REG + HAL_WBM_IDLE_LINK_RING_BASE_LSB(ab);
1417	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_WBM_REG + HAL_WBM_IDLE_LINK_RING_HP;
1418
1419	s = &hal->srng_config[HAL_SW2WBM_RELEASE];
1420	s->max_rings = 1;
1421	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_WBM_REG +
1422		HAL_WBM_SW_RELEASE_RING_BASE_LSB(ab);
1423	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_WBM_REG + HAL_WBM_SW_RELEASE_RING_HP;
1424
1425	s = &hal->srng_config[HAL_WBM2SW_RELEASE];
1426	s->reg_start[0] = HAL_SEQ_WCSS_UMAC_WBM_REG + HAL_WBM0_RELEASE_RING_BASE_LSB(ab);
1427	s->reg_start[1] = HAL_SEQ_WCSS_UMAC_WBM_REG + HAL_WBM0_RELEASE_RING_HP;
1428	s->reg_size[0] = HAL_WBM1_RELEASE_RING_BASE_LSB(ab) -
1429		HAL_WBM0_RELEASE_RING_BASE_LSB(ab);
1430	s->reg_size[1] = HAL_WBM1_RELEASE_RING_HP - HAL_WBM0_RELEASE_RING_HP;
1431
1432	s = &hal->srng_config[HAL_RXDMA_BUF];
1433	s->max_rings = 2;
1434	s->mac_type = ATH12K_HAL_SRNG_PMAC;
1435
1436	s = &hal->srng_config[HAL_RXDMA_DST];
1437	s->max_rings = 1;
1438	s->entry_size = sizeof(struct hal_reo_entrance_ring) >> 2;
1439
1440	/* below rings are not used */
1441	s = &hal->srng_config[HAL_RXDMA_DIR_BUF];
1442	s->max_rings = 0;
1443
1444	s = &hal->srng_config[HAL_PPE2TCL];
1445	s->max_rings = 0;
1446
1447	s = &hal->srng_config[HAL_PPE_RELEASE];
1448	s->max_rings = 0;
1449
1450	s = &hal->srng_config[HAL_TX_MONITOR_BUF];
1451	s->max_rings = 0;
1452
1453	s = &hal->srng_config[HAL_TX_MONITOR_DST];
1454	s->max_rings = 0;
1455
1456	s = &hal->srng_config[HAL_PPE2TCL];
1457	s->max_rings = 0;
1458
1459	return 0;
1460}
1461
1462static bool ath12k_hw_wcn7850_dp_rx_h_msdu_done(struct hal_rx_desc *desc)
1463{
1464	return !!le32_get_bits(desc->u.wcn7850.msdu_end.info14,
1465			       RX_MSDU_END_INFO14_MSDU_DONE);
1466}
1467
1468static bool ath12k_hw_wcn7850_dp_rx_h_l4_cksum_fail(struct hal_rx_desc *desc)
1469{
1470	return !!le32_get_bits(desc->u.wcn7850.msdu_end.info13,
1471			       RX_MSDU_END_INFO13_TCP_UDP_CKSUM_FAIL);
1472}
1473
1474static bool ath12k_hw_wcn7850_dp_rx_h_ip_cksum_fail(struct hal_rx_desc *desc)
1475{
1476	return !!le32_get_bits(desc->u.wcn7850.msdu_end.info13,
1477			      RX_MSDU_END_INFO13_IP_CKSUM_FAIL);
1478}
1479
1480static bool ath12k_hw_wcn7850_dp_rx_h_is_decrypted(struct hal_rx_desc *desc)
1481{
1482	return (le32_get_bits(desc->u.wcn7850.msdu_end.info14,
1483			      RX_MSDU_END_INFO14_DECRYPT_STATUS_CODE) ==
1484			      RX_DESC_DECRYPT_STATUS_CODE_OK);
1485}
1486
1487static u32 ath12k_hw_wcn7850_dp_rx_h_mpdu_err(struct hal_rx_desc *desc)
1488{
1489	u32 info = __le32_to_cpu(desc->u.wcn7850.msdu_end.info13);
1490	u32 errmap = 0;
1491
1492	if (info & RX_MSDU_END_INFO13_FCS_ERR)
1493		errmap |= HAL_RX_MPDU_ERR_FCS;
1494
1495	if (info & RX_MSDU_END_INFO13_DECRYPT_ERR)
1496		errmap |= HAL_RX_MPDU_ERR_DECRYPT;
1497
1498	if (info & RX_MSDU_END_INFO13_TKIP_MIC_ERR)
1499		errmap |= HAL_RX_MPDU_ERR_TKIP_MIC;
1500
1501	if (info & RX_MSDU_END_INFO13_A_MSDU_ERROR)
1502		errmap |= HAL_RX_MPDU_ERR_AMSDU_ERR;
1503
1504	if (info & RX_MSDU_END_INFO13_OVERFLOW_ERR)
1505		errmap |= HAL_RX_MPDU_ERR_OVERFLOW;
1506
1507	if (info & RX_MSDU_END_INFO13_MSDU_LEN_ERR)
1508		errmap |= HAL_RX_MPDU_ERR_MSDU_LEN;
1509
1510	if (info & RX_MSDU_END_INFO13_MPDU_LEN_ERR)
1511		errmap |= HAL_RX_MPDU_ERR_MPDU_LEN;
1512
1513	return errmap;
1514}
1515
1516static u32 ath12k_hw_wcn7850_get_rx_desc_size(void)
1517{
1518	return sizeof(struct hal_rx_desc_wcn7850);
1519}
1520
1521static u8 ath12k_hw_wcn7850_rx_desc_get_msdu_src_link(struct hal_rx_desc *desc)
1522{
1523	return 0;
1524}
1525
1526const struct hal_rx_ops hal_rx_wcn7850_ops = {
1527	.rx_desc_get_first_msdu = ath12k_hw_wcn7850_rx_desc_get_first_msdu,
1528	.rx_desc_get_last_msdu = ath12k_hw_wcn7850_rx_desc_get_last_msdu,
1529	.rx_desc_get_l3_pad_bytes = ath12k_hw_wcn7850_rx_desc_get_l3_pad_bytes,
1530	.rx_desc_encrypt_valid = ath12k_hw_wcn7850_rx_desc_encrypt_valid,
1531	.rx_desc_get_encrypt_type = ath12k_hw_wcn7850_rx_desc_get_encrypt_type,
1532	.rx_desc_get_decap_type = ath12k_hw_wcn7850_rx_desc_get_decap_type,
1533	.rx_desc_get_mesh_ctl = ath12k_hw_wcn7850_rx_desc_get_mesh_ctl,
1534	.rx_desc_get_mpdu_seq_ctl_vld = ath12k_hw_wcn7850_rx_desc_get_mpdu_seq_ctl_vld,
1535	.rx_desc_get_mpdu_fc_valid = ath12k_hw_wcn7850_rx_desc_get_mpdu_fc_valid,
1536	.rx_desc_get_mpdu_start_seq_no = ath12k_hw_wcn7850_rx_desc_get_mpdu_start_seq_no,
1537	.rx_desc_get_msdu_len = ath12k_hw_wcn7850_rx_desc_get_msdu_len,
1538	.rx_desc_get_msdu_sgi = ath12k_hw_wcn7850_rx_desc_get_msdu_sgi,
1539	.rx_desc_get_msdu_rate_mcs = ath12k_hw_wcn7850_rx_desc_get_msdu_rate_mcs,
1540	.rx_desc_get_msdu_rx_bw = ath12k_hw_wcn7850_rx_desc_get_msdu_rx_bw,
1541	.rx_desc_get_msdu_freq = ath12k_hw_wcn7850_rx_desc_get_msdu_freq,
1542	.rx_desc_get_msdu_pkt_type = ath12k_hw_wcn7850_rx_desc_get_msdu_pkt_type,
1543	.rx_desc_get_msdu_nss = ath12k_hw_wcn7850_rx_desc_get_msdu_nss,
1544	.rx_desc_get_mpdu_tid = ath12k_hw_wcn7850_rx_desc_get_mpdu_tid,
1545	.rx_desc_get_mpdu_peer_id = ath12k_hw_wcn7850_rx_desc_get_mpdu_peer_id,
1546	.rx_desc_copy_end_tlv = ath12k_hw_wcn7850_rx_desc_copy_end_tlv,
1547	.rx_desc_get_mpdu_start_tag = ath12k_hw_wcn7850_rx_desc_get_mpdu_start_tag,
1548	.rx_desc_get_mpdu_ppdu_id = ath12k_hw_wcn7850_rx_desc_get_mpdu_ppdu_id,
1549	.rx_desc_set_msdu_len = ath12k_hw_wcn7850_rx_desc_set_msdu_len,
1550	.rx_desc_get_msdu_payload = ath12k_hw_wcn7850_rx_desc_get_msdu_payload,
1551	.rx_desc_get_mpdu_start_offset = ath12k_hw_wcn7850_rx_desc_get_mpdu_start_offset,
1552	.rx_desc_get_msdu_end_offset = ath12k_hw_wcn7850_rx_desc_get_msdu_end_offset,
1553	.rx_desc_mac_addr2_valid = ath12k_hw_wcn7850_rx_desc_mac_addr2_valid,
1554	.rx_desc_mpdu_start_addr2 = ath12k_hw_wcn7850_rx_desc_mpdu_start_addr2,
1555	.rx_desc_is_da_mcbc = ath12k_hw_wcn7850_rx_desc_is_da_mcbc,
1556	.rx_desc_get_dot11_hdr = ath12k_hw_wcn7850_rx_desc_get_dot11_hdr,
1557	.rx_desc_get_crypto_header = ath12k_hw_wcn7850_rx_desc_get_crypto_hdr,
1558	.rx_desc_get_mpdu_frame_ctl = ath12k_hw_wcn7850_rx_desc_get_mpdu_frame_ctl,
1559	.dp_rx_h_msdu_done = ath12k_hw_wcn7850_dp_rx_h_msdu_done,
1560	.dp_rx_h_l4_cksum_fail = ath12k_hw_wcn7850_dp_rx_h_l4_cksum_fail,
1561	.dp_rx_h_ip_cksum_fail = ath12k_hw_wcn7850_dp_rx_h_ip_cksum_fail,
1562	.dp_rx_h_is_decrypted = ath12k_hw_wcn7850_dp_rx_h_is_decrypted,
1563	.dp_rx_h_mpdu_err = ath12k_hw_wcn7850_dp_rx_h_mpdu_err,
1564	.rx_desc_get_desc_size = ath12k_hw_wcn7850_get_rx_desc_size,
1565	.rx_desc_get_msdu_src_link_id = ath12k_hw_wcn7850_rx_desc_get_msdu_src_link,
1566};
1567
1568const struct hal_ops hal_wcn7850_ops = {
1569	.create_srng_config = ath12k_hal_srng_create_config_wcn7850,
1570	.tcl_to_wbm_rbm_map = ath12k_hal_wcn7850_tcl_to_wbm_rbm_map,
1571	.rxdma_ring_wmask_rx_mpdu_start = NULL,
1572	.rxdma_ring_wmask_rx_msdu_end = NULL,
1573	.get_hal_rx_compact_ops = NULL,
1574};
1575
1576static int ath12k_hal_alloc_cont_rdp(struct ath12k_base *ab)
1577{
1578	struct ath12k_hal *hal = &ab->hal;
1579	size_t size;
1580
1581	size = sizeof(u32) * HAL_SRNG_RING_ID_MAX;
1582	hal->rdp.vaddr = dma_alloc_coherent(ab->dev, size, &hal->rdp.paddr,
1583					    GFP_KERNEL);
1584	if (!hal->rdp.vaddr)
1585		return -ENOMEM;
1586
1587	return 0;
1588}
1589
1590static void ath12k_hal_free_cont_rdp(struct ath12k_base *ab)
1591{
1592	struct ath12k_hal *hal = &ab->hal;
1593	size_t size;
1594
1595	if (!hal->rdp.vaddr)
1596		return;
1597
1598	size = sizeof(u32) * HAL_SRNG_RING_ID_MAX;
1599	dma_free_coherent(ab->dev, size,
1600			  hal->rdp.vaddr, hal->rdp.paddr);
1601	hal->rdp.vaddr = NULL;
1602}
1603
1604static int ath12k_hal_alloc_cont_wrp(struct ath12k_base *ab)
1605{
1606	struct ath12k_hal *hal = &ab->hal;
1607	size_t size;
1608
1609	size = sizeof(u32) * (HAL_SRNG_NUM_PMAC_RINGS + HAL_SRNG_NUM_DMAC_RINGS);
1610	hal->wrp.vaddr = dma_alloc_coherent(ab->dev, size, &hal->wrp.paddr,
1611					    GFP_KERNEL);
1612	if (!hal->wrp.vaddr)
1613		return -ENOMEM;
1614
1615	return 0;
1616}
1617
1618static void ath12k_hal_free_cont_wrp(struct ath12k_base *ab)
1619{
1620	struct ath12k_hal *hal = &ab->hal;
1621	size_t size;
1622
1623	if (!hal->wrp.vaddr)
1624		return;
1625
1626	size = sizeof(u32) * (HAL_SRNG_NUM_PMAC_RINGS + HAL_SRNG_NUM_DMAC_RINGS);
1627	dma_free_coherent(ab->dev, size,
1628			  hal->wrp.vaddr, hal->wrp.paddr);
1629	hal->wrp.vaddr = NULL;
1630}
1631
1632static void ath12k_hal_ce_dst_setup(struct ath12k_base *ab,
1633				    struct hal_srng *srng, int ring_num)
1634{
1635	struct hal_srng_config *srng_config = &ab->hal.srng_config[HAL_CE_DST];
1636	u32 addr;
1637	u32 val;
1638
1639	addr = HAL_CE_DST_RING_CTRL +
1640	       srng_config->reg_start[HAL_SRNG_REG_GRP_R0] +
1641	       ring_num * srng_config->reg_size[HAL_SRNG_REG_GRP_R0];
1642
1643	val = ath12k_hif_read32(ab, addr);
1644	val &= ~HAL_CE_DST_R0_DEST_CTRL_MAX_LEN;
1645	val |= u32_encode_bits(srng->u.dst_ring.max_buffer_length,
1646			       HAL_CE_DST_R0_DEST_CTRL_MAX_LEN);
1647	ath12k_hif_write32(ab, addr, val);
1648}
1649
1650static void ath12k_hal_srng_dst_hw_init(struct ath12k_base *ab,
1651					struct hal_srng *srng)
1652{
1653	struct ath12k_hal *hal = &ab->hal;
1654	u32 val;
1655	u64 hp_addr;
1656	u32 reg_base;
1657
1658	reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R0];
1659
1660	if (srng->flags & HAL_SRNG_FLAGS_MSI_INTR) {
1661		ath12k_hif_write32(ab, reg_base +
1662				   ath12k_hal_reo1_ring_msi1_base_lsb_offset(ab),
1663				   srng->msi_addr);
1664
1665		val = u32_encode_bits(((u64)srng->msi_addr >> HAL_ADDR_MSB_REG_SHIFT),
1666				      HAL_REO1_RING_MSI1_BASE_MSB_ADDR) |
1667				      HAL_REO1_RING_MSI1_BASE_MSB_MSI1_ENABLE;
1668		ath12k_hif_write32(ab, reg_base +
1669				   ath12k_hal_reo1_ring_msi1_base_msb_offset(ab), val);
1670
1671		ath12k_hif_write32(ab,
1672				   reg_base + ath12k_hal_reo1_ring_msi1_data_offset(ab),
1673				   srng->msi_data);
1674	}
1675
1676	ath12k_hif_write32(ab, reg_base, srng->ring_base_paddr);
1677
1678	val = u32_encode_bits(((u64)srng->ring_base_paddr >> HAL_ADDR_MSB_REG_SHIFT),
1679			      HAL_REO1_RING_BASE_MSB_RING_BASE_ADDR_MSB) |
1680	      u32_encode_bits((srng->entry_size * srng->num_entries),
1681			      HAL_REO1_RING_BASE_MSB_RING_SIZE);
1682	ath12k_hif_write32(ab, reg_base + ath12k_hal_reo1_ring_base_msb_offset(ab), val);
1683
1684	val = u32_encode_bits(srng->ring_id, HAL_REO1_RING_ID_RING_ID) |
1685	      u32_encode_bits(srng->entry_size, HAL_REO1_RING_ID_ENTRY_SIZE);
1686	ath12k_hif_write32(ab, reg_base + ath12k_hal_reo1_ring_id_offset(ab), val);
1687
1688	/* interrupt setup */
1689	val = u32_encode_bits((srng->intr_timer_thres_us >> 3),
1690			      HAL_REO1_RING_PRDR_INT_SETUP_INTR_TMR_THOLD);
1691
1692	val |= u32_encode_bits((srng->intr_batch_cntr_thres_entries * srng->entry_size),
1693				HAL_REO1_RING_PRDR_INT_SETUP_BATCH_COUNTER_THOLD);
1694
1695	ath12k_hif_write32(ab,
1696			   reg_base + ath12k_hal_reo1_ring_producer_int_setup_offset(ab),
1697			   val);
1698
1699	hp_addr = hal->rdp.paddr +
1700		  ((unsigned long)srng->u.dst_ring.hp_addr -
1701		   (unsigned long)hal->rdp.vaddr);
1702	ath12k_hif_write32(ab, reg_base + ath12k_hal_reo1_ring_hp_addr_lsb_offset(ab),
1703			   hp_addr & HAL_ADDR_LSB_REG_MASK);
1704	ath12k_hif_write32(ab, reg_base + ath12k_hal_reo1_ring_hp_addr_msb_offset(ab),
1705			   hp_addr >> HAL_ADDR_MSB_REG_SHIFT);
1706
1707	/* Initialize head and tail pointers to indicate ring is empty */
1708	reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R2];
1709	ath12k_hif_write32(ab, reg_base, 0);
1710	ath12k_hif_write32(ab, reg_base + HAL_REO1_RING_TP_OFFSET, 0);
1711	*srng->u.dst_ring.hp_addr = 0;
1712
1713	reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R0];
1714	val = 0;
1715	if (srng->flags & HAL_SRNG_FLAGS_DATA_TLV_SWAP)
1716		val |= HAL_REO1_RING_MISC_DATA_TLV_SWAP;
1717	if (srng->flags & HAL_SRNG_FLAGS_RING_PTR_SWAP)
1718		val |= HAL_REO1_RING_MISC_HOST_FW_SWAP;
1719	if (srng->flags & HAL_SRNG_FLAGS_MSI_SWAP)
1720		val |= HAL_REO1_RING_MISC_MSI_SWAP;
1721	val |= HAL_REO1_RING_MISC_SRNG_ENABLE;
1722
1723	ath12k_hif_write32(ab, reg_base + ath12k_hal_reo1_ring_misc_offset(ab), val);
1724}
1725
1726static void ath12k_hal_srng_src_hw_init(struct ath12k_base *ab,
1727					struct hal_srng *srng)
1728{
1729	struct ath12k_hal *hal = &ab->hal;
1730	u32 val;
1731	u64 tp_addr;
1732	u32 reg_base;
1733
1734	reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R0];
1735
1736	if (srng->flags & HAL_SRNG_FLAGS_MSI_INTR) {
1737		ath12k_hif_write32(ab, reg_base +
1738				   HAL_TCL1_RING_MSI1_BASE_LSB_OFFSET(ab),
1739				   srng->msi_addr);
1740
1741		val = u32_encode_bits(((u64)srng->msi_addr >> HAL_ADDR_MSB_REG_SHIFT),
1742				      HAL_TCL1_RING_MSI1_BASE_MSB_ADDR) |
1743				      HAL_TCL1_RING_MSI1_BASE_MSB_MSI1_ENABLE;
1744		ath12k_hif_write32(ab, reg_base +
1745				       HAL_TCL1_RING_MSI1_BASE_MSB_OFFSET(ab),
1746				   val);
1747
1748		ath12k_hif_write32(ab, reg_base +
1749				       HAL_TCL1_RING_MSI1_DATA_OFFSET(ab),
1750				   srng->msi_data);
1751	}
1752
1753	ath12k_hif_write32(ab, reg_base, srng->ring_base_paddr);
1754
1755	val = u32_encode_bits(((u64)srng->ring_base_paddr >> HAL_ADDR_MSB_REG_SHIFT),
1756			      HAL_TCL1_RING_BASE_MSB_RING_BASE_ADDR_MSB) |
1757	      u32_encode_bits((srng->entry_size * srng->num_entries),
1758			      HAL_TCL1_RING_BASE_MSB_RING_SIZE);
1759	ath12k_hif_write32(ab, reg_base + HAL_TCL1_RING_BASE_MSB_OFFSET, val);
1760
1761	val = u32_encode_bits(srng->entry_size, HAL_REO1_RING_ID_ENTRY_SIZE);
1762	ath12k_hif_write32(ab, reg_base + HAL_TCL1_RING_ID_OFFSET(ab), val);
1763
1764	val = u32_encode_bits(srng->intr_timer_thres_us,
1765			      HAL_TCL1_RING_CONSR_INT_SETUP_IX0_INTR_TMR_THOLD);
1766
1767	val |= u32_encode_bits((srng->intr_batch_cntr_thres_entries * srng->entry_size),
1768			       HAL_TCL1_RING_CONSR_INT_SETUP_IX0_BATCH_COUNTER_THOLD);
1769
1770	ath12k_hif_write32(ab,
1771			   reg_base + HAL_TCL1_RING_CONSR_INT_SETUP_IX0_OFFSET(ab),
1772			   val);
1773
1774	val = 0;
1775	if (srng->flags & HAL_SRNG_FLAGS_LOW_THRESH_INTR_EN) {
1776		val |= u32_encode_bits(srng->u.src_ring.low_threshold,
1777				       HAL_TCL1_RING_CONSR_INT_SETUP_IX1_LOW_THOLD);
1778	}
1779	ath12k_hif_write32(ab,
1780			   reg_base + HAL_TCL1_RING_CONSR_INT_SETUP_IX1_OFFSET(ab),
1781			   val);
1782
1783	if (srng->ring_id != HAL_SRNG_RING_ID_WBM_IDLE_LINK) {
1784		tp_addr = hal->rdp.paddr +
1785			  ((unsigned long)srng->u.src_ring.tp_addr -
1786			   (unsigned long)hal->rdp.vaddr);
1787		ath12k_hif_write32(ab,
1788				   reg_base + HAL_TCL1_RING_TP_ADDR_LSB_OFFSET(ab),
1789				   tp_addr & HAL_ADDR_LSB_REG_MASK);
1790		ath12k_hif_write32(ab,
1791				   reg_base + HAL_TCL1_RING_TP_ADDR_MSB_OFFSET(ab),
1792				   tp_addr >> HAL_ADDR_MSB_REG_SHIFT);
1793	}
1794
1795	/* Initialize head and tail pointers to indicate ring is empty */
1796	reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R2];
1797	ath12k_hif_write32(ab, reg_base, 0);
1798	ath12k_hif_write32(ab, reg_base + HAL_TCL1_RING_TP_OFFSET, 0);
1799	*srng->u.src_ring.tp_addr = 0;
1800
1801	reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R0];
1802	val = 0;
1803	if (srng->flags & HAL_SRNG_FLAGS_DATA_TLV_SWAP)
1804		val |= HAL_TCL1_RING_MISC_DATA_TLV_SWAP;
1805	if (srng->flags & HAL_SRNG_FLAGS_RING_PTR_SWAP)
1806		val |= HAL_TCL1_RING_MISC_HOST_FW_SWAP;
1807	if (srng->flags & HAL_SRNG_FLAGS_MSI_SWAP)
1808		val |= HAL_TCL1_RING_MISC_MSI_SWAP;
1809
1810	/* Loop count is not used for SRC rings */
1811	val |= HAL_TCL1_RING_MISC_MSI_LOOPCNT_DISABLE;
1812
1813	val |= HAL_TCL1_RING_MISC_SRNG_ENABLE;
1814
1815	if (srng->ring_id == HAL_SRNG_RING_ID_WBM_IDLE_LINK)
1816		val |= HAL_TCL1_RING_MISC_MSI_RING_ID_DISABLE;
1817
1818	ath12k_hif_write32(ab, reg_base + HAL_TCL1_RING_MISC_OFFSET(ab), val);
1819}
1820
1821static void ath12k_hal_srng_hw_init(struct ath12k_base *ab,
1822				    struct hal_srng *srng)
1823{
1824	if (srng->ring_dir == HAL_SRNG_DIR_SRC)
1825		ath12k_hal_srng_src_hw_init(ab, srng);
1826	else
1827		ath12k_hal_srng_dst_hw_init(ab, srng);
1828}
1829
1830static int ath12k_hal_srng_get_ring_id(struct ath12k_base *ab,
1831				       enum hal_ring_type type,
1832				       int ring_num, int mac_id)
1833{
1834	struct hal_srng_config *srng_config = &ab->hal.srng_config[type];
1835	int ring_id;
1836
1837	if (ring_num >= srng_config->max_rings) {
1838		ath12k_warn(ab, "invalid ring number :%d\n", ring_num);
1839		return -EINVAL;
1840	}
1841
1842	ring_id = srng_config->start_ring_id + ring_num;
1843	if (srng_config->mac_type == ATH12K_HAL_SRNG_PMAC)
1844		ring_id += mac_id * HAL_SRNG_RINGS_PER_PMAC;
1845
1846	if (WARN_ON(ring_id >= HAL_SRNG_RING_ID_MAX))
1847		return -EINVAL;
1848
1849	return ring_id;
1850}
1851
1852int ath12k_hal_srng_get_entrysize(struct ath12k_base *ab, u32 ring_type)
1853{
1854	struct hal_srng_config *srng_config;
1855
1856	if (WARN_ON(ring_type >= HAL_MAX_RING_TYPES))
1857		return -EINVAL;
1858
1859	srng_config = &ab->hal.srng_config[ring_type];
1860
1861	return (srng_config->entry_size << 2);
1862}
1863
1864int ath12k_hal_srng_get_max_entries(struct ath12k_base *ab, u32 ring_type)
1865{
1866	struct hal_srng_config *srng_config;
1867
1868	if (WARN_ON(ring_type >= HAL_MAX_RING_TYPES))
1869		return -EINVAL;
1870
1871	srng_config = &ab->hal.srng_config[ring_type];
1872
1873	return (srng_config->max_size / srng_config->entry_size);
1874}
1875
1876void ath12k_hal_srng_get_params(struct ath12k_base *ab, struct hal_srng *srng,
1877				struct hal_srng_params *params)
1878{
1879	params->ring_base_paddr = srng->ring_base_paddr;
1880	params->ring_base_vaddr = srng->ring_base_vaddr;
1881	params->num_entries = srng->num_entries;
1882	params->intr_timer_thres_us = srng->intr_timer_thres_us;
1883	params->intr_batch_cntr_thres_entries =
1884		srng->intr_batch_cntr_thres_entries;
1885	params->low_threshold = srng->u.src_ring.low_threshold;
1886	params->msi_addr = srng->msi_addr;
1887	params->msi2_addr = srng->msi2_addr;
1888	params->msi_data = srng->msi_data;
1889	params->msi2_data = srng->msi2_data;
1890	params->flags = srng->flags;
1891}
1892
1893dma_addr_t ath12k_hal_srng_get_hp_addr(struct ath12k_base *ab,
1894				       struct hal_srng *srng)
1895{
1896	if (!(srng->flags & HAL_SRNG_FLAGS_LMAC_RING))
1897		return 0;
1898
1899	if (srng->ring_dir == HAL_SRNG_DIR_SRC)
1900		return ab->hal.wrp.paddr +
1901		       ((unsigned long)srng->u.src_ring.hp_addr -
1902			(unsigned long)ab->hal.wrp.vaddr);
1903	else
1904		return ab->hal.rdp.paddr +
1905		       ((unsigned long)srng->u.dst_ring.hp_addr -
1906			 (unsigned long)ab->hal.rdp.vaddr);
1907}
1908
1909dma_addr_t ath12k_hal_srng_get_tp_addr(struct ath12k_base *ab,
1910				       struct hal_srng *srng)
1911{
1912	if (!(srng->flags & HAL_SRNG_FLAGS_LMAC_RING))
1913		return 0;
1914
1915	if (srng->ring_dir == HAL_SRNG_DIR_SRC)
1916		return ab->hal.rdp.paddr +
1917		       ((unsigned long)srng->u.src_ring.tp_addr -
1918			(unsigned long)ab->hal.rdp.vaddr);
1919	else
1920		return ab->hal.wrp.paddr +
1921		       ((unsigned long)srng->u.dst_ring.tp_addr -
1922			(unsigned long)ab->hal.wrp.vaddr);
1923}
1924
1925u32 ath12k_hal_ce_get_desc_size(enum hal_ce_desc type)
1926{
1927	switch (type) {
1928	case HAL_CE_DESC_SRC:
1929		return sizeof(struct hal_ce_srng_src_desc);
1930	case HAL_CE_DESC_DST:
1931		return sizeof(struct hal_ce_srng_dest_desc);
1932	case HAL_CE_DESC_DST_STATUS:
1933		return sizeof(struct hal_ce_srng_dst_status_desc);
1934	}
1935
1936	return 0;
1937}
1938
1939void ath12k_hal_ce_src_set_desc(struct hal_ce_srng_src_desc *desc, dma_addr_t paddr,
1940				u32 len, u32 id, u8 byte_swap_data)
1941{
1942	desc->buffer_addr_low = cpu_to_le32(paddr & HAL_ADDR_LSB_REG_MASK);
1943	desc->buffer_addr_info =
1944		le32_encode_bits(((u64)paddr >> HAL_ADDR_MSB_REG_SHIFT),
1945				 HAL_CE_SRC_DESC_ADDR_INFO_ADDR_HI) |
1946		le32_encode_bits(byte_swap_data,
1947				 HAL_CE_SRC_DESC_ADDR_INFO_BYTE_SWAP) |
1948		le32_encode_bits(0, HAL_CE_SRC_DESC_ADDR_INFO_GATHER) |
1949		le32_encode_bits(len, HAL_CE_SRC_DESC_ADDR_INFO_LEN);
1950	desc->meta_info = le32_encode_bits(id, HAL_CE_SRC_DESC_META_INFO_DATA);
1951}
1952
1953void ath12k_hal_ce_dst_set_desc(struct hal_ce_srng_dest_desc *desc, dma_addr_t paddr)
1954{
1955	desc->buffer_addr_low = cpu_to_le32(paddr & HAL_ADDR_LSB_REG_MASK);
1956	desc->buffer_addr_info =
1957		le32_encode_bits(((u64)paddr >> HAL_ADDR_MSB_REG_SHIFT),
1958				 HAL_CE_DEST_DESC_ADDR_INFO_ADDR_HI);
1959}
1960
1961u32 ath12k_hal_ce_dst_status_get_length(struct hal_ce_srng_dst_status_desc *desc)
1962{
1963	u32 len;
1964
1965	len = le32_get_bits(desc->flags, HAL_CE_DST_STATUS_DESC_FLAGS_LEN);
1966	desc->flags &= ~cpu_to_le32(HAL_CE_DST_STATUS_DESC_FLAGS_LEN);
1967
1968	return len;
1969}
1970
1971void ath12k_hal_set_link_desc_addr(struct hal_wbm_link_desc *desc, u32 cookie,
1972				   dma_addr_t paddr,
1973				   enum hal_rx_buf_return_buf_manager rbm)
1974{
1975	desc->buf_addr_info.info0 = le32_encode_bits((paddr & HAL_ADDR_LSB_REG_MASK),
1976						     BUFFER_ADDR_INFO0_ADDR);
1977	desc->buf_addr_info.info1 =
1978			le32_encode_bits(((u64)paddr >> HAL_ADDR_MSB_REG_SHIFT),
1979					 BUFFER_ADDR_INFO1_ADDR) |
1980			le32_encode_bits(rbm, BUFFER_ADDR_INFO1_RET_BUF_MGR) |
1981			le32_encode_bits(cookie, BUFFER_ADDR_INFO1_SW_COOKIE);
1982}
1983
1984void *ath12k_hal_srng_dst_peek(struct ath12k_base *ab, struct hal_srng *srng)
1985{
1986	lockdep_assert_held(&srng->lock);
1987
1988	if (srng->u.dst_ring.tp != srng->u.dst_ring.cached_hp)
1989		return (srng->ring_base_vaddr + srng->u.dst_ring.tp);
1990
1991	return NULL;
1992}
1993
1994void *ath12k_hal_srng_dst_get_next_entry(struct ath12k_base *ab,
1995					 struct hal_srng *srng)
1996{
1997	void *desc;
1998
1999	lockdep_assert_held(&srng->lock);
2000
2001	if (srng->u.dst_ring.tp == srng->u.dst_ring.cached_hp)
2002		return NULL;
2003
2004	desc = srng->ring_base_vaddr + srng->u.dst_ring.tp;
2005
2006	srng->u.dst_ring.tp = (srng->u.dst_ring.tp + srng->entry_size) %
2007			      srng->ring_size;
2008
2009	return desc;
2010}
2011
2012int ath12k_hal_srng_dst_num_free(struct ath12k_base *ab, struct hal_srng *srng,
2013				 bool sync_hw_ptr)
2014{
2015	u32 tp, hp;
2016
2017	lockdep_assert_held(&srng->lock);
2018
2019	tp = srng->u.dst_ring.tp;
2020
2021	if (sync_hw_ptr) {
2022		hp = *srng->u.dst_ring.hp_addr;
2023		srng->u.dst_ring.cached_hp = hp;
2024	} else {
2025		hp = srng->u.dst_ring.cached_hp;
2026	}
2027
2028	if (hp >= tp)
2029		return (hp - tp) / srng->entry_size;
2030	else
2031		return (srng->ring_size - tp + hp) / srng->entry_size;
2032}
2033
2034/* Returns number of available entries in src ring */
2035int ath12k_hal_srng_src_num_free(struct ath12k_base *ab, struct hal_srng *srng,
2036				 bool sync_hw_ptr)
2037{
2038	u32 tp, hp;
2039
2040	lockdep_assert_held(&srng->lock);
2041
2042	hp = srng->u.src_ring.hp;
2043
2044	if (sync_hw_ptr) {
2045		tp = *srng->u.src_ring.tp_addr;
2046		srng->u.src_ring.cached_tp = tp;
2047	} else {
2048		tp = srng->u.src_ring.cached_tp;
2049	}
2050
2051	if (tp > hp)
2052		return ((tp - hp) / srng->entry_size) - 1;
2053	else
2054		return ((srng->ring_size - hp + tp) / srng->entry_size) - 1;
2055}
2056
2057void *ath12k_hal_srng_src_get_next_entry(struct ath12k_base *ab,
2058					 struct hal_srng *srng)
2059{
2060	void *desc;
2061	u32 next_hp;
2062
2063	lockdep_assert_held(&srng->lock);
2064
2065	/* TODO: Using % is expensive, but we have to do this since size of some
2066	 * SRNG rings is not power of 2 (due to descriptor sizes). Need to see
2067	 * if separate function is defined for rings having power of 2 ring size
2068	 * (TCL2SW, REO2SW, SW2RXDMA and CE rings) so that we can avoid the
2069	 * overhead of % by using mask (with &).
2070	 */
2071	next_hp = (srng->u.src_ring.hp + srng->entry_size) % srng->ring_size;
2072
2073	if (next_hp == srng->u.src_ring.cached_tp)
2074		return NULL;
2075
2076	desc = srng->ring_base_vaddr + srng->u.src_ring.hp;
2077	srng->u.src_ring.hp = next_hp;
2078
2079	/* TODO: Reap functionality is not used by all rings. If particular
2080	 * ring does not use reap functionality, we need not update reap_hp
2081	 * with next_hp pointer. Need to make sure a separate function is used
2082	 * before doing any optimization by removing below code updating
2083	 * reap_hp.
2084	 */
2085	srng->u.src_ring.reap_hp = next_hp;
2086
2087	return desc;
2088}
2089
2090void *ath12k_hal_srng_src_reap_next(struct ath12k_base *ab,
2091				    struct hal_srng *srng)
2092{
2093	void *desc;
2094	u32 next_reap_hp;
2095
2096	lockdep_assert_held(&srng->lock);
2097
2098	next_reap_hp = (srng->u.src_ring.reap_hp + srng->entry_size) %
2099		       srng->ring_size;
2100
2101	if (next_reap_hp == srng->u.src_ring.cached_tp)
2102		return NULL;
2103
2104	desc = srng->ring_base_vaddr + next_reap_hp;
2105	srng->u.src_ring.reap_hp = next_reap_hp;
2106
2107	return desc;
2108}
2109
2110void *ath12k_hal_srng_src_get_next_reaped(struct ath12k_base *ab,
2111					  struct hal_srng *srng)
2112{
2113	void *desc;
2114
2115	lockdep_assert_held(&srng->lock);
2116
2117	if (srng->u.src_ring.hp == srng->u.src_ring.reap_hp)
2118		return NULL;
2119
2120	desc = srng->ring_base_vaddr + srng->u.src_ring.hp;
2121	srng->u.src_ring.hp = (srng->u.src_ring.hp + srng->entry_size) %
2122			      srng->ring_size;
2123
2124	return desc;
2125}
2126
2127void ath12k_hal_srng_access_begin(struct ath12k_base *ab, struct hal_srng *srng)
2128{
2129	lockdep_assert_held(&srng->lock);
2130
2131	if (srng->ring_dir == HAL_SRNG_DIR_SRC)
2132		srng->u.src_ring.cached_tp =
2133			*(volatile u32 *)srng->u.src_ring.tp_addr;
2134	else
2135		srng->u.dst_ring.cached_hp = *srng->u.dst_ring.hp_addr;
2136}
2137
2138/* Update cached ring head/tail pointers to HW. ath12k_hal_srng_access_begin()
2139 * should have been called before this.
2140 */
2141void ath12k_hal_srng_access_end(struct ath12k_base *ab, struct hal_srng *srng)
2142{
2143	lockdep_assert_held(&srng->lock);
2144
2145	/* TODO: See if we need a write memory barrier here */
2146	if (srng->flags & HAL_SRNG_FLAGS_LMAC_RING) {
2147		/* For LMAC rings, ring pointer updates are done through FW and
2148		 * hence written to a shared memory location that is read by FW
2149		 */
2150		if (srng->ring_dir == HAL_SRNG_DIR_SRC) {
2151			srng->u.src_ring.last_tp =
2152				*(volatile u32 *)srng->u.src_ring.tp_addr;
2153			*srng->u.src_ring.hp_addr = srng->u.src_ring.hp;
2154		} else {
2155			srng->u.dst_ring.last_hp = *srng->u.dst_ring.hp_addr;
2156			*srng->u.dst_ring.tp_addr = srng->u.dst_ring.tp;
2157		}
2158	} else {
2159		if (srng->ring_dir == HAL_SRNG_DIR_SRC) {
2160			srng->u.src_ring.last_tp =
2161				*(volatile u32 *)srng->u.src_ring.tp_addr;
2162			ath12k_hif_write32(ab,
2163					   (unsigned long)srng->u.src_ring.hp_addr -
2164					   (unsigned long)ab->mem,
2165					   srng->u.src_ring.hp);
2166		} else {
2167			srng->u.dst_ring.last_hp = *srng->u.dst_ring.hp_addr;
2168			ath12k_hif_write32(ab,
2169					   (unsigned long)srng->u.dst_ring.tp_addr -
2170					   (unsigned long)ab->mem,
2171					   srng->u.dst_ring.tp);
2172		}
2173	}
2174
2175	srng->timestamp = jiffies;
2176}
2177
2178void ath12k_hal_setup_link_idle_list(struct ath12k_base *ab,
2179				     struct hal_wbm_idle_scatter_list *sbuf,
2180				     u32 nsbufs, u32 tot_link_desc,
2181				     u32 end_offset)
2182{
2183	struct ath12k_buffer_addr *link_addr;
2184	int i;
2185	u32 reg_scatter_buf_sz = HAL_WBM_IDLE_SCATTER_BUF_SIZE / 64;
2186	u32 val;
2187
2188	link_addr = (void *)sbuf[0].vaddr + HAL_WBM_IDLE_SCATTER_BUF_SIZE;
2189
2190	for (i = 1; i < nsbufs; i++) {
2191		link_addr->info0 = cpu_to_le32(sbuf[i].paddr & HAL_ADDR_LSB_REG_MASK);
2192
2193		link_addr->info1 =
2194			le32_encode_bits((u64)sbuf[i].paddr >> HAL_ADDR_MSB_REG_SHIFT,
2195					 HAL_WBM_SCATTERED_DESC_MSB_BASE_ADDR_39_32) |
2196			le32_encode_bits(BASE_ADDR_MATCH_TAG_VAL,
2197					 HAL_WBM_SCATTERED_DESC_MSB_BASE_ADDR_MATCH_TAG);
2198
2199		link_addr = (void *)sbuf[i].vaddr +
2200			     HAL_WBM_IDLE_SCATTER_BUF_SIZE;
2201	}
2202
2203	val = u32_encode_bits(reg_scatter_buf_sz, HAL_WBM_SCATTER_BUFFER_SIZE) |
2204	      u32_encode_bits(0x1, HAL_WBM_LINK_DESC_IDLE_LIST_MODE);
2205
2206	ath12k_hif_write32(ab,
2207			   HAL_SEQ_WCSS_UMAC_WBM_REG +
2208			   HAL_WBM_R0_IDLE_LIST_CONTROL_ADDR(ab),
2209			   val);
2210
2211	val = u32_encode_bits(reg_scatter_buf_sz * nsbufs,
2212			      HAL_WBM_SCATTER_RING_SIZE_OF_IDLE_LINK_DESC_LIST);
2213	ath12k_hif_write32(ab,
2214			   HAL_SEQ_WCSS_UMAC_WBM_REG + HAL_WBM_R0_IDLE_LIST_SIZE_ADDR(ab),
2215			   val);
2216
2217	val = u32_encode_bits(sbuf[0].paddr & HAL_ADDR_LSB_REG_MASK,
2218			      BUFFER_ADDR_INFO0_ADDR);
2219	ath12k_hif_write32(ab,
2220			   HAL_SEQ_WCSS_UMAC_WBM_REG +
2221			   HAL_WBM_SCATTERED_RING_BASE_LSB(ab),
2222			   val);
2223
2224	val = u32_encode_bits(BASE_ADDR_MATCH_TAG_VAL,
2225			      HAL_WBM_SCATTERED_DESC_MSB_BASE_ADDR_MATCH_TAG) |
2226	      u32_encode_bits((u64)sbuf[0].paddr >> HAL_ADDR_MSB_REG_SHIFT,
2227			      HAL_WBM_SCATTERED_DESC_MSB_BASE_ADDR_39_32);
2228	ath12k_hif_write32(ab,
2229			   HAL_SEQ_WCSS_UMAC_WBM_REG +
2230			   HAL_WBM_SCATTERED_RING_BASE_MSB(ab),
2231			   val);
2232
2233	/* Setup head and tail pointers for the idle list */
2234	val = u32_encode_bits(sbuf[nsbufs - 1].paddr, BUFFER_ADDR_INFO0_ADDR);
2235	ath12k_hif_write32(ab,
2236			   HAL_SEQ_WCSS_UMAC_WBM_REG +
2237			   HAL_WBM_SCATTERED_DESC_PTR_HEAD_INFO_IX0(ab),
2238			   val);
2239
2240	val = u32_encode_bits(((u64)sbuf[nsbufs - 1].paddr >> HAL_ADDR_MSB_REG_SHIFT),
2241			      HAL_WBM_SCATTERED_DESC_MSB_BASE_ADDR_39_32) |
2242	       u32_encode_bits((end_offset >> 2),
2243			       HAL_WBM_SCATTERED_DESC_HEAD_P_OFFSET_IX1);
2244	ath12k_hif_write32(ab,
2245			   HAL_SEQ_WCSS_UMAC_WBM_REG +
2246			   HAL_WBM_SCATTERED_DESC_PTR_HEAD_INFO_IX1(ab),
2247			   val);
2248
2249	val = u32_encode_bits(sbuf[0].paddr, BUFFER_ADDR_INFO0_ADDR);
2250	ath12k_hif_write32(ab,
2251			   HAL_SEQ_WCSS_UMAC_WBM_REG +
2252			   HAL_WBM_SCATTERED_DESC_PTR_HEAD_INFO_IX0(ab),
2253			   val);
2254
2255	val = u32_encode_bits(sbuf[0].paddr, BUFFER_ADDR_INFO0_ADDR);
2256	ath12k_hif_write32(ab,
2257			   HAL_SEQ_WCSS_UMAC_WBM_REG +
2258			   HAL_WBM_SCATTERED_DESC_PTR_TAIL_INFO_IX0(ab),
2259			   val);
2260
2261	val = u32_encode_bits(((u64)sbuf[0].paddr >> HAL_ADDR_MSB_REG_SHIFT),
2262			      HAL_WBM_SCATTERED_DESC_MSB_BASE_ADDR_39_32) |
2263	      u32_encode_bits(0, HAL_WBM_SCATTERED_DESC_TAIL_P_OFFSET_IX1);
2264	ath12k_hif_write32(ab,
2265			   HAL_SEQ_WCSS_UMAC_WBM_REG +
2266			   HAL_WBM_SCATTERED_DESC_PTR_TAIL_INFO_IX1(ab),
2267			   val);
2268
2269	val = 2 * tot_link_desc;
2270	ath12k_hif_write32(ab,
2271			   HAL_SEQ_WCSS_UMAC_WBM_REG +
2272			   HAL_WBM_SCATTERED_DESC_PTR_HP_ADDR(ab),
2273			   val);
2274
2275	/* Enable the SRNG */
2276	val = u32_encode_bits(1, HAL_WBM_IDLE_LINK_RING_MISC_SRNG_ENABLE) |
2277	      u32_encode_bits(1, HAL_WBM_IDLE_LINK_RING_MISC_RIND_ID_DISABLE);
2278	ath12k_hif_write32(ab,
2279			   HAL_SEQ_WCSS_UMAC_WBM_REG +
2280			   HAL_WBM_IDLE_LINK_RING_MISC_ADDR(ab),
2281			   val);
2282}
2283
2284int ath12k_hal_srng_setup(struct ath12k_base *ab, enum hal_ring_type type,
2285			  int ring_num, int mac_id,
2286			  struct hal_srng_params *params)
2287{
2288	struct ath12k_hal *hal = &ab->hal;
2289	struct hal_srng_config *srng_config = &ab->hal.srng_config[type];
2290	struct hal_srng *srng;
2291	int ring_id;
2292	u32 idx;
2293	int i;
2294	u32 reg_base;
2295
2296	ring_id = ath12k_hal_srng_get_ring_id(ab, type, ring_num, mac_id);
2297	if (ring_id < 0)
2298		return ring_id;
2299
2300	srng = &hal->srng_list[ring_id];
2301
2302	srng->ring_id = ring_id;
2303	srng->ring_dir = srng_config->ring_dir;
2304	srng->ring_base_paddr = params->ring_base_paddr;
2305	srng->ring_base_vaddr = params->ring_base_vaddr;
2306	srng->entry_size = srng_config->entry_size;
2307	srng->num_entries = params->num_entries;
2308	srng->ring_size = srng->entry_size * srng->num_entries;
2309	srng->intr_batch_cntr_thres_entries =
2310				params->intr_batch_cntr_thres_entries;
2311	srng->intr_timer_thres_us = params->intr_timer_thres_us;
2312	srng->flags = params->flags;
2313	srng->msi_addr = params->msi_addr;
2314	srng->msi2_addr = params->msi2_addr;
2315	srng->msi_data = params->msi_data;
2316	srng->msi2_data = params->msi2_data;
2317	srng->initialized = 1;
2318	spin_lock_init(&srng->lock);
2319	lockdep_set_class(&srng->lock, &srng->lock_key);
2320
2321	for (i = 0; i < HAL_SRNG_NUM_REG_GRP; i++) {
2322		srng->hwreg_base[i] = srng_config->reg_start[i] +
2323				      (ring_num * srng_config->reg_size[i]);
2324	}
2325
2326	memset(srng->ring_base_vaddr, 0,
2327	       (srng->entry_size * srng->num_entries) << 2);
2328
2329	reg_base = srng->hwreg_base[HAL_SRNG_REG_GRP_R2];
2330
2331	if (srng->ring_dir == HAL_SRNG_DIR_SRC) {
2332		srng->u.src_ring.hp = 0;
2333		srng->u.src_ring.cached_tp = 0;
2334		srng->u.src_ring.reap_hp = srng->ring_size - srng->entry_size;
2335		srng->u.src_ring.tp_addr = (void *)(hal->rdp.vaddr + ring_id);
2336		srng->u.src_ring.low_threshold = params->low_threshold *
2337						 srng->entry_size;
2338		if (srng_config->mac_type == ATH12K_HAL_SRNG_UMAC) {
2339			if (!ab->hw_params->supports_shadow_regs)
2340				srng->u.src_ring.hp_addr =
2341					(u32 *)((unsigned long)ab->mem + reg_base);
2342			else
2343				ath12k_dbg(ab, ATH12K_DBG_HAL,
2344					   "hal type %d ring_num %d reg_base 0x%x shadow 0x%lx\n",
2345					   type, ring_num,
2346					   reg_base,
2347					   (unsigned long)srng->u.src_ring.hp_addr -
2348					   (unsigned long)ab->mem);
2349		} else {
2350			idx = ring_id - HAL_SRNG_RING_ID_DMAC_CMN_ID_START;
2351			srng->u.src_ring.hp_addr = (void *)(hal->wrp.vaddr +
2352						   idx);
2353			srng->flags |= HAL_SRNG_FLAGS_LMAC_RING;
2354		}
2355	} else {
2356		/* During initialization loop count in all the descriptors
2357		 * will be set to zero, and HW will set it to 1 on completing
2358		 * descriptor update in first loop, and increments it by 1 on
2359		 * subsequent loops (loop count wraps around after reaching
2360		 * 0xffff). The 'loop_cnt' in SW ring state is the expected
2361		 * loop count in descriptors updated by HW (to be processed
2362		 * by SW).
2363		 */
2364		srng->u.dst_ring.loop_cnt = 1;
2365		srng->u.dst_ring.tp = 0;
2366		srng->u.dst_ring.cached_hp = 0;
2367		srng->u.dst_ring.hp_addr = (void *)(hal->rdp.vaddr + ring_id);
2368		if (srng_config->mac_type == ATH12K_HAL_SRNG_UMAC) {
2369			if (!ab->hw_params->supports_shadow_regs)
2370				srng->u.dst_ring.tp_addr =
2371					(u32 *)((unsigned long)ab->mem + reg_base +
2372					(HAL_REO1_RING_TP - HAL_REO1_RING_HP));
2373			else
2374				ath12k_dbg(ab, ATH12K_DBG_HAL,
2375					   "type %d ring_num %d target_reg 0x%x shadow 0x%lx\n",
2376					   type, ring_num,
2377					   reg_base + HAL_REO1_RING_TP - HAL_REO1_RING_HP,
2378					   (unsigned long)srng->u.dst_ring.tp_addr -
2379					   (unsigned long)ab->mem);
2380		} else {
2381			/* For PMAC & DMAC rings, tail pointer updates will be done
2382			 * through FW by writing to a shared memory location
2383			 */
2384			idx = ring_id - HAL_SRNG_RING_ID_DMAC_CMN_ID_START;
2385			srng->u.dst_ring.tp_addr = (void *)(hal->wrp.vaddr +
2386						   idx);
2387			srng->flags |= HAL_SRNG_FLAGS_LMAC_RING;
2388		}
2389	}
2390
2391	if (srng_config->mac_type != ATH12K_HAL_SRNG_UMAC)
2392		return ring_id;
2393
2394	ath12k_hal_srng_hw_init(ab, srng);
2395
2396	if (type == HAL_CE_DST) {
2397		srng->u.dst_ring.max_buffer_length = params->max_buffer_len;
2398		ath12k_hal_ce_dst_setup(ab, srng, ring_num);
2399	}
2400
2401	return ring_id;
2402}
2403
2404static void ath12k_hal_srng_update_hp_tp_addr(struct ath12k_base *ab,
2405					      int shadow_cfg_idx,
2406					      enum hal_ring_type ring_type,
2407					      int ring_num)
2408{
2409	struct hal_srng *srng;
2410	struct ath12k_hal *hal = &ab->hal;
2411	int ring_id;
2412	struct hal_srng_config *srng_config = &hal->srng_config[ring_type];
2413
2414	ring_id = ath12k_hal_srng_get_ring_id(ab, ring_type, ring_num, 0);
2415	if (ring_id < 0)
2416		return;
2417
2418	srng = &hal->srng_list[ring_id];
2419
2420	if (srng_config->ring_dir == HAL_SRNG_DIR_DST)
2421		srng->u.dst_ring.tp_addr = (u32 *)(HAL_SHADOW_REG(shadow_cfg_idx) +
2422						   (unsigned long)ab->mem);
2423	else
2424		srng->u.src_ring.hp_addr = (u32 *)(HAL_SHADOW_REG(shadow_cfg_idx) +
2425						   (unsigned long)ab->mem);
2426}
2427
2428int ath12k_hal_srng_update_shadow_config(struct ath12k_base *ab,
2429					 enum hal_ring_type ring_type,
2430					 int ring_num)
2431{
2432	struct ath12k_hal *hal = &ab->hal;
2433	struct hal_srng_config *srng_config = &hal->srng_config[ring_type];
2434	int shadow_cfg_idx = hal->num_shadow_reg_configured;
2435	u32 target_reg;
2436
2437	if (shadow_cfg_idx >= HAL_SHADOW_NUM_REGS)
2438		return -EINVAL;
2439
2440	hal->num_shadow_reg_configured++;
2441
2442	target_reg = srng_config->reg_start[HAL_HP_OFFSET_IN_REG_START];
2443	target_reg += srng_config->reg_size[HAL_HP_OFFSET_IN_REG_START] *
2444		ring_num;
2445
2446	/* For destination ring, shadow the TP */
2447	if (srng_config->ring_dir == HAL_SRNG_DIR_DST)
2448		target_reg += HAL_OFFSET_FROM_HP_TO_TP;
2449
2450	hal->shadow_reg_addr[shadow_cfg_idx] = target_reg;
2451
2452	/* update hp/tp addr to hal structure*/
2453	ath12k_hal_srng_update_hp_tp_addr(ab, shadow_cfg_idx, ring_type,
2454					  ring_num);
2455
2456	ath12k_dbg(ab, ATH12K_DBG_HAL,
2457		   "target_reg %x, shadow reg 0x%x shadow_idx 0x%x, ring_type %d, ring num %d",
2458		  target_reg,
2459		  HAL_SHADOW_REG(shadow_cfg_idx),
2460		  shadow_cfg_idx,
2461		  ring_type, ring_num);
2462
2463	return 0;
2464}
2465
2466void ath12k_hal_srng_shadow_config(struct ath12k_base *ab)
2467{
2468	struct ath12k_hal *hal = &ab->hal;
2469	int ring_type, ring_num;
2470
2471	/* update all the non-CE srngs. */
2472	for (ring_type = 0; ring_type < HAL_MAX_RING_TYPES; ring_type++) {
2473		struct hal_srng_config *srng_config = &hal->srng_config[ring_type];
2474
2475		if (ring_type == HAL_CE_SRC ||
2476		    ring_type == HAL_CE_DST ||
2477			ring_type == HAL_CE_DST_STATUS)
2478			continue;
2479
2480		if (srng_config->mac_type == ATH12K_HAL_SRNG_DMAC ||
2481		    srng_config->mac_type == ATH12K_HAL_SRNG_PMAC)
2482			continue;
2483
2484		for (ring_num = 0; ring_num < srng_config->max_rings; ring_num++)
2485			ath12k_hal_srng_update_shadow_config(ab, ring_type, ring_num);
2486	}
2487}
2488
2489void ath12k_hal_srng_get_shadow_config(struct ath12k_base *ab,
2490				       u32 **cfg, u32 *len)
2491{
2492	struct ath12k_hal *hal = &ab->hal;
2493
2494	*len = hal->num_shadow_reg_configured;
2495	*cfg = hal->shadow_reg_addr;
2496}
2497
2498void ath12k_hal_srng_shadow_update_hp_tp(struct ath12k_base *ab,
2499					 struct hal_srng *srng)
2500{
2501	lockdep_assert_held(&srng->lock);
2502
2503	/* check whether the ring is empty. Update the shadow
2504	 * HP only when then ring isn't' empty.
2505	 */
2506	if (srng->ring_dir == HAL_SRNG_DIR_SRC &&
2507	    *srng->u.src_ring.tp_addr != srng->u.src_ring.hp)
2508		ath12k_hal_srng_access_end(ab, srng);
2509}
2510
2511static void ath12k_hal_register_srng_lock_keys(struct ath12k_base *ab)
2512{
2513	struct ath12k_hal *hal = &ab->hal;
2514	u32 ring_id;
2515
2516	for (ring_id = 0; ring_id < HAL_SRNG_RING_ID_MAX; ring_id++)
2517		lockdep_register_key(&hal->srng_list[ring_id].lock_key);
2518}
2519
2520static void ath12k_hal_unregister_srng_lock_keys(struct ath12k_base *ab)
2521{
2522	struct ath12k_hal *hal = &ab->hal;
2523	u32 ring_id;
2524
2525	for (ring_id = 0; ring_id < HAL_SRNG_RING_ID_MAX; ring_id++)
2526		lockdep_unregister_key(&hal->srng_list[ring_id].lock_key);
2527}
2528
2529int ath12k_hal_srng_init(struct ath12k_base *ab)
2530{
2531	struct ath12k_hal *hal = &ab->hal;
2532	int ret;
2533
2534	memset(hal, 0, sizeof(*hal));
2535
2536	ret = ab->hw_params->hal_ops->create_srng_config(ab);
2537	if (ret)
2538		goto err_hal;
2539
2540	ret = ath12k_hal_alloc_cont_rdp(ab);
2541	if (ret)
2542		goto err_hal;
2543
2544	ret = ath12k_hal_alloc_cont_wrp(ab);
2545	if (ret)
2546		goto err_free_cont_rdp;
2547
2548	ath12k_hal_register_srng_lock_keys(ab);
2549
2550	return 0;
2551
2552err_free_cont_rdp:
2553	ath12k_hal_free_cont_rdp(ab);
2554
2555err_hal:
2556	return ret;
2557}
2558
2559void ath12k_hal_srng_deinit(struct ath12k_base *ab)
2560{
2561	struct ath12k_hal *hal = &ab->hal;
2562
2563	ath12k_hal_unregister_srng_lock_keys(ab);
2564	ath12k_hal_free_cont_rdp(ab);
2565	ath12k_hal_free_cont_wrp(ab);
2566	kfree(hal->srng_config);
2567	hal->srng_config = NULL;
2568}
2569
2570void ath12k_hal_dump_srng_stats(struct ath12k_base *ab)
2571{
2572	struct hal_srng *srng;
2573	struct ath12k_ext_irq_grp *irq_grp;
2574	struct ath12k_ce_pipe *ce_pipe;
2575	int i;
2576
2577	ath12k_err(ab, "Last interrupt received for each CE:\n");
2578	for (i = 0; i < ab->hw_params->ce_count; i++) {
2579		ce_pipe = &ab->ce.ce_pipe[i];
2580
2581		if (ath12k_ce_get_attr_flags(ab, i) & CE_ATTR_DIS_INTR)
2582			continue;
2583
2584		ath12k_err(ab, "CE_id %d pipe_num %d %ums before\n",
2585			   i, ce_pipe->pipe_num,
2586			   jiffies_to_msecs(jiffies - ce_pipe->timestamp));
2587	}
2588
2589	ath12k_err(ab, "\nLast interrupt received for each group:\n");
2590	for (i = 0; i < ATH12K_EXT_IRQ_GRP_NUM_MAX; i++) {
2591		irq_grp = &ab->ext_irq_grp[i];
2592		ath12k_err(ab, "group_id %d %ums before\n",
2593			   irq_grp->grp_id,
2594			   jiffies_to_msecs(jiffies - irq_grp->timestamp));
2595	}
2596
2597	for (i = 0; i < HAL_SRNG_RING_ID_MAX; i++) {
2598		srng = &ab->hal.srng_list[i];
2599
2600		if (!srng->initialized)
2601			continue;
2602
2603		if (srng->ring_dir == HAL_SRNG_DIR_SRC)
2604			ath12k_err(ab,
2605				   "src srng id %u hp %u, reap_hp %u, cur tp %u, cached tp %u last tp %u napi processed before %ums\n",
2606				   srng->ring_id, srng->u.src_ring.hp,
2607				   srng->u.src_ring.reap_hp,
2608				   *srng->u.src_ring.tp_addr, srng->u.src_ring.cached_tp,
2609				   srng->u.src_ring.last_tp,
2610				   jiffies_to_msecs(jiffies - srng->timestamp));
2611		else if (srng->ring_dir == HAL_SRNG_DIR_DST)
2612			ath12k_err(ab,
2613				   "dst srng id %u tp %u, cur hp %u, cached hp %u last hp %u napi processed before %ums\n",
2614				   srng->ring_id, srng->u.dst_ring.tp,
2615				   *srng->u.dst_ring.hp_addr,
2616				   srng->u.dst_ring.cached_hp,
2617				   srng->u.dst_ring.last_hp,
2618				   jiffies_to_msecs(jiffies - srng->timestamp));
2619	}
2620}