# --------------------------------------------
# 02/09/29	jgarzik@mandrakesoft.com	1.704
# [net drivers] add optional duplex-changed arg to generic_mii_ioctl helper
# --------------------------------------------
#
diff -Nru a/drivers/net/8139cp.c b/drivers/net/8139cp.c
--- a/drivers/net/8139cp.c	Sun Sep 29 19:35:38 2002
+++ b/drivers/net/8139cp.c	Sun Sep 29 19:35:38 2002
@@ -1664,9 +1664,9 @@
 	if (cmd == SIOCETHTOOL)
 		return cp_ethtool_ioctl(cp, (void *) rq->ifr_data);
 
-	rc = generic_mii_ioctl(&cp->mii_if, mii, cmd);
-	if (rc == 1)	/* we don't care about duplex change, fixup rc */
-		rc = 0;
+	spin_lock_irq(&cp->lock);
+	rc = generic_mii_ioctl(&cp->mii_if, mii, cmd, NULL);
+	spin_unlock_irq(&cp->lock);
 	return rc;
 }
 
diff -Nru a/drivers/net/8139too.c b/drivers/net/8139too.c
--- a/drivers/net/8139too.c	Sun Sep 29 19:35:38 2002
+++ b/drivers/net/8139too.c	Sun Sep 29 19:35:38 2002
@@ -2453,11 +2453,8 @@
 
 	else {
 		spin_lock_irq(&np->lock);
-		rc = generic_mii_ioctl(&np->mii, data, cmd);
+		rc = generic_mii_ioctl(&np->mii, data, cmd, NULL);
 		spin_unlock_irq(&np->lock);
-
-		if (rc == 1)	/* don't care about duplex change, fix up rc */
-			rc = 0;
 	}
 
 	return rc;
diff -Nru a/drivers/net/epic100.c b/drivers/net/epic100.c
--- a/drivers/net/epic100.c	Sun Sep 29 19:35:38 2002
+++ b/drivers/net/epic100.c	Sun Sep 29 19:35:38 2002
@@ -1447,10 +1447,8 @@
 	/* all other ioctls (the SIOC[GS]MIIxxx ioctls) */
 	else {
 		spin_lock_irq(&np->lock);
-		rc = generic_mii_ioctl(&np->mii, data, cmd);
+		rc = generic_mii_ioctl(&np->mii, data, cmd, NULL);
 		spin_unlock_irq(&np->lock);
-		if (rc == 1)	/* don't care about duplex change, fixup rc */
-			rc = 0;
 	}
 
 	/* power-down, if interface is down */
diff -Nru a/drivers/net/fealnx.c b/drivers/net/fealnx.c
--- a/drivers/net/fealnx.c	Sun Sep 29 19:35:38 2002
+++ b/drivers/net/fealnx.c	Sun Sep 29 19:35:38 2002
@@ -1847,10 +1847,8 @@
 
 	else {
 		spin_lock_irq(&np->lock);
-		rc = generic_mii_ioctl(&np->mii, data, cmd);
+		rc = generic_mii_ioctl(&np->mii, data, cmd, NULL);
 		spin_unlock_irq(&np->lock);
-		if (rc == 1)	/* don't care about duplex change, fix up rc */
-			rc = 0;
 	}
 
 	return rc;
diff -Nru a/drivers/net/mii.c b/drivers/net/mii.c
--- a/drivers/net/mii.c	Sun Sep 29 19:35:38 2002
+++ b/drivers/net/mii.c	Sun Sep 29 19:35:38 2002
@@ -262,11 +262,15 @@
 }
 
 int generic_mii_ioctl(struct mii_if_info *mii_if,
-		      struct mii_ioctl_data *mii_data, int cmd)
+		      struct mii_ioctl_data *mii_data, int cmd,
+		      unsigned int *duplex_chg_out)
 {
 	int rc = 0;
 	unsigned int duplex_changed = 0;
 
+	if (duplex_chg_out)
+		*duplex_chg_out = 0;
+
 	mii_data->phy_id &= mii_if->phy_id_mask;
 	mii_data->reg_num &= mii_if->reg_num_mask;
 
@@ -326,8 +330,9 @@
 		break;
 	}
 
-	if ((rc == 0) && (duplex_changed))
-		rc = 1;
+	if ((rc == 0) && (duplex_chg_out) && (duplex_changed))
+		*duplex_chg_out = 1;
+
 	return rc;
 }
 
diff -Nru a/drivers/net/sundance.c b/drivers/net/sundance.c
--- a/drivers/net/sundance.c	Sun Sep 29 19:35:38 2002
+++ b/drivers/net/sundance.c	Sun Sep 29 19:35:38 2002
@@ -1564,10 +1564,8 @@
 
 	else {
 		spin_lock_irq(&np->lock);
-		rc = generic_mii_ioctl(&np->mii_if, data, cmd);
+		rc = generic_mii_ioctl(&np->mii_if, data, cmd, NULL);
 		spin_unlock_irq(&np->lock);
-		if (rc == 1)	/* don't care about duplex change, fix up rc */
-			rc = 0;
 	}
 
 	return rc;
diff -Nru a/drivers/net/via-rhine.c b/drivers/net/via-rhine.c
--- a/drivers/net/via-rhine.c	Sun Sep 29 19:35:38 2002
+++ b/drivers/net/via-rhine.c	Sun Sep 29 19:35:38 2002
@@ -1733,10 +1733,8 @@
 
 	else {
 		spin_lock_irq(&np->lock);
-		rc = generic_mii_ioctl(&np->mii_if, data, cmd);
+		rc = generic_mii_ioctl(&np->mii_if, data, cmd, NULL);
 		spin_unlock_irq(&np->lock);
-		if (rc == 1)	/* don't care about duplex change, fix up rc */
-			rc = 0;
 	}
 
 	return rc;
diff -Nru a/include/linux/mii.h b/include/linux/mii.h
--- a/include/linux/mii.h	Sun Sep 29 19:35:38 2002
+++ b/include/linux/mii.h	Sun Sep 29 19:35:38 2002
@@ -130,7 +130,8 @@
 				     unsigned int ok_to_print,
 				     unsigned int init_media);
 extern int generic_mii_ioctl(struct mii_if_info *mii_if,
-                      	     struct mii_ioctl_data *mii_data, int cmd);
+                      	     struct mii_ioctl_data *mii_data, int cmd,
+			     unsigned int *duplex_changed);
 
 
 
