diff options
Diffstat (limited to 'net/mac80211/work.c')
-rw-r--r-- | net/mac80211/work.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/net/mac80211/work.c b/net/mac80211/work.c index ae344d1ba056..2b5c3f267198 100644 --- a/net/mac80211/work.c +++ b/net/mac80211/work.c | |||
@@ -561,6 +561,25 @@ ieee80211_remain_on_channel_timeout(struct ieee80211_work *wk) | |||
561 | } | 561 | } |
562 | 562 | ||
563 | static enum work_action __must_check | 563 | static enum work_action __must_check |
564 | ieee80211_offchannel_tx(struct ieee80211_work *wk) | ||
565 | { | ||
566 | if (!wk->started) { | ||
567 | wk->timeout = jiffies + msecs_to_jiffies(wk->offchan_tx.wait); | ||
568 | |||
569 | /* | ||
570 | * After this, offchan_tx.frame remains but now is no | ||
571 | * longer a valid pointer -- we still need it as the | ||
572 | * cookie for canceling this work. | ||
573 | */ | ||
574 | ieee80211_tx_skb(wk->sdata, wk->offchan_tx.frame); | ||
575 | |||
576 | return WORK_ACT_NONE; | ||
577 | } | ||
578 | |||
579 | return WORK_ACT_TIMEOUT; | ||
580 | } | ||
581 | |||
582 | static enum work_action __must_check | ||
564 | ieee80211_assoc_beacon_wait(struct ieee80211_work *wk) | 583 | ieee80211_assoc_beacon_wait(struct ieee80211_work *wk) |
565 | { | 584 | { |
566 | if (wk->started) | 585 | if (wk->started) |
@@ -955,6 +974,9 @@ static void ieee80211_work_work(struct work_struct *work) | |||
955 | case IEEE80211_WORK_REMAIN_ON_CHANNEL: | 974 | case IEEE80211_WORK_REMAIN_ON_CHANNEL: |
956 | rma = ieee80211_remain_on_channel_timeout(wk); | 975 | rma = ieee80211_remain_on_channel_timeout(wk); |
957 | break; | 976 | break; |
977 | case IEEE80211_WORK_OFFCHANNEL_TX: | ||
978 | rma = ieee80211_offchannel_tx(wk); | ||
979 | break; | ||
958 | case IEEE80211_WORK_ASSOC_BEACON_WAIT: | 980 | case IEEE80211_WORK_ASSOC_BEACON_WAIT: |
959 | rma = ieee80211_assoc_beacon_wait(wk); | 981 | rma = ieee80211_assoc_beacon_wait(wk); |
960 | break; | 982 | break; |