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

Commit beaff57e authored by Yeshwanth Sriram Guntuka's avatar Yeshwanth Sriram Guntuka Committed by snandini
Browse files

qcacmn: Reset the inv bit in ring desc cookie for jumbo pkts

When a msdu scattered across multiple nbufs is received
in REO2SW ring and the remaining nbufs are not yet
available in the ring, loop in dp_rx_process is exited
without resetting the invalid bit in the ring desc cookie.
This will result in an incorrect assertion failure when
the same entry is processed the next time.

Fix is to reset the invalid bit in ring desc cookie
when the loop is exited in the above msdu scattered
scenario.

Change-Id: Ie5cfa1fb8ea1db4b7a0a4837545ecbfdfbb8719a
CRs-Fixed: 2916296
parent 26292e68
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -2459,6 +2459,8 @@ uint32_t dp_rx_process(struct dp_intr *int_ctx, hal_ring_handle_t hal_ring_hdl,
						soc,
						rx.msdu_scatter_wait_break,
						1);
					dp_rx_cookie_reset_invalid_bit(
								     ring_desc);
					break;
				}
				is_prev_msdu_last = false;
+18 −0
Original line number Diff line number Diff line
@@ -563,12 +563,30 @@ dp_rx_cookie_check_and_invalidate(hal_ring_desc_t ring_desc)
	HAL_RX_REO_BUF_COOKIE_INVALID_SET(ring_desc);
	return QDF_STATUS_SUCCESS;
}

/**
 * dp_rx_cookie_reset_invalid_bit() - Reset the invalid bit of the cookie
 *  field in ring descriptor
 * @ring_desc: ring descriptor
 *
 * Return: None
 */
static inline void
dp_rx_cookie_reset_invalid_bit(hal_ring_desc_t ring_desc)
{
	HAL_RX_REO_BUF_COOKIE_INVALID_RESET(ring_desc);
}
#else
static inline QDF_STATUS
dp_rx_cookie_check_and_invalidate(hal_ring_desc_t ring_desc)
{
	return QDF_STATUS_SUCCESS;
}

static inline void
dp_rx_cookie_reset_invalid_bit(hal_ring_desc_t ring_desc)
{
}
#endif

QDF_STATUS dp_rx_desc_pool_is_allocated(struct rx_desc_pool *rx_desc_pool);
+13 −0
Original line number Diff line number Diff line
@@ -287,6 +287,14 @@ enum hal_rx_ret_buf_manager {
		(BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_OFFSET >> 2))) |= \
		HAL_RX_COOKIE_INVALID_MASK)

/*
 * macro to reset the invalid bit for sw cookie
 */
#define HAL_RX_BUF_COOKIE_INVALID_RESET(buff_addr_info) \
		((*(((unsigned int *)buff_addr_info) + \
		(BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_OFFSET >> 2))) &= \
		~HAL_RX_COOKIE_INVALID_MASK)

/*
 * macro to set the cookie into the rxdma ring entry
 */
@@ -390,6 +398,11 @@ enum hal_rx_ret_buf_manager {
	(((struct reo_destination_ring *)	\
		reo_desc)->buf_or_link_desc_addr_info)))

#define HAL_RX_REO_BUF_COOKIE_INVALID_RESET(reo_desc)	\
		(HAL_RX_BUF_COOKIE_INVALID_RESET(&		\
		(((struct reo_destination_ring *)	\
			reo_desc)->buf_or_link_desc_addr_info)))

#define HAL_RX_MPDU_SEQUENCE_NUMBER_GET(mpdu_info_ptr)	\
	((mpdu_info_ptr					\
	[RX_MPDU_DESC_INFO_0_MPDU_SEQUENCE_NUMBER_OFFSET >> 2] & \