[rt2x00-users] [PATCH] rt2x00: Fix beacon de-synchronization while update beacon (rt73usb)
Igor Perminov
igor.perminov at inbox.ru
Mon Aug 3 23:34:36 UTC 2009
On Sat, 01/08/2009 at 15:21 +0200, Ivo van Doorn wrote:
> Hi,
>
> > When beacon is being updated to refresh TIM (AP mode), beacon frames are
> > de-synchronizing (i.e. two neighbor beacon frames - before and after
> > update - are being transmitted with a wrong time interval).
> > That is because rt73usb_write_beacon should clear only
> > TXRX_CSR9_BEACON_GEN flag, but not TXRX_CSR9_TSF_TICKING and
> > TXRX_CSR9_TBTT_ENABLE.
>
> Sorry for the late reply, after discovering that your mails are ending up
> in my spambox I have now gone through the entire folder to see what
> other mails were incorrectly marked as spam. :S
>
> > Signed-off-by: Igor Perminov <igor.perminov at inbox.ru>
> > ---
> > diff -urN a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
> > --- a/drivers/net/wireless/rt2x00/rt73usb.c 2009-07-16 23:12:43.000000000 +0400
> > +++ b/drivers/net/wireless/rt2x00/rt73usb.c 2009-07-23 00:56:07.000000000 +0400
> > @@ -1545,8 +1545,6 @@
> > * otherwise we might be sending out invalid data.
> > */
> > rt2x00usb_register_read(rt2x00dev, TXRX_CSR9, ®);
> > - rt2x00_set_field32(®, TXRX_CSR9_TSF_TICKING, 0);
> > - rt2x00_set_field32(®, TXRX_CSR9_TBTT_ENABLE, 0);
> > rt2x00_set_field32(®, TXRX_CSR9_BEACON_GEN, 0);
> > rt2x00usb_register_write(rt2x00dev, TXRX_CSR9, reg);
>
> Could you update this patch for the other drivers as well?
>
> Thanks,
>
> Ivo
Hi,
As for rt2400pci, rt2500pci, rt61pci and rt2800usb, beacon on/off code
is almost the same and I can update the patch for these drivers easily.
And as for rt2500usb, this driver has an extra code in
rt2500usb_kick_tx_queue (lines 6 - 14 in the code snippet below):
1: rt2500usb_register_read(rt2x00dev, TXRX_CSR19, ®);
2: if (!rt2x00_get_field16(reg, TXRX_CSR19_BEACON_GEN)) {
3: rt2x00_set_field16(®, TXRX_CSR19_TSF_COUNT, 1);
4: rt2x00_set_field16(®, TXRX_CSR19_TBCN, 1);
5: rt2x00_set_field16(®, TXRX_CSR19_BEACON_GEN, 1);
6: /*
7: * Beacon generation will fail initially.
8: * To prevent this we need to register the TXRX_CSR19
9: * register several times.
10: */
11: rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
12: rt2500usb_register_write(rt2x00dev, TXRX_CSR19, 0);
13: rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
14: rt2500usb_register_write(rt2x00dev, TXRX_CSR19, 0);
15: rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
16: }
This extra code will also de-synchronize beacon frames.
It is surprisingly, but my rt2500usb stick generates beacon frames fine
even without this part of code, I've tested it.
May be this was a workaround for some early version of a buggy rt2500usb
hardware?
So, we have three alternatives:
A) Leave rt2500usb code as is, not fixing the beacon synchronization
problem for it.
B) Exclude the code that switches TXRX_CSR19 to zero in
rt2500usb_kick_tx_queue with a risk of regression.
C) Same as B, but allow to turn on that code by a module parameter.
What do you think of it?
Igor
More information about the users
mailing list