summaryrefslogtreecommitdiffstats
path: root/target/linux/realtek/files/arch/rlx/bsp/pci.c
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/realtek/files/arch/rlx/bsp/pci.c')
-rw-r--r--target/linux/realtek/files/arch/rlx/bsp/pci.c1265
1 files changed, 0 insertions, 1265 deletions
diff --git a/target/linux/realtek/files/arch/rlx/bsp/pci.c b/target/linux/realtek/files/arch/rlx/bsp/pci.c
deleted file mode 100644
index 147f743cb..000000000
--- a/target/linux/realtek/files/arch/rlx/bsp/pci.c
+++ /dev/null
@@ -1,1265 +0,0 @@
-/*
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * RTL819XX PCIE Host Controller Glue Driver
- * Copyright (C) 2006, Realtek Semiconductor Corp.
- * Author: (ghhuang@realtek.com.tw)
- *
- * Copyright (C) 2013, Artur Artamonov (artur@advem.lv)
- *
- * Notes:
- * - Two host controllers available.
- * - Each host direcly connects to one device
- * - Supports PCI devices through PCIE-to-PCI bridges
- * - If no PCI devices are connected to RC. Timeout monitor shall be
- * enabled to prevent bus hanging.
- */
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/pci.h>
-#include <linux/interrupt.h>
-#include <linux/delay.h>
-//#include <asm/rlxregs.h>
-#include "bspchip.h"
-
-#define PCI_8BIT_ACCESS 1
-#define PCI_16BIT_ACCESS 2
-#define PCI_32BIT_ACCESS 4
-#define PCI_ACCESS_READ 8
-#define PCI_ACCESS_WRITE 16
-
-#define MAX_NUM_DEV 4
-
-#define DEBUG_PRINTK 0
-
-#define CLK_MANAGE 0xb8000010
-#define SYS_PCIE_PHY0 (0xb8000000 +0x50)
-#define SYS_PCIE_PHY1 (0xb8000000 +0x54)
-#define PCIE_PHY0 0xb8b01008
-#define PCIE_PHY1 0xb8b21008
-//best define ever
-#define PIN_208 1
-
-#define MAX_PAYLOAD_SIZE_128B 0
-
-static int pci0_bus_number = 0xff;
-static int pci1_bus_number = 0xff;
-
-
-
-static struct resource rtl8196c_pci0_io_resource = {
- .name = "RTL8196C PCI0 IO",
- .flags = IORESOURCE_IO,
- .start = PADDR(BSP_PCIE0_D_IO),
- .end = PADDR(BSP_PCIE0_D_IO + 0x1FFFFF)
-};
-
-static struct resource rtl8196c_pci0_mem_resource = {
- .name = "RTL8196C PCI0 MEM",
- .flags = IORESOURCE_MEM,
- .start = PADDR(BSP_PCIE0_D_MEM),
- .end = PADDR(BSP_PCIE0_D_MEM + 0xFFFFFF)
-};
-
-static struct resource rtl8196d_pci0_io_resource = {
- .name = "RTL8196D PCI0 IO",
- .flags = IORESOURCE_IO,
- .start = PADDR(BSP_PCIE0_D_IO),
- .end = PADDR(BSP_PCIE0_D_IO + 0x1FFFFF)
-};
-
-static struct resource rtl8196d_pci0_mem_resource = {
- .name = "RTL8196D PCI0 MEM",
- .flags = IORESOURCE_MEM,
- .start = PADDR(BSP_PCIE0_D_MEM),
- .end = PADDR(BSP_PCIE0_D_MEM + 0xFFFFFF)
-};
-
-static struct resource rtl8196b_pci1_io_resource = {
- .name = "RTL8196B PCI1 IO",
- .flags = IORESOURCE_IO,
- .start = PADDR(BSP_PCIE1_D_IO),
- .end = PADDR(BSP_PCIE1_D_IO + 0x1FFFFF)
-};
-
-static struct resource rtl8196b_pci1_mem_resource = {
- .name = "RTL8196B PCI1 MEM",
- .flags = IORESOURCE_MEM,
- .start = PADDR(BSP_PCIE1_D_MEM),
- .end = PADDR(BSP_PCIE1_D_MEM + 0xFFFFFF)
-};
-
-
-#if defined(CONFIG_RTL_8196C)
-static struct resource rtl8196b_pci0_io_resource = resource rtl8196c_pci0_io_resource;
-static struct resource rtl8196b_pci0_mem_resource = resource rtl8196c_pci0_mem_resource;
-#elif defined(CONFIG_RTL_819XD)
-static struct resource rtl8196b_pci0_io_resource = resource rtl8196d_pci0_io_resource;
-static struct resource rtl8196b_pci0_mem_resource = resource rtl8196d_pci0_mem_resource;
-#endif
-
-//HOST PCIE
-#define PCIE0_RC_EXT_BASE (0xb8b01000)
-#define PCIE1_RC_EXT_BASE (0xb8b21000)
-
-//RC Extended register
-#define PCIE0_MDIO (PCIE0_RC_EXT_BASE+0x00)
-#define PCIE1_MDIO (PCIE1_RC_EXT_BASE+0x00)
-
-//MDIO
-#define PCIE_MDIO_DATA_OFFSET (16)
-#define PCIE_MDIO_DATA_MASK (0xffff <<PCIE_MDIO_DATA_OFFSET)
-#define PCIE_MDIO_REG_OFFSET (8)
-#define PCIE_MDIO_RDWR_OFFSET (0)
-
-int at2_mode=0;
-
-//------------------------------------------------------------------------
-unsigned int HostPCIe_SetPhyMdioRead(unsigned int portnum, unsigned int regaddr)
-{
- unsigned int mdioaddr=PCIE0_MDIO;
-/*
- if(portnum==0) mdioaddr=PCIE0_MDIO;
- else if(portnum==1) mdioaddr=PCIE1_MDIO;
- else return 0;
-*/
- REG32(mdioaddr)= ((regaddr&0x1f)<<PCIE_MDIO_REG_OFFSET) | (0<<PCIE_MDIO_RDWR_OFFSET);
- //delay
- volatile int i;
- for(i=0;i<5555;i++) ;
-
- int val;
- val=REG32(mdioaddr)& (0xffff <<PCIE_MDIO_DATA_OFFSET) ;
- return ((val>>PCIE_MDIO_DATA_OFFSET)&0xffff);
-
-}
-
-
-void HostPCIe_SetPhyMdioWrite(unsigned int portnum, unsigned int regaddr, unsigned short val)
-{
- unsigned int mdioaddr;
-
- if(portnum==0) mdioaddr=PCIE0_MDIO;
- else if(portnum==1) mdioaddr=PCIE1_MDIO;
- else return 0;
-
- REG32(mdioaddr)= ( (regaddr&0x1f)<<PCIE_MDIO_REG_OFFSET) | ((val&0xffff)<<PCIE_MDIO_DATA_OFFSET) | (1<<PCIE_MDIO_RDWR_OFFSET) ;
- //delay
- volatile int i;
- for(i=0;i<5555;i++) ;
-}
-
-//----------------------------------------------------------------------------
-
-void PCIE_MDIO_Reset(unsigned int portnum)
-{
- #define SYS_PCIE_PHY0 (0xb8000000 +0x50)
- #define SYS_PCIE_PHY1 (0xb8000000 +0x54)
- unsigned int sys_pcie_phy;
-
- if (portnum==0)
- sys_pcie_phy=SYS_PCIE_PHY0;
- else if (portnum==1)
- sys_pcie_phy=SYS_PCIE_PHY1;
- else
- return;
-
- // 3.MDIO Reset
- REG32(sys_pcie_phy) = (1<<3) |(0<<1) | (0<<0); //mdio reset=0,
- REG32(sys_pcie_phy) = (1<<3) |(0<<1) | (1<<0); //mdio reset=1,
- REG32(sys_pcie_phy) = (1<<3) |(1<<1) | (1<<0); //bit1 load_done=1
-}
-//------------------------------------------------------------------------
-void PCIE_PHY_Reset(unsigned int portnum)
-{
- #define PCIE_PHY0 0xb8b01008
- #define PCIE_PHY1 0xb8b21008
- unsigned int pcie_phy;
-
- if(portnum==0) pcie_phy=PCIE_PHY0;
- else if(portnum==1) pcie_phy=PCIE_PHY1;
- else return;
-
- //4. PCIE PHY Reset
- REG32(pcie_phy) = 0x01; //bit7:PHY reset=0 bit0: Enable LTSSM=1
- REG32(pcie_phy) = 0x81; //bit7: PHY reset=1 bit0: Enable LTSSM=1
-
-}
-//------------------------------------------------------------------------
-int PCIE_Check_Link(unsigned int portnum)
-{
- unsigned int dbgaddr;
- unsigned int cfgaddr;
-
- if(portnum==0) dbgaddr=0xb8b00728;
- else if(portnum==1) dbgaddr=0xb8b20728;
- else return;
-
- //wait for LinkUP
-#ifdef CONFIG_RTK_VOIP
- // accelerate when no pcie card
- int i=3;
-#else
- int i=20;
-#endif
- while(--i)
- {
- if( (REG32(dbgaddr)&0x1f)==0x11)
- break;
- mdelay(300);
-
- }
- if(i==0)
- {
- printk("i=%x Cannot LinkUP \n",i);
- return 0;
- }
- else
- {
- printk("\nLink-UP OK\n");
- if(portnum==0)
- cfgaddr=0xb8b10000;
- else if(portnum==1)
- cfgaddr=0xb8b30000;
-
-
- REG32(cfgaddr+0x04)=0x00100007;
-
- printk("Find Port=%x Device:Vender ID=%x\n", portnum, REG32(cfgaddr) );
- REG32(cfgaddr);
- mdelay(1);
-
- #if defined(CONFIG_RTL_819XD)
- if (portnum == 0)
- REG32(BSP_GIMR) |= BSP_PCIE_IE;
- else
- REG32(BSP_GIMR) |= BSP_PCIE2_IE;
- #endif
- }
- return 1;
-}
-//------------------------------------------------------------------------
-/*
-void PCIE_Device_PERST(void)
-{
- REG32(CLK_MANAGE) &= ~(1<<12); //perst=0 off.
- mdelay(500); //PCIE standadrd: poweron: 100us, after poweron: 100ms
- mdelay(500);
- REG32(CLK_MANAGE) |= (1<<12); //PERST=1
- mdelay(500);
-}
-*/
-
-static void PCIE_Device_PERST(int portnum)
-{
- #define CLK_MANAGE 0xb8000010
- #define GPIO_BASE 0xB8003500
- #define PEFGHCNR_REG (0x01C + GPIO_BASE) /* Port EFGH control */
- #define PEFGHPTYPE_REG (0x020 + GPIO_BASE) /* Port EFGH type */
- #define PEFGHDIR_REG (0x024 + GPIO_BASE) /* Port EFGH direction */
- #define PEFGHDAT_REG (0x028 + GPIO_BASE) /* Port EFGH data */
- if (portnum==0)
- {
- REG32(CLK_MANAGE) &= ~(1<<26); //perst=0 off.
- mdelay(500); //PCIE standadrd: poweron: 100us, after poweron: 100ms
- mdelay(500);
- REG32(CLK_MANAGE) |= (1<<26); //PERST=1
- }
- else if (portnum==1)
- {
- /* PCIE Device Reset
- * The pcei1 slot reset register depends on the hw
- */
-#if 1//defined(CONFIG_RTL_DUAL_PCIESLOT_BIWLAN) || (RTL_USED_PCIE_SLOT==1) || defined(CONFIG_RTL_DUAL_PCIESLOT_BIWLAN_D)
- REG32(PEFGHDAT_REG) &= ~(0x1000); //perst=0 off.
- mdelay(300); //PCIE standadrd: poweron: 100us, after poweron: 100ms
- mdelay(300);
- REG32(PEFGHDAT_REG) |= (0x1000); //PERST=1
-#elif defined(CONFIG_RTL_92D_SUPPORT)
- REG32(CLK_MANAGE) &= ~(1<<26); //perst=0 off.
- mdelay(500); //PCIE standadrd: poweron: 100us, after poweron: 100ms
- mdelay(500);
- REG32(CLK_MANAGE) |= (1<<26); //PERST=1
-#endif
- }
- else
- return;
-}
-
-//------------------------------------------------------------------------
-
-int OnlyOneReset()
-{
-
- int result=0;
- int portnum=0;
- printk("PCIE RESET Only Once\n");
-
-
- #define CLK_MANAGE 0xb8000010
-#ifdef CONFIG_RTL_819XD
- REG32(CLK_MANAGE)|= (1<<12)|(1<<13)|(1<<19)|(1<<20)|(1<<18)|(1<<16);
-#endif
- REG32(CLK_MANAGE) &= (~(1<<14)); //disable active_pcie0
- REG32(CLK_MANAGE) |= (1<<14); //enable active_pcie0
-
- #define PAD_CONTROL 0xb8000048
- REG32(PAD_CONTROL)|=(1<<27); //switch to rc
- REG32(CLK_MANAGE) &= (~(1<<16)); //disable active_pcie1
- REG32(CLK_MANAGE) |= (1<<16); //enable active_pcie1
-
- //PERST=1
- //REG32(CLK_MANAGE) |= (1<<26);
- //PCIE_Device_PERST(0);
-
-
-
- for(portnum=0; portnum<2; portnum++)
- PCIE_MDIO_Reset(portnum);
- mdelay(500);
-
- for(portnum=0; portnum<2; portnum++)
- {
- #if 1//def RTL8198_FORMALCHIP_A
- HostPCIe_SetPhyMdioWrite(portnum, 0, 0xD087); //bokai tell, and fix
-
- HostPCIe_SetPhyMdioWrite(portnum, 1, 0x0003);
- HostPCIe_SetPhyMdioWrite(portnum, 2, 0x4d18);
- #ifdef CONFIG_PHY_EAT_40MHZ
- HostPCIe_SetPhyMdioWrite(portnum, 5, 0x0BCB); //40M
- #endif
-
- #ifdef CONFIG_PHY_EAT_40MHZ
- HostPCIe_SetPhyMdioWrite(portnum, 6, 0xF148); //40M
- #else
- HostPCIe_SetPhyMdioWrite(portnum, 6, 0xf848); //25M
- #endif
-
- HostPCIe_SetPhyMdioWrite(portnum, 7, 0x31ff);
-
- #ifdef CONFIG_RTL_819XD
- HostPCIe_SetPhyMdioWrite(portnum, 8, 0x18d6); //peisi tune
- #else
- HostPCIe_SetPhyMdioWrite(portnum, 8, 0x18d7); //peisi tune
- #endif
- HostPCIe_SetPhyMdioWrite(portnum, 0x09, 0x539c);
- HostPCIe_SetPhyMdioWrite(portnum, 0x0a, 0x20eb);
- HostPCIe_SetPhyMdioWrite(portnum, 0x0d, 0x1766);
- //HostPCIe_SetPhyMdioWrite(portnum, 0x0d, 0x1464); //wei add
-
- HostPCIe_SetPhyMdioWrite(portnum, 0x0b, 0x0511); //for sloving low performance
-
-
- HostPCIe_SetPhyMdioWrite(portnum, 0xf, 0x0a00);
- HostPCIe_SetPhyMdioWrite(portnum, 0x19, 0xFCE0);
-
- HostPCIe_SetPhyMdioWrite(portnum, 0x1a, 0x7e40); //formal chip, reg 0x1a.4=0
- HostPCIe_SetPhyMdioWrite(portnum, 0x1b, 0xFC01); //formal chip reg 0x1b.0=1
-
- HostPCIe_SetPhyMdioWrite(portnum, 0x1e, 0xC280);
-
- #endif
- }
-
- PCIE_Device_PERST(0);
- mdelay(500);
- for(portnum=0; portnum<2; portnum++)
- PCIE_PHY_Reset(portnum);
-
- mdelay(500);
- mdelay(500);
- mdelay(500);
-
-
- for(portnum=0; portnum<2; portnum++)
- { result=PCIE_Check_Link(portnum);
- if(result!=1)
- continue;
-
-
- #if 1 //wei add patch
-
- //add compatible, slove sata pcie card.
- if(portnum==0) REG32(0xb8b0100c)=(1<<3); //set target Device Num=1;
- if(portnum==1) REG32(0xb8b2100c)=(2<<3); //set target Device Num=1;
-
- unsigned int rc_cfg, cfgaddr;
- unsigned int iomapaddr;
- unsigned int memmapaddr;
-
-#define PCIE0_RC_CFG_BASE (0xb8b00000)
-#define PCIE0_RC_EXT_BASE (PCIE0_RC_CFG_BASE + 0x1000)
-#define PCIE0_EP_CFG_BASE (0xb8b10000)
-
-#define PCIE1_RC_CFG_BASE (0xb8b20000)
-#define PCIE1_RC_EXT_BASE (PCIE1_RC_CFG_BASE + 0x1000)
-#define PCIE1_EP_CFG_BASE (0xb8b30000)
-
-
-#define PCIE0_MAP_IO_BASE (0xb8c00000)
-#define PCIE0_MAP_MEM_BASE (0xb9000000)
-
-#define PCIE1_MAP_IO_BASE (0xb8e00000)
-#define PCIE1_MAP_MEM_BASE (0xba000000)
-
-#define MAX_READ_REQSIZE_128B 0x00
-#define MAX_READ_REQSIZE_256B 0x10
-#define MAX_READ_REQSIZE_512B 0x20
-#define MAX_READ_REQSIZE_1KB 0x30
-#define MAX_READ_REQSIZE_2KB 0x40
-#define MAX_READ_REQSIZE_4KB 0x50
-
-#define MAX_PAYLOAD_SIZE_128B 0x00
-#define MAX_PAYLOAD_SIZE_256B 0x20
-#define MAX_PAYLOAD_SIZE_512B 0x40
-#define MAX_PAYLOAD_SIZE_1KB 0x60
-#define MAX_PAYLOAD_SIZE_2KB 0x80
-#define MAX_PAYLOAD_SIZE_4KB 0xA0
-
- if(portnum==0)
- { rc_cfg=PCIE0_RC_CFG_BASE;
- cfgaddr=PCIE0_EP_CFG_BASE;
- iomapaddr=PCIE0_MAP_IO_BASE;
- memmapaddr=PCIE0_MAP_MEM_BASE;
- }
- else if(portnum==1)
- { rc_cfg=PCIE1_RC_CFG_BASE;
- cfgaddr=PCIE1_EP_CFG_BASE;
- iomapaddr=PCIE1_MAP_IO_BASE;
- memmapaddr=PCIE1_MAP_MEM_BASE;
- }
- //STATUS
- //bit 4: capabilties List
-
- //CMD
- //bit 2: Enable Bys master,
- //bit 1: enable memmap,
- //bit 0: enable iomap
- REG32(rc_cfg + 0x04)= 0x00100007;
-
- //Device Control Register
- //bit [7-5] payload size
- REG32(rc_cfg + 0x78)= (REG32(rc_cfg + 0x78 ) & (~0xE0)) | MAX_PAYLOAD_SIZE_128B; // Set MAX_PAYLOAD_SIZE to 128B,default
- REG32(cfgaddr + 0x04)= 0x00100007; //0x00180007
-
- //bit 0: 0:memory, 1 io indicate
- //REG32(cfgaddr + 0x10)= (iomapaddr | 0x00000001) & 0x1FFFFFFF; // Set BAR0
-
- //bit 3: prefetch
- //bit [2:1] 00:32bit, 01:reserved, 10:64bit 11:reserved
- //REG32(cfgaddr + 0x18)= (memmapaddr | 0x00000004) & 0x1FFFFFFF; // Set BAR1
-
- //offset 0x78 [7:5]
- REG32(cfgaddr + 0x78) = (REG32(cfgaddr + 0x78) & (~0xE0)) | (MAX_PAYLOAD_SIZE_128B); // Set MAX_PAYLOAD_SIZE to 128B
-
- //offset 0x79: [6:4]
- REG32(cfgaddr + 0x78) = (REG32(cfgaddr + 0x78) & (~0x7000)) | (MAX_READ_REQSIZE_256B<<8); // Set MAX_REQ_SIZE to 256B,default
-
- //io and mem limit, setting to no litmit
- REG32(rc_cfg+ 0x1c) = (2<<4) | (0<<12); // [7:4]=base [15:12]=limit
- REG32(rc_cfg+ 0x20) = (2<<4) | (0<<20); // [15:4]=base [31:20]=limit
- REG32(rc_cfg+ 0x24) = (2<<4) | (0<<20); // [15:4]=base [31:20]=limit
-#endif
- }
-
- return 1;
-
-}
-
-//----------------------------------------------------------------------
-//======================================================================
-//please rewrite me/ here is a lot of ...
-#if defined(CONFIG_RTL_8196C)
-int PCIE_reset_procedure(int portnum, int Use_External_PCIE_CLK, int mdio_reset)
-{
- #define CLK_MANAGE 0xb8000010
- int result;
-
- REG32(CLK_MANAGE) |= (1<<11); //enable active_pcie0
-
- mdelay(10);
- REG32(0xb8b0100c)=(1<<3); //set target Device Num=1;
- mdelay(10);
-
- if (mdio_reset) {
- printk("Do MDIO_RESET\n");
- // 3.MDIO Reset
- PCIE_MDIO_Reset(portnum);
- mdelay(10);
- }
- //4. PCIE PHY Reset
- PCIE_PHY_Reset(portnum);
- mdelay(10);
- mdelay(10);
-
- //----------------------------------------
- if (mdio_reset) {
- HostPCIe_SetPhyMdioWrite(portnum, 0, 0xD087); //bokai tell, and fix
-
- HostPCIe_SetPhyMdioWrite(portnum, 1, 0x0003);
- HostPCIe_SetPhyMdioWrite(portnum, 2, 0x4d18);
-#ifdef CONFIG_PHY_EAT_40MHZ
-#ifdef CONFIG_HIGH_POWER_EXT_PA
- HostPCIe_SetPhyMdioWrite(portnum, 5, 0x0BF3); //40M
-#else
- HostPCIe_SetPhyMdioWrite(portnum, 5, 0x0BCB); //40M
-#endif
-#endif
-
-#ifdef CONFIG_PHY_EAT_40MHZ
- HostPCIe_SetPhyMdioWrite(portnum, 6, 0xF148); //40M
-#else
- HostPCIe_SetPhyMdioWrite(portnum, 6, 0xf848); //25M
-#endif
-
- HostPCIe_SetPhyMdioWrite(portnum, 7, 0x31ff);
- HostPCIe_SetPhyMdioWrite(portnum, 8, 0x18d7); //peisi tune
-
-#if 0 //old,
- HostPCIe_SetPhyMdioWrite(portnum, 9, 0x531c);
- HostPCIe_SetPhyMdioWrite(portnum, 0xd, 0x1766); //peisi tune
-#else //saving more power, 8196c pe-si tune
- HostPCIe_SetPhyMdioWrite(portnum, 0x09, 0x539c);
- HostPCIe_SetPhyMdioWrite(portnum, 0x0a, 0x20eb);
- HostPCIe_SetPhyMdioWrite(portnum, 0x0d, 0x1764);
-#endif
- HostPCIe_SetPhyMdioWrite(portnum, 0x0b, 0x0511); //for sloving low performance
-
- HostPCIe_SetPhyMdioWrite(portnum, 0xf, 0x0a00);
- HostPCIe_SetPhyMdioWrite(portnum, 0x19, 0xFCE0);
-
- HostPCIe_SetPhyMdioWrite(portnum, 0x1e, 0xC280);
- }
-
- //---------------------------------------
- PCIE_Device_PERST();
-
- PCIE_PHY_Reset(portnum);
- mdelay(500);
- REG32(0xb8b00000 + 0x04)= 0x00100007;
- REG8(0xb8b00000 + 0x78)=((REG8(0xb8b00000 + 0x78) & (~0xE0)) | MAX_PAYLOAD_SIZE_128B);
- mdelay(500);
- result=PCIE_Check_Link(portnum);
- return result;
-}
-#elif defined(CONFIG_RTL_819XD)
-int PCIE_reset_procedure(int portnum, int Use_External_PCIE_CLK, int mdio_reset)
-{
- // dprintf("port=%x, mdio_rst=%x \n", portnum, mdio_reset);
- int result=0;
-
- //first, Turn On PCIE IP
- #define CLK_MANAGE 0xb8000010
- if(portnum==0) REG32(CLK_MANAGE) |= (1<<14); //enable active_pcie0
- else if(portnum==1) REG32(CLK_MANAGE) |= (1<<16); //enable active_pcie1
- else return result;
- if (portnum==0)
- {
- REG32(CLK_MANAGE) |= (1<<26); //PERST=1
- }
- else if (portnum==1)
- {
- REG32(0xb8000040)|=0x300;
- REG32(PEFGHCNR_REG) &= ~(0x1000); /*port F bit 4 */
- REG32(PEFGHDIR_REG) |= (0x1000); /*port F bit 4 */
- REG32(PEFGHDAT_REG) |= (0x1000); //PERST=1
- }
-#ifdef CONFIG_RTL_819XD
- REG32(CLK_MANAGE) |= (1<<12)| (1<<13)|(1<<18);
-#endif
- mdelay(500);
- #ifdef CONFIG_RTL8198_REVISION_B
- if(portnum==1)
- {
- #define PAD_CONTROL 0xb8000048
- REG32(PAD_CONTROL)|=(1<<27);
- }
- #endif
-
-
- if(mdio_reset)
- {
- if(at2_mode==0) //no auto test, show message
- printk("Do MDIO_RESET\n");
- mdelay(1);
- // 3.MDIO Reset
- PCIE_MDIO_Reset(portnum);
- }
-/*
- PCIE_PHY_Reset(portnum);
- */
- mdelay(500);
- mdelay(500);
-
- //----------------------------------------
- if(mdio_reset)
- {
- //fix 8198 test chip pcie tx problem.
-#if defined(CONFIG_RTL8198_REVISION_B) || defined(CONFIG_RTL_819XD)
- if ((REG32(BSP_REVR) >= BSP_RTL8198_REVISION_B) || ((REG32(BSP_REVR)&0xfffff000) == BSP_RTL8197D))
- {
- #if 1//def RTL8198_FORMALCHIP_A
- HostPCIe_SetPhyMdioWrite(portnum, 0, 0xD087); //bokai tell, and fix
-
- HostPCIe_SetPhyMdioWrite(portnum, 1, 0x0003);
- HostPCIe_SetPhyMdioWrite(portnum, 2, 0x4d18);
- #ifdef CONFIG_PHY_EAT_40MHZ
- HostPCIe_SetPhyMdioWrite(portnum, 5, 0x0BCB); //40M
- #endif
-
- #ifdef CONFIG_PHY_EAT_40MHZ
- HostPCIe_SetPhyMdioWrite(portnum, 6, 0xF148); //40M
- #else
- HostPCIe_SetPhyMdioWrite(portnum, 6, 0xf848); //25M
- #endif
-
- HostPCIe_SetPhyMdioWrite(portnum, 7, 0x31ff);
- HostPCIe_SetPhyMdioWrite(portnum, 8, 0x18d5); //peisi tune
-
- #if 0 //old,
- HostPCIe_SetPhyMdioWrite(portnum, 9, 0x531c);
- HostPCIe_SetPhyMdioWrite(portnum, 0xd, 0x1766); //peisi tune
- #else //saving more power, 8196c pe-si tune
- HostPCIe_SetPhyMdioWrite(portnum, 0x09, 0x539c);
- HostPCIe_SetPhyMdioWrite(portnum, 0x0a, 0x20eb);
- HostPCIe_SetPhyMdioWrite(portnum, 0x0d, 0x1766);
- #endif
-#ifdef CONFIG_RTL_819XD
- HostPCIe_SetPhyMdioWrite(portnum, 0x0b, 0x0711); //for sloving low performance
-#else
- HostPCIe_SetPhyMdioWrite(portnum, 0x0b, 0x0511); //for sloving low performance
-#endif
-
- HostPCIe_SetPhyMdioWrite(portnum, 0xf, 0x0a00);
- HostPCIe_SetPhyMdioWrite(portnum, 0x19, 0xFCE0);
-
- HostPCIe_SetPhyMdioWrite(portnum, 0x1a, 0x7e4f); //formal chip, reg 0x1a.4=0
- HostPCIe_SetPhyMdioWrite(portnum, 0x1b, 0xFC01); //formal chip reg 0x1b.0=1
-
- HostPCIe_SetPhyMdioWrite(portnum, 0x1e, 0xC280);
-
- #endif
-
- }
- else
-#endif
- {
-//#define PHY_USE_TEST_CHIP 1 // 1: test chip, 0: fib chip
-//#define PHY_EAT_40MHZ 0 // 0: 25MHz, 1: 40MHz
-
- //HostPCIe_SetPhyMdioWrite(portnum, 0, 0xD187);//ori
- HostPCIe_SetPhyMdioWrite(portnum, 0, 0xD087);
-
- HostPCIe_SetPhyMdioWrite(portnum, 1, 0x0003);
- //HostPCIe_SetPhyMdioWrite(portnum, 2, 0x4d18);
- HostPCIe_SetPhyMdioWrite(portnum, 6, 0xf448); //new
- HostPCIe_SetPhyMdioWrite(portnum, 6, 0x408); //avoid noise infuse //15-12=0, 7-5=0, 0448
-
- HostPCIe_SetPhyMdioWrite(portnum, 7, 0x31ff);
- HostPCIe_SetPhyMdioWrite(portnum, 8, 0x18d5); //new
- HostPCIe_SetPhyMdioWrite(portnum, 9, 0x531c);
-
- //HostPCIe_SetPhyMdioWrite(portnum, 0xa, 0x00C9);
- //HostPCIe_SetPhyMdioWrite(portnum, 0xb, 0xe511);
- //HostPCIe_SetPhyMdioWrite(portnum, 0xc, 0x0820);
- HostPCIe_SetPhyMdioWrite(portnum, 0xd, 0x1766);
- HostPCIe_SetPhyMdioWrite(portnum, 0xf, 0x0010);//ori
- // HostPCIe_SetPhyMdioWrite(portnum, 0xf, 0x0a00);
-
- HostPCIe_SetPhyMdioWrite(portnum, 0x19, 0xFCE0);
- HostPCIe_SetPhyMdioWrite(portnum, 0x1e, 0xC280);
-
-
-
-#if 0 //saving more power
- HostPCIe_SetPhyMdioWrite(0xa, 0xeb);
- HostPCIe_SetPhyMdioWrite(0x9, 0x538c);
-
-// HostPCIe_SetPhyMdioWrite(0xc, 0xC828); //original
-// HostPCIe_SetPhyMdioWrite(0x0, 0x502F); //fix
-
- HostPCIe_SetPhyMdioWrite(0xc, 0x8828); //new
- HostPCIe_SetPhyMdioWrite(0x0, 0x502F); //fix
-#endif
- }
- }
-
- //---------------------------------------
- PCIE_Device_PERST(portnum);
-
- PCIE_PHY_Reset(portnum);
- mdelay(500);
- mdelay(500);
- result=PCIE_Check_Link(portnum);
- #if 0
- if(portnum==0)
- {
- if(result)
- {
- WRITE_MEM32(BSP_PCIE0_H_PWRCR, READ_MEM32(BSP_PCIE0_H_PWRCR) & 0xFFFFFF7F);
- mdelay(100);
- WRITE_MEM32(BSP_PCIE0_H_PWRCR, READ_MEM32(BSP_PCIE0_H_PWRCR) | 0x00000080);
- }
- }
- else
- {
- #ifdef PIN_208
- if(result)
- {
- WRITE_MEM32(BSP_PCIE1_H_PWRCR, READ_MEM32(BSP_PCIE1_H_PWRCR) & 0xFFFFFF7F);
- mdelay(100);
- WRITE_MEM32(BSP_PCIE1_H_PWRCR, READ_MEM32(BSP_PCIE1_H_PWRCR) | 0x00000080);
- }
- #endif
- }
- #endif
- return result;
-#endif
-
-//========================================================================================
-
-static int rtl8196b_pci_reset(void)
-{
- /* If PCI needs to be reset, put code here.
- * Note:
- * Software may need to do hot reset for a period of time, say ~100us.
- * Here we put 2ms.
- */
-#if 1
-//Modified for PCIE PHY parameter due to RD center suggestion by Jason 12252009
-WRITE_MEM32(0xb8000044, 0x9);//Enable PCIE PLL
-mdelay(10);
-//WRITE_MEM32(0xb8000010, 0x00FFFFD6);//Active LX & PCIE Clock in 8196B system register
-WRITE_MEM32(0xb8000010, READ_MEM32(0xb8000010)|(1<<8)|(1<<9)|(1<<10));
-#ifdef PIN_208
-WRITE_MEM32(0xb8000010, READ_MEM32(0xb8000010)|(1<<12));
-#endif
-mdelay(10);
-WRITE_MEM32(0xb800003C, 0x1);//PORT0 PCIE PHY MDIO Reset
-mdelay(10);
-WRITE_MEM32(0xb800003C, 0x3);//PORT0 PCIE PHY MDIO Reset
-mdelay(10);
-#ifdef PIN_208
-WRITE_MEM32(0xb8000040, 0x1);//PORT1 PCIE PHY MDIO Reset
-mdelay(10);
-WRITE_MEM32(0xb8000040, 0x3);//PORT1 PCIE PHY MDIO Reset
-mdelay(10);
-#endif
-WRITE_MEM32(0xb8b01008, 0x1);// PCIE PHY Reset Close:Port 0
-mdelay(10);
-WRITE_MEM32(0xb8b01008, 0x81);// PCIE PHY Reset On:Port 0
-mdelay(10);
-#ifdef PIN_208
-WRITE_MEM32(0xb8b21008, 0x1);// PCIE PHY Reset Close:Port 1
-mdelay(10);
-WRITE_MEM32(0xb8b21008, 0x81);// PCIE PHY Reset On:Port 1
-mdelay(10);
-#endif
-#ifdef OUT_CYSTALL
-WRITE_MEM32(0xb8b01000, 0xcc011901);// PCIE PHY Reset On:Port 0
-mdelay(10);
-#ifdef PIN_208
-WRITE_MEM32(0xb8b21000, 0xcc011901);// PCIE PHY Reset On:Port 1
-mdelay(10);
-#endif
-#endif
-//WRITE_MEM32(0xb8000010, 0x01FFFFD6);// PCIE PHY Reset On:Port 1
-WRITE_MEM32(0xb8000010, READ_MEM32(0xb8000010)|(1<<24));
-mdelay(10);
-#endif
- WRITE_MEM32(BSP_PCIE0_H_PWRCR, READ_MEM32(BSP_PCIE0_H_PWRCR) & 0xFFFFFF7F);
-#ifdef PIN_208
- WRITE_MEM32(BSP_PCIE1_H_PWRCR, READ_MEM32(BSP_PCIE1_H_PWRCR) & 0xFFFFFF7F);
-#endif
- mdelay(100);
- WRITE_MEM32(BSP_PCIE0_H_PWRCR, READ_MEM32(BSP_PCIE0_H_PWRCR) | 0x00000080);
-#ifdef PIN_208
- WRITE_MEM32(BSP_PCIE1_H_PWRCR, READ_MEM32(BSP_PCIE1_H_PWRCR) | 0x00000080);
-#endif
- return 0;
-}
-
-//========================================================================================
-
-static int rtl8196b_pcibios_config_access(unsigned char access_type,
- unsigned int addr, unsigned int *data)
-{
- /* Do 8bit/16bit/32bit access */
- if (access_type & PCI_ACCESS_WRITE)
- {
- if (access_type & PCI_8BIT_ACCESS)
- WRITE_MEM8(addr, *data);
- else if (access_type & PCI_16BIT_ACCESS)
- WRITE_MEM16(addr, *data);
- else
- WRITE_MEM32(addr, *data);
- }
- else if (access_type & PCI_ACCESS_READ)
- {
- if (access_type & PCI_8BIT_ACCESS)
- {
- #ifdef CONFIG_RTL8198_REVISION_B
- unsigned int data_temp=0; int swap[4]={0,8,16,24}; int diff = addr&0x3;
- data_temp=READ_MEM32(addr);
- *data=(unsigned int)(( data_temp>>swap[diff])&0xff);
- #else
- *data = READ_MEM8(addr);
- #endif
- }
- else if (access_type & PCI_16BIT_ACCESS)
- {
- #ifdef CONFIG_RTL8198_REVISION_B
- unsigned int data_temp=0; int swap[4]={0,8,16,24}; int diff = addr&0x3;
- data_temp=READ_MEM32(addr);
- *data=(unsigned int)(( data_temp>>swap[diff])&0xffff);
- #else
- *data = READ_MEM16(addr);
- #endif
- }
- else
- *data = READ_MEM32(addr);
- }
-
- /* If need to check for PCIE access timeout, put code here */
- /* ... */
-
- return 0;
-}
-
-
-//========================================================================================
-/*
- * RTL8196b supports config word read access for 8/16/32 bit
- *
- * FIXME: currently only utilize 32bit access
- */
-static int rtl8196b_pcibios0_read(struct pci_bus *bus, unsigned int devfn,
- int where, int size, unsigned int *val)
-{
- unsigned int data = 0;
- unsigned int addr = 0;
-
- if (pci0_bus_number == 0xff)
- pci0_bus_number = bus->number;
- #if DEBUG_PRINTK
- //printk("File: %s, Function: %s, Line: %d\n", __FILE__, __FUNCTION__, __LINE__);
- //printk("Bus: %d, Slot: %d, Func: %d, Where: %d, Size: %d\n", bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn), where, size);
- #endif
-
- if (bus->number == pci0_bus_number)
- {
- /* PCIE host controller */
- if (PCI_SLOT(devfn) == 0)
- {
- addr = BSP_PCIE0_H_CFG + where;
-
- if (rtl8196b_pcibios_config_access(PCI_ACCESS_READ | PCI_32BIT_ACCESS, addr & ~(0x3), &data))
- return PCIBIOS_DEVICE_NOT_FOUND;
-
- if (size == 1)
- *val = (data >> ((where & 3) << 3)) & 0xff;
- else if (size == 2)
- *val = (data >> ((where & 3) << 3)) & 0xffff;
- else
- *val = data;
- }
- else
- return PCIBIOS_DEVICE_NOT_FOUND;
- }
- else if (bus->number == (pci0_bus_number + 1))
- {
- /* PCIE devices directly connected */
- if (PCI_SLOT(devfn) == 0)
- {
- addr = BSP_PCIE0_D_CFG0 + (PCI_FUNC(devfn) << 12) + where;
-
- if (rtl8196b_pcibios_config_access(PCI_ACCESS_READ | size, addr, val))
- return PCIBIOS_DEVICE_NOT_FOUND;
- }
- else
- return PCIBIOS_DEVICE_NOT_FOUND;
- }
- else
- {
- /* Devices connected through bridge */
- if (PCI_SLOT(devfn) < MAX_NUM_DEV)
- {
- WRITE_MEM32(BSP_PCIE0_H_IPCFG, ((bus->number) << 8) | (PCI_SLOT(devfn) << 3) | PCI_FUNC(devfn));
- addr = BSP_PCIE0_D_CFG1 + where;
-
- if (rtl8196b_pcibios_config_access(PCI_ACCESS_READ | size, addr, val))
- return PCIBIOS_DEVICE_NOT_FOUND;
- }
- else
- return PCIBIOS_DEVICE_NOT_FOUND;
- }
-#if defined(CONFIG_RTL_819XD)
- REG32(0xb8000014)=0x800200;
-#endif
- #if DEBUG_PRINTK
- //printk("File: %s, Function: %s, Line: %d\n", __FILE__, __FUNCTION__, __LINE__);
- //printk("Read Value: 0x%08X\n", *val);
- #endif
-
- return PCIBIOS_SUCCESSFUL;
-}
-
-//========================================================================================
-static int rtl8196b_pcibios0_write(struct pci_bus *bus, unsigned int devfn,
- int where, int size, unsigned int val)
-{
- unsigned int data = 0;
- unsigned int addr = 0;
-
- static int pci0_bus_number = 0xff;
- if (pci0_bus_number == 0xff)
- pci0_bus_number = bus->number;
-
- #if DEBUG_PRINTK
- //printk("File: %s, Function: %s, Line: %d\n", __FILE__, __FUNCTION__, __LINE__);
- //printk("Bus: %d, Slot: %d, Func: %d, Where: %d, Size: %d\n", bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn), where, size);
- #endif
-
- if (bus->number == pci0_bus_number)
- {
- /* PCIE host controller */
- if (PCI_SLOT(devfn) == 0)
- {
- addr = BSP_PCIE0_H_CFG + where;
-
- if (rtl8196b_pcibios_config_access(PCI_ACCESS_READ | PCI_32BIT_ACCESS, addr & ~(0x3), &data))
- return PCIBIOS_DEVICE_NOT_FOUND;
-
- if (size == 1)
- data = (data & ~(0xff << ((where & 3) << 3))) | (val << ((where & 3) << 3));
- else if (size == 2)
- data = (data & ~(0xffff << ((where & 3) << 3))) | (val << ((where & 3) << 3));
- else
- data = val;
-
- if (rtl8196b_pcibios_config_access(PCI_ACCESS_WRITE | PCI_32BIT_ACCESS, addr & ~(0x3), &data))
- return PCIBIOS_DEVICE_NOT_FOUND;
- }
- else
- return PCIBIOS_DEVICE_NOT_FOUND;
- }
- else if (bus->number == (pci0_bus_number + 1))
- {
- /* PCIE devices directly connected */
- if (PCI_SLOT(devfn) == 0)
- {
- addr = BSP_PCIE0_D_CFG0 + (PCI_FUNC(devfn) << 12) + where;
-
- if (rtl8196b_pcibios_config_access(PCI_ACCESS_WRITE | size, addr, &val))
- return PCIBIOS_DEVICE_NOT_FOUND;
- }
- else
- return PCIBIOS_DEVICE_NOT_FOUND;
- }
- else
- {
- /* Devices connected through bridge */
- if (PCI_SLOT(devfn) < MAX_NUM_DEV)
- {
- WRITE_MEM32(BSP_PCIE0_H_IPCFG, ((bus->number) << 8) | (PCI_SLOT(devfn) << 3) | PCI_FUNC(devfn));
- addr = BSP_PCIE0_D_CFG1 + where;
-
- if (rtl8196b_pcibios_config_access(PCI_ACCESS_WRITE | size, addr, &val))
- return PCIBIOS_DEVICE_NOT_FOUND;
- }
- else
- return PCIBIOS_DEVICE_NOT_FOUND;
- }
-
- return PCIBIOS_SUCCESSFUL;
-}
-//========================================================================================
-
-/*
- * RTL8196b supports config word read access for 8/16/32 bit
- *
- * FIXME: currently only utilize 32bit access
- */
-#ifdef PIN_208
-static int rtl8196b_pcibios1_read(struct pci_bus *bus, unsigned int devfn,
- int where, int size, unsigned int *val)
-{
- unsigned int data = 0;
- unsigned int addr = 0;
-
- if (pci1_bus_number == 0xff)
- pci1_bus_number = bus->number;
-
- #if DEBUG_PRINTK
- printk("File: %s, Function: %s, Line: %d\n", __FILE__, __FUNCTION__, __LINE__);
- printk("Bus: %d, Slot: %d, Func: %d, Where: %d, Size: %d\n", bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn), where, size);
- #endif
-
- if (bus->number == pci1_bus_number)
- {
- /* PCIE host controller */
- if (PCI_SLOT(devfn) == 0)
- {
- addr = BSP_PCIE1_H_CFG + where;
-
- if (rtl8196b_pcibios_config_access(PCI_ACCESS_READ | PCI_32BIT_ACCESS, addr & ~(0x3), &data))
- return PCIBIOS_DEVICE_NOT_FOUND;
-
- if (size == 1)
- *val = (data >> ((where & 3) << 3)) & 0xff;
- else if (size == 2)
- *val = (data >> ((where & 3) << 3)) & 0xffff;
- else
- *val = data;
- }
- else
- return PCIBIOS_DEVICE_NOT_FOUND;
- }
- else if (bus->number == (pci1_bus_number + 1))
- {
- /* PCIE devices directly connected */
- if (PCI_SLOT(devfn) == 0)
- {
- addr = BSP_PCIE1_D_CFG0 + (PCI_FUNC(devfn) << 12) + where;
-
- if (rtl8196b_pcibios_config_access(PCI_ACCESS_READ | size, addr, val))
- return PCIBIOS_DEVICE_NOT_FOUND;
- }
- else
- return PCIBIOS_DEVICE_NOT_FOUND;
- }
- else
- {
- /* Devices connected through bridge */
- if (PCI_SLOT(devfn) < MAX_NUM_DEV)
- {
- WRITE_MEM32(BSP_PCIE1_H_IPCFG, ((bus->number) << 8) | (PCI_SLOT(devfn) << 3) | PCI_FUNC(devfn));
- addr = BSP_PCIE1_D_CFG1 + where;
-
- if (rtl8196b_pcibios_config_access(PCI_ACCESS_READ | size, addr, val))
- return PCIBIOS_DEVICE_NOT_FOUND;
- }
- else
- return PCIBIOS_DEVICE_NOT_FOUND;
- }
-
- #if DEBUG_PRINTK
- printk("0xb8000014:%x\n",REG32(0xb8000014));
- //printk("File: %s, Function: %s, Line: %d\n", __FILE__, __FUNCTION__, __LINE__);
- //printk("Read Value: 0x%08X\n", *val);
- #endif
-
- return PCIBIOS_SUCCESSFUL;
-}
-
-//========================================================================================
-static int rtl8196b_pcibios1_write(struct pci_bus *bus, unsigned int devfn,
- int where, int size, unsigned int val)
-{
- unsigned int data = 0;
- unsigned int addr = 0;
-
- static int pci1_bus_number = 0xff;
-
- if (pci1_bus_number == 0xff)
- pci1_bus_number = bus->number;
-
- #if DEBUG_PRINTK
- printk("0xb8000014:%x\n",REG32(0xb8000014));
- //printk("File: %s, Function: %s, Line: %d\n", __FILE__, __FUNCTION__, __LINE__);
- //printk("Bus: %d, Slot: %d, Func: %d, Where: %d, Size: %d\n", bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn), where, size);
- #endif
-
-
- if (bus->number == pci1_bus_number)
- {
- /* PCIE host controller */
- if (PCI_SLOT(devfn) == 0)
- {
- addr = BSP_PCIE1_H_CFG + where;
-
- if (rtl8196b_pcibios_config_access(PCI_ACCESS_READ | PCI_32BIT_ACCESS, addr & ~(0x3), &data))
- return PCIBIOS_DEVICE_NOT_FOUND;
-
- if (size == 1)
- data = (data & ~(0xff << ((where & 3) << 3))) | (val << ((where & 3) << 3));
- else if (size == 2)
- data = (data & ~(0xffff << ((where & 3) << 3))) | (val << ((where & 3) << 3));
- else
- data = val;
-
- if (rtl8196b_pcibios_config_access(PCI_ACCESS_WRITE | PCI_32BIT_ACCESS, addr & ~(0x3), &data))
- return PCIBIOS_DEVICE_NOT_FOUND;
- }
- else
- return PCIBIOS_DEVICE_NOT_FOUND;
- }
- else if (bus->number == (pci1_bus_number + 1))
- {
- /* PCIE devices directly connected */
- if (PCI_SLOT(devfn) == 0)
- {
- addr = BSP_PCIE1_D_CFG0 + (PCI_FUNC(devfn) << 12) + where;
-
- if (rtl8196b_pcibios_config_access(PCI_ACCESS_WRITE | size, addr, &val))
- return PCIBIOS_DEVICE_NOT_FOUND;
- }
- else
- return PCIBIOS_DEVICE_NOT_FOUND;
- }
- else
- {
- /* Devices connected through bridge */
- if (PCI_SLOT(devfn) < MAX_NUM_DEV)
- {
- WRITE_MEM32(BSP_PCIE1_H_IPCFG, ((bus->number) << 8) | (PCI_SLOT(devfn) << 3) | PCI_FUNC(devfn));
- addr = BSP_PCIE1_D_CFG1 + where;
-
- if (rtl8196b_pcibios_config_access(PCI_ACCESS_WRITE | size, addr, &val))
- return PCIBIOS_DEVICE_NOT_FOUND;
- }
- else
- return PCIBIOS_DEVICE_NOT_FOUND;
- }
-
- return PCIBIOS_SUCCESSFUL;
-}
-#endif
-//========================================================================================
-struct pci_ops rtl8196b_pci0_ops = {
- .read = rtl8196b_pcibios0_read,
- .write = rtl8196b_pcibios0_write
-};
-
-#ifdef PIN_208
-struct pci_ops rtl8196b_pci1_ops = {
- .read = rtl8196b_pcibios1_read,
- .write = rtl8196b_pcibios1_write
-};
-#endif
-
-static struct pci_controller rtl8196b_pci0_controller = {
- .pci_ops = &rtl8196b_pci0_ops,
- .mem_resource = &rtl8196b_pci0_mem_resource,
- .io_resource = &rtl8196b_pci0_io_resource,
-};
-
-#ifdef PIN_208
-static struct pci_controller rtl8196b_pci1_controller = {
- .pci_ops = &rtl8196b_pci1_ops,
- .mem_resource = &rtl8196b_pci1_mem_resource,
- .io_resource = &rtl8196b_pci1_io_resource,
-};
-#endif
-
-//========================================================================================
-int pcibios_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
-{
- #if DEBUG_PRINTK
- printk("File: %s, Function: %s, Line: %d\n", __FILE__, __FUNCTION__, __LINE__);
- printk("**Slot: %d\n", slot);
- printk("**Pin: %d\n", pin);
- printk("**Dev->BUS->Number: %d\n", dev->bus->number);
- #endif
-
-#if defined(CONFIG_RTL_819XD)
- if (dev->bus->number < pci1_bus_number)
- return BSP_PCIE_IRQ;
- else
- return BSP_PCIE2_IRQ;
-#else
- return BSP_PCIE_IRQ;
-#endif
-}
-//========================================================================================
-/* Do platform specific device initialization at pci_enable_device() time */
-int pcibios_plat_dev_init(struct pci_dev *dev)
-{
- #if DEBUG_PRINTK
- printk("File: %s, Function: %s, Line: %d\n", __FILE__, __FUNCTION__, __LINE__);
- #endif
-
- return 0;
-}
-
-static __init int bsp_pcie_init(void)
-{
-
- int Use_External_PCIE_CLK=0;
- int result=0,result1=0;
-
- printk("<<<<<Register 1st PCI Controller>>>>>\n");
- mdelay(1);
-
- //sry i need more time to figure out all how that stuff should coorectly work
- #if defined(CONFIG_RTL_8196C)
- result=PCIE_reset_procedure(0, 0, 1);
- if (result)
- register_pci_controller(&rtl8196b_pci0_controller);
- else
- REG32(CLK_MANAGE) &= (~(1<<11)); //disable active_pcie0
- #elif defined(CONFIG_RTL_819XD)
- #ifndef CONFIG_RTL_DUAL_PCIESLOT_BIWLAN_D
- #ifndef PIN_208
- result=PCIE_reset_procedure(0, Use_External_PCIE_CLK, 1);
- #else
- result=PCIE_reset_procedure(0, Use_External_PCIE_CLK, 1);
- mdelay(1);
- result1=PCIE_reset_procedure(1, Use_External_PCIE_CLK, 1);
- #endif
- #else //wei add
- OnlyOneReset();
-
- result=PCIE_Check_Link(0);
- result1=PCIE_Check_Link(1);
-
- #endif
-
- #if DEBUG_PRINTK
- printk("<<<<<Register 1st PCI Controller>>>>>\n");
- #ifdef PIN_208
- printk("<<<<<Register 2nd PCI Controller>>>>>\n");
- #endif
- #endif
- mdelay(1);
- #ifndef CONFIG_RTL_DUAL_PCIESLOT_BIWLAN_D
- if(result)
- register_pci_controller(&rtl8196b_pci0_controller);
- else
- {
- REG32(CLK_MANAGE) &= (~(1<<14)); //disable active_pcie0
- }
- #ifdef PIN_208
- if(result1)
- register_pci_controller(&rtl8196b_pci1_controller);
- else
- {
- REG32(CLK_MANAGE) &= (~(1<<16)); //disable active_pcie1
- }
- #endif
- #else
-
- if(result1)
- register_pci_controller(&rtl8196b_pci1_controller);
- else
- { REG32(CLK_MANAGE) &= (~(1<<16)); //disable active_pcie1
- }
-
-
- if(result)
- register_pci_controller(&rtl8196b_pci0_controller);
- else
- { REG32(CLK_MANAGE) &= (~(1<<14)); //disable active_pcie0
- }
-
-
- #endif
- #endif
-
- return 0
-}
-
-arch_initcall(bsp_pcie_init);