From: Chris Wright Date: Wed, 21 Sep 2005 06:55:19 +0000 (-0700) Subject: Add skge oops fix from shemminger X-Git-Tag: v2.6.13.3~6 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9efb7dc1f4131ac77459226abc7cf11f80880666;p=thirdparty%2Fkernel%2Fstable-queue.git Add skge oops fix from shemminger --- diff --git a/queue/series b/queue/series index 0afc3a697ea..baa49f8f73d 100644 --- a/queue/series +++ b/queue/series @@ -5,3 +5,4 @@ ipvs-ip_vs_ftp-breaks-connections.patch missing-acct-mm-calls-in-compat_do_execve.patch uml-fix-x86_64-page-leak.patch check-connect-status-for-IPv6-UDP-socket.patch +skge-set-mac-address-oops-with-bonding.patch diff --git a/queue/skge-set-mac-address-oops-with-bonding.patch b/queue/skge-set-mac-address-oops-with-bonding.patch new file mode 100644 index 00000000000..265693ab298 --- /dev/null +++ b/queue/skge-set-mac-address-oops-with-bonding.patch @@ -0,0 +1,63 @@ +From stable-bounces@linux.kernel.org Tue Sep 20 09:59:26 2005 +Date: Tue, 20 Sep 2005 09:59:25 -0700 +From: Stephen Hemminger +To: Krzysztof Oledzki , Chris Wright +Cc: stable@kernel.org +Subject: [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 +Sigend-off-by: Chris Wright +--- + drivers/net/skge.c | 24 ++++++++++++++++-------- + 1 files changed, 16 insertions(+), 8 deletions(-) + +Index: linux-2.6.13.y/drivers/net/skge.c +=================================================================== +--- linux-2.6.13.y.orig/drivers/net/skge.c ++++ linux-2.6.13.y/drivers/net/skge.c +@@ -2828,21 +2828,29 @@ static void skge_netpoll(struct net_devi + 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 {