Hi Andre, On 10/18/2010 06:05 PM, Andre B. Oliveira wrote: > Slightly more reliable, yet still pretty much innocuous (read-only), > sja1000_probe_chip function. > > Signed-off-by: Andre B. Oliveira <[email protected]> > --- > drivers/net/can/sja1000/sja1000.c | 15 ++++++++++++--- > 1 files changed, 12 insertions(+), 3 deletions(-) > > diff --git a/drivers/net/can/sja1000/sja1000.c > b/drivers/net/can/sja1000/sja1000.c > index 0a8de01..3ae107f 100644 > --- a/drivers/net/can/sja1000/sja1000.c > +++ b/drivers/net/can/sja1000/sja1000.c > @@ -100,12 +100,21 @@ static void sja1000_write_cmdreg(struct sja1000_priv > *priv, u8 val) > static int sja1000_probe_chip(struct net_device *dev) > { > struct sja1000_priv *priv = netdev_priv(dev); > + u8 cdr, cmr; > > - if (priv->reg_base && (priv->read_reg(priv, 0) == 0xFF)) { > - printk(KERN_INFO "%s: probing @0x%lX failed\n", > - DRV_NAME, dev->base_addr); > + cdr = priv->read_reg(priv, REG_CDR); > + if (cdr & 0x10) /* datasheet section 6.5.4 */ > return 0; > + > + cmr = priv->read_reg(priv, REG_CMR); > + if (cdr & CDR_PELICAN) { > + if (cmr != 0x00) /* datasheet section 6.4.4 */ > + return 0; > + } else { > + if (cmr != 0xff) /* datasheet section 6.3.4 */ > + return 0; > } > + > return -1; > }
The plx_pci_check_sja1000() of the plx_pci driver is known to work. Why not just using that one, or something similar, at least: http://lxr.linux.no/#linux+v2.6.35.7/drivers/net/can/sja1000/plx_pci.c#L302 But these functions require the chip to be in the reset state. Not sure if that is the case on any card. Maybe it's safer to provide a common sja1000_probe_reset_chip(), which could be used directly by the drivers. Wolfgang. _______________________________________________ Socketcan-core mailing list [email protected] https://lists.berlios.de/mailman/listinfo/socketcan-core
