]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Add skge oops fix from shemminger
authorChris Wright <chrisw@osdl.org>
Wed, 21 Sep 2005 06:55:19 +0000 (23:55 -0700)
committerChris Wright <chrisw@osdl.org>
Wed, 21 Sep 2005 06:55:19 +0000 (23:55 -0700)
queue/series
queue/skge-set-mac-address-oops-with-bonding.patch [new file with mode: 0644]

index 0afc3a697ea8cb50334dca0ad1629e267170dc48..baa49f8f73de1e9eca718a2eb06e2f00f6380111 100644 (file)
@@ -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 (file)
index 0000000..265693a
--- /dev/null
@@ -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 <shemminger@osdl.org>
+To: Krzysztof Oledzki <olel@ans.pl>, Chris Wright <chrisw@osdl.org>
+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 <shemminger@osdl.org>
+Sigend-off-by: Chris Wright <chrisw@osdl.org>
+---
+ 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 {