1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
4 * Copyright(c) 2016 Realtek Corporation.
7 * wlanfae <wlanfae@realtek.com>
8 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
11 * Larry Finger <Larry.Finger@lwfinger.net>
13 *****************************************************************************/
14 #include "../halmac_88xx_cfg.h"
15 #include "../halmac_api_88xx_pcie.h"
16 #include "halmac_8822b_cfg.h"
19 * halmac_mac_power_switch_8822b_pcie() - switch mac power
20 * @halmac_adapter : the adapter of halmac
21 * @halmac_power : power state
22 * Author : KaiYuan Chang
23 * Return : enum halmac_ret_status
24 * More details of status code can be found in prototype document
26 enum halmac_ret_status
27 halmac_mac_power_switch_8822b_pcie(struct halmac_adapter *halmac_adapter,
28 enum halmac_mac_power halmac_power)
32 void *driver_adapter = NULL;
33 struct halmac_api *halmac_api;
35 if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
36 return HALMAC_RET_ADAPTER_INVALID;
38 if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
39 return HALMAC_RET_API_INVALID;
41 halmac_api_record_id_88xx(halmac_adapter, HALMAC_API_MAC_POWER_SWITCH);
43 driver_adapter = halmac_adapter->driver_adapter;
44 halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
47 driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
48 "halmac_mac_power_switch_88xx_pcie halmac_power = %x ==========>\n",
50 interface_mask = HALMAC_PWR_INTF_PCI_MSK;
52 value8 = HALMAC_REG_READ_8(halmac_adapter, REG_CR);
54 halmac_adapter->halmac_state.mac_power = HALMAC_MAC_POWER_OFF;
56 halmac_adapter->halmac_state.mac_power = HALMAC_MAC_POWER_ON;
58 /* Check if power switch is needed */
59 if (halmac_power == HALMAC_MAC_POWER_ON &&
60 halmac_adapter->halmac_state.mac_power == HALMAC_MAC_POWER_ON) {
62 driver_adapter, HALMAC_MSG_PWR, DBG_WARNING,
63 "halmac_mac_power_switch power state unchange!\n");
64 return HALMAC_RET_PWR_UNCHANGE;
67 if (halmac_power == HALMAC_MAC_POWER_OFF) {
68 if (halmac_pwr_seq_parser_88xx(
69 halmac_adapter, HALMAC_PWR_CUT_ALL_MSK,
70 HALMAC_PWR_FAB_TSMC_MSK, interface_mask,
71 halmac_8822b_card_disable_flow) !=
73 pr_err("Handle power off cmd error\n");
74 return HALMAC_RET_POWER_OFF_FAIL;
77 halmac_adapter->halmac_state.mac_power = HALMAC_MAC_POWER_OFF;
78 halmac_adapter->halmac_state.ps_state =
79 HALMAC_PS_STATE_UNDEFINE;
80 halmac_adapter->halmac_state.dlfw_state = HALMAC_DLFW_NONE;
81 halmac_init_adapter_dynamic_para_88xx(halmac_adapter);
83 if (halmac_pwr_seq_parser_88xx(
84 halmac_adapter, HALMAC_PWR_CUT_ALL_MSK,
85 HALMAC_PWR_FAB_TSMC_MSK, interface_mask,
86 halmac_8822b_card_enable_flow) !=
88 pr_err("Handle power on cmd error\n");
89 return HALMAC_RET_POWER_ON_FAIL;
92 halmac_adapter->halmac_state.mac_power = HALMAC_MAC_POWER_ON;
93 halmac_adapter->halmac_state.ps_state = HALMAC_PS_STATE_ACT;
96 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
97 "halmac_mac_power_switch_88xx_pcie <==========\n");
99 return HALMAC_RET_SUCCESS;
103 * halmac_pcie_switch_8822b() - pcie gen1/gen2 switch
104 * @halmac_adapter : the adapter of halmac
105 * @pcie_cfg : gen1/gen2 selection
106 * Author : KaiYuan Chang
107 * Return : enum halmac_ret_status
108 * More details of status code can be found in prototype document
110 enum halmac_ret_status
111 halmac_pcie_switch_8822b(struct halmac_adapter *halmac_adapter,
112 enum halmac_pcie_cfg pcie_cfg)
114 void *driver_adapter = NULL;
115 struct halmac_api *halmac_api;
116 u8 current_link_speed = 0;
119 if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
120 return HALMAC_RET_ADAPTER_INVALID;
122 if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
123 return HALMAC_RET_API_INVALID;
125 halmac_api_record_id_88xx(halmac_adapter, HALMAC_API_PCIE_SWITCH);
127 driver_adapter = halmac_adapter->driver_adapter;
128 halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
130 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
131 "%s ==========>\n", __func__);
133 /* Link Control 2 Register[3:0] Target Link Speed
134 * Defined encodings are:
135 * 0001b Target Link 2.5 GT/s
136 * 0010b Target Link 5.0 GT/s
137 * 0100b Target Link 8.0 GT/s
140 if (pcie_cfg == HALMAC_PCIE_GEN1) {
141 /* cfg 0xA0[3:0]=4'b0001 */
142 halmac_dbi_write8_88xx(
143 halmac_adapter, LINK_CTRL2_REG_OFFSET,
144 (halmac_dbi_read8_88xx(halmac_adapter,
145 LINK_CTRL2_REG_OFFSET) &
148 /* cfg 0x80C[17]=1 //PCIe DesignWave */
149 halmac_dbi_write32_88xx(
150 halmac_adapter, GEN2_CTRL_OFFSET,
151 halmac_dbi_read32_88xx(halmac_adapter,
155 /* check link speed if GEN1 */
156 /* cfg 0x82[3:0]=4'b0001 */
158 halmac_dbi_read8_88xx(halmac_adapter,
159 LINK_STATUS_REG_OFFSET) &
163 while (current_link_speed != GEN1_SPEED && count != 0) {
164 usleep_range(50, 60);
166 halmac_dbi_read8_88xx(halmac_adapter,
167 LINK_STATUS_REG_OFFSET) &
172 if (current_link_speed != GEN1_SPEED) {
173 pr_err("Speed change to GEN1 fail !\n");
174 return HALMAC_RET_FAIL;
177 } else if (pcie_cfg == HALMAC_PCIE_GEN2) {
178 /* cfg 0xA0[3:0]=4'b0010 */
179 halmac_dbi_write8_88xx(
180 halmac_adapter, LINK_CTRL2_REG_OFFSET,
181 (halmac_dbi_read8_88xx(halmac_adapter,
182 LINK_CTRL2_REG_OFFSET) &
185 /* cfg 0x80C[17]=1 //PCIe DesignWave */
186 halmac_dbi_write32_88xx(
187 halmac_adapter, GEN2_CTRL_OFFSET,
188 halmac_dbi_read32_88xx(halmac_adapter,
192 /* check link speed if GEN2 */
193 /* cfg 0x82[3:0]=4'b0010 */
195 halmac_dbi_read8_88xx(halmac_adapter,
196 LINK_STATUS_REG_OFFSET) &
200 while (current_link_speed != GEN2_SPEED && count != 0) {
201 usleep_range(50, 60);
203 halmac_dbi_read8_88xx(halmac_adapter,
204 LINK_STATUS_REG_OFFSET) &
209 if (current_link_speed != GEN2_SPEED) {
210 pr_err("Speed change to GEN1 fail !\n");
211 return HALMAC_RET_FAIL;
215 pr_err("Error Speed !\n");
216 return HALMAC_RET_FAIL;
219 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
220 "%s <==========\n", __func__);
222 return HALMAC_RET_SUCCESS;
225 enum halmac_ret_status
226 halmac_pcie_switch_8822b_nc(struct halmac_adapter *halmac_adapter,
227 enum halmac_pcie_cfg pcie_cfg)
229 void *driver_adapter = NULL;
230 struct halmac_api *halmac_api;
232 if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
233 return HALMAC_RET_ADAPTER_INVALID;
235 if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
236 return HALMAC_RET_API_INVALID;
238 halmac_api_record_id_88xx(halmac_adapter, HALMAC_API_PCIE_SWITCH);
240 driver_adapter = halmac_adapter->driver_adapter;
241 halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
243 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
244 "%s ==========>\n", __func__);
246 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
247 "%s <==========\n", __func__);
249 return HALMAC_RET_SUCCESS;
253 * halmac_phy_cfg_8822b_pcie() - phy config
254 * @halmac_adapter : the adapter of halmac
255 * Author : KaiYuan Chang
256 * Return : enum halmac_ret_status
257 * More details of status code can be found in prototype document
259 enum halmac_ret_status
260 halmac_phy_cfg_8822b_pcie(struct halmac_adapter *halmac_adapter,
261 enum halmac_intf_phy_platform platform)
263 void *driver_adapter = NULL;
264 enum halmac_ret_status status = HALMAC_RET_SUCCESS;
265 struct halmac_api *halmac_api;
267 if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
268 return HALMAC_RET_ADAPTER_INVALID;
270 if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
271 return HALMAC_RET_API_INVALID;
273 halmac_api_record_id_88xx(halmac_adapter, HALMAC_API_PHY_CFG);
275 driver_adapter = halmac_adapter->driver_adapter;
276 halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
278 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
279 "halmac_phy_cfg ==========>\n");
281 status = halmac_parse_intf_phy_88xx(halmac_adapter,
282 HALMAC_RTL8822B_PCIE_PHY_GEN1,
283 platform, HAL_INTF_PHY_PCIE_GEN1);
285 if (status != HALMAC_RET_SUCCESS)
288 status = halmac_parse_intf_phy_88xx(halmac_adapter,
289 HALMAC_RTL8822B_PCIE_PHY_GEN2,
290 platform, HAL_INTF_PHY_PCIE_GEN2);
292 if (status != HALMAC_RET_SUCCESS)
295 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
296 "halmac_phy_cfg <==========\n");
298 return HALMAC_RET_SUCCESS;
302 * halmac_interface_integration_tuning_8822b_pcie() - pcie interface fine tuning
303 * @halmac_adapter : the adapter of halmac
305 * Return : enum halmac_ret_status
306 * More details of status code can be found in prototype document
308 enum halmac_ret_status halmac_interface_integration_tuning_8822b_pcie(
309 struct halmac_adapter *halmac_adapter)
311 return HALMAC_RET_SUCCESS;