1 /* 2 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 /** 18 * DOC: Define VDEV MLME structure and APIs 19 */ 20 #ifndef _WLAN_VDEV_MLME_H_ 21 #define _WLAN_VDEV_MLME_H_ 22 23 struct vdev_mlme_obj; 24 25 /** 26 * struct vdev_mlme_proto - VDEV protocol strucutre 27 */ 28 struct vdev_mlme_proto { 29 }; 30 31 /** 32 * enum beacon_update_op - Beacon update op type 33 * @BEACON_INIT: Initialize beacon 34 * @BEACON_REINIT: Re-initialize beacon 35 * @BEACON_UPDATE: Update dynamic fields of beacon 36 * @BEACON_CSA: Enable CSA IE 37 * @BEACON_FREE: Beacon buffer free 38 */ 39 enum beacon_update_op { 40 BEACON_INIT, 41 BEACON_REINIT, 42 BEACON_UPDATE, 43 BEACON_CSA, 44 BEACON_FREE, 45 }; 46 47 /** 48 * enum vdev_cmd_type - Command type 49 * @START_REQ: Start request 50 * @RESTART_REQ: Restart request 51 */ 52 enum vdev_cmd_type { 53 START_REQ, 54 RESTART_REQ, 55 }; 56 57 /** 58 * struct vdev_mlme_ops - VDEV MLME operation callbacks structure 59 * @mlme_vdev_validate_basic_params: callback to validate VDEV basic params 60 * @mlme_vdev_reset_proto_params: callback to Reset protocol params 61 * @mlme_vdev_start_send: callback to initiate actions of VDEV 62 * MLME start operation 63 * @mlme_vdev_restart_send: callback to initiate actions of VDEV 64 * MLME restart operation 65 * @mlme_vdev_stop_start_send: callback to block start/restart VDEV 66 * request command 67 * @mlme_vdev_start_continue: callback to initiate operations on 68 * LMAC/FW start response 69 * @mlme_vdev_up_send: callback to initiate actions of VDEV 70 * MLME up operation 71 * @mlme_vdev_notify_up_complete: callback to notify VDEV MLME on moving 72 * to UP state 73 * @mlme_vdev_notify_roam_start: callback to initiate roaming 74 * @mlme_vdev_update_beacon: callback to initiate beacon update 75 * @mlme_vdev_disconnect_peers: callback to initiate disconnection of 76 * peers 77 * @mlme_vdev_dfs_cac_timer_stop: callback to stop the DFS CAC timer 78 * @mlme_vdev_stop_send: callback to initiate actions of VDEV 79 * MLME stop operation 80 * @mlme_vdev_stop_continue: callback to initiate operations on 81 * LMAC/FW stop response 82 * @mlme_vdev_bss_peer_delete_continue: callback to initiate operations on BSS 83 * peer delete completion 84 * @mlme_vdev_down_send: callback to initiate actions of VDEV 85 * MLME down operation 86 */ 87 struct vdev_mlme_ops { 88 QDF_STATUS (*mlme_vdev_validate_basic_params)( 89 struct vdev_mlme_obj *vdev_mlme, 90 uint16_t event_data_len, void *event_data); 91 QDF_STATUS (*mlme_vdev_reset_proto_params)( 92 struct vdev_mlme_obj *vdev_mlme, 93 uint16_t event_data_len, void *event_data); 94 QDF_STATUS (*mlme_vdev_start_send)( 95 struct vdev_mlme_obj *vdev_mlme, 96 uint16_t event_data_len, void *event_data); 97 QDF_STATUS (*mlme_vdev_restart_send)( 98 struct vdev_mlme_obj *vdev_mlme, 99 uint16_t event_data_len, void *event_data); 100 QDF_STATUS (*mlme_vdev_stop_start_send)( 101 struct vdev_mlme_obj *vdev_mlme, 102 enum vdev_cmd_type type, 103 uint16_t event_data_len, void *event_data); 104 QDF_STATUS (*mlme_vdev_start_continue)( 105 struct vdev_mlme_obj *vdev_mlme, 106 uint16_t event_data_len, void *event_data); 107 QDF_STATUS (*mlme_vdev_sta_conn_start)( 108 struct vdev_mlme_obj *vdev_mlme, 109 uint16_t event_data_len, void *event_data); 110 QDF_STATUS (*mlme_vdev_start_req_failed)( 111 struct vdev_mlme_obj *vdev_mlme, 112 uint16_t event_data_len, void *event_data); 113 QDF_STATUS (*mlme_vdev_up_send)( 114 struct vdev_mlme_obj *vdev_mlme, 115 uint16_t event_data_len, void *event_data); 116 QDF_STATUS (*mlme_vdev_notify_up_complete)( 117 struct vdev_mlme_obj *vdev_mlme, 118 uint16_t event_data_len, void *event_data); 119 QDF_STATUS (*mlme_vdev_notify_roam_start)( 120 struct vdev_mlme_obj *vdev_mlme, 121 uint16_t event_data_len, void *event_data); 122 QDF_STATUS (*mlme_vdev_update_beacon)( 123 struct vdev_mlme_obj *vdev_mlme, 124 enum beacon_update_op op, 125 uint16_t event_data_len, void *event_data); 126 QDF_STATUS (*mlme_vdev_disconnect_peers)( 127 struct vdev_mlme_obj *vdev_mlme, 128 uint16_t event_data_len, void *event_data); 129 QDF_STATUS (*mlme_vdev_dfs_cac_timer_stop)( 130 struct vdev_mlme_obj *vdev_mlme, 131 uint16_t event_data_len, void *event_data); 132 QDF_STATUS (*mlme_vdev_stop_send)( 133 struct vdev_mlme_obj *vdev_mlme, 134 uint16_t event_data_len, void *event_data); 135 QDF_STATUS (*mlme_vdev_stop_continue)( 136 struct vdev_mlme_obj *vdev_mlme, 137 uint16_t event_data_len, void *event_data); 138 QDF_STATUS (*mlme_vdev_down_send)( 139 struct vdev_mlme_obj *vdev_mlme, 140 uint16_t event_data_len, void *event_data); 141 QDF_STATUS (*mlme_vdev_notify_down_complete)( 142 struct vdev_mlme_obj *vdev_mlme, 143 uint16_t event_data_len, void *event_data); 144 }; 145 146 /** 147 * struct vdev_mlme_obj - VDEV MLME component object 148 * @vdev_proto: VDEV MLME proto substructure 149 * @sm_lock: VDEV SM lock 150 * @vdev_cmd_lock: VDEV MLME command atomicity 151 * @sm_hdl: VDEV SM handle 152 * @ops: VDEV MLME callback table 153 * @ext_vdev_ptr: VDEV MLME legacy pointer 154 */ 155 struct vdev_mlme_obj { 156 struct vdev_mlme_proto vdev_proto; 157 #ifdef VDEV_SM_LOCK_SUPPORT 158 qdf_spinlock_t sm_lock; 159 qdf_mutex_t vdev_cmd_lock; 160 #endif 161 struct wlan_sm *sm_hdl; 162 struct wlan_objmgr_vdev *vdev; 163 struct vdev_mlme_ops *ops; 164 void *ext_vdev_ptr; 165 }; 166 167 /** 168 * mlme_vdev_validate_basic_params - Validate basic params 169 * @vdev_mlme_obj: VDEV MLME comp object 170 * @event_data_len: data size 171 * @event_data: event data 172 * 173 * API validate MLME VDEV basic parameters 174 * 175 * Return: SUCCESS on successful validation 176 * FAILURE, if any parameter is not initialized 177 */ 178 static inline QDF_STATUS mlme_vdev_validate_basic_params( 179 struct vdev_mlme_obj *vdev_mlme, 180 uint16_t event_data_len, void *event_data) 181 { 182 QDF_STATUS ret = QDF_STATUS_SUCCESS; 183 184 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_validate_basic_params) 185 ret = vdev_mlme->ops->mlme_vdev_validate_basic_params( 186 vdev_mlme, event_data_len, event_data); 187 188 return ret; 189 } 190 191 /** 192 * mlme_vdev_reset_proto_params - Reset VDEV protocol params 193 * @vdev_mlme_obj: VDEV MLME comp object 194 * @event_data_len: data size 195 * @event_data: event data 196 * 197 * API resets the protocol params fo vdev 198 * 199 * Return: SUCCESS on successful reset 200 * FAILURE, if it fails due to any 201 */ 202 static inline QDF_STATUS mlme_vdev_reset_proto_params( 203 struct vdev_mlme_obj *vdev_mlme, 204 uint16_t event_data_len, void *event_data) 205 { 206 QDF_STATUS ret = QDF_STATUS_SUCCESS; 207 208 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_reset_proto_params) 209 ret = vdev_mlme->ops->mlme_vdev_reset_proto_params( 210 vdev_mlme, event_data_len, event_data); 211 212 return ret; 213 } 214 215 /** 216 * mlme_vdev_start_send - Invokes VDEV start operation 217 * @vdev_mlme_obj: VDEV MLME comp object 218 * @event_data_len: data size 219 * @event_data: event data 220 * 221 * API invokes VDEV start operation 222 * 223 * Return: SUCCESS on successful completion of start operation 224 * FAILURE, if it fails due to any 225 */ 226 static inline QDF_STATUS mlme_vdev_start_send( 227 struct vdev_mlme_obj *vdev_mlme, 228 uint16_t event_data_len, void *event_data) 229 { 230 QDF_STATUS ret = QDF_STATUS_SUCCESS; 231 232 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_start_send) 233 ret = vdev_mlme->ops->mlme_vdev_start_send( 234 vdev_mlme, event_data_len, event_data); 235 236 return ret; 237 } 238 239 /** 240 * mlme_vdev_restart_send - Invokes VDEV restart operation 241 * @vdev_mlme_obj: VDEV MLME comp object 242 * @event_data_len: data size 243 * @event_data: event data 244 * 245 * API invokes VDEV restart operation 246 * 247 * Return: SUCCESS on successful completion of restart operation 248 * FAILURE, if it fails due to any 249 */ 250 static inline QDF_STATUS mlme_vdev_restart_send( 251 struct vdev_mlme_obj *vdev_mlme, 252 uint16_t event_data_len, void *event_data) 253 { 254 QDF_STATUS ret = QDF_STATUS_SUCCESS; 255 256 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_restart_send) 257 ret = vdev_mlme->ops->mlme_vdev_restart_send( 258 vdev_mlme, event_data_len, event_data); 259 260 return ret; 261 } 262 263 /** 264 * mlme_vdev_stop_start_send - Invoke block VDEV restart operation 265 * @vdev_mlme_obj: VDEV MLME comp object 266 * @restart: restart req/start req 267 * @event_data_len: data size 268 * @event_data: event data 269 * 270 * API invokes stops pending VDEV restart operation 271 * 272 * Return: SUCCESS alsways 273 */ 274 static inline QDF_STATUS mlme_vdev_stop_start_send( 275 struct vdev_mlme_obj *vdev_mlme, 276 uint8_t restart, 277 uint16_t event_data_len, void *event_data) 278 { 279 QDF_STATUS ret = QDF_STATUS_SUCCESS; 280 281 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_stop_start_send) 282 ret = vdev_mlme->ops->mlme_vdev_stop_start_send( 283 vdev_mlme, restart, event_data_len, event_data); 284 285 return ret; 286 } 287 288 /** 289 * mlme_vdev_start_continue - VDEV start response handling 290 * @vdev_mlme_obj: VDEV MLME comp object 291 * @event_data_len: data size 292 * @event_data: event data 293 * 294 * API invokes VDEV start response actions 295 * 296 * Return: SUCCESS on successful completion of start response operation 297 * FAILURE, if it fails due to any 298 */ 299 static inline QDF_STATUS mlme_vdev_start_continue( 300 struct vdev_mlme_obj *vdev_mlme, 301 uint16_t event_data_len, void *event_data) 302 { 303 QDF_STATUS ret = QDF_STATUS_SUCCESS; 304 305 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_start_continue) 306 ret = vdev_mlme->ops->mlme_vdev_start_continue( 307 vdev_mlme, event_data_len, event_data); 308 309 return ret; 310 } 311 312 /** 313 * mlme_vdev_start_req_failed - Invoke Station VDEV connection, if it pause 314 * @vdev_mlme_obj: VDEV MLME comp object 315 * @event_data_len: data size 316 * @event_data: event data 317 * 318 * API invokes on START fail response 319 * 320 * Return: SUCCESS on successful invocation of callback 321 * FAILURE, if it fails due to any 322 */ 323 static inline QDF_STATUS mlme_vdev_start_req_failed( 324 struct vdev_mlme_obj *vdev_mlme, 325 uint16_t event_data_len, void *event_data) 326 { 327 QDF_STATUS ret = QDF_STATUS_SUCCESS; 328 329 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_start_req_failed) 330 ret = vdev_mlme->ops->mlme_vdev_start_req_failed( 331 vdev_mlme, event_data_len, event_data); 332 333 return ret; 334 } 335 336 /** 337 * mlme_vdev_sta_conn_start - Invoke Station VDEV connection, if it pause 338 * @vdev_mlme_obj: VDEV MLME comp object 339 * @event_data_len: data size 340 * @event_data: event data 341 * 342 * API invokes connection SM to start station connection 343 * 344 * Return: SUCCESS on successful invocation of connection sm 345 * FAILURE, if it fails due to any 346 */ 347 static inline QDF_STATUS mlme_vdev_sta_conn_start( 348 struct vdev_mlme_obj *vdev_mlme, 349 uint16_t event_data_len, void *event_data) 350 { 351 QDF_STATUS ret = QDF_STATUS_SUCCESS; 352 353 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_sta_conn_start) 354 ret = vdev_mlme->ops->mlme_vdev_sta_conn_start( 355 vdev_mlme, event_data_len, event_data); 356 357 return ret; 358 } 359 360 /** 361 * mlme_vdev_up_send - VDEV up operation 362 * @vdev_mlme_obj: VDEV MLME comp object 363 * @event_data_len: data size 364 * @event_data: event data 365 * 366 * API invokes VDEV up operations 367 * 368 * Return: SUCCESS on successful completion of up operation 369 * FAILURE, if it fails due to any 370 */ 371 static inline QDF_STATUS mlme_vdev_up_send( 372 struct vdev_mlme_obj *vdev_mlme, 373 uint16_t event_data_len, void *event_data) 374 { 375 QDF_STATUS ret = QDF_STATUS_SUCCESS; 376 377 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_up_send) 378 ret = vdev_mlme->ops->mlme_vdev_up_send( 379 vdev_mlme, event_data_len, event_data); 380 381 return ret; 382 } 383 384 /** 385 * mlme_vdev_notify_up_complete - VDEV up state transition notification 386 * @vdev_mlme_obj: VDEV MLME comp object 387 * @event_data_len: data size 388 * @event_data: event data 389 * 390 * API notifies MLME on moving to UP state 391 * 392 * Return: SUCCESS on successful completion of up notification 393 * FAILURE, if it fails due to any 394 */ 395 static inline 396 QDF_STATUS mlme_vdev_notify_up_complete(struct vdev_mlme_obj *vdev_mlme, 397 uint16_t event_data_len, 398 void *event_data) 399 { 400 QDF_STATUS ret = QDF_STATUS_SUCCESS; 401 402 if (vdev_mlme->ops && vdev_mlme->ops->mlme_vdev_notify_up_complete) 403 ret = vdev_mlme->ops->mlme_vdev_notify_up_complete( 404 vdev_mlme, event_data_len, event_data); 405 406 return ret; 407 } 408 409 /** 410 * mlme_vdev_notify_roam_start - VDEV Roaming notification 411 * @vdev_mlme_obj: VDEV MLME comp object 412 * @event_len: data size 413 * @event_data: event data 414 * 415 * API notifies MLME on roaming 416 * 417 * Return: SUCCESS on successful completion of up notification 418 * FAILURE, if it fails due to any 419 */ 420 static inline 421 QDF_STATUS mlme_vdev_notify_roam_start(struct vdev_mlme_obj *vdev_mlme, 422 uint16_t event_len, void *event_data) 423 { 424 QDF_STATUS ret = QDF_STATUS_SUCCESS; 425 426 if (vdev_mlme->ops && vdev_mlme->ops->mlme_vdev_notify_roam_start) 427 ret = vdev_mlme->ops->mlme_vdev_notify_roam_start(vdev_mlme, 428 event_len, 429 event_data); 430 431 return ret; 432 } 433 434 /** 435 * mlme_vdev_update_beacon - Updates beacon 436 * @vdev_mlme_obj: VDEV MLME comp object 437 * @op: beacon update type 438 * @event_data_len: data size 439 * @event_data: event data 440 * 441 * API updates/allocates/frees the beacon 442 * 443 * Return: SUCCESS on successful update of beacon 444 * FAILURE, if it fails due to any 445 */ 446 static inline 447 QDF_STATUS mlme_vdev_update_beacon(struct vdev_mlme_obj *vdev_mlme, 448 enum beacon_update_op op, 449 uint16_t event_data_len, void *event_data) 450 { 451 QDF_STATUS ret = QDF_STATUS_SUCCESS; 452 453 if (vdev_mlme->ops && vdev_mlme->ops->mlme_vdev_update_beacon) 454 ret = vdev_mlme->ops->mlme_vdev_update_beacon(vdev_mlme, op, 455 event_data_len, event_data); 456 457 return ret; 458 } 459 460 /** 461 * mlme_vdev_disconnect_peers - Disconnect peers 462 * @vdev_mlme_obj: VDEV MLME comp object 463 * @event_data_len: data size 464 * @event_data: event data 465 * 466 * API trigger stations disconnection with AP VDEV or AP disconnection with STA 467 * VDEV 468 * 469 * Return: SUCCESS on successful invocation of station disconnection 470 * FAILURE, if it fails due to any 471 */ 472 static inline QDF_STATUS mlme_vdev_disconnect_peers( 473 struct vdev_mlme_obj *vdev_mlme, 474 uint16_t event_data_len, void *event_data) 475 { 476 QDF_STATUS ret = QDF_STATUS_SUCCESS; 477 478 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_disconnect_peers) 479 ret = vdev_mlme->ops->mlme_vdev_disconnect_peers( 480 vdev_mlme, event_data_len, event_data); 481 482 return ret; 483 } 484 485 /** 486 * mlme_vdev_dfs_cac_timer_stop - Stop CAC timer 487 * @vdev_mlme_obj: VDEV MLME comp object 488 * @event_data_len: data size 489 * @event_data: event data 490 * 491 * API stops the CAC timer through DFS API 492 * 493 * Return: SUCCESS on successful CAC timer stop 494 * FAILURE, if it fails due to any 495 */ 496 static inline QDF_STATUS mlme_vdev_dfs_cac_timer_stop( 497 struct vdev_mlme_obj *vdev_mlme, 498 uint16_t event_data_len, void *event_data) 499 { 500 QDF_STATUS ret = QDF_STATUS_SUCCESS; 501 502 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_dfs_cac_timer_stop) 503 ret = vdev_mlme->ops->mlme_vdev_dfs_cac_timer_stop( 504 vdev_mlme, event_data_len, event_data); 505 506 return ret; 507 } 508 509 /** 510 * mlme_vdev_stop_send - Invokes VDEV stop operation 511 * @vdev_mlme_obj: VDEV MLME comp object 512 * @event_data_len: data size 513 * @event_data: event data 514 * 515 * API invokes VDEV stop operation 516 * 517 * Return: SUCCESS on successful completion of stop operation 518 * FAILURE, if it fails due to any 519 */ 520 static inline QDF_STATUS mlme_vdev_stop_send( 521 struct vdev_mlme_obj *vdev_mlme, 522 uint16_t event_data_len, void *event_data) 523 { 524 QDF_STATUS ret = QDF_STATUS_SUCCESS; 525 526 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_stop_send) 527 ret = vdev_mlme->ops->mlme_vdev_stop_send( 528 vdev_mlme, event_data_len, event_data); 529 530 return ret; 531 } 532 533 /** 534 * mlme_vdev_stop_continue - VDEV stop response handling 535 * @vdev_mlme_obj: VDEV MLME comp object 536 * @event_data_len: data size 537 * @event_data: event data 538 * 539 * API invokes VDEV stop response actions 540 * 541 * Return: SUCCESS on successful completion of stop response operation 542 * FAILURE, if it fails due to any 543 */ 544 static inline QDF_STATUS mlme_vdev_stop_continue( 545 struct vdev_mlme_obj *vdev_mlme, 546 uint16_t event_data_len, void *event_data) 547 { 548 QDF_STATUS ret = QDF_STATUS_SUCCESS; 549 550 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_stop_continue) 551 ret = vdev_mlme->ops->mlme_vdev_stop_continue(vdev_mlme, 552 event_data_len, 553 event_data); 554 555 return ret; 556 } 557 558 /** 559 * mlme_vdev_down_send - VDEV down operation 560 * @vdev_mlme_obj: VDEV MLME comp object 561 * @event_data_len: data size 562 * @event_data: event data 563 * 564 * API invokes VDEV down operation 565 * 566 * Return: SUCCESS on successful completion of VDEV down operation 567 * FAILURE, if it fails due to any 568 */ 569 static inline QDF_STATUS mlme_vdev_down_send( 570 struct vdev_mlme_obj *vdev_mlme, 571 uint16_t event_data_len, void *event_data) 572 { 573 QDF_STATUS ret = QDF_STATUS_SUCCESS; 574 575 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_down_send) 576 ret = vdev_mlme->ops->mlme_vdev_down_send( 577 vdev_mlme, event_data_len, event_data); 578 579 return ret; 580 } 581 582 /** 583 * mlme_vdev_notify_down_complete - VDEV init state transition notification 584 * @vdev_mlme_obj: VDEV MLME comp object 585 * @event_data_len: data size 586 * @event_data: event data 587 * 588 * API notifies MLME on moving to INIT state 589 * 590 * Return: SUCCESS on successful completion of down notification 591 * FAILURE, if it fails due to any 592 */ 593 static inline QDF_STATUS mlme_vdev_notify_down_complete( 594 struct vdev_mlme_obj *vdev_mlme, 595 uint16_t event_data_len, void *event_data) 596 { 597 QDF_STATUS ret = QDF_STATUS_SUCCESS; 598 599 if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_notify_down_complete) 600 ret = vdev_mlme->ops->mlme_vdev_notify_down_complete( 601 vdev_mlme, event_data_len, event_data); 602 603 return ret; 604 } 605 606 #endif 607