From patchwork Thu Oct 20 09:05:01 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sumit Saxena X-Patchwork-Id: 9386357 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 2ACD7607F0 for ; Thu, 20 Oct 2016 09:05:29 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1A45C29B11 for ; Thu, 20 Oct 2016 09:05:29 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0F56E29B5D; Thu, 20 Oct 2016 09:05:29 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9AE1229B58 for ; Thu, 20 Oct 2016 09:05:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757384AbcJTJF0 (ORCPT ); Thu, 20 Oct 2016 05:05:26 -0400 Received: from mail-pf0-f177.google.com ([209.85.192.177]:33246 "EHLO mail-pf0-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755605AbcJTJFY (ORCPT ); Thu, 20 Oct 2016 05:05:24 -0400 Received: by mail-pf0-f177.google.com with SMTP id 128so32891318pfz.0 for ; Thu, 20 Oct 2016 02:05:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=DhfIjwAjMO7kbKrrvbdyZWsiOeWSU5+c28c1gZ01S1s=; b=CvWC47uEr8Xo8/P4k5DZafoTtbTf2EFKFSajwnK7XZHYSt9ZqN9Jo9gmQ81m/FJm0n ie0MWVVSzDJhmGGpJHDLrYOdnYH7g12T52x0onpRdf74+/Yw+ij+aFSgFXnnfMQWya70 bMpuYaNh9lYYEmDVzjs4X7/tvxP5YhN++WDcY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=DhfIjwAjMO7kbKrrvbdyZWsiOeWSU5+c28c1gZ01S1s=; b=P3YG/e8t8ab0/u1YTnh2XY+KdXofxC8e7v06ocNrSq4pzjdRF7TUducvyqFgBrIa6v 0v4GROW3XzYJaoDufCV58+LAUnlrTd+a9hnHIZZ+7L54Z9BIy29adVq5WaoR2tjDyADz 1SBhSUclk8IXbYvotyshgMW/meJUD5K6UzWK+a56CKCaJG2yhswSKeKXJQNNc5rK6Cyi m5DNDZISdaWgPJaanRHU1d63bgNUkL2IMLanOQIRxd3P+nptVEwL8dCjei8YcPYFgCTA hMWGu2MI1czhxD0RwUFgC9TS/QtXq2Cuzy97OZbtXGFgPE2aVWmq4pOX1mUZxh8c2i1v bt4g== X-Gm-Message-State: AA6/9RkRvaSPdRMnoZZAbLc7ELQNPL2gXQU3QPDmlDr9s1KFW2aSe5Bh0Jz0ZwtSZhDOFHAZ X-Received: by 10.98.97.68 with SMTP id v65mr19481486pfb.81.1476954323028; Thu, 20 Oct 2016 02:05:23 -0700 (PDT) Received: from dhcp-135-24-192-142.localdomain ([192.19.239.250]) by smtp.gmail.com with ESMTPSA id 136sm69738199pfu.87.2016.10.20.02.05.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 20 Oct 2016 02:05:22 -0700 (PDT) From: Sumit Saxena To: linux-scsi@vger.kernel.org Cc: martin.petersen@oracle.com, thenzl@redhat.com, jejb@linux.vnet.ibm.com, kashyap.desai@broadcom.com, Sumit Saxena , Shivasharan Srikanteshwara Subject: [PATCH v2 3/7] megaraid_sas: Do not fire DCMDs during PCI shutdown/detach Date: Thu, 20 Oct 2016 02:05:01 -0700 Message-Id: <1476954305-576-4-git-send-email-sumit.saxena@broadcom.com> X-Mailer: git-send-email 2.4.3 In-Reply-To: <1476954305-576-1-git-send-email-sumit.saxena@broadcom.com> References: <1476954305-576-1-git-send-email-sumit.saxena@broadcom.com> Sender: linux-scsi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This patch addresses the issue of driver firing DCMDs in PCI shutdown/detach path irrespective of firmware state. Driver will check for whether firmware is operational state or not before firing DCMDs. If firmware is in unrecoverbale state or does not become operational within specfied time, driver will skip firing DCMDs. Signed-off-by: Sumit Saxena Signed-off-by: Shivasharan Srikanteshwara --- drivers/scsi/megaraid/megaraid_sas_base.c | 39 +++++++++++++++++++++++++++++ drivers/scsi/megaraid/megaraid_sas_fusion.c | 9 ++++--- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c index 9ff57de..3236632 100644 --- a/drivers/scsi/megaraid/megaraid_sas_base.c +++ b/drivers/scsi/megaraid/megaraid_sas_base.c @@ -6248,6 +6248,34 @@ static void megasas_shutdown_controller(struct megasas_instance *instance, #define megasas_resume NULL #endif +static inline int +megasas_wait_for_adapter_operational(struct megasas_instance *instance) +{ + int wait_time = MEGASAS_RESET_WAIT_TIME * 2; + int i; + + if (atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) + return 1; + + for (i = 0; i < wait_time; i++) { + if (atomic_read(&instance->adprecovery) == MEGASAS_HBA_OPERATIONAL) + break; + + if (!(i % MEGASAS_RESET_NOTICE_INTERVAL)) + dev_notice(&instance->pdev->dev, "waiting for controller reset to finish\n"); + + msleep(1000); + } + + if (atomic_read(&instance->adprecovery) != MEGASAS_HBA_OPERATIONAL) { + dev_info(&instance->pdev->dev, "%s timed out while waiting for HBA to recover.\n", + __func__); + return 1; + } + + return 0; +} + /** * megasas_detach_one - PCI hot"un"plug entry point * @pdev: PCI device structure @@ -6272,9 +6300,14 @@ static void megasas_detach_one(struct pci_dev *pdev) if (instance->fw_crash_state != UNAVAILABLE) megasas_free_host_crash_buffer(instance); scsi_remove_host(instance->host); + + if (megasas_wait_for_adapter_operational(instance)) + goto skip_firing_dcmds; + megasas_flush_cache(instance); megasas_shutdown_controller(instance, MR_DCMD_CTRL_SHUTDOWN); +skip_firing_dcmds: /* cancel the delayed work if this work still in queue*/ if (instance->ev != NULL) { struct megasas_aen_event *ev = instance->ev; @@ -6388,8 +6421,14 @@ static void megasas_shutdown(struct pci_dev *pdev) struct megasas_instance *instance = pci_get_drvdata(pdev); instance->unload = 1; + + if (megasas_wait_for_adapter_operational(instance)) + goto skip_firing_dcmds; + megasas_flush_cache(instance); megasas_shutdown_controller(instance, MR_DCMD_CTRL_SHUTDOWN); + +skip_firing_dcmds: instance->instancet->disable_intr(instance); megasas_destroy_irqs(instance); diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c b/drivers/scsi/megaraid/megaraid_sas_fusion.c index 61be7ed..2159f6a 100644 --- a/drivers/scsi/megaraid/megaraid_sas_fusion.c +++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c @@ -2463,12 +2463,15 @@ irqreturn_t megasas_isr_fusion(int irq, void *devp) /* Start collecting crash, if DMA bit is done */ if ((fw_state == MFI_STATE_FAULT) && dma_state) schedule_work(&instance->crash_init); - else if (fw_state == MFI_STATE_FAULT) - schedule_work(&instance->work_init); + else if (fw_state == MFI_STATE_FAULT) { + if (instance->unload == 0) + schedule_work(&instance->work_init); + } } else if (fw_state == MFI_STATE_FAULT) { dev_warn(&instance->pdev->dev, "Iop2SysDoorbellInt" "for scsi%d\n", instance->host->host_no); - schedule_work(&instance->work_init); + if (instance->unload == 0) + schedule_work(&instance->work_init); } }