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. [...]