GNU Linux-libre 4.19.281-gnu1
[releases.git] / drivers / staging / rtlwifi / halmac / halmac_88xx / halmac_8822b / halmac_api_8822b_usb.c
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_88xx_cfg.h"
15 #include "halmac_8822b_cfg.h"
16
17 /**
18  * halmac_mac_power_switch_8822b_usb() - switch mac power
19  * @halmac_adapter : the adapter of halmac
20  * @halmac_power : power state
21  * Author : KaiYuan Chang
22  * Return : enum halmac_ret_status
23  * More details of status code can be found in prototype document
24  */
25 enum halmac_ret_status
26 halmac_mac_power_switch_8822b_usb(struct halmac_adapter *halmac_adapter,
27                                   enum halmac_mac_power halmac_power)
28 {
29         u8 interface_mask;
30         u8 value8;
31         void *driver_adapter = NULL;
32         struct halmac_api *halmac_api;
33
34         if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
35                 return HALMAC_RET_ADAPTER_INVALID;
36
37         if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
38                 return HALMAC_RET_API_INVALID;
39
40         halmac_api_record_id_88xx(halmac_adapter, HALMAC_API_MAC_POWER_SWITCH);
41
42         driver_adapter = halmac_adapter->driver_adapter;
43         halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
44
45         HALMAC_RT_TRACE(
46                 driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
47                 "halmac_mac_power_switch_88xx_usb halmac_power = %x ==========>\n",
48                 halmac_power);
49
50         interface_mask = HALMAC_PWR_INTF_USB_MSK;
51
52         value8 = HALMAC_REG_READ_8(halmac_adapter, REG_CR);
53         if (value8 == 0xEA) {
54                 halmac_adapter->halmac_state.mac_power = HALMAC_MAC_POWER_OFF;
55         } else {
56                 if (BIT(0) ==
57                     (HALMAC_REG_READ_8(halmac_adapter, REG_SYS_STATUS1 + 1) &
58                      BIT(0)))
59                         halmac_adapter->halmac_state.mac_power =
60                                 HALMAC_MAC_POWER_OFF;
61                 else
62                         halmac_adapter->halmac_state.mac_power =
63                                 HALMAC_MAC_POWER_ON;
64         }
65
66         /*Check if power switch is needed*/
67         if (halmac_power == HALMAC_MAC_POWER_ON &&
68             halmac_adapter->halmac_state.mac_power == HALMAC_MAC_POWER_ON) {
69                 HALMAC_RT_TRACE(
70                         driver_adapter, HALMAC_MSG_PWR, DBG_WARNING,
71                         "halmac_mac_power_switch power state unchange!\n");
72                 return HALMAC_RET_PWR_UNCHANGE;
73         }
74         if (halmac_power == HALMAC_MAC_POWER_OFF) {
75                 if (halmac_pwr_seq_parser_88xx(
76                             halmac_adapter, HALMAC_PWR_CUT_ALL_MSK,
77                             HALMAC_PWR_FAB_TSMC_MSK, interface_mask,
78                             halmac_8822b_card_disable_flow) !=
79                     HALMAC_RET_SUCCESS) {
80                         pr_err("Handle power off cmd error\n");
81                         return HALMAC_RET_POWER_OFF_FAIL;
82                 }
83
84                 halmac_adapter->halmac_state.mac_power = HALMAC_MAC_POWER_OFF;
85                 halmac_adapter->halmac_state.ps_state =
86                         HALMAC_PS_STATE_UNDEFINE;
87                 halmac_adapter->halmac_state.dlfw_state = HALMAC_DLFW_NONE;
88                 halmac_init_adapter_dynamic_para_88xx(halmac_adapter);
89         } else {
90                 if (halmac_pwr_seq_parser_88xx(
91                             halmac_adapter, HALMAC_PWR_CUT_ALL_MSK,
92                             HALMAC_PWR_FAB_TSMC_MSK, interface_mask,
93                             halmac_8822b_card_enable_flow) !=
94                     HALMAC_RET_SUCCESS) {
95                         pr_err("Handle power on cmd error\n");
96                         return HALMAC_RET_POWER_ON_FAIL;
97                 }
98
99                 HALMAC_REG_WRITE_8(
100                         halmac_adapter, REG_SYS_STATUS1 + 1,
101                         HALMAC_REG_READ_8(halmac_adapter, REG_SYS_STATUS1 + 1) &
102                                 ~(BIT(0)));
103
104                 halmac_adapter->halmac_state.mac_power = HALMAC_MAC_POWER_ON;
105                 halmac_adapter->halmac_state.ps_state = HALMAC_PS_STATE_ACT;
106         }
107
108         HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
109                         "halmac_mac_power_switch_88xx_usb <==========\n");
110
111         return HALMAC_RET_SUCCESS;
112 }
113
114 /**
115  * halmac_phy_cfg_8822b_usb() - phy config
116  * @halmac_adapter : the adapter of halmac
117  * Author : KaiYuan Chang
118  * Return : enum halmac_ret_status
119  * More details of status code can be found in prototype document
120  */
121 enum halmac_ret_status
122 halmac_phy_cfg_8822b_usb(struct halmac_adapter *halmac_adapter,
123                          enum halmac_intf_phy_platform platform)
124 {
125         void *driver_adapter = NULL;
126         enum halmac_ret_status status = HALMAC_RET_SUCCESS;
127         struct halmac_api *halmac_api;
128
129         if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
130                 return HALMAC_RET_ADAPTER_INVALID;
131
132         if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
133                 return HALMAC_RET_API_INVALID;
134
135         halmac_api_record_id_88xx(halmac_adapter, HALMAC_API_PHY_CFG);
136
137         driver_adapter = halmac_adapter->driver_adapter;
138         halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
139
140         HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
141                         "halmac_phy_cfg ==========>\n");
142
143         status = halmac_parse_intf_phy_88xx(halmac_adapter,
144                                             HALMAC_RTL8822B_USB2_PHY, platform,
145                                             HAL_INTF_PHY_USB2);
146
147         if (status != HALMAC_RET_SUCCESS)
148                 return status;
149
150         status = halmac_parse_intf_phy_88xx(halmac_adapter,
151                                             HALMAC_RTL8822B_USB3_PHY, platform,
152                                             HAL_INTF_PHY_USB3);
153
154         if (status != HALMAC_RET_SUCCESS)
155                 return status;
156
157         HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
158                         "halmac_phy_cfg <==========\n");
159
160         return HALMAC_RET_SUCCESS;
161 }
162
163 /**
164  * halmac_interface_integration_tuning_8822b_usb() - usb interface fine tuning
165  * @halmac_adapter : the adapter of halmac
166  * Author : Ivan
167  * Return : enum halmac_ret_status
168  * More details of status code can be found in prototype document
169  */
170 enum halmac_ret_status halmac_interface_integration_tuning_8822b_usb(
171         struct halmac_adapter *halmac_adapter)
172 {
173         return HALMAC_RET_SUCCESS;
174 }