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