• Jarod Wilson's avatar
    net/qlcnic: fix mac address restore in bond mode 5/6 · e824de8a
    Jarod Wilson authored
    The bonding driver saves a copy of slaves' original mac address and then
    assigns whatever mac as needed to the slave, depending on mode. In at
    least modes 5 and 6 (balance-tlb, balance-alb), it often ends up being the
    mac address of another slave. On release from the bond, the original mac
    address is supposed to get restored via a dev_set_mac_address() call in
    the bonding driver's __bond_release_one() function, which calls the
    slave's ndo_set_mac_address function, which for qlcnic, is
    qlcnic_set_mac().
    
    Now, this function tries to be somewhat intelligent and exit early if
    you're trying to set the mac address to the same thing that is already
    set. The problem here is that adapter->mac_addr isn't in sync with
    netdev->dev_addr. The qlcnic driver still has the original mac stored in
    adapter->mac_addr, while the bonding driver has updated netdev->dev_addr,
    so qlcnic thinks we're trying to set the same address it already has.
    
    I think the way to go here, since the function updates both netdev and
    adapter's stored mac addresses, is to check if either of them doesn't
    match the newly requested mac. Simply checking netdev's value only could
    result in a similar mismatch and non-update, so look at both.
    
    CC: Dept-GELinuxNICDev@qlogic.com
    CC: netdev@vger.kernel.org
    CC: Manish Chopra <manish.chopra@qlogic.com>
    Signed-off-by: default avatarJarod Wilson <jarod@redhat.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    e824de8a
qlcnic_main.c 111 KB