浏览代码

Tsi108_eth: fix link recovery after disconnect

Bug fix for tsi108_eth network driver.
This patch fixes a problem with link recovery after connection was lost.

Signed-off-by: Alexandre Bounine <alexandreb@tundra.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Alex Bounine 17 年之前
父节点
当前提交
b1aefe58c2
共有 1 个文件被更改,包括 12 次插入14 次删除
  1. 12 14
      drivers/net/tsi108_eth.c

+ 12 - 14
drivers/net/tsi108_eth.c

@@ -338,22 +338,21 @@ static void tsi108_check_phy(struct net_device *dev)
 
 
 			TSI_WRITE(TSI108_MAC_CFG2, mac_cfg2_reg);
 			TSI_WRITE(TSI108_MAC_CFG2, mac_cfg2_reg);
 			TSI_WRITE(TSI108_EC_PORTCTRL, portctrl_reg);
 			TSI_WRITE(TSI108_EC_PORTCTRL, portctrl_reg);
+		}
 
 
-			if (data->link_up == 0) {
-				/* The manual says it can take 3-4 usecs for the speed change
-				 * to take effect.
-				 */
-				udelay(5);
+		if (data->link_up == 0) {
+			/* The manual says it can take 3-4 usecs for the speed change
+			 * to take effect.
+			 */
+			udelay(5);
 
 
-				spin_lock(&data->txlock);
-				if (is_valid_ether_addr(dev->dev_addr) && data->txfree)
-					netif_wake_queue(dev);
+			spin_lock(&data->txlock);
+			if (is_valid_ether_addr(dev->dev_addr) && data->txfree)
+				netif_wake_queue(dev);
 
 
-				data->link_up = 1;
-				spin_unlock(&data->txlock);
-			}
+			data->link_up = 1;
+			spin_unlock(&data->txlock);
 		}
 		}
-
 	} else {
 	} else {
 		if (data->link_up == 1) {
 		if (data->link_up == 1) {
 			netif_stop_queue(dev);
 			netif_stop_queue(dev);
@@ -1267,12 +1266,11 @@ static void tsi108_init_phy(struct net_device *dev)
 	 * PHY_STAT register before the link up status bit is set.
 	 * PHY_STAT register before the link up status bit is set.
 	 */
 	 */
 
 
-	data->link_up = 1;
+	data->link_up = 0;
 
 
 	while (!((phyval = tsi108_read_mii(data, MII_BMSR)) &
 	while (!((phyval = tsi108_read_mii(data, MII_BMSR)) &
 		 BMSR_LSTATUS)) {
 		 BMSR_LSTATUS)) {
 		if (i++ > (MII_READ_DELAY / 10)) {
 		if (i++ > (MII_READ_DELAY / 10)) {
-			data->link_up = 0;
 			break;
 			break;
 		}
 		}
 		spin_unlock_irqrestore(&phy_lock, flags);
 		spin_unlock_irqrestore(&phy_lock, flags);