From bcfa6d86839a9fadc0d62ed191e45d889c05bde5 Mon Sep 17 00:00:00 2001 From: Venkata Sharath Chandra Manchala Date: Wed, 28 Mar 2018 23:42:39 -0700 Subject: [PATCH] qcacmn: Add lock to protect rx_desc_pool Create a lock for protecting rx descriptor pool allocation during initialization and destroy it during unloading the driver. Change-Id: Icd489e400dab9bb648709134dcaa24c4d7724aa6 CRs-Fixed: 2215430 --- dp/wifi3.0/dp_rx.c | 2 -- dp/wifi3.0/dp_rx_desc.c | 22 +++++++++++++--------- dp/wifi3.0/dp_types.h | 5 ++--- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index e29bacefbd..f3ab90c78f 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -1650,7 +1650,6 @@ dp_rx_pdev_detach(struct dp_pdev *pdev) if (rx_desc_pool->pool_size != 0) { dp_rx_desc_pool_free(soc, pdev_id, rx_desc_pool); - qdf_spinlock_destroy(&soc->rx_desc_mutex[pdev_id]); } return; @@ -1685,7 +1684,6 @@ dp_rx_pdev_attach(struct dp_pdev *pdev) return QDF_STATUS_SUCCESS; } - qdf_spinlock_create(&soc->rx_desc_mutex[pdev_id]); pdev = soc->pdev_list[pdev_id]; rxdma_srng = pdev->rx_refill_buf_ring; soc->process_rx_status = CONFIG_PROCESS_RX_STATUS; diff --git a/dp/wifi3.0/dp_rx_desc.c b/dp/wifi3.0/dp_rx_desc.c index 5d3444c92d..dda5b71d52 100644 --- a/dp/wifi3.0/dp_rx_desc.c +++ b/dp/wifi3.0/dp_rx_desc.c @@ -46,7 +46,10 @@ QDF_STATUS dp_rx_desc_pool_alloc(struct dp_soc *soc, uint32_t pool_id, return QDF_STATUS_E_NOMEM; } - qdf_spin_lock_bh(&soc->rx_desc_mutex[pool_id]); + /* Initialize the lock */ + qdf_spinlock_create(&rx_desc_pool->lock); + + qdf_spin_lock_bh(&rx_desc_pool->lock); rx_desc_pool->pool_size = pool_size; /* link SW rx descs into a freelist */ @@ -61,7 +64,7 @@ QDF_STATUS dp_rx_desc_pool_alloc(struct dp_soc *soc, uint32_t pool_id, rx_desc_pool->array[i].next = NULL; rx_desc_pool->array[i].rx_desc.cookie = i | (pool_id << 18); rx_desc_pool->array[i].rx_desc.pool_id = pool_id; - qdf_spin_unlock_bh(&soc->rx_desc_mutex[pool_id]); + qdf_spin_unlock_bh(&rx_desc_pool->lock); return QDF_STATUS_SUCCESS; } @@ -78,7 +81,7 @@ void dp_rx_desc_pool_free(struct dp_soc *soc, uint32_t pool_id, { int i; - qdf_spin_lock_bh(&soc->rx_desc_mutex[pool_id]); + qdf_spin_lock_bh(&rx_desc_pool->lock); for (i = 0; i < rx_desc_pool->pool_size; i++) { if (rx_desc_pool->array[i].rx_desc.in_use) { if (!(rx_desc_pool->array[i].rx_desc.unmapped)) @@ -89,7 +92,8 @@ void dp_rx_desc_pool_free(struct dp_soc *soc, uint32_t pool_id, } } qdf_mem_free(rx_desc_pool->array); - qdf_spin_unlock_bh(&soc->rx_desc_mutex[pool_id]); + qdf_spin_unlock_bh(&rx_desc_pool->lock); + qdf_spinlock_destroy(&rx_desc_pool->lock); } /* @@ -113,21 +117,21 @@ uint16_t dp_rx_get_free_desc_list(struct dp_soc *soc, uint32_t pool_id, { uint16_t count; - qdf_spin_lock_bh(&soc->rx_desc_mutex[pool_id]); + qdf_spin_lock_bh(&rx_desc_pool->lock); *desc_list = *tail = rx_desc_pool->freelist; for (count = 0; count < num_descs; count++) { if (qdf_unlikely(!rx_desc_pool->freelist)) { - qdf_spin_unlock_bh(&soc->rx_desc_mutex[pool_id]); + qdf_spin_unlock_bh(&rx_desc_pool->lock); return count; } *tail = rx_desc_pool->freelist; rx_desc_pool->freelist = rx_desc_pool->freelist->next; } (*tail)->next = NULL; - qdf_spin_unlock_bh(&soc->rx_desc_mutex[pool_id]); + qdf_spin_unlock_bh(&rx_desc_pool->lock); return count; } @@ -149,7 +153,7 @@ void dp_rx_add_desc_list_to_free_list(struct dp_soc *soc, { union dp_rx_desc_list_elem_t *temp_list = NULL; - qdf_spin_lock_bh(&soc->rx_desc_mutex[pool_id]); + qdf_spin_lock_bh(&rx_desc_pool->lock); temp_list = rx_desc_pool->freelist; @@ -159,5 +163,5 @@ void dp_rx_add_desc_list_to_free_list(struct dp_soc *soc, rx_desc_pool->freelist = *local_desc_list; (*tail)->next = temp_list; - qdf_spin_unlock_bh(&soc->rx_desc_mutex[pool_id]); + qdf_spin_unlock_bh(&rx_desc_pool->lock); } diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 890330667e..2ea7ffb321 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -211,11 +211,13 @@ enum dp_nss_cfg { * @pool_size: number of RX descriptor in the pool * @array: pointer to array of RX descriptor * @freelist: pointer to free RX descriptor link list + * @lock: Protection for the RX descriptor pool */ struct rx_desc_pool { uint32_t pool_size; union dp_rx_desc_list_elem_t *array; union dp_rx_desc_list_elem_t *freelist; + qdf_spinlock_t lock; }; /** @@ -684,9 +686,6 @@ struct dp_soc { /* Rx SW descriptor pool for RXDMA status buffer */ struct rx_desc_pool rx_desc_status[MAX_RXDESC_POOLS]; - /* DP rx desc lock */ - DP_MUTEX_TYPE rx_desc_mutex[MAX_RXDESC_POOLS]; - /* HAL SOC handle */ void *hal_soc;