From patchwork Tue Mar 21 07:22:59 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: yangxingui X-Patchwork-Id: 72730 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:604a:0:0:0:0:0 with SMTP id j10csp1637615wrt; Tue, 21 Mar 2023 00:33:42 -0700 (PDT) X-Google-Smtp-Source: AK7set+BIOzQzaS75o5x5tvkPEQzCK8gotUxfQK4EhFPPg8cM1USn9ol3yd+yUQgTSOipnlClK0k X-Received: by 2002:a17:902:d481:b0:19f:31cc:47fc with SMTP id c1-20020a170902d48100b0019f31cc47fcmr1445429plg.39.1679384022310; Tue, 21 Mar 2023 00:33:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1679384022; cv=none; d=google.com; s=arc-20160816; b=bGLg2dml5cxn/bLOlhGTky/FcFTIan5YqpX5hucjQBEdoUd9doyZGBofiex95bvMYt WcdMjSRD89Z+fTJuRwawp5WLvtvx/11J/Rr85UVbOrBw4Vh97PXspvKAiQdFGMHs2z+P 5+mqjLWsOiO9kgg5NePIkbWVqoofI4A3MC5iAgwRU1TVahArPeCQctG58LCyzkGvVmO8 oxK0Wp3ePGF0V6mvLDB0n6kE850N3jIvu51NGfmBNSpk2EH/UTXeeshnMh/srLtUdY82 9FpSTsBVF5qGKpoTLOatlHQMxvwBWF/Pfzjve5CtRJ/ktEod5swSwIirkd2auTs1b7Rx 4VqQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:message-id:date:subject:cc:to:from; bh=ZgnLdbalYJaZ+AHaq2PujhMzO0WvuV/E06dtzL9F8dg=; b=Lxt5FW+xpusS5sfwmIgqJR62NiYKAGZwgKSdNOPPHkbOIOQpR2JtRDTHDjjd1Knhwz MvvtLoZN7n7IlsI8FUUJOv2hBqrI3EFut/pGcDmui+j3AlPD4jjmUhRj9dg/nG4nMBh0 Xp0eEXGcdNzZI/19wKDdNorWy7sPiW1IUFipPf16ZCd9n8f/PEy3e738aF4KZ/hGz0kP bas2AJNSghTfN3Qah5fnfaSk5MKTFxh2iQBx3XZ1F7CqYExJlpoWQUZyGbW4Bc7mcKlX XA8fWIgxJfhwHB57sCnfXl+F2ZB3k3EMmgmvWIc9T32mQ+mQIuwBl8Mb5EK7PF99m+kP vxVQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id km13-20020a17090327cd00b0019ce503d057si11525645plb.519.2023.03.21.00.33.26; Tue, 21 Mar 2023 00:33:42 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229694AbjCUH3h (ORCPT + 99 others); Tue, 21 Mar 2023 03:29:37 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56932 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229541AbjCUH3d (ORCPT ); Tue, 21 Mar 2023 03:29:33 -0400 Received: from szxga01-in.huawei.com (szxga01-in.huawei.com [45.249.212.187]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2D11534027; Tue, 21 Mar 2023 00:29:29 -0700 (PDT) Received: from dggpemm500012.china.huawei.com (unknown [172.30.72.54]) by szxga01-in.huawei.com (SkyGuard) with ESMTP id 4PgjrW5G0xzrVDj; Tue, 21 Mar 2023 15:28:27 +0800 (CST) Received: from localhost.localdomain (10.50.163.32) by dggpemm500012.china.huawei.com (7.185.36.89) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.21; Tue, 21 Mar 2023 15:29:27 +0800 From: Xingui Yang To: , , CC: , , , , , Subject: [PATCH] scsi: libsas: Add end eh callback Date: Tue, 21 Mar 2023 07:22:59 +0000 Message-ID: <20230321072259.35366-1-yangxingui@huawei.com> X-Mailer: git-send-email 2.17.1 MIME-Version: 1.0 X-Originating-IP: [10.50.163.32] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To dggpemm500012.china.huawei.com (7.185.36.89) X-CFilter-Loop: Reflected X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1760961780707707059?= X-GMAIL-MSGID: =?utf-8?q?1760961780707707059?= If an error occurs while the disk is processing an NCQ command and the host received the abnormal SDB FIS, let libata EH to analyze the NCQ error, and it is not necessary to reset the target to recover. Then the hisi_sas has some special process to set dev_status to normal when end the eh for NCQ error without reset the target, so add a callback and fill it in for the hisi_sas driver. Signed-off-by: Xingui Yang --- drivers/scsi/hisi_sas/hisi_sas_main.c | 12 +++++++++--- drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 7 +++++-- drivers/scsi/libsas/sas_ata.c | 4 ++++ include/scsi/libsas.h | 2 ++ 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c index 325d6d6a21c3..61686ead0027 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_main.c +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c @@ -1777,9 +1777,6 @@ static int hisi_sas_I_T_nexus_reset(struct domain_device *device) struct device *dev = hisi_hba->dev; int rc; - if (sas_dev->dev_status == HISI_SAS_DEV_NCQ_ERR) - sas_dev->dev_status = HISI_SAS_DEV_NORMAL; - rc = hisi_sas_internal_task_abort_dev(sas_dev, false); if (rc < 0) { dev_err(dev, "I_T nexus reset: internal abort (%d)\n", rc); @@ -1967,6 +1964,14 @@ static bool hisi_sas_internal_abort_timeout(struct sas_task *task, return false; } +static void hisi_sas_end_eh(struct domain_device *dev) +{ + struct hisi_sas_device *sas_dev = dev->lldd_dev; + + if (sas_dev->dev_status == HISI_SAS_DEV_NCQ_ERR) + sas_dev->dev_status = HISI_SAS_DEV_NORMAL; +} + static void hisi_sas_port_formed(struct asd_sas_phy *sas_phy) { hisi_sas_port_notify_formed(sas_phy); @@ -2083,6 +2088,7 @@ static struct sas_domain_function_template hisi_sas_transport_ops = { .lldd_write_gpio = hisi_sas_write_gpio, .lldd_tmf_aborted = hisi_sas_tmf_aborted, .lldd_abort_timeout = hisi_sas_internal_abort_timeout, + .lldd_end_eh = hisi_sas_end_eh, }; void hisi_sas_init_mem(struct hisi_hba *hisi_hba) diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c index 66fcb340b98e..abad57de4aee 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c @@ -2433,15 +2433,18 @@ static int complete_v3_hw(struct hisi_sas_cq *cq) struct hisi_sas_device *sas_dev = &hisi_hba->devices[device_id]; struct domain_device *device = sas_dev->sas_device; + bool force_reset = true; dev_err(dev, "erroneous completion disk err dev id=%d sas_addr=0x%llx CQ hdr: 0x%x 0x%x 0x%x 0x%x\n", device_id, itct->sas_addr, dw0, dw1, complete_hdr->act, dw3); - if (is_ncq_err_v3_hw(complete_hdr)) + if (is_ncq_err_v3_hw(complete_hdr)) { sas_dev->dev_status = HISI_SAS_DEV_NCQ_ERR; + force_reset = false; + } - sas_ata_device_link_abort(device, true); + sas_ata_device_link_abort(device, force_reset); } else if (likely(iptt < HISI_SAS_COMMAND_ENTRIES_V3_HW)) { slot = &hisi_hba->slot_info[iptt]; slot->cmplt_queue_slot = rd_point; diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c index 77714a495cbb..2d48643a08cf 100644 --- a/drivers/scsi/libsas/sas_ata.c +++ b/drivers/scsi/libsas/sas_ata.c @@ -539,6 +539,10 @@ void sas_ata_end_eh(struct ata_port *ap) spin_lock_irqsave(&ha->lock, flags); if (test_and_clear_bit(SAS_DEV_EH_PENDING, &dev->state)) ha->eh_active--; + + if (i->dft->lldd_end_eh) + i->dft->lldd_end_eh(device); + spin_unlock_irqrestore(&ha->lock, flags); } diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index 159823e0afbf..659395ef616e 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h @@ -683,6 +683,8 @@ struct sas_domain_function_template { int (*lldd_lu_reset)(struct domain_device *, u8 *lun); int (*lldd_query_task)(struct sas_task *); + void (*lldd_end_eh)(struct domain_device *dev); + /* Special TMF callbacks */ void (*lldd_tmf_exec_complete)(struct domain_device *dev); void (*lldd_tmf_aborted)(struct sas_task *task);