diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath10k/wmi.c')
-rw-r--r-- | drivers/net/wireless/ath/ath10k/wmi.c | 1087 |
1 files changed, 1033 insertions, 54 deletions
diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c index 33cb19eb3d89..ccf3597fd9e2 100644 --- a/drivers/net/wireless/ath/ath10k/wmi.c +++ b/drivers/net/wireless/ath/ath10k/wmi.c | |||
@@ -23,6 +23,471 @@ | |||
23 | #include "wmi.h" | 23 | #include "wmi.h" |
24 | #include "mac.h" | 24 | #include "mac.h" |
25 | 25 | ||
26 | /* MAIN WMI cmd track */ | ||
27 | static struct wmi_cmd_map wmi_cmd_map = { | ||
28 | .init_cmdid = WMI_INIT_CMDID, | ||
29 | .start_scan_cmdid = WMI_START_SCAN_CMDID, | ||
30 | .stop_scan_cmdid = WMI_STOP_SCAN_CMDID, | ||
31 | .scan_chan_list_cmdid = WMI_SCAN_CHAN_LIST_CMDID, | ||
32 | .scan_sch_prio_tbl_cmdid = WMI_SCAN_SCH_PRIO_TBL_CMDID, | ||
33 | .pdev_set_regdomain_cmdid = WMI_PDEV_SET_REGDOMAIN_CMDID, | ||
34 | .pdev_set_channel_cmdid = WMI_PDEV_SET_CHANNEL_CMDID, | ||
35 | .pdev_set_param_cmdid = WMI_PDEV_SET_PARAM_CMDID, | ||
36 | .pdev_pktlog_enable_cmdid = WMI_PDEV_PKTLOG_ENABLE_CMDID, | ||
37 | .pdev_pktlog_disable_cmdid = WMI_PDEV_PKTLOG_DISABLE_CMDID, | ||
38 | .pdev_set_wmm_params_cmdid = WMI_PDEV_SET_WMM_PARAMS_CMDID, | ||
39 | .pdev_set_ht_cap_ie_cmdid = WMI_PDEV_SET_HT_CAP_IE_CMDID, | ||
40 | .pdev_set_vht_cap_ie_cmdid = WMI_PDEV_SET_VHT_CAP_IE_CMDID, | ||
41 | .pdev_set_dscp_tid_map_cmdid = WMI_PDEV_SET_DSCP_TID_MAP_CMDID, | ||
42 | .pdev_set_quiet_mode_cmdid = WMI_PDEV_SET_QUIET_MODE_CMDID, | ||
43 | .pdev_green_ap_ps_enable_cmdid = WMI_PDEV_GREEN_AP_PS_ENABLE_CMDID, | ||
44 | .pdev_get_tpc_config_cmdid = WMI_PDEV_GET_TPC_CONFIG_CMDID, | ||
45 | .pdev_set_base_macaddr_cmdid = WMI_PDEV_SET_BASE_MACADDR_CMDID, | ||
46 | .vdev_create_cmdid = WMI_VDEV_CREATE_CMDID, | ||
47 | .vdev_delete_cmdid = WMI_VDEV_DELETE_CMDID, | ||
48 | .vdev_start_request_cmdid = WMI_VDEV_START_REQUEST_CMDID, | ||
49 | .vdev_restart_request_cmdid = WMI_VDEV_RESTART_REQUEST_CMDID, | ||
50 | .vdev_up_cmdid = WMI_VDEV_UP_CMDID, | ||
51 | .vdev_stop_cmdid = WMI_VDEV_STOP_CMDID, | ||
52 | .vdev_down_cmdid = WMI_VDEV_DOWN_CMDID, | ||
53 | .vdev_set_param_cmdid = WMI_VDEV_SET_PARAM_CMDID, | ||
54 | .vdev_install_key_cmdid = WMI_VDEV_INSTALL_KEY_CMDID, | ||
55 | .peer_create_cmdid = WMI_PEER_CREATE_CMDID, | ||
56 | .peer_delete_cmdid = WMI_PEER_DELETE_CMDID, | ||
57 | .peer_flush_tids_cmdid = WMI_PEER_FLUSH_TIDS_CMDID, | ||
58 | .peer_set_param_cmdid = WMI_PEER_SET_PARAM_CMDID, | ||
59 | .peer_assoc_cmdid = WMI_PEER_ASSOC_CMDID, | ||
60 | .peer_add_wds_entry_cmdid = WMI_PEER_ADD_WDS_ENTRY_CMDID, | ||
61 | .peer_remove_wds_entry_cmdid = WMI_PEER_REMOVE_WDS_ENTRY_CMDID, | ||
62 | .peer_mcast_group_cmdid = WMI_PEER_MCAST_GROUP_CMDID, | ||
63 | .bcn_tx_cmdid = WMI_BCN_TX_CMDID, | ||
64 | .pdev_send_bcn_cmdid = WMI_PDEV_SEND_BCN_CMDID, | ||
65 | .bcn_tmpl_cmdid = WMI_BCN_TMPL_CMDID, | ||
66 | .bcn_filter_rx_cmdid = WMI_BCN_FILTER_RX_CMDID, | ||
67 | .prb_req_filter_rx_cmdid = WMI_PRB_REQ_FILTER_RX_CMDID, | ||
68 | .mgmt_tx_cmdid = WMI_MGMT_TX_CMDID, | ||
69 | .prb_tmpl_cmdid = WMI_PRB_TMPL_CMDID, | ||
70 | .addba_clear_resp_cmdid = WMI_ADDBA_CLEAR_RESP_CMDID, | ||
71 | .addba_send_cmdid = WMI_ADDBA_SEND_CMDID, | ||
72 | .addba_status_cmdid = WMI_ADDBA_STATUS_CMDID, | ||
73 | .delba_send_cmdid = WMI_DELBA_SEND_CMDID, | ||
74 | .addba_set_resp_cmdid = WMI_ADDBA_SET_RESP_CMDID, | ||
75 | .send_singleamsdu_cmdid = WMI_SEND_SINGLEAMSDU_CMDID, | ||
76 | .sta_powersave_mode_cmdid = WMI_STA_POWERSAVE_MODE_CMDID, | ||
77 | .sta_powersave_param_cmdid = WMI_STA_POWERSAVE_PARAM_CMDID, | ||
78 | .sta_mimo_ps_mode_cmdid = WMI_STA_MIMO_PS_MODE_CMDID, | ||
79 | .pdev_dfs_enable_cmdid = WMI_PDEV_DFS_ENABLE_CMDID, | ||
80 | .pdev_dfs_disable_cmdid = WMI_PDEV_DFS_DISABLE_CMDID, | ||
81 | .roam_scan_mode = WMI_ROAM_SCAN_MODE, | ||
82 | .roam_scan_rssi_threshold = WMI_ROAM_SCAN_RSSI_THRESHOLD, | ||
83 | .roam_scan_period = WMI_ROAM_SCAN_PERIOD, | ||
84 | .roam_scan_rssi_change_threshold = WMI_ROAM_SCAN_RSSI_CHANGE_THRESHOLD, | ||
85 | .roam_ap_profile = WMI_ROAM_AP_PROFILE, | ||
86 | .ofl_scan_add_ap_profile = WMI_ROAM_AP_PROFILE, | ||
87 | .ofl_scan_remove_ap_profile = WMI_OFL_SCAN_REMOVE_AP_PROFILE, | ||
88 | .ofl_scan_period = WMI_OFL_SCAN_PERIOD, | ||
89 | .p2p_dev_set_device_info = WMI_P2P_DEV_SET_DEVICE_INFO, | ||
90 | .p2p_dev_set_discoverability = WMI_P2P_DEV_SET_DISCOVERABILITY, | ||
91 | .p2p_go_set_beacon_ie = WMI_P2P_GO_SET_BEACON_IE, | ||
92 | .p2p_go_set_probe_resp_ie = WMI_P2P_GO_SET_PROBE_RESP_IE, | ||
93 | .p2p_set_vendor_ie_data_cmdid = WMI_P2P_SET_VENDOR_IE_DATA_CMDID, | ||
94 | .ap_ps_peer_param_cmdid = WMI_AP_PS_PEER_PARAM_CMDID, | ||
95 | .ap_ps_peer_uapsd_coex_cmdid = WMI_AP_PS_PEER_UAPSD_COEX_CMDID, | ||
96 | .peer_rate_retry_sched_cmdid = WMI_PEER_RATE_RETRY_SCHED_CMDID, | ||
97 | .wlan_profile_trigger_cmdid = WMI_WLAN_PROFILE_TRIGGER_CMDID, | ||
98 | .wlan_profile_set_hist_intvl_cmdid = | ||
99 | WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID, | ||
100 | .wlan_profile_get_profile_data_cmdid = | ||
101 | WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID, | ||
102 | .wlan_profile_enable_profile_id_cmdid = | ||
103 | WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID, | ||
104 | .wlan_profile_list_profile_id_cmdid = | ||
105 | WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID, | ||
106 | .pdev_suspend_cmdid = WMI_PDEV_SUSPEND_CMDID, | ||
107 | .pdev_resume_cmdid = WMI_PDEV_RESUME_CMDID, | ||
108 | .add_bcn_filter_cmdid = WMI_ADD_BCN_FILTER_CMDID, | ||
109 | .rmv_bcn_filter_cmdid = WMI_RMV_BCN_FILTER_CMDID, | ||
110 | .wow_add_wake_pattern_cmdid = WMI_WOW_ADD_WAKE_PATTERN_CMDID, | ||
111 | .wow_del_wake_pattern_cmdid = WMI_WOW_DEL_WAKE_PATTERN_CMDID, | ||
112 | .wow_enable_disable_wake_event_cmdid = | ||
113 | WMI_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID, | ||
114 | .wow_enable_cmdid = WMI_WOW_ENABLE_CMDID, | ||
115 | .wow_hostwakeup_from_sleep_cmdid = WMI_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID, | ||
116 | .rtt_measreq_cmdid = WMI_RTT_MEASREQ_CMDID, | ||
117 | .rtt_tsf_cmdid = WMI_RTT_TSF_CMDID, | ||
118 | .vdev_spectral_scan_configure_cmdid = | ||
119 | WMI_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID, | ||
120 | .vdev_spectral_scan_enable_cmdid = WMI_VDEV_SPECTRAL_SCAN_ENABLE_CMDID, | ||
121 | .request_stats_cmdid = WMI_REQUEST_STATS_CMDID, | ||
122 | .set_arp_ns_offload_cmdid = WMI_SET_ARP_NS_OFFLOAD_CMDID, | ||
123 | .network_list_offload_config_cmdid = | ||
124 | WMI_NETWORK_LIST_OFFLOAD_CONFIG_CMDID, | ||
125 | .gtk_offload_cmdid = WMI_GTK_OFFLOAD_CMDID, | ||
126 | .csa_offload_enable_cmdid = WMI_CSA_OFFLOAD_ENABLE_CMDID, | ||
127 | .csa_offload_chanswitch_cmdid = WMI_CSA_OFFLOAD_CHANSWITCH_CMDID, | ||
128 | .chatter_set_mode_cmdid = WMI_CHATTER_SET_MODE_CMDID, | ||
129 | .peer_tid_addba_cmdid = WMI_PEER_TID_ADDBA_CMDID, | ||
130 | .peer_tid_delba_cmdid = WMI_PEER_TID_DELBA_CMDID, | ||
131 | .sta_dtim_ps_method_cmdid = WMI_STA_DTIM_PS_METHOD_CMDID, | ||
132 | .sta_uapsd_auto_trig_cmdid = WMI_STA_UAPSD_AUTO_TRIG_CMDID, | ||
133 | .sta_keepalive_cmd = WMI_STA_KEEPALIVE_CMD, | ||
134 | .echo_cmdid = WMI_ECHO_CMDID, | ||
135 | .pdev_utf_cmdid = WMI_PDEV_UTF_CMDID, | ||
136 | .dbglog_cfg_cmdid = WMI_DBGLOG_CFG_CMDID, | ||
137 | .pdev_qvit_cmdid = WMI_PDEV_QVIT_CMDID, | ||
138 | .pdev_ftm_intg_cmdid = WMI_PDEV_FTM_INTG_CMDID, | ||
139 | .vdev_set_keepalive_cmdid = WMI_VDEV_SET_KEEPALIVE_CMDID, | ||
140 | .vdev_get_keepalive_cmdid = WMI_VDEV_GET_KEEPALIVE_CMDID, | ||
141 | .force_fw_hang_cmdid = WMI_FORCE_FW_HANG_CMDID, | ||
142 | .gpio_config_cmdid = WMI_GPIO_CONFIG_CMDID, | ||
143 | .gpio_output_cmdid = WMI_GPIO_OUTPUT_CMDID, | ||
144 | }; | ||
145 | |||
146 | /* 10.X WMI cmd track */ | ||
147 | static struct wmi_cmd_map wmi_10x_cmd_map = { | ||
148 | .init_cmdid = WMI_10X_INIT_CMDID, | ||
149 | .start_scan_cmdid = WMI_10X_START_SCAN_CMDID, | ||
150 | .stop_scan_cmdid = WMI_10X_STOP_SCAN_CMDID, | ||
151 | .scan_chan_list_cmdid = WMI_10X_SCAN_CHAN_LIST_CMDID, | ||
152 | .scan_sch_prio_tbl_cmdid = WMI_CMD_UNSUPPORTED, | ||
153 | .pdev_set_regdomain_cmdid = WMI_10X_PDEV_SET_REGDOMAIN_CMDID, | ||
154 | .pdev_set_channel_cmdid = WMI_10X_PDEV_SET_CHANNEL_CMDID, | ||
155 | .pdev_set_param_cmdid = WMI_10X_PDEV_SET_PARAM_CMDID, | ||
156 | .pdev_pktlog_enable_cmdid = WMI_10X_PDEV_PKTLOG_ENABLE_CMDID, | ||
157 | .pdev_pktlog_disable_cmdid = WMI_10X_PDEV_PKTLOG_DISABLE_CMDID, | ||
158 | .pdev_set_wmm_params_cmdid = WMI_10X_PDEV_SET_WMM_PARAMS_CMDID, | ||
159 | .pdev_set_ht_cap_ie_cmdid = WMI_10X_PDEV_SET_HT_CAP_IE_CMDID, | ||
160 | .pdev_set_vht_cap_ie_cmdid = WMI_10X_PDEV_SET_VHT_CAP_IE_CMDID, | ||
161 | .pdev_set_dscp_tid_map_cmdid = WMI_10X_PDEV_SET_DSCP_TID_MAP_CMDID, | ||
162 | .pdev_set_quiet_mode_cmdid = WMI_10X_PDEV_SET_QUIET_MODE_CMDID, | ||
163 | .pdev_green_ap_ps_enable_cmdid = WMI_10X_PDEV_GREEN_AP_PS_ENABLE_CMDID, | ||
164 | .pdev_get_tpc_config_cmdid = WMI_10X_PDEV_GET_TPC_CONFIG_CMDID, | ||
165 | .pdev_set_base_macaddr_cmdid = WMI_10X_PDEV_SET_BASE_MACADDR_CMDID, | ||
166 | .vdev_create_cmdid = WMI_10X_VDEV_CREATE_CMDID, | ||
167 | .vdev_delete_cmdid = WMI_10X_VDEV_DELETE_CMDID, | ||
168 | .vdev_start_request_cmdid = WMI_10X_VDEV_START_REQUEST_CMDID, | ||
169 | .vdev_restart_request_cmdid = WMI_10X_VDEV_RESTART_REQUEST_CMDID, | ||
170 | .vdev_up_cmdid = WMI_10X_VDEV_UP_CMDID, | ||
171 | .vdev_stop_cmdid = WMI_10X_VDEV_STOP_CMDID, | ||
172 | .vdev_down_cmdid = WMI_10X_VDEV_DOWN_CMDID, | ||
173 | .vdev_set_param_cmdid = WMI_10X_VDEV_SET_PARAM_CMDID, | ||
174 | .vdev_install_key_cmdid = WMI_10X_VDEV_INSTALL_KEY_CMDID, | ||
175 | .peer_create_cmdid = WMI_10X_PEER_CREATE_CMDID, | ||
176 | .peer_delete_cmdid = WMI_10X_PEER_DELETE_CMDID, | ||
177 | .peer_flush_tids_cmdid = WMI_10X_PEER_FLUSH_TIDS_CMDID, | ||
178 | .peer_set_param_cmdid = WMI_10X_PEER_SET_PARAM_CMDID, | ||
179 | .peer_assoc_cmdid = WMI_10X_PEER_ASSOC_CMDID, | ||
180 | .peer_add_wds_entry_cmdid = WMI_10X_PEER_ADD_WDS_ENTRY_CMDID, | ||
181 | .peer_remove_wds_entry_cmdid = WMI_10X_PEER_REMOVE_WDS_ENTRY_CMDID, | ||
182 | .peer_mcast_group_cmdid = WMI_10X_PEER_MCAST_GROUP_CMDID, | ||
183 | .bcn_tx_cmdid = WMI_10X_BCN_TX_CMDID, | ||
184 | .pdev_send_bcn_cmdid = WMI_10X_PDEV_SEND_BCN_CMDID, | ||
185 | .bcn_tmpl_cmdid = WMI_CMD_UNSUPPORTED, | ||
186 | .bcn_filter_rx_cmdid = WMI_10X_BCN_FILTER_RX_CMDID, | ||
187 | .prb_req_filter_rx_cmdid = WMI_10X_PRB_REQ_FILTER_RX_CMDID, | ||
188 | .mgmt_tx_cmdid = WMI_10X_MGMT_TX_CMDID, | ||
189 | .prb_tmpl_cmdid = WMI_CMD_UNSUPPORTED, | ||
190 | .addba_clear_resp_cmdid = WMI_10X_ADDBA_CLEAR_RESP_CMDID, | ||
191 | .addba_send_cmdid = WMI_10X_ADDBA_SEND_CMDID, | ||
192 | .addba_status_cmdid = WMI_10X_ADDBA_STATUS_CMDID, | ||
193 | .delba_send_cmdid = WMI_10X_DELBA_SEND_CMDID, | ||
194 | .addba_set_resp_cmdid = WMI_10X_ADDBA_SET_RESP_CMDID, | ||
195 | .send_singleamsdu_cmdid = WMI_10X_SEND_SINGLEAMSDU_CMDID, | ||
196 | .sta_powersave_mode_cmdid = WMI_10X_STA_POWERSAVE_MODE_CMDID, | ||
197 | .sta_powersave_param_cmdid = WMI_10X_STA_POWERSAVE_PARAM_CMDID, | ||
198 | .sta_mimo_ps_mode_cmdid = WMI_10X_STA_MIMO_PS_MODE_CMDID, | ||
199 | .pdev_dfs_enable_cmdid = WMI_10X_PDEV_DFS_ENABLE_CMDID, | ||
200 | .pdev_dfs_disable_cmdid = WMI_10X_PDEV_DFS_DISABLE_CMDID, | ||
201 | .roam_scan_mode = WMI_10X_ROAM_SCAN_MODE, | ||
202 | .roam_scan_rssi_threshold = WMI_10X_ROAM_SCAN_RSSI_THRESHOLD, | ||
203 | .roam_scan_period = WMI_10X_ROAM_SCAN_PERIOD, | ||
204 | .roam_scan_rssi_change_threshold = | ||
205 | WMI_10X_ROAM_SCAN_RSSI_CHANGE_THRESHOLD, | ||
206 | .roam_ap_profile = WMI_10X_ROAM_AP_PROFILE, | ||
207 | .ofl_scan_add_ap_profile = WMI_10X_OFL_SCAN_ADD_AP_PROFILE, | ||
208 | .ofl_scan_remove_ap_profile = WMI_10X_OFL_SCAN_REMOVE_AP_PROFILE, | ||
209 | .ofl_scan_period = WMI_10X_OFL_SCAN_PERIOD, | ||
210 | .p2p_dev_set_device_info = WMI_10X_P2P_DEV_SET_DEVICE_INFO, | ||
211 | .p2p_dev_set_discoverability = WMI_10X_P2P_DEV_SET_DISCOVERABILITY, | ||
212 | .p2p_go_set_beacon_ie = WMI_10X_P2P_GO_SET_BEACON_IE, | ||
213 | .p2p_go_set_probe_resp_ie = WMI_10X_P2P_GO_SET_PROBE_RESP_IE, | ||
214 | .p2p_set_vendor_ie_data_cmdid = WMI_CMD_UNSUPPORTED, | ||
215 | .ap_ps_peer_param_cmdid = WMI_CMD_UNSUPPORTED, | ||
216 | .ap_ps_peer_uapsd_coex_cmdid = WMI_CMD_UNSUPPORTED, | ||
217 | .peer_rate_retry_sched_cmdid = WMI_10X_PEER_RATE_RETRY_SCHED_CMDID, | ||
218 | .wlan_profile_trigger_cmdid = WMI_10X_WLAN_PROFILE_TRIGGER_CMDID, | ||
219 | .wlan_profile_set_hist_intvl_cmdid = | ||
220 | WMI_10X_WLAN_PROFILE_SET_HIST_INTVL_CMDID, | ||
221 | .wlan_profile_get_profile_data_cmdid = | ||
222 | WMI_10X_WLAN_PROFILE_GET_PROFILE_DATA_CMDID, | ||
223 | .wlan_profile_enable_profile_id_cmdid = | ||
224 | WMI_10X_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID, | ||
225 | .wlan_profile_list_profile_id_cmdid = | ||
226 | WMI_10X_WLAN_PROFILE_LIST_PROFILE_ID_CMDID, | ||
227 | .pdev_suspend_cmdid = WMI_10X_PDEV_SUSPEND_CMDID, | ||
228 | .pdev_resume_cmdid = WMI_10X_PDEV_RESUME_CMDID, | ||
229 | .add_bcn_filter_cmdid = WMI_10X_ADD_BCN_FILTER_CMDID, | ||
230 | .rmv_bcn_filter_cmdid = WMI_10X_RMV_BCN_FILTER_CMDID, | ||
231 | .wow_add_wake_pattern_cmdid = WMI_10X_WOW_ADD_WAKE_PATTERN_CMDID, | ||
232 | .wow_del_wake_pattern_cmdid = WMI_10X_WOW_DEL_WAKE_PATTERN_CMDID, | ||
233 | .wow_enable_disable_wake_event_cmdid = | ||
234 | WMI_10X_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID, | ||
235 | .wow_enable_cmdid = WMI_10X_WOW_ENABLE_CMDID, | ||
236 | .wow_hostwakeup_from_sleep_cmdid = | ||
237 | WMI_10X_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID, | ||
238 | .rtt_measreq_cmdid = WMI_10X_RTT_MEASREQ_CMDID, | ||
239 | .rtt_tsf_cmdid = WMI_10X_RTT_TSF_CMDID, | ||
240 | .vdev_spectral_scan_configure_cmdid = | ||
241 | WMI_10X_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID, | ||
242 | .vdev_spectral_scan_enable_cmdid = | ||
243 | WMI_10X_VDEV_SPECTRAL_SCAN_ENABLE_CMDID, | ||
244 | .request_stats_cmdid = WMI_10X_REQUEST_STATS_CMDID, | ||
245 | .set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED, | ||
246 | .network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED, | ||
247 | .gtk_offload_cmdid = WMI_CMD_UNSUPPORTED, | ||
248 | .csa_offload_enable_cmdid = WMI_CMD_UNSUPPORTED, | ||
249 | .csa_offload_chanswitch_cmdid = WMI_CMD_UNSUPPORTED, | ||
250 | .chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED, | ||
251 | .peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED, | ||
252 | .peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED, | ||
253 | .sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED, | ||
254 | .sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED, | ||
255 | .sta_keepalive_cmd = WMI_CMD_UNSUPPORTED, | ||
256 | .echo_cmdid = WMI_10X_ECHO_CMDID, | ||
257 | .pdev_utf_cmdid = WMI_10X_PDEV_UTF_CMDID, | ||
258 | .dbglog_cfg_cmdid = WMI_10X_DBGLOG_CFG_CMDID, | ||
259 | .pdev_qvit_cmdid = WMI_10X_PDEV_QVIT_CMDID, | ||
260 | .pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED, | ||
261 | .vdev_set_keepalive_cmdid = WMI_CMD_UNSUPPORTED, | ||
262 | .vdev_get_keepalive_cmdid = WMI_CMD_UNSUPPORTED, | ||
263 | .force_fw_hang_cmdid = WMI_CMD_UNSUPPORTED, | ||
264 | .gpio_config_cmdid = WMI_10X_GPIO_CONFIG_CMDID, | ||
265 | .gpio_output_cmdid = WMI_10X_GPIO_OUTPUT_CMDID, | ||
266 | }; | ||
267 | |||
268 | /* MAIN WMI VDEV param map */ | ||
269 | static struct wmi_vdev_param_map wmi_vdev_param_map = { | ||
270 | .rts_threshold = WMI_VDEV_PARAM_RTS_THRESHOLD, | ||
271 | .fragmentation_threshold = WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD, | ||
272 | .beacon_interval = WMI_VDEV_PARAM_BEACON_INTERVAL, | ||
273 | .listen_interval = WMI_VDEV_PARAM_LISTEN_INTERVAL, | ||
274 | .multicast_rate = WMI_VDEV_PARAM_MULTICAST_RATE, | ||
275 | .mgmt_tx_rate = WMI_VDEV_PARAM_MGMT_TX_RATE, | ||
276 | .slot_time = WMI_VDEV_PARAM_SLOT_TIME, | ||
277 | .preamble = WMI_VDEV_PARAM_PREAMBLE, | ||
278 | .swba_time = WMI_VDEV_PARAM_SWBA_TIME, | ||
279 | .wmi_vdev_stats_update_period = WMI_VDEV_STATS_UPDATE_PERIOD, | ||
280 | .wmi_vdev_pwrsave_ageout_time = WMI_VDEV_PWRSAVE_AGEOUT_TIME, | ||
281 | .wmi_vdev_host_swba_interval = WMI_VDEV_HOST_SWBA_INTERVAL, | ||
282 | .dtim_period = WMI_VDEV_PARAM_DTIM_PERIOD, | ||
283 | .wmi_vdev_oc_scheduler_air_time_limit = | ||
284 | WMI_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT, | ||
285 | .wds = WMI_VDEV_PARAM_WDS, | ||
286 | .atim_window = WMI_VDEV_PARAM_ATIM_WINDOW, | ||
287 | .bmiss_count_max = WMI_VDEV_PARAM_BMISS_COUNT_MAX, | ||
288 | .bmiss_first_bcnt = WMI_VDEV_PARAM_BMISS_FIRST_BCNT, | ||
289 | .bmiss_final_bcnt = WMI_VDEV_PARAM_BMISS_FINAL_BCNT, | ||
290 | .feature_wmm = WMI_VDEV_PARAM_FEATURE_WMM, | ||
291 | .chwidth = WMI_VDEV_PARAM_CHWIDTH, | ||
292 | .chextoffset = WMI_VDEV_PARAM_CHEXTOFFSET, | ||
293 | .disable_htprotection = WMI_VDEV_PARAM_DISABLE_HTPROTECTION, | ||
294 | .sta_quickkickout = WMI_VDEV_PARAM_STA_QUICKKICKOUT, | ||
295 | .mgmt_rate = WMI_VDEV_PARAM_MGMT_RATE, | ||
296 | .protection_mode = WMI_VDEV_PARAM_PROTECTION_MODE, | ||
297 | .fixed_rate = WMI_VDEV_PARAM_FIXED_RATE, | ||
298 | .sgi = WMI_VDEV_PARAM_SGI, | ||
299 | .ldpc = WMI_VDEV_PARAM_LDPC, | ||
300 | .tx_stbc = WMI_VDEV_PARAM_TX_STBC, | ||
301 | .rx_stbc = WMI_VDEV_PARAM_RX_STBC, | ||
302 | .intra_bss_fwd = WMI_VDEV_PARAM_INTRA_BSS_FWD, | ||
303 | .def_keyid = WMI_VDEV_PARAM_DEF_KEYID, | ||
304 | .nss = WMI_VDEV_PARAM_NSS, | ||
305 | .bcast_data_rate = WMI_VDEV_PARAM_BCAST_DATA_RATE, | ||
306 | .mcast_data_rate = WMI_VDEV_PARAM_MCAST_DATA_RATE, | ||
307 | .mcast_indicate = WMI_VDEV_PARAM_MCAST_INDICATE, | ||
308 | .dhcp_indicate = WMI_VDEV_PARAM_DHCP_INDICATE, | ||
309 | .unknown_dest_indicate = WMI_VDEV_PARAM_UNKNOWN_DEST_INDICATE, | ||
310 | .ap_keepalive_min_idle_inactive_time_secs = | ||
311 | WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS, | ||
312 | .ap_keepalive_max_idle_inactive_time_secs = | ||
313 | WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS, | ||
314 | .ap_keepalive_max_unresponsive_time_secs = | ||
315 | WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS, | ||
316 | .ap_enable_nawds = WMI_VDEV_PARAM_AP_ENABLE_NAWDS, | ||
317 | .mcast2ucast_set = WMI_VDEV_PARAM_UNSUPPORTED, | ||
318 | .enable_rtscts = WMI_VDEV_PARAM_ENABLE_RTSCTS, | ||
319 | .txbf = WMI_VDEV_PARAM_TXBF, | ||
320 | .packet_powersave = WMI_VDEV_PARAM_PACKET_POWERSAVE, | ||
321 | .drop_unencry = WMI_VDEV_PARAM_DROP_UNENCRY, | ||
322 | .tx_encap_type = WMI_VDEV_PARAM_TX_ENCAP_TYPE, | ||
323 | .ap_detect_out_of_sync_sleeping_sta_time_secs = | ||
324 | WMI_VDEV_PARAM_UNSUPPORTED, | ||
325 | }; | ||
326 | |||
327 | /* 10.X WMI VDEV param map */ | ||
328 | static struct wmi_vdev_param_map wmi_10x_vdev_param_map = { | ||
329 | .rts_threshold = WMI_10X_VDEV_PARAM_RTS_THRESHOLD, | ||
330 | .fragmentation_threshold = WMI_10X_VDEV_PARAM_FRAGMENTATION_THRESHOLD, | ||
331 | .beacon_interval = WMI_10X_VDEV_PARAM_BEACON_INTERVAL, | ||
332 | .listen_interval = WMI_10X_VDEV_PARAM_LISTEN_INTERVAL, | ||
333 | .multicast_rate = WMI_10X_VDEV_PARAM_MULTICAST_RATE, | ||
334 | .mgmt_tx_rate = WMI_10X_VDEV_PARAM_MGMT_TX_RATE, | ||
335 | .slot_time = WMI_10X_VDEV_PARAM_SLOT_TIME, | ||
336 | .preamble = WMI_10X_VDEV_PARAM_PREAMBLE, | ||
337 | .swba_time = WMI_10X_VDEV_PARAM_SWBA_TIME, | ||
338 | .wmi_vdev_stats_update_period = WMI_10X_VDEV_STATS_UPDATE_PERIOD, | ||
339 | .wmi_vdev_pwrsave_ageout_time = WMI_10X_VDEV_PWRSAVE_AGEOUT_TIME, | ||
340 | .wmi_vdev_host_swba_interval = WMI_10X_VDEV_HOST_SWBA_INTERVAL, | ||
341 | .dtim_period = WMI_10X_VDEV_PARAM_DTIM_PERIOD, | ||
342 | .wmi_vdev_oc_scheduler_air_time_limit = | ||
343 | WMI_10X_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT, | ||
344 | .wds = WMI_10X_VDEV_PARAM_WDS, | ||
345 | .atim_window = WMI_10X_VDEV_PARAM_ATIM_WINDOW, | ||
346 | .bmiss_count_max = WMI_10X_VDEV_PARAM_BMISS_COUNT_MAX, | ||
347 | .bmiss_first_bcnt = WMI_VDEV_PARAM_UNSUPPORTED, | ||
348 | .bmiss_final_bcnt = WMI_VDEV_PARAM_UNSUPPORTED, | ||
349 | .feature_wmm = WMI_10X_VDEV_PARAM_FEATURE_WMM, | ||
350 | .chwidth = WMI_10X_VDEV_PARAM_CHWIDTH, | ||
351 | .chextoffset = WMI_10X_VDEV_PARAM_CHEXTOFFSET, | ||
352 | .disable_htprotection = WMI_10X_VDEV_PARAM_DISABLE_HTPROTECTION, | ||
353 | .sta_quickkickout = WMI_10X_VDEV_PARAM_STA_QUICKKICKOUT, | ||
354 | .mgmt_rate = WMI_10X_VDEV_PARAM_MGMT_RATE, | ||
355 | .protection_mode = WMI_10X_VDEV_PARAM_PROTECTION_MODE, | ||
356 | .fixed_rate = WMI_10X_VDEV_PARAM_FIXED_RATE, | ||
357 | .sgi = WMI_10X_VDEV_PARAM_SGI, | ||
358 | .ldpc = WMI_10X_VDEV_PARAM_LDPC, | ||
359 | .tx_stbc = WMI_10X_VDEV_PARAM_TX_STBC, | ||
360 | .rx_stbc = WMI_10X_VDEV_PARAM_RX_STBC, | ||
361 | .intra_bss_fwd = WMI_10X_VDEV_PARAM_INTRA_BSS_FWD, | ||
362 | .def_keyid = WMI_10X_VDEV_PARAM_DEF_KEYID, | ||
363 | .nss = WMI_10X_VDEV_PARAM_NSS, | ||
364 | .bcast_data_rate = WMI_10X_VDEV_PARAM_BCAST_DATA_RATE, | ||
365 | .mcast_data_rate = WMI_10X_VDEV_PARAM_MCAST_DATA_RATE, | ||
366 | .mcast_indicate = WMI_10X_VDEV_PARAM_MCAST_INDICATE, | ||
367 | .dhcp_indicate = WMI_10X_VDEV_PARAM_DHCP_INDICATE, | ||
368 | .unknown_dest_indicate = WMI_10X_VDEV_PARAM_UNKNOWN_DEST_INDICATE, | ||
369 | .ap_keepalive_min_idle_inactive_time_secs = | ||
370 | WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS, | ||
371 | .ap_keepalive_max_idle_inactive_time_secs = | ||
372 | WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS, | ||
373 | .ap_keepalive_max_unresponsive_time_secs = | ||
374 | WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS, | ||
375 | .ap_enable_nawds = WMI_10X_VDEV_PARAM_AP_ENABLE_NAWDS, | ||
376 | .mcast2ucast_set = WMI_10X_VDEV_PARAM_MCAST2UCAST_SET, | ||
377 | .enable_rtscts = WMI_10X_VDEV_PARAM_ENABLE_RTSCTS, | ||
378 | .txbf = WMI_VDEV_PARAM_UNSUPPORTED, | ||
379 | .packet_powersave = WMI_VDEV_PARAM_UNSUPPORTED, | ||
380 | .drop_unencry = WMI_VDEV_PARAM_UNSUPPORTED, | ||
381 | .tx_encap_type = WMI_VDEV_PARAM_UNSUPPORTED, | ||
382 | .ap_detect_out_of_sync_sleeping_sta_time_secs = | ||
383 | WMI_10X_VDEV_PARAM_AP_DETECT_OUT_OF_SYNC_SLEEPING_STA_TIME_SECS, | ||
384 | }; | ||
385 | |||
386 | static struct wmi_pdev_param_map wmi_pdev_param_map = { | ||
387 | .tx_chain_mask = WMI_PDEV_PARAM_TX_CHAIN_MASK, | ||
388 | .rx_chain_mask = WMI_PDEV_PARAM_RX_CHAIN_MASK, | ||
389 | .txpower_limit2g = WMI_PDEV_PARAM_TXPOWER_LIMIT2G, | ||
390 | .txpower_limit5g = WMI_PDEV_PARAM_TXPOWER_LIMIT5G, | ||
391 | .txpower_scale = WMI_PDEV_PARAM_TXPOWER_SCALE, | ||
392 | .beacon_gen_mode = WMI_PDEV_PARAM_BEACON_GEN_MODE, | ||
393 | .beacon_tx_mode = WMI_PDEV_PARAM_BEACON_TX_MODE, | ||
394 | .resmgr_offchan_mode = WMI_PDEV_PARAM_RESMGR_OFFCHAN_MODE, | ||
395 | .protection_mode = WMI_PDEV_PARAM_PROTECTION_MODE, | ||
396 | .dynamic_bw = WMI_PDEV_PARAM_DYNAMIC_BW, | ||
397 | .non_agg_sw_retry_th = WMI_PDEV_PARAM_NON_AGG_SW_RETRY_TH, | ||
398 | .agg_sw_retry_th = WMI_PDEV_PARAM_AGG_SW_RETRY_TH, | ||
399 | .sta_kickout_th = WMI_PDEV_PARAM_STA_KICKOUT_TH, | ||
400 | .ac_aggrsize_scaling = WMI_PDEV_PARAM_AC_AGGRSIZE_SCALING, | ||
401 | .ltr_enable = WMI_PDEV_PARAM_LTR_ENABLE, | ||
402 | .ltr_ac_latency_be = WMI_PDEV_PARAM_LTR_AC_LATENCY_BE, | ||
403 | .ltr_ac_latency_bk = WMI_PDEV_PARAM_LTR_AC_LATENCY_BK, | ||
404 | .ltr_ac_latency_vi = WMI_PDEV_PARAM_LTR_AC_LATENCY_VI, | ||
405 | .ltr_ac_latency_vo = WMI_PDEV_PARAM_LTR_AC_LATENCY_VO, | ||
406 | .ltr_ac_latency_timeout = WMI_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT, | ||
407 | .ltr_sleep_override = WMI_PDEV_PARAM_LTR_SLEEP_OVERRIDE, | ||
408 | .ltr_rx_override = WMI_PDEV_PARAM_LTR_RX_OVERRIDE, | ||
409 | .ltr_tx_activity_timeout = WMI_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT, | ||
410 | .l1ss_enable = WMI_PDEV_PARAM_L1SS_ENABLE, | ||
411 | .dsleep_enable = WMI_PDEV_PARAM_DSLEEP_ENABLE, | ||
412 | .pcielp_txbuf_flush = WMI_PDEV_PARAM_PCIELP_TXBUF_FLUSH, | ||
413 | .pcielp_txbuf_watermark = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_EN, | ||
414 | .pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_EN, | ||
415 | .pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_VALUE, | ||
416 | .pdev_stats_update_period = WMI_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD, | ||
417 | .vdev_stats_update_period = WMI_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD, | ||
418 | .peer_stats_update_period = WMI_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD, | ||
419 | .bcnflt_stats_update_period = WMI_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD, | ||
420 | .pmf_qos = WMI_PDEV_PARAM_PMF_QOS, | ||
421 | .arp_ac_override = WMI_PDEV_PARAM_ARP_AC_OVERRIDE, | ||
422 | .arpdhcp_ac_override = WMI_PDEV_PARAM_UNSUPPORTED, | ||
423 | .dcs = WMI_PDEV_PARAM_DCS, | ||
424 | .ani_enable = WMI_PDEV_PARAM_ANI_ENABLE, | ||
425 | .ani_poll_period = WMI_PDEV_PARAM_ANI_POLL_PERIOD, | ||
426 | .ani_listen_period = WMI_PDEV_PARAM_ANI_LISTEN_PERIOD, | ||
427 | .ani_ofdm_level = WMI_PDEV_PARAM_ANI_OFDM_LEVEL, | ||
428 | .ani_cck_level = WMI_PDEV_PARAM_ANI_CCK_LEVEL, | ||
429 | .dyntxchain = WMI_PDEV_PARAM_DYNTXCHAIN, | ||
430 | .proxy_sta = WMI_PDEV_PARAM_PROXY_STA, | ||
431 | .idle_ps_config = WMI_PDEV_PARAM_IDLE_PS_CONFIG, | ||
432 | .power_gating_sleep = WMI_PDEV_PARAM_POWER_GATING_SLEEP, | ||
433 | .fast_channel_reset = WMI_PDEV_PARAM_UNSUPPORTED, | ||
434 | .burst_dur = WMI_PDEV_PARAM_UNSUPPORTED, | ||
435 | .burst_enable = WMI_PDEV_PARAM_UNSUPPORTED, | ||
436 | }; | ||
437 | |||
438 | static struct wmi_pdev_param_map wmi_10x_pdev_param_map = { | ||
439 | .tx_chain_mask = WMI_10X_PDEV_PARAM_TX_CHAIN_MASK, | ||
440 | .rx_chain_mask = WMI_10X_PDEV_PARAM_RX_CHAIN_MASK, | ||
441 | .txpower_limit2g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT2G, | ||
442 | .txpower_limit5g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT5G, | ||
443 | .txpower_scale = WMI_10X_PDEV_PARAM_TXPOWER_SCALE, | ||
444 | .beacon_gen_mode = WMI_10X_PDEV_PARAM_BEACON_GEN_MODE, | ||
445 | .beacon_tx_mode = WMI_10X_PDEV_PARAM_BEACON_TX_MODE, | ||
446 | .resmgr_offchan_mode = WMI_10X_PDEV_PARAM_RESMGR_OFFCHAN_MODE, | ||
447 | .protection_mode = WMI_10X_PDEV_PARAM_PROTECTION_MODE, | ||
448 | .dynamic_bw = WMI_10X_PDEV_PARAM_DYNAMIC_BW, | ||
449 | .non_agg_sw_retry_th = WMI_10X_PDEV_PARAM_NON_AGG_SW_RETRY_TH, | ||
450 | .agg_sw_retry_th = WMI_10X_PDEV_PARAM_AGG_SW_RETRY_TH, | ||
451 | .sta_kickout_th = WMI_10X_PDEV_PARAM_STA_KICKOUT_TH, | ||
452 | .ac_aggrsize_scaling = WMI_10X_PDEV_PARAM_AC_AGGRSIZE_SCALING, | ||
453 | .ltr_enable = WMI_10X_PDEV_PARAM_LTR_ENABLE, | ||
454 | .ltr_ac_latency_be = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BE, | ||
455 | .ltr_ac_latency_bk = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BK, | ||
456 | .ltr_ac_latency_vi = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VI, | ||
457 | .ltr_ac_latency_vo = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VO, | ||
458 | .ltr_ac_latency_timeout = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT, | ||
459 | .ltr_sleep_override = WMI_10X_PDEV_PARAM_LTR_SLEEP_OVERRIDE, | ||
460 | .ltr_rx_override = WMI_10X_PDEV_PARAM_LTR_RX_OVERRIDE, | ||
461 | .ltr_tx_activity_timeout = WMI_10X_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT, | ||
462 | .l1ss_enable = WMI_10X_PDEV_PARAM_L1SS_ENABLE, | ||
463 | .dsleep_enable = WMI_10X_PDEV_PARAM_DSLEEP_ENABLE, | ||
464 | .pcielp_txbuf_flush = WMI_PDEV_PARAM_UNSUPPORTED, | ||
465 | .pcielp_txbuf_watermark = WMI_PDEV_PARAM_UNSUPPORTED, | ||
466 | .pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_UNSUPPORTED, | ||
467 | .pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_UNSUPPORTED, | ||
468 | .pdev_stats_update_period = WMI_10X_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD, | ||
469 | .vdev_stats_update_period = WMI_10X_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD, | ||
470 | .peer_stats_update_period = WMI_10X_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD, | ||
471 | .bcnflt_stats_update_period = | ||
472 | WMI_10X_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD, | ||
473 | .pmf_qos = WMI_10X_PDEV_PARAM_PMF_QOS, | ||
474 | .arp_ac_override = WMI_PDEV_PARAM_UNSUPPORTED, | ||
475 | .arpdhcp_ac_override = WMI_10X_PDEV_PARAM_ARPDHCP_AC_OVERRIDE, | ||
476 | .dcs = WMI_10X_PDEV_PARAM_DCS, | ||
477 | .ani_enable = WMI_10X_PDEV_PARAM_ANI_ENABLE, | ||
478 | .ani_poll_period = WMI_10X_PDEV_PARAM_ANI_POLL_PERIOD, | ||
479 | .ani_listen_period = WMI_10X_PDEV_PARAM_ANI_LISTEN_PERIOD, | ||
480 | .ani_ofdm_level = WMI_10X_PDEV_PARAM_ANI_OFDM_LEVEL, | ||
481 | .ani_cck_level = WMI_10X_PDEV_PARAM_ANI_CCK_LEVEL, | ||
482 | .dyntxchain = WMI_10X_PDEV_PARAM_DYNTXCHAIN, | ||
483 | .proxy_sta = WMI_PDEV_PARAM_UNSUPPORTED, | ||
484 | .idle_ps_config = WMI_PDEV_PARAM_UNSUPPORTED, | ||
485 | .power_gating_sleep = WMI_PDEV_PARAM_UNSUPPORTED, | ||
486 | .fast_channel_reset = WMI_10X_PDEV_PARAM_FAST_CHANNEL_RESET, | ||
487 | .burst_dur = WMI_10X_PDEV_PARAM_BURST_DUR, | ||
488 | .burst_enable = WMI_10X_PDEV_PARAM_BURST_ENABLE, | ||
489 | }; | ||
490 | |||
26 | int ath10k_wmi_wait_for_service_ready(struct ath10k *ar) | 491 | int ath10k_wmi_wait_for_service_ready(struct ath10k *ar) |
27 | { | 492 | { |
28 | int ret; | 493 | int ret; |
@@ -64,7 +529,7 @@ static void ath10k_wmi_htc_tx_complete(struct ath10k *ar, struct sk_buff *skb) | |||
64 | } | 529 | } |
65 | 530 | ||
66 | static int ath10k_wmi_cmd_send_nowait(struct ath10k *ar, struct sk_buff *skb, | 531 | static int ath10k_wmi_cmd_send_nowait(struct ath10k *ar, struct sk_buff *skb, |
67 | enum wmi_cmd_id cmd_id) | 532 | u32 cmd_id) |
68 | { | 533 | { |
69 | struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb); | 534 | struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb); |
70 | struct wmi_cmd_hdr *cmd_hdr; | 535 | struct wmi_cmd_hdr *cmd_hdr; |
@@ -144,9 +609,17 @@ static void ath10k_wmi_op_ep_tx_credits(struct ath10k *ar) | |||
144 | } | 609 | } |
145 | 610 | ||
146 | static int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, | 611 | static int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, |
147 | enum wmi_cmd_id cmd_id) | 612 | u32 cmd_id) |
148 | { | 613 | { |
149 | int ret = -EINVAL; | 614 | int ret = -EOPNOTSUPP; |
615 | |||
616 | might_sleep(); | ||
617 | |||
618 | if (cmd_id == WMI_CMD_UNSUPPORTED) { | ||
619 | ath10k_warn("wmi command %d is not supported by firmware\n", | ||
620 | cmd_id); | ||
621 | return ret; | ||
622 | } | ||
150 | 623 | ||
151 | wait_event_timeout(ar->wmi.tx_credits_wq, ({ | 624 | wait_event_timeout(ar->wmi.tx_credits_wq, ({ |
152 | /* try to send pending beacons first. they take priority */ | 625 | /* try to send pending beacons first. they take priority */ |
@@ -162,6 +635,57 @@ static int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, | |||
162 | return ret; | 635 | return ret; |
163 | } | 636 | } |
164 | 637 | ||
638 | int ath10k_wmi_mgmt_tx(struct ath10k *ar, struct sk_buff *skb) | ||
639 | { | ||
640 | int ret = 0; | ||
641 | struct wmi_mgmt_tx_cmd *cmd; | ||
642 | struct ieee80211_hdr *hdr; | ||
643 | struct sk_buff *wmi_skb; | ||
644 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | ||
645 | int len; | ||
646 | u16 fc; | ||
647 | |||
648 | hdr = (struct ieee80211_hdr *)skb->data; | ||
649 | fc = le16_to_cpu(hdr->frame_control); | ||
650 | |||
651 | if (WARN_ON_ONCE(!ieee80211_is_mgmt(hdr->frame_control))) | ||
652 | return -EINVAL; | ||
653 | |||
654 | len = sizeof(cmd->hdr) + skb->len; | ||
655 | len = round_up(len, 4); | ||
656 | |||
657 | wmi_skb = ath10k_wmi_alloc_skb(len); | ||
658 | if (!wmi_skb) | ||
659 | return -ENOMEM; | ||
660 | |||
661 | cmd = (struct wmi_mgmt_tx_cmd *)wmi_skb->data; | ||
662 | |||
663 | cmd->hdr.vdev_id = __cpu_to_le32(ATH10K_SKB_CB(skb)->vdev_id); | ||
664 | cmd->hdr.tx_rate = 0; | ||
665 | cmd->hdr.tx_power = 0; | ||
666 | cmd->hdr.buf_len = __cpu_to_le32((u32)(skb->len)); | ||
667 | |||
668 | memcpy(cmd->hdr.peer_macaddr.addr, ieee80211_get_DA(hdr), ETH_ALEN); | ||
669 | memcpy(cmd->buf, skb->data, skb->len); | ||
670 | |||
671 | ath10k_dbg(ATH10K_DBG_WMI, "wmi mgmt tx skb %p len %d ftype %02x stype %02x\n", | ||
672 | wmi_skb, wmi_skb->len, fc & IEEE80211_FCTL_FTYPE, | ||
673 | fc & IEEE80211_FCTL_STYPE); | ||
674 | |||
675 | /* Send the management frame buffer to the target */ | ||
676 | ret = ath10k_wmi_cmd_send(ar, wmi_skb, ar->wmi.cmd->mgmt_tx_cmdid); | ||
677 | if (ret) { | ||
678 | dev_kfree_skb_any(skb); | ||
679 | return ret; | ||
680 | } | ||
681 | |||
682 | /* TODO: report tx status to mac80211 - temporary just ACK */ | ||
683 | info->flags |= IEEE80211_TX_STAT_ACK; | ||
684 | ieee80211_tx_status_irqsafe(ar->hw, skb); | ||
685 | |||
686 | return ret; | ||
687 | } | ||
688 | |||
165 | static int ath10k_wmi_event_scan(struct ath10k *ar, struct sk_buff *skb) | 689 | static int ath10k_wmi_event_scan(struct ath10k *ar, struct sk_buff *skb) |
166 | { | 690 | { |
167 | struct wmi_scan_event *event = (struct wmi_scan_event *)skb->data; | 691 | struct wmi_scan_event *event = (struct wmi_scan_event *)skb->data; |
@@ -964,6 +1488,55 @@ static void ath10k_wmi_event_vdev_install_key_complete(struct ath10k *ar, | |||
964 | ath10k_dbg(ATH10K_DBG_WMI, "WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID\n"); | 1488 | ath10k_dbg(ATH10K_DBG_WMI, "WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID\n"); |
965 | } | 1489 | } |
966 | 1490 | ||
1491 | static void ath10k_wmi_event_inst_rssi_stats(struct ath10k *ar, | ||
1492 | struct sk_buff *skb) | ||
1493 | { | ||
1494 | ath10k_dbg(ATH10K_DBG_WMI, "WMI_INST_RSSI_STATS_EVENTID\n"); | ||
1495 | } | ||
1496 | |||
1497 | static void ath10k_wmi_event_vdev_standby_req(struct ath10k *ar, | ||
1498 | struct sk_buff *skb) | ||
1499 | { | ||
1500 | ath10k_dbg(ATH10K_DBG_WMI, "WMI_VDEV_STANDBY_REQ_EVENTID\n"); | ||
1501 | } | ||
1502 | |||
1503 | static void ath10k_wmi_event_vdev_resume_req(struct ath10k *ar, | ||
1504 | struct sk_buff *skb) | ||
1505 | { | ||
1506 | ath10k_dbg(ATH10K_DBG_WMI, "WMI_VDEV_RESUME_REQ_EVENTID\n"); | ||
1507 | } | ||
1508 | |||
1509 | static int ath10k_wmi_alloc_host_mem(struct ath10k *ar, u32 req_id, | ||
1510 | u32 num_units, u32 unit_len) | ||
1511 | { | ||
1512 | dma_addr_t paddr; | ||
1513 | u32 pool_size; | ||
1514 | int idx = ar->wmi.num_mem_chunks; | ||
1515 | |||
1516 | pool_size = num_units * round_up(unit_len, 4); | ||
1517 | |||
1518 | if (!pool_size) | ||
1519 | return -EINVAL; | ||
1520 | |||
1521 | ar->wmi.mem_chunks[idx].vaddr = dma_alloc_coherent(ar->dev, | ||
1522 | pool_size, | ||
1523 | &paddr, | ||
1524 | GFP_ATOMIC); | ||
1525 | if (!ar->wmi.mem_chunks[idx].vaddr) { | ||
1526 | ath10k_warn("failed to allocate memory chunk\n"); | ||
1527 | return -ENOMEM; | ||
1528 | } | ||
1529 | |||
1530 | memset(ar->wmi.mem_chunks[idx].vaddr, 0, pool_size); | ||
1531 | |||
1532 | ar->wmi.mem_chunks[idx].paddr = paddr; | ||
1533 | ar->wmi.mem_chunks[idx].len = pool_size; | ||
1534 | ar->wmi.mem_chunks[idx].req_id = req_id; | ||
1535 | ar->wmi.num_mem_chunks++; | ||
1536 | |||
1537 | return 0; | ||
1538 | } | ||
1539 | |||
967 | static void ath10k_wmi_service_ready_event_rx(struct ath10k *ar, | 1540 | static void ath10k_wmi_service_ready_event_rx(struct ath10k *ar, |
968 | struct sk_buff *skb) | 1541 | struct sk_buff *skb) |
969 | { | 1542 | { |
@@ -988,7 +1561,8 @@ static void ath10k_wmi_service_ready_event_rx(struct ath10k *ar, | |||
988 | ar->phy_capability = __le32_to_cpu(ev->phy_capability); | 1561 | ar->phy_capability = __le32_to_cpu(ev->phy_capability); |
989 | ar->num_rf_chains = __le32_to_cpu(ev->num_rf_chains); | 1562 | ar->num_rf_chains = __le32_to_cpu(ev->num_rf_chains); |
990 | 1563 | ||
991 | if (ar->fw_version_build > 636) | 1564 | /* only manually set fw features when not using FW IE format */ |
1565 | if (ar->fw_api == 1 && ar->fw_version_build > 636) | ||
992 | set_bit(ATH10K_FW_FEATURE_EXT_WMI_MGMT_RX, ar->fw_features); | 1566 | set_bit(ATH10K_FW_FEATURE_EXT_WMI_MGMT_RX, ar->fw_features); |
993 | 1567 | ||
994 | if (ar->num_rf_chains > WMI_MAX_SPATIAL_STREAM) { | 1568 | if (ar->num_rf_chains > WMI_MAX_SPATIAL_STREAM) { |
@@ -1035,6 +1609,108 @@ static void ath10k_wmi_service_ready_event_rx(struct ath10k *ar, | |||
1035 | complete(&ar->wmi.service_ready); | 1609 | complete(&ar->wmi.service_ready); |
1036 | } | 1610 | } |
1037 | 1611 | ||
1612 | static void ath10k_wmi_10x_service_ready_event_rx(struct ath10k *ar, | ||
1613 | struct sk_buff *skb) | ||
1614 | { | ||
1615 | u32 num_units, req_id, unit_size, num_mem_reqs, num_unit_info, i; | ||
1616 | int ret; | ||
1617 | struct wmi_service_ready_event_10x *ev = (void *)skb->data; | ||
1618 | |||
1619 | if (skb->len < sizeof(*ev)) { | ||
1620 | ath10k_warn("Service ready event was %d B but expected %zu B. Wrong firmware version?\n", | ||
1621 | skb->len, sizeof(*ev)); | ||
1622 | return; | ||
1623 | } | ||
1624 | |||
1625 | ar->hw_min_tx_power = __le32_to_cpu(ev->hw_min_tx_power); | ||
1626 | ar->hw_max_tx_power = __le32_to_cpu(ev->hw_max_tx_power); | ||
1627 | ar->ht_cap_info = __le32_to_cpu(ev->ht_cap_info); | ||
1628 | ar->vht_cap_info = __le32_to_cpu(ev->vht_cap_info); | ||
1629 | ar->fw_version_major = | ||
1630 | (__le32_to_cpu(ev->sw_version) & 0xff000000) >> 24; | ||
1631 | ar->fw_version_minor = (__le32_to_cpu(ev->sw_version) & 0x00ffffff); | ||
1632 | ar->phy_capability = __le32_to_cpu(ev->phy_capability); | ||
1633 | ar->num_rf_chains = __le32_to_cpu(ev->num_rf_chains); | ||
1634 | |||
1635 | if (ar->num_rf_chains > WMI_MAX_SPATIAL_STREAM) { | ||
1636 | ath10k_warn("hardware advertises support for more spatial streams than it should (%d > %d)\n", | ||
1637 | ar->num_rf_chains, WMI_MAX_SPATIAL_STREAM); | ||
1638 | ar->num_rf_chains = WMI_MAX_SPATIAL_STREAM; | ||
1639 | } | ||
1640 | |||
1641 | ar->ath_common.regulatory.current_rd = | ||
1642 | __le32_to_cpu(ev->hal_reg_capabilities.eeprom_rd); | ||
1643 | |||
1644 | ath10k_debug_read_service_map(ar, ev->wmi_service_bitmap, | ||
1645 | sizeof(ev->wmi_service_bitmap)); | ||
1646 | |||
1647 | if (strlen(ar->hw->wiphy->fw_version) == 0) { | ||
1648 | snprintf(ar->hw->wiphy->fw_version, | ||
1649 | sizeof(ar->hw->wiphy->fw_version), | ||
1650 | "%u.%u", | ||
1651 | ar->fw_version_major, | ||
1652 | ar->fw_version_minor); | ||
1653 | } | ||
1654 | |||
1655 | num_mem_reqs = __le32_to_cpu(ev->num_mem_reqs); | ||
1656 | |||
1657 | if (num_mem_reqs > ATH10K_MAX_MEM_REQS) { | ||
1658 | ath10k_warn("requested memory chunks number (%d) exceeds the limit\n", | ||
1659 | num_mem_reqs); | ||
1660 | return; | ||
1661 | } | ||
1662 | |||
1663 | if (!num_mem_reqs) | ||
1664 | goto exit; | ||
1665 | |||
1666 | ath10k_dbg(ATH10K_DBG_WMI, "firmware has requested %d memory chunks\n", | ||
1667 | num_mem_reqs); | ||
1668 | |||
1669 | for (i = 0; i < num_mem_reqs; ++i) { | ||
1670 | req_id = __le32_to_cpu(ev->mem_reqs[i].req_id); | ||
1671 | num_units = __le32_to_cpu(ev->mem_reqs[i].num_units); | ||
1672 | unit_size = __le32_to_cpu(ev->mem_reqs[i].unit_size); | ||
1673 | num_unit_info = __le32_to_cpu(ev->mem_reqs[i].num_unit_info); | ||
1674 | |||
1675 | if (num_unit_info & NUM_UNITS_IS_NUM_PEERS) | ||
1676 | /* number of units to allocate is number of | ||
1677 | * peers, 1 extra for self peer on target */ | ||
1678 | /* this needs to be tied, host and target | ||
1679 | * can get out of sync */ | ||
1680 | num_units = TARGET_10X_NUM_PEERS + 1; | ||
1681 | else if (num_unit_info & NUM_UNITS_IS_NUM_VDEVS) | ||
1682 | num_units = TARGET_10X_NUM_VDEVS + 1; | ||
1683 | |||
1684 | ath10k_dbg(ATH10K_DBG_WMI, | ||
1685 | "wmi mem_req_id %d num_units %d num_unit_info %d unit size %d actual units %d\n", | ||
1686 | req_id, | ||
1687 | __le32_to_cpu(ev->mem_reqs[i].num_units), | ||
1688 | num_unit_info, | ||
1689 | unit_size, | ||
1690 | num_units); | ||
1691 | |||
1692 | ret = ath10k_wmi_alloc_host_mem(ar, req_id, num_units, | ||
1693 | unit_size); | ||
1694 | if (ret) | ||
1695 | return; | ||
1696 | } | ||
1697 | |||
1698 | exit: | ||
1699 | ath10k_dbg(ATH10K_DBG_WMI, | ||
1700 | "wmi event service ready sw_ver 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", | ||
1701 | __le32_to_cpu(ev->sw_version), | ||
1702 | __le32_to_cpu(ev->abi_version), | ||
1703 | __le32_to_cpu(ev->phy_capability), | ||
1704 | __le32_to_cpu(ev->ht_cap_info), | ||
1705 | __le32_to_cpu(ev->vht_cap_info), | ||
1706 | __le32_to_cpu(ev->vht_supp_mcs), | ||
1707 | __le32_to_cpu(ev->sys_cap_info), | ||
1708 | __le32_to_cpu(ev->num_mem_reqs), | ||
1709 | __le32_to_cpu(ev->num_rf_chains)); | ||
1710 | |||
1711 | complete(&ar->wmi.service_ready); | ||
1712 | } | ||
1713 | |||
1038 | static int ath10k_wmi_ready_event_rx(struct ath10k *ar, struct sk_buff *skb) | 1714 | static int ath10k_wmi_ready_event_rx(struct ath10k *ar, struct sk_buff *skb) |
1039 | { | 1715 | { |
1040 | struct wmi_ready_event *ev = (struct wmi_ready_event *)skb->data; | 1716 | struct wmi_ready_event *ev = (struct wmi_ready_event *)skb->data; |
@@ -1055,7 +1731,7 @@ static int ath10k_wmi_ready_event_rx(struct ath10k *ar, struct sk_buff *skb) | |||
1055 | return 0; | 1731 | return 0; |
1056 | } | 1732 | } |
1057 | 1733 | ||
1058 | static void ath10k_wmi_process_rx(struct ath10k *ar, struct sk_buff *skb) | 1734 | static void ath10k_wmi_main_process_rx(struct ath10k *ar, struct sk_buff *skb) |
1059 | { | 1735 | { |
1060 | struct wmi_cmd_hdr *cmd_hdr; | 1736 | struct wmi_cmd_hdr *cmd_hdr; |
1061 | enum wmi_event_id id; | 1737 | enum wmi_event_id id; |
@@ -1174,9 +1850,138 @@ static void ath10k_wmi_process_rx(struct ath10k *ar, struct sk_buff *skb) | |||
1174 | dev_kfree_skb(skb); | 1850 | dev_kfree_skb(skb); |
1175 | } | 1851 | } |
1176 | 1852 | ||
1853 | static void ath10k_wmi_10x_process_rx(struct ath10k *ar, struct sk_buff *skb) | ||
1854 | { | ||
1855 | struct wmi_cmd_hdr *cmd_hdr; | ||
1856 | enum wmi_10x_event_id id; | ||
1857 | u16 len; | ||
1858 | |||
1859 | cmd_hdr = (struct wmi_cmd_hdr *)skb->data; | ||
1860 | id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID); | ||
1861 | |||
1862 | if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL) | ||
1863 | return; | ||
1864 | |||
1865 | len = skb->len; | ||
1866 | |||
1867 | trace_ath10k_wmi_event(id, skb->data, skb->len); | ||
1868 | |||
1869 | switch (id) { | ||
1870 | case WMI_10X_MGMT_RX_EVENTID: | ||
1871 | ath10k_wmi_event_mgmt_rx(ar, skb); | ||
1872 | /* mgmt_rx() owns the skb now! */ | ||
1873 | return; | ||
1874 | case WMI_10X_SCAN_EVENTID: | ||
1875 | ath10k_wmi_event_scan(ar, skb); | ||
1876 | break; | ||
1877 | case WMI_10X_CHAN_INFO_EVENTID: | ||
1878 | ath10k_wmi_event_chan_info(ar, skb); | ||
1879 | break; | ||
1880 | case WMI_10X_ECHO_EVENTID: | ||
1881 | ath10k_wmi_event_echo(ar, skb); | ||
1882 | break; | ||
1883 | case WMI_10X_DEBUG_MESG_EVENTID: | ||
1884 | ath10k_wmi_event_debug_mesg(ar, skb); | ||
1885 | break; | ||
1886 | case WMI_10X_UPDATE_STATS_EVENTID: | ||
1887 | ath10k_wmi_event_update_stats(ar, skb); | ||
1888 | break; | ||
1889 | case WMI_10X_VDEV_START_RESP_EVENTID: | ||
1890 | ath10k_wmi_event_vdev_start_resp(ar, skb); | ||
1891 | break; | ||
1892 | case WMI_10X_VDEV_STOPPED_EVENTID: | ||
1893 | ath10k_wmi_event_vdev_stopped(ar, skb); | ||
1894 | break; | ||
1895 | case WMI_10X_PEER_STA_KICKOUT_EVENTID: | ||
1896 | ath10k_wmi_event_peer_sta_kickout(ar, skb); | ||
1897 | break; | ||
1898 | case WMI_10X_HOST_SWBA_EVENTID: | ||
1899 | ath10k_wmi_event_host_swba(ar, skb); | ||
1900 | break; | ||
1901 | case WMI_10X_TBTTOFFSET_UPDATE_EVENTID: | ||
1902 | ath10k_wmi_event_tbttoffset_update(ar, skb); | ||
1903 | break; | ||
1904 | case WMI_10X_PHYERR_EVENTID: | ||
1905 | ath10k_wmi_event_phyerr(ar, skb); | ||
1906 | break; | ||
1907 | case WMI_10X_ROAM_EVENTID: | ||
1908 | ath10k_wmi_event_roam(ar, skb); | ||
1909 | break; | ||
1910 | case WMI_10X_PROFILE_MATCH: | ||
1911 | ath10k_wmi_event_profile_match(ar, skb); | ||
1912 | break; | ||
1913 | case WMI_10X_DEBUG_PRINT_EVENTID: | ||
1914 | ath10k_wmi_event_debug_print(ar, skb); | ||
1915 | break; | ||
1916 | case WMI_10X_PDEV_QVIT_EVENTID: | ||
1917 | ath10k_wmi_event_pdev_qvit(ar, skb); | ||
1918 | break; | ||
1919 | case WMI_10X_WLAN_PROFILE_DATA_EVENTID: | ||
1920 | ath10k_wmi_event_wlan_profile_data(ar, skb); | ||
1921 | break; | ||
1922 | case WMI_10X_RTT_MEASUREMENT_REPORT_EVENTID: | ||
1923 | ath10k_wmi_event_rtt_measurement_report(ar, skb); | ||
1924 | break; | ||
1925 | case WMI_10X_TSF_MEASUREMENT_REPORT_EVENTID: | ||
1926 | ath10k_wmi_event_tsf_measurement_report(ar, skb); | ||
1927 | break; | ||
1928 | case WMI_10X_RTT_ERROR_REPORT_EVENTID: | ||
1929 | ath10k_wmi_event_rtt_error_report(ar, skb); | ||
1930 | break; | ||
1931 | case WMI_10X_WOW_WAKEUP_HOST_EVENTID: | ||
1932 | ath10k_wmi_event_wow_wakeup_host(ar, skb); | ||
1933 | break; | ||
1934 | case WMI_10X_DCS_INTERFERENCE_EVENTID: | ||
1935 | ath10k_wmi_event_dcs_interference(ar, skb); | ||
1936 | break; | ||
1937 | case WMI_10X_PDEV_TPC_CONFIG_EVENTID: | ||
1938 | ath10k_wmi_event_pdev_tpc_config(ar, skb); | ||
1939 | break; | ||
1940 | case WMI_10X_INST_RSSI_STATS_EVENTID: | ||
1941 | ath10k_wmi_event_inst_rssi_stats(ar, skb); | ||
1942 | break; | ||
1943 | case WMI_10X_VDEV_STANDBY_REQ_EVENTID: | ||
1944 | ath10k_wmi_event_vdev_standby_req(ar, skb); | ||
1945 | break; | ||
1946 | case WMI_10X_VDEV_RESUME_REQ_EVENTID: | ||
1947 | ath10k_wmi_event_vdev_resume_req(ar, skb); | ||
1948 | break; | ||
1949 | case WMI_10X_SERVICE_READY_EVENTID: | ||
1950 | ath10k_wmi_10x_service_ready_event_rx(ar, skb); | ||
1951 | break; | ||
1952 | case WMI_10X_READY_EVENTID: | ||
1953 | ath10k_wmi_ready_event_rx(ar, skb); | ||
1954 | break; | ||
1955 | default: | ||
1956 | ath10k_warn("Unknown eventid: %d\n", id); | ||
1957 | break; | ||
1958 | } | ||
1959 | |||
1960 | dev_kfree_skb(skb); | ||
1961 | } | ||
1962 | |||
1963 | |||
1964 | static void ath10k_wmi_process_rx(struct ath10k *ar, struct sk_buff *skb) | ||
1965 | { | ||
1966 | if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) | ||
1967 | ath10k_wmi_10x_process_rx(ar, skb); | ||
1968 | else | ||
1969 | ath10k_wmi_main_process_rx(ar, skb); | ||
1970 | } | ||
1971 | |||
1177 | /* WMI Initialization functions */ | 1972 | /* WMI Initialization functions */ |
1178 | int ath10k_wmi_attach(struct ath10k *ar) | 1973 | int ath10k_wmi_attach(struct ath10k *ar) |
1179 | { | 1974 | { |
1975 | if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) { | ||
1976 | ar->wmi.cmd = &wmi_10x_cmd_map; | ||
1977 | ar->wmi.vdev_param = &wmi_10x_vdev_param_map; | ||
1978 | ar->wmi.pdev_param = &wmi_10x_pdev_param_map; | ||
1979 | } else { | ||
1980 | ar->wmi.cmd = &wmi_cmd_map; | ||
1981 | ar->wmi.vdev_param = &wmi_vdev_param_map; | ||
1982 | ar->wmi.pdev_param = &wmi_pdev_param_map; | ||
1983 | } | ||
1984 | |||
1180 | init_completion(&ar->wmi.service_ready); | 1985 | init_completion(&ar->wmi.service_ready); |
1181 | init_completion(&ar->wmi.unified_ready); | 1986 | init_completion(&ar->wmi.unified_ready); |
1182 | init_waitqueue_head(&ar->wmi.tx_credits_wq); | 1987 | init_waitqueue_head(&ar->wmi.tx_credits_wq); |
@@ -1186,6 +1991,17 @@ int ath10k_wmi_attach(struct ath10k *ar) | |||
1186 | 1991 | ||
1187 | void ath10k_wmi_detach(struct ath10k *ar) | 1992 | void ath10k_wmi_detach(struct ath10k *ar) |
1188 | { | 1993 | { |
1994 | int i; | ||
1995 | |||
1996 | /* free the host memory chunks requested by firmware */ | ||
1997 | for (i = 0; i < ar->wmi.num_mem_chunks; i++) { | ||
1998 | dma_free_coherent(ar->dev, | ||
1999 | ar->wmi.mem_chunks[i].len, | ||
2000 | ar->wmi.mem_chunks[i].vaddr, | ||
2001 | ar->wmi.mem_chunks[i].paddr); | ||
2002 | } | ||
2003 | |||
2004 | ar->wmi.num_mem_chunks = 0; | ||
1189 | } | 2005 | } |
1190 | 2006 | ||
1191 | int ath10k_wmi_connect_htc_service(struct ath10k *ar) | 2007 | int ath10k_wmi_connect_htc_service(struct ath10k *ar) |
@@ -1237,7 +2053,8 @@ int ath10k_wmi_pdev_set_regdomain(struct ath10k *ar, u16 rd, u16 rd2g, | |||
1237 | "wmi pdev regdomain rd %x rd2g %x rd5g %x ctl2g %x ctl5g %x\n", | 2053 | "wmi pdev regdomain rd %x rd2g %x rd5g %x ctl2g %x ctl5g %x\n", |
1238 | rd, rd2g, rd5g, ctl2g, ctl5g); | 2054 | rd, rd2g, rd5g, ctl2g, ctl5g); |
1239 | 2055 | ||
1240 | return ath10k_wmi_cmd_send(ar, skb, WMI_PDEV_SET_REGDOMAIN_CMDID); | 2056 | return ath10k_wmi_cmd_send(ar, skb, |
2057 | ar->wmi.cmd->pdev_set_regdomain_cmdid); | ||
1241 | } | 2058 | } |
1242 | 2059 | ||
1243 | int ath10k_wmi_pdev_set_channel(struct ath10k *ar, | 2060 | int ath10k_wmi_pdev_set_channel(struct ath10k *ar, |
@@ -1267,7 +2084,8 @@ int ath10k_wmi_pdev_set_channel(struct ath10k *ar, | |||
1267 | "wmi set channel mode %d freq %d\n", | 2084 | "wmi set channel mode %d freq %d\n", |
1268 | arg->mode, arg->freq); | 2085 | arg->mode, arg->freq); |
1269 | 2086 | ||
1270 | return ath10k_wmi_cmd_send(ar, skb, WMI_PDEV_SET_CHANNEL_CMDID); | 2087 | return ath10k_wmi_cmd_send(ar, skb, |
2088 | ar->wmi.cmd->pdev_set_channel_cmdid); | ||
1271 | } | 2089 | } |
1272 | 2090 | ||
1273 | int ath10k_wmi_pdev_suspend_target(struct ath10k *ar) | 2091 | int ath10k_wmi_pdev_suspend_target(struct ath10k *ar) |
@@ -1282,7 +2100,7 @@ int ath10k_wmi_pdev_suspend_target(struct ath10k *ar) | |||
1282 | cmd = (struct wmi_pdev_suspend_cmd *)skb->data; | 2100 | cmd = (struct wmi_pdev_suspend_cmd *)skb->data; |
1283 | cmd->suspend_opt = WMI_PDEV_SUSPEND; | 2101 | cmd->suspend_opt = WMI_PDEV_SUSPEND; |
1284 | 2102 | ||
1285 | return ath10k_wmi_cmd_send(ar, skb, WMI_PDEV_SUSPEND_CMDID); | 2103 | return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_suspend_cmdid); |
1286 | } | 2104 | } |
1287 | 2105 | ||
1288 | int ath10k_wmi_pdev_resume_target(struct ath10k *ar) | 2106 | int ath10k_wmi_pdev_resume_target(struct ath10k *ar) |
@@ -1293,15 +2111,19 @@ int ath10k_wmi_pdev_resume_target(struct ath10k *ar) | |||
1293 | if (skb == NULL) | 2111 | if (skb == NULL) |
1294 | return -ENOMEM; | 2112 | return -ENOMEM; |
1295 | 2113 | ||
1296 | return ath10k_wmi_cmd_send(ar, skb, WMI_PDEV_RESUME_CMDID); | 2114 | return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_resume_cmdid); |
1297 | } | 2115 | } |
1298 | 2116 | ||
1299 | int ath10k_wmi_pdev_set_param(struct ath10k *ar, enum wmi_pdev_param id, | 2117 | int ath10k_wmi_pdev_set_param(struct ath10k *ar, u32 id, u32 value) |
1300 | u32 value) | ||
1301 | { | 2118 | { |
1302 | struct wmi_pdev_set_param_cmd *cmd; | 2119 | struct wmi_pdev_set_param_cmd *cmd; |
1303 | struct sk_buff *skb; | 2120 | struct sk_buff *skb; |
1304 | 2121 | ||
2122 | if (id == WMI_PDEV_PARAM_UNSUPPORTED) { | ||
2123 | ath10k_warn("pdev param %d not supported by firmware\n", id); | ||
2124 | return -EOPNOTSUPP; | ||
2125 | } | ||
2126 | |||
1305 | skb = ath10k_wmi_alloc_skb(sizeof(*cmd)); | 2127 | skb = ath10k_wmi_alloc_skb(sizeof(*cmd)); |
1306 | if (!skb) | 2128 | if (!skb) |
1307 | return -ENOMEM; | 2129 | return -ENOMEM; |
@@ -1312,15 +2134,16 @@ int ath10k_wmi_pdev_set_param(struct ath10k *ar, enum wmi_pdev_param id, | |||
1312 | 2134 | ||
1313 | ath10k_dbg(ATH10K_DBG_WMI, "wmi pdev set param %d value %d\n", | 2135 | ath10k_dbg(ATH10K_DBG_WMI, "wmi pdev set param %d value %d\n", |
1314 | id, value); | 2136 | id, value); |
1315 | return ath10k_wmi_cmd_send(ar, skb, WMI_PDEV_SET_PARAM_CMDID); | 2137 | return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_set_param_cmdid); |
1316 | } | 2138 | } |
1317 | 2139 | ||
1318 | int ath10k_wmi_cmd_init(struct ath10k *ar) | 2140 | static int ath10k_wmi_main_cmd_init(struct ath10k *ar) |
1319 | { | 2141 | { |
1320 | struct wmi_init_cmd *cmd; | 2142 | struct wmi_init_cmd *cmd; |
1321 | struct sk_buff *buf; | 2143 | struct sk_buff *buf; |
1322 | struct wmi_resource_config config = {}; | 2144 | struct wmi_resource_config config = {}; |
1323 | u32 val; | 2145 | u32 len, val; |
2146 | int i; | ||
1324 | 2147 | ||
1325 | config.num_vdevs = __cpu_to_le32(TARGET_NUM_VDEVS); | 2148 | config.num_vdevs = __cpu_to_le32(TARGET_NUM_VDEVS); |
1326 | config.num_peers = __cpu_to_le32(TARGET_NUM_PEERS + TARGET_NUM_VDEVS); | 2149 | config.num_peers = __cpu_to_le32(TARGET_NUM_PEERS + TARGET_NUM_VDEVS); |
@@ -1373,23 +2196,158 @@ int ath10k_wmi_cmd_init(struct ath10k *ar) | |||
1373 | config.num_msdu_desc = __cpu_to_le32(TARGET_NUM_MSDU_DESC); | 2196 | config.num_msdu_desc = __cpu_to_le32(TARGET_NUM_MSDU_DESC); |
1374 | config.max_frag_entries = __cpu_to_le32(TARGET_MAX_FRAG_ENTRIES); | 2197 | config.max_frag_entries = __cpu_to_le32(TARGET_MAX_FRAG_ENTRIES); |
1375 | 2198 | ||
1376 | buf = ath10k_wmi_alloc_skb(sizeof(*cmd)); | 2199 | len = sizeof(*cmd) + |
2200 | (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks); | ||
2201 | |||
2202 | buf = ath10k_wmi_alloc_skb(len); | ||
1377 | if (!buf) | 2203 | if (!buf) |
1378 | return -ENOMEM; | 2204 | return -ENOMEM; |
1379 | 2205 | ||
1380 | cmd = (struct wmi_init_cmd *)buf->data; | 2206 | cmd = (struct wmi_init_cmd *)buf->data; |
1381 | cmd->num_host_mem_chunks = 0; | 2207 | |
2208 | if (ar->wmi.num_mem_chunks == 0) { | ||
2209 | cmd->num_host_mem_chunks = 0; | ||
2210 | goto out; | ||
2211 | } | ||
2212 | |||
2213 | ath10k_dbg(ATH10K_DBG_WMI, "wmi sending %d memory chunks info.\n", | ||
2214 | __cpu_to_le32(ar->wmi.num_mem_chunks)); | ||
2215 | |||
2216 | cmd->num_host_mem_chunks = __cpu_to_le32(ar->wmi.num_mem_chunks); | ||
2217 | |||
2218 | for (i = 0; i < ar->wmi.num_mem_chunks; i++) { | ||
2219 | cmd->host_mem_chunks[i].ptr = | ||
2220 | __cpu_to_le32(ar->wmi.mem_chunks[i].paddr); | ||
2221 | cmd->host_mem_chunks[i].size = | ||
2222 | __cpu_to_le32(ar->wmi.mem_chunks[i].len); | ||
2223 | cmd->host_mem_chunks[i].req_id = | ||
2224 | __cpu_to_le32(ar->wmi.mem_chunks[i].req_id); | ||
2225 | |||
2226 | ath10k_dbg(ATH10K_DBG_WMI, | ||
2227 | "wmi chunk %d len %d requested, addr 0x%x\n", | ||
2228 | i, | ||
2229 | cmd->host_mem_chunks[i].size, | ||
2230 | cmd->host_mem_chunks[i].ptr); | ||
2231 | } | ||
2232 | out: | ||
1382 | memcpy(&cmd->resource_config, &config, sizeof(config)); | 2233 | memcpy(&cmd->resource_config, &config, sizeof(config)); |
1383 | 2234 | ||
1384 | ath10k_dbg(ATH10K_DBG_WMI, "wmi init\n"); | 2235 | ath10k_dbg(ATH10K_DBG_WMI, "wmi init\n"); |
1385 | return ath10k_wmi_cmd_send(ar, buf, WMI_INIT_CMDID); | 2236 | return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->init_cmdid); |
2237 | } | ||
2238 | |||
2239 | static int ath10k_wmi_10x_cmd_init(struct ath10k *ar) | ||
2240 | { | ||
2241 | struct wmi_init_cmd_10x *cmd; | ||
2242 | struct sk_buff *buf; | ||
2243 | struct wmi_resource_config_10x config = {}; | ||
2244 | u32 len, val; | ||
2245 | int i; | ||
2246 | |||
2247 | config.num_vdevs = __cpu_to_le32(TARGET_10X_NUM_VDEVS); | ||
2248 | config.num_peers = __cpu_to_le32(TARGET_10X_NUM_PEERS); | ||
2249 | config.num_peer_keys = __cpu_to_le32(TARGET_10X_NUM_PEER_KEYS); | ||
2250 | config.num_tids = __cpu_to_le32(TARGET_10X_NUM_TIDS); | ||
2251 | config.ast_skid_limit = __cpu_to_le32(TARGET_10X_AST_SKID_LIMIT); | ||
2252 | config.tx_chain_mask = __cpu_to_le32(TARGET_10X_TX_CHAIN_MASK); | ||
2253 | config.rx_chain_mask = __cpu_to_le32(TARGET_10X_RX_CHAIN_MASK); | ||
2254 | config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI); | ||
2255 | config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI); | ||
2256 | config.rx_timeout_pri_be = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI); | ||
2257 | config.rx_timeout_pri_bk = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_HI_PRI); | ||
2258 | config.rx_decap_mode = __cpu_to_le32(TARGET_10X_RX_DECAP_MODE); | ||
2259 | |||
2260 | config.scan_max_pending_reqs = | ||
2261 | __cpu_to_le32(TARGET_10X_SCAN_MAX_PENDING_REQS); | ||
2262 | |||
2263 | config.bmiss_offload_max_vdev = | ||
2264 | __cpu_to_le32(TARGET_10X_BMISS_OFFLOAD_MAX_VDEV); | ||
2265 | |||
2266 | config.roam_offload_max_vdev = | ||
2267 | __cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_VDEV); | ||
2268 | |||
2269 | config.roam_offload_max_ap_profiles = | ||
2270 | __cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_AP_PROFILES); | ||
2271 | |||
2272 | config.num_mcast_groups = __cpu_to_le32(TARGET_10X_NUM_MCAST_GROUPS); | ||
2273 | config.num_mcast_table_elems = | ||
2274 | __cpu_to_le32(TARGET_10X_NUM_MCAST_TABLE_ELEMS); | ||
2275 | |||
2276 | config.mcast2ucast_mode = __cpu_to_le32(TARGET_10X_MCAST2UCAST_MODE); | ||
2277 | config.tx_dbg_log_size = __cpu_to_le32(TARGET_10X_TX_DBG_LOG_SIZE); | ||
2278 | config.num_wds_entries = __cpu_to_le32(TARGET_10X_NUM_WDS_ENTRIES); | ||
2279 | config.dma_burst_size = __cpu_to_le32(TARGET_10X_DMA_BURST_SIZE); | ||
2280 | config.mac_aggr_delim = __cpu_to_le32(TARGET_10X_MAC_AGGR_DELIM); | ||
2281 | |||
2282 | val = TARGET_10X_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK; | ||
2283 | config.rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(val); | ||
2284 | |||
2285 | config.vow_config = __cpu_to_le32(TARGET_10X_VOW_CONFIG); | ||
2286 | |||
2287 | config.num_msdu_desc = __cpu_to_le32(TARGET_10X_NUM_MSDU_DESC); | ||
2288 | config.max_frag_entries = __cpu_to_le32(TARGET_10X_MAX_FRAG_ENTRIES); | ||
2289 | |||
2290 | len = sizeof(*cmd) + | ||
2291 | (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks); | ||
2292 | |||
2293 | buf = ath10k_wmi_alloc_skb(len); | ||
2294 | if (!buf) | ||
2295 | return -ENOMEM; | ||
2296 | |||
2297 | cmd = (struct wmi_init_cmd_10x *)buf->data; | ||
2298 | |||
2299 | if (ar->wmi.num_mem_chunks == 0) { | ||
2300 | cmd->num_host_mem_chunks = 0; | ||
2301 | goto out; | ||
2302 | } | ||
2303 | |||
2304 | ath10k_dbg(ATH10K_DBG_WMI, "wmi sending %d memory chunks info.\n", | ||
2305 | __cpu_to_le32(ar->wmi.num_mem_chunks)); | ||
2306 | |||
2307 | cmd->num_host_mem_chunks = __cpu_to_le32(ar->wmi.num_mem_chunks); | ||
2308 | |||
2309 | for (i = 0; i < ar->wmi.num_mem_chunks; i++) { | ||
2310 | cmd->host_mem_chunks[i].ptr = | ||
2311 | __cpu_to_le32(ar->wmi.mem_chunks[i].paddr); | ||
2312 | cmd->host_mem_chunks[i].size = | ||
2313 | __cpu_to_le32(ar->wmi.mem_chunks[i].len); | ||
2314 | cmd->host_mem_chunks[i].req_id = | ||
2315 | __cpu_to_le32(ar->wmi.mem_chunks[i].req_id); | ||
2316 | |||
2317 | ath10k_dbg(ATH10K_DBG_WMI, | ||
2318 | "wmi chunk %d len %d requested, addr 0x%x\n", | ||
2319 | i, | ||
2320 | cmd->host_mem_chunks[i].size, | ||
2321 | cmd->host_mem_chunks[i].ptr); | ||
2322 | } | ||
2323 | out: | ||
2324 | memcpy(&cmd->resource_config, &config, sizeof(config)); | ||
2325 | |||
2326 | ath10k_dbg(ATH10K_DBG_WMI, "wmi init 10x\n"); | ||
2327 | return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->init_cmdid); | ||
2328 | } | ||
2329 | |||
2330 | int ath10k_wmi_cmd_init(struct ath10k *ar) | ||
2331 | { | ||
2332 | int ret; | ||
2333 | |||
2334 | if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) | ||
2335 | ret = ath10k_wmi_10x_cmd_init(ar); | ||
2336 | else | ||
2337 | ret = ath10k_wmi_main_cmd_init(ar); | ||
2338 | |||
2339 | return ret; | ||
1386 | } | 2340 | } |
1387 | 2341 | ||
1388 | static int ath10k_wmi_start_scan_calc_len(const struct wmi_start_scan_arg *arg) | 2342 | static int ath10k_wmi_start_scan_calc_len(struct ath10k *ar, |
2343 | const struct wmi_start_scan_arg *arg) | ||
1389 | { | 2344 | { |
1390 | int len; | 2345 | int len; |
1391 | 2346 | ||
1392 | len = sizeof(struct wmi_start_scan_cmd); | 2347 | if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) |
2348 | len = sizeof(struct wmi_start_scan_cmd_10x); | ||
2349 | else | ||
2350 | len = sizeof(struct wmi_start_scan_cmd); | ||
1393 | 2351 | ||
1394 | if (arg->ie_len) { | 2352 | if (arg->ie_len) { |
1395 | if (!arg->ie) | 2353 | if (!arg->ie) |
@@ -1449,7 +2407,7 @@ int ath10k_wmi_start_scan(struct ath10k *ar, | |||
1449 | int len = 0; | 2407 | int len = 0; |
1450 | int i; | 2408 | int i; |
1451 | 2409 | ||
1452 | len = ath10k_wmi_start_scan_calc_len(arg); | 2410 | len = ath10k_wmi_start_scan_calc_len(ar, arg); |
1453 | if (len < 0) | 2411 | if (len < 0) |
1454 | return len; /* len contains error code here */ | 2412 | return len; /* len contains error code here */ |
1455 | 2413 | ||
@@ -1481,7 +2439,14 @@ int ath10k_wmi_start_scan(struct ath10k *ar, | |||
1481 | cmd->scan_ctrl_flags = __cpu_to_le32(arg->scan_ctrl_flags); | 2439 | cmd->scan_ctrl_flags = __cpu_to_le32(arg->scan_ctrl_flags); |
1482 | 2440 | ||
1483 | /* TLV list starts after fields included in the struct */ | 2441 | /* TLV list starts after fields included in the struct */ |
1484 | off = sizeof(*cmd); | 2442 | /* There's just one filed that differes the two start_scan |
2443 | * structures - burst_duration, which we are not using btw, | ||
2444 | no point to make the split here, just shift the buffer to fit with | ||
2445 | given FW */ | ||
2446 | if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) | ||
2447 | off = sizeof(struct wmi_start_scan_cmd_10x); | ||
2448 | else | ||
2449 | off = sizeof(struct wmi_start_scan_cmd); | ||
1485 | 2450 | ||
1486 | if (arg->n_channels) { | 2451 | if (arg->n_channels) { |
1487 | channels = (void *)skb->data + off; | 2452 | channels = (void *)skb->data + off; |
@@ -1543,7 +2508,7 @@ int ath10k_wmi_start_scan(struct ath10k *ar, | |||
1543 | } | 2508 | } |
1544 | 2509 | ||
1545 | ath10k_dbg(ATH10K_DBG_WMI, "wmi start scan\n"); | 2510 | ath10k_dbg(ATH10K_DBG_WMI, "wmi start scan\n"); |
1546 | return ath10k_wmi_cmd_send(ar, skb, WMI_START_SCAN_CMDID); | 2511 | return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->start_scan_cmdid); |
1547 | } | 2512 | } |
1548 | 2513 | ||
1549 | void ath10k_wmi_start_scan_init(struct ath10k *ar, | 2514 | void ath10k_wmi_start_scan_init(struct ath10k *ar, |
@@ -1559,7 +2524,7 @@ void ath10k_wmi_start_scan_init(struct ath10k *ar, | |||
1559 | arg->repeat_probe_time = 0; | 2524 | arg->repeat_probe_time = 0; |
1560 | arg->probe_spacing_time = 0; | 2525 | arg->probe_spacing_time = 0; |
1561 | arg->idle_time = 0; | 2526 | arg->idle_time = 0; |
1562 | arg->max_scan_time = 5000; | 2527 | arg->max_scan_time = 20000; |
1563 | arg->probe_delay = 5; | 2528 | arg->probe_delay = 5; |
1564 | arg->notify_scan_events = WMI_SCAN_EVENT_STARTED | 2529 | arg->notify_scan_events = WMI_SCAN_EVENT_STARTED |
1565 | | WMI_SCAN_EVENT_COMPLETED | 2530 | | WMI_SCAN_EVENT_COMPLETED |
@@ -1603,7 +2568,7 @@ int ath10k_wmi_stop_scan(struct ath10k *ar, const struct wmi_stop_scan_arg *arg) | |||
1603 | ath10k_dbg(ATH10K_DBG_WMI, | 2568 | ath10k_dbg(ATH10K_DBG_WMI, |
1604 | "wmi stop scan reqid %d req_type %d vdev/scan_id %d\n", | 2569 | "wmi stop scan reqid %d req_type %d vdev/scan_id %d\n", |
1605 | arg->req_id, arg->req_type, arg->u.scan_id); | 2570 | arg->req_id, arg->req_type, arg->u.scan_id); |
1606 | return ath10k_wmi_cmd_send(ar, skb, WMI_STOP_SCAN_CMDID); | 2571 | return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->stop_scan_cmdid); |
1607 | } | 2572 | } |
1608 | 2573 | ||
1609 | int ath10k_wmi_vdev_create(struct ath10k *ar, u32 vdev_id, | 2574 | int ath10k_wmi_vdev_create(struct ath10k *ar, u32 vdev_id, |
@@ -1628,7 +2593,7 @@ int ath10k_wmi_vdev_create(struct ath10k *ar, u32 vdev_id, | |||
1628 | "WMI vdev create: id %d type %d subtype %d macaddr %pM\n", | 2593 | "WMI vdev create: id %d type %d subtype %d macaddr %pM\n", |
1629 | vdev_id, type, subtype, macaddr); | 2594 | vdev_id, type, subtype, macaddr); |
1630 | 2595 | ||
1631 | return ath10k_wmi_cmd_send(ar, skb, WMI_VDEV_CREATE_CMDID); | 2596 | return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_create_cmdid); |
1632 | } | 2597 | } |
1633 | 2598 | ||
1634 | int ath10k_wmi_vdev_delete(struct ath10k *ar, u32 vdev_id) | 2599 | int ath10k_wmi_vdev_delete(struct ath10k *ar, u32 vdev_id) |
@@ -1646,20 +2611,20 @@ int ath10k_wmi_vdev_delete(struct ath10k *ar, u32 vdev_id) | |||
1646 | ath10k_dbg(ATH10K_DBG_WMI, | 2611 | ath10k_dbg(ATH10K_DBG_WMI, |
1647 | "WMI vdev delete id %d\n", vdev_id); | 2612 | "WMI vdev delete id %d\n", vdev_id); |
1648 | 2613 | ||
1649 | return ath10k_wmi_cmd_send(ar, skb, WMI_VDEV_DELETE_CMDID); | 2614 | return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_delete_cmdid); |
1650 | } | 2615 | } |
1651 | 2616 | ||
1652 | static int ath10k_wmi_vdev_start_restart(struct ath10k *ar, | 2617 | static int ath10k_wmi_vdev_start_restart(struct ath10k *ar, |
1653 | const struct wmi_vdev_start_request_arg *arg, | 2618 | const struct wmi_vdev_start_request_arg *arg, |
1654 | enum wmi_cmd_id cmd_id) | 2619 | u32 cmd_id) |
1655 | { | 2620 | { |
1656 | struct wmi_vdev_start_request_cmd *cmd; | 2621 | struct wmi_vdev_start_request_cmd *cmd; |
1657 | struct sk_buff *skb; | 2622 | struct sk_buff *skb; |
1658 | const char *cmdname; | 2623 | const char *cmdname; |
1659 | u32 flags = 0; | 2624 | u32 flags = 0; |
1660 | 2625 | ||
1661 | if (cmd_id != WMI_VDEV_START_REQUEST_CMDID && | 2626 | if (cmd_id != ar->wmi.cmd->vdev_start_request_cmdid && |
1662 | cmd_id != WMI_VDEV_RESTART_REQUEST_CMDID) | 2627 | cmd_id != ar->wmi.cmd->vdev_restart_request_cmdid) |
1663 | return -EINVAL; | 2628 | return -EINVAL; |
1664 | if (WARN_ON(arg->ssid && arg->ssid_len == 0)) | 2629 | if (WARN_ON(arg->ssid && arg->ssid_len == 0)) |
1665 | return -EINVAL; | 2630 | return -EINVAL; |
@@ -1668,9 +2633,9 @@ static int ath10k_wmi_vdev_start_restart(struct ath10k *ar, | |||
1668 | if (WARN_ON(arg->ssid_len > sizeof(cmd->ssid.ssid))) | 2633 | if (WARN_ON(arg->ssid_len > sizeof(cmd->ssid.ssid))) |
1669 | return -EINVAL; | 2634 | return -EINVAL; |
1670 | 2635 | ||
1671 | if (cmd_id == WMI_VDEV_START_REQUEST_CMDID) | 2636 | if (cmd_id == ar->wmi.cmd->vdev_start_request_cmdid) |
1672 | cmdname = "start"; | 2637 | cmdname = "start"; |
1673 | else if (cmd_id == WMI_VDEV_RESTART_REQUEST_CMDID) | 2638 | else if (cmd_id == ar->wmi.cmd->vdev_restart_request_cmdid) |
1674 | cmdname = "restart"; | 2639 | cmdname = "restart"; |
1675 | else | 2640 | else |
1676 | return -EINVAL; /* should not happen, we already check cmd_id */ | 2641 | return -EINVAL; /* should not happen, we already check cmd_id */ |
@@ -1721,15 +2686,17 @@ static int ath10k_wmi_vdev_start_restart(struct ath10k *ar, | |||
1721 | int ath10k_wmi_vdev_start(struct ath10k *ar, | 2686 | int ath10k_wmi_vdev_start(struct ath10k *ar, |
1722 | const struct wmi_vdev_start_request_arg *arg) | 2687 | const struct wmi_vdev_start_request_arg *arg) |
1723 | { | 2688 | { |
1724 | return ath10k_wmi_vdev_start_restart(ar, arg, | 2689 | u32 cmd_id = ar->wmi.cmd->vdev_start_request_cmdid; |
1725 | WMI_VDEV_START_REQUEST_CMDID); | 2690 | |
2691 | return ath10k_wmi_vdev_start_restart(ar, arg, cmd_id); | ||
1726 | } | 2692 | } |
1727 | 2693 | ||
1728 | int ath10k_wmi_vdev_restart(struct ath10k *ar, | 2694 | int ath10k_wmi_vdev_restart(struct ath10k *ar, |
1729 | const struct wmi_vdev_start_request_arg *arg) | 2695 | const struct wmi_vdev_start_request_arg *arg) |
1730 | { | 2696 | { |
1731 | return ath10k_wmi_vdev_start_restart(ar, arg, | 2697 | u32 cmd_id = ar->wmi.cmd->vdev_restart_request_cmdid; |
1732 | WMI_VDEV_RESTART_REQUEST_CMDID); | 2698 | |
2699 | return ath10k_wmi_vdev_start_restart(ar, arg, cmd_id); | ||
1733 | } | 2700 | } |
1734 | 2701 | ||
1735 | int ath10k_wmi_vdev_stop(struct ath10k *ar, u32 vdev_id) | 2702 | int ath10k_wmi_vdev_stop(struct ath10k *ar, u32 vdev_id) |
@@ -1746,7 +2713,7 @@ int ath10k_wmi_vdev_stop(struct ath10k *ar, u32 vdev_id) | |||
1746 | 2713 | ||
1747 | ath10k_dbg(ATH10K_DBG_WMI, "wmi vdev stop id 0x%x\n", vdev_id); | 2714 | ath10k_dbg(ATH10K_DBG_WMI, "wmi vdev stop id 0x%x\n", vdev_id); |
1748 | 2715 | ||
1749 | return ath10k_wmi_cmd_send(ar, skb, WMI_VDEV_STOP_CMDID); | 2716 | return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_stop_cmdid); |
1750 | } | 2717 | } |
1751 | 2718 | ||
1752 | int ath10k_wmi_vdev_up(struct ath10k *ar, u32 vdev_id, u32 aid, const u8 *bssid) | 2719 | int ath10k_wmi_vdev_up(struct ath10k *ar, u32 vdev_id, u32 aid, const u8 *bssid) |
@@ -1767,7 +2734,7 @@ int ath10k_wmi_vdev_up(struct ath10k *ar, u32 vdev_id, u32 aid, const u8 *bssid) | |||
1767 | "wmi mgmt vdev up id 0x%x assoc id %d bssid %pM\n", | 2734 | "wmi mgmt vdev up id 0x%x assoc id %d bssid %pM\n", |
1768 | vdev_id, aid, bssid); | 2735 | vdev_id, aid, bssid); |
1769 | 2736 | ||
1770 | return ath10k_wmi_cmd_send(ar, skb, WMI_VDEV_UP_CMDID); | 2737 | return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_up_cmdid); |
1771 | } | 2738 | } |
1772 | 2739 | ||
1773 | int ath10k_wmi_vdev_down(struct ath10k *ar, u32 vdev_id) | 2740 | int ath10k_wmi_vdev_down(struct ath10k *ar, u32 vdev_id) |
@@ -1785,15 +2752,22 @@ int ath10k_wmi_vdev_down(struct ath10k *ar, u32 vdev_id) | |||
1785 | ath10k_dbg(ATH10K_DBG_WMI, | 2752 | ath10k_dbg(ATH10K_DBG_WMI, |
1786 | "wmi mgmt vdev down id 0x%x\n", vdev_id); | 2753 | "wmi mgmt vdev down id 0x%x\n", vdev_id); |
1787 | 2754 | ||
1788 | return ath10k_wmi_cmd_send(ar, skb, WMI_VDEV_DOWN_CMDID); | 2755 | return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_down_cmdid); |
1789 | } | 2756 | } |
1790 | 2757 | ||
1791 | int ath10k_wmi_vdev_set_param(struct ath10k *ar, u32 vdev_id, | 2758 | int ath10k_wmi_vdev_set_param(struct ath10k *ar, u32 vdev_id, |
1792 | enum wmi_vdev_param param_id, u32 param_value) | 2759 | u32 param_id, u32 param_value) |
1793 | { | 2760 | { |
1794 | struct wmi_vdev_set_param_cmd *cmd; | 2761 | struct wmi_vdev_set_param_cmd *cmd; |
1795 | struct sk_buff *skb; | 2762 | struct sk_buff *skb; |
1796 | 2763 | ||
2764 | if (param_id == WMI_VDEV_PARAM_UNSUPPORTED) { | ||
2765 | ath10k_dbg(ATH10K_DBG_WMI, | ||
2766 | "vdev param %d not supported by firmware\n", | ||
2767 | param_id); | ||
2768 | return -EOPNOTSUPP; | ||
2769 | } | ||
2770 | |||
1797 | skb = ath10k_wmi_alloc_skb(sizeof(*cmd)); | 2771 | skb = ath10k_wmi_alloc_skb(sizeof(*cmd)); |
1798 | if (!skb) | 2772 | if (!skb) |
1799 | return -ENOMEM; | 2773 | return -ENOMEM; |
@@ -1807,7 +2781,7 @@ int ath10k_wmi_vdev_set_param(struct ath10k *ar, u32 vdev_id, | |||
1807 | "wmi vdev id 0x%x set param %d value %d\n", | 2781 | "wmi vdev id 0x%x set param %d value %d\n", |
1808 | vdev_id, param_id, param_value); | 2782 | vdev_id, param_id, param_value); |
1809 | 2783 | ||
1810 | return ath10k_wmi_cmd_send(ar, skb, WMI_VDEV_SET_PARAM_CMDID); | 2784 | return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_set_param_cmdid); |
1811 | } | 2785 | } |
1812 | 2786 | ||
1813 | int ath10k_wmi_vdev_install_key(struct ath10k *ar, | 2787 | int ath10k_wmi_vdev_install_key(struct ath10k *ar, |
@@ -1842,7 +2816,8 @@ int ath10k_wmi_vdev_install_key(struct ath10k *ar, | |||
1842 | ath10k_dbg(ATH10K_DBG_WMI, | 2816 | ath10k_dbg(ATH10K_DBG_WMI, |
1843 | "wmi vdev install key idx %d cipher %d len %d\n", | 2817 | "wmi vdev install key idx %d cipher %d len %d\n", |
1844 | arg->key_idx, arg->key_cipher, arg->key_len); | 2818 | arg->key_idx, arg->key_cipher, arg->key_len); |
1845 | return ath10k_wmi_cmd_send(ar, skb, WMI_VDEV_INSTALL_KEY_CMDID); | 2819 | return ath10k_wmi_cmd_send(ar, skb, |
2820 | ar->wmi.cmd->vdev_install_key_cmdid); | ||
1846 | } | 2821 | } |
1847 | 2822 | ||
1848 | int ath10k_wmi_peer_create(struct ath10k *ar, u32 vdev_id, | 2823 | int ath10k_wmi_peer_create(struct ath10k *ar, u32 vdev_id, |
@@ -1862,7 +2837,7 @@ int ath10k_wmi_peer_create(struct ath10k *ar, u32 vdev_id, | |||
1862 | ath10k_dbg(ATH10K_DBG_WMI, | 2837 | ath10k_dbg(ATH10K_DBG_WMI, |
1863 | "wmi peer create vdev_id %d peer_addr %pM\n", | 2838 | "wmi peer create vdev_id %d peer_addr %pM\n", |
1864 | vdev_id, peer_addr); | 2839 | vdev_id, peer_addr); |
1865 | return ath10k_wmi_cmd_send(ar, skb, WMI_PEER_CREATE_CMDID); | 2840 | return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_create_cmdid); |
1866 | } | 2841 | } |
1867 | 2842 | ||
1868 | int ath10k_wmi_peer_delete(struct ath10k *ar, u32 vdev_id, | 2843 | int ath10k_wmi_peer_delete(struct ath10k *ar, u32 vdev_id, |
@@ -1882,7 +2857,7 @@ int ath10k_wmi_peer_delete(struct ath10k *ar, u32 vdev_id, | |||
1882 | ath10k_dbg(ATH10K_DBG_WMI, | 2857 | ath10k_dbg(ATH10K_DBG_WMI, |
1883 | "wmi peer delete vdev_id %d peer_addr %pM\n", | 2858 | "wmi peer delete vdev_id %d peer_addr %pM\n", |
1884 | vdev_id, peer_addr); | 2859 | vdev_id, peer_addr); |
1885 | return ath10k_wmi_cmd_send(ar, skb, WMI_PEER_DELETE_CMDID); | 2860 | return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_delete_cmdid); |
1886 | } | 2861 | } |
1887 | 2862 | ||
1888 | int ath10k_wmi_peer_flush(struct ath10k *ar, u32 vdev_id, | 2863 | int ath10k_wmi_peer_flush(struct ath10k *ar, u32 vdev_id, |
@@ -1903,7 +2878,7 @@ int ath10k_wmi_peer_flush(struct ath10k *ar, u32 vdev_id, | |||
1903 | ath10k_dbg(ATH10K_DBG_WMI, | 2878 | ath10k_dbg(ATH10K_DBG_WMI, |
1904 | "wmi peer flush vdev_id %d peer_addr %pM tids %08x\n", | 2879 | "wmi peer flush vdev_id %d peer_addr %pM tids %08x\n", |
1905 | vdev_id, peer_addr, tid_bitmap); | 2880 | vdev_id, peer_addr, tid_bitmap); |
1906 | return ath10k_wmi_cmd_send(ar, skb, WMI_PEER_FLUSH_TIDS_CMDID); | 2881 | return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_flush_tids_cmdid); |
1907 | } | 2882 | } |
1908 | 2883 | ||
1909 | int ath10k_wmi_peer_set_param(struct ath10k *ar, u32 vdev_id, | 2884 | int ath10k_wmi_peer_set_param(struct ath10k *ar, u32 vdev_id, |
@@ -1927,7 +2902,7 @@ int ath10k_wmi_peer_set_param(struct ath10k *ar, u32 vdev_id, | |||
1927 | "wmi vdev %d peer 0x%pM set param %d value %d\n", | 2902 | "wmi vdev %d peer 0x%pM set param %d value %d\n", |
1928 | vdev_id, peer_addr, param_id, param_value); | 2903 | vdev_id, peer_addr, param_id, param_value); |
1929 | 2904 | ||
1930 | return ath10k_wmi_cmd_send(ar, skb, WMI_PEER_SET_PARAM_CMDID); | 2905 | return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_set_param_cmdid); |
1931 | } | 2906 | } |
1932 | 2907 | ||
1933 | int ath10k_wmi_set_psmode(struct ath10k *ar, u32 vdev_id, | 2908 | int ath10k_wmi_set_psmode(struct ath10k *ar, u32 vdev_id, |
@@ -1948,7 +2923,8 @@ int ath10k_wmi_set_psmode(struct ath10k *ar, u32 vdev_id, | |||
1948 | "wmi set powersave id 0x%x mode %d\n", | 2923 | "wmi set powersave id 0x%x mode %d\n", |
1949 | vdev_id, psmode); | 2924 | vdev_id, psmode); |
1950 | 2925 | ||
1951 | return ath10k_wmi_cmd_send(ar, skb, WMI_STA_POWERSAVE_MODE_CMDID); | 2926 | return ath10k_wmi_cmd_send(ar, skb, |
2927 | ar->wmi.cmd->sta_powersave_mode_cmdid); | ||
1952 | } | 2928 | } |
1953 | 2929 | ||
1954 | int ath10k_wmi_set_sta_ps_param(struct ath10k *ar, u32 vdev_id, | 2930 | int ath10k_wmi_set_sta_ps_param(struct ath10k *ar, u32 vdev_id, |
@@ -1970,7 +2946,8 @@ int ath10k_wmi_set_sta_ps_param(struct ath10k *ar, u32 vdev_id, | |||
1970 | ath10k_dbg(ATH10K_DBG_WMI, | 2946 | ath10k_dbg(ATH10K_DBG_WMI, |
1971 | "wmi sta ps param vdev_id 0x%x param %d value %d\n", | 2947 | "wmi sta ps param vdev_id 0x%x param %d value %d\n", |
1972 | vdev_id, param_id, value); | 2948 | vdev_id, param_id, value); |
1973 | return ath10k_wmi_cmd_send(ar, skb, WMI_STA_POWERSAVE_PARAM_CMDID); | 2949 | return ath10k_wmi_cmd_send(ar, skb, |
2950 | ar->wmi.cmd->sta_powersave_param_cmdid); | ||
1974 | } | 2951 | } |
1975 | 2952 | ||
1976 | int ath10k_wmi_set_ap_ps_param(struct ath10k *ar, u32 vdev_id, const u8 *mac, | 2953 | int ath10k_wmi_set_ap_ps_param(struct ath10k *ar, u32 vdev_id, const u8 *mac, |
@@ -1996,7 +2973,8 @@ int ath10k_wmi_set_ap_ps_param(struct ath10k *ar, u32 vdev_id, const u8 *mac, | |||
1996 | "wmi ap ps param vdev_id 0x%X param %d value %d mac_addr %pM\n", | 2973 | "wmi ap ps param vdev_id 0x%X param %d value %d mac_addr %pM\n", |
1997 | vdev_id, param_id, value, mac); | 2974 | vdev_id, param_id, value, mac); |
1998 | 2975 | ||
1999 | return ath10k_wmi_cmd_send(ar, skb, WMI_AP_PS_PEER_PARAM_CMDID); | 2976 | return ath10k_wmi_cmd_send(ar, skb, |
2977 | ar->wmi.cmd->ap_ps_peer_param_cmdid); | ||
2000 | } | 2978 | } |
2001 | 2979 | ||
2002 | int ath10k_wmi_scan_chan_list(struct ath10k *ar, | 2980 | int ath10k_wmi_scan_chan_list(struct ath10k *ar, |
@@ -2049,7 +3027,7 @@ int ath10k_wmi_scan_chan_list(struct ath10k *ar, | |||
2049 | ci->flags |= __cpu_to_le32(flags); | 3027 | ci->flags |= __cpu_to_le32(flags); |
2050 | } | 3028 | } |
2051 | 3029 | ||
2052 | return ath10k_wmi_cmd_send(ar, skb, WMI_SCAN_CHAN_LIST_CMDID); | 3030 | return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->scan_chan_list_cmdid); |
2053 | } | 3031 | } |
2054 | 3032 | ||
2055 | int ath10k_wmi_peer_assoc(struct ath10k *ar, | 3033 | int ath10k_wmi_peer_assoc(struct ath10k *ar, |
@@ -2108,7 +3086,7 @@ int ath10k_wmi_peer_assoc(struct ath10k *ar, | |||
2108 | ath10k_dbg(ATH10K_DBG_WMI, | 3086 | ath10k_dbg(ATH10K_DBG_WMI, |
2109 | "wmi peer assoc vdev %d addr %pM\n", | 3087 | "wmi peer assoc vdev %d addr %pM\n", |
2110 | arg->vdev_id, arg->addr); | 3088 | arg->vdev_id, arg->addr); |
2111 | return ath10k_wmi_cmd_send(ar, skb, WMI_PEER_ASSOC_CMDID); | 3089 | return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_assoc_cmdid); |
2112 | } | 3090 | } |
2113 | 3091 | ||
2114 | int ath10k_wmi_beacon_send_nowait(struct ath10k *ar, | 3092 | int ath10k_wmi_beacon_send_nowait(struct ath10k *ar, |
@@ -2128,7 +3106,7 @@ int ath10k_wmi_beacon_send_nowait(struct ath10k *ar, | |||
2128 | cmd->hdr.bcn_len = __cpu_to_le32(arg->bcn_len); | 3106 | cmd->hdr.bcn_len = __cpu_to_le32(arg->bcn_len); |
2129 | memcpy(cmd->bcn, arg->bcn, arg->bcn_len); | 3107 | memcpy(cmd->bcn, arg->bcn, arg->bcn_len); |
2130 | 3108 | ||
2131 | return ath10k_wmi_cmd_send_nowait(ar, skb, WMI_BCN_TX_CMDID); | 3109 | return ath10k_wmi_cmd_send_nowait(ar, skb, ar->wmi.cmd->bcn_tx_cmdid); |
2132 | } | 3110 | } |
2133 | 3111 | ||
2134 | static void ath10k_wmi_pdev_set_wmm_param(struct wmi_wmm_params *params, | 3112 | static void ath10k_wmi_pdev_set_wmm_param(struct wmi_wmm_params *params, |
@@ -2159,7 +3137,8 @@ int ath10k_wmi_pdev_set_wmm_params(struct ath10k *ar, | |||
2159 | ath10k_wmi_pdev_set_wmm_param(&cmd->ac_vo, &arg->ac_vo); | 3137 | ath10k_wmi_pdev_set_wmm_param(&cmd->ac_vo, &arg->ac_vo); |
2160 | 3138 | ||
2161 | ath10k_dbg(ATH10K_DBG_WMI, "wmi pdev set wmm params\n"); | 3139 | ath10k_dbg(ATH10K_DBG_WMI, "wmi pdev set wmm params\n"); |
2162 | return ath10k_wmi_cmd_send(ar, skb, WMI_PDEV_SET_WMM_PARAMS_CMDID); | 3140 | return ath10k_wmi_cmd_send(ar, skb, |
3141 | ar->wmi.cmd->pdev_set_wmm_params_cmdid); | ||
2163 | } | 3142 | } |
2164 | 3143 | ||
2165 | int ath10k_wmi_request_stats(struct ath10k *ar, enum wmi_stats_id stats_id) | 3144 | int ath10k_wmi_request_stats(struct ath10k *ar, enum wmi_stats_id stats_id) |
@@ -2175,7 +3154,7 @@ int ath10k_wmi_request_stats(struct ath10k *ar, enum wmi_stats_id stats_id) | |||
2175 | cmd->stats_id = __cpu_to_le32(stats_id); | 3154 | cmd->stats_id = __cpu_to_le32(stats_id); |
2176 | 3155 | ||
2177 | ath10k_dbg(ATH10K_DBG_WMI, "wmi request stats %d\n", (int)stats_id); | 3156 | ath10k_dbg(ATH10K_DBG_WMI, "wmi request stats %d\n", (int)stats_id); |
2178 | return ath10k_wmi_cmd_send(ar, skb, WMI_REQUEST_STATS_CMDID); | 3157 | return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->request_stats_cmdid); |
2179 | } | 3158 | } |
2180 | 3159 | ||
2181 | int ath10k_wmi_force_fw_hang(struct ath10k *ar, | 3160 | int ath10k_wmi_force_fw_hang(struct ath10k *ar, |
@@ -2194,5 +3173,5 @@ int ath10k_wmi_force_fw_hang(struct ath10k *ar, | |||
2194 | 3173 | ||
2195 | ath10k_dbg(ATH10K_DBG_WMI, "wmi force fw hang %d delay %d\n", | 3174 | ath10k_dbg(ATH10K_DBG_WMI, "wmi force fw hang %d delay %d\n", |
2196 | type, delay_ms); | 3175 | type, delay_ms); |
2197 | return ath10k_wmi_cmd_send(ar, skb, WMI_FORCE_FW_HANG_CMDID); | 3176 | return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->force_fw_hang_cmdid); |
2198 | } | 3177 | } |