rt2x00: Correctly kill beacon queue
authorIvo van Doorn <ivdoorn@gmail.com>
Mon, 30 Aug 2010 19:14:56 +0000 (21:14 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 31 Aug 2010 18:22:24 +0000 (14:22 -0400)
USB devices upload their beacon and then automatically send
it out every beacon interval. However when killing a TX queue
we only kill the URB and not the actual transmission of the beacon.

This will reset the Beacon register to prevent any beacons from
being transmitted.

Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
Acked-by: Gertjan van Wingerde <gwingerde@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/rt2x00/rt2500usb.c
drivers/net/wireless/rt2x00/rt2800usb.c
drivers/net/wireless/rt2x00/rt73usb.c

index 71d8d82..a161e9e 100644 (file)
@@ -1196,6 +1196,14 @@ static int rt2500usb_get_tx_data_len(struct queue_entry *entry)
        return length;
 }
 
+static void rt2500usb_kill_tx_queue(struct data_queue *queue)
+{
+       if (queue->qid == QID_BEACON)
+               rt2500usb_register_write(queue->rt2x00dev, TXRX_CSR19, 0);
+
+       rt2x00usb_kill_tx_queue(queue);
+}
+
 /*
  * RX control handlers
  */
@@ -1794,7 +1802,7 @@ static const struct rt2x00lib_ops rt2500usb_rt2x00_ops = {
        .write_beacon           = rt2500usb_write_beacon,
        .get_tx_data_len        = rt2500usb_get_tx_data_len,
        .kick_tx_queue          = rt2x00usb_kick_tx_queue,
-       .kill_tx_queue          = rt2x00usb_kill_tx_queue,
+       .kill_tx_queue          = rt2500usb_kill_tx_queue,
        .fill_rxdone            = rt2500usb_fill_rxdone,
        .config_shared_key      = rt2500usb_config_key,
        .config_pairwise_key    = rt2500usb_config_key,
index d275549..3dff56e 100644 (file)
@@ -335,6 +335,14 @@ 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);
+
+       rt2x00usb_kill_tx_queue(queue);
+}
+
 /*
  * RX control handlers
  */
@@ -533,7 +541,7 @@ static const struct rt2x00lib_ops rt2800usb_rt2x00_ops = {
        .write_beacon           = rt2800_write_beacon,
        .get_tx_data_len        = rt2800usb_get_tx_data_len,
        .kick_tx_queue          = rt2x00usb_kick_tx_queue,
-       .kill_tx_queue          = rt2x00usb_kill_tx_queue,
+       .kill_tx_queue          = rt2800usb_kill_tx_queue,
        .fill_rxdone            = rt2800usb_fill_rxdone,
        .config_shared_key      = rt2800_config_shared_key,
        .config_pairwise_key    = rt2800_config_pairwise_key,
index ac8f6d0..df0ef3f 100644 (file)
@@ -1573,6 +1573,14 @@ static int rt73usb_get_tx_data_len(struct queue_entry *entry)
        return length;
 }
 
+static void rt73usb_kill_tx_queue(struct data_queue *queue)
+{
+       if (queue->qid == QID_BEACON)
+               rt2x00usb_register_write(queue->rt2x00dev, TXRX_CSR9, 0);
+
+       rt2x00usb_kill_tx_queue(queue);
+}
+
 /*
  * RX control handlers
  */
@@ -2262,7 +2270,7 @@ static const struct rt2x00lib_ops rt73usb_rt2x00_ops = {
        .write_beacon           = rt73usb_write_beacon,
        .get_tx_data_len        = rt73usb_get_tx_data_len,
        .kick_tx_queue          = rt2x00usb_kick_tx_queue,
-       .kill_tx_queue          = rt2x00usb_kill_tx_queue,
+       .kill_tx_queue          = rt73usb_kill_tx_queue,
        .fill_rxdone            = rt73usb_fill_rxdone,
        .config_shared_key      = rt73usb_config_shared_key,
        .config_pairwise_key    = rt73usb_config_pairwise_key,