2 * Copyright (c) 2005-2011 Atheros Communications Inc.
3 * Copyright (c) 2011-2013 Qualcomm Atheros, Inc.
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 #include <linux/skbuff.h>
26 void ath10k_wmi_flush_tx(struct ath10k
*ar
)
30 lockdep_assert_held(&ar
->conf_mutex
);
32 if (ar
->state
== ATH10K_STATE_WEDGED
) {
33 ath10k_warn("wmi flush skipped - device is wedged anyway\n");
37 ret
= wait_event_timeout(ar
->wmi
.wq
,
38 atomic_read(&ar
->wmi
.pending_tx_count
) == 0,
40 if (atomic_read(&ar
->wmi
.pending_tx_count
) == 0)
47 ath10k_warn("wmi flush failed (%d)\n", ret
);
50 int ath10k_wmi_wait_for_service_ready(struct ath10k
*ar
)
53 ret
= wait_for_completion_timeout(&ar
->wmi
.service_ready
,
54 WMI_SERVICE_READY_TIMEOUT_HZ
);
58 int ath10k_wmi_wait_for_unified_ready(struct ath10k
*ar
)
61 ret
= wait_for_completion_timeout(&ar
->wmi
.unified_ready
,
62 WMI_UNIFIED_READY_TIMEOUT_HZ
);
66 static struct sk_buff
*ath10k_wmi_alloc_skb(u32 len
)
69 u32 round_len
= roundup(len
, 4);
71 skb
= ath10k_htc_alloc_skb(WMI_SKB_HEADROOM
+ round_len
);
75 skb_reserve(skb
, WMI_SKB_HEADROOM
);
76 if (!IS_ALIGNED((unsigned long)skb
->data
, 4))
77 ath10k_warn("Unaligned WMI skb\n");
79 skb_put(skb
, round_len
);
80 memset(skb
->data
, 0, round_len
);
85 static void ath10k_wmi_htc_tx_complete(struct ath10k
*ar
, struct sk_buff
*skb
)
89 if (atomic_sub_return(1, &ar
->wmi
.pending_tx_count
) == 0)
94 static int ath10k_wmi_cmd_send(struct ath10k
*ar
, struct sk_buff
*skb
,
95 enum wmi_cmd_id cmd_id
)
97 struct ath10k_skb_cb
*skb_cb
= ATH10K_SKB_CB(skb
);
98 struct wmi_cmd_hdr
*cmd_hdr
;
102 if (skb_push(skb
, sizeof(struct wmi_cmd_hdr
)) == NULL
)
105 cmd
|= SM(cmd_id
, WMI_CMD_HDR_CMD_ID
);
107 cmd_hdr
= (struct wmi_cmd_hdr
*)skb
->data
;
108 cmd_hdr
->cmd_id
= __cpu_to_le32(cmd
);
110 if (atomic_add_return(1, &ar
->wmi
.pending_tx_count
) >
111 WMI_MAX_PENDING_TX_COUNT
) {
112 /* avoid using up memory when FW hangs */
113 atomic_dec(&ar
->wmi
.pending_tx_count
);
117 memset(skb_cb
, 0, sizeof(*skb_cb
));
119 trace_ath10k_wmi_cmd(cmd_id
, skb
->data
, skb
->len
);
121 status
= ath10k_htc_send(&ar
->htc
, ar
->wmi
.eid
, skb
);
123 dev_kfree_skb_any(skb
);
124 atomic_dec(&ar
->wmi
.pending_tx_count
);
131 static int ath10k_wmi_event_scan(struct ath10k
*ar
, struct sk_buff
*skb
)
133 struct wmi_scan_event
*event
= (struct wmi_scan_event
*)skb
->data
;
134 enum wmi_scan_event_type event_type
;
135 enum wmi_scan_completion_reason reason
;
141 event_type
= __le32_to_cpu(event
->event_type
);
142 reason
= __le32_to_cpu(event
->reason
);
143 freq
= __le32_to_cpu(event
->channel_freq
);
144 req_id
= __le32_to_cpu(event
->scan_req_id
);
145 scan_id
= __le32_to_cpu(event
->scan_id
);
146 vdev_id
= __le32_to_cpu(event
->vdev_id
);
148 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_SCAN_EVENTID\n");
149 ath10k_dbg(ATH10K_DBG_WMI
,
150 "scan event type %d reason %d freq %d req_id %d "
151 "scan_id %d vdev_id %d\n",
152 event_type
, reason
, freq
, req_id
, scan_id
, vdev_id
);
154 spin_lock_bh(&ar
->data_lock
);
156 switch (event_type
) {
157 case WMI_SCAN_EVENT_STARTED
:
158 ath10k_dbg(ATH10K_DBG_WMI
, "SCAN_EVENT_STARTED\n");
159 if (ar
->scan
.in_progress
&& ar
->scan
.is_roc
)
160 ieee80211_ready_on_channel(ar
->hw
);
162 complete(&ar
->scan
.started
);
164 case WMI_SCAN_EVENT_COMPLETED
:
165 ath10k_dbg(ATH10K_DBG_WMI
, "SCAN_EVENT_COMPLETED\n");
167 case WMI_SCAN_REASON_COMPLETED
:
168 ath10k_dbg(ATH10K_DBG_WMI
, "SCAN_REASON_COMPLETED\n");
170 case WMI_SCAN_REASON_CANCELLED
:
171 ath10k_dbg(ATH10K_DBG_WMI
, "SCAN_REASON_CANCELED\n");
173 case WMI_SCAN_REASON_PREEMPTED
:
174 ath10k_dbg(ATH10K_DBG_WMI
, "SCAN_REASON_PREEMPTED\n");
176 case WMI_SCAN_REASON_TIMEDOUT
:
177 ath10k_dbg(ATH10K_DBG_WMI
, "SCAN_REASON_TIMEDOUT\n");
183 ar
->scan_channel
= NULL
;
184 if (!ar
->scan
.in_progress
) {
185 ath10k_warn("no scan requested, ignoring\n");
189 if (ar
->scan
.is_roc
) {
190 ath10k_offchan_tx_purge(ar
);
192 if (!ar
->scan
.aborting
)
193 ieee80211_remain_on_channel_expired(ar
->hw
);
195 ieee80211_scan_completed(ar
->hw
, ar
->scan
.aborting
);
198 del_timer(&ar
->scan
.timeout
);
199 complete_all(&ar
->scan
.completed
);
200 ar
->scan
.in_progress
= false;
202 case WMI_SCAN_EVENT_BSS_CHANNEL
:
203 ath10k_dbg(ATH10K_DBG_WMI
, "SCAN_EVENT_BSS_CHANNEL\n");
204 ar
->scan_channel
= NULL
;
206 case WMI_SCAN_EVENT_FOREIGN_CHANNEL
:
207 ath10k_dbg(ATH10K_DBG_WMI
, "SCAN_EVENT_FOREIGN_CHANNEL\n");
208 ar
->scan_channel
= ieee80211_get_channel(ar
->hw
->wiphy
, freq
);
209 if (ar
->scan
.in_progress
&& ar
->scan
.is_roc
&&
210 ar
->scan
.roc_freq
== freq
) {
211 complete(&ar
->scan
.on_channel
);
214 case WMI_SCAN_EVENT_DEQUEUED
:
215 ath10k_dbg(ATH10K_DBG_WMI
, "SCAN_EVENT_DEQUEUED\n");
217 case WMI_SCAN_EVENT_PREEMPTED
:
218 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_SCAN_EVENT_PREEMPTED\n");
220 case WMI_SCAN_EVENT_START_FAILED
:
221 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_SCAN_EVENT_START_FAILED\n");
227 spin_unlock_bh(&ar
->data_lock
);
231 static inline enum ieee80211_band
phy_mode_to_band(u32 phy_mode
)
233 enum ieee80211_band band
;
239 case MODE_11AC_VHT20
:
240 case MODE_11AC_VHT40
:
241 case MODE_11AC_VHT80
:
242 band
= IEEE80211_BAND_5GHZ
;
249 case MODE_11AC_VHT20_2G
:
250 case MODE_11AC_VHT40_2G
:
251 case MODE_11AC_VHT80_2G
:
253 band
= IEEE80211_BAND_2GHZ
;
259 static inline u8
get_rate_idx(u32 rate
, enum ieee80211_band band
)
305 if (band
== IEEE80211_BAND_5GHZ
) {
316 static int ath10k_wmi_event_mgmt_rx(struct ath10k
*ar
, struct sk_buff
*skb
)
318 struct wmi_mgmt_rx_event
*event
= (struct wmi_mgmt_rx_event
*)skb
->data
;
319 struct ieee80211_rx_status
*status
= IEEE80211_SKB_RXCB(skb
);
320 struct ieee80211_hdr
*hdr
;
329 channel
= __le32_to_cpu(event
->hdr
.channel
);
330 buf_len
= __le32_to_cpu(event
->hdr
.buf_len
);
331 rx_status
= __le32_to_cpu(event
->hdr
.status
);
332 snr
= __le32_to_cpu(event
->hdr
.snr
);
333 phy_mode
= __le32_to_cpu(event
->hdr
.phy_mode
);
334 rate
= __le32_to_cpu(event
->hdr
.rate
);
336 memset(status
, 0, sizeof(*status
));
338 ath10k_dbg(ATH10K_DBG_MGMT
,
339 "event mgmt rx status %08x\n", rx_status
);
341 if (rx_status
& WMI_RX_STATUS_ERR_DECRYPT
) {
346 if (rx_status
& WMI_RX_STATUS_ERR_KEY_CACHE_MISS
) {
351 if (rx_status
& WMI_RX_STATUS_ERR_CRC
)
352 status
->flag
|= RX_FLAG_FAILED_FCS_CRC
;
353 if (rx_status
& WMI_RX_STATUS_ERR_MIC
)
354 status
->flag
|= RX_FLAG_MMIC_ERROR
;
356 status
->band
= phy_mode_to_band(phy_mode
);
357 status
->freq
= ieee80211_channel_to_frequency(channel
, status
->band
);
358 status
->signal
= snr
+ ATH10K_DEFAULT_NOISE_FLOOR
;
359 status
->rate_idx
= get_rate_idx(rate
, status
->band
);
361 skb_pull(skb
, sizeof(event
->hdr
));
363 hdr
= (struct ieee80211_hdr
*)skb
->data
;
364 fc
= le16_to_cpu(hdr
->frame_control
);
366 if (fc
& IEEE80211_FCTL_PROTECTED
) {
367 status
->flag
|= RX_FLAG_DECRYPTED
| RX_FLAG_IV_STRIPPED
|
368 RX_FLAG_MMIC_STRIPPED
;
369 hdr
->frame_control
= __cpu_to_le16(fc
&
370 ~IEEE80211_FCTL_PROTECTED
);
373 ath10k_dbg(ATH10K_DBG_MGMT
,
374 "event mgmt rx skb %p len %d ftype %02x stype %02x\n",
376 fc
& IEEE80211_FCTL_FTYPE
, fc
& IEEE80211_FCTL_STYPE
);
378 ath10k_dbg(ATH10K_DBG_MGMT
,
379 "event mgmt rx freq %d band %d snr %d, rate_idx %d\n",
380 status
->freq
, status
->band
, status
->signal
,
384 * packets from HTC come aligned to 4byte boundaries
385 * because they can originally come in along with a trailer
387 skb_trim(skb
, buf_len
);
389 ieee80211_rx(ar
->hw
, skb
);
393 static int freq_to_idx(struct ath10k
*ar
, int freq
)
395 struct ieee80211_supported_band
*sband
;
396 int band
, ch
, idx
= 0;
398 for (band
= IEEE80211_BAND_2GHZ
; band
< IEEE80211_NUM_BANDS
; band
++) {
399 sband
= ar
->hw
->wiphy
->bands
[band
];
403 for (ch
= 0; ch
< sband
->n_channels
; ch
++, idx
++)
404 if (sband
->channels
[ch
].center_freq
== freq
)
412 static void ath10k_wmi_event_chan_info(struct ath10k
*ar
, struct sk_buff
*skb
)
414 struct wmi_chan_info_event
*ev
;
415 struct survey_info
*survey
;
416 u32 err_code
, freq
, cmd_flags
, noise_floor
, rx_clear_count
, cycle_count
;
419 ev
= (struct wmi_chan_info_event
*)skb
->data
;
421 err_code
= __le32_to_cpu(ev
->err_code
);
422 freq
= __le32_to_cpu(ev
->freq
);
423 cmd_flags
= __le32_to_cpu(ev
->cmd_flags
);
424 noise_floor
= __le32_to_cpu(ev
->noise_floor
);
425 rx_clear_count
= __le32_to_cpu(ev
->rx_clear_count
);
426 cycle_count
= __le32_to_cpu(ev
->cycle_count
);
428 ath10k_dbg(ATH10K_DBG_WMI
,
429 "chan info err_code %d freq %d cmd_flags %d noise_floor %d rx_clear_count %d cycle_count %d\n",
430 err_code
, freq
, cmd_flags
, noise_floor
, rx_clear_count
,
433 spin_lock_bh(&ar
->data_lock
);
435 if (!ar
->scan
.in_progress
) {
436 ath10k_warn("chan info event without a scan request?\n");
440 idx
= freq_to_idx(ar
, freq
);
441 if (idx
>= ARRAY_SIZE(ar
->survey
)) {
442 ath10k_warn("chan info: invalid frequency %d (idx %d out of bounds)\n",
447 if (cmd_flags
& WMI_CHAN_INFO_FLAG_COMPLETE
) {
448 /* During scanning chan info is reported twice for each
449 * visited channel. The reported cycle count is global
450 * and per-channel cycle count must be calculated */
452 cycle_count
-= ar
->survey_last_cycle_count
;
453 rx_clear_count
-= ar
->survey_last_rx_clear_count
;
455 survey
= &ar
->survey
[idx
];
456 survey
->channel_time
= WMI_CHAN_INFO_MSEC(cycle_count
);
457 survey
->channel_time_rx
= WMI_CHAN_INFO_MSEC(rx_clear_count
);
458 survey
->noise
= noise_floor
;
459 survey
->filled
= SURVEY_INFO_CHANNEL_TIME
|
460 SURVEY_INFO_CHANNEL_TIME_RX
|
461 SURVEY_INFO_NOISE_DBM
;
464 ar
->survey_last_rx_clear_count
= rx_clear_count
;
465 ar
->survey_last_cycle_count
= cycle_count
;
468 spin_unlock_bh(&ar
->data_lock
);
471 static void ath10k_wmi_event_echo(struct ath10k
*ar
, struct sk_buff
*skb
)
473 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_ECHO_EVENTID\n");
476 static void ath10k_wmi_event_debug_mesg(struct ath10k
*ar
, struct sk_buff
*skb
)
478 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_DEBUG_MESG_EVENTID\n");
481 static void ath10k_wmi_event_update_stats(struct ath10k
*ar
,
484 struct wmi_stats_event
*ev
= (struct wmi_stats_event
*)skb
->data
;
486 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_UPDATE_STATS_EVENTID\n");
488 ath10k_debug_read_target_stats(ar
, ev
);
491 static void ath10k_wmi_event_vdev_start_resp(struct ath10k
*ar
,
494 struct wmi_vdev_start_response_event
*ev
;
496 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_VDEV_START_RESP_EVENTID\n");
498 ev
= (struct wmi_vdev_start_response_event
*)skb
->data
;
500 if (WARN_ON(__le32_to_cpu(ev
->status
)))
503 complete(&ar
->vdev_setup_done
);
506 static void ath10k_wmi_event_vdev_stopped(struct ath10k
*ar
,
509 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_VDEV_STOPPED_EVENTID\n");
510 complete(&ar
->vdev_setup_done
);
513 static void ath10k_wmi_event_peer_sta_kickout(struct ath10k
*ar
,
516 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_PEER_STA_KICKOUT_EVENTID\n");
522 * We don't report to mac80211 sleep state of connected
523 * stations. Due to this mac80211 can't fill in TIM IE
526 * I know of no way of getting nullfunc frames that contain
527 * sleep transition from connected stations - these do not
528 * seem to be sent from the target to the host. There also
529 * doesn't seem to be a dedicated event for that. So the
530 * only way left to do this would be to read tim_bitmap
533 * We could probably try using tim_bitmap from SWBA to tell
534 * mac80211 which stations are asleep and which are not. The
535 * problem here is calling mac80211 functions so many times
536 * could take too long and make us miss the time to submit
537 * the beacon to the target.
539 * So as a workaround we try to extend the TIM IE if there
540 * is unicast buffered for stations with aid > 7 and fill it
543 static void ath10k_wmi_update_tim(struct ath10k
*ar
,
544 struct ath10k_vif
*arvif
,
546 struct wmi_bcn_info
*bcn_info
)
548 struct ieee80211_hdr
*hdr
= (struct ieee80211_hdr
*)bcn
->data
;
549 struct ieee80211_tim_ie
*tim
;
553 /* if next SWBA has no tim_changed the tim_bitmap is garbage.
554 * we must copy the bitmap upon change and reuse it later */
555 if (__le32_to_cpu(bcn_info
->tim_info
.tim_changed
)) {
558 BUILD_BUG_ON(sizeof(arvif
->u
.ap
.tim_bitmap
) !=
559 sizeof(bcn_info
->tim_info
.tim_bitmap
));
561 for (i
= 0; i
< sizeof(arvif
->u
.ap
.tim_bitmap
); i
++) {
562 __le32 t
= bcn_info
->tim_info
.tim_bitmap
[i
/ 4];
563 u32 v
= __le32_to_cpu(t
);
564 arvif
->u
.ap
.tim_bitmap
[i
] = (v
>> ((i
% 4) * 8)) & 0xFF;
567 /* FW reports either length 0 or 16
568 * so we calculate this on our own */
569 arvif
->u
.ap
.tim_len
= 0;
570 for (i
= 0; i
< sizeof(arvif
->u
.ap
.tim_bitmap
); i
++)
571 if (arvif
->u
.ap
.tim_bitmap
[i
])
572 arvif
->u
.ap
.tim_len
= i
;
574 arvif
->u
.ap
.tim_len
++;
578 ies
+= ieee80211_hdrlen(hdr
->frame_control
);
579 ies
+= 12; /* fixed parameters */
581 ie
= (u8
*)cfg80211_find_ie(WLAN_EID_TIM
, ies
,
582 (u8
*)skb_tail_pointer(bcn
) - ies
);
584 if (arvif
->vdev_type
!= WMI_VDEV_TYPE_IBSS
)
585 ath10k_warn("no tim ie found;\n");
589 tim
= (void *)ie
+ 2;
591 pvm_len
= ie_len
- 3; /* exclude dtim count, dtim period, bmap ctl */
593 if (pvm_len
< arvif
->u
.ap
.tim_len
) {
594 int expand_size
= sizeof(arvif
->u
.ap
.tim_bitmap
) - pvm_len
;
595 int move_size
= skb_tail_pointer(bcn
) - (ie
+ 2 + ie_len
);
596 void *next_ie
= ie
+ 2 + ie_len
;
598 if (skb_put(bcn
, expand_size
)) {
599 memmove(next_ie
+ expand_size
, next_ie
, move_size
);
601 ie
[1] += expand_size
;
602 ie_len
+= expand_size
;
603 pvm_len
+= expand_size
;
605 ath10k_warn("tim expansion failed\n");
609 if (pvm_len
> sizeof(arvif
->u
.ap
.tim_bitmap
)) {
610 ath10k_warn("tim pvm length is too great (%d)\n", pvm_len
);
614 tim
->bitmap_ctrl
= !!__le32_to_cpu(bcn_info
->tim_info
.tim_mcast
);
615 memcpy(tim
->virtual_map
, arvif
->u
.ap
.tim_bitmap
, pvm_len
);
617 ath10k_dbg(ATH10K_DBG_MGMT
, "dtim %d/%d mcast %d pvmlen %d\n",
618 tim
->dtim_count
, tim
->dtim_period
,
619 tim
->bitmap_ctrl
, pvm_len
);
622 static void ath10k_p2p_fill_noa_ie(u8
*data
, u32 len
,
623 struct wmi_p2p_noa_info
*noa
)
625 struct ieee80211_p2p_noa_attr
*noa_attr
;
626 u8 ctwindow_oppps
= noa
->ctwindow_oppps
;
627 u8 ctwindow
= ctwindow_oppps
>> WMI_P2P_OPPPS_CTWINDOW_OFFSET
;
628 bool oppps
= !!(ctwindow_oppps
& WMI_P2P_OPPPS_ENABLE_BIT
);
629 __le16
*noa_attr_len
;
631 u8 noa_descriptors
= noa
->num_descriptors
;
635 data
[0] = WLAN_EID_VENDOR_SPECIFIC
;
637 data
[2] = (WLAN_OUI_WFA
>> 16) & 0xff;
638 data
[3] = (WLAN_OUI_WFA
>> 8) & 0xff;
639 data
[4] = (WLAN_OUI_WFA
>> 0) & 0xff;
640 data
[5] = WLAN_OUI_TYPE_WFA_P2P
;
643 data
[6] = IEEE80211_P2P_ATTR_ABSENCE_NOTICE
;
644 noa_attr_len
= (__le16
*)&data
[7]; /* 2 bytes */
645 noa_attr
= (struct ieee80211_p2p_noa_attr
*)&data
[9];
647 noa_attr
->index
= noa
->index
;
648 noa_attr
->oppps_ctwindow
= ctwindow
;
650 noa_attr
->oppps_ctwindow
|= IEEE80211_P2P_OPPPS_ENABLE_BIT
;
652 for (i
= 0; i
< noa_descriptors
; i
++) {
653 noa_attr
->desc
[i
].count
=
654 __le32_to_cpu(noa
->descriptors
[i
].type_count
);
655 noa_attr
->desc
[i
].duration
= noa
->descriptors
[i
].duration
;
656 noa_attr
->desc
[i
].interval
= noa
->descriptors
[i
].interval
;
657 noa_attr
->desc
[i
].start_time
= noa
->descriptors
[i
].start_time
;
660 attr_len
= 2; /* index + oppps_ctwindow */
661 attr_len
+= noa_descriptors
* sizeof(struct ieee80211_p2p_noa_desc
);
662 *noa_attr_len
= __cpu_to_le16(attr_len
);
665 static u32
ath10k_p2p_calc_noa_ie_len(struct wmi_p2p_noa_info
*noa
)
668 u8 noa_descriptors
= noa
->num_descriptors
;
669 u8 opp_ps_info
= noa
->ctwindow_oppps
;
670 bool opps_enabled
= !!(opp_ps_info
& WMI_P2P_OPPPS_ENABLE_BIT
);
673 if (!noa_descriptors
&& !opps_enabled
)
676 len
+= 1 + 1 + 4; /* EID + len + OUI */
677 len
+= 1 + 2; /* noa attr + attr len */
678 len
+= 1 + 1; /* index + oppps_ctwindow */
679 len
+= noa_descriptors
* sizeof(struct ieee80211_p2p_noa_desc
);
684 static void ath10k_wmi_update_noa(struct ath10k
*ar
, struct ath10k_vif
*arvif
,
686 struct wmi_bcn_info
*bcn_info
)
688 struct wmi_p2p_noa_info
*noa
= &bcn_info
->p2p_noa_info
;
689 u8
*new_data
, *old_data
= arvif
->u
.ap
.noa_data
;
692 if (arvif
->vdev_subtype
!= WMI_VDEV_SUBTYPE_P2P_GO
)
695 ath10k_dbg(ATH10K_DBG_MGMT
, "noa changed: %d\n", noa
->changed
);
696 if (noa
->changed
& WMI_P2P_NOA_CHANGED_BIT
) {
697 new_len
= ath10k_p2p_calc_noa_ie_len(noa
);
701 new_data
= kmalloc(new_len
, GFP_ATOMIC
);
705 ath10k_p2p_fill_noa_ie(new_data
, new_len
, noa
);
707 spin_lock_bh(&ar
->data_lock
);
708 arvif
->u
.ap
.noa_data
= new_data
;
709 arvif
->u
.ap
.noa_len
= new_len
;
710 spin_unlock_bh(&ar
->data_lock
);
714 if (arvif
->u
.ap
.noa_data
)
715 if (!pskb_expand_head(bcn
, 0, arvif
->u
.ap
.noa_len
, GFP_ATOMIC
))
716 memcpy(skb_put(bcn
, arvif
->u
.ap
.noa_len
),
717 arvif
->u
.ap
.noa_data
,
718 arvif
->u
.ap
.noa_len
);
722 spin_lock_bh(&ar
->data_lock
);
723 arvif
->u
.ap
.noa_data
= NULL
;
724 arvif
->u
.ap
.noa_len
= 0;
725 spin_unlock_bh(&ar
->data_lock
);
730 static void ath10k_wmi_event_host_swba(struct ath10k
*ar
, struct sk_buff
*skb
)
732 struct wmi_host_swba_event
*ev
;
735 struct wmi_bcn_info
*bcn_info
;
736 struct ath10k_vif
*arvif
;
737 struct wmi_bcn_tx_arg arg
;
742 ath10k_dbg(ATH10K_DBG_MGMT
, "WMI_HOST_SWBA_EVENTID\n");
744 ev
= (struct wmi_host_swba_event
*)skb
->data
;
745 map
= __le32_to_cpu(ev
->vdev_map
);
747 ath10k_dbg(ATH10K_DBG_MGMT
, "host swba:\n"
751 for (; map
; map
>>= 1, vdev_id
++) {
757 if (i
>= WMI_MAX_AP_VDEV
) {
758 ath10k_warn("swba has corrupted vdev map\n");
762 bcn_info
= &ev
->bcn_info
[i
];
764 ath10k_dbg(ATH10K_DBG_MGMT
,
769 "--tim_num_ps_pending %d\n"
770 "--tim_bitmap 0x%08x%08x%08x%08x\n",
772 __le32_to_cpu(bcn_info
->tim_info
.tim_len
),
773 __le32_to_cpu(bcn_info
->tim_info
.tim_mcast
),
774 __le32_to_cpu(bcn_info
->tim_info
.tim_changed
),
775 __le32_to_cpu(bcn_info
->tim_info
.tim_num_ps_pending
),
776 __le32_to_cpu(bcn_info
->tim_info
.tim_bitmap
[3]),
777 __le32_to_cpu(bcn_info
->tim_info
.tim_bitmap
[2]),
778 __le32_to_cpu(bcn_info
->tim_info
.tim_bitmap
[1]),
779 __le32_to_cpu(bcn_info
->tim_info
.tim_bitmap
[0]));
781 arvif
= ath10k_get_arvif(ar
, vdev_id
);
783 ath10k_warn("no vif for vdev_id %d found\n", vdev_id
);
787 bcn
= ieee80211_beacon_get(ar
->hw
, arvif
->vif
);
789 ath10k_warn("could not get mac80211 beacon\n");
793 ath10k_tx_h_seq_no(bcn
);
794 ath10k_wmi_update_tim(ar
, arvif
, bcn
, bcn_info
);
795 ath10k_wmi_update_noa(ar
, arvif
, bcn
, bcn_info
);
797 arg
.vdev_id
= arvif
->vdev_id
;
801 arg
.bcn_len
= bcn
->len
;
803 ret
= ath10k_wmi_beacon_send(ar
, &arg
);
805 ath10k_warn("could not send beacon (%d)\n", ret
);
807 dev_kfree_skb_any(bcn
);
811 static void ath10k_wmi_event_tbttoffset_update(struct ath10k
*ar
,
814 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_TBTTOFFSET_UPDATE_EVENTID\n");
817 static void ath10k_wmi_event_phyerr(struct ath10k
*ar
, struct sk_buff
*skb
)
819 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_PHYERR_EVENTID\n");
822 static void ath10k_wmi_event_roam(struct ath10k
*ar
, struct sk_buff
*skb
)
824 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_ROAM_EVENTID\n");
827 static void ath10k_wmi_event_profile_match(struct ath10k
*ar
,
830 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_PROFILE_MATCH\n");
833 static void ath10k_wmi_event_debug_print(struct ath10k
*ar
,
836 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_DEBUG_PRINT_EVENTID\n");
839 static void ath10k_wmi_event_pdev_qvit(struct ath10k
*ar
, struct sk_buff
*skb
)
841 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_PDEV_QVIT_EVENTID\n");
844 static void ath10k_wmi_event_wlan_profile_data(struct ath10k
*ar
,
847 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_WLAN_PROFILE_DATA_EVENTID\n");
850 static void ath10k_wmi_event_rtt_measurement_report(struct ath10k
*ar
,
853 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_RTT_MEASUREMENT_REPORT_EVENTID\n");
856 static void ath10k_wmi_event_tsf_measurement_report(struct ath10k
*ar
,
859 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_TSF_MEASUREMENT_REPORT_EVENTID\n");
862 static void ath10k_wmi_event_rtt_error_report(struct ath10k
*ar
,
865 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_RTT_ERROR_REPORT_EVENTID\n");
868 static void ath10k_wmi_event_wow_wakeup_host(struct ath10k
*ar
,
871 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_WOW_WAKEUP_HOST_EVENTID\n");
874 static void ath10k_wmi_event_dcs_interference(struct ath10k
*ar
,
877 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_DCS_INTERFERENCE_EVENTID\n");
880 static void ath10k_wmi_event_pdev_tpc_config(struct ath10k
*ar
,
883 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_PDEV_TPC_CONFIG_EVENTID\n");
886 static void ath10k_wmi_event_pdev_ftm_intg(struct ath10k
*ar
,
889 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_PDEV_FTM_INTG_EVENTID\n");
892 static void ath10k_wmi_event_gtk_offload_status(struct ath10k
*ar
,
895 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_GTK_OFFLOAD_STATUS_EVENTID\n");
898 static void ath10k_wmi_event_gtk_rekey_fail(struct ath10k
*ar
,
901 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_GTK_REKEY_FAIL_EVENTID\n");
904 static void ath10k_wmi_event_delba_complete(struct ath10k
*ar
,
907 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_TX_DELBA_COMPLETE_EVENTID\n");
910 static void ath10k_wmi_event_addba_complete(struct ath10k
*ar
,
913 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_TX_ADDBA_COMPLETE_EVENTID\n");
916 static void ath10k_wmi_event_vdev_install_key_complete(struct ath10k
*ar
,
919 ath10k_dbg(ATH10K_DBG_WMI
, "WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID\n");
922 static void ath10k_wmi_service_ready_event_rx(struct ath10k
*ar
,
925 struct wmi_service_ready_event
*ev
= (void *)skb
->data
;
927 if (skb
->len
< sizeof(*ev
)) {
928 ath10k_warn("Service ready event was %d B but expected %zu B. Wrong firmware version?\n",
929 skb
->len
, sizeof(*ev
));
933 ar
->hw_min_tx_power
= __le32_to_cpu(ev
->hw_min_tx_power
);
934 ar
->hw_max_tx_power
= __le32_to_cpu(ev
->hw_max_tx_power
);
935 ar
->ht_cap_info
= __le32_to_cpu(ev
->ht_cap_info
);
936 ar
->vht_cap_info
= __le32_to_cpu(ev
->vht_cap_info
);
937 ar
->fw_version_major
=
938 (__le32_to_cpu(ev
->sw_version
) & 0xff000000) >> 24;
939 ar
->fw_version_minor
= (__le32_to_cpu(ev
->sw_version
) & 0x00ffffff);
940 ar
->fw_version_release
=
941 (__le32_to_cpu(ev
->sw_version_1
) & 0xffff0000) >> 16;
942 ar
->fw_version_build
= (__le32_to_cpu(ev
->sw_version_1
) & 0x0000ffff);
943 ar
->phy_capability
= __le32_to_cpu(ev
->phy_capability
);
944 ar
->num_rf_chains
= __le32_to_cpu(ev
->num_rf_chains
);
946 if (ar
->num_rf_chains
> WMI_MAX_SPATIAL_STREAM
) {
947 ath10k_warn("hardware advertises support for more spatial streams than it should (%d > %d)\n",
948 ar
->num_rf_chains
, WMI_MAX_SPATIAL_STREAM
);
949 ar
->num_rf_chains
= WMI_MAX_SPATIAL_STREAM
;
952 ar
->ath_common
.regulatory
.current_rd
=
953 __le32_to_cpu(ev
->hal_reg_capabilities
.eeprom_rd
);
955 ath10k_debug_read_service_map(ar
, ev
->wmi_service_bitmap
,
956 sizeof(ev
->wmi_service_bitmap
));
958 if (strlen(ar
->hw
->wiphy
->fw_version
) == 0) {
959 snprintf(ar
->hw
->wiphy
->fw_version
,
960 sizeof(ar
->hw
->wiphy
->fw_version
),
962 ar
->fw_version_major
,
963 ar
->fw_version_minor
,
964 ar
->fw_version_release
,
965 ar
->fw_version_build
);
968 /* FIXME: it probably should be better to support this */
969 if (__le32_to_cpu(ev
->num_mem_reqs
) > 0) {
970 ath10k_warn("target requested %d memory chunks; ignoring\n",
971 __le32_to_cpu(ev
->num_mem_reqs
));
974 ath10k_dbg(ATH10K_DBG_WMI
,
975 "wmi event service ready sw_ver 0x%08x sw_ver1 0x%08x abi_ver %u phy_cap 0x%08x ht_cap 0x%08x vht_cap 0x%08x vht_supp_msc 0x%08x sys_cap_info 0x%08x mem_reqs %u num_rf_chains %u\n",
976 __le32_to_cpu(ev
->sw_version
),
977 __le32_to_cpu(ev
->sw_version_1
),
978 __le32_to_cpu(ev
->abi_version
),
979 __le32_to_cpu(ev
->phy_capability
),
980 __le32_to_cpu(ev
->ht_cap_info
),
981 __le32_to_cpu(ev
->vht_cap_info
),
982 __le32_to_cpu(ev
->vht_supp_mcs
),
983 __le32_to_cpu(ev
->sys_cap_info
),
984 __le32_to_cpu(ev
->num_mem_reqs
),
985 __le32_to_cpu(ev
->num_rf_chains
));
987 complete(&ar
->wmi
.service_ready
);
990 static int ath10k_wmi_ready_event_rx(struct ath10k
*ar
, struct sk_buff
*skb
)
992 struct wmi_ready_event
*ev
= (struct wmi_ready_event
*)skb
->data
;
994 if (WARN_ON(skb
->len
< sizeof(*ev
)))
997 memcpy(ar
->mac_addr
, ev
->mac_addr
.addr
, ETH_ALEN
);
999 ath10k_dbg(ATH10K_DBG_WMI
,
1000 "wmi event ready sw_version %u abi_version %u mac_addr %pM status %d\n",
1001 __le32_to_cpu(ev
->sw_version
),
1002 __le32_to_cpu(ev
->abi_version
),
1004 __le32_to_cpu(ev
->status
));
1006 complete(&ar
->wmi
.unified_ready
);
1010 static void ath10k_wmi_event_process(struct ath10k
*ar
, struct sk_buff
*skb
)
1012 struct wmi_cmd_hdr
*cmd_hdr
;
1013 enum wmi_event_id id
;
1016 cmd_hdr
= (struct wmi_cmd_hdr
*)skb
->data
;
1017 id
= MS(__le32_to_cpu(cmd_hdr
->cmd_id
), WMI_CMD_HDR_CMD_ID
);
1019 if (skb_pull(skb
, sizeof(struct wmi_cmd_hdr
)) == NULL
)
1024 trace_ath10k_wmi_event(id
, skb
->data
, skb
->len
);
1027 case WMI_MGMT_RX_EVENTID
:
1028 ath10k_wmi_event_mgmt_rx(ar
, skb
);
1029 /* mgmt_rx() owns the skb now! */
1031 case WMI_SCAN_EVENTID
:
1032 ath10k_wmi_event_scan(ar
, skb
);
1034 case WMI_CHAN_INFO_EVENTID
:
1035 ath10k_wmi_event_chan_info(ar
, skb
);
1037 case WMI_ECHO_EVENTID
:
1038 ath10k_wmi_event_echo(ar
, skb
);
1040 case WMI_DEBUG_MESG_EVENTID
:
1041 ath10k_wmi_event_debug_mesg(ar
, skb
);
1043 case WMI_UPDATE_STATS_EVENTID
:
1044 ath10k_wmi_event_update_stats(ar
, skb
);
1046 case WMI_VDEV_START_RESP_EVENTID
:
1047 ath10k_wmi_event_vdev_start_resp(ar
, skb
);
1049 case WMI_VDEV_STOPPED_EVENTID
:
1050 ath10k_wmi_event_vdev_stopped(ar
, skb
);
1052 case WMI_PEER_STA_KICKOUT_EVENTID
:
1053 ath10k_wmi_event_peer_sta_kickout(ar
, skb
);
1055 case WMI_HOST_SWBA_EVENTID
:
1056 ath10k_wmi_event_host_swba(ar
, skb
);
1058 case WMI_TBTTOFFSET_UPDATE_EVENTID
:
1059 ath10k_wmi_event_tbttoffset_update(ar
, skb
);
1061 case WMI_PHYERR_EVENTID
:
1062 ath10k_wmi_event_phyerr(ar
, skb
);
1064 case WMI_ROAM_EVENTID
:
1065 ath10k_wmi_event_roam(ar
, skb
);
1067 case WMI_PROFILE_MATCH
:
1068 ath10k_wmi_event_profile_match(ar
, skb
);
1070 case WMI_DEBUG_PRINT_EVENTID
:
1071 ath10k_wmi_event_debug_print(ar
, skb
);
1073 case WMI_PDEV_QVIT_EVENTID
:
1074 ath10k_wmi_event_pdev_qvit(ar
, skb
);
1076 case WMI_WLAN_PROFILE_DATA_EVENTID
:
1077 ath10k_wmi_event_wlan_profile_data(ar
, skb
);
1079 case WMI_RTT_MEASUREMENT_REPORT_EVENTID
:
1080 ath10k_wmi_event_rtt_measurement_report(ar
, skb
);
1082 case WMI_TSF_MEASUREMENT_REPORT_EVENTID
:
1083 ath10k_wmi_event_tsf_measurement_report(ar
, skb
);
1085 case WMI_RTT_ERROR_REPORT_EVENTID
:
1086 ath10k_wmi_event_rtt_error_report(ar
, skb
);
1088 case WMI_WOW_WAKEUP_HOST_EVENTID
:
1089 ath10k_wmi_event_wow_wakeup_host(ar
, skb
);
1091 case WMI_DCS_INTERFERENCE_EVENTID
:
1092 ath10k_wmi_event_dcs_interference(ar
, skb
);
1094 case WMI_PDEV_TPC_CONFIG_EVENTID
:
1095 ath10k_wmi_event_pdev_tpc_config(ar
, skb
);
1097 case WMI_PDEV_FTM_INTG_EVENTID
:
1098 ath10k_wmi_event_pdev_ftm_intg(ar
, skb
);
1100 case WMI_GTK_OFFLOAD_STATUS_EVENTID
:
1101 ath10k_wmi_event_gtk_offload_status(ar
, skb
);
1103 case WMI_GTK_REKEY_FAIL_EVENTID
:
1104 ath10k_wmi_event_gtk_rekey_fail(ar
, skb
);
1106 case WMI_TX_DELBA_COMPLETE_EVENTID
:
1107 ath10k_wmi_event_delba_complete(ar
, skb
);
1109 case WMI_TX_ADDBA_COMPLETE_EVENTID
:
1110 ath10k_wmi_event_addba_complete(ar
, skb
);
1112 case WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID
:
1113 ath10k_wmi_event_vdev_install_key_complete(ar
, skb
);
1115 case WMI_SERVICE_READY_EVENTID
:
1116 ath10k_wmi_service_ready_event_rx(ar
, skb
);
1118 case WMI_READY_EVENTID
:
1119 ath10k_wmi_ready_event_rx(ar
, skb
);
1122 ath10k_warn("Unknown eventid: %d\n", id
);
1129 static void ath10k_wmi_event_work(struct work_struct
*work
)
1131 struct ath10k
*ar
= container_of(work
, struct ath10k
,
1132 wmi
.wmi_event_work
);
1133 struct sk_buff
*skb
;
1136 skb
= skb_dequeue(&ar
->wmi
.wmi_event_list
);
1140 ath10k_wmi_event_process(ar
, skb
);
1144 static void ath10k_wmi_process_rx(struct ath10k
*ar
, struct sk_buff
*skb
)
1146 struct wmi_cmd_hdr
*cmd_hdr
= (struct wmi_cmd_hdr
*)skb
->data
;
1147 enum wmi_event_id event_id
;
1149 event_id
= MS(__le32_to_cpu(cmd_hdr
->cmd_id
), WMI_CMD_HDR_CMD_ID
);
1151 /* some events require to be handled ASAP
1152 * thus can't be defered to a worker thread */
1154 case WMI_HOST_SWBA_EVENTID
:
1155 case WMI_MGMT_RX_EVENTID
:
1156 ath10k_wmi_event_process(ar
, skb
);
1162 skb_queue_tail(&ar
->wmi
.wmi_event_list
, skb
);
1163 queue_work(ar
->workqueue
, &ar
->wmi
.wmi_event_work
);
1166 /* WMI Initialization functions */
1167 int ath10k_wmi_attach(struct ath10k
*ar
)
1169 init_completion(&ar
->wmi
.service_ready
);
1170 init_completion(&ar
->wmi
.unified_ready
);
1171 init_waitqueue_head(&ar
->wmi
.wq
);
1173 skb_queue_head_init(&ar
->wmi
.wmi_event_list
);
1174 INIT_WORK(&ar
->wmi
.wmi_event_work
, ath10k_wmi_event_work
);
1179 void ath10k_wmi_detach(struct ath10k
*ar
)
1181 /* HTC should've drained the packets already */
1182 if (WARN_ON(atomic_read(&ar
->wmi
.pending_tx_count
) > 0))
1183 ath10k_warn("there are still pending packets\n");
1185 cancel_work_sync(&ar
->wmi
.wmi_event_work
);
1186 skb_queue_purge(&ar
->wmi
.wmi_event_list
);
1189 int ath10k_wmi_connect_htc_service(struct ath10k
*ar
)
1192 struct ath10k_htc_svc_conn_req conn_req
;
1193 struct ath10k_htc_svc_conn_resp conn_resp
;
1195 memset(&conn_req
, 0, sizeof(conn_req
));
1196 memset(&conn_resp
, 0, sizeof(conn_resp
));
1198 /* these fields are the same for all service endpoints */
1199 conn_req
.ep_ops
.ep_tx_complete
= ath10k_wmi_htc_tx_complete
;
1200 conn_req
.ep_ops
.ep_rx_complete
= ath10k_wmi_process_rx
;
1202 /* connect to control service */
1203 conn_req
.service_id
= ATH10K_HTC_SVC_ID_WMI_CONTROL
;
1205 status
= ath10k_htc_connect_service(&ar
->htc
, &conn_req
, &conn_resp
);
1207 ath10k_warn("failed to connect to WMI CONTROL service status: %d\n",
1212 ar
->wmi
.eid
= conn_resp
.eid
;
1216 int ath10k_wmi_pdev_set_regdomain(struct ath10k
*ar
, u16 rd
, u16 rd2g
,
1217 u16 rd5g
, u16 ctl2g
, u16 ctl5g
)
1219 struct wmi_pdev_set_regdomain_cmd
*cmd
;
1220 struct sk_buff
*skb
;
1222 skb
= ath10k_wmi_alloc_skb(sizeof(*cmd
));
1226 cmd
= (struct wmi_pdev_set_regdomain_cmd
*)skb
->data
;
1227 cmd
->reg_domain
= __cpu_to_le32(rd
);
1228 cmd
->reg_domain_2G
= __cpu_to_le32(rd2g
);
1229 cmd
->reg_domain_5G
= __cpu_to_le32(rd5g
);
1230 cmd
->conformance_test_limit_2G
= __cpu_to_le32(ctl2g
);
1231 cmd
->conformance_test_limit_5G
= __cpu_to_le32(ctl5g
);
1233 ath10k_dbg(ATH10K_DBG_WMI
,
1234 "wmi pdev regdomain rd %x rd2g %x rd5g %x ctl2g %x ctl5g %x\n",
1235 rd
, rd2g
, rd5g
, ctl2g
, ctl5g
);
1237 return ath10k_wmi_cmd_send(ar
, skb
, WMI_PDEV_SET_REGDOMAIN_CMDID
);
1240 int ath10k_wmi_pdev_set_channel(struct ath10k
*ar
,
1241 const struct wmi_channel_arg
*arg
)
1243 struct wmi_set_channel_cmd
*cmd
;
1244 struct sk_buff
*skb
;
1249 skb
= ath10k_wmi_alloc_skb(sizeof(*cmd
));
1253 cmd
= (struct wmi_set_channel_cmd
*)skb
->data
;
1254 cmd
->chan
.mhz
= __cpu_to_le32(arg
->freq
);
1255 cmd
->chan
.band_center_freq1
= __cpu_to_le32(arg
->freq
);
1256 cmd
->chan
.mode
= arg
->mode
;
1257 cmd
->chan
.min_power
= arg
->min_power
;
1258 cmd
->chan
.max_power
= arg
->max_power
;
1259 cmd
->chan
.reg_power
= arg
->max_reg_power
;
1260 cmd
->chan
.reg_classid
= arg
->reg_class_id
;
1261 cmd
->chan
.antenna_max
= arg
->max_antenna_gain
;
1263 ath10k_dbg(ATH10K_DBG_WMI
,
1264 "wmi set channel mode %d freq %d\n",
1265 arg
->mode
, arg
->freq
);
1267 return ath10k_wmi_cmd_send(ar
, skb
, WMI_PDEV_SET_CHANNEL_CMDID
);
1270 int ath10k_wmi_pdev_suspend_target(struct ath10k
*ar
)
1272 struct wmi_pdev_suspend_cmd
*cmd
;
1273 struct sk_buff
*skb
;
1275 skb
= ath10k_wmi_alloc_skb(sizeof(*cmd
));
1279 cmd
= (struct wmi_pdev_suspend_cmd
*)skb
->data
;
1280 cmd
->suspend_opt
= WMI_PDEV_SUSPEND
;
1282 return ath10k_wmi_cmd_send(ar
, skb
, WMI_PDEV_SUSPEND_CMDID
);
1285 int ath10k_wmi_pdev_resume_target(struct ath10k
*ar
)
1287 struct sk_buff
*skb
;
1289 skb
= ath10k_wmi_alloc_skb(0);
1293 return ath10k_wmi_cmd_send(ar
, skb
, WMI_PDEV_RESUME_CMDID
);
1296 int ath10k_wmi_pdev_set_param(struct ath10k
*ar
, enum wmi_pdev_param id
,
1299 struct wmi_pdev_set_param_cmd
*cmd
;
1300 struct sk_buff
*skb
;
1302 skb
= ath10k_wmi_alloc_skb(sizeof(*cmd
));
1306 cmd
= (struct wmi_pdev_set_param_cmd
*)skb
->data
;
1307 cmd
->param_id
= __cpu_to_le32(id
);
1308 cmd
->param_value
= __cpu_to_le32(value
);
1310 ath10k_dbg(ATH10K_DBG_WMI
, "wmi pdev set param %d value %d\n",
1312 return ath10k_wmi_cmd_send(ar
, skb
, WMI_PDEV_SET_PARAM_CMDID
);
1315 int ath10k_wmi_cmd_init(struct ath10k
*ar
)
1317 struct wmi_init_cmd
*cmd
;
1318 struct sk_buff
*buf
;
1319 struct wmi_resource_config config
= {};
1322 config
.num_vdevs
= __cpu_to_le32(TARGET_NUM_VDEVS
);
1323 config
.num_peers
= __cpu_to_le32(TARGET_NUM_PEERS
+ TARGET_NUM_VDEVS
);
1324 config
.num_offload_peers
= __cpu_to_le32(TARGET_NUM_OFFLOAD_PEERS
);
1326 config
.num_offload_reorder_bufs
=
1327 __cpu_to_le32(TARGET_NUM_OFFLOAD_REORDER_BUFS
);
1329 config
.num_peer_keys
= __cpu_to_le32(TARGET_NUM_PEER_KEYS
);
1330 config
.num_tids
= __cpu_to_le32(TARGET_NUM_TIDS
);
1331 config
.ast_skid_limit
= __cpu_to_le32(TARGET_AST_SKID_LIMIT
);
1332 config
.tx_chain_mask
= __cpu_to_le32(TARGET_TX_CHAIN_MASK
);
1333 config
.rx_chain_mask
= __cpu_to_le32(TARGET_RX_CHAIN_MASK
);
1334 config
.rx_timeout_pri_vo
= __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI
);
1335 config
.rx_timeout_pri_vi
= __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI
);
1336 config
.rx_timeout_pri_be
= __cpu_to_le32(TARGET_RX_TIMEOUT_LO_PRI
);
1337 config
.rx_timeout_pri_bk
= __cpu_to_le32(TARGET_RX_TIMEOUT_HI_PRI
);
1338 config
.rx_decap_mode
= __cpu_to_le32(TARGET_RX_DECAP_MODE
);
1340 config
.scan_max_pending_reqs
=
1341 __cpu_to_le32(TARGET_SCAN_MAX_PENDING_REQS
);
1343 config
.bmiss_offload_max_vdev
=
1344 __cpu_to_le32(TARGET_BMISS_OFFLOAD_MAX_VDEV
);
1346 config
.roam_offload_max_vdev
=
1347 __cpu_to_le32(TARGET_ROAM_OFFLOAD_MAX_VDEV
);
1349 config
.roam_offload_max_ap_profiles
=
1350 __cpu_to_le32(TARGET_ROAM_OFFLOAD_MAX_AP_PROFILES
);
1352 config
.num_mcast_groups
= __cpu_to_le32(TARGET_NUM_MCAST_GROUPS
);
1353 config
.num_mcast_table_elems
=
1354 __cpu_to_le32(TARGET_NUM_MCAST_TABLE_ELEMS
);
1356 config
.mcast2ucast_mode
= __cpu_to_le32(TARGET_MCAST2UCAST_MODE
);
1357 config
.tx_dbg_log_size
= __cpu_to_le32(TARGET_TX_DBG_LOG_SIZE
);
1358 config
.num_wds_entries
= __cpu_to_le32(TARGET_NUM_WDS_ENTRIES
);
1359 config
.dma_burst_size
= __cpu_to_le32(TARGET_DMA_BURST_SIZE
);
1360 config
.mac_aggr_delim
= __cpu_to_le32(TARGET_MAC_AGGR_DELIM
);
1362 val
= TARGET_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK
;
1363 config
.rx_skip_defrag_timeout_dup_detection_check
= __cpu_to_le32(val
);
1365 config
.vow_config
= __cpu_to_le32(TARGET_VOW_CONFIG
);
1367 config
.gtk_offload_max_vdev
=
1368 __cpu_to_le32(TARGET_GTK_OFFLOAD_MAX_VDEV
);
1370 config
.num_msdu_desc
= __cpu_to_le32(TARGET_NUM_MSDU_DESC
);
1371 config
.max_frag_entries
= __cpu_to_le32(TARGET_MAX_FRAG_ENTRIES
);
1373 buf
= ath10k_wmi_alloc_skb(sizeof(*cmd
));
1377 cmd
= (struct wmi_init_cmd
*)buf
->data
;
1378 cmd
->num_host_mem_chunks
= 0;
1379 memcpy(&cmd
->resource_config
, &config
, sizeof(config
));
1381 ath10k_dbg(ATH10K_DBG_WMI
, "wmi init\n");
1382 return ath10k_wmi_cmd_send(ar
, buf
, WMI_INIT_CMDID
);
1385 static int ath10k_wmi_start_scan_calc_len(const struct wmi_start_scan_arg
*arg
)
1389 len
= sizeof(struct wmi_start_scan_cmd
);
1394 if (arg
->ie_len
> WLAN_SCAN_PARAMS_MAX_IE_LEN
)
1397 len
+= sizeof(struct wmi_ie_data
);
1398 len
+= roundup(arg
->ie_len
, 4);
1401 if (arg
->n_channels
) {
1404 if (arg
->n_channels
> ARRAY_SIZE(arg
->channels
))
1407 len
+= sizeof(struct wmi_chan_list
);
1408 len
+= sizeof(__le32
) * arg
->n_channels
;
1414 if (arg
->n_ssids
> WLAN_SCAN_PARAMS_MAX_SSID
)
1417 len
+= sizeof(struct wmi_ssid_list
);
1418 len
+= sizeof(struct wmi_ssid
) * arg
->n_ssids
;
1421 if (arg
->n_bssids
) {
1424 if (arg
->n_bssids
> WLAN_SCAN_PARAMS_MAX_BSSID
)
1427 len
+= sizeof(struct wmi_bssid_list
);
1428 len
+= sizeof(struct wmi_mac_addr
) * arg
->n_bssids
;
1434 int ath10k_wmi_start_scan(struct ath10k
*ar
,
1435 const struct wmi_start_scan_arg
*arg
)
1437 struct wmi_start_scan_cmd
*cmd
;
1438 struct sk_buff
*skb
;
1439 struct wmi_ie_data
*ie
;
1440 struct wmi_chan_list
*channels
;
1441 struct wmi_ssid_list
*ssids
;
1442 struct wmi_bssid_list
*bssids
;
1449 len
= ath10k_wmi_start_scan_calc_len(arg
);
1451 return len
; /* len contains error code here */
1453 skb
= ath10k_wmi_alloc_skb(len
);
1457 scan_id
= WMI_HOST_SCAN_REQ_ID_PREFIX
;
1458 scan_id
|= arg
->scan_id
;
1460 scan_req_id
= WMI_HOST_SCAN_REQUESTOR_ID_PREFIX
;
1461 scan_req_id
|= arg
->scan_req_id
;
1463 cmd
= (struct wmi_start_scan_cmd
*)skb
->data
;
1464 cmd
->scan_id
= __cpu_to_le32(scan_id
);
1465 cmd
->scan_req_id
= __cpu_to_le32(scan_req_id
);
1466 cmd
->vdev_id
= __cpu_to_le32(arg
->vdev_id
);
1467 cmd
->scan_priority
= __cpu_to_le32(arg
->scan_priority
);
1468 cmd
->notify_scan_events
= __cpu_to_le32(arg
->notify_scan_events
);
1469 cmd
->dwell_time_active
= __cpu_to_le32(arg
->dwell_time_active
);
1470 cmd
->dwell_time_passive
= __cpu_to_le32(arg
->dwell_time_passive
);
1471 cmd
->min_rest_time
= __cpu_to_le32(arg
->min_rest_time
);
1472 cmd
->max_rest_time
= __cpu_to_le32(arg
->max_rest_time
);
1473 cmd
->repeat_probe_time
= __cpu_to_le32(arg
->repeat_probe_time
);
1474 cmd
->probe_spacing_time
= __cpu_to_le32(arg
->probe_spacing_time
);
1475 cmd
->idle_time
= __cpu_to_le32(arg
->idle_time
);
1476 cmd
->max_scan_time
= __cpu_to_le32(arg
->max_scan_time
);
1477 cmd
->probe_delay
= __cpu_to_le32(arg
->probe_delay
);
1478 cmd
->scan_ctrl_flags
= __cpu_to_le32(arg
->scan_ctrl_flags
);
1480 /* TLV list starts after fields included in the struct */
1483 if (arg
->n_channels
) {
1484 channels
= (void *)skb
->data
+ off
;
1485 channels
->tag
= __cpu_to_le32(WMI_CHAN_LIST_TAG
);
1486 channels
->num_chan
= __cpu_to_le32(arg
->n_channels
);
1488 for (i
= 0; i
< arg
->n_channels
; i
++)
1489 channels
->channel_list
[i
] =
1490 __cpu_to_le32(arg
->channels
[i
]);
1492 off
+= sizeof(*channels
);
1493 off
+= sizeof(__le32
) * arg
->n_channels
;
1497 ssids
= (void *)skb
->data
+ off
;
1498 ssids
->tag
= __cpu_to_le32(WMI_SSID_LIST_TAG
);
1499 ssids
->num_ssids
= __cpu_to_le32(arg
->n_ssids
);
1501 for (i
= 0; i
< arg
->n_ssids
; i
++) {
1502 ssids
->ssids
[i
].ssid_len
=
1503 __cpu_to_le32(arg
->ssids
[i
].len
);
1504 memcpy(&ssids
->ssids
[i
].ssid
,
1509 off
+= sizeof(*ssids
);
1510 off
+= sizeof(struct wmi_ssid
) * arg
->n_ssids
;
1513 if (arg
->n_bssids
) {
1514 bssids
= (void *)skb
->data
+ off
;
1515 bssids
->tag
= __cpu_to_le32(WMI_BSSID_LIST_TAG
);
1516 bssids
->num_bssid
= __cpu_to_le32(arg
->n_bssids
);
1518 for (i
= 0; i
< arg
->n_bssids
; i
++)
1519 memcpy(&bssids
->bssid_list
[i
],
1520 arg
->bssids
[i
].bssid
,
1523 off
+= sizeof(*bssids
);
1524 off
+= sizeof(struct wmi_mac_addr
) * arg
->n_bssids
;
1528 ie
= (void *)skb
->data
+ off
;
1529 ie
->tag
= __cpu_to_le32(WMI_IE_TAG
);
1530 ie
->ie_len
= __cpu_to_le32(arg
->ie_len
);
1531 memcpy(ie
->ie_data
, arg
->ie
, arg
->ie_len
);
1534 off
+= roundup(arg
->ie_len
, 4);
1537 if (off
!= skb
->len
) {
1542 ath10k_dbg(ATH10K_DBG_WMI
, "wmi start scan\n");
1543 return ath10k_wmi_cmd_send(ar
, skb
, WMI_START_SCAN_CMDID
);
1546 void ath10k_wmi_start_scan_init(struct ath10k
*ar
,
1547 struct wmi_start_scan_arg
*arg
)
1549 /* setup commonly used values */
1550 arg
->scan_req_id
= 1;
1551 arg
->scan_priority
= WMI_SCAN_PRIORITY_LOW
;
1552 arg
->dwell_time_active
= 50;
1553 arg
->dwell_time_passive
= 150;
1554 arg
->min_rest_time
= 50;
1555 arg
->max_rest_time
= 500;
1556 arg
->repeat_probe_time
= 0;
1557 arg
->probe_spacing_time
= 0;
1559 arg
->max_scan_time
= 5000;
1560 arg
->probe_delay
= 5;
1561 arg
->notify_scan_events
= WMI_SCAN_EVENT_STARTED
1562 | WMI_SCAN_EVENT_COMPLETED
1563 | WMI_SCAN_EVENT_BSS_CHANNEL
1564 | WMI_SCAN_EVENT_FOREIGN_CHANNEL
1565 | WMI_SCAN_EVENT_DEQUEUED
;
1566 arg
->scan_ctrl_flags
|= WMI_SCAN_ADD_OFDM_RATES
;
1567 arg
->scan_ctrl_flags
|= WMI_SCAN_CHAN_STAT_EVENT
;
1569 arg
->bssids
[0].bssid
= "\xFF\xFF\xFF\xFF\xFF\xFF";
1572 int ath10k_wmi_stop_scan(struct ath10k
*ar
, const struct wmi_stop_scan_arg
*arg
)
1574 struct wmi_stop_scan_cmd
*cmd
;
1575 struct sk_buff
*skb
;
1579 if (arg
->req_id
> 0xFFF)
1581 if (arg
->req_type
== WMI_SCAN_STOP_ONE
&& arg
->u
.scan_id
> 0xFFF)
1584 skb
= ath10k_wmi_alloc_skb(sizeof(*cmd
));
1588 scan_id
= arg
->u
.scan_id
;
1589 scan_id
|= WMI_HOST_SCAN_REQ_ID_PREFIX
;
1591 req_id
= arg
->req_id
;
1592 req_id
|= WMI_HOST_SCAN_REQUESTOR_ID_PREFIX
;
1594 cmd
= (struct wmi_stop_scan_cmd
*)skb
->data
;
1595 cmd
->req_type
= __cpu_to_le32(arg
->req_type
);
1596 cmd
->vdev_id
= __cpu_to_le32(arg
->u
.vdev_id
);
1597 cmd
->scan_id
= __cpu_to_le32(scan_id
);
1598 cmd
->scan_req_id
= __cpu_to_le32(req_id
);
1600 ath10k_dbg(ATH10K_DBG_WMI
,
1601 "wmi stop scan reqid %d req_type %d vdev/scan_id %d\n",
1602 arg
->req_id
, arg
->req_type
, arg
->u
.scan_id
);
1603 return ath10k_wmi_cmd_send(ar
, skb
, WMI_STOP_SCAN_CMDID
);
1606 int ath10k_wmi_vdev_create(struct ath10k
*ar
, u32 vdev_id
,
1607 enum wmi_vdev_type type
,
1608 enum wmi_vdev_subtype subtype
,
1609 const u8 macaddr
[ETH_ALEN
])
1611 struct wmi_vdev_create_cmd
*cmd
;
1612 struct sk_buff
*skb
;
1614 skb
= ath10k_wmi_alloc_skb(sizeof(*cmd
));
1618 cmd
= (struct wmi_vdev_create_cmd
*)skb
->data
;
1619 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1620 cmd
->vdev_type
= __cpu_to_le32(type
);
1621 cmd
->vdev_subtype
= __cpu_to_le32(subtype
);
1622 memcpy(cmd
->vdev_macaddr
.addr
, macaddr
, ETH_ALEN
);
1624 ath10k_dbg(ATH10K_DBG_WMI
,
1625 "WMI vdev create: id %d type %d subtype %d macaddr %pM\n",
1626 vdev_id
, type
, subtype
, macaddr
);
1628 return ath10k_wmi_cmd_send(ar
, skb
, WMI_VDEV_CREATE_CMDID
);
1631 int ath10k_wmi_vdev_delete(struct ath10k
*ar
, u32 vdev_id
)
1633 struct wmi_vdev_delete_cmd
*cmd
;
1634 struct sk_buff
*skb
;
1636 skb
= ath10k_wmi_alloc_skb(sizeof(*cmd
));
1640 cmd
= (struct wmi_vdev_delete_cmd
*)skb
->data
;
1641 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1643 ath10k_dbg(ATH10K_DBG_WMI
,
1644 "WMI vdev delete id %d\n", vdev_id
);
1646 return ath10k_wmi_cmd_send(ar
, skb
, WMI_VDEV_DELETE_CMDID
);
1649 static int ath10k_wmi_vdev_start_restart(struct ath10k
*ar
,
1650 const struct wmi_vdev_start_request_arg
*arg
,
1651 enum wmi_cmd_id cmd_id
)
1653 struct wmi_vdev_start_request_cmd
*cmd
;
1654 struct sk_buff
*skb
;
1655 const char *cmdname
;
1658 if (cmd_id
!= WMI_VDEV_START_REQUEST_CMDID
&&
1659 cmd_id
!= WMI_VDEV_RESTART_REQUEST_CMDID
)
1661 if (WARN_ON(arg
->ssid
&& arg
->ssid_len
== 0))
1663 if (WARN_ON(arg
->hidden_ssid
&& !arg
->ssid
))
1665 if (WARN_ON(arg
->ssid_len
> sizeof(cmd
->ssid
.ssid
)))
1668 if (cmd_id
== WMI_VDEV_START_REQUEST_CMDID
)
1670 else if (cmd_id
== WMI_VDEV_RESTART_REQUEST_CMDID
)
1671 cmdname
= "restart";
1673 return -EINVAL
; /* should not happen, we already check cmd_id */
1675 skb
= ath10k_wmi_alloc_skb(sizeof(*cmd
));
1679 if (arg
->hidden_ssid
)
1680 flags
|= WMI_VDEV_START_HIDDEN_SSID
;
1681 if (arg
->pmf_enabled
)
1682 flags
|= WMI_VDEV_START_PMF_ENABLED
;
1684 cmd
= (struct wmi_vdev_start_request_cmd
*)skb
->data
;
1685 cmd
->vdev_id
= __cpu_to_le32(arg
->vdev_id
);
1686 cmd
->disable_hw_ack
= __cpu_to_le32(arg
->disable_hw_ack
);
1687 cmd
->beacon_interval
= __cpu_to_le32(arg
->bcn_intval
);
1688 cmd
->dtim_period
= __cpu_to_le32(arg
->dtim_period
);
1689 cmd
->flags
= __cpu_to_le32(flags
);
1690 cmd
->bcn_tx_rate
= __cpu_to_le32(arg
->bcn_tx_rate
);
1691 cmd
->bcn_tx_power
= __cpu_to_le32(arg
->bcn_tx_power
);
1694 cmd
->ssid
.ssid_len
= __cpu_to_le32(arg
->ssid_len
);
1695 memcpy(cmd
->ssid
.ssid
, arg
->ssid
, arg
->ssid_len
);
1698 cmd
->chan
.mhz
= __cpu_to_le32(arg
->channel
.freq
);
1700 cmd
->chan
.band_center_freq1
=
1701 __cpu_to_le32(arg
->channel
.band_center_freq1
);
1703 cmd
->chan
.mode
= arg
->channel
.mode
;
1704 cmd
->chan
.min_power
= arg
->channel
.min_power
;
1705 cmd
->chan
.max_power
= arg
->channel
.max_power
;
1706 cmd
->chan
.reg_power
= arg
->channel
.max_reg_power
;
1707 cmd
->chan
.reg_classid
= arg
->channel
.reg_class_id
;
1708 cmd
->chan
.antenna_max
= arg
->channel
.max_antenna_gain
;
1710 ath10k_dbg(ATH10K_DBG_WMI
,
1711 "wmi vdev %s id 0x%x freq %d, mode %d, ch_flags: 0x%0X,"
1712 "max_power: %d\n", cmdname
, arg
->vdev_id
, arg
->channel
.freq
,
1713 arg
->channel
.mode
, flags
, arg
->channel
.max_power
);
1715 return ath10k_wmi_cmd_send(ar
, skb
, cmd_id
);
1718 int ath10k_wmi_vdev_start(struct ath10k
*ar
,
1719 const struct wmi_vdev_start_request_arg
*arg
)
1721 return ath10k_wmi_vdev_start_restart(ar
, arg
,
1722 WMI_VDEV_START_REQUEST_CMDID
);
1725 int ath10k_wmi_vdev_restart(struct ath10k
*ar
,
1726 const struct wmi_vdev_start_request_arg
*arg
)
1728 return ath10k_wmi_vdev_start_restart(ar
, arg
,
1729 WMI_VDEV_RESTART_REQUEST_CMDID
);
1732 int ath10k_wmi_vdev_stop(struct ath10k
*ar
, u32 vdev_id
)
1734 struct wmi_vdev_stop_cmd
*cmd
;
1735 struct sk_buff
*skb
;
1737 skb
= ath10k_wmi_alloc_skb(sizeof(*cmd
));
1741 cmd
= (struct wmi_vdev_stop_cmd
*)skb
->data
;
1742 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1744 ath10k_dbg(ATH10K_DBG_WMI
, "wmi vdev stop id 0x%x\n", vdev_id
);
1746 return ath10k_wmi_cmd_send(ar
, skb
, WMI_VDEV_STOP_CMDID
);
1749 int ath10k_wmi_vdev_up(struct ath10k
*ar
, u32 vdev_id
, u32 aid
, const u8
*bssid
)
1751 struct wmi_vdev_up_cmd
*cmd
;
1752 struct sk_buff
*skb
;
1754 skb
= ath10k_wmi_alloc_skb(sizeof(*cmd
));
1758 cmd
= (struct wmi_vdev_up_cmd
*)skb
->data
;
1759 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1760 cmd
->vdev_assoc_id
= __cpu_to_le32(aid
);
1761 memcpy(&cmd
->vdev_bssid
.addr
, bssid
, 6);
1763 ath10k_dbg(ATH10K_DBG_WMI
,
1764 "wmi mgmt vdev up id 0x%x assoc id %d bssid %pM\n",
1765 vdev_id
, aid
, bssid
);
1767 return ath10k_wmi_cmd_send(ar
, skb
, WMI_VDEV_UP_CMDID
);
1770 int ath10k_wmi_vdev_down(struct ath10k
*ar
, u32 vdev_id
)
1772 struct wmi_vdev_down_cmd
*cmd
;
1773 struct sk_buff
*skb
;
1775 skb
= ath10k_wmi_alloc_skb(sizeof(*cmd
));
1779 cmd
= (struct wmi_vdev_down_cmd
*)skb
->data
;
1780 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1782 ath10k_dbg(ATH10K_DBG_WMI
,
1783 "wmi mgmt vdev down id 0x%x\n", vdev_id
);
1785 return ath10k_wmi_cmd_send(ar
, skb
, WMI_VDEV_DOWN_CMDID
);
1788 int ath10k_wmi_vdev_set_param(struct ath10k
*ar
, u32 vdev_id
,
1789 enum wmi_vdev_param param_id
, u32 param_value
)
1791 struct wmi_vdev_set_param_cmd
*cmd
;
1792 struct sk_buff
*skb
;
1794 skb
= ath10k_wmi_alloc_skb(sizeof(*cmd
));
1798 cmd
= (struct wmi_vdev_set_param_cmd
*)skb
->data
;
1799 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1800 cmd
->param_id
= __cpu_to_le32(param_id
);
1801 cmd
->param_value
= __cpu_to_le32(param_value
);
1803 ath10k_dbg(ATH10K_DBG_WMI
,
1804 "wmi vdev id 0x%x set param %d value %d\n",
1805 vdev_id
, param_id
, param_value
);
1807 return ath10k_wmi_cmd_send(ar
, skb
, WMI_VDEV_SET_PARAM_CMDID
);
1810 int ath10k_wmi_vdev_install_key(struct ath10k
*ar
,
1811 const struct wmi_vdev_install_key_arg
*arg
)
1813 struct wmi_vdev_install_key_cmd
*cmd
;
1814 struct sk_buff
*skb
;
1816 if (arg
->key_cipher
== WMI_CIPHER_NONE
&& arg
->key_data
!= NULL
)
1818 if (arg
->key_cipher
!= WMI_CIPHER_NONE
&& arg
->key_data
== NULL
)
1821 skb
= ath10k_wmi_alloc_skb(sizeof(*cmd
) + arg
->key_len
);
1825 cmd
= (struct wmi_vdev_install_key_cmd
*)skb
->data
;
1826 cmd
->vdev_id
= __cpu_to_le32(arg
->vdev_id
);
1827 cmd
->key_idx
= __cpu_to_le32(arg
->key_idx
);
1828 cmd
->key_flags
= __cpu_to_le32(arg
->key_flags
);
1829 cmd
->key_cipher
= __cpu_to_le32(arg
->key_cipher
);
1830 cmd
->key_len
= __cpu_to_le32(arg
->key_len
);
1831 cmd
->key_txmic_len
= __cpu_to_le32(arg
->key_txmic_len
);
1832 cmd
->key_rxmic_len
= __cpu_to_le32(arg
->key_rxmic_len
);
1835 memcpy(cmd
->peer_macaddr
.addr
, arg
->macaddr
, ETH_ALEN
);
1837 memcpy(cmd
->key_data
, arg
->key_data
, arg
->key_len
);
1839 ath10k_dbg(ATH10K_DBG_WMI
,
1840 "wmi vdev install key idx %d cipher %d len %d\n",
1841 arg
->key_idx
, arg
->key_cipher
, arg
->key_len
);
1842 return ath10k_wmi_cmd_send(ar
, skb
, WMI_VDEV_INSTALL_KEY_CMDID
);
1845 int ath10k_wmi_peer_create(struct ath10k
*ar
, u32 vdev_id
,
1846 const u8 peer_addr
[ETH_ALEN
])
1848 struct wmi_peer_create_cmd
*cmd
;
1849 struct sk_buff
*skb
;
1851 skb
= ath10k_wmi_alloc_skb(sizeof(*cmd
));
1855 cmd
= (struct wmi_peer_create_cmd
*)skb
->data
;
1856 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1857 memcpy(cmd
->peer_macaddr
.addr
, peer_addr
, ETH_ALEN
);
1859 ath10k_dbg(ATH10K_DBG_WMI
,
1860 "wmi peer create vdev_id %d peer_addr %pM\n",
1861 vdev_id
, peer_addr
);
1862 return ath10k_wmi_cmd_send(ar
, skb
, WMI_PEER_CREATE_CMDID
);
1865 int ath10k_wmi_peer_delete(struct ath10k
*ar
, u32 vdev_id
,
1866 const u8 peer_addr
[ETH_ALEN
])
1868 struct wmi_peer_delete_cmd
*cmd
;
1869 struct sk_buff
*skb
;
1871 skb
= ath10k_wmi_alloc_skb(sizeof(*cmd
));
1875 cmd
= (struct wmi_peer_delete_cmd
*)skb
->data
;
1876 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1877 memcpy(cmd
->peer_macaddr
.addr
, peer_addr
, ETH_ALEN
);
1879 ath10k_dbg(ATH10K_DBG_WMI
,
1880 "wmi peer delete vdev_id %d peer_addr %pM\n",
1881 vdev_id
, peer_addr
);
1882 return ath10k_wmi_cmd_send(ar
, skb
, WMI_PEER_DELETE_CMDID
);
1885 int ath10k_wmi_peer_flush(struct ath10k
*ar
, u32 vdev_id
,
1886 const u8 peer_addr
[ETH_ALEN
], u32 tid_bitmap
)
1888 struct wmi_peer_flush_tids_cmd
*cmd
;
1889 struct sk_buff
*skb
;
1891 skb
= ath10k_wmi_alloc_skb(sizeof(*cmd
));
1895 cmd
= (struct wmi_peer_flush_tids_cmd
*)skb
->data
;
1896 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1897 cmd
->peer_tid_bitmap
= __cpu_to_le32(tid_bitmap
);
1898 memcpy(cmd
->peer_macaddr
.addr
, peer_addr
, ETH_ALEN
);
1900 ath10k_dbg(ATH10K_DBG_WMI
,
1901 "wmi peer flush vdev_id %d peer_addr %pM tids %08x\n",
1902 vdev_id
, peer_addr
, tid_bitmap
);
1903 return ath10k_wmi_cmd_send(ar
, skb
, WMI_PEER_FLUSH_TIDS_CMDID
);
1906 int ath10k_wmi_peer_set_param(struct ath10k
*ar
, u32 vdev_id
,
1907 const u8
*peer_addr
, enum wmi_peer_param param_id
,
1910 struct wmi_peer_set_param_cmd
*cmd
;
1911 struct sk_buff
*skb
;
1913 skb
= ath10k_wmi_alloc_skb(sizeof(*cmd
));
1917 cmd
= (struct wmi_peer_set_param_cmd
*)skb
->data
;
1918 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1919 cmd
->param_id
= __cpu_to_le32(param_id
);
1920 cmd
->param_value
= __cpu_to_le32(param_value
);
1921 memcpy(&cmd
->peer_macaddr
.addr
, peer_addr
, 6);
1923 ath10k_dbg(ATH10K_DBG_WMI
,
1924 "wmi vdev %d peer 0x%pM set param %d value %d\n",
1925 vdev_id
, peer_addr
, param_id
, param_value
);
1927 return ath10k_wmi_cmd_send(ar
, skb
, WMI_PEER_SET_PARAM_CMDID
);
1930 int ath10k_wmi_set_psmode(struct ath10k
*ar
, u32 vdev_id
,
1931 enum wmi_sta_ps_mode psmode
)
1933 struct wmi_sta_powersave_mode_cmd
*cmd
;
1934 struct sk_buff
*skb
;
1936 skb
= ath10k_wmi_alloc_skb(sizeof(*cmd
));
1940 cmd
= (struct wmi_sta_powersave_mode_cmd
*)skb
->data
;
1941 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1942 cmd
->sta_ps_mode
= __cpu_to_le32(psmode
);
1944 ath10k_dbg(ATH10K_DBG_WMI
,
1945 "wmi set powersave id 0x%x mode %d\n",
1948 return ath10k_wmi_cmd_send(ar
, skb
, WMI_STA_POWERSAVE_MODE_CMDID
);
1951 int ath10k_wmi_set_sta_ps_param(struct ath10k
*ar
, u32 vdev_id
,
1952 enum wmi_sta_powersave_param param_id
,
1955 struct wmi_sta_powersave_param_cmd
*cmd
;
1956 struct sk_buff
*skb
;
1958 skb
= ath10k_wmi_alloc_skb(sizeof(*cmd
));
1962 cmd
= (struct wmi_sta_powersave_param_cmd
*)skb
->data
;
1963 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1964 cmd
->param_id
= __cpu_to_le32(param_id
);
1965 cmd
->param_value
= __cpu_to_le32(value
);
1967 ath10k_dbg(ATH10K_DBG_WMI
,
1968 "wmi sta ps param vdev_id 0x%x param %d value %d\n",
1969 vdev_id
, param_id
, value
);
1970 return ath10k_wmi_cmd_send(ar
, skb
, WMI_STA_POWERSAVE_PARAM_CMDID
);
1973 int ath10k_wmi_set_ap_ps_param(struct ath10k
*ar
, u32 vdev_id
, const u8
*mac
,
1974 enum wmi_ap_ps_peer_param param_id
, u32 value
)
1976 struct wmi_ap_ps_peer_cmd
*cmd
;
1977 struct sk_buff
*skb
;
1982 skb
= ath10k_wmi_alloc_skb(sizeof(*cmd
));
1986 cmd
= (struct wmi_ap_ps_peer_cmd
*)skb
->data
;
1987 cmd
->vdev_id
= __cpu_to_le32(vdev_id
);
1988 cmd
->param_id
= __cpu_to_le32(param_id
);
1989 cmd
->param_value
= __cpu_to_le32(value
);
1990 memcpy(&cmd
->peer_macaddr
, mac
, ETH_ALEN
);
1992 ath10k_dbg(ATH10K_DBG_WMI
,
1993 "wmi ap ps param vdev_id 0x%X param %d value %d mac_addr %pM\n",
1994 vdev_id
, param_id
, value
, mac
);
1996 return ath10k_wmi_cmd_send(ar
, skb
, WMI_AP_PS_PEER_PARAM_CMDID
);
1999 int ath10k_wmi_scan_chan_list(struct ath10k
*ar
,
2000 const struct wmi_scan_chan_list_arg
*arg
)
2002 struct wmi_scan_chan_list_cmd
*cmd
;
2003 struct sk_buff
*skb
;
2004 struct wmi_channel_arg
*ch
;
2005 struct wmi_channel
*ci
;
2009 len
= sizeof(*cmd
) + arg
->n_channels
* sizeof(struct wmi_channel
);
2011 skb
= ath10k_wmi_alloc_skb(len
);
2015 cmd
= (struct wmi_scan_chan_list_cmd
*)skb
->data
;
2016 cmd
->num_scan_chans
= __cpu_to_le32(arg
->n_channels
);
2018 for (i
= 0; i
< arg
->n_channels
; i
++) {
2021 ch
= &arg
->channels
[i
];
2022 ci
= &cmd
->chan_info
[i
];
2025 flags
|= WMI_CHAN_FLAG_PASSIVE
;
2027 flags
|= WMI_CHAN_FLAG_ADHOC_ALLOWED
;
2029 flags
|= WMI_CHAN_FLAG_ALLOW_HT
;
2031 flags
|= WMI_CHAN_FLAG_ALLOW_VHT
;
2033 flags
|= WMI_CHAN_FLAG_HT40_PLUS
;
2035 ci
->mhz
= __cpu_to_le32(ch
->freq
);
2036 ci
->band_center_freq1
= __cpu_to_le32(ch
->freq
);
2037 ci
->band_center_freq2
= 0;
2038 ci
->min_power
= ch
->min_power
;
2039 ci
->max_power
= ch
->max_power
;
2040 ci
->reg_power
= ch
->max_reg_power
;
2041 ci
->antenna_max
= ch
->max_antenna_gain
;
2042 ci
->antenna_max
= 0;
2044 /* mode & flags share storage */
2045 ci
->mode
= ch
->mode
;
2046 ci
->flags
|= __cpu_to_le32(flags
);
2049 return ath10k_wmi_cmd_send(ar
, skb
, WMI_SCAN_CHAN_LIST_CMDID
);
2052 int ath10k_wmi_peer_assoc(struct ath10k
*ar
,
2053 const struct wmi_peer_assoc_complete_arg
*arg
)
2055 struct wmi_peer_assoc_complete_cmd
*cmd
;
2056 struct sk_buff
*skb
;
2058 if (arg
->peer_mpdu_density
> 16)
2060 if (arg
->peer_legacy_rates
.num_rates
> MAX_SUPPORTED_RATES
)
2062 if (arg
->peer_ht_rates
.num_rates
> MAX_SUPPORTED_RATES
)
2065 skb
= ath10k_wmi_alloc_skb(sizeof(*cmd
));
2069 cmd
= (struct wmi_peer_assoc_complete_cmd
*)skb
->data
;
2070 cmd
->vdev_id
= __cpu_to_le32(arg
->vdev_id
);
2071 cmd
->peer_new_assoc
= __cpu_to_le32(arg
->peer_reassoc
? 0 : 1);
2072 cmd
->peer_associd
= __cpu_to_le32(arg
->peer_aid
);
2073 cmd
->peer_flags
= __cpu_to_le32(arg
->peer_flags
);
2074 cmd
->peer_caps
= __cpu_to_le32(arg
->peer_caps
);
2075 cmd
->peer_listen_intval
= __cpu_to_le32(arg
->peer_listen_intval
);
2076 cmd
->peer_ht_caps
= __cpu_to_le32(arg
->peer_ht_caps
);
2077 cmd
->peer_max_mpdu
= __cpu_to_le32(arg
->peer_max_mpdu
);
2078 cmd
->peer_mpdu_density
= __cpu_to_le32(arg
->peer_mpdu_density
);
2079 cmd
->peer_rate_caps
= __cpu_to_le32(arg
->peer_rate_caps
);
2080 cmd
->peer_nss
= __cpu_to_le32(arg
->peer_num_spatial_streams
);
2081 cmd
->peer_vht_caps
= __cpu_to_le32(arg
->peer_vht_caps
);
2082 cmd
->peer_phymode
= __cpu_to_le32(arg
->peer_phymode
);
2084 memcpy(cmd
->peer_macaddr
.addr
, arg
->addr
, ETH_ALEN
);
2086 cmd
->peer_legacy_rates
.num_rates
=
2087 __cpu_to_le32(arg
->peer_legacy_rates
.num_rates
);
2088 memcpy(cmd
->peer_legacy_rates
.rates
, arg
->peer_legacy_rates
.rates
,
2089 arg
->peer_legacy_rates
.num_rates
);
2091 cmd
->peer_ht_rates
.num_rates
=
2092 __cpu_to_le32(arg
->peer_ht_rates
.num_rates
);
2093 memcpy(cmd
->peer_ht_rates
.rates
, arg
->peer_ht_rates
.rates
,
2094 arg
->peer_ht_rates
.num_rates
);
2096 cmd
->peer_vht_rates
.rx_max_rate
=
2097 __cpu_to_le32(arg
->peer_vht_rates
.rx_max_rate
);
2098 cmd
->peer_vht_rates
.rx_mcs_set
=
2099 __cpu_to_le32(arg
->peer_vht_rates
.rx_mcs_set
);
2100 cmd
->peer_vht_rates
.tx_max_rate
=
2101 __cpu_to_le32(arg
->peer_vht_rates
.tx_max_rate
);
2102 cmd
->peer_vht_rates
.tx_mcs_set
=
2103 __cpu_to_le32(arg
->peer_vht_rates
.tx_mcs_set
);
2105 ath10k_dbg(ATH10K_DBG_WMI
,
2106 "wmi peer assoc vdev %d addr %pM\n",
2107 arg
->vdev_id
, arg
->addr
);
2108 return ath10k_wmi_cmd_send(ar
, skb
, WMI_PEER_ASSOC_CMDID
);
2111 int ath10k_wmi_beacon_send(struct ath10k
*ar
, const struct wmi_bcn_tx_arg
*arg
)
2113 struct wmi_bcn_tx_cmd
*cmd
;
2114 struct sk_buff
*skb
;
2116 skb
= ath10k_wmi_alloc_skb(sizeof(*cmd
) + arg
->bcn_len
);
2120 cmd
= (struct wmi_bcn_tx_cmd
*)skb
->data
;
2121 cmd
->hdr
.vdev_id
= __cpu_to_le32(arg
->vdev_id
);
2122 cmd
->hdr
.tx_rate
= __cpu_to_le32(arg
->tx_rate
);
2123 cmd
->hdr
.tx_power
= __cpu_to_le32(arg
->tx_power
);
2124 cmd
->hdr
.bcn_len
= __cpu_to_le32(arg
->bcn_len
);
2125 memcpy(cmd
->bcn
, arg
->bcn
, arg
->bcn_len
);
2127 return ath10k_wmi_cmd_send(ar
, skb
, WMI_BCN_TX_CMDID
);
2130 static void ath10k_wmi_pdev_set_wmm_param(struct wmi_wmm_params
*params
,
2131 const struct wmi_wmm_params_arg
*arg
)
2133 params
->cwmin
= __cpu_to_le32(arg
->cwmin
);
2134 params
->cwmax
= __cpu_to_le32(arg
->cwmax
);
2135 params
->aifs
= __cpu_to_le32(arg
->aifs
);
2136 params
->txop
= __cpu_to_le32(arg
->txop
);
2137 params
->acm
= __cpu_to_le32(arg
->acm
);
2138 params
->no_ack
= __cpu_to_le32(arg
->no_ack
);
2141 int ath10k_wmi_pdev_set_wmm_params(struct ath10k
*ar
,
2142 const struct wmi_pdev_set_wmm_params_arg
*arg
)
2144 struct wmi_pdev_set_wmm_params
*cmd
;
2145 struct sk_buff
*skb
;
2147 skb
= ath10k_wmi_alloc_skb(sizeof(*cmd
));
2151 cmd
= (struct wmi_pdev_set_wmm_params
*)skb
->data
;
2152 ath10k_wmi_pdev_set_wmm_param(&cmd
->ac_be
, &arg
->ac_be
);
2153 ath10k_wmi_pdev_set_wmm_param(&cmd
->ac_bk
, &arg
->ac_bk
);
2154 ath10k_wmi_pdev_set_wmm_param(&cmd
->ac_vi
, &arg
->ac_vi
);
2155 ath10k_wmi_pdev_set_wmm_param(&cmd
->ac_vo
, &arg
->ac_vo
);
2157 ath10k_dbg(ATH10K_DBG_WMI
, "wmi pdev set wmm params\n");
2158 return ath10k_wmi_cmd_send(ar
, skb
, WMI_PDEV_SET_WMM_PARAMS_CMDID
);
2161 int ath10k_wmi_request_stats(struct ath10k
*ar
, enum wmi_stats_id stats_id
)
2163 struct wmi_request_stats_cmd
*cmd
;
2164 struct sk_buff
*skb
;
2166 skb
= ath10k_wmi_alloc_skb(sizeof(*cmd
));
2170 cmd
= (struct wmi_request_stats_cmd
*)skb
->data
;
2171 cmd
->stats_id
= __cpu_to_le32(stats_id
);
2173 ath10k_dbg(ATH10K_DBG_WMI
, "wmi request stats %d\n", (int)stats_id
);
2174 return ath10k_wmi_cmd_send(ar
, skb
, WMI_REQUEST_STATS_CMDID
);
2177 int ath10k_wmi_force_fw_hang(struct ath10k
*ar
,
2178 enum wmi_force_fw_hang_type type
, u32 delay_ms
)
2180 struct wmi_force_fw_hang_cmd
*cmd
;
2181 struct sk_buff
*skb
;
2183 skb
= ath10k_wmi_alloc_skb(sizeof(*cmd
));
2187 cmd
= (struct wmi_force_fw_hang_cmd
*)skb
->data
;
2188 cmd
->type
= __cpu_to_le32(type
);
2189 cmd
->delay_ms
= __cpu_to_le32(delay_ms
);
2191 ath10k_dbg(ATH10K_DBG_WMI
, "wmi force fw hang %d delay %d\n",
2193 return ath10k_wmi_cmd_send(ar
, skb
, WMI_FORCE_FW_HANG_CMDID
);