diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/dp/htt/htt.c b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/dp/htt/htt.c index 14e0174e679c..66321e5dbbc9 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/dp/htt/htt.c +++ b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/dp/htt/htt.c @@ -114,32 +114,28 @@ void htt_htc_pkt_pool_free(struct htt_pdev_t *pdev) #ifdef ATH_11AC_TXCOMPACT -void -htt_htc_misc_pkt_list_trim(struct htt_pdev_t *pdev, int level) +void htt_htc_misc_pkt_list_trim(struct htt_pdev_t *pdev) { - struct htt_htc_pkt_union *pkt, *next, *prev = NULL; - int i = 0; + struct htt_htc_pkt_union *pkt, *next; qdf_nbuf_t netbuf; - HTT_TX_MUTEX_ACQUIRE(&pdev->htt_tx_mutex); - pkt = pdev->htt_htc_pkt_misclist; + // skip if first come + if(!pdev->last_misc_pkt->u.next) + goto out; + + pkt = pdev->last_misc_pkt->u.next; + pdev->last_misc_pkt->u.next = NULL; while (pkt) { next = pkt->u.next; - /* trim the out grown list*/ - if (++i > level) { - netbuf = - (qdf_nbuf_t)(pkt->u.pkt.htc_pkt.pNetBufContext); - qdf_nbuf_unmap(pdev->osdev, netbuf, QDF_DMA_TO_DEVICE); - qdf_nbuf_free(netbuf); - qdf_mem_free(pkt); - pkt = NULL; - if (prev) - prev->u.next = NULL; - } - prev = pkt; + netbuf = (qdf_nbuf_t) (pkt->u.pkt.htc_pkt.pNetBufContext); + qdf_nbuf_unmap(pdev->osdev, netbuf, QDF_DMA_TO_DEVICE); + qdf_nbuf_free(netbuf); + qdf_mem_free(pkt); pkt = next; } - HTT_TX_MUTEX_RELEASE(&pdev->htt_tx_mutex); +out: + pdev->last_misc_pkt = pdev->htt_htc_pkt_misclist; + pdev->last_misc_num = 1; } void htt_htc_misc_pkt_list_add(struct htt_pdev_t *pdev, struct htt_htc_pkt *pkt) @@ -153,15 +149,16 @@ void htt_htc_misc_pkt_list_add(struct htt_pdev_t *pdev, struct htt_htc_pkt *pkt) if (pdev->htt_htc_pkt_misclist) { u_pkt->u.next = pdev->htt_htc_pkt_misclist; pdev->htt_htc_pkt_misclist = u_pkt; + pdev->last_misc_num++; } else { pdev->htt_htc_pkt_misclist = u_pkt; + pdev->last_misc_pkt = u_pkt; + pdev->last_misc_num = 1; } - HTT_TX_MUTEX_RELEASE(&pdev->htt_tx_mutex); - /* only ce pipe size + tx_queue_depth could possibly be in use - * free older packets in the msiclist - */ - htt_htc_misc_pkt_list_trim(pdev, misclist_trim_level); + if (pdev->last_misc_num > misclist_trim_level) + htt_htc_misc_pkt_list_trim(pdev); + HTT_TX_MUTEX_RELEASE(&pdev->htt_tx_mutex); } void htt_htc_misc_pkt_pool_free(struct htt_pdev_t *pdev) diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/dp/htt/htt_internal.h b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/dp/htt/htt_internal.h index 17bd2cbc9c6d..a4d47cf74ad7 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/dp/htt/htt_internal.h +++ b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/dp/htt/htt_internal.h @@ -608,7 +608,7 @@ void htt_htc_pkt_free(struct htt_pdev_t *pdev, struct htt_htc_pkt *pkt); void htt_htc_pkt_pool_free(struct htt_pdev_t *pdev); #ifdef ATH_11AC_TXCOMPACT -void htt_htc_misc_pkt_list_trim(struct htt_pdev_t *pdev, int level); +void htt_htc_misc_pkt_list_trim(struct htt_pdev_t *pdev); void htt_htc_misc_pkt_list_add(struct htt_pdev_t *pdev, struct htt_htc_pkt *pkt); diff --git a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/dp/htt/htt_types.h b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/dp/htt/htt_types.h index 0ad01dec88b7..338cb05f0fd6 100755 --- a/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/dp/htt/htt_types.h +++ b/drivers/net/wireless/qualcomm/wcn39xx/qcacld-3.0/core/dp/htt/htt_types.h @@ -452,6 +452,9 @@ struct htt_pdev_t { /* Flag to indicate whether new htt format is supported */ bool new_htt_format_enabled; + + struct htt_htc_pkt_union *last_misc_pkt; + int last_misc_num; }; #define HTT_EPID_GET(_htt_pdev_hdl) \