Selaa lähdekoodia

qcacld-3.0: Fix synchronization issue of credit number

The target_delta and bus_delta combined with target_tx_credit
to fulfil the credit function of host.
A global lock is needed to ensure reenterable.

Change-Id: I71c006ccfe05b442706283490cd7bba4cc8a6f5f
CRs-Fixed: 964530
Chris Guo 7 vuotta sitten
vanhempi
sitoutus
9e293a9667
4 muutettua tiedostoa jossa 11 lisäystä ja 0 poistoa
  1. 2 0
      core/dp/htt/htt.c
  2. 2 0
      core/dp/htt/htt_h2t.c
  3. 6 0
      core/dp/htt/htt_t2h.c
  4. 1 0
      core/dp/htt/htt_types.h

+ 2 - 0
core/dp/htt/htt.c

@@ -463,6 +463,7 @@ htt_attach(struct htt_pdev_t *pdev, int desc_pool_size)
 
 	HTT_TX_MUTEX_INIT(&pdev->htt_tx_mutex);
 	HTT_TX_NBUF_QUEUE_MUTEX_INIT(pdev);
+	HTT_TX_MUTEX_INIT(&pdev->credit_mutex);
 
 	/* pre-allocate some HTC_PACKET objects */
 	for (i = 0; i < HTT_HTC_PKT_POOL_INIT_SIZE; i++) {
@@ -633,6 +634,7 @@ void htt_detach(htt_pdev_handle pdev)
 #ifdef ATH_11AC_TXCOMPACT
 	htt_htc_misc_pkt_pool_free(pdev);
 #endif
+	HTT_TX_MUTEX_DESTROY(&pdev->credit_mutex);
 	HTT_TX_MUTEX_DESTROY(&pdev->htt_tx_mutex);
 	HTT_TX_NBUF_QUEUE_MUTEX_DESTROY(pdev);
 	htt_rx_dbg_rxbuf_deinit(pdev);

+ 2 - 0
core/dp/htt/htt_h2t.c

@@ -102,8 +102,10 @@ void htt_h2t_send_complete(void *context, HTC_PACKET *htc_pkt)
 	if (pdev->cfg.is_high_latency && !pdev->cfg.default_tx_comp_req) {
 		int32_t credit_delta;
 
+		HTT_TX_MUTEX_ACQUIRE(&pdev->credit_mutex);
 		qdf_atomic_add(1, &pdev->htt_tx_credit.bus_delta);
 		credit_delta = htt_tx_credit_update(pdev);
+		HTT_TX_MUTEX_RELEASE(&pdev->credit_mutex);
 
 		if (credit_delta)
 			ol_tx_credit_completion_handler(pdev->txrx_pdev,

+ 6 - 0
core/dp/htt/htt_t2h.c

@@ -398,10 +398,12 @@ static void htt_t2h_lp_msg_handler(void *context, qdf_nbuf_t htt_t2h_msg,
 
 		if (pdev->cfg.is_high_latency) {
 			if (!pdev->cfg.default_tx_comp_req) {
+				HTT_TX_MUTEX_ACQUIRE(&pdev->credit_mutex);
 				qdf_atomic_add(credit_delta,
 					       &pdev->htt_tx_credit.
 								target_delta);
 				credit_delta = htt_tx_credit_update(pdev);
+				HTT_TX_MUTEX_RELEASE(&pdev->credit_mutex);
 			}
 			if (credit_delta)
 				ol_tx_target_credit_update(
@@ -457,9 +459,11 @@ static void htt_t2h_lp_msg_handler(void *context, qdf_nbuf_t htt_t2h_msg,
 
 		if (pdev->cfg.is_high_latency &&
 		    !pdev->cfg.default_tx_comp_req) {
+			HTT_TX_MUTEX_ACQUIRE(&pdev->credit_mutex);
 			qdf_atomic_add(htt_credit_delta,
 				       &pdev->htt_tx_credit.target_delta);
 			htt_credit_delta = htt_tx_credit_update(pdev);
+			HTT_TX_MUTEX_RELEASE(&pdev->credit_mutex);
 		}
 
 		htt_tx_group_credit_process(pdev, msg_word);
@@ -682,10 +686,12 @@ void htt_t2h_msg_handler(void *context, HTC_PACKET *pkt)
 			if (!pdev->cfg.default_tx_comp_req) {
 				int credit_delta;
 
+				HTT_TX_MUTEX_ACQUIRE(&pdev->credit_mutex);
 				qdf_atomic_add(num_msdus,
 					       &pdev->htt_tx_credit.
 								target_delta);
 				credit_delta = htt_tx_credit_update(pdev);
+				HTT_TX_MUTEX_RELEASE(&pdev->credit_mutex);
 
 				if (credit_delta) {
 					ol_tx_target_credit_update(

+ 1 - 0
core/dp/htt/htt_types.h

@@ -415,6 +415,7 @@ struct htt_pdev_t {
 				       qdf_nbuf_t msdu, uint16_t msdu_id);
 
 	HTT_TX_MUTEX_TYPE htt_tx_mutex;
+	HTT_TX_MUTEX_TYPE credit_mutex;
 
 	struct {
 		int htc_err_cnt;