qcacmn: Flush REO descriptors entirely
To avoid race conditions where BA window size can change, always flush entire REO descriptor from HW cache irrespective of current BA window size. Change-Id: I608996722e7dc2dc6acfd145b8c190b58ce09822 CRs-Fixed: 2251811
This commit is contained in:

committed by
nshrivas

parent
6ba855ca40
commit
26ebbe4492
@@ -1495,9 +1495,7 @@ int dp_rx_tid_setup_wifi3(struct dp_peer *peer, int tid,
|
||||
rx_tid->delba_tx_success_cnt = 0;
|
||||
rx_tid->delba_tx_fail_cnt = 0;
|
||||
rx_tid->statuscode = 0;
|
||||
#ifdef notyet
|
||||
hw_qdesc_size = hal_get_reo_qdesc_size(soc->hal_soc, ba_window_size);
|
||||
#else
|
||||
|
||||
/* TODO: Allocating HW queue descriptors based on max BA window size
|
||||
* for all QOS TIDs so that same descriptor can be used later when
|
||||
* ADDBA request is recevied. This should be changed to allocate HW
|
||||
@@ -1508,11 +1506,10 @@ int dp_rx_tid_setup_wifi3(struct dp_peer *peer, int tid,
|
||||
*/
|
||||
if (tid != DP_NON_QOS_TID)
|
||||
hw_qdesc_size = hal_get_reo_qdesc_size(soc->hal_soc,
|
||||
HAL_RX_MAX_BA_WINDOW);
|
||||
HAL_RX_MAX_BA_WINDOW, tid);
|
||||
else
|
||||
hw_qdesc_size = hal_get_reo_qdesc_size(soc->hal_soc,
|
||||
ba_window_size);
|
||||
#endif
|
||||
ba_window_size, tid);
|
||||
|
||||
hw_qdesc_align = hal_get_reo_qdesc_align(soc->hal_soc);
|
||||
/* To avoid unnecessary extra allocation for alignment, try allocating
|
||||
@@ -1670,9 +1667,10 @@ static void dp_rx_tid_delete_cb(struct dp_soc *soc, void *cb_ctxt,
|
||||
|
||||
/* Flush and invalidate REO descriptor from HW cache: Base and
|
||||
* extension descriptors should be flushed separately */
|
||||
tot_desc_size = hal_get_reo_qdesc_size(soc->hal_soc,
|
||||
rx_tid->ba_win_size);
|
||||
desc_size = hal_get_reo_qdesc_size(soc->hal_soc, 0);
|
||||
tot_desc_size = rx_tid->hw_qdesc_alloc_size;
|
||||
/* Get base descriptor size by passing non-qos TID */
|
||||
desc_size = hal_get_reo_qdesc_size(soc->hal_soc, 0,
|
||||
DP_NON_QOS_TID);
|
||||
|
||||
/* Flush reo extension descriptors */
|
||||
while ((tot_desc_size -= desc_size) > 0) {
|
||||
|
@@ -76,6 +76,7 @@
|
||||
|
||||
#define HAL_SRNG_REO_EXCEPTION HAL_SRNG_REO2SW1
|
||||
#define HAL_SRNG_REO_ALTERNATE_SELECT 0x7
|
||||
#define HAL_NON_QOS_TID 16
|
||||
|
||||
/* calculate the register address offset from bar0 of shadow register x */
|
||||
#ifdef QCA_WIFI_QCA6390
|
||||
@@ -320,13 +321,24 @@ static inline void hal_set_link_desc_addr(void *desc, uint32_t cookie,
|
||||
*
|
||||
* @hal_soc: Opaque HAL SOC handle
|
||||
* @ba_window_size: BlockAck window size
|
||||
* @tid: TID number
|
||||
*
|
||||
*/
|
||||
static inline uint32_t hal_get_reo_qdesc_size(void *hal_soc,
|
||||
uint32_t ba_window_size)
|
||||
uint32_t ba_window_size, int tid)
|
||||
{
|
||||
if (ba_window_size <= 1)
|
||||
/* Return descriptor size corresponding to window size of 2 since
|
||||
* we set ba_window_size to 2 while setting up REO descriptors as
|
||||
* a WAR to get 2k jump exception aggregates are received without
|
||||
* a BA session.
|
||||
*/
|
||||
if (ba_window_size <= 1) {
|
||||
if (tid != HAL_NON_QOS_TID)
|
||||
return sizeof(struct rx_reo_queue) +
|
||||
sizeof(struct rx_reo_queue_ext);
|
||||
else
|
||||
return sizeof(struct rx_reo_queue);
|
||||
}
|
||||
|
||||
if (ba_window_size <= 105)
|
||||
return sizeof(struct rx_reo_queue) +
|
||||
|
@@ -112,7 +112,12 @@ void hal_reo_qdesc_setup(void *hal_soc, int tid, uint32_t ba_window_size,
|
||||
|
||||
if (ba_window_size < 1)
|
||||
ba_window_size = 1;
|
||||
|
||||
/* WAR to get 2k exception in Non BA case.
|
||||
* Setting window size to 2 to get 2k jump exception
|
||||
* when we receive aggregates in Non BA case
|
||||
*/
|
||||
if ((ba_window_size == 1) && (tid != HAL_NON_QOS_TID))
|
||||
ba_window_size++;
|
||||
/* Set RTY bit for non-BA case. Duplicate detection is currently not
|
||||
* done by HW in non-BA case if RTY bit is not set.
|
||||
* TODO: This is a temporary War and should be removed once HW fix is
|
||||
|
@@ -246,13 +246,13 @@
|
||||
#define WLAN_CFG_REO_EXCEPTION_RING_SIZE_MIN 128
|
||||
#define WLAN_CFG_REO_EXCEPTION_RING_SIZE_MAX 128
|
||||
|
||||
#define WLAN_CFG_REO_CMD_RING_SIZE 64
|
||||
#define WLAN_CFG_REO_CMD_RING_SIZE 128
|
||||
#define WLAN_CFG_REO_CMD_RING_SIZE_MIN 64
|
||||
#define WLAN_CFG_REO_CMD_RING_SIZE_MAX 64
|
||||
#define WLAN_CFG_REO_CMD_RING_SIZE_MAX 128
|
||||
|
||||
#define WLAN_CFG_REO_STATUS_RING_SIZE 128
|
||||
#define WLAN_CFG_REO_STATUS_RING_SIZE 256
|
||||
#define WLAN_CFG_REO_STATUS_RING_SIZE_MIN 128
|
||||
#define WLAN_CFG_REO_STATUS_RING_SIZE_MAX 128
|
||||
#define WLAN_CFG_REO_STATUS_RING_SIZE_MAX 256
|
||||
|
||||
#define WLAN_CFG_RXDMA_BUF_RING_SIZE 1024
|
||||
#define WLAN_CFG_RXDMA_BUF_RING_SIZE_MIN 1024
|
||||
|
Reference in New Issue
Block a user