diff options
author | Stephen Hemminger <shemminger@osdl.org> | 2005-09-20 09:59:25 -0700 |
---|---|---|
committer | Chris Wright <chrisw@osdl.org> | 2005-10-03 16:27:18 -0700 |
commit | 7d9e68d3ec0b72a77c6ce6a272f83844fa4f8e3e (patch) | |
tree | 13ecb93fd874960e4e2375088aec50e39897d88f /drivers | |
parent | 38e00d341514cce58a4514904fc6562d586ec4dc (diff) |
[PATCH] skge: set mac address oops with bonding
Here is the patch (fuzz removed) for 2.6.13.2 that fixes
OOPs when using bonding with skge.
Skge driver was bringing link up/down when changing mac
address. This doesn't work in the bonding environment, and is
more effort than needed.
Fixes-bug: http://bugzilla.kernel.org/show_bug.cgi?id=5271
Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
Sigend-off-by: Chris Wright <chrisw@osdl.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/skge.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/drivers/net/skge.c b/drivers/net/skge.c index f15739481d6..e37e3049293 100644 --- a/drivers/net/skge.c +++ b/drivers/net/skge.c @@ -2828,21 +2828,29 @@ static void skge_netpoll(struct net_device *dev) static int skge_set_mac_address(struct net_device *dev, void *p) { struct skge_port *skge = netdev_priv(dev); - struct sockaddr *addr = p; - int err = 0; + struct skge_hw *hw = skge->hw; + unsigned port = skge->port; + const struct sockaddr *addr = p; if (!is_valid_ether_addr(addr->sa_data)) return -EADDRNOTAVAIL; - skge_down(dev); + spin_lock_bh(&hw->phy_lock); memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); - memcpy_toio(skge->hw->regs + B2_MAC_1 + skge->port*8, + memcpy_toio(hw->regs + B2_MAC_1 + port*8, dev->dev_addr, ETH_ALEN); - memcpy_toio(skge->hw->regs + B2_MAC_2 + skge->port*8, + memcpy_toio(hw->regs + B2_MAC_2 + port*8, dev->dev_addr, ETH_ALEN); - if (dev->flags & IFF_UP) - err = skge_up(dev); - return err; + + if (hw->chip_id == CHIP_ID_GENESIS) + xm_outaddr(hw, port, XM_SA, dev->dev_addr); + else { + gma_set_addr(hw, port, GM_SRC_ADDR_1L, dev->dev_addr); + gma_set_addr(hw, port, GM_SRC_ADDR_2L, dev->dev_addr); + } + spin_unlock_bh(&hw->phy_lock); + + return 0; } static const struct { |