FEC: Add timeout for chip reset
Signed-off-by: Marek Vasut <marek.vasut@gmail.com> Cc: Ben Warren <biggerbadderben@gmail.com> Cc: Stefano Babic <sbabic@denx.de> Cc: Wolfgang Denk <wd@denx.de> Cc: Detlev Zundel <dzu@denx.de>
This commit is contained in:

committed by
Albert ARIBAUD

parent
2e5f44213f
commit
e382fb4873
@@ -695,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 eth_device *edev;
|
||||||
struct fec_priv *fec;
|
struct fec_priv *fec;
|
||||||
unsigned char ethaddr[6];
|
unsigned char ethaddr[6];
|
||||||
|
uint32_t start;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
/* create and fill edev struct */
|
/* create and fill edev struct */
|
||||||
edev = (struct eth_device *)malloc(sizeof(struct eth_device));
|
edev = (struct eth_device *)malloc(sizeof(struct eth_device));
|
||||||
if (!edev) {
|
if (!edev) {
|
||||||
puts("fec_mxc: not enough malloc memory for eth_device\n");
|
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));
|
fec = (struct fec_priv *)malloc(sizeof(struct fec_priv));
|
||||||
if (!fec) {
|
if (!fec) {
|
||||||
puts("fec_mxc: not enough malloc memory for fec_priv\n");
|
puts("fec_mxc: not enough malloc memory for fec_priv\n");
|
||||||
return -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
goto err2;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(edev, 0, sizeof(*edev));
|
memset(edev, 0, sizeof(*edev));
|
||||||
@@ -726,8 +730,14 @@ static int fec_probe(bd_t *bd, int dev_id, int phy_id, uint32_t base_addr)
|
|||||||
|
|
||||||
/* Reset chip. */
|
/* Reset chip. */
|
||||||
writel(readl(&fec->eth->ecntrl) | FEC_ECNTRL_RESET, &fec->eth->ecntrl);
|
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);
|
udelay(10);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set interrupt mask register
|
* Set interrupt mask register
|
||||||
@@ -767,7 +777,14 @@ static int fec_probe(bd_t *bd, int dev_id, int phy_id, uint32_t base_addr)
|
|||||||
memcpy(edev->enetaddr, ethaddr, 6);
|
memcpy(edev->enetaddr, ethaddr, 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
|
|
||||||
|
err3:
|
||||||
|
free(fec);
|
||||||
|
err2:
|
||||||
|
free(edev);
|
||||||
|
err1:
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_FEC_MXC_MULTI
|
#ifndef CONFIG_FEC_MXC_MULTI
|
||||||
|
Reference in New Issue
Block a user