rt2x00: Fix beacon de-synchronization while update beacon
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 xxx_write_beacon should disable beacon generation only while beacon data are being uploaded to the device, but it should not disable the beacon clock. Signed-off-by: Igor Perminov <igor.perminov@inbox.ru> Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:

committed by
John W. Linville

parent
3281d95d05
commit
d6756d0dc2
@@ -1238,8 +1238,6 @@ static void rt2500usb_write_beacon(struct queue_entry *entry)
|
||||
* otherwise we might be sending out invalid data.
|
||||
*/
|
||||
rt2500usb_register_read(rt2x00dev, TXRX_CSR19, ®);
|
||||
rt2x00_set_field16(®, TXRX_CSR19_TSF_COUNT, 0);
|
||||
rt2x00_set_field16(®, TXRX_CSR19_TBCN, 0);
|
||||
rt2x00_set_field16(®, TXRX_CSR19_BEACON_GEN, 0);
|
||||
rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
|
||||
|
||||
@@ -1287,7 +1285,7 @@ static int rt2500usb_get_tx_data_len(struct queue_entry *entry)
|
||||
static void rt2500usb_kick_tx_queue(struct rt2x00_dev *rt2x00dev,
|
||||
const enum data_queue_qid queue)
|
||||
{
|
||||
u16 reg;
|
||||
u16 reg, reg0;
|
||||
|
||||
if (queue != QID_BEACON) {
|
||||
rt2x00usb_kick_tx_queue(rt2x00dev, queue);
|
||||
@@ -1298,16 +1296,19 @@ static void rt2500usb_kick_tx_queue(struct rt2x00_dev *rt2x00dev,
|
||||
if (!rt2x00_get_field16(reg, TXRX_CSR19_BEACON_GEN)) {
|
||||
rt2x00_set_field16(®, TXRX_CSR19_TSF_COUNT, 1);
|
||||
rt2x00_set_field16(®, TXRX_CSR19_TBCN, 1);
|
||||
reg0 = reg;
|
||||
rt2x00_set_field16(®, TXRX_CSR19_BEACON_GEN, 1);
|
||||
/*
|
||||
* Beacon generation will fail initially.
|
||||
* To prevent this we need to register the TXRX_CSR19
|
||||
* register several times.
|
||||
* To prevent this we need to change the TXRX_CSR19
|
||||
* register several times (reg0 is the same as reg
|
||||
* except for TXRX_CSR19_BEACON_GEN, which is 0 in reg0
|
||||
* and 1 in reg).
|
||||
*/
|
||||
rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
|
||||
rt2500usb_register_write(rt2x00dev, TXRX_CSR19, 0);
|
||||
rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg0);
|
||||
rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
|
||||
rt2500usb_register_write(rt2x00dev, TXRX_CSR19, 0);
|
||||
rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg0);
|
||||
rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user