2 /******************************************************************************
4 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of version 2 of the GNU General Public License as
8 * published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * You should have received a copy of the GNU General Public License along with
16 * this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
20 ******************************************************************************/
22 #ifndef __HAL8188EPWRSEQ_H__
23 #define __HAL8188EPWRSEQ_H__
25 #include "pwrseqcmd.h"
28 Check document WM-20110607-Paul-RTL8188E_Power_Architecture-R02.vsd
29 There are 6 HW Power States:
32 2: CARDEMU--Card Emulation
34 4: LPS--Low Power State
37 The transision from different states are defined below
48 PWR SEQ Version: rtl8188E_PwrSeq_V09.h
50 #define RTL8188E_TRANS_CARDEMU_TO_ACT_STEPS 10
51 #define RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS 10
52 #define RTL8188E_TRANS_CARDEMU_TO_SUS_STEPS 10
53 #define RTL8188E_TRANS_SUS_TO_CARDEMU_STEPS 10
54 #define RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS 10
55 #define RTL8188E_TRANS_PDN_TO_CARDEMU_STEPS 10
56 #define RTL8188E_TRANS_ACT_TO_LPS_STEPS 15
57 #define RTL8188E_TRANS_LPS_TO_ACT_STEPS 15
58 #define RTL8188E_TRANS_END_STEPS 1
61 #define RTL8188E_TRANS_CARDEMU_TO_ACT \
63 * { offset, cut_msk, interface_msk, base|cmd, msk, value
67 {0x0006, PWR_CUT_ALL_MSK, \
68 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(1), BIT(1)}, \
69 /* wait till 0x04[17] = 1 power ready*/ \
70 {0x0002, PWR_CUT_ALL_MSK, \
71 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0) | BIT(1), 0}, \
72 /* 0x02[1:0] = 0 reset BB*/ \
73 {0x0026, PWR_CUT_ALL_MSK, \
74 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), BIT(7)}, \
75 /*0x24[23] = 2b'01 schmit trigger */ \
76 {0x0005, PWR_CUT_ALL_MSK, \
77 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), 0}, \
78 /* 0x04[15] = 0 disable HWPDN (control by DRV)*/ \
79 {0x0005, PWR_CUT_ALL_MSK, \
80 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4) | BIT(3), 0}, \
81 /*0x04[12:11] = 2b'00 disable WL suspend*/ \
82 {0x0005, PWR_CUT_ALL_MSK, \
83 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), BIT(0)}, \
84 /*0x04[8] = 1 polling until return 0*/ \
85 {0x0005, PWR_CUT_ALL_MSK, \
86 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(0), 0}, \
87 /*wait till 0x04[8] = 0*/ \
88 {0x0023, PWR_CUT_ALL_MSK, \
89 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), 0}, \
92 #define RTL8188E_TRANS_ACT_TO_CARDEMU \
94 * { offset, cut_msk, interface_msk, base|cmd, msk, value
98 {0x001F, PWR_CUT_ALL_MSK, \
99 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0}, \
100 /*0x1F[7:0] = 0 turn off RF*/ \
101 {0x0023, PWR_CUT_ALL_MSK, \
102 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), BIT(4)}, \
104 {0x0005, PWR_CUT_ALL_MSK, \
105 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), BIT(1)}, \
106 /*0x04[9] = 1 turn off MAC by HW state machine*/ \
107 {0x0005, PWR_CUT_ALL_MSK, \
108 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(1), 0}, \
109 /*wait till 0x04[9] = 0 polling until return 0 to disable*/
111 #define RTL8188E_TRANS_CARDEMU_TO_SUS \
113 * { offset, cut_msk, interface_msk, base|cmd, msk,
117 {0x0005, PWR_CUT_ALL_MSK, PWR_BASEADDR_MAC, \
118 PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3)}, \
119 /* 0x04[12:11] = 2b'01enable WL suspend */ \
120 {0x0007, PWR_CUT_ALL_MSK, PWR_BASEADDR_MAC, \
121 PWR_CMD_WRITE, 0xFF, BIT(7)}, \
122 /* 0x04[31:30] = 2b'10 enable enable bandgap mbias in suspend */\
123 {0x0041, PWR_CUT_ALL_MSK, PWR_BASEADDR_MAC, \
124 PWR_CMD_WRITE, BIT(4), 0}, \
125 /*Clear SIC_EN register 0x40[12] = 1'b0 */ \
126 {0xfe10, PWR_CUT_ALL_MSK, PWR_BASEADDR_MAC, \
127 PWR_CMD_WRITE, BIT(4), BIT(4)}, \
128 /*Set USB suspend enable local register 0xfe10[4]=1 */
130 #define RTL8188E_TRANS_SUS_TO_CARDEMU \
132 * { offset, cut_msk, interface_msk, base|cmd, msk,
136 {0x0005, PWR_CUT_ALL_MSK, \
137 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3) | BIT(4), 0}, \
138 /*0x04[12:11] = 2b'01enable WL suspend*/
140 #define RTL8188E_TRANS_CARDEMU_TO_CARDDIS \
142 * { offset, cut_msk, interface_msk, base|cmd, msk,
146 {0x0026, PWR_CUT_ALL_MSK, \
147 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), BIT(7)}, \
148 /*0x24[23] = 2b'01 schmit trigger */ \
149 {0x0005, PWR_CUT_ALL_MSK, PWR_BASEADDR_MAC, \
150 PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3)}, \
151 /*0x04[12:11] = 2b'01 enable WL suspend*/ \
152 {0x0007, PWR_CUT_ALL_MSK, PWR_BASEADDR_MAC, \
153 PWR_CMD_WRITE, 0xFF, 0}, \
154 /* 0x04[31:30] = 2b'10 enable enable bandgap mbias in suspend */\
155 {0x0041, PWR_CUT_ALL_MSK, PWR_BASEADDR_MAC, \
156 PWR_CMD_WRITE, BIT(4), 0}, \
157 /*Clear SIC_EN register 0x40[12] = 1'b0 */ \
158 {0xfe10, PWR_CUT_ALL_MSK, \
159 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), BIT(4)}, \
160 /*Set USB suspend enable local register 0xfe10[4]=1 */
162 #define RTL8188E_TRANS_CARDDIS_TO_CARDEMU \
164 * { offset, cut_msk, interface_msk, base|cmd, msk,
168 {0x0005, PWR_CUT_ALL_MSK, \
169 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3) | BIT(4), 0}, \
170 /*0x04[12:11] = 2b'01enable WL suspend*/
172 #define RTL8188E_TRANS_CARDEMU_TO_PDN \
174 * { offset, cut_msk, interface_msk, base|cmd, msk,
178 {0x0006, PWR_CUT_ALL_MSK, \
179 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), 0}, \
181 {0x0005, PWR_CUT_ALL_MSK, \
182 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), BIT(7)}, \
185 #define RTL8188E_TRANS_PDN_TO_CARDEMU \
187 * { offset, cut_msk, interface_msk, base|cmd, msk,
191 {0x0005, PWR_CUT_ALL_MSK, \
192 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), 0}, \
195 /* This is used by driver for LPSRadioOff Procedure, not for FW LPS Step */
196 #define RTL8188E_TRANS_ACT_TO_LPS \
198 * { offset, cut_msk, interface_msk, base|cmd, msk,
202 {0x0522, PWR_CUT_ALL_MSK, \
203 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x7F},/*Tx Pause*/ \
204 {0x05F8, PWR_CUT_ALL_MSK, \
205 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0}, \
206 /*Should be zero if no packet is transmitting*/ \
207 {0x05F9, PWR_CUT_ALL_MSK, \
208 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0}, \
209 /*Should be zero if no packet is transmitting*/ \
210 {0x05FA, PWR_CUT_ALL_MSK, \
211 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0}, \
212 /*Should be zero if no packet is transmitting*/ \
213 {0x05FB, PWR_CUT_ALL_MSK, \
214 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0}, \
215 /*Should be zero if no packet is transmitting*/ \
216 {0x0002, PWR_CUT_ALL_MSK, \
217 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), 0}, \
218 /*CCK and OFDM are disabled,and clock are gated*/ \
219 {0x0002, PWR_CUT_ALL_MSK, \
220 PWR_BASEADDR_MAC, PWR_CMD_DELAY, 0, \
221 PWRSEQ_DELAY_US},/*Delay 1us*/ \
222 {0x0100, PWR_CUT_ALL_MSK, \
223 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x3F},/*Reset MAC TRX*/ \
224 {0x0101, PWR_CUT_ALL_MSK, \
225 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), 0},/*check if removed later*/\
226 {0x0553, PWR_CUT_ALL_MSK, \
227 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(5), BIT(5)}, \
228 /*Respond TxOK to scheduler*/
231 #define RTL8188E_TRANS_LPS_TO_ACT \
233 * { offset, cut_msk, interface_msk, base|cmd, msk,
237 {0xFE58, PWR_CUT_ALL_MSK, \
238 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/ \
239 {0x0002, PWR_CUT_ALL_MSK, \
240 PWR_BASEADDR_MAC, PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/ \
241 {0x0008, PWR_CUT_ALL_MSK, \
242 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), 0}, \
243 /* 0x08[4] = 0 switch TSF to 40M */ \
244 {0x0109, PWR_CUT_ALL_MSK, \
245 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(7), 0}, \
246 /* Polling 0x109[7]=0 TSF in 40M */ \
247 {0x0029, PWR_CUT_ALL_MSK, \
248 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(6) | BIT(7), 0}, \
249 /* 0x29[7:6] = 2b'00 enable BB clock */ \
250 {0x0101, PWR_CUT_ALL_MSK, \
251 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), BIT(1)}, \
253 {0x0100, PWR_CUT_ALL_MSK, \
254 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0xFF}, \
255 /* 0x100[7:0] = 0xFF enable WMAC TRX */ \
256 {0x0002, PWR_CUT_ALL_MSK, \
257 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1) | BIT(0), BIT(1) | BIT(0)}, \
258 /* 0x02[1:0] = 2b'11 enable BB macro */ \
259 {0x0522, PWR_CUT_ALL_MSK, \
260 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0}, /*. 0x522 = 0*/
262 #define RTL8188E_TRANS_END \
264 * { offset, cut_msk, interface_msk, base|cmd, msk,
268 {0xFFFF, PWR_CUT_ALL_MSK, 0, \
272 extern struct wl_pwr_cfg rtl8188E_power_on_flow
273 [RTL8188E_TRANS_CARDEMU_TO_ACT_STEPS + RTL8188E_TRANS_END_STEPS];
274 extern struct wl_pwr_cfg rtl8188E_radio_off_flow
275 [RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS + RTL8188E_TRANS_END_STEPS];
276 extern struct wl_pwr_cfg rtl8188E_card_disable_flow
277 [RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS +
278 RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS +
279 RTL8188E_TRANS_END_STEPS];
280 extern struct wl_pwr_cfg rtl8188E_card_enable_flow
281 [RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS +
282 RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS +
283 RTL8188E_TRANS_END_STEPS];
284 extern struct wl_pwr_cfg rtl8188E_suspend_flow[
285 RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS +
286 RTL8188E_TRANS_CARDEMU_TO_SUS_STEPS +
287 RTL8188E_TRANS_END_STEPS];
288 extern struct wl_pwr_cfg rtl8188E_resume_flow
289 [RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS +
290 RTL8188E_TRANS_CARDEMU_TO_SUS_STEPS +
291 RTL8188E_TRANS_END_STEPS];
292 extern struct wl_pwr_cfg rtl8188E_hwpdn_flow
293 [RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS +
294 RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS + RTL8188E_TRANS_END_STEPS];
295 extern struct wl_pwr_cfg rtl8188E_enter_lps_flow
296 [RTL8188E_TRANS_ACT_TO_LPS_STEPS + RTL8188E_TRANS_END_STEPS];
297 extern struct wl_pwr_cfg rtl8188E_leave_lps_flow
298 [RTL8188E_TRANS_LPS_TO_ACT_STEPS + RTL8188E_TRANS_END_STEPS];
300 #endif /* __HAL8188EPWRSEQ_H__ */