[<prev] [next>] [day] [month] [year] [list]
Message-Id: <1464956051-16930-1-git-send-email-ch1102chiou@gmail.com>
Date: Fri, 3 Jun 2016 20:14:11 +0800
From: Charles Chiou <ch1102chiou@...il.com>
To: jejb@...ux.vnet.ibm.com, martin.petersen@...cle.com,
linux-scsi@...r.kernel.org, linux-kernel@...r.kernel.org,
linus.chen@...promise.com, grace.chang@...promise.com,
victor.p@...mise.com, eva.cheng@...promise.com,
charles.chiou@...promise.com
Cc: Paul <paul.lyu@...promise.com>
Subject: [PATCH 5/5] Add P3 support, acpi s5 & s6
From: Paul <paul.lyu@...promise.com>
1.Add reboot notifier
2.Register reboot notifier in probe
3.Reboot set a flag for shutdown callback
Signed-off-by: Paul <paul.lyu@...promise.com>
---
drivers/scsi/stex.c | 27 ++++++++++++++++++++++++---
1 file changed, 24 insertions(+), 3 deletions(-)
diff --git a/drivers/scsi/stex.c b/drivers/scsi/stex.c
index b18c434..9de2de2 100644
--- a/drivers/scsi/stex.c
+++ b/drivers/scsi/stex.c
@@ -26,6 +26,7 @@
#include <linux/module.h>
#include <linux/spinlock.h>
#include <linux/ktime.h>
+#include <linux/reboot.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/byteorder.h>
@@ -362,6 +363,12 @@ struct st_card_info {
u16 sts_count;
};
+int S6flag;
+static int stex_halt(struct notifier_block *nb, ulong event, void *buf);
+static struct notifier_block stex_notifier = {
+ stex_halt, NULL, 0
+};
+
static int msi;
module_param(msi, int, 0);
MODULE_PARM_DESC(msi, "Enable Message Signaled Interrupts(0=off, 1=on)");
@@ -1669,6 +1676,9 @@ static int stex_probe(struct pci_dev *pdev, const struct pci_device_id *id)
pci_set_master(pdev);
+ S6flag = 0;
+ register_reboot_notifier(&stex_notifier);
+
host = scsi_host_alloc(&driver_template, sizeof(struct st_hba));
if (!host) {
@@ -1944,15 +1954,19 @@ static void stex_remove(struct pci_dev *pdev)
scsi_host_put(hba->host);
pci_disable_device(pdev);
+
+ unregister_reboot_notifier(&stex_notifier);
}
static void stex_shutdown(struct pci_dev *pdev)
{
struct st_hba *hba = pci_get_drvdata(pdev);
-
- if (hba->supports_pm == 0)
+ if (hba->supports_pm == 0) {
stex_hba_stop(hba, ST_IGNORED);
- else
+ } else if (hba->supports_pm == 1 && S6flag) {
+ unregister_reboot_notifier(&stex_notifier);
+ stex_hba_stop(hba, ST_S6);
+ } else
stex_hba_stop(hba, ST_S5);
}
@@ -1989,6 +2003,13 @@ static int stex_resume(struct pci_dev *pdev)
stex_handshake(hba);
return 0;
}
+
+static int stex_halt(struct notifier_block *nb, unsigned long event, void *buf)
+{
+ S6flag = 1;
+ return NOTIFY_OK;
+}
+
MODULE_DEVICE_TABLE(pci, stex_pci_tbl);
static struct pci_driver stex_pci_driver = {
--
1.9.1
Powered by blists - more mailing lists