From: Brian King <brking@us.ibm.com>
To: Mark Haverkamp <markh@osdl.org>
Cc: James Bottomley <James.Bottomley@steeleye.com>,
Mark Salyzyn <mark_salyzyn@adaptec.com>,
linux-scsi <linux-scsi@vger.kernel.org>
Subject: Re: [PATCH] 2.6 aacraid: shutdown notification
Date: Fri, 24 Jun 2005 15:30:39 -0500 [thread overview]
Message-ID: <42BC6D6F.5090402@us.ibm.com> (raw)
In-Reply-To: <1119643035.25270.20.camel@markh1.pdx.osdl.net>
The pci_driver->shutdown method should be used instead of registering
a reboot notifier.
Brian
Mark Haverkamp wrote:
> Received from Mark Salyzyn at Adaptec
>
> Add in reboot notification so that the adapter shuts down correctly and
> flushes its cache. Shutdown should also disable the adapter's interrupt
> when shutdown (in particularly if the driver is rmmod'd) to prevent
> spurious hardware activities.
>
>
> Patch against scsi-misc-2.6 git tree.
>
> Signed-off-by: Mark Haverkamp <markh@osdl.org>
>
> aacraid.h | 4 ++++
> linit.c | 28 +++++++++++++++++++++++++++-
> rkt.c | 20 ++++++++++++++++++++
> rx.c | 20 ++++++++++++++++++++
> sa.c | 22 ++++++++++++++++++++--
> 5 files changed, 91 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
> --- a/drivers/scsi/aacraid/aacraid.h
> +++ b/drivers/scsi/aacraid/aacraid.h
> @@ -460,6 +460,7 @@ struct adapter_ops
> {
> void (*adapter_interrupt)(struct aac_dev *dev);
> void (*adapter_notify)(struct aac_dev *dev, u32 event);
> + void (*adapter_disable_int)(struct aac_dev *dev);
> int (*adapter_sync_cmd)(struct aac_dev *dev, u32 command, u32 p1, u32 p2, u32 p3, u32 p4, u32 p5, u32 p6, u32 *status, u32 *r1, u32 *r2, u32 *r3, u32 *r4);
> int (*adapter_check_health)(struct aac_dev *dev);
> };
> @@ -970,6 +971,9 @@ struct aac_dev
> #define aac_adapter_notify(dev, event) \
> (dev)->a_ops.adapter_notify(dev, event)
>
> +#define aac_adapter_disable_int(dev) \
> + (dev)->a_ops.adapter_disable_int(dev)
> +
> #define aac_adapter_sync_cmd(dev, command, p1, p2, p3, p4, p5, p6, status, r1, r2, r3, r4) \
> (dev)->a_ops.adapter_sync_cmd(dev, command, p1, p2, p3, p4, p5, p6, status, r1, r2, r3, r4)
>
> diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
> --- a/drivers/scsi/aacraid/linit.c
> +++ b/drivers/scsi/aacraid/linit.c
> @@ -55,6 +55,7 @@
> #include <scsi/scsi_tcq.h>
> #include <scsi/scsicam.h>
> #include <scsi/scsi_eh.h>
> +#include <linux/reboot.h>
>
> #include "aacraid.h"
>
> @@ -815,11 +816,12 @@ static int __devinit aac_probe_one(struc
>
> return 0;
>
> -out_deinit:
> + out_deinit:
> kill_proc(aac->thread_pid, SIGKILL, 0);
> wait_for_completion(&aac->aif_completion);
>
> aac_send_shutdown(aac);
> + aac_adapter_disable_int(aac);
> fib_map_free(aac);
> pci_free_consistent(aac->pdev, aac->comm_size, aac->comm_addr, aac->comm_phys);
> kfree(aac->queues);
> @@ -847,6 +849,7 @@ static void __devexit aac_remove_one(str
> wait_for_completion(&aac->aif_completion);
>
> aac_send_shutdown(aac);
> + aac_adapter_disable_int(aac);
> fib_map_free(aac);
> pci_free_consistent(aac->pdev, aac->comm_size, aac->comm_addr,
> aac->comm_phys);
> @@ -869,6 +872,26 @@ static struct pci_driver aac_pci_driver
> .remove = __devexit_p(aac_remove_one),
> };
>
> +static int aac_reboot_event(struct notifier_block * n, ulong code, void *p)
> +{
> + if ((code == SYS_RESTART) ||
> + (code == SYS_HALT) ||
> + (code == SYS_POWER_OFF)) {
> + struct aac_dev *aac;
> +
> + list_for_each_entry(aac, &aac_devices, entry)
> + aac_send_shutdown(aac);
> + }
> + return NOTIFY_DONE;
> +}
> +
> +static struct notifier_block aac_reboot_notifier =
> +{
> + aac_reboot_event,
> + NULL,
> + 0
> +};
> +
> static int __init aac_init(void)
> {
> int error;
> @@ -885,12 +908,15 @@ static int __init aac_init(void)
> printk(KERN_WARNING
> "aacraid: unable to register \"aac\" device.\n");
> }
> + register_reboot_notifier(&aac_reboot_notifier);
> +
> return 0;
> }
>
> static void __exit aac_exit(void)
> {
> unregister_chrdev(aac_cfg_major, "aac");
> + unregister_reboot_notifier(&aac_reboot_notifier);
> pci_unregister_driver(&aac_pci_driver);
> }
>
> diff --git a/drivers/scsi/aacraid/rkt.c b/drivers/scsi/aacraid/rkt.c
> --- a/drivers/scsi/aacraid/rkt.c
> +++ b/drivers/scsi/aacraid/rkt.c
> @@ -88,6 +88,16 @@ static irqreturn_t aac_rkt_intr(int irq,
> }
>
> /**
> + * aac_rkt_disable_interrupt - Disable interrupts
> + * @dev: Adapter
> + */
> +
> +static void aac_rkt_disable_interrupt(struct aac_dev *dev)
> +{
> + rkt_writeb(dev, MUnit.OIMR, dev->OIMR = 0xff);
> +}
> +
> +/**
> * rkt_sync_cmd - send a command and wait
> * @dev: Adapter
> * @command: Command to execute
> @@ -412,10 +422,19 @@ int aac_rkt_init(struct aac_dev *dev)
> * Fill in the function dispatch table.
> */
> dev->a_ops.adapter_interrupt = aac_rkt_interrupt_adapter;
> + dev->a_ops.adapter_disable_int = aac_rkt_disable_interrupt;
> dev->a_ops.adapter_notify = aac_rkt_notify_adapter;
> dev->a_ops.adapter_sync_cmd = rkt_sync_cmd;
> dev->a_ops.adapter_check_health = aac_rkt_check_health;
>
> + /*
> + * First clear out all interrupts. Then enable the one's that we
> + * can handle.
> + */
> + rkt_writeb(dev, MUnit.OIMR, 0xff);
> + rkt_writel(dev, MUnit.ODR, 0xffffffff);
> + rkt_writeb(dev, MUnit.OIMR, dev->OIMR = 0xfb);
> +
> if (aac_init_adapter(dev) == NULL)
> goto error_irq;
> /*
> @@ -438,6 +457,7 @@ error_kfree:
> kfree(dev->queues);
>
> error_irq:
> + rkt_writeb(dev, MUnit.OIMR, dev->OIMR = 0xff);
> free_irq(dev->scsi_host_ptr->irq, (void *)dev);
>
> error_iounmap:
> diff --git a/drivers/scsi/aacraid/rx.c b/drivers/scsi/aacraid/rx.c
> --- a/drivers/scsi/aacraid/rx.c
> +++ b/drivers/scsi/aacraid/rx.c
> @@ -88,6 +88,16 @@ static irqreturn_t aac_rx_intr(int irq,
> }
>
> /**
> + * aac_rx_disable_interrupt - Disable interrupts
> + * @dev: Adapter
> + */
> +
> +static void aac_rx_disable_interrupt(struct aac_dev *dev)
> +{
> + rx_writeb(dev, MUnit.OIMR, dev->OIMR = 0xff);
> +}
> +
> +/**
> * rx_sync_cmd - send a command and wait
> * @dev: Adapter
> * @command: Command to execute
> @@ -412,10 +422,19 @@ int aac_rx_init(struct aac_dev *dev)
> * Fill in the function dispatch table.
> */
> dev->a_ops.adapter_interrupt = aac_rx_interrupt_adapter;
> + dev->a_ops.adapter_disable_int = aac_rx_disable_interrupt;
> dev->a_ops.adapter_notify = aac_rx_notify_adapter;
> dev->a_ops.adapter_sync_cmd = rx_sync_cmd;
> dev->a_ops.adapter_check_health = aac_rx_check_health;
>
> + /*
> + * First clear out all interrupts. Then enable the one's that we
> + * can handle.
> + */
> + rx_writeb(dev, MUnit.OIMR, 0xff);
> + rx_writel(dev, MUnit.ODR, 0xffffffff);
> + rx_writeb(dev, MUnit.OIMR, dev->OIMR = 0xfb);
> +
> if (aac_init_adapter(dev) == NULL)
> goto error_irq;
> /*
> @@ -438,6 +457,7 @@ error_kfree:
> kfree(dev->queues);
>
> error_irq:
> + rx_writeb(dev, MUnit.OIMR, dev->OIMR = 0xff);
> free_irq(dev->scsi_host_ptr->irq, (void *)dev);
>
> error_iounmap:
> diff --git a/drivers/scsi/aacraid/sa.c b/drivers/scsi/aacraid/sa.c
> --- a/drivers/scsi/aacraid/sa.c
> +++ b/drivers/scsi/aacraid/sa.c
> @@ -82,6 +82,16 @@ static irqreturn_t aac_sa_intr(int irq,
> }
>
> /**
> + * aac_sa_disable_interrupt - disable interrupt
> + * @dev: Which adapter to enable.
> + */
> +
> +static void aac_sa_disable_interrupt (struct aac_dev *dev)
> +{
> + sa_writew(dev, SaDbCSR.PRISETIRQMASK, 0xffff);
> +}
> +
> +/**
> * aac_sa_notify_adapter - handle adapter notification
> * @dev: Adapter that notification is for
> * @event: Event to notidy
> @@ -214,9 +224,8 @@ static int sa_sync_cmd(struct aac_dev *d
>
> static void aac_sa_interrupt_adapter (struct aac_dev *dev)
> {
> - u32 ret;
> sa_sync_cmd(dev, BREAKPOINT_REQUEST, 0, 0, 0, 0, 0, 0,
> - &ret, NULL, NULL, NULL, NULL);
> + NULL, NULL, NULL, NULL, NULL);
> }
>
> /**
> @@ -352,10 +361,18 @@ int aac_sa_init(struct aac_dev *dev)
> */
>
> dev->a_ops.adapter_interrupt = aac_sa_interrupt_adapter;
> + dev->a_ops.adapter_disable_int = aac_sa_disable_interrupt;
> dev->a_ops.adapter_notify = aac_sa_notify_adapter;
> dev->a_ops.adapter_sync_cmd = sa_sync_cmd;
> dev->a_ops.adapter_check_health = aac_sa_check_health;
>
> + /*
> + * First clear out all interrupts. Then enable the one's that
> + * we can handle.
> + */
> + sa_writew(dev, SaDbCSR.PRISETIRQMASK, 0xffff);
> + sa_writew(dev, SaDbCSR.PRICLEARIRQMASK, (PrintfReady | DOORBELL_1 |
> + DOORBELL_2 | DOORBELL_3 | DOORBELL_4));
>
> if(aac_init_adapter(dev) == NULL)
> goto error_irq;
> @@ -381,6 +398,7 @@ error_kfree:
> kfree(dev->queues);
>
> error_irq:
> + sa_writew(dev, SaDbCSR.PRISETIRQMASK, 0xffff);
> free_irq(dev->scsi_host_ptr->irq, (void *)dev);
>
> error_iounmap:
>
--
Brian King
eServer Storage I/O
IBM Linux Technology Center
prev parent reply other threads:[~2005-06-24 20:30 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-06-24 19:57 [PATCH] 2.6 aacraid: shutdown notification Mark Haverkamp
2005-06-24 20:30 ` Brian King [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=42BC6D6F.5090402@us.ibm.com \
--to=brking@us.ibm.com \
--cc=James.Bottomley@steeleye.com \
--cc=linux-scsi@vger.kernel.org \
--cc=mark_salyzyn@adaptec.com \
--cc=markh@osdl.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox