1 /******************************************************************************
3 * Copyright(c) 2016 Realtek Corporation.
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.
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
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
22 * Larry Finger <Larry.Finger@lwfinger.net>
24 *****************************************************************************/
25 #include "halmac_8822b_cfg.h"
28 * halmac_mac_power_switch_8822b_sdio() - switch mac power
29 * @halmac_adapter : the adapter of halmac
30 * @halmac_power : power state
31 * Author : KaiYuan Chang/Ivan Lin
32 * Return : enum halmac_ret_status
33 * More details of status code can be found in prototype document
35 enum halmac_ret_status
36 halmac_mac_power_switch_8822b_sdio(struct halmac_adapter *halmac_adapter,
37 enum halmac_mac_power halmac_power)
43 void *driver_adapter = NULL;
44 struct halmac_api *halmac_api;
46 if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
47 return HALMAC_RET_ADAPTER_INVALID;
49 if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
50 return HALMAC_RET_API_INVALID;
52 driver_adapter = halmac_adapter->driver_adapter;
53 halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
56 driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
57 "[TRACE]halmac_mac_power_switch_88xx_sdio==========>\n");
58 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
59 "[TRACE]halmac_power = %x ==========>\n", halmac_power);
60 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
61 "[TRACE]8822B pwr seq ver = %s\n",
62 HALMAC_8822B_PWR_SEQ_VER);
64 interface_mask = HALMAC_PWR_INTF_SDIO_MSK;
66 halmac_adapter->rpwm_record =
67 HALMAC_REG_READ_8(halmac_adapter, REG_SDIO_HRPWM1);
69 /* Check FW still exist or not */
70 if (HALMAC_REG_READ_16(halmac_adapter, REG_MCUFW_CTRL) == 0xC078) {
72 rpwm = (u8)((halmac_adapter->rpwm_record ^ BIT(7)) & 0x80);
73 HALMAC_REG_WRITE_8(halmac_adapter, REG_SDIO_HRPWM1, rpwm);
76 value8 = HALMAC_REG_READ_8(halmac_adapter, REG_CR);
78 halmac_adapter->halmac_state.mac_power = HALMAC_MAC_POWER_OFF;
80 halmac_adapter->halmac_state.mac_power = HALMAC_MAC_POWER_ON;
82 /*Check if power switch is needed*/
83 if (halmac_power == HALMAC_MAC_POWER_ON &&
84 halmac_adapter->halmac_state.mac_power == HALMAC_MAC_POWER_ON) {
86 driver_adapter, HALMAC_MSG_PWR, DBG_WARNING,
87 "[WARN]halmac_mac_power_switch power state unchange!\n");
88 return HALMAC_RET_PWR_UNCHANGE;
91 imr_backup = HALMAC_REG_READ_32(halmac_adapter, REG_SDIO_HIMR);
92 HALMAC_REG_WRITE_32(halmac_adapter, REG_SDIO_HIMR, 0);
94 if (halmac_power == HALMAC_MAC_POWER_OFF) {
95 if (halmac_pwr_seq_parser_88xx(
96 halmac_adapter, HALMAC_PWR_CUT_ALL_MSK,
97 HALMAC_PWR_FAB_TSMC_MSK, interface_mask,
98 halmac_8822b_card_disable_flow) !=
100 pr_err("[ERR]Handle power off cmd error\n");
101 HALMAC_REG_WRITE_32(halmac_adapter, REG_SDIO_HIMR,
103 return HALMAC_RET_POWER_OFF_FAIL;
106 halmac_adapter->halmac_state.mac_power = HALMAC_MAC_POWER_OFF;
107 halmac_adapter->halmac_state.ps_state =
108 HALMAC_PS_STATE_UNDEFINE;
109 halmac_adapter->halmac_state.dlfw_state = HALMAC_DLFW_NONE;
110 halmac_init_adapter_dynamic_para_88xx(halmac_adapter);
112 if (halmac_pwr_seq_parser_88xx(
113 halmac_adapter, HALMAC_PWR_CUT_ALL_MSK,
114 HALMAC_PWR_FAB_TSMC_MSK, interface_mask,
115 halmac_8822b_card_enable_flow) !=
116 HALMAC_RET_SUCCESS) {
117 pr_err("[ERR]Handle power on cmd error\n");
118 HALMAC_REG_WRITE_32(halmac_adapter, REG_SDIO_HIMR,
120 return HALMAC_RET_POWER_ON_FAIL;
123 halmac_adapter->halmac_state.mac_power = HALMAC_MAC_POWER_ON;
124 halmac_adapter->halmac_state.ps_state = HALMAC_PS_STATE_ACT;
127 HALMAC_REG_WRITE_32(halmac_adapter, REG_SDIO_HIMR, imr_backup);
130 driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
131 "[TRACE]halmac_mac_power_switch_88xx_sdio <==========\n");
133 return HALMAC_RET_SUCCESS;
137 * halmac_phy_cfg_8822b_sdio() - phy config
138 * @halmac_adapter : the adapter of halmac
139 * Author : KaiYuan Chang
140 * Return : enum halmac_ret_status
141 * More details of status code can be found in prototype document
143 enum halmac_ret_status
144 halmac_phy_cfg_8822b_sdio(struct halmac_adapter *halmac_adapter,
145 enum halmac_intf_phy_platform platform)
147 void *driver_adapter = NULL;
148 struct halmac_api *halmac_api;
150 if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
151 return HALMAC_RET_ADAPTER_INVALID;
153 if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
154 return HALMAC_RET_API_INVALID;
156 halmac_api_record_id_88xx(halmac_adapter, HALMAC_API_PHY_CFG);
158 driver_adapter = halmac_adapter->driver_adapter;
159 halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
161 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
162 "halmac_phy_cfg ==========>\n");
164 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
167 HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
168 "halmac_phy_cfg <==========\n");
170 return HALMAC_RET_SUCCESS;
174 * halmac_interface_integration_tuning_8822b_sdio() - sdio interface fine tuning
175 * @halmac_adapter : the adapter of halmac
177 * Return : enum halmac_ret_status
178 * More details of status code can be found in prototype document
180 enum halmac_ret_status halmac_interface_integration_tuning_8822b_sdio(
181 struct halmac_adapter *halmac_adapter)
183 return HALMAC_RET_SUCCESS;