aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless
diff options
context:
space:
mode:
authorHelmut Schaa <helmut.schaa@googlemail.com>2010-12-13 06:33:36 -0500
committerJohn W. Linville <linville@tuxdriver.com>2010-12-13 15:23:34 -0500
commit89b25f60e08180d7e00e6239398b467142aaec01 (patch)
tree7c8dd38055d85a9b062b524353835ad162a02a69 /drivers/net/wireless
parenta061a93b6eb8db8227b251666436da1e344771a0 (diff)
rt2x00: Don't frequently reset beacon interval in AdHoc mode
Commit 0204464329c17ba6d293e1899f71223599a0e582 "Check for specific changed flags when updating the erp config" changed the way in which a new beacon interval gets handled. However, due to a bug in rt2800usb and rt2800pci the beacon interval was reset during each scan, thus causing problems in AdHoc mode. Fix this by not cleaning up the beacon interval when killing the beacon queue but just prevent the device from sending out beacons. Reported-by: Wolfgang Kufner <wolfgang.kufner@gmail.com> Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com> Acked-by: Gertjan van Wingerde <gwingerde@gmail.com> Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r--drivers/net/wireless/rt2x00/rt2400pci.c6
-rw-r--r--drivers/net/wireless/rt2x00/rt2500pci.c6
-rw-r--r--drivers/net/wireless/rt2x00/rt2500usb.c12
-rw-r--r--drivers/net/wireless/rt2x00/rt2800pci.c6
-rw-r--r--drivers/net/wireless/rt2x00/rt2800usb.c12
-rw-r--r--drivers/net/wireless/rt2x00/rt61pci.c6
-rw-r--r--drivers/net/wireless/rt2x00/rt73usb.c12
7 files changed, 50 insertions, 10 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c
index 9ec6691adf0..62786608951 100644
--- a/drivers/net/wireless/rt2x00/rt2400pci.c
+++ b/drivers/net/wireless/rt2x00/rt2400pci.c
@@ -1140,7 +1140,11 @@ static void rt2400pci_kill_tx_queue(struct data_queue *queue)
1140 u32 reg; 1140 u32 reg;
1141 1141
1142 if (queue->qid == QID_BEACON) { 1142 if (queue->qid == QID_BEACON) {
1143 rt2x00pci_register_write(rt2x00dev, CSR14, 0); 1143 rt2x00pci_register_read(rt2x00dev, CSR14, &reg);
1144 rt2x00_set_field32(&reg, CSR14_TSF_COUNT, 0);
1145 rt2x00_set_field32(&reg, CSR14_TBCN, 0);
1146 rt2x00_set_field32(&reg, CSR14_BEACON_GEN, 0);
1147 rt2x00pci_register_write(rt2x00dev, CSR14, reg);
1144 } else { 1148 } else {
1145 rt2x00pci_register_read(rt2x00dev, TXCSR0, &reg); 1149 rt2x00pci_register_read(rt2x00dev, TXCSR0, &reg);
1146 rt2x00_set_field32(&reg, TXCSR0_ABORT, 1); 1150 rt2x00_set_field32(&reg, TXCSR0_ABORT, 1);
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c
index 3e7f2034624..ce9212f2820 100644
--- a/drivers/net/wireless/rt2x00/rt2500pci.c
+++ b/drivers/net/wireless/rt2x00/rt2500pci.c
@@ -1294,7 +1294,11 @@ static void rt2500pci_kill_tx_queue(struct data_queue *queue)
1294 u32 reg; 1294 u32 reg;
1295 1295
1296 if (queue->qid == QID_BEACON) { 1296 if (queue->qid == QID_BEACON) {
1297 rt2x00pci_register_write(rt2x00dev, CSR14, 0); 1297 rt2x00pci_register_read(rt2x00dev, CSR14, &reg);
1298 rt2x00_set_field32(&reg, CSR14_TSF_COUNT, 0);
1299 rt2x00_set_field32(&reg, CSR14_TBCN, 0);
1300 rt2x00_set_field32(&reg, CSR14_BEACON_GEN, 0);
1301 rt2x00pci_register_write(rt2x00dev, CSR14, reg);
1298 } else { 1302 } else {
1299 rt2x00pci_register_read(rt2x00dev, TXCSR0, &reg); 1303 rt2x00pci_register_read(rt2x00dev, TXCSR0, &reg);
1300 rt2x00_set_field32(&reg, TXCSR0_ABORT, 1); 1304 rt2x00_set_field32(&reg, TXCSR0_ABORT, 1);
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c
index 8152fec3175..bbfa671f115 100644
--- a/drivers/net/wireless/rt2x00/rt2500usb.c
+++ b/drivers/net/wireless/rt2x00/rt2500usb.c
@@ -1205,8 +1205,16 @@ static int rt2500usb_get_tx_data_len(struct queue_entry *entry)
1205 1205
1206static void rt2500usb_kill_tx_queue(struct data_queue *queue) 1206static void rt2500usb_kill_tx_queue(struct data_queue *queue)
1207{ 1207{
1208 if (queue->qid == QID_BEACON) 1208 struct rt2x00_dev *rt2x00dev = queue->rt2x00dev;
1209 rt2500usb_register_write(queue->rt2x00dev, TXRX_CSR19, 0); 1209 u16 reg;
1210
1211 if (queue->qid == QID_BEACON) {
1212 rt2500usb_register_read(rt2x00dev, TXRX_CSR19, &reg);
1213 rt2x00_set_field16(&reg, TXRX_CSR19_TSF_COUNT, 0);
1214 rt2x00_set_field16(&reg, TXRX_CSR19_TBCN, 0);
1215 rt2x00_set_field16(&reg, TXRX_CSR19_BEACON_GEN, 0);
1216 rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
1217 }
1210 1218
1211 rt2x00usb_kill_tx_queue(queue); 1219 rt2x00usb_kill_tx_queue(queue);
1212} 1220}
diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c
index f5abcc6e86b..533a8fc1f7c 100644
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
@@ -588,7 +588,11 @@ static void rt2800pci_kill_tx_queue(struct data_queue *queue)
588 u32 reg; 588 u32 reg;
589 589
590 if (queue->qid == QID_BEACON) { 590 if (queue->qid == QID_BEACON) {
591 rt2800_register_write(rt2x00dev, BCN_TIME_CFG, 0); 591 rt2800_register_read(rt2x00dev, BCN_TIME_CFG, &reg);
592 rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_TICKING, 0);
593 rt2x00_set_field32(&reg, BCN_TIME_CFG_TBTT_ENABLE, 0);
594 rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_GEN, 0);
595 rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg);
592 return; 596 return;
593 } 597 }
594 598
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c
index 042e47d92b6..a150fccffba 100644
--- a/drivers/net/wireless/rt2x00/rt2800usb.c
+++ b/drivers/net/wireless/rt2x00/rt2800usb.c
@@ -391,8 +391,16 @@ static void rt2800usb_work_txdone(struct work_struct *work)
391 391
392static void rt2800usb_kill_tx_queue(struct data_queue *queue) 392static void rt2800usb_kill_tx_queue(struct data_queue *queue)
393{ 393{
394 if (queue->qid == QID_BEACON) 394 struct rt2x00_dev *rt2x00dev = queue->rt2x00dev;
395 rt2x00usb_register_write(queue->rt2x00dev, BCN_TIME_CFG, 0); 395 u32 reg;
396
397 if (queue->qid == QID_BEACON) {
398 rt2800_register_read(rt2x00dev, BCN_TIME_CFG, &reg);
399 rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_TICKING, 0);
400 rt2x00_set_field32(&reg, BCN_TIME_CFG_TBTT_ENABLE, 0);
401 rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_GEN, 0);
402 rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg);
403 }
396 404
397 rt2x00usb_kill_tx_queue(queue); 405 rt2x00usb_kill_tx_queue(queue);
398} 406}
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
index 6b09b01f634..6ad0c1c9ce4 100644
--- a/drivers/net/wireless/rt2x00/rt61pci.c
+++ b/drivers/net/wireless/rt2x00/rt61pci.c
@@ -1944,7 +1944,11 @@ static void rt61pci_kill_tx_queue(struct data_queue *queue)
1944 u32 reg; 1944 u32 reg;
1945 1945
1946 if (queue->qid == QID_BEACON) { 1946 if (queue->qid == QID_BEACON) {
1947 rt2x00pci_register_write(rt2x00dev, TXRX_CSR9, 0); 1947 rt2x00pci_register_read(rt2x00dev, TXRX_CSR9, &reg);
1948 rt2x00_set_field32(&reg, TXRX_CSR9_TSF_TICKING, 0);
1949 rt2x00_set_field32(&reg, TXRX_CSR9_TBTT_ENABLE, 0);
1950 rt2x00_set_field32(&reg, TXRX_CSR9_BEACON_GEN, 0);
1951 rt2x00pci_register_write(rt2x00dev, TXRX_CSR9, reg);
1948 return; 1952 return;
1949 } 1953 }
1950 1954
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
index 6f04552f581..3934dad709c 100644
--- a/drivers/net/wireless/rt2x00/rt73usb.c
+++ b/drivers/net/wireless/rt2x00/rt73usb.c
@@ -1581,8 +1581,16 @@ static int rt73usb_get_tx_data_len(struct queue_entry *entry)
1581 1581
1582static void rt73usb_kill_tx_queue(struct data_queue *queue) 1582static void rt73usb_kill_tx_queue(struct data_queue *queue)
1583{ 1583{
1584 if (queue->qid == QID_BEACON) 1584 struct rt2x00_dev *rt2x00dev = queue->rt2x00dev;
1585 rt2x00usb_register_write(queue->rt2x00dev, TXRX_CSR9, 0); 1585 u32 reg;
1586
1587 if (queue->qid == QID_BEACON) {
1588 rt2x00usb_register_read(rt2x00dev, TXRX_CSR9, &reg);
1589 rt2x00_set_field32(&reg, TXRX_CSR9_TSF_TICKING, 0);
1590 rt2x00_set_field32(&reg, TXRX_CSR9_TBTT_ENABLE, 0);
1591 rt2x00_set_field32(&reg, TXRX_CSR9_BEACON_GEN, 0);
1592 rt2x00usb_register_write(rt2x00dev, TXRX_CSR9, reg);
1593 }
1586 1594
1587 rt2x00usb_kill_tx_queue(queue); 1595 rt2x00usb_kill_tx_queue(queue);
1588} 1596}