Commit 6a019851 authored by Nithyanantham Paramasivam's avatar Nithyanantham Paramasivam Committed by Jeff Johnson
Browse files

wifi: ath12k: Refactor REO command to use ath12k_dp_rx_tid_rxq



Introduce ath12k_dp_rx_tid_rxq as a lightweight structure to represent
only the necessary fields for REO command construction. Replace direct
usage of ath12k_dp_rx_tid in REO command paths with this new structure.

This decouples REO command logic from internal TID state representation,
improves modularity, and reduces unnecessary data dependencies.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3

Signed-off-by: default avatarNithyanantham Paramasivam <nithyanantham.paramasivam@oss.qualcomm.com>
Reviewed-by: default avatarBaochen Qiang <baochen.qiang@oss.qualcomm.com>
Reviewed-by: default avatarVasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com>
Link: https://patch.msgid.link/20250806111750.3214584-5-nithyanantham.paramasivam@oss.qualcomm.com


Signed-off-by: default avatarJeff Johnson <jeff.johnson@oss.qualcomm.com>
parent f829a1f8
Loading
Loading
Loading
Loading
+32 −14
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@
#define ATH12K_DP_RX_FRAGMENT_TIMEOUT_MS (2 * HZ)

static int ath12k_dp_rx_tid_delete_handler(struct ath12k_base *ab,
					     struct ath12k_dp_rx_tid *rx_tid);
					   struct ath12k_dp_rx_tid_rxq *rx_tid);

static enum hal_encrypt_type ath12k_dp_rx_h_enctype(struct ath12k_base *ab,
						    struct hal_rx_desc *desc)
@@ -584,6 +584,14 @@ static int ath12k_dp_rx_pdev_srng_alloc(struct ath12k *ar)
	return 0;
}

static void ath12k_dp_init_rx_tid_rxq(struct ath12k_dp_rx_tid_rxq *rx_tid_rxq,
				      struct ath12k_dp_rx_tid *rx_tid)
{
	rx_tid_rxq->tid = rx_tid->tid;
	rx_tid_rxq->active = rx_tid->active;
	rx_tid_rxq->qbuf = rx_tid->qbuf;
}

static void ath12k_dp_rx_tid_cleanup(struct ath12k_base *ab,
				     struct ath12k_reoq_buf *tid_qbuf)
{
@@ -621,7 +629,7 @@ void ath12k_dp_rx_reo_cmd_list_cleanup(struct ath12k_base *ab)
static void ath12k_dp_reo_cmd_free(struct ath12k_dp *dp, void *ctx,
				   enum hal_reo_cmd_status status)
{
	struct ath12k_dp_rx_tid *rx_tid = ctx;
	struct ath12k_dp_rx_tid_rxq *rx_tid = ctx;

	if (status != HAL_REO_CMD_SUCCESS)
		ath12k_warn(dp->ab, "failed to flush rx tid hw desc, tid %d status %d\n",
@@ -630,7 +638,8 @@ static void ath12k_dp_reo_cmd_free(struct ath12k_dp *dp, void *ctx,
	ath12k_dp_rx_tid_cleanup(dp->ab, &rx_tid->qbuf);
}

static int ath12k_dp_reo_cmd_send(struct ath12k_base *ab, struct ath12k_dp_rx_tid *rx_tid,
static int ath12k_dp_reo_cmd_send(struct ath12k_base *ab,
				  struct ath12k_dp_rx_tid_rxq *rx_tid,
				  enum hal_reo_cmd_type type,
				  struct ath12k_hal_reo_cmd *cmd,
				  void (*cb)(struct ath12k_dp *dp, void *ctx,
@@ -676,7 +685,7 @@ static int ath12k_dp_reo_cmd_send(struct ath12k_base *ab, struct ath12k_dp_rx_ti
}

static void ath12k_dp_reo_cache_flush(struct ath12k_base *ab,
				      struct ath12k_dp_rx_tid *rx_tid)
				      struct ath12k_dp_rx_tid_rxq *rx_tid)
{
	struct ath12k_hal_reo_cmd cmd = {};
	unsigned long tot_desc_sz, desc_sz;
@@ -719,7 +728,7 @@ static void ath12k_dp_rx_tid_del_func(struct ath12k_dp *dp, void *ctx,
				      enum hal_reo_cmd_status status)
{
	struct ath12k_base *ab = dp->ab;
	struct ath12k_dp_rx_tid *rx_tid = ctx;
	struct ath12k_dp_rx_tid_rxq *rx_tid = ctx;
	struct ath12k_dp_rx_reo_cache_flush_elem *elem, *tmp;

	if (status == HAL_REO_CMD_DRAIN) {
@@ -774,7 +783,7 @@ static void ath12k_dp_rx_tid_del_func(struct ath12k_dp *dp, void *ctx,
}

static int ath12k_dp_rx_tid_delete_handler(struct ath12k_base *ab,
					     struct ath12k_dp_rx_tid *rx_tid)
					   struct ath12k_dp_rx_tid_rxq *rx_tid)
{
	struct ath12k_hal_reo_cmd cmd = {};

@@ -849,11 +858,14 @@ void ath12k_dp_rx_peer_tid_delete(struct ath12k *ar,
{
	struct ath12k_dp_rx_tid *rx_tid = &peer->rx_tid[tid];
	int ret;
	struct ath12k_dp_rx_tid_rxq rx_tid_rxq;

	if (!rx_tid->active)
		return;

	ret = ath12k_dp_rx_tid_delete_handler(ar->ab, rx_tid);
	ath12k_dp_init_rx_tid_rxq(&rx_tid_rxq, rx_tid);

	ret = ath12k_dp_rx_tid_delete_handler(ar->ab, &rx_tid_rxq);
	if (ret) {
		ath12k_err(ar->ab, "failed to send HAL_REO_CMD_UPDATE_RX_QUEUE cmd, tid %d (%d)\n",
			   tid, ret);
@@ -950,9 +962,12 @@ static int ath12k_peer_rx_tid_reo_update(struct ath12k *ar,
{
	struct ath12k_hal_reo_cmd cmd = {};
	int ret;
	struct ath12k_dp_rx_tid_rxq rx_tid_rxq;

	cmd.addr_lo = lower_32_bits(rx_tid->qbuf.paddr_aligned);
	cmd.addr_hi = upper_32_bits(rx_tid->qbuf.paddr_aligned);
	ath12k_dp_init_rx_tid_rxq(&rx_tid_rxq, rx_tid);

	cmd.addr_lo = lower_32_bits(rx_tid_rxq.qbuf.paddr_aligned);
	cmd.addr_hi = upper_32_bits(rx_tid_rxq.qbuf.paddr_aligned);
	cmd.flag = HAL_REO_CMD_FLG_NEED_STATUS;
	cmd.upd0 = HAL_REO_CMD_UPD0_BA_WINDOW_SIZE;
	cmd.ba_window_size = ba_win_sz;
@@ -962,12 +977,12 @@ static int ath12k_peer_rx_tid_reo_update(struct ath12k *ar,
		cmd.upd2 = u32_encode_bits(ssn, HAL_REO_CMD_UPD2_SSN);
	}

	ret = ath12k_dp_reo_cmd_send(ar->ab, rx_tid,
	ret = ath12k_dp_reo_cmd_send(ar->ab, &rx_tid_rxq,
				     HAL_REO_CMD_UPDATE_RX_QUEUE, &cmd,
				     NULL);
	if (ret) {
		ath12k_warn(ar->ab, "failed to update rx tid queue, tid %d (%d)\n",
			    rx_tid->tid, ret);
			    rx_tid_rxq.tid, ret);
		return ret;
	}

@@ -1216,6 +1231,7 @@ int ath12k_dp_rx_peer_pn_replay_config(struct ath12k_link_vif *arvif,
	struct ath12k_hal_reo_cmd cmd = {};
	struct ath12k_peer *peer;
	struct ath12k_dp_rx_tid *rx_tid;
	struct ath12k_dp_rx_tid_rxq rx_tid_rxq;
	u8 tid;
	int ret = 0;

@@ -1262,9 +1278,11 @@ int ath12k_dp_rx_peer_pn_replay_config(struct ath12k_link_vif *arvif,
		rx_tid = &peer->rx_tid[tid];
		if (!rx_tid->active)
			continue;
		cmd.addr_lo = lower_32_bits(rx_tid->qbuf.paddr_aligned);
		cmd.addr_hi = upper_32_bits(rx_tid->qbuf.paddr_aligned);
		ret = ath12k_dp_reo_cmd_send(ab, rx_tid,

		ath12k_dp_init_rx_tid_rxq(&rx_tid_rxq, rx_tid);
		cmd.addr_lo = lower_32_bits(rx_tid_rxq.qbuf.paddr_aligned);
		cmd.addr_hi = upper_32_bits(rx_tid_rxq.qbuf.paddr_aligned);
		ret = ath12k_dp_reo_cmd_send(ab, &rx_tid_rxq,
					     HAL_REO_CMD_UPDATE_RX_QUEUE,
					     &cmd, NULL);
		if (ret) {
+8 −2
Original line number Diff line number Diff line
@@ -31,15 +31,21 @@ struct ath12k_dp_rx_tid {
	struct ath12k_base *ab;
};

struct ath12k_dp_rx_tid_rxq {
	u8 tid;
	bool active;
	struct ath12k_reoq_buf qbuf;
};

struct ath12k_dp_rx_reo_cache_flush_elem {
	struct list_head list;
	struct ath12k_dp_rx_tid data;
	struct ath12k_dp_rx_tid_rxq data;
	unsigned long ts;
};

struct ath12k_dp_rx_reo_cmd {
	struct list_head list;
	struct ath12k_dp_rx_tid data;
	struct ath12k_dp_rx_tid_rxq data;
	int cmd_num;
	void (*handler)(struct ath12k_dp *dp, void *ctx,
			enum hal_reo_cmd_status status);