[patch] (4/8) Add 802.3ad support to bonding

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This patch adds support for getting slave's speed and duplex via ethtool 
(Needed for 802.3ad and other future modes).

This patch is against bonding 2.4.20-20030317.

diff -Nuarp linux-2.4.20-bonding-20030317/drivers/net/bonding.c linux-2.4.20-bonding-20030317-devel/drivers/net/bonding.c
--- linux-2.4.20-bonding-20030317/drivers/net/bonding.c	2003-03-18 17:03:26.000000000 +0200
+++ linux-2.4.20-bonding-20030317-devel/drivers/net/bonding.c	2003-03-18 17:03:27.000000000 +0200
@@ -299,6 +299,10 @@
  *		Shmulik Hen <shmulik.hen at intel dot com>
  *	- Fixed hang in bond_enslave(): netdev_set_master() must not be
  *	  called from within the bond lock while traffic is running.
+ *
+ * 2003/03/18 - Amir Noam <amir.noam at intel dot com>
+ *	- Added support for getting slave's speed and duplex via ethtool.
+ *	  Needed for 802.3ad and other future modes.
  */
 
 #include <linux/config.h>
@@ -649,6 +653,59 @@ bond_attach_slave(struct bonding *bond, 
 	set_fs(fs);			\
 	ret; })
 
+/*
+ * Get link speed and duplex from the slave's base driver
+ * using ethtool. If for some reason the call fails or the
+ * values are invalid, fake speed and duplex to 100/Full
+ * and return error.
+ */
+static int bond_update_speed_duplex(struct slave *slave)
+{
+	struct net_device *dev = slave->dev;
+	static int (* ioctl)(struct net_device *, struct ifreq *, int);
+	struct ifreq ifr;
+	struct ethtool_cmd etool;
+
+	ioctl = dev->do_ioctl;
+	if (ioctl) {
+		etool.cmd = ETHTOOL_GSET;
+		ifr.ifr_data = (char*)&etool;
+		if (IOCTL(dev, &ifr, SIOCETHTOOL) == 0) {
+			slave->speed = etool.speed;
+			slave->duplex = etool.duplex;
+		} else {
+			goto err_out;
+		}
+	} else {
+		goto err_out;
+	}
+
+	switch (slave->speed) {
+		case SPEED_10:
+		case SPEED_100:
+		case SPEED_1000:
+			break;
+		default:
+			goto err_out;
+	}
+	
+	switch (slave->duplex) {
+		case DUPLEX_FULL:
+		case DUPLEX_HALF:
+			break;
+		default:
+			goto err_out;
+	}
+	
+	return 0;
+	
+err_out:
+	//Fake speed and duplex
+	slave->speed = SPEED_100;
+	slave->duplex = DUPLEX_FULL;
+	return -1;
+}
+
 /* 
  * if <dev> supports MII link status reporting, check its link status.
  *
@@ -1173,6 +1230,13 @@ static int bond_enslave(struct net_devic
 		new_slave->link  = BOND_LINK_DOWN;
 	}
 
+	if (bond_update_speed_duplex(new_slave) && (new_slave->link == BOND_LINK_UP) ) {
+		printk(KERN_WARNING
+		       "bond_enslave(): failed to get speed/duplex from %s, "
+		       "speed forced to 100Mbps, duplex forced to Full.\n",
+		       new_slave->dev->name);
+	}
+	
 	/* if we're in active-backup mode, we need one and only one active
 	 * interface. The backup interfaces will have their NOARP flag set
 	 * because we need them to be completely deaf and not to respond to
@@ -1821,6 +1885,9 @@ static void bond_mii_monitor(struct net_
 			}
 			break;
 		} /* end of switch */
+		
+		bond_update_speed_duplex(slave);
+		
 	} /* end of while */
 
 	/* 
diff -Nuarp linux-2.4.20-bonding-20030317/include/linux/if_bonding.h linux-2.4.20-bonding-20030317-devel/include/linux/if_bonding.h
--- linux-2.4.20-bonding-20030317/include/linux/if_bonding.h	2003-03-18 17:03:26.000000000 +0200
+++ linux-2.4.20-bonding-20030317-devel/include/linux/if_bonding.h	2003-03-18 17:03:27.000000000 +0200
@@ -11,6 +11,9 @@
  *	This software may be used and distributed according to the terms
  *	of the GNU Public License, incorporated herein by reference.
  * 
+ * 2003/03/18 - Amir Noam <amir.noam at intel dot com>
+ *	- Added support for getting slave's speed and duplex via ethtool.
+ *	  Needed for 802.3ad and other future modes.
  */
 
 #ifndef _LINUX_IF_BONDING_H
@@ -89,6 +92,8 @@ typedef struct slave {
 	char   state;   /* one of BOND_STATE_XXXX */
 	unsigned short original_flags;
 	u32 link_failure_count;
+	u16    speed;
+	u8     duplex;
 } slave_t;
 
 /*

-- 
| Shmulik Hen                                    |
| Israel Design Center (Jerusalem)               |
| LAN Access Division                            |
| Intel Communications Group, Intel corp.        |
|                                                |
| Anti-Spam: shmulik dot hen at intel dot com    |



-
: send the line "unsubscribe linux-net" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux 802.1Q VLAN]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Git]     [Bugtraq]     [Yosemite News and Information]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux PCI]     [Linux Admin]     [Samba]

  Powered by Linux