2 * Copyright (c) 2014 Qualcomm Atheros, Inc.
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 /* Set/change channels. If the channel is really being changed, it's done
20 * by reseting the chip. To accomplish this we must first cleanup any pending
21 * DMA, then restart stuff.
23 static int ath_set_channel(struct ath_softc
*sc
)
25 struct ath_hw
*ah
= sc
->sc_ah
;
26 struct ath_common
*common
= ath9k_hw_common(ah
);
27 struct ieee80211_hw
*hw
= sc
->hw
;
28 struct ath9k_channel
*hchan
;
29 struct cfg80211_chan_def
*chandef
= &sc
->cur_chan
->chandef
;
30 struct ieee80211_channel
*chan
= chandef
->chan
;
31 int pos
= chan
->hw_value
;
35 if (test_bit(ATH_OP_INVALID
, &common
->op_flags
))
39 old_pos
= ah
->curchan
- &ah
->channels
[0];
41 ath_dbg(common
, CONFIG
, "Set channel: %d MHz width: %d\n",
42 chan
->center_freq
, chandef
->width
);
44 /* update survey stats for the old channel before switching */
45 spin_lock_bh(&common
->cc_lock
);
46 ath_update_survey_stats(sc
);
47 spin_unlock_bh(&common
->cc_lock
);
49 ath9k_cmn_get_channel(hw
, ah
, chandef
);
51 /* If the operating channel changes, change the survey in-use flags
53 * Reset the survey data for the new channel, unless we're switching
54 * back to the operating channel from an off-channel operation.
56 if (!sc
->cur_chan
->offchannel
&& sc
->cur_survey
!= &sc
->survey
[pos
]) {
58 sc
->cur_survey
->filled
&= ~SURVEY_INFO_IN_USE
;
60 sc
->cur_survey
= &sc
->survey
[pos
];
62 memset(sc
->cur_survey
, 0, sizeof(struct survey_info
));
63 sc
->cur_survey
->filled
|= SURVEY_INFO_IN_USE
;
64 } else if (!(sc
->survey
[pos
].filled
& SURVEY_INFO_IN_USE
)) {
65 memset(&sc
->survey
[pos
], 0, sizeof(struct survey_info
));
68 hchan
= &sc
->sc_ah
->channels
[pos
];
69 r
= ath_reset(sc
, hchan
);
73 /* The most recent snapshot of channel->noisefloor for the old
74 * channel is only available after the hardware reset. Copy it to
75 * the survey stats now.
78 ath_update_survey_nf(sc
, old_pos
);
80 /* Enable radar pulse detection if on a DFS channel. Spectral
81 * scanning and radar detection can not be used concurrently.
83 if (hw
->conf
.radar_enabled
) {
86 rxfilter
= ath9k_hw_getrxfilter(ah
);
87 rxfilter
|= ATH9K_RX_FILTER_PHYRADAR
|
88 ATH9K_RX_FILTER_PHYERR
;
89 ath9k_hw_setrxfilter(ah
, rxfilter
);
90 ath_dbg(common
, DFS
, "DFS enabled at freq %d\n",
93 /* perform spectral scan if requested. */
94 if (test_bit(ATH_OP_SCANNING
, &common
->op_flags
) &&
95 sc
->spectral_mode
== SPECTRAL_CHANSCAN
)
96 ath9k_spectral_scan_trigger(hw
);
102 void ath_chanctx_init(struct ath_softc
*sc
)
104 struct ath_chanctx
*ctx
;
105 struct ath_common
*common
= ath9k_hw_common(sc
->sc_ah
);
106 struct ieee80211_supported_band
*sband
;
107 struct ieee80211_channel
*chan
;
110 sband
= &common
->sbands
[IEEE80211_BAND_2GHZ
];
111 if (!sband
->n_channels
)
112 sband
= &common
->sbands
[IEEE80211_BAND_5GHZ
];
114 chan
= &sband
->channels
[0];
115 for (i
= 0; i
< ATH9K_NUM_CHANCTX
; i
++) {
116 ctx
= &sc
->chanctx
[i
];
117 cfg80211_chandef_create(&ctx
->chandef
, chan
, NL80211_CHAN_HT20
);
118 INIT_LIST_HEAD(&ctx
->vifs
);
119 ctx
->txpower
= ATH_TXPOWER_MAX
;
120 for (j
= 0; j
< ARRAY_SIZE(ctx
->acq
); j
++)
121 INIT_LIST_HEAD(&ctx
->acq
[j
]);
125 void ath_chanctx_set_channel(struct ath_softc
*sc
, struct ath_chanctx
*ctx
,
126 struct cfg80211_chan_def
*chandef
)
128 struct ath_common
*common
= ath9k_hw_common(sc
->sc_ah
);
131 spin_lock_bh(&sc
->chan_lock
);
133 memcpy(&ctx
->chandef
, chandef
, sizeof(*chandef
));
134 cur_chan
= sc
->cur_chan
== ctx
;
135 spin_unlock_bh(&sc
->chan_lock
);
138 ath_dbg(common
, CHAN_CTX
,
139 "Current context differs from the new context\n");
146 #ifdef CONFIG_ATH9K_CHANNEL_CONTEXT
148 /**********************************************************/
149 /* Functions to handle the channel context state machine. */
150 /**********************************************************/
152 static const char *offchannel_state_string(enum ath_offchannel_state state
)
155 case_rtn_string(ATH_OFFCHANNEL_IDLE
);
156 case_rtn_string(ATH_OFFCHANNEL_PROBE_SEND
);
157 case_rtn_string(ATH_OFFCHANNEL_PROBE_WAIT
);
158 case_rtn_string(ATH_OFFCHANNEL_SUSPEND
);
159 case_rtn_string(ATH_OFFCHANNEL_ROC_START
);
160 case_rtn_string(ATH_OFFCHANNEL_ROC_WAIT
);
161 case_rtn_string(ATH_OFFCHANNEL_ROC_DONE
);
167 static const char *chanctx_event_string(enum ath_chanctx_event ev
)
170 case_rtn_string(ATH_CHANCTX_EVENT_BEACON_PREPARE
);
171 case_rtn_string(ATH_CHANCTX_EVENT_BEACON_SENT
);
172 case_rtn_string(ATH_CHANCTX_EVENT_TSF_TIMER
);
173 case_rtn_string(ATH_CHANCTX_EVENT_BEACON_RECEIVED
);
174 case_rtn_string(ATH_CHANCTX_EVENT_AUTHORIZED
);
175 case_rtn_string(ATH_CHANCTX_EVENT_SWITCH
);
176 case_rtn_string(ATH_CHANCTX_EVENT_ASSIGN
);
177 case_rtn_string(ATH_CHANCTX_EVENT_UNASSIGN
);
178 case_rtn_string(ATH_CHANCTX_EVENT_CHANGE
);
179 case_rtn_string(ATH_CHANCTX_EVENT_ENABLE_MULTICHANNEL
);
185 static const char *chanctx_state_string(enum ath_chanctx_state state
)
188 case_rtn_string(ATH_CHANCTX_STATE_IDLE
);
189 case_rtn_string(ATH_CHANCTX_STATE_WAIT_FOR_BEACON
);
190 case_rtn_string(ATH_CHANCTX_STATE_WAIT_FOR_TIMER
);
191 case_rtn_string(ATH_CHANCTX_STATE_SWITCH
);
192 case_rtn_string(ATH_CHANCTX_STATE_FORCE_ACTIVE
);
198 void ath_chanctx_check_active(struct ath_softc
*sc
, struct ath_chanctx
*ctx
)
200 struct ath_common
*common
= ath9k_hw_common(sc
->sc_ah
);
208 list_for_each_entry(avp
, &ctx
->vifs
, list
) {
209 struct ieee80211_vif
*vif
= avp
->vif
;
212 case NL80211_IFTYPE_P2P_CLIENT
:
213 case NL80211_IFTYPE_STATION
:
222 ctx
->active
= active
;
224 ath_for_each_chanctx(sc
, ctx
) {
225 if (!ctx
->assigned
|| list_empty(&ctx
->vifs
))
231 clear_bit(ATH_OP_MULTI_CHANNEL
, &common
->op_flags
);
234 if (test_and_set_bit(ATH_OP_MULTI_CHANNEL
, &common
->op_flags
))
237 if (ath9k_is_chanctx_enabled()) {
238 ath_chanctx_event(sc
, NULL
,
239 ATH_CHANCTX_EVENT_ENABLE_MULTICHANNEL
);
243 static struct ath_chanctx
*
244 ath_chanctx_get_next(struct ath_softc
*sc
, struct ath_chanctx
*ctx
)
246 int idx
= ctx
- &sc
->chanctx
[0];
248 return &sc
->chanctx
[!idx
];
251 static void ath_chanctx_adjust_tbtt_delta(struct ath_softc
*sc
)
253 struct ath_chanctx
*prev
, *cur
;
255 u32 cur_tsf
, prev_tsf
, beacon_int
;
258 beacon_int
= TU_TO_USEC(sc
->cur_chan
->beacon
.beacon_interval
);
261 prev
= ath_chanctx_get_next(sc
, cur
);
263 if (!prev
->switch_after_beacon
)
266 getrawmonotonic(&ts
);
267 cur_tsf
= (u32
) cur
->tsf_val
+
268 ath9k_hw_get_tsf_offset(&cur
->tsf_ts
, &ts
);
270 prev_tsf
= prev
->last_beacon
- (u32
) prev
->tsf_val
+ cur_tsf
;
271 prev_tsf
-= ath9k_hw_get_tsf_offset(&prev
->tsf_ts
, &ts
);
273 /* Adjust the TSF time of the AP chanctx to keep its beacons
274 * at half beacon interval offset relative to the STA chanctx.
276 offset
= cur_tsf
- prev_tsf
;
278 /* Ignore stale data or spurious timestamps */
279 if (offset
< 0 || offset
> 3 * beacon_int
)
282 offset
= beacon_int
/ 2 - (offset
% beacon_int
);
283 prev
->tsf_val
+= offset
;
286 /* Configure the TSF based hardware timer for a channel switch.
287 * Also set up backup software timer, in case the gen timer fails.
288 * This could be caused by a hardware reset.
290 static void ath_chanctx_setup_timer(struct ath_softc
*sc
, u32 tsf_time
)
292 struct ath_common
*common
= ath9k_hw_common(sc
->sc_ah
);
293 struct ath_hw
*ah
= sc
->sc_ah
;
295 ath9k_hw_gen_timer_start(ah
, sc
->p2p_ps_timer
, tsf_time
, 1000000);
296 tsf_time
-= ath9k_hw_gettsf32(ah
);
297 tsf_time
= msecs_to_jiffies(tsf_time
/ 1000) + 1;
298 mod_timer(&sc
->sched
.timer
, jiffies
+ tsf_time
);
300 ath_dbg(common
, CHAN_CTX
,
301 "Setup chanctx timer with timeout: %d ms\n", jiffies_to_msecs(tsf_time
));
304 void ath_chanctx_event(struct ath_softc
*sc
, struct ieee80211_vif
*vif
,
305 enum ath_chanctx_event ev
)
307 struct ath_hw
*ah
= sc
->sc_ah
;
308 struct ath_common
*common
= ath9k_hw_common(ah
);
309 struct ath_beacon_config
*cur_conf
;
310 struct ath_vif
*avp
= NULL
;
311 struct ath_chanctx
*ctx
;
316 avp
= (struct ath_vif
*) vif
->drv_priv
;
318 spin_lock_bh(&sc
->chan_lock
);
320 ath_dbg(common
, CHAN_CTX
, "cur_chan: %d MHz, event: %s, state: %s\n",
321 sc
->cur_chan
->chandef
.center_freq1
,
322 chanctx_event_string(ev
),
323 chanctx_state_string(sc
->sched
.state
));
326 case ATH_CHANCTX_EVENT_BEACON_PREPARE
:
327 if (avp
->offchannel_duration
)
328 avp
->offchannel_duration
= 0;
330 if (avp
->chanctx
!= sc
->cur_chan
) {
331 ath_dbg(common
, CHAN_CTX
,
332 "Contexts differ, not preparing beacon\n");
336 if (sc
->sched
.offchannel_pending
&& !sc
->sched
.wait_switch
) {
337 sc
->sched
.offchannel_pending
= false;
338 sc
->next_chan
= &sc
->offchannel
.chan
;
339 sc
->sched
.state
= ATH_CHANCTX_STATE_WAIT_FOR_BEACON
;
340 ath_dbg(common
, CHAN_CTX
,
341 "Setting offchannel_pending to false\n");
344 ctx
= ath_chanctx_get_next(sc
, sc
->cur_chan
);
345 if (ctx
->active
&& sc
->sched
.state
== ATH_CHANCTX_STATE_IDLE
) {
347 sc
->sched
.state
= ATH_CHANCTX_STATE_WAIT_FOR_BEACON
;
348 ath_dbg(common
, CHAN_CTX
,
349 "Set next context, move chanctx state to WAIT_FOR_BEACON\n");
352 /* if the timer missed its window, use the next interval */
353 if (sc
->sched
.state
== ATH_CHANCTX_STATE_WAIT_FOR_TIMER
) {
354 sc
->sched
.state
= ATH_CHANCTX_STATE_WAIT_FOR_BEACON
;
355 ath_dbg(common
, CHAN_CTX
,
356 "Move chanctx state from WAIT_FOR_TIMER to WAIT_FOR_BEACON\n");
360 * When a context becomes inactive, for example,
361 * disassociation of a station context, the NoA
362 * attribute needs to be removed from subsequent
365 if (!ctx
->active
&& avp
->noa_duration
&&
366 sc
->sched
.state
!= ATH_CHANCTX_STATE_WAIT_FOR_BEACON
) {
367 avp
->noa_duration
= 0;
368 avp
->periodic_noa
= false;
370 ath_dbg(common
, CHAN_CTX
,
371 "Clearing NoA schedule\n");
374 if (sc
->sched
.state
!= ATH_CHANCTX_STATE_WAIT_FOR_BEACON
)
377 ath_dbg(common
, CHAN_CTX
, "Preparing beacon for vif: %pM\n", vif
->addr
);
379 sc
->sched
.beacon_pending
= true;
380 sc
->sched
.next_tbtt
= REG_READ(ah
, AR_NEXT_TBTT_TIMER
);
382 cur_conf
= &sc
->cur_chan
->beacon
;
383 beacon_int
= TU_TO_USEC(cur_conf
->beacon_interval
);
385 /* defer channel switch by a quarter beacon interval */
386 tsf_time
= sc
->sched
.next_tbtt
+ beacon_int
/ 4;
387 sc
->sched
.switch_start_time
= tsf_time
;
388 sc
->cur_chan
->last_beacon
= sc
->sched
.next_tbtt
;
391 * If an offchannel switch is scheduled to happen after
392 * a beacon transmission, update the NoA with one-shot
393 * values and increment the index.
395 if (sc
->next_chan
== &sc
->offchannel
.chan
) {
397 avp
->offchannel_start
= tsf_time
;
398 avp
->offchannel_duration
= sc
->sched
.offchannel_duration
;
400 ath_dbg(common
, CHAN_CTX
,
401 "offchannel noa_duration: %d, noa_start: %d, noa_index: %d\n",
402 avp
->offchannel_duration
,
403 avp
->offchannel_start
,
407 * When multiple contexts are active, the NoA
408 * has to be recalculated and advertised after
409 * an offchannel operation.
411 if (ctx
->active
&& avp
->noa_duration
)
412 avp
->noa_duration
= 0;
418 * Clear the extend_absence flag if it had been
419 * set during the previous beacon transmission,
420 * since we need to revert to the normal NoA
423 if (ctx
->active
&& sc
->sched
.extend_absence
) {
424 avp
->noa_duration
= 0;
425 sc
->sched
.extend_absence
= false;
428 /* If at least two consecutive beacons were missed on the STA
429 * chanctx, stay on the STA channel for one extra beacon period,
430 * to resync the timer properly.
432 if (ctx
->active
&& sc
->sched
.beacon_miss
>= 2) {
433 avp
->noa_duration
= 0;
434 sc
->sched
.extend_absence
= true;
437 /* Prevent wrap-around issues */
438 if (avp
->noa_duration
&& tsf_time
- avp
->noa_start
> BIT(30))
439 avp
->noa_duration
= 0;
442 * If multiple contexts are active, start periodic
443 * NoA and increment the index for the first
447 (!avp
->noa_duration
|| sc
->sched
.force_noa_update
)) {
449 avp
->noa_start
= tsf_time
;
451 if (sc
->sched
.extend_absence
)
452 avp
->noa_duration
= (3 * beacon_int
/ 2) +
453 sc
->sched
.channel_switch_time
;
456 TU_TO_USEC(cur_conf
->beacon_interval
) / 2 +
457 sc
->sched
.channel_switch_time
;
459 if (test_bit(ATH_OP_SCANNING
, &common
->op_flags
) ||
460 sc
->sched
.extend_absence
)
461 avp
->periodic_noa
= false;
463 avp
->periodic_noa
= true;
465 ath_dbg(common
, CHAN_CTX
,
466 "noa_duration: %d, noa_start: %d, noa_index: %d, periodic: %d\n",
473 if (ctx
->active
&& sc
->sched
.force_noa_update
)
474 sc
->sched
.force_noa_update
= false;
477 case ATH_CHANCTX_EVENT_BEACON_SENT
:
478 if (!sc
->sched
.beacon_pending
) {
479 ath_dbg(common
, CHAN_CTX
,
480 "No pending beacon\n");
484 sc
->sched
.beacon_pending
= false;
485 if (sc
->sched
.state
!= ATH_CHANCTX_STATE_WAIT_FOR_BEACON
)
488 ath_dbg(common
, CHAN_CTX
,
489 "Move chanctx state to WAIT_FOR_TIMER\n");
491 sc
->sched
.state
= ATH_CHANCTX_STATE_WAIT_FOR_TIMER
;
492 ath_chanctx_setup_timer(sc
, sc
->sched
.switch_start_time
);
494 case ATH_CHANCTX_EVENT_TSF_TIMER
:
495 if (sc
->sched
.state
!= ATH_CHANCTX_STATE_WAIT_FOR_TIMER
)
498 if (!sc
->cur_chan
->switch_after_beacon
&&
499 sc
->sched
.beacon_pending
)
500 sc
->sched
.beacon_miss
++;
502 ath_dbg(common
, CHAN_CTX
,
503 "Move chanctx state to SWITCH\n");
505 sc
->sched
.state
= ATH_CHANCTX_STATE_SWITCH
;
506 ieee80211_queue_work(sc
->hw
, &sc
->chanctx_work
);
508 case ATH_CHANCTX_EVENT_BEACON_RECEIVED
:
509 if (!test_bit(ATH_OP_MULTI_CHANNEL
, &common
->op_flags
) ||
510 sc
->cur_chan
== &sc
->offchannel
.chan
)
513 sc
->sched
.beacon_pending
= false;
514 sc
->sched
.beacon_miss
= 0;
516 if (sc
->sched
.state
== ATH_CHANCTX_STATE_FORCE_ACTIVE
||
517 !sc
->cur_chan
->tsf_val
)
520 ath_chanctx_adjust_tbtt_delta(sc
);
522 /* TSF time might have been updated by the incoming beacon,
523 * need update the channel switch timer to reflect the change.
525 tsf_time
= sc
->sched
.switch_start_time
;
526 tsf_time
-= (u32
) sc
->cur_chan
->tsf_val
+
527 ath9k_hw_get_tsf_offset(&sc
->cur_chan
->tsf_ts
, NULL
);
528 tsf_time
+= ath9k_hw_gettsf32(ah
);
531 ath_chanctx_setup_timer(sc
, tsf_time
);
533 case ATH_CHANCTX_EVENT_AUTHORIZED
:
534 if (sc
->sched
.state
!= ATH_CHANCTX_STATE_FORCE_ACTIVE
||
535 avp
->chanctx
!= sc
->cur_chan
)
538 ath_dbg(common
, CHAN_CTX
,
539 "Move chanctx state from FORCE_ACTIVE to IDLE\n");
541 sc
->sched
.state
= ATH_CHANCTX_STATE_IDLE
;
543 case ATH_CHANCTX_EVENT_SWITCH
:
544 if (!test_bit(ATH_OP_MULTI_CHANNEL
, &common
->op_flags
) ||
545 sc
->sched
.state
== ATH_CHANCTX_STATE_FORCE_ACTIVE
||
546 sc
->cur_chan
->switch_after_beacon
||
547 sc
->cur_chan
== &sc
->offchannel
.chan
)
550 /* If this is a station chanctx, stay active for a half
551 * beacon period (minus channel switch time)
553 sc
->next_chan
= ath_chanctx_get_next(sc
, sc
->cur_chan
);
554 cur_conf
= &sc
->cur_chan
->beacon
;
556 ath_dbg(common
, CHAN_CTX
,
557 "Move chanctx state to WAIT_FOR_TIMER (event SWITCH)\n");
559 sc
->sched
.state
= ATH_CHANCTX_STATE_WAIT_FOR_TIMER
;
560 sc
->sched
.wait_switch
= false;
562 tsf_time
= TU_TO_USEC(cur_conf
->beacon_interval
) / 2;
564 if (sc
->sched
.extend_absence
) {
565 sc
->sched
.beacon_miss
= 0;
569 tsf_time
-= sc
->sched
.channel_switch_time
;
570 tsf_time
+= ath9k_hw_gettsf32(sc
->sc_ah
);
571 sc
->sched
.switch_start_time
= tsf_time
;
573 ath_chanctx_setup_timer(sc
, tsf_time
);
574 sc
->sched
.beacon_pending
= true;
576 case ATH_CHANCTX_EVENT_ENABLE_MULTICHANNEL
:
577 if (sc
->cur_chan
== &sc
->offchannel
.chan
||
578 sc
->cur_chan
->switch_after_beacon
)
581 sc
->next_chan
= ath_chanctx_get_next(sc
, sc
->cur_chan
);
582 ieee80211_queue_work(sc
->hw
, &sc
->chanctx_work
);
584 case ATH_CHANCTX_EVENT_UNASSIGN
:
585 if (sc
->cur_chan
->assigned
) {
586 if (sc
->next_chan
&& !sc
->next_chan
->assigned
&&
587 sc
->next_chan
!= &sc
->offchannel
.chan
)
588 sc
->sched
.state
= ATH_CHANCTX_STATE_IDLE
;
592 ctx
= ath_chanctx_get_next(sc
, sc
->cur_chan
);
593 sc
->sched
.state
= ATH_CHANCTX_STATE_IDLE
;
598 ieee80211_queue_work(sc
->hw
, &sc
->chanctx_work
);
600 case ATH_CHANCTX_EVENT_ASSIGN
:
602 * When adding a new channel context, check if a scan
603 * is in progress and abort it since the addition of
604 * a new channel context is usually followed by VIF
605 * assignment, in which case we have to start multi-channel
608 if (test_bit(ATH_OP_SCANNING
, &common
->op_flags
)) {
609 ath_dbg(common
, CHAN_CTX
,
610 "Aborting HW scan to add new context\n");
612 spin_unlock_bh(&sc
->chan_lock
);
613 del_timer_sync(&sc
->offchannel
.timer
);
614 ath_scan_complete(sc
, true);
615 spin_lock_bh(&sc
->chan_lock
);
618 case ATH_CHANCTX_EVENT_CHANGE
:
622 spin_unlock_bh(&sc
->chan_lock
);
625 void ath_chanctx_beacon_sent_ev(struct ath_softc
*sc
,
626 enum ath_chanctx_event ev
)
628 if (sc
->sched
.beacon_pending
)
629 ath_chanctx_event(sc
, NULL
, ev
);
632 void ath_chanctx_beacon_recv_ev(struct ath_softc
*sc
,
633 enum ath_chanctx_event ev
)
635 ath_chanctx_event(sc
, NULL
, ev
);
638 static int ath_scan_channel_duration(struct ath_softc
*sc
,
639 struct ieee80211_channel
*chan
)
641 struct cfg80211_scan_request
*req
= sc
->offchannel
.scan_req
;
643 if (!req
->n_ssids
|| (chan
->flags
& IEEE80211_CHAN_NO_IR
))
644 return (HZ
/ 9); /* ~110 ms */
646 return (HZ
/ 16); /* ~60 ms */
649 static void ath_chanctx_switch(struct ath_softc
*sc
, struct ath_chanctx
*ctx
,
650 struct cfg80211_chan_def
*chandef
)
652 struct ath_common
*common
= ath9k_hw_common(sc
->sc_ah
);
654 spin_lock_bh(&sc
->chan_lock
);
656 if (test_bit(ATH_OP_MULTI_CHANNEL
, &common
->op_flags
) &&
657 (sc
->cur_chan
!= ctx
) && (ctx
== &sc
->offchannel
.chan
)) {
659 ctx
->chandef
= *chandef
;
661 sc
->sched
.offchannel_pending
= true;
662 sc
->sched
.wait_switch
= true;
663 sc
->sched
.offchannel_duration
=
664 jiffies_to_usecs(sc
->offchannel
.duration
) +
665 sc
->sched
.channel_switch_time
;
667 spin_unlock_bh(&sc
->chan_lock
);
668 ath_dbg(common
, CHAN_CTX
,
669 "Set offchannel_pending to true\n");
675 ctx
->chandef
= *chandef
;
676 ath_dbg(common
, CHAN_CTX
,
677 "Assigned next_chan to %d MHz\n", chandef
->center_freq1
);
680 if (sc
->next_chan
== &sc
->offchannel
.chan
) {
681 sc
->sched
.offchannel_duration
=
682 jiffies_to_usecs(sc
->offchannel
.duration
) +
683 sc
->sched
.channel_switch_time
;
686 ath_dbg(common
, CHAN_CTX
,
687 "Offchannel duration for chan %d MHz : %u\n",
688 chandef
->center_freq1
,
689 sc
->sched
.offchannel_duration
);
692 spin_unlock_bh(&sc
->chan_lock
);
693 ieee80211_queue_work(sc
->hw
, &sc
->chanctx_work
);
696 static void ath_chanctx_offchan_switch(struct ath_softc
*sc
,
697 struct ieee80211_channel
*chan
)
699 struct ath_common
*common
= ath9k_hw_common(sc
->sc_ah
);
700 struct cfg80211_chan_def chandef
;
702 cfg80211_chandef_create(&chandef
, chan
, NL80211_CHAN_NO_HT
);
703 ath_dbg(common
, CHAN_CTX
,
704 "Channel definition created: %d MHz\n", chandef
.center_freq1
);
706 ath_chanctx_switch(sc
, &sc
->offchannel
.chan
, &chandef
);
709 static struct ath_chanctx
*ath_chanctx_get_oper_chan(struct ath_softc
*sc
,
712 struct ath_chanctx
*ctx
;
714 ath_for_each_chanctx(sc
, ctx
) {
715 if (!ctx
->assigned
|| list_empty(&ctx
->vifs
))
717 if (active
&& !ctx
->active
)
720 if (ctx
->switch_after_beacon
)
724 return &sc
->chanctx
[0];
728 ath_scan_next_channel(struct ath_softc
*sc
)
730 struct ath_common
*common
= ath9k_hw_common(sc
->sc_ah
);
731 struct cfg80211_scan_request
*req
= sc
->offchannel
.scan_req
;
732 struct ieee80211_channel
*chan
;
734 if (sc
->offchannel
.scan_idx
>= req
->n_channels
) {
735 ath_dbg(common
, CHAN_CTX
,
736 "Moving offchannel state to ATH_OFFCHANNEL_IDLE, "
737 "scan_idx: %d, n_channels: %d\n",
738 sc
->offchannel
.scan_idx
,
741 sc
->offchannel
.state
= ATH_OFFCHANNEL_IDLE
;
742 ath_chanctx_switch(sc
, ath_chanctx_get_oper_chan(sc
, false),
747 ath_dbg(common
, CHAN_CTX
,
748 "Moving offchannel state to ATH_OFFCHANNEL_PROBE_SEND, scan_idx: %d\n",
749 sc
->offchannel
.scan_idx
);
751 chan
= req
->channels
[sc
->offchannel
.scan_idx
++];
752 sc
->offchannel
.duration
= ath_scan_channel_duration(sc
, chan
);
753 sc
->offchannel
.state
= ATH_OFFCHANNEL_PROBE_SEND
;
755 ath_chanctx_offchan_switch(sc
, chan
);
758 void ath_offchannel_next(struct ath_softc
*sc
)
760 struct ieee80211_vif
*vif
;
762 if (sc
->offchannel
.scan_req
) {
763 vif
= sc
->offchannel
.scan_vif
;
764 sc
->offchannel
.chan
.txpower
= vif
->bss_conf
.txpower
;
765 ath_scan_next_channel(sc
);
766 } else if (sc
->offchannel
.roc_vif
) {
767 vif
= sc
->offchannel
.roc_vif
;
768 sc
->offchannel
.chan
.txpower
= vif
->bss_conf
.txpower
;
769 sc
->offchannel
.duration
=
770 msecs_to_jiffies(sc
->offchannel
.roc_duration
);
771 sc
->offchannel
.state
= ATH_OFFCHANNEL_ROC_START
;
772 ath_chanctx_offchan_switch(sc
, sc
->offchannel
.roc_chan
);
774 ath_chanctx_switch(sc
, ath_chanctx_get_oper_chan(sc
, false),
776 sc
->offchannel
.state
= ATH_OFFCHANNEL_IDLE
;
782 void ath_roc_complete(struct ath_softc
*sc
, bool abort
)
784 struct ath_common
*common
= ath9k_hw_common(sc
->sc_ah
);
787 ath_dbg(common
, CHAN_CTX
, "RoC aborted\n");
789 ath_dbg(common
, CHAN_CTX
, "RoC expired\n");
791 sc
->offchannel
.roc_vif
= NULL
;
792 sc
->offchannel
.roc_chan
= NULL
;
794 ieee80211_remain_on_channel_expired(sc
->hw
);
795 ath_offchannel_next(sc
);
796 ath9k_ps_restore(sc
);
799 void ath_scan_complete(struct ath_softc
*sc
, bool abort
)
801 struct ath_common
*common
= ath9k_hw_common(sc
->sc_ah
);
804 ath_dbg(common
, CHAN_CTX
, "HW scan aborted\n");
806 ath_dbg(common
, CHAN_CTX
, "HW scan complete\n");
808 sc
->offchannel
.scan_req
= NULL
;
809 sc
->offchannel
.scan_vif
= NULL
;
810 sc
->offchannel
.state
= ATH_OFFCHANNEL_IDLE
;
811 ieee80211_scan_completed(sc
->hw
, abort
);
812 clear_bit(ATH_OP_SCANNING
, &common
->op_flags
);
813 spin_lock_bh(&sc
->chan_lock
);
814 if (test_bit(ATH_OP_MULTI_CHANNEL
, &common
->op_flags
))
815 sc
->sched
.force_noa_update
= true;
816 spin_unlock_bh(&sc
->chan_lock
);
817 ath_offchannel_next(sc
);
818 ath9k_ps_restore(sc
);
821 static void ath_scan_send_probe(struct ath_softc
*sc
,
822 struct cfg80211_ssid
*ssid
)
824 struct cfg80211_scan_request
*req
= sc
->offchannel
.scan_req
;
825 struct ieee80211_vif
*vif
= sc
->offchannel
.scan_vif
;
826 struct ath_tx_control txctl
= {};
828 struct ieee80211_tx_info
*info
;
829 int band
= sc
->offchannel
.chan
.chandef
.chan
->band
;
831 skb
= ieee80211_probereq_get(sc
->hw
, vif
,
832 ssid
->ssid
, ssid
->ssid_len
, req
->ie_len
);
836 info
= IEEE80211_SKB_CB(skb
);
838 info
->flags
|= IEEE80211_TX_CTL_NO_CCK_RATE
;
841 memcpy(skb_put(skb
, req
->ie_len
), req
->ie
, req
->ie_len
);
843 skb_set_queue_mapping(skb
, IEEE80211_AC_VO
);
845 if (!ieee80211_tx_prepare_skb(sc
->hw
, vif
, skb
, band
, NULL
))
848 txctl
.txq
= sc
->tx
.txq_map
[IEEE80211_AC_VO
];
849 txctl
.force_channel
= true;
850 if (ath_tx_start(sc
->hw
, skb
, &txctl
))
856 ieee80211_free_txskb(sc
->hw
, skb
);
859 static void ath_scan_channel_start(struct ath_softc
*sc
)
861 struct ath_common
*common
= ath9k_hw_common(sc
->sc_ah
);
862 struct cfg80211_scan_request
*req
= sc
->offchannel
.scan_req
;
865 if (!(sc
->cur_chan
->chandef
.chan
->flags
& IEEE80211_CHAN_NO_IR
) &&
867 for (i
= 0; i
< req
->n_ssids
; i
++)
868 ath_scan_send_probe(sc
, &req
->ssids
[i
]);
872 ath_dbg(common
, CHAN_CTX
,
873 "Moving offchannel state to ATH_OFFCHANNEL_PROBE_WAIT\n");
875 sc
->offchannel
.state
= ATH_OFFCHANNEL_PROBE_WAIT
;
876 mod_timer(&sc
->offchannel
.timer
, jiffies
+ sc
->offchannel
.duration
);
879 static void ath_chanctx_timer(unsigned long data
)
881 struct ath_softc
*sc
= (struct ath_softc
*) data
;
882 struct ath_common
*common
= ath9k_hw_common(sc
->sc_ah
);
884 ath_dbg(common
, CHAN_CTX
,
885 "Channel context timer invoked\n");
887 ath_chanctx_event(sc
, NULL
, ATH_CHANCTX_EVENT_TSF_TIMER
);
890 static void ath_offchannel_timer(unsigned long data
)
892 struct ath_softc
*sc
= (struct ath_softc
*)data
;
893 struct ath_chanctx
*ctx
;
894 struct ath_common
*common
= ath9k_hw_common(sc
->sc_ah
);
896 ath_dbg(common
, CHAN_CTX
, "%s: offchannel state: %s\n",
897 __func__
, offchannel_state_string(sc
->offchannel
.state
));
899 switch (sc
->offchannel
.state
) {
900 case ATH_OFFCHANNEL_PROBE_WAIT
:
901 if (!sc
->offchannel
.scan_req
)
904 /* get first active channel context */
905 ctx
= ath_chanctx_get_oper_chan(sc
, true);
907 ath_dbg(common
, CHAN_CTX
,
908 "Switch to oper/active context, "
909 "move offchannel state to ATH_OFFCHANNEL_SUSPEND\n");
911 sc
->offchannel
.state
= ATH_OFFCHANNEL_SUSPEND
;
912 ath_chanctx_switch(sc
, ctx
, NULL
);
913 mod_timer(&sc
->offchannel
.timer
, jiffies
+ HZ
/ 10);
917 case ATH_OFFCHANNEL_SUSPEND
:
918 if (!sc
->offchannel
.scan_req
)
921 ath_scan_next_channel(sc
);
923 case ATH_OFFCHANNEL_ROC_START
:
924 case ATH_OFFCHANNEL_ROC_WAIT
:
925 ctx
= ath_chanctx_get_oper_chan(sc
, false);
926 sc
->offchannel
.state
= ATH_OFFCHANNEL_ROC_DONE
;
927 ath_chanctx_switch(sc
, ctx
, NULL
);
935 ath_chanctx_send_vif_ps_frame(struct ath_softc
*sc
, struct ath_vif
*avp
,
938 struct ieee80211_vif
*vif
= avp
->vif
;
939 struct ieee80211_sta
*sta
= NULL
;
940 struct ieee80211_hdr_3addr
*nullfunc
;
941 struct ath_tx_control txctl
;
943 int band
= sc
->cur_chan
->chandef
.chan
->band
;
946 case NL80211_IFTYPE_STATION
:
950 skb
= ieee80211_nullfunc_get(sc
->hw
, vif
);
954 nullfunc
= (struct ieee80211_hdr_3addr
*) skb
->data
;
956 nullfunc
->frame_control
|=
957 cpu_to_le16(IEEE80211_FCTL_PM
);
959 skb_set_queue_mapping(skb
, IEEE80211_AC_VO
);
960 if (!ieee80211_tx_prepare_skb(sc
->hw
, vif
, skb
, band
, &sta
)) {
961 dev_kfree_skb_any(skb
);
969 memset(&txctl
, 0, sizeof(txctl
));
970 txctl
.txq
= sc
->tx
.txq_map
[IEEE80211_AC_VO
];
972 txctl
.force_channel
= true;
973 if (ath_tx_start(sc
->hw
, skb
, &txctl
)) {
974 ieee80211_free_txskb(sc
->hw
, skb
);
982 ath_chanctx_send_ps_frame(struct ath_softc
*sc
, bool powersave
)
988 list_for_each_entry(avp
, &sc
->cur_chan
->vifs
, list
) {
989 if (ath_chanctx_send_vif_ps_frame(sc
, avp
, powersave
))
997 static bool ath_chanctx_defer_switch(struct ath_softc
*sc
)
999 struct ath_common
*common
= ath9k_hw_common(sc
->sc_ah
);
1001 if (sc
->cur_chan
== &sc
->offchannel
.chan
)
1004 switch (sc
->sched
.state
) {
1005 case ATH_CHANCTX_STATE_SWITCH
:
1007 case ATH_CHANCTX_STATE_IDLE
:
1008 if (!sc
->cur_chan
->switch_after_beacon
)
1011 ath_dbg(common
, CHAN_CTX
,
1012 "Defer switch, set chanctx state to WAIT_FOR_BEACON\n");
1014 sc
->sched
.state
= ATH_CHANCTX_STATE_WAIT_FOR_BEACON
;
1023 static void ath_offchannel_channel_change(struct ath_softc
*sc
)
1025 struct ath_common
*common
= ath9k_hw_common(sc
->sc_ah
);
1027 ath_dbg(common
, CHAN_CTX
, "%s: offchannel state: %s\n",
1028 __func__
, offchannel_state_string(sc
->offchannel
.state
));
1030 switch (sc
->offchannel
.state
) {
1031 case ATH_OFFCHANNEL_PROBE_SEND
:
1032 if (!sc
->offchannel
.scan_req
)
1035 if (sc
->cur_chan
->chandef
.chan
!=
1036 sc
->offchannel
.chan
.chandef
.chan
)
1039 ath_scan_channel_start(sc
);
1041 case ATH_OFFCHANNEL_IDLE
:
1042 if (!sc
->offchannel
.scan_req
)
1045 ath_scan_complete(sc
, false);
1047 case ATH_OFFCHANNEL_ROC_START
:
1048 if (sc
->cur_chan
!= &sc
->offchannel
.chan
)
1051 sc
->offchannel
.state
= ATH_OFFCHANNEL_ROC_WAIT
;
1052 mod_timer(&sc
->offchannel
.timer
,
1053 jiffies
+ sc
->offchannel
.duration
);
1054 ieee80211_ready_on_channel(sc
->hw
);
1056 case ATH_OFFCHANNEL_ROC_DONE
:
1057 ath_roc_complete(sc
, false);
1064 void ath_chanctx_set_next(struct ath_softc
*sc
, bool force
)
1066 struct ath_common
*common
= ath9k_hw_common(sc
->sc_ah
);
1067 struct ath_chanctx
*old_ctx
;
1069 bool measure_time
= false;
1070 bool send_ps
= false;
1071 bool queues_stopped
= false;
1073 spin_lock_bh(&sc
->chan_lock
);
1074 if (!sc
->next_chan
) {
1075 spin_unlock_bh(&sc
->chan_lock
);
1079 if (!force
&& ath_chanctx_defer_switch(sc
)) {
1080 spin_unlock_bh(&sc
->chan_lock
);
1084 ath_dbg(common
, CHAN_CTX
,
1085 "%s: current: %d MHz, next: %d MHz\n",
1087 sc
->cur_chan
->chandef
.center_freq1
,
1088 sc
->next_chan
->chandef
.center_freq1
);
1090 if (sc
->cur_chan
!= sc
->next_chan
) {
1091 ath_dbg(common
, CHAN_CTX
,
1092 "Stopping current chanctx: %d\n",
1093 sc
->cur_chan
->chandef
.center_freq1
);
1094 sc
->cur_chan
->stopped
= true;
1095 spin_unlock_bh(&sc
->chan_lock
);
1097 if (sc
->next_chan
== &sc
->offchannel
.chan
) {
1098 getrawmonotonic(&ts
);
1099 measure_time
= true;
1102 ath9k_chanctx_stop_queues(sc
, sc
->cur_chan
);
1103 queues_stopped
= true;
1105 __ath9k_flush(sc
->hw
, ~0, true);
1107 if (ath_chanctx_send_ps_frame(sc
, true))
1108 __ath9k_flush(sc
->hw
, BIT(IEEE80211_AC_VO
), false);
1111 spin_lock_bh(&sc
->chan_lock
);
1113 if (sc
->cur_chan
!= &sc
->offchannel
.chan
) {
1114 getrawmonotonic(&sc
->cur_chan
->tsf_ts
);
1115 sc
->cur_chan
->tsf_val
= ath9k_hw_gettsf64(sc
->sc_ah
);
1118 old_ctx
= sc
->cur_chan
;
1119 sc
->cur_chan
= sc
->next_chan
;
1120 sc
->cur_chan
->stopped
= false;
1121 sc
->next_chan
= NULL
;
1123 if (!sc
->sched
.offchannel_pending
)
1124 sc
->sched
.offchannel_duration
= 0;
1126 if (sc
->sched
.state
!= ATH_CHANCTX_STATE_FORCE_ACTIVE
)
1127 sc
->sched
.state
= ATH_CHANCTX_STATE_IDLE
;
1129 spin_unlock_bh(&sc
->chan_lock
);
1131 if (sc
->sc_ah
->chip_fullsleep
||
1132 memcmp(&sc
->cur_chandef
, &sc
->cur_chan
->chandef
,
1133 sizeof(sc
->cur_chandef
))) {
1134 ath_dbg(common
, CHAN_CTX
,
1135 "%s: Set channel %d MHz\n",
1136 __func__
, sc
->cur_chan
->chandef
.center_freq1
);
1137 ath_set_channel(sc
);
1139 sc
->sched
.channel_switch_time
=
1140 ath9k_hw_get_tsf_offset(&ts
, NULL
);
1142 * A reset will ensure that all queues are woken up,
1143 * so there is no need to awaken them again.
1149 ath9k_chanctx_wake_queues(sc
, old_ctx
);
1152 ath_chanctx_send_ps_frame(sc
, false);
1154 ath_offchannel_channel_change(sc
);
1155 ath_chanctx_event(sc
, NULL
, ATH_CHANCTX_EVENT_SWITCH
);
1158 static void ath_chanctx_work(struct work_struct
*work
)
1160 struct ath_softc
*sc
= container_of(work
, struct ath_softc
,
1162 mutex_lock(&sc
->mutex
);
1163 ath_chanctx_set_next(sc
, false);
1164 mutex_unlock(&sc
->mutex
);
1167 void ath9k_offchannel_init(struct ath_softc
*sc
)
1169 struct ath_chanctx
*ctx
;
1170 struct ath_common
*common
= ath9k_hw_common(sc
->sc_ah
);
1171 struct ieee80211_supported_band
*sband
;
1172 struct ieee80211_channel
*chan
;
1175 sband
= &common
->sbands
[IEEE80211_BAND_2GHZ
];
1176 if (!sband
->n_channels
)
1177 sband
= &common
->sbands
[IEEE80211_BAND_5GHZ
];
1179 chan
= &sband
->channels
[0];
1181 ctx
= &sc
->offchannel
.chan
;
1182 INIT_LIST_HEAD(&ctx
->vifs
);
1183 ctx
->txpower
= ATH_TXPOWER_MAX
;
1184 cfg80211_chandef_create(&ctx
->chandef
, chan
, NL80211_CHAN_HT20
);
1186 for (i
= 0; i
< ARRAY_SIZE(ctx
->acq
); i
++)
1187 INIT_LIST_HEAD(&ctx
->acq
[i
]);
1189 sc
->offchannel
.chan
.offchannel
= true;
1192 void ath9k_init_channel_context(struct ath_softc
*sc
)
1194 INIT_WORK(&sc
->chanctx_work
, ath_chanctx_work
);
1196 setup_timer(&sc
->offchannel
.timer
, ath_offchannel_timer
,
1198 setup_timer(&sc
->sched
.timer
, ath_chanctx_timer
,
1202 void ath9k_deinit_channel_context(struct ath_softc
*sc
)
1204 cancel_work_sync(&sc
->chanctx_work
);
1207 bool ath9k_is_chanctx_enabled(void)
1209 return (ath9k_use_chanctx
== 1);
1212 /********************/
1213 /* Queue management */
1214 /********************/
1216 void ath9k_chanctx_stop_queues(struct ath_softc
*sc
, struct ath_chanctx
*ctx
)
1218 struct ath_hw
*ah
= sc
->sc_ah
;
1221 if (ctx
== &sc
->offchannel
.chan
) {
1222 ieee80211_stop_queue(sc
->hw
,
1223 sc
->hw
->offchannel_tx_hw_queue
);
1225 for (i
= 0; i
< IEEE80211_NUM_ACS
; i
++)
1226 ieee80211_stop_queue(sc
->hw
,
1227 ctx
->hw_queue_base
+ i
);
1230 if (ah
->opmode
== NL80211_IFTYPE_AP
)
1231 ieee80211_stop_queue(sc
->hw
, sc
->hw
->queues
- 2);
1235 void ath9k_chanctx_wake_queues(struct ath_softc
*sc
, struct ath_chanctx
*ctx
)
1237 struct ath_hw
*ah
= sc
->sc_ah
;
1240 if (ctx
== &sc
->offchannel
.chan
) {
1241 ieee80211_wake_queue(sc
->hw
,
1242 sc
->hw
->offchannel_tx_hw_queue
);
1244 for (i
= 0; i
< IEEE80211_NUM_ACS
; i
++)
1245 ieee80211_wake_queue(sc
->hw
,
1246 ctx
->hw_queue_base
+ i
);
1249 if (ah
->opmode
== NL80211_IFTYPE_AP
)
1250 ieee80211_wake_queue(sc
->hw
, sc
->hw
->queues
- 2);
1257 static void ath9k_update_p2p_ps_timer(struct ath_softc
*sc
, struct ath_vif
*avp
)
1259 struct ath_hw
*ah
= sc
->sc_ah
;
1260 s32 tsf
, target_tsf
;
1262 if (!avp
|| !avp
->noa
.has_next_tsf
)
1265 ath9k_hw_gen_timer_stop(ah
, sc
->p2p_ps_timer
);
1267 tsf
= ath9k_hw_gettsf32(sc
->sc_ah
);
1269 target_tsf
= avp
->noa
.next_tsf
;
1270 if (!avp
->noa
.absent
)
1271 target_tsf
-= ATH_P2P_PS_STOP_TIME
;
1273 if (target_tsf
- tsf
< ATH_P2P_PS_STOP_TIME
)
1274 target_tsf
= tsf
+ ATH_P2P_PS_STOP_TIME
;
1276 ath9k_hw_gen_timer_start(ah
, sc
->p2p_ps_timer
, (u32
) target_tsf
, 1000000);
1279 static void ath9k_update_p2p_ps(struct ath_softc
*sc
, struct ieee80211_vif
*vif
)
1281 struct ath_vif
*avp
= (void *)vif
->drv_priv
;
1284 if (!sc
->p2p_ps_timer
)
1287 if (vif
->type
!= NL80211_IFTYPE_STATION
|| !vif
->p2p
)
1290 sc
->p2p_ps_vif
= avp
;
1291 tsf
= ath9k_hw_gettsf32(sc
->sc_ah
);
1292 ieee80211_parse_p2p_noa(&vif
->bss_conf
.p2p_noa_attr
, &avp
->noa
, tsf
);
1293 ath9k_update_p2p_ps_timer(sc
, avp
);
1296 static u8
ath9k_get_ctwin(struct ath_softc
*sc
, struct ath_vif
*avp
)
1298 struct ath_beacon_config
*cur_conf
= &sc
->cur_chan
->beacon
;
1299 u8 switch_time
, ctwin
;
1302 * Channel switch in multi-channel mode is deferred
1303 * by a quarter beacon interval when handling
1304 * ATH_CHANCTX_EVENT_BEACON_PREPARE, so the P2P-GO
1305 * interface is guaranteed to be discoverable
1306 * for that duration after a TBTT.
1308 switch_time
= cur_conf
->beacon_interval
/ 4;
1310 ctwin
= avp
->vif
->bss_conf
.p2p_noa_attr
.oppps_ctwindow
;
1311 if (ctwin
&& (ctwin
< switch_time
))
1314 if (switch_time
< P2P_DEFAULT_CTWIN
)
1317 return P2P_DEFAULT_CTWIN
;
1320 void ath9k_beacon_add_noa(struct ath_softc
*sc
, struct ath_vif
*avp
,
1321 struct sk_buff
*skb
)
1323 static const u8 noa_ie_hdr
[] = {
1324 WLAN_EID_VENDOR_SPECIFIC
, /* type */
1326 0x50, 0x6f, 0x9a, /* WFA OUI */
1327 0x09, /* P2P subtype */
1328 0x0c, /* Notice of Absence */
1329 0x00, /* LSB of little-endian len */
1330 0x00, /* MSB of little-endian len */
1333 struct ieee80211_p2p_noa_attr
*noa
;
1334 int noa_len
, noa_desc
, i
= 0;
1337 if (!avp
->offchannel_duration
&& !avp
->noa_duration
)
1340 noa_desc
= !!avp
->offchannel_duration
+ !!avp
->noa_duration
;
1341 noa_len
= 2 + sizeof(struct ieee80211_p2p_noa_desc
) * noa_desc
;
1343 hdr
= skb_put(skb
, sizeof(noa_ie_hdr
));
1344 memcpy(hdr
, noa_ie_hdr
, sizeof(noa_ie_hdr
));
1345 hdr
[1] = sizeof(noa_ie_hdr
) + noa_len
- 2;
1348 noa
= (void *) skb_put(skb
, noa_len
);
1349 memset(noa
, 0, noa_len
);
1351 noa
->index
= avp
->noa_index
;
1352 noa
->oppps_ctwindow
= ath9k_get_ctwin(sc
, avp
);
1354 if (avp
->noa_duration
) {
1355 if (avp
->periodic_noa
) {
1356 u32 interval
= TU_TO_USEC(sc
->cur_chan
->beacon
.beacon_interval
);
1357 noa
->desc
[i
].count
= 255;
1358 noa
->desc
[i
].interval
= cpu_to_le32(interval
);
1360 noa
->desc
[i
].count
= 1;
1363 noa
->desc
[i
].start_time
= cpu_to_le32(avp
->noa_start
);
1364 noa
->desc
[i
].duration
= cpu_to_le32(avp
->noa_duration
);
1368 if (avp
->offchannel_duration
) {
1369 noa
->desc
[i
].count
= 1;
1370 noa
->desc
[i
].start_time
= cpu_to_le32(avp
->offchannel_start
);
1371 noa
->desc
[i
].duration
= cpu_to_le32(avp
->offchannel_duration
);
1375 void ath9k_p2p_ps_timer(void *priv
)
1377 struct ath_softc
*sc
= priv
;
1378 struct ath_vif
*avp
= sc
->p2p_ps_vif
;
1379 struct ieee80211_vif
*vif
;
1380 struct ieee80211_sta
*sta
;
1381 struct ath_node
*an
;
1384 del_timer_sync(&sc
->sched
.timer
);
1385 ath9k_hw_gen_timer_stop(sc
->sc_ah
, sc
->p2p_ps_timer
);
1386 ath_chanctx_event(sc
, NULL
, ATH_CHANCTX_EVENT_TSF_TIMER
);
1388 if (!avp
|| avp
->chanctx
!= sc
->cur_chan
)
1391 tsf
= ath9k_hw_gettsf32(sc
->sc_ah
);
1392 if (!avp
->noa
.absent
)
1393 tsf
+= ATH_P2P_PS_STOP_TIME
;
1395 if (!avp
->noa
.has_next_tsf
||
1396 avp
->noa
.next_tsf
- tsf
> BIT(31))
1397 ieee80211_update_p2p_noa(&avp
->noa
, tsf
);
1399 ath9k_update_p2p_ps_timer(sc
, avp
);
1404 sta
= ieee80211_find_sta(vif
, avp
->bssid
);
1408 an
= (void *) sta
->drv_priv
;
1409 if (an
->sleeping
== !!avp
->noa
.absent
)
1412 an
->sleeping
= avp
->noa
.absent
;
1414 ath_tx_aggr_sleep(sta
, sc
, an
);
1416 ath_tx_aggr_wakeup(sc
, an
);
1422 void ath9k_p2p_bss_info_changed(struct ath_softc
*sc
,
1423 struct ieee80211_vif
*vif
)
1425 unsigned long flags
;
1427 spin_lock_bh(&sc
->sc_pcu_lock
);
1428 spin_lock_irqsave(&sc
->sc_pm_lock
, flags
);
1429 if (!(sc
->ps_flags
& PS_BEACON_SYNC
))
1430 ath9k_update_p2p_ps(sc
, vif
);
1431 spin_unlock_irqrestore(&sc
->sc_pm_lock
, flags
);
1432 spin_unlock_bh(&sc
->sc_pcu_lock
);
1435 void ath9k_p2p_beacon_sync(struct ath_softc
*sc
)
1438 ath9k_update_p2p_ps(sc
, sc
->p2p_ps_vif
->vif
);
1441 void ath9k_p2p_remove_vif(struct ath_softc
*sc
,
1442 struct ieee80211_vif
*vif
)
1444 struct ath_vif
*avp
= (void *)vif
->drv_priv
;
1446 spin_lock_bh(&sc
->sc_pcu_lock
);
1447 if (avp
== sc
->p2p_ps_vif
) {
1448 sc
->p2p_ps_vif
= NULL
;
1449 ath9k_update_p2p_ps_timer(sc
, NULL
);
1451 spin_unlock_bh(&sc
->sc_pcu_lock
);
1454 int ath9k_init_p2p(struct ath_softc
*sc
)
1456 sc
->p2p_ps_timer
= ath_gen_timer_alloc(sc
->sc_ah
, ath9k_p2p_ps_timer
,
1457 NULL
, sc
, AR_FIRST_NDP_TIMER
);
1458 if (!sc
->p2p_ps_timer
)
1464 void ath9k_deinit_p2p(struct ath_softc
*sc
)
1466 if (sc
->p2p_ps_timer
)
1467 ath_gen_timer_free(sc
->sc_ah
, sc
->p2p_ps_timer
);
1470 #endif /* CONFIG_ATH9K_CHANNEL_CONTEXT */