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_tx.c |   68 +++++++++++++++++++--------------
 1 files changed, 39 insertions(+), 29 deletions(-)

diff --git a/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/rwnx_tx.c b/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/rwnx_tx.c
old mode 100644
new mode 100755
index c2d815c..72027f1
--- a/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/rwnx_tx.c
+++ b/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/rwnx_tx.c
@@ -41,7 +41,9 @@
 	} else {
 		bool uapsd = (ps_id != LEGACY_PS_ID);
 		rwnx_send_me_traffic_ind(rwnx_hw, sta->sta_idx, uapsd, available);
+#ifdef CREATE_TRACE_POINTS
 		trace_ps_traffic_update(sta->sta_idx, available, uapsd);
+#endif
 	}
 }
 
@@ -76,8 +78,9 @@
 	struct rwnx_txq *txq;
 
 	if (enable) {
+#ifdef CREATE_TRACE_POINTS
 		trace_ps_enable(sta);
-
+#endif
 		spin_lock_bh(&rwnx_hw->tx_lock);
 		sta->ps.active = true;
 		sta->ps.sp_cnt[LEGACY_PS_ID] = 0;
@@ -100,14 +103,15 @@
 
 		spin_unlock_bh(&rwnx_hw->tx_lock);
 
-		if (sta->ps.pkt_ready[LEGACY_PS_ID])
+		/*if (sta->ps.pkt_ready[LEGACY_PS_ID])
 			rwnx_set_traffic_status(rwnx_hw, sta, true, LEGACY_PS_ID);
 
 		if (sta->ps.pkt_ready[UAPSD_ID])
-			rwnx_set_traffic_status(rwnx_hw, sta, true, UAPSD_ID);
+			rwnx_set_traffic_status(rwnx_hw, sta, true, UAPSD_ID);*/
 	} else {
+#ifdef CREATE_TRACE_POINTS
 		trace_ps_disable(sta->sta_idx);
-
+#endif
 		spin_lock_bh(&rwnx_hw->tx_lock);
 		sta->ps.active = false;
 
@@ -125,11 +129,11 @@
 		rwnx_txq_sta_start(sta, RWNX_TXQ_STOP_STA_PS, rwnx_hw);
 		spin_unlock_bh(&rwnx_hw->tx_lock);
 
-		if (sta->ps.pkt_ready[LEGACY_PS_ID])
+		/*if (sta->ps.pkt_ready[LEGACY_PS_ID])
 			rwnx_set_traffic_status(rwnx_hw, sta, false, LEGACY_PS_ID);
 
 		if (sta->ps.pkt_ready[UAPSD_ID])
-			rwnx_set_traffic_status(rwnx_hw, sta, false, UAPSD_ID);
+			rwnx_set_traffic_status(rwnx_hw, sta, false, UAPSD_ID);*/
 
 		tasklet_schedule(&rwnx_hw->task);
 	}
@@ -168,9 +172,9 @@
 	printk("sta %pM is not in Power Save mode", sta->mac_addr);
 		return;
 	}
-
+#ifdef CREATE_TRACE_POINTS
 	trace_ps_traffic_req(sta, pkt_req, ps_id);
-
+#endif
 	spin_lock_bh(&rwnx_hw->tx_lock);
 
 	/* Fw may ask to stop a service period with PS_SP_INTERRUPTED. This only
@@ -446,9 +450,9 @@
 	if (unlikely(sta->ps.active)) {
 		sta->ps.pkt_ready[txq->ps_id]--;
 		sta->ps.sp_cnt[txq->ps_id]--;
-
+#ifdef CREATE_TRACE_POINTS
 		trace_ps_push(sta);
-
+#endif
 		if (((txq->ps_id == UAPSD_ID) || (vif->wdev.iftype == NL80211_IFTYPE_MESH_POINT) || (sta->tdls.active))
 				&& !sta->ps.sp_cnt[txq->ps_id]) {
 			sw_txhdr->desc.host.flags |= TXU_CNTRL_EOSP;
@@ -578,7 +582,8 @@
 	   between queue and push (because of PS) */
 	sw_txhdr->hw_queue = hw_queue;
 
-	sw_txhdr->desc.host.packet_addr = hw_queue; //use packet_addr field for hw_txq
+	//sw_txhdr->desc.host.packet_addr = hw_queue; //use packet_addr field for hw_txq
+	sw_txhdr->desc.host.ac = hw_queue; //use ac field for hw_txq
 #ifdef CONFIG_RWNX_MUMIMO_TX
 	/* MU group is only selected during hwq processing */
 	sw_txhdr->desc.host.mumimo_info = txq->mumimo_info;
@@ -589,8 +594,9 @@
 		/* only for AP mode */
 		rwnx_set_more_data_flag(rwnx_hw, sw_txhdr);
 	}
-
+#ifdef CREATE_TRACE_POINTS
 	trace_push_desc(skb, sw_txhdr, flags);
+#endif
 	#if 0
 	txq->credits--;
 	#endif
@@ -607,7 +613,8 @@
 	rwnx_ipc_txdesc_push(rwnx_hw, &sw_txhdr->desc, skb, hw_queue, user);
 #else
 #ifdef AICWF_SDIO_SUPPORT
-	if (((sw_txhdr->desc.host.flags & TXU_CNTRL_MGMT) && ((*(skb->data+sw_txhdr->headroom) == 0xd0) || (*(skb->data+sw_txhdr->headroom) == 0x10))) || \
+	if (((sw_txhdr->desc.host.flags & TXU_CNTRL_MGMT) && \
+		((*(skb->data+sw_txhdr->headroom) == 0xd0) || (*(skb->data+sw_txhdr->headroom) == 0x10) || (*(skb->data+sw_txhdr->headroom) == 0x30))) || \
 		(sw_txhdr->desc.host.ethertype == 0x8e88)) {
 		sw_txhdr->need_cfm = 1;
 		sw_txhdr->desc.host.status_desc_addr = ((1<<31) | rwnx_hw->sdio_env.txdesc_free_idx[0]);
@@ -624,7 +631,8 @@
 	aicwf_frame_tx((void *)(rwnx_hw->sdiodev), skb);
 #endif
 #ifdef AICWF_USB_SUPPORT
-	if (((sw_txhdr->desc.host.flags & TXU_CNTRL_MGMT) && ((*(skb->data+sw_txhdr->headroom) == 0xd0) || (*(skb->data+sw_txhdr->headroom) == 0x10))) || \
+	if (((sw_txhdr->desc.host.flags & TXU_CNTRL_MGMT) && \
+		((*(skb->data+sw_txhdr->headroom) == 0xd0) || (*(skb->data+sw_txhdr->headroom) == 0x10) || (*(skb->data+sw_txhdr->headroom) == 0x30))) || \
 		(sw_txhdr->desc.host.ethertype == 0x8e88)) {
 		printk("push need cfm flags 0x%x\n", sw_txhdr->desc.host.flags);
 		sw_txhdr->need_cfm = 1;
@@ -672,12 +680,14 @@
 
 	if (!sw_retry) {
 		/* update sw desc */
+#if 0
 		sw_txhdr->desc.host.sn = cfm->sn;
 		sw_txhdr->desc.host.pn[0] = cfm->pn[0];
 		sw_txhdr->desc.host.pn[1] = cfm->pn[1];
 		sw_txhdr->desc.host.pn[2] = cfm->pn[2];
 		sw_txhdr->desc.host.pn[3] = cfm->pn[3];
 		sw_txhdr->desc.host.timestamp = cfm->timestamp;
+#endif
 		sw_txhdr->desc.host.flags |= TXU_CNTRL_RETRY;
 
 		#ifdef CONFIG_RWNX_AMSDUS_TX
@@ -866,9 +876,6 @@
 	amsdu->pad = AMSDU_PADDING(map_len - amsdu->pad);
 	list_add_tail(&amsdu_txhdr->list, &amsdu->hdrs);
 	amsdu->len += map_len;
-
-	rwnx_ipc_sta_buffer(rwnx_hw, sw_txhdr->txq->sta,
-						sw_txhdr->txq->tid, msdu_len);
 
 	trace_amsdu_subframe(sw_txhdr);
 	return 0;
@@ -1095,7 +1102,7 @@
 		(memcmp(desc->host.eth_dest_addr.array, rwnx_vif->sta.tdls_sta->mac_addr, ETH_ALEN) == 0)) {
 		desc->host.flags |= TXU_CNTRL_TDLS;
 		rwnx_vif->sta.tdls_sta->tdls.last_tid = desc->host.tid;
-		rwnx_vif->sta.tdls_sta->tdls.last_sn = desc->host.sn;
+		//rwnx_vif->sta.tdls_sta->tdls.last_sn = desc->host.sn;
 	}
 
 	if (rwnx_vif->wdev.iftype == NL80211_IFTYPE_MESH_POINT) {
@@ -1122,11 +1129,13 @@
 	/* Fill-in TX descriptor */
 	frame_oft = sizeof(struct rwnx_txhdr) - offsetof(struct rwnx_txhdr, hw_hdr)
 				+ hdr_pads;// + sizeof(*eth);
+#if 0
 #ifdef CONFIG_RWNX_SPLIT_TX_BUF
 	desc->host.packet_addr[0] = sw_txhdr->dma_addr + frame_oft;
 	desc->host.packet_cnt = 1;
 #else
 	desc->host.packet_addr = sw_txhdr->dma_addr + frame_oft;
+#endif
 #endif
 	desc->host.status_desc_addr = sw_txhdr->dma_addr;
 
@@ -1312,11 +1321,13 @@
 	}
 
 	frame_oft = sizeof(struct rwnx_txhdr) - offsetof(struct rwnx_txhdr, hw_hdr);
+#if 0
 #ifdef CONFIG_RWNX_SPLIT_TX_BUF
 	desc->host.packet_addr[0] = sw_txhdr->dma_addr + frame_oft;
 	desc->host.packet_cnt = 1;
 #else
 	desc->host.packet_addr = sw_txhdr->dma_addr + frame_oft;
+#endif
 #endif
 	desc->host.status_desc_addr = sw_txhdr->dma_addr;
 
@@ -1344,6 +1355,7 @@
 	struct rwnx_sw_txhdr *sw_txhdr;
 	struct rwnx_hwq *hwq;
 	struct rwnx_txq *txq;
+	int headroom;
 	//int peek_off = offsetof(struct rwnx_hw_txhdr, cfm);
 	//int peek_len = sizeof(((struct rwnx_hw_txhdr *)0)->cfm);
 
@@ -1366,14 +1378,14 @@
 
 	/* Update txq and HW queue credits */
 	if (sw_txhdr->desc.host.flags & TXU_CNTRL_MGMT) {
-		trace_printk("done=%d retry_required=%d sw_retry_required=%d acknowledged=%d\n",
+		printk("done=%d retry_required=%d sw_retry_required=%d acknowledged=%d\n",
 					 rwnx_txst.tx_done, rwnx_txst.retry_required,
 					 rwnx_txst.sw_retry_required, rwnx_txst.acknowledged);
-
+#ifdef CREATE_TRACE_POINTS
 		trace_mgmt_cfm(sw_txhdr->rwnx_vif->vif_index,
 					   (sw_txhdr->rwnx_sta) ? sw_txhdr->rwnx_sta->sta_idx : 0xFF,
 					   rwnx_txst.acknowledged);
-
+#endif
 		/* Confirm transmission to CFG80211 */
 		cfg80211_mgmt_tx_status(&sw_txhdr->rwnx_vif->wdev,
 								(unsigned long)skb,
@@ -1393,9 +1405,9 @@
 		rwnx_tx_retry(rwnx_hw, skb, txhdr, sw_retry);
 		return 0;
 	}
-
+#ifdef CREATE_TRACE_POINTS
 	trace_skb_confirm(skb, txq, hwq, &txhdr->hw_hdr.cfm);
-
+#endif
 	/* STA may have disconnect (and txq stopped) when buffers were stored
 	   in fw. In this case do nothing when they're returned */
 	if (txq->idx != TXQ_INACTIVE) {
@@ -1433,18 +1445,14 @@
 		struct rwnx_amsdu_txhdr *amsdu_txhdr;
 		list_for_each_entry(amsdu_txhdr, &sw_txhdr->amsdu.hdrs, list) {
 			rwnx_amsdu_del_subframe_header(amsdu_txhdr);
-			 rwnx_ipc_sta_buffer(rwnx_hw, txq->sta, txq->tid,
-								 -amsdu_txhdr->msdu_len);
 			consume_skb(amsdu_txhdr->skb);
 		}
 	}
 #endif /* CONFIG_RWNX_AMSDUS_TX */
 
-	rwnx_ipc_sta_buffer(rwnx_hw, txq->sta, txq->tid,
-						-sw_txhdr->frame_len);
-
+	headroom = sw_txhdr->headroom;
 	kmem_cache_free(rwnx_hw->sw_txhdr_cache, sw_txhdr);
-	skb_pull(skb, sw_txhdr->headroom);
+	skb_pull(skb, headroom);
 	consume_skb(skb);
 
 	return 0;
@@ -1473,7 +1481,9 @@
 
 	if (txq->idx != TXQ_INACTIVE) {
 		//txq->credits += update;
+#ifdef CREATE_TRACE_POINTS
 		trace_credit_update(txq, update);
+#endif
 		if (txq->credits <= 0)
 			rwnx_txq_stop(txq, RWNX_TXQ_STOP_FULL);
 		else

--
Gitblit v1.6.2