7f93626ddc617751e39b89a4d57e8905e20ba3e9
[firefly-linux-kernel-4.4.55.git] / net / mac80211 / offchannel.c
1 /*
2  * Off-channel operation helpers
3  *
4  * Copyright 2003, Jouni Malinen <jkmaline@cc.hut.fi>
5  * Copyright 2004, Instant802 Networks, Inc.
6  * Copyright 2005, Devicescape Software, Inc.
7  * Copyright 2006-2007  Jiri Benc <jbenc@suse.cz>
8  * Copyright 2007, Michael Wu <flamingice@sourmilk.net>
9  * Copyright 2009       Johannes Berg <johannes@sipsolutions.net>
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License version 2 as
13  * published by the Free Software Foundation.
14  */
15 #include <linux/export.h>
16 #include <net/mac80211.h>
17 #include "ieee80211_i.h"
18 #include "driver-trace.h"
19 #include "driver-ops.h"
20
21 /*
22  * Tell our hardware to disable PS.
23  * Optionally inform AP that we will go to sleep so that it will buffer
24  * the frames while we are doing off-channel work.  This is optional
25  * because we *may* be doing work on-operating channel, and want our
26  * hardware unconditionally awake, but still let the AP send us normal frames.
27  */
28 static void ieee80211_offchannel_ps_enable(struct ieee80211_sub_if_data *sdata)
29 {
30         struct ieee80211_local *local = sdata->local;
31         struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
32
33         local->offchannel_ps_enabled = false;
34
35         /* FIXME: what to do when local->pspolling is true? */
36
37         del_timer_sync(&local->dynamic_ps_timer);
38         del_timer_sync(&ifmgd->bcn_mon_timer);
39         del_timer_sync(&ifmgd->conn_mon_timer);
40
41         cancel_work_sync(&local->dynamic_ps_enable_work);
42
43         if (local->hw.conf.flags & IEEE80211_CONF_PS) {
44                 local->offchannel_ps_enabled = true;
45                 local->hw.conf.flags &= ~IEEE80211_CONF_PS;
46                 ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
47         }
48
49         if (!local->offchannel_ps_enabled ||
50             !(local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK))
51                 /*
52                  * If power save was enabled, no need to send a nullfunc
53                  * frame because AP knows that we are sleeping. But if the
54                  * hardware is creating the nullfunc frame for power save
55                  * status (ie. IEEE80211_HW_PS_NULLFUNC_STACK is not
56                  * enabled) and power save was enabled, the firmware just
57                  * sent a null frame with power save disabled. So we need
58                  * to send a new nullfunc frame to inform the AP that we
59                  * are again sleeping.
60                  */
61                 ieee80211_send_nullfunc(local, sdata, 1);
62 }
63
64 /* inform AP that we are awake again, unless power save is enabled */
65 static void ieee80211_offchannel_ps_disable(struct ieee80211_sub_if_data *sdata)
66 {
67         struct ieee80211_local *local = sdata->local;
68
69         if (!local->ps_sdata)
70                 ieee80211_send_nullfunc(local, sdata, 0);
71         else if (local->offchannel_ps_enabled) {
72                 /*
73                  * In !IEEE80211_HW_PS_NULLFUNC_STACK case the hardware
74                  * will send a nullfunc frame with the powersave bit set
75                  * even though the AP already knows that we are sleeping.
76                  * This could be avoided by sending a null frame with power
77                  * save bit disabled before enabling the power save, but
78                  * this doesn't gain anything.
79                  *
80                  * When IEEE80211_HW_PS_NULLFUNC_STACK is enabled, no need
81                  * to send a nullfunc frame because AP already knows that
82                  * we are sleeping, let's just enable power save mode in
83                  * hardware.
84                  */
85                 /* TODO:  Only set hardware if CONF_PS changed?
86                  * TODO:  Should we set offchannel_ps_enabled to false?
87                  */
88                 local->hw.conf.flags |= IEEE80211_CONF_PS;
89                 ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
90         } else if (local->hw.conf.dynamic_ps_timeout > 0) {
91                 /*
92                  * If IEEE80211_CONF_PS was not set and the dynamic_ps_timer
93                  * had been running before leaving the operating channel,
94                  * restart the timer now and send a nullfunc frame to inform
95                  * the AP that we are awake.
96                  */
97                 ieee80211_send_nullfunc(local, sdata, 0);
98                 mod_timer(&local->dynamic_ps_timer, jiffies +
99                           msecs_to_jiffies(local->hw.conf.dynamic_ps_timeout));
100         }
101
102         ieee80211_sta_reset_beacon_monitor(sdata);
103         ieee80211_sta_reset_conn_monitor(sdata);
104 }
105
106 void ieee80211_offchannel_stop_vifs(struct ieee80211_local *local,
107                                     bool offchannel_ps_enable)
108 {
109         struct ieee80211_sub_if_data *sdata;
110
111         /*
112          * notify the AP about us leaving the channel and stop all
113          * STA interfaces.
114          */
115         mutex_lock(&local->iflist_mtx);
116         list_for_each_entry(sdata, &local->interfaces, list) {
117                 if (!ieee80211_sdata_running(sdata))
118                         continue;
119
120                 if (sdata->vif.type != NL80211_IFTYPE_MONITOR)
121                         set_bit(SDATA_STATE_OFFCHANNEL, &sdata->state);
122
123                 /* Check to see if we should disable beaconing. */
124                 if (sdata->vif.type == NL80211_IFTYPE_AP ||
125                     sdata->vif.type == NL80211_IFTYPE_ADHOC ||
126                     sdata->vif.type == NL80211_IFTYPE_MESH_POINT)
127                         ieee80211_bss_info_change_notify(
128                                 sdata, BSS_CHANGED_BEACON_ENABLED);
129
130                 if (sdata->vif.type != NL80211_IFTYPE_MONITOR) {
131                         netif_tx_stop_all_queues(sdata->dev);
132                         if (offchannel_ps_enable &&
133                             (sdata->vif.type == NL80211_IFTYPE_STATION) &&
134                             sdata->u.mgd.associated)
135                                 ieee80211_offchannel_ps_enable(sdata);
136                 }
137         }
138         mutex_unlock(&local->iflist_mtx);
139 }
140
141 void ieee80211_offchannel_return(struct ieee80211_local *local,
142                                  bool offchannel_ps_disable)
143 {
144         struct ieee80211_sub_if_data *sdata;
145
146         mutex_lock(&local->iflist_mtx);
147         list_for_each_entry(sdata, &local->interfaces, list) {
148                 if (sdata->vif.type != NL80211_IFTYPE_MONITOR)
149                         clear_bit(SDATA_STATE_OFFCHANNEL, &sdata->state);
150
151                 if (!ieee80211_sdata_running(sdata))
152                         continue;
153
154                 /* Tell AP we're back */
155                 if (offchannel_ps_disable &&
156                     sdata->vif.type == NL80211_IFTYPE_STATION) {
157                         if (sdata->u.mgd.associated)
158                                 ieee80211_offchannel_ps_disable(sdata);
159                 }
160
161                 if (sdata->vif.type != NL80211_IFTYPE_MONITOR) {
162                         /*
163                          * This may wake up queues even though the driver
164                          * currently has them stopped. This is not very
165                          * likely, since the driver won't have gotten any
166                          * (or hardly any) new packets while we weren't
167                          * on the right channel, and even if it happens
168                          * it will at most lead to queueing up one more
169                          * packet per queue in mac80211 rather than on
170                          * the interface qdisc.
171                          */
172                         netif_tx_wake_all_queues(sdata->dev);
173                 }
174
175                 if (sdata->vif.type == NL80211_IFTYPE_AP ||
176                     sdata->vif.type == NL80211_IFTYPE_ADHOC ||
177                     sdata->vif.type == NL80211_IFTYPE_MESH_POINT)
178                         ieee80211_bss_info_change_notify(
179                                 sdata, BSS_CHANGED_BEACON_ENABLED);
180         }
181         mutex_unlock(&local->iflist_mtx);
182 }
183
184 void ieee80211_handle_roc_started(struct ieee80211_roc_work *roc)
185 {
186         if (roc->notified)
187                 return;
188
189         if (roc->mgmt_tx_cookie) {
190                 if (!WARN_ON(!roc->frame)) {
191                         ieee80211_tx_skb(roc->sdata, roc->frame);
192                         roc->frame = NULL;
193                 }
194         } else {
195                 cfg80211_ready_on_channel(roc->sdata->dev, (unsigned long)roc,
196                                           roc->chan, roc->chan_type,
197                                           roc->req_duration, GFP_KERNEL);
198         }
199
200         roc->notified = true;
201 }
202
203 static void ieee80211_hw_roc_start(struct work_struct *work)
204 {
205         struct ieee80211_local *local =
206                 container_of(work, struct ieee80211_local, hw_roc_start);
207         struct ieee80211_roc_work *roc, *dep, *tmp;
208
209         mutex_lock(&local->mtx);
210
211         if (list_empty(&local->roc_list))
212                 goto out_unlock;
213
214         roc = list_first_entry(&local->roc_list, struct ieee80211_roc_work,
215                                list);
216
217         if (!roc->started)
218                 goto out_unlock;
219
220         roc->hw_begun = true;
221         roc->hw_start_time = local->hw_roc_start_time;
222
223         ieee80211_handle_roc_started(roc);
224         list_for_each_entry_safe(dep, tmp, &roc->dependents, list) {
225                 ieee80211_handle_roc_started(dep);
226
227                 if (dep->duration > roc->duration) {
228                         u32 dur = dep->duration;
229                         dep->duration = dur - roc->duration;
230                         roc->duration = dur;
231                         list_del(&dep->list);
232                         list_add(&dep->list, &roc->list);
233                 }
234         }
235  out_unlock:
236         mutex_unlock(&local->mtx);
237 }
238
239 void ieee80211_ready_on_channel(struct ieee80211_hw *hw)
240 {
241         struct ieee80211_local *local = hw_to_local(hw);
242
243         local->hw_roc_start_time = jiffies;
244
245         trace_api_ready_on_channel(local);
246
247         ieee80211_queue_work(hw, &local->hw_roc_start);
248 }
249 EXPORT_SYMBOL_GPL(ieee80211_ready_on_channel);
250
251 void ieee80211_start_next_roc(struct ieee80211_local *local)
252 {
253         struct ieee80211_roc_work *roc;
254
255         lockdep_assert_held(&local->mtx);
256
257         if (list_empty(&local->roc_list)) {
258                 ieee80211_run_deferred_scan(local);
259                 return;
260         }
261
262         roc = list_first_entry(&local->roc_list, struct ieee80211_roc_work,
263                                list);
264
265         if (WARN_ON_ONCE(roc->started))
266                 return;
267
268         if (local->ops->remain_on_channel) {
269                 int ret, duration = roc->duration;
270
271                 /* XXX: duplicated, see ieee80211_start_roc_work() */
272                 if (!duration)
273                         duration = 10;
274
275                 ret = drv_remain_on_channel(local, roc->chan,
276                                             roc->chan_type,
277                                             duration);
278
279                 roc->started = true;
280
281                 if (ret) {
282                         wiphy_warn(local->hw.wiphy,
283                                    "failed to start next HW ROC (%d)\n", ret);
284                         /*
285                          * queue the work struct again to avoid recursion
286                          * when multiple failures occur
287                          */
288                         ieee80211_remain_on_channel_expired(&local->hw);
289                 }
290         } else {
291                 /* delay it a bit */
292                 ieee80211_queue_delayed_work(&local->hw, &roc->work,
293                                              round_jiffies_relative(HZ/2));
294         }
295 }
296
297 void ieee80211_roc_notify_destroy(struct ieee80211_roc_work *roc)
298 {
299         struct ieee80211_roc_work *dep, *tmp;
300
301         /* was never transmitted */
302         if (roc->frame) {
303                 cfg80211_mgmt_tx_status(roc->sdata->dev,
304                                         (unsigned long)roc->frame,
305                                         roc->frame->data, roc->frame->len,
306                                         false, GFP_KERNEL);
307                 kfree_skb(roc->frame);
308         }
309
310         if (!roc->mgmt_tx_cookie)
311                 cfg80211_remain_on_channel_expired(roc->sdata->dev,
312                                                    (unsigned long)roc,
313                                                    roc->chan, roc->chan_type,
314                                                    GFP_KERNEL);
315
316         list_for_each_entry_safe(dep, tmp, &roc->dependents, list)
317                 ieee80211_roc_notify_destroy(dep);
318
319         kfree(roc);
320 }
321
322 void ieee80211_sw_roc_work(struct work_struct *work)
323 {
324         struct ieee80211_roc_work *roc =
325                 container_of(work, struct ieee80211_roc_work, work.work);
326         struct ieee80211_sub_if_data *sdata = roc->sdata;
327         struct ieee80211_local *local = sdata->local;
328
329         mutex_lock(&local->mtx);
330
331         if (roc->abort)
332                 goto finish;
333
334         if (WARN_ON(list_empty(&local->roc_list)))
335                 goto out_unlock;
336
337         if (WARN_ON(roc != list_first_entry(&local->roc_list,
338                                             struct ieee80211_roc_work,
339                                             list)))
340                 goto out_unlock;
341
342         if (!roc->started) {
343                 struct ieee80211_roc_work *dep;
344
345                 /* start this ROC */
346
347                 /* switch channel etc */
348                 ieee80211_recalc_idle(local);
349
350                 local->tmp_channel = roc->chan;
351                 local->tmp_channel_type = roc->chan_type;
352                 ieee80211_hw_config(local, 0);
353
354                 /* tell userspace or send frame */
355                 ieee80211_handle_roc_started(roc);
356                 list_for_each_entry(dep, &roc->dependents, list)
357                         ieee80211_handle_roc_started(dep);
358
359                 /* if it was pure TX, just finish right away */
360                 if (!roc->duration)
361                         goto finish;
362
363                 roc->started = true;
364                 ieee80211_queue_delayed_work(&local->hw, &roc->work,
365                                              msecs_to_jiffies(roc->duration));
366         } else {
367                 /* finish this ROC */
368  finish:
369                 list_del(&roc->list);
370                 ieee80211_roc_notify_destroy(roc);
371
372                 if (roc->started) {
373                         drv_flush(local, false);
374
375                         local->tmp_channel = NULL;
376                         ieee80211_hw_config(local, 0);
377
378                         ieee80211_offchannel_return(local, true);
379                 }
380
381                 ieee80211_recalc_idle(local);
382
383                 if (roc->started)
384                         ieee80211_start_next_roc(local);
385         }
386
387  out_unlock:
388         mutex_unlock(&local->mtx);
389 }
390
391 static void ieee80211_hw_roc_done(struct work_struct *work)
392 {
393         struct ieee80211_local *local =
394                 container_of(work, struct ieee80211_local, hw_roc_done);
395         struct ieee80211_roc_work *roc;
396
397         mutex_lock(&local->mtx);
398
399         if (list_empty(&local->roc_list))
400                 goto out_unlock;
401
402         roc = list_first_entry(&local->roc_list, struct ieee80211_roc_work,
403                                list);
404
405         if (!roc->started)
406                 goto out_unlock;
407
408         list_del(&roc->list);
409
410         ieee80211_roc_notify_destroy(roc);
411
412         /* if there's another roc, start it now */
413         ieee80211_start_next_roc(local);
414
415  out_unlock:
416         mutex_unlock(&local->mtx);
417 }
418
419 void ieee80211_remain_on_channel_expired(struct ieee80211_hw *hw)
420 {
421         struct ieee80211_local *local = hw_to_local(hw);
422
423         trace_api_remain_on_channel_expired(local);
424
425         ieee80211_queue_work(hw, &local->hw_roc_done);
426 }
427 EXPORT_SYMBOL_GPL(ieee80211_remain_on_channel_expired);
428
429 void ieee80211_roc_setup(struct ieee80211_local *local)
430 {
431         INIT_WORK(&local->hw_roc_start, ieee80211_hw_roc_start);
432         INIT_WORK(&local->hw_roc_done, ieee80211_hw_roc_done);
433         INIT_LIST_HEAD(&local->roc_list);
434 }
435
436 void ieee80211_roc_purge(struct ieee80211_sub_if_data *sdata)
437 {
438         struct ieee80211_local *local = sdata->local;
439         struct ieee80211_roc_work *roc, *tmp;
440         LIST_HEAD(tmp_list);
441
442         mutex_lock(&local->mtx);
443         list_for_each_entry_safe(roc, tmp, &local->roc_list, list) {
444                 if (roc->sdata != sdata)
445                         continue;
446
447                 if (roc->started && local->ops->remain_on_channel) {
448                         /* can race, so ignore return value */
449                         drv_cancel_remain_on_channel(local);
450                 }
451
452                 list_move_tail(&roc->list, &tmp_list);
453                 roc->abort = true;
454         }
455
456         ieee80211_start_next_roc(local);
457         mutex_unlock(&local->mtx);
458
459         list_for_each_entry_safe(roc, tmp, &tmp_list, list) {
460                 if (local->ops->remain_on_channel) {
461                         list_del(&roc->list);
462                         ieee80211_roc_notify_destroy(roc);
463                 } else {
464                         ieee80211_queue_delayed_work(&local->hw, &roc->work, 0);
465
466                         /* work will clean up etc */
467                         flush_delayed_work(&roc->work);
468                 }
469         }
470
471         WARN_ON_ONCE(!list_empty(&tmp_list));
472 }