return 0;
}
+/*
+ * Count the number of slaves with link == BOND_LINK_*
+ */
+static int bond_count_slaves(struct bonding *bond, int link)
+{
+ struct slave *slave;
+ int i, count=0;
+
+ bond_for_each_slave(bond, slave, i) {
+ if (slave->link == link)
+ count++;
+ }
+ return count;
+}
+
/*
* Get link speed and duplex from the slave's base driver
* using ethtool. If for some reason the call fails or the
case BOND_LINK_DOWN:
if (!link_state)
continue;
+ slave->link = BOND_LINK_BACK;
+ slave->delay = 0;
- slave->link = BOND_LINK_BACK;
- slave->delay = bond->params.updelay;
-
- if (slave->delay) {
- printk(KERN_INFO DRV_NAME
- ": %s: link status up for "
+ if (bond_count_slaves(bond, BOND_LINK_UP) == 0) {
+ printk(KERN_INFO DRV_NAME
+ ": %s: link status up for "
+ "interface %s, enabling it "
+ "immediately as it is the only slave.\n",
+ bond->dev->name,
+ slave->dev->name);
+ } else if (bond->params.updelay) {
+ slave->delay = bond->params.updelay;
+ printk(KERN_INFO DRV_NAME
+ ": %s: link status up for "
"interface %s, enabling it in %d ms.\n",
bond->dev->name, slave->dev->name,
bond->params.updelay *