Lines Matching refs:roc

190 void ieee80211_handle_roc_started(struct ieee80211_roc_work *roc)  in ieee80211_handle_roc_started()  argument
192 if (roc->notified) in ieee80211_handle_roc_started()
195 if (roc->mgmt_tx_cookie) { in ieee80211_handle_roc_started()
196 if (!WARN_ON(!roc->frame)) { in ieee80211_handle_roc_started()
197 ieee80211_tx_skb_tid_band(roc->sdata, roc->frame, 7, in ieee80211_handle_roc_started()
198 roc->chan->band); in ieee80211_handle_roc_started()
199 roc->frame = NULL; in ieee80211_handle_roc_started()
202 cfg80211_ready_on_channel(&roc->sdata->wdev, roc->cookie, in ieee80211_handle_roc_started()
203 roc->chan, roc->req_duration, in ieee80211_handle_roc_started()
207 roc->notified = true; in ieee80211_handle_roc_started()
214 struct ieee80211_roc_work *roc, *dep, *tmp; in ieee80211_hw_roc_start() local
221 roc = list_first_entry(&local->roc_list, struct ieee80211_roc_work, in ieee80211_hw_roc_start()
224 if (!roc->started) in ieee80211_hw_roc_start()
227 roc->hw_begun = true; in ieee80211_hw_roc_start()
228 roc->hw_start_time = local->hw_roc_start_time; in ieee80211_hw_roc_start()
230 ieee80211_handle_roc_started(roc); in ieee80211_hw_roc_start()
231 list_for_each_entry_safe(dep, tmp, &roc->dependents, list) { in ieee80211_hw_roc_start()
234 if (dep->duration > roc->duration) { in ieee80211_hw_roc_start()
236 dep->duration = dur - roc->duration; in ieee80211_hw_roc_start()
237 roc->duration = dur; in ieee80211_hw_roc_start()
238 list_move(&dep->list, &roc->list); in ieee80211_hw_roc_start()
259 struct ieee80211_roc_work *roc; in ieee80211_start_next_roc() local
268 roc = list_first_entry(&local->roc_list, struct ieee80211_roc_work, in ieee80211_start_next_roc()
271 if (WARN_ON_ONCE(roc->started)) in ieee80211_start_next_roc()
275 int ret, duration = roc->duration; in ieee80211_start_next_roc()
281 ret = drv_remain_on_channel(local, roc->sdata, roc->chan, in ieee80211_start_next_roc()
282 duration, roc->type); in ieee80211_start_next_roc()
284 roc->started = true; in ieee80211_start_next_roc()
297 ieee80211_queue_delayed_work(&local->hw, &roc->work, in ieee80211_start_next_roc()
302 void ieee80211_roc_notify_destroy(struct ieee80211_roc_work *roc, bool free) in ieee80211_roc_notify_destroy() argument
306 if (WARN_ON(roc->to_be_freed)) in ieee80211_roc_notify_destroy()
310 if (roc->frame) { in ieee80211_roc_notify_destroy()
311 cfg80211_mgmt_tx_status(&roc->sdata->wdev, in ieee80211_roc_notify_destroy()
312 (unsigned long)roc->frame, in ieee80211_roc_notify_destroy()
313 roc->frame->data, roc->frame->len, in ieee80211_roc_notify_destroy()
315 kfree_skb(roc->frame); in ieee80211_roc_notify_destroy()
318 if (!roc->mgmt_tx_cookie) in ieee80211_roc_notify_destroy()
319 cfg80211_remain_on_channel_expired(&roc->sdata->wdev, in ieee80211_roc_notify_destroy()
320 roc->cookie, roc->chan, in ieee80211_roc_notify_destroy()
323 list_for_each_entry_safe(dep, tmp, &roc->dependents, list) in ieee80211_roc_notify_destroy()
327 kfree(roc); in ieee80211_roc_notify_destroy()
329 roc->to_be_freed = true; in ieee80211_roc_notify_destroy()
334 struct ieee80211_roc_work *roc = in ieee80211_sw_roc_work() local
336 struct ieee80211_sub_if_data *sdata = roc->sdata; in ieee80211_sw_roc_work()
342 if (roc->to_be_freed) in ieee80211_sw_roc_work()
345 if (roc->abort) in ieee80211_sw_roc_work()
351 if (WARN_ON(roc != list_first_entry(&local->roc_list, in ieee80211_sw_roc_work()
356 if (!roc->started) { in ieee80211_sw_roc_work()
366 roc->on_channel = roc->chan == local->_oper_chandef.chan && in ieee80211_sw_roc_work()
373 if (!roc->on_channel) { in ieee80211_sw_roc_work()
376 local->tmp_channel = roc->chan; in ieee80211_sw_roc_work()
381 ieee80211_handle_roc_started(roc); in ieee80211_sw_roc_work()
382 list_for_each_entry(dep, &roc->dependents, list) in ieee80211_sw_roc_work()
386 if (!roc->duration) in ieee80211_sw_roc_work()
389 roc->started = true; in ieee80211_sw_roc_work()
390 ieee80211_queue_delayed_work(&local->hw, &roc->work, in ieee80211_sw_roc_work()
391 msecs_to_jiffies(roc->duration)); in ieee80211_sw_roc_work()
395 list_del(&roc->list); in ieee80211_sw_roc_work()
396 started = roc->started; in ieee80211_sw_roc_work()
397 on_channel = roc->on_channel; in ieee80211_sw_roc_work()
398 ieee80211_roc_notify_destroy(roc, !roc->abort); in ieee80211_sw_roc_work()
425 struct ieee80211_roc_work *roc; in ieee80211_hw_roc_done() local
432 roc = list_first_entry(&local->roc_list, struct ieee80211_roc_work, in ieee80211_hw_roc_done()
435 if (!roc->started) in ieee80211_hw_roc_done()
438 list_del(&roc->list); in ieee80211_hw_roc_done()
440 ieee80211_roc_notify_destroy(roc, true); in ieee80211_hw_roc_done()
469 struct ieee80211_roc_work *roc, *tmp; in ieee80211_roc_purge() local
473 list_for_each_entry_safe(roc, tmp, &local->roc_list, list) { in ieee80211_roc_purge()
474 if (sdata && roc->sdata != sdata) in ieee80211_roc_purge()
477 if (roc->started && local->ops->remain_on_channel) { in ieee80211_roc_purge()
482 list_move_tail(&roc->list, &tmp_list); in ieee80211_roc_purge()
483 roc->abort = true; in ieee80211_roc_purge()
487 list_for_each_entry_safe(roc, tmp, &tmp_list, list) { in ieee80211_roc_purge()
489 list_del(&roc->list); in ieee80211_roc_purge()
490 ieee80211_roc_notify_destroy(roc, true); in ieee80211_roc_purge()
492 ieee80211_queue_delayed_work(&local->hw, &roc->work, 0); in ieee80211_roc_purge()
495 flush_delayed_work(&roc->work); in ieee80211_roc_purge()
496 WARN_ON(!roc->to_be_freed); in ieee80211_roc_purge()
497 kfree(roc); in ieee80211_roc_purge()