usb_halinit.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. /******************************************************************************
  2. * usb_halinit.c
  3. *
  4. * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
  5. * Linux device driver for RTL8192SU
  6. *
  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.
  10. *
  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
  14. * more details.
  15. *
  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
  19. *
  20. * Modifications for inclusion into the Linux staging tree are
  21. * Copyright(c) 2010 Larry Finger. All rights reserved.
  22. *
  23. * Contact information:
  24. * WLAN FAE <wlanfae@realtek.com>
  25. * Larry Finger <Larry.Finger@lwfinger.net>
  26. *
  27. ******************************************************************************/
  28. #define _HCI_HAL_INIT_C_
  29. #include "osdep_service.h"
  30. #include "drv_types.h"
  31. #include "usb_ops.h"
  32. #include "usb_osintf.h"
  33. u8 r8712_usb_hal_bus_init(struct _adapter *padapter)
  34. {
  35. u8 val8 = 0;
  36. u8 ret = _SUCCESS;
  37. int PollingCnt = 20;
  38. struct registry_priv *pregistrypriv = &padapter->registrypriv;
  39. if (pregistrypriv->chip_version == RTL8712_FPGA) {
  40. val8 = 0x01;
  41. /* switch to 80M clock */
  42. r8712_write8(padapter, SYS_CLKR, val8);
  43. val8 = r8712_read8(padapter, SPS1_CTRL);
  44. val8 = val8 | 0x01;
  45. /* enable VSPS12 LDO Macro block */
  46. r8712_write8(padapter, SPS1_CTRL, val8);
  47. val8 = r8712_read8(padapter, AFE_MISC);
  48. val8 = val8 | 0x01;
  49. /* Enable AFE Macro Block's Bandgap */
  50. r8712_write8(padapter, AFE_MISC, val8);
  51. val8 = r8712_read8(padapter, LDOA15_CTRL);
  52. val8 = val8 | 0x01;
  53. /* enable LDOA15 block */
  54. r8712_write8(padapter, LDOA15_CTRL, val8);
  55. val8 = r8712_read8(padapter, SPS1_CTRL);
  56. val8 = val8 | 0x02;
  57. /* Enable VSPS12_SW Macro Block */
  58. r8712_write8(padapter, SPS1_CTRL, val8);
  59. val8 = r8712_read8(padapter, AFE_MISC);
  60. val8 = val8 | 0x02;
  61. /* Enable AFE Macro Block's Mbias */
  62. r8712_write8(padapter, AFE_MISC, val8);
  63. val8 = r8712_read8(padapter, SYS_ISO_CTRL + 1);
  64. val8 = val8 | 0x08;
  65. /* isolate PCIe Analog 1.2V to PCIe 3.3V and PCIE Digital */
  66. r8712_write8(padapter, SYS_ISO_CTRL + 1, val8);
  67. val8 = r8712_read8(padapter, SYS_ISO_CTRL + 1);
  68. val8 = val8 & 0xEF;
  69. /* attatch AFE PLL to MACTOP/BB/PCIe Digital */
  70. r8712_write8(padapter, SYS_ISO_CTRL + 1, val8);
  71. val8 = r8712_read8(padapter, AFE_XTAL_CTRL + 1);
  72. val8 = val8 & 0xFB;
  73. /* enable AFE clock */
  74. r8712_write8(padapter, AFE_XTAL_CTRL + 1, val8);
  75. val8 = r8712_read8(padapter, AFE_PLL_CTRL);
  76. val8 = val8 | 0x01;
  77. /* Enable AFE PLL Macro Block */
  78. r8712_write8(padapter, AFE_PLL_CTRL, val8);
  79. val8 = 0xEE;
  80. /* release isolation AFE PLL & MD */
  81. r8712_write8(padapter, SYS_ISO_CTRL, val8);
  82. val8 = r8712_read8(padapter, SYS_CLKR + 1);
  83. val8 = val8 | 0x08;
  84. /* enable MAC clock */
  85. r8712_write8(padapter, SYS_CLKR + 1, val8);
  86. val8 = r8712_read8(padapter, SYS_FUNC_EN + 1);
  87. val8 = val8 | 0x08;
  88. /* enable Core digital and enable IOREG R/W */
  89. r8712_write8(padapter, SYS_FUNC_EN + 1, val8);
  90. val8 = val8 | 0x80;
  91. /* enable REG_EN */
  92. r8712_write8(padapter, SYS_FUNC_EN + 1, val8);
  93. val8 = r8712_read8(padapter, SYS_CLKR + 1);
  94. val8 = (val8 | 0x80) & 0xBF;
  95. /* switch the control path */
  96. r8712_write8(padapter, SYS_CLKR + 1, val8);
  97. val8 = 0xFC;
  98. r8712_write8(padapter, CR, val8);
  99. val8 = 0x37;
  100. r8712_write8(padapter, CR + 1, val8);
  101. /* reduce EndPoint & init it */
  102. r8712_write8(padapter, 0x102500ab, r8712_read8(padapter,
  103. 0x102500ab) | BIT(6) | BIT(7));
  104. /* consideration of power consumption - init */
  105. r8712_write8(padapter, 0x10250008, r8712_read8(padapter,
  106. 0x10250008) & 0xfffffffb);
  107. } else if (pregistrypriv->chip_version == RTL8712_1stCUT) {
  108. /* Initialization for power on sequence, */
  109. r8712_write8(padapter, SPS0_CTRL + 1, 0x53);
  110. r8712_write8(padapter, SPS0_CTRL, 0x57);
  111. /* Enable AFE Macro Block's Bandgap and Enable AFE Macro
  112. * Block's Mbias
  113. */
  114. val8 = r8712_read8(padapter, AFE_MISC);
  115. r8712_write8(padapter, AFE_MISC, (val8 | AFE_MISC_BGEN |
  116. AFE_MISC_MBEN));
  117. /* Enable LDOA15 block */
  118. val8 = r8712_read8(padapter, LDOA15_CTRL);
  119. r8712_write8(padapter, LDOA15_CTRL, (val8 | LDA15_EN));
  120. val8 = r8712_read8(padapter, SPS1_CTRL);
  121. r8712_write8(padapter, SPS1_CTRL, (val8 | SPS1_LDEN));
  122. msleep(20);
  123. /* Enable Switch Regulator Block */
  124. val8 = r8712_read8(padapter, SPS1_CTRL);
  125. r8712_write8(padapter, SPS1_CTRL, (val8 | SPS1_SWEN));
  126. r8712_write32(padapter, SPS1_CTRL, 0x00a7b267);
  127. val8 = r8712_read8(padapter, SYS_ISO_CTRL + 1);
  128. r8712_write8(padapter, SYS_ISO_CTRL + 1, (val8 | 0x08));
  129. /* Engineer Packet CP test Enable */
  130. val8 = r8712_read8(padapter, SYS_FUNC_EN + 1);
  131. r8712_write8(padapter, SYS_FUNC_EN + 1, (val8 | 0x20));
  132. val8 = r8712_read8(padapter, SYS_ISO_CTRL + 1);
  133. r8712_write8(padapter, SYS_ISO_CTRL + 1, (val8 & 0x6F));
  134. /* Enable AFE clock */
  135. val8 = r8712_read8(padapter, AFE_XTAL_CTRL + 1);
  136. r8712_write8(padapter, AFE_XTAL_CTRL + 1, (val8 & 0xfb));
  137. /* Enable AFE PLL Macro Block */
  138. val8 = r8712_read8(padapter, AFE_PLL_CTRL);
  139. r8712_write8(padapter, AFE_PLL_CTRL, (val8 | 0x11));
  140. /* Attach AFE PLL to MACTOP/BB/PCIe Digital */
  141. val8 = r8712_read8(padapter, SYS_ISO_CTRL);
  142. r8712_write8(padapter, SYS_ISO_CTRL, (val8 & 0xEE));
  143. /* Switch to 40M clock */
  144. val8 = r8712_read8(padapter, SYS_CLKR);
  145. r8712_write8(padapter, SYS_CLKR, val8 & (~SYS_CLKSEL));
  146. /* SSC Disable */
  147. val8 = r8712_read8(padapter, SYS_CLKR);
  148. /* Enable MAC clock */
  149. val8 = r8712_read8(padapter, SYS_CLKR + 1);
  150. r8712_write8(padapter, SYS_CLKR + 1, (val8 | 0x18));
  151. /* Revised POS, */
  152. r8712_write8(padapter, PMC_FSM, 0x02);
  153. /* Enable Core digital and enable IOREG R/W */
  154. val8 = r8712_read8(padapter, SYS_FUNC_EN + 1);
  155. r8712_write8(padapter, SYS_FUNC_EN + 1, (val8 | 0x08));
  156. /* Enable REG_EN */
  157. val8 = r8712_read8(padapter, SYS_FUNC_EN + 1);
  158. r8712_write8(padapter, SYS_FUNC_EN + 1, (val8 | 0x80));
  159. /* Switch the control path to FW */
  160. val8 = r8712_read8(padapter, SYS_CLKR + 1);
  161. r8712_write8(padapter, SYS_CLKR + 1, (val8 | 0x80) & 0xBF);
  162. r8712_write8(padapter, CR, 0xFC);
  163. r8712_write8(padapter, CR + 1, 0x37);
  164. /* Fix the RX FIFO issue(usb error), */
  165. val8 = r8712_read8(padapter, 0x1025FE5c);
  166. r8712_write8(padapter, 0x1025FE5c, (val8 | BIT(7)));
  167. val8 = r8712_read8(padapter, 0x102500ab);
  168. r8712_write8(padapter, 0x102500ab, (val8 | BIT(6) | BIT(7)));
  169. /* For power save, used this in the bit file after 970621 */
  170. val8 = r8712_read8(padapter, SYS_CLKR);
  171. r8712_write8(padapter, SYS_CLKR, val8 & (~CPU_CLKSEL));
  172. } else if (pregistrypriv->chip_version == RTL8712_2ndCUT ||
  173. pregistrypriv->chip_version == RTL8712_3rdCUT) {
  174. /* Initialization for power on sequence,
  175. * E-Fuse leakage prevention sequence
  176. */
  177. r8712_write8(padapter, 0x37, 0xb0);
  178. msleep(20);
  179. r8712_write8(padapter, 0x37, 0x30);
  180. /* Set control path switch to HW control and reset Digital Core,
  181. * CPU Core and MAC I/O to solve FW download fail when system
  182. * from resume sate.
  183. */
  184. val8 = r8712_read8(padapter, SYS_CLKR + 1);
  185. if (val8 & 0x80) {
  186. val8 &= 0x3f;
  187. r8712_write8(padapter, SYS_CLKR + 1, val8);
  188. }
  189. val8 = r8712_read8(padapter, SYS_FUNC_EN + 1);
  190. val8 &= 0x73;
  191. r8712_write8(padapter, SYS_FUNC_EN + 1, val8);
  192. msleep(20);
  193. /* Revised POS, */
  194. /* Enable AFE Macro Block's Bandgap and Enable AFE Macro
  195. * Block's Mbias */
  196. r8712_write8(padapter, SPS0_CTRL + 1, 0x53);
  197. r8712_write8(padapter, SPS0_CTRL, 0x57);
  198. val8 = r8712_read8(padapter, AFE_MISC);
  199. /*Bandgap*/
  200. r8712_write8(padapter, AFE_MISC, (val8 | AFE_MISC_BGEN));
  201. r8712_write8(padapter, AFE_MISC, (val8 | AFE_MISC_BGEN |
  202. AFE_MISC_MBEN | AFE_MISC_I32_EN));
  203. /* Enable PLL Power (LDOA15V) */
  204. val8 = r8712_read8(padapter, LDOA15_CTRL);
  205. r8712_write8(padapter, LDOA15_CTRL, (val8 | LDA15_EN));
  206. /* Enable LDOV12D block */
  207. val8 = r8712_read8(padapter, LDOV12D_CTRL);
  208. r8712_write8(padapter, LDOV12D_CTRL, (val8 | LDV12_EN));
  209. val8 = r8712_read8(padapter, SYS_ISO_CTRL + 1);
  210. r8712_write8(padapter, SYS_ISO_CTRL + 1, (val8 | 0x08));
  211. /* Engineer Packet CP test Enable */
  212. val8 = r8712_read8(padapter, SYS_FUNC_EN + 1);
  213. r8712_write8(padapter, SYS_FUNC_EN + 1, (val8 | 0x20));
  214. /* Support 64k IMEM */
  215. val8 = r8712_read8(padapter, SYS_ISO_CTRL + 1);
  216. r8712_write8(padapter, SYS_ISO_CTRL + 1, (val8 & 0x68));
  217. /* Enable AFE clock */
  218. val8 = r8712_read8(padapter, AFE_XTAL_CTRL + 1);
  219. r8712_write8(padapter, AFE_XTAL_CTRL + 1, (val8 & 0xfb));
  220. /* Enable AFE PLL Macro Block */
  221. val8 = r8712_read8(padapter, AFE_PLL_CTRL);
  222. r8712_write8(padapter, AFE_PLL_CTRL, (val8 | 0x11));
  223. /* Some sample will download fw failure. The clock will be
  224. * stable with 500 us delay after reset the PLL
  225. * TODO: When usleep is added to kernel, change next 3
  226. * udelay(500) to usleep(500)
  227. */
  228. udelay(500);
  229. r8712_write8(padapter, AFE_PLL_CTRL, (val8 | 0x51));
  230. udelay(500);
  231. r8712_write8(padapter, AFE_PLL_CTRL, (val8 | 0x11));
  232. udelay(500);
  233. /* Attach AFE PLL to MACTOP/BB/PCIe Digital */
  234. val8 = r8712_read8(padapter, SYS_ISO_CTRL);
  235. r8712_write8(padapter, SYS_ISO_CTRL, (val8 & 0xEE));
  236. /* Switch to 40M clock */
  237. r8712_write8(padapter, SYS_CLKR, 0x00);
  238. /* CPU Clock and 80M Clock SSC Disable to overcome FW download
  239. * fail timing issue.
  240. */
  241. val8 = r8712_read8(padapter, SYS_CLKR);
  242. r8712_write8(padapter, SYS_CLKR, (val8 | 0xa0));
  243. /* Enable MAC clock */
  244. val8 = r8712_read8(padapter, SYS_CLKR + 1);
  245. r8712_write8(padapter, SYS_CLKR + 1, (val8 | 0x18));
  246. /* Revised POS, */
  247. r8712_write8(padapter, PMC_FSM, 0x02);
  248. /* Enable Core digital and enable IOREG R/W */
  249. val8 = r8712_read8(padapter, SYS_FUNC_EN + 1);
  250. r8712_write8(padapter, SYS_FUNC_EN + 1, (val8 | 0x08));
  251. /* Enable REG_EN */
  252. val8 = r8712_read8(padapter, SYS_FUNC_EN + 1);
  253. r8712_write8(padapter, SYS_FUNC_EN + 1, (val8 | 0x80));
  254. /* Switch the control path to FW */
  255. val8 = r8712_read8(padapter, SYS_CLKR + 1);
  256. r8712_write8(padapter, SYS_CLKR + 1, (val8 | 0x80) & 0xBF);
  257. r8712_write8(padapter, CR, 0xFC);
  258. r8712_write8(padapter, CR + 1, 0x37);
  259. /* Fix the RX FIFO issue(usb error), 970410 */
  260. val8 = r8712_read8(padapter, 0x1025FE5c);
  261. r8712_write8(padapter, 0x1025FE5c, (val8 | BIT(7)));
  262. /* For power save, used this in the bit file after 970621 */
  263. val8 = r8712_read8(padapter, SYS_CLKR);
  264. r8712_write8(padapter, SYS_CLKR, val8 & (~CPU_CLKSEL));
  265. /* Revised for 8051 ROM code wrong operation. */
  266. r8712_write8(padapter, 0x1025fe1c, 0x80);
  267. /* To make sure that TxDMA can ready to download FW.
  268. * We should reset TxDMA if IMEM RPT was not ready.
  269. */
  270. do {
  271. val8 = r8712_read8(padapter, TCR);
  272. if ((val8 & _TXDMA_INIT_VALUE) == _TXDMA_INIT_VALUE)
  273. break;
  274. udelay(5); /* PlatformStallExecution(5); */
  275. } while (PollingCnt--); /* Delay 1ms */
  276. if (PollingCnt <= 0) {
  277. val8 = r8712_read8(padapter, CR);
  278. r8712_write8(padapter, CR, val8 & (~_TXDMA_EN));
  279. udelay(2); /* PlatformStallExecution(2); */
  280. /* Reset TxDMA */
  281. r8712_write8(padapter, CR, val8 | _TXDMA_EN);
  282. }
  283. } else {
  284. ret = _FAIL;
  285. }
  286. return ret;
  287. }
  288. unsigned int r8712_usb_inirp_init(struct _adapter *padapter)
  289. {
  290. u8 i;
  291. struct recv_buf *precvbuf;
  292. struct intf_hdl *pintfhdl = &padapter->pio_queue->intf;
  293. struct recv_priv *precvpriv = &(padapter->recvpriv);
  294. precvpriv->ff_hwaddr = RTL8712_DMA_RX0FF; /* mapping rx fifo address */
  295. /* issue Rx irp to receive data */
  296. precvbuf = (struct recv_buf *)precvpriv->precv_buf;
  297. for (i = 0; i < NR_RECVBUFF; i++) {
  298. if (r8712_usb_read_port(pintfhdl, precvpriv->ff_hwaddr, 0,
  299. (unsigned char *)precvbuf) == false)
  300. return _FAIL;
  301. precvbuf++;
  302. precvpriv->free_recv_buf_queue_cnt--;
  303. }
  304. return _SUCCESS;
  305. }
  306. unsigned int r8712_usb_inirp_deinit(struct _adapter *padapter)
  307. {
  308. r8712_usb_read_port_cancel(padapter);
  309. return _SUCCESS;
  310. }