1 /* 2 * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved. 3 * 4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc. 5 * 6 * 7 * Permission to use, copy, modify, and/or distribute this software for 8 * any purpose with or without fee is hereby granted, provided that the 9 * above copyright notice and this permission notice appear in all 10 * copies. 11 * 12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 19 * PERFORMANCE OF THIS SOFTWARE. 20 */ 21 22 /* 23 * This file was originally distributed by Qualcomm Atheros, Inc. 24 * under proprietary terms before Copyright ownership was assigned 25 * to the Linux Foundation. 26 */ 27 /** 28 * @file cdp_txrx_misc.h 29 * @brief Define the host data path miscelleneous API functions 30 * called by the host control SW and the OS interface module 31 */ 32 #ifndef _CDP_TXRX_MISC_H_ 33 #define _CDP_TXRX_MISC_H_ 34 35 #include "cdp_txrx_handle.h" 36 /** 37 * cdp_tx_non_std() - Allow the control-path SW to send data frames 38 * 39 * @soc - data path soc handle 40 * @data_vdev - which vdev should transmit the tx data frames 41 * @tx_spec - what non-standard handling to apply to the tx data frames 42 * @msdu_list - NULL-terminated list of tx MSDUs 43 * 44 * Generally, all tx data frames come from the OS shim into the txrx layer. 45 * However, there are rare cases such as TDLS messaging where the UMAC 46 * control-path SW creates tx data frames. 47 * This UMAC SW can call this function to provide the tx data frames to 48 * the txrx layer. 49 * The UMAC SW can request a callback for these data frames after their 50 * transmission completes, by using the ol_txrx_data_tx_cb_set function 51 * to register a tx completion callback, and by specifying 52 * ol_tx_spec_no_free as the tx_spec arg when giving the frames to 53 * ol_tx_non_std. 54 * The MSDUs need to have the appropriate L2 header type (802.3 vs. 802.11), 55 * as specified by ol_cfg_frame_type(). 56 * 57 * Return: null - success, skb - failure 58 */ 59 static inline qdf_nbuf_t 60 cdp_tx_non_std(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, 61 enum ol_tx_spec tx_spec, qdf_nbuf_t msdu_list) 62 { 63 if (!soc || !soc->ops || !soc->ops->misc_ops) { 64 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, 65 "%s invalid instance", __func__); 66 return NULL; 67 } 68 69 if (soc->ops->misc_ops->tx_non_std) 70 return soc->ops->misc_ops->tx_non_std( 71 vdev, tx_spec, msdu_list); 72 return NULL; 73 } 74 75 /** 76 * cdp_set_ibss_vdev_heart_beat_timer() - Update ibss vdev heart 77 * beat timer 78 * @soc - data path soc handle 79 * @vdev - vdev handle 80 * @timer_value_sec - new heart beat timer value 81 * 82 * Return: Old timer value set in vdev. 83 */ 84 static inline uint16_t 85 cdp_set_ibss_vdev_heart_beat_timer(ol_txrx_soc_handle soc, 86 struct cdp_vdev *vdev, uint16_t timer_value_sec) 87 { 88 if (!soc || !soc->ops || !soc->ops->misc_ops) { 89 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 90 "%s invalid instance", __func__); 91 return 0; 92 } 93 94 if (soc->ops->misc_ops->set_ibss_vdev_heart_beat_timer) 95 return soc->ops->misc_ops->set_ibss_vdev_heart_beat_timer( 96 vdev, timer_value_sec); 97 98 return 0; 99 } 100 101 /** 102 * cdp_set_wisa_mode() - set wisa mode 103 * @soc - data path soc handle 104 * @vdev - vdev handle 105 * @enable - enable or disable 106 * 107 * Return: QDF_STATUS_SUCCESS mode enable success 108 */ 109 static inline QDF_STATUS 110 cdp_set_wisa_mode(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, bool enable) 111 { 112 if (!soc || !soc->ops || !soc->ops->misc_ops) { 113 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 114 "%s invalid instance", __func__); 115 return QDF_STATUS_E_INVAL; 116 } 117 118 if (soc->ops->misc_ops->set_wisa_mode) 119 return soc->ops->misc_ops->set_wisa_mode(vdev, enable); 120 return QDF_STATUS_SUCCESS; 121 } 122 123 /** 124 * cdp_data_stall_cb_register() - register data stall callback 125 * @soc - data path soc handle 126 * @cb - callback function 127 * 128 * Return: QDF_STATUS_SUCCESS register success 129 */ 130 static inline QDF_STATUS cdp_data_stall_cb_register(ol_txrx_soc_handle soc, 131 data_stall_detect_cb cb) 132 { 133 if (!soc || !soc->ops || !soc->ops->misc_ops) { 134 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 135 "%s invalid instance", __func__); 136 return QDF_STATUS_E_INVAL; 137 } 138 139 if (soc->ops->misc_ops->txrx_data_stall_cb_register) 140 return soc->ops->misc_ops->txrx_data_stall_cb_register(cb); 141 return QDF_STATUS_SUCCESS; 142 } 143 144 /** 145 * cdp_data_stall_cb_deregister() - de-register data stall callback 146 * @soc - data path soc handle 147 * @cb - callback function 148 * 149 * Return: QDF_STATUS_SUCCESS de-register success 150 */ 151 static inline QDF_STATUS cdp_data_stall_cb_deregister(ol_txrx_soc_handle soc, 152 data_stall_detect_cb cb) 153 { 154 if (!soc || !soc->ops || !soc->ops->misc_ops) { 155 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 156 "%s invalid instance", __func__); 157 return QDF_STATUS_E_INVAL; 158 } 159 160 if (soc->ops->misc_ops->txrx_data_stall_cb_deregister) 161 return soc->ops->misc_ops->txrx_data_stall_cb_deregister(cb); 162 return QDF_STATUS_SUCCESS; 163 } 164 165 /** 166 * cdp_post_data_stall_event() - post data stall event 167 * @soc - data path soc handle 168 * @indicator: Module triggering data stall 169 * @data_stall_type: data stall event type 170 * @pdev_id: pdev id 171 * @vdev_id_bitmap: vdev id bitmap 172 * @recovery_type: data stall recovery type 173 * 174 * Return: None 175 */ 176 static inline void 177 cdp_post_data_stall_event(ol_txrx_soc_handle soc, 178 enum data_stall_log_event_indicator indicator, 179 enum data_stall_log_event_type data_stall_type, 180 uint32_t pdev_id, uint32_t vdev_id_bitmap, 181 enum data_stall_log_recovery_type recovery_type) 182 { 183 if (!soc || !soc->ops) { 184 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 185 "%s invalid instance", __func__); 186 QDF_BUG(0); 187 return; 188 } 189 190 if (!soc->ops->misc_ops || 191 !soc->ops->misc_ops->txrx_post_data_stall_event) 192 return; 193 194 soc->ops->misc_ops->txrx_post_data_stall_event( 195 indicator, data_stall_type, pdev_id, 196 vdev_id_bitmap, recovery_type); 197 } 198 199 /** 200 * cdp_set_wmm_param() - set wmm parameter 201 * @soc - data path soc handle 202 * @pdev - device instance pointer 203 * @wmm_param - wmm parameter 204 * 205 * Return: none 206 */ 207 static inline void 208 cdp_set_wmm_param(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, 209 struct ol_tx_wmm_param_t wmm_param) 210 { 211 if (!soc || !soc->ops || !soc->ops->misc_ops) { 212 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 213 "%s invalid instance", __func__); 214 return; 215 } 216 217 if (soc->ops->misc_ops->set_wmm_param) 218 return soc->ops->misc_ops->set_wmm_param( 219 pdev, wmm_param); 220 221 return; 222 } 223 224 /** 225 * cdp_runtime_suspend() - suspend 226 * @soc - data path soc handle 227 * @pdev - device instance pointer 228 * 229 * Return: QDF_STATUS_SUCCESS suspend success 230 */ 231 static inline QDF_STATUS cdp_runtime_suspend(ol_txrx_soc_handle soc, 232 struct cdp_pdev *pdev) 233 { 234 if (!soc || !soc->ops || !soc->ops->misc_ops) { 235 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 236 "%s invalid instance", __func__); 237 return QDF_STATUS_E_INVAL; 238 } 239 240 if (soc->ops->misc_ops->runtime_suspend) 241 return soc->ops->misc_ops->runtime_suspend(pdev); 242 243 return QDF_STATUS_SUCCESS; 244 } 245 246 /** 247 * cdp_runtime_resume() - resume 248 * @soc - data path soc handle 249 * @pdev - device instance pointer 250 * 251 * Return: QDF_STATUS_SUCCESS suspend success 252 */ 253 static inline QDF_STATUS cdp_runtime_resume(ol_txrx_soc_handle soc, 254 struct cdp_pdev *pdev) 255 { 256 if (!soc || !soc->ops || !soc->ops->misc_ops) { 257 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 258 "%s invalid instance", __func__); 259 return QDF_STATUS_E_INVAL; 260 } 261 262 if (soc->ops->misc_ops->runtime_resume) 263 return soc->ops->misc_ops->runtime_resume(pdev); 264 265 return QDF_STATUS_SUCCESS; 266 } 267 268 /** 269 * cdp_hl_tdls_flag_reset() - tdls flag reset 270 * @soc - data path soc handle 271 * @vdev - virtual interface handle pointer 272 * @flag 273 * 274 * Return: none 275 */ 276 static inline void 277 cdp_hl_tdls_flag_reset(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, bool flag) 278 { 279 if (!soc || !soc->ops || !soc->ops->misc_ops) { 280 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 281 "%s invalid instance", __func__); 282 return; 283 } 284 285 if (soc->ops->misc_ops->hl_tdls_flag_reset) 286 return soc->ops->misc_ops->hl_tdls_flag_reset(vdev, flag); 287 288 return; 289 } 290 291 /** 292 * cdp_get_opmode() - get vdev operation mode 293 * @soc - data path soc handle 294 * @vdev - virtual interface instance 295 * 296 * Return virtual device operational mode 297 * op_mode_ap, 298 * op_mode_ibss, 299 * op_mode_sta, 300 * op_mode_monitor, 301 * op_mode_ocb, 302 * 303 * return interface id 304 * 0 unknown interface 305 */ 306 static inline int 307 cdp_get_opmode(ol_txrx_soc_handle soc, struct cdp_vdev *vdev) 308 { 309 if (!soc || !soc->ops || !soc->ops->misc_ops) { 310 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 311 "%s invalid instance", __func__); 312 return 0; 313 } 314 315 if (soc->ops->misc_ops->get_opmode) 316 return soc->ops->misc_ops->get_opmode(vdev); 317 return 0; 318 } 319 320 /** 321 * cdp_get_vdev_id() - get vdev id 322 * @soc - data path soc handle 323 * @vdev - virtual interface instance 324 * 325 * get virtual interface id 326 * 327 * return interface id 328 * 0 unknown interface 329 */ 330 static inline uint16_t 331 cdp_get_vdev_id(ol_txrx_soc_handle soc, struct cdp_vdev *vdev) 332 { 333 if (!soc || !soc->ops || !soc->ops->misc_ops) { 334 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 335 "%s invalid instance", __func__); 336 return 0; 337 } 338 339 if (soc->ops->misc_ops->get_vdev_id) 340 return soc->ops->misc_ops->get_vdev_id(vdev); 341 return 0; 342 } 343 344 /** 345 * cdp_get_tx_ack_stats() - get tx ack count for vdev 346 * @soc - data path soc handle 347 * @vdev_id - vdev id 348 * 349 * return tx ack count 350 * 0 invalid count 351 */ 352 static inline uint32_t 353 cdp_get_tx_ack_stats(ol_txrx_soc_handle soc, uint8_t vdev_id) 354 { 355 if (!soc || !soc->ops || !soc->ops->misc_ops) { 356 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 357 "%s invalid instance", __func__); 358 return 0; 359 } 360 361 if (soc->ops->misc_ops->get_tx_ack_stats) 362 return soc->ops->misc_ops->get_tx_ack_stats(vdev_id); 363 return 0; 364 } 365 366 /** 367 * cdp_bad_peer_txctl_set_setting() - TBD 368 * @soc - data path soc handle 369 * @pdev - data path device instance 370 * @enable - 371 * @period - 372 * @txq_limit - 373 * 374 * TBD 375 * 376 * Return: none 377 */ 378 static inline void 379 cdp_bad_peer_txctl_set_setting(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, 380 int enable, int period, int txq_limit) 381 { 382 if (!soc || !soc->ops || !soc->ops->misc_ops) { 383 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 384 "%s invalid instance", __func__); 385 return; 386 } 387 388 if (soc->ops->misc_ops->bad_peer_txctl_set_setting) 389 return soc->ops->misc_ops->bad_peer_txctl_set_setting(pdev, 390 enable, period, txq_limit); 391 return; 392 } 393 394 /** 395 * cdp_bad_peer_txctl_update_threshold() - TBD 396 * @soc - data path soc handle 397 * @pdev - data path device instance 398 * @level - 399 * @tput_thresh - 400 * @tx_limit - 401 * 402 * TBD 403 * 404 * Return: none 405 */ 406 static inline void 407 cdp_bad_peer_txctl_update_threshold(ol_txrx_soc_handle soc, 408 struct cdp_pdev *pdev, 409 int level, int tput_thresh, int tx_limit) 410 { 411 if (!soc || !soc->ops || !soc->ops->misc_ops) { 412 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 413 "%s invalid instance", __func__); 414 return; 415 } 416 417 if (soc->ops->misc_ops->bad_peer_txctl_update_threshold) 418 return soc->ops->misc_ops->bad_peer_txctl_update_threshold( 419 pdev, level, tput_thresh, tx_limit); 420 return; 421 } 422 423 /** 424 * cdp_mark_first_wakeup_packet() - set flag to indicate that 425 * fw is compatible for marking first packet after wow wakeup 426 * @soc - data path soc handle 427 * @value: 1 for enabled/ 0 for disabled 428 * 429 * Return: None 430 */ 431 static inline void cdp_mark_first_wakeup_packet(ol_txrx_soc_handle soc, 432 uint8_t value) 433 { 434 if (!soc || !soc->ops || !soc->ops->misc_ops) { 435 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 436 "%s invalid instance", __func__); 437 return; 438 } 439 440 if (soc->ops->misc_ops->mark_first_wakeup_packet) 441 return soc->ops->misc_ops->mark_first_wakeup_packet(value); 442 return; 443 } 444 445 446 /** 447 * cds_update_mac_id() - update mac_id for vdev 448 * @soc - data path soc handle 449 * @vdev_id: vdev id 450 * @mac_id: mac id 451 * 452 * Return: none 453 */ 454 static inline void cdp_update_mac_id(void *psoc, uint8_t vdev_id, 455 uint8_t mac_id) 456 { 457 ol_txrx_soc_handle soc = psoc; 458 459 if (!soc || !soc->ops || !soc->ops->misc_ops) { 460 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 461 "%s invalid instance", __func__); 462 return; 463 } 464 465 if (soc->ops->misc_ops->update_mac_id) 466 return soc->ops->misc_ops->update_mac_id(vdev_id, mac_id); 467 return; 468 } 469 470 /** 471 * cdp_flush_rx_frames() - flush cached rx frames 472 * @soc - data path soc handle 473 * @peer: peer 474 * @drop: set flag to drop frames 475 * 476 * Return: None 477 */ 478 static inline void cdp_flush_rx_frames(ol_txrx_soc_handle soc, void *peer, 479 bool drop) 480 { 481 if (!soc || !soc->ops || !soc->ops->misc_ops) { 482 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 483 "%s invalid instance", __func__); 484 return; 485 } 486 487 if (soc->ops->misc_ops->flush_rx_frames) 488 return soc->ops->misc_ops->flush_rx_frames(peer, drop); 489 return; 490 } 491 492 /* 493 * cdp_get_intra_bss_fwd_pkts_count() - to get the total tx and rx packets 494 * that has been forwarded from txrx layer without going to upper layers. 495 * @vdev_id: vdev id 496 * @fwd_tx_packets: pointer to forwarded tx packets count parameter 497 * @fwd_rx_packets: pointer to forwarded rx packets count parameter 498 * 499 * Return: status -> A_OK - success, A_ERROR - failure 500 */ 501 static inline A_STATUS cdp_get_intra_bss_fwd_pkts_count( 502 ol_txrx_soc_handle soc, uint8_t vdev_id, 503 uint64_t *fwd_tx_packets, uint64_t *fwd_rx_packets) 504 { 505 if (!soc || !soc->ops || !soc->ops->misc_ops) { 506 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 507 "%s invalid instance", __func__); 508 return 0; 509 } 510 511 if (soc->ops->misc_ops->get_intra_bss_fwd_pkts_count) 512 return soc->ops->misc_ops->get_intra_bss_fwd_pkts_count( 513 vdev_id, fwd_tx_packets, fwd_rx_packets); 514 515 return 0; 516 } 517 518 /** 519 * cdp_pkt_log_init() - API to initialize packet log 520 * @handle: pdev handle 521 * @scn: HIF context 522 * 523 * Return: void 524 */ 525 static inline void cdp_pkt_log_init(ol_txrx_soc_handle soc, 526 struct cdp_pdev *pdev, void *scn) 527 { 528 if (!soc || !soc->ops || !soc->ops->misc_ops) { 529 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 530 "%s invalid instance", __func__); 531 return; 532 } 533 534 if (soc->ops->misc_ops->pkt_log_init) 535 return soc->ops->misc_ops->pkt_log_init(pdev, scn); 536 537 return; 538 } 539 540 /** 541 * cdp_pkt_log_con_service() - API to connect packet log service 542 * @handle: pdev handle 543 * @scn: HIF context 544 * 545 * Return: void 546 */ 547 static inline void cdp_pkt_log_con_service(ol_txrx_soc_handle soc, 548 struct cdp_pdev *pdev, void *scn) 549 { 550 if (!soc || !soc->ops || !soc->ops->misc_ops) { 551 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 552 "%s invalid instance", __func__); 553 return; 554 } 555 556 if (soc->ops->misc_ops->pkt_log_con_service) 557 return soc->ops->misc_ops->pkt_log_con_service(pdev, scn); 558 559 return; 560 } 561 #endif /* _CDP_TXRX_MISC_H_ */ 562