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