]> git.sur5r.net Git - u-boot/blobdiff - drivers/net/fec_mxc.c
e1000: Rewrite EEPROM checksum error to give more information
[u-boot] / drivers / net / fec_mxc.c
index 3c593aaaf50cf446c19e1e46fbc30c49c1419ee4..0c0c7cd2c738cfc7e89bdce54d88abc7fd42de96 100644 (file)
@@ -109,7 +109,7 @@ static void fec_mii_setspeed(struct fec_priv *fec)
         */
        writel((((imx_get_fecclk() / 1000000) + 2) / 5) << 1,
                        &fec->eth->mii_speed);
-       debug("fec_init: mii_speed %#lx\n",
+       debug("fec_init: mii_speed %08x\n",
                        readl(&fec->eth->mii_speed));
 }
 static int fec_miiphy_write(const char *dev, uint8_t phyAddr, uint8_t regAddr,
@@ -153,6 +153,7 @@ static int fec_miiphy_write(const char *dev, uint8_t phyAddr, uint8_t regAddr,
 static int miiphy_restart_aneg(struct eth_device *dev)
 {
        struct fec_priv *fec = (struct fec_priv *)dev->priv;
+       int ret = 0;
 
        /*
         * Wake up from sleep if necessary
@@ -173,7 +174,11 @@ static int miiphy_restart_aneg(struct eth_device *dev)
                        LPA_10HALF | PHY_ANLPAR_PSB_802_3);
        miiphy_write(dev->name, fec->phy_id, MII_BMCR,
                        BMCR_ANENABLE | BMCR_ANRESTART);
-       return 0;
+
+       if (fec->mii_postcall)
+               ret = fec->mii_postcall(fec->phy_id);
+
+       return ret;
 }
 
 static int miiphy_wait_aneg(struct eth_device *dev)
@@ -624,7 +629,7 @@ static int fec_recv(struct eth_device *dev)
         */
        ievent = readl(&fec->eth->ievent);
        writel(ievent, &fec->eth->ievent);
-       debug("fec_recv: ievent 0x%x\n", ievent);
+       debug("fec_recv: ievent 0x%lx\n", ievent);
        if (ievent & FEC_IEVENT_BABR) {
                fec_halt(dev);
                fec_init(dev, fec->bd);
@@ -690,18 +695,22 @@ static int fec_probe(bd_t *bd, int dev_id, int phy_id, uint32_t base_addr)
        struct eth_device *edev;
        struct fec_priv *fec;
        unsigned char ethaddr[6];
+       uint32_t start;
+       int ret = 0;
 
        /* create and fill edev struct */
        edev = (struct eth_device *)malloc(sizeof(struct eth_device));
        if (!edev) {
                puts("fec_mxc: not enough malloc memory for eth_device\n");
-               return -ENOMEM;
+               ret = -ENOMEM;
+               goto err1;
        }
 
        fec = (struct fec_priv *)malloc(sizeof(struct fec_priv));
        if (!fec) {
                puts("fec_mxc: not enough malloc memory for fec_priv\n");
-               return -ENOMEM;
+               ret = -ENOMEM;
+               goto err2;
        }
 
        memset(edev, 0, sizeof(*edev));
@@ -721,8 +730,14 @@ static int fec_probe(bd_t *bd, int dev_id, int phy_id, uint32_t base_addr)
 
        /* Reset chip. */
        writel(readl(&fec->eth->ecntrl) | FEC_ECNTRL_RESET, &fec->eth->ecntrl);
-       while (readl(&fec->eth->ecntrl) & FEC_ECNTRL_RESET)
+       start = get_timer(0);
+       while (readl(&fec->eth->ecntrl) & FEC_ECNTRL_RESET) {
+               if (get_timer(start) > (CONFIG_SYS_HZ * 5)) {
+                       printf("FEC MXC: Timeout reseting chip\n");
+                       goto err3;
+               }
                udelay(10);
+       }
 
        /*
         * Set interrupt mask register
@@ -758,11 +773,18 @@ static int fec_probe(bd_t *bd, int dev_id, int phy_id, uint32_t base_addr)
        eth_register(edev);
 
        if (fec_get_hwaddr(edev, ethaddr) == 0) {
-               printf("got MAC address from fuse: %pM\n", ethaddr);
+               debug("got MAC address from fuse: %pM\n", ethaddr);
                memcpy(edev->enetaddr, ethaddr, 6);
        }
 
-       return 0;
+       return ret;
+
+err3:
+       free(fec);
+err2:
+       free(edev);
+err1:
+       return ret;
 }
 
 #ifndef        CONFIG_FEC_MXC_MULTI
@@ -786,3 +808,10 @@ int fecmxc_initialize_multi(bd_t *bd, int dev_id, int phy_id, uint32_t addr)
 
        return lout;
 }
+
+int fecmxc_register_mii_postcall(struct eth_device *dev, int (*cb)(int))
+{
+       struct fec_priv *fec = (struct fec_priv *)dev->priv;
+       fec->mii_postcall = cb;
+       return 0;
+}