Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ff13a5f2 authored by Jinwei Chen's avatar Jinwei Chen Committed by snandini
Browse files

qcacmn: add duplicate link desc check when refill

Same back to back link descriptor address/cookie is observed in
WBM idle link desc ring.
add duplicate link desc check when host
refill link descriptor to WBM through SW2WBM release ring,
also REO reinject ring.

Change-Id: Iaf9defd87670776fa9488d7f650efa3c08fefa60
CRs-Fixed: 2739879
parent f7305420
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -1325,4 +1325,17 @@ void dp_rx_deliver_to_stack(struct dp_soc *soc,
			    qdf_nbuf_t nbuf_head,
			    qdf_nbuf_t nbuf_tail);

/*
 * dp_rx_link_desc_refill_duplicate_check() - check if link desc duplicate
					      to refill
 * @soc: DP SOC handle
 * @buf_info: the last link desc buf info
 * @ring_buf_info: current buf address pointor including link desc
 *
 * return: none.
 */
void dp_rx_link_desc_refill_duplicate_check(
				struct dp_soc *soc,
				struct hal_buf_info *buf_info,
				hal_buff_addrinfo_t ring_buf_info);
#endif /* _DP_RX_H */
+7 −0
Original line number Diff line number Diff line
@@ -1173,6 +1173,13 @@ static QDF_STATUS dp_rx_defrag_reo_reinject(struct dp_peer *peer,
						peer->rx_tid[tid].array;
	qdf_nbuf_t nbuf_head;
	struct rx_desc_pool *rx_desc_pool = NULL;
	void *buf_addr_info = HAL_RX_REO_BUF_ADDR_INFO_GET(dst_ring_desc);

	/* do duplicate link desc address check */
	dp_rx_link_desc_refill_duplicate_check(
				soc,
				&soc->last_op_info.reo_reinject_link_desc,
				buf_addr_info);

	nbuf_head = dp_ipa_handle_rx_reo_reinject(soc, head);
	if (qdf_unlikely(!nbuf_head)) {
+26 −0
Original line number Diff line number Diff line
@@ -154,6 +154,26 @@ static inline bool dp_rx_mcast_echo_check(struct dp_soc *soc,
	return false;
}

void dp_rx_link_desc_refill_duplicate_check(
				struct dp_soc *soc,
				struct hal_buf_info *buf_info,
				hal_buff_addrinfo_t ring_buf_info)
{
	struct hal_buf_info current_link_desc_buf_info = { 0 };

	/* do duplicate link desc address check */
	hal_rx_buffer_addr_info_get_paddr(ring_buf_info,
					  &current_link_desc_buf_info);
	if (qdf_unlikely(current_link_desc_buf_info.paddr ==
			 buf_info->paddr)) {
		dp_info_rl("duplicate link desc addr: %llu, cookie: 0x%x",
			   current_link_desc_buf_info.paddr,
			   current_link_desc_buf_info.sw_cookie);
		DP_STATS_INC(soc, rx.err.dup_refill_link_desc, 1);
	}
	*buf_info = current_link_desc_buf_info;
}

/**
 * dp_rx_link_desc_return_by_addr - Return a MPDU link descriptor to
 *					(WBM) by address
@@ -180,6 +200,12 @@ dp_rx_link_desc_return_by_addr(struct dp_soc *soc,
		return status;
	}

	/* do duplicate link desc address check */
	dp_rx_link_desc_refill_duplicate_check(
				soc,
				&soc->last_op_info.wbm_rel_link_desc,
				link_desc_addr);

	if (qdf_unlikely(hal_srng_access_start(hal_soc, wbm_rel_srng))) {

		/* TODO */
+2 −0
Original line number Diff line number Diff line
@@ -5557,6 +5557,8 @@ void dp_txrx_path_stats(struct dp_soc *soc)
			       pdev->soc->stats.rx.err.invalid_link_cookie);
		DP_PRINT_STATS("Rx nbuf sanity fails: %d",
			       pdev->soc->stats.rx.err.nbuf_sanity_fail);
		DP_PRINT_STATS("Rx refill duplicate link desc: %d",
			       pdev->soc->stats.rx.err.dup_refill_link_desc);

		DP_PRINT_STATS("Reo Statistics");
		DP_PRINT_STATS("near_full: %u ", soc->stats.rx.near_full);
+12 −0
Original line number Diff line number Diff line
@@ -822,6 +822,8 @@ struct dp_soc_stats {
			uint32_t invalid_link_cookie;
			/* Nbuf sanity failure */
			uint32_t nbuf_sanity_fail;
			/* Duplicate link desc refilled */
			uint32_t dup_refill_link_desc;
		} err;

		/* packet count per core - per ring */
@@ -956,6 +958,14 @@ static inline uint32_t dp_history_get_next_index(qdf_atomic_t *curr_idx,
	return idx & (max_entries - 1);
}

/* structure to record recent operation related variable */
struct dp_last_op_info {
	/* last link desc buf info through WBM release ring */
	struct hal_buf_info wbm_rel_link_desc;
	/* last link desc buf info through REO reinject ring */
	struct hal_buf_info reo_reinject_link_desc;
};

/* SOC level structure for data path */
struct dp_soc {
	/**
@@ -1330,6 +1340,8 @@ struct dp_soc {
	} skip_fisa_param;
#endif
#endif /* WLAN_SUPPORT_RX_FLOW_TAG || WLAN_SUPPORT_RX_FISA */
	/* Save recent operation related variable */
	struct dp_last_op_info last_op_info;
};

#ifdef IPA_OFFLOAD