All of lore.kernel.org
 help / color / mirror / Atom feed
From: Wang YanQing <udknight@gmail.com>
To: Francois Romieu <romieu@fr.zoreil.com>
Cc: netdev@vger.kernel.org, David Miller <davem@davemloft.net>,
	Lee Chun-Yi <jlee@suse.com>, Hayes Wang <hayeswang@realtek.com>
Subject: Re: [PATCH net 1/1] r8169: workaround for missing extended GigaMAC registers
Date: Fri, 7 Dec 2012 08:39:55 +0800	[thread overview]
Message-ID: <20121207003955.GA3668@udknight> (raw)
In-Reply-To: <20121205223452.GA24164@electric-eye.fr.zoreil.com>

On Wed, Dec 05, 2012 at 11:34:52PM +0100, Francois Romieu wrote:
> GigaMAC registers have been reported left unitialized in several
> situations:
> - after cold boot from power-off state
> - after S3 resume
> 
> Tweaking rtl_hw_phy_config takes care of both.
> 
> Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
> Cc: Hayes Wang <hayeswang@realtek.com>
> ---
>  drivers/net/ethernet/realtek/r8169.c | 42 ++++++++++++++++++++----------------
>  1 file changed, 24 insertions(+), 18 deletions(-)
> 
>  YanQing and Chun-Yi, can you add your Signed-off-by to this patch ?
>  It contains bits of everybody's work but it does not match any. :o)
> 
>  I apparently play in the safe bios league since I did not notice any
>  difference before or after the patch.
> 
>  Beware, this patch seems to apply to net-next but doing so moves
>  rtl_rar_exgmac_set from rtl8168e_2_hw_phy_config to rtl8168f_hw_phy_config.
> 
>  Hayes, your comments are welcome if any.
> 
> diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c
> index 927aa33..b353003 100644
> --- a/drivers/net/ethernet/realtek/r8169.c
> +++ b/drivers/net/ethernet/realtek/r8169.c
> @@ -3096,6 +3096,23 @@ static void rtl8168e_1_hw_phy_config(struct rtl8169_private *tp)
>  	rtl_writephy(tp, 0x0d, 0x0000);
>  }
>  
> +static void rtl_rar_exgmac_set(struct rtl8169_private *tp, u8 *addr)
> +{
> +	const u16 w[] = {
> +		addr[0] | (addr[1] << 8),
> +		addr[2] | (addr[3] << 8),
> +		addr[4] | (addr[5] << 8)
> +	};
> +	const struct exgmac_reg e[] = {
> +		{ .addr = 0xe0, ERIAR_MASK_1111, .val = w[0] | (w[1] << 16) },
> +		{ .addr = 0xe4, ERIAR_MASK_1111, .val = w[2] },
> +		{ .addr = 0xf0, ERIAR_MASK_1111, .val = w[0] << 16 },
> +		{ .addr = 0xf4, ERIAR_MASK_1111, .val = w[1] | (w[2] << 16) },
> +	};
> +
> +	rtl_write_exgmac_batch(tp, e, ARRAY_SIZE(e));
> +}
> +
>  static void rtl8168e_2_hw_phy_config(struct rtl8169_private *tp)
>  {
>  	static const struct phy_reg phy_reg_init[] = {
> @@ -3178,6 +3195,9 @@ static void rtl8168e_2_hw_phy_config(struct rtl8169_private *tp)
>  	rtl_w1w0_phy(tp, 0x19, 0x0000, 0x0001);
>  	rtl_w1w0_phy(tp, 0x10, 0x0000, 0x0400);
>  	rtl_writephy(tp, 0x1f, 0x0000);
> +
> +	/* Broken BIOS workaround: feed GigaMAC registers with MAC address. */
> +	rtl_rar_exgmac_set(tp, tp->dev->dev_addr);
>  }
>  
>  static void rtl8168f_hw_phy_config(struct rtl8169_private *tp)
> @@ -3708,33 +3728,19 @@ static void rtl8169_init_phy(struct net_device *dev, struct rtl8169_private *tp)
>  static void rtl_rar_set(struct rtl8169_private *tp, u8 *addr)
>  {
>  	void __iomem *ioaddr = tp->mmio_addr;
> -	u32 high;
> -	u32 low;
> -
> -	low  = addr[0] | (addr[1] << 8) | (addr[2] << 16) | (addr[3] << 24);
> -	high = addr[4] | (addr[5] << 8);
>  
>  	rtl_lock_work(tp);
>  
>  	RTL_W8(Cfg9346, Cfg9346_Unlock);
>  
> -	RTL_W32(MAC4, high);
> +	RTL_W32(MAC4, addr[4] | addr[5] << 8);
>  	RTL_R32(MAC4);
>  
> -	RTL_W32(MAC0, low);
> +	RTL_W32(MAC0, addr[0] | addr[1] << 8 | addr[2] << 16 | addr[3] << 24);
>  	RTL_R32(MAC0);
>  
> -	if (tp->mac_version == RTL_GIGA_MAC_VER_34) {
> -		const struct exgmac_reg e[] = {
> -			{ .addr = 0xe0, ERIAR_MASK_1111, .val = low },
> -			{ .addr = 0xe4, ERIAR_MASK_1111, .val = high },
> -			{ .addr = 0xf0, ERIAR_MASK_1111, .val = low << 16 },
> -			{ .addr = 0xf4, ERIAR_MASK_1111, .val = high << 16 |
> -								low  >> 16 },
> -		};
> -
> -		rtl_write_exgmac_batch(tp, e, ARRAY_SIZE(e));
> -	}
> +	if (tp->mac_version == RTL_GIGA_MAC_VER_34)
> +		rtl_rar_exgmac_set(tp, addr);
>  
>  	RTL_W8(Cfg9346, Cfg9346_Lock);
>  
> -- 
> 1.7.11.7
Signed-off-by: Wang YanQing <udknight@gmail.com>

  parent reply	other threads:[~2012-12-07  0:39 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-12-05 22:34 [PATCH net 1/1] r8169: workaround for missing extended GigaMAC registers Francois Romieu
2012-12-06  7:38 ` Wang YanQing
2012-12-06 12:25   ` Francois Romieu
2012-12-07  0:39 ` Wang YanQing [this message]
2012-12-07 17:55 ` David Miller

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=20121207003955.GA3668@udknight \
    --to=udknight@gmail.com \
    --cc=davem@davemloft.net \
    --cc=hayeswang@realtek.com \
    --cc=jlee@suse.com \
    --cc=netdev@vger.kernel.org \
    --cc=romieu@fr.zoreil.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.