1 /** @file */ 2 /****************************************************************************** 3 * 4 * Copyright(c) 2019 Realtek Corporation. All rights reserved. 5 * 6 * This program is free software; you can redistribute it and/or modify it 7 * under the terms of version 2 of the GNU General Public License as 8 * published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope that it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13 * more details. 14 * 15 ******************************************************************************/ 16 17 #ifndef _MAC_AX_SDIO_H_ 18 #define _MAC_AX_SDIO_H_ 19 20 #include "../type.h" 21 #include "pwr.h" 22 23 #if MAC_AX_SDIO_SUPPORT 24 /* SDIO CMD address mapping */ 25 #define SDIO_8BYTE_LEN_MASK 0x0FFF 26 #define SDIO_4BYTE_LEN_MASK 0x03FF 27 #define SDIO_LOCAL_MSK 0x00000FFF 28 #define SDIO_LOCAL_SHIFT 0x00001000 29 #define WLAN_IOREG_MSK 0xFFFE0000 30 31 /* IO Bus domain address mapping */ 32 #define SDIO_LOCAL_BASE 0x80000000 33 #define WLAN_IOREG_BASE 0x00000000 34 #define SDIO_TX_BASE 0x00010000 35 36 #define SDIO_CMD_ADDR_TXFF_SHIFT 12 37 #define SDIO_CMD_ADDR_TXFF_0 0 38 #define SDIO_CMD_ADDR_TXFF_1 1 39 #define SDIO_CMD_ADDR_TXFF_2 2 40 #define SDIO_CMD_ADDR_TXFF_3 3 41 #define SDIO_CMD_ADDR_TXFF_4 4 42 #define SDIO_CMD_ADDR_TXFF_5 5 43 #define SDIO_CMD_ADDR_TXFF_6 6 44 #define SDIO_CMD_ADDR_TXFF_7 7 45 #define SDIO_CMD_ADDR_TXFF_8 8 46 #define SDIO_CMD_ADDR_TXFF_9 9 47 #define SDIO_CMD_ADDR_TXFF_10 10 48 #define SDIO_CMD_ADDR_TXFF_11 11 49 #define SDIO_CMD_ADDR_TXFF_12 12 50 #define SDIO_CMD_ADDR_RXFF 0x1F00 51 52 #define SDIO_REG_LOCAL 0 53 #define SDIO_REG_WLAN_REG 1 54 #define SDIO_REG_WLAN_PLTFM 2 55 56 #define SDIO_PWR_ON 0 57 #define SDIO_PWR_OFF 1 58 59 #define SDIO_WAIT_CNT 50 60 61 #define SDIO_LOCAL_REG_START 0x1000 62 #define SDIO_LOCAL_REG_END 0x1F00 63 #define SDIO_LOCAL_REG_END_PATCH 0x2000 64 #define SDIO_WLAN_REG_END 0x1FFFF 65 #define SDIO_WLAN_REG_END_PATCH 0xFFFF 66 67 #define SDIO_BYTE_MODE_SIZE_MAX 512 68 #define CMAC_CLK_ALLEN 0xFFFFFFFF 69 #define SDIO_DEFAULT_AGG_NUM 0x40 70 71 /** 72 * @struct mac_sdio_tbl 73 * @brief mac_sdio_tbl 74 * 75 * @var mac_sdio_tbl::lock 76 * Please Place Description here. 77 */ 78 struct mac_sdio_tbl { 79 mac_ax_mutex lock; 80 }; 81 82 /** 83 * @struct mac_sdio_ch_thr 84 * @brief mac_sdio_ch_thr 85 * 86 * @var mac_sdio_ch_thr::thr 87 * Please Place Description here. 88 * @var mac_sdio_ch_thr::intrpt_en 89 * Please Place Description here. 90 * @var mac_sdio_ch_thr::wp_sh 91 * Please Place Description here. 92 * @var mac_sdio_ch_thr::wp_msk 93 * Please Place Description here. 94 * @var mac_sdio_ch_thr::wd_sh 95 * Please Place Description here. 96 * @var mac_sdio_ch_thr::wd_msk 97 * Please Place Description here. 98 */ 99 struct mac_sdio_ch_thr { 100 u16 thr; 101 u32 intrpt_en; 102 u8 wp_sh; 103 u16 wp_msk; 104 u8 wd_sh; 105 u16 wd_msk; 106 }; 107 108 /** 109 * @enum sdio_io_size 110 * 111 * @brief sdio_io_size 112 * 113 * @var sdio_io_size::SDIO_IO_BYTE 114 * Please Place Description here. 115 * @var sdio_io_size::SDIO_IO_WORD 116 * Please Place Description here. 117 * @var sdio_io_size::SDIO_IO_DWORD 118 * Please Place Description here. 119 * @var sdio_io_size::SDIO_IO_LAST 120 * Please Place Description here. 121 * @var sdio_io_size::SDIO_IO_MAX 122 * Please Place Description here. 123 * @var sdio_io_size::SDIO_IO_INVALID 124 * Please Place Description here. 125 */ 126 enum sdio_io_size { 127 SDIO_IO_BYTE, 128 SDIO_IO_WORD, 129 SDIO_IO_DWORD, 130 131 /* keep last */ 132 SDIO_IO_LAST, 133 SDIO_IO_MAX = SDIO_IO_LAST, 134 SDIO_IO_INVALID = SDIO_IO_LAST, 135 }; 136 137 /** 138 * @enum sdio_tx_byte_cnt 139 * 140 * @brief sdio_tx_byte_cnt 141 * 142 * @var sdio_tx_byte_cnt::SDIO_IO_BYTE 143 * Please Place Description here. 144 * @var sdio_tx_byte_cnt::SDIO_IO_WORD 145 * Please Place Description here. 146 */ 147 enum sdio_tx_byte_cnt { 148 SDIO_TX_AGG_8_BYTE_CNT, 149 SDIO_TX_DUMMY_4_BYTE_CNT, 150 }; 151 152 /** 153 * @addtogroup HCI 154 * @{ 155 * @addtogroup BasicIO 156 * @{ 157 */ 158 /** 159 * @brief reg_read8_sdio 160 * 161 * @param *adapter 162 * @param addr 163 * @return Please Place Description here. 164 * @retval u8 165 */ 166 u8 reg_read8_sdio(struct mac_ax_adapter *adapter, u32 addr); 167 /** 168 * @} 169 * @} 170 */ 171 172 /** 173 * @addtogroup HCI 174 * @{ 175 * @addtogroup BasicIO 176 * @{ 177 */ 178 /** 179 * @brief reg_write8_sdio 180 * 181 * @param *adapter 182 * @param addr 183 * @param val 184 * @return Please Place Description here. 185 * @retval void 186 */ 187 void reg_write8_sdio(struct mac_ax_adapter *adapter, u32 addr, u8 val); 188 /** 189 * @} 190 * @} 191 */ 192 193 /** 194 * @addtogroup HCI 195 * @{ 196 * @addtogroup BasicIO 197 * @{ 198 */ 199 /** 200 * @brief reg_read16_sdio 201 * 202 * @param *adapter 203 * @param addr 204 * @return Please Place Description here. 205 * @retval u16 206 */ 207 u16 reg_read16_sdio(struct mac_ax_adapter *adapter, u32 addr); 208 /** 209 * @} 210 * @} 211 */ 212 213 /** 214 * @addtogroup HCI 215 * @{ 216 * @addtogroup BasicIO 217 * @{ 218 */ 219 /** 220 * @brief reg_write16_sdio 221 * 222 * @param *adapter 223 * @param addr 224 * @param val 225 * @return Please Place Description here. 226 * @retval void 227 */ 228 void reg_write16_sdio(struct mac_ax_adapter *adapter, u32 addr, u16 val); 229 /** 230 * @} 231 * @} 232 */ 233 234 /** 235 * @addtogroup HCI 236 * @{ 237 * @addtogroup BasicIO 238 * @{ 239 */ 240 241 /** 242 * @brief reg_read32_sdio 243 * 244 * @param *adapter 245 * @param addr 246 * @return Please Place Description here. 247 * @retval u32 248 */ 249 u32 reg_read32_sdio(struct mac_ax_adapter *adapter, u32 addr); 250 /** 251 * @} 252 * @} 253 */ 254 255 /** 256 * @addtogroup HCI 257 * @{ 258 * @addtogroup BasicIO 259 * @{ 260 */ 261 /** 262 * @brief reg_write32_sdio 263 * 264 * @param *adapter 265 * @param addr 266 * @param val 267 * @return Please Place Description here. 268 * @retval void 269 */ 270 void reg_write32_sdio(struct mac_ax_adapter *adapter, u32 addr, u32 val); 271 /** 272 * @} 273 * @} 274 */ 275 276 /** 277 * @addtogroup HCI 278 * @{ 279 * @addtogroup SDIO 280 * @{ 281 */ 282 /** 283 * @brief reg_read_n_sdio 284 * 285 * @param *adapter 286 * @param adr 287 * @param size 288 * @param *val 289 * @return Please Place Description here. 290 * @retval u32 291 */ 292 u32 reg_read_n_sdio(struct mac_ax_adapter *adapter, u32 adr, u32 size, u8 *val); 293 /** 294 * @} 295 * @} 296 */ 297 298 /** 299 * @addtogroup HCI 300 * @{ 301 * @addtogroup SDIO 302 * @{ 303 */ 304 305 /** 306 * @brief tx_allow_sdio 307 * 308 * @param *adapter 309 * @param *info 310 * @return Please Place Description here. 311 * @retval u32 312 */ 313 u32 tx_allow_sdio(struct mac_ax_adapter *adapter, 314 struct mac_ax_sdio_tx_info *info); 315 /** 316 * @} 317 * @} 318 */ 319 320 /** 321 * @addtogroup HCI 322 * @{ 323 * @addtogroup SDIO 324 * @{ 325 */ 326 327 /** 328 * @brief tx_cmd_addr_sdio 329 * 330 * @param *adapter 331 * @param *info 332 * @param *cmd_addr 333 * @return Please Place Description here. 334 * @retval u32 335 */ 336 u32 tx_cmd_addr_sdio(struct mac_ax_adapter *adapter, 337 struct mac_ax_sdio_tx_info *info, u32 *cmd_addr); 338 /** 339 * @} 340 * @} 341 */ 342 343 /** 344 * @addtogroup HCI 345 * @{ 346 * @addtogroup SDIO 347 * @{ 348 */ 349 350 /** 351 * @brief sdio_pre_init 352 * 353 * @param *adapter 354 * @param *param 355 * @return Please Place Description here. 356 * @retval u32 357 */ 358 u32 sdio_pre_init(struct mac_ax_adapter *adapter, void *param); 359 /** 360 * @} 361 * @} 362 */ 363 364 /** 365 * @addtogroup HCI 366 * @{ 367 * @addtogroup SDIO 368 * @{ 369 */ 370 371 /** 372 * @brief sdio_init 373 * 374 * @param *adapter 375 * @param *param 376 * @return Please Place Description here. 377 * @retval u32 378 */ 379 u32 sdio_init(struct mac_ax_adapter *adapter, void *param); 380 /** 381 * @} 382 * @} 383 */ 384 385 /** 386 * @addtogroup HCI 387 * @{ 388 * @addtogroup SDIO 389 * @{ 390 */ 391 392 /** 393 * @brief sdio_deinit 394 * 395 * @param *adapter 396 * @param *param 397 * @return Please Place Description here. 398 * @retval u32 399 */ 400 u32 sdio_deinit(struct mac_ax_adapter *adapter, void *param); 401 /** 402 * @} 403 * @} 404 */ 405 406 /** 407 * @addtogroup HCI 408 * @{ 409 * @addtogroup SDIO 410 * @{ 411 */ 412 413 /** 414 * @brief r_indir_sdio 415 * 416 * @param *adapter 417 * @param adr 418 * @param size 419 * @return Please Place Description here. 420 * @retval u32 421 */ 422 423 u32 r_indir_sdio(struct mac_ax_adapter *adapter, u32 adr, 424 enum sdio_io_size size); 425 /** 426 * @} 427 * @} 428 */ 429 430 /** 431 * @addtogroup HCI 432 * @{ 433 * @addtogroup SDIO 434 * @{ 435 */ 436 437 /** 438 * @brief w_indir_sdio 439 * 440 * @param *adapter 441 * @param adr 442 * @param val 443 * @param size 444 * @return Please Place Description here. 445 * @retval void 446 */ 447 void w_indir_sdio(struct mac_ax_adapter *adapter, u32 adr, u32 val, 448 enum sdio_io_size size); 449 /** 450 * @} 451 * @} 452 */ 453 454 /** 455 * @addtogroup HCI 456 * @{ 457 * @addtogroup SDIO 458 * @{ 459 */ 460 461 /** 462 * @brief set_info_sdio 463 * 464 * @param *adapter 465 * @param *info 466 * @return Please Place Description here. 467 * @retval u32 468 */ 469 u32 set_info_sdio(struct mac_ax_adapter *adapter, 470 struct mac_ax_sdio_info *info); 471 /** 472 * @} 473 * @} 474 */ 475 476 /** 477 * @addtogroup HCI 478 * @{ 479 * @addtogroup SDIO 480 * @{ 481 */ 482 483 /** 484 * @brief tx_mode_cfg_sdio 485 * 486 * @param *adapter 487 * @param mode 488 * @return Please Place Description here. 489 * @retval u32 490 */ 491 u32 tx_mode_cfg_sdio(struct mac_ax_adapter *adapter, 492 enum mac_ax_sdio_tx_mode mode); 493 /** 494 * @} 495 * @} 496 */ 497 498 /** 499 * @addtogroup HCI 500 * @{ 501 * @addtogroup SDIO 502 * @{ 503 */ 504 505 /** 506 * @brief rx_agg_cfg_sdio 507 * 508 * @param *adapter 509 * @param *cfg 510 * @return Please Place Description here. 511 * @retval void 512 */ 513 void rx_agg_cfg_sdio(struct mac_ax_adapter *adapter, 514 struct mac_ax_rx_agg_cfg *cfg); 515 /** 516 * @} 517 * @} 518 */ 519 520 /** 521 * @addtogroup HCI 522 * @{ 523 * @addtogroup SDIO 524 * @{ 525 */ 526 527 /** 528 * @brief tx_agg_cfg_sdio 529 * 530 * @param *adapter 531 * @param *cfg 532 * @return Please Place Description here. 533 * @retval u32 534 */ 535 u32 tx_agg_cfg_sdio(struct mac_ax_adapter *adapter, 536 struct mac_ax_sdio_txagg_cfg *cfg); 537 /** 538 * @} 539 * @} 540 */ 541 542 /** 543 * @addtogroup HCI 544 * @{ 545 * @addtogroup SDIO 546 * @{ 547 */ 548 549 /** 550 * @brief aval_page_cfg_sdio 551 * 552 * @param *adapter 553 * @param *cfg 554 * @return Please Place Description here. 555 * @retval void 556 */ 557 void aval_page_cfg_sdio(struct mac_ax_adapter *adapter, 558 struct mac_ax_aval_page_cfg *cfg); 559 /** 560 * @} 561 * @} 562 */ 563 564 /** 565 * @addtogroup HCI 566 * @{ 567 * @addtogroup SDIO 568 * @{ 569 */ 570 571 /** 572 * @brief leave_suspend_sdio 573 * 574 * @param *adapter 575 * @return Please Place Description here. 576 * @retval u32 577 */ 578 u32 leave_suspend_sdio(struct mac_ax_adapter *adapter); 579 /** 580 * @} 581 * @} 582 */ 583 584 /** 585 * @addtogroup HCI 586 * @{ 587 * @addtogroup SDIO 588 * @{ 589 */ 590 591 /** 592 * @brief get_int_latency_sdio 593 * 594 * @param *adapter 595 * @return Please Place Description here. 596 * @retval u32 597 */ 598 u32 get_int_latency_sdio(struct mac_ax_adapter *adapter); 599 /** 600 * @} 601 * @} 602 */ 603 604 /** 605 * @addtogroup HCI 606 * @{ 607 * @addtogroup SDIO 608 * @{ 609 */ 610 611 /** 612 * @brief get_clk_cnt_sdio 613 * 614 * @param *adapter 615 * @param *cnt 616 * @return Please Place Description here. 617 * @retval u32 618 */ 619 u32 get_clk_cnt_sdio(struct mac_ax_adapter *adapter, u32 *cnt); 620 /** 621 * @} 622 * @} 623 */ 624 625 /** 626 * @addtogroup HCI 627 * @{ 628 * @addtogroup SDIO 629 * @{ 630 */ 631 632 /** 633 * @brief set_wt_cfg_sdio 634 * 635 * @param *adapter 636 * @param en 637 * @return Please Place Description here. 638 * @retval u32 639 */ 640 u32 set_wt_cfg_sdio(struct mac_ax_adapter *adapter, u8 en); 641 /** 642 * @} 643 * @} 644 */ 645 646 /** 647 * @addtogroup HCI 648 * @{ 649 * @addtogroup SDIO 650 * @{ 651 */ 652 653 /** 654 * @brief set_clk_mon_sdio 655 * 656 * @param *adapter 657 * @param *cfg 658 * @return Please Place Description here. 659 * @retval u32 660 */ 661 u32 set_clk_mon_sdio(struct mac_ax_adapter *adapter, 662 struct mac_ax_sdio_clk_mon_cfg *cfg); 663 /** 664 * @} 665 * @} 666 */ 667 668 /** 669 * @addtogroup HCI 670 * @{ 671 * @addtogroup SDIO 672 * @{ 673 */ 674 675 /** 676 * @brief sdio_tbl_init 677 * 678 * @param *adapter 679 * @return Please Place Description here. 680 * @retval u32 681 */ 682 u32 sdio_tbl_init(struct mac_ax_adapter *adapter); 683 /** 684 * @} 685 * @} 686 */ 687 688 /** 689 * @addtogroup HCI 690 * @{ 691 * @addtogroup SDIO 692 * @{ 693 */ 694 695 /** 696 * @brief sdio_tbl_exit 697 * 698 * @param *adapter 699 * @return Please Place Description here. 700 * @retval u32 701 */ 702 u32 sdio_tbl_exit(struct mac_ax_adapter *adapter); 703 /** 704 * @} 705 * @} 706 */ 707 708 /** 709 * @addtogroup HCI 710 * @{ 711 * @addtogroup SDIO 712 * @{ 713 */ 714 715 /** 716 * @brief sdio_pwr_switch 717 * 718 * @param *vadapter 719 * @param pre_switch 720 * @param on 721 * @return Please Place Description here. 722 * @retval u32 723 */ 724 u32 sdio_pwr_switch(void *vadapter, 725 u8 pre_switch, u8 on); 726 /** 727 * @} 728 * @} 729 */ 730 731 /** 732 * @brief sdio_pwr_switch 733 * 734 * @param *vadapter 735 * @param mac_ax_wow_ctrl 736 * @return Please Place Description here. 737 * @retval u32 738 */ 739 u32 set_sdio_wowlan(struct mac_ax_adapter *adapter, enum mac_ax_wow_ctrl w_c); 740 /** 741 * @} 742 * @} 743 */ 744 745 /** 746 * @brief sdio_get_txagg_num 747 * 748 * @param *adapter 749 * @param band 750 * @return Please Place Description here. 751 * @retval u32 752 */ 753 u32 sdio_get_txagg_num(struct mac_ax_adapter *adapter, u8 band); 754 /** 755 * @} 756 * @} 757 */ 758 759 /** 760 * @brief sdio_autok_counter_avg 761 * 762 * @param *adapter 763 * @return Please Place Description here. 764 * @retval u32 765 */ 766 u32 sdio_autok_counter_avg(struct mac_ax_adapter *adapter); 767 /** 768 * @} 769 * @} 770 */ 771 772 /** 773 * @addtogroup HCI 774 * @{ 775 * @addtogroup SDIO 776 * @{ 777 */ 778 779 /** 780 * @brief dbcc_hci_ctrl_sdio 781 * 782 * @param *adapter 783 * @param *info 784 * @return Please Place Description here. 785 * @retval u32 786 */ 787 u32 dbcc_hci_ctrl_sdio(struct mac_ax_adapter *adapter, 788 struct mac_ax_dbcc_hci_ctrl *info); 789 /** 790 * @} 791 * @} 792 */ 793 #endif /*MAC_AX_SDIO_SUPPORT*/ 794 #endif 795