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