From patchwork Thu Jan 6 00:17:10 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Mortimer X-Patchwork-Id: 77651 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 5F3B8B7141 for ; Thu, 6 Jan 2011 11:27:43 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752837Ab1AFA1l (ORCPT ); Wed, 5 Jan 2011 19:27:41 -0500 Received: from racecourse.oldelvet.net ([93.93.128.81]:46485 "EHLO racecourse.oldelvet.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751388Ab1AFA1k (ORCPT ); Wed, 5 Jan 2011 19:27:40 -0500 X-Greylist: delayed 627 seconds by postgrey-1.27 at vger.kernel.org; Wed, 05 Jan 2011 19:27:39 EST Received: from localhost (localhost [127.0.0.1]) by racecourse.oldelvet.net (Postfix) with ESMTP id 7FB0D210412; Thu, 6 Jan 2011 00:17:11 +0000 (GMT) X-Virus-Scanned: Debian amavisd-new at mx.oldelvet.net Received: from racecourse.oldelvet.net ([127.0.0.1]) by localhost (racecourse.oldelvet.net [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Dq8XJsXcO-sB; Thu, 6 Jan 2011 00:17:11 +0000 (GMT) Received: from royalcounty.home.oldelvet.org.uk (bridge.oldelvet.org.uk [194.106.37.22]) by racecourse.oldelvet.net (Postfix) with ESMTPSA id 54F1B210221; Thu, 6 Jan 2011 00:17:11 +0000 (GMT) Received: from [192.168.2.159] by royalcounty.home.oldelvet.org.uk with esmtpsa (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1PadXS-0006dm-SM; Thu, 06 Jan 2011 00:17:10 +0000 Subject: [PATCH] cassini: Use local-mac-address prom property for Cassini MAC address From: Richard Mortimer To: sparclinux , David Miller Cc: Frans van Berckel Date: Thu, 06 Jan 2011 00:17:10 +0000 Message-ID: <1294273030.6193.31.camel@duncow> Mime-Version: 1.0 X-Mailer: Evolution 2.30.3 Sender: sparclinux-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: sparclinux@vger.kernel.org Fallback on the local-mac-address prom property if the Cassini device does not have an address programmed in the VPD ROM. This uses the same technique as implemented by the sungem driver. The problem was reported by Frans van Berckel using Debian kernel 2.6.34-7 on Sun Fire V440. udev was assigning a new eth device name on each reboot because the cassini driver was using a random MAC address. Fix tested on 2.6.34-7/Sun Fire V440. Compile tested only against 2.6.36 davem/sparc-2.6.git because Sun Fire V440 does not currently boot recent kernels so runtime test is not possible at present. Reported-by: Frans van Berckel Tested-by: Frans van Berckel Signed-off-by: Richard Mortimer --- drivers/net/cassini.c | 20 ++++++++++++++++++++ drivers/net/cassini.h | 3 +++ 2 files changed, 23 insertions(+), 0 deletions(-) diff --git a/drivers/net/cassini.c b/drivers/net/cassini.c index d6b6d6a..4541e3f 100644 --- a/drivers/net/cassini.c +++ b/drivers/net/cassini.c @@ -82,6 +82,10 @@ #include #include #include +#if defined(CONFIG_SPARC) +#include +#include +#endif #include #include @@ -3203,6 +3207,10 @@ static int cas_get_vpd_info(struct cas *cp, unsigned char *dev_addr, int phy_type = CAS_PHY_MII_MDIO0; /* default phy type */ int mac_off = 0; +#if defined(CONFIG_SPARC) + const unsigned char *addr; +#endif + /* give us access to the PROM */ writel(BIM_LOCAL_DEV_PROM | BIM_LOCAL_DEV_PAD, cp->regs + REG_BIM_LOCAL_DEV_EN); @@ -3350,6 +3358,14 @@ use_random_mac_addr: if (found & VPD_FOUND_MAC) goto done; +#if defined(CONFIG_SPARC) + addr = of_get_property(cp->of_node, "local-mac-address", NULL); + if (addr != NULL) { + memcpy(dev_addr, addr, 6); + goto done; + } +#endif + /* Sun MAC prefix then 3 random bytes. */ pr_info("MAC address not found in ROM VPD\n"); dev_addr[0] = 0x08; @@ -5019,6 +5035,10 @@ static int __devinit cas_init_one(struct pci_dev *pdev, cp->msg_enable = (cassini_debug < 0) ? CAS_DEF_MSG_ENABLE : cassini_debug; +#if defined(CONFIG_SPARC) + cp->of_node = pci_device_to_OF_node(pdev); +#endif + cp->link_transition = LINK_TRANSITION_UNKNOWN; cp->link_transition_jiffies_valid = 0; diff --git a/drivers/net/cassini.h b/drivers/net/cassini.h index dbc4787..34d46fa 100644 --- a/drivers/net/cassini.h +++ b/drivers/net/cassini.h @@ -2868,6 +2868,9 @@ struct cas { dma_addr_t block_dvma, tx_tiny_dvma[N_TX_RINGS]; struct pci_dev *pdev; struct net_device *dev; +#if defined(CONFIG_SPARC) + struct device_node *of_node; +#endif /* Firmware Info */ u16 fw_load_addr;