diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 18:49:45 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 18:49:45 +0000 |
commit | 2c3c1048746a4622d8c89a29670120dc8fab93c4 (patch) | |
tree | 848558de17fb3008cdf4d861b01ac7781903ce39 /drivers/staging/rtl8712/usb_halinit.c | |
parent | Initial commit. (diff) | |
download | linux-upstream.tar.xz linux-upstream.zip |
Adding upstream version 6.1.76.upstream/6.1.76upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'drivers/staging/rtl8712/usb_halinit.c')
-rw-r--r-- | drivers/staging/rtl8712/usb_halinit.c | 307 |
1 files changed, 307 insertions, 0 deletions
diff --git a/drivers/staging/rtl8712/usb_halinit.c b/drivers/staging/rtl8712/usb_halinit.c new file mode 100644 index 000000000..313c56974 --- /dev/null +++ b/drivers/staging/rtl8712/usb_halinit.c @@ -0,0 +1,307 @@ +// SPDX-License-Identifier: GPL-2.0 +/****************************************************************************** + * usb_halinit.c + * + * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved. + * Linux device driver for RTL8192SU + * + * Modifications for inclusion into the Linux staging tree are + * Copyright(c) 2010 Larry Finger. All rights reserved. + * + * Contact information: + * WLAN FAE <wlanfae@realtek.com> + * Larry Finger <Larry.Finger@lwfinger.net> + * + ******************************************************************************/ + +#define _HCI_HAL_INIT_C_ + +#include "osdep_service.h" +#include "drv_types.h" +#include "usb_ops.h" +#include "usb_osintf.h" + +u8 r8712_usb_hal_bus_init(struct _adapter *adapter) +{ + u8 val8 = 0; + u8 ret = _SUCCESS; + int PollingCnt = 20; + struct registry_priv *registrypriv = &adapter->registrypriv; + + if (registrypriv->chip_version == RTL8712_FPGA) { + val8 = 0x01; + /* switch to 80M clock */ + r8712_write8(adapter, SYS_CLKR, val8); + val8 = r8712_read8(adapter, SPS1_CTRL); + val8 = val8 | 0x01; + /* enable VSPS12 LDO Macro block */ + r8712_write8(adapter, SPS1_CTRL, val8); + val8 = r8712_read8(adapter, AFE_MISC); + val8 = val8 | 0x01; + /* Enable AFE Macro Block's Bandgap */ + r8712_write8(adapter, AFE_MISC, val8); + val8 = r8712_read8(adapter, LDOA15_CTRL); + val8 = val8 | 0x01; + /* enable LDOA15 block */ + r8712_write8(adapter, LDOA15_CTRL, val8); + val8 = r8712_read8(adapter, SPS1_CTRL); + val8 = val8 | 0x02; + /* Enable VSPS12_SW Macro Block */ + r8712_write8(adapter, SPS1_CTRL, val8); + val8 = r8712_read8(adapter, AFE_MISC); + val8 = val8 | 0x02; + /* Enable AFE Macro Block's Mbias */ + r8712_write8(adapter, AFE_MISC, val8); + val8 = r8712_read8(adapter, SYS_ISO_CTRL + 1); + val8 = val8 | 0x08; + /* isolate PCIe Analog 1.2V to PCIe 3.3V and PCIE Digital */ + r8712_write8(adapter, SYS_ISO_CTRL + 1, val8); + val8 = r8712_read8(adapter, SYS_ISO_CTRL + 1); + val8 = val8 & 0xEF; + /* attach AFE PLL to MACTOP/BB/PCIe Digital */ + r8712_write8(adapter, SYS_ISO_CTRL + 1, val8); + val8 = r8712_read8(adapter, AFE_XTAL_CTRL + 1); + val8 = val8 & 0xFB; + /* enable AFE clock */ + r8712_write8(adapter, AFE_XTAL_CTRL + 1, val8); + val8 = r8712_read8(adapter, AFE_PLL_CTRL); + val8 = val8 | 0x01; + /* Enable AFE PLL Macro Block */ + r8712_write8(adapter, AFE_PLL_CTRL, val8); + val8 = 0xEE; + /* release isolation AFE PLL & MD */ + r8712_write8(adapter, SYS_ISO_CTRL, val8); + val8 = r8712_read8(adapter, SYS_CLKR + 1); + val8 = val8 | 0x08; + /* enable MAC clock */ + r8712_write8(adapter, SYS_CLKR + 1, val8); + val8 = r8712_read8(adapter, SYS_FUNC_EN + 1); + val8 = val8 | 0x08; + /* enable Core digital and enable IOREG R/W */ + r8712_write8(adapter, SYS_FUNC_EN + 1, val8); + val8 = val8 | 0x80; + /* enable REG_EN */ + r8712_write8(adapter, SYS_FUNC_EN + 1, val8); + val8 = r8712_read8(adapter, SYS_CLKR + 1); + val8 = (val8 | 0x80) & 0xBF; + /* switch the control path */ + r8712_write8(adapter, SYS_CLKR + 1, val8); + val8 = 0xFC; + r8712_write8(adapter, CR, val8); + val8 = 0x37; + r8712_write8(adapter, CR + 1, val8); + /* reduce EndPoint & init it */ + r8712_write8(adapter, 0x102500ab, r8712_read8(adapter, + 0x102500ab) | BIT(6) | BIT(7)); + /* consideration of power consumption - init */ + r8712_write8(adapter, 0x10250008, r8712_read8(adapter, + 0x10250008) & 0xfffffffb); + } else if (registrypriv->chip_version == RTL8712_1stCUT) { + /* Initialization for power on sequence, */ + r8712_write8(adapter, SPS0_CTRL + 1, 0x53); + r8712_write8(adapter, SPS0_CTRL, 0x57); + /* Enable AFE Macro Block's Bandgap and Enable AFE Macro + * Block's Mbias + */ + val8 = r8712_read8(adapter, AFE_MISC); + r8712_write8(adapter, AFE_MISC, (val8 | AFE_MISC_BGEN | + AFE_MISC_MBEN)); + /* Enable LDOA15 block */ + val8 = r8712_read8(adapter, LDOA15_CTRL); + r8712_write8(adapter, LDOA15_CTRL, (val8 | LDA15_EN)); + val8 = r8712_read8(adapter, SPS1_CTRL); + r8712_write8(adapter, SPS1_CTRL, (val8 | SPS1_LDEN)); + msleep(20); + /* Enable Switch Regulator Block */ + val8 = r8712_read8(adapter, SPS1_CTRL); + r8712_write8(adapter, SPS1_CTRL, (val8 | SPS1_SWEN)); + r8712_write32(adapter, SPS1_CTRL, 0x00a7b267); + val8 = r8712_read8(adapter, SYS_ISO_CTRL + 1); + r8712_write8(adapter, SYS_ISO_CTRL + 1, (val8 | 0x08)); + /* Engineer Packet CP test Enable */ + val8 = r8712_read8(adapter, SYS_FUNC_EN + 1); + r8712_write8(adapter, SYS_FUNC_EN + 1, (val8 | 0x20)); + val8 = r8712_read8(adapter, SYS_ISO_CTRL + 1); + r8712_write8(adapter, SYS_ISO_CTRL + 1, (val8 & 0x6F)); + /* Enable AFE clock */ + val8 = r8712_read8(adapter, AFE_XTAL_CTRL + 1); + r8712_write8(adapter, AFE_XTAL_CTRL + 1, (val8 & 0xfb)); + /* Enable AFE PLL Macro Block */ + val8 = r8712_read8(adapter, AFE_PLL_CTRL); + r8712_write8(adapter, AFE_PLL_CTRL, (val8 | 0x11)); + /* Attach AFE PLL to MACTOP/BB/PCIe Digital */ + val8 = r8712_read8(adapter, SYS_ISO_CTRL); + r8712_write8(adapter, SYS_ISO_CTRL, (val8 & 0xEE)); + /* Switch to 40M clock */ + val8 = r8712_read8(adapter, SYS_CLKR); + r8712_write8(adapter, SYS_CLKR, val8 & (~SYS_CLKSEL)); + /* SSC Disable */ + val8 = r8712_read8(adapter, SYS_CLKR); + /* Enable MAC clock */ + val8 = r8712_read8(adapter, SYS_CLKR + 1); + r8712_write8(adapter, SYS_CLKR + 1, (val8 | 0x18)); + /* Revised POS, */ + r8712_write8(adapter, PMC_FSM, 0x02); + /* Enable Core digital and enable IOREG R/W */ + val8 = r8712_read8(adapter, SYS_FUNC_EN + 1); + r8712_write8(adapter, SYS_FUNC_EN + 1, (val8 | 0x08)); + /* Enable REG_EN */ + val8 = r8712_read8(adapter, SYS_FUNC_EN + 1); + r8712_write8(adapter, SYS_FUNC_EN + 1, (val8 | 0x80)); + /* Switch the control path to FW */ + val8 = r8712_read8(adapter, SYS_CLKR + 1); + r8712_write8(adapter, SYS_CLKR + 1, (val8 | 0x80) & 0xBF); + r8712_write8(adapter, CR, 0xFC); + r8712_write8(adapter, CR + 1, 0x37); + /* Fix the RX FIFO issue(usb error), */ + val8 = r8712_read8(adapter, 0x1025FE5c); + r8712_write8(adapter, 0x1025FE5c, (val8 | BIT(7))); + val8 = r8712_read8(adapter, 0x102500ab); + r8712_write8(adapter, 0x102500ab, (val8 | BIT(6) | BIT(7))); + /* For power save, used this in the bit file after 970621 */ + val8 = r8712_read8(adapter, SYS_CLKR); + r8712_write8(adapter, SYS_CLKR, val8 & (~CPU_CLKSEL)); + } else if (registrypriv->chip_version == RTL8712_2ndCUT || + registrypriv->chip_version == RTL8712_3rdCUT) { + /* Initialization for power on sequence, + * E-Fuse leakage prevention sequence + */ + r8712_write8(adapter, 0x37, 0xb0); + msleep(20); + r8712_write8(adapter, 0x37, 0x30); + /* Set control path switch to HW control and reset Digital Core, + * CPU Core and MAC I/O to solve FW download fail when system + * from resume sate. + */ + val8 = r8712_read8(adapter, SYS_CLKR + 1); + if (val8 & 0x80) { + val8 &= 0x3f; + r8712_write8(adapter, SYS_CLKR + 1, val8); + } + val8 = r8712_read8(adapter, SYS_FUNC_EN + 1); + val8 &= 0x73; + r8712_write8(adapter, SYS_FUNC_EN + 1, val8); + msleep(20); + /* Revised POS, */ + /* Enable AFE Macro Block's Bandgap and Enable AFE Macro + * Block's Mbias + */ + r8712_write8(adapter, SPS0_CTRL + 1, 0x53); + r8712_write8(adapter, SPS0_CTRL, 0x57); + val8 = r8712_read8(adapter, AFE_MISC); + /*Bandgap*/ + r8712_write8(adapter, AFE_MISC, (val8 | AFE_MISC_BGEN)); + r8712_write8(adapter, AFE_MISC, (val8 | AFE_MISC_BGEN | + AFE_MISC_MBEN | AFE_MISC_I32_EN)); + /* Enable PLL Power (LDOA15V) */ + val8 = r8712_read8(adapter, LDOA15_CTRL); + r8712_write8(adapter, LDOA15_CTRL, (val8 | LDA15_EN)); + /* Enable LDOV12D block */ + val8 = r8712_read8(adapter, LDOV12D_CTRL); + r8712_write8(adapter, LDOV12D_CTRL, (val8 | LDV12_EN)); + val8 = r8712_read8(adapter, SYS_ISO_CTRL + 1); + r8712_write8(adapter, SYS_ISO_CTRL + 1, (val8 | 0x08)); + /* Engineer Packet CP test Enable */ + val8 = r8712_read8(adapter, SYS_FUNC_EN + 1); + r8712_write8(adapter, SYS_FUNC_EN + 1, (val8 | 0x20)); + /* Support 64k IMEM */ + val8 = r8712_read8(adapter, SYS_ISO_CTRL + 1); + r8712_write8(adapter, SYS_ISO_CTRL + 1, (val8 & 0x68)); + /* Enable AFE clock */ + val8 = r8712_read8(adapter, AFE_XTAL_CTRL + 1); + r8712_write8(adapter, AFE_XTAL_CTRL + 1, (val8 & 0xfb)); + /* Enable AFE PLL Macro Block */ + val8 = r8712_read8(adapter, AFE_PLL_CTRL); + r8712_write8(adapter, AFE_PLL_CTRL, (val8 | 0x11)); + /* Some sample will download fw failure. The clock will be + * stable with 500 us delay after reset the PLL + * TODO: When usleep is added to kernel, change next 3 + * udelay(500) to usleep(500) + */ + udelay(500); + r8712_write8(adapter, AFE_PLL_CTRL, (val8 | 0x51)); + udelay(500); + r8712_write8(adapter, AFE_PLL_CTRL, (val8 | 0x11)); + udelay(500); + /* Attach AFE PLL to MACTOP/BB/PCIe Digital */ + val8 = r8712_read8(adapter, SYS_ISO_CTRL); + r8712_write8(adapter, SYS_ISO_CTRL, (val8 & 0xEE)); + /* Switch to 40M clock */ + r8712_write8(adapter, SYS_CLKR, 0x00); + /* CPU Clock and 80M Clock SSC Disable to overcome FW download + * fail timing issue. + */ + val8 = r8712_read8(adapter, SYS_CLKR); + r8712_write8(adapter, SYS_CLKR, (val8 | 0xa0)); + /* Enable MAC clock */ + val8 = r8712_read8(adapter, SYS_CLKR + 1); + r8712_write8(adapter, SYS_CLKR + 1, (val8 | 0x18)); + /* Revised POS, */ + r8712_write8(adapter, PMC_FSM, 0x02); + /* Enable Core digital and enable IOREG R/W */ + val8 = r8712_read8(adapter, SYS_FUNC_EN + 1); + r8712_write8(adapter, SYS_FUNC_EN + 1, (val8 | 0x08)); + /* Enable REG_EN */ + val8 = r8712_read8(adapter, SYS_FUNC_EN + 1); + r8712_write8(adapter, SYS_FUNC_EN + 1, (val8 | 0x80)); + /* Switch the control path to FW */ + val8 = r8712_read8(adapter, SYS_CLKR + 1); + r8712_write8(adapter, SYS_CLKR + 1, (val8 | 0x80) & 0xBF); + r8712_write8(adapter, CR, 0xFC); + r8712_write8(adapter, CR + 1, 0x37); + /* Fix the RX FIFO issue(usb error), 970410 */ + val8 = r8712_read8(adapter, 0x1025FE5c); + r8712_write8(adapter, 0x1025FE5c, (val8 | BIT(7))); + /* For power save, used this in the bit file after 970621 */ + val8 = r8712_read8(adapter, SYS_CLKR); + r8712_write8(adapter, SYS_CLKR, val8 & (~CPU_CLKSEL)); + /* Revised for 8051 ROM code wrong operation. */ + r8712_write8(adapter, 0x1025fe1c, 0x80); + /* To make sure that TxDMA can ready to download FW. + * We should reset TxDMA if IMEM RPT was not ready. + */ + do { + val8 = r8712_read8(adapter, TCR); + if ((val8 & _TXDMA_INIT_VALUE) == _TXDMA_INIT_VALUE) + break; + udelay(5); /* PlatformStallExecution(5); */ + } while (PollingCnt--); /* Delay 1ms */ + + if (PollingCnt <= 0) { + val8 = r8712_read8(adapter, CR); + r8712_write8(adapter, CR, val8 & (~_TXDMA_EN)); + udelay(2); /* PlatformStallExecution(2); */ + /* Reset TxDMA */ + r8712_write8(adapter, CR, val8 | _TXDMA_EN); + } + } else { + ret = _FAIL; + } + return ret; +} + +unsigned int r8712_usb_inirp_init(struct _adapter *adapter) +{ + u8 i; + struct recv_buf *recvbuf; + struct intf_hdl *intfhdl = &adapter->pio_queue->intf; + struct recv_priv *recvpriv = &(adapter->recvpriv); + + recvpriv->ff_hwaddr = RTL8712_DMA_RX0FF; /* mapping rx fifo address */ + /* issue Rx irp to receive data */ + recvbuf = (struct recv_buf *)recvpriv->precv_buf; + for (i = 0; i < NR_RECVBUFF; i++) { + if (r8712_usb_read_port(intfhdl, recvpriv->ff_hwaddr, 0, + (unsigned char *)recvbuf) == false) + return _FAIL; + recvbuf++; + recvpriv->free_recv_buf_queue_cnt--; + } + return _SUCCESS; +} + +unsigned int r8712_usb_inirp_deinit(struct _adapter *adapter) +{ + r8712_usb_read_port_cancel(adapter); + return _SUCCESS; +} |