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_success_cnt = 0;
|
||||||
rx_tid->delba_tx_fail_cnt = 0;
|
rx_tid->delba_tx_fail_cnt = 0;
|
||||||
rx_tid->statuscode = 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
|
/* TODO: Allocating HW queue descriptors based on max BA window size
|
||||||
* for all QOS TIDs so that same descriptor can be used later when
|
* for all QOS TIDs so that same descriptor can be used later when
|
||||||
* ADDBA request is recevied. This should be changed to allocate HW
|
* 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)
|
if (tid != DP_NON_QOS_TID)
|
||||||
hw_qdesc_size = hal_get_reo_qdesc_size(soc->hal_soc,
|
hw_qdesc_size = hal_get_reo_qdesc_size(soc->hal_soc,
|
||||||
HAL_RX_MAX_BA_WINDOW);
|
HAL_RX_MAX_BA_WINDOW, tid);
|
||||||
else
|
else
|
||||||
hw_qdesc_size = hal_get_reo_qdesc_size(soc->hal_soc,
|
hw_qdesc_size = hal_get_reo_qdesc_size(soc->hal_soc,
|
||||||
ba_window_size);
|
ba_window_size, tid);
|
||||||
#endif
|
|
||||||
|
|
||||||
hw_qdesc_align = hal_get_reo_qdesc_align(soc->hal_soc);
|
hw_qdesc_align = hal_get_reo_qdesc_align(soc->hal_soc);
|
||||||
/* To avoid unnecessary extra allocation for alignment, try allocating
|
/* 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
|
/* Flush and invalidate REO descriptor from HW cache: Base and
|
||||||
* extension descriptors should be flushed separately */
|
* extension descriptors should be flushed separately */
|
||||||
tot_desc_size = hal_get_reo_qdesc_size(soc->hal_soc,
|
tot_desc_size = rx_tid->hw_qdesc_alloc_size;
|
||||||
rx_tid->ba_win_size);
|
/* Get base descriptor size by passing non-qos TID */
|
||||||
desc_size = hal_get_reo_qdesc_size(soc->hal_soc, 0);
|
desc_size = hal_get_reo_qdesc_size(soc->hal_soc, 0,
|
||||||
|
DP_NON_QOS_TID);
|
||||||
|
|
||||||
/* Flush reo extension descriptors */
|
/* Flush reo extension descriptors */
|
||||||
while ((tot_desc_size -= desc_size) > 0) {
|
while ((tot_desc_size -= desc_size) > 0) {
|
||||||
|
@@ -76,6 +76,7 @@
|
|||||||
|
|
||||||
#define HAL_SRNG_REO_EXCEPTION HAL_SRNG_REO2SW1
|
#define HAL_SRNG_REO_EXCEPTION HAL_SRNG_REO2SW1
|
||||||
#define HAL_SRNG_REO_ALTERNATE_SELECT 0x7
|
#define HAL_SRNG_REO_ALTERNATE_SELECT 0x7
|
||||||
|
#define HAL_NON_QOS_TID 16
|
||||||
|
|
||||||
/* calculate the register address offset from bar0 of shadow register x */
|
/* calculate the register address offset from bar0 of shadow register x */
|
||||||
#ifdef QCA_WIFI_QCA6390
|
#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
|
* @hal_soc: Opaque HAL SOC handle
|
||||||
* @ba_window_size: BlockAck window size
|
* @ba_window_size: BlockAck window size
|
||||||
|
* @tid: TID number
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
static inline uint32_t hal_get_reo_qdesc_size(void *hal_soc,
|
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
|
||||||
return sizeof(struct rx_reo_queue);
|
* 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)
|
if (ba_window_size <= 105)
|
||||||
return sizeof(struct rx_reo_queue) +
|
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)
|
if (ba_window_size < 1)
|
||||||
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
|
/* 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.
|
* 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
|
* 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_MIN 128
|
||||||
#define WLAN_CFG_REO_EXCEPTION_RING_SIZE_MAX 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_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_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 1024
|
||||||
#define WLAN_CFG_RXDMA_BUF_RING_SIZE_MIN 1024
|
#define WLAN_CFG_RXDMA_BUF_RING_SIZE_MIN 1024
|
||||||
|
Reference in New Issue
Block a user