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