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>
next prev 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.