From patchwork Tue Jul 14 13:42:46 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wolfgang Denk X-Patchwork-Id: 29768 Return-Path: X-Original-To: patchwork-incoming@bilbo.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from ozlabs.org (ozlabs.org [203.10.76.45]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "mx.ozlabs.org", Issuer "CA Cert Signing Authority" (verified OK)) by bilbo.ozlabs.org (Postfix) with ESMTPS id 7C255B7089 for ; Tue, 14 Jul 2009 23:43:29 +1000 (EST) Received: by ozlabs.org (Postfix) id 722CFDDDA0; Tue, 14 Jul 2009 23:43:29 +1000 (EST) Delivered-To: patchwork-incoming@ozlabs.org Received: from bilbo.ozlabs.org (bilbo.ozlabs.org [203.10.76.25]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "bilbo.ozlabs.org", Issuer "CAcert Class 3 Root" (verified OK)) by ozlabs.org (Postfix) with ESMTPS id 6F8BBDDD1B for ; Tue, 14 Jul 2009 23:43:29 +1000 (EST) Received: from bilbo.ozlabs.org (localhost [127.0.0.1]) by bilbo.ozlabs.org (Postfix) with ESMTP id 08A4EB7DFE for ; Tue, 14 Jul 2009 23:43:01 +1000 (EST) Received: from ozlabs.org (ozlabs.org [203.10.76.45]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "mx.ozlabs.org", Issuer "CA Cert Signing Authority" (verified OK)) by bilbo.ozlabs.org (Postfix) with ESMTPS id BE91FB7089 for ; Tue, 14 Jul 2009 23:42:53 +1000 (EST) Received: by ozlabs.org (Postfix) id B0986DDDA0; Tue, 14 Jul 2009 23:42:53 +1000 (EST) Delivered-To: linuxppc-dev@ozlabs.org Received: from mail-out.m-online.net (mail-out.m-online.net [212.18.0.9]) by ozlabs.org (Postfix) with ESMTP id 0DE82DDD1B for ; Tue, 14 Jul 2009 23:42:51 +1000 (EST) Received: from mail01.m-online.net (mail.m-online.net [192.168.3.149]) by mail-out.m-online.net (Postfix) with ESMTP id BE5021C15591; Tue, 14 Jul 2009 15:42:47 +0200 (CEST) Received: from localhost (dynscan2.mnet-online.de [192.168.1.215]) by mail.m-online.net (Postfix) with ESMTP id D4CF4901F5; Tue, 14 Jul 2009 15:42:47 +0200 (CEST) X-Virus-Scanned: amavisd-new at mnet-online.de Received: from smtp-auth.mnet-online.de ([192.168.3.149]) by localhost (dynscan2.mnet-online.de [192.168.1.215]) (amavisd-new, port 10024) with ESMTP id khwM6d6WKuke; Tue, 14 Jul 2009 15:42:46 +0200 (CEST) X-Auth-Info: oKw0ZDdFULOj+K/luMcIwh+N2Jo4k3C5agA3pn0wWfo= Received: from diddl.denx.de (ppp-88-217-54-40.dynamic.mnet-online.de [88.217.54.40]) by smtp-auth.mnet-online.de (Postfix) with ESMTP; Tue, 14 Jul 2009 15:42:46 +0200 (CEST) Received: from gemini.denx.de (gemini.denx.de [10.0.0.2]) by diddl.denx.de (Postfix) with ESMTP id 16B95C913180; Tue, 14 Jul 2009 15:42:46 +0200 (CEST) Received: by gemini.denx.de (Postfix, from userid 500) id 0D5F5832E416; Tue, 14 Jul 2009 15:42:46 +0200 (CEST) From: Wolfgang Denk To: linuxppc-dev@ozlabs.org Subject: [PATCH v2] fs_enet/mii-fec.c: fix MII speed calculation Date: Tue, 14 Jul 2009 15:42:46 +0200 Message-Id: <1247578966-9847-1-git-send-email-wd@denx.de> X-Mailer: git-send-email 1.6.0.6 In-Reply-To: <1244751543-21977-2-git-send-email-wd@denx.de> References: <1244751543-21977-2-git-send-email-wd@denx.de> Cc: netdev@vger.kernel.org, Wolfgang Denk X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.11 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org The MII speed calculation was based on the CPU clock (ppc_proc_freq), but for MPC512x we must use the bus clock instead. This patch makes it use the correct clock and makes sure we don't clobber reserved bits in the MII_SPEED register. Signed-off-by: Wolfgang Denk Cc: Grant Likely Cc: Kumar Gala Cc: --- Note 1: This patch is a rewrite of a previous posting: http://patchwork.ozlabs.org/patch/28584/ Note 2: Function mpc5xxx_get_mii_speed() was introduced for re-use in a later patch to drivers/net/fec_mpc52xx.c and drivers/net/fec_mpc52xx_phy.c, which also contain code to calculate the MII speed without taking care to check for overflow or to write only the bits that belong to the MII_SPEED field when setting the MII speed. arch/powerpc/sysdev/mpc5xxx_clocks.c | 37 ++++++++++++++++++++++++++++++++++ drivers/net/fs_enet/mii-fec.c | 13 +++++++++-- 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/arch/powerpc/sysdev/mpc5xxx_clocks.c b/arch/powerpc/sysdev/mpc5xxx_clocks.c index 34e12f9..e26d12b 100644 --- a/arch/powerpc/sysdev/mpc5xxx_clocks.c +++ b/arch/powerpc/sysdev/mpc5xxx_clocks.c @@ -31,3 +31,40 @@ mpc5xxx_get_bus_frequency(struct device_node *node) return p_bus_freq ? *p_bus_freq : 0; } EXPORT_SYMBOL(mpc5xxx_get_bus_frequency); + +/** + * mpc5xxx_get_mii_speed - Get the MII_SPEED value + * @node: device node + * + * Returns the MII_SPEED value for MPC512x and MPC52xx systems. + * The value gets computed such that the resulting MDC frequency + * is 2.5 MHz or lower. + */ + +int +mpc5xxx_get_mii_speed(struct of_device *ofdev) +{ + unsigned int clock, speed; + + clock = mpc5xxx_get_bus_frequency(ofdev->node); + + if (!clock) { + dev_err(&ofdev->dev, "could not determine IPS/IPB clock\n"); + return -ENODEV; + } + + /* scale for a MII clock <= 2.5 MHz */ + speed = (clock + 2499999) / 2500000; + + /* only 6 bits available for MII speed */ + if (speed > 0x3F) { + speed = 0x3F; + dev_err(&ofdev->dev, + "MII clock (%d MHz) exceeds max (2.5 MHz)\n", + clock / speed); + } + + /* Field is in bits 25:30 of MII_SPEED register */ + return speed << 1; +} +EXPORT_SYMBOL(mpc5xxx_get_mii_speed); diff --git a/drivers/net/fs_enet/mii-fec.c b/drivers/net/fs_enet/mii-fec.c index 75a0999..a28d39f 100644 --- a/drivers/net/fs_enet/mii-fec.c +++ b/drivers/net/fs_enet/mii-fec.c @@ -36,6 +36,7 @@ #include #include #include +#include #include "fs_enet.h" #include "fec.h" @@ -103,7 +104,6 @@ static int fs_enet_fec_mii_reset(struct mii_bus *bus) static int __devinit fs_enet_mdio_probe(struct of_device *ofdev, const struct of_device_id *match) { - struct device_node *np = NULL; struct resource res; struct mii_bus *new_bus; struct fec_info *fec; @@ -133,13 +133,20 @@ static int __devinit fs_enet_mdio_probe(struct of_device *ofdev, if (!fec->fecp) goto out_fec; - fec->mii_speed = ((ppc_proc_freq + 4999999) / 5000000) << 1; + if (of_device_is_compatible(ofdev->node, "fsl,mpc5121-fec-mdio")) { + i = mpc5xxx_get_mii_speed(ofdev); + if (i < 0) + goto out_unmap_regs; + fec->mii_speed = i; + } else { + fec->mii_speed = ((ppc_proc_freq + 4999999) / 5000000) << 1; + } setbits32(&fec->fecp->fec_r_cntrl, FEC_RCNTRL_MII_MODE); setbits32(&fec->fecp->fec_ecntrl, FEC_ECNTRL_PINMUX | FEC_ECNTRL_ETHER_EN); out_be32(&fec->fecp->fec_ievent, FEC_ENET_MII); - out_be32(&fec->fecp->fec_mii_speed, fec->mii_speed); + clrsetbits_be32(&fec->fecp->fec_mii_speed, 0x7E, fec->mii_speed); new_bus->phy_mask = ~0; new_bus->irq = kmalloc(sizeof(int) * PHY_MAX_ADDR, GFP_KERNEL);