From 1926c1efb51d5843a259554bc4c9cc5e8d53f79a Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 27 Feb 2020 13:57:24 +0100 Subject: [PATCH] 5.4-stable patches added patches: ata-ahci-add-shutdown-to-freeze-hardware-resources-of-ahci.patch --- ...to-freeze-hardware-resources-of-ahci.patch | 105 ++++++++++++++++++ queue-5.4/series | 1 + 2 files changed, 106 insertions(+) create mode 100644 queue-5.4/ata-ahci-add-shutdown-to-freeze-hardware-resources-of-ahci.patch diff --git a/queue-5.4/ata-ahci-add-shutdown-to-freeze-hardware-resources-of-ahci.patch b/queue-5.4/ata-ahci-add-shutdown-to-freeze-hardware-resources-of-ahci.patch new file mode 100644 index 00000000000..64262d12821 --- /dev/null +++ b/queue-5.4/ata-ahci-add-shutdown-to-freeze-hardware-resources-of-ahci.patch @@ -0,0 +1,105 @@ +From 10a663a1b15134a5a714aa515e11425a44d4fdf7 Mon Sep 17 00:00:00 2001 +From: Prabhakar Kushwaha +Date: Sat, 25 Jan 2020 03:37:29 +0000 +Subject: ata: ahci: Add shutdown to freeze hardware resources of ahci + +From: Prabhakar Kushwaha + +commit 10a663a1b15134a5a714aa515e11425a44d4fdf7 upstream. + +device_shutdown() called from reboot or power_shutdown expect +all devices to be shutdown. Same is true for even ahci pci driver. +As no ahci shutdown function is implemented, the ata subsystem +always remains alive with DMA & interrupt support. File system +related calls should not be honored after device_shutdown(). + +So defining ahci pci driver shutdown to freeze hardware (mask +interrupt, stop DMA engine and free DMA resources). + +Signed-off-by: Prabhakar Kushwaha +Signed-off-by: Jens Axboe +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/ata/ahci.c | 7 +++++++ + drivers/ata/libata-core.c | 21 +++++++++++++++++++++ + include/linux/libata.h | 1 + + 3 files changed, 29 insertions(+) + +--- a/drivers/ata/ahci.c ++++ b/drivers/ata/ahci.c +@@ -80,6 +80,7 @@ enum board_ids { + + static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); + static void ahci_remove_one(struct pci_dev *dev); ++static void ahci_shutdown_one(struct pci_dev *dev); + static int ahci_vt8251_hardreset(struct ata_link *link, unsigned int *class, + unsigned long deadline); + static int ahci_avn_hardreset(struct ata_link *link, unsigned int *class, +@@ -593,6 +594,7 @@ static struct pci_driver ahci_pci_driver + .id_table = ahci_pci_tbl, + .probe = ahci_init_one, + .remove = ahci_remove_one, ++ .shutdown = ahci_shutdown_one, + .driver = { + .pm = &ahci_pci_pm_ops, + }, +@@ -1864,6 +1866,11 @@ static int ahci_init_one(struct pci_dev + return 0; + } + ++static void ahci_shutdown_one(struct pci_dev *pdev) ++{ ++ ata_pci_shutdown_one(pdev); ++} ++ + static void ahci_remove_one(struct pci_dev *pdev) + { + pm_runtime_get_noresume(&pdev->dev); +--- a/drivers/ata/libata-core.c ++++ b/drivers/ata/libata-core.c +@@ -6762,6 +6762,26 @@ void ata_pci_remove_one(struct pci_dev * + ata_host_detach(host); + } + ++void ata_pci_shutdown_one(struct pci_dev *pdev) ++{ ++ struct ata_host *host = pci_get_drvdata(pdev); ++ int i; ++ ++ for (i = 0; i < host->n_ports; i++) { ++ struct ata_port *ap = host->ports[i]; ++ ++ ap->pflags |= ATA_PFLAG_FROZEN; ++ ++ /* Disable port interrupts */ ++ if (ap->ops->freeze) ++ ap->ops->freeze(ap); ++ ++ /* Stop the port DMA engines */ ++ if (ap->ops->port_stop) ++ ap->ops->port_stop(ap); ++ } ++} ++ + /* move to PCI subsystem */ + int pci_test_config_bits(struct pci_dev *pdev, const struct pci_bits *bits) + { +@@ -7382,6 +7402,7 @@ EXPORT_SYMBOL_GPL(ata_timing_cycle2mode) + + #ifdef CONFIG_PCI + EXPORT_SYMBOL_GPL(pci_test_config_bits); ++EXPORT_SYMBOL_GPL(ata_pci_shutdown_one); + EXPORT_SYMBOL_GPL(ata_pci_remove_one); + #ifdef CONFIG_PM + EXPORT_SYMBOL_GPL(ata_pci_device_do_suspend); +--- a/include/linux/libata.h ++++ b/include/linux/libata.h +@@ -1220,6 +1220,7 @@ struct pci_bits { + }; + + extern int pci_test_config_bits(struct pci_dev *pdev, const struct pci_bits *bits); ++extern void ata_pci_shutdown_one(struct pci_dev *pdev); + extern void ata_pci_remove_one(struct pci_dev *pdev); + + #ifdef CONFIG_PM diff --git a/queue-5.4/series b/queue-5.4/series index 9fac07fce39..31571236614 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -125,3 +125,4 @@ alsa-seq-fix-concurrent-access-to-queue-current-tick-time.patch netfilter-xt_hashlimit-limit-the-max-size-of-hashtable.patch rxrpc-fix-call-rcu-cleanup-using-non-bh-safe-locks.patch io_uring-prevent-sq_thread-from-spinning-when-it-should-stop.patch +ata-ahci-add-shutdown-to-freeze-hardware-resources-of-ahci.patch -- 2.47.3