halmac_api_8821c_pcie.c 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. #include "../halmac_88xx_cfg.h"
  2. #include "halmac_8821c_cfg.h"
  3. #define CLKCAL_CTRL_PHYPARA 0x00
  4. #define CLKCAL_SET_PHYPARA 0x20
  5. #define CLKCAL_TRG_VAL_PHYPARA 0x21
  6. static HALMAC_RET_STATUS
  7. halmac_auto_refclk_cal_8821c_pcie(
  8. IN PHALMAC_ADAPTER pHalmac_adapter
  9. );
  10. /**
  11. * halmac_mac_power_switch_8821c_pcie() - switch mac power
  12. * @pHalmac_adapter : the adapter of halmac
  13. * @halmac_power : power state
  14. * Author : KaiYuan Chang / Ivan Lin
  15. * Return : HALMAC_RET_STATUS
  16. * More details of status code can be found in prototype document
  17. */
  18. HALMAC_RET_STATUS
  19. halmac_mac_power_switch_8821c_pcie(
  20. IN PHALMAC_ADAPTER pHalmac_adapter,
  21. IN HALMAC_MAC_POWER halmac_power
  22. )
  23. {
  24. u8 interface_mask;
  25. u8 value8;
  26. VOID *pDriver_adapter = NULL;
  27. PHALMAC_API pHalmac_api;
  28. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  29. return HALMAC_RET_ADAPTER_INVALID;
  30. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  31. return HALMAC_RET_API_INVALID;
  32. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_MAC_POWER_SWITCH);
  33. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  34. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  35. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_TRACE, "halmac_mac_power_switch_88xx_pcie halmac_power = %x ==========>\n", halmac_power);
  36. interface_mask = HALMAC_PWR_INTF_PCI_MSK;
  37. value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_CR);
  38. if (0xEA == value8)
  39. pHalmac_adapter->halmac_state.mac_power = HALMAC_MAC_POWER_OFF;
  40. else
  41. pHalmac_adapter->halmac_state.mac_power = HALMAC_MAC_POWER_ON;
  42. /* Check if power switch is needed */
  43. if (halmac_power == HALMAC_MAC_POWER_ON && pHalmac_adapter->halmac_state.mac_power == HALMAC_MAC_POWER_ON) {
  44. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_WARN, "halmac_mac_power_switch power state unchange!\n");
  45. return HALMAC_RET_PWR_UNCHANGE;
  46. } else {
  47. if (HALMAC_MAC_POWER_OFF == halmac_power) {
  48. if (HALMAC_RET_SUCCESS != halmac_pwr_seq_parser_88xx(pHalmac_adapter, HALMAC_PWR_CUT_ALL_MSK, HALMAC_PWR_FAB_TSMC_MSK,
  49. interface_mask, halmac_8821c_card_disable_flow)) {
  50. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_ERR, "Handle power off cmd error\n");
  51. return HALMAC_RET_POWER_OFF_FAIL;
  52. }
  53. pHalmac_adapter->halmac_state.mac_power = HALMAC_MAC_POWER_OFF;
  54. pHalmac_adapter->halmac_state.ps_state = HALMAC_PS_STATE_UNDEFINE;
  55. pHalmac_adapter->halmac_state.dlfw_state = HALMAC_DLFW_NONE;
  56. halmac_init_adapter_dynamic_para_88xx(pHalmac_adapter);
  57. } else {
  58. if (HALMAC_RET_SUCCESS != halmac_pwr_seq_parser_88xx(pHalmac_adapter, HALMAC_PWR_CUT_ALL_MSK, HALMAC_PWR_FAB_TSMC_MSK,
  59. interface_mask, halmac_8821c_card_enable_flow)) {
  60. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_ERR, "Handle power on cmd error\n");
  61. return HALMAC_RET_POWER_ON_FAIL;
  62. }
  63. pHalmac_adapter->halmac_state.mac_power = HALMAC_MAC_POWER_ON;
  64. pHalmac_adapter->halmac_state.ps_state = HALMAC_PS_STATE_ACT;
  65. }
  66. }
  67. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_TRACE, "halmac_mac_power_switch_88xx_pcie <==========\n");
  68. return HALMAC_RET_SUCCESS;
  69. }
  70. /**
  71. * halmac_pcie_switch_8821c() - pcie gen1/gen2 switch
  72. * @pHalmac_adapter : the adapter of halmac
  73. * @pcie_cfg : gen1/gen2 selection
  74. * Author : KaiYuan Chang / Ivan Lin
  75. * Return : HALMAC_RET_STATUS
  76. * More details of status code can be found in prototype document
  77. */
  78. HALMAC_RET_STATUS
  79. halmac_pcie_switch_8821c(
  80. IN PHALMAC_ADAPTER pHalmac_adapter,
  81. IN HALMAC_PCIE_CFG pcie_cfg
  82. )
  83. {
  84. VOID *pDriver_adapter = NULL;
  85. PHALMAC_API pHalmac_api;
  86. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  87. return HALMAC_RET_ADAPTER_INVALID;
  88. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  89. return HALMAC_RET_API_INVALID;
  90. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_PCIE_SWITCH);
  91. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  92. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  93. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_TRACE, "halmac_pcie_switch_8821c ==========>\n");
  94. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_TRACE, "halmac_pcie_switch_8821c <==========\n");
  95. return HALMAC_RET_SUCCESS;
  96. }
  97. HALMAC_RET_STATUS
  98. halmac_pcie_switch_8821c_nc(
  99. IN PHALMAC_ADAPTER pHalmac_adapter,
  100. IN HALMAC_PCIE_CFG pcie_cfg
  101. )
  102. {
  103. VOID *pDriver_adapter = NULL;
  104. PHALMAC_API pHalmac_api;
  105. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  106. return HALMAC_RET_ADAPTER_INVALID;
  107. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  108. return HALMAC_RET_API_INVALID;
  109. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_PCIE_SWITCH);
  110. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  111. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  112. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_TRACE, "halmac_pcie_switch_8821c_nc ==========>\n");
  113. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_TRACE, "halmac_pcie_switch_8821c_nc <==========\n");
  114. return HALMAC_RET_SUCCESS;
  115. }
  116. /**
  117. * halmac_phy_cfg_8821c_pcie() - phy config
  118. * @pHalmac_adapter : the adapter of halmac
  119. * Author : KaiYuan Chang / Ivan Lin
  120. * Return : HALMAC_RET_STATUS
  121. * More details of status code can be found in prototype document
  122. */
  123. HALMAC_RET_STATUS
  124. halmac_phy_cfg_8821c_pcie(
  125. IN PHALMAC_ADAPTER pHalmac_adapter,
  126. IN HALMAC_INTF_PHY_PLATFORM platform
  127. )
  128. {
  129. VOID *pDriver_adapter = NULL;
  130. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  131. PHALMAC_API pHalmac_api;
  132. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  133. return HALMAC_RET_ADAPTER_INVALID;
  134. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  135. return HALMAC_RET_API_INVALID;
  136. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_PHY_CFG);
  137. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  138. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  139. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_TRACE, "halmac_phy_cfg ==========>\n");
  140. status = halmac_parse_intf_phy_88xx(pHalmac_adapter, HALMAC_RTL8821C_PCIE_PHY_GEN1, platform, HAL_INTF_PHY_PCIE_GEN1);
  141. if (HALMAC_RET_SUCCESS != status)
  142. return status;
  143. status = halmac_parse_intf_phy_88xx(pHalmac_adapter, HALMAC_RTL8821C_PCIE_PHY_GEN2, platform, HAL_INTF_PHY_PCIE_GEN2);
  144. if (HALMAC_RET_SUCCESS != status)
  145. return status;
  146. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_TRACE, "halmac_phy_cfg <==========\n");
  147. return HALMAC_RET_SUCCESS;
  148. }
  149. /**
  150. * halmac_interface_integration_tuning_8821c_pcie() - pcie interface fine tuning
  151. * @pHalmac_adapter : the adapter of halmac
  152. * Author : Rick Liu
  153. * Return : HALMAC_RET_STATUS
  154. * More details of status code can be found in prototype document
  155. */
  156. HALMAC_RET_STATUS
  157. halmac_interface_integration_tuning_8821c_pcie(
  158. IN PHALMAC_ADAPTER pHalmac_adapter
  159. )
  160. {
  161. HALMAC_RET_STATUS status;
  162. status = halmac_auto_refclk_cal_8821c_pcie(pHalmac_adapter);
  163. return status;
  164. }
  165. static HALMAC_RET_STATUS
  166. halmac_auto_refclk_cal_8821c_pcie(
  167. IN PHALMAC_ADAPTER pHalmac_adapter
  168. )
  169. {
  170. u16 read_tmp;
  171. u16 cal_target;
  172. u16 margin;
  173. HALMAC_RET_STATUS status;
  174. VOID *pDriver_adapter = NULL;
  175. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  176. /* Set reference clock div number at 0x00[7:6] */
  177. read_tmp = halmac_mdio_read_88xx(pHalmac_adapter, CLKCAL_CTRL_PHYPARA, HAL_INTF_PHY_PCIE_GEN1);
  178. /* status = halmac_mdio_write_88xx(pHalmac_adapter, CLKCAL_CTRL_PHYPARA, read_tmp & ~(BIT(6) | BIT(7)), HAL_INTF_PHY_PCIE_GEN1); */
  179. /* status = halmac_mdio_write_88xx(pHalmac_adapter, CLKCAL_CTRL_PHYPARA, read_tmp & ~(BIT(6)) | BIT(7), HAL_INTF_PHY_PCIE_GEN1); */
  180. status = halmac_mdio_write_88xx(pHalmac_adapter, CLKCAL_CTRL_PHYPARA, read_tmp | BIT(7) | BIT(6), HAL_INTF_PHY_PCIE_GEN1);
  181. if (HALMAC_RET_SUCCESS != status)
  182. return status;
  183. /* Set 0x00[11] to count 1T of reference clock and read target value at 0x21[11:0] */
  184. read_tmp = halmac_mdio_read_88xx(pHalmac_adapter, CLKCAL_CTRL_PHYPARA, HAL_INTF_PHY_PCIE_GEN1);
  185. status = halmac_mdio_write_88xx(pHalmac_adapter, CLKCAL_CTRL_PHYPARA, read_tmp | BIT(11), HAL_INTF_PHY_PCIE_GEN1);
  186. if (HALMAC_RET_SUCCESS != status)
  187. return status;
  188. PLATFORM_RTL_DELAY_US(pDriver_adapter, 22);
  189. cal_target = halmac_mdio_read_88xx(pHalmac_adapter, CLKCAL_TRG_VAL_PHYPARA, HAL_INTF_PHY_PCIE_GEN1);
  190. /* Set calibration target at 0x20[11:0] and margin at 0x20[15:12] */
  191. margin = 0x0003;
  192. status = halmac_mdio_write_88xx(pHalmac_adapter, CLKCAL_SET_PHYPARA, (cal_target & 0x0FFF) | (margin << 12), HAL_INTF_PHY_PCIE_GEN1);
  193. if (HALMAC_RET_SUCCESS != status)
  194. return status;
  195. /* Turn on calibration mechanium at 0x00[9] */
  196. status = halmac_mdio_write_88xx(pHalmac_adapter, CLKCAL_CTRL_PHYPARA, read_tmp | BIT(9), HAL_INTF_PHY_PCIE_GEN1);
  197. return HALMAC_RET_SUCCESS;
  198. }