Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S964797AbVI3CZh (ORCPT ); Thu, 29 Sep 2005 22:25:37 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S932541AbVI3CZD (ORCPT ); Thu, 29 Sep 2005 22:25:03 -0400 Received: from smtp.osdl.org ([65.172.181.4]:12202 "EHLO smtp.osdl.org") by vger.kernel.org with ESMTP id S932419AbVI3CXg (ORCPT ); Thu, 29 Sep 2005 22:23:36 -0400 Message-Id: <20050930022242.010635000@localhost.localdomain> References: <20050930022016.640197000@localhost.localdomain> Date: Thu, 29 Sep 2005 19:20:24 -0700 From: Chris Wright To: linux-kernel@vger.kernel.org, stable@kernel.org, Krzysztof Oledzki , Chris Wright Cc: Justin Forbes , Zwane Mwaikambo , "Theodore Ts'o" , Randy Dunlap , Chuck Wolber , torvalds@osdl.org, akpm@osdl.org, alan@lxorguk.ukuu.org.uk, Stephen Hemminger Subject: [PATCH 08/10] [PATCH] skge: set mac address oops with bonding Content-Disposition: inline; filename=skge-set-mac-address-oops-with-bonding.patch Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2151 Lines: 66 -stable review patch. If anyone has any objections, please let us know. ------------------ 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 { -- - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/