From d4a1bd480003f3e1a0590bc46fbcb24f05652ca7 Mon Sep 17 00:00:00 2001
From: tzh <tanzhtanzh@gmail.com>
Date: Thu, 15 Aug 2024 06:56:47 +0000
Subject: [PATCH] feat(wfit/bt): update aic8800 wifi/bt drive and hal

---
 longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/rwnx_txq.c |   90 ++++++++++++++++++++++++---------------------
 1 files changed, 48 insertions(+), 42 deletions(-)

diff --git a/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/rwnx_txq.c b/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/rwnx_txq.c
old mode 100644
new mode 100755
index 5e1cdb5..8a43f8a
--- a/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/rwnx_txq.c
+++ b/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/rwnx_txq.c
@@ -137,15 +137,15 @@
 		if (sw_txhdr->desc.host.packet_cnt > 1) {
 			struct rwnx_amsdu_txhdr *amsdu_txhdr;
 			list_for_each_entry(amsdu_txhdr, &sw_txhdr->amsdu.hdrs, list) {
-				dma_unmap_single(rwnx_hw->dev, amsdu_txhdr->dma_addr,
-								 amsdu_txhdr->map_len, DMA_TO_DEVICE);
+				//dma_unmap_single(rwnx_hw->dev, amsdu_txhdr->dma_addr,
+				//				 amsdu_txhdr->map_len, DMA_TO_DEVICE);
 				dev_kfree_skb_any(amsdu_txhdr->skb);
 			}
 		}
 #endif
 		kmem_cache_free(rwnx_hw->sw_txhdr_cache, sw_txhdr);
-		dma_unmap_single(rwnx_hw->dev, sw_txhdr->dma_addr, sw_txhdr->map_len,
-						 DMA_TO_DEVICE);
+		//dma_unmap_single(rwnx_hw->dev, sw_txhdr->dma_addr, sw_txhdr->map_len,
+		//				 DMA_TO_DEVICE);
 
 #ifdef CONFIG_RWNX_FULLMAC
 	dev_kfree_skb_any(skb);
@@ -257,7 +257,6 @@
 	}
 
 #endif /* CONFIG_RWNX_FULLMAC*/
-	rwnx_ipc_sta_buffer_init(rwnx_hw, rwnx_sta->sta_idx);
 }
 
 /**
@@ -385,7 +384,9 @@
 void rwnx_txq_add_to_hw_list(struct rwnx_txq *txq)
 {
 	if (!(txq->status & RWNX_TXQ_IN_HWQ_LIST)) {
+#ifdef CREATE_TRACE_POINTS
 		trace_txq_add_to_hw(txq);
+#endif
 		txq->status |= RWNX_TXQ_IN_HWQ_LIST;
 		list_add_tail(&txq->sched_list, &txq->hwq->list);
 		txq->hwq->need_processing = true;
@@ -403,7 +404,9 @@
 void rwnx_txq_del_from_hw_list(struct rwnx_txq *txq)
 {
 	if (txq->status & RWNX_TXQ_IN_HWQ_LIST) {
+#ifdef CREATE_TRACE_POINTS
 		trace_txq_del_from_hw(txq);
+#endif
 		txq->status &= ~RWNX_TXQ_IN_HWQ_LIST;
 		list_del(&txq->sched_list);
 	}
@@ -441,7 +444,9 @@
 {
 	BUG_ON(txq == NULL);
 	if (txq->idx != TXQ_INACTIVE && (txq->status & reason)) {
+#ifdef CREATE_TRACE_POINTS
 		trace_txq_start(txq, reason);
+#endif
 		txq->status &= ~reason;
 		if (!rwnx_txq_is_stopped(txq) && rwnx_txq_skb_ready(txq))
 			rwnx_txq_add_to_hw_list(txq);
@@ -461,7 +466,9 @@
 {
 	BUG_ON(txq == NULL);
 	if (txq->idx != TXQ_INACTIVE) {
+#ifdef CREATE_TRACE_POINTS
 		trace_txq_stop(txq, reason);
+#endif
 		txq->status |= reason;
 		rwnx_txq_del_from_hw_list(txq);
 	}
@@ -493,8 +500,9 @@
 {
 	struct rwnx_txq *txq;
 	int tid;
-
+#ifdef CREATE_TRACE_POINTS
 	trace_txq_sta_start(rwnx_sta->sta_idx);
+#endif
 
 	foreach_sta_txq(rwnx_sta, txq, tid, rwnx_hw) {
 		rwnx_txq_start(txq, reason);
@@ -529,8 +537,9 @@
 
 	if (!rwnx_sta)
 		return;
-
+#ifdef CREATE_TRACE_POINTS
 	trace_txq_sta_stop(rwnx_sta->sta_idx);
+#endif
 	foreach_sta_txq(rwnx_sta, txq, tid, rwnx_hw) {
 		rwnx_txq_stop(txq, reason);
 	}
@@ -540,7 +549,9 @@
 void rwnx_txq_tdls_sta_start(struct rwnx_vif *rwnx_vif, u16 reason,
 				struct rwnx_hw *rwnx_hw)
 {
+#ifdef CREATE_TRACE_POINTS
 	trace_txq_vif_start(rwnx_vif->vif_index);
+#endif
 	spin_lock_bh(&rwnx_hw->tx_lock);
 
 	if (rwnx_vif->sta.tdls_sta)
@@ -554,7 +565,9 @@
 void rwnx_txq_tdls_sta_stop(struct rwnx_vif *rwnx_vif, u16 reason,
 				struct rwnx_hw *rwnx_hw)
 {
+#ifdef CREATE_TRACE_POINTS
 	trace_txq_vif_stop(rwnx_vif->vif_index);
+#endif
 
 	spin_lock_bh(&rwnx_hw->tx_lock);
 
@@ -614,9 +627,9 @@
 						struct rwnx_hw *rwnx_hw)
 {
 	struct rwnx_txq *txq;
-
+#ifdef CREATE_TRACE_POINTS
 	trace_txq_vif_start(rwnx_vif->vif_index);
-
+#endif
 	spin_lock_bh(&rwnx_hw->tx_lock);
 
 #ifdef CONFIG_RWNX_FULLMAC
@@ -658,10 +671,9 @@
 					   struct rwnx_hw *rwnx_hw)
 {
 	struct rwnx_txq *txq;
-
-	RWNX_DBG(RWNX_FN_ENTRY_STR);
-
+#ifdef CREATE_TRACE_POINTS
 	trace_txq_vif_stop(rwnx_vif->vif_index);
+#endif
 	spin_lock_bh(&rwnx_hw->tx_lock);
 
 #ifdef CONFIG_RWNX_FULLMAC
@@ -761,8 +773,9 @@
 #ifdef CONFIG_RWNX_FULLMAC
 	if (unlikely(txq->sta && txq->sta->ps.active)) {
 		txq->sta->ps.pkt_ready[txq->ps_id]++;
+#ifdef CREATE_TRACE_POINTS
 		trace_ps_queue(txq->sta);
-
+#endif
 		if (txq->sta->ps.pkt_ready[txq->ps_id] == 1) {
 			rwnx_set_traffic_status(rwnx_hw, txq->sta, true, txq->ps_id);
 		}
@@ -772,11 +785,6 @@
 	if (!retry) {
 		/* add buffer in the sk_list */
 		skb_queue_tail(&txq->sk_list, skb);
-#ifdef CONFIG_RWNX_FULLMAC
-		// to update for SOFTMAC
-		rwnx_ipc_sta_buffer(rwnx_hw, txq->sta, txq->tid,
-							((struct rwnx_txhdr *)skb->data)->sw_hdr->frame_len);
-#endif
 	} else {
 		if (txq->last_retry_skb)
 			rwnx_skb_append(txq->last_retry_skb, skb, &txq->sk_list);
@@ -786,9 +794,9 @@
 		txq->last_retry_skb = skb;
 		txq->nb_retry++;
 	}
-
+#ifdef CREATE_TRACE_POINTS
 	trace_txq_queue_skb(skb, txq, retry);
-
+#endif
 	/* Flowctrl corresponding netdev queue if needed */
 #ifdef CONFIG_RWNX_FULLMAC
 	/* If too many buffer are queued for this TXQ stop netdev queue */
@@ -796,7 +804,9 @@
 		(skb_queue_len(&txq->sk_list) > RWNX_NDEV_FLOW_CTRL_STOP)) {
 		txq->status |= RWNX_TXQ_NDEV_FLOW_CTRL;
 		netif_stop_subqueue(txq->ndev, txq->ndev_idx);
+#ifdef CREATE_TRACE_POINTS
 		trace_txq_flowctrl_stop(txq);
+#endif
 	}
 #else /* ! CONFIG_RWNX_FULLMAC */
 
@@ -852,7 +862,6 @@
 	if (txq->pkt_pushed[user])
 		txq->pkt_pushed[user]--;
 
-	hwq->credits[user]++;
 	hwq->need_processing = true;
 	rwnx_hw->stats.cfm_balance[hwq->id]--;
 }
@@ -1019,7 +1028,7 @@
 							  struct sk_buff_head *sk_list_push)
 {
 	int nb_ready = skb_queue_len(&txq->sk_list);
-	int credits = min_t(int, rwnx_txq_get_credits(txq), hwq->credits[user]);
+	int credits = rwnx_txq_get_credits(txq);
 	bool res = false;
 
 	__skb_queue_head_init(sk_list_push);
@@ -1159,9 +1168,9 @@
 	struct rwnx_txq *txq, *next;
 	int user, credit_map = 0;
 	bool mu_enable;
-
+#ifdef CREATE_TRACE_POINTS
 	trace_process_hw_queue(hwq);
-
+#endif
 	hwq->need_processing = false;
 
 	mu_enable = rwnx_txq_take_mu_lock(rwnx_hw);
@@ -1173,38 +1182,35 @@
 		struct sk_buff_head sk_list_push;
 		struct sk_buff *skb;
 		bool txq_empty;
-
+#ifdef CREATE_TRACE_POINTS
 		trace_process_txq(txq);
-
+#endif
 		/* sanity check for debug */
 		BUG_ON(!(txq->status & RWNX_TXQ_IN_HWQ_LIST));
+		if (txq->idx == TXQ_INACTIVE) {
+			printk("%s txq->idx == TXQ_INACTIVE \r\n", __func__);
+			continue;
+		}
 		BUG_ON(txq->idx == TXQ_INACTIVE);
 		BUG_ON(txq->credits <= 0);
 		BUG_ON(!rwnx_txq_skb_ready(txq));
 
-		if (!rwnx_txq_select_user(rwnx_hw, mu_enable, txq, hwq, &user))
-			continue;
-
-		if (!hwq->credits[user]) {
-			credit_map |= BIT(user);
-			if (credit_map == ALL_HWQ_MASK)
-				break;
+		if (!rwnx_txq_select_user(rwnx_hw, mu_enable, txq, hwq, &user)) {
+			printk("select user:%d\n", user);
 			continue;
 		}
 
 		txq_empty = rwnx_txq_get_skb_to_push(rwnx_hw, hwq, txq, user,
 											 &sk_list_push);
-
 		while ((skb = __skb_dequeue(&sk_list_push)) != NULL) {
 			txhdr = (struct rwnx_txhdr *)skb->data;
 			rwnx_tx_push(rwnx_hw, txhdr, 0);
 		}
 
 		if (txq_empty) {
-		rwnx_txq_del_from_hw_list(txq);
-		txq->pkt_sent = 0;
-		} else if ((hwq->credits[user] == 0) &&
-				rwnx_txq_is_scheduled(txq)) {
+			rwnx_txq_del_from_hw_list(txq);
+			txq->pkt_sent = 0;
+		} else if (rwnx_txq_is_scheduled(txq)) {
 			/* txq not empty,
 			- To avoid starving need to process other txq in the list
 			- For better aggregation, need to send "as many consecutive
@@ -1230,10 +1236,12 @@
 
 		/* restart netdev queue if number of queued buffer is below threshold */
 		if (unlikely(txq->status & RWNX_TXQ_NDEV_FLOW_CTRL) &&
-			skb_queue_len(&txq->sk_list) < RWNX_NDEV_FLOW_CTRL_RESTART) {
+			(skb_queue_len(&txq->sk_list) < RWNX_NDEV_FLOW_CTRL_RESTART)) {
 			txq->status &= ~RWNX_TXQ_NDEV_FLOW_CTRL;
 			netif_wake_subqueue(txq->ndev, txq->ndev_idx);
+#ifdef CREATE_TRACE_POINTS
 			trace_txq_flowctrl_restart(txq);
+#endif
 		}
 #endif /* CONFIG_RWNX_FULLMAC */
 	}
@@ -1272,13 +1280,11 @@
  */
 void rwnx_hwq_init(struct rwnx_hw *rwnx_hw)
 {
-	int i, j;
+	int i;
 
 	for (i = 0; i < ARRAY_SIZE(rwnx_hw->hwq); i++) {
 		struct rwnx_hwq *hwq = &rwnx_hw->hwq[i];
 
-		for (j = 0 ; j < CONFIG_USER_MAX; j++)
-			hwq->credits[j] = nx_txdesc_cnt[i];
 		hwq->id = i;
 		hwq->size = nx_txdesc_cnt[i];
 		INIT_LIST_HEAD(&hwq->list);

--
Gitblit v1.6.2