| From 0000000000000000000000000000000000000000 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: [PATCH 4/5] scsi: aacraid: Fix controller initialization failure |
| |
| 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. |
| |
| Cc: <stable@vger.kernel.org> |
| 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> |
| (cherry picked from commit 45348de2c8a7a1e64c5be27b22c9786b4152dd41) |
| Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com> |
| --- |
| drivers/scsi/aacraid/comminit.c | 8 +++++--- |
| drivers/scsi/aacraid/linit.c | 7 ++++++- |
| 2 files changed, 11 insertions(+), 4 deletions(-) |
| |
| diff --git a/drivers/scsi/aacraid/comminit.c b/drivers/scsi/aacraid/comminit.c |
| index 9ee025b1d0e0..289b6fe306fd 100644 |
| --- a/drivers/scsi/aacraid/comminit.c |
| +++ b/drivers/scsi/aacraid/comminit.c |
| @@ -302,9 +302,11 @@ int aac_send_shutdown(struct aac_dev * dev) |
| 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); |
| diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c |
| index 0f277df73af0..231bd3345f44 100644 |
| --- a/drivers/scsi/aacraid/linit.c |
| +++ b/drivers/scsi/aacraid/linit.c |
| @@ -1401,8 +1401,9 @@ static void __aac_shutdown(struct aac_dev * aac) |
| { |
| 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_dev * aac) |
| } |
| 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++) { |