qcacmn: Fix the next link descriptor read issue

Link descriptor were getting freed by the pointer
of the previous freed link descriptor. This patch
fixes by copying the address of the current in a
local descriptor info and using it to free the
current.

Change-Id: I95e137ba5b1f0ad21b0e6fb39f6671e1d5b65ba6
CRs-Fixed: 2577624
This commit is contained in:
Aniruddha Paul
2019-11-27 18:48:04 +05:30
committed by nshrivas
parent efa9f5d2a9
commit 33fce952a9
7 changed files with 57 additions and 42 deletions

View File

@@ -76,6 +76,12 @@ typedef struct hal_link_desc *hal_link_desc_t;
struct hal_rxdma_desc;
typedef struct hal_rxdma_desc *hal_rxdma_desc_t;
/**
* hal_buff_addrinfo - opaque handle for DP buffer address info
*/
struct hal_buff_addrinfo;
typedef struct hal_buff_addrinfo *hal_buff_addrinfo_t;
#ifdef ENABLE_VERBOSE_DEBUG
static inline void
hal_set_verbose_debug(bool flag)

View File

@@ -265,7 +265,6 @@ bool HAL_RX_HW_DESC_MPDU_VALID(void *hw_desc_addr)
static inline
void hal_rx_reo_ent_buf_paddr_get(hal_rxdma_desc_t rx_desc,
struct hal_buf_info *buf_info,
void **pp_buf_addr_info,
uint32_t *msdu_cnt
)
{
@@ -292,18 +291,17 @@ void hal_rx_reo_ent_buf_paddr_get(hal_rxdma_desc_t rx_desc,
(HAL_RX_BUFFER_ADDR_39_32_GET(buf_addr_info)) << 32));
buf_info->sw_cookie = HAL_RX_BUF_COOKIE_GET(buf_addr_info);
buf_info->rbm = HAL_RX_BUF_RBM_GET(buf_addr_info);
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
"[%s][%d] ReoAddr=%pK, addrInfo=%pK, paddr=0x%llx, loopcnt=%d",
__func__, __LINE__, reo_ent_ring, buf_addr_info,
(unsigned long long)buf_info->paddr, loop_cnt);
*pp_buf_addr_info = (void *)buf_addr_info;
}
static inline
void hal_rx_mon_next_link_desc_get(void *rx_msdu_link_desc,
struct hal_buf_info *buf_info, void **pp_buf_addr_info)
struct hal_buf_info *buf_info)
{
struct rx_msdu_link *msdu_link =
(struct rx_msdu_link *)rx_msdu_link_desc;
@@ -317,8 +315,7 @@ void hal_rx_mon_next_link_desc_get(void *rx_msdu_link_desc,
(HAL_RX_BUFFER_ADDR_39_32_GET(buf_addr_info)) << 32));
buf_info->sw_cookie = HAL_RX_BUF_COOKIE_GET(buf_addr_info);
*pp_buf_addr_info = (void *)buf_addr_info;
buf_info->rbm = HAL_RX_BUF_RBM_GET(buf_addr_info);
}
/**
@@ -334,7 +331,7 @@ void hal_rx_mon_next_link_desc_get(void *rx_msdu_link_desc,
static inline
void hal_rx_mon_msdu_link_desc_set(hal_soc_handle_t hal_soc_hdl,
void *src_srng_desc,
void *buf_addr_info)
hal_buff_addrinfo_t buf_addr_info)
{
struct buffer_addr_info *wbm_srng_buffer_addr_info =
(struct buffer_addr_info *)src_srng_desc;

View File

@@ -87,6 +87,9 @@
#define SRNG_LOOP_CNT_MASK REO_DESTINATION_RING_15_LOOPING_COUNT_MASK
#define SRNG_LOOP_CNT_LSB REO_DESTINATION_RING_15_LOOPING_COUNT_LSB
/* HAL Macro to get the buffer info size */
#define HAL_RX_BUFFINFO_NUM_DWORDS NUM_OF_DWORDS_BUFFER_ADDR_INFO
#define HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS 100 /* milliseconds */
#define HAL_DEFAULT_VO_REO_TIMEOUT_MS 40 /* milliseconds */

View File

@@ -1702,6 +1702,7 @@ struct hal_rx_msdu_list {
struct hal_buf_info {
uint64_t paddr;
uint32_t sw_cookie;
uint8_t rbm;
};
/**
@@ -2096,7 +2097,7 @@ static inline void hal_dump_wbm_rel_desc(void *src_srng_desc)
static inline
void hal_rx_msdu_link_desc_set(hal_soc_handle_t hal_soc_hdl,
void *src_srng_desc,
hal_link_desc_t buf_addr_info,
hal_buff_addrinfo_t buf_addr_info,
uint8_t bm_action)
{
struct wbm_release_ring *wbm_rel_srng =