1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
3 *
4 * Copyright(c) 2016 Realtek Corporation.
5 *
6 * Contact Information:
7 * wlanfae <wlanfae@realtek.com>
8 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
9 * Hsinchu 300, Taiwan.
10 *
11 * Larry Finger <Larry.Finger@lwfinger.net>
12 *
13 *****************************************************************************/
14 #include "halmac_8822b_cfg.h"
15
16 /**
17 * halmac_mac_power_switch_8822b_sdio() - switch mac power
18 * @halmac_adapter : the adapter of halmac
19 * @halmac_power : power state
20 * Author : KaiYuan Chang/Ivan Lin
21 * Return : enum halmac_ret_status
22 * More details of status code can be found in prototype document
23 */
24 enum halmac_ret_status
halmac_mac_power_switch_8822b_sdio(struct halmac_adapter * halmac_adapter,enum halmac_mac_power halmac_power)25 halmac_mac_power_switch_8822b_sdio(struct halmac_adapter *halmac_adapter,
26 enum halmac_mac_power halmac_power)
27 {
28 u8 interface_mask;
29 u8 value8;
30 u8 rpwm;
31 u32 imr_backup;
32 void *driver_adapter = NULL;
33 struct halmac_api *halmac_api;
34
35 if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
36 return HALMAC_RET_ADAPTER_INVALID;
37
38 if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
39 return HALMAC_RET_API_INVALID;
40
41 driver_adapter = halmac_adapter->driver_adapter;
42 halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
43
44 HALMAC_RT_TRACE(
45 driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
46 "[TRACE]halmac_mac_power_switch_88xx_sdio==========>\n");
47 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
48 "[TRACE]halmac_power = %x ==========>\n", halmac_power);
49 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
50 "[TRACE]8822B pwr seq ver = %s\n",
51 HALMAC_8822B_PWR_SEQ_VER);
52
53 interface_mask = HALMAC_PWR_INTF_SDIO_MSK;
54
55 halmac_adapter->rpwm_record =
56 HALMAC_REG_READ_8(halmac_adapter, REG_SDIO_HRPWM1);
57
58 /* Check FW still exist or not */
59 if (HALMAC_REG_READ_16(halmac_adapter, REG_MCUFW_CTRL) == 0xC078) {
60 /* Leave 32K */
61 rpwm = (u8)((halmac_adapter->rpwm_record ^ BIT(7)) & 0x80);
62 HALMAC_REG_WRITE_8(halmac_adapter, REG_SDIO_HRPWM1, rpwm);
63 }
64
65 value8 = HALMAC_REG_READ_8(halmac_adapter, REG_CR);
66 if (value8 == 0xEA)
67 halmac_adapter->halmac_state.mac_power = HALMAC_MAC_POWER_OFF;
68 else
69 halmac_adapter->halmac_state.mac_power = HALMAC_MAC_POWER_ON;
70
71 /*Check if power switch is needed*/
72 if (halmac_power == HALMAC_MAC_POWER_ON &&
73 halmac_adapter->halmac_state.mac_power == HALMAC_MAC_POWER_ON) {
74 HALMAC_RT_TRACE(
75 driver_adapter, HALMAC_MSG_PWR, DBG_WARNING,
76 "[WARN]halmac_mac_power_switch power state unchange!\n");
77 return HALMAC_RET_PWR_UNCHANGE;
78 }
79
80 imr_backup = HALMAC_REG_READ_32(halmac_adapter, REG_SDIO_HIMR);
81 HALMAC_REG_WRITE_32(halmac_adapter, REG_SDIO_HIMR, 0);
82
83 if (halmac_power == HALMAC_MAC_POWER_OFF) {
84 if (halmac_pwr_seq_parser_88xx(
85 halmac_adapter, HALMAC_PWR_CUT_ALL_MSK,
86 HALMAC_PWR_FAB_TSMC_MSK, interface_mask,
87 halmac_8822b_card_disable_flow) !=
88 HALMAC_RET_SUCCESS) {
89 pr_err("[ERR]Handle power off cmd error\n");
90 HALMAC_REG_WRITE_32(halmac_adapter, REG_SDIO_HIMR,
91 imr_backup);
92 return HALMAC_RET_POWER_OFF_FAIL;
93 }
94
95 halmac_adapter->halmac_state.mac_power = HALMAC_MAC_POWER_OFF;
96 halmac_adapter->halmac_state.ps_state =
97 HALMAC_PS_STATE_UNDEFINE;
98 halmac_adapter->halmac_state.dlfw_state = HALMAC_DLFW_NONE;
99 halmac_init_adapter_dynamic_para_88xx(halmac_adapter);
100 } else {
101 if (halmac_pwr_seq_parser_88xx(
102 halmac_adapter, HALMAC_PWR_CUT_ALL_MSK,
103 HALMAC_PWR_FAB_TSMC_MSK, interface_mask,
104 halmac_8822b_card_enable_flow) !=
105 HALMAC_RET_SUCCESS) {
106 pr_err("[ERR]Handle power on cmd error\n");
107 HALMAC_REG_WRITE_32(halmac_adapter, REG_SDIO_HIMR,
108 imr_backup);
109 return HALMAC_RET_POWER_ON_FAIL;
110 }
111
112 halmac_adapter->halmac_state.mac_power = HALMAC_MAC_POWER_ON;
113 halmac_adapter->halmac_state.ps_state = HALMAC_PS_STATE_ACT;
114 }
115
116 HALMAC_REG_WRITE_32(halmac_adapter, REG_SDIO_HIMR, imr_backup);
117
118 HALMAC_RT_TRACE(
119 driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
120 "[TRACE]halmac_mac_power_switch_88xx_sdio <==========\n");
121
122 return HALMAC_RET_SUCCESS;
123 }
124
125 /**
126 * halmac_phy_cfg_8822b_sdio() - phy config
127 * @halmac_adapter : the adapter of halmac
128 * Author : KaiYuan Chang
129 * Return : enum halmac_ret_status
130 * More details of status code can be found in prototype document
131 */
132 enum halmac_ret_status
halmac_phy_cfg_8822b_sdio(struct halmac_adapter * halmac_adapter,enum halmac_intf_phy_platform platform)133 halmac_phy_cfg_8822b_sdio(struct halmac_adapter *halmac_adapter,
134 enum halmac_intf_phy_platform platform)
135 {
136 void *driver_adapter = NULL;
137 struct halmac_api *halmac_api;
138
139 if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
140 return HALMAC_RET_ADAPTER_INVALID;
141
142 if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
143 return HALMAC_RET_API_INVALID;
144
145 halmac_api_record_id_88xx(halmac_adapter, HALMAC_API_PHY_CFG);
146
147 driver_adapter = halmac_adapter->driver_adapter;
148 halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
149
150 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
151 "halmac_phy_cfg ==========>\n");
152
153 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
154 "sdio no phy\n");
155
156 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
157 "halmac_phy_cfg <==========\n");
158
159 return HALMAC_RET_SUCCESS;
160 }
161
162 /**
163 * halmac_interface_integration_tuning_8822b_sdio() - sdio interface fine tuning
164 * @halmac_adapter : the adapter of halmac
165 * Author : Ivan
166 * Return : enum halmac_ret_status
167 * More details of status code can be found in prototype document
168 */
halmac_interface_integration_tuning_8822b_sdio(struct halmac_adapter * halmac_adapter)169 enum halmac_ret_status halmac_interface_integration_tuning_8822b_sdio(
170 struct halmac_adapter *halmac_adapter)
171 {
172 return HALMAC_RET_SUCCESS;
173 }
174