aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00/rt2500usb.c
diff options
context:
space:
mode:
authorIgor Perminov <igor.perminov@inbox.ru>2009-08-09 18:58:54 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-08-14 09:13:55 -0400
commitd6756d0dc220c3d12e2c4c06ca97d1dbcb5edf4e (patch)
treeaaa10e86a291624fa71cde855860a7787bb49d2e /drivers/net/wireless/rt2x00/rt2500usb.c
parent3281d95d0535909e28ff16c38a678102e10f0312 (diff)
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>
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2500usb.c')
-rw-r--r--drivers/net/wireless/rt2x00/rt2500usb.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c
index de48c5c68eff..09a589432dab 100644
--- a/drivers/net/wireless/rt2x00/rt2500usb.c
+++ b/drivers/net/wireless/rt2x00/rt2500usb.c
@@ -1238,8 +1238,6 @@ static void rt2500usb_write_beacon(struct queue_entry *entry)
1238 * otherwise we might be sending out invalid data. 1238 * otherwise we might be sending out invalid data.
1239 */ 1239 */
1240 rt2500usb_register_read(rt2x00dev, TXRX_CSR19, &reg); 1240 rt2500usb_register_read(rt2x00dev, TXRX_CSR19, &reg);
1241 rt2x00_set_field16(&reg, TXRX_CSR19_TSF_COUNT, 0);
1242 rt2x00_set_field16(&reg, TXRX_CSR19_TBCN, 0);
1243 rt2x00_set_field16(&reg, TXRX_CSR19_BEACON_GEN, 0); 1241 rt2x00_set_field16(&reg, TXRX_CSR19_BEACON_GEN, 0);
1244 rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg); 1242 rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
1245 1243
@@ -1287,7 +1285,7 @@ static int rt2500usb_get_tx_data_len(struct queue_entry *entry)
1287static void rt2500usb_kick_tx_queue(struct rt2x00_dev *rt2x00dev, 1285static void rt2500usb_kick_tx_queue(struct rt2x00_dev *rt2x00dev,
1288 const enum data_queue_qid queue) 1286 const enum data_queue_qid queue)
1289{ 1287{
1290 u16 reg; 1288 u16 reg, reg0;
1291 1289
1292 if (queue != QID_BEACON) { 1290 if (queue != QID_BEACON) {
1293 rt2x00usb_kick_tx_queue(rt2x00dev, queue); 1291 rt2x00usb_kick_tx_queue(rt2x00dev, queue);
@@ -1298,16 +1296,19 @@ static void rt2500usb_kick_tx_queue(struct rt2x00_dev *rt2x00dev,
1298 if (!rt2x00_get_field16(reg, TXRX_CSR19_BEACON_GEN)) { 1296 if (!rt2x00_get_field16(reg, TXRX_CSR19_BEACON_GEN)) {
1299 rt2x00_set_field16(&reg, TXRX_CSR19_TSF_COUNT, 1); 1297 rt2x00_set_field16(&reg, TXRX_CSR19_TSF_COUNT, 1);
1300 rt2x00_set_field16(&reg, TXRX_CSR19_TBCN, 1); 1298 rt2x00_set_field16(&reg, TXRX_CSR19_TBCN, 1);
1299 reg0 = reg;
1301 rt2x00_set_field16(&reg, TXRX_CSR19_BEACON_GEN, 1); 1300 rt2x00_set_field16(&reg, TXRX_CSR19_BEACON_GEN, 1);
1302 /* 1301 /*
1303 * Beacon generation will fail initially. 1302 * Beacon generation will fail initially.
1304 * To prevent this we need to register the TXRX_CSR19 1303 * To prevent this we need to change the TXRX_CSR19
1305 * register several times. 1304 * register several times (reg0 is the same as reg
1305 * except for TXRX_CSR19_BEACON_GEN, which is 0 in reg0
1306 * and 1 in reg).
1306 */ 1307 */
1307 rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg); 1308 rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
1308 rt2500usb_register_write(rt2x00dev, TXRX_CSR19, 0); 1309 rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg0);
1309 rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg); 1310 rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
1310 rt2500usb_register_write(rt2x00dev, TXRX_CSR19, 0); 1311 rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg0);
1311 rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg); 1312 rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
1312 } 1313 }
1313} 1314}