I forgot to attach the patches, do it now. On Wed, Mar 07, 2018 at 01:27:01PM +0100, Stanislaw Gruszka wrote: > On Thu, Mar 01, 2018 at 04:30:10PM +0100, Daniel Golle wrote: > > [forwarding to all other involved players] > > > > On Thu, Mar 01, 2018 at 05:50:51PM +0300, Jamie Stuart wrote: > > > Hi Daniel, > > > The driver seems much improved after this fix. > > > > it's about those two > > [PATCH 1/2] rt2x00: pause almost full queue early > > [PATCH 2/2] rt2x00: do not pause queue unconditionally on error path > > > > > Under very heavy load (30 clients downloading multi-GB files from SD card on the server concurrently), wifi dies with errors: > > This is some testbed? Could you share how did you setup such > environment and what are client devices ? > > > > [ 7794.230376] ieee80211 phy0: rt2x00lib_rxdone_read_signal: Warning - Frame received with unrecognized signal, mode=0x0001, signal=0x010c, type=4 > > This is indicator that HW/FW has a problem. There could be various > reasons for that. One possible I can also observe in my setup,is strange > mishmash of seq on frames which were not acked in BlockACK and > had to be resent. This can happen when many frames are wrongly decoded > (i.e. when there is bad radio condition or we have not correct low level > RF/BBP setup for a Ralink device). To mitigate that problem we can > limit length of agreggeted AMPDU frame. > > I attached two patches which do that. One for RX side second for TX side. > Please check if they make a diffrent. You can also hardcode ba_size = 0 > for those 30 clients setup. > > Note the patches can cause (possibly small) perfromance degradation on > good setups. > > Mathias, could you check them as well and see if they do not cause > performance regression on your device ? Lastly when I changed ba_size > setting, it was a problem on your setup. > > > > Thu Mar 1 16:36:47 2018 kern.err kernel: [ 8702.146403] ieee80211 phy0: rt2x00queue_write_tx_frame: Error - Arrived at non-free entry in the non-full queue 2 > > > Thu Mar 1 16:36:47 2018 kern.err kernel: [ 8702.146403] Please file bug report to http://rt2x00.serialmonkey.com > > > Thu Mar 1 16:36:48 2018 kern.err kernel: [ 8702.288149] ieee80211 phy0: rt2x00queue_write_tx_frame: Error - Arrived at non-free entry in the non-full queue 2 > > > Thu Mar 1 16:36:48 2018 kern.err kernel: [ 8702.288149] Please file bug report to http://rt2x00.serialmonkey.com > > > Thu Mar 1 16:36:48 2018 kern.err kernel: [ 8702.380761] ieee80211 phy0: rt2x00queue_write_tx_frame: Error - Arrived at non-free entry in the non-full queue 2 > > > Thu Mar 1 16:36:48 2018 kern.err kernel: [ 8702.380761] Please file bug report to http://rt2x00.serialmonkey.com > > For those errors I recommend to remove > > 600-23-rt2x00-rt2800mmio-add-a-workaround-for-spurious-TX_F.patch > > patch. Whould be good if OpenWRT developers could apply this patch only > on target where it is really needed, not for all rt2800 devices. > > Thanks > Stanislaw
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c index d2c289446c00..e68f7f9d48f8 100644 --- a/drivers/net/wireless/ralink/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2800lib.c @@ -9285,7 +9285,7 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev) spec->ht.cap |= rx_chains << IEEE80211_HT_CAP_RX_STBC_SHIFT; - spec->ht.ampdu_factor = (rx_chains > 1) ? 3 : 2; + spec->ht.ampdu_factor = 0; spec->ht.ampdu_density = 4; spec->ht.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; if (tx_chains != rx_chains) {
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c index a2c1ca5c76d1..66377f222300 100644 --- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c @@ -305,12 +305,13 @@ static void rt2x00queue_create_tx_descriptor_ht(struct rt2x00_dev *rt2x00dev, struct ieee80211_tx_rate *txrate = &tx_info->control.rates[0]; struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; struct rt2x00_sta *sta_priv = NULL; - u8 density = 0; + u8 density = 0, ba_size = 0; if (sta) { sta_priv = sta_to_rt2x00_sta(sta); txdesc->u.ht.wcid = sta_priv->wcid; density = sta->ht_cap.ampdu_density; + ba_size = (2 << sta->ht_cap.ampdu_factor) - 1; } /* @@ -357,7 +358,7 @@ static void rt2x00queue_create_tx_descriptor_ht(struct rt2x00_dev *rt2x00dev, !(tx_info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE)) { __set_bit(ENTRY_TXD_HT_AMPDU, &txdesc->flags); txdesc->u.ht.mpdu_density = density; - txdesc->u.ht.ba_size = 7; /* FIXME: What value is needed? */ + txdesc->u.ht.ba_size = ba_size; } /*