From 98b30de85218a2f2808b9e22b77bba1e86aa6591 Mon Sep 17 00:00:00 2001 From: Manjunathappa Prakash Date: Wed, 22 Nov 2017 14:09:33 -0800 Subject: [PATCH] qcacmn: Track available ext descriptors in the pool Check for available ext descriptors before accessing freelist. Change-Id: Iaeea9c7b3b69d14d53bcc23054ebd309b8be2ea9 CRs-Fixed: 2148174 --- dp/wifi3.0/dp_tx_desc.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/dp/wifi3.0/dp_tx_desc.h b/dp/wifi3.0/dp_tx_desc.h index 0d306ed0d9..02a750032e 100644 --- a/dp/wifi3.0/dp_tx_desc.h +++ b/dp/wifi3.0/dp_tx_desc.h @@ -368,9 +368,14 @@ struct dp_tx_ext_desc_elem_s *dp_tx_ext_desc_alloc(struct dp_soc *soc, struct dp_tx_ext_desc_elem_s *c_elem; TX_DESC_LOCK_LOCK(&soc->tx_ext_desc[desc_pool_id].lock); + if (soc->tx_ext_desc[desc_pool_id].num_free <= 0) { + TX_DESC_LOCK_UNLOCK(&soc->tx_ext_desc[desc_pool_id].lock); + return NULL; + } c_elem = soc->tx_ext_desc[desc_pool_id].freelist; soc->tx_ext_desc[desc_pool_id].freelist = soc->tx_ext_desc[desc_pool_id].freelist->next; + soc->tx_ext_desc[desc_pool_id].num_free--; TX_DESC_LOCK_UNLOCK(&soc->tx_ext_desc[desc_pool_id].lock); return c_elem; } @@ -389,6 +394,7 @@ static inline void dp_tx_ext_desc_free(struct dp_soc *soc, TX_DESC_LOCK_LOCK(&soc->tx_ext_desc[desc_pool_id].lock); elem->next = soc->tx_ext_desc[desc_pool_id].freelist; soc->tx_ext_desc[desc_pool_id].freelist = elem; + soc->tx_ext_desc[desc_pool_id].num_free++; TX_DESC_LOCK_UNLOCK(&soc->tx_ext_desc[desc_pool_id].lock); return; }