--- zzzz-none-000/linux-4.9.279/drivers/net/bonding/bond_main.c 2021-08-08 06:38:54.000000000 +0000 +++ puma7-arm-6591-750/linux-4.9.279/drivers/net/bonding/bond_main.c 2023-02-08 10:58:13.000000000 +0000 @@ -31,6 +31,11 @@ * */ +/* + * Includes Intel Corporation's changes/modifications dated: 2017, 2018. + * Changed/modified portions - Copyright (c) 2017-2018, Intel Corporation. + */ + #include #include #include @@ -381,6 +386,13 @@ struct ethtool_link_ksettings ecmd; int res; + if (slave->man_link != -1) + { + slave->speed = slave->man_speed; + slave->duplex = slave->man_duplex; + return 0; + } + slave->speed = SPEED_UNKNOWN; slave->duplex = DUPLEX_UNKNOWN; @@ -1481,6 +1493,26 @@ res = -ENOMEM; goto err_undo_flags; } + + /* Create manual link params override sysfs */ + new_slave->man_speed = SPEED_UNKNOWN; + new_slave->man_duplex = DUPLEX_UNKNOWN; + new_slave->man_link = -1; /* no define for unk */ + + sysfs_attr_init(&new_slave->man_linkprop.attr); + new_slave->man_linkprop.attr.name = kzalloc(strlen(slave_dev->name) + sizeof("_man_linkprop") + 1, GFP_KERNEL); + sprintf((char *)new_slave->man_linkprop.attr.name, "%s_man_linkprop", slave_dev->name); + + new_slave->man_linkprop.attr.mode = 0644; + new_slave->man_linkprop.show = bonding_show_man_linkprop; + new_slave->man_linkprop.store = bonding_store_man_linkprop; + + res = sysfs_add_file_to_group(&bond_dev->dev.kobj, &new_slave->man_linkprop.attr, bond_dev->sysfs_groups[0]->name); + if (res) + { + pr_debug("Error %d calling sysfs_add_file_to_group\n", res); + goto err_free; + } /* Set the new_slave's queue_id to be zero. Queue ID mapping * is set via sysfs or module option if desired. @@ -1806,6 +1838,8 @@ dev_set_mtu(slave_dev, new_slave->original_mtu); err_free: + if (new_slave->man_linkprop.attr.name) + kfree(new_slave->man_linkprop.attr.name); kobject_put(&new_slave->kobj); err_undo_flags: @@ -1990,6 +2024,9 @@ if (!netif_is_bond_master(slave_dev)) slave_dev->priv_flags &= ~IFF_BONDING; + /* remove slave attribute from sysfs sysfs */ + sysfs_remove_file_from_group(&bond_dev->dev.kobj, &slave->man_linkprop.attr, bond_dev->sysfs_groups[0]->name); + kfree(slave->man_linkprop.attr.name); kobject_put(&slave->kobj); return 0; @@ -2062,7 +2099,13 @@ bond_for_each_slave_rcu(bond, slave, iter) { slave->new_link = BOND_LINK_NOCHANGE; - link_state = bond_check_dev_link(bond, slave->dev, 0); + /* override, upcasting */ + if (slave->man_link != -1) { + link_state = slave->man_link ? BMSR_LSTATUS : 0; + } + else { + link_state = bond_check_dev_link(bond, slave->dev, 0); + } switch (slave->link) { case BOND_LINK_UP: @@ -3064,7 +3107,7 @@ return NOTIFY_DONE; } -static int bond_slave_netdev_event(unsigned long event, +int bond_slave_netdev_event(unsigned long event, struct net_device *slave_dev) { struct slave *slave = bond_slave_get_rtnl(slave_dev), *primary;