| From 45348de2c8a7a1e64c5be27b22c9786b4152dd41 Mon Sep 17 00:00:00 2001 |
| From: Raghava Aditya Renukunta <RaghavaAditya.Renukunta@microsemi.com> |
| Date: Mon, 16 Oct 2017 17:22:31 -0700 |
| Subject: scsi: aacraid: Fix controller initialization failure |
| |
| From: Raghava Aditya Renukunta <RaghavaAditya.Renukunta@microsemi.com> |
| |
| commit 45348de2c8a7a1e64c5be27b22c9786b4152dd41 upstream. |
| |
| This is a fix to an issue where the driver sends its periodic WELLNESS |
| command to the controller after the driver shut it down.This causes the |
| controller to crash. The window where this can happen is small, but it |
| can be hit at around 4 hours of constant resets. |
| |
| Fixes: fbd185986eba (aacraid: Fix AIF triggered IOP_RESET) |
| Signed-off-by: Raghava Aditya Renukunta <RaghavaAditya.Renukunta@microsemi.com> |
| Reviewed-by: Dave Carroll <david.carroll@microsemi.com> |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/scsi/aacraid/comminit.c | 8 +++++--- |
| drivers/scsi/aacraid/linit.c | 7 ++++++- |
| 2 files changed, 11 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/scsi/aacraid/comminit.c |
| +++ b/drivers/scsi/aacraid/comminit.c |
| @@ -302,9 +302,11 @@ int aac_send_shutdown(struct aac_dev * d |
| return -ENOMEM; |
| aac_fib_init(fibctx); |
| |
| - mutex_lock(&dev->ioctl_mutex); |
| - dev->adapter_shutdown = 1; |
| - mutex_unlock(&dev->ioctl_mutex); |
| + if (!dev->adapter_shutdown) { |
| + mutex_lock(&dev->ioctl_mutex); |
| + dev->adapter_shutdown = 1; |
| + mutex_unlock(&dev->ioctl_mutex); |
| + } |
| |
| cmd = (struct aac_close *) fib_data(fibctx); |
| cmd->command = cpu_to_le32(VM_CloseAll); |
| --- a/drivers/scsi/aacraid/linit.c |
| +++ b/drivers/scsi/aacraid/linit.c |
| @@ -1401,8 +1401,9 @@ static void __aac_shutdown(struct aac_de |
| { |
| int i; |
| |
| + mutex_lock(&aac->ioctl_mutex); |
| aac->adapter_shutdown = 1; |
| - aac_send_shutdown(aac); |
| + mutex_unlock(&aac->ioctl_mutex); |
| |
| if (aac->aif_thread) { |
| int i; |
| @@ -1415,7 +1416,11 @@ static void __aac_shutdown(struct aac_de |
| } |
| kthread_stop(aac->thread); |
| } |
| + |
| + aac_send_shutdown(aac); |
| + |
| aac_adapter_disable_int(aac); |
| + |
| if (aac_is_src(aac)) { |
| if (aac->max_msix > 1) { |
| for (i = 0; i < aac->max_msix; i++) { |