diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2x00dev.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00dev.c | 70 |
1 files changed, 31 insertions, 39 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index d019830ca840..fa74acdd271f 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
@@ -66,20 +66,16 @@ int rt2x00lib_enable_radio(struct rt2x00_dev *rt2x00dev) | |||
66 | set_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags); | 66 | set_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags); |
67 | 67 | ||
68 | /* | 68 | /* |
69 | * Enable RX. | 69 | * Enable queues. |
70 | */ | 70 | */ |
71 | rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON); | 71 | rt2x00queue_start_queues(rt2x00dev); |
72 | rt2x00link_start_tuner(rt2x00dev); | ||
72 | 73 | ||
73 | /* | 74 | /* |
74 | * Start watchdog monitoring. | 75 | * Start watchdog monitoring. |
75 | */ | 76 | */ |
76 | rt2x00link_start_watchdog(rt2x00dev); | 77 | rt2x00link_start_watchdog(rt2x00dev); |
77 | 78 | ||
78 | /* | ||
79 | * Start the TX queues. | ||
80 | */ | ||
81 | ieee80211_wake_queues(rt2x00dev->hw); | ||
82 | |||
83 | return 0; | 79 | return 0; |
84 | } | 80 | } |
85 | 81 | ||
@@ -89,20 +85,16 @@ void rt2x00lib_disable_radio(struct rt2x00_dev *rt2x00dev) | |||
89 | return; | 85 | return; |
90 | 86 | ||
91 | /* | 87 | /* |
92 | * Stop the TX queues in mac80211. | ||
93 | */ | ||
94 | ieee80211_stop_queues(rt2x00dev->hw); | ||
95 | rt2x00queue_stop_queues(rt2x00dev); | ||
96 | |||
97 | /* | ||
98 | * Stop watchdog monitoring. | 88 | * Stop watchdog monitoring. |
99 | */ | 89 | */ |
100 | rt2x00link_stop_watchdog(rt2x00dev); | 90 | rt2x00link_stop_watchdog(rt2x00dev); |
101 | 91 | ||
102 | /* | 92 | /* |
103 | * Disable RX. | 93 | * Stop all queues |
104 | */ | 94 | */ |
105 | rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF); | 95 | rt2x00link_stop_tuner(rt2x00dev); |
96 | rt2x00queue_stop_queues(rt2x00dev); | ||
97 | rt2x00queue_flush_queues(rt2x00dev, true); | ||
106 | 98 | ||
107 | /* | 99 | /* |
108 | * Disable radio. | 100 | * Disable radio. |
@@ -113,23 +105,6 @@ void rt2x00lib_disable_radio(struct rt2x00_dev *rt2x00dev) | |||
113 | rt2x00leds_led_radio(rt2x00dev, false); | 105 | rt2x00leds_led_radio(rt2x00dev, false); |
114 | } | 106 | } |
115 | 107 | ||
116 | void rt2x00lib_toggle_rx(struct rt2x00_dev *rt2x00dev, enum dev_state state) | ||
117 | { | ||
118 | /* | ||
119 | * When we are disabling the RX, we should also stop the link tuner. | ||
120 | */ | ||
121 | if (state == STATE_RADIO_RX_OFF) | ||
122 | rt2x00link_stop_tuner(rt2x00dev); | ||
123 | |||
124 | rt2x00dev->ops->lib->set_device_state(rt2x00dev, state); | ||
125 | |||
126 | /* | ||
127 | * When we are enabling the RX, we should also start the link tuner. | ||
128 | */ | ||
129 | if (state == STATE_RADIO_RX_ON) | ||
130 | rt2x00link_start_tuner(rt2x00dev); | ||
131 | } | ||
132 | |||
133 | static void rt2x00lib_intf_scheduled_iter(void *data, u8 *mac, | 108 | static void rt2x00lib_intf_scheduled_iter(void *data, u8 *mac, |
134 | struct ieee80211_vif *vif) | 109 | struct ieee80211_vif *vif) |
135 | { | 110 | { |
@@ -251,8 +226,16 @@ void rt2x00lib_pretbtt(struct rt2x00_dev *rt2x00dev) | |||
251 | } | 226 | } |
252 | EXPORT_SYMBOL_GPL(rt2x00lib_pretbtt); | 227 | EXPORT_SYMBOL_GPL(rt2x00lib_pretbtt); |
253 | 228 | ||
229 | void rt2x00lib_dmastart(struct queue_entry *entry) | ||
230 | { | ||
231 | set_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags); | ||
232 | rt2x00queue_index_inc(entry->queue, Q_INDEX); | ||
233 | } | ||
234 | EXPORT_SYMBOL_GPL(rt2x00lib_dmastart); | ||
235 | |||
254 | void rt2x00lib_dmadone(struct queue_entry *entry) | 236 | void rt2x00lib_dmadone(struct queue_entry *entry) |
255 | { | 237 | { |
238 | set_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags); | ||
256 | clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags); | 239 | clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags); |
257 | rt2x00queue_index_inc(entry->queue, Q_INDEX_DMA_DONE); | 240 | rt2x00queue_index_inc(entry->queue, Q_INDEX_DMA_DONE); |
258 | } | 241 | } |
@@ -264,11 +247,9 @@ void rt2x00lib_txdone(struct queue_entry *entry, | |||
264 | struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; | 247 | struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; |
265 | struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(entry->skb); | 248 | struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(entry->skb); |
266 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); | 249 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); |
267 | enum data_queue_qid qid = skb_get_queue_mapping(entry->skb); | 250 | unsigned int header_length, i; |
268 | unsigned int header_length = ieee80211_get_hdrlen_from_skb(entry->skb); | ||
269 | u8 rate_idx, rate_flags, retry_rates; | 251 | u8 rate_idx, rate_flags, retry_rates; |
270 | u8 skbdesc_flags = skbdesc->flags; | 252 | u8 skbdesc_flags = skbdesc->flags; |
271 | unsigned int i; | ||
272 | bool success; | 253 | bool success; |
273 | 254 | ||
274 | /* | 255 | /* |
@@ -287,6 +268,11 @@ void rt2x00lib_txdone(struct queue_entry *entry, | |||
287 | skbdesc->flags &= ~SKBDESC_DESC_IN_SKB; | 268 | skbdesc->flags &= ~SKBDESC_DESC_IN_SKB; |
288 | 269 | ||
289 | /* | 270 | /* |
271 | * Determine the length of 802.11 header. | ||
272 | */ | ||
273 | header_length = ieee80211_get_hdrlen_from_skb(entry->skb); | ||
274 | |||
275 | /* | ||
290 | * Remove L2 padding which was added during | 276 | * Remove L2 padding which was added during |
291 | */ | 277 | */ |
292 | if (test_bit(DRIVER_REQUIRE_L2PAD, &rt2x00dev->flags)) | 278 | if (test_bit(DRIVER_REQUIRE_L2PAD, &rt2x00dev->flags)) |
@@ -414,7 +400,7 @@ void rt2x00lib_txdone(struct queue_entry *entry, | |||
414 | * is reenabled when the txdone handler has finished. | 400 | * is reenabled when the txdone handler has finished. |
415 | */ | 401 | */ |
416 | if (!rt2x00queue_threshold(entry->queue)) | 402 | if (!rt2x00queue_threshold(entry->queue)) |
417 | ieee80211_wake_queue(rt2x00dev->hw, qid); | 403 | rt2x00queue_unpause_queue(entry->queue); |
418 | } | 404 | } |
419 | EXPORT_SYMBOL_GPL(rt2x00lib_txdone); | 405 | EXPORT_SYMBOL_GPL(rt2x00lib_txdone); |
420 | 406 | ||
@@ -486,6 +472,10 @@ void rt2x00lib_rxdone(struct queue_entry *entry) | |||
486 | unsigned int header_length; | 472 | unsigned int header_length; |
487 | int rate_idx; | 473 | int rate_idx; |
488 | 474 | ||
475 | if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags) || | ||
476 | !test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) | ||
477 | goto submit_entry; | ||
478 | |||
489 | if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags)) | 479 | if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags)) |
490 | goto submit_entry; | 480 | goto submit_entry; |
491 | 481 | ||
@@ -570,9 +560,11 @@ void rt2x00lib_rxdone(struct queue_entry *entry) | |||
570 | entry->skb = skb; | 560 | entry->skb = skb; |
571 | 561 | ||
572 | submit_entry: | 562 | submit_entry: |
573 | rt2x00dev->ops->lib->clear_entry(entry); | 563 | entry->flags = 0; |
574 | rt2x00queue_index_inc(entry->queue, Q_INDEX); | ||
575 | rt2x00queue_index_inc(entry->queue, Q_INDEX_DONE); | 564 | rt2x00queue_index_inc(entry->queue, Q_INDEX_DONE); |
565 | if (test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags) && | ||
566 | test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) | ||
567 | rt2x00dev->ops->lib->clear_entry(entry); | ||
576 | } | 568 | } |
577 | EXPORT_SYMBOL_GPL(rt2x00lib_rxdone); | 569 | EXPORT_SYMBOL_GPL(rt2x00lib_rxdone); |
578 | 570 | ||
@@ -681,7 +673,7 @@ static void rt2x00lib_rate(struct ieee80211_rate *entry, | |||
681 | { | 673 | { |
682 | entry->flags = 0; | 674 | entry->flags = 0; |
683 | entry->bitrate = rate->bitrate; | 675 | entry->bitrate = rate->bitrate; |
684 | entry->hw_value =index; | 676 | entry->hw_value = index; |
685 | entry->hw_value_short = index; | 677 | entry->hw_value_short = index; |
686 | 678 | ||
687 | if (rate->flags & DEV_RATE_SHORT_PREAMBLE) | 679 | if (rate->flags & DEV_RATE_SHORT_PREAMBLE) |