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

Reply via email to