Skip to contentSkip to conversation

scsi:stex.c Add reboot support

PATCH Superseded Charles Chiou 2 participants 6 messages Dec 16, 2014 – Dec 30, 2014 SCSI

v3 of 4 Superseded Latest is v4 →

lore
Share & tools
lore
#0 lore raw

PATCH v3 3/4 scsi:stex.c Add reboot support

From 72f5b5cbda424a254b0e9672bd4d9d249728fcb9 Mon Sep 17 00:00:00 2001
From: Charles Chiou <[email protected]>
Date: Wed, 5 Nov 2014 19:29:46 +0800
Subject: [PATCH 3/4] scsi:stex.c Add reboot support

1. Add reboot support, Pegasus devices should be notified that the host is going to shut down/reboot. I register reboot callback function to distinct host is going to shut down or to reboot.

2. Pegasus FW shutdown flow is sensitive to host behavior (host is going to S3/S4/shut down/reboot). To this end, I add one argument in stex_hba_stop to support various stop command.

Signed-off-by [email protected]
---
 drivers/scsi/stex.c | 46 ++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 42 insertions(+), 4 deletions(-)
drivers/scsi/stex.c +42 -4
index 7dc6afe..a536cfb 100644
@@ -24,6 +24,7 @@
 #include <linux/interrupt.h>
 #include <linux/types.h>
 #include <linux/module.h>
+#include <linux/reboot.h>
 #include <linux/spinlock.h>
 #include <asm/io.h>
 #include <asm/irq.h>
@@ -166,6 +167,13 @@ enum {
 
 	ST_ADDITIONAL_MEM			= 0x200000,
 	ST_ADDITIONAL_MEM_MIN			= 0x80000,
+	PMIC_SHUTDOWN				= 0x0D,
+	PMIC_REUMSE					= 0x10,
+	ST_IGNORED					= -1,
+	ST_S3						= 3,
+	ST_S4						= 4,
+	ST_S5						= 5,
+	ST_S6						= 6,
 };
 
 struct st_sgitem {
@@ -344,6 +352,7 @@ struct st_card_info {
 	u16 sts_count;
 };
 
+static int reboot;
 static int msi;
 module_param(msi, int, 0);
 MODULE_PARM_DESC(msi, "Enable Message Signaled Interrupts(0=off, 1=on)");
@@ -364,6 +373,14 @@ MODULE_AUTHOR("Ed Lin");
 MODULE_DESCRIPTION("Promise Technology SuperTrak EX Controllers");
 MODULE_LICENSE("GPL");
 MODULE_VERSION(ST_DRIVER_VERSION);
+static int stex_reboot_callback(struct notifier_block *self,
+							  unsigned long val,
+							  void *data)
+{
+	if (val == SYS_RESTART)
+		reboot = 1;
+	return NOTIFY_OK;
+}
 
 static void stex_gettime(__le64 *time)
 {
@@ -1562,6 +1579,7 @@ static int stex_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 	u32 sts_offset, cp_offset, scratch_offset;
 	int err;
 
+	reboot = 0;
 	err = pci_enable_device(pdev);
 	if (err)
 		return err;
@@ -1755,7 +1773,7 @@ out_disable:
 	return err;
 }
 
-static void stex_hba_stop(struct st_hba *hba)
+static void stex_hba_stop(struct st_hba *hba, int st_sleep_mic)
 {
 	struct req_msg *req;
 	struct st_msg_header *msg_h;
@@ -1771,11 +1789,18 @@ static void stex_hba_stop(struct st_hba *hba)
 	} else
 		memset(req, 0, hba->rq_size);
 
-	if (hba->cardtype == st_yosemite || hba->cardtype == st_yel) {
+	if ((hba->cardtype == st_yosemite || hba->cardtype == st_yel)
+		&& st_sleep_mic == ST_IGNORED) {
 		req->cdb[0] = MGT_CMD;
 		req->cdb[1] = MGT_CMD_SIGNATURE;
 		req->cdb[2] = CTLR_CONFIG_CMD;
 		req->cdb[3] = CTLR_SHUTDOWN;
+	} else if (hba->cardtype == st_yel && st_sleep_mic != ST_IGNORED) {
+		req->cdb[0] = MGT_CMD;
+		req->cdb[1] = MGT_CMD_SIGNATURE;
+		req->cdb[2] = CTLR_CONFIG_CMD;
+		req->cdb[3] = PMIC_SHUTDOWN;
+		req->cdb[4] = st_sleep_mic;
 	} else {
 		req->cdb[0] = CONTROLLER_CMD;
 		req->cdb[1] = CTLR_POWER_STATE_CHANGE;
@@ -1795,10 +1820,12 @@ static void stex_hba_stop(struct st_hba *hba)
 	while (hba->ccb[tag].req_type & PASSTHRU_REQ_TYPE) {
 		if (time_after(jiffies, before + ST_INTERNAL_TIMEOUT * HZ)) {
 			hba->ccb[tag].req_type = 0;
+			hba->mu_status = MU_STATE_STOP;
 			return;
 		}
 		msleep(1);
 	}
+	hba->mu_status = MU_STATE_STOP;
 }
 
 static void stex_hba_free(struct st_hba *hba)
@@ -1838,7 +1865,14 @@ static void stex_shutdown(struct pci_dev *pdev)
 {
 	struct st_hba *hba = pci_get_drvdata(pdev);
 
-	stex_hba_stop(hba);
+	if (hba->supports_pm == 0)
+		stex_hba_stop(hba, ST_IGNORED);
+	else {
+		if (reboot)
+			stex_hba_stop(hba, ST_S6);
+		else
+			stex_hba_stop(hba, ST_S5);
+	}
 }
 
 MODULE_DEVICE_TABLE(pci, stex_pci_tbl);
@@ -1851,18 +1885,22 @@ static struct pci_driver stex_pci_driver = {
 	.shutdown	= stex_shutdown,
 };
 
+static struct notifier_block stex_reboot_notifier = {
+	stex_reboot_callback, NULL, 0
+};
 static int __init stex_init(void)
 {
 	printk(KERN_INFO DRV_NAME
 		": Promise SuperTrak EX Driver version: %s\n",
 		 ST_DRIVER_VERSION);
-
+	register_reboot_notifier(&stex_reboot_notifier);
 	return pci_register_driver(&stex_pci_driver);
 }
 
 static void __exit stex_exit(void)
 {
 	pci_unregister_driver(&stex_pci_driver);
+	unregister_reboot_notifier(&stex_reboot_notifier);
 }
 
 module_init(stex_init);
Signature · 1 line
1.9.1
#1 lore raw

I'm not going to add a new reboot notifier for a driver. If you can convince the driver model / PM people to pass this information to ->shutdown we can add support for this difference, but not in this way.

Can you send me a series that just adds the hardware support for now, so we can dash this PM issue out separately?

#2 lore raw
Quoted 7 lines · Christoph Hellwig

I'm not going to add a new reboot notifier for a driver. If you can convince the driver model / PM people to pass this information to ->shutdown we can add support for this difference, but not in this way.

Can you send me a series that just adds the hardware support for now, so we can dash this PM issue out separately?

Hi, we need to provide this information to our device.
We face the HW signal issue on various motherboards.
We experiment on many motherboards, and we observe that the restart signal is different on different motherboard. If device misses the signal, PCI loss or volume disappearance might happen.

To make power management easier, driver provide the shutdown or reboot information to the device.

Sorry, I'm not understand what is meaning of "series". Could you specify what you what me to send you? Thank you

BRS
Charles

#3 lore raw
Quoted 21 lines · Charles Chiou
Quoted 7 lines · Christoph Hellwig

I'm not going to add a new reboot notifier for a driver. If you can convince the driver model / PM people to pass this information to ->shutdown we can add support for this difference, but not in this way.

Can you send me a series that just adds the hardware support for now, so we can dash this PM issue out separately?

Hi, we need to provide this information to our device. We face the HW signal issue on various motherboards.
We experiment on many motherboards, and we observe that the restart signal is different on different motherboard. If device misses the signal, PCI loss or volume disappearance might happen.

To make power management easier, driver provide the shutdown or reboot information to the device.

Quoted 7 lines

Sorry, I'm not understand what is meaning of "series". Could you specify what you what me to send you? Thank you

BRS
Charles

Hi, after our internal discussion, we can use shutdown flow for reboot temporarily. Some signal issue will happen (depend on MB), and it can be fixed by plug in and plug out manually. We will add reboot feature after PM can pass reboot information to ->shutdown.

BRS
Charles

#5 lore raw
In reply to Charles Chiou
Quoted 2 lines · Charles Chiou

Sorry, I'm not understand what is meaning of "series". Could you specify what you what me to send you?

Series means a set of patches, e.g. all the ones you send.

Talking about patches series it would be very helpful if you send the actual patches as replies to the [PATCH 0/n] introduction mail. The git-send-email tool is a great way to do this automatically.

#4 lore raw
In reply to Charles Chiou
Quoted 4 lines · Charles Chiou

Hi, after our internal discussion, we can use shutdown flow for reboot temporarily. Some signal issue will happen (depend on MB), and it can be fixed by plug in and plug out manually. We will add reboot feature after PM can pass reboot information to ->shutdown.

Thanks. Please send the updated patch series to the list.

Note that you should also try to pass the information you need through proper channels, e.g. adding an argument to the ->shutdown method. Please send this to the linux-pm ad linux-kernel lists.