diff options
author | Ivo van Doorn <ivdoorn@gmail.com> | 2009-01-27 18:32:33 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-02-09 15:03:34 -0500 |
commit | a2c9b652a12a550d3d8509e9bae43bac396c5076 (patch) | |
tree | 8e871e038bc73465c6eca67f8563e9562d079d56 /drivers/net/wireless/rt2x00/rt2500pci.c | |
parent | 382fe0f2da78db7833c6a7278e33e694e6e2a6f3 (diff) |
rt2x00: Add kill_tx_queue callback function
provide rt2x00lib the possibility to kill a particular TX queue.
This can be useful when disabling the radio, but more importantly
will allow beaconing to be disabled when mac80211 requests this
(during scanning for example)
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/rt2500pci.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2500pci.c | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c index b9104e28bc2e..eb82860c54f9 100644 --- a/drivers/net/wireless/rt2x00/rt2500pci.c +++ b/drivers/net/wireless/rt2x00/rt2500pci.c | |||
@@ -1093,21 +1093,10 @@ static int rt2500pci_enable_radio(struct rt2x00_dev *rt2x00dev) | |||
1093 | 1093 | ||
1094 | static void rt2500pci_disable_radio(struct rt2x00_dev *rt2x00dev) | 1094 | static void rt2500pci_disable_radio(struct rt2x00_dev *rt2x00dev) |
1095 | { | 1095 | { |
1096 | u32 reg; | ||
1097 | |||
1098 | rt2x00pci_register_write(rt2x00dev, PWRCSR0, 0); | ||
1099 | |||
1100 | /* | 1096 | /* |
1101 | * Disable synchronisation. | 1097 | * Disable power |
1102 | */ | 1098 | */ |
1103 | rt2x00pci_register_write(rt2x00dev, CSR14, 0); | 1099 | rt2x00pci_register_write(rt2x00dev, PWRCSR0, 0); |
1104 | |||
1105 | /* | ||
1106 | * Cancel RX and TX. | ||
1107 | */ | ||
1108 | rt2x00pci_register_read(rt2x00dev, TXCSR0, ®); | ||
1109 | rt2x00_set_field32(®, TXCSR0_ABORT, 1); | ||
1110 | rt2x00pci_register_write(rt2x00dev, TXCSR0, reg); | ||
1111 | } | 1100 | } |
1112 | 1101 | ||
1113 | static int rt2500pci_set_state(struct rt2x00_dev *rt2x00dev, | 1102 | static int rt2500pci_set_state(struct rt2x00_dev *rt2x00dev, |
@@ -1303,6 +1292,20 @@ static void rt2500pci_kick_tx_queue(struct rt2x00_dev *rt2x00dev, | |||
1303 | rt2x00pci_register_write(rt2x00dev, TXCSR0, reg); | 1292 | rt2x00pci_register_write(rt2x00dev, TXCSR0, reg); |
1304 | } | 1293 | } |
1305 | 1294 | ||
1295 | static void rt2500pci_kill_tx_queue(struct rt2x00_dev *rt2x00dev, | ||
1296 | const enum data_queue_qid qid) | ||
1297 | { | ||
1298 | u32 reg; | ||
1299 | |||
1300 | if (qid == QID_BEACON) { | ||
1301 | rt2x00pci_register_write(rt2x00dev, CSR14, 0); | ||
1302 | } else { | ||
1303 | rt2x00pci_register_read(rt2x00dev, TXCSR0, ®); | ||
1304 | rt2x00_set_field32(®, TXCSR0_ABORT, 1); | ||
1305 | rt2x00pci_register_write(rt2x00dev, TXCSR0, reg); | ||
1306 | } | ||
1307 | } | ||
1308 | |||
1306 | /* | 1309 | /* |
1307 | * RX control handlers | 1310 | * RX control handlers |
1308 | */ | 1311 | */ |
@@ -1905,6 +1908,7 @@ static const struct rt2x00lib_ops rt2500pci_rt2x00_ops = { | |||
1905 | .write_tx_data = rt2x00pci_write_tx_data, | 1908 | .write_tx_data = rt2x00pci_write_tx_data, |
1906 | .write_beacon = rt2500pci_write_beacon, | 1909 | .write_beacon = rt2500pci_write_beacon, |
1907 | .kick_tx_queue = rt2500pci_kick_tx_queue, | 1910 | .kick_tx_queue = rt2500pci_kick_tx_queue, |
1911 | .kill_tx_queue = rt2500pci_kill_tx_queue, | ||
1908 | .fill_rxdone = rt2500pci_fill_rxdone, | 1912 | .fill_rxdone = rt2500pci_fill_rxdone, |
1909 | .config_filter = rt2500pci_config_filter, | 1913 | .config_filter = rt2500pci_config_filter, |
1910 | .config_intf = rt2500pci_config_intf, | 1914 | .config_intf = rt2500pci_config_intf, |