@@ -95,11 +95,16 @@ static void sja1000_write_cmdreg(struct sja1000_priv *priv, u8 val)
95
95
spin_unlock_irqrestore (& priv -> cmdreg_lock , flags );
96
96
}
97
97
98
+ static int sja1000_is_absent (struct sja1000_priv * priv )
99
+ {
100
+ return (priv -> read_reg (priv , REG_MOD ) == 0xFF );
101
+ }
102
+
98
103
static int sja1000_probe_chip (struct net_device * dev )
99
104
{
100
105
struct sja1000_priv * priv = netdev_priv (dev );
101
106
102
- if (priv -> reg_base && (priv -> read_reg ( priv , 0 ) == 0xFF )) {
107
+ if (priv -> reg_base && sja1000_is_absent (priv )) {
103
108
printk (KERN_INFO "%s: probing @0x%lX failed\n" ,
104
109
DRV_NAME , dev -> base_addr );
105
110
return 0 ;
@@ -493,6 +498,9 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id)
493
498
while ((isrc = priv -> read_reg (priv , REG_IR )) && (n < SJA1000_MAX_IRQ )) {
494
499
n ++ ;
495
500
status = priv -> read_reg (priv , REG_SR );
501
+ /* check for absent controller due to hw unplug */
502
+ if (status == 0xFF && sja1000_is_absent (priv ))
503
+ return IRQ_NONE ;
496
504
497
505
if (isrc & IRQ_WUI )
498
506
dev_warn (dev -> dev .parent , "wakeup interrupt\n" );
@@ -509,6 +517,9 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id)
509
517
while (status & SR_RBS ) {
510
518
sja1000_rx (dev );
511
519
status = priv -> read_reg (priv , REG_SR );
520
+ /* check for absent controller */
521
+ if (status == 0xFF && sja1000_is_absent (priv ))
522
+ return IRQ_NONE ;
512
523
}
513
524
}
514
525
if (isrc & (IRQ_DOI | IRQ_EI | IRQ_BEI | IRQ_EPI | IRQ_ALI )) {
0 commit comments