aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00/rt2x00dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2x00dev.c')
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00dev.c70
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
116void 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
133static void rt2x00lib_intf_scheduled_iter(void *data, u8 *mac, 108static 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}
252EXPORT_SYMBOL_GPL(rt2x00lib_pretbtt); 227EXPORT_SYMBOL_GPL(rt2x00lib_pretbtt);
253 228
229void 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}
234EXPORT_SYMBOL_GPL(rt2x00lib_dmastart);
235
254void rt2x00lib_dmadone(struct queue_entry *entry) 236void 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}
419EXPORT_SYMBOL_GPL(rt2x00lib_txdone); 405EXPORT_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
572submit_entry: 562submit_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}
577EXPORT_SYMBOL_GPL(rt2x00lib_rxdone); 569EXPORT_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)