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:
Karunakar Dasineni
2018-05-31 07:59:10 -07:00
committed by nshrivas
parent 6ba855ca40
commit 26ebbe4492
4 changed files with 32 additions and 17 deletions

View File

@@ -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) {

View File

@@ -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) +

View File

@@ -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

View File

@@ -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