|
@@ -836,13 +836,17 @@ static int ioc3_mii_init(struct ioc3_private *ip)
|
|
|
}
|
|
|
|
|
|
ip->mii.phy_id = i;
|
|
|
+
|
|
|
+out:
|
|
|
+ return res;
|
|
|
+}
|
|
|
+
|
|
|
+static void ioc3_mii_start(struct ioc3_private *ip)
|
|
|
+{
|
|
|
ip->ioc3_timer.expires = jiffies + (12 * HZ)/10; /* 1.2 sec. */
|
|
|
ip->ioc3_timer.data = (unsigned long) ip;
|
|
|
ip->ioc3_timer.function = &ioc3_timer;
|
|
|
add_timer(&ip->ioc3_timer);
|
|
|
-
|
|
|
-out:
|
|
|
- return res;
|
|
|
}
|
|
|
|
|
|
static inline void ioc3_clean_rx_ring(struct ioc3_private *ip)
|
|
@@ -1071,6 +1075,7 @@ static int ioc3_open(struct net_device *dev)
|
|
|
ip->ehar_h = 0;
|
|
|
ip->ehar_l = 0;
|
|
|
ioc3_init(dev);
|
|
|
+ ioc3_mii_start(ip);
|
|
|
|
|
|
netif_start_queue(dev);
|
|
|
return 0;
|
|
@@ -1274,6 +1279,7 @@ static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|
|
goto out_stop;
|
|
|
}
|
|
|
|
|
|
+ ioc3_mii_start(ip);
|
|
|
ioc3_ssram_disc(ip);
|
|
|
ioc3_get_eaddr(ip);
|
|
|
|
|
@@ -1314,6 +1320,7 @@ static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|
|
|
|
|
out_stop:
|
|
|
ioc3_stop(ip);
|
|
|
+ del_timer_sync(&ip->ioc3_timer);
|
|
|
ioc3_free_rings(ip);
|
|
|
out_res:
|
|
|
pci_release_regions(pdev);
|
|
@@ -1335,6 +1342,8 @@ static void __devexit ioc3_remove_one (struct pci_dev *pdev)
|
|
|
struct ioc3 *ioc3 = ip->regs;
|
|
|
|
|
|
unregister_netdev(dev);
|
|
|
+ del_timer_sync(&ip->ioc3_timer);
|
|
|
+
|
|
|
iounmap(ioc3);
|
|
|
pci_release_regions(pdev);
|
|
|
free_netdev(dev);
|
|
@@ -1492,6 +1501,7 @@ static void ioc3_timeout(struct net_device *dev)
|
|
|
ioc3_stop(ip);
|
|
|
ioc3_init(dev);
|
|
|
ioc3_mii_init(ip);
|
|
|
+ ioc3_mii_start(ip);
|
|
|
|
|
|
spin_unlock_irq(&ip->ioc3_lock);
|
|
|
|