Переглянути джерело

ag71xx: close a race between the phy state machine and link state

A fast stop/start cycle could leave the ag71xx interrupts and tx engine
disabled when using a phy driver with a fixed link and the start/stop
happens between two phy state machine polls.

Prevent this by always forcing the link down on stop regardless of phy
state and having a phy connected.

SVN-Revision: 28380
Jonas Gorski 14 роки тому
батько
коміт
c674c874b7

+ 7 - 3
target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_phy.c

@@ -59,15 +59,19 @@ void ag71xx_phy_start(struct ag71xx *ag)
 void ag71xx_phy_stop(struct ag71xx *ag)
 {
 	struct ag71xx_platform_data *pdata = ag71xx_get_pdata(ag);
+	unsigned long flags;
 
-	if (ag->phy_dev) {
+	if (ag->phy_dev)
 		phy_stop(ag->phy_dev);
-	} else {
-		if (pdata->has_ar7240_switch)
+	else if (pdata->has_ar7240_switch)
 			ag71xx_ar7240_stop(ag);
+
+	spin_lock_irqsave(&ag->lock, flags);
+	if (ag->link) {
 		ag->link = 0;
 		ag71xx_link_adjust(ag);
 	}
+	spin_unlock_irqrestore(&ag->lock, flags);
 }
 
 static int ag71xx_phy_connect_fixed(struct ag71xx *ag)