From: Raju Rangoju <Raju.Rangoju@amd.com>
To: <netdev@vger.kernel.org>
Cc: <linux-kernel@vger.kernel.org>, <pabeni@redhat.com>,
<kuba@kernel.org>, <edumazet@google.com>, <davem@davemloft.net>,
<andrew+netdev@lunn.ch>, "Raju Rangoju" <Raju.Rangoju@amd.com>
Subject: [PATCH net-next 2/2] amd-xgbe: add PCI power management for S0i3 support
Date: Fri, 6 Mar 2026 17:40:47 +0530 [thread overview]
Message-ID: <20260306121047.1231755-3-Raju.Rangoju@amd.com> (raw)
In-Reply-To: <20260306121047.1231755-1-Raju.Rangoju@amd.com>
The current suspend/resume implementation does not correctly handle PCI
device power state transitions, which prevents AMD platforms from
reaching the deepest suspend state (S0i3) when the amd-xgbe driver is
enabled.
In particular, the amd_pmc driver reports:
"Last suspend didn't reach deepest state"
when this device is present.
Implement proper PCI power management operations following the standard
PCI PM model so that the device can be cleanly powered down and resumed.
Suspend path:
- Power down the network interface
- Put the PHY into low-power mode
- Disable bus mastering to prevent DMA activity
- Save PCI configuration space
- Disable the PCI device
- Disable wake from D3 (S0i3 does not require Wake-on-LAN)
- Set the device to D3hot
Resume path:
- Restore the PCI power state to D0
- Restore PCI configuration space
- Enable the PCI device
- Re-enable bus mastering
- Re-enable device interrupts
- Clear the PHY low-power mode
- Power up the network interface
This allows systems using amd-xgbe to reach the deepest suspend state
when entering modern standby (S0i3).
Signed-off-by: Raju Rangoju <Raju.Rangoju@amd.com>
---
drivers/net/ethernet/amd/xgbe/xgbe-pci.c | 33 ++++++++++++++++++++++++
1 file changed, 33 insertions(+)
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-pci.c b/drivers/net/ethernet/amd/xgbe/xgbe-pci.c
index d8c1037dec45..061dfc9f75e3 100644
--- a/drivers/net/ethernet/amd/xgbe/xgbe-pci.c
+++ b/drivers/net/ethernet/amd/xgbe/xgbe-pci.c
@@ -364,15 +364,31 @@ static int xgbe_pci_suspend(struct device *dev)
{
struct xgbe_prv_data *pdata = dev_get_drvdata(dev);
struct net_device *netdev = pdata->netdev;
+ struct pci_dev *pdev = to_pci_dev(dev);
int ret = 0;
if (netif_running(netdev))
ret = xgbe_powerdown(netdev);
+ /* Disable all device interrupts to prevent spurious wakeups */
+ XP_IOWRITE(pdata, XP_INT_EN, 0x0);
+
+ /* Set PHY to low-power mode */
pdata->lpm_ctrl = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_CTRL1);
pdata->lpm_ctrl |= MDIO_CTRL1_LPOWER;
XMDIO_WRITE(pdata, MDIO_MMD_PCS, MDIO_CTRL1, pdata->lpm_ctrl);
+ /* Disable bus mastering to prevent DMA activity */
+ pci_clear_master(pdev);
+
+ /* Save PCI configuration state and disable device */
+ pci_save_state(pdev);
+ pci_disable_device(pdev);
+
+ /* Disable wake from D3 - required for S0i3 deep sleep */
+ pci_wake_from_d3(pdev, false);
+ pci_set_power_state(pdev, PCI_D3hot);
+
return ret;
}
@@ -380,10 +396,27 @@ static int xgbe_pci_resume(struct device *dev)
{
struct xgbe_prv_data *pdata = dev_get_drvdata(dev);
struct net_device *netdev = pdata->netdev;
+ struct pci_dev *pdev = to_pci_dev(dev);
int ret = 0;
+ /* Restore PCI power state */
+ pci_set_power_state(pdev, PCI_D0);
+
+ /* Restore PCI configuration state */
+ pci_restore_state(pdev);
+
+ /* Enable PCI device */
+ ret = pci_enable_device(pdev);
+ if (ret)
+ return ret;
+
+ /* Re-enable bus mastering */
+ pci_set_master(pdev);
+
+ /* Re-enable all device interrupts */
XP_IOWRITE(pdata, XP_INT_EN, 0x1fffff);
+ /* Clear PHY low-power mode */
pdata->lpm_ctrl &= ~MDIO_CTRL1_LPOWER;
XMDIO_WRITE(pdata, MDIO_MMD_PCS, MDIO_CTRL1, pdata->lpm_ctrl);
--
2.34.1
prev parent reply other threads:[~2026-03-06 12:11 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-06 12:10 [PATCH net-next 0/2] amd-xgbe: Improve power management for S0i3 Raju Rangoju
2026-03-06 12:10 ` [PATCH net-next 1/2] amd-xgbe: Simplify powerdown/powerup paths Raju Rangoju
2026-03-07 1:24 ` kernel test robot
2026-03-06 12:10 ` Raju Rangoju [this message]
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=20260306121047.1231755-3-Raju.Rangoju@amd.com \
--to=raju.rangoju@amd.com \
--cc=andrew+netdev@lunn.ch \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox