Commit 2eb9625a authored by Manish Chopra's avatar Manish Chopra Committed by Jakub Kicinski

qede: fix firmware halt over suspend and resume

While performing certain power-off sequences, PCI drivers are
called to suspend and resume their underlying devices through
PCI PM (power management) interface. However this NIC hardware
does not support PCI PM suspend/resume operations so system wide
suspend/resume leads to bad MFW (management firmware) state which
causes various follow-up errors in driver when communicating with
the device/firmware afterwards.

To fix this driver implements PCI PM suspend handler to indicate
unsupported operation to the PCI subsystem explicitly, thus avoiding
system to go into suspended/standby mode.

Without this fix device/firmware does not recover unless system
is power cycled.

Fixes: 2950219d ("qede: Add basic network device support")
Signed-off-by: default avatarManish Chopra <manishc@marvell.com>
Signed-off-by: default avatarAlok Prasad <palok@marvell.com>
Reviewed-by: default avatarJohn Meneghini <jmeneghi@redhat.com>
Reviewed-by: default avatarSimon Horman <horms@kernel.org>
Link: https://lore.kernel.org/r/20230816150711.59035-1-manishc@marvell.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent b616be6b
...@@ -176,6 +176,15 @@ static int qede_sriov_configure(struct pci_dev *pdev, int num_vfs_param) ...@@ -176,6 +176,15 @@ static int qede_sriov_configure(struct pci_dev *pdev, int num_vfs_param)
} }
#endif #endif
static int __maybe_unused qede_suspend(struct device *dev)
{
dev_info(dev, "Device does not support suspend operation\n");
return -EOPNOTSUPP;
}
static DEFINE_SIMPLE_DEV_PM_OPS(qede_pm_ops, qede_suspend, NULL);
static const struct pci_error_handlers qede_err_handler = { static const struct pci_error_handlers qede_err_handler = {
.error_detected = qede_io_error_detected, .error_detected = qede_io_error_detected,
}; };
...@@ -190,6 +199,7 @@ static struct pci_driver qede_pci_driver = { ...@@ -190,6 +199,7 @@ static struct pci_driver qede_pci_driver = {
.sriov_configure = qede_sriov_configure, .sriov_configure = qede_sriov_configure,
#endif #endif
.err_handler = &qede_err_handler, .err_handler = &qede_err_handler,
.driver.pm = &qede_pm_ops,
}; };
static struct qed_eth_cb_ops qede_ll_ops = { static struct qed_eth_cb_ops qede_ll_ops = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment