1/* 2 * Copyright (c) 2005-2011 Atheros Communications Inc. 3 * Copyright (c) 2011-2014 Qualcomm Atheros, Inc. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18#ifndef _WMI_OPS_H_ 19#define _WMI_OPS_H_ 20 21struct ath10k; 22struct sk_buff; 23 24struct wmi_ops { 25 void (*rx)(struct ath10k *ar, struct sk_buff *skb); 26 void (*map_svc)(const __le32 *in, unsigned long *out, size_t len); 27 28 int (*pull_scan)(struct ath10k *ar, struct sk_buff *skb, 29 struct wmi_scan_ev_arg *arg); 30 int (*pull_mgmt_rx)(struct ath10k *ar, struct sk_buff *skb, 31 struct wmi_mgmt_rx_ev_arg *arg); 32 int (*pull_ch_info)(struct ath10k *ar, struct sk_buff *skb, 33 struct wmi_ch_info_ev_arg *arg); 34 int (*pull_vdev_start)(struct ath10k *ar, struct sk_buff *skb, 35 struct wmi_vdev_start_ev_arg *arg); 36 int (*pull_peer_kick)(struct ath10k *ar, struct sk_buff *skb, 37 struct wmi_peer_kick_ev_arg *arg); 38 int (*pull_swba)(struct ath10k *ar, struct sk_buff *skb, 39 struct wmi_swba_ev_arg *arg); 40 int (*pull_phyerr)(struct ath10k *ar, struct sk_buff *skb, 41 struct wmi_phyerr_ev_arg *arg); 42 int (*pull_svc_rdy)(struct ath10k *ar, struct sk_buff *skb, 43 struct wmi_svc_rdy_ev_arg *arg); 44 int (*pull_rdy)(struct ath10k *ar, struct sk_buff *skb, 45 struct wmi_rdy_ev_arg *arg); 46 int (*pull_fw_stats)(struct ath10k *ar, struct sk_buff *skb, 47 struct ath10k_fw_stats *stats); 48 49 struct sk_buff *(*gen_pdev_suspend)(struct ath10k *ar, u32 suspend_opt); 50 struct sk_buff *(*gen_pdev_resume)(struct ath10k *ar); 51 struct sk_buff *(*gen_pdev_set_rd)(struct ath10k *ar, u16 rd, u16 rd2g, 52 u16 rd5g, u16 ctl2g, u16 ctl5g, 53 enum wmi_dfs_region dfs_reg); 54 struct sk_buff *(*gen_pdev_set_param)(struct ath10k *ar, u32 id, 55 u32 value); 56 struct sk_buff *(*gen_init)(struct ath10k *ar); 57 struct sk_buff *(*gen_start_scan)(struct ath10k *ar, 58 const struct wmi_start_scan_arg *arg); 59 struct sk_buff *(*gen_stop_scan)(struct ath10k *ar, 60 const struct wmi_stop_scan_arg *arg); 61 struct sk_buff *(*gen_vdev_create)(struct ath10k *ar, u32 vdev_id, 62 enum wmi_vdev_type type, 63 enum wmi_vdev_subtype subtype, 64 const u8 macaddr[ETH_ALEN]); 65 struct sk_buff *(*gen_vdev_delete)(struct ath10k *ar, u32 vdev_id); 66 struct sk_buff *(*gen_vdev_start)(struct ath10k *ar, 67 const struct wmi_vdev_start_request_arg *arg, 68 bool restart); 69 struct sk_buff *(*gen_vdev_stop)(struct ath10k *ar, u32 vdev_id); 70 struct sk_buff *(*gen_vdev_up)(struct ath10k *ar, u32 vdev_id, u32 aid, 71 const u8 *bssid); 72 struct sk_buff *(*gen_vdev_down)(struct ath10k *ar, u32 vdev_id); 73 struct sk_buff *(*gen_vdev_set_param)(struct ath10k *ar, u32 vdev_id, 74 u32 param_id, u32 param_value); 75 struct sk_buff *(*gen_vdev_install_key)(struct ath10k *ar, 76 const struct wmi_vdev_install_key_arg *arg); 77 struct sk_buff *(*gen_vdev_spectral_conf)(struct ath10k *ar, 78 const struct wmi_vdev_spectral_conf_arg *arg); 79 struct sk_buff *(*gen_vdev_spectral_enable)(struct ath10k *ar, u32 vdev_id, 80 u32 trigger, u32 enable); 81 struct sk_buff *(*gen_vdev_wmm_conf)(struct ath10k *ar, u32 vdev_id, 82 const struct wmi_wmm_params_all_arg *arg); 83 struct sk_buff *(*gen_peer_create)(struct ath10k *ar, u32 vdev_id, 84 const u8 peer_addr[ETH_ALEN]); 85 struct sk_buff *(*gen_peer_delete)(struct ath10k *ar, u32 vdev_id, 86 const u8 peer_addr[ETH_ALEN]); 87 struct sk_buff *(*gen_peer_flush)(struct ath10k *ar, u32 vdev_id, 88 const u8 peer_addr[ETH_ALEN], 89 u32 tid_bitmap); 90 struct sk_buff *(*gen_peer_set_param)(struct ath10k *ar, u32 vdev_id, 91 const u8 *peer_addr, 92 enum wmi_peer_param param_id, 93 u32 param_value); 94 struct sk_buff *(*gen_peer_assoc)(struct ath10k *ar, 95 const struct wmi_peer_assoc_complete_arg *arg); 96 struct sk_buff *(*gen_set_psmode)(struct ath10k *ar, u32 vdev_id, 97 enum wmi_sta_ps_mode psmode); 98 struct sk_buff *(*gen_set_sta_ps)(struct ath10k *ar, u32 vdev_id, 99 enum wmi_sta_powersave_param param_id, 100 u32 value); 101 struct sk_buff *(*gen_set_ap_ps)(struct ath10k *ar, u32 vdev_id, 102 const u8 *mac, 103 enum wmi_ap_ps_peer_param param_id, 104 u32 value); 105 struct sk_buff *(*gen_scan_chan_list)(struct ath10k *ar, 106 const struct wmi_scan_chan_list_arg *arg); 107 struct sk_buff *(*gen_beacon_dma)(struct ath10k *ar, u32 vdev_id, 108 const void *bcn, size_t bcn_len, 109 u32 bcn_paddr, bool dtim_zero, 110 bool deliver_cab); 111 struct sk_buff *(*gen_pdev_set_wmm)(struct ath10k *ar, 112 const struct wmi_wmm_params_all_arg *arg); 113 struct sk_buff *(*gen_request_stats)(struct ath10k *ar, u32 stats_mask); 114 struct sk_buff *(*gen_force_fw_hang)(struct ath10k *ar, 115 enum wmi_force_fw_hang_type type, 116 u32 delay_ms); 117 struct sk_buff *(*gen_mgmt_tx)(struct ath10k *ar, struct sk_buff *skb); 118 struct sk_buff *(*gen_dbglog_cfg)(struct ath10k *ar, u32 module_enable, 119 u32 log_level); 120 struct sk_buff *(*gen_pktlog_enable)(struct ath10k *ar, u32 filter); 121 struct sk_buff *(*gen_pktlog_disable)(struct ath10k *ar); 122 struct sk_buff *(*gen_pdev_set_quiet_mode)(struct ath10k *ar, 123 u32 period, u32 duration, 124 u32 next_offset, 125 u32 enabled); 126 struct sk_buff *(*gen_pdev_get_temperature)(struct ath10k *ar); 127 struct sk_buff *(*gen_addba_clear_resp)(struct ath10k *ar, u32 vdev_id, 128 const u8 *mac); 129 struct sk_buff *(*gen_addba_send)(struct ath10k *ar, u32 vdev_id, 130 const u8 *mac, u32 tid, u32 buf_size); 131 struct sk_buff *(*gen_addba_set_resp)(struct ath10k *ar, u32 vdev_id, 132 const u8 *mac, u32 tid, 133 u32 status); 134 struct sk_buff *(*gen_delba_send)(struct ath10k *ar, u32 vdev_id, 135 const u8 *mac, u32 tid, u32 initiator, 136 u32 reason); 137 struct sk_buff *(*gen_bcn_tmpl)(struct ath10k *ar, u32 vdev_id, 138 u32 tim_ie_offset, struct sk_buff *bcn, 139 u32 prb_caps, u32 prb_erp, 140 void *prb_ies, size_t prb_ies_len); 141 struct sk_buff *(*gen_prb_tmpl)(struct ath10k *ar, u32 vdev_id, 142 struct sk_buff *bcn); 143 struct sk_buff *(*gen_p2p_go_bcn_ie)(struct ath10k *ar, u32 vdev_id, 144 const u8 *p2p_ie); 145 struct sk_buff *(*gen_vdev_sta_uapsd)(struct ath10k *ar, u32 vdev_id, 146 const u8 peer_addr[ETH_ALEN], 147 const struct wmi_sta_uapsd_auto_trig_arg *args, 148 u32 num_ac); 149 struct sk_buff *(*gen_sta_keepalive)(struct ath10k *ar, 150 const struct wmi_sta_keepalive_arg *arg); 151}; 152 153int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id); 154 155static inline int 156ath10k_wmi_rx(struct ath10k *ar, struct sk_buff *skb) 157{ 158 if (WARN_ON_ONCE(!ar->wmi.ops->rx)) 159 return -EOPNOTSUPP; 160 161 ar->wmi.ops->rx(ar, skb); 162 return 0; 163} 164 165static inline int 166ath10k_wmi_map_svc(struct ath10k *ar, const __le32 *in, unsigned long *out, 167 size_t len) 168{ 169 if (!ar->wmi.ops->map_svc) 170 return -EOPNOTSUPP; 171 172 ar->wmi.ops->map_svc(in, out, len); 173 return 0; 174} 175 176static inline int 177ath10k_wmi_pull_scan(struct ath10k *ar, struct sk_buff *skb, 178 struct wmi_scan_ev_arg *arg) 179{ 180 if (!ar->wmi.ops->pull_scan) 181 return -EOPNOTSUPP; 182 183 return ar->wmi.ops->pull_scan(ar, skb, arg); 184} 185 186static inline int 187ath10k_wmi_pull_mgmt_rx(struct ath10k *ar, struct sk_buff *skb, 188 struct wmi_mgmt_rx_ev_arg *arg) 189{ 190 if (!ar->wmi.ops->pull_mgmt_rx) 191 return -EOPNOTSUPP; 192 193 return ar->wmi.ops->pull_mgmt_rx(ar, skb, arg); 194} 195 196static inline int 197ath10k_wmi_pull_ch_info(struct ath10k *ar, struct sk_buff *skb, 198 struct wmi_ch_info_ev_arg *arg) 199{ 200 if (!ar->wmi.ops->pull_ch_info) 201 return -EOPNOTSUPP; 202 203 return ar->wmi.ops->pull_ch_info(ar, skb, arg); 204} 205 206static inline int 207ath10k_wmi_pull_vdev_start(struct ath10k *ar, struct sk_buff *skb, 208 struct wmi_vdev_start_ev_arg *arg) 209{ 210 if (!ar->wmi.ops->pull_vdev_start) 211 return -EOPNOTSUPP; 212 213 return ar->wmi.ops->pull_vdev_start(ar, skb, arg); 214} 215 216static inline int 217ath10k_wmi_pull_peer_kick(struct ath10k *ar, struct sk_buff *skb, 218 struct wmi_peer_kick_ev_arg *arg) 219{ 220 if (!ar->wmi.ops->pull_peer_kick) 221 return -EOPNOTSUPP; 222 223 return ar->wmi.ops->pull_peer_kick(ar, skb, arg); 224} 225 226static inline int 227ath10k_wmi_pull_swba(struct ath10k *ar, struct sk_buff *skb, 228 struct wmi_swba_ev_arg *arg) 229{ 230 if (!ar->wmi.ops->pull_swba) 231 return -EOPNOTSUPP; 232 233 return ar->wmi.ops->pull_swba(ar, skb, arg); 234} 235 236static inline int 237ath10k_wmi_pull_phyerr(struct ath10k *ar, struct sk_buff *skb, 238 struct wmi_phyerr_ev_arg *arg) 239{ 240 if (!ar->wmi.ops->pull_phyerr) 241 return -EOPNOTSUPP; 242 243 return ar->wmi.ops->pull_phyerr(ar, skb, arg); 244} 245 246static inline int 247ath10k_wmi_pull_svc_rdy(struct ath10k *ar, struct sk_buff *skb, 248 struct wmi_svc_rdy_ev_arg *arg) 249{ 250 if (!ar->wmi.ops->pull_svc_rdy) 251 return -EOPNOTSUPP; 252 253 return ar->wmi.ops->pull_svc_rdy(ar, skb, arg); 254} 255 256static inline int 257ath10k_wmi_pull_rdy(struct ath10k *ar, struct sk_buff *skb, 258 struct wmi_rdy_ev_arg *arg) 259{ 260 if (!ar->wmi.ops->pull_rdy) 261 return -EOPNOTSUPP; 262 263 return ar->wmi.ops->pull_rdy(ar, skb, arg); 264} 265 266static inline int 267ath10k_wmi_pull_fw_stats(struct ath10k *ar, struct sk_buff *skb, 268 struct ath10k_fw_stats *stats) 269{ 270 if (!ar->wmi.ops->pull_fw_stats) 271 return -EOPNOTSUPP; 272 273 return ar->wmi.ops->pull_fw_stats(ar, skb, stats); 274} 275 276static inline int 277ath10k_wmi_mgmt_tx(struct ath10k *ar, struct sk_buff *msdu) 278{ 279 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(msdu); 280 struct sk_buff *skb; 281 int ret; 282 283 if (!ar->wmi.ops->gen_mgmt_tx) 284 return -EOPNOTSUPP; 285 286 skb = ar->wmi.ops->gen_mgmt_tx(ar, msdu); 287 if (IS_ERR(skb)) 288 return PTR_ERR(skb); 289 290 ret = ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->mgmt_tx_cmdid); 291 if (ret) 292 return ret; 293 294 /* FIXME There's no ACK event for Management Tx. This probably 295 * shouldn't be called here either. */ 296 info->flags |= IEEE80211_TX_STAT_ACK; 297 ieee80211_tx_status_irqsafe(ar->hw, msdu); 298 299 return 0; 300} 301 302static inline int 303ath10k_wmi_pdev_set_regdomain(struct ath10k *ar, u16 rd, u16 rd2g, u16 rd5g, 304 u16 ctl2g, u16 ctl5g, 305 enum wmi_dfs_region dfs_reg) 306{ 307 struct sk_buff *skb; 308 309 if (!ar->wmi.ops->gen_pdev_set_rd) 310 return -EOPNOTSUPP; 311 312 skb = ar->wmi.ops->gen_pdev_set_rd(ar, rd, rd2g, rd5g, ctl2g, ctl5g, 313 dfs_reg); 314 if (IS_ERR(skb)) 315 return PTR_ERR(skb); 316 317 return ath10k_wmi_cmd_send(ar, skb, 318 ar->wmi.cmd->pdev_set_regdomain_cmdid); 319} 320 321static inline int 322ath10k_wmi_pdev_suspend_target(struct ath10k *ar, u32 suspend_opt) 323{ 324 struct sk_buff *skb; 325 326 if (!ar->wmi.ops->gen_pdev_suspend) 327 return -EOPNOTSUPP; 328 329 skb = ar->wmi.ops->gen_pdev_suspend(ar, suspend_opt); 330 if (IS_ERR(skb)) 331 return PTR_ERR(skb); 332 333 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_suspend_cmdid); 334} 335 336static inline int 337ath10k_wmi_pdev_resume_target(struct ath10k *ar) 338{ 339 struct sk_buff *skb; 340 341 if (!ar->wmi.ops->gen_pdev_resume) 342 return -EOPNOTSUPP; 343 344 skb = ar->wmi.ops->gen_pdev_resume(ar); 345 if (IS_ERR(skb)) 346 return PTR_ERR(skb); 347 348 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_resume_cmdid); 349} 350 351static inline int 352ath10k_wmi_pdev_set_param(struct ath10k *ar, u32 id, u32 value) 353{ 354 struct sk_buff *skb; 355 356 if (!ar->wmi.ops->gen_pdev_set_param) 357 return -EOPNOTSUPP; 358 359 skb = ar->wmi.ops->gen_pdev_set_param(ar, id, value); 360 if (IS_ERR(skb)) 361 return PTR_ERR(skb); 362 363 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_set_param_cmdid); 364} 365 366static inline int 367ath10k_wmi_cmd_init(struct ath10k *ar) 368{ 369 struct sk_buff *skb; 370 371 if (!ar->wmi.ops->gen_init) 372 return -EOPNOTSUPP; 373 374 skb = ar->wmi.ops->gen_init(ar); 375 if (IS_ERR(skb)) 376 return PTR_ERR(skb); 377 378 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->init_cmdid); 379} 380 381static inline int 382ath10k_wmi_start_scan(struct ath10k *ar, 383 const struct wmi_start_scan_arg *arg) 384{ 385 struct sk_buff *skb; 386 387 if (!ar->wmi.ops->gen_start_scan) 388 return -EOPNOTSUPP; 389 390 skb = ar->wmi.ops->gen_start_scan(ar, arg); 391 if (IS_ERR(skb)) 392 return PTR_ERR(skb); 393 394 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->start_scan_cmdid); 395} 396 397static inline int 398ath10k_wmi_stop_scan(struct ath10k *ar, const struct wmi_stop_scan_arg *arg) 399{ 400 struct sk_buff *skb; 401 402 if (!ar->wmi.ops->gen_stop_scan) 403 return -EOPNOTSUPP; 404 405 skb = ar->wmi.ops->gen_stop_scan(ar, arg); 406 if (IS_ERR(skb)) 407 return PTR_ERR(skb); 408 409 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->stop_scan_cmdid); 410} 411 412static inline int 413ath10k_wmi_vdev_create(struct ath10k *ar, u32 vdev_id, 414 enum wmi_vdev_type type, 415 enum wmi_vdev_subtype subtype, 416 const u8 macaddr[ETH_ALEN]) 417{ 418 struct sk_buff *skb; 419 420 if (!ar->wmi.ops->gen_vdev_create) 421 return -EOPNOTSUPP; 422 423 skb = ar->wmi.ops->gen_vdev_create(ar, vdev_id, type, subtype, macaddr); 424 if (IS_ERR(skb)) 425 return PTR_ERR(skb); 426 427 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_create_cmdid); 428} 429 430static inline int 431ath10k_wmi_vdev_delete(struct ath10k *ar, u32 vdev_id) 432{ 433 struct sk_buff *skb; 434 435 if (!ar->wmi.ops->gen_vdev_delete) 436 return -EOPNOTSUPP; 437 438 skb = ar->wmi.ops->gen_vdev_delete(ar, vdev_id); 439 if (IS_ERR(skb)) 440 return PTR_ERR(skb); 441 442 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_delete_cmdid); 443} 444 445static inline int 446ath10k_wmi_vdev_start(struct ath10k *ar, 447 const struct wmi_vdev_start_request_arg *arg) 448{ 449 struct sk_buff *skb; 450 451 if (!ar->wmi.ops->gen_vdev_start) 452 return -EOPNOTSUPP; 453 454 skb = ar->wmi.ops->gen_vdev_start(ar, arg, false); 455 if (IS_ERR(skb)) 456 return PTR_ERR(skb); 457 458 return ath10k_wmi_cmd_send(ar, skb, 459 ar->wmi.cmd->vdev_start_request_cmdid); 460} 461 462static inline int 463ath10k_wmi_vdev_restart(struct ath10k *ar, 464 const struct wmi_vdev_start_request_arg *arg) 465{ 466 struct sk_buff *skb; 467 468 if (!ar->wmi.ops->gen_vdev_start) 469 return -EOPNOTSUPP; 470 471 skb = ar->wmi.ops->gen_vdev_start(ar, arg, true); 472 if (IS_ERR(skb)) 473 return PTR_ERR(skb); 474 475 return ath10k_wmi_cmd_send(ar, skb, 476 ar->wmi.cmd->vdev_restart_request_cmdid); 477} 478 479static inline int 480ath10k_wmi_vdev_stop(struct ath10k *ar, u32 vdev_id) 481{ 482 struct sk_buff *skb; 483 484 if (!ar->wmi.ops->gen_vdev_stop) 485 return -EOPNOTSUPP; 486 487 skb = ar->wmi.ops->gen_vdev_stop(ar, vdev_id); 488 if (IS_ERR(skb)) 489 return PTR_ERR(skb); 490 491 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_stop_cmdid); 492} 493 494static inline int 495ath10k_wmi_vdev_up(struct ath10k *ar, u32 vdev_id, u32 aid, const u8 *bssid) 496{ 497 struct sk_buff *skb; 498 499 if (!ar->wmi.ops->gen_vdev_up) 500 return -EOPNOTSUPP; 501 502 skb = ar->wmi.ops->gen_vdev_up(ar, vdev_id, aid, bssid); 503 if (IS_ERR(skb)) 504 return PTR_ERR(skb); 505 506 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_up_cmdid); 507} 508 509static inline int 510ath10k_wmi_vdev_down(struct ath10k *ar, u32 vdev_id) 511{ 512 struct sk_buff *skb; 513 514 if (!ar->wmi.ops->gen_vdev_down) 515 return -EOPNOTSUPP; 516 517 skb = ar->wmi.ops->gen_vdev_down(ar, vdev_id); 518 if (IS_ERR(skb)) 519 return PTR_ERR(skb); 520 521 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_down_cmdid); 522} 523 524static inline int 525ath10k_wmi_vdev_set_param(struct ath10k *ar, u32 vdev_id, u32 param_id, 526 u32 param_value) 527{ 528 struct sk_buff *skb; 529 530 if (!ar->wmi.ops->gen_vdev_set_param) 531 return -EOPNOTSUPP; 532 533 skb = ar->wmi.ops->gen_vdev_set_param(ar, vdev_id, param_id, 534 param_value); 535 if (IS_ERR(skb)) 536 return PTR_ERR(skb); 537 538 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_set_param_cmdid); 539} 540 541static inline int 542ath10k_wmi_vdev_install_key(struct ath10k *ar, 543 const struct wmi_vdev_install_key_arg *arg) 544{ 545 struct sk_buff *skb; 546 547 if (!ar->wmi.ops->gen_vdev_install_key) 548 return -EOPNOTSUPP; 549 550 skb = ar->wmi.ops->gen_vdev_install_key(ar, arg); 551 if (IS_ERR(skb)) 552 return PTR_ERR(skb); 553 554 return ath10k_wmi_cmd_send(ar, skb, 555 ar->wmi.cmd->vdev_install_key_cmdid); 556} 557 558static inline int 559ath10k_wmi_vdev_spectral_conf(struct ath10k *ar, 560 const struct wmi_vdev_spectral_conf_arg *arg) 561{ 562 struct sk_buff *skb; 563 u32 cmd_id; 564 565 skb = ar->wmi.ops->gen_vdev_spectral_conf(ar, arg); 566 if (IS_ERR(skb)) 567 return PTR_ERR(skb); 568 569 cmd_id = ar->wmi.cmd->vdev_spectral_scan_configure_cmdid; 570 return ath10k_wmi_cmd_send(ar, skb, cmd_id); 571} 572 573static inline int 574ath10k_wmi_vdev_spectral_enable(struct ath10k *ar, u32 vdev_id, u32 trigger, 575 u32 enable) 576{ 577 struct sk_buff *skb; 578 u32 cmd_id; 579 580 skb = ar->wmi.ops->gen_vdev_spectral_enable(ar, vdev_id, trigger, 581 enable); 582 if (IS_ERR(skb)) 583 return PTR_ERR(skb); 584 585 cmd_id = ar->wmi.cmd->vdev_spectral_scan_enable_cmdid; 586 return ath10k_wmi_cmd_send(ar, skb, cmd_id); 587} 588 589static inline int 590ath10k_wmi_vdev_sta_uapsd(struct ath10k *ar, u32 vdev_id, 591 const u8 peer_addr[ETH_ALEN], 592 const struct wmi_sta_uapsd_auto_trig_arg *args, 593 u32 num_ac) 594{ 595 struct sk_buff *skb; 596 u32 cmd_id; 597 598 if (!ar->wmi.ops->gen_vdev_sta_uapsd) 599 return -EOPNOTSUPP; 600 601 skb = ar->wmi.ops->gen_vdev_sta_uapsd(ar, vdev_id, peer_addr, args, 602 num_ac); 603 if (IS_ERR(skb)) 604 return PTR_ERR(skb); 605 606 cmd_id = ar->wmi.cmd->sta_uapsd_auto_trig_cmdid; 607 return ath10k_wmi_cmd_send(ar, skb, cmd_id); 608} 609 610static inline int 611ath10k_wmi_vdev_wmm_conf(struct ath10k *ar, u32 vdev_id, 612 const struct wmi_wmm_params_all_arg *arg) 613{ 614 struct sk_buff *skb; 615 u32 cmd_id; 616 617 skb = ar->wmi.ops->gen_vdev_wmm_conf(ar, vdev_id, arg); 618 if (IS_ERR(skb)) 619 return PTR_ERR(skb); 620 621 cmd_id = ar->wmi.cmd->vdev_set_wmm_params_cmdid; 622 return ath10k_wmi_cmd_send(ar, skb, cmd_id); 623} 624 625static inline int 626ath10k_wmi_peer_create(struct ath10k *ar, u32 vdev_id, 627 const u8 peer_addr[ETH_ALEN]) 628{ 629 struct sk_buff *skb; 630 631 if (!ar->wmi.ops->gen_peer_create) 632 return -EOPNOTSUPP; 633 634 skb = ar->wmi.ops->gen_peer_create(ar, vdev_id, peer_addr); 635 if (IS_ERR(skb)) 636 return PTR_ERR(skb); 637 638 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_create_cmdid); 639} 640 641static inline int 642ath10k_wmi_peer_delete(struct ath10k *ar, u32 vdev_id, 643 const u8 peer_addr[ETH_ALEN]) 644{ 645 struct sk_buff *skb; 646 647 if (!ar->wmi.ops->gen_peer_delete) 648 return -EOPNOTSUPP; 649 650 skb = ar->wmi.ops->gen_peer_delete(ar, vdev_id, peer_addr); 651 if (IS_ERR(skb)) 652 return PTR_ERR(skb); 653 654 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_delete_cmdid); 655} 656 657static inline int 658ath10k_wmi_peer_flush(struct ath10k *ar, u32 vdev_id, 659 const u8 peer_addr[ETH_ALEN], u32 tid_bitmap) 660{ 661 struct sk_buff *skb; 662 663 if (!ar->wmi.ops->gen_peer_flush) 664 return -EOPNOTSUPP; 665 666 skb = ar->wmi.ops->gen_peer_flush(ar, vdev_id, peer_addr, tid_bitmap); 667 if (IS_ERR(skb)) 668 return PTR_ERR(skb); 669 670 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_flush_tids_cmdid); 671} 672 673static inline int 674ath10k_wmi_peer_set_param(struct ath10k *ar, u32 vdev_id, const u8 *peer_addr, 675 enum wmi_peer_param param_id, u32 param_value) 676{ 677 struct sk_buff *skb; 678 679 if (!ar->wmi.ops->gen_peer_set_param) 680 return -EOPNOTSUPP; 681 682 skb = ar->wmi.ops->gen_peer_set_param(ar, vdev_id, peer_addr, param_id, 683 param_value); 684 if (IS_ERR(skb)) 685 return PTR_ERR(skb); 686 687 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_set_param_cmdid); 688} 689 690static inline int 691ath10k_wmi_set_psmode(struct ath10k *ar, u32 vdev_id, 692 enum wmi_sta_ps_mode psmode) 693{ 694 struct sk_buff *skb; 695 696 if (!ar->wmi.ops->gen_set_psmode) 697 return -EOPNOTSUPP; 698 699 skb = ar->wmi.ops->gen_set_psmode(ar, vdev_id, psmode); 700 if (IS_ERR(skb)) 701 return PTR_ERR(skb); 702 703 return ath10k_wmi_cmd_send(ar, skb, 704 ar->wmi.cmd->sta_powersave_mode_cmdid); 705} 706 707static inline int 708ath10k_wmi_set_sta_ps_param(struct ath10k *ar, u32 vdev_id, 709 enum wmi_sta_powersave_param param_id, u32 value) 710{ 711 struct sk_buff *skb; 712 713 if (!ar->wmi.ops->gen_set_sta_ps) 714 return -EOPNOTSUPP; 715 716 skb = ar->wmi.ops->gen_set_sta_ps(ar, vdev_id, param_id, value); 717 if (IS_ERR(skb)) 718 return PTR_ERR(skb); 719 720 return ath10k_wmi_cmd_send(ar, skb, 721 ar->wmi.cmd->sta_powersave_param_cmdid); 722} 723 724static inline int 725ath10k_wmi_set_ap_ps_param(struct ath10k *ar, u32 vdev_id, const u8 *mac, 726 enum wmi_ap_ps_peer_param param_id, u32 value) 727{ 728 struct sk_buff *skb; 729 730 if (!ar->wmi.ops->gen_set_ap_ps) 731 return -EOPNOTSUPP; 732 733 skb = ar->wmi.ops->gen_set_ap_ps(ar, vdev_id, mac, param_id, value); 734 if (IS_ERR(skb)) 735 return PTR_ERR(skb); 736 737 return ath10k_wmi_cmd_send(ar, skb, 738 ar->wmi.cmd->ap_ps_peer_param_cmdid); 739} 740 741static inline int 742ath10k_wmi_scan_chan_list(struct ath10k *ar, 743 const struct wmi_scan_chan_list_arg *arg) 744{ 745 struct sk_buff *skb; 746 747 if (!ar->wmi.ops->gen_scan_chan_list) 748 return -EOPNOTSUPP; 749 750 skb = ar->wmi.ops->gen_scan_chan_list(ar, arg); 751 if (IS_ERR(skb)) 752 return PTR_ERR(skb); 753 754 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->scan_chan_list_cmdid); 755} 756 757static inline int 758ath10k_wmi_peer_assoc(struct ath10k *ar, 759 const struct wmi_peer_assoc_complete_arg *arg) 760{ 761 struct sk_buff *skb; 762 763 if (!ar->wmi.ops->gen_peer_assoc) 764 return -EOPNOTSUPP; 765 766 skb = ar->wmi.ops->gen_peer_assoc(ar, arg); 767 if (IS_ERR(skb)) 768 return PTR_ERR(skb); 769 770 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_assoc_cmdid); 771} 772 773static inline int 774ath10k_wmi_beacon_send_ref_nowait(struct ath10k *ar, u32 vdev_id, 775 const void *bcn, size_t bcn_len, 776 u32 bcn_paddr, bool dtim_zero, 777 bool deliver_cab) 778{ 779 struct sk_buff *skb; 780 int ret; 781 782 if (!ar->wmi.ops->gen_beacon_dma) 783 return -EOPNOTSUPP; 784 785 skb = ar->wmi.ops->gen_beacon_dma(ar, vdev_id, bcn, bcn_len, bcn_paddr, 786 dtim_zero, deliver_cab); 787 if (IS_ERR(skb)) 788 return PTR_ERR(skb); 789 790 ret = ath10k_wmi_cmd_send_nowait(ar, skb, 791 ar->wmi.cmd->pdev_send_bcn_cmdid); 792 if (ret) { 793 dev_kfree_skb(skb); 794 return ret; 795 } 796 797 return 0; 798} 799 800static inline int 801ath10k_wmi_pdev_set_wmm_params(struct ath10k *ar, 802 const struct wmi_wmm_params_all_arg *arg) 803{ 804 struct sk_buff *skb; 805 806 if (!ar->wmi.ops->gen_pdev_set_wmm) 807 return -EOPNOTSUPP; 808 809 skb = ar->wmi.ops->gen_pdev_set_wmm(ar, arg); 810 if (IS_ERR(skb)) 811 return PTR_ERR(skb); 812 813 return ath10k_wmi_cmd_send(ar, skb, 814 ar->wmi.cmd->pdev_set_wmm_params_cmdid); 815} 816 817static inline int 818ath10k_wmi_request_stats(struct ath10k *ar, u32 stats_mask) 819{ 820 struct sk_buff *skb; 821 822 if (!ar->wmi.ops->gen_request_stats) 823 return -EOPNOTSUPP; 824 825 skb = ar->wmi.ops->gen_request_stats(ar, stats_mask); 826 if (IS_ERR(skb)) 827 return PTR_ERR(skb); 828 829 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->request_stats_cmdid); 830} 831 832static inline int 833ath10k_wmi_force_fw_hang(struct ath10k *ar, 834 enum wmi_force_fw_hang_type type, u32 delay_ms) 835{ 836 struct sk_buff *skb; 837 838 if (!ar->wmi.ops->gen_force_fw_hang) 839 return -EOPNOTSUPP; 840 841 skb = ar->wmi.ops->gen_force_fw_hang(ar, type, delay_ms); 842 if (IS_ERR(skb)) 843 return PTR_ERR(skb); 844 845 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->force_fw_hang_cmdid); 846} 847 848static inline int 849ath10k_wmi_dbglog_cfg(struct ath10k *ar, u32 module_enable, u32 log_level) 850{ 851 struct sk_buff *skb; 852 853 if (!ar->wmi.ops->gen_dbglog_cfg) 854 return -EOPNOTSUPP; 855 856 skb = ar->wmi.ops->gen_dbglog_cfg(ar, module_enable, log_level); 857 if (IS_ERR(skb)) 858 return PTR_ERR(skb); 859 860 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->dbglog_cfg_cmdid); 861} 862 863static inline int 864ath10k_wmi_pdev_pktlog_enable(struct ath10k *ar, u32 filter) 865{ 866 struct sk_buff *skb; 867 868 if (!ar->wmi.ops->gen_pktlog_enable) 869 return -EOPNOTSUPP; 870 871 skb = ar->wmi.ops->gen_pktlog_enable(ar, filter); 872 if (IS_ERR(skb)) 873 return PTR_ERR(skb); 874 875 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_pktlog_enable_cmdid); 876} 877 878static inline int 879ath10k_wmi_pdev_pktlog_disable(struct ath10k *ar) 880{ 881 struct sk_buff *skb; 882 883 if (!ar->wmi.ops->gen_pktlog_disable) 884 return -EOPNOTSUPP; 885 886 skb = ar->wmi.ops->gen_pktlog_disable(ar); 887 if (IS_ERR(skb)) 888 return PTR_ERR(skb); 889 890 return ath10k_wmi_cmd_send(ar, skb, 891 ar->wmi.cmd->pdev_pktlog_disable_cmdid); 892} 893 894static inline int 895ath10k_wmi_pdev_set_quiet_mode(struct ath10k *ar, u32 period, u32 duration, 896 u32 next_offset, u32 enabled) 897{ 898 struct sk_buff *skb; 899 900 if (!ar->wmi.ops->gen_pdev_set_quiet_mode) 901 return -EOPNOTSUPP; 902 903 skb = ar->wmi.ops->gen_pdev_set_quiet_mode(ar, period, duration, 904 next_offset, enabled); 905 if (IS_ERR(skb)) 906 return PTR_ERR(skb); 907 908 return ath10k_wmi_cmd_send(ar, skb, 909 ar->wmi.cmd->pdev_set_quiet_mode_cmdid); 910} 911 912static inline int 913ath10k_wmi_pdev_get_temperature(struct ath10k *ar) 914{ 915 struct sk_buff *skb; 916 917 if (!ar->wmi.ops->gen_pdev_get_temperature) 918 return -EOPNOTSUPP; 919 920 skb = ar->wmi.ops->gen_pdev_get_temperature(ar); 921 if (IS_ERR(skb)) 922 return PTR_ERR(skb); 923 924 return ath10k_wmi_cmd_send(ar, skb, 925 ar->wmi.cmd->pdev_get_temperature_cmdid); 926} 927 928static inline int 929ath10k_wmi_addba_clear_resp(struct ath10k *ar, u32 vdev_id, const u8 *mac) 930{ 931 struct sk_buff *skb; 932 933 if (!ar->wmi.ops->gen_addba_clear_resp) 934 return -EOPNOTSUPP; 935 936 skb = ar->wmi.ops->gen_addba_clear_resp(ar, vdev_id, mac); 937 if (IS_ERR(skb)) 938 return PTR_ERR(skb); 939 940 return ath10k_wmi_cmd_send(ar, skb, 941 ar->wmi.cmd->addba_clear_resp_cmdid); 942} 943 944static inline int 945ath10k_wmi_addba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac, 946 u32 tid, u32 buf_size) 947{ 948 struct sk_buff *skb; 949 950 if (!ar->wmi.ops->gen_addba_send) 951 return -EOPNOTSUPP; 952 953 skb = ar->wmi.ops->gen_addba_send(ar, vdev_id, mac, tid, buf_size); 954 if (IS_ERR(skb)) 955 return PTR_ERR(skb); 956 957 return ath10k_wmi_cmd_send(ar, skb, 958 ar->wmi.cmd->addba_send_cmdid); 959} 960 961static inline int 962ath10k_wmi_addba_set_resp(struct ath10k *ar, u32 vdev_id, const u8 *mac, 963 u32 tid, u32 status) 964{ 965 struct sk_buff *skb; 966 967 if (!ar->wmi.ops->gen_addba_set_resp) 968 return -EOPNOTSUPP; 969 970 skb = ar->wmi.ops->gen_addba_set_resp(ar, vdev_id, mac, tid, status); 971 if (IS_ERR(skb)) 972 return PTR_ERR(skb); 973 974 return ath10k_wmi_cmd_send(ar, skb, 975 ar->wmi.cmd->addba_set_resp_cmdid); 976} 977 978static inline int 979ath10k_wmi_delba_send(struct ath10k *ar, u32 vdev_id, const u8 *mac, 980 u32 tid, u32 initiator, u32 reason) 981{ 982 struct sk_buff *skb; 983 984 if (!ar->wmi.ops->gen_delba_send) 985 return -EOPNOTSUPP; 986 987 skb = ar->wmi.ops->gen_delba_send(ar, vdev_id, mac, tid, initiator, 988 reason); 989 if (IS_ERR(skb)) 990 return PTR_ERR(skb); 991 992 return ath10k_wmi_cmd_send(ar, skb, 993 ar->wmi.cmd->delba_send_cmdid); 994} 995 996static inline int 997ath10k_wmi_bcn_tmpl(struct ath10k *ar, u32 vdev_id, u32 tim_ie_offset, 998 struct sk_buff *bcn, u32 prb_caps, u32 prb_erp, 999 void *prb_ies, size_t prb_ies_len) 1000{ 1001 struct sk_buff *skb; 1002 1003 if (!ar->wmi.ops->gen_bcn_tmpl) 1004 return -EOPNOTSUPP; 1005 1006 skb = ar->wmi.ops->gen_bcn_tmpl(ar, vdev_id, tim_ie_offset, bcn, 1007 prb_caps, prb_erp, prb_ies, 1008 prb_ies_len); 1009 if (IS_ERR(skb)) 1010 return PTR_ERR(skb); 1011 1012 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->bcn_tmpl_cmdid); 1013} 1014 1015static inline int 1016ath10k_wmi_prb_tmpl(struct ath10k *ar, u32 vdev_id, struct sk_buff *prb) 1017{ 1018 struct sk_buff *skb; 1019 1020 if (!ar->wmi.ops->gen_prb_tmpl) 1021 return -EOPNOTSUPP; 1022 1023 skb = ar->wmi.ops->gen_prb_tmpl(ar, vdev_id, prb); 1024 if (IS_ERR(skb)) 1025 return PTR_ERR(skb); 1026 1027 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->prb_tmpl_cmdid); 1028} 1029 1030static inline int 1031ath10k_wmi_p2p_go_bcn_ie(struct ath10k *ar, u32 vdev_id, const u8 *p2p_ie) 1032{ 1033 struct sk_buff *skb; 1034 1035 if (!ar->wmi.ops->gen_p2p_go_bcn_ie) 1036 return -EOPNOTSUPP; 1037 1038 skb = ar->wmi.ops->gen_p2p_go_bcn_ie(ar, vdev_id, p2p_ie); 1039 if (IS_ERR(skb)) 1040 return PTR_ERR(skb); 1041 1042 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->p2p_go_set_beacon_ie); 1043} 1044 1045static inline int 1046ath10k_wmi_sta_keepalive(struct ath10k *ar, 1047 const struct wmi_sta_keepalive_arg *arg) 1048{ 1049 struct sk_buff *skb; 1050 u32 cmd_id; 1051 1052 if (!ar->wmi.ops->gen_sta_keepalive) 1053 return -EOPNOTSUPP; 1054 1055 skb = ar->wmi.ops->gen_sta_keepalive(ar, arg); 1056 if (IS_ERR(skb)) 1057 return PTR_ERR(skb); 1058 1059 cmd_id = ar->wmi.cmd->sta_keepalive_cmd; 1060 return ath10k_wmi_cmd_send(ar, skb, cmd_id); 1061} 1062 1063#endif 1064