rtl8821ce_halinit.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2015 - 2016 Realtek Corporation. All rights reserved.
  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. * You should have received a copy of the GNU General Public License along with
  15. * this program; if not, write to the Free Software Foundation, Inc.,
  16. * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  17. *
  18. *
  19. ******************************************************************************/
  20. #define _RTL8821CE_HALINIT_C_
  21. #include <drv_types.h> /* PADAPTER, basic_types.h and etc. */
  22. #include <hal_data.h> /* HAL_DATA_TYPE */
  23. #include "../rtl8821c.h"
  24. #include "rtl8821ce.h"
  25. u32 InitMAC_TRXBD_8821CE(PADAPTER Adapter)
  26. {
  27. u8 tmpU1b;
  28. u16 tmpU2b;
  29. u32 tmpU4b;
  30. int q_idx;
  31. struct recv_priv *precvpriv = &Adapter->recvpriv;
  32. struct xmit_priv *pxmitpriv = &Adapter->xmitpriv;
  33. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  34. RTW_INFO("=======>InitMAC_TXBD_8821CE()\n");
  35. /*
  36. * Set CMD TX BD (buffer descriptor) physical address(from OS API).
  37. */
  38. rtw_write32(Adapter, REG_H2CQ_TXBD_DESA_8821C,
  39. (u64)pxmitpriv->tx_ring[TXCMD_QUEUE_INX].dma &
  40. DMA_BIT_MASK(32));
  41. rtw_write32(Adapter, REG_H2CQ_TXBD_NUM_8821C,
  42. TX_BD_NUM_8821CE_CMD | ((RTL8821CE_SEG_NUM << 12) &
  43. 0x3000));
  44. #ifdef CONFIG_64BIT_DMA
  45. rtw_write32(Adapter, REG_H2CQ_TXBD_DESA_8821C + 4,
  46. ((u64)pxmitpriv->tx_ring[TXCMD_QUEUE_INX].dma) >> 32);
  47. #endif
  48. /*
  49. * Set TX/RX BD (buffer descriptor) physical address(from OS API).
  50. */
  51. rtw_write32(Adapter, REG_BCNQ_TXBD_DESA_8821C,
  52. (u64)pxmitpriv->tx_ring[BCN_QUEUE_INX].dma &
  53. DMA_BIT_MASK(32));
  54. rtw_write32(Adapter, REG_MGQ_TXBD_DESA_8821C,
  55. (u64)pxmitpriv->tx_ring[MGT_QUEUE_INX].dma &
  56. DMA_BIT_MASK(32));
  57. rtw_write32(Adapter, REG_VOQ_TXBD_DESA_8821C,
  58. (u64)pxmitpriv->tx_ring[VO_QUEUE_INX].dma &
  59. DMA_BIT_MASK(32));
  60. rtw_write32(Adapter, REG_VIQ_TXBD_DESA_8821C,
  61. (u64)pxmitpriv->tx_ring[VI_QUEUE_INX].dma &
  62. DMA_BIT_MASK(32));
  63. rtw_write32(Adapter, REG_BEQ_TXBD_DESA_8821C,
  64. (u64)pxmitpriv->tx_ring[BE_QUEUE_INX].dma &
  65. DMA_BIT_MASK(32));
  66. /* vincent sync windows */
  67. tmpU4b = rtw_read32(Adapter, REG_BEQ_TXBD_DESA_8821C);
  68. rtw_write32(Adapter, REG_BKQ_TXBD_DESA_8821C,
  69. (u64)pxmitpriv->tx_ring[BK_QUEUE_INX].dma &
  70. DMA_BIT_MASK(32));
  71. rtw_write32(Adapter, REG_HI0Q_TXBD_DESA_8821C,
  72. (u64)pxmitpriv->tx_ring[HIGH_QUEUE_INX].dma &
  73. DMA_BIT_MASK(32));
  74. rtw_write32(Adapter, REG_RXQ_RXBD_DESA_8821C,
  75. (u64)precvpriv->rx_ring[RX_MPDU_QUEUE].dma &
  76. DMA_BIT_MASK(32));
  77. #ifdef CONFIG_64BIT_DMA
  78. /*
  79. * 2009/10/28 MH For DMA 64 bits. We need to assign the high
  80. * 32 bit address for NIC HW to transmit data to correct path.
  81. */
  82. rtw_write32(Adapter, REG_BCNQ_TXBD_DESA_8821C + 4,
  83. ((u64)pxmitpriv->tx_ring[BCN_QUEUE_INX].dma) >> 32);
  84. rtw_write32(Adapter, REG_MGQ_TXBD_DESA_8821C + 4,
  85. ((u64)pxmitpriv->tx_ring[MGT_QUEUE_INX].dma) >> 32);
  86. rtw_write32(Adapter, REG_VOQ_TXBD_DESA_8821C + 4,
  87. ((u64)pxmitpriv->tx_ring[VO_QUEUE_INX].dma) >> 32);
  88. rtw_write32(Adapter, REG_VIQ_TXBD_DESA_8821C + 4,
  89. ((u64)pxmitpriv->tx_ring[VI_QUEUE_INX].dma) >> 32);
  90. rtw_write32(Adapter, REG_BEQ_TXBD_DESA_8821C + 4,
  91. ((u64)pxmitpriv->tx_ring[BE_QUEUE_INX].dma) >> 32);
  92. rtw_write32(Adapter, REG_BKQ_TXBD_DESA_8821C + 4,
  93. ((u64)pxmitpriv->tx_ring[BK_QUEUE_INX].dma) >> 32);
  94. rtw_write32(Adapter, REG_HI0Q_TXBD_DESA_8821C + 4,
  95. ((u64)pxmitpriv->tx_ring[HIGH_QUEUE_INX].dma) >> 32);
  96. rtw_write32(Adapter, REG_RXQ_RXBD_DESA_8821C + 4,
  97. ((u64)precvpriv->rx_ring[RX_MPDU_QUEUE].dma) >> 32);
  98. /* 2009/10/28 MH If RX descriptor address is not equal to zero.
  99. * We will enable DMA 64 bit functuion.
  100. * Note: We never saw thd consition which the descripto address are
  101. * divided into 4G down and 4G upper separate area.
  102. */
  103. if (((u64)precvpriv->rx_ring[RX_MPDU_QUEUE].dma) >> 32 != 0) {
  104. RTW_INFO("Enable DMA64 bit\n");
  105. /* Check if other descriptor address is zero and
  106. * abnormally be in 4G lower area.
  107. */
  108. if (((u64)pxmitpriv->tx_ring[MGT_QUEUE_INX].dma) >> 32)
  109. RTW_INFO("MGNT_QUEUE HA=0\n");
  110. PlatformEnableDMA64(Adapter);
  111. } else
  112. RTW_INFO("Enable DMA32 bit\n");
  113. #endif
  114. /* pci buffer descriptor mode: Reset the Read/Write point to 0 */
  115. PlatformEFIOWrite4Byte(Adapter, REG_TSFTIMER_HCI_8821C, 0x3fffffff);
  116. /* Reset the H2CQ R/W point index to 0 */
  117. tmpU4b = rtw_read32(Adapter, REG_H2CQ_CSR_8821C);
  118. rtw_write32(Adapter, REG_H2CQ_CSR_8821C, (tmpU4b | BIT8 | BIT16));
  119. tmpU1b = rtw_read8(Adapter, REG_PCIE_CTRL + 3);
  120. rtw_write8(Adapter, REG_PCIE_CTRL + 3, (tmpU1b | 0xF7));
  121. /* 20100318 Joseph: Reset interrupt migration setting
  122. * when initialization. Suggested by SD1
  123. */
  124. rtw_write32(Adapter, REG_INT_MIG, 0);
  125. pHalData->bInterruptMigration = _FALSE;
  126. /* 2009.10.19. Reset H2C protection register. by tynli. */
  127. rtw_write32(Adapter, REG_MCUTST_I_8821C, 0x0);
  128. #if MP_DRIVER == 1
  129. if (Adapter->registrypriv.mp_mode == 1) {
  130. rtw_write32(Adapter, REG_MACID, 0x87654321);
  131. rtw_write32(Adapter, 0x0700, 0x87654321);
  132. }
  133. #endif
  134. /* pic buffer descriptor mode: */
  135. /* ---- tx */
  136. rtw_write16(Adapter, REG_MGQ_TXBD_NUM_8821C,
  137. TX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 12) & 0x3000));
  138. rtw_write16(Adapter, REG_VOQ_TXBD_NUM_8821C,
  139. TX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 12) & 0x3000));
  140. rtw_write16(Adapter, REG_VIQ_TXBD_NUM_8821C,
  141. TX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 12) & 0x3000));
  142. rtw_write16(Adapter, REG_BEQ_TXBD_NUM_8821C,
  143. TX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 12) & 0x3000));
  144. rtw_write16(Adapter, REG_BKQ_TXBD_NUM_8821C,
  145. TX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 12) & 0x3000));
  146. rtw_write16(Adapter, REG_HI0Q_TXBD_NUM_8821C,
  147. TX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 12) & 0x3000));
  148. rtw_write16(Adapter, REG_HI1Q_TXBD_NUM_8821C,
  149. TX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 12) & 0x3000));
  150. rtw_write16(Adapter, REG_HI2Q_TXBD_NUM_8821C,
  151. TX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 12) & 0x3000));
  152. rtw_write16(Adapter, REG_HI3Q_TXBD_NUM_8821C,
  153. TX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 12) & 0x3000));
  154. rtw_write16(Adapter, REG_HI4Q_TXBD_NUM_8821C,
  155. TX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 12) & 0x3000));
  156. rtw_write16(Adapter, REG_HI5Q_TXBD_NUM_8821C,
  157. TX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 12) & 0x3000));
  158. rtw_write16(Adapter, REG_HI6Q_TXBD_NUM_8821C,
  159. TX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 12) & 0x3000));
  160. rtw_write16(Adapter, REG_HI7Q_TXBD_NUM_8821C,
  161. TX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 12) & 0x3000));
  162. /* rx. support 32 bits in linux */
  163. /* using 64bit
  164. * rtw_write16(Adapter, REG_RX_RXBD_NUM_8821C,
  165. * RX_BD_NUM_8821CE |((RTL8821CE_SEG_NUM<<13 ) & 0x6000) |0x8000);
  166. */
  167. /* using 32bit */
  168. rtw_write16(Adapter, REG_RX_RXBD_NUM_8821C,
  169. RX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 13) & 0x6000));
  170. /* reset read/write point */
  171. rtw_write32(Adapter, REG_TSFTIMER_HCI_8821C, 0XFFFFFFFF);
  172. #if 1 /* vincent windows */
  173. /* Start debug mode */
  174. {
  175. u8 reg0x3f3 = 0;
  176. reg0x3f3 = rtw_read8(Adapter, 0x3f3);
  177. rtw_write8(Adapter, 0x3f3, reg0x3f3 | BIT2);
  178. }
  179. {
  180. /* Need to disable BT coex to let MP tool Tx, this would be done in FW
  181. * in the future, suggest by ChunChu, 2015.05.19
  182. */
  183. u8 tmp1Byte;
  184. u16 tmp2Byte;
  185. u32 tmp4Byte;
  186. tmp2Byte = rtw_read16(Adapter, REG_SYS_FUNC_EN_8821C);
  187. rtw_write16(Adapter, REG_SYS_FUNC_EN_8821C, tmp2Byte | BIT10);
  188. tmp1Byte = rtw_read8(Adapter, REG_DIS_TXREQ_CLR_8821C);
  189. rtw_write8(Adapter, REG_DIS_TXREQ_CLR_8821C, tmp1Byte | BIT7);
  190. tmp4Byte = rtw_read32(Adapter, 0x1080);
  191. rtw_write32(Adapter, 0x1080, tmp4Byte | BIT16);
  192. }
  193. #endif
  194. RTW_INFO("InitMAC_TXBD_8821CE() <====\n");
  195. return _SUCCESS;
  196. }
  197. u32 rtl8821ce_hal_init(PADAPTER padapter)
  198. {
  199. u8 ok = _TRUE;
  200. u8 val8;
  201. PHAL_DATA_TYPE hal;
  202. struct registry_priv *registry_par;
  203. hal = GET_HAL_DATA(padapter);
  204. registry_par = &padapter->registrypriv;
  205. InitMAC_TRXBD_8821CE(padapter);
  206. ok = rtl8821c_hal_init(padapter);
  207. if (ok == _FALSE)
  208. return _FAIL;
  209. #if defined(USING_RX_TAG)
  210. /* have to init after halmac init */
  211. val8 = rtw_read8(padapter, REG_PCIE_CTRL_8821C + 2);
  212. rtw_write8(padapter, REG_PCIE_CTRL_8821C + 2, (val8 | BIT4));
  213. rtw_write16(padapter, REG_PCIE_CTRL_8821C, 0x8000);
  214. #else
  215. rtw_write16(padapter, REG_PCIE_CTRL_8821C, 0x0000);
  216. #endif
  217. rtw_write8(padapter, REG_RX_DRVINFO_SZ_8821C, 0x4);
  218. hal->pci_backdoor_ctrl = registry_par->pci_aspm_config;
  219. rtw_pci_aspm_config(padapter);
  220. return _SUCCESS;
  221. }
  222. void rtl8821ce_init_default_value(PADAPTER padapter)
  223. {
  224. PHAL_DATA_TYPE pHalData;
  225. pHalData = GET_HAL_DATA(padapter);
  226. rtl8821c_init_default_value(padapter);
  227. /* interface related variable */
  228. pHalData->CurrentWirelessMode = WIRELESS_MODE_AUTO;
  229. pHalData->bDefaultAntenna = 1;
  230. pHalData->TransmitConfig = BIT_CFEND_FORMAT | BIT_WMAC_TCR_ERRSTEN_3;
  231. /* Set RCR-Receive Control Register .
  232. * The value is set in InitializeAdapter8190Pci().
  233. */
  234. pHalData->ReceiveConfig = (
  235. #ifdef CONFIG_RX_PACKET_APPEND_FCS
  236. BIT_APP_FCS |
  237. #endif
  238. BIT_APP_MIC |
  239. BIT_APP_ICV |
  240. BIT_APP_PHYSTS |
  241. BIT_VHT_DACK |
  242. BIT_HTC_LOC_CTRL |
  243. /* BIT_AMF | */
  244. BIT_CBSSID_DATA |
  245. BIT_CBSSID_BCN |
  246. /* BIT_ACF | */
  247. /* BIT_ADF | PS-Poll filter */
  248. BIT_AB |
  249. BIT_AB |
  250. BIT_APM |
  251. 0);
  252. /*
  253. * Set default value of Interrupt Mask Register0
  254. */
  255. pHalData->IntrMaskDefault[0] = (u32)(
  256. BIT(29) | /* BIT_PSTIMEOUT */
  257. BIT(27) | /* BIT_GTINT3 */
  258. BIT_TXBCN0ERR_MSK |
  259. BIT_TXBCN0OK_MSK |
  260. BIT_BCNDMAINT0_MSK |
  261. BIT_HSISR_IND_ON_INT_MSK |
  262. BIT_C2HCMD_MSK |
  263. BIT_HIGHDOK_MSK |
  264. BIT_MGTDOK_MSK |
  265. BIT_BKDOK_MSK |
  266. BIT_BEDOK_MSK |
  267. BIT_VIDOK_MSK |
  268. BIT_VODOK_MSK |
  269. BIT_RDU_MSK |
  270. BIT_RXOK_MSK |
  271. 0);
  272. /*
  273. * Set default value of Interrupt Mask Register1
  274. */
  275. pHalData->IntrMaskDefault[1] = (u32)(
  276. BIT(9) | /* TXFOVW */
  277. BIT_FOVW_MSK |
  278. 0);
  279. /*
  280. * Set default value of Interrupt Mask Register3
  281. */
  282. pHalData->IntrMaskDefault[3] = (u32)(
  283. BIT_SETH2CDOK_MASK | /* H2C_TX_OK */
  284. 0);
  285. /* 2012/03/27 hpfan Add for win8 DTM DPC ISR test */
  286. pHalData->IntrMaskReg[0] = (u32)(
  287. BIT_RDU_MSK |
  288. BIT(29) | /* BIT_PSTIMEOUT */
  289. 0);
  290. pHalData->IntrMaskReg[1] = (u32)(
  291. BIT_C2HCMD_MSK |
  292. 0);
  293. pHalData->IntrMask[0] = pHalData->IntrMaskDefault[0];
  294. pHalData->IntrMask[1] = pHalData->IntrMaskDefault[1];
  295. pHalData->IntrMask[3] = pHalData->IntrMaskDefault[3];
  296. }
  297. static void hal_deinit_misc(PADAPTER padapter)
  298. {
  299. }
  300. u32 rtl8821ce_hal_deinit(PADAPTER padapter)
  301. {
  302. struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);
  303. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  304. struct dvobj_priv *pobj_priv = adapter_to_dvobj(padapter);
  305. u8 status = _TRUE;
  306. RTW_INFO("==> %s\n", __func__);
  307. hal_deinit_misc(padapter);
  308. status = rtl8821c_hal_deinit(padapter);
  309. if (status == _FALSE) {
  310. RTW_INFO("%s: rtl8821c_hal_deinit fail\n", __func__);
  311. return _FAIL;
  312. }
  313. RTW_INFO("%s <==\n", __func__);
  314. return _SUCCESS;
  315. }