diff options
-rw-r--r-- | drivers/net/arcnet/arcdevice.h | 2 | ||||
-rw-r--r-- | drivers/net/arcnet/arcnet.c | 25 |
2 files changed, 27 insertions, 0 deletions
diff --git a/drivers/net/arcnet/arcdevice.h b/drivers/net/arcnet/arcdevice.h index 2edc0c0ab7c7..20bfb9ba83ea 100644 --- a/drivers/net/arcnet/arcdevice.h +++ b/drivers/net/arcnet/arcdevice.h | |||
@@ -267,6 +267,8 @@ struct arcnet_local { | |||
267 | struct led_trigger *recon_led_trig; | 267 | struct led_trigger *recon_led_trig; |
268 | char recon_led_trig_name[ARCNET_LED_NAME_SZ]; | 268 | char recon_led_trig_name[ARCNET_LED_NAME_SZ]; |
269 | 269 | ||
270 | struct timer_list timer; | ||
271 | |||
270 | /* | 272 | /* |
271 | * Buffer management: an ARCnet card has 4 x 512-byte buffers, each of | 273 | * Buffer management: an ARCnet card has 4 x 512-byte buffers, each of |
272 | * which can be used for either sending or receiving. The new dynamic | 274 | * which can be used for either sending or receiving. The new dynamic |
diff --git a/drivers/net/arcnet/arcnet.c b/drivers/net/arcnet/arcnet.c index 4242522ae86b..6ea963e3b89a 100644 --- a/drivers/net/arcnet/arcnet.c +++ b/drivers/net/arcnet/arcnet.c | |||
@@ -381,6 +381,16 @@ static void arcdev_setup(struct net_device *dev) | |||
381 | dev->flags = IFF_BROADCAST; | 381 | dev->flags = IFF_BROADCAST; |
382 | } | 382 | } |
383 | 383 | ||
384 | static void arcnet_timer(unsigned long data) | ||
385 | { | ||
386 | struct net_device *dev = (struct net_device *)data; | ||
387 | |||
388 | if (!netif_carrier_ok(dev)) { | ||
389 | netif_carrier_on(dev); | ||
390 | netdev_info(dev, "link up\n"); | ||
391 | } | ||
392 | } | ||
393 | |||
384 | struct net_device *alloc_arcdev(const char *name) | 394 | struct net_device *alloc_arcdev(const char *name) |
385 | { | 395 | { |
386 | struct net_device *dev; | 396 | struct net_device *dev; |
@@ -392,6 +402,9 @@ struct net_device *alloc_arcdev(const char *name) | |||
392 | struct arcnet_local *lp = netdev_priv(dev); | 402 | struct arcnet_local *lp = netdev_priv(dev); |
393 | 403 | ||
394 | spin_lock_init(&lp->lock); | 404 | spin_lock_init(&lp->lock); |
405 | init_timer(&lp->timer); | ||
406 | lp->timer.data = (unsigned long) dev; | ||
407 | lp->timer.function = arcnet_timer; | ||
395 | } | 408 | } |
396 | 409 | ||
397 | return dev; | 410 | return dev; |
@@ -490,7 +503,9 @@ int arcnet_open(struct net_device *dev) | |||
490 | lp->hw.intmask(dev, lp->intmask); | 503 | lp->hw.intmask(dev, lp->intmask); |
491 | arc_printk(D_DEBUG, dev, "%s: %d: %s\n", __FILE__, __LINE__, __func__); | 504 | arc_printk(D_DEBUG, dev, "%s: %d: %s\n", __FILE__, __LINE__, __func__); |
492 | 505 | ||
506 | netif_carrier_off(dev); | ||
493 | netif_start_queue(dev); | 507 | netif_start_queue(dev); |
508 | mod_timer(&lp->timer, jiffies + msecs_to_jiffies(1000)); | ||
494 | 509 | ||
495 | arcnet_led_event(dev, ARCNET_LED_EVENT_OPEN); | 510 | arcnet_led_event(dev, ARCNET_LED_EVENT_OPEN); |
496 | return 0; | 511 | return 0; |
@@ -507,7 +522,10 @@ int arcnet_close(struct net_device *dev) | |||
507 | struct arcnet_local *lp = netdev_priv(dev); | 522 | struct arcnet_local *lp = netdev_priv(dev); |
508 | 523 | ||
509 | arcnet_led_event(dev, ARCNET_LED_EVENT_STOP); | 524 | arcnet_led_event(dev, ARCNET_LED_EVENT_STOP); |
525 | del_timer_sync(&lp->timer); | ||
526 | |||
510 | netif_stop_queue(dev); | 527 | netif_stop_queue(dev); |
528 | netif_carrier_off(dev); | ||
511 | 529 | ||
512 | /* flush TX and disable RX */ | 530 | /* flush TX and disable RX */ |
513 | lp->hw.intmask(dev, 0); | 531 | lp->hw.intmask(dev, 0); |
@@ -908,6 +926,12 @@ irqreturn_t arcnet_interrupt(int irq, void *dev_id) | |||
908 | 926 | ||
909 | arc_printk(D_RECON, dev, "Network reconfiguration detected (status=%Xh)\n", | 927 | arc_printk(D_RECON, dev, "Network reconfiguration detected (status=%Xh)\n", |
910 | status); | 928 | status); |
929 | if (netif_carrier_ok(dev)) { | ||
930 | netif_carrier_off(dev); | ||
931 | netdev_info(dev, "link down\n"); | ||
932 | } | ||
933 | mod_timer(&lp->timer, jiffies + msecs_to_jiffies(1000)); | ||
934 | |||
911 | arcnet_led_event(dev, ARCNET_LED_EVENT_RECON); | 935 | arcnet_led_event(dev, ARCNET_LED_EVENT_RECON); |
912 | /* MYRECON bit is at bit 7 of diagstatus */ | 936 | /* MYRECON bit is at bit 7 of diagstatus */ |
913 | if (diagstatus & 0x80) | 937 | if (diagstatus & 0x80) |
@@ -959,6 +983,7 @@ irqreturn_t arcnet_interrupt(int irq, void *dev_id) | |||
959 | lp->num_recons = lp->network_down = 0; | 983 | lp->num_recons = lp->network_down = 0; |
960 | 984 | ||
961 | arc_printk(D_DURING, dev, "not recon: clearing counters anyway.\n"); | 985 | arc_printk(D_DURING, dev, "not recon: clearing counters anyway.\n"); |
986 | netif_carrier_on(dev); | ||
962 | } | 987 | } |
963 | 988 | ||
964 | if (didsomething) | 989 | if (didsomething) |