rtl8821ce_halinit.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  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 _RTL8821CE_HALINIT_C_
  16. #include <drv_types.h> /* PADAPTER, basic_types.h and etc. */
  17. #include <hal_data.h> /* HAL_DATA_TYPE */
  18. #include "../rtl8821c.h"
  19. #include "rtl8821ce.h"
  20. u32 InitMAC_TRXBD_8821CE(PADAPTER Adapter)
  21. {
  22. u8 tmpU1b;
  23. u16 tmpU2b;
  24. u32 tmpU4b;
  25. int q_idx;
  26. struct recv_priv *precvpriv = &Adapter->recvpriv;
  27. struct xmit_priv *pxmitpriv = &Adapter->xmitpriv;
  28. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  29. RTW_INFO("=======>InitMAC_TXBD_8821CE()\n");
  30. /*
  31. * Set CMD TX BD (buffer descriptor) physical address(from OS API).
  32. */
  33. rtw_write32(Adapter, REG_H2CQ_TXBD_DESA_8821C,
  34. (u64)pxmitpriv->tx_ring[TXCMD_QUEUE_INX].dma &
  35. DMA_BIT_MASK(32));
  36. rtw_write32(Adapter, REG_H2CQ_TXBD_NUM_8821C,
  37. TX_BD_NUM_8821CE_CMD | ((RTL8821CE_SEG_NUM << 12) &
  38. 0x3000));
  39. #ifdef CONFIG_64BIT_DMA
  40. rtw_write32(Adapter, REG_H2CQ_TXBD_DESA_8821C + 4,
  41. ((u64)pxmitpriv->tx_ring[TXCMD_QUEUE_INX].dma) >> 32);
  42. #endif
  43. /*
  44. * Set TX/RX BD (buffer descriptor) physical address(from OS API).
  45. */
  46. rtw_write32(Adapter, REG_BCNQ_TXBD_DESA_8821C,
  47. (u64)pxmitpriv->tx_ring[BCN_QUEUE_INX].dma &
  48. DMA_BIT_MASK(32));
  49. rtw_write32(Adapter, REG_MGQ_TXBD_DESA_8821C,
  50. (u64)pxmitpriv->tx_ring[MGT_QUEUE_INX].dma &
  51. DMA_BIT_MASK(32));
  52. rtw_write32(Adapter, REG_VOQ_TXBD_DESA_8821C,
  53. (u64)pxmitpriv->tx_ring[VO_QUEUE_INX].dma &
  54. DMA_BIT_MASK(32));
  55. rtw_write32(Adapter, REG_VIQ_TXBD_DESA_8821C,
  56. (u64)pxmitpriv->tx_ring[VI_QUEUE_INX].dma &
  57. DMA_BIT_MASK(32));
  58. rtw_write32(Adapter, REG_BEQ_TXBD_DESA_8821C,
  59. (u64)pxmitpriv->tx_ring[BE_QUEUE_INX].dma &
  60. DMA_BIT_MASK(32));
  61. /* vincent sync windows */
  62. tmpU4b = rtw_read32(Adapter, REG_BEQ_TXBD_DESA_8821C);
  63. rtw_write32(Adapter, REG_BKQ_TXBD_DESA_8821C,
  64. (u64)pxmitpriv->tx_ring[BK_QUEUE_INX].dma &
  65. DMA_BIT_MASK(32));
  66. rtw_write32(Adapter, REG_HI0Q_TXBD_DESA_8821C,
  67. (u64)pxmitpriv->tx_ring[HIGH_QUEUE_INX].dma &
  68. DMA_BIT_MASK(32));
  69. rtw_write32(Adapter, REG_RXQ_RXBD_DESA_8821C,
  70. (u64)precvpriv->rx_ring[RX_MPDU_QUEUE].dma &
  71. DMA_BIT_MASK(32));
  72. #ifdef CONFIG_64BIT_DMA
  73. /*
  74. * 2009/10/28 MH For DMA 64 bits. We need to assign the high
  75. * 32 bit address for NIC HW to transmit data to correct path.
  76. */
  77. rtw_write32(Adapter, REG_BCNQ_TXBD_DESA_8821C + 4,
  78. ((u64)pxmitpriv->tx_ring[BCN_QUEUE_INX].dma) >> 32);
  79. rtw_write32(Adapter, REG_MGQ_TXBD_DESA_8821C + 4,
  80. ((u64)pxmitpriv->tx_ring[MGT_QUEUE_INX].dma) >> 32);
  81. rtw_write32(Adapter, REG_VOQ_TXBD_DESA_8821C + 4,
  82. ((u64)pxmitpriv->tx_ring[VO_QUEUE_INX].dma) >> 32);
  83. rtw_write32(Adapter, REG_VIQ_TXBD_DESA_8821C + 4,
  84. ((u64)pxmitpriv->tx_ring[VI_QUEUE_INX].dma) >> 32);
  85. rtw_write32(Adapter, REG_BEQ_TXBD_DESA_8821C + 4,
  86. ((u64)pxmitpriv->tx_ring[BE_QUEUE_INX].dma) >> 32);
  87. rtw_write32(Adapter, REG_BKQ_TXBD_DESA_8821C + 4,
  88. ((u64)pxmitpriv->tx_ring[BK_QUEUE_INX].dma) >> 32);
  89. rtw_write32(Adapter, REG_HI0Q_TXBD_DESA_8821C + 4,
  90. ((u64)pxmitpriv->tx_ring[HIGH_QUEUE_INX].dma) >> 32);
  91. rtw_write32(Adapter, REG_RXQ_RXBD_DESA_8821C + 4,
  92. ((u64)precvpriv->rx_ring[RX_MPDU_QUEUE].dma) >> 32);
  93. #if 0
  94. /* 2009/10/28 MH If RX descriptor address is not equal to zero.
  95. * We will enable DMA 64 bit functuion.
  96. * Note: We never saw thd consition which the descripto address are
  97. * divided into 4G down and 4G upper separate area.
  98. */
  99. if (((u64)precvpriv->rx_ring[RX_MPDU_QUEUE].dma) >> 32 != 0) {
  100. RTW_INFO("Enable DMA64 bit\n");
  101. /* Check if other descriptor address is zero and
  102. * abnormally be in 4G lower area.
  103. */
  104. if (((u64)pxmitpriv->tx_ring[MGT_QUEUE_INX].dma) >> 32)
  105. RTW_INFO("MGNT_QUEUE HA=0\n");
  106. } else
  107. RTW_INFO("Enable DMA32 bit\n");
  108. #endif
  109. if (adapter_to_dvobj(Adapter)->bdma64)
  110. PlatformEnableDMA64(Adapter);
  111. #endif
  112. /* pci buffer descriptor mode: Reset the Read/Write point to 0 */
  113. PlatformEFIOWrite4Byte(Adapter, REG_TSFTIMER_HCI_8821C, 0x3fffffff);
  114. /* Reset the H2CQ R/W point index to 0 */
  115. tmpU4b = rtw_read32(Adapter, REG_H2CQ_CSR_8821C);
  116. rtw_write32(Adapter, REG_H2CQ_CSR_8821C, (tmpU4b | BIT8 | BIT16));
  117. tmpU1b = rtw_read8(Adapter, REG_PCIE_CTRL + 3);
  118. rtw_write8(Adapter, REG_PCIE_CTRL + 3, (tmpU1b | 0xF7));
  119. /* 20100318 Joseph: Reset interrupt migration setting
  120. * when initialization. Suggested by SD1
  121. */
  122. rtw_write32(Adapter, REG_INT_MIG, 0);
  123. pHalData->bInterruptMigration = _FALSE;
  124. /* 2009.10.19. Reset H2C protection register. by tynli. */
  125. rtw_write32(Adapter, REG_MCUTST_I_8821C, 0x0);
  126. #if MP_DRIVER == 1
  127. if (Adapter->registrypriv.mp_mode == 1) {
  128. rtw_write32(Adapter, REG_MACID, 0x87654321);
  129. rtw_write32(Adapter, 0x0700, 0x87654321);
  130. }
  131. #endif
  132. /* pic buffer descriptor mode: */
  133. /* ---- tx */
  134. rtw_write16(Adapter, REG_MGQ_TXBD_NUM_8821C,
  135. TX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 12) & 0x3000));
  136. rtw_write16(Adapter, REG_VOQ_TXBD_NUM_8821C,
  137. TX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 12) & 0x3000));
  138. rtw_write16(Adapter, REG_VIQ_TXBD_NUM_8821C,
  139. TX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 12) & 0x3000));
  140. rtw_write16(Adapter, REG_BEQ_TXBD_NUM_8821C,
  141. TX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 12) & 0x3000));
  142. rtw_write16(Adapter, REG_BKQ_TXBD_NUM_8821C,
  143. TX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 12) & 0x3000));
  144. rtw_write16(Adapter, REG_HI0Q_TXBD_NUM_8821C,
  145. TX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 12) & 0x3000));
  146. rtw_write16(Adapter, REG_HI1Q_TXBD_NUM_8821C,
  147. TX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 12) & 0x3000));
  148. rtw_write16(Adapter, REG_HI2Q_TXBD_NUM_8821C,
  149. TX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 12) & 0x3000));
  150. rtw_write16(Adapter, REG_HI3Q_TXBD_NUM_8821C,
  151. TX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 12) & 0x3000));
  152. rtw_write16(Adapter, REG_HI4Q_TXBD_NUM_8821C,
  153. TX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 12) & 0x3000));
  154. rtw_write16(Adapter, REG_HI5Q_TXBD_NUM_8821C,
  155. TX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 12) & 0x3000));
  156. rtw_write16(Adapter, REG_HI6Q_TXBD_NUM_8821C,
  157. TX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 12) & 0x3000));
  158. rtw_write16(Adapter, REG_HI7Q_TXBD_NUM_8821C,
  159. TX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 12) & 0x3000));
  160. /* rx. support 32 bits in linux */
  161. #ifdef CONFIG_64BIT_DMA
  162. /* using 64bit */
  163. rtw_write16(Adapter, REG_RX_RXBD_NUM_8821C,
  164. RX_BD_NUM_8821CE |((RTL8821CE_SEG_NUM<<13 ) & 0x6000) |0x8000);
  165. #else
  166. /* using 32bit */
  167. rtw_write16(Adapter, REG_RX_RXBD_NUM_8821C,
  168. RX_BD_NUM_8821CE | ((RTL8821CE_SEG_NUM << 13) & 0x6000));
  169. #endif
  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. /* MAX AMPDU Number = 43, Reg0x4C8[21:16] = 0x2B */
  219. rtw_write16(padapter, REG_PROT_MODE_CTRL_8821C + 2, 0x2B2B);
  220. hal->pci_backdoor_ctrl = registry_par->pci_aspm_config;
  221. rtw_pci_aspm_config(padapter);
  222. return _SUCCESS;
  223. }
  224. void rtl8821ce_init_default_value(PADAPTER padapter)
  225. {
  226. PHAL_DATA_TYPE pHalData;
  227. pHalData = GET_HAL_DATA(padapter);
  228. rtl8821c_init_default_value(padapter);
  229. /* interface related variable */
  230. pHalData->CurrentWirelessMode = WIRELESS_MODE_AUTO;
  231. pHalData->bDefaultAntenna = 1;
  232. pHalData->TransmitConfig = BIT_CFEND_FORMAT | BIT_WMAC_TCR_ERRSTEN_3;
  233. /* Set RCR-Receive Control Register .
  234. * The value is set in InitializeAdapter8190Pci().
  235. */
  236. pHalData->ReceiveConfig = (
  237. #ifdef CONFIG_RX_PACKET_APPEND_FCS
  238. BIT_APP_FCS |
  239. #endif
  240. BIT_APP_MIC |
  241. BIT_APP_ICV |
  242. BIT_APP_PHYSTS |
  243. BIT_VHT_DACK |
  244. BIT_HTC_LOC_CTRL |
  245. /* BIT_AMF | */
  246. BIT_CBSSID_DATA |
  247. BIT_CBSSID_BCN |
  248. /* BIT_ACF | */
  249. /* BIT_ADF | PS-Poll filter */
  250. BIT_AB |
  251. BIT_AB |
  252. BIT_APM |
  253. 0);
  254. /*
  255. * Set default value of Interrupt Mask Register0
  256. */
  257. pHalData->IntrMaskDefault[0] = (u32)(
  258. BIT(29) | /* BIT_PSTIMEOUT */
  259. BIT(27) | /* BIT_GTINT3 */
  260. BIT_TXBCN0ERR_MSK |
  261. BIT_TXBCN0OK_MSK |
  262. BIT_BCNDMAINT0_MSK |
  263. BIT_HSISR_IND_ON_INT_MSK |
  264. BIT_C2HCMD_MSK |
  265. #ifdef CONFIG_LPS_LCLK
  266. BIT_CPWM_MSK |
  267. #endif
  268. BIT_HIGHDOK_MSK |
  269. BIT_MGTDOK_MSK |
  270. BIT_BKDOK_MSK |
  271. BIT_BEDOK_MSK |
  272. BIT_VIDOK_MSK |
  273. BIT_VODOK_MSK |
  274. BIT_RDU_MSK |
  275. BIT_RXOK_MSK |
  276. 0);
  277. /*
  278. * Set default value of Interrupt Mask Register1
  279. */
  280. pHalData->IntrMaskDefault[1] = (u32)(
  281. BIT(9) | /* TXFOVW */
  282. BIT_FOVW_MSK |
  283. BIT_PRETXERR_HANDLE_IMR |
  284. 0);
  285. /*
  286. * Set default value of Interrupt Mask Register3
  287. */
  288. pHalData->IntrMaskDefault[3] = (u32)(
  289. BIT_SETH2CDOK_MASK | /* H2C_TX_OK */
  290. 0);
  291. /* 2012/03/27 hpfan Add for win8 DTM DPC ISR test */
  292. pHalData->IntrMaskReg[0] = (u32)(
  293. BIT_RDU_MSK |
  294. BIT(29) | /* BIT_PSTIMEOUT */
  295. 0);
  296. pHalData->IntrMaskReg[1] = (u32)(
  297. BIT_C2HCMD_MSK |
  298. 0);
  299. pHalData->IntrMask[0] = pHalData->IntrMaskDefault[0];
  300. pHalData->IntrMask[1] = pHalData->IntrMaskDefault[1];
  301. pHalData->IntrMask[3] = pHalData->IntrMaskDefault[3];
  302. }
  303. static void hal_deinit_misc(PADAPTER padapter)
  304. {
  305. }
  306. u32 rtl8821ce_hal_deinit(PADAPTER padapter)
  307. {
  308. struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter);
  309. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  310. struct dvobj_priv *pobj_priv = adapter_to_dvobj(padapter);
  311. u8 status = _TRUE;
  312. RTW_INFO("==> %s\n", __func__);
  313. hal_deinit_misc(padapter);
  314. status = rtl8821c_hal_deinit(padapter);
  315. if (status == _FALSE) {
  316. RTW_INFO("%s: rtl8821c_hal_deinit fail\n", __func__);
  317. return _FAIL;
  318. }
  319. RTW_INFO("%s <==\n", __func__);
  320. return _SUCCESS;
  321. }