Search Linux Wireless

Re: [PATCH] wifi: rtlwifi: rtl8192cu: Fix TX aggregation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 2024-02-08 at 21:54 +0200, Bitterblue Smith wrote:
> 
> rtl8192cu is checking rtl_mac.tids when deciding if it should enable
> aggregation. This is wrong because rtl_mac.tids is not initialised
> anywhere. Check rtl_sta_info.tids instead, which is initialised.
> 
> Also, when enabling aggregation also enable RTS. The vendor driver does
> this, my router does this. It seems like the thing to do.
> 
> Also also, it seems right to set the AMPDU density only when enabling
> aggregation.
> 
> Also also also, delete the unused member rtl_mac.tids and the unused
> macros RTL_AGG_ON and RTL_AGG_OFF.
> 
> Naturally, with working AMPDU the download/upload speeds are better.
> Before: 59/32 Mbps.
> After:  68/46 Mbps.
> 
> Signed-off-by: Bitterblue Smith <rtl8821cerfe2@xxxxxxxxx>
> ---
>  .../wireless/realtek/rtlwifi/rtl8192cu/trx.c  | 27 ++++++++++---------
>  .../wireless/realtek/rtlwifi/rtl8192cu/trx.h  |  2 --
>  drivers/net/wireless/realtek/rtlwifi/wifi.h   |  3 ---
>  3 files changed, 15 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/trx.c
> b/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/trx.c
> index e5c81c1c63c0..cbbd1dab8af0 100644
> --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/trx.c
> +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/trx.c
> @@ -475,8 +475,9 @@ void rtl92cu_tx_fill_desc(struct ieee80211_hw *hw,
>         struct rtl_priv *rtlpriv = rtl_priv(hw);
>         struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
>         struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
> -       u8 *qc = ieee80211_get_qos_ctl(hdr);
> -       u8 tid = qc[0] & IEEE80211_QOS_CTL_TID_MASK;
> +       struct rtl_sta_info *sta_entry;
> +       u8 agg_state = RTL_AGG_STOP;
> +       u8 ampdu_density = 0;
>         u16 seq_number;
>         __le16 fc = hdr->frame_control;
>         u8 rate_flag = info->control.rates[0].flags;
> @@ -498,10 +499,20 @@ void rtl92cu_tx_fill_desc(struct ieee80211_hw *hw,
>         set_tx_desc_tx_rate(txdesc, tcb_desc->hw_rate);
>         if (tcb_desc->use_shortgi || tcb_desc->use_shortpreamble)
>                 set_tx_desc_data_shortgi(txdesc, 1);
> -       if (mac->tids[tid].agg.agg_state == RTL_AGG_ON &&
> -                   info->flags & IEEE80211_TX_CTL_AMPDU) {
> +
> +       if (sta) {
> +               sta_entry = (struct rtl_sta_info *)sta->drv_priv;

nit: It would be better to be separated statement of ieee80211_get_tid(hdr)

tid = ieee80211_get_tid(hdr);
agg_state = sta_entry->tids[tid].agg.agg_state;


> +               agg_state = sta_entry->tids[ieee80211_get_tid(hdr)].agg.agg_state;
> +               ampdu_density = sta->deflink.ht_cap.ampdu_density;
> +       }
> +
> +       if (agg_state == RTL_AGG_OPERATIONAL &&
> +           info->flags & IEEE80211_TX_CTL_AMPDU) {
>                 set_tx_desc_agg_enable(txdesc, 1);
>                 set_tx_desc_max_agg_num(txdesc, 0x14);

Have you tried larger number of this? 
As IEEE80211_MAX_AMPDU_BUF_HT is 0x40, set 0x3f here to get higher TX
throughput if USB speed can afford. 

You can reference an equation of rtw89: 

	ampdu_num = (u8)((rtwsta->ampdu_params[tid].agg_num ?
			  rtwsta->ampdu_params[tid].agg_num :
			  4 << sta->deflink.ht_cap.ampdu_factor) - 1);

This is new for rtlwifi, so we can have this later. 


[...]







[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux