aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/arcnet/arcdevice.h2
-rw-r--r--drivers/net/arcnet/arcnet.c25
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
384static 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
384struct net_device *alloc_arcdev(const char *name) 394struct 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)