From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paulraj, Sandeep Date: Thu, 8 Oct 2009 09:42:12 -0500 Subject: [U-Boot] [PATCH v3] TI: OMAP3: Overo Tobi ethernet support In-Reply-To: <20091008065902.GA12935@lixom.net> References: <20090911204750.GA22246@lixom.net> <20090923145556.GA28659@lixom.net> <20090926211434.GB21538@lixom.net> <5e088bd90910050656l265d6fav32fe3bd86fd06250@mail.gmail.com> <4ACD6FA9.3070905@googlemail <20091008065902.GA12935@lixom.net> Message-ID: <0554BEF07D437848AF01B9C9B5F0BC5D93164B86@dlee01.ent.ti.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de > > Most probably we need a Signed-off-by then ;) > > Take your pick. Either a: > > Acked-by: Olof Johansson > > 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 > Acked-by: Dirk Behme > Acked-by: Ben Warren 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 >