diff options
-rw-r--r-- | drivers/net/bonding/bond_alb.c | 8 | ||||
-rw-r--r-- | drivers/net/bonding/bond_main.c | 92 | ||||
-rw-r--r-- | drivers/net/bonding/bond_sysfs.c | 22 |
3 files changed, 56 insertions, 66 deletions
diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c index 073d25f357bb..f0dde1888c71 100644 --- a/drivers/net/bonding/bond_alb.c +++ b/drivers/net/bonding/bond_alb.c | |||
@@ -1218,11 +1218,6 @@ static int alb_set_mac_address(struct bonding *bond, void *addr) | |||
1218 | } | 1218 | } |
1219 | 1219 | ||
1220 | bond_for_each_slave(bond, slave, i) { | 1220 | bond_for_each_slave(bond, slave, i) { |
1221 | if (slave->dev->set_mac_address == NULL) { | ||
1222 | res = -EOPNOTSUPP; | ||
1223 | goto unwind; | ||
1224 | } | ||
1225 | |||
1226 | /* save net_device's current hw address */ | 1221 | /* save net_device's current hw address */ |
1227 | memcpy(tmp_addr, slave->dev->dev_addr, ETH_ALEN); | 1222 | memcpy(tmp_addr, slave->dev->dev_addr, ETH_ALEN); |
1228 | 1223 | ||
@@ -1231,9 +1226,8 @@ static int alb_set_mac_address(struct bonding *bond, void *addr) | |||
1231 | /* restore net_device's hw address */ | 1226 | /* restore net_device's hw address */ |
1232 | memcpy(slave->dev->dev_addr, tmp_addr, ETH_ALEN); | 1227 | memcpy(slave->dev->dev_addr, tmp_addr, ETH_ALEN); |
1233 | 1228 | ||
1234 | if (res) { | 1229 | if (res) |
1235 | goto unwind; | 1230 | goto unwind; |
1236 | } | ||
1237 | } | 1231 | } |
1238 | 1232 | ||
1239 | return 0; | 1233 | return 0; |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index db5f5c24a250..614656c8187b 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -462,10 +462,11 @@ static void bond_vlan_rx_register(struct net_device *bond_dev, struct vlan_group | |||
462 | 462 | ||
463 | bond_for_each_slave(bond, slave, i) { | 463 | bond_for_each_slave(bond, slave, i) { |
464 | struct net_device *slave_dev = slave->dev; | 464 | struct net_device *slave_dev = slave->dev; |
465 | const struct net_device_ops *slave_ops = slave_dev->netdev_ops; | ||
465 | 466 | ||
466 | if ((slave_dev->features & NETIF_F_HW_VLAN_RX) && | 467 | if ((slave_dev->features & NETIF_F_HW_VLAN_RX) && |
467 | slave_dev->vlan_rx_register) { | 468 | slave_ops->ndo_vlan_rx_register) { |
468 | slave_dev->vlan_rx_register(slave_dev, grp); | 469 | slave_ops->ndo_vlan_rx_register(slave_dev, grp); |
469 | } | 470 | } |
470 | } | 471 | } |
471 | } | 472 | } |
@@ -483,10 +484,11 @@ static void bond_vlan_rx_add_vid(struct net_device *bond_dev, uint16_t vid) | |||
483 | 484 | ||
484 | bond_for_each_slave(bond, slave, i) { | 485 | bond_for_each_slave(bond, slave, i) { |
485 | struct net_device *slave_dev = slave->dev; | 486 | struct net_device *slave_dev = slave->dev; |
487 | const struct net_device_ops *slave_ops = slave_dev->netdev_ops; | ||
486 | 488 | ||
487 | if ((slave_dev->features & NETIF_F_HW_VLAN_FILTER) && | 489 | if ((slave_dev->features & NETIF_F_HW_VLAN_FILTER) && |
488 | slave_dev->vlan_rx_add_vid) { | 490 | slave_ops->ndo_vlan_rx_add_vid) { |
489 | slave_dev->vlan_rx_add_vid(slave_dev, vid); | 491 | slave_ops->ndo_vlan_rx_add_vid(slave_dev, vid); |
490 | } | 492 | } |
491 | } | 493 | } |
492 | 494 | ||
@@ -512,14 +514,15 @@ static void bond_vlan_rx_kill_vid(struct net_device *bond_dev, uint16_t vid) | |||
512 | 514 | ||
513 | bond_for_each_slave(bond, slave, i) { | 515 | bond_for_each_slave(bond, slave, i) { |
514 | struct net_device *slave_dev = slave->dev; | 516 | struct net_device *slave_dev = slave->dev; |
517 | const struct net_device_ops *slave_ops = slave_dev->netdev_ops; | ||
515 | 518 | ||
516 | if ((slave_dev->features & NETIF_F_HW_VLAN_FILTER) && | 519 | if ((slave_dev->features & NETIF_F_HW_VLAN_FILTER) && |
517 | slave_dev->vlan_rx_kill_vid) { | 520 | slave_ops->ndo_vlan_rx_kill_vid) { |
518 | /* Save and then restore vlan_dev in the grp array, | 521 | /* Save and then restore vlan_dev in the grp array, |
519 | * since the slave's driver might clear it. | 522 | * since the slave's driver might clear it. |
520 | */ | 523 | */ |
521 | vlan_dev = vlan_group_get_device(bond->vlgrp, vid); | 524 | vlan_dev = vlan_group_get_device(bond->vlgrp, vid); |
522 | slave_dev->vlan_rx_kill_vid(slave_dev, vid); | 525 | slave_ops->ndo_vlan_rx_kill_vid(slave_dev, vid); |
523 | vlan_group_set_device(bond->vlgrp, vid, vlan_dev); | 526 | vlan_group_set_device(bond->vlgrp, vid, vlan_dev); |
524 | } | 527 | } |
525 | } | 528 | } |
@@ -535,26 +538,23 @@ static void bond_vlan_rx_kill_vid(struct net_device *bond_dev, uint16_t vid) | |||
535 | static void bond_add_vlans_on_slave(struct bonding *bond, struct net_device *slave_dev) | 538 | static void bond_add_vlans_on_slave(struct bonding *bond, struct net_device *slave_dev) |
536 | { | 539 | { |
537 | struct vlan_entry *vlan; | 540 | struct vlan_entry *vlan; |
541 | const struct net_device_ops *slave_ops = slave_dev->netdev_ops; | ||
538 | 542 | ||
539 | write_lock_bh(&bond->lock); | 543 | write_lock_bh(&bond->lock); |
540 | 544 | ||
541 | if (list_empty(&bond->vlan_list)) { | 545 | if (list_empty(&bond->vlan_list)) |
542 | goto out; | 546 | goto out; |
543 | } | ||
544 | 547 | ||
545 | if ((slave_dev->features & NETIF_F_HW_VLAN_RX) && | 548 | if ((slave_dev->features & NETIF_F_HW_VLAN_RX) && |
546 | slave_dev->vlan_rx_register) { | 549 | slave_ops->ndo_vlan_rx_register) |
547 | slave_dev->vlan_rx_register(slave_dev, bond->vlgrp); | 550 | slave_ops->ndo_vlan_rx_register(slave_dev, bond->vlgrp); |
548 | } | ||
549 | 551 | ||
550 | if (!(slave_dev->features & NETIF_F_HW_VLAN_FILTER) || | 552 | if (!(slave_dev->features & NETIF_F_HW_VLAN_FILTER) || |
551 | !(slave_dev->vlan_rx_add_vid)) { | 553 | !(slave_ops->ndo_vlan_rx_add_vid)) |
552 | goto out; | 554 | goto out; |
553 | } | ||
554 | 555 | ||
555 | list_for_each_entry(vlan, &bond->vlan_list, vlan_list) { | 556 | list_for_each_entry(vlan, &bond->vlan_list, vlan_list) |
556 | slave_dev->vlan_rx_add_vid(slave_dev, vlan->vlan_id); | 557 | slave_ops->ndo_vlan_rx_add_vid(slave_dev, vlan->vlan_id); |
557 | } | ||
558 | 558 | ||
559 | out: | 559 | out: |
560 | write_unlock_bh(&bond->lock); | 560 | write_unlock_bh(&bond->lock); |
@@ -562,34 +562,32 @@ out: | |||
562 | 562 | ||
563 | static void bond_del_vlans_from_slave(struct bonding *bond, struct net_device *slave_dev) | 563 | static void bond_del_vlans_from_slave(struct bonding *bond, struct net_device *slave_dev) |
564 | { | 564 | { |
565 | const struct net_device_ops *slave_ops = slave_dev->netdev_ops; | ||
565 | struct vlan_entry *vlan; | 566 | struct vlan_entry *vlan; |
566 | struct net_device *vlan_dev; | 567 | struct net_device *vlan_dev; |
567 | 568 | ||
568 | write_lock_bh(&bond->lock); | 569 | write_lock_bh(&bond->lock); |
569 | 570 | ||
570 | if (list_empty(&bond->vlan_list)) { | 571 | if (list_empty(&bond->vlan_list)) |
571 | goto out; | 572 | goto out; |
572 | } | ||
573 | 573 | ||
574 | if (!(slave_dev->features & NETIF_F_HW_VLAN_FILTER) || | 574 | if (!(slave_dev->features & NETIF_F_HW_VLAN_FILTER) || |
575 | !(slave_dev->vlan_rx_kill_vid)) { | 575 | !(slave_ops->ndo_vlan_rx_kill_vid)) |
576 | goto unreg; | 576 | goto unreg; |
577 | } | ||
578 | 577 | ||
579 | list_for_each_entry(vlan, &bond->vlan_list, vlan_list) { | 578 | list_for_each_entry(vlan, &bond->vlan_list, vlan_list) { |
580 | /* Save and then restore vlan_dev in the grp array, | 579 | /* Save and then restore vlan_dev in the grp array, |
581 | * since the slave's driver might clear it. | 580 | * since the slave's driver might clear it. |
582 | */ | 581 | */ |
583 | vlan_dev = vlan_group_get_device(bond->vlgrp, vlan->vlan_id); | 582 | vlan_dev = vlan_group_get_device(bond->vlgrp, vlan->vlan_id); |
584 | slave_dev->vlan_rx_kill_vid(slave_dev, vlan->vlan_id); | 583 | slave_ops->ndo_vlan_rx_kill_vid(slave_dev, vlan->vlan_id); |
585 | vlan_group_set_device(bond->vlgrp, vlan->vlan_id, vlan_dev); | 584 | vlan_group_set_device(bond->vlgrp, vlan->vlan_id, vlan_dev); |
586 | } | 585 | } |
587 | 586 | ||
588 | unreg: | 587 | unreg: |
589 | if ((slave_dev->features & NETIF_F_HW_VLAN_RX) && | 588 | if ((slave_dev->features & NETIF_F_HW_VLAN_RX) && |
590 | slave_dev->vlan_rx_register) { | 589 | slave_ops->ndo_vlan_rx_register) |
591 | slave_dev->vlan_rx_register(slave_dev, NULL); | 590 | slave_ops->ndo_vlan_rx_register(slave_dev, NULL); |
592 | } | ||
593 | 591 | ||
594 | out: | 592 | out: |
595 | write_unlock_bh(&bond->lock); | 593 | write_unlock_bh(&bond->lock); |
@@ -698,15 +696,15 @@ static int bond_update_speed_duplex(struct slave *slave) | |||
698 | */ | 696 | */ |
699 | static int bond_check_dev_link(struct bonding *bond, struct net_device *slave_dev, int reporting) | 697 | static int bond_check_dev_link(struct bonding *bond, struct net_device *slave_dev, int reporting) |
700 | { | 698 | { |
699 | const struct net_device_ops *slave_ops = slave_dev->netdev_ops; | ||
701 | static int (* ioctl)(struct net_device *, struct ifreq *, int); | 700 | static int (* ioctl)(struct net_device *, struct ifreq *, int); |
702 | struct ifreq ifr; | 701 | struct ifreq ifr; |
703 | struct mii_ioctl_data *mii; | 702 | struct mii_ioctl_data *mii; |
704 | 703 | ||
705 | if (bond->params.use_carrier) { | 704 | if (bond->params.use_carrier) |
706 | return netif_carrier_ok(slave_dev) ? BMSR_LSTATUS : 0; | 705 | return netif_carrier_ok(slave_dev) ? BMSR_LSTATUS : 0; |
707 | } | ||
708 | 706 | ||
709 | ioctl = slave_dev->do_ioctl; | 707 | ioctl = slave_ops->ndo_do_ioctl; |
710 | if (ioctl) { | 708 | if (ioctl) { |
711 | /* TODO: set pointer to correct ioctl on a per team member */ | 709 | /* TODO: set pointer to correct ioctl on a per team member */ |
712 | /* bases to make this more efficient. that is, once */ | 710 | /* bases to make this more efficient. that is, once */ |
@@ -1401,6 +1399,7 @@ static void bond_setup_by_slave(struct net_device *bond_dev, | |||
1401 | int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) | 1399 | int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) |
1402 | { | 1400 | { |
1403 | struct bonding *bond = netdev_priv(bond_dev); | 1401 | struct bonding *bond = netdev_priv(bond_dev); |
1402 | const struct net_device_ops *slave_ops = slave_dev->netdev_ops; | ||
1404 | struct slave *new_slave = NULL; | 1403 | struct slave *new_slave = NULL; |
1405 | struct dev_mc_list *dmi; | 1404 | struct dev_mc_list *dmi; |
1406 | struct sockaddr addr; | 1405 | struct sockaddr addr; |
@@ -1409,7 +1408,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) | |||
1409 | int res = 0; | 1408 | int res = 0; |
1410 | 1409 | ||
1411 | if (!bond->params.use_carrier && slave_dev->ethtool_ops == NULL && | 1410 | if (!bond->params.use_carrier && slave_dev->ethtool_ops == NULL && |
1412 | slave_dev->do_ioctl == NULL) { | 1411 | slave_ops->ndo_do_ioctl == NULL) { |
1413 | printk(KERN_WARNING DRV_NAME | 1412 | printk(KERN_WARNING DRV_NAME |
1414 | ": %s: Warning: no link monitoring support for %s\n", | 1413 | ": %s: Warning: no link monitoring support for %s\n", |
1415 | bond_dev->name, slave_dev->name); | 1414 | bond_dev->name, slave_dev->name); |
@@ -1491,7 +1490,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) | |||
1491 | goto err_undo_flags; | 1490 | goto err_undo_flags; |
1492 | } | 1491 | } |
1493 | 1492 | ||
1494 | if (slave_dev->set_mac_address == NULL) { | 1493 | if (slave_ops->ndo_set_mac_address == NULL) { |
1495 | if (bond->slave_cnt == 0) { | 1494 | if (bond->slave_cnt == 0) { |
1496 | printk(KERN_WARNING DRV_NAME | 1495 | printk(KERN_WARNING DRV_NAME |
1497 | ": %s: Warning: The first slave device " | 1496 | ": %s: Warning: The first slave device " |
@@ -4208,6 +4207,10 @@ static int bond_set_mac_address(struct net_device *bond_dev, void *addr) | |||
4208 | int res = 0; | 4207 | int res = 0; |
4209 | int i; | 4208 | int i; |
4210 | 4209 | ||
4210 | if (bond->params.mode == BOND_MODE_ALB) | ||
4211 | return bond_alb_set_mac_address(bond_dev, addr); | ||
4212 | |||
4213 | |||
4211 | dprintk("bond=%p, name=%s\n", bond, (bond_dev ? bond_dev->name : "None")); | 4214 | dprintk("bond=%p, name=%s\n", bond, (bond_dev ? bond_dev->name : "None")); |
4212 | 4215 | ||
4213 | /* | 4216 | /* |
@@ -4237,9 +4240,10 @@ static int bond_set_mac_address(struct net_device *bond_dev, void *addr) | |||
4237 | */ | 4240 | */ |
4238 | 4241 | ||
4239 | bond_for_each_slave(bond, slave, i) { | 4242 | bond_for_each_slave(bond, slave, i) { |
4243 | const struct net_device_ops *slave_ops = slave->dev->netdev_ops; | ||
4240 | dprintk("slave %p %s\n", slave, slave->dev->name); | 4244 | dprintk("slave %p %s\n", slave, slave->dev->name); |
4241 | 4245 | ||
4242 | if (slave->dev->set_mac_address == NULL) { | 4246 | if (slave_ops->ndo_set_mac_address == NULL) { |
4243 | res = -EOPNOTSUPP; | 4247 | res = -EOPNOTSUPP; |
4244 | dprintk("EOPNOTSUPP %s\n", slave->dev->name); | 4248 | dprintk("EOPNOTSUPP %s\n", slave->dev->name); |
4245 | goto unwind; | 4249 | goto unwind; |
@@ -4517,7 +4521,6 @@ void bond_set_mode_ops(struct bonding *bond, int mode) | |||
4517 | /* FALLTHRU */ | 4521 | /* FALLTHRU */ |
4518 | case BOND_MODE_TLB: | 4522 | case BOND_MODE_TLB: |
4519 | bond_dev->hard_start_xmit = bond_alb_xmit; | 4523 | bond_dev->hard_start_xmit = bond_alb_xmit; |
4520 | bond_dev->set_mac_address = bond_alb_set_mac_address; | ||
4521 | break; | 4524 | break; |
4522 | default: | 4525 | default: |
4523 | /* Should never happen, mode already checked */ | 4526 | /* Should never happen, mode already checked */ |
@@ -4547,6 +4550,20 @@ static const struct ethtool_ops bond_ethtool_ops = { | |||
4547 | .get_flags = ethtool_op_get_flags, | 4550 | .get_flags = ethtool_op_get_flags, |
4548 | }; | 4551 | }; |
4549 | 4552 | ||
4553 | static const struct net_device_ops bond_netdev_ops = { | ||
4554 | .ndo_open = bond_open, | ||
4555 | .ndo_stop = bond_close, | ||
4556 | .ndo_get_stats = bond_get_stats, | ||
4557 | .ndo_do_ioctl = bond_do_ioctl, | ||
4558 | .ndo_set_multicast_list = bond_set_multicast_list, | ||
4559 | .ndo_change_mtu = bond_change_mtu, | ||
4560 | .ndo_validate_addr = NULL, | ||
4561 | .ndo_set_mac_address = bond_set_mac_address, | ||
4562 | .ndo_vlan_rx_register = bond_vlan_rx_register, | ||
4563 | .ndo_vlan_rx_add_vid = bond_vlan_rx_add_vid, | ||
4564 | .ndo_vlan_rx_kill_vid = bond_vlan_rx_kill_vid, | ||
4565 | }; | ||
4566 | |||
4550 | /* | 4567 | /* |
4551 | * Does not allocate but creates a /proc entry. | 4568 | * Does not allocate but creates a /proc entry. |
4552 | * Allowed to fail. | 4569 | * Allowed to fail. |
@@ -4579,16 +4596,8 @@ static int bond_init(struct net_device *bond_dev, struct bond_params *params) | |||
4579 | INIT_LIST_HEAD(&bond->vlan_list); | 4596 | INIT_LIST_HEAD(&bond->vlan_list); |
4580 | 4597 | ||
4581 | /* Initialize the device entry points */ | 4598 | /* Initialize the device entry points */ |
4582 | bond_dev->open = bond_open; | 4599 | bond_dev->netdev_ops = &bond_netdev_ops; |
4583 | bond_dev->stop = bond_close; | ||
4584 | bond_dev->get_stats = bond_get_stats; | ||
4585 | bond_dev->do_ioctl = bond_do_ioctl; | ||
4586 | bond_dev->ethtool_ops = &bond_ethtool_ops; | 4600 | bond_dev->ethtool_ops = &bond_ethtool_ops; |
4587 | bond_dev->set_multicast_list = bond_set_multicast_list; | ||
4588 | bond_dev->change_mtu = bond_change_mtu; | ||
4589 | bond_dev->set_mac_address = bond_set_mac_address; | ||
4590 | bond_dev->validate_addr = NULL; | ||
4591 | |||
4592 | bond_set_mode_ops(bond, bond->params.mode); | 4601 | bond_set_mode_ops(bond, bond->params.mode); |
4593 | 4602 | ||
4594 | bond_dev->destructor = bond_destructor; | 4603 | bond_dev->destructor = bond_destructor; |
@@ -4617,9 +4626,6 @@ static int bond_init(struct net_device *bond_dev, struct bond_params *params) | |||
4617 | * when there are slaves that are not hw accel | 4626 | * when there are slaves that are not hw accel |
4618 | * capable | 4627 | * capable |
4619 | */ | 4628 | */ |
4620 | bond_dev->vlan_rx_register = bond_vlan_rx_register; | ||
4621 | bond_dev->vlan_rx_add_vid = bond_vlan_rx_add_vid; | ||
4622 | bond_dev->vlan_rx_kill_vid = bond_vlan_rx_kill_vid; | ||
4623 | bond_dev->features |= (NETIF_F_HW_VLAN_TX | | 4629 | bond_dev->features |= (NETIF_F_HW_VLAN_TX | |
4624 | NETIF_F_HW_VLAN_RX | | 4630 | NETIF_F_HW_VLAN_RX | |
4625 | NETIF_F_HW_VLAN_FILTER); | 4631 | NETIF_F_HW_VLAN_FILTER); |
diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c index fc490d89d4af..f6475ce347df 100644 --- a/drivers/net/bonding/bond_sysfs.c +++ b/drivers/net/bonding/bond_sysfs.c | |||
@@ -317,18 +317,12 @@ static ssize_t bonding_store_slaves(struct device *d, | |||
317 | 317 | ||
318 | /* Set the slave's MTU to match the bond */ | 318 | /* Set the slave's MTU to match the bond */ |
319 | original_mtu = dev->mtu; | 319 | original_mtu = dev->mtu; |
320 | if (dev->mtu != bond->dev->mtu) { | 320 | res = dev_set_mtu(dev, bond->dev->mtu); |
321 | if (dev->change_mtu) { | 321 | if (res) { |
322 | res = dev->change_mtu(dev, | 322 | ret = res; |
323 | bond->dev->mtu); | 323 | goto out; |
324 | if (res) { | ||
325 | ret = res; | ||
326 | goto out; | ||
327 | } | ||
328 | } else { | ||
329 | dev->mtu = bond->dev->mtu; | ||
330 | } | ||
331 | } | 324 | } |
325 | |||
332 | res = bond_enslave(bond->dev, dev); | 326 | res = bond_enslave(bond->dev, dev); |
333 | bond_for_each_slave(bond, slave, i) | 327 | bond_for_each_slave(bond, slave, i) |
334 | if (strnicmp(slave->dev->name, ifname, IFNAMSIZ) == 0) | 328 | if (strnicmp(slave->dev->name, ifname, IFNAMSIZ) == 0) |
@@ -357,11 +351,7 @@ static ssize_t bonding_store_slaves(struct device *d, | |||
357 | goto out; | 351 | goto out; |
358 | } | 352 | } |
359 | /* set the slave MTU to the default */ | 353 | /* set the slave MTU to the default */ |
360 | if (dev->change_mtu) { | 354 | dev_set_mtu(dev, original_mtu); |
361 | dev->change_mtu(dev, original_mtu); | ||
362 | } else { | ||
363 | dev->mtu = original_mtu; | ||
364 | } | ||
365 | } | 355 | } |
366 | else { | 356 | else { |
367 | printk(KERN_ERR DRV_NAME ": unable to remove non-existent slave %s for bond %s.\n", | 357 | printk(KERN_ERR DRV_NAME ": unable to remove non-existent slave %s for bond %s.\n", |