Jelajahi Sumber

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
Venkata Sharath Chandra Manchala 7 tahun lalu
induk
melakukan
bcfa6d8683
3 mengubah file dengan 15 tambahan dan 14 penghapusan
  1. 0 2
      dp/wifi3.0/dp_rx.c
  2. 13 9
      dp/wifi3.0/dp_rx_desc.c
  3. 2 3
      dp/wifi3.0/dp_types.h

+ 0 - 2
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;

+ 13 - 9
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);
 }

+ 2 - 3
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;