Return-path: Received: from mout2.freenet.de ([195.4.92.92]:60874 "EHLO mout2.freenet.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753766Ab2AXIEy (ORCPT ); Tue, 24 Jan 2012 03:04:54 -0500 Message-ID: <4F1E656A.5000204@01019freenet.de> (sfid-20120124_090458_516526_DB79E497) Date: Tue, 24 Jan 2012 09:01:46 +0100 From: Andreas Hartmann MIME-Version: 1.0 To: Stanislaw Gruszka CC: Helmut Schaa , "linux-wireless@vger.kernel.org" , Felix Fietkau Subject: Re: Compat-wireless-3.2-rc6-3 is broken for rt2860 device References: <4F040FEA.3080703@01019freenet.de> <1408490.qSFZVkU7fA@helmutmobil.site> <4F0562DF.3000200@dualc.maya.org> <4F0AEBAB.9020104@01019freenet.de> <201201100803.q0A83nsQ003757@mail.maya.org> <201201200730.q0K7U0oj004966@mail.maya.org> <20120124072946.GB2420@redhat.com> In-Reply-To: <20120124072946.GB2420@redhat.com> Content-Type: text/plain; charset=ISO-8859-1 Sender: linux-wireless-owner@vger.kernel.org List-ID: Stanislaw Gruszka schrieb: > On Mon, Jan 23, 2012 at 02:29:08PM +0100, Helmut Schaa wrote: >> On Fri, Jan 20, 2012 at 8:29 AM, Andreas Hartmann >> wrote: >>> All in one: Your workaround was a good idea, but unfortunately it >>> doesn't "solve" / workaround the problem introduced with the patch >>> "mac80211: retry sending failed BAR frames later instead of tearing >>> down aggr" [1]. I don't know off any other solution at this time as to revert it. >> >> Ok, so we've got at least one hw issue here: rt2800 is not able to report >> correct ACK state of BARs :( > > Whould it help, if rt2800 driver will not filter out BAR frames? > > diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c > index 22a1a8f..20418be 100644 > --- a/drivers/net/wireless/rt2x00/rt2800lib.c > +++ b/drivers/net/wireless/rt2x00/rt2800lib.c > @@ -1205,8 +1205,7 @@ void rt2800_config_filter(struct rt2x00_dev *rt2x00dev, > !(filter_flags & FIF_PSPOLL)); > rt2x00_set_field32(®, RX_FILTER_CFG_DROP_BA, > !(filter_flags & FIF_CONTROL)); > - rt2x00_set_field32(®, RX_FILTER_CFG_DROP_BAR, > - !(filter_flags & FIF_CONTROL)); > + rt2x00_set_field32(®, RX_FILTER_CFG_DROP_BAR, 0); > rt2x00_set_field32(®, RX_FILTER_CFG_DROP_CNTL, > !(filter_flags & FIF_CONTROL)); > rt2800_register_write(rt2x00dev, RX_FILTER_CFG, reg); > > This can't be applied to compat-wireless-3.2-1-s (same in compat-wireless-3.2-rc6-3) - it seems to be already existing. The relevant part looks like this: void rt2800_config_filter(struct rt2x00_dev *rt2x00dev, const unsigned int filter_flags) { u32 reg; /* * Start configuration steps. * Note that the version error will always be dropped * and broadcast frames will always be accepted since * there is no filter for it at this time. */ rt2800_register_read(rt2x00dev, RX_FILTER_CFG, ®); rt2x00_set_field32(®, RX_FILTER_CFG_DROP_CRC_ERROR, !(filter_flags & FIF_FCSFAIL)); rt2x00_set_field32(®, RX_FILTER_CFG_DROP_PHY_ERROR, !(filter_flags & FIF_PLCPFAIL)); rt2x00_set_field32(®, RX_FILTER_CFG_DROP_NOT_TO_ME, !(filter_flags & FIF_PROMISC_IN_BSS)); rt2x00_set_field32(®, RX_FILTER_CFG_DROP_NOT_MY_BSSD, 0); rt2x00_set_field32(®, RX_FILTER_CFG_DROP_VER_ERROR, 1); rt2x00_set_field32(®, RX_FILTER_CFG_DROP_MULTICAST, !(filter_flags & FIF_ALLMULTI)); rt2x00_set_field32(®, RX_FILTER_CFG_DROP_BROADCAST, 0); rt2x00_set_field32(®, RX_FILTER_CFG_DROP_DUPLICATE, 1); rt2x00_set_field32(®, RX_FILTER_CFG_DROP_CF_END_ACK, !(filter_flags & FIF_CONTROL)); rt2x00_set_field32(®, RX_FILTER_CFG_DROP_CF_END, !(filter_flags & FIF_CONTROL)); rt2x00_set_field32(®, RX_FILTER_CFG_DROP_ACK, !(filter_flags & FIF_CONTROL)); rt2x00_set_field32(®, RX_FILTER_CFG_DROP_CTS, !(filter_flags & FIF_CONTROL)); rt2x00_set_field32(®, RX_FILTER_CFG_DROP_RTS, !(filter_flags & FIF_CONTROL)); rt2x00_set_field32(®, RX_FILTER_CFG_DROP_PSPOLL, !(filter_flags & FIF_PSPOLL)); rt2x00_set_field32(®, RX_FILTER_CFG_DROP_BA, 1); rt2x00_set_field32(®, RX_FILTER_CFG_DROP_BAR, 0); rt2x00_set_field32(®, RX_FILTER_CFG_DROP_CNTL, !(filter_flags & FIF_CONTROL)); rt2800_register_write(rt2x00dev, RX_FILTER_CFG, reg); } EXPORT_SYMBOL_GPL(rt2800_config_filter); Thanks, Andreas