Message ID | 20230807093725.46829-1-njavali@marvell.com |
---|---|
State | New |
Headers | show |
Series | qedf: fix firmware halt over suspend and resume | expand |
On Mon, 07 Aug 2023 15:07:24 +0530, Nilesh Javali wrote: > While performing certain power-off sequences, PCI drivers are > called to suspend and resume their underlying devices through > PCI PM (power management) interface. However the 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. > > [...] Applied to 6.5/scsi-fixes, thanks! [1/1] qedf: fix firmware halt over suspend and resume https://git.kernel.org/mkp/scsi/c/ef222f551e7c
On Mon, 07 Aug 2023 15:07:25 +0530, Nilesh Javali wrote: > While performing certain power-off sequences, PCI drivers are > called to suspend and resume their underlying devices through > PCI PM (power management) interface. However the 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. > > [...] Applied to 6.5/scsi-fixes, thanks! [1/1] qedi: fix firmware halt over suspend and resume https://git.kernel.org/mkp/scsi/c/1516ee035df3
diff --git a/drivers/scsi/qedf/qedf_main.c b/drivers/scsi/qedf/qedf_main.c index 2a31ddc99dde..7825765c936c 100644 --- a/drivers/scsi/qedf/qedf_main.c +++ b/drivers/scsi/qedf/qedf_main.c @@ -31,6 +31,7 @@ static void qedf_remove(struct pci_dev *pdev); static void qedf_shutdown(struct pci_dev *pdev); static void qedf_schedule_recovery_handler(void *dev); static void qedf_recovery_handler(struct work_struct *work); +static int qedf_suspend(struct pci_dev *pdev, pm_message_t state); /* * Driver module parameters. @@ -3271,6 +3272,7 @@ static struct pci_driver qedf_pci_driver = { .probe = qedf_probe, .remove = qedf_remove, .shutdown = qedf_shutdown, + .suspend = qedf_suspend, }; static int __qedf_probe(struct pci_dev *pdev, int mode) @@ -4000,6 +4002,22 @@ static void qedf_shutdown(struct pci_dev *pdev) __qedf_remove(pdev, QEDF_MODE_NORMAL); } +static int qedf_suspend(struct pci_dev *pdev, pm_message_t state) +{ + struct qedf_ctx *qedf; + + if (!pdev) { + QEDF_ERR(NULL, "pdev is NULL.\n"); + return -ENODEV; + } + + qedf = pci_get_drvdata(pdev); + + QEDF_ERR(&qedf->dbg_ctx, "%s: Device does not support suspend operation\n", __func__); + + return -EPERM; +} + /* * Recovery handler code */