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;
        }
 
        /*

Reply via email to