All of lore.kernel.org
 help / color / mirror / Atom feed
From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
To: Valentine Barshak <vbarshak@ru.mvista.com>
Cc: linuxppc-dev@ozlabs.org
Subject: Re: [PATCH 2/2] ibm_newemac: PowerPC 440EP/440GR EMAC PHY clock workaround
Date: Tue, 25 Mar 2008 10:22:15 +1100	[thread overview]
Message-ID: <1206400935.7197.59.camel@pasglop> (raw)
In-Reply-To: <20080306134359.GA31762@ru.mvista.com>


On Thu, 2008-03-06 at 16:43 +0300, Valentine Barshak wrote:
> This patch adds ibm_newemac PHY clock workaround for 440EP/440GR EMAC
> attached to a PHY which doesn't generate RX clock if there is no link.
> The code is based on the previous ibm_emac driver stuff. The 440EP/440GR
> allows controlling each EMAC clock separately as opposed to global clock
> selection for 440GX.
> 
> Signed-off-by: Valentine Barshak <vbarshak@ru.mvista.com>

Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>

> ---
>  drivers/net/ibm_newemac/core.c |   34 ++++++++++++++++++++++++++++++++--
>  drivers/net/ibm_newemac/core.h |    6 +++++-
>  2 files changed, 37 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-26 16:32:33.000000000 +0300
> +++ linux-2.6/drivers/net/ibm_newemac/core.c	2008-02-26 16:37:52.000000000 +0300
> @@ -129,10 +129,29 @@ static struct device_node *emac_boot_lis
>  static inline void emac_report_timeout_error(struct emac_instance *dev,
>  					     const char *error)
>  {
> -	if (net_ratelimit())
> +	if (emac_has_feature(dev, EMAC_FTR_440GX_PHY_CLK_FIX |
> +				  EMAC_FTR_440EP_PHY_CLK_FIX))
> +		DBG(dev, "%s" NL, error);
> +	else if (net_ratelimit())
>  		printk(KERN_ERR "%s: %s\n", dev->ndev->name, error);
>  }
>  
> +/* EMAC PHY clock workaround:
> + * 440EP/440GR has more sane SDR0_MFR register implementation than 440GX,
> + * which allows controlling each EMAC clock
> + */
> +static inline void emac_rx_clk_tx(struct emac_instance *dev)
> +{
> +	if (emac_has_feature(dev, EMAC_FTR_440EP_PHY_CLK_FIX))
> +		dcri_clrset(SDR0, SDR0_MFR, 0, SDR0_MFR_ECS >> dev->cell_index);
> +}
> +
> +static inline void emac_rx_clk_default(struct emac_instance *dev)
> +{
> +	if (emac_has_feature(dev, EMAC_FTR_440EP_PHY_CLK_FIX))
> +		dcri_clrset(SDR0, SDR0_MFR, SDR0_MFR_ECS >> dev->cell_index, 0);
> +}
> +
>  /* PHY polling intervals */
>  #define PHY_POLL_LINK_ON	HZ
>  #define PHY_POLL_LINK_OFF	(HZ / 5)
> @@ -1089,9 +1112,11 @@ static int emac_open(struct net_device *
>  		int link_poll_interval;
>  		if (dev->phy.def->ops->poll_link(&dev->phy)) {
>  			dev->phy.def->ops->read_link(&dev->phy);
> +			emac_rx_clk_default(dev);
>  			netif_carrier_on(dev->ndev);
>  			link_poll_interval = PHY_POLL_LINK_ON;
>  		} else {
> +			emac_rx_clk_tx(dev);
>  			netif_carrier_off(dev->ndev);
>  			link_poll_interval = PHY_POLL_LINK_OFF;
>  		}
> @@ -1169,6 +1194,7 @@ static void emac_link_timer(struct work_
>  
>  	if (dev->phy.def->ops->poll_link(&dev->phy)) {
>  		if (!netif_carrier_ok(dev->ndev)) {
> +			emac_rx_clk_default(dev);
>  			/* Get new link parameters */
>  			dev->phy.def->ops->read_link(&dev->phy);
>  
> @@ -1181,6 +1207,7 @@ static void emac_link_timer(struct work_
>  		link_poll_interval = PHY_POLL_LINK_ON;
>  	} else {
>  		if (netif_carrier_ok(dev->ndev)) {
> +			emac_rx_clk_tx(dev);
>  			netif_carrier_off(dev->ndev);
>  			netif_tx_disable(dev->ndev);
>  			emac_reinitialize(dev);
> @@ -2325,9 +2352,12 @@ static int __devinit emac_init_phy(struc
>  	dev->phy.mdio_read = emac_mdio_read;
>  	dev->phy.mdio_write = emac_mdio_write;
>  
> -	/* Enable internal clock source */
> +	/* EMAC PHY clock workaround */
>  	if (emac_has_feature(dev, EMAC_FTR_440GX_PHY_CLK_FIX))
> +		/* Enable internal clock source */
>  		dcri_clrset(SDR0, SDR0_MFR, 0, SDR0_MFR_ECS);
> +	else
> +		emac_rx_clk_tx(dev);
>  
>  	/* Configure EMAC with defaults so we can at least use MDIO
>  	 * This is needed mostly for 440GX
> @@ -2495,6 +2525,10 @@ static int __devinit emac_init_config(st
>  		dev->features |= EMAC_FTR_EMAC4;
>  		if (of_device_is_compatible(np, "ibm,emac-440gx"))
>  			dev->features |= EMAC_FTR_440GX_PHY_CLK_FIX;
> +	} else {
> +		if (of_device_is_compatible(np, "ibm,emac-440ep") ||
> +		    of_device_is_compatible(np, "ibm,emac-440gr"))
> +			dev->features |= EMAC_FTR_440EP_PHY_CLK_FIX;
>  	}
>  
>  	/* Fixup some feature bits based on the device tree */
> 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-26 16:32:33.000000000 +0300
> +++ linux-2.6/drivers/net/ibm_newemac/core.h	2008-02-26 16:37:52.000000000 +0300
> @@ -305,6 +305,10 @@ struct emac_instance {
>   * Set if we need phy clock workaround for 440gx
>   */
>  #define EMAC_FTR_440GX_PHY_CLK_FIX	0x00000080
> +/*
> + * Set if we need phy clock workaround for 440ep or 440gr
> + */
> +#define EMAC_FTR_440EP_PHY_CLK_FIX	0x00000100
>  
> 
>  /* Right now, we don't quite handle the always/possible masks on the
> @@ -328,7 +332,7 @@ enum {
>  #ifdef CONFIG_IBM_NEW_EMAC_RGMII
>  	    EMAC_FTR_HAS_RGMII	|
>  #endif
> -	    0,
> +	EMAC_FTR_440EP_PHY_CLK_FIX,
>  };
>  
>  static inline int emac_has_feature(struct emac_instance *dev,

  reply	other threads:[~2008-03-24 23:23 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-02-21 14:46 [RFC][PATCH] PowerPC 4xx: ibm_newemac 440GX phy clock workaround Valentine Barshak
2008-02-21 22:52 ` Benjamin Herrenschmidt
2008-02-22 19:15   ` Valentine Barshak
2008-02-22 20:51     ` Josh Boyer
2008-02-22 19:24   ` [RFC][PATCH] ibm_newemac: PowerPC 440GX EMAC PHY " Valentine Barshak
2008-02-22 19:28   ` [RFC][PATCH] ibm_newemac: PowerPC 440EP/440GR " Valentine Barshak
2008-02-22 20:49     ` Josh Boyer
2008-02-26 12:25       ` Valentine Barshak
2008-02-26 14:10         ` Steven A. Falco
2008-02-26 15:02           ` Josh Boyer
2008-02-28  7:54             ` Benjamin Herrenschmidt
2008-03-05 17:46               ` Valentine Barshak
2008-03-05 18:38                 ` [PATCH] PowerPC 4xx: Add dcri_clrset() for locked read/modify/write functionality Valentine Barshak
2008-03-06  0:06                   ` Benjamin Herrenschmidt
2008-03-06  1:12                     ` Josh Boyer
2008-03-06 11:31                       ` Valentine Barshak
2008-03-06 11:50                         ` Benjamin Herrenschmidt
2008-03-06 13:37                           ` [PATCH] PowerPC 4xx: Use dcri_clrset() for PCIe indirect dcr read/modify/write access Valentine Barshak
2008-03-06 14:08                             ` Valentine Barshak
2008-03-06 14:34                               ` Valentine Barshak
2008-03-06 13:41                           ` [PATCH 1/2] ibm_newemac: PowerPC 440GX EMAC PHY clock workaround Valentine Barshak
2008-03-24 23:21                             ` Benjamin Herrenschmidt
2008-03-26 12:36                               ` Josh Boyer
2008-03-06 13:43                           ` [PATCH 2/2] ibm_newemac: PowerPC 440EP/440GR " Valentine Barshak
2008-03-24 23:22                             ` Benjamin Herrenschmidt [this message]
2008-03-26 12:35                               ` Josh Boyer
2008-03-27 13:50                                 ` Valentine Barshak
2008-03-27 13:53                                   ` Josh Boyer
2008-03-27 14:40                                     ` [PATCH 1/2] ibm_newemac: PowerPC 440GX " Valentine Barshak
2008-03-27 14:40                                       ` Valentine Barshak
2008-03-29  2:18                                       ` Jeff Garzik
2008-03-29  2:18                                         ` Jeff Garzik
2008-03-29  3:28                                         ` Benjamin Herrenschmidt
2008-03-29  3:30                                         ` Josh Boyer
2008-03-29  3:30                                           ` Josh Boyer
2008-04-11 14:24                                         ` Josh Boyer
2008-04-11 14:24                                           ` Josh Boyer
2008-04-12 20:28                                           ` Jeff Garzik
2008-04-12 20:28                                             ` Jeff Garzik
2008-04-12 20:47                                             ` Josh Boyer
2008-04-12 21:13                                               ` Jeff Garzik
2008-03-27 14:42                                     ` [PATCH 2/2] ibm_newemac: PowerPC 440EP/440GR " Valentine Barshak
2008-03-27 14:42                                       ` Valentine Barshak
2008-03-27 14:43                                     ` [PATCH] ibm_newemac: emac_tx_csum typo fix Valentine Barshak
2008-03-29  1:54                                       ` Jeff Garzik

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1206400935.7197.59.camel@pasglop \
    --to=benh@kernel.crashing.org \
    --cc=linuxppc-dev@ozlabs.org \
    --cc=vbarshak@ru.mvista.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.