1fc9a8e8dSKaricheri, Muralidharan /* 2fc9a8e8dSKaricheri, Muralidharan * Ethernet driver for TI K2HK EVM. 3fc9a8e8dSKaricheri, Muralidharan * 4fc9a8e8dSKaricheri, Muralidharan * (C) Copyright 2012-2014 5fc9a8e8dSKaricheri, Muralidharan * Texas Instruments Incorporated, <www.ti.com> 6fc9a8e8dSKaricheri, Muralidharan * 7fc9a8e8dSKaricheri, Muralidharan * SPDX-License-Identifier: GPL-2.0+ 8fc9a8e8dSKaricheri, Muralidharan */ 9fc9a8e8dSKaricheri, Muralidharan #include <common.h> 10fc9a8e8dSKaricheri, Muralidharan #include <command.h> 11fc9a8e8dSKaricheri, Muralidharan 12fc9a8e8dSKaricheri, Muralidharan #include <net.h> 133fe93623SKhoronzhuk, Ivan #include <phy.h> 14c05d05e7SKhoronzhuk, Ivan #include <errno.h> 15fc9a8e8dSKaricheri, Muralidharan #include <miiphy.h> 16fc9a8e8dSKaricheri, Muralidharan #include <malloc.h> 17ef454717SKhoronzhuk, Ivan #include <asm/ti-common/keystone_nav.h> 180935cac6SKhoronzhuk, Ivan #include <asm/ti-common/keystone_net.h> 19a43febdeSKhoronzhuk, Ivan #include <asm/ti-common/keystone_serdes.h> 20fc9a8e8dSKaricheri, Muralidharan 21fc9a8e8dSKaricheri, Muralidharan unsigned int emac_open; 22550c5ce6SKhoronzhuk, Ivan static struct mii_dev *mdio_bus; 23fc9a8e8dSKaricheri, Muralidharan static unsigned int sys_has_mdio = 1; 24fc9a8e8dSKaricheri, Muralidharan 25fc9a8e8dSKaricheri, Muralidharan #ifdef KEYSTONE2_EMAC_GIG_ENABLE 26fc9a8e8dSKaricheri, Muralidharan #define emac_gigabit_enable(x) keystone2_eth_gigabit_enable(x) 27fc9a8e8dSKaricheri, Muralidharan #else 28fc9a8e8dSKaricheri, Muralidharan #define emac_gigabit_enable(x) /* no gigabit to enable */ 29fc9a8e8dSKaricheri, Muralidharan #endif 30fc9a8e8dSKaricheri, Muralidharan 31fc9a8e8dSKaricheri, Muralidharan #define RX_BUFF_NUMS 24 32fc9a8e8dSKaricheri, Muralidharan #define RX_BUFF_LEN 1520 33fc9a8e8dSKaricheri, Muralidharan #define MAX_SIZE_STREAM_BUFFER RX_BUFF_LEN 34c05d05e7SKhoronzhuk, Ivan #define SGMII_ANEG_TIMEOUT 4000 35fc9a8e8dSKaricheri, Muralidharan 36fc9a8e8dSKaricheri, Muralidharan static u8 rx_buffs[RX_BUFF_NUMS * RX_BUFF_LEN] __aligned(16); 37fc9a8e8dSKaricheri, Muralidharan 38fc9a8e8dSKaricheri, Muralidharan struct rx_buff_desc net_rx_buffs = { 39fc9a8e8dSKaricheri, Muralidharan .buff_ptr = rx_buffs, 40fc9a8e8dSKaricheri, Muralidharan .num_buffs = RX_BUFF_NUMS, 41fc9a8e8dSKaricheri, Muralidharan .buff_len = RX_BUFF_LEN, 42fc9a8e8dSKaricheri, Muralidharan .rx_flow = 22, 43fc9a8e8dSKaricheri, Muralidharan }; 44fc9a8e8dSKaricheri, Muralidharan 45a43febdeSKhoronzhuk, Ivan static void keystone2_net_serdes_setup(void); 46fc9a8e8dSKaricheri, Muralidharan 47fc9a8e8dSKaricheri, Muralidharan int keystone2_eth_read_mac_addr(struct eth_device *dev) 48fc9a8e8dSKaricheri, Muralidharan { 49fc9a8e8dSKaricheri, Muralidharan struct eth_priv_t *eth_priv; 50fc9a8e8dSKaricheri, Muralidharan u32 maca = 0; 51fc9a8e8dSKaricheri, Muralidharan u32 macb = 0; 52fc9a8e8dSKaricheri, Muralidharan 53fc9a8e8dSKaricheri, Muralidharan eth_priv = (struct eth_priv_t *)dev->priv; 54fc9a8e8dSKaricheri, Muralidharan 55fc9a8e8dSKaricheri, Muralidharan /* Read the e-fuse mac address */ 56fc9a8e8dSKaricheri, Muralidharan if (eth_priv->slave_port == 1) { 57fc9a8e8dSKaricheri, Muralidharan maca = __raw_readl(MAC_ID_BASE_ADDR); 58fc9a8e8dSKaricheri, Muralidharan macb = __raw_readl(MAC_ID_BASE_ADDR + 4); 59fc9a8e8dSKaricheri, Muralidharan } 60fc9a8e8dSKaricheri, Muralidharan 61fc9a8e8dSKaricheri, Muralidharan dev->enetaddr[0] = (macb >> 8) & 0xff; 62fc9a8e8dSKaricheri, Muralidharan dev->enetaddr[1] = (macb >> 0) & 0xff; 63fc9a8e8dSKaricheri, Muralidharan dev->enetaddr[2] = (maca >> 24) & 0xff; 64fc9a8e8dSKaricheri, Muralidharan dev->enetaddr[3] = (maca >> 16) & 0xff; 65fc9a8e8dSKaricheri, Muralidharan dev->enetaddr[4] = (maca >> 8) & 0xff; 66fc9a8e8dSKaricheri, Muralidharan dev->enetaddr[5] = (maca >> 0) & 0xff; 67fc9a8e8dSKaricheri, Muralidharan 68fc9a8e8dSKaricheri, Muralidharan return 0; 69fc9a8e8dSKaricheri, Muralidharan } 70fc9a8e8dSKaricheri, Muralidharan 71550c5ce6SKhoronzhuk, Ivan /* MDIO */ 72550c5ce6SKhoronzhuk, Ivan 73550c5ce6SKhoronzhuk, Ivan static int keystone2_mdio_reset(struct mii_dev *bus) 74fc9a8e8dSKaricheri, Muralidharan { 75fc9a8e8dSKaricheri, Muralidharan u_int32_t clkdiv; 76550c5ce6SKhoronzhuk, Ivan struct mdio_regs *adap_mdio = bus->priv; 77fc9a8e8dSKaricheri, Muralidharan 78fc9a8e8dSKaricheri, Muralidharan clkdiv = (EMAC_MDIO_BUS_FREQ / EMAC_MDIO_CLOCK_FREQ) - 1; 79fc9a8e8dSKaricheri, Muralidharan 80550c5ce6SKhoronzhuk, Ivan writel((clkdiv & 0xffff) | MDIO_CONTROL_ENABLE | 81550c5ce6SKhoronzhuk, Ivan MDIO_CONTROL_FAULT | MDIO_CONTROL_FAULT_ENABLE, 82fc9a8e8dSKaricheri, Muralidharan &adap_mdio->control); 83fc9a8e8dSKaricheri, Muralidharan 84fc9a8e8dSKaricheri, Muralidharan while (readl(&adap_mdio->control) & MDIO_CONTROL_IDLE) 85fc9a8e8dSKaricheri, Muralidharan ; 86550c5ce6SKhoronzhuk, Ivan 87550c5ce6SKhoronzhuk, Ivan return 0; 88fc9a8e8dSKaricheri, Muralidharan } 89fc9a8e8dSKaricheri, Muralidharan 90550c5ce6SKhoronzhuk, Ivan /** 91550c5ce6SKhoronzhuk, Ivan * keystone2_mdio_read - read a PHY register via MDIO interface. 92550c5ce6SKhoronzhuk, Ivan * Blocks until operation is complete. 93550c5ce6SKhoronzhuk, Ivan */ 94550c5ce6SKhoronzhuk, Ivan static int keystone2_mdio_read(struct mii_dev *bus, 95550c5ce6SKhoronzhuk, Ivan int addr, int devad, int reg) 96fc9a8e8dSKaricheri, Muralidharan { 97fc9a8e8dSKaricheri, Muralidharan int tmp; 98550c5ce6SKhoronzhuk, Ivan struct mdio_regs *adap_mdio = bus->priv; 99fc9a8e8dSKaricheri, Muralidharan 100fc9a8e8dSKaricheri, Muralidharan while (readl(&adap_mdio->useraccess0) & MDIO_USERACCESS0_GO) 101fc9a8e8dSKaricheri, Muralidharan ; 102fc9a8e8dSKaricheri, Muralidharan 103550c5ce6SKhoronzhuk, Ivan writel(MDIO_USERACCESS0_GO | MDIO_USERACCESS0_WRITE_READ | 104550c5ce6SKhoronzhuk, Ivan ((reg & 0x1f) << 21) | ((addr & 0x1f) << 16), 105fc9a8e8dSKaricheri, Muralidharan &adap_mdio->useraccess0); 106fc9a8e8dSKaricheri, Muralidharan 107fc9a8e8dSKaricheri, Muralidharan /* Wait for command to complete */ 108fc9a8e8dSKaricheri, Muralidharan while ((tmp = readl(&adap_mdio->useraccess0)) & MDIO_USERACCESS0_GO) 109fc9a8e8dSKaricheri, Muralidharan ; 110fc9a8e8dSKaricheri, Muralidharan 111550c5ce6SKhoronzhuk, Ivan if (tmp & MDIO_USERACCESS0_ACK) 112550c5ce6SKhoronzhuk, Ivan return tmp & 0xffff; 113fc9a8e8dSKaricheri, Muralidharan 114fc9a8e8dSKaricheri, Muralidharan return -1; 115fc9a8e8dSKaricheri, Muralidharan } 116fc9a8e8dSKaricheri, Muralidharan 117550c5ce6SKhoronzhuk, Ivan /** 118550c5ce6SKhoronzhuk, Ivan * keystone2_mdio_write - write to a PHY register via MDIO interface. 119fc9a8e8dSKaricheri, Muralidharan * Blocks until operation is complete. 120fc9a8e8dSKaricheri, Muralidharan */ 121550c5ce6SKhoronzhuk, Ivan static int keystone2_mdio_write(struct mii_dev *bus, 122550c5ce6SKhoronzhuk, Ivan int addr, int devad, int reg, u16 val) 123fc9a8e8dSKaricheri, Muralidharan { 124550c5ce6SKhoronzhuk, Ivan struct mdio_regs *adap_mdio = bus->priv; 125550c5ce6SKhoronzhuk, Ivan 126fc9a8e8dSKaricheri, Muralidharan while (readl(&adap_mdio->useraccess0) & MDIO_USERACCESS0_GO) 127fc9a8e8dSKaricheri, Muralidharan ; 128fc9a8e8dSKaricheri, Muralidharan 129550c5ce6SKhoronzhuk, Ivan writel(MDIO_USERACCESS0_GO | MDIO_USERACCESS0_WRITE_WRITE | 130550c5ce6SKhoronzhuk, Ivan ((reg & 0x1f) << 21) | ((addr & 0x1f) << 16) | 131550c5ce6SKhoronzhuk, Ivan (val & 0xffff), &adap_mdio->useraccess0); 132fc9a8e8dSKaricheri, Muralidharan 133fc9a8e8dSKaricheri, Muralidharan /* Wait for command to complete */ 134fc9a8e8dSKaricheri, Muralidharan while (readl(&adap_mdio->useraccess0) & MDIO_USERACCESS0_GO) 135fc9a8e8dSKaricheri, Muralidharan ; 136fc9a8e8dSKaricheri, Muralidharan 137fc9a8e8dSKaricheri, Muralidharan return 0; 138fc9a8e8dSKaricheri, Muralidharan } 139fc9a8e8dSKaricheri, Muralidharan 140fc9a8e8dSKaricheri, Muralidharan static void __attribute__((unused)) 141fc9a8e8dSKaricheri, Muralidharan keystone2_eth_gigabit_enable(struct eth_device *dev) 142fc9a8e8dSKaricheri, Muralidharan { 143fc9a8e8dSKaricheri, Muralidharan u_int16_t data; 144fc9a8e8dSKaricheri, Muralidharan struct eth_priv_t *eth_priv = (struct eth_priv_t *)dev->priv; 145fc9a8e8dSKaricheri, Muralidharan 146fc9a8e8dSKaricheri, Muralidharan if (sys_has_mdio) { 147550c5ce6SKhoronzhuk, Ivan data = keystone2_mdio_read(mdio_bus, eth_priv->phy_addr, 148550c5ce6SKhoronzhuk, Ivan MDIO_DEVAD_NONE, 0); 149550c5ce6SKhoronzhuk, Ivan /* speed selection MSB */ 150550c5ce6SKhoronzhuk, Ivan if (!(data & (1 << 6))) 151fc9a8e8dSKaricheri, Muralidharan return; 152fc9a8e8dSKaricheri, Muralidharan } 153fc9a8e8dSKaricheri, Muralidharan 154fc9a8e8dSKaricheri, Muralidharan /* 155fc9a8e8dSKaricheri, Muralidharan * Check if link detected is giga-bit 156fc9a8e8dSKaricheri, Muralidharan * If Gigabit mode detected, enable gigbit in MAC 157fc9a8e8dSKaricheri, Muralidharan */ 158b2cfe322SHao Zhang writel(readl(DEVICE_EMACSL_BASE(eth_priv->slave_port - 1) + 159b2cfe322SHao Zhang CPGMACSL_REG_CTL) | 160fc9a8e8dSKaricheri, Muralidharan EMAC_MACCONTROL_GIGFORCE | EMAC_MACCONTROL_GIGABIT_ENABLE, 161b2cfe322SHao Zhang DEVICE_EMACSL_BASE(eth_priv->slave_port - 1) + CPGMACSL_REG_CTL); 162fc9a8e8dSKaricheri, Muralidharan } 163fc9a8e8dSKaricheri, Muralidharan 164fc9a8e8dSKaricheri, Muralidharan int keystone_sgmii_link_status(int port) 165fc9a8e8dSKaricheri, Muralidharan { 166fc9a8e8dSKaricheri, Muralidharan u32 status = 0; 167fc9a8e8dSKaricheri, Muralidharan 168fc9a8e8dSKaricheri, Muralidharan status = __raw_readl(SGMII_STATUS_REG(port)); 169fc9a8e8dSKaricheri, Muralidharan 170a4d2adeeSKhoronzhuk, Ivan return (status & SGMII_REG_STATUS_LOCK) && 171a4d2adeeSKhoronzhuk, Ivan (status & SGMII_REG_STATUS_LINK); 172fc9a8e8dSKaricheri, Muralidharan } 173fc9a8e8dSKaricheri, Muralidharan 174c05d05e7SKhoronzhuk, Ivan int keystone_sgmii_config(struct phy_device *phy_dev, int port, int interface) 175fc9a8e8dSKaricheri, Muralidharan { 176fc9a8e8dSKaricheri, Muralidharan unsigned int i, status, mask; 177fc9a8e8dSKaricheri, Muralidharan unsigned int mr_adv_ability, control; 178fc9a8e8dSKaricheri, Muralidharan 179fc9a8e8dSKaricheri, Muralidharan switch (interface) { 180fc9a8e8dSKaricheri, Muralidharan case SGMII_LINK_MAC_MAC_AUTONEG: 181fc9a8e8dSKaricheri, Muralidharan mr_adv_ability = (SGMII_REG_MR_ADV_ENABLE | 182fc9a8e8dSKaricheri, Muralidharan SGMII_REG_MR_ADV_LINK | 183fc9a8e8dSKaricheri, Muralidharan SGMII_REG_MR_ADV_FULL_DUPLEX | 184fc9a8e8dSKaricheri, Muralidharan SGMII_REG_MR_ADV_GIG_MODE); 185fc9a8e8dSKaricheri, Muralidharan control = (SGMII_REG_CONTROL_MASTER | 186fc9a8e8dSKaricheri, Muralidharan SGMII_REG_CONTROL_AUTONEG); 187fc9a8e8dSKaricheri, Muralidharan 188fc9a8e8dSKaricheri, Muralidharan break; 189fc9a8e8dSKaricheri, Muralidharan case SGMII_LINK_MAC_PHY: 190fc9a8e8dSKaricheri, Muralidharan case SGMII_LINK_MAC_PHY_FORCED: 191fc9a8e8dSKaricheri, Muralidharan mr_adv_ability = SGMII_REG_MR_ADV_ENABLE; 192fc9a8e8dSKaricheri, Muralidharan control = SGMII_REG_CONTROL_AUTONEG; 193fc9a8e8dSKaricheri, Muralidharan 194fc9a8e8dSKaricheri, Muralidharan break; 195fc9a8e8dSKaricheri, Muralidharan case SGMII_LINK_MAC_MAC_FORCED: 196fc9a8e8dSKaricheri, Muralidharan mr_adv_ability = (SGMII_REG_MR_ADV_ENABLE | 197fc9a8e8dSKaricheri, Muralidharan SGMII_REG_MR_ADV_LINK | 198fc9a8e8dSKaricheri, Muralidharan SGMII_REG_MR_ADV_FULL_DUPLEX | 199fc9a8e8dSKaricheri, Muralidharan SGMII_REG_MR_ADV_GIG_MODE); 200fc9a8e8dSKaricheri, Muralidharan control = SGMII_REG_CONTROL_MASTER; 201fc9a8e8dSKaricheri, Muralidharan 202fc9a8e8dSKaricheri, Muralidharan break; 203fc9a8e8dSKaricheri, Muralidharan case SGMII_LINK_MAC_FIBER: 204fc9a8e8dSKaricheri, Muralidharan mr_adv_ability = 0x20; 205fc9a8e8dSKaricheri, Muralidharan control = SGMII_REG_CONTROL_AUTONEG; 206fc9a8e8dSKaricheri, Muralidharan 207fc9a8e8dSKaricheri, Muralidharan break; 208fc9a8e8dSKaricheri, Muralidharan default: 209fc9a8e8dSKaricheri, Muralidharan mr_adv_ability = SGMII_REG_MR_ADV_ENABLE; 210fc9a8e8dSKaricheri, Muralidharan control = SGMII_REG_CONTROL_AUTONEG; 211fc9a8e8dSKaricheri, Muralidharan } 212fc9a8e8dSKaricheri, Muralidharan 213fc9a8e8dSKaricheri, Muralidharan __raw_writel(0, SGMII_CTL_REG(port)); 214fc9a8e8dSKaricheri, Muralidharan 215fc9a8e8dSKaricheri, Muralidharan /* 216fc9a8e8dSKaricheri, Muralidharan * Wait for the SerDes pll to lock, 217fc9a8e8dSKaricheri, Muralidharan * but don't trap if lock is never read 218fc9a8e8dSKaricheri, Muralidharan */ 219fc9a8e8dSKaricheri, Muralidharan for (i = 0; i < 1000; i++) { 220fc9a8e8dSKaricheri, Muralidharan udelay(2000); 221fc9a8e8dSKaricheri, Muralidharan status = __raw_readl(SGMII_STATUS_REG(port)); 222fc9a8e8dSKaricheri, Muralidharan if ((status & SGMII_REG_STATUS_LOCK) != 0) 223fc9a8e8dSKaricheri, Muralidharan break; 224fc9a8e8dSKaricheri, Muralidharan } 225fc9a8e8dSKaricheri, Muralidharan 226fc9a8e8dSKaricheri, Muralidharan __raw_writel(mr_adv_ability, SGMII_MRADV_REG(port)); 227fc9a8e8dSKaricheri, Muralidharan __raw_writel(control, SGMII_CTL_REG(port)); 228fc9a8e8dSKaricheri, Muralidharan 229fc9a8e8dSKaricheri, Muralidharan 230fc9a8e8dSKaricheri, Muralidharan mask = SGMII_REG_STATUS_LINK; 231fc9a8e8dSKaricheri, Muralidharan 232fc9a8e8dSKaricheri, Muralidharan if (control & SGMII_REG_CONTROL_AUTONEG) 233fc9a8e8dSKaricheri, Muralidharan mask |= SGMII_REG_STATUS_AUTONEG; 234fc9a8e8dSKaricheri, Muralidharan 235fc9a8e8dSKaricheri, Muralidharan status = __raw_readl(SGMII_STATUS_REG(port)); 236fc9a8e8dSKaricheri, Muralidharan if ((status & mask) == mask) 237c05d05e7SKhoronzhuk, Ivan return 0; 238c05d05e7SKhoronzhuk, Ivan 239c05d05e7SKhoronzhuk, Ivan printf("\n%s Waiting for SGMII auto negotiation to complete", 240c05d05e7SKhoronzhuk, Ivan phy_dev->dev->name); 241c05d05e7SKhoronzhuk, Ivan while ((status & mask) != mask) { 242c05d05e7SKhoronzhuk, Ivan /* 243c05d05e7SKhoronzhuk, Ivan * Timeout reached ? 244c05d05e7SKhoronzhuk, Ivan */ 245c05d05e7SKhoronzhuk, Ivan if (i > SGMII_ANEG_TIMEOUT) { 246c05d05e7SKhoronzhuk, Ivan puts(" TIMEOUT !\n"); 247c05d05e7SKhoronzhuk, Ivan phy_dev->link = 0; 248c05d05e7SKhoronzhuk, Ivan return 0; 249fc9a8e8dSKaricheri, Muralidharan } 250fc9a8e8dSKaricheri, Muralidharan 251c05d05e7SKhoronzhuk, Ivan if (ctrlc()) { 252c05d05e7SKhoronzhuk, Ivan puts("user interrupt!\n"); 253c05d05e7SKhoronzhuk, Ivan phy_dev->link = 0; 254c05d05e7SKhoronzhuk, Ivan return -EINTR; 255c05d05e7SKhoronzhuk, Ivan } 256c05d05e7SKhoronzhuk, Ivan 257c05d05e7SKhoronzhuk, Ivan if ((i++ % 500) == 0) 258c05d05e7SKhoronzhuk, Ivan printf("."); 259c05d05e7SKhoronzhuk, Ivan 260c05d05e7SKhoronzhuk, Ivan udelay(1000); /* 1 ms */ 261c05d05e7SKhoronzhuk, Ivan status = __raw_readl(SGMII_STATUS_REG(port)); 262c05d05e7SKhoronzhuk, Ivan } 263c05d05e7SKhoronzhuk, Ivan puts(" done\n"); 264c05d05e7SKhoronzhuk, Ivan 265fc9a8e8dSKaricheri, Muralidharan return 0; 266fc9a8e8dSKaricheri, Muralidharan } 267fc9a8e8dSKaricheri, Muralidharan 268fc9a8e8dSKaricheri, Muralidharan int mac_sl_reset(u32 port) 269fc9a8e8dSKaricheri, Muralidharan { 270fc9a8e8dSKaricheri, Muralidharan u32 i, v; 271fc9a8e8dSKaricheri, Muralidharan 272fc9a8e8dSKaricheri, Muralidharan if (port >= DEVICE_N_GMACSL_PORTS) 273fc9a8e8dSKaricheri, Muralidharan return GMACSL_RET_INVALID_PORT; 274fc9a8e8dSKaricheri, Muralidharan 275fc9a8e8dSKaricheri, Muralidharan /* Set the soft reset bit */ 276e6c9428aSKhoronzhuk, Ivan writel(CPGMAC_REG_RESET_VAL_RESET, 277e6c9428aSKhoronzhuk, Ivan DEVICE_EMACSL_BASE(port) + CPGMACSL_REG_RESET); 278fc9a8e8dSKaricheri, Muralidharan 279fc9a8e8dSKaricheri, Muralidharan /* Wait for the bit to clear */ 280fc9a8e8dSKaricheri, Muralidharan for (i = 0; i < DEVICE_EMACSL_RESET_POLL_COUNT; i++) { 281e6c9428aSKhoronzhuk, Ivan v = readl(DEVICE_EMACSL_BASE(port) + CPGMACSL_REG_RESET); 282fc9a8e8dSKaricheri, Muralidharan if ((v & CPGMAC_REG_RESET_VAL_RESET_MASK) != 283fc9a8e8dSKaricheri, Muralidharan CPGMAC_REG_RESET_VAL_RESET) 284fc9a8e8dSKaricheri, Muralidharan return GMACSL_RET_OK; 285fc9a8e8dSKaricheri, Muralidharan } 286fc9a8e8dSKaricheri, Muralidharan 287fc9a8e8dSKaricheri, Muralidharan /* Timeout on the reset */ 288fc9a8e8dSKaricheri, Muralidharan return GMACSL_RET_WARN_RESET_INCOMPLETE; 289fc9a8e8dSKaricheri, Muralidharan } 290fc9a8e8dSKaricheri, Muralidharan 291fc9a8e8dSKaricheri, Muralidharan int mac_sl_config(u_int16_t port, struct mac_sl_cfg *cfg) 292fc9a8e8dSKaricheri, Muralidharan { 293fc9a8e8dSKaricheri, Muralidharan u32 v, i; 294fc9a8e8dSKaricheri, Muralidharan int ret = GMACSL_RET_OK; 295fc9a8e8dSKaricheri, Muralidharan 296fc9a8e8dSKaricheri, Muralidharan if (port >= DEVICE_N_GMACSL_PORTS) 297fc9a8e8dSKaricheri, Muralidharan return GMACSL_RET_INVALID_PORT; 298fc9a8e8dSKaricheri, Muralidharan 299fc9a8e8dSKaricheri, Muralidharan if (cfg->max_rx_len > CPGMAC_REG_MAXLEN_LEN) { 300fc9a8e8dSKaricheri, Muralidharan cfg->max_rx_len = CPGMAC_REG_MAXLEN_LEN; 301fc9a8e8dSKaricheri, Muralidharan ret = GMACSL_RET_WARN_MAXLEN_TOO_BIG; 302fc9a8e8dSKaricheri, Muralidharan } 303fc9a8e8dSKaricheri, Muralidharan 304fc9a8e8dSKaricheri, Muralidharan /* Must wait if the device is undergoing reset */ 305fc9a8e8dSKaricheri, Muralidharan for (i = 0; i < DEVICE_EMACSL_RESET_POLL_COUNT; i++) { 306e6c9428aSKhoronzhuk, Ivan v = readl(DEVICE_EMACSL_BASE(port) + CPGMACSL_REG_RESET); 307fc9a8e8dSKaricheri, Muralidharan if ((v & CPGMAC_REG_RESET_VAL_RESET_MASK) != 308fc9a8e8dSKaricheri, Muralidharan CPGMAC_REG_RESET_VAL_RESET) 309fc9a8e8dSKaricheri, Muralidharan break; 310fc9a8e8dSKaricheri, Muralidharan } 311fc9a8e8dSKaricheri, Muralidharan 312fc9a8e8dSKaricheri, Muralidharan if (i == DEVICE_EMACSL_RESET_POLL_COUNT) 313fc9a8e8dSKaricheri, Muralidharan return GMACSL_RET_CONFIG_FAIL_RESET_ACTIVE; 314fc9a8e8dSKaricheri, Muralidharan 315e6c9428aSKhoronzhuk, Ivan writel(cfg->max_rx_len, DEVICE_EMACSL_BASE(port) + CPGMACSL_REG_MAXLEN); 316e6c9428aSKhoronzhuk, Ivan writel(cfg->ctl, DEVICE_EMACSL_BASE(port) + CPGMACSL_REG_CTL); 317fc9a8e8dSKaricheri, Muralidharan 3186c0fb41aSKhoronzhuk, Ivan #if defined(CONFIG_SOC_K2E) || defined(CONFIG_SOC_K2L) 319ff11c769SKhoronzhuk, Ivan /* Map RX packet flow priority to 0 */ 320ff11c769SKhoronzhuk, Ivan writel(0, DEVICE_EMACSL_BASE(port) + CPGMACSL_REG_RX_PRI_MAP); 321ff11c769SKhoronzhuk, Ivan #endif 322ff11c769SKhoronzhuk, Ivan 323fc9a8e8dSKaricheri, Muralidharan return ret; 324fc9a8e8dSKaricheri, Muralidharan } 325fc9a8e8dSKaricheri, Muralidharan 326fc9a8e8dSKaricheri, Muralidharan int ethss_config(u32 ctl, u32 max_pkt_size) 327fc9a8e8dSKaricheri, Muralidharan { 328fc9a8e8dSKaricheri, Muralidharan u32 i; 329fc9a8e8dSKaricheri, Muralidharan 330fc9a8e8dSKaricheri, Muralidharan /* Max length register */ 331e6c9428aSKhoronzhuk, Ivan writel(max_pkt_size, DEVICE_CPSW_BASE + CPSW_REG_MAXLEN); 332fc9a8e8dSKaricheri, Muralidharan 333fc9a8e8dSKaricheri, Muralidharan /* Control register */ 334e6c9428aSKhoronzhuk, Ivan writel(ctl, DEVICE_CPSW_BASE + CPSW_REG_CTL); 335fc9a8e8dSKaricheri, Muralidharan 336fc9a8e8dSKaricheri, Muralidharan /* All statistics enabled by default */ 337e6c9428aSKhoronzhuk, Ivan writel(CPSW_REG_VAL_STAT_ENABLE_ALL, 338e6c9428aSKhoronzhuk, Ivan DEVICE_CPSW_BASE + CPSW_REG_STAT_PORT_EN); 339fc9a8e8dSKaricheri, Muralidharan 340fc9a8e8dSKaricheri, Muralidharan /* Reset and enable the ALE */ 341e6c9428aSKhoronzhuk, Ivan writel(CPSW_REG_VAL_ALE_CTL_RESET_AND_ENABLE | 342e6c9428aSKhoronzhuk, Ivan CPSW_REG_VAL_ALE_CTL_BYPASS, 343e6c9428aSKhoronzhuk, Ivan DEVICE_CPSW_BASE + CPSW_REG_ALE_CONTROL); 344fc9a8e8dSKaricheri, Muralidharan 345fc9a8e8dSKaricheri, Muralidharan /* All ports put into forward mode */ 346fc9a8e8dSKaricheri, Muralidharan for (i = 0; i < DEVICE_CPSW_NUM_PORTS; i++) 347e6c9428aSKhoronzhuk, Ivan writel(CPSW_REG_VAL_PORTCTL_FORWARD_MODE, 348e6c9428aSKhoronzhuk, Ivan DEVICE_CPSW_BASE + CPSW_REG_ALE_PORTCTL(i)); 349fc9a8e8dSKaricheri, Muralidharan 350fc9a8e8dSKaricheri, Muralidharan return 0; 351fc9a8e8dSKaricheri, Muralidharan } 352fc9a8e8dSKaricheri, Muralidharan 353fc9a8e8dSKaricheri, Muralidharan int ethss_start(void) 354fc9a8e8dSKaricheri, Muralidharan { 355fc9a8e8dSKaricheri, Muralidharan int i; 356fc9a8e8dSKaricheri, Muralidharan struct mac_sl_cfg cfg; 357fc9a8e8dSKaricheri, Muralidharan 358fc9a8e8dSKaricheri, Muralidharan cfg.max_rx_len = MAX_SIZE_STREAM_BUFFER; 359fc9a8e8dSKaricheri, Muralidharan cfg.ctl = GMACSL_ENABLE | GMACSL_RX_ENABLE_EXT_CTL; 360fc9a8e8dSKaricheri, Muralidharan 361fc9a8e8dSKaricheri, Muralidharan for (i = 0; i < DEVICE_N_GMACSL_PORTS; i++) { 362fc9a8e8dSKaricheri, Muralidharan mac_sl_reset(i); 363fc9a8e8dSKaricheri, Muralidharan mac_sl_config(i, &cfg); 364fc9a8e8dSKaricheri, Muralidharan } 365fc9a8e8dSKaricheri, Muralidharan 366fc9a8e8dSKaricheri, Muralidharan return 0; 367fc9a8e8dSKaricheri, Muralidharan } 368fc9a8e8dSKaricheri, Muralidharan 369fc9a8e8dSKaricheri, Muralidharan int ethss_stop(void) 370fc9a8e8dSKaricheri, Muralidharan { 371fc9a8e8dSKaricheri, Muralidharan int i; 372fc9a8e8dSKaricheri, Muralidharan 373fc9a8e8dSKaricheri, Muralidharan for (i = 0; i < DEVICE_N_GMACSL_PORTS; i++) 374fc9a8e8dSKaricheri, Muralidharan mac_sl_reset(i); 375fc9a8e8dSKaricheri, Muralidharan 376fc9a8e8dSKaricheri, Muralidharan return 0; 377fc9a8e8dSKaricheri, Muralidharan } 378fc9a8e8dSKaricheri, Muralidharan 379fc9a8e8dSKaricheri, Muralidharan int32_t cpmac_drv_send(u32 *buffer, int num_bytes, int slave_port_num) 380fc9a8e8dSKaricheri, Muralidharan { 381fc9a8e8dSKaricheri, Muralidharan if (num_bytes < EMAC_MIN_ETHERNET_PKT_SIZE) 382fc9a8e8dSKaricheri, Muralidharan num_bytes = EMAC_MIN_ETHERNET_PKT_SIZE; 383fc9a8e8dSKaricheri, Muralidharan 3849ea9021aSKhoronzhuk, Ivan return ksnav_send(&netcp_pktdma, buffer, 3859ea9021aSKhoronzhuk, Ivan num_bytes, (slave_port_num) << 16); 386fc9a8e8dSKaricheri, Muralidharan } 387fc9a8e8dSKaricheri, Muralidharan 388fc9a8e8dSKaricheri, Muralidharan /* Eth device open */ 389fc9a8e8dSKaricheri, Muralidharan static int keystone2_eth_open(struct eth_device *dev, bd_t *bis) 390fc9a8e8dSKaricheri, Muralidharan { 391fc9a8e8dSKaricheri, Muralidharan struct eth_priv_t *eth_priv = (struct eth_priv_t *)dev->priv; 3923fe93623SKhoronzhuk, Ivan struct phy_device *phy_dev = eth_priv->phy_dev; 393fc9a8e8dSKaricheri, Muralidharan 394fc9a8e8dSKaricheri, Muralidharan debug("+ emac_open\n"); 395fc9a8e8dSKaricheri, Muralidharan 396fc9a8e8dSKaricheri, Muralidharan net_rx_buffs.rx_flow = eth_priv->rx_flow; 397fc9a8e8dSKaricheri, Muralidharan 398fc9a8e8dSKaricheri, Muralidharan sys_has_mdio = 399fc9a8e8dSKaricheri, Muralidharan (eth_priv->sgmii_link_type == SGMII_LINK_MAC_PHY) ? 1 : 0; 400fc9a8e8dSKaricheri, Muralidharan 4016c0fb41aSKhoronzhuk, Ivan if (sys_has_mdio) 4026c0fb41aSKhoronzhuk, Ivan keystone2_mdio_reset(mdio_bus); 4036c0fb41aSKhoronzhuk, Ivan 404c05d05e7SKhoronzhuk, Ivan keystone_sgmii_config(phy_dev, eth_priv->slave_port - 1, 405fc9a8e8dSKaricheri, Muralidharan eth_priv->sgmii_link_type); 406fc9a8e8dSKaricheri, Muralidharan 407fc9a8e8dSKaricheri, Muralidharan udelay(10000); 408fc9a8e8dSKaricheri, Muralidharan 409fc9a8e8dSKaricheri, Muralidharan /* On chip switch configuration */ 410fc9a8e8dSKaricheri, Muralidharan ethss_config(target_get_switch_ctl(), SWITCH_MAX_PKT_SIZE); 411fc9a8e8dSKaricheri, Muralidharan 412fc9a8e8dSKaricheri, Muralidharan /* TODO: add error handling code */ 413fc9a8e8dSKaricheri, Muralidharan if (qm_init()) { 414fc9a8e8dSKaricheri, Muralidharan printf("ERROR: qm_init()\n"); 415fc9a8e8dSKaricheri, Muralidharan return -1; 416fc9a8e8dSKaricheri, Muralidharan } 4179ea9021aSKhoronzhuk, Ivan if (ksnav_init(&netcp_pktdma, &net_rx_buffs)) { 418fc9a8e8dSKaricheri, Muralidharan qm_close(); 419fc9a8e8dSKaricheri, Muralidharan printf("ERROR: netcp_init()\n"); 420fc9a8e8dSKaricheri, Muralidharan return -1; 421fc9a8e8dSKaricheri, Muralidharan } 422fc9a8e8dSKaricheri, Muralidharan 423fc9a8e8dSKaricheri, Muralidharan /* 424fc9a8e8dSKaricheri, Muralidharan * Streaming switch configuration. If not present this 425fc9a8e8dSKaricheri, Muralidharan * statement is defined to void in target.h. 426fc9a8e8dSKaricheri, Muralidharan * If present this is usually defined to a series of register writes 427fc9a8e8dSKaricheri, Muralidharan */ 428fc9a8e8dSKaricheri, Muralidharan hw_config_streaming_switch(); 429fc9a8e8dSKaricheri, Muralidharan 430fc9a8e8dSKaricheri, Muralidharan if (sys_has_mdio) { 431550c5ce6SKhoronzhuk, Ivan keystone2_mdio_reset(mdio_bus); 432fc9a8e8dSKaricheri, Muralidharan 4333fe93623SKhoronzhuk, Ivan phy_startup(phy_dev); 4343fe93623SKhoronzhuk, Ivan if (phy_dev->link == 0) { 4359ea9021aSKhoronzhuk, Ivan ksnav_close(&netcp_pktdma); 436fc9a8e8dSKaricheri, Muralidharan qm_close(); 437fc9a8e8dSKaricheri, Muralidharan return -1; 438fc9a8e8dSKaricheri, Muralidharan } 439fc9a8e8dSKaricheri, Muralidharan } 440fc9a8e8dSKaricheri, Muralidharan 441fc9a8e8dSKaricheri, Muralidharan emac_gigabit_enable(dev); 442fc9a8e8dSKaricheri, Muralidharan 443fc9a8e8dSKaricheri, Muralidharan ethss_start(); 444fc9a8e8dSKaricheri, Muralidharan 445fc9a8e8dSKaricheri, Muralidharan debug("- emac_open\n"); 446fc9a8e8dSKaricheri, Muralidharan 447fc9a8e8dSKaricheri, Muralidharan emac_open = 1; 448fc9a8e8dSKaricheri, Muralidharan 449fc9a8e8dSKaricheri, Muralidharan return 0; 450fc9a8e8dSKaricheri, Muralidharan } 451fc9a8e8dSKaricheri, Muralidharan 452fc9a8e8dSKaricheri, Muralidharan /* Eth device close */ 453fc9a8e8dSKaricheri, Muralidharan void keystone2_eth_close(struct eth_device *dev) 454fc9a8e8dSKaricheri, Muralidharan { 4553fe93623SKhoronzhuk, Ivan struct eth_priv_t *eth_priv = (struct eth_priv_t *)dev->priv; 4563fe93623SKhoronzhuk, Ivan struct phy_device *phy_dev = eth_priv->phy_dev; 4573fe93623SKhoronzhuk, Ivan 458fc9a8e8dSKaricheri, Muralidharan debug("+ emac_close\n"); 459fc9a8e8dSKaricheri, Muralidharan 460fc9a8e8dSKaricheri, Muralidharan if (!emac_open) 461fc9a8e8dSKaricheri, Muralidharan return; 462fc9a8e8dSKaricheri, Muralidharan 463fc9a8e8dSKaricheri, Muralidharan ethss_stop(); 464fc9a8e8dSKaricheri, Muralidharan 4659ea9021aSKhoronzhuk, Ivan ksnav_close(&netcp_pktdma); 466fc9a8e8dSKaricheri, Muralidharan qm_close(); 4673fe93623SKhoronzhuk, Ivan phy_shutdown(phy_dev); 468fc9a8e8dSKaricheri, Muralidharan 469fc9a8e8dSKaricheri, Muralidharan emac_open = 0; 470fc9a8e8dSKaricheri, Muralidharan 471fc9a8e8dSKaricheri, Muralidharan debug("- emac_close\n"); 472fc9a8e8dSKaricheri, Muralidharan } 473fc9a8e8dSKaricheri, Muralidharan 474fc9a8e8dSKaricheri, Muralidharan /* 475fc9a8e8dSKaricheri, Muralidharan * This function sends a single packet on the network and returns 476fc9a8e8dSKaricheri, Muralidharan * positive number (number of bytes transmitted) or negative for error 477fc9a8e8dSKaricheri, Muralidharan */ 478fc9a8e8dSKaricheri, Muralidharan static int keystone2_eth_send_packet(struct eth_device *dev, 479fc9a8e8dSKaricheri, Muralidharan void *packet, int length) 480fc9a8e8dSKaricheri, Muralidharan { 481fc9a8e8dSKaricheri, Muralidharan int ret_status = -1; 482fc9a8e8dSKaricheri, Muralidharan struct eth_priv_t *eth_priv = (struct eth_priv_t *)dev->priv; 483a4d2adeeSKhoronzhuk, Ivan struct phy_device *phy_dev = eth_priv->phy_dev; 484fc9a8e8dSKaricheri, Muralidharan 485a4d2adeeSKhoronzhuk, Ivan genphy_update_link(phy_dev); 486a4d2adeeSKhoronzhuk, Ivan if (phy_dev->link == 0) 487fc9a8e8dSKaricheri, Muralidharan return -1; 488fc9a8e8dSKaricheri, Muralidharan 489fc9a8e8dSKaricheri, Muralidharan if (cpmac_drv_send((u32 *)packet, length, eth_priv->slave_port) != 0) 490fc9a8e8dSKaricheri, Muralidharan return ret_status; 491fc9a8e8dSKaricheri, Muralidharan 492fc9a8e8dSKaricheri, Muralidharan return length; 493fc9a8e8dSKaricheri, Muralidharan } 494fc9a8e8dSKaricheri, Muralidharan 495fc9a8e8dSKaricheri, Muralidharan /* 496fc9a8e8dSKaricheri, Muralidharan * This function handles receipt of a packet from the network 497fc9a8e8dSKaricheri, Muralidharan */ 498fc9a8e8dSKaricheri, Muralidharan static int keystone2_eth_rcv_packet(struct eth_device *dev) 499fc9a8e8dSKaricheri, Muralidharan { 500fc9a8e8dSKaricheri, Muralidharan void *hd; 501fc9a8e8dSKaricheri, Muralidharan int pkt_size; 502fc9a8e8dSKaricheri, Muralidharan u32 *pkt; 503fc9a8e8dSKaricheri, Muralidharan 5049ea9021aSKhoronzhuk, Ivan hd = ksnav_recv(&netcp_pktdma, &pkt, &pkt_size); 505fc9a8e8dSKaricheri, Muralidharan if (hd == NULL) 506fc9a8e8dSKaricheri, Muralidharan return 0; 507fc9a8e8dSKaricheri, Muralidharan 5081fd92db8SJoe Hershberger net_process_received_packet((uchar *)pkt, pkt_size); 509fc9a8e8dSKaricheri, Muralidharan 5109ea9021aSKhoronzhuk, Ivan ksnav_release_rxhd(&netcp_pktdma, hd); 511fc9a8e8dSKaricheri, Muralidharan 512fc9a8e8dSKaricheri, Muralidharan return pkt_size; 513fc9a8e8dSKaricheri, Muralidharan } 514fc9a8e8dSKaricheri, Muralidharan 5155031ca59SVitaly Andrianov #ifdef CONFIG_MCAST_TFTP 5165031ca59SVitaly Andrianov static int keystone2_eth_bcast_addr(struct eth_device *dev, u32 ip, u8 set) 5175031ca59SVitaly Andrianov { 5185031ca59SVitaly Andrianov return 0; 5195031ca59SVitaly Andrianov } 5205031ca59SVitaly Andrianov #endif 5215031ca59SVitaly Andrianov 522fc9a8e8dSKaricheri, Muralidharan /* 523fc9a8e8dSKaricheri, Muralidharan * This function initializes the EMAC hardware. 524fc9a8e8dSKaricheri, Muralidharan */ 525fc9a8e8dSKaricheri, Muralidharan int keystone2_emac_initialize(struct eth_priv_t *eth_priv) 526fc9a8e8dSKaricheri, Muralidharan { 527550c5ce6SKhoronzhuk, Ivan int res; 528fc9a8e8dSKaricheri, Muralidharan struct eth_device *dev; 5293fe93623SKhoronzhuk, Ivan struct phy_device *phy_dev; 530fc9a8e8dSKaricheri, Muralidharan 531fc9a8e8dSKaricheri, Muralidharan dev = malloc(sizeof(struct eth_device)); 532fc9a8e8dSKaricheri, Muralidharan if (dev == NULL) 533fc9a8e8dSKaricheri, Muralidharan return -1; 534fc9a8e8dSKaricheri, Muralidharan 535fc9a8e8dSKaricheri, Muralidharan memset(dev, 0, sizeof(struct eth_device)); 536fc9a8e8dSKaricheri, Muralidharan 537fc9a8e8dSKaricheri, Muralidharan strcpy(dev->name, eth_priv->int_name); 538fc9a8e8dSKaricheri, Muralidharan dev->priv = eth_priv; 539fc9a8e8dSKaricheri, Muralidharan 540fc9a8e8dSKaricheri, Muralidharan keystone2_eth_read_mac_addr(dev); 541fc9a8e8dSKaricheri, Muralidharan 542fc9a8e8dSKaricheri, Muralidharan dev->iobase = 0; 543fc9a8e8dSKaricheri, Muralidharan dev->init = keystone2_eth_open; 544fc9a8e8dSKaricheri, Muralidharan dev->halt = keystone2_eth_close; 545fc9a8e8dSKaricheri, Muralidharan dev->send = keystone2_eth_send_packet; 546fc9a8e8dSKaricheri, Muralidharan dev->recv = keystone2_eth_rcv_packet; 5475031ca59SVitaly Andrianov #ifdef CONFIG_MCAST_TFTP 5485031ca59SVitaly Andrianov dev->mcast = keystone2_eth_bcast_addr; 5495031ca59SVitaly Andrianov #endif 550fc9a8e8dSKaricheri, Muralidharan 551fc9a8e8dSKaricheri, Muralidharan eth_register(dev); 552fc9a8e8dSKaricheri, Muralidharan 553550c5ce6SKhoronzhuk, Ivan /* Register MDIO bus if it's not registered yet */ 554550c5ce6SKhoronzhuk, Ivan if (!mdio_bus) { 555550c5ce6SKhoronzhuk, Ivan mdio_bus = mdio_alloc(); 556550c5ce6SKhoronzhuk, Ivan mdio_bus->read = keystone2_mdio_read; 557550c5ce6SKhoronzhuk, Ivan mdio_bus->write = keystone2_mdio_write; 558550c5ce6SKhoronzhuk, Ivan mdio_bus->reset = keystone2_mdio_reset; 559550c5ce6SKhoronzhuk, Ivan mdio_bus->priv = (void *)EMAC_MDIO_BASE_ADDR; 560550c5ce6SKhoronzhuk, Ivan sprintf(mdio_bus->name, "ethernet-mdio"); 561550c5ce6SKhoronzhuk, Ivan 562550c5ce6SKhoronzhuk, Ivan res = mdio_register(mdio_bus); 563550c5ce6SKhoronzhuk, Ivan if (res) 564550c5ce6SKhoronzhuk, Ivan return res; 565550c5ce6SKhoronzhuk, Ivan } 566550c5ce6SKhoronzhuk, Ivan 567312aca4eSVitaly Andrianov keystone2_net_serdes_setup(); 568312aca4eSVitaly Andrianov 5693fe93623SKhoronzhuk, Ivan /* Create phy device and bind it with driver */ 5703fe93623SKhoronzhuk, Ivan #ifdef CONFIG_KSNET_MDIO_PHY_CONFIG_ENABLE 5713fe93623SKhoronzhuk, Ivan phy_dev = phy_connect(mdio_bus, eth_priv->phy_addr, 572*bf7bd4e7SMugunthan V N dev, eth_priv->phy_if); 5733fe93623SKhoronzhuk, Ivan phy_config(phy_dev); 5743fe93623SKhoronzhuk, Ivan #else 5753fe93623SKhoronzhuk, Ivan phy_dev = phy_find_by_mask(mdio_bus, 1 << eth_priv->phy_addr, 576*bf7bd4e7SMugunthan V N eth_priv->phy_if); 5773fe93623SKhoronzhuk, Ivan phy_dev->dev = dev; 5783fe93623SKhoronzhuk, Ivan #endif 5793fe93623SKhoronzhuk, Ivan eth_priv->phy_dev = phy_dev; 5803fe93623SKhoronzhuk, Ivan 581fc9a8e8dSKaricheri, Muralidharan return 0; 582fc9a8e8dSKaricheri, Muralidharan } 583fc9a8e8dSKaricheri, Muralidharan 58492a16c81SHao Zhang struct ks2_serdes ks2_serdes_sgmii_156p25mhz = { 58592a16c81SHao Zhang .clk = SERDES_CLOCK_156P25M, 58692a16c81SHao Zhang .rate = SERDES_RATE_5G, 58792a16c81SHao Zhang .rate_mode = SERDES_QUARTER_RATE, 58892a16c81SHao Zhang .intf = SERDES_PHY_SGMII, 58992a16c81SHao Zhang .loopback = 0, 59092a16c81SHao Zhang }; 59192a16c81SHao Zhang 592a43febdeSKhoronzhuk, Ivan static void keystone2_net_serdes_setup(void) 593fc9a8e8dSKaricheri, Muralidharan { 59492a16c81SHao Zhang ks2_serdes_init(CONFIG_KSNET_SERDES_SGMII_BASE, 59592a16c81SHao Zhang &ks2_serdes_sgmii_156p25mhz, 59692a16c81SHao Zhang CONFIG_KSNET_SERDES_LANES_PER_SGMII); 59792a16c81SHao Zhang 59887ac27bdSKhoronzhuk, Ivan #if defined(CONFIG_SOC_K2E) || defined(CONFIG_SOC_K2L) 5993c61502aSKhoronzhuk, Ivan ks2_serdes_init(CONFIG_KSNET_SERDES_SGMII2_BASE, 6003c61502aSKhoronzhuk, Ivan &ks2_serdes_sgmii_156p25mhz, 6013c61502aSKhoronzhuk, Ivan CONFIG_KSNET_SERDES_LANES_PER_SGMII); 6023c61502aSKhoronzhuk, Ivan #endif 6033c61502aSKhoronzhuk, Ivan 60492a16c81SHao Zhang /* wait till setup */ 60592a16c81SHao Zhang udelay(5000); 606fc9a8e8dSKaricheri, Muralidharan } 607