
Most probably we need a Signed-off-by then ;)
Take your pick. Either a:
Acked-by: Olof Johansson olof@lixom.net
Or apply the below revised patch instead.
SMC911X: Add chip auto detection
Refactor the smc911x driver to allow for detecting when the chip is missing. I.e. the detect_chip() function is called earlier and will abort gracefully when the Chip ID read returns all 1's.
Based on testing from Steve Sakoman, the test has been moved up in the function to not hang on systems without ethernet.
Signed-off-by: Olof Johansson olof@lixom.net Acked-by: Dirk Behme dirk.behme@googlemail.com Acked-by: Ben Warren biggerbadderben@gmail.com
Are we sure we have Ben's ACK.
I can't see an e-mail from him today. Or am I missing something?
drivers/net/smc911x.c | 14 ++++++++------ drivers/net/smc911x.h | 7 +++++-- 2 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/drivers/net/smc911x.c b/drivers/net/smc911x.c index 18a729c..df73478 100644 --- a/drivers/net/smc911x.c +++ b/drivers/net/smc911x.c @@ -146,10 +146,9 @@ static void smc911x_enable(struct eth_device *dev)
static int smc911x_init(struct eth_device *dev, bd_t * bd) {
- printf(DRIVERNAME ": initializing\n");
- struct chip_id *id = dev->priv;
- if (smc911x_detect_chip(dev))
goto err_out;
printf(DRIVERNAME ": detected %s controller\n", id->name);
smc911x_reset(dev);
@@ -162,9 +161,6 @@ static int smc911x_init(struct eth_device *dev, bd_t * bd) smc911x_enable(dev);
return 0;
-err_out:
- return -1;
}
static int smc911x_send(struct eth_device *dev, @@ -253,6 +249,12 @@ int smc911x_initialize(u8 dev_num, int base_addr)
dev->iobase = base_addr;
- /* Try to detect chip. Will fail if not present. */
- if (smc911x_detect_chip(dev)) {
free(dev);
return 0;
- }
- addrh = smc911x_get_mac_csr(dev, ADDRH); addrl = smc911x_get_mac_csr(dev, ADDRL); dev->enetaddr[0] = addrl;
diff --git a/drivers/net/smc911x.h b/drivers/net/smc911x.h index 053e330..d5bca63 100644 --- a/drivers/net/smc911x.h +++ b/drivers/net/smc911x.h @@ -441,7 +441,10 @@ static int smc911x_detect_chip(struct eth_device *dev) unsigned long val, i;
val = smc911x_reg_read(dev, BYTE_TEST);
- if (val != 0x87654321) {
- if (val == 0xffffffff) {
/* Special case -- no chip present */
return -1;
- } else if (val != 0x87654321) { printf(DRIVERNAME ": Invalid chip endian 0x%08lx\n", val); return -1; }
@@ -455,7 +458,7 @@ static int smc911x_detect_chip(struct eth_device *dev) return -1; }
- printf(DRIVERNAME ": detected %s controller\n", chip_ids[i].name);
dev->priv = (void *)&chip_ids[i];
return 0;
}
1.6.3.3