All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kai-Heng Feng <kai.heng.feng@canonical.com>
To: Heiner Kallweit <hkallweit1@gmail.com>
Cc: nic_swsd <nic_swsd@realtek.com>,
	Bjorn Helgaas <bhelgaas@google.com>,
	David Miller <davem@davemloft.net>,
	Jakub Kicinski <kuba@kernel.org>,
	Linux Netdev List <netdev@vger.kernel.org>,
	Linux PCI <linux-pci@vger.kernel.org>,
	LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH net-next v3 3/3] r8169: Enable ASPM for selected NICs
Date: Fri, 27 Aug 2021 14:23:07 +0800	[thread overview]
Message-ID: <CAAd53p7JLemocM+rA-EyiuX=asYg5__J07+F9W7YZpUgWVMrPg@mail.gmail.com> (raw)
In-Reply-To: <d3e4ec0b-2681-1b3c-f0ca-828b24b253e7@gmail.com>

On Thu, Aug 19, 2021 at 5:56 PM Heiner Kallweit <hkallweit1@gmail.com> wrote:
>
> On 19.08.2021 08:50, Kai-Heng Feng wrote:
> > On Thu, Aug 19, 2021 at 2:08 PM Heiner Kallweit <hkallweit1@gmail.com> wrote:
> >>
> >> On 19.08.2021 07:45, Kai-Heng Feng wrote:
> >>> The latest vendor driver enables ASPM for more recent r8168 NICs, so
> >>> disable ASPM on older chips and enable ASPM for the rest.
> >>>
> >>> Rename aspm_manageable to pcie_aspm_manageable to indicate it's ASPM
> >>> from PCIe, and use rtl_aspm_supported for Realtek NIC's internal ASPM
> >>> function.
> >>>
> >>> Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
> >>> ---
> >>> v3:
> >>>  - Use pcie_aspm_supported() to retrieve ASPM support status
> >>>  - Use whitelist for r8169 internal ASPM status
> >>>
> >>> v2:
> >>>  - No change
> >>>
> >>>  drivers/net/ethernet/realtek/r8169_main.c | 27 ++++++++++++++++-------
> >>>  1 file changed, 19 insertions(+), 8 deletions(-)
> >>>
> >>> diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c
> >>> index 3359509c1c351..88e015d93e490 100644
> >>> --- a/drivers/net/ethernet/realtek/r8169_main.c
> >>> +++ b/drivers/net/ethernet/realtek/r8169_main.c
> >>> @@ -623,7 +623,8 @@ struct rtl8169_private {
> >>>       } wk;
> >>>
> >>>       unsigned supports_gmii:1;
> >>> -     unsigned aspm_manageable:1;
> >>> +     unsigned pcie_aspm_manageable:1;
> >>> +     unsigned rtl_aspm_supported:1;
> >>>       unsigned rtl_aspm_enabled:1;
> >>>       struct delayed_work aspm_toggle;
> >>>       atomic_t aspm_packet_count;
> >>> @@ -702,6 +703,20 @@ static bool rtl_is_8168evl_up(struct rtl8169_private *tp)
> >>>              tp->mac_version <= RTL_GIGA_MAC_VER_53;
> >>>  }
> >>>
> >>> +static int rtl_supports_aspm(struct rtl8169_private *tp)
> >>> +{
> >>> +     switch (tp->mac_version) {
> >>> +     case RTL_GIGA_MAC_VER_02 ... RTL_GIGA_MAC_VER_31:
> >>> +     case RTL_GIGA_MAC_VER_37:
> >>> +     case RTL_GIGA_MAC_VER_39:
> >>> +     case RTL_GIGA_MAC_VER_43:
> >>> +     case RTL_GIGA_MAC_VER_47:
> >>> +             return 0;
> >>> +     default:
> >>> +             return 1;
> >>> +     }
> >>> +}
> >>> +
> >>>  static bool rtl_supports_eee(struct rtl8169_private *tp)
> >>>  {
> >>>       return tp->mac_version >= RTL_GIGA_MAC_VER_34 &&
> >>> @@ -2669,7 +2684,7 @@ static void rtl_pcie_state_l2l3_disable(struct rtl8169_private *tp)
> >>>
> >>>  static void rtl_hw_aspm_clkreq_enable(struct rtl8169_private *tp, bool enable)
> >>>  {
> >>> -     if (!tp->aspm_manageable && enable)
> >>> +     if (!(tp->pcie_aspm_manageable && tp->rtl_aspm_supported) && enable)
> >>>               return;
> >>>
> >>>       tp->rtl_aspm_enabled = enable;
> >>> @@ -5319,12 +5334,8 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
> >>>       if (rc)
> >>>               return rc;
> >>>
> >>> -     /* Disable ASPM completely as that cause random device stop working
> >>> -      * problems as well as full system hangs for some PCIe devices users.
> >>> -      */
> >>> -     rc = pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S |
> >>> -                                       PCIE_LINK_STATE_L1);
> >>> -     tp->aspm_manageable = !rc;
> >>> +     tp->pcie_aspm_manageable = pcie_aspm_supported(pdev);
> >>
> >> That's not what I meant, and it's also not correct.
> >
> > In case I make another mistake in next series, let me ask it more clearly...
> > What you meant was to check both link->aspm_enabled and link->aspm_support?
> >
> aspm_enabled can be changed by the user at any time.

OK, will check that too.

> pci_disable_link_state() also considers whether BIOS forbids that OS
> mess with ASPM. See aspm_disabled.

I think aspm_disabled means leave BIOS ASPM setting intact?
So If PCIe ASPM is already enabled, we should also enable Realtek
specific bits to make ASPM really work.

>
> >>
> >>> +     tp->rtl_aspm_supported = rtl_supports_aspm(tp);
> >
> > Is rtl_supports_aspm() what you expect for the whitelist?
> > And what else am I missing?
> >
> I meant use rtl_supports_aspm() to check when ASPM is relevant at all,

I think that means the relevant bits are link->aspm_capable and
pcie_aspm_support_enabled().
ASPM can be already enabled by BIOS with aspm_disabled set.

Then check link->aspm_enabled in aspm_toggle() routine because it can
be enabled at runtime.

> and in addition use a blacklist for chip versions where ASPM is
> completely unusable.

Thanks for your suggestion and review.

Kai-Heng

>
> > Kai-Heng
> >
> >>>
> >>>       /* enable device (incl. PCI PM wakeup and hotplug setup) */
> >>>       rc = pcim_enable_device(pdev);
> >>>
> >>
>

  reply	other threads:[~2021-08-27  6:23 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-19  5:45 [PATCH net-next v3 0/3] r8169: Implement dynamic ASPM mechanism for recent 1.0/2.5Gbps Realtek NICs Kai-Heng Feng
2021-08-19  5:45 ` [PATCH net-next v3 1/3] r8169: Implement dynamic ASPM mechanism Kai-Heng Feng
2021-08-19 11:42   ` Bjorn Helgaas
2021-08-19 15:45     ` Heiner Kallweit
2021-08-20 21:03       ` Bjorn Helgaas
2021-08-24  7:39         ` Kai-Heng Feng
2021-08-24 14:53           ` Bjorn Helgaas
2021-08-27  4:56             ` Kai-Heng Feng
2021-08-19  5:45 ` [PATCH net-next v3 2/3] PCI/ASPM: Introduce a new helper to report ASPM support status Kai-Heng Feng
2021-08-19  5:45 ` [PATCH net-next v3 3/3] r8169: Enable ASPM for selected NICs Kai-Heng Feng
2021-08-19  6:02   ` Heiner Kallweit
2021-08-19  6:50     ` Kai-Heng Feng
2021-08-19  9:56       ` Heiner Kallweit
2021-08-27  6:23         ` Kai-Heng Feng [this message]
2021-08-19  6:08 ` [PATCH net-next v3 0/3] r8169: Implement dynamic ASPM mechanism for recent 1.0/2.5Gbps Realtek NICs Heiner Kallweit
2021-08-19  6:19   ` Kai-Heng Feng

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='CAAd53p7JLemocM+rA-EyiuX=asYg5__J07+F9W7YZpUgWVMrPg@mail.gmail.com' \
    --to=kai.heng.feng@canonical.com \
    --cc=bhelgaas@google.com \
    --cc=davem@davemloft.net \
    --cc=hkallweit1@gmail.com \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=nic_swsd@realtek.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.