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; } -- 1.7.1 _______________________________________________ Socketcan-core mailing list [email protected] https://lists.berlios.de/mailman/listinfo/socketcan-core
