Lines Matching defs:ar

1699 void ath10k_wmi_put_wmi_channel(struct ath10k *ar, struct wmi_channel *ch,
1725 chan = ieee80211_get_channel(ar->hw->wiphy,
1744 chan = ieee80211_get_channel(ar->hw->wiphy,
1764 int ath10k_wmi_wait_for_service_ready(struct ath10k *ar)
1768 time_left = wait_for_completion_timeout(&ar->wmi.service_ready,
1777 ath10k_warn(ar, "failed to receive service ready completion, polling..\n");
1780 ath10k_hif_send_complete_check(ar, i, 1);
1782 time_left = wait_for_completion_timeout(&ar->wmi.service_ready,
1785 ath10k_warn(ar, "polling timed out\n");
1789 ath10k_warn(ar, "service ready completion received, continuing normally\n");
1795 int ath10k_wmi_wait_for_unified_ready(struct ath10k *ar)
1799 time_left = wait_for_completion_timeout(&ar->wmi.unified_ready,
1806 struct sk_buff *ath10k_wmi_alloc_skb(struct ath10k *ar, u32 len)
1811 skb = ath10k_htc_alloc_skb(ar, WMI_SKB_HEADROOM + round_len);
1817 ath10k_warn(ar, "Unaligned WMI skb\n");
1825 static void ath10k_wmi_htc_tx_complete(struct ath10k *ar, struct sk_buff *skb)
1830 int ath10k_wmi_cmd_send_nowait(struct ath10k *ar, struct sk_buff *skb,
1847 trace_ath10k_wmi_cmd(ar, cmd_id, skb->data, skb->len);
1848 ret = ath10k_htc_send(&ar->htc, ar->wmi.eid, skb);
1862 struct ath10k *ar = arvif->ar;
1869 spin_lock_bh(&ar->data_lock);
1884 spin_unlock_bh(&ar->data_lock);
1888 ret = ath10k_wmi_beacon_send_ref_nowait(arvif->ar,
1895 spin_lock_bh(&ar->data_lock);
1904 spin_unlock_bh(&ar->data_lock);
1915 static void ath10k_wmi_tx_beacons_nowait(struct ath10k *ar)
1917 ieee80211_iterate_active_interfaces_atomic(ar->hw,
1923 static void ath10k_wmi_op_ep_tx_credits(struct ath10k *ar)
1926 ath10k_wmi_tx_beacons_nowait(ar);
1928 wake_up(&ar->wmi.tx_credits_wq);
1931 int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id)
1938 ath10k_warn(ar, "wmi command %d is not supported by firmware\n",
1943 wait_event_timeout(ar->wmi.tx_credits_wq, ({
1945 ath10k_wmi_tx_beacons_nowait(ar);
1947 ret = ath10k_wmi_cmd_send_nowait(ar, skb, cmd_id);
1949 if (ret && test_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags))
1959 ath10k_warn(ar, "wmi command %d timeout, restarting hardware\n",
1961 ath10k_core_start_recovery(ar);
1968 ath10k_wmi_op_gen_mgmt_tx(struct ath10k *ar, struct sk_buff *msdu)
2018 skb = ath10k_wmi_alloc_skb(ar, len);
2032 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi mgmt tx skb %pK len %d ftype %02x stype %02x\n",
2035 trace_ath10k_tx_hdr(ar, skb->data, skb->len);
2036 trace_ath10k_tx_payload(ar, skb->data, skb->len);
2041 static void ath10k_wmi_event_scan_started(struct ath10k *ar)
2043 lockdep_assert_held(&ar->data_lock);
2045 switch (ar->scan.state) {
2049 ath10k_warn(ar, "received scan started event in an invalid scan state: %s (%d)\n",
2050 ath10k_scan_state_str(ar->scan.state),
2051 ar->scan.state);
2054 ar->scan.state = ATH10K_SCAN_RUNNING;
2056 if (ar->scan.is_roc)
2057 ieee80211_ready_on_channel(ar->hw);
2059 complete(&ar->scan.started);
2064 static void ath10k_wmi_event_scan_start_failed(struct ath10k *ar)
2066 lockdep_assert_held(&ar->data_lock);
2068 switch (ar->scan.state) {
2072 ath10k_warn(ar, "received scan start failed event in an invalid scan state: %s (%d)\n",
2073 ath10k_scan_state_str(ar->scan.state),
2074 ar->scan.state);
2077 complete(&ar->scan.started);
2078 __ath10k_scan_finish(ar);
2083 static void ath10k_wmi_event_scan_completed(struct ath10k *ar)
2085 lockdep_assert_held(&ar->data_lock);
2087 switch (ar->scan.state) {
2098 ath10k_warn(ar, "received scan completed event in an invalid scan state: %s (%d)\n",
2099 ath10k_scan_state_str(ar->scan.state),
2100 ar->scan.state);
2104 __ath10k_scan_finish(ar);
2109 static void ath10k_wmi_event_scan_bss_chan(struct ath10k *ar)
2111 lockdep_assert_held(&ar->data_lock);
2113 switch (ar->scan.state) {
2116 ath10k_warn(ar, "received scan bss chan event in an invalid scan state: %s (%d)\n",
2117 ath10k_scan_state_str(ar->scan.state),
2118 ar->scan.state);
2122 ar->scan_channel = NULL;
2127 static void ath10k_wmi_event_scan_foreign_chan(struct ath10k *ar, u32 freq)
2129 lockdep_assert_held(&ar->data_lock);
2131 switch (ar->scan.state) {
2134 ath10k_warn(ar, "received scan foreign chan event in an invalid scan state: %s (%d)\n",
2135 ath10k_scan_state_str(ar->scan.state),
2136 ar->scan.state);
2140 ar->scan_channel = ieee80211_get_channel(ar->hw->wiphy, freq);
2142 if (ar->scan.is_roc && ar->scan.roc_freq == freq)
2143 complete(&ar->scan.on_channel);
2190 static int ath10k_wmi_op_pull_scan_ev(struct ath10k *ar, struct sk_buff *skb,
2209 int ath10k_wmi_event_scan(struct ath10k *ar, struct sk_buff *skb)
2220 ret = ath10k_wmi_pull_scan(ar, skb, &arg);
2222 ath10k_warn(ar, "failed to parse scan event: %d\n", ret);
2233 spin_lock_bh(&ar->data_lock);
2235 ath10k_dbg(ar, ATH10K_DBG_WMI,
2239 ath10k_scan_state_str(ar->scan.state), ar->scan.state);
2243 ath10k_wmi_event_scan_started(ar);
2246 ath10k_wmi_event_scan_completed(ar);
2249 ath10k_wmi_event_scan_bss_chan(ar);
2252 ath10k_wmi_event_scan_foreign_chan(ar, freq);
2255 ath10k_warn(ar, "received scan start failure event\n");
2256 ath10k_wmi_event_scan_start_failed(ar);
2266 spin_unlock_bh(&ar->data_lock);
2273 static void ath10k_wmi_handle_wep_reauth(struct ath10k *ar,
2293 spin_lock_bh(&ar->data_lock);
2294 peer_key = ath10k_mac_is_peer_wep_key_set(ar, addr, keyidx);
2295 spin_unlock_bh(&ar->data_lock);
2298 ath10k_dbg(ar, ATH10K_DBG_MAC,
2304 static int ath10k_wmi_op_pull_mgmt_rx_ev(struct ath10k *ar, struct sk_buff *skb,
2316 ar->running_fw->fw_file.fw_features)) {
2355 static int ath10k_wmi_10_4_op_pull_mgmt_rx_ev(struct ath10k *ar,
2398 static bool ath10k_wmi_rx_is_decrypted(struct ath10k *ar,
2415 ar->hw_params.sw_decrypt_mcast_mgmt)
2422 wmi_process_mgmt_tx_comp(struct ath10k *ar, struct mgmt_tx_compl_params *param)
2425 struct ath10k_wmi *wmi = &ar->wmi;
2430 spin_lock_bh(&ar->data_lock);
2434 ath10k_warn(ar, "received mgmt tx completion for invalid msdu_id: %d\n",
2441 dma_unmap_single(ar->dev, pkt_addr->paddr,
2454 ieee80211_tx_status_irqsafe(ar->hw, msdu);
2460 spin_unlock_bh(&ar->data_lock);
2464 int ath10k_wmi_event_mgmt_tx_compl(struct ath10k *ar, struct sk_buff *skb)
2470 ret = ath10k_wmi_pull_mgmt_tx_compl(ar, skb, &arg);
2472 ath10k_warn(ar, "failed to parse mgmt comp event: %d\n", ret);
2480 if (test_bit(WMI_SERVICE_TX_DATA_ACK_RSSI, ar->wmi.svc_map))
2483 wmi_process_mgmt_tx_comp(ar, &param);
2485 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi tlv evnt mgmt tx completion\n");
2490 int ath10k_wmi_event_mgmt_tx_bundle_compl(struct ath10k *ar, struct sk_buff *skb)
2497 ret = ath10k_wmi_pull_mgmt_tx_bundle_compl(ar, skb, &arg);
2499 ath10k_warn(ar, "failed to parse bundle mgmt compl event: %d\n", ret);
2510 if (test_bit(WMI_SERVICE_TX_DATA_ACK_RSSI, ar->wmi.svc_map))
2512 wmi_process_mgmt_tx_comp(ar, &param);
2515 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi tlv event bundle mgmt tx completion\n");
2520 int ath10k_wmi_event_mgmt_rx(struct ath10k *ar, struct sk_buff *skb)
2534 ret = ath10k_wmi_pull_mgmt_rx(ar, skb, &arg);
2536 ath10k_warn(ar, "failed to parse mgmt rx event: %d\n", ret);
2549 ath10k_dbg(ar, ATH10K_DBG_MGMT,
2552 if ((test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags)) ||
2585 ath10k_dbg(ar, ATH10K_DBG_MGMT, "wmi mgmt rx 11b (CCK) on 5GHz\n");
2587 sband = &ar->mac.sbands[status->band];
2597 ath10k_dbg(ar, ATH10K_DBG_MGMT, "mgmt rssi[%d]:%d\n", i, arg.rssi[i]);
2616 ath10k_wmi_handle_wep_reauth(ar, skb, status);
2618 if (ath10k_wmi_rx_is_decrypted(ar, hdr)) {
2632 ath10k_mac_handle_beacon(ar, skb);
2638 ath10k_dbg(ar, ATH10K_DBG_MGMT,
2643 ath10k_dbg(ar, ATH10K_DBG_MGMT,
2648 ieee80211_rx_ni(ar->hw, skb);
2653 static int freq_to_idx(struct ath10k *ar, int freq)
2659 sband = ar->hw->wiphy->bands[band];
2672 static int ath10k_wmi_op_pull_ch_info_ev(struct ath10k *ar, struct sk_buff *skb,
2691 static int ath10k_wmi_10_4_op_pull_ch_info_ev(struct ath10k *ar,
2718 static void ath10k_wmi_event_chan_info_unpaired(struct ath10k *ar,
2725 ath10k_dbg(ar, ATH10K_DBG_WMI, "chan info report completed\n");
2729 idx = freq_to_idx(ar, params->freq);
2730 if (idx >= ARRAY_SIZE(ar->survey)) {
2731 ath10k_warn(ar, "chan info: invalid frequency %d (idx %d out of bounds)\n",
2736 survey = &ar->survey[idx];
2754 static void ath10k_wmi_event_chan_info_paired(struct ath10k *ar,
2760 idx = freq_to_idx(ar, params->freq);
2761 if (idx >= ARRAY_SIZE(ar->survey)) {
2762 ath10k_warn(ar, "chan info: invalid frequency %d (idx %d out of bounds)\n",
2768 if (ar->ch_info_can_report_survey) {
2769 survey = &ar->survey[idx];
2773 ath10k_hw_fill_survey_time(ar,
2777 ar->survey_last_cycle_count,
2778 ar->survey_last_rx_clear_count);
2781 ar->ch_info_can_report_survey = false;
2783 ar->ch_info_can_report_survey = true;
2787 ar->survey_last_rx_clear_count = params->rx_clear_count;
2788 ar->survey_last_cycle_count = params->cycle_count;
2792 void ath10k_wmi_event_chan_info(struct ath10k *ar, struct sk_buff *skb)
2798 ret = ath10k_wmi_pull_ch_info(ar, skb, &arg);
2800 ath10k_warn(ar, "failed to parse chan info event: %d\n", ret);
2812 ath10k_dbg(ar, ATH10K_DBG_WMI,
2818 spin_lock_bh(&ar->data_lock);
2820 switch (ar->scan.state) {
2823 ath10k_dbg(ar, ATH10K_DBG_WMI, "received chan info event without a scan request, ignoring\n");
2831 ar->running_fw->fw_file.fw_features))
2832 ath10k_wmi_event_chan_info_unpaired(ar, &ch_info_param);
2834 ath10k_wmi_event_chan_info_paired(ar, &ch_info_param);
2837 spin_unlock_bh(&ar->data_lock);
2840 void ath10k_wmi_event_echo(struct ath10k *ar, struct sk_buff *skb)
2845 ret = ath10k_wmi_pull_echo_ev(ar, skb, &arg);
2847 ath10k_warn(ar, "failed to parse echo: %d\n", ret);
2851 ath10k_dbg(ar, ATH10K_DBG_WMI,
2856 complete(&ar->wmi.barrier);
2859 int ath10k_wmi_event_debug_mesg(struct ath10k *ar, struct sk_buff *skb)
2861 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi event debug mesg len %d\n",
2864 trace_ath10k_wmi_dbglog(ar, skb->data, skb->len);
3019 static int ath10k_wmi_main_op_pull_fw_stats(struct ath10k *ar,
3073 static int ath10k_wmi_10x_op_pull_fw_stats(struct ath10k *ar,
3131 static int ath10k_wmi_10_2_op_pull_fw_stats(struct ath10k *ar,
3208 static int ath10k_wmi_10_2_4_op_pull_fw_stats(struct ath10k *ar,
3267 if (test_bit(WMI_SERVICE_PEER_STATS, ar->wmi.svc_map))
3284 if (ath10k_peer_stats_enabled(ar))
3294 static int ath10k_wmi_10_4_op_pull_fw_stats(struct ath10k *ar,
3435 void ath10k_wmi_event_update_stats(struct ath10k *ar, struct sk_buff *skb)
3437 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_UPDATE_STATS_EVENTID\n");
3438 ath10k_debug_fw_stats_process(ar, skb);
3442 ath10k_wmi_op_pull_vdev_start_ev(struct ath10k *ar, struct sk_buff *skb,
3459 void ath10k_wmi_event_vdev_start_resp(struct ath10k *ar, struct sk_buff *skb)
3465 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_START_RESP_EVENTID\n");
3467 ar->last_wmi_vdev_start_status = 0;
3469 ret = ath10k_wmi_pull_vdev_start(ar, skb, &arg);
3471 ath10k_warn(ar, "failed to parse vdev start event: %d\n", ret);
3472 ar->last_wmi_vdev_start_status = ret;
3478 ath10k_warn(ar, "vdev-start-response reports status error: %d (%s)\n",
3484 ar->last_wmi_vdev_start_status = -EINVAL;
3488 complete(&ar->vdev_setup_done);
3491 void ath10k_wmi_event_vdev_stopped(struct ath10k *ar, struct sk_buff *skb)
3493 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_STOPPED_EVENTID\n");
3494 complete(&ar->vdev_setup_done);
3498 ath10k_wmi_op_pull_peer_kick_ev(struct ath10k *ar, struct sk_buff *skb,
3512 void ath10k_wmi_event_peer_sta_kickout(struct ath10k *ar, struct sk_buff *skb)
3518 ret = ath10k_wmi_pull_peer_kick(ar, skb, &arg);
3520 ath10k_warn(ar, "failed to parse peer kickout event: %d\n",
3525 ath10k_dbg(ar, ATH10K_DBG_STA, "wmi event peer sta kickout %pM\n",
3530 sta = ieee80211_find_sta_by_ifaddr(ar->hw, arg.mac_addr, NULL);
3532 ath10k_warn(ar, "Spurious quick kickout for STA %pM\n",
3567 static void ath10k_wmi_update_tim(struct ath10k *ar,
3591 ath10k_warn(ar, "SWBA TIM field is too big (%u), truncated it to %zu",
3621 ath10k_warn(ar, "no tim ie found;\n");
3641 ath10k_warn(ar, "tim expansion failed\n");
3646 ath10k_warn(ar, "tim pvm length is too great (%d)\n", pvm_len);
3660 ath10k_dbg(ar, ATH10K_DBG_MGMT, "dtim %d/%d mcast %d pvmlen %d\n",
3665 static void ath10k_wmi_update_noa(struct ath10k *ar, struct ath10k_vif *arvif,
3672 ath10k_dbg(ar, ATH10K_DBG_MGMT, "noa changed: %d\n", noa->changed);
3683 static int ath10k_wmi_op_pull_swba_ev(struct ath10k *ar, struct sk_buff *skb,
3708 ath10k_warn(ar, "refusing to parse invalid swba structure\n");
3728 static int ath10k_wmi_10_2_4_op_pull_swba_ev(struct ath10k *ar,
3754 ath10k_warn(ar, "refusing to parse invalid swba structure\n");
3772 static int ath10k_wmi_10_4_op_pull_swba_ev(struct ath10k *ar,
3798 ath10k_warn(ar, "refusing to parse invalid swba structure\n");
3829 static enum wmi_txbf_conf ath10k_wmi_10_4_txbf_conf_scheme(struct ath10k *ar)
3834 void ath10k_wmi_event_host_swba(struct ath10k *ar, struct sk_buff *skb)
3846 ret = ath10k_wmi_pull_swba(ar, skb, &arg);
3848 ath10k_warn(ar, "failed to parse swba event: %d\n", ret);
3854 ath10k_dbg(ar, ATH10K_DBG_MGMT, "mgmt swba vdev_map 0x%x\n",
3864 ath10k_warn(ar, "swba has corrupted vdev map\n");
3871 ath10k_dbg(ar, ATH10K_DBG_MGMT,
3887 arvif = ath10k_get_arvif(ar, vdev_id);
3889 ath10k_warn(ar, "no vif for vdev_id %d found\n",
3912 bcn = ieee80211_beacon_get(ar->hw, arvif->vif, 0);
3914 ath10k_warn(ar, "could not get mac80211 beacon\n");
3919 ath10k_wmi_update_tim(ar, arvif, bcn, tim_info);
3920 ath10k_wmi_update_noa(ar, arvif, bcn, noa_info);
3922 spin_lock_bh(&ar->data_lock);
3929 ath10k_warn(ar, "SWBA overrun on vdev %d, skipped old beacon\n",
3933 ath10k_warn(ar, "SWBA overrun on vdev %d, skipped new beacon\n",
3943 paddr = dma_map_single(arvif->ar->dev, bcn->data,
3945 ret = dma_mapping_error(arvif->ar->dev, paddr);
3947 ath10k_warn(ar, "failed to map beacon: %d\n",
3956 ath10k_warn(ar, "trimming beacon %d -> %d bytes!\n",
3967 trace_ath10k_tx_hdr(ar, bcn->data, bcn->len);
3968 trace_ath10k_tx_payload(ar, bcn->data, bcn->len);
3971 spin_unlock_bh(&ar->data_lock);
3974 ath10k_wmi_tx_beacons_nowait(ar);
3977 void ath10k_wmi_event_tbttoffset_update(struct ath10k *ar, struct sk_buff *skb)
3979 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TBTTOFFSET_UPDATE_EVENTID\n");
3982 static void ath10k_radar_detected(struct ath10k *ar)
3984 ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs radar detected\n");
3985 ATH10K_DFS_STAT_INC(ar, radar_detected);
3990 if (ar->dfs_block_radar_events)
3991 ath10k_info(ar, "DFS Radar detected, but ignored as requested\n");
3993 ieee80211_radar_detected(ar->hw);
3998 struct ath10k *ar = container_of(work, struct ath10k,
4003 reinit_completion(&ar->wmi.radar_confirm);
4005 spin_lock_bh(&ar->data_lock);
4006 memcpy(&radar_info, &ar->last_radar_info, sizeof(radar_info));
4007 spin_unlock_bh(&ar->data_lock);
4009 ret = ath10k_wmi_report_radar_found(ar, &radar_info);
4011 ath10k_warn(ar, "failed to send radar found %d\n", ret);
4015 time_left = wait_for_completion_timeout(&ar->wmi.radar_confirm,
4026 ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
4032 ath10k_radar_detected(ar);
4038 spin_lock_bh(&ar->data_lock);
4039 if (ar->radar_conf_state != ATH10K_RADAR_CONFIRMATION_STOPPED)
4040 ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_IDLE;
4041 spin_unlock_bh(&ar->data_lock);
4044 static void ath10k_dfs_radar_report(struct ath10k *ar,
4060 ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
4066 ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
4073 ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
4078 if (!ar->dfs_detector)
4081 spin_lock_bh(&ar->data_lock);
4082 ch = ar->rx_channel;
4086 ch = ar->tgt_oper_chan;
4088 spin_unlock_bh(&ar->data_lock);
4091 ath10k_warn(ar, "failed to derive channel for radar pulse, treating as radar\n");
4114 ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
4118 ATH10K_DFS_STAT_INC(ar, pulses_detected);
4120 if (!ar->dfs_detector->add_pulse(ar->dfs_detector, &pe, &rs)) {
4121 ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
4126 if ((test_bit(WMI_SERVICE_HOST_DFS_CHECK_SUPPORT, ar->wmi.svc_map)) &&
4127 ar->dfs_detector->region == NL80211_DFS_FCC) {
4132 spin_lock_bh(&ar->data_lock);
4133 if (ar->radar_conf_state != ATH10K_RADAR_CONFIRMATION_IDLE) {
4134 spin_unlock_bh(&ar->data_lock);
4137 ar->radar_conf_state = ATH10K_RADAR_CONFIRMATION_INPROGRESS;
4138 radar_info = &ar->last_radar_info;
4148 ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
4153 ieee80211_queue_work(ar->hw, &ar->radar_confirmation_work);
4154 spin_unlock_bh(&ar->data_lock);
4159 ath10k_radar_detected(ar);
4162 static int ath10k_dfs_fft_report(struct ath10k *ar,
4174 ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
4180 ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
4192 ath10k_dbg(ar, ATH10K_DBG_REGULATORY, "dfs false pulse detected\n");
4193 ATH10K_DFS_STAT_INC(ar, pulses_discarded);
4200 void ath10k_wmi_event_dfs(struct ath10k *ar,
4211 ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
4220 ATH10K_DFS_STAT_INC(ar, pulses_total);
4224 ath10k_warn(ar, "too short buf for tlv header (%d)\n",
4232 ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
4239 ath10k_warn(ar, "too short radar pulse summary (%d)\n",
4245 ath10k_dfs_radar_report(ar, phyerr, rr, tsf);
4249 ath10k_warn(ar, "too short fft report (%d)\n",
4255 res = ath10k_dfs_fft_report(ar, phyerr, fftr, tsf);
4265 void ath10k_wmi_event_spectral_scan(struct ath10k *ar,
4279 ath10k_warn(ar, "failed to parse phyerr tlv header at byte %d\n",
4289 ath10k_warn(ar, "failed to parse phyerr tlv payload at byte %d\n",
4297 ath10k_warn(ar, "failed to parse fft report at byte %d\n",
4304 res = ath10k_spectral_process_fft(ar, phyerr,
4308 ath10k_dbg(ar, ATH10K_DBG_WMI, "failed to process fft report: %d\n",
4319 static int ath10k_wmi_op_pull_phyerr_ev_hdr(struct ath10k *ar,
4337 static int ath10k_wmi_10_4_op_pull_phyerr_ev_hdr(struct ath10k *ar,
4357 int ath10k_wmi_op_pull_phyerr_ev(struct ath10k *ar,
4366 ath10k_warn(ar, "wrong phyerr event head len %d (need: >=%zd)\n",
4401 static int ath10k_wmi_10_4_op_pull_phyerr_ev(struct ath10k *ar,
4411 ath10k_warn(ar, "wrong phyerr event head len %d (need: >=%zd)\n",
4440 void ath10k_wmi_event_phyerr(struct ath10k *ar, struct sk_buff *skb)
4449 ATH10K_DFS_STAT_INC(ar, phy_errors);
4451 ret = ath10k_wmi_pull_phyerr_hdr(ar, skb, &hdr_arg);
4453 ath10k_warn(ar, "failed to parse phyerr event hdr: %d\n", ret);
4466 ath10k_dbg(ar, ATH10K_DBG_WMI,
4472 ret = ath10k_wmi_pull_phyerr(ar, phyerr, left_len, &phyerr_arg);
4474 ath10k_warn(ar, "failed to parse phyerr event (%d)\n",
4484 ath10k_warn(ar, "single event (%d) wrong buf len\n", i);
4492 ath10k_wmi_event_dfs(ar, &phyerr_arg, tsf);
4495 ath10k_wmi_event_spectral_scan(ar, &phyerr_arg, tsf);
4498 ath10k_wmi_event_dfs(ar, &phyerr_arg, tsf);
4499 ath10k_wmi_event_spectral_scan(ar, &phyerr_arg, tsf);
4510 ath10k_wmi_10_4_op_pull_dfs_status_ev(struct ath10k *ar, struct sk_buff *skb,
4524 ath10k_wmi_event_dfs_status_check(struct ath10k *ar, struct sk_buff *skb)
4529 ret = ath10k_wmi_pull_dfs_status(ar, skb, &status_arg);
4532 ath10k_warn(ar, "failed to parse dfs status event: %d\n", ret);
4536 ath10k_dbg(ar, ATH10K_DBG_REGULATORY,
4546 ath10k_radar_detected(ar);
4547 complete(&ar->wmi.radar_confirm);
4550 void ath10k_wmi_event_roam(struct ath10k *ar, struct sk_buff *skb)
4558 ret = ath10k_wmi_pull_roam_ev(ar, skb, &arg);
4560 ath10k_warn(ar, "failed to parse roam event: %d\n", ret);
4569 ath10k_dbg(ar, ATH10K_DBG_WMI,
4574 ath10k_warn(ar, "ignoring unknown roam event reason %d on vdev %i\n",
4579 ath10k_mac_handle_beacon_miss(ar, vdev_id);
4585 ath10k_warn(ar, "ignoring not implemented roam event reason %d on vdev %i\n",
4591 void ath10k_wmi_event_profile_match(struct ath10k *ar, struct sk_buff *skb)
4593 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PROFILE_MATCH\n");
4596 void ath10k_wmi_event_debug_print(struct ath10k *ar, struct sk_buff *skb)
4617 ath10k_warn(ar, "wmi debug print truncated: %d\n", skb->len);
4626 ath10k_dbg(ar, ATH10K_DBG_WMI_PRINT, "wmi print '%s'\n", buf);
4629 void ath10k_wmi_event_pdev_qvit(struct ath10k *ar, struct sk_buff *skb)
4631 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PDEV_QVIT_EVENTID\n");
4634 void ath10k_wmi_event_wlan_profile_data(struct ath10k *ar, struct sk_buff *skb)
4636 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_WLAN_PROFILE_DATA_EVENTID\n");
4639 void ath10k_wmi_event_rtt_measurement_report(struct ath10k *ar,
4642 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_RTT_MEASUREMENT_REPORT_EVENTID\n");
4645 void ath10k_wmi_event_tsf_measurement_report(struct ath10k *ar,
4648 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TSF_MEASUREMENT_REPORT_EVENTID\n");
4651 void ath10k_wmi_event_rtt_error_report(struct ath10k *ar, struct sk_buff *skb)
4653 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_RTT_ERROR_REPORT_EVENTID\n");
4656 void ath10k_wmi_event_wow_wakeup_host(struct ath10k *ar, struct sk_buff *skb)
4661 complete(&ar->wow.wakeup_completed);
4663 ret = ath10k_wmi_pull_wow_event(ar, skb, &ev);
4665 ath10k_warn(ar, "failed to parse wow wakeup event: %d\n", ret);
4669 ath10k_dbg(ar, ATH10K_DBG_WMI, "wow wakeup host reason %s\n",
4673 void ath10k_wmi_event_dcs_interference(struct ath10k *ar, struct sk_buff *skb)
4675 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_DCS_INTERFERENCE_EVENTID\n");
4678 static u8 ath10k_tpc_config_get_rate(struct ath10k *ar,
4715 ath10k_warn(ar, "unknown wmi tpc table type: %d\n", type);
4724 static void ath10k_tpc_config_disp_tables(struct ath10k *ar,
4739 ath10k_dbg(ar, ATH10K_DBG_WMI, "CDD not supported\n");
4746 ath10k_dbg(ar, ATH10K_DBG_WMI, "STBC not supported\n");
4753 ath10k_dbg(ar, ATH10K_DBG_WMI, "TXBF not supported\n");
4759 ath10k_dbg(ar, ATH10K_DBG_WMI,
4772 tpc[j] = ath10k_tpc_config_get_rate(ar, ev, i, j + 1,
4882 void ath10k_wmi_event_pdev_tpc_config(struct ath10k *ar, struct sk_buff *skb)
4895 ath10k_warn(ar, "number of tx chain is %d greater than TPC configured tx chain %d\n",
4902 ath10k_warn(ar, "number of rate is %d greater than TPC configured rate %d\n",
4926 ath10k_tpc_config_disp_tables(ar, ev, tpc_stats,
4929 ath10k_tpc_config_disp_tables(ar, ev, tpc_stats,
4932 ath10k_tpc_config_disp_tables(ar, ev, tpc_stats,
4936 ath10k_debug_tpc_stats_process(ar, tpc_stats);
4938 ath10k_dbg(ar, ATH10K_DBG_WMI,
4953 ath10k_wmi_tpc_final_get_rate(struct ath10k *ar,
5019 ath10k_warn(ar, "unknown wmi tpc final index and frequency: %u, %u\n",
5068 ath10k_warn(ar, "unknown wmi tpc final table type: %d\n", type);
5078 ath10k_wmi_tpc_stats_final_disp_tables(struct ath10k *ar,
5093 ath10k_dbg(ar, ATH10K_DBG_WMI, "CDD not supported\n");
5100 ath10k_dbg(ar, ATH10K_DBG_WMI, "STBC not supported\n");
5107 ath10k_dbg(ar, ATH10K_DBG_WMI, "TXBF not supported\n");
5113 ath10k_dbg(ar, ATH10K_DBG_WMI,
5126 tpc[j] = ath10k_wmi_tpc_final_get_rate(ar, ev, i, j + 1,
5139 void ath10k_wmi_event_tpc_final_table(struct ath10k *ar, struct sk_buff *skb)
5151 ath10k_warn(ar, "number of tx chain is %d greater than TPC final configured tx chain %d\n",
5158 ath10k_warn(ar, "number of rate is %d greater than TPC final configured rate %d\n",
5182 ath10k_wmi_tpc_stats_final_disp_tables(ar, ev, tpc_stats,
5185 ath10k_wmi_tpc_stats_final_disp_tables(ar, ev, tpc_stats,
5188 ath10k_wmi_tpc_stats_final_disp_tables(ar, ev, tpc_stats,
5192 ath10k_debug_tpc_stats_final_process(ar, tpc_stats);
5194 ath10k_dbg(ar, ATH10K_DBG_WMI,
5209 ath10k_wmi_handle_tdls_peer_event(struct ath10k *ar, struct sk_buff *skb)
5220 ath10k_err(ar, "received tdls peer event with invalid size (%d bytes)\n",
5230 spin_lock_bh(&ar->data_lock);
5231 peer = ath10k_peer_find(ar, vdev_id, ev->peer_macaddr.addr);
5232 spin_unlock_bh(&ar->data_lock);
5235 ath10k_warn(ar, "failed to find peer entry for %pM\n",
5253 arvif = ath10k_get_arvif(ar, vdev_id);
5255 ath10k_warn(ar, "received tdls peer event for invalid vdev id %u\n",
5264 ath10k_dbg(ar, ATH10K_DBG_WMI,
5269 ath10k_dbg(ar, ATH10K_DBG_WMI,
5277 ath10k_wmi_event_peer_sta_ps_state_chg(struct ath10k *ar, struct sk_buff *skb)
5284 lockdep_assert_held(&ar->data_lock);
5291 sta = ieee80211_find_sta_by_ifaddr(ar->hw, peer_addr, NULL);
5294 ath10k_warn(ar, "failed to find station entry %pM\n",
5306 void ath10k_wmi_event_pdev_ftm_intg(struct ath10k *ar, struct sk_buff *skb)
5308 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PDEV_FTM_INTG_EVENTID\n");
5311 void ath10k_wmi_event_gtk_offload_status(struct ath10k *ar, struct sk_buff *skb)
5313 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_GTK_OFFLOAD_STATUS_EVENTID\n");
5316 void ath10k_wmi_event_gtk_rekey_fail(struct ath10k *ar, struct sk_buff *skb)
5318 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_GTK_REKEY_FAIL_EVENTID\n");
5321 void ath10k_wmi_event_delba_complete(struct ath10k *ar, struct sk_buff *skb)
5323 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TX_DELBA_COMPLETE_EVENTID\n");
5326 void ath10k_wmi_event_addba_complete(struct ath10k *ar, struct sk_buff *skb)
5328 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TX_ADDBA_COMPLETE_EVENTID\n");
5331 void ath10k_wmi_event_vdev_install_key_complete(struct ath10k *ar,
5334 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID\n");
5337 void ath10k_wmi_event_inst_rssi_stats(struct ath10k *ar, struct sk_buff *skb)
5339 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_INST_RSSI_STATS_EVENTID\n");
5342 void ath10k_wmi_event_vdev_standby_req(struct ath10k *ar, struct sk_buff *skb)
5344 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_STANDBY_REQ_EVENTID\n");
5347 void ath10k_wmi_event_vdev_resume_req(struct ath10k *ar, struct sk_buff *skb)
5349 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_RESUME_REQ_EVENTID\n");
5352 static int ath10k_wmi_alloc_chunk(struct ath10k *ar, u32 req_id,
5357 int idx = ar->wmi.num_mem_chunks;
5361 vaddr = dma_alloc_coherent(ar->dev, pool_size, &paddr, GFP_KERNEL);
5366 ar->wmi.mem_chunks[idx].vaddr = vaddr;
5367 ar->wmi.mem_chunks[idx].paddr = paddr;
5368 ar->wmi.mem_chunks[idx].len = pool_size;
5369 ar->wmi.mem_chunks[idx].req_id = req_id;
5370 ar->wmi.num_mem_chunks++;
5375 static int ath10k_wmi_alloc_host_mem(struct ath10k *ar, u32 req_id,
5381 ret = ath10k_wmi_alloc_chunk(ar, req_id, num_units, unit_len);
5392 ath10k_wmi_is_host_mem_allocated(struct ath10k *ar,
5401 if (ar->wmi.num_mem_chunks != num_mem_reqs)
5411 if (ar->num_active_peers)
5412 num_units = ar->num_active_peers + 1;
5414 num_units = ar->max_num_peers + 1;
5416 num_units = ar->max_num_peers + 1;
5418 num_units = ar->max_num_vdevs + 1;
5422 for (j = 0; j < ar->wmi.num_mem_chunks; j++) {
5423 if (ar->wmi.mem_chunks[j].req_id == req_id) {
5425 if (ar->wmi.mem_chunks[j].len == pool_size) {
5439 ath10k_wmi_main_op_pull_svc_rdy_ev(struct ath10k *ar, struct sk_buff *skb,
5481 ath10k_wmi_10x_op_pull_svc_rdy_ev(struct ath10k *ar, struct sk_buff *skb,
5529 struct ath10k *ar = container_of(work, struct ath10k, svc_rdy_work);
5530 struct sk_buff *skb = ar->svc_rdy_skb;
5537 ath10k_warn(ar, "invalid service ready event skb\n");
5541 ret = ath10k_wmi_pull_svc_rdy(ar, skb, &arg);
5543 ath10k_warn(ar, "failed to parse service ready: %d\n", ret);
5547 ath10k_wmi_map_svc(ar, arg.service_map, ar->wmi.svc_map,
5550 ar->hw_min_tx_power = __le32_to_cpu(arg.min_tx_power);
5551 ar->hw_max_tx_power = __le32_to_cpu(arg.max_tx_power);
5552 ar->ht_cap_info = __le32_to_cpu(arg.ht_cap);
5553 ar->vht_cap_info = __le32_to_cpu(arg.vht_cap);
5554 ar->vht_supp_mcs = __le32_to_cpu(arg.vht_supp_mcs);
5555 ar->fw_version_major =
5557 ar->fw_version_minor = (__le32_to_cpu(arg.sw_ver0) & 0x00ffffff);
5558 ar->fw_version_release =
5560 ar->fw_version_build = (__le32_to_cpu(arg.sw_ver1) & 0x0000ffff);
5561 ar->phy_capability = __le32_to_cpu(arg.phy_capab);
5562 ar->num_rf_chains = __le32_to_cpu(arg.num_rf_chains);
5563 ar->hw_eeprom_rd = __le32_to_cpu(arg.eeprom_rd);
5564 ar->low_2ghz_chan = __le32_to_cpu(arg.low_2ghz_chan);
5565 ar->high_2ghz_chan = __le32_to_cpu(arg.high_2ghz_chan);
5566 ar->low_5ghz_chan = __le32_to_cpu(arg.low_5ghz_chan);
5567 ar->high_5ghz_chan = __le32_to_cpu(arg.high_5ghz_chan);
5568 ar->sys_cap_info = __le32_to_cpu(arg.sys_cap_info);
5570 ath10k_dbg_dump(ar, ATH10K_DBG_WMI, NULL, "wmi svc: ",
5572 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi sys_cap_info 0x%x\n",
5573 ar->sys_cap_info);
5575 if (ar->num_rf_chains > ar->max_spatial_stream) {
5576 ath10k_warn(ar, "hardware advertises support for more spatial streams than it should (%d > %d)\n",
5577 ar->num_rf_chains, ar->max_spatial_stream);
5578 ar->num_rf_chains = ar->max_spatial_stream;
5581 if (!ar->cfg_tx_chainmask) {
5582 ar->cfg_tx_chainmask = (1 << ar->num_rf_chains) - 1;
5583 ar->cfg_rx_chainmask = (1 << ar->num_rf_chains) - 1;
5586 if (strlen(ar->hw->wiphy->fw_version) == 0) {
5587 snprintf(ar->hw->wiphy->fw_version,
5588 sizeof(ar->hw->wiphy->fw_version),
5590 ar->fw_version_major,
5591 ar->fw_version_minor,
5592 ar->fw_version_release,
5593 ar->fw_version_build);
5598 ath10k_warn(ar, "requested memory chunks number (%d) exceeds the limit\n",
5603 if (test_bit(WMI_SERVICE_PEER_CACHING, ar->wmi.svc_map)) {
5605 ar->running_fw->fw_file.fw_features))
5606 ar->num_active_peers = TARGET_10_4_QCACHE_ACTIVE_PEERS_PFC +
5607 ar->max_num_vdevs;
5609 ar->num_active_peers = TARGET_10_4_QCACHE_ACTIVE_PEERS +
5610 ar->max_num_vdevs;
5612 ar->max_num_peers = TARGET_10_4_NUM_QCACHE_PEERS_MAX +
5613 ar->max_num_vdevs;
5614 ar->num_tids = ar->num_active_peers * 2;
5615 ar->max_num_stations = TARGET_10_4_NUM_QCACHE_PEERS_MAX;
5622 allocated = ath10k_wmi_is_host_mem_allocated(ar, arg.mem_reqs,
5632 ath10k_wmi_free_host_mem(ar);
5641 if (ar->num_active_peers)
5642 num_units = ar->num_active_peers + 1;
5644 num_units = ar->max_num_peers + 1;
5651 num_units = ar->max_num_peers + 1;
5653 num_units = ar->max_num_vdevs + 1;
5656 ath10k_dbg(ar, ATH10K_DBG_WMI,
5664 ret = ath10k_wmi_alloc_host_mem(ar, req_id, num_units,
5671 ath10k_dbg(ar, ATH10K_DBG_WMI,
5691 ar->svc_rdy_skb = NULL;
5692 complete(&ar->wmi.service_ready);
5695 void ath10k_wmi_event_service_ready(struct ath10k *ar, struct sk_buff *skb)
5697 ar->svc_rdy_skb = skb;
5698 queue_work(ar->workqueue_aux, &ar->svc_rdy_work);
5701 static int ath10k_wmi_op_pull_rdy_ev(struct ath10k *ar, struct sk_buff *skb,
5718 static int ath10k_wmi_op_pull_roam_ev(struct ath10k *ar, struct sk_buff *skb,
5733 static int ath10k_wmi_op_pull_echo_ev(struct ath10k *ar,
5744 int ath10k_wmi_event_ready(struct ath10k *ar, struct sk_buff *skb)
5749 ret = ath10k_wmi_pull_rdy(ar, skb, &arg);
5751 ath10k_warn(ar, "failed to parse ready event: %d\n", ret);
5755 ath10k_dbg(ar, ATH10K_DBG_WMI,
5762 if (is_zero_ether_addr(ar->mac_addr))
5763 ether_addr_copy(ar->mac_addr, arg.mac_addr);
5764 complete(&ar->wmi.unified_ready);
5768 void ath10k_wmi_event_service_available(struct ath10k *ar, struct sk_buff *skb)
5773 ret = ath10k_wmi_pull_svc_avail(ar, skb, &arg);
5775 ath10k_warn(ar, "failed to parse service available event: %d\n",
5784 ath10k_wmi_map_svc_ext(ar, arg.service_map_ext, ar->wmi.svc_map,
5788 static int ath10k_wmi_event_temperature(struct ath10k *ar, struct sk_buff *skb)
5796 ath10k_thermal_event_temperature(ar, __le32_to_cpu(ev->temperature));
5800 static int ath10k_wmi_event_pdev_bss_chan_info(struct ath10k *ar,
5807 u32 cc_freq_hz = ar->hw_params.channel_counters_freq_hz;
5822 ath10k_dbg(ar, ATH10K_DBG_WMI,
5826 spin_lock_bh(&ar->data_lock);
5827 idx = freq_to_idx(ar, freq);
5828 if (idx >= ARRAY_SIZE(ar->survey)) {
5829 ath10k_warn(ar, "bss chan info: invalid frequency %d (idx %d out of bounds)\n",
5834 survey = &ar->survey[idx];
5847 spin_unlock_bh(&ar->data_lock);
5848 complete(&ar->bss_survey_done);
5852 static inline void ath10k_wmi_queue_set_coverage_class_work(struct ath10k *ar)
5854 if (ar->hw_params.hw_ops->set_coverage_class) {
5855 spin_lock_bh(&ar->data_lock);
5862 if (ar->fw_coverage.coverage_class)
5863 queue_work(ar->workqueue, &ar->set_coverage_class_work);
5865 spin_unlock_bh(&ar->data_lock);
5869 static void ath10k_wmi_op_rx(struct ath10k *ar, struct sk_buff *skb)
5880 trace_ath10k_wmi_event(ar, id, skb->data, skb->len);
5884 ath10k_wmi_event_mgmt_rx(ar, skb);
5888 ath10k_wmi_event_scan(ar, skb);
5889 ath10k_wmi_queue_set_coverage_class_work(ar);
5892 ath10k_wmi_event_chan_info(ar, skb);
5895 ath10k_wmi_event_echo(ar, skb);
5898 ath10k_wmi_event_debug_mesg(ar, skb);
5899 ath10k_wmi_queue_set_coverage_class_work(ar);
5902 ath10k_wmi_event_update_stats(ar, skb);
5905 ath10k_wmi_event_vdev_start_resp(ar, skb);
5906 ath10k_wmi_queue_set_coverage_class_work(ar);
5909 ath10k_wmi_event_vdev_stopped(ar, skb);
5910 ath10k_wmi_queue_set_coverage_class_work(ar);
5913 ath10k_wmi_event_peer_sta_kickout(ar, skb);
5916 ath10k_wmi_event_host_swba(ar, skb);
5919 ath10k_wmi_event_tbttoffset_update(ar, skb);
5922 ath10k_wmi_event_phyerr(ar, skb);
5925 ath10k_wmi_event_roam(ar, skb);
5926 ath10k_wmi_queue_set_coverage_class_work(ar);
5929 ath10k_wmi_event_profile_match(ar, skb);
5932 ath10k_wmi_event_debug_print(ar, skb);
5933 ath10k_wmi_queue_set_coverage_class_work(ar);
5936 ath10k_wmi_event_pdev_qvit(ar, skb);
5939 ath10k_wmi_event_wlan_profile_data(ar, skb);
5942 ath10k_wmi_event_rtt_measurement_report(ar, skb);
5945 ath10k_wmi_event_tsf_measurement_report(ar, skb);
5948 ath10k_wmi_event_rtt_error_report(ar, skb);
5951 ath10k_wmi_event_wow_wakeup_host(ar, skb);
5954 ath10k_wmi_event_dcs_interference(ar, skb);
5957 ath10k_wmi_event_pdev_tpc_config(ar, skb);
5960 ath10k_wmi_event_pdev_ftm_intg(ar, skb);
5963 ath10k_wmi_event_gtk_offload_status(ar, skb);
5966 ath10k_wmi_event_gtk_rekey_fail(ar, skb);
5969 ath10k_wmi_event_delba_complete(ar, skb);
5972 ath10k_wmi_event_addba_complete(ar, skb);
5975 ath10k_wmi_event_vdev_install_key_complete(ar, skb);
5978 ath10k_wmi_event_service_ready(ar, skb);
5981 ath10k_wmi_event_ready(ar, skb);
5982 ath10k_wmi_queue_set_coverage_class_work(ar);
5985 ath10k_wmi_event_service_available(ar, skb);
5988 ath10k_warn(ar, "Unknown eventid: %d\n", id);
5996 static void ath10k_wmi_10_1_op_rx(struct ath10k *ar, struct sk_buff *skb)
6008 trace_ath10k_wmi_event(ar, id, skb->data, skb->len);
6010 consumed = ath10k_tm_event_wmi(ar, id, skb);
6017 ath10k_dbg(ar, ATH10K_DBG_WMI,
6024 ath10k_wmi_event_mgmt_rx(ar, skb);
6028 ath10k_wmi_event_scan(ar, skb);
6029 ath10k_wmi_queue_set_coverage_class_work(ar);
6032 ath10k_wmi_event_chan_info(ar, skb);
6035 ath10k_wmi_event_echo(ar, skb);
6038 ath10k_wmi_event_debug_mesg(ar, skb);
6039 ath10k_wmi_queue_set_coverage_class_work(ar);
6042 ath10k_wmi_event_update_stats(ar, skb);
6045 ath10k_wmi_event_vdev_start_resp(ar, skb);
6046 ath10k_wmi_queue_set_coverage_class_work(ar);
6049 ath10k_wmi_event_vdev_stopped(ar, skb);
6050 ath10k_wmi_queue_set_coverage_class_work(ar);
6053 ath10k_wmi_event_peer_sta_kickout(ar, skb);
6056 ath10k_wmi_event_host_swba(ar, skb);
6059 ath10k_wmi_event_tbttoffset_update(ar, skb);
6062 ath10k_wmi_event_phyerr(ar, skb);
6065 ath10k_wmi_event_roam(ar, skb);
6066 ath10k_wmi_queue_set_coverage_class_work(ar);
6069 ath10k_wmi_event_profile_match(ar, skb);
6072 ath10k_wmi_event_debug_print(ar, skb);
6073 ath10k_wmi_queue_set_coverage_class_work(ar);
6076 ath10k_wmi_event_pdev_qvit(ar, skb);
6079 ath10k_wmi_event_wlan_profile_data(ar, skb);
6082 ath10k_wmi_event_rtt_measurement_report(ar, skb);
6085 ath10k_wmi_event_tsf_measurement_report(ar, skb);
6088 ath10k_wmi_event_rtt_error_report(ar, skb);
6091 ath10k_wmi_event_wow_wakeup_host(ar, skb);
6094 ath10k_wmi_event_dcs_interference(ar, skb);
6097 ath10k_wmi_event_pdev_tpc_config(ar, skb);
6100 ath10k_wmi_event_inst_rssi_stats(ar, skb);
6103 ath10k_wmi_event_vdev_standby_req(ar, skb);
6106 ath10k_wmi_event_vdev_resume_req(ar, skb);
6109 ath10k_wmi_event_service_ready(ar, skb);
6112 ath10k_wmi_event_ready(ar, skb);
6113 ath10k_wmi_queue_set_coverage_class_work(ar);
6119 ath10k_warn(ar, "Unknown eventid: %d\n", id);
6127 static void ath10k_wmi_10_2_op_rx(struct ath10k *ar, struct sk_buff *skb)
6139 trace_ath10k_wmi_event(ar, id, skb->data, skb->len);
6141 consumed = ath10k_tm_event_wmi(ar, id, skb);
6148 ath10k_dbg(ar, ATH10K_DBG_WMI,
6155 ath10k_wmi_event_mgmt_rx(ar, skb);
6159 ath10k_wmi_event_scan(ar, skb);
6160 ath10k_wmi_queue_set_coverage_class_work(ar);
6163 ath10k_wmi_event_chan_info(ar, skb);
6166 ath10k_wmi_event_echo(ar, skb);
6169 ath10k_wmi_event_debug_mesg(ar, skb);
6170 ath10k_wmi_queue_set_coverage_class_work(ar);
6173 ath10k_wmi_event_update_stats(ar, skb);
6176 ath10k_wmi_event_vdev_start_resp(ar, skb);
6177 ath10k_wmi_queue_set_coverage_class_work(ar);
6180 ath10k_wmi_event_vdev_stopped(ar, skb);
6181 ath10k_wmi_queue_set_coverage_class_work(ar);
6184 ath10k_wmi_event_peer_sta_kickout(ar, skb);
6187 ath10k_wmi_event_host_swba(ar, skb);
6190 ath10k_wmi_event_tbttoffset_update(ar, skb);
6193 ath10k_wmi_event_phyerr(ar, skb);
6196 ath10k_wmi_event_roam(ar, skb);
6197 ath10k_wmi_queue_set_coverage_class_work(ar);
6200 ath10k_wmi_event_profile_match(ar, skb);
6203 ath10k_wmi_event_debug_print(ar, skb);
6204 ath10k_wmi_queue_set_coverage_class_work(ar);
6207 ath10k_wmi_event_pdev_qvit(ar, skb);
6210 ath10k_wmi_event_wlan_profile_data(ar, skb);
6213 ath10k_wmi_event_rtt_measurement_report(ar, skb);
6216 ath10k_wmi_event_tsf_measurement_report(ar, skb);
6219 ath10k_wmi_event_rtt_error_report(ar, skb);
6222 ath10k_wmi_event_wow_wakeup_host(ar, skb);
6225 ath10k_wmi_event_dcs_interference(ar, skb);
6228 ath10k_wmi_event_pdev_tpc_config(ar, skb);
6231 ath10k_wmi_event_inst_rssi_stats(ar, skb);
6234 ath10k_wmi_event_vdev_standby_req(ar, skb);
6235 ath10k_wmi_queue_set_coverage_class_work(ar);
6238 ath10k_wmi_event_vdev_resume_req(ar, skb);
6239 ath10k_wmi_queue_set_coverage_class_work(ar);
6242 ath10k_wmi_event_service_ready(ar, skb);
6245 ath10k_wmi_event_ready(ar, skb);
6246 ath10k_wmi_queue_set_coverage_class_work(ar);
6249 ath10k_wmi_event_temperature(ar, skb);
6252 ath10k_wmi_event_pdev_bss_chan_info(ar, skb);
6261 ath10k_dbg(ar, ATH10K_DBG_WMI,
6265 ath10k_wmi_event_peer_sta_ps_state_chg(ar, skb);
6268 ath10k_warn(ar, "Unknown eventid: %d\n", id);
6276 static void ath10k_wmi_10_4_op_rx(struct ath10k *ar, struct sk_buff *skb)
6288 trace_ath10k_wmi_event(ar, id, skb->data, skb->len);
6290 consumed = ath10k_tm_event_wmi(ar, id, skb);
6297 ath10k_dbg(ar, ATH10K_DBG_WMI,
6304 ath10k_wmi_event_mgmt_rx(ar, skb);
6308 ath10k_wmi_event_echo(ar, skb);
6311 ath10k_wmi_event_debug_mesg(ar, skb);
6312 ath10k_wmi_queue_set_coverage_class_work(ar);
6315 ath10k_wmi_event_service_ready(ar, skb);
6318 ath10k_wmi_event_scan(ar, skb);
6319 ath10k_wmi_queue_set_coverage_class_work(ar);
6322 ath10k_wmi_event_chan_info(ar, skb);
6325 ath10k_wmi_event_phyerr(ar, skb);
6328 ath10k_wmi_event_ready(ar, skb);
6329 ath10k_wmi_queue_set_coverage_class_work(ar);
6332 ath10k_wmi_event_peer_sta_kickout(ar, skb);
6335 ath10k_wmi_event_roam(ar, skb);
6336 ath10k_wmi_queue_set_coverage_class_work(ar);
6339 ath10k_wmi_event_host_swba(ar, skb);
6342 ath10k_wmi_event_tbttoffset_update(ar, skb);
6345 ath10k_wmi_event_debug_print(ar, skb);
6346 ath10k_wmi_queue_set_coverage_class_work(ar);
6349 ath10k_wmi_event_vdev_start_resp(ar, skb);
6350 ath10k_wmi_queue_set_coverage_class_work(ar);
6353 ath10k_wmi_event_vdev_stopped(ar, skb);
6354 ath10k_wmi_queue_set_coverage_class_work(ar);
6360 ath10k_dbg(ar, ATH10K_DBG_WMI,
6364 ath10k_wmi_event_update_stats(ar, skb);
6367 ath10k_wmi_event_temperature(ar, skb);
6370 ath10k_wmi_event_pdev_bss_chan_info(ar, skb);
6373 ath10k_wmi_event_pdev_tpc_config(ar, skb);
6376 ath10k_wmi_handle_tdls_peer_event(ar, skb);
6379 ath10k_wmi_event_tpc_final_table(ar, skb);
6382 ath10k_wmi_event_dfs_status_check(ar, skb);
6385 ath10k_wmi_event_peer_sta_ps_state_chg(ar, skb);
6388 ath10k_warn(ar, "Unknown eventid: %d\n", id);
6396 static void ath10k_wmi_process_rx(struct ath10k *ar, struct sk_buff *skb)
6400 ret = ath10k_wmi_rx(ar, skb);
6402 ath10k_warn(ar, "failed to process wmi rx: %d\n", ret);
6405 int ath10k_wmi_connect(struct ath10k *ar)
6411 memset(&ar->wmi.svc_map, 0, sizeof(ar->wmi.svc_map));
6424 status = ath10k_htc_connect_service(&ar->htc, &conn_req, &conn_resp);
6426 ath10k_warn(ar, "failed to connect to WMI CONTROL service status: %d\n",
6431 ar->wmi.eid = conn_resp.eid;
6436 ath10k_wmi_op_gen_pdev_set_base_macaddr(struct ath10k *ar,
6442 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6449 ath10k_dbg(ar, ATH10K_DBG_WMI,
6455 ath10k_wmi_op_gen_pdev_set_rd(struct ath10k *ar, u16 rd, u16 rd2g, u16 rd5g,
6462 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6473 ath10k_dbg(ar, ATH10K_DBG_WMI,
6480 ath10k_wmi_10x_op_gen_pdev_set_rd(struct ath10k *ar, u16 rd, u16 rd2g, u16
6487 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6499 ath10k_dbg(ar, ATH10K_DBG_WMI,
6506 ath10k_wmi_op_gen_pdev_suspend(struct ath10k *ar, u32 suspend_opt)
6511 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6522 ath10k_wmi_op_gen_pdev_resume(struct ath10k *ar)
6526 skb = ath10k_wmi_alloc_skb(ar, 0);
6534 ath10k_wmi_op_gen_pdev_set_param(struct ath10k *ar, u32 id, u32 value)
6540 ath10k_warn(ar, "pdev param %d not supported by firmware\n",
6545 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
6553 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev set param %d value %d\n",
6558 void ath10k_wmi_put_host_mem_chunks(struct ath10k *ar,
6564 chunks->count = __cpu_to_le32(ar->wmi.num_mem_chunks);
6566 for (i = 0; i < ar->wmi.num_mem_chunks; i++) {
6568 chunk->ptr = __cpu_to_le32(ar->wmi.mem_chunks[i].paddr);
6569 chunk->size = __cpu_to_le32(ar->wmi.mem_chunks[i].len);
6570 chunk->req_id = __cpu_to_le32(ar->wmi.mem_chunks[i].req_id);
6572 ath10k_dbg(ar, ATH10K_DBG_WMI,
6575 ar->wmi.mem_chunks[i].len,
6576 (unsigned long long)ar->wmi.mem_chunks[i].paddr);
6580 static struct sk_buff *ath10k_wmi_op_gen_init(struct ath10k *ar)
6603 config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode);
6637 buf = ath10k_wmi_alloc_skb(ar, struct_size(cmd, mem_chunks.items,
6638 ar->wmi.num_mem_chunks));
6645 ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);
6647 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init\n");
6651 static struct sk_buff *ath10k_wmi_10_1_op_gen_init(struct ath10k *ar)
6669 config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode);
6700 buf = ath10k_wmi_alloc_skb(ar, struct_size(cmd, mem_chunks.items,
6701 ar->wmi.num_mem_chunks));
6708 ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);
6710 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10x\n");
6714 static struct sk_buff *ath10k_wmi_10_2_op_gen_init(struct ath10k *ar)
6724 if (ath10k_peer_stats_enabled(ar)) {
6739 config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode);
6771 buf = ath10k_wmi_alloc_skb(ar, struct_size(cmd, mem_chunks.items,
6772 ar->wmi.num_mem_chunks));
6780 if (test_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags) &&
6781 test_bit(WMI_SERVICE_COEX_GPIO, ar->wmi.svc_map))
6784 if (ath10k_peer_stats_enabled(ar))
6787 if (test_bit(WMI_SERVICE_BSS_CHANNEL_INFO_64, ar->wmi.svc_map))
6793 ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);
6795 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10.2\n");
6799 static struct sk_buff *ath10k_wmi_10_4_op_gen_init(struct ath10k *ar)
6805 config.num_vdevs = __cpu_to_le32(ar->max_num_vdevs);
6806 config.num_peers = __cpu_to_le32(ar->max_num_peers);
6807 config.num_active_peers = __cpu_to_le32(ar->num_active_peers);
6808 config.num_tids = __cpu_to_le32(ar->num_tids);
6815 config.tx_chain_mask = __cpu_to_le32(ar->hw_params.tx_chain_mask);
6816 config.rx_chain_mask = __cpu_to_le32(ar->hw_params.rx_chain_mask);
6823 config.rx_decap_mode = __cpu_to_le32(ar->wmi.rx_decap_mode);
6847 config.num_msdu_desc = __cpu_to_le32(ar->htt.max_num_pending_tx);
6865 buf = ath10k_wmi_alloc_skb(ar, struct_size(cmd, mem_chunks.items,
6866 ar->wmi.num_mem_chunks));
6872 ath10k_wmi_put_host_mem_chunks(ar, &cmd->mem_chunks);
6874 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi init 10.4\n");
7015 ath10k_wmi_op_gen_start_scan(struct ath10k *ar,
7028 skb = ath10k_wmi_alloc_skb(ar, len);
7039 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi start scan\n");
7044 ath10k_wmi_10x_op_gen_start_scan(struct ath10k *ar,
7057 skb = ath10k_wmi_alloc_skb(ar, len);
7066 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi 10x start scan\n");
7070 void ath10k_wmi_start_scan_init(struct ath10k *ar,
7097 ath10k_wmi_op_gen_stop_scan(struct ath10k *ar,
7110 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7126 ath10k_dbg(ar, ATH10K_DBG_WMI,
7133 ath10k_wmi_op_gen_vdev_create(struct ath10k *ar, u32 vdev_id,
7141 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7151 ath10k_dbg(ar, ATH10K_DBG_WMI,
7158 ath10k_wmi_op_gen_vdev_delete(struct ath10k *ar, u32 vdev_id)
7163 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7170 ath10k_dbg(ar, ATH10K_DBG_WMI,
7176 ath10k_wmi_op_gen_vdev_start(struct ath10k *ar,
7195 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7218 ath10k_wmi_put_wmi_channel(ar, &cmd->chan, &arg->channel);
7220 ath10k_dbg(ar, ATH10K_DBG_WMI,
7230 ath10k_wmi_op_gen_vdev_stop(struct ath10k *ar, u32 vdev_id)
7235 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7242 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi vdev stop id 0x%x\n", vdev_id);
7247 ath10k_wmi_op_gen_vdev_up(struct ath10k *ar, u32 vdev_id, u32 aid,
7253 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7262 ath10k_dbg(ar, ATH10K_DBG_WMI,
7269 ath10k_wmi_op_gen_vdev_down(struct ath10k *ar, u32 vdev_id)
7274 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7281 ath10k_dbg(ar, ATH10K_DBG_WMI,
7287 ath10k_wmi_op_gen_vdev_set_param(struct ath10k *ar, u32 vdev_id,
7294 ath10k_dbg(ar, ATH10K_DBG_WMI,
7300 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7309 ath10k_dbg(ar, ATH10K_DBG_WMI,
7316 ath10k_wmi_op_gen_vdev_install_key(struct ath10k *ar,
7327 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd) + arg->key_len);
7345 ath10k_dbg(ar, ATH10K_DBG_WMI,
7352 ath10k_wmi_op_gen_vdev_spectral_conf(struct ath10k *ar,
7358 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7387 ath10k_wmi_op_gen_vdev_spectral_enable(struct ath10k *ar, u32 vdev_id,
7393 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7406 ath10k_wmi_op_gen_peer_create(struct ath10k *ar, u32 vdev_id,
7413 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7422 ath10k_dbg(ar, ATH10K_DBG_WMI,
7429 ath10k_wmi_op_gen_peer_delete(struct ath10k *ar, u32 vdev_id,
7435 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7443 ath10k_dbg(ar, ATH10K_DBG_WMI,
7450 ath10k_wmi_op_gen_peer_flush(struct ath10k *ar, u32 vdev_id,
7456 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7465 ath10k_dbg(ar, ATH10K_DBG_WMI,
7472 ath10k_wmi_op_gen_peer_set_param(struct ath10k *ar, u32 vdev_id,
7480 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7490 ath10k_dbg(ar, ATH10K_DBG_WMI,
7497 ath10k_wmi_op_gen_set_psmode(struct ath10k *ar, u32 vdev_id,
7503 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7511 ath10k_dbg(ar, ATH10K_DBG_WMI,
7518 ath10k_wmi_op_gen_set_sta_ps(struct ath10k *ar, u32 vdev_id,
7525 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7534 ath10k_dbg(ar, ATH10K_DBG_STA,
7541 ath10k_wmi_op_gen_set_ap_ps(struct ath10k *ar, u32 vdev_id, const u8 *mac,
7550 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7560 ath10k_dbg(ar, ATH10K_DBG_WMI,
7567 ath10k_wmi_op_gen_scan_chan_list(struct ath10k *ar,
7576 skb = ath10k_wmi_alloc_skb(ar, struct_size(cmd, chan_info, arg->n_channels));
7587 ath10k_wmi_put_wmi_channel(ar, ci, ch);
7594 ath10k_wmi_peer_assoc_fill(struct ath10k *ar, void *buf,
7636 ath10k_wmi_peer_assoc_fill_main(struct ath10k *ar, void *buf,
7641 ath10k_wmi_peer_assoc_fill(ar, buf, arg);
7646 ath10k_wmi_peer_assoc_fill_10_1(struct ath10k *ar, void *buf,
7649 ath10k_wmi_peer_assoc_fill(ar, buf, arg);
7653 ath10k_wmi_peer_assoc_fill_10_2(struct ath10k *ar, void *buf,
7667 ath10k_wmi_peer_assoc_fill(ar, buf, arg);
7672 ath10k_wmi_peer_assoc_fill_10_4(struct ath10k *ar, void *buf,
7677 ath10k_wmi_peer_assoc_fill_10_2(ar, buf, arg);
7696 ath10k_wmi_op_gen_peer_assoc(struct ath10k *ar,
7707 skb = ath10k_wmi_alloc_skb(ar, len);
7711 ath10k_wmi_peer_assoc_fill_main(ar, skb->data, arg);
7713 ath10k_dbg(ar, ATH10K_DBG_WMI,
7721 ath10k_wmi_10_1_op_gen_peer_assoc(struct ath10k *ar,
7732 skb = ath10k_wmi_alloc_skb(ar, len);
7736 ath10k_wmi_peer_assoc_fill_10_1(ar, skb->data, arg);
7738 ath10k_dbg(ar, ATH10K_DBG_WMI,
7746 ath10k_wmi_10_2_op_gen_peer_assoc(struct ath10k *ar,
7757 skb = ath10k_wmi_alloc_skb(ar, len);
7761 ath10k_wmi_peer_assoc_fill_10_2(ar, skb->data, arg);
7763 ath10k_dbg(ar, ATH10K_DBG_WMI,
7771 ath10k_wmi_10_4_op_gen_peer_assoc(struct ath10k *ar,
7782 skb = ath10k_wmi_alloc_skb(ar, len);
7786 ath10k_wmi_peer_assoc_fill_10_4(ar, skb->data, arg);
7788 ath10k_dbg(ar, ATH10K_DBG_WMI,
7796 ath10k_wmi_10_2_op_gen_pdev_get_temperature(struct ath10k *ar)
7800 skb = ath10k_wmi_alloc_skb(ar, 0);
7804 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev get temperature\n");
7809 ath10k_wmi_10_2_op_gen_pdev_bss_chan_info(struct ath10k *ar,
7815 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7822 ath10k_dbg(ar, ATH10K_DBG_WMI,
7830 ath10k_wmi_op_gen_beacon_dma(struct ath10k *ar, u32 vdev_id, const void *bcn,
7839 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7876 ath10k_wmi_op_gen_pdev_set_wmm(struct ath10k *ar,
7882 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7892 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi pdev set wmm params\n");
7897 ath10k_wmi_op_gen_request_stats(struct ath10k *ar, u32 stats_mask)
7902 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7909 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi request stats 0x%08x\n",
7915 ath10k_wmi_op_gen_force_fw_hang(struct ath10k *ar,
7921 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7929 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi force fw hang %d delay %d\n",
7935 ath10k_wmi_op_gen_dbglog_cfg(struct ath10k *ar, u64 module_enable,
7942 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
7963 ath10k_dbg(ar, ATH10K_DBG_WMI,
7973 ath10k_wmi_10_4_op_gen_dbglog_cfg(struct ath10k *ar, u64 module_enable,
7980 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8001 ath10k_dbg(ar, ATH10K_DBG_WMI,
8011 ath10k_wmi_op_gen_pktlog_enable(struct ath10k *ar, u32 ev_bitmap)
8016 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8025 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi enable pktlog filter 0x%08x\n",
8031 ath10k_wmi_op_gen_pktlog_disable(struct ath10k *ar)
8035 skb = ath10k_wmi_alloc_skb(ar, 0);
8039 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi disable pktlog\n");
8044 ath10k_wmi_op_gen_pdev_set_quiet_mode(struct ath10k *ar, u32 period,
8051 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8061 ath10k_dbg(ar, ATH10K_DBG_WMI,
8068 ath10k_wmi_op_gen_addba_clear_resp(struct ath10k *ar, u32 vdev_id,
8077 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8085 ath10k_dbg(ar, ATH10K_DBG_WMI,
8092 ath10k_wmi_op_gen_addba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac,
8101 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8111 ath10k_dbg(ar, ATH10K_DBG_WMI,
8118 ath10k_wmi_op_gen_addba_set_resp(struct ath10k *ar, u32 vdev_id, const u8 *mac,
8127 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8137 ath10k_dbg(ar, ATH10K_DBG_WMI,
8144 ath10k_wmi_op_gen_delba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac,
8153 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8164 ath10k_dbg(ar, ATH10K_DBG_WMI,
8171 ath10k_wmi_10_2_4_op_gen_pdev_get_tpc_config(struct ath10k *ar, u32 param)
8176 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8183 ath10k_dbg(ar, ATH10K_DBG_WMI,
8443 void ath10k_wmi_main_op_fw_stats_fill(struct ath10k *ar,
8455 spin_lock_bh(&ar->data_lock);
8460 ath10k_warn(ar, "failed to get pdev stats\n");
8493 spin_unlock_bh(&ar->data_lock);
8501 void ath10k_wmi_10x_op_fw_stats_fill(struct ath10k *ar,
8513 spin_lock_bh(&ar->data_lock);
8518 ath10k_warn(ar, "failed to get pdev stats\n");
8552 spin_unlock_bh(&ar->data_lock);
8561 ath10k_wmi_op_gen_pdev_enable_adaptive_cca(struct ath10k *ar, u8 enable,
8567 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8576 ath10k_dbg(ar, ATH10K_DBG_WMI,
8648 void ath10k_wmi_10_4_op_fw_stats_fill(struct ath10k *ar,
8661 spin_lock_bh(&ar->data_lock);
8666 ath10k_warn(ar, "failed to get pdev stats\n");
8732 spin_unlock_bh(&ar->data_lock);
8740 int ath10k_wmi_op_get_vdev_subtype(struct ath10k *ar,
8761 static int ath10k_wmi_10_2_4_op_get_vdev_subtype(struct ath10k *ar,
8783 static int ath10k_wmi_10_4_op_get_vdev_subtype(struct ath10k *ar,
8806 ath10k_wmi_10_4_ext_resource_config(struct ath10k *ar,
8814 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8818 if (test_bit(WMI_SERVICE_TDLS_UAPSD_SLEEP_STA, ar->wmi.svc_map))
8824 cmd->wlan_gpio_priority = __cpu_to_le32(ar->coex_gpio_pin);
8835 ath10k_dbg(ar, ATH10K_DBG_WMI,
8842 ath10k_wmi_10_4_gen_update_fw_tdls_state(struct ath10k *ar, u32 vdev_id,
8849 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8853 if (test_bit(WMI_SERVICE_TDLS_EXPLICIT_MODE_ONLY, ar->wmi.svc_map) &&
8857 if (test_bit(WMI_SERVICE_TDLS_UAPSD_BUFFER_STA, ar->wmi.svc_map))
8877 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi update fw tdls state %d for vdev %i\n",
8901 ath10k_wmi_10_4_op_gen_pdev_get_tpc_table_cmdid(struct ath10k *ar, u32 param)
8906 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8913 ath10k_dbg(ar, ATH10K_DBG_WMI,
8919 ath10k_wmi_10_4_gen_tdls_peer_update(struct ath10k *ar,
8937 skb = ath10k_wmi_alloc_skb(ar, len);
8967 ath10k_wmi_put_wmi_channel(ar, chan, &chan_arg[i]);
8970 ath10k_dbg(ar, ATH10K_DBG_WMI,
8977 ath10k_wmi_10_4_gen_radar_found(struct ath10k *ar,
8983 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
8995 ath10k_dbg(ar, ATH10K_DBG_WMI,
9003 ath10k_wmi_10_4_gen_per_peer_per_tid_cfg(struct ath10k *ar,
9009 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
9027 ath10k_dbg(ar, ATH10K_DBG_WMI,
9036 ath10k_wmi_op_gen_echo(struct ath10k *ar, u32 value)
9041 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
9048 ath10k_dbg(ar, ATH10K_DBG_WMI,
9054 ath10k_wmi_barrier(struct ath10k *ar)
9059 spin_lock_bh(&ar->data_lock);
9060 reinit_completion(&ar->wmi.barrier);
9061 spin_unlock_bh(&ar->data_lock);
9063 ret = ath10k_wmi_echo(ar, ATH10K_WMI_BARRIER_ECHO_ID);
9065 ath10k_warn(ar, "failed to submit wmi echo: %d\n", ret);
9069 time_left = wait_for_completion_timeout(&ar->wmi.barrier,
9078 ath10k_wmi_10_2_4_op_gen_bb_timing(struct ath10k *ar,
9084 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd));
9092 ath10k_dbg(ar, ATH10K_DBG_WMI,
9456 int ath10k_wmi_attach(struct ath10k *ar)
9458 switch (ar->running_fw->fw_file.wmi_op_version) {
9460 ar->wmi.ops = &wmi_10_4_ops;
9461 ar->wmi.cmd = &wmi_10_4_cmd_map;
9462 ar->wmi.vdev_param = &wmi_10_4_vdev_param_map;
9463 ar->wmi.pdev_param = &wmi_10_4_pdev_param_map;
9464 ar->wmi.peer_param = &wmi_peer_param_map;
9465 ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
9466 ar->wmi_key_cipher = wmi_key_cipher_suites;
9469 ar->wmi.cmd = &wmi_10_2_4_cmd_map;
9470 ar->wmi.ops = &wmi_10_2_4_ops;
9471 ar->wmi.vdev_param = &wmi_10_2_4_vdev_param_map;
9472 ar->wmi.pdev_param = &wmi_10_2_4_pdev_param_map;
9473 ar->wmi.peer_param = &wmi_peer_param_map;
9474 ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
9475 ar->wmi_key_cipher = wmi_key_cipher_suites;
9478 ar->wmi.cmd = &wmi_10_2_cmd_map;
9479 ar->wmi.ops = &wmi_10_2_ops;
9480 ar->wmi.vdev_param = &wmi_10x_vdev_param_map;
9481 ar->wmi.pdev_param = &wmi_10x_pdev_param_map;
9482 ar->wmi.peer_param = &wmi_peer_param_map;
9483 ar->wmi.peer_flags = &wmi_10_2_peer_flags_map;
9484 ar->wmi_key_cipher = wmi_key_cipher_suites;
9487 ar->wmi.cmd = &wmi_10x_cmd_map;
9488 ar->wmi.ops = &wmi_10_1_ops;
9489 ar->wmi.vdev_param = &wmi_10x_vdev_param_map;
9490 ar->wmi.pdev_param = &wmi_10x_pdev_param_map;
9491 ar->wmi.peer_param = &wmi_peer_param_map;
9492 ar->wmi.peer_flags = &wmi_10x_peer_flags_map;
9493 ar->wmi_key_cipher = wmi_key_cipher_suites;
9496 ar->wmi.cmd = &wmi_cmd_map;
9497 ar->wmi.ops = &wmi_ops;
9498 ar->wmi.vdev_param = &wmi_vdev_param_map;
9499 ar->wmi.pdev_param = &wmi_pdev_param_map;
9500 ar->wmi.peer_param = &wmi_peer_param_map;
9501 ar->wmi.peer_flags = &wmi_peer_flags_map;
9502 ar->wmi_key_cipher = wmi_key_cipher_suites;
9505 ath10k_wmi_tlv_attach(ar);
9506 ar->wmi_key_cipher = wmi_tlv_key_cipher_suites;
9510 ath10k_err(ar, "unsupported WMI op version: %d\n",
9511 ar->running_fw->fw_file.wmi_op_version);
9515 init_completion(&ar->wmi.service_ready);
9516 init_completion(&ar->wmi.unified_ready);
9517 init_completion(&ar->wmi.barrier);
9518 init_completion(&ar->wmi.radar_confirm);
9520 INIT_WORK(&ar->svc_rdy_work, ath10k_wmi_event_service_ready_work);
9521 INIT_WORK(&ar->radar_confirmation_work,
9525 ar->running_fw->fw_file.fw_features)) {
9526 idr_init(&ar->wmi.mgmt_pending_tx);
9532 void ath10k_wmi_free_host_mem(struct ath10k *ar)
9537 for (i = 0; i < ar->wmi.num_mem_chunks; i++) {
9538 dma_free_coherent(ar->dev,
9539 ar->wmi.mem_chunks[i].len,
9540 ar->wmi.mem_chunks[i].vaddr,
9541 ar->wmi.mem_chunks[i].paddr);
9544 ar->wmi.num_mem_chunks = 0;
9551 struct ath10k *ar = ctx;
9554 ath10k_dbg(ar, ATH10K_DBG_WMI,
9558 dma_unmap_single(ar->dev, pkt_addr->paddr,
9560 ieee80211_free_txskb(ar->hw, msdu);
9565 void ath10k_wmi_detach(struct ath10k *ar)
9568 ar->running_fw->fw_file.fw_features)) {
9569 spin_lock_bh(&ar->data_lock);
9570 idr_for_each(&ar->wmi.mgmt_pending_tx,
9571 ath10k_wmi_mgmt_tx_clean_up_pending, ar);
9572 idr_destroy(&ar->wmi.mgmt_pending_tx);
9573 spin_unlock_bh(&ar->data_lock);
9576 cancel_work_sync(&ar->svc_rdy_work);
9577 dev_kfree_skb(ar->svc_rdy_skb);