Merge branch 'master' of git://git.denx.de/u-boot
[platform/kernel/u-boot.git] / drivers / net / keystone_net.c
index 0c5fdee..5ed29ae 100644 (file)
@@ -42,7 +42,9 @@ struct rx_buff_desc net_rx_buffs = {
        .rx_flow        = 22,
 };
 
+#ifndef CONFIG_SOC_K2G
 static void keystone2_net_serdes_setup(void);
+#endif
 
 int keystone2_eth_read_mac_addr(struct eth_device *dev)
 {
@@ -161,16 +163,37 @@ static void  __attribute__((unused))
               DEVICE_EMACSL_BASE(eth_priv->slave_port - 1) + CPGMACSL_REG_CTL);
 }
 
-int keystone_sgmii_link_status(int port)
+#ifdef CONFIG_SOC_K2G
+int keystone_rgmii_config(struct phy_device *phy_dev)
 {
-       u32 status = 0;
+       unsigned int i, status;
 
-       status = __raw_readl(SGMII_STATUS_REG(port));
+       i = 0;
+       do {
+               if (i > SGMII_ANEG_TIMEOUT) {
+                       puts(" TIMEOUT !\n");
+                       phy_dev->link = 0;
+                       return 0;
+               }
 
-       return (status & SGMII_REG_STATUS_LOCK) &&
-              (status & SGMII_REG_STATUS_LINK);
-}
+               if (ctrlc()) {
+                       puts("user interrupt!\n");
+                       phy_dev->link = 0;
+                       return -EINTR;
+               }
+
+               if ((i++ % 500) == 0)
+                       printf(".");
+
+               udelay(1000);   /* 1 ms */
+               status = readl(RGMII_STATUS_REG);
+       } while (!(status & RGMII_REG_STATUS_LINK));
 
+       puts(" done\n");
+
+       return 0;
+}
+#else
 int keystone_sgmii_config(struct phy_device *phy_dev, int port, int interface)
 {
        unsigned int i, status, mask;
@@ -264,6 +287,7 @@ int keystone_sgmii_config(struct phy_device *phy_dev, int port, int interface)
 
        return 0;
 }
+#endif
 
 int mac_sl_reset(u32 port)
 {
@@ -315,7 +339,7 @@ int mac_sl_config(u_int16_t port, struct mac_sl_cfg *cfg)
        writel(cfg->max_rx_len, DEVICE_EMACSL_BASE(port) + CPGMACSL_REG_MAXLEN);
        writel(cfg->ctl, DEVICE_EMACSL_BASE(port) + CPGMACSL_REG_CTL);
 
-#if defined(CONFIG_SOC_K2E) || defined(CONFIG_SOC_K2L)
+#ifndef CONFIG_SOC_K2HK
        /* Map RX packet flow priority to 0 */
        writel(0, DEVICE_EMACSL_BASE(port) + CPGMACSL_REG_RX_PRI_MAP);
 #endif
@@ -401,8 +425,12 @@ static int keystone2_eth_open(struct eth_device *dev, bd_t *bis)
        if (sys_has_mdio)
                keystone2_mdio_reset(mdio_bus);
 
+#ifdef CONFIG_SOC_K2G
+       keystone_rgmii_config(phy_dev);
+#else
        keystone_sgmii_config(phy_dev, eth_priv->slave_port - 1,
                              eth_priv->sgmii_link_type);
+#endif
 
        udelay(10000);
 
@@ -512,6 +540,13 @@ static int keystone2_eth_rcv_packet(struct eth_device *dev)
        return pkt_size;
 }
 
+#ifdef CONFIG_MCAST_TFTP
+static int keystone2_eth_bcast_addr(struct eth_device *dev, u32 ip, u8 set)
+{
+       return 0;
+}
+#endif
+
 /*
  * This function initializes the EMAC hardware.
  */
@@ -537,6 +572,9 @@ int keystone2_emac_initialize(struct eth_priv_t *eth_priv)
        dev->halt               = keystone2_eth_close;
        dev->send               = keystone2_eth_send_packet;
        dev->recv               = keystone2_eth_rcv_packet;
+#ifdef CONFIG_MCAST_TFTP
+       dev->mcast              = keystone2_eth_bcast_addr;
+#endif
 
        eth_register(dev);
 
@@ -554,16 +592,18 @@ int keystone2_emac_initialize(struct eth_priv_t *eth_priv)
                        return res;
        }
 
+#ifndef CONFIG_SOC_K2G
        keystone2_net_serdes_setup();
+#endif
 
        /* Create phy device and bind it with driver */
 #ifdef CONFIG_KSNET_MDIO_PHY_CONFIG_ENABLE
        phy_dev = phy_connect(mdio_bus, eth_priv->phy_addr,
-                             dev, PHY_INTERFACE_MODE_SGMII);
+                             dev, eth_priv->phy_if);
        phy_config(phy_dev);
 #else
        phy_dev = phy_find_by_mask(mdio_bus, 1 << eth_priv->phy_addr,
-                                  PHY_INTERFACE_MODE_SGMII);
+                                  eth_priv->phy_if);
        phy_dev->dev = dev;
 #endif
        eth_priv->phy_dev = phy_dev;
@@ -579,6 +619,7 @@ struct ks2_serdes ks2_serdes_sgmii_156p25mhz = {
        .loopback = 0,
 };
 
+#ifndef CONFIG_SOC_K2G
 static void keystone2_net_serdes_setup(void)
 {
        ks2_serdes_init(CONFIG_KSNET_SERDES_SGMII_BASE,
@@ -594,3 +635,4 @@ static void keystone2_net_serdes_setup(void)
        /* wait till setup */
        udelay(5000);
 }
+#endif