From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from vaxon.spb.rtsoft.ru (unknown [212.176.242.38]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTP id 3AA5FDDEC3 for ; Fri, 22 Feb 2008 01:48:17 +1100 (EST) Date: Thu, 21 Feb 2008 17:46:18 +0300 From: Valentine Barshak To: linuxppc-dev@ozlabs.org Subject: [RFC][PATCH] PowerPC 4xx: ibm_newemac 440GX phy clock workaround. Message-ID: <20080221144617.GA19465@ru.mvista.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , The PowerPC 440GX Taishan board fails to reset EMAC3 (reset timeout error) and because of that it can't find PHY chip. The older ibm_emac driver had a workaround for that: the EMAC_CLK_INTERNAL/EMAC_CLK_EXTERNAL macros which toggle the Ethernet Clock Select bit in the SDR0_MFR register. This patch does the same for "ibm,emac-440gx" compatible chips. Signed-off-by: Valentine Barshak --- drivers/net/ibm_newemac/core.c | 16 +++++++++++++++- drivers/net/ibm_newemac/core.h | 8 ++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff -pruN linux-2.6.orig/drivers/net/ibm_newemac/core.c linux-2.6/drivers/net/ibm_newemac/core.c --- linux-2.6.orig/drivers/net/ibm_newemac/core.c 2008-02-21 16:45:36.000000000 +0300 +++ linux-2.6/drivers/net/ibm_newemac/core.c 2008-02-21 17:21:21.000000000 +0300 @@ -43,6 +43,8 @@ #include #include #include +#include +#include #include "core.h" @@ -2480,8 +2482,11 @@ static int __devinit emac_init_config(st } /* Check EMAC version */ - if (of_device_is_compatible(np, "ibm,emac4")) + if (of_device_is_compatible(np, "ibm,emac4")) { dev->features |= EMAC_FTR_EMAC4; + if (of_device_is_compatible(np, "ibm,emac-440gx")) + dev->features |= EMAC_FTR_440GX_PHY_CLK_FIX; + } /* Fixup some feature bits based on the device tree */ if (of_get_property(np, "has-inverted-stacr-oc", NULL)) @@ -2673,8 +2678,17 @@ static int __devinit emac_probe(struct o dev->stop_timeout = STOP_TIMEOUT_100; INIT_DELAYED_WORK(&dev->link_work, emac_link_timer); + /* Enable internal phy clock source */ + if (emac_has_feature(dev, EMAC_FTR_440GX_PHY_CLK_FIX)) + mtdcri(SDR0, SDR0_MFR, mfdcri(SDR0, SDR0_MFR) | SDR0_MFR_ECS); + /* Find PHY if any */ err = emac_init_phy(dev); + + /* Enable external phy clock source */ + if (emac_has_feature(dev, EMAC_FTR_440GX_PHY_CLK_FIX)) + mtdcri(SDR0, SDR0_MFR, mfdcri(SDR0, SDR0_MFR) & ~SDR0_MFR_ECS); + if (err != 0) goto err_detach_tah; diff -pruN linux-2.6.orig/drivers/net/ibm_newemac/core.h linux-2.6/drivers/net/ibm_newemac/core.h --- linux-2.6.orig/drivers/net/ibm_newemac/core.h 2008-02-21 16:45:36.000000000 +0300 +++ linux-2.6/drivers/net/ibm_newemac/core.h 2008-02-21 17:21:47.000000000 +0300 @@ -301,6 +301,10 @@ struct emac_instance { * Set if we have new type STACR with STAOPC */ #define EMAC_FTR_HAS_NEW_STACR 0x00000040 +/* + * Set if we need phy clock workaround for 440gx + */ +#define EMAC_FTR_440GX_PHY_CLK_FIX 0x00000080 /* Right now, we don't quite handle the always/possible masks on the @@ -312,8 +316,8 @@ enum { EMAC_FTRS_POSSIBLE = #ifdef CONFIG_IBM_NEW_EMAC_EMAC4 - EMAC_FTR_EMAC4 | EMAC_FTR_HAS_NEW_STACR | - EMAC_FTR_STACR_OC_INVERT | + EMAC_FTR_EMAC4 | EMAC_FTR_HAS_NEW_STACR | + EMAC_FTR_STACR_OC_INVERT | EMAC_FTR_440GX_PHY_CLK_FIX | #endif #ifdef CONFIG_IBM_NEW_EMAC_TAH EMAC_FTR_HAS_TAH |