rt2x00: Don't frequently reset beacon interval in AdHoc mode
authorHelmut Schaa <helmut.schaa@googlemail.com>
Mon, 13 Dec 2010 11:33:36 +0000 (12:33 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 13 Dec 2010 20:23:34 +0000 (15:23 -0500)
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>
drivers/net/wireless/rt2x00/rt2400pci.c
drivers/net/wireless/rt2x00/rt2500pci.c
drivers/net/wireless/rt2x00/rt2500usb.c
drivers/net/wireless/rt2x00/rt2800pci.c
drivers/net/wireless/rt2x00/rt2800usb.c
drivers/net/wireless/rt2x00/rt61pci.c
drivers/net/wireless/rt2x00/rt73usb.c

index 9ec6691adf0d5782ea04182100a9025cb91646fb..62786608951e2b95bc7c740aff8a974008423f39 100644 (file)
@@ -1140,7 +1140,11 @@ static void rt2400pci_kill_tx_queue(struct data_queue *queue)
        u32 reg;
 
        if (queue->qid == QID_BEACON) {
-               rt2x00pci_register_write(rt2x00dev, CSR14, 0);
+               rt2x00pci_register_read(rt2x00dev, CSR14, &reg);
+               rt2x00_set_field32(&reg, CSR14_TSF_COUNT, 0);
+               rt2x00_set_field32(&reg, CSR14_TBCN, 0);
+               rt2x00_set_field32(&reg, CSR14_BEACON_GEN, 0);
+               rt2x00pci_register_write(rt2x00dev, CSR14, reg);
        } else {
                rt2x00pci_register_read(rt2x00dev, TXCSR0, &reg);
                rt2x00_set_field32(&reg, TXCSR0_ABORT, 1);
index 3e7f20346243d2b8a9dec103953aec6a70560696..ce9212f2820704656df985cf661a0a74cbb5ec57 100644 (file)
@@ -1294,7 +1294,11 @@ static void rt2500pci_kill_tx_queue(struct data_queue *queue)
        u32 reg;
 
        if (queue->qid == QID_BEACON) {
-               rt2x00pci_register_write(rt2x00dev, CSR14, 0);
+               rt2x00pci_register_read(rt2x00dev, CSR14, &reg);
+               rt2x00_set_field32(&reg, CSR14_TSF_COUNT, 0);
+               rt2x00_set_field32(&reg, CSR14_TBCN, 0);
+               rt2x00_set_field32(&reg, CSR14_BEACON_GEN, 0);
+               rt2x00pci_register_write(rt2x00dev, CSR14, reg);
        } else {
                rt2x00pci_register_read(rt2x00dev, TXCSR0, &reg);
                rt2x00_set_field32(&reg, TXCSR0_ABORT, 1);
index 8152fec317537937e773593c039475df1f67c716..bbfa671f115203b6e42e0f2ad9797a69d2b26f06 100644 (file)
@@ -1205,8 +1205,16 @@ static int rt2500usb_get_tx_data_len(struct queue_entry *entry)
 
 static void rt2500usb_kill_tx_queue(struct data_queue *queue)
 {
-       if (queue->qid == QID_BEACON)
-               rt2500usb_register_write(queue->rt2x00dev, TXRX_CSR19, 0);
+       struct rt2x00_dev *rt2x00dev = queue->rt2x00dev;
+       u16 reg;
+
+       if (queue->qid == QID_BEACON) {
+               rt2500usb_register_read(rt2x00dev, TXRX_CSR19, &reg);
+               rt2x00_set_field16(&reg, TXRX_CSR19_TSF_COUNT, 0);
+               rt2x00_set_field16(&reg, TXRX_CSR19_TBCN, 0);
+               rt2x00_set_field16(&reg, TXRX_CSR19_BEACON_GEN, 0);
+               rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg);
+       }
 
        rt2x00usb_kill_tx_queue(queue);
 }
index f5abcc6e86b756233528c1b45a9e80038d42c93e..533a8fc1f7c1231cc6fb371c664dd0fed977f280 100644 (file)
@@ -588,7 +588,11 @@ static void rt2800pci_kill_tx_queue(struct data_queue *queue)
        u32 reg;
 
        if (queue->qid == QID_BEACON) {
-               rt2800_register_write(rt2x00dev, BCN_TIME_CFG, 0);
+               rt2800_register_read(rt2x00dev, BCN_TIME_CFG, &reg);
+               rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_TICKING, 0);
+               rt2x00_set_field32(&reg, BCN_TIME_CFG_TBTT_ENABLE, 0);
+               rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_GEN, 0);
+               rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg);
                return;
        }
 
index 042e47d92b6e6d433a93fcbc2e718a2a03660403..a150fccffba2f8b42e1046bc483edc180aa340a6 100644 (file)
@@ -391,8 +391,16 @@ static void rt2800usb_work_txdone(struct work_struct *work)
 
 static void rt2800usb_kill_tx_queue(struct data_queue *queue)
 {
-       if (queue->qid == QID_BEACON)
-               rt2x00usb_register_write(queue->rt2x00dev, BCN_TIME_CFG, 0);
+       struct rt2x00_dev *rt2x00dev = queue->rt2x00dev;
+       u32 reg;
+
+       if (queue->qid == QID_BEACON) {
+               rt2800_register_read(rt2x00dev, BCN_TIME_CFG, &reg);
+               rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_TICKING, 0);
+               rt2x00_set_field32(&reg, BCN_TIME_CFG_TBTT_ENABLE, 0);
+               rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_GEN, 0);
+               rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg);
+       }
 
        rt2x00usb_kill_tx_queue(queue);
 }
index 6b09b01f634f029c7cc4c0eda8951ad2f6e354e1..6ad0c1c9ce4e5b2f203fd986dd1bd02f78cdf135 100644 (file)
@@ -1944,7 +1944,11 @@ static void rt61pci_kill_tx_queue(struct data_queue *queue)
        u32 reg;
 
        if (queue->qid == QID_BEACON) {
-               rt2x00pci_register_write(rt2x00dev, TXRX_CSR9, 0);
+               rt2x00pci_register_read(rt2x00dev, TXRX_CSR9, &reg);
+               rt2x00_set_field32(&reg, TXRX_CSR9_TSF_TICKING, 0);
+               rt2x00_set_field32(&reg, TXRX_CSR9_TBTT_ENABLE, 0);
+               rt2x00_set_field32(&reg, TXRX_CSR9_BEACON_GEN, 0);
+               rt2x00pci_register_write(rt2x00dev, TXRX_CSR9, reg);
                return;
        }
 
index 6f04552f581987ff802bc180deef39291425a5fe..3934dad709c6c1d4390addef0a30effa475c3c89 100644 (file)
@@ -1581,8 +1581,16 @@ static int rt73usb_get_tx_data_len(struct queue_entry *entry)
 
 static void rt73usb_kill_tx_queue(struct data_queue *queue)
 {
-       if (queue->qid == QID_BEACON)
-               rt2x00usb_register_write(queue->rt2x00dev, TXRX_CSR9, 0);
+       struct rt2x00_dev *rt2x00dev = queue->rt2x00dev;
+       u32 reg;
+
+       if (queue->qid == QID_BEACON) {
+               rt2x00usb_register_read(rt2x00dev, TXRX_CSR9, &reg);
+               rt2x00_set_field32(&reg, TXRX_CSR9_TSF_TICKING, 0);
+               rt2x00_set_field32(&reg, TXRX_CSR9_TBTT_ENABLE, 0);
+               rt2x00_set_field32(&reg, TXRX_CSR9_BEACON_GEN, 0);
+               rt2x00usb_register_write(rt2x00dev, TXRX_CSR9, reg);
+       }
 
        rt2x00usb_kill_tx_queue(queue);
 }