diff options
| author | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2010-02-24 14:31:04 -0500 |
|---|---|---|
| committer | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2010-02-24 14:33:45 -0500 |
| commit | 109d28152b6e9d5de64cd23e3bc08885ccb3d1ef (patch) | |
| tree | b7b8863faa05254781acfb85cc41da3eef467c6b /net/mac80211/util.c | |
| parent | 168cf9af699e87d5a6f44b684583714ecabb8e71 (diff) | |
| parent | 60b341b778cc2929df16c0a504c91621b3c6a4ad (diff) | |
Merge tag 'v2.6.33' for its firewire changes since last branch point
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'net/mac80211/util.c')
| -rw-r--r-- | net/mac80211/util.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index 78a6e924c7e1..3848140313f5 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
| @@ -269,6 +269,7 @@ static void __ieee80211_wake_queue(struct ieee80211_hw *hw, int queue, | |||
| 269 | enum queue_stop_reason reason) | 269 | enum queue_stop_reason reason) |
| 270 | { | 270 | { |
| 271 | struct ieee80211_local *local = hw_to_local(hw); | 271 | struct ieee80211_local *local = hw_to_local(hw); |
| 272 | struct ieee80211_sub_if_data *sdata; | ||
| 272 | 273 | ||
| 273 | if (WARN_ON(queue >= hw->queues)) | 274 | if (WARN_ON(queue >= hw->queues)) |
| 274 | return; | 275 | return; |
| @@ -281,6 +282,11 @@ static void __ieee80211_wake_queue(struct ieee80211_hw *hw, int queue, | |||
| 281 | 282 | ||
| 282 | if (!skb_queue_empty(&local->pending[queue])) | 283 | if (!skb_queue_empty(&local->pending[queue])) |
| 283 | tasklet_schedule(&local->tx_pending_tasklet); | 284 | tasklet_schedule(&local->tx_pending_tasklet); |
| 285 | |||
| 286 | rcu_read_lock(); | ||
| 287 | list_for_each_entry_rcu(sdata, &local->interfaces, list) | ||
| 288 | netif_tx_wake_queue(netdev_get_tx_queue(sdata->dev, queue)); | ||
| 289 | rcu_read_unlock(); | ||
| 284 | } | 290 | } |
| 285 | 291 | ||
| 286 | void ieee80211_wake_queue_by_reason(struct ieee80211_hw *hw, int queue, | 292 | void ieee80211_wake_queue_by_reason(struct ieee80211_hw *hw, int queue, |
| @@ -305,11 +311,17 @@ static void __ieee80211_stop_queue(struct ieee80211_hw *hw, int queue, | |||
| 305 | enum queue_stop_reason reason) | 311 | enum queue_stop_reason reason) |
| 306 | { | 312 | { |
| 307 | struct ieee80211_local *local = hw_to_local(hw); | 313 | struct ieee80211_local *local = hw_to_local(hw); |
| 314 | struct ieee80211_sub_if_data *sdata; | ||
| 308 | 315 | ||
| 309 | if (WARN_ON(queue >= hw->queues)) | 316 | if (WARN_ON(queue >= hw->queues)) |
| 310 | return; | 317 | return; |
| 311 | 318 | ||
| 312 | __set_bit(reason, &local->queue_stop_reasons[queue]); | 319 | __set_bit(reason, &local->queue_stop_reasons[queue]); |
| 320 | |||
| 321 | rcu_read_lock(); | ||
| 322 | list_for_each_entry_rcu(sdata, &local->interfaces, list) | ||
| 323 | netif_tx_stop_queue(netdev_get_tx_queue(sdata->dev, queue)); | ||
| 324 | rcu_read_unlock(); | ||
| 313 | } | 325 | } |
| 314 | 326 | ||
| 315 | void ieee80211_stop_queue_by_reason(struct ieee80211_hw *hw, int queue, | 327 | void ieee80211_stop_queue_by_reason(struct ieee80211_hw *hw, int queue, |
| @@ -1039,7 +1051,19 @@ int ieee80211_reconfig(struct ieee80211_local *local) | |||
| 1039 | 1051 | ||
| 1040 | /* restart hardware */ | 1052 | /* restart hardware */ |
| 1041 | if (local->open_count) { | 1053 | if (local->open_count) { |
| 1054 | /* | ||
| 1055 | * Upon resume hardware can sometimes be goofy due to | ||
| 1056 | * various platform / driver / bus issues, so restarting | ||
| 1057 | * the device may at times not work immediately. Propagate | ||
| 1058 | * the error. | ||
| 1059 | */ | ||
| 1042 | res = drv_start(local); | 1060 | res = drv_start(local); |
| 1061 | if (res) { | ||
| 1062 | WARN(local->suspended, "Harware became unavailable " | ||
| 1063 | "upon resume. This is could be a software issue" | ||
| 1064 | "prior to suspend or a harware issue\n"); | ||
| 1065 | return res; | ||
| 1066 | } | ||
| 1043 | 1067 | ||
| 1044 | ieee80211_led_radio(local, true); | 1068 | ieee80211_led_radio(local, true); |
| 1045 | } | 1069 | } |
