0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 #define _HCI_HAL_INIT_C_
0018
0019 #include "osdep_service.h"
0020 #include "drv_types.h"
0021 #include "usb_ops.h"
0022 #include "usb_osintf.h"
0023
0024 u8 r8712_usb_hal_bus_init(struct _adapter *adapter)
0025 {
0026 u8 val8 = 0;
0027 u8 ret = _SUCCESS;
0028 int PollingCnt = 20;
0029 struct registry_priv *registrypriv = &adapter->registrypriv;
0030
0031 if (registrypriv->chip_version == RTL8712_FPGA) {
0032 val8 = 0x01;
0033
0034 r8712_write8(adapter, SYS_CLKR, val8);
0035 val8 = r8712_read8(adapter, SPS1_CTRL);
0036 val8 = val8 | 0x01;
0037
0038 r8712_write8(adapter, SPS1_CTRL, val8);
0039 val8 = r8712_read8(adapter, AFE_MISC);
0040 val8 = val8 | 0x01;
0041
0042 r8712_write8(adapter, AFE_MISC, val8);
0043 val8 = r8712_read8(adapter, LDOA15_CTRL);
0044 val8 = val8 | 0x01;
0045
0046 r8712_write8(adapter, LDOA15_CTRL, val8);
0047 val8 = r8712_read8(adapter, SPS1_CTRL);
0048 val8 = val8 | 0x02;
0049
0050 r8712_write8(adapter, SPS1_CTRL, val8);
0051 val8 = r8712_read8(adapter, AFE_MISC);
0052 val8 = val8 | 0x02;
0053
0054 r8712_write8(adapter, AFE_MISC, val8);
0055 val8 = r8712_read8(adapter, SYS_ISO_CTRL + 1);
0056 val8 = val8 | 0x08;
0057
0058 r8712_write8(adapter, SYS_ISO_CTRL + 1, val8);
0059 val8 = r8712_read8(adapter, SYS_ISO_CTRL + 1);
0060 val8 = val8 & 0xEF;
0061
0062 r8712_write8(adapter, SYS_ISO_CTRL + 1, val8);
0063 val8 = r8712_read8(adapter, AFE_XTAL_CTRL + 1);
0064 val8 = val8 & 0xFB;
0065
0066 r8712_write8(adapter, AFE_XTAL_CTRL + 1, val8);
0067 val8 = r8712_read8(adapter, AFE_PLL_CTRL);
0068 val8 = val8 | 0x01;
0069
0070 r8712_write8(adapter, AFE_PLL_CTRL, val8);
0071 val8 = 0xEE;
0072
0073 r8712_write8(adapter, SYS_ISO_CTRL, val8);
0074 val8 = r8712_read8(adapter, SYS_CLKR + 1);
0075 val8 = val8 | 0x08;
0076
0077 r8712_write8(adapter, SYS_CLKR + 1, val8);
0078 val8 = r8712_read8(adapter, SYS_FUNC_EN + 1);
0079 val8 = val8 | 0x08;
0080
0081 r8712_write8(adapter, SYS_FUNC_EN + 1, val8);
0082 val8 = val8 | 0x80;
0083
0084 r8712_write8(adapter, SYS_FUNC_EN + 1, val8);
0085 val8 = r8712_read8(adapter, SYS_CLKR + 1);
0086 val8 = (val8 | 0x80) & 0xBF;
0087
0088 r8712_write8(adapter, SYS_CLKR + 1, val8);
0089 val8 = 0xFC;
0090 r8712_write8(adapter, CR, val8);
0091 val8 = 0x37;
0092 r8712_write8(adapter, CR + 1, val8);
0093
0094 r8712_write8(adapter, 0x102500ab, r8712_read8(adapter,
0095 0x102500ab) | BIT(6) | BIT(7));
0096
0097 r8712_write8(adapter, 0x10250008, r8712_read8(adapter,
0098 0x10250008) & 0xfffffffb);
0099 } else if (registrypriv->chip_version == RTL8712_1stCUT) {
0100
0101 r8712_write8(adapter, SPS0_CTRL + 1, 0x53);
0102 r8712_write8(adapter, SPS0_CTRL, 0x57);
0103
0104
0105
0106 val8 = r8712_read8(adapter, AFE_MISC);
0107 r8712_write8(adapter, AFE_MISC, (val8 | AFE_MISC_BGEN |
0108 AFE_MISC_MBEN));
0109
0110 val8 = r8712_read8(adapter, LDOA15_CTRL);
0111 r8712_write8(adapter, LDOA15_CTRL, (val8 | LDA15_EN));
0112 val8 = r8712_read8(adapter, SPS1_CTRL);
0113 r8712_write8(adapter, SPS1_CTRL, (val8 | SPS1_LDEN));
0114 msleep(20);
0115
0116 val8 = r8712_read8(adapter, SPS1_CTRL);
0117 r8712_write8(adapter, SPS1_CTRL, (val8 | SPS1_SWEN));
0118 r8712_write32(adapter, SPS1_CTRL, 0x00a7b267);
0119 val8 = r8712_read8(adapter, SYS_ISO_CTRL + 1);
0120 r8712_write8(adapter, SYS_ISO_CTRL + 1, (val8 | 0x08));
0121
0122 val8 = r8712_read8(adapter, SYS_FUNC_EN + 1);
0123 r8712_write8(adapter, SYS_FUNC_EN + 1, (val8 | 0x20));
0124 val8 = r8712_read8(adapter, SYS_ISO_CTRL + 1);
0125 r8712_write8(adapter, SYS_ISO_CTRL + 1, (val8 & 0x6F));
0126
0127 val8 = r8712_read8(adapter, AFE_XTAL_CTRL + 1);
0128 r8712_write8(adapter, AFE_XTAL_CTRL + 1, (val8 & 0xfb));
0129
0130 val8 = r8712_read8(adapter, AFE_PLL_CTRL);
0131 r8712_write8(adapter, AFE_PLL_CTRL, (val8 | 0x11));
0132
0133 val8 = r8712_read8(adapter, SYS_ISO_CTRL);
0134 r8712_write8(adapter, SYS_ISO_CTRL, (val8 & 0xEE));
0135
0136 val8 = r8712_read8(adapter, SYS_CLKR);
0137 r8712_write8(adapter, SYS_CLKR, val8 & (~SYS_CLKSEL));
0138
0139 val8 = r8712_read8(adapter, SYS_CLKR);
0140
0141 val8 = r8712_read8(adapter, SYS_CLKR + 1);
0142 r8712_write8(adapter, SYS_CLKR + 1, (val8 | 0x18));
0143
0144 r8712_write8(adapter, PMC_FSM, 0x02);
0145
0146 val8 = r8712_read8(adapter, SYS_FUNC_EN + 1);
0147 r8712_write8(adapter, SYS_FUNC_EN + 1, (val8 | 0x08));
0148
0149 val8 = r8712_read8(adapter, SYS_FUNC_EN + 1);
0150 r8712_write8(adapter, SYS_FUNC_EN + 1, (val8 | 0x80));
0151
0152 val8 = r8712_read8(adapter, SYS_CLKR + 1);
0153 r8712_write8(adapter, SYS_CLKR + 1, (val8 | 0x80) & 0xBF);
0154 r8712_write8(adapter, CR, 0xFC);
0155 r8712_write8(adapter, CR + 1, 0x37);
0156
0157 val8 = r8712_read8(adapter, 0x1025FE5c);
0158 r8712_write8(adapter, 0x1025FE5c, (val8 | BIT(7)));
0159 val8 = r8712_read8(adapter, 0x102500ab);
0160 r8712_write8(adapter, 0x102500ab, (val8 | BIT(6) | BIT(7)));
0161
0162 val8 = r8712_read8(adapter, SYS_CLKR);
0163 r8712_write8(adapter, SYS_CLKR, val8 & (~CPU_CLKSEL));
0164 } else if (registrypriv->chip_version == RTL8712_2ndCUT ||
0165 registrypriv->chip_version == RTL8712_3rdCUT) {
0166
0167
0168
0169 r8712_write8(adapter, 0x37, 0xb0);
0170 msleep(20);
0171 r8712_write8(adapter, 0x37, 0x30);
0172
0173
0174
0175
0176 val8 = r8712_read8(adapter, SYS_CLKR + 1);
0177 if (val8 & 0x80) {
0178 val8 &= 0x3f;
0179 r8712_write8(adapter, SYS_CLKR + 1, val8);
0180 }
0181 val8 = r8712_read8(adapter, SYS_FUNC_EN + 1);
0182 val8 &= 0x73;
0183 r8712_write8(adapter, SYS_FUNC_EN + 1, val8);
0184 msleep(20);
0185
0186
0187
0188
0189 r8712_write8(adapter, SPS0_CTRL + 1, 0x53);
0190 r8712_write8(adapter, SPS0_CTRL, 0x57);
0191 val8 = r8712_read8(adapter, AFE_MISC);
0192
0193 r8712_write8(adapter, AFE_MISC, (val8 | AFE_MISC_BGEN));
0194 r8712_write8(adapter, AFE_MISC, (val8 | AFE_MISC_BGEN |
0195 AFE_MISC_MBEN | AFE_MISC_I32_EN));
0196
0197 val8 = r8712_read8(adapter, LDOA15_CTRL);
0198 r8712_write8(adapter, LDOA15_CTRL, (val8 | LDA15_EN));
0199
0200 val8 = r8712_read8(adapter, LDOV12D_CTRL);
0201 r8712_write8(adapter, LDOV12D_CTRL, (val8 | LDV12_EN));
0202 val8 = r8712_read8(adapter, SYS_ISO_CTRL + 1);
0203 r8712_write8(adapter, SYS_ISO_CTRL + 1, (val8 | 0x08));
0204
0205 val8 = r8712_read8(adapter, SYS_FUNC_EN + 1);
0206 r8712_write8(adapter, SYS_FUNC_EN + 1, (val8 | 0x20));
0207
0208 val8 = r8712_read8(adapter, SYS_ISO_CTRL + 1);
0209 r8712_write8(adapter, SYS_ISO_CTRL + 1, (val8 & 0x68));
0210
0211 val8 = r8712_read8(adapter, AFE_XTAL_CTRL + 1);
0212 r8712_write8(adapter, AFE_XTAL_CTRL + 1, (val8 & 0xfb));
0213
0214 val8 = r8712_read8(adapter, AFE_PLL_CTRL);
0215 r8712_write8(adapter, AFE_PLL_CTRL, (val8 | 0x11));
0216
0217
0218
0219
0220
0221 udelay(500);
0222 r8712_write8(adapter, AFE_PLL_CTRL, (val8 | 0x51));
0223 udelay(500);
0224 r8712_write8(adapter, AFE_PLL_CTRL, (val8 | 0x11));
0225 udelay(500);
0226
0227 val8 = r8712_read8(adapter, SYS_ISO_CTRL);
0228 r8712_write8(adapter, SYS_ISO_CTRL, (val8 & 0xEE));
0229
0230 r8712_write8(adapter, SYS_CLKR, 0x00);
0231
0232
0233
0234 val8 = r8712_read8(adapter, SYS_CLKR);
0235 r8712_write8(adapter, SYS_CLKR, (val8 | 0xa0));
0236
0237 val8 = r8712_read8(adapter, SYS_CLKR + 1);
0238 r8712_write8(adapter, SYS_CLKR + 1, (val8 | 0x18));
0239
0240 r8712_write8(adapter, PMC_FSM, 0x02);
0241
0242 val8 = r8712_read8(adapter, SYS_FUNC_EN + 1);
0243 r8712_write8(adapter, SYS_FUNC_EN + 1, (val8 | 0x08));
0244
0245 val8 = r8712_read8(adapter, SYS_FUNC_EN + 1);
0246 r8712_write8(adapter, SYS_FUNC_EN + 1, (val8 | 0x80));
0247
0248 val8 = r8712_read8(adapter, SYS_CLKR + 1);
0249 r8712_write8(adapter, SYS_CLKR + 1, (val8 | 0x80) & 0xBF);
0250 r8712_write8(adapter, CR, 0xFC);
0251 r8712_write8(adapter, CR + 1, 0x37);
0252
0253 val8 = r8712_read8(adapter, 0x1025FE5c);
0254 r8712_write8(adapter, 0x1025FE5c, (val8 | BIT(7)));
0255
0256 val8 = r8712_read8(adapter, SYS_CLKR);
0257 r8712_write8(adapter, SYS_CLKR, val8 & (~CPU_CLKSEL));
0258
0259 r8712_write8(adapter, 0x1025fe1c, 0x80);
0260
0261
0262
0263 do {
0264 val8 = r8712_read8(adapter, TCR);
0265 if ((val8 & _TXDMA_INIT_VALUE) == _TXDMA_INIT_VALUE)
0266 break;
0267 udelay(5);
0268 } while (PollingCnt--);
0269
0270 if (PollingCnt <= 0) {
0271 val8 = r8712_read8(adapter, CR);
0272 r8712_write8(adapter, CR, val8 & (~_TXDMA_EN));
0273 udelay(2);
0274
0275 r8712_write8(adapter, CR, val8 | _TXDMA_EN);
0276 }
0277 } else {
0278 ret = _FAIL;
0279 }
0280 return ret;
0281 }
0282
0283 unsigned int r8712_usb_inirp_init(struct _adapter *adapter)
0284 {
0285 u8 i;
0286 struct recv_buf *recvbuf;
0287 struct intf_hdl *intfhdl = &adapter->pio_queue->intf;
0288 struct recv_priv *recvpriv = &(adapter->recvpriv);
0289
0290 recvpriv->ff_hwaddr = RTL8712_DMA_RX0FF;
0291
0292 recvbuf = (struct recv_buf *)recvpriv->precv_buf;
0293 for (i = 0; i < NR_RECVBUFF; i++) {
0294 if (r8712_usb_read_port(intfhdl, recvpriv->ff_hwaddr, 0,
0295 (unsigned char *)recvbuf) == false)
0296 return _FAIL;
0297 recvbuf++;
0298 recvpriv->free_recv_buf_queue_cnt--;
0299 }
0300 return _SUCCESS;
0301 }
0302
0303 unsigned int r8712_usb_inirp_deinit(struct _adapter *adapter)
0304 {
0305 r8712_usb_read_port_cancel(adapter);
0306 return _SUCCESS;
0307 }