1 /******************************************************************************
4 * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5 * Linux device driver for RTL8192SU
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of version 2 of the GNU General Public License as
9 * published by the Free Software Foundation.
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 * You should have received a copy of the GNU General Public License along with
17 * this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
20 * Modifications for inclusion into the Linux staging tree are
21 * Copyright(c) 2010 Larry Finger. All rights reserved.
23 * Contact information:
24 * WLAN FAE <wlanfae@realtek.com>
25 * Larry Finger <Larry.Finger@lwfinger.net>
27 ******************************************************************************/
29 #define _HCI_HAL_INIT_C_
31 #include "osdep_service.h"
32 #include "drv_types.h"
34 #include "usb_osintf.h"
36 u8
r8712_usb_hal_bus_init(struct _adapter
*padapter
)
41 struct registry_priv
*pregistrypriv
= &padapter
->registrypriv
;
43 if (pregistrypriv
->chip_version
== RTL8712_FPGA
) {
45 /* switch to 80M clock */
46 r8712_write8(padapter
, SYS_CLKR
, val8
);
47 val8
= r8712_read8(padapter
, SPS1_CTRL
);
49 /* enable VSPS12 LDO Macro block */
50 r8712_write8(padapter
, SPS1_CTRL
, val8
);
51 val8
= r8712_read8(padapter
, AFE_MISC
);
53 /* Enable AFE Macro Block's Bandgap */
54 r8712_write8(padapter
, AFE_MISC
, val8
);
55 val8
= r8712_read8(padapter
, LDOA15_CTRL
);
57 /* enable LDOA15 block */
58 r8712_write8(padapter
, LDOA15_CTRL
, val8
);
59 val8
= r8712_read8(padapter
, SPS1_CTRL
);
61 /* Enable VSPS12_SW Macro Block */
62 r8712_write8(padapter
, SPS1_CTRL
, val8
);
63 val8
= r8712_read8(padapter
, AFE_MISC
);
65 /* Enable AFE Macro Block's Mbias */
66 r8712_write8(padapter
, AFE_MISC
, val8
);
67 val8
= r8712_read8(padapter
, SYS_ISO_CTRL
+ 1);
69 /* isolate PCIe Analog 1.2V to PCIe 3.3V and PCIE Digital */
70 r8712_write8(padapter
, SYS_ISO_CTRL
+ 1, val8
);
71 val8
= r8712_read8(padapter
, SYS_ISO_CTRL
+ 1);
73 /* attatch AFE PLL to MACTOP/BB/PCIe Digital */
74 r8712_write8(padapter
, SYS_ISO_CTRL
+ 1, val8
);
75 val8
= r8712_read8(padapter
, AFE_XTAL_CTRL
+ 1);
77 /* enable AFE clock */
78 r8712_write8(padapter
, AFE_XTAL_CTRL
+ 1, val8
);
79 val8
= r8712_read8(padapter
, AFE_PLL_CTRL
);
81 /* Enable AFE PLL Macro Block */
82 r8712_write8(padapter
, AFE_PLL_CTRL
, val8
);
84 /* release isolation AFE PLL & MD */
85 r8712_write8(padapter
, SYS_ISO_CTRL
, val8
);
86 val8
= r8712_read8(padapter
, SYS_CLKR
+ 1);
88 /* enable MAC clock */
89 r8712_write8(padapter
, SYS_CLKR
+ 1, val8
);
90 val8
= r8712_read8(padapter
, SYS_FUNC_EN
+ 1);
92 /* enable Core digital and enable IOREG R/W */
93 r8712_write8(padapter
, SYS_FUNC_EN
+ 1, val8
);
96 r8712_write8(padapter
, SYS_FUNC_EN
+ 1, val8
);
97 val8
= r8712_read8(padapter
, SYS_CLKR
+ 1);
98 val8
= (val8
| 0x80) & 0xBF;
99 /* switch the control path */
100 r8712_write8(padapter
, SYS_CLKR
+ 1, val8
);
102 r8712_write8(padapter
, CR
, val8
);
104 r8712_write8(padapter
, CR
+ 1, val8
);
105 /* reduce EndPoint & init it */
106 r8712_write8(padapter
, 0x102500ab, r8712_read8(padapter
,
107 0x102500ab) | BIT(6) | BIT(7));
108 /* consideration of power consumption - init */
109 r8712_write8(padapter
, 0x10250008, r8712_read8(padapter
,
110 0x10250008) & 0xfffffffb);
111 } else if (pregistrypriv
->chip_version
== RTL8712_1stCUT
) {
112 /* Initialization for power on sequence, */
113 r8712_write8(padapter
, SPS0_CTRL
+ 1, 0x53);
114 r8712_write8(padapter
, SPS0_CTRL
, 0x57);
115 /* Enable AFE Macro Block's Bandgap and Enable AFE Macro
118 val8
= r8712_read8(padapter
, AFE_MISC
);
119 r8712_write8(padapter
, AFE_MISC
, (val8
| AFE_MISC_BGEN
|
121 /* Enable LDOA15 block */
122 val8
= r8712_read8(padapter
, LDOA15_CTRL
);
123 r8712_write8(padapter
, LDOA15_CTRL
, (val8
| LDA15_EN
));
124 val8
= r8712_read8(padapter
, SPS1_CTRL
);
125 r8712_write8(padapter
, SPS1_CTRL
, (val8
| SPS1_LDEN
));
127 /* Enable Switch Regulator Block */
128 val8
= r8712_read8(padapter
, SPS1_CTRL
);
129 r8712_write8(padapter
, SPS1_CTRL
, (val8
| SPS1_SWEN
));
130 r8712_write32(padapter
, SPS1_CTRL
, 0x00a7b267);
131 val8
= r8712_read8(padapter
, SYS_ISO_CTRL
+ 1);
132 r8712_write8(padapter
, SYS_ISO_CTRL
+ 1, (val8
| 0x08));
133 /* Engineer Packet CP test Enable */
134 val8
= r8712_read8(padapter
, SYS_FUNC_EN
+ 1);
135 r8712_write8(padapter
, SYS_FUNC_EN
+ 1, (val8
| 0x20));
136 val8
= r8712_read8(padapter
, SYS_ISO_CTRL
+ 1);
137 r8712_write8(padapter
, SYS_ISO_CTRL
+ 1, (val8
& 0x6F));
138 /* Enable AFE clock */
139 val8
= r8712_read8(padapter
, AFE_XTAL_CTRL
+ 1);
140 r8712_write8(padapter
, AFE_XTAL_CTRL
+ 1, (val8
& 0xfb));
141 /* Enable AFE PLL Macro Block */
142 val8
= r8712_read8(padapter
, AFE_PLL_CTRL
);
143 r8712_write8(padapter
, AFE_PLL_CTRL
, (val8
| 0x11));
144 /* Attatch AFE PLL to MACTOP/BB/PCIe Digital */
145 val8
= r8712_read8(padapter
, SYS_ISO_CTRL
);
146 r8712_write8(padapter
, SYS_ISO_CTRL
, (val8
& 0xEE));
147 /* Switch to 40M clock */
148 val8
= r8712_read8(padapter
, SYS_CLKR
);
149 r8712_write8(padapter
, SYS_CLKR
, val8
& (~SYS_CLKSEL
));
151 val8
= r8712_read8(padapter
, SYS_CLKR
);
152 /* Enable MAC clock */
153 val8
= r8712_read8(padapter
, SYS_CLKR
+ 1);
154 r8712_write8(padapter
, SYS_CLKR
+ 1, (val8
| 0x18));
156 r8712_write8(padapter
, PMC_FSM
, 0x02);
157 /* Enable Core digital and enable IOREG R/W */
158 val8
= r8712_read8(padapter
, SYS_FUNC_EN
+ 1);
159 r8712_write8(padapter
, SYS_FUNC_EN
+ 1, (val8
| 0x08));
161 val8
= r8712_read8(padapter
, SYS_FUNC_EN
+ 1);
162 r8712_write8(padapter
, SYS_FUNC_EN
+ 1, (val8
| 0x80));
163 /* Switch the control path to FW */
164 val8
= r8712_read8(padapter
, SYS_CLKR
+ 1);
165 r8712_write8(padapter
, SYS_CLKR
+ 1, (val8
| 0x80) & 0xBF);
166 r8712_write8(padapter
, CR
, 0xFC);
167 r8712_write8(padapter
, CR
+ 1, 0x37);
168 /* Fix the RX FIFO issue(usb error), */
169 val8
= r8712_read8(padapter
, 0x1025FE5c);
170 r8712_write8(padapter
, 0x1025FE5c, (val8
|BIT(7)));
171 val8
= r8712_read8(padapter
, 0x102500ab);
172 r8712_write8(padapter
, 0x102500ab, (val8
|BIT(6)|BIT(7)));
173 /* For power save, used this in the bit file after 970621 */
174 val8
= r8712_read8(padapter
, SYS_CLKR
);
175 r8712_write8(padapter
, SYS_CLKR
, val8
&(~CPU_CLKSEL
));
176 } else if (pregistrypriv
->chip_version
== RTL8712_2ndCUT
||
177 pregistrypriv
->chip_version
== RTL8712_3rdCUT
) {
178 /* Initialization for power on sequence,
179 * E-Fuse leakage prevention sequence
181 r8712_write8(padapter
, 0x37, 0xb0);
183 r8712_write8(padapter
, 0x37, 0x30);
184 /* Set control path switch to HW control and reset Digital Core,
185 * CPU Core and MAC I/O to solve FW download fail when system
188 val8
= r8712_read8(padapter
, SYS_CLKR
+ 1);
191 r8712_write8(padapter
, SYS_CLKR
+ 1, val8
);
193 val8
= r8712_read8(padapter
, SYS_FUNC_EN
+ 1);
195 r8712_write8(padapter
, SYS_FUNC_EN
+ 1, val8
);
198 /* Enable AFE Macro Block's Bandgap and Enable AFE Macro
200 r8712_write8(padapter
, SPS0_CTRL
+ 1, 0x53);
201 r8712_write8(padapter
, SPS0_CTRL
, 0x57);
202 val8
= r8712_read8(padapter
, AFE_MISC
);
204 r8712_write8(padapter
, AFE_MISC
, (val8
| AFE_MISC_BGEN
));
205 r8712_write8(padapter
, AFE_MISC
, (val8
| AFE_MISC_BGEN
|
206 AFE_MISC_MBEN
| AFE_MISC_I32_EN
));
207 /* Enable PLL Power (LDOA15V) */
208 val8
= r8712_read8(padapter
, LDOA15_CTRL
);
209 r8712_write8(padapter
, LDOA15_CTRL
, (val8
| LDA15_EN
));
210 /* Enable LDOV12D block */
211 val8
= r8712_read8(padapter
, LDOV12D_CTRL
);
212 r8712_write8(padapter
, LDOV12D_CTRL
, (val8
| LDV12_EN
));
213 val8
= r8712_read8(padapter
, SYS_ISO_CTRL
+ 1);
214 r8712_write8(padapter
, SYS_ISO_CTRL
+ 1, (val8
| 0x08));
215 /* Engineer Packet CP test Enable */
216 val8
= r8712_read8(padapter
, SYS_FUNC_EN
+ 1);
217 r8712_write8(padapter
, SYS_FUNC_EN
+ 1, (val8
| 0x20));
218 /* Support 64k IMEM */
219 val8
= r8712_read8(padapter
, SYS_ISO_CTRL
+ 1);
220 r8712_write8(padapter
, SYS_ISO_CTRL
+ 1, (val8
& 0x68));
221 /* Enable AFE clock */
222 val8
= r8712_read8(padapter
, AFE_XTAL_CTRL
+ 1);
223 r8712_write8(padapter
, AFE_XTAL_CTRL
+ 1, (val8
& 0xfb));
224 /* Enable AFE PLL Macro Block */
225 val8
= r8712_read8(padapter
, AFE_PLL_CTRL
);
226 r8712_write8(padapter
, AFE_PLL_CTRL
, (val8
| 0x11));
227 /* Some sample will download fw failure. The clock will be
228 * stable with 500 us delay after reset the PLL
229 * TODO: When usleep is added to kernel, change next 3
230 * udelay(500) to usleep(500)
233 r8712_write8(padapter
, AFE_PLL_CTRL
, (val8
| 0x51));
235 r8712_write8(padapter
, AFE_PLL_CTRL
, (val8
| 0x11));
237 /* Attatch AFE PLL to MACTOP/BB/PCIe Digital */
238 val8
= r8712_read8(padapter
, SYS_ISO_CTRL
);
239 r8712_write8(padapter
, SYS_ISO_CTRL
, (val8
& 0xEE));
240 /* Switch to 40M clock */
241 r8712_write8(padapter
, SYS_CLKR
, 0x00);
242 /* CPU Clock and 80M Clock SSC Disable to overcome FW download
245 val8
= r8712_read8(padapter
, SYS_CLKR
);
246 r8712_write8(padapter
, SYS_CLKR
, (val8
| 0xa0));
247 /* Enable MAC clock */
248 val8
= r8712_read8(padapter
, SYS_CLKR
+ 1);
249 r8712_write8(padapter
, SYS_CLKR
+ 1, (val8
| 0x18));
251 r8712_write8(padapter
, PMC_FSM
, 0x02);
252 /* Enable Core digital and enable IOREG R/W */
253 val8
= r8712_read8(padapter
, SYS_FUNC_EN
+ 1);
254 r8712_write8(padapter
, SYS_FUNC_EN
+ 1, (val8
| 0x08));
256 val8
= r8712_read8(padapter
, SYS_FUNC_EN
+ 1);
257 r8712_write8(padapter
, SYS_FUNC_EN
+ 1, (val8
| 0x80));
258 /* Switch the control path to FW */
259 val8
= r8712_read8(padapter
, SYS_CLKR
+ 1);
260 r8712_write8(padapter
, SYS_CLKR
+ 1, (val8
| 0x80) & 0xBF);
261 r8712_write8(padapter
, CR
, 0xFC);
262 r8712_write8(padapter
, CR
+ 1, 0x37);
263 /* Fix the RX FIFO issue(usb error), 970410 */
264 val8
= r8712_read8(padapter
, 0x1025FE5c);
265 r8712_write8(padapter
, 0x1025FE5c, (val8
| BIT(7)));
266 /* For power save, used this in the bit file after 970621 */
267 val8
= r8712_read8(padapter
, SYS_CLKR
);
268 r8712_write8(padapter
, SYS_CLKR
, val8
& (~CPU_CLKSEL
));
269 /* Revised for 8051 ROM code wrong operation. */
270 r8712_write8(padapter
, 0x1025fe1c, 0x80);
271 /* To make sure that TxDMA can ready to download FW.
272 * We should reset TxDMA if IMEM RPT was not ready.
275 val8
= r8712_read8(padapter
, TCR
);
276 if ((val8
& _TXDMA_INIT_VALUE
) == _TXDMA_INIT_VALUE
)
278 udelay(5); /* PlatformStallExecution(5); */
279 } while (PollingCnt
--); /* Delay 1ms */
281 if (PollingCnt
<= 0) {
282 val8
= r8712_read8(padapter
, CR
);
283 r8712_write8(padapter
, CR
, val8
&(~_TXDMA_EN
));
284 udelay(2); /* PlatformStallExecution(2); */
286 r8712_write8(padapter
, CR
, val8
|_TXDMA_EN
);
293 unsigned int r8712_usb_inirp_init(struct _adapter
*padapter
)
296 struct recv_buf
*precvbuf
;
297 struct intf_hdl
*pintfhdl
= &padapter
->pio_queue
->intf
;
298 struct recv_priv
*precvpriv
= &(padapter
->recvpriv
);
300 precvpriv
->ff_hwaddr
= RTL8712_DMA_RX0FF
; /* mapping rx fifo address */
301 /* issue Rx irp to receive data */
302 precvbuf
= (struct recv_buf
*)precvpriv
->precv_buf
;
303 for (i
= 0; i
< NR_RECVBUFF
; i
++) {
304 if (r8712_usb_read_port(pintfhdl
, precvpriv
->ff_hwaddr
, 0,
305 (unsigned char *)precvbuf
) == false)
308 precvpriv
->free_recv_buf_queue_cnt
--;
313 unsigned int r8712_usb_inirp_deinit(struct _adapter
*padapter
)
315 r8712_usb_read_port_cancel(padapter
);