Message ID | 20210701081040.559253-1-koba.ko@canonical.com |
---|---|
State | New |
Headers | show |
Series | [V2,SRU,OEM-5.13] UBUNTU: SAUCE: r8169: Use PHY_POLL when RTL8106E enable ASPM | expand |
On 1.7.2021 11.10, Koba Ko wrote: > BugLink: https://bugs.launchpad.net/bugs/1930645 > > For RTL8106E, it's a Fast-ethernet chip. > If ASPM is enabled, the link chang interrupt wouldn't be triggered > immediately and must wait a very long time to get link change interrupt. > Even the link change interrupt isn't triggered, the phy link is already > established. > > Use PHY_POLL to watch the status of phy link > when ASPM is enabled on RTL8106E. > > Signed-off-by: Koba Ko <koba.ko@canonical.com> > --- > drivers/net/ethernet/realtek/r8169_main.c | 16 +++++++++++++++- > 1 file changed, 15 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c > index 88ff10fde853..b3c88ad943b1 100644 > --- a/drivers/net/ethernet/realtek/r8169_main.c > +++ b/drivers/net/ethernet/realtek/r8169_main.c > @@ -2246,6 +2246,19 @@ static int rtl_set_mac_address(struct net_device *dev, void *p) > return 0; > } > > +static int rtl_phy_poll_quirk(struct rtl8169_private *tp) > +{ > + struct pci_dev *pdev = tp->pci_dev; > + > + if (!pcie_aspm_enabled(pdev)) > + return 0; > + > + if (tp->mac_version == RTL_GIGA_MAC_VER_39) > + return 1; > + > + return 0; > +} > + > static void rtl_wol_enable_rx(struct rtl8169_private *tp) > { > if (tp->mac_version >= RTL_GIGA_MAC_VER_25) > @@ -5085,7 +5098,8 @@ static int r8169_mdio_register(struct rtl8169_private *tp) > new_bus->name = "r8169"; > new_bus->priv = tp; > new_bus->parent = &pdev->dev; > - new_bus->irq[0] = PHY_MAC_INTERRUPT; > + new_bus->irq[0] = > + (rtl_phy_poll_quirk(tp) ? PHY_POLL : PHY_MAC_INTERRUPT); > snprintf(new_bus->id, MII_BUS_ID_SIZE, "r8169-%x", pci_dev_id(pdev)); > > new_bus->read = r8169_mdio_read_reg; > applied to oem-5.13, thanks
diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c index 88ff10fde853..b3c88ad943b1 100644 --- a/drivers/net/ethernet/realtek/r8169_main.c +++ b/drivers/net/ethernet/realtek/r8169_main.c @@ -2246,6 +2246,19 @@ static int rtl_set_mac_address(struct net_device *dev, void *p) return 0; } +static int rtl_phy_poll_quirk(struct rtl8169_private *tp) +{ + struct pci_dev *pdev = tp->pci_dev; + + if (!pcie_aspm_enabled(pdev)) + return 0; + + if (tp->mac_version == RTL_GIGA_MAC_VER_39) + return 1; + + return 0; +} + static void rtl_wol_enable_rx(struct rtl8169_private *tp) { if (tp->mac_version >= RTL_GIGA_MAC_VER_25) @@ -5085,7 +5098,8 @@ static int r8169_mdio_register(struct rtl8169_private *tp) new_bus->name = "r8169"; new_bus->priv = tp; new_bus->parent = &pdev->dev; - new_bus->irq[0] = PHY_MAC_INTERRUPT; + new_bus->irq[0] = + (rtl_phy_poll_quirk(tp) ? PHY_POLL : PHY_MAC_INTERRUPT); snprintf(new_bus->id, MII_BUS_ID_SIZE, "r8169-%x", pci_dev_id(pdev)); new_bus->read = r8169_mdio_read_reg;
BugLink: https://bugs.launchpad.net/bugs/1930645 For RTL8106E, it's a Fast-ethernet chip. If ASPM is enabled, the link chang interrupt wouldn't be triggered immediately and must wait a very long time to get link change interrupt. Even the link change interrupt isn't triggered, the phy link is already established. Use PHY_POLL to watch the status of phy link when ASPM is enabled on RTL8106E. Signed-off-by: Koba Ko <koba.ko@canonical.com> --- drivers/net/ethernet/realtek/r8169_main.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-)