From patchwork Thu Dec 14 20:58:55 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ranjan Kumar X-Patchwork-Id: 13493677 Received: from mail-pf1-f171.google.com (mail-pf1-f171.google.com [209.85.210.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D9BB72DF66 for ; Thu, 14 Dec 2023 21:01:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=broadcom.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=broadcom.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=broadcom.com header.i=@broadcom.com header.b="W3uvO2FP" Received: by mail-pf1-f171.google.com with SMTP id d2e1a72fcca58-6d267461249so584228b3a.3 for ; Thu, 14 Dec 2023 13:01:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1702587662; x=1703192462; darn=vger.kernel.org; h=mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:from:to:cc:subject:date:message-id:reply-to; bh=MdLtQ6r57qyKuA0ogKBq5zfOsRV+jdFJgmY9lNl5pGk=; b=W3uvO2FP410N/DqoU/lUQCVwficRFnDD28lkfXtmqgDJ0YAbCSb+v8mutUdeanZcVc fA7h8cJ4d7Wg+KgedMxxza7eXe3oQMDfhHJKOZ9wYDWAt6kW712/W0ok3IAZib1PlvoV AjE5cebxmqvCz1EZfEMEEiuBYxSrBx2qfccrY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1702587662; x=1703192462; h=mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=MdLtQ6r57qyKuA0ogKBq5zfOsRV+jdFJgmY9lNl5pGk=; b=BSIatwr0RzvHQyU/G/iVRvICRz7DEq5jz01iBwNLh3dnFeyq1W2B0V6jDh62oaYmYE 9AcfykYXRPwpfpv3oNvEdTguv1Td4WJ2tGtuIlx9+ujUNP9bKfqBSltEYqsBQX90QDab 9sAZgpTeHvIDg8O0twPyFmTvj/kFUW3TQ33RVSttB8KzLa2+joJ7vzg6+jOrKsxkTOzR 4vnJC2YZEIJ7AgtGX94Ogbrqlw0NyysBUdzotgpETBLmC5jDTWXehH++n3E3z1/VHuxD HR/bcmLsCJib7Lm9nU1x+DB7leZzG+MtSi4yXdy2rKvZm8AcYSPgbRmxY1rENSH9JCPT s48Q== X-Gm-Message-State: AOJu0Yx/N4WnfnkkLIad4LL825apkCCsj2uhA3xxOHAcNyPjOUyN/Aom b760EDskAJkCmXK/MKunRmMO8O+I6kYHfqZi2X131Cs724QBt6fRauGPKJ7EJmTdvkJSM6QyU/n l35ie3j4GAd1ngSCH0EB3ZT1f8zWHgDgA1xij2WV8qhProkzP8FSqWpvPh90AJGSGXB3UwD/ew6 JMzMd6PAOvOw== X-Google-Smtp-Source: AGHT+IE518HiBlXymt/MejxnVwizYC5xhHPpCrq5UH9/vVHGO01H7bTJu+IivEcNHPhZSKeoSNy4EA== X-Received: by 2002:a05:6a00:4601:b0:6cb:6a27:ab57 with SMTP id ko1-20020a056a00460100b006cb6a27ab57mr5686252pfb.14.1702587662002; Thu, 14 Dec 2023 13:01:02 -0800 (PST) Received: from localhost.localdomain ([192.19.234.250]) by smtp.gmail.com with ESMTPSA id bv190-20020a632ec7000000b005c2967852c5sm11904303pgb.30.2023.12.14.13.00.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 Dec 2023 13:01:01 -0800 (PST) From: Ranjan Kumar To: linux-scsi@vger.kernel.org, martin.petersen@oracle.com Cc: rajsekhar.chundru@broadcom.com, sathya.prakash@broadcom.com, sumit.saxena@broadcom.com, chandrakanth.patil@broadcom.com, prayas.patel@broadcom.com, Ranjan Kumar Subject: [PATCH v2 1/6] mpi3mr: Creation of helper function Date: Fri, 15 Dec 2023 02:28:55 +0530 Message-Id: <20231214205900.270488-2-ranjan.kumar@broadcom.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20231214205900.270488-1-ranjan.kumar@broadcom.com> References: <20231214205900.270488-1-ranjan.kumar@broadcom.com> Precedence: bulk X-Mailing-List: linux-scsi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Use of helper function to get controller and shost details. Signed-off-by: Sathya Prakash Signed-off-by: Ranjan Kumar --- drivers/scsi/mpi3mr/mpi3mr_os.c | 54 ++++++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/drivers/scsi/mpi3mr/mpi3mr_os.c b/drivers/scsi/mpi3mr/mpi3mr_os.c index 1bffd629c124..76ba31a9517d 100644 --- a/drivers/scsi/mpi3mr/mpi3mr_os.c +++ b/drivers/scsi/mpi3mr/mpi3mr_os.c @@ -5230,6 +5230,35 @@ mpi3mr_probe(struct pci_dev *pdev, const struct pci_device_id *id) return retval; } +/** + * mpi3mr_get_shost_and_mrioc - get shost and ioc reference if + * they are valid + * @pdev: PCI device struct + * @shost: address to store scsi host reference + * @mrioc: address store HBA adapter reference + * + * Return: 0 if *shost and *ioc are not NULL otherwise -1. + */ + +static int +mpi3mr_get_shost_and_mrioc(struct pci_dev *pdev, + struct Scsi_Host **shost, struct mpi3mr_ioc **mrioc) +{ + *shost = pci_get_drvdata(pdev); + if (*shost == NULL) { + dev_err(&pdev->dev, "pdev's driver data is null\n"); + return -ENXIO; + } + + *mrioc = shost_priv(*shost); + if (*mrioc == NULL) { + dev_err(&pdev->dev, "shost's private data is null\n"); + *shost = NULL; + return -ENXIO; + } + return 0; +} + /** * mpi3mr_remove - PCI remove callback * @pdev: PCI device instance @@ -5242,7 +5271,7 @@ mpi3mr_probe(struct pci_dev *pdev, const struct pci_device_id *id) */ static void mpi3mr_remove(struct pci_dev *pdev) { - struct Scsi_Host *shost = pci_get_drvdata(pdev); + struct Scsi_Host *shost; struct mpi3mr_ioc *mrioc; struct workqueue_struct *wq; unsigned long flags; @@ -5250,7 +5279,7 @@ static void mpi3mr_remove(struct pci_dev *pdev) struct mpi3mr_hba_port *port, *hba_port_next; struct mpi3mr_sas_node *sas_expander, *sas_expander_next; - if (!shost) + if (mpi3mr_get_shost_and_mrioc(pdev, &shost, &mrioc)) return; mrioc = shost_priv(shost); @@ -5328,12 +5357,12 @@ static void mpi3mr_remove(struct pci_dev *pdev) */ static void mpi3mr_shutdown(struct pci_dev *pdev) { - struct Scsi_Host *shost = pci_get_drvdata(pdev); + struct Scsi_Host *shost; struct mpi3mr_ioc *mrioc; struct workqueue_struct *wq; unsigned long flags; - if (!shost) + if (mpi3mr_get_shost_and_mrioc(pdev, &shost, &mrioc)) return; mrioc = shost_priv(shost); @@ -5361,17 +5390,19 @@ static void mpi3mr_shutdown(struct pci_dev *pdev) * Change the power state to the given value and cleanup the IOC * by issuing MUR and shutdown notification * - * Return: 0 always. + * Return: 0 on success, non-zero on failure */ static int __maybe_unused mpi3mr_suspend(struct device *dev) { struct pci_dev *pdev = to_pci_dev(dev); - struct Scsi_Host *shost = pci_get_drvdata(pdev); + struct Scsi_Host *shost; struct mpi3mr_ioc *mrioc; + int rc; - if (!shost) - return 0; + rc = mpi3mr_get_shost_and_mrioc(pdev, &shost, &mrioc); + if (rc) + return rc; mrioc = shost_priv(shost); while (mrioc->reset_in_progress || mrioc->is_driver_loading) @@ -5402,13 +5433,14 @@ static int __maybe_unused mpi3mr_resume(struct device *dev) { struct pci_dev *pdev = to_pci_dev(dev); - struct Scsi_Host *shost = pci_get_drvdata(pdev); + struct Scsi_Host *shost; struct mpi3mr_ioc *mrioc; pci_power_t device_state = pdev->current_state; int r; - if (!shost) - return 0; + r = mpi3mr_get_shost_and_mrioc(pdev, &shost, &mrioc); + if (r) + return r; mrioc = shost_priv(shost); From patchwork Thu Dec 14 20:58:56 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ranjan Kumar X-Patchwork-Id: 13493678 Received: from mail-oo1-f44.google.com (mail-oo1-f44.google.com [209.85.161.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C726C2BCF9 for ; Thu, 14 Dec 2023 21:01:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=broadcom.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=broadcom.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=broadcom.com header.i=@broadcom.com header.b="V8L7HA/2" Received: by mail-oo1-f44.google.com with SMTP id 006d021491bc7-591487a1941so942eaf.3 for ; Thu, 14 Dec 2023 13:01:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1702587665; x=1703192465; darn=vger.kernel.org; h=mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:from:to:cc:subject:date:message-id:reply-to; bh=GpXfKVSDBR+BeAB0pTiAjCR/Gl0tiHb0Hrs6tYDKt8I=; b=V8L7HA/2JJxVpjmE0+zrQ2UzGifKkBwCfHwBWid/UDfMPZBIxTclWv8RNcV+WoftzE UJy++TnZCJMRHduH7jiyAqub2IJg3S1CmoPBAOmKMTVEa640y+n64K66U/569mXg5158 vAca3fwNm+jPS35KVjc5gzAzbQE7MzIMAKikM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1702587665; x=1703192465; h=mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=GpXfKVSDBR+BeAB0pTiAjCR/Gl0tiHb0Hrs6tYDKt8I=; b=OB8jQjyolnJQhDR8LftW7luNn+SV1lzLSaEBtcnhAs8UbthR2KquBQGIT2W1nvu1Nb jtSCQgcjaLHyFZlHNIWMRI2RYXkE1Cpz35uextqzx5/98m5uVlfTZr/noWsDFM5gMhx7 5VV2m8dliku2hKicGaoJY7mq7eergSDxjGqbU/Qw9ilQ2N+UYtf6i5lwguULsiXW1Yy+ 2RhZ4EZvpwYdVnJQ8lvpyAqtmA2+WOokpKFjlywuGd6YxAk9vG6xEyTgyGR7Xm3GqoE/ J+4BySUPbS8QkU3uvPL6zaQ2rjK7OfyANnRxZR9r5wp9MYaOrm7uR2/Ockhkw3WgJvgi ePPQ== X-Gm-Message-State: AOJu0YzuUb/ymiL+psiwB/A3wBPu3TtUyYthK7Yr7QViogAsGN/z5RKO PFSa7c+rRi+o+yWQ4x19orc0cnePXyqDyrl/AnYJEkcPVSFEzEka9PsqCuRYeQCeaPTgtBXbMvQ UzD4983AIhvvtqZ++f979dx2j9xSGkDwHhiVQNcwY+v7Bjqnxxc1D2gGY8czA4G+5jC5pTVjzmB KANUXK8cGJOQ== X-Google-Smtp-Source: AGHT+IHAO1T7SdQgePeX97R2xkEqirC3M+CWJtdY8Ciz/+FDUwDdiHHiAcr0B9NPKCsNEUea0RyJqg== X-Received: by 2002:a05:6358:3106:b0:170:6675:a50a with SMTP id c6-20020a056358310600b001706675a50amr12170156rwe.36.1702587665266; Thu, 14 Dec 2023 13:01:05 -0800 (PST) Received: from localhost.localdomain ([192.19.234.250]) by smtp.gmail.com with ESMTPSA id bv190-20020a632ec7000000b005c2967852c5sm11904303pgb.30.2023.12.14.13.01.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 Dec 2023 13:01:04 -0800 (PST) From: Ranjan Kumar To: linux-scsi@vger.kernel.org, martin.petersen@oracle.com Cc: rajsekhar.chundru@broadcom.com, sathya.prakash@broadcom.com, sumit.saxena@broadcom.com, chandrakanth.patil@broadcom.com, prayas.patel@broadcom.com, Ranjan Kumar Subject: [PATCH v2 2/6] mpi3mr: Support PCIe Error Recovery callback handlers Date: Fri, 15 Dec 2023 02:28:56 +0530 Message-Id: <20231214205900.270488-3-ranjan.kumar@broadcom.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20231214205900.270488-1-ranjan.kumar@broadcom.com> References: <20231214205900.270488-1-ranjan.kumar@broadcom.com> Precedence: bulk X-Mailing-List: linux-scsi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 The driver has been upgraded to include support for the PCIe error recovery callback handler which is crucial for the recovery of the controllers. This feature is necessary for addressing the errors reported by the PCIe AER (Advanced Error Reporting) mechanism. Signed-off-by: Sathya Prakash Signed-off-by: Ranjan Kumar --- drivers/scsi/mpi3mr/mpi3mr.h | 5 + drivers/scsi/mpi3mr/mpi3mr_os.c | 197 ++++++++++++++++++++++++++++++++ 2 files changed, 202 insertions(+) diff --git a/drivers/scsi/mpi3mr/mpi3mr.h b/drivers/scsi/mpi3mr/mpi3mr.h index 3de1ee05c44e..25e6e3a09468 100644 --- a/drivers/scsi/mpi3mr/mpi3mr.h +++ b/drivers/scsi/mpi3mr/mpi3mr.h @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -1055,6 +1056,8 @@ struct scmd_priv { * @ioctl_chain_sge: DMA buffer descriptor for IOCTL chain * @ioctl_resp_sge: DMA buffer descriptor for Mgmt cmd response * @ioctl_sges_allocated: Flag for IOCTL SGEs allocated or not + * @pcie_err_recovery: PCIe error recovery in progress + * @block_on_pcie_err: Block IO during PCI error recovery */ struct mpi3mr_ioc { struct list_head list; @@ -1246,6 +1249,8 @@ struct mpi3mr_ioc { struct dma_memory_desc ioctl_chain_sge; struct dma_memory_desc ioctl_resp_sge; bool ioctl_sges_allocated; + bool pcie_err_recovery; + bool block_on_pcie_err; }; /** diff --git a/drivers/scsi/mpi3mr/mpi3mr_os.c b/drivers/scsi/mpi3mr/mpi3mr_os.c index 76ba31a9517d..dea47ef53abb 100644 --- a/drivers/scsi/mpi3mr/mpi3mr_os.c +++ b/drivers/scsi/mpi3mr/mpi3mr_os.c @@ -5472,6 +5472,195 @@ mpi3mr_resume(struct device *dev) return 0; } +/** + * mpi3mr_pcierr_detected - PCI error detected callback + * @pdev: PCI device instance + * @state: channel state + * + * This function is called by the PCI error recovery driver and + * based on the state passed the driver decides what actions to + * be recommended back to PCI driver. + * + * For all of the states if there is no valid mrioc or scsi host + * references in the pci device then this function will retyrn + * the resul as disconnect. + * + * For normal state, this function will return the result as can + * recover. + * + * For frozen state, this function will block for any pennding + * controller initialization or re-initialization to complete, + * stop any new interactions with the controller and return + * status as reset required. + * + * For permanent failure state, this function will mark the + * controller as unrecoverable and return status as disconnect. + * + * Returns: PCI_ERS_RESULT_NEED_RESET or CAN_RECOVER or + * DISCONNECT based on the controller state. + */ +static pci_ers_result_t +mpi3mr_pcierr_detected(struct pci_dev *pdev, pci_channel_state_t state) +{ + struct Scsi_Host *shost; + struct mpi3mr_ioc *mrioc; + pci_ers_result_t ret_val = PCI_ERS_RESULT_DISCONNECT; + + dev_info(&pdev->dev, "%s: callback invoked state(%d)\n", __func__, + state); + + if (mpi3mr_get_shost_and_mrioc(pdev, &shost, &mrioc)) { + dev_err(&pdev->dev, "device not available\n"); + return ret_val; + } + + switch (state) { + case pci_channel_io_normal: + ret_val = PCI_ERS_RESULT_CAN_RECOVER; + break; + case pci_channel_io_frozen: + mrioc->pcie_err_recovery = true; + mrioc->block_on_pcie_err = true; + while (mrioc->reset_in_progress || mrioc->is_driver_loading) + ssleep(1); + scsi_block_requests(mrioc->shost); + mpi3mr_stop_watchdog(mrioc); + mpi3mr_cleanup_resources(mrioc); + mrioc->pdev = NULL; + ret_val = PCI_ERS_RESULT_NEED_RESET; + break; + case pci_channel_io_perm_failure: + mrioc->pcie_err_recovery = true; + mrioc->block_on_pcie_err = true; + mrioc->unrecoverable = 1; + mpi3mr_stop_watchdog(mrioc); + mpi3mr_flush_cmds_for_unrecovered_controller(mrioc); + ret_val = PCI_ERS_RESULT_DISCONNECT; + break; + default: + break; + } + return ret_val; +} + +/** + * mpi3mr_pcierr_slot_reset_done - Post slot reset callback + * @pdev: PCI device instance + * + * This function is called by the PCI error recovery driver + * after a slot or link reset issued by it for the recovery, the + * driver is expected to bring back the controller and + * initialize it. + * + * This function restores pci state and reinitializes controller + * resoruces and the controller, this blocks for any pending + * reset to complete. + * + * Returns: PCI_ERS_RESULT_DISCONNECT on failure or + * PCI_ERS_RESULT_RECOVERED + */ +static pci_ers_result_t mpi3mr_pcierr_slot_reset_done(struct pci_dev *pdev) +{ + struct Scsi_Host *shost; + struct mpi3mr_ioc *mrioc; + + + dev_info(&pdev->dev, "%s: callback invoked\n", __func__); + + if (mpi3mr_get_shost_and_mrioc(pdev, &shost, &mrioc)) { + dev_err(&pdev->dev, "device not available\n"); + return PCI_ERS_RESULT_DISCONNECT; + } + + while (mrioc->reset_in_progress) + ssleep(1); + + mrioc->pdev = pdev; + pci_restore_state(pdev); + + if (mpi3mr_setup_resources(mrioc)) { + ioc_err(mrioc, "setup resources failed\n"); + goto out_failed; + } + mrioc->unrecoverable = 0; + mrioc->pcie_err_recovery = false; + + if (mpi3mr_soft_reset_handler(mrioc, MPI3MR_RESET_FROM_FIRMWARE, 0)) + goto out_failed; + + return PCI_ERS_RESULT_RECOVERED; + +out_failed: + mrioc->unrecoverable = 1; + mrioc->block_on_pcie_err = false; + scsi_unblock_requests(shost); + mpi3mr_start_watchdog(mrioc); + return PCI_ERS_RESULT_DISCONNECT; +} + +/** + * mpi3mr_pcierr_resume - PCI error recovery resume + * callback + * @pdev: PCI device instance + * + * This function enables all I/O and IOCTLs post reset issued as + * part of the PCI advacned error reporting and handling + * + * Return: Nothing. + */ +static void mpi3mr_pcierr_resume(struct pci_dev *pdev) +{ + struct Scsi_Host *shost; + struct mpi3mr_ioc *mrioc; + + dev_info(&pdev->dev, "%s: callback invoked\n", __func__); + + if (mpi3mr_get_shost_and_mrioc(pdev, &shost, &mrioc)) { + dev_err(&pdev->dev, "device not available\n"); + return; + } + + pci_aer_clear_nonfatal_status(pdev); + + if (mrioc->block_on_pcie_err) { + mrioc->block_on_pcie_err = false; + scsi_unblock_requests(shost); + mpi3mr_start_watchdog(mrioc); + } + +} + +/** + * mpi3mr_pcierr_mmio_enabled - PCI error recovery callback + * @pdev: PCI device instance + * + * This is called only if _pcierr_error_detected returns + * PCI_ERS_RESULT_CAN_RECOVER. + * + * Return: PCI_ERS_RESULT_DISCONNECT when the controller is + * unrecoverable or when the shost/mnrioc reference cannot be + * found, else return PCI_ERS_RESULT_RECOVERED + */ +static pci_ers_result_t mpi3mr_pcierr_mmio_enabled(struct pci_dev *pdev) +{ + + struct Scsi_Host *shost; + struct mpi3mr_ioc *mrioc; +/* + * + */ + dev_info(&pdev->dev, "%s: callback invoked\n", __func__); + + if (mpi3mr_get_shost_and_mrioc(pdev, &shost, &mrioc)) { + dev_err(&pdev->dev, "device not available\n"); + return PCI_ERS_RESULT_DISCONNECT; + } + if (mrioc->unrecoverable) + return PCI_ERS_RESULT_DISCONNECT; + + return PCI_ERS_RESULT_RECOVERED; +} + static const struct pci_device_id mpi3mr_pci_id_table[] = { { PCI_DEVICE_SUB(MPI3_MFGPAGE_VENDORID_BROADCOM, @@ -5489,6 +5678,13 @@ static const struct pci_device_id mpi3mr_pci_id_table[] = { }; MODULE_DEVICE_TABLE(pci, mpi3mr_pci_id_table); +static struct pci_error_handlers mpi3mr_err_handler = { + .error_detected = mpi3mr_pcierr_detected, + .mmio_enabled = mpi3mr_pcierr_mmio_enabled, + .slot_reset = mpi3mr_pcierr_slot_reset_done, + .resume = mpi3mr_pcierr_resume, +}; + static SIMPLE_DEV_PM_OPS(mpi3mr_pm_ops, mpi3mr_suspend, mpi3mr_resume); static struct pci_driver mpi3mr_pci_driver = { @@ -5497,6 +5693,7 @@ static struct pci_driver mpi3mr_pci_driver = { .probe = mpi3mr_probe, .remove = mpi3mr_remove, .shutdown = mpi3mr_shutdown, + .err_handler = &mpi3mr_err_handler, .driver.pm = &mpi3mr_pm_ops, }; From patchwork Thu Dec 14 20:58:57 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ranjan Kumar X-Patchwork-Id: 13493679 Received: from mail-pg1-f170.google.com (mail-pg1-f170.google.com [209.85.215.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CE61B7494 for ; Thu, 14 Dec 2023 21:01:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=broadcom.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=broadcom.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=broadcom.com header.i=@broadcom.com header.b="D6OqXnNh" Received: by mail-pg1-f170.google.com with SMTP id 41be03b00d2f7-5c1f8b0c149so4109a12.3 for ; Thu, 14 Dec 2023 13:01:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1702587669; x=1703192469; darn=vger.kernel.org; h=mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:from:to:cc:subject:date:message-id:reply-to; bh=Za5m9LJTF9zC0xDBakWAxFKFnLtnuX6VfD8kbdBMJm0=; b=D6OqXnNhTkCrXloZ6Lfp4CPJLxANjUM4o+l4ZCH1iv5dGcR453/1AChDp+8yFWAMWS ySzEsnd/V2vidto380if85VZIOx51zgZwVhqd0z4ISdkbVDSQ5usWTrxKpLObeI3HHrB FYneoY13PacrC8hM/Hjkwue6PMdrP+FZ91O8E= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1702587669; x=1703192469; h=mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Za5m9LJTF9zC0xDBakWAxFKFnLtnuX6VfD8kbdBMJm0=; b=ZRi25l806XO1Lb5+Ckuz9/qKtATbUC6DYcLLPdF9JDlhcvyWzuEDe1dcXx5ljWkwOK 3kfrlsYliN9+hE0mVwp3EcGrjUU/ZQk6UpFyAT8AO2MmsntkF1WtlLMOIQjldVBUuDJ9 Tl3sFY8e4/sVE2E0+5ehD1clrJIPhUBdKHfpT2w358FCbvRhWyk5hNe+SM/Rd/9fa9zp PofE0E8jRGNbkWmjuvVFjMtuTOfU868hjEJRUfFJ7XCfb1yFCqSz5y3aPZHPJ0/6ueFG OnGKPStqFTRRDDKKHlmmqSeEQ5Bxavs9ZluGo7D6f5gHo1jbsGCf1QQzXqgDzyhxEvvH pgYg== X-Gm-Message-State: AOJu0YzVvCg4uBEIJAnP3XfFL27W7fO03yibMSF2lHHhQ4fw5XBp3iXW gksLp+dUqA2apnI+WYUu5dvaMdMwMWanGPaicxohfXps8wAY5MvDwTWYqu8PME/5Vz055zBZV68 yHE6hMFU0RLIzFI3cSEHo6IkrrYAGTNLpWlGQVMEA1IkYDqjxcfgVPkOjfN0nsXun5LlUWmEG8i 0wflTnNWvDvg== X-Google-Smtp-Source: AGHT+IHR6QUG2REQpk3dtQh6sbE98gbPtMN5M5BM4+zyqTYyDiU7MRrQP4DCaSji+O5pBRhHBN3abw== X-Received: by 2002:a05:6a20:2583:b0:18c:1af0:ad56 with SMTP id k3-20020a056a20258300b0018c1af0ad56mr6857076pzd.8.1702587668996; Thu, 14 Dec 2023 13:01:08 -0800 (PST) Received: from localhost.localdomain ([192.19.234.250]) by smtp.gmail.com with ESMTPSA id bv190-20020a632ec7000000b005c2967852c5sm11904303pgb.30.2023.12.14.13.01.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 Dec 2023 13:01:07 -0800 (PST) From: Ranjan Kumar To: linux-scsi@vger.kernel.org, martin.petersen@oracle.com Cc: rajsekhar.chundru@broadcom.com, sathya.prakash@broadcom.com, sumit.saxena@broadcom.com, chandrakanth.patil@broadcom.com, prayas.patel@broadcom.com, Ranjan Kumar Subject: [PATCH v2 3/6] mpi3mr: Prevent PCI writes from driver during PCI error recovery Date: Fri, 15 Dec 2023 02:28:57 +0530 Message-Id: <20231214205900.270488-4-ranjan.kumar@broadcom.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20231214205900.270488-1-ranjan.kumar@broadcom.com> References: <20231214205900.270488-1-ranjan.kumar@broadcom.com> Precedence: bulk X-Mailing-List: linux-scsi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Prevent interacting with the hardware while the error recovery in progress. Signed-off-by: Sathya Prakash Signed-off-by: Ranjan Kumar --- drivers/scsi/mpi3mr/mpi3mr.h | 26 ++++++++++ drivers/scsi/mpi3mr/mpi3mr_app.c | 64 +++++++++++++---------- drivers/scsi/mpi3mr/mpi3mr_fw.c | 28 +++++++--- drivers/scsi/mpi3mr/mpi3mr_os.c | 71 +++++++++++++++----------- drivers/scsi/mpi3mr/mpi3mr_transport.c | 39 ++++++++++++-- 5 files changed, 158 insertions(+), 70 deletions(-) diff --git a/drivers/scsi/mpi3mr/mpi3mr.h b/drivers/scsi/mpi3mr/mpi3mr.h index 25e6e3a09468..1ac7f88dc1cd 100644 --- a/drivers/scsi/mpi3mr/mpi3mr.h +++ b/drivers/scsi/mpi3mr/mpi3mr.h @@ -481,6 +481,7 @@ struct mpi3mr_throttle_group_info { /* HBA port flags */ #define MPI3MR_HBA_PORT_FLAG_DIRTY 0x01 +#define MPI3MR_HBA_PORT_FLAG_NEW 0x02 /* IOCTL data transfer sge*/ #define MPI3MR_NUM_IOCTL_SGE 256 @@ -900,6 +901,29 @@ struct scmd_priv { u8 mpi3mr_scsiio_req[MPI3MR_ADMIN_REQ_FRAME_SZ]; }; +/** + * struct mpi3mr_pdevinfo - PCI device information + * + * @dev_id: PCI device ID of the adapter + * @dev_hw_rev: PCI revision of the adapter + * @subsys_dev_id: PCI subsystem device ID of the adapter + * @subsys_ven_id: PCI subsystem vendor ID of the adapter + * @dev: PCI device + * @func: PCI function + * @bus: PCI bus + * @seg_id: PCI segment ID + */ +struct mpi3mr_pdevinfo { + u16 id; + u16 ssid; + u16 ssvid; + u16 segment; + u8 dev:5; + u8 func:3; + u8 bus; + u8 revision; +}; + /** * struct mpi3mr_ioc - Adapter anchor structure stored in shost * private data @@ -1058,6 +1082,7 @@ struct scmd_priv { * @ioctl_sges_allocated: Flag for IOCTL SGEs allocated or not * @pcie_err_recovery: PCIe error recovery in progress * @block_on_pcie_err: Block IO during PCI error recovery + * @pdevinfo: PCI device information */ struct mpi3mr_ioc { struct list_head list; @@ -1251,6 +1276,7 @@ struct mpi3mr_ioc { bool ioctl_sges_allocated; bool pcie_err_recovery; bool block_on_pcie_err; + struct mpi3mr_pdevinfo pdevinfo; }; /** diff --git a/drivers/scsi/mpi3mr/mpi3mr_app.c b/drivers/scsi/mpi3mr/mpi3mr_app.c index 4b93b7440da6..a11d6f026f0e 100644 --- a/drivers/scsi/mpi3mr/mpi3mr_app.c +++ b/drivers/scsi/mpi3mr/mpi3mr_app.c @@ -31,7 +31,7 @@ static int mpi3mr_bsg_pel_abort(struct mpi3mr_ioc *mrioc) dprint_bsg_err(mrioc, "%s: reset in progress\n", __func__); return -1; } - if (mrioc->stop_bsgs) { + if (mrioc->stop_bsgs || mrioc->block_on_pcie_err) { dprint_bsg_err(mrioc, "%s: bsgs are blocked\n", __func__); return -1; } @@ -424,6 +424,9 @@ static long mpi3mr_bsg_adp_reset(struct mpi3mr_ioc *mrioc, goto out; } + if (mrioc->unrecoverable || mrioc->block_on_pcie_err) + return -EINVAL; + sg_copy_to_buffer(job->request_payload.sg_list, job->request_payload.sg_cnt, &adpreset, sizeof(adpreset)); @@ -470,25 +473,29 @@ static long mpi3mr_bsg_populate_adpinfo(struct mpi3mr_ioc *mrioc, memset(&adpinfo, 0, sizeof(adpinfo)); adpinfo.adp_type = MPI3MR_BSG_ADPTYPE_AVGFAMILY; - adpinfo.pci_dev_id = mrioc->pdev->device; - adpinfo.pci_dev_hw_rev = mrioc->pdev->revision; - adpinfo.pci_subsys_dev_id = mrioc->pdev->subsystem_device; - adpinfo.pci_subsys_ven_id = mrioc->pdev->subsystem_vendor; - adpinfo.pci_bus = mrioc->pdev->bus->number; - adpinfo.pci_dev = PCI_SLOT(mrioc->pdev->devfn); - adpinfo.pci_func = PCI_FUNC(mrioc->pdev->devfn); - adpinfo.pci_seg_id = pci_domain_nr(mrioc->pdev->bus); adpinfo.app_intfc_ver = MPI3MR_IOCTL_VERSION; - ioc_state = mpi3mr_get_iocstate(mrioc); - if (ioc_state == MRIOC_STATE_UNRECOVERABLE) - adpinfo.adp_state = MPI3MR_BSG_ADPSTATE_UNRECOVERABLE; - else if ((mrioc->reset_in_progress) || (mrioc->stop_bsgs)) + if (mrioc->reset_in_progress || mrioc->stop_bsgs || + mrioc->block_on_pcie_err) adpinfo.adp_state = MPI3MR_BSG_ADPSTATE_IN_RESET; - else if (ioc_state == MRIOC_STATE_FAULT) - adpinfo.adp_state = MPI3MR_BSG_ADPSTATE_FAULT; - else - adpinfo.adp_state = MPI3MR_BSG_ADPSTATE_OPERATIONAL; + else { + ioc_state = mpi3mr_get_iocstate(mrioc); + if (ioc_state == MRIOC_STATE_UNRECOVERABLE) + adpinfo.adp_state = MPI3MR_BSG_ADPSTATE_UNRECOVERABLE; + else if (ioc_state == MRIOC_STATE_FAULT) + adpinfo.adp_state = MPI3MR_BSG_ADPSTATE_FAULT; + else + adpinfo.adp_state = MPI3MR_BSG_ADPSTATE_OPERATIONAL; + } + + adpinfo.pci_dev_id = mrioc->pdevinfo.id; + adpinfo.pci_dev_hw_rev = mrioc->pdevinfo.revision; + adpinfo.pci_subsys_dev_id = mrioc->pdevinfo.ssid; + adpinfo.pci_subsys_ven_id = mrioc->pdevinfo.ssvid; + adpinfo.pci_bus = mrioc->pdevinfo.bus; + adpinfo.pci_dev = mrioc->pdevinfo.dev; + adpinfo.pci_func = mrioc->pdevinfo.func; + adpinfo.pci_seg_id = mrioc->pdevinfo.segment; memcpy((u8 *)&adpinfo.driver_info, (u8 *)&mrioc->driver_info, sizeof(adpinfo.driver_info)); @@ -1495,7 +1502,7 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job) mutex_unlock(&mrioc->bsg_cmds.mutex); goto out; } - if (mrioc->stop_bsgs) { + if (mrioc->stop_bsgs || mrioc->block_on_pcie_err) { dprint_bsg_err(mrioc, "%s: bsgs are blocked\n", __func__); rval = -EAGAIN; mutex_unlock(&mrioc->bsg_cmds.mutex); @@ -2020,17 +2027,20 @@ adp_state_show(struct device *dev, struct device_attribute *attr, enum mpi3mr_iocstate ioc_state; uint8_t adp_state; - ioc_state = mpi3mr_get_iocstate(mrioc); - if (ioc_state == MRIOC_STATE_UNRECOVERABLE) - adp_state = MPI3MR_BSG_ADPSTATE_UNRECOVERABLE; - else if ((mrioc->reset_in_progress) || (mrioc->stop_bsgs)) + if (mrioc->reset_in_progress || mrioc->stop_bsgs || + mrioc->block_on_pcie_err) adp_state = MPI3MR_BSG_ADPSTATE_IN_RESET; - else if (ioc_state == MRIOC_STATE_FAULT) - adp_state = MPI3MR_BSG_ADPSTATE_FAULT; - else - adp_state = MPI3MR_BSG_ADPSTATE_OPERATIONAL; + else { + ioc_state = mpi3mr_get_iocstate(mrioc); + if (ioc_state == MRIOC_STATE_UNRECOVERABLE) + adp_state = MPI3MR_BSG_ADPSTATE_UNRECOVERABLE; + else if (ioc_state == MRIOC_STATE_FAULT) + adp_state = MPI3MR_BSG_ADPSTATE_FAULT; + else + adp_state = MPI3MR_BSG_ADPSTATE_OPERATIONAL; + } - return sysfs_emit(buf, "%u\n", adp_state); + return snprintf(buf, PAGE_SIZE, "%u\n", adp_state); } static DEVICE_ATTR_RO(adp_state); diff --git a/drivers/scsi/mpi3mr/mpi3mr_fw.c b/drivers/scsi/mpi3mr/mpi3mr_fw.c index d8c57a0a518f..c50fc27231cd 100644 --- a/drivers/scsi/mpi3mr/mpi3mr_fw.c +++ b/drivers/scsi/mpi3mr/mpi3mr_fw.c @@ -595,7 +595,7 @@ int mpi3mr_blk_mq_poll(struct Scsi_Host *shost, unsigned int queue_num) mrioc = (struct mpi3mr_ioc *)shost->hostdata; if ((mrioc->reset_in_progress || mrioc->prepare_for_reset || - mrioc->unrecoverable)) + mrioc->unrecoverable || mrioc->pcie_err_recovery)) return 0; num_entries = mpi3mr_process_op_reply_q(mrioc, @@ -1037,13 +1037,13 @@ enum mpi3mr_iocstate mpi3mr_get_iocstate(struct mpi3mr_ioc *mrioc) u32 ioc_status, ioc_config; u8 ready, enabled; - ioc_status = readl(&mrioc->sysif_regs->ioc_status); - ioc_config = readl(&mrioc->sysif_regs->ioc_configuration); - if (mrioc->unrecoverable) return MRIOC_STATE_UNRECOVERABLE; + ioc_status = readl(&mrioc->sysif_regs->ioc_status); + if (ioc_status & MPI3_SYSIF_IOC_STATUS_FAULT) return MRIOC_STATE_FAULT; + ioc_config = readl(&mrioc->sysif_regs->ioc_configuration); ready = (ioc_status & MPI3_SYSIF_IOC_STATUS_READY); enabled = (ioc_config & MPI3_SYSIF_IOC_CONFIG_ENABLE_IOC); @@ -1667,6 +1667,12 @@ int mpi3mr_admin_request_post(struct mpi3mr_ioc *mrioc, void *admin_req, retval = -EAGAIN; goto out; } + if (mrioc->pcie_err_recovery) { + ioc_err(mrioc, "admin request queue submission failed due to pcie error recovery in progress\n"); + retval = -EAGAIN; + goto out; + } + areq_entry = (u8 *)mrioc->admin_req_base + (areq_pi * MPI3MR_ADMIN_REQ_FRAME_SZ); memset(areq_entry, 0, MPI3MR_ADMIN_REQ_FRAME_SZ); @@ -2337,6 +2343,11 @@ int mpi3mr_op_request_post(struct mpi3mr_ioc *mrioc, retval = -EAGAIN; goto out; } + if (mrioc->pcie_err_recovery) { + ioc_err(mrioc, "operational request queue submission failed due to pcie error recovery in progress\n"); + retval = -EAGAIN; + goto out; + } segment_base_addr = segments[pi / op_req_q->segment_qd].segment; req_entry = (u8 *)segment_base_addr + @@ -2585,7 +2596,7 @@ static void mpi3mr_watchdog_work(struct work_struct *work) u32 fault, host_diagnostic, ioc_status; u32 reset_reason = MPI3MR_RESET_FROM_FAULT_WATCH; - if (mrioc->reset_in_progress) + if (mrioc->reset_in_progress || mrioc->pcie_err_recovery) return; if (!mrioc->unrecoverable && !pci_device_is_present(mrioc->pdev)) { @@ -4111,7 +4122,7 @@ int mpi3mr_reinit_ioc(struct mpi3mr_ioc *mrioc, u8 is_resume) goto out_failed_noretry; } - if (is_resume) { + if (is_resume || mrioc->block_on_pcie_err) { dprint_reset(mrioc, "setting up single ISR\n"); retval = mpi3mr_setup_isr(mrioc, 1); if (retval) { @@ -4151,7 +4162,7 @@ int mpi3mr_reinit_ioc(struct mpi3mr_ioc *mrioc, u8 is_resume) goto out_failed; } - if (is_resume) { + if (is_resume || mrioc->block_on_pcie_err) { dprint_reset(mrioc, "setting up multiple ISR\n"); retval = mpi3mr_setup_isr(mrioc, 0); if (retval) { @@ -4625,7 +4636,8 @@ void mpi3mr_cleanup_ioc(struct mpi3mr_ioc *mrioc) ioc_state = mpi3mr_get_iocstate(mrioc); - if ((!mrioc->unrecoverable) && (!mrioc->reset_in_progress) && + if (!mrioc->unrecoverable && !mrioc->reset_in_progress && + !mrioc->pcie_err_recovery && (ioc_state == MRIOC_STATE_READY)) { if (mpi3mr_issue_and_process_mur(mrioc, MPI3MR_RESET_FROM_CTLR_CLEANUP)) diff --git a/drivers/scsi/mpi3mr/mpi3mr_os.c b/drivers/scsi/mpi3mr/mpi3mr_os.c index dea47ef53abb..d61fd105dfad 100644 --- a/drivers/scsi/mpi3mr/mpi3mr_os.c +++ b/drivers/scsi/mpi3mr/mpi3mr_os.c @@ -919,7 +919,7 @@ static int mpi3mr_report_tgtdev_to_host(struct mpi3mr_ioc *mrioc, int retval = 0; struct mpi3mr_tgt_dev *tgtdev; - if (mrioc->reset_in_progress) + if (mrioc->reset_in_progress || mrioc->pcie_err_recovery) return -1; tgtdev = mpi3mr_get_tgtdev_by_perst_id(mrioc, perst_id); @@ -2000,8 +2000,13 @@ static void mpi3mr_fwevt_bh(struct mpi3mr_ioc *mrioc, } case MPI3_EVENT_WAIT_FOR_DEVICES_TO_REFRESH: { - while (mrioc->device_refresh_on) + while ((mrioc->device_refresh_on || mrioc->block_on_pcie_err) && + !mrioc->unrecoverable && !mrioc->pcie_err_recovery) { msleep(500); + } + + if (mrioc->unrecoverable || mrioc->pcie_err_recovery) + break; dprint_event_bh(mrioc, "scan for non responding and newly added devices after soft reset started\n"); @@ -3680,6 +3685,13 @@ int mpi3mr_issue_tm(struct mpi3mr_ioc *mrioc, u8 tm_type, mutex_unlock(&drv_cmd->mutex); goto out; } + if (mrioc->block_on_pcie_err) { + retval = -1; + dprint_tm(mrioc, "sending task management failed due to\n" + "pcie error recovery in progress\n"); + mutex_unlock(&drv_cmd->mutex); + goto out; + } drv_cmd->state = MPI3MR_CMD_PENDING; drv_cmd->is_waiting = 1; @@ -4073,12 +4085,19 @@ static int mpi3mr_eh_bus_reset(struct scsi_cmnd *scmd) if (dev_type == MPI3_DEVICE_DEVFORM_VD) { mpi3mr_wait_for_host_io(mrioc, MPI3MR_RAID_ERRREC_RESET_TIMEOUT); - if (!mpi3mr_get_fw_pending_ios(mrioc)) + if (!mpi3mr_get_fw_pending_ios(mrioc)) { + while (mrioc->reset_in_progress || + mrioc->prepare_for_reset || + mrioc->block_on_pcie_err) + ssleep(1); retval = SUCCESS; + goto out; + } } if (retval == FAILED) mpi3mr_print_pending_host_io(mrioc); +out: sdev_printk(KERN_INFO, scmd->device, "Bus reset is %s for scmd(%p)\n", ((retval == SUCCESS) ? "SUCCESS" : "FAILED"), scmd); @@ -4779,7 +4798,8 @@ static int mpi3mr_qcmd(struct Scsi_Host *shost, goto out; } - if (mrioc->reset_in_progress) { + if (mrioc->reset_in_progress || mrioc->prepare_for_reset + || mrioc->block_on_pcie_err) { retval = SCSI_MLQUEUE_HOST_BUSY; goto out; } @@ -5123,6 +5143,14 @@ mpi3mr_probe(struct pci_dev *pdev, const struct pci_device_id *id) mrioc->logging_level = logging_level; mrioc->shost = shost; mrioc->pdev = pdev; + mrioc->pdevinfo.id = pdev->device; + mrioc->pdevinfo.revision = pdev->revision; + mrioc->pdevinfo.ssid = pdev->subsystem_device; + mrioc->pdevinfo.ssvid = pdev->subsystem_vendor; + mrioc->pdevinfo.bus = pdev->bus->number; + mrioc->pdevinfo.dev = PCI_SLOT(pdev->devfn); + mrioc->pdevinfo.func = PCI_FUNC(pdev->devfn); + mrioc->pdevinfo.segment = pci_domain_nr(pdev->bus); mrioc->stop_bsgs = 1; mrioc->max_sgl_entries = max_sgl_entries; @@ -5276,17 +5304,21 @@ static void mpi3mr_remove(struct pci_dev *pdev) struct workqueue_struct *wq; unsigned long flags; struct mpi3mr_tgt_dev *tgtdev, *tgtdev_next; - struct mpi3mr_hba_port *port, *hba_port_next; - struct mpi3mr_sas_node *sas_expander, *sas_expander_next; if (mpi3mr_get_shost_and_mrioc(pdev, &shost, &mrioc)) return; - mrioc = shost_priv(shost); while (mrioc->reset_in_progress || mrioc->is_driver_loading) ssleep(1); - if (!pci_device_is_present(mrioc->pdev)) { + if (mrioc->block_on_pcie_err) { + mrioc->block_on_pcie_err = false; + scsi_unblock_requests(shost); + mrioc->unrecoverable = 1; + } + + if (!pci_device_is_present(mrioc->pdev) || + mrioc->pcie_err_recovery) { mrioc->unrecoverable = 1; mpi3mr_flush_cmds_for_unrecovered_controller(mrioc); } @@ -5316,29 +5348,6 @@ static void mpi3mr_remove(struct pci_dev *pdev) mpi3mr_cleanup_ioc(mrioc); mpi3mr_free_mem(mrioc); mpi3mr_cleanup_resources(mrioc); - - spin_lock_irqsave(&mrioc->sas_node_lock, flags); - list_for_each_entry_safe_reverse(sas_expander, sas_expander_next, - &mrioc->sas_expander_list, list) { - spin_unlock_irqrestore(&mrioc->sas_node_lock, flags); - mpi3mr_expander_node_remove(mrioc, sas_expander); - spin_lock_irqsave(&mrioc->sas_node_lock, flags); - } - list_for_each_entry_safe(port, hba_port_next, &mrioc->hba_port_table_list, list) { - ioc_info(mrioc, - "removing hba_port entry: %p port: %d from hba_port list\n", - port, port->port_id); - list_del(&port->list); - kfree(port); - } - spin_unlock_irqrestore(&mrioc->sas_node_lock, flags); - - if (mrioc->sas_hba.num_phys) { - kfree(mrioc->sas_hba.phy); - mrioc->sas_hba.phy = NULL; - mrioc->sas_hba.num_phys = 0; - } - spin_lock(&mrioc_list_lock); list_del(&mrioc->list); spin_unlock(&mrioc_list_lock); diff --git a/drivers/scsi/mpi3mr/mpi3mr_transport.c b/drivers/scsi/mpi3mr/mpi3mr_transport.c index c0c8ab586957..8c8368104a27 100644 --- a/drivers/scsi/mpi3mr/mpi3mr_transport.c +++ b/drivers/scsi/mpi3mr/mpi3mr_transport.c @@ -149,6 +149,11 @@ static int mpi3mr_report_manufacture(struct mpi3mr_ioc *mrioc, return -EFAULT; } + if (mrioc->pcie_err_recovery) { + ioc_err(mrioc, "%s: pcie error recovery in progress!\n", __func__); + return -EFAULT; + } + data_out_sz = sizeof(struct rep_manu_request); data_in_sz = sizeof(struct rep_manu_reply); data_out = dma_alloc_coherent(&mrioc->pdev->dev, @@ -792,6 +797,12 @@ static int mpi3mr_set_identify(struct mpi3mr_ioc *mrioc, u16 handle, return -EFAULT; } + if (mrioc->pcie_err_recovery) { + ioc_err(mrioc, "%s: pcie error recovery in progress!\n", + __func__); + return -EFAULT; + } + if ((mpi3mr_cfg_get_dev_pg0(mrioc, &ioc_status, &device_pg0, sizeof(device_pg0), MPI3_DEVICE_PGAD_FORM_HANDLE, handle))) { ioc_err(mrioc, "%s: device page0 read failed\n", __func__); @@ -1009,6 +1020,9 @@ mpi3mr_alloc_hba_port(struct mpi3mr_ioc *mrioc, u16 port_id) hba_port->port_id = port_id; ioc_info(mrioc, "hba_port entry: %p, port: %d is added to hba_port list\n", hba_port, hba_port->port_id); + if (mrioc->reset_in_progress || + mrioc->pcie_err_recovery) + hba_port->flags = MPI3MR_HBA_PORT_FLAG_NEW; list_add_tail(&hba_port->list, &mrioc->hba_port_table_list); return hba_port; } @@ -1057,7 +1071,7 @@ void mpi3mr_update_links(struct mpi3mr_ioc *mrioc, struct mpi3mr_sas_node *mr_sas_node; struct mpi3mr_sas_phy *mr_sas_phy; - if (mrioc->reset_in_progress) + if (mrioc->reset_in_progress || mrioc->pcie_err_recovery) return; spin_lock_irqsave(&mrioc->sas_node_lock, flags); @@ -1965,7 +1979,7 @@ int mpi3mr_expander_add(struct mpi3mr_ioc *mrioc, u16 handle) if (!handle) return -1; - if (mrioc->reset_in_progress) + if (mrioc->reset_in_progress || mrioc->pcie_err_recovery) return -1; if ((mpi3mr_cfg_get_sas_exp_pg0(mrioc, &ioc_status, &expander_pg0, @@ -2171,7 +2185,7 @@ void mpi3mr_expander_node_remove(struct mpi3mr_ioc *mrioc, /* remove sibling ports attached to this expander */ list_for_each_entry_safe(mr_sas_port, next, &sas_expander->sas_port_list, port_list) { - if (mrioc->reset_in_progress) + if (mrioc->reset_in_progress || mrioc->pcie_err_recovery) return; if (mr_sas_port->remote_identify.device_type == SAS_END_DEVICE) @@ -2221,7 +2235,7 @@ void mpi3mr_expander_remove(struct mpi3mr_ioc *mrioc, u64 sas_address, struct mpi3mr_sas_node *sas_expander; unsigned long flags; - if (mrioc->reset_in_progress) + if (mrioc->reset_in_progress || mrioc->pcie_err_recovery) return; if (!hba_port) @@ -2532,6 +2546,11 @@ static int mpi3mr_get_expander_phy_error_log(struct mpi3mr_ioc *mrioc, return -EFAULT; } + if (mrioc->pcie_err_recovery) { + ioc_err(mrioc, "%s: pcie error recovery in progress!\n", __func__); + return -EFAULT; + } + data_out_sz = sizeof(struct phy_error_log_request); data_in_sz = sizeof(struct phy_error_log_reply); sz = data_out_sz + data_in_sz; @@ -2791,6 +2810,12 @@ mpi3mr_expander_phy_control(struct mpi3mr_ioc *mrioc, return -EFAULT; } + if (mrioc->pcie_err_recovery) { + ioc_err(mrioc, "%s: pcie error recovery in progress!\n", + __func__); + return -EFAULT; + } + data_out_sz = sizeof(struct phy_control_request); data_in_sz = sizeof(struct phy_control_reply); sz = data_out_sz + data_in_sz; @@ -3214,6 +3239,12 @@ mpi3mr_transport_smp_handler(struct bsg_job *job, struct Scsi_Host *shost, goto out; } + if (mrioc->pcie_err_recovery) { + ioc_err(mrioc, "%s: pcie error recovery in progress!\n", __func__); + rc = -EFAULT; + goto out; + } + rc = mpi3mr_map_smp_buffer(&mrioc->pdev->dev, &job->request_payload, &dma_addr_out, &dma_len_out, &addr_out); if (rc) From patchwork Thu Dec 14 20:58:58 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ranjan Kumar X-Patchwork-Id: 13493680 Received: from mail-pg1-f180.google.com (mail-pg1-f180.google.com [209.85.215.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8821D7494 for ; Thu, 14 Dec 2023 21:01:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=broadcom.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=broadcom.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=broadcom.com header.i=@broadcom.com header.b="J/EqLPwu" Received: by mail-pg1-f180.google.com with SMTP id 41be03b00d2f7-5c210e34088so7285a12.2 for ; Thu, 14 Dec 2023 13:01:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1702587673; x=1703192473; darn=vger.kernel.org; h=mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:from:to:cc:subject:date:message-id:reply-to; bh=wpUkK6ITIMil2yG9knOEkvfpxottBbwtLLuhrQinNns=; b=J/EqLPwuPGTugutiFlp+hqAyP/vh6RXrMCIZNx8e5c/R9yx0Zj3HIPQLMbk09xxfMI B+gMAlxoA49stENjckvtaIugiKP4TecKR+ZUE+DoZs2DqQaXKI+UnNio150wPDGiDRXU 3L9HMaG2LlG6eV4dSomnnwjDuVTzfhaTidIY8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1702587673; x=1703192473; h=mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=wpUkK6ITIMil2yG9knOEkvfpxottBbwtLLuhrQinNns=; b=T563UyPmYVw/bcBZCj9x3PahYdIBUp4Vh/0O8qI4Oz3XoSLjOi9pvtZVpMD1EMZ7A8 Ut/wvQLH6ghE1mZFPb6QT6eIAAlnek6dISACp4ETv8mhDd0zLlnbq0013gZqOZ994OeY bwq3ZuyPLxgfov4n8UYWh/5bN5b2Hwij5lTkooGQNLQAGsnAaXR7V6stUAlB36+1C/Wz OUP4uObQ/GxmJPelQInPxkwwjPTul6J7/5NOpJggSYf5Ci2SJX0Hf3QCLQ1+Vt2MNE3H 4y/OTqtwpAnQXs7TDMIKptmsTprsIAy4+Nf5gOYC5vNFf0rhT0dx6Z0Wy32RCk6Zdv/S g4kA== X-Gm-Message-State: AOJu0YxGV80xCuwcdg6RGrxbKwJROvaBT5iXyI6XjQXLGt2WCnjFBMbC mpD/a2kqcVkdjDW64LO5XOHcL5B7t+S3WkUwezAvhx+lf8s+O/duGlQgpDcJzGyXxIe2CnhbPB7 +CoNMyCuC+HOz8tyD2XcuAHxNq3JoEOtP7kR9aaKdjrIp8n9WQxz3NclHKubFgMwfE0Wf4LH3OG OnTfSXAYp+6w== X-Google-Smtp-Source: AGHT+IGukzCheuPz33VN+IQ7Us8vPqCqiZ4590d4yynT0ZGqFYsB7wwM9VojxitKsVmjC729+xpFew== X-Received: by 2002:a05:6a20:b3aa:b0:18f:e1f:32ce with SMTP id eg42-20020a056a20b3aa00b0018f0e1f32cemr10600679pzb.115.1702587672769; Thu, 14 Dec 2023 13:01:12 -0800 (PST) Received: from localhost.localdomain ([192.19.234.250]) by smtp.gmail.com with ESMTPSA id bv190-20020a632ec7000000b005c2967852c5sm11904303pgb.30.2023.12.14.13.01.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 Dec 2023 13:01:11 -0800 (PST) From: Ranjan Kumar To: linux-scsi@vger.kernel.org, martin.petersen@oracle.com Cc: rajsekhar.chundru@broadcom.com, sathya.prakash@broadcom.com, sumit.saxena@broadcom.com, chandrakanth.patil@broadcom.com, prayas.patel@broadcom.com, Ranjan Kumar Subject: [PATCH v2 4/6] mpi3mr: Improve Shutdown times when firmware has faulted Date: Fri, 15 Dec 2023 02:28:58 +0530 Message-Id: <20231214205900.270488-5-ranjan.kumar@broadcom.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20231214205900.270488-1-ranjan.kumar@broadcom.com> References: <20231214205900.270488-1-ranjan.kumar@broadcom.com> Precedence: bulk X-Mailing-List: linux-scsi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 The driver monitors the controller state periodically while waiting for the shutdown notification MPI request to complete. If the firmware is faulty, the driver resets the controller and re-issues the shutdown notification. The driver will make three attempts to complete the shutdown process and will not retry the notification request if the controller reset is unsuccessful. Signed-off-by: Prayas Patel Signed-off-by: Ranjan Kumar --- drivers/scsi/mpi3mr/mpi3mr.h | 1 + drivers/scsi/mpi3mr/mpi3mr_fw.c | 36 +++++++++++++++++++++++++-------- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/drivers/scsi/mpi3mr/mpi3mr.h b/drivers/scsi/mpi3mr/mpi3mr.h index 1ac7f88dc1cd..de953eb055d0 100644 --- a/drivers/scsi/mpi3mr/mpi3mr.h +++ b/drivers/scsi/mpi3mr/mpi3mr.h @@ -159,6 +159,7 @@ extern atomic64_t event_counter; /* Controller Reset related definitions */ #define MPI3MR_HOSTDIAG_UNLOCK_RETRY_COUNT 5 #define MPI3MR_MAX_RESET_RETRY_COUNT 3 +#define MPI3MR_MAX_SHUTDOWN_RETRY_COUNT 2 /* ResponseCode definitions */ #define MPI3MR_RI_MASK_RESPCODE (0x000000FF) diff --git a/drivers/scsi/mpi3mr/mpi3mr_fw.c b/drivers/scsi/mpi3mr/mpi3mr_fw.c index c50fc27231cd..491ef854fdba 100644 --- a/drivers/scsi/mpi3mr/mpi3mr_fw.c +++ b/drivers/scsi/mpi3mr/mpi3mr_fw.c @@ -4566,9 +4566,10 @@ void mpi3mr_free_mem(struct mpi3mr_ioc *mrioc) */ static void mpi3mr_issue_ioc_shutdown(struct mpi3mr_ioc *mrioc) { - u32 ioc_config, ioc_status; - u8 retval = 1; + u32 ioc_config, ioc_status, shutdown_action; + u8 retval = 1, retry = 0; u32 timeout = MPI3MR_DEFAULT_SHUTDOWN_TIME * 10; + u32 timeout_remaining = 0; ioc_info(mrioc, "Issuing shutdown Notification\n"); if (mrioc->unrecoverable) { @@ -4583,15 +4584,16 @@ static void mpi3mr_issue_ioc_shutdown(struct mpi3mr_ioc *mrioc) return; } + shutdown_action = MPI3_SYSIF_IOC_CONFIG_SHUTDOWN_NORMAL | + MPI3_SYSIF_IOC_CONFIG_DEVICE_SHUTDOWN_SEND_REQ; ioc_config = readl(&mrioc->sysif_regs->ioc_configuration); - ioc_config |= MPI3_SYSIF_IOC_CONFIG_SHUTDOWN_NORMAL; - ioc_config |= MPI3_SYSIF_IOC_CONFIG_DEVICE_SHUTDOWN_SEND_REQ; + ioc_config |= shutdown_action; writel(ioc_config, &mrioc->sysif_regs->ioc_configuration); if (mrioc->facts.shutdown_timeout) timeout = mrioc->facts.shutdown_timeout * 10; - + timeout_remaining = timeout; do { ioc_status = readl(&mrioc->sysif_regs->ioc_status); if ((ioc_status & MPI3_SYSIF_IOC_STATUS_SHUTDOWN_MASK) @@ -4599,8 +4601,26 @@ static void mpi3mr_issue_ioc_shutdown(struct mpi3mr_ioc *mrioc) retval = 0; break; } + if (mrioc->unrecoverable) + break; + if (ioc_status & MPI3_SYSIF_IOC_STATUS_FAULT) { + mpi3mr_print_fault_info(mrioc); + if (retry >= MPI3MR_MAX_SHUTDOWN_RETRY_COUNT) + break; + if (mpi3mr_issue_reset(mrioc, + MPI3_SYSIF_HOST_DIAG_RESET_ACTION_SOFT_RESET, + MPI3MR_RESET_FROM_CTLR_CLEANUP)) + break; + ioc_config = + readl(&mrioc->sysif_regs->ioc_configuration); + ioc_config |= shutdown_action; + writel(ioc_config, + &mrioc->sysif_regs->ioc_configuration); + timeout_remaining = timeout; + retry++; + } msleep(100); - } while (--timeout); + } while (--timeout_remaining); ioc_status = readl(&mrioc->sysif_regs->ioc_status); ioc_config = readl(&mrioc->sysif_regs->ioc_configuration); @@ -4609,11 +4629,11 @@ static void mpi3mr_issue_ioc_shutdown(struct mpi3mr_ioc *mrioc) if ((ioc_status & MPI3_SYSIF_IOC_STATUS_SHUTDOWN_MASK) == MPI3_SYSIF_IOC_STATUS_SHUTDOWN_IN_PROGRESS) ioc_warn(mrioc, - "shutdown still in progress after timeout\n"); + "shutdown still in progress\n"); } ioc_info(mrioc, - "Base IOC Sts/Config after %s shutdown is (0x%x)/(0x%x)\n", + "ioc_status/ioc_config after %s shutdown is (0x%x)/(0x%x)\n", (!retval) ? "successful" : "failed", ioc_status, ioc_config); } From patchwork Thu Dec 14 20:58:59 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ranjan Kumar X-Patchwork-Id: 13493681 Received: from mail-io1-f54.google.com (mail-io1-f54.google.com [209.85.166.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B947D7494 for ; Thu, 14 Dec 2023 21:01:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=broadcom.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=broadcom.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=broadcom.com header.i=@broadcom.com header.b="avRPuL/E" Received: by mail-io1-f54.google.com with SMTP id ca18e2360f4ac-7b6fa79b547so508971039f.1 for ; Thu, 14 Dec 2023 13:01:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1702587676; x=1703192476; darn=vger.kernel.org; h=mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:from:to:cc:subject:date:message-id:reply-to; bh=eoCwyQdBQNplETbcUkUFUES+7wPPhF9uGlbIiVxkCcI=; b=avRPuL/ENobub2Rd+y1QJ/n758hJ4ttZFzr3Mx1CYMIvk7K1A+A9r7Cn+lxuF3wLU0 Rk1IaXThxjZV2U28fBw1dO1pITxyi9ZOGw0xXgyHBR8Zd0Ea0z6QbWW1ZwbQFWDUrHVV 3NAnZMMv9NYgoslBFZN8ozEYkRQ1X26w0cV7g= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1702587676; x=1703192476; h=mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=eoCwyQdBQNplETbcUkUFUES+7wPPhF9uGlbIiVxkCcI=; b=p1L47AFsQFRcfjE8blrY7NheEV2T4yfQq3G8x7MNFJMcQ6nUsgEuhl5Hsks27MwLeC eFB1XlcYAtxelTevFEwzvocbLMR9IRMxGQbPskC6neyMeXEgrincCjTOsKBuIAAjtyTn U+2+9NYMk2B7kNomVrlaky9/TvFOFbCt97YoNG3dskRnkHF61THIduApvSSjHcI8F8Kh cyy67Lbs4j37RFf3jyl9u/zi78Iut7TUWFN/7pT+Fwvj8lL2GkwnPwP6xaubT1CGVZPS HbmtgPUU3CSQvkK9bo2BcQ+A9/G7gRKAKC7PJHNIM0K4PLPah1aWdJmMFj3Tz3HrWWrM GdHA== X-Gm-Message-State: AOJu0YywoUkhQZm1J4dX6MHcW165ZQMKukCPyOzaAiWPsL/LNJtpkeX2 a0D4jZxyxYvI2Ilw3QGUwEGIBfv8lD/07dNgtiIcH2jma/RlMuuTKoL7Pg9GK/FRpJa0VqpBiv5 y1yyhFxRk2n6OBBz7wgtIzUak9Dt82bbqx1grpch2PpV9dkUHJbLPreJUpEH/yH1ZWMz5+H813S nfhsBs2oG10A== X-Google-Smtp-Source: AGHT+IFfvULEMtEpnnMCw1qRcCc/iJ4mFRP+Lzm3MLfh3ZxqSnrh+VkjwXmKKFt0fCpIPU9vDxcg2w== X-Received: by 2002:a92:c269:0:b0:35f:7715:6cdd with SMTP id h9-20020a92c269000000b0035f77156cddmr3785669ild.33.1702587676066; Thu, 14 Dec 2023 13:01:16 -0800 (PST) Received: from localhost.localdomain ([192.19.234.250]) by smtp.gmail.com with ESMTPSA id bv190-20020a632ec7000000b005c2967852c5sm11904303pgb.30.2023.12.14.13.01.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 Dec 2023 13:01:15 -0800 (PST) From: Ranjan Kumar To: linux-scsi@vger.kernel.org, martin.petersen@oracle.com Cc: rajsekhar.chundru@broadcom.com, sathya.prakash@broadcom.com, sumit.saxena@broadcom.com, chandrakanth.patil@broadcom.com, prayas.patel@broadcom.com, Ranjan Kumar Subject: [PATCH v2 5/6] mpi3mr: Reset stop_bsgs flag post controller reset failure Date: Fri, 15 Dec 2023 02:28:59 +0530 Message-Id: <20231214205900.270488-6-ranjan.kumar@broadcom.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20231214205900.270488-1-ranjan.kumar@broadcom.com> References: <20231214205900.270488-1-ranjan.kumar@broadcom.com> Precedence: bulk X-Mailing-List: linux-scsi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 stop_bsgs flag blocks the ioctls during controller reset. currently, it remains set after a controller failure, so resetting it. Signed-off-by: Sumit Saxena Signed-off-by: Ranjan Kumar --- drivers/scsi/mpi3mr/mpi3mr_fw.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/scsi/mpi3mr/mpi3mr_fw.c b/drivers/scsi/mpi3mr/mpi3mr_fw.c index 491ef854fdba..209920cd5ec2 100644 --- a/drivers/scsi/mpi3mr/mpi3mr_fw.c +++ b/drivers/scsi/mpi3mr/mpi3mr_fw.c @@ -5136,6 +5136,7 @@ int mpi3mr_soft_reset_handler(struct mpi3mr_ioc *mrioc, mrioc->device_refresh_on = 0; mrioc->unrecoverable = 1; mrioc->reset_in_progress = 0; + mrioc->stop_bsgs = 0; retval = -1; mpi3mr_flush_cmds_for_unrecovered_controller(mrioc); } From patchwork Thu Dec 14 20:59:00 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ranjan Kumar X-Patchwork-Id: 13493682 Received: from mail-pf1-f177.google.com (mail-pf1-f177.google.com [209.85.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1C23C54277 for ; Thu, 14 Dec 2023 21:01:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=broadcom.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=broadcom.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=broadcom.com header.i=@broadcom.com header.b="D36naECr" Received: by mail-pf1-f177.google.com with SMTP id d2e1a72fcca58-6ce972ac39dso5754838b3a.3 for ; Thu, 14 Dec 2023 13:01:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1702587679; x=1703192479; darn=vger.kernel.org; h=mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:from:to:cc:subject:date:message-id:reply-to; bh=IQ7v9oV72bW1L7iF+/ICZi/S2pBtwO+QoQzkegQ7R6c=; b=D36naECrUITkqMbdznHMRUVsTQXFR59mQ0PacDG7iSsO3elHiJkBBhmq6dE2zF/1dd 0yf8D8bVTlFsWh7r2OQv6aKlr+WQ8nq0Rdb6JLo6dYleYbmvAxbKjDaGujov3BL/jgc0 Wp4tJ9eaN7ihibwj2vIotySFlP5e1tl1Cg7q0= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1702587679; x=1703192479; h=mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=IQ7v9oV72bW1L7iF+/ICZi/S2pBtwO+QoQzkegQ7R6c=; b=azQImByVkP1w6+TODcWYf/LyIcW5uo7nOcZdpzkgy5oILzmccz1SZLwD22HKHtJBWb rb8CIgvdiGSl1B/nZtl1SOrcqwijprXFZoZrHJhoGCPDK77QTV6wSVWossZu8QFlSbI2 6uZHh5nZG/lyvbCePrugHGm+D4OTeQtaIG4a9h0n9tsHz+G33Sf2PpA/OzwhxPVgMi6C K9c/D1pWNmU+KMUMVFiE2eVIhueJsVjz15QgRiWAc0/pt5y7jVGZJzKMPh1fdJNhP8sM OnsbPuBkvF16KN5N/G0eGb+FHyhPFUt1DZir3+n6t/IIhuyp+/tkT2hTsa81TOSdHSzh Q87Q== X-Gm-Message-State: AOJu0YwHq6xpI+pIESUMTYIDzjxy28vBXveb3YQ94/1xCXmDEMp2ddHP kf04QQwOSWrX1dNOr2QozahKq+YkZYN6VOv0hHmwr1gIAIp1uddP6CcTxeaWuJoSjiQJjgQuRnl 1nj17mLMUgMLfVbdJ28/Vk+JI0YAb3FibAOir0iHJH+HcFzGo6lVrgXLopJolxHkh9+vVICTLc6 FYOk6Yr8ZIVw== X-Google-Smtp-Source: AGHT+IF1TbHivlqpzLJn01DrawkLOsK05IVdj+cnPMJMlB/lJrMcLDFhldt9ywiD5xI/jP/nO8SJTA== X-Received: by 2002:a05:6a20:3d28:b0:190:7f2a:6b29 with SMTP id y40-20020a056a203d2800b001907f2a6b29mr6642540pzi.82.1702587679390; Thu, 14 Dec 2023 13:01:19 -0800 (PST) Received: from localhost.localdomain ([192.19.234.250]) by smtp.gmail.com with ESMTPSA id bv190-20020a632ec7000000b005c2967852c5sm11904303pgb.30.2023.12.14.13.01.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 Dec 2023 13:01:18 -0800 (PST) From: Ranjan Kumar To: linux-scsi@vger.kernel.org, martin.petersen@oracle.com Cc: rajsekhar.chundru@broadcom.com, sathya.prakash@broadcom.com, sumit.saxena@broadcom.com, chandrakanth.patil@broadcom.com, prayas.patel@broadcom.com, Ranjan Kumar Subject: [PATCH v2 6/6] mpi3mr: Update driver version to 8.6.1.0.50 Date: Fri, 15 Dec 2023 02:29:00 +0530 Message-Id: <20231214205900.270488-7-ranjan.kumar@broadcom.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20231214205900.270488-1-ranjan.kumar@broadcom.com> References: <20231214205900.270488-1-ranjan.kumar@broadcom.com> Precedence: bulk X-Mailing-List: linux-scsi@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Update driver version to 8.6.1.0.50 Signed-off-by: Ranjan Kumar --- drivers/scsi/mpi3mr/mpi3mr.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/scsi/mpi3mr/mpi3mr.h b/drivers/scsi/mpi3mr/mpi3mr.h index de953eb055d0..d6e43862221f 100644 --- a/drivers/scsi/mpi3mr/mpi3mr.h +++ b/drivers/scsi/mpi3mr/mpi3mr.h @@ -56,8 +56,8 @@ extern struct list_head mrioc_list; extern int prot_mask; extern atomic64_t event_counter; -#define MPI3MR_DRIVER_VERSION "8.5.1.0.0" -#define MPI3MR_DRIVER_RELDATE "5-December-2023" +#define MPI3MR_DRIVER_VERSION "8.6.1.0.50" +#define MPI3MR_DRIVER_RELDATE "6-December-2023" #define MPI3MR_DRIVER_NAME "mpi3mr" #define MPI3MR_DRIVER_LICENSE "GPL"