]> git.sur5r.net Git - u-boot/blobdiff - drivers/net/tsec.c
drivers/net/fec_mxc.c: write mac address in init
[u-boot] / drivers / net / tsec.c
index 7600e40de906d20d5885744878296d265f1333fc..9b5dd92fbb84a330e0ca84cff78f9dae6c135ebd 100644 (file)
@@ -60,9 +60,9 @@ static void phy_run_commands(struct tsec_private *priv, struct phy_cmd *cmd);
 static void adjust_link(struct eth_device *dev);
 #if defined(CONFIG_MII) || defined(CONFIG_CMD_MII) \
        && !defined(BITBANGMII)
-static int tsec_miiphy_write(char *devname, unsigned char addr,
+static int tsec_miiphy_write(const char *devname, unsigned char addr,
                             unsigned char reg, unsigned short value);
-static int tsec_miiphy_read(char *devname, unsigned char addr,
+static int tsec_miiphy_read(const char *devname, unsigned char addr,
                            unsigned char reg, unsigned short *value);
 #endif
 #ifdef CONFIG_MCAST_TFTP
@@ -95,14 +95,23 @@ static struct tsec_info_struct tsec_info[] = {
 #endif
 };
 
+/*
+ * Initialize all the TSEC devices
+ *
+ * Returns the number of TSEC devices that were initialized
+ */
 int tsec_eth_init(bd_t *bis, struct tsec_info_struct *tsecs, int num)
 {
        int i;
+       int ret, count = 0;
 
-       for (i = 0; i < num; i++)
-               tsec_initialize(bis, &tsecs[i]);
+       for (i = 0; i < num; i++) {
+               ret = tsec_initialize(bis, &tsecs[i]);
+               if (ret > 0)
+                       count += ret;
+       }
 
-       return 0;
+       return count;
 }
 
 int tsec_standard_init(bd_t *bis)
@@ -281,12 +290,16 @@ static uint tsec_local_mdio_read(volatile tsec_mdio_t *phyregs,
                | TBIANA_FULL_DUPLEX \
                )
 
-/* Force the TBI PHY into 1000Mbps full duplex when in SGMII mode */
+/* By default force the TBI PHY into 1000Mbps full duplex when in SGMII mode */
+#ifndef CONFIG_TSEC_TBICR_SETTINGS
 #define TBICR_SETTINGS ( \
                TBICR_PHY_RESET \
                | TBICR_FULL_DUPLEX \
                | TBICR_SPEED1_SET \
                )
+#else
+#define TBICR_SETTINGS CONFIG_TSEC_TBICR_SETTINGS
+#endif /* CONFIG_TSEC_TBICR_SETTINGS */
 
 /* Configure the TBI for SGMII operation */
 static void tsec_configure_serdes(struct tsec_private *priv)
@@ -617,6 +630,7 @@ static uint mii_parse_BCM5482_sr(uint mii_reg, struct tsec_private *priv)
 {
        if (BCM8482_is_serdes(priv)) {
                mii_parse_BCM5482_serdes_sr(priv);
+               priv->flags |= TSEC_FIBER;
        } else {
                /* Wait for auto-negotiation to complete or fail */
                mii_parse_sr(mii_reg, priv);
@@ -940,8 +954,9 @@ static void adjust_link(struct eth_device *dev)
                        break;
                }
 
-               printf("Speed: %d, %s duplex\n", priv->speed,
-                      (priv->duplexity) ? "full" : "half");
+               printf("Speed: %d, %s duplex%s\n", priv->speed,
+                      (priv->duplexity) ? "full" : "half",
+                      (priv->flags & TSEC_FIBER) ? ", fiber mode" : "");
 
        } else {
                printf("%s: No link.\n", dev->name);
@@ -1080,7 +1095,8 @@ static void tsec_halt(struct eth_device *dev)
        regs->dmactrl &= ~(DMACTRL_GRS | DMACTRL_GTS);
        regs->dmactrl |= (DMACTRL_GRS | DMACTRL_GTS);
 
-       while (!(regs->ievent & (IEVENT_GRSC | IEVENT_GTSC))) ;
+       while ((regs->ievent & (IEVENT_GRSC | IEVENT_GTSC))
+               != (IEVENT_GRSC | IEVENT_GTSC)) ;
 
        regs->maccfg1 &= ~(MACCFG1_TX_EN | MACCFG1_RX_EN);
 
@@ -1624,6 +1640,27 @@ static struct phy_info phy_info_dm9161 = {
        },
 };
 
+/* micrel KSZ804  */
+static struct phy_info phy_info_ksz804 =  {
+       0x0022151,
+       "Micrel KSZ804 PHY",
+       4,
+       (struct phy_cmd[]) { /* config */
+               {PHY_BMCR, PHY_BMCR_RESET, NULL},
+               {PHY_BMCR, PHY_BMCR_AUTON|PHY_BMCR_RST_NEG, NULL},
+               {miim_end,}
+       },
+       (struct phy_cmd[]) { /* startup */
+               {PHY_BMSR, miim_read, NULL},
+               {PHY_BMSR, miim_read, &mii_parse_sr},
+               {PHY_BMSR, miim_read, &mii_parse_link},
+               {miim_end,}
+       },
+       (struct phy_cmd[]) { /* shutdown */
+               {miim_end,}
+       }
+};
+
 /* a generic flavor.  */
 static struct phy_info phy_info_generic =  {
        0,
@@ -1787,6 +1824,7 @@ static struct phy_info *phy_info[] = {
        &phy_info_M88E1145,
        &phy_info_M88E1149S,
        &phy_info_dm9161,
+       &phy_info_ksz804,
        &phy_info_lxt971,
        &phy_info_VSC8211,
        &phy_info_VSC8244,
@@ -1881,7 +1919,7 @@ static void phy_run_commands(struct tsec_private *priv, struct phy_cmd *cmd)
  * Returns:
  *  0 on success
  */
-static int tsec_miiphy_read(char *devname, unsigned char addr,
+static int tsec_miiphy_read(const char *devname, unsigned char addr,
                            unsigned char reg, unsigned short *value)
 {
        unsigned short ret;
@@ -1904,7 +1942,7 @@ static int tsec_miiphy_read(char *devname, unsigned char addr,
  * Returns:
  *  0 on success
  */
-static int tsec_miiphy_write(char *devname, unsigned char addr,
+static int tsec_miiphy_write(const char *devname, unsigned char addr,
                             unsigned char reg, unsigned short value)
 {
        struct tsec_private *priv = privlist[0];