rtl8821c_mac.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2016 - 2017 Realtek Corporation.
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of version 2 of the GNU General Public License as
  7. * published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. *
  14. *****************************************************************************/
  15. #define _RTL8821C_MAC_C_
  16. #include <drv_types.h> /* PADAPTER, basic_types.h and etc. */
  17. #include <hal_data.h> /* HAL_DATA_TYPE */
  18. #include "../hal_halmac.h" /* Register Definition and etc. */
  19. #ifdef CONFIG_XMIT_ACK
  20. inline u8 rtl8821c_set_mgnt_xmit_ack(_adapter *adapter)
  21. {
  22. int err;
  23. /*ack for xmit mgmt frames.*/
  24. err = rtw_write32(adapter, REG_FWHW_TXQ_CTRL_8821C, rtw_read32(adapter, REG_FWHW_TXQ_CTRL_8821C) | BIT(12));
  25. if (err == _FAIL)
  26. return _FAIL;
  27. return _SUCCESS;
  28. }
  29. #endif
  30. inline u8 rtl8821c_rx_ba_ssn_appended(PADAPTER p)
  31. {
  32. return rtw_hal_rcr_check(p, BIT_APP_BASSN_8821C);
  33. }
  34. inline u8 rtl8821c_rx_fcs_append_switch(PADAPTER p, u8 enable)
  35. {
  36. u32 rcr_bit;
  37. u8 ret = _TRUE;
  38. rcr_bit = BIT_APP_FCS_8821C;
  39. if (_TRUE == enable)
  40. ret = rtw_hal_rcr_add(p, rcr_bit);
  41. else
  42. ret = rtw_hal_rcr_clear(p, rcr_bit);
  43. return ret;
  44. }
  45. inline u8 rtl8821c_rx_fcs_appended(PADAPTER p)
  46. {
  47. return rtw_hal_rcr_check(p, BIT_APP_FCS_8821C);
  48. }
  49. u8 rtl8821c_rx_tsf_addr_filter_config(_adapter *adapter, u8 config)
  50. {
  51. u8 v8;
  52. int err;
  53. v8 = GET_HAL_DATA(adapter)->rx_tsf_addr_filter_config;
  54. if (v8 != config) {
  55. err = rtw_write8(adapter, REG_NAN_RX_TSF_FILTER_8821C, config);
  56. if (_FAIL == err)
  57. return _FALSE;
  58. }
  59. GET_HAL_DATA(adapter)->rx_tsf_addr_filter_config = config;
  60. return _TRUE;
  61. }
  62. /*
  63. * Return:
  64. * _SUCCESS Download Firmware OK.
  65. * _FAIL Download Firmware FAIL!
  66. */
  67. s32 rtl8821c_fw_dl(PADAPTER adapter, u8 wowlan)
  68. {
  69. struct dvobj_priv *d = adapter_to_dvobj(adapter);
  70. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  71. int err;
  72. u8 fw_bin = _TRUE;
  73. #ifdef CONFIG_FILE_FWIMG
  74. fw_bin = _TRUE;
  75. if (_TRUE == wowlan) {
  76. rtw_get_phy_file_path(adapter, MAC_FILE_FW_WW_IMG);
  77. err = rtw_halmac_dlfw_from_file(d, rtw_phy_para_file_path);
  78. } else {
  79. rtw_get_phy_file_path(adapter, MAC_FILE_FW_NIC);
  80. err = rtw_halmac_dlfw_from_file(d, rtw_phy_para_file_path);
  81. }
  82. #else
  83. fw_bin = _FALSE;
  84. #ifdef CONFIG_WOWLAN
  85. if (_TRUE == wowlan)
  86. err = rtw_halmac_dlfw(d, array_mp_8821c_fw_wowlan, array_length_mp_8821c_fw_wowlan);
  87. else
  88. #endif
  89. err = rtw_halmac_dlfw(d, array_mp_8821c_fw_nic, array_length_mp_8821c_fw_nic);
  90. #endif
  91. if (!err) {
  92. hal_data->bFWReady = _TRUE;
  93. hal_data->fw_ractrl = _TRUE;
  94. RTW_INFO("%s Download Firmware from %s success\n", __func__, (fw_bin) ? "file" : "array");
  95. RTW_INFO("%s FW Version:%d SubVersion:%d\n", (wowlan) ? "WOW" : "NIC", hal_data->firmware_version, hal_data->firmware_sub_version);
  96. return _SUCCESS;
  97. } else {
  98. RTW_ERR("%s Download Firmware from %s failed\n", __func__, (fw_bin) ? "file" : "array");
  99. return _FAIL;
  100. }
  101. }
  102. /*
  103. * Return:
  104. * _SUCCESS Download Firmware MEM OK.
  105. * _FAIL Download Firmware MEM FAIL!
  106. */
  107. s32 rtl8821c_fw_mem_dl(PADAPTER adapter, enum fw_mem mem)
  108. {
  109. struct dvobj_priv *d = adapter_to_dvobj(adapter);
  110. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  111. int err = 0;
  112. u8 fw_bin = _TRUE;
  113. #ifdef CONFIG_FILE_FWIMG
  114. fw_bin = _TRUE;
  115. rtw_get_phy_file_path(adapter, MAC_FILE_FW_NIC);
  116. err = rtw_halmac_dlfw_mem_from_file(d, rtw_phy_para_file_path, mem);
  117. #else
  118. fw_bin = _FALSE;
  119. err = rtw_halmac_dlfw_mem(d, array_mp_8821c_fw_nic, array_length_mp_8821c_fw_nic, mem);
  120. #endif
  121. if (err) {
  122. RTW_ERR("%s Download Firmware MEM from %s failed\n", __func__, (fw_bin) ? "file" : "array");
  123. return _FAIL;
  124. }
  125. RTW_INFO("%s Download Firmware MEM from %s success\n", __func__, (fw_bin) ? "file" : "array");
  126. return _SUCCESS;
  127. }
  128. #ifdef CONFIG_AMPDU_PRETX_CD
  129. #include "rtl8821c.h"
  130. #define AMPDU_NUMBER 0x3F3F /*MAX AMPDU Number = 63*/
  131. #define REG_PRECNT_CTRL_8821C 0x04E5
  132. #define BIT_EN_PRECNT_8821C BIT(11)
  133. #define PRECNT_TH 0x1E4 /*6.05us*/
  134. /* pre-tx count-down mechanism */
  135. void rtl8821c_pretx_cd_config(_adapter *adapter)
  136. {
  137. u8 burst_mode;
  138. u16 pre_cnt = PRECNT_TH | BIT_EN_PRECNT_8821C;
  139. /*Enable AMPDU PRE-TX, Reg0x4BC[6] = 1*/
  140. burst_mode = rtw_read8(adapter, REG_SW_AMPDU_BURST_MODE_CTRL_8821C);
  141. if (!(burst_mode & BIT_PRE_TX_CMD_8821C)) {
  142. burst_mode |= BIT_PRE_TX_CMD_8821C;
  143. rtw_write8(adapter, REG_SW_AMPDU_BURST_MODE_CTRL_8821C, burst_mode);
  144. }
  145. /*MAX AMPDU Number = 63, Reg0x4C8[21:16] = 0x3F*/
  146. rtw_write16(adapter, REG_PROT_MODE_CTRL_8821C + 2, AMPDU_NUMBER);
  147. /*Reg0x4E5[11] = 1, Reg0x4E5[10:0] = 0x1E4 */
  148. rtw_write8(adapter, REG_PRECNT_CTRL_8821C, (u8)(pre_cnt & 0xFF));
  149. rtw_write8(adapter, (REG_PRECNT_CTRL_8821C + 1), (u8)(pre_cnt >> 8));
  150. #if (defined(DBG_PRE_TX_HANG) && (defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)))
  151. rtw_write32(adapter, REG_HIMR1_8821C ,
  152. (rtw_read32(adapter, REG_HIMR1_8821C) | BIT_PRETXERR_HANDLE_IMR));
  153. #endif
  154. }
  155. #endif /*CONFIG_AMPDU_PRETX_CD*/