From patchwork Mon Oct 17 10:24:06 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sumit Saxena X-Patchwork-Id: 9378895 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 1545560780 for ; Mon, 17 Oct 2016 10:24:32 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 072FB2912D for ; Mon, 17 Oct 2016 10:24:32 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id EFF5529132; Mon, 17 Oct 2016 10:24:31 +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 8D62E2912D for ; Mon, 17 Oct 2016 10:24:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934293AbcJQKYb (ORCPT ); Mon, 17 Oct 2016 06:24:31 -0400 Received: from mail-pa0-f54.google.com ([209.85.220.54]:35913 "EHLO mail-pa0-f54.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933510AbcJQKYa (ORCPT ); Mon, 17 Oct 2016 06:24:30 -0400 Received: by mail-pa0-f54.google.com with SMTP id ry6so62359213pac.3 for ; Mon, 17 Oct 2016 03:24:30 -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=TD1FNrBMxTGuKqCR1+FMu3op2HrC9G6wLi9/0M0u5oU=; b=HE8sPzvEmlzOH9TGWs4jZOKwkth5WMtSspSpsqrB6xUwgsaAAhk8+6yszSkR5AJAlF sWfgA6sghp3bTcuRy6Hhnse4HYJNPOFWnuptQNMUwLYD/SicvHtBSt8gJOxseB48e79Z Rn7V1gECR3N3z6XitvbsE49V5UFgJifaFSjdY= 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=TD1FNrBMxTGuKqCR1+FMu3op2HrC9G6wLi9/0M0u5oU=; b=k7V5xRbYCmhx2XF/d5f2j1PVQb076M+hlXmj54tF637wSQyuxN+SJEAwg3olYevlO2 nIcR9CzoZyQKpX1EGn1a6EpadS38Wp6mGVDGXMLubJ/eEl+RWDnDYUqLBAr32BxZdz19 XyR42XZzfNI/wUiLpsflGpinMiqErOyhPfG/LAI04YSurCQbRSsH67myqjTtdkpVi+jC t7Be3IsT8CqpVih+jyY0YqQTAMukymDMoJ0n7gmMsyyes2tBXjoaALm9okFdFJI69+AI fA6RjMSaWH80EAiTjbVt3h9eiEBRUJrVFkwal5b9XF2XUBYjVWsjw10cyKL0cGb5XZ6R XWbQ== X-Gm-Message-State: AA6/9RnvdJLuQC8XHgmYc7ut8MfE5n7L1nriUgYDgf20Ej/PQ+dkcvVamDTxmfWSN3fXbT47 X-Received: by 10.66.233.36 with SMTP id tt4mr30564051pac.89.1476699869561; Mon, 17 Oct 2016 03:24:29 -0700 (PDT) Received: from dhcp-135-24-192-142.localdomain ([192.19.239.250]) by smtp.gmail.com with ESMTPSA id dj3sm36203777pad.1.2016.10.17.03.24.27 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 17 Oct 2016 03:24:29 -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 Subject: [PATCH 3/7] megaraid_sas: Do not fire DCMDs during PCI shutdown/detach Date: Mon, 17 Oct 2016 03:24:06 -0700 Message-Id: <1476699850-25083-4-git-send-email-sumit.saxena@broadcom.com> X-Mailer: git-send-email 2.4.3 In-Reply-To: <1476699850-25083-1-git-send-email-sumit.saxena@broadcom.com> References: <1476699850-25083-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 --- drivers/scsi/megaraid/megaraid_sas_base.c | 46 +++++++++++++++++++++++++++++ drivers/scsi/megaraid/megaraid_sas_fusion.c | 9 ++++-- 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c index 9ff57de..092387f 100644 --- a/drivers/scsi/megaraid/megaraid_sas_base.c +++ b/drivers/scsi/megaraid/megaraid_sas_base.c @@ -6248,6 +6248,32 @@ fail_reenable_msix: #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; + + 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 +6298,18 @@ 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); + + msleep(1000); + if ((atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) + || ((atomic_read(&instance->adprecovery) + != MEGASAS_HBA_OPERATIONAL) && + 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 +6423,19 @@ static void megasas_shutdown(struct pci_dev *pdev) struct megasas_instance *instance = pci_get_drvdata(pdev); instance->unload = 1; + + msleep(1000); + + if ((atomic_read(&instance->adprecovery) == MEGASAS_HW_CRITICAL_ERROR) + || ((atomic_read(&instance->adprecovery) + != MEGASAS_HBA_OPERATIONAL) + && 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); } }