From nobody Tue Jun 30 04:37:39 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 17A74C433EF for ; Tue, 25 Jan 2022 11:43:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S244105AbiAYLmf (ORCPT ); Tue, 25 Jan 2022 06:42:35 -0500 Received: from frasgout.his.huawei.com ([185.176.79.56]:4493 "EHLO frasgout.his.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1382067AbiAYLin (ORCPT ); Tue, 25 Jan 2022 06:38:43 -0500 Received: from fraeml709-chm.china.huawei.com (unknown [172.18.147.201]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4JjlBs34Sdz687G4; Tue, 25 Jan 2022 19:35:01 +0800 (CST) Received: from lhreml724-chm.china.huawei.com (10.201.108.75) by fraeml709-chm.china.huawei.com (10.206.15.37) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 12:38:26 +0100 Received: from localhost.localdomain (10.69.192.58) by lhreml724-chm.china.huawei.com (10.201.108.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 11:38:22 +0000 From: John Garry To: , , , , , CC: , , , , , , , , John Garry Subject: [PATCH 01/16] scsi: libsas: Use enum for response frame DATAPRES field Date: Tue, 25 Jan 2022 19:32:37 +0800 Message-ID: <1643110372-85470-2-git-send-email-john.garry@huawei.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1643110372-85470-1-git-send-email-john.garry@huawei.com> References: <1643110372-85470-1-git-send-email-john.garry@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.69.192.58] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To lhreml724-chm.china.huawei.com (10.201.108.75) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" As defined in table 126 of the SAS spec 1.1, use an enum for the DATAPRES field, which makes reading the code easier. Signed-off-by: John Garry Reported-by: Damien Le Moal Reviewed-by: Jack Wang Tested-by: liyihang6@hisilicon.com --- drivers/scsi/libsas/sas_task.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/scsi/libsas/sas_task.c b/drivers/scsi/libsas/sas_task.c index 2966ead1d421..7240fd22b154 100644 --- a/drivers/scsi/libsas/sas_task.c +++ b/drivers/scsi/libsas/sas_task.c @@ -7,6 +7,12 @@ #include #include =20 +enum { + NO_DATA =3D 0, + RESPONSE_DATA =3D 1, + SENSE_DATA =3D 2, +}; + /* fill task_status_struct based on SSP response frame */ void sas_ssp_task_response(struct device *dev, struct sas_task *task, struct ssp_response_iu *iu) @@ -15,11 +21,11 @@ void sas_ssp_task_response(struct device *dev, struct s= as_task *task, =20 tstat->resp =3D SAS_TASK_COMPLETE; =20 - if (iu->datapres =3D=3D 0) + if (iu->datapres =3D=3D NO_DATA) tstat->stat =3D iu->status; - else if (iu->datapres =3D=3D 1) + else if (iu->datapres =3D=3D RESPONSE_DATA) tstat->stat =3D iu->resp_data[3]; - else if (iu->datapres =3D=3D 2) { + else if (iu->datapres =3D=3D SENSE_DATA) { tstat->stat =3D SAS_SAM_STAT_CHECK_CONDITION; tstat->buf_valid_size =3D min_t(int, SAS_STATUS_BUF_SIZE, --=20 2.26.2 From nobody Tue Jun 30 04:37:39 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C882BC433EF for ; Tue, 25 Jan 2022 11:44:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1382855AbiAYLnn (ORCPT ); Tue, 25 Jan 2022 06:43:43 -0500 Received: from frasgout.his.huawei.com ([185.176.79.56]:4494 "EHLO frasgout.his.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1382068AbiAYLio (ORCPT ); Tue, 25 Jan 2022 06:38:44 -0500 Received: from fraeml707-chm.china.huawei.com (unknown [172.18.147.207]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4Jjl9y4bfrz6873Q; Tue, 25 Jan 2022 19:34:14 +0800 (CST) Received: from lhreml724-chm.china.huawei.com (10.201.108.75) by fraeml707-chm.china.huawei.com (10.206.15.35) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 12:38:30 +0100 Received: from localhost.localdomain (10.69.192.58) by lhreml724-chm.china.huawei.com (10.201.108.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 11:38:26 +0000 From: John Garry To: , , , , , CC: , , , , , , , , John Garry Subject: [PATCH 02/16] scsi: libsas: Delete lldd_clear_aca callback Date: Tue, 25 Jan 2022 19:32:38 +0800 Message-ID: <1643110372-85470-3-git-send-email-john.garry@huawei.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1643110372-85470-1-git-send-email-john.garry@huawei.com> References: <1643110372-85470-1-git-send-email-john.garry@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.69.192.58] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To lhreml724-chm.china.huawei.com (10.201.108.75) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This callback is never called, so remove support. Signed-off-by: John Garry Reported-by: Damien Le Moal Reviewed-by: Christoph Hellwig Reviewed-by: Jack Wang Reviewed-by: Xiang Chen Tested-by: liyihang6@hisilicon.com --- Documentation/scsi/libsas.rst | 2 -- drivers/scsi/aic94xx/aic94xx.h | 1 - drivers/scsi/aic94xx/aic94xx_init.c | 1 - drivers/scsi/aic94xx/aic94xx_tmf.c | 9 --------- drivers/scsi/hisi_sas/hisi_sas_main.c | 12 ------------ drivers/scsi/isci/init.c | 1 - drivers/scsi/isci/task.c | 18 ------------------ drivers/scsi/isci/task.h | 4 ---- drivers/scsi/mvsas/mv_init.c | 1 - drivers/scsi/mvsas/mv_sas.c | 11 ----------- drivers/scsi/mvsas/mv_sas.h | 1 - drivers/scsi/pm8001/pm8001_init.c | 1 - drivers/scsi/pm8001/pm8001_sas.c | 8 -------- drivers/scsi/pm8001/pm8001_sas.h | 1 - include/scsi/libsas.h | 1 - 15 files changed, 72 deletions(-) diff --git a/Documentation/scsi/libsas.rst b/Documentation/scsi/libsas.rst index 6589dfefbc02..305a253d5c3b 100644 --- a/Documentation/scsi/libsas.rst +++ b/Documentation/scsi/libsas.rst @@ -207,7 +207,6 @@ Management Functions (TMFs) described in SAM:: /* Task Management Functions. Must be called from process context. */ int (*lldd_abort_task)(struct sas_task *); int (*lldd_abort_task_set)(struct domain_device *, u8 *lun); - int (*lldd_clear_aca)(struct domain_device *, u8 *lun); int (*lldd_clear_task_set)(struct domain_device *, u8 *lun); int (*lldd_I_T_nexus_reset)(struct domain_device *); int (*lldd_lu_reset)(struct domain_device *, u8 *lun); @@ -262,7 +261,6 @@ can look like this (called last thing from probe()) =20 my_ha->sas_ha.lldd_abort_task =3D my_abort_task; my_ha->sas_ha.lldd_abort_task_set =3D my_abort_task_set; - my_ha->sas_ha.lldd_clear_aca =3D my_clear_aca; my_ha->sas_ha.lldd_clear_task_set =3D my_clear_task_set; my_ha->sas_ha.lldd_I_T_nexus_reset=3D NULL; (2) my_ha->sas_ha.lldd_lu_reset =3D my_lu_reset; diff --git a/drivers/scsi/aic94xx/aic94xx.h b/drivers/scsi/aic94xx/aic94xx.h index 8f24180646c2..f595bc2ee45e 100644 --- a/drivers/scsi/aic94xx/aic94xx.h +++ b/drivers/scsi/aic94xx/aic94xx.h @@ -60,7 +60,6 @@ void asd_set_dmamode(struct domain_device *dev); /* ---------- TMFs ---------- */ int asd_abort_task(struct sas_task *); int asd_abort_task_set(struct domain_device *, u8 *lun); -int asd_clear_aca(struct domain_device *, u8 *lun); int asd_clear_task_set(struct domain_device *, u8 *lun); int asd_lu_reset(struct domain_device *, u8 *lun); int asd_I_T_nexus_reset(struct domain_device *dev); diff --git a/drivers/scsi/aic94xx/aic94xx_init.c b/drivers/scsi/aic94xx/aic= 94xx_init.c index 7a78606598c4..954d0c5ae2e2 100644 --- a/drivers/scsi/aic94xx/aic94xx_init.c +++ b/drivers/scsi/aic94xx/aic94xx_init.c @@ -960,7 +960,6 @@ static struct sas_domain_function_template aic94xx_tran= sport_functions =3D { =20 .lldd_abort_task =3D asd_abort_task, .lldd_abort_task_set =3D asd_abort_task_set, - .lldd_clear_aca =3D asd_clear_aca, .lldd_clear_task_set =3D asd_clear_task_set, .lldd_I_T_nexus_reset =3D asd_I_T_nexus_reset, .lldd_lu_reset =3D asd_lu_reset, diff --git a/drivers/scsi/aic94xx/aic94xx_tmf.c b/drivers/scsi/aic94xx/aic9= 4xx_tmf.c index 0eb6e206a2b4..0ff0d6506ccf 100644 --- a/drivers/scsi/aic94xx/aic94xx_tmf.c +++ b/drivers/scsi/aic94xx/aic94xx_tmf.c @@ -644,15 +644,6 @@ int asd_abort_task_set(struct domain_device *dev, u8 *= lun) return res; } =20 -int asd_clear_aca(struct domain_device *dev, u8 *lun) -{ - int res =3D asd_initiate_ssp_tmf(dev, lun, TMF_CLEAR_ACA, 0); - - if (res =3D=3D TMF_RESP_FUNC_COMPLETE) - asd_clear_nexus_I_T_L(dev, lun); - return res; -} - int asd_clear_task_set(struct domain_device *dev, u8 *lun) { int res =3D asd_initiate_ssp_tmf(dev, lun, TMF_CLEAR_TASK_SET, 0); diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/= hisi_sas_main.c index a05ec7aece5a..f014e458edbb 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_main.c +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c @@ -1801,17 +1801,6 @@ static int hisi_sas_abort_task_set(struct domain_dev= ice *device, u8 *lun) return rc; } =20 -static int hisi_sas_clear_aca(struct domain_device *device, u8 *lun) -{ - struct hisi_sas_tmf_task tmf_task; - int rc; - - tmf_task.tmf =3D TMF_CLEAR_ACA; - rc =3D hisi_sas_debug_issue_ssp_tmf(device, lun, &tmf_task); - - return rc; -} - #define I_T_NEXUS_RESET_PHYUP_TIMEOUT (2 * HZ) =20 static int hisi_sas_debug_I_T_nexus_reset(struct domain_device *device) @@ -2341,7 +2330,6 @@ static struct sas_domain_function_template hisi_sas_t= ransport_ops =3D { .lldd_control_phy =3D hisi_sas_control_phy, .lldd_abort_task =3D hisi_sas_abort_task, .lldd_abort_task_set =3D hisi_sas_abort_task_set, - .lldd_clear_aca =3D hisi_sas_clear_aca, .lldd_I_T_nexus_reset =3D hisi_sas_I_T_nexus_reset, .lldd_lu_reset =3D hisi_sas_lu_reset, .lldd_query_task =3D hisi_sas_query_task, diff --git a/drivers/scsi/isci/init.c b/drivers/scsi/isci/init.c index aade707c5553..e294d5d961eb 100644 --- a/drivers/scsi/isci/init.c +++ b/drivers/scsi/isci/init.c @@ -193,7 +193,6 @@ static struct sas_domain_function_template isci_transpo= rt_ops =3D { /* Task Management Functions. Must be called from process context. */ .lldd_abort_task =3D isci_task_abort_task, .lldd_abort_task_set =3D isci_task_abort_task_set, - .lldd_clear_aca =3D isci_task_clear_aca, .lldd_clear_task_set =3D isci_task_clear_task_set, .lldd_I_T_nexus_reset =3D isci_task_I_T_nexus_reset, .lldd_lu_reset =3D isci_task_lu_reset, diff --git a/drivers/scsi/isci/task.c b/drivers/scsi/isci/task.c index 3fd88d72a0c0..403bfee34d84 100644 --- a/drivers/scsi/isci/task.c +++ b/drivers/scsi/isci/task.c @@ -625,24 +625,6 @@ int isci_task_abort_task_set( } =20 =20 -/** - * isci_task_clear_aca() - This function is one of the SAS Domain Template - * functions. This is one of the Task Management functoins called by li= bsas. - * @d_device: This parameter specifies the domain device associated with t= his - * request. - * @lun: This parameter specifies the lun associated with this request. - * - * status, zero indicates success. - */ -int isci_task_clear_aca( - struct domain_device *d_device, - u8 *lun) -{ - return TMF_RESP_FUNC_FAILED; -} - - - /** * isci_task_clear_task_set() - This function is one of the SAS Domain Tem= plate * functions. This is one of the Task Management functoins called by li= bsas. diff --git a/drivers/scsi/isci/task.h b/drivers/scsi/isci/task.h index cae168b8916f..f96633fa6939 100644 --- a/drivers/scsi/isci/task.h +++ b/drivers/scsi/isci/task.h @@ -140,10 +140,6 @@ int isci_task_abort_task_set( struct domain_device *d_device, u8 *lun); =20 -int isci_task_clear_aca( - struct domain_device *d_device, - u8 *lun); - int isci_task_clear_task_set( struct domain_device *d_device, u8 *lun); diff --git a/drivers/scsi/mvsas/mv_init.c b/drivers/scsi/mvsas/mv_init.c index dcae2d4464f9..21429e3a3632 100644 --- a/drivers/scsi/mvsas/mv_init.c +++ b/drivers/scsi/mvsas/mv_init.c @@ -64,7 +64,6 @@ static struct sas_domain_function_template mvs_transport_= ops =3D { =20 .lldd_abort_task =3D mvs_abort_task, .lldd_abort_task_set =3D mvs_abort_task_set, - .lldd_clear_aca =3D mvs_clear_aca, .lldd_clear_task_set =3D mvs_clear_task_set, .lldd_I_T_nexus_reset =3D mvs_I_T_nexus_reset, .lldd_lu_reset =3D mvs_lu_reset, diff --git a/drivers/scsi/mvsas/mv_sas.c b/drivers/scsi/mvsas/mv_sas.c index 1e52bc7febfa..fd273c3e069e 100644 --- a/drivers/scsi/mvsas/mv_sas.c +++ b/drivers/scsi/mvsas/mv_sas.c @@ -1553,17 +1553,6 @@ int mvs_abort_task_set(struct domain_device *dev, u8= *lun) return rc; } =20 -int mvs_clear_aca(struct domain_device *dev, u8 *lun) -{ - int rc =3D TMF_RESP_FUNC_FAILED; - struct mvs_tmf_task tmf_task; - - tmf_task.tmf =3D TMF_CLEAR_ACA; - rc =3D mvs_debug_issue_ssp_tmf(dev, lun, &tmf_task); - - return rc; -} - int mvs_clear_task_set(struct domain_device *dev, u8 *lun) { int rc =3D TMF_RESP_FUNC_FAILED; diff --git a/drivers/scsi/mvsas/mv_sas.h b/drivers/scsi/mvsas/mv_sas.h index 8ff976c9967e..fa654c73beee 100644 --- a/drivers/scsi/mvsas/mv_sas.h +++ b/drivers/scsi/mvsas/mv_sas.h @@ -441,7 +441,6 @@ int mvs_scan_finished(struct Scsi_Host *shost, unsigned= long time); int mvs_queue_command(struct sas_task *task, gfp_t gfp_flags); int mvs_abort_task(struct sas_task *task); int mvs_abort_task_set(struct domain_device *dev, u8 *lun); -int mvs_clear_aca(struct domain_device *dev, u8 *lun); int mvs_clear_task_set(struct domain_device *dev, u8 * lun); void mvs_port_formed(struct asd_sas_phy *sas_phy); void mvs_port_deformed(struct asd_sas_phy *sas_phy); diff --git a/drivers/scsi/pm8001/pm8001_init.c b/drivers/scsi/pm8001/pm8001= _init.c index d8a2121cb8d9..b8cf1bae4040 100644 --- a/drivers/scsi/pm8001/pm8001_init.c +++ b/drivers/scsi/pm8001/pm8001_init.c @@ -123,7 +123,6 @@ static struct sas_domain_function_template pm8001_trans= port_ops =3D { =20 .lldd_abort_task =3D pm8001_abort_task, .lldd_abort_task_set =3D pm8001_abort_task_set, - .lldd_clear_aca =3D pm8001_clear_aca, .lldd_clear_task_set =3D pm8001_clear_task_set, .lldd_I_T_nexus_reset =3D pm8001_I_T_nexus_reset, .lldd_lu_reset =3D pm8001_lu_reset, diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_= sas.c index 160ee8b228c9..4368122ab475 100644 --- a/drivers/scsi/pm8001/pm8001_sas.c +++ b/drivers/scsi/pm8001/pm8001_sas.c @@ -1357,14 +1357,6 @@ int pm8001_abort_task_set(struct domain_device *dev,= u8 *lun) return pm8001_issue_ssp_tmf(dev, lun, &tmf_task); } =20 -int pm8001_clear_aca(struct domain_device *dev, u8 *lun) -{ - struct pm8001_tmf_task tmf_task; - - tmf_task.tmf =3D TMF_CLEAR_ACA; - return pm8001_issue_ssp_tmf(dev, lun, &tmf_task); -} - int pm8001_clear_task_set(struct domain_device *dev, u8 *lun) { struct pm8001_tmf_task tmf_task; diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_= sas.h index a17da1cebce1..3ea53a0d0cc1 100644 --- a/drivers/scsi/pm8001/pm8001_sas.h +++ b/drivers/scsi/pm8001/pm8001_sas.h @@ -649,7 +649,6 @@ int pm8001_scan_finished(struct Scsi_Host *shost, unsig= ned long time); int pm8001_queue_command(struct sas_task *task, gfp_t gfp_flags); int pm8001_abort_task(struct sas_task *task); int pm8001_abort_task_set(struct domain_device *dev, u8 *lun); -int pm8001_clear_aca(struct domain_device *dev, u8 *lun); int pm8001_clear_task_set(struct domain_device *dev, u8 *lun); int pm8001_dev_found(struct domain_device *dev); void pm8001_dev_gone(struct domain_device *dev); diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index 698f2032807b..d59618898619 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h @@ -637,7 +637,6 @@ struct sas_domain_function_template { /* Task Management Functions. Must be called from process context. */ int (*lldd_abort_task)(struct sas_task *); int (*lldd_abort_task_set)(struct domain_device *, u8 *lun); - int (*lldd_clear_aca)(struct domain_device *, u8 *lun); int (*lldd_clear_task_set)(struct domain_device *, u8 *lun); int (*lldd_I_T_nexus_reset)(struct domain_device *); int (*lldd_ata_check_ready)(struct domain_device *); --=20 2.26.2 From nobody Tue Jun 30 04:37:39 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8CF33C433F5 for ; Tue, 25 Jan 2022 11:44:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1354384AbiAYLmw (ORCPT ); Tue, 25 Jan 2022 06:42:52 -0500 Received: from frasgout.his.huawei.com ([185.176.79.56]:4495 "EHLO frasgout.his.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1382095AbiAYLin (ORCPT ); Tue, 25 Jan 2022 06:38:43 -0500 Received: from fraeml708-chm.china.huawei.com (unknown [172.18.147.226]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4JjlGW6D7Gz685YM; Tue, 25 Jan 2022 19:38:11 +0800 (CST) Received: from lhreml724-chm.china.huawei.com (10.201.108.75) by fraeml708-chm.china.huawei.com (10.206.15.36) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 12:38:33 +0100 Received: from localhost.localdomain (10.69.192.58) by lhreml724-chm.china.huawei.com (10.201.108.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 11:38:30 +0000 From: John Garry To: , , , , , CC: , , , , , , , , John Garry Subject: [PATCH 03/16] scsi: hisi_sas: Delete unused I_T_NEXUS_RESET_PHYUP_TIMEOUT Date: Tue, 25 Jan 2022 19:32:39 +0800 Message-ID: <1643110372-85470-4-git-send-email-john.garry@huawei.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1643110372-85470-1-git-send-email-john.garry@huawei.com> References: <1643110372-85470-1-git-send-email-john.garry@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.69.192.58] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To lhreml724-chm.china.huawei.com (10.201.108.75) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" There is no user, so delete it. Signed-off-by: John Garry Reported-by: Damien Le Moal Tested-by: liyihang6@hisilicon.com --- drivers/scsi/hisi_sas/hisi_sas_main.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/= hisi_sas_main.c index f014e458edbb..61414a308906 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_main.c +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c @@ -1801,8 +1801,6 @@ static int hisi_sas_abort_task_set(struct domain_devi= ce *device, u8 *lun) return rc; } =20 -#define I_T_NEXUS_RESET_PHYUP_TIMEOUT (2 * HZ) - static int hisi_sas_debug_I_T_nexus_reset(struct domain_device *device) { struct sas_phy *local_phy =3D sas_get_local_phy(device); --=20 2.26.2 From nobody Tue Jun 30 04:37:39 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B91FCC433F5 for ; Tue, 25 Jan 2022 11:44:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1382744AbiAYLnT (ORCPT ); Tue, 25 Jan 2022 06:43:19 -0500 Received: from frasgout.his.huawei.com ([185.176.79.56]:4496 "EHLO frasgout.his.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1382137AbiAYLin (ORCPT ); Tue, 25 Jan 2022 06:38:43 -0500 Received: from fraeml706-chm.china.huawei.com (unknown [172.18.147.207]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4JjlB55lvNz6FGxF; Tue, 25 Jan 2022 19:34:21 +0800 (CST) Received: from lhreml724-chm.china.huawei.com (10.201.108.75) by fraeml706-chm.china.huawei.com (10.206.15.55) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2308.21; Tue, 25 Jan 2022 12:38:37 +0100 Received: from localhost.localdomain (10.69.192.58) by lhreml724-chm.china.huawei.com (10.201.108.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 11:38:33 +0000 From: John Garry To: , , , , , CC: , , , , , , , , John Garry Subject: [PATCH 04/16] scsi: libsas: Move SMP task handlers to core Date: Tue, 25 Jan 2022 19:32:40 +0800 Message-ID: <1643110372-85470-5-git-send-email-john.garry@huawei.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1643110372-85470-1-git-send-email-john.garry@huawei.com> References: <1643110372-85470-1-git-send-email-john.garry@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.69.192.58] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To lhreml724-chm.china.huawei.com (10.201.108.75) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Move the SMP task handlers to the core host code as they will be re-used for executing internal abort and TMF tasks. Signed-off-by: John Garry Reported-by: Damien Le Moal Tested-by: liyihang6@hisilicon.com --- drivers/scsi/libsas/sas_expander.c | 24 ++---------------------- drivers/scsi/libsas/sas_internal.h | 3 +++ drivers/scsi/libsas/sas_scsi_host.c | 24 ++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 22 deletions(-) diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_e= xpander.c index 6abce9dfc17b..260e735d06fa 100644 --- a/drivers/scsi/libsas/sas_expander.c +++ b/drivers/scsi/libsas/sas_expander.c @@ -28,26 +28,6 @@ static int sas_disable_routing(struct domain_device *dev= , u8 *sas_addr); =20 /* ---------- SMP task management ---------- */ =20 -static void smp_task_timedout(struct timer_list *t) -{ - struct sas_task_slow *slow =3D from_timer(slow, t, timer); - struct sas_task *task =3D slow->task; - unsigned long flags; - - spin_lock_irqsave(&task->task_state_lock, flags); - if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) { - task->task_state_flags |=3D SAS_TASK_STATE_ABORTED; - complete(&task->slow_task->completion); - } - spin_unlock_irqrestore(&task->task_state_lock, flags); -} - -static void smp_task_done(struct sas_task *task) -{ - del_timer(&task->slow_task->timer); - complete(&task->slow_task->completion); -} - /* Give it some long enough timeout. In seconds. */ #define SMP_TIMEOUT 10 =20 @@ -78,9 +58,9 @@ static int smp_execute_task_sg(struct domain_device *dev, task->smp_task.smp_req =3D *req; task->smp_task.smp_resp =3D *resp; =20 - task->task_done =3D smp_task_done; + task->task_done =3D sas_task_internal_done; =20 - task->slow_task->timer.function =3D smp_task_timedout; + task->slow_task->timer.function =3D sas_task_internal_timedout; task->slow_task->timer.expires =3D jiffies + SMP_TIMEOUT*HZ; add_timer(&task->slow_task->timer); =20 diff --git a/drivers/scsi/libsas/sas_internal.h b/drivers/scsi/libsas/sas_i= nternal.h index acd515c01861..cd6aa723c3e1 100644 --- a/drivers/scsi/libsas/sas_internal.h +++ b/drivers/scsi/libsas/sas_internal.h @@ -95,6 +95,9 @@ void sas_destruct_devices(struct asd_sas_port *port); extern const work_func_t sas_phy_event_fns[PHY_NUM_EVENTS]; extern const work_func_t sas_port_event_fns[PORT_NUM_EVENTS]; =20 +void sas_task_internal_done(struct sas_task *task); +void sas_task_internal_timedout(struct timer_list *t); + #ifdef CONFIG_SCSI_SAS_HOST_SMP extern void sas_smp_host_handler(struct bsg_job *job, struct Scsi_Host *sh= ost); #else diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_= scsi_host.c index fb19e739a39c..42b6041d10fc 100644 --- a/drivers/scsi/libsas/sas_scsi_host.c +++ b/drivers/scsi/libsas/sas_scsi_host.c @@ -894,6 +894,30 @@ int sas_bios_param(struct scsi_device *scsi_dev, } EXPORT_SYMBOL_GPL(sas_bios_param); =20 +void sas_task_internal_done(struct sas_task *task) +{ + del_timer(&task->slow_task->timer); + complete(&task->slow_task->completion); +} + +void sas_task_internal_timedout(struct timer_list *t) +{ + struct sas_task_slow *slow =3D from_timer(slow, t, timer); + struct sas_task *task =3D slow->task; + bool is_completed =3D true; + unsigned long flags; + + spin_lock_irqsave(&task->task_state_lock, flags); + if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) { + task->task_state_flags |=3D SAS_TASK_STATE_ABORTED; + is_completed =3D false; + } + spin_unlock_irqrestore(&task->task_state_lock, flags); + + if (!is_completed) + complete(&task->slow_task->completion); +} + /* * Tell an upper layer that it needs to initiate an abort for a given task. * This should only ever be called by an LLDD. --=20 2.26.2 From nobody Tue Jun 30 04:37:39 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D6642C433EF for ; Tue, 25 Jan 2022 11:44:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1382914AbiAYLnp (ORCPT ); Tue, 25 Jan 2022 06:43:45 -0500 Received: from frasgout.his.huawei.com ([185.176.79.56]:4497 "EHLO frasgout.his.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1355801AbiAYLir (ORCPT ); Tue, 25 Jan 2022 06:38:47 -0500 Received: from fraeml705-chm.china.huawei.com (unknown [172.18.147.226]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4JjlGg2tKgz67Ljg; Tue, 25 Jan 2022 19:38:19 +0800 (CST) Received: from lhreml724-chm.china.huawei.com (10.201.108.75) by fraeml705-chm.china.huawei.com (10.206.15.54) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2308.21; Tue, 25 Jan 2022 12:38:41 +0100 Received: from localhost.localdomain (10.69.192.58) by lhreml724-chm.china.huawei.com (10.201.108.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 11:38:37 +0000 From: John Garry To: , , , , , CC: , , , , , , , , John Garry Subject: [PATCH 05/16] scsi: libsas: Add struct sas_tmf_task Date: Tue, 25 Jan 2022 19:32:41 +0800 Message-ID: <1643110372-85470-6-git-send-email-john.garry@huawei.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1643110372-85470-1-git-send-email-john.garry@huawei.com> References: <1643110372-85470-1-git-send-email-john.garry@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.69.192.58] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To lhreml724-chm.china.huawei.com (10.201.108.75) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Some of the LLDDs which use libsas have their own definition of a struct to hold TMF info, so add a common struct for libsas. Also add an interim force phy id field for hisi_sas driver, which will be removed once the STP "TMF" code is factored out. Even though some LLDDs (pm8001) use a u32 for the tag, u16 should be enough. Signed-off-by: John Garry Reported-by: Damien Le Moal Tested-by: liyihang6@hisilicon.com --- drivers/scsi/hisi_sas/hisi_sas.h | 9 +-------- drivers/scsi/hisi_sas/hisi_sas_main.c | 22 +++++++++++----------- drivers/scsi/hisi_sas/hisi_sas_v1_hw.c | 2 +- drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 4 ++-- drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 2 +- drivers/scsi/mvsas/mv_defs.h | 5 ----- drivers/scsi/mvsas/mv_sas.c | 20 ++++++++++---------- drivers/scsi/pm8001/pm8001_hwi.c | 4 ++-- drivers/scsi/pm8001/pm8001_sas.c | 18 +++++++++--------- drivers/scsi/pm8001/pm8001_sas.h | 10 +++------- include/scsi/libsas.h | 9 +++++++++ 11 files changed, 49 insertions(+), 56 deletions(-) diff --git a/drivers/scsi/hisi_sas/hisi_sas.h b/drivers/scsi/hisi_sas/hisi_= sas.h index 15a58c955516..fe0c15bbfca9 100644 --- a/drivers/scsi/hisi_sas/hisi_sas.h +++ b/drivers/scsi/hisi_sas/hisi_sas.h @@ -234,13 +234,6 @@ struct hisi_sas_device { spinlock_t lock; /* For protecting slots */ }; =20 -struct hisi_sas_tmf_task { - int force_phy; - int phy_id; - u8 tmf; - u16 tag_of_task_to_be_managed; -}; - struct hisi_sas_slot { struct list_head entry; struct list_head delivery; @@ -259,7 +252,7 @@ struct hisi_sas_slot { dma_addr_t cmd_hdr_dma; struct timer_list internal_abort_timer; bool is_internal; - struct hisi_sas_tmf_task *tmf; + struct sas_tmf_task *tmf; /* Do not reorder/change members after here */ void *buf; dma_addr_t buf_dma; diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/= hisi_sas_main.c index 61414a308906..db6f8ea7864d 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_main.c +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c @@ -11,7 +11,7 @@ ((!dev) || (dev->dev_type =3D=3D SAS_PHY_UNUSED)) =20 static int hisi_sas_debug_issue_ssp_tmf(struct domain_device *device, - u8 *lun, struct hisi_sas_tmf_task *tmf); + u8 *lun, struct sas_tmf_task *tmf); static int hisi_sas_internal_task_abort(struct hisi_hba *hisi_hba, struct domain_device *device, @@ -401,7 +401,7 @@ void hisi_sas_task_deliver(struct hisi_hba *hisi_hba, struct hisi_sas_dq *dq, struct hisi_sas_device *sas_dev, struct hisi_sas_internal_abort *abort, - struct hisi_sas_tmf_task *tmf) + struct sas_tmf_task *tmf) { struct hisi_sas_cmd_hdr *cmd_hdr_base; int dlvry_queue_slot, dlvry_queue; @@ -472,7 +472,7 @@ void hisi_sas_task_deliver(struct hisi_hba *hisi_hba, } =20 static int hisi_sas_task_exec(struct sas_task *task, gfp_t gfp_flags, - struct hisi_sas_tmf_task *tmf) + struct sas_tmf_task *tmf) { int n_elem =3D 0, n_elem_dif =3D 0, n_elem_req =3D 0; struct domain_device *device =3D task->dev; @@ -680,7 +680,7 @@ static int hisi_sas_init_device(struct domain_device *d= evice) { int rc =3D TMF_RESP_FUNC_COMPLETE; struct scsi_lun lun; - struct hisi_sas_tmf_task tmf_task; + struct sas_tmf_task tmf_task; int retry =3D HISI_SAS_DISK_RECOVER_CNT; struct hisi_hba *hisi_hba =3D dev_to_hisi_hba(device); struct device *dev =3D hisi_hba->dev; @@ -1245,7 +1245,7 @@ static void hisi_sas_tmf_timedout(struct timer_list *= t) #define INTERNAL_ABORT_TIMEOUT (6 * HZ) static int hisi_sas_exec_internal_tmf_task(struct domain_device *device, void *parameter, u32 para_len, - struct hisi_sas_tmf_task *tmf) + struct sas_tmf_task *tmf) { struct hisi_sas_device *sas_dev =3D device->lldd_dev; struct hisi_hba *hisi_hba =3D sas_dev->hisi_hba; @@ -1413,7 +1413,7 @@ static int hisi_sas_softreset_ata_disk(struct domain_= device *device) } =20 static int hisi_sas_debug_issue_ssp_tmf(struct domain_device *device, - u8 *lun, struct hisi_sas_tmf_task *tmf) + u8 *lun, struct sas_tmf_task *tmf) { struct sas_ssp_task ssp_task; =20 @@ -1520,7 +1520,7 @@ static void hisi_sas_send_ata_reset_each_phy(struct h= isi_hba *hisi_hba, struct asd_sas_port *sas_port, struct domain_device *device) { - struct hisi_sas_tmf_task tmf_task =3D { .force_phy =3D 1 }; + struct sas_tmf_task tmf_task =3D { .force_phy =3D 1 }; struct ata_port *ap =3D device->sata_dev.ap; struct device *dev =3D hisi_hba->dev; int s =3D sizeof(struct host_to_dev_fis); @@ -1672,7 +1672,7 @@ static int hisi_sas_controller_reset(struct hisi_hba = *hisi_hba) static int hisi_sas_abort_task(struct sas_task *task) { struct scsi_lun lun; - struct hisi_sas_tmf_task tmf_task; + struct sas_tmf_task tmf_task; struct domain_device *device =3D task->dev; struct hisi_sas_device *sas_dev =3D device->lldd_dev; struct hisi_hba *hisi_hba; @@ -1781,7 +1781,7 @@ static int hisi_sas_abort_task_set(struct domain_devi= ce *device, u8 *lun) { struct hisi_hba *hisi_hba =3D dev_to_hisi_hba(device); struct device *dev =3D hisi_hba->dev; - struct hisi_sas_tmf_task tmf_task; + struct sas_tmf_task tmf_task; int rc; =20 rc =3D hisi_sas_internal_task_abort(hisi_hba, device, @@ -1932,7 +1932,7 @@ static int hisi_sas_lu_reset(struct domain_device *de= vice, u8 *lun) hisi_sas_release_task(hisi_hba, device); sas_put_local_phy(phy); } else { - struct hisi_sas_tmf_task tmf_task =3D { .tmf =3D TMF_LU_RESET }; + struct sas_tmf_task tmf_task =3D { .tmf =3D TMF_LU_RESET }; =20 rc =3D hisi_sas_debug_issue_ssp_tmf(device, lun, &tmf_task); if (rc =3D=3D TMF_RESP_FUNC_COMPLETE) @@ -1990,7 +1990,7 @@ static int hisi_sas_clear_nexus_ha(struct sas_ha_stru= ct *sas_ha) static int hisi_sas_query_task(struct sas_task *task) { struct scsi_lun lun; - struct hisi_sas_tmf_task tmf_task; + struct sas_tmf_task tmf_task; int rc =3D TMF_RESP_FUNC_FAILED; =20 if (task->lldd_task && task->task_proto & SAS_PROTOCOL_SSP) { diff --git a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c b/drivers/scsi/hisi_sas= /hisi_sas_v1_hw.c index 3059d19e4368..176a2e7ccc93 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c +++ b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c @@ -958,7 +958,7 @@ static void prep_ssp_v1_hw(struct hisi_hba *hisi_hba, struct hisi_sas_port *port =3D slot->port; struct sas_ssp_task *ssp_task =3D &task->ssp_task; struct scsi_cmnd *scsi_cmnd =3D ssp_task->cmd; - struct hisi_sas_tmf_task *tmf =3D slot->tmf; + struct sas_tmf_task *tmf =3D slot->tmf; int has_data =3D 0, priority =3D !!tmf; u8 *buf_cmd, fburst =3D 0; u32 dw1, dw2; diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c b/drivers/scsi/hisi_sas= /hisi_sas_v2_hw.c index 64ed3e472e65..ef5d8f64edd8 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c +++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c @@ -1742,7 +1742,7 @@ static void prep_ssp_v2_hw(struct hisi_hba *hisi_hba, struct hisi_sas_port *port =3D slot->port; struct sas_ssp_task *ssp_task =3D &task->ssp_task; struct scsi_cmnd *scsi_cmnd =3D ssp_task->cmd; - struct hisi_sas_tmf_task *tmf =3D slot->tmf; + struct sas_tmf_task *tmf =3D slot->tmf; int has_data =3D 0, priority =3D !!tmf; u8 *buf_cmd; u32 dw1 =3D 0, dw2 =3D 0; @@ -2492,7 +2492,7 @@ static void prep_ata_v2_hw(struct hisi_hba *hisi_hba, struct hisi_sas_cmd_hdr *hdr =3D slot->cmd_hdr; struct asd_sas_port *sas_port =3D device->port; struct hisi_sas_port *port =3D to_hisi_sas_port(sas_port); - struct hisi_sas_tmf_task *tmf =3D slot->tmf; + struct sas_tmf_task *tmf =3D slot->tmf; u8 *buf_cmd; int has_data =3D 0, hdr_tag =3D 0; u32 dw0, dw1 =3D 0, dw2 =3D 0; diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas= /hisi_sas_v3_hw.c index a45ef9a5e12e..794a08b908f3 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c @@ -1219,7 +1219,7 @@ static void prep_ssp_v3_hw(struct hisi_hba *hisi_hba, struct hisi_sas_port *port =3D slot->port; struct sas_ssp_task *ssp_task =3D &task->ssp_task; struct scsi_cmnd *scsi_cmnd =3D ssp_task->cmd; - struct hisi_sas_tmf_task *tmf =3D slot->tmf; + struct sas_tmf_task *tmf =3D slot->tmf; int has_data =3D 0, priority =3D !!tmf; unsigned char prot_op; u8 *buf_cmd; diff --git a/drivers/scsi/mvsas/mv_defs.h b/drivers/scsi/mvsas/mv_defs.h index 199ab49aa047..7123a2efbf58 100644 --- a/drivers/scsi/mvsas/mv_defs.h +++ b/drivers/scsi/mvsas/mv_defs.h @@ -486,9 +486,4 @@ enum datapres_field { SENSE_DATA =3D 2, }; =20 -/* define task management IU */ -struct mvs_tmf_task{ - u8 tmf; - u16 tag_of_task_to_be_managed; -}; #endif diff --git a/drivers/scsi/mvsas/mv_sas.c b/drivers/scsi/mvsas/mv_sas.c index fd273c3e069e..22bffaaf2eb0 100644 --- a/drivers/scsi/mvsas/mv_sas.c +++ b/drivers/scsi/mvsas/mv_sas.c @@ -556,7 +556,7 @@ static int mvs_task_prep_ata(struct mvs_info *mvi, =20 static int mvs_task_prep_ssp(struct mvs_info *mvi, struct mvs_task_exec_info *tei, int is_tmf, - struct mvs_tmf_task *tmf) + struct sas_tmf_task *tmf) { struct sas_task *task =3D tei->task; struct mvs_cmd_hdr *hdr =3D tei->hdr; @@ -696,7 +696,7 @@ static int mvs_task_prep_ssp(struct mvs_info *mvi, =20 #define DEV_IS_GONE(mvi_dev) ((!mvi_dev || (mvi_dev->dev_type =3D=3D SAS_P= HY_UNUSED))) static int mvs_task_prep(struct sas_task *task, struct mvs_info *mvi, int = is_tmf, - struct mvs_tmf_task *tmf, int *pass) + struct sas_tmf_task *tmf, int *pass) { struct domain_device *dev =3D task->dev; struct mvs_device *mvi_dev =3D dev->lldd_dev; @@ -842,7 +842,7 @@ static int mvs_task_prep(struct sas_task *task, struct = mvs_info *mvi, int is_tmf =20 static int mvs_task_exec(struct sas_task *task, gfp_t gfp_flags, struct completion *completion, int is_tmf, - struct mvs_tmf_task *tmf) + struct sas_tmf_task *tmf) { struct mvs_info *mvi =3D NULL; u32 rc =3D 0; @@ -1280,7 +1280,7 @@ static void mvs_tmf_timedout(struct timer_list *t) =20 #define MVS_TASK_TIMEOUT 20 static int mvs_exec_internal_tmf_task(struct domain_device *dev, - void *parameter, u32 para_len, struct mvs_tmf_task *tmf) + void *parameter, u32 para_len, struct sas_tmf_task *tmf) { int res, retry; struct sas_task *task =3D NULL; @@ -1355,7 +1355,7 @@ static int mvs_exec_internal_tmf_task(struct domain_d= evice *dev, } =20 static int mvs_debug_issue_ssp_tmf(struct domain_device *dev, - u8 *lun, struct mvs_tmf_task *tmf) + u8 *lun, struct sas_tmf_task *tmf) { struct sas_ssp_task ssp_task; if (!(dev->tproto & SAS_PROTOCOL_SSP)) @@ -1387,7 +1387,7 @@ int mvs_lu_reset(struct domain_device *dev, u8 *lun) { unsigned long flags; int rc =3D TMF_RESP_FUNC_FAILED; - struct mvs_tmf_task tmf_task; + struct sas_tmf_task tmf_task; struct mvs_device * mvi_dev =3D dev->lldd_dev; struct mvs_info *mvi =3D mvi_dev->mvi_info; =20 @@ -1431,7 +1431,7 @@ int mvs_query_task(struct sas_task *task) { u32 tag; struct scsi_lun lun; - struct mvs_tmf_task tmf_task; + struct sas_tmf_task tmf_task; int rc =3D TMF_RESP_FUNC_FAILED; =20 if (task->lldd_task && task->task_proto & SAS_PROTOCOL_SSP) { @@ -1468,7 +1468,7 @@ int mvs_query_task(struct sas_task *task) int mvs_abort_task(struct sas_task *task) { struct scsi_lun lun; - struct mvs_tmf_task tmf_task; + struct sas_tmf_task tmf_task; struct domain_device *dev =3D task->dev; struct mvs_device *mvi_dev =3D (struct mvs_device *)dev->lldd_dev; struct mvs_info *mvi; @@ -1545,7 +1545,7 @@ int mvs_abort_task(struct sas_task *task) int mvs_abort_task_set(struct domain_device *dev, u8 *lun) { int rc; - struct mvs_tmf_task tmf_task; + struct sas_tmf_task tmf_task; =20 tmf_task.tmf =3D TMF_ABORT_TASK_SET; rc =3D mvs_debug_issue_ssp_tmf(dev, lun, &tmf_task); @@ -1556,7 +1556,7 @@ int mvs_abort_task_set(struct domain_device *dev, u8 = *lun) int mvs_clear_task_set(struct domain_device *dev, u8 *lun) { int rc =3D TMF_RESP_FUNC_FAILED; - struct mvs_tmf_task tmf_task; + struct sas_tmf_task tmf_task; =20 tmf_task.tmf =3D TMF_CLEAR_TASK_SET; rc =3D mvs_debug_issue_ssp_tmf(dev, lun, &tmf_task); diff --git a/drivers/scsi/pm8001/pm8001_hwi.c b/drivers/scsi/pm8001/pm8001_= hwi.c index c814e5071712..cac5755ba115 100644 --- a/drivers/scsi/pm8001/pm8001_hwi.c +++ b/drivers/scsi/pm8001/pm8001_hwi.c @@ -4627,7 +4627,7 @@ int pm8001_chip_abort_task(struct pm8001_hba_info *pm= 8001_ha, * @tmf: task management function. */ int pm8001_chip_ssp_tm_req(struct pm8001_hba_info *pm8001_ha, - struct pm8001_ccb_info *ccb, struct pm8001_tmf_task *tmf) + struct pm8001_ccb_info *ccb, struct sas_tmf_task *tmf) { struct sas_task *task =3D ccb->task; struct domain_device *dev =3D task->dev; @@ -4639,7 +4639,7 @@ int pm8001_chip_ssp_tm_req(struct pm8001_hba_info *pm= 8001_ha, =20 memset(&sspTMCmd, 0, sizeof(sspTMCmd)); sspTMCmd.device_id =3D cpu_to_le32(pm8001_dev->device_id); - sspTMCmd.relate_tag =3D cpu_to_le32(tmf->tag_of_task_to_be_managed); + sspTMCmd.relate_tag =3D cpu_to_le32((u32)tmf->tag_of_task_to_be_managed); sspTMCmd.tmf =3D cpu_to_le32(tmf->tmf); memcpy(sspTMCmd.lun, task->ssp_task.LUN, 8); sspTMCmd.tag =3D cpu_to_le32(ccb->ccb_tag); diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_= sas.c index 4368122ab475..0a3701d97549 100644 --- a/drivers/scsi/pm8001/pm8001_sas.c +++ b/drivers/scsi/pm8001/pm8001_sas.c @@ -336,7 +336,7 @@ static int pm8001_task_prep_ata(struct pm8001_hba_info = *pm8001_ha, * @tmf: the task management IU */ static int pm8001_task_prep_ssp_tm(struct pm8001_hba_info *pm8001_ha, - struct pm8001_ccb_info *ccb, struct pm8001_tmf_task *tmf) + struct pm8001_ccb_info *ccb, struct sas_tmf_task *tmf) { return PM8001_CHIP_DISP->ssp_tm_req(pm8001_ha, ccb, tmf); } @@ -379,7 +379,7 @@ static int sas_find_local_port_id(struct domain_device = *dev) * @tmf: the task management IU */ static int pm8001_task_exec(struct sas_task *task, - gfp_t gfp_flags, int is_tmf, struct pm8001_tmf_task *tmf) + gfp_t gfp_flags, int is_tmf, struct sas_tmf_task *tmf) { struct domain_device *dev =3D task->dev; struct pm8001_hba_info *pm8001_ha; @@ -731,7 +731,7 @@ static void pm8001_tmf_timedout(struct timer_list *t) * this function, note it is also with the task execute interface. */ static int pm8001_exec_internal_tmf_task(struct domain_device *dev, - void *parameter, u32 para_len, struct pm8001_tmf_task *tmf) + void *parameter, u32 para_len, struct sas_tmf_task *tmf) { int res, retry; struct sas_task *task =3D NULL; @@ -917,7 +917,7 @@ void pm8001_dev_gone(struct domain_device *dev) } =20 static int pm8001_issue_ssp_tmf(struct domain_device *dev, - u8 *lun, struct pm8001_tmf_task *tmf) + u8 *lun, struct sas_tmf_task *tmf) { struct sas_ssp_task ssp_task; if (!(dev->tproto & SAS_PROTOCOL_SSP)) @@ -1119,7 +1119,7 @@ int pm8001_I_T_nexus_event_handler(struct domain_devi= ce *dev) int pm8001_lu_reset(struct domain_device *dev, u8 *lun) { int rc =3D TMF_RESP_FUNC_FAILED; - struct pm8001_tmf_task tmf_task; + struct sas_tmf_task tmf_task; struct pm8001_device *pm8001_dev =3D dev->lldd_dev; struct pm8001_hba_info *pm8001_ha =3D pm8001_find_ha_by_dev(dev); DECLARE_COMPLETION_ONSTACK(completion_setstate); @@ -1148,7 +1148,7 @@ int pm8001_query_task(struct sas_task *task) { u32 tag =3D 0xdeadbeef; struct scsi_lun lun; - struct pm8001_tmf_task tmf_task; + struct sas_tmf_task tmf_task; int rc =3D TMF_RESP_FUNC_FAILED; if (unlikely(!task || !task->lldd_task || !task->dev)) return rc; @@ -1197,7 +1197,7 @@ int pm8001_abort_task(struct sas_task *task) struct pm8001_hba_info *pm8001_ha; struct scsi_lun lun; struct pm8001_device *pm8001_dev; - struct pm8001_tmf_task tmf_task; + struct sas_tmf_task tmf_task; int rc =3D TMF_RESP_FUNC_FAILED, ret; u32 phy_id, port_id; struct sas_task_slow slow_task; @@ -1351,7 +1351,7 @@ int pm8001_abort_task(struct sas_task *task) =20 int pm8001_abort_task_set(struct domain_device *dev, u8 *lun) { - struct pm8001_tmf_task tmf_task; + struct sas_tmf_task tmf_task; =20 tmf_task.tmf =3D TMF_ABORT_TASK_SET; return pm8001_issue_ssp_tmf(dev, lun, &tmf_task); @@ -1359,7 +1359,7 @@ int pm8001_abort_task_set(struct domain_device *dev, = u8 *lun) =20 int pm8001_clear_task_set(struct domain_device *dev, u8 *lun) { - struct pm8001_tmf_task tmf_task; + struct sas_tmf_task tmf_task; struct pm8001_device *pm8001_dev =3D dev->lldd_dev; struct pm8001_hba_info *pm8001_ha =3D pm8001_find_ha_by_dev(dev); =20 diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_= sas.h index 3ea53a0d0cc1..0b1086042ca6 100644 --- a/drivers/scsi/pm8001/pm8001_sas.h +++ b/drivers/scsi/pm8001/pm8001_sas.h @@ -99,11 +99,7 @@ extern const struct pm8001_dispatch pm8001_80xx_dispatch; struct pm8001_hba_info; struct pm8001_ccb_info; struct pm8001_device; -/* define task management IU */ -struct pm8001_tmf_task { - u8 tmf; - u32 tag_of_task_to_be_managed; -}; + struct pm8001_ioctl_payload { u32 signature; u16 major_function; @@ -203,7 +199,7 @@ struct pm8001_dispatch { struct pm8001_device *pm8001_dev, u8 flag, u32 task_tag, u32 cmd_tag); int (*ssp_tm_req)(struct pm8001_hba_info *pm8001_ha, - struct pm8001_ccb_info *ccb, struct pm8001_tmf_task *tmf); + struct pm8001_ccb_info *ccb, struct sas_tmf_task *tmf); int (*get_nvmd_req)(struct pm8001_hba_info *pm8001_ha, void *payload); int (*set_nvmd_req)(struct pm8001_hba_info *pm8001_ha, void *payload); int (*fw_flash_update_req)(struct pm8001_hba_info *pm8001_ha, @@ -687,7 +683,7 @@ int pm8001_chip_set_nvmd_req(struct pm8001_hba_info *pm= 8001_ha, void *payload); int pm8001_chip_get_nvmd_req(struct pm8001_hba_info *pm8001_ha, void *payl= oad); int pm8001_chip_ssp_tm_req(struct pm8001_hba_info *pm8001_ha, struct pm8001_ccb_info *ccb, - struct pm8001_tmf_task *tmf); + struct sas_tmf_task *tmf); int pm8001_chip_abort_task(struct pm8001_hba_info *pm8001_ha, struct pm8001_device *pm8001_dev, u8 flag, u32 task_tag, u32 cmd_tag); diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index d59618898619..30b9afec1e1d 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h @@ -577,6 +577,15 @@ struct sas_ssp_task { struct scsi_cmnd *cmd; }; =20 +struct sas_tmf_task { + u8 tmf; + u16 tag_of_task_to_be_managed; + + /* Temp */ + int force_phy; + int phy_id; +}; + struct sas_task { struct domain_device *dev; =20 --=20 2.26.2 From nobody Tue Jun 30 04:37:39 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id EB928C433FE for ; Tue, 25 Jan 2022 11:44:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1383037AbiAYLny (ORCPT ); Tue, 25 Jan 2022 06:43:54 -0500 Received: from frasgout.his.huawei.com ([185.176.79.56]:4498 "EHLO frasgout.his.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1382284AbiAYLis (ORCPT ); Tue, 25 Jan 2022 06:38:48 -0500 Received: from fraeml704-chm.china.huawei.com (unknown [172.18.147.206]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4JjlBF2hR3z689R4; Tue, 25 Jan 2022 19:34:29 +0800 (CST) Received: from lhreml724-chm.china.huawei.com (10.201.108.75) by fraeml704-chm.china.huawei.com (10.206.15.53) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2308.21; Tue, 25 Jan 2022 12:38:44 +0100 Received: from localhost.localdomain (10.69.192.58) by lhreml724-chm.china.huawei.com (10.201.108.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 11:38:41 +0000 From: John Garry To: , , , , , CC: , , , , , , , , John Garry Subject: [PATCH 06/16] scsi: libsas: Add sas_task.tmf Date: Tue, 25 Jan 2022 19:32:42 +0800 Message-ID: <1643110372-85470-7-git-send-email-john.garry@huawei.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1643110372-85470-1-git-send-email-john.garry@huawei.com> References: <1643110372-85470-1-git-send-email-john.garry@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.69.192.58] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To lhreml724-chm.china.huawei.com (10.201.108.75) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a pointer to a sas_tmf_task to the sas_task struct, as this will be used when the common LLDD TMF code is factored out. Also set it for the LLDDs to store per-sas_task TMF info. Signed-off-by: John Garry Reported-by: Damien Le Moal Tested-by: liyihang6@hisilicon.com --- drivers/scsi/hisi_sas/hisi_sas_main.c | 25 +++++++++--------------- drivers/scsi/mvsas/mv_sas.c | 15 ++++++-------- drivers/scsi/pm8001/pm8001_sas.c | 28 ++++++++++----------------- include/scsi/libsas.h | 1 + 4 files changed, 26 insertions(+), 43 deletions(-) diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/= hisi_sas_main.c index db6f8ea7864d..4f146aa50423 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_main.c +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c @@ -400,8 +400,7 @@ void hisi_sas_task_deliver(struct hisi_hba *hisi_hba, struct hisi_sas_slot *slot, struct hisi_sas_dq *dq, struct hisi_sas_device *sas_dev, - struct hisi_sas_internal_abort *abort, - struct sas_tmf_task *tmf) + struct hisi_sas_internal_abort *abort) { struct hisi_sas_cmd_hdr *cmd_hdr_base; int dlvry_queue_slot, dlvry_queue; @@ -427,8 +426,6 @@ void hisi_sas_task_deliver(struct hisi_hba *hisi_hba, cmd_hdr_base =3D hisi_hba->cmd_hdr[dlvry_queue]; slot->cmd_hdr =3D &cmd_hdr_base[dlvry_queue_slot]; =20 - slot->tmf =3D tmf; - slot->is_internal =3D tmf; task->lldd_task =3D slot; =20 memset(slot->cmd_hdr, 0, sizeof(struct hisi_sas_cmd_hdr)); @@ -471,8 +468,7 @@ void hisi_sas_task_deliver(struct hisi_hba *hisi_hba, spin_unlock(&dq->lock); } =20 -static int hisi_sas_task_exec(struct sas_task *task, gfp_t gfp_flags, - struct sas_tmf_task *tmf) +static int hisi_sas_queue_command(struct sas_task *task, gfp_t gfp_flags) { int n_elem =3D 0, n_elem_dif =3D 0, n_elem_req =3D 0; struct domain_device *device =3D task->dev; @@ -583,11 +579,11 @@ static int hisi_sas_task_exec(struct sas_task *task, = gfp_t gfp_flags, slot->task =3D task; slot->port =3D port; =20 - slot->tmf =3D tmf; - slot->is_internal =3D tmf; + slot->tmf =3D task->tmf; + slot->is_internal =3D task->tmf; =20 /* protect task_prep and start_delivery sequence */ - hisi_sas_task_deliver(hisi_hba, slot, dq, sas_dev, NULL, tmf); + hisi_sas_task_deliver(hisi_hba, slot, dq, sas_dev, NULL); =20 return 0; =20 @@ -1115,11 +1111,6 @@ static void hisi_sas_dev_gone(struct domain_device *= device) up(&hisi_hba->sem); } =20 -static int hisi_sas_queue_command(struct sas_task *task, gfp_t gfp_flags) -{ - return hisi_sas_task_exec(task, gfp_flags, NULL); -} - static int hisi_sas_phy_set_linkrate(struct hisi_hba *hisi_hba, int phy_no, struct sas_phy_linkrates *r) { @@ -1273,7 +1264,9 @@ static int hisi_sas_exec_internal_tmf_task(struct dom= ain_device *device, task->slow_task->timer.expires =3D jiffies + TASK_TIMEOUT; add_timer(&task->slow_task->timer); =20 - res =3D hisi_sas_task_exec(task, GFP_KERNEL, tmf); + task->tmf =3D tmf; + + res =3D hisi_sas_queue_command(task, GFP_KERNEL); if (res) { del_timer_sync(&task->slow_task->timer); dev_err(dev, "abort tmf: executing internal task failed: %d\n", @@ -2054,7 +2047,7 @@ hisi_sas_internal_abort_task_exec(struct hisi_hba *hi= si_hba, int device_id, slot->port =3D port; slot->is_internal =3D true; =20 - hisi_sas_task_deliver(hisi_hba, slot, dq, sas_dev, abort, NULL); + hisi_sas_task_deliver(hisi_hba, slot, dq, sas_dev, abort); =20 return 0; =20 diff --git a/drivers/scsi/mvsas/mv_sas.c b/drivers/scsi/mvsas/mv_sas.c index 22bffaaf2eb0..5105d55eb00c 100644 --- a/drivers/scsi/mvsas/mv_sas.c +++ b/drivers/scsi/mvsas/mv_sas.c @@ -840,14 +840,14 @@ static int mvs_task_prep(struct sas_task *task, struc= t mvs_info *mvi, int is_tmf return rc; } =20 -static int mvs_task_exec(struct sas_task *task, gfp_t gfp_flags, - struct completion *completion, int is_tmf, - struct sas_tmf_task *tmf) +int mvs_queue_command(struct sas_task *task, gfp_t gfp_flags) { struct mvs_info *mvi =3D NULL; u32 rc =3D 0; u32 pass =3D 0; unsigned long flags =3D 0; + struct sas_tmf_task *tmf =3D task->tmf; + int is_tmf =3D !!task->tmf; =20 mvi =3D ((struct mvs_device *)task->dev->lldd_dev)->mvi_info; =20 @@ -864,11 +864,6 @@ static int mvs_task_exec(struct sas_task *task, gfp_t = gfp_flags, return rc; } =20 -int mvs_queue_command(struct sas_task *task, gfp_t gfp_flags) -{ - return mvs_task_exec(task, gfp_flags, NULL, 0, NULL); -} - static void mvs_slot_free(struct mvs_info *mvi, u32 rx_desc) { u32 slot_idx =3D rx_desc & RXQ_SLOT_MASK; @@ -1300,7 +1295,9 @@ static int mvs_exec_internal_tmf_task(struct domain_d= evice *dev, task->slow_task->timer.expires =3D jiffies + MVS_TASK_TIMEOUT*HZ; add_timer(&task->slow_task->timer); =20 - res =3D mvs_task_exec(task, GFP_KERNEL, NULL, 1, tmf); + task->tmf =3D tmf; + + res =3D mvs_queue_command(task, GFP_KERNEL); =20 if (res) { del_timer(&task->slow_task->timer); diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_= sas.c index 0a3701d97549..323b172243b8 100644 --- a/drivers/scsi/pm8001/pm8001_sas.c +++ b/drivers/scsi/pm8001/pm8001_sas.c @@ -371,15 +371,14 @@ static int sas_find_local_port_id(struct domain_devic= e *dev) =20 #define DEV_IS_GONE(pm8001_dev) \ ((!pm8001_dev || (pm8001_dev->dev_type =3D=3D SAS_PHY_UNUSED))) + /** - * pm8001_task_exec - queue the task(ssp, smp && ata) to the hardware. + * pm8001_queue_command - register for upper layer used, all IO commands = sent + * to HBA are from this interface. * @task: the task to be execute. - * @gfp_flags: gfp_flags. - * @is_tmf: if it is task management task. - * @tmf: the task management IU + * @gfp_flags: gfp_flags */ -static int pm8001_task_exec(struct sas_task *task, - gfp_t gfp_flags, int is_tmf, struct sas_tmf_task *tmf) +int pm8001_queue_command(struct sas_task *task, gfp_t gfp_flags) { struct domain_device *dev =3D task->dev; struct pm8001_hba_info *pm8001_ha; @@ -390,6 +389,8 @@ static int pm8001_task_exec(struct sas_task *task, u32 tag =3D 0xdeadbeef, rc =3D 0, n_elem =3D 0; unsigned long flags =3D 0; enum sas_protocol task_proto =3D t->task_proto; + struct sas_tmf_task *tmf =3D task->tmf; + int is_tmf =3D !!task->tmf; =20 if (!dev->port) { struct task_status_struct *tsm =3D &t->task_status; @@ -507,17 +508,6 @@ static int pm8001_task_exec(struct sas_task *task, return rc; } =20 -/** - * pm8001_queue_command - register for upper layer used, all IO commands = sent - * to HBA are from this interface. - * @task: the task to be execute. - * @gfp_flags: gfp_flags - */ -int pm8001_queue_command(struct sas_task *task, gfp_t gfp_flags) -{ - return pm8001_task_exec(task, gfp_flags, 0, NULL); -} - /** * pm8001_ccb_task_free - free the sg for ssp and smp command, free the c= cb. * @pm8001_ha: our hba card information @@ -752,7 +742,9 @@ static int pm8001_exec_internal_tmf_task(struct domain_= device *dev, task->slow_task->timer.expires =3D jiffies + PM8001_TASK_TIMEOUT*HZ; add_timer(&task->slow_task->timer); =20 - res =3D pm8001_task_exec(task, GFP_KERNEL, 1, tmf); + task->tmf =3D tmf; + + res =3D pm8001_queue_command(task, GFP_KERNEL); =20 if (res) { del_timer(&task->slow_task->timer); diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index 30b9afec1e1d..802b4e04e3a1 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h @@ -611,6 +611,7 @@ struct sas_task { void *lldd_task; /* for use by LLDDs */ void *uldd_task; struct sas_task_slow *slow_task; + struct sas_tmf_task *tmf; }; =20 struct sas_task_slow { --=20 2.26.2 From nobody Tue Jun 30 04:37:39 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 06C5CC433F5 for ; Tue, 25 Jan 2022 11:44:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1383138AbiAYLn5 (ORCPT ); Tue, 25 Jan 2022 06:43:57 -0500 Received: from frasgout.his.huawei.com ([185.176.79.56]:4499 "EHLO frasgout.his.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1382347AbiAYLi5 (ORCPT ); Tue, 25 Jan 2022 06:38:57 -0500 Received: from fraeml703-chm.china.huawei.com (unknown [172.18.147.207]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4JjlGq01mfz67P7p; Tue, 25 Jan 2022 19:38:27 +0800 (CST) Received: from lhreml724-chm.china.huawei.com (10.201.108.75) by fraeml703-chm.china.huawei.com (10.206.15.52) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2308.21; Tue, 25 Jan 2022 12:38:48 +0100 Received: from localhost.localdomain (10.69.192.58) by lhreml724-chm.china.huawei.com (10.201.108.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 11:38:44 +0000 From: John Garry To: , , , , , CC: , , , , , , , , John Garry Subject: [PATCH 07/16] scsi: libsas: Add sas_execute_tmf() Date: Tue, 25 Jan 2022 19:32:43 +0800 Message-ID: <1643110372-85470-8-git-send-email-john.garry@huawei.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1643110372-85470-1-git-send-email-john.garry@huawei.com> References: <1643110372-85470-1-git-send-email-john.garry@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.69.192.58] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To lhreml724-chm.china.huawei.com (10.201.108.75) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Drivers using libsas have to issue their own TMFs, and the code to do this is duplicated between drivers. Add a common function to handle TMFs. This will be also used for sending ATA commands, but use name "tmf" as the purpose is similar between SCSI and ATA in the usage. The force_phy_id argument will be used for a hisi_sas HW bug workaround. We check the sas task status stat field against TMF codes, as according to the SAS v1.1 spec 9.2.2.5.3, if response_data is in datapres, then the response code should be a TMF code - see table 128. Signed-off-by: John Garry Reported-by: Damien Le Moal Tested-by: liyihang6@hisilicon.com --- drivers/scsi/libsas/sas_internal.h | 3 + drivers/scsi/libsas/sas_scsi_host.c | 105 ++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+) diff --git a/drivers/scsi/libsas/sas_internal.h b/drivers/scsi/libsas/sas_i= nternal.h index cd6aa723c3e1..b60f0bf612cf 100644 --- a/drivers/scsi/libsas/sas_internal.h +++ b/drivers/scsi/libsas/sas_internal.h @@ -97,6 +97,9 @@ extern const work_func_t sas_port_event_fns[PORT_NUM_EVEN= TS]; =20 void sas_task_internal_done(struct sas_task *task); void sas_task_internal_timedout(struct timer_list *t); +int sas_execute_tmf(struct domain_device *device, void *parameter, + int para_len, int force_phy_id, + struct sas_tmf_task *tmf); =20 #ifdef CONFIG_SCSI_SAS_HOST_SMP extern void sas_smp_host_handler(struct bsg_job *job, struct Scsi_Host *sh= ost); diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_= scsi_host.c index 42b6041d10fc..93ca6da63104 100644 --- a/drivers/scsi/libsas/sas_scsi_host.c +++ b/drivers/scsi/libsas/sas_scsi_host.c @@ -918,6 +918,111 @@ void sas_task_internal_timedout(struct timer_list *t) complete(&task->slow_task->completion); } =20 +#define TASK_TIMEOUT (20 * HZ) +#define TASK_RETRY 3 + +int sas_execute_tmf(struct domain_device *device, void *parameter, + int para_len, int force_phy_id, + struct sas_tmf_task *tmf) +{ + struct sas_task *task; + struct sas_internal *i =3D + to_sas_internal(device->port->ha->core.shost->transportt); + int res, retry; + + for (retry =3D 0; retry < TASK_RETRY; retry++) { + task =3D sas_alloc_slow_task(GFP_KERNEL); + if (!task) + return -ENOMEM; + + task->dev =3D device; + task->task_proto =3D device->tproto; + + task->task_done =3D sas_task_internal_done; + task->tmf =3D tmf; + + task->slow_task->timer.function =3D sas_task_internal_timedout; + task->slow_task->timer.expires =3D jiffies + TASK_TIMEOUT; + add_timer(&task->slow_task->timer); + + res =3D i->dft->lldd_execute_task(task, GFP_KERNEL); + if (res) { + del_timer_sync(&task->slow_task->timer); + pr_err("executing TMF (%d) task failed %016llx (%d)\n", tmf->tmf, + SAS_ADDR(device->sas_addr), res); + break; + } + + wait_for_completion(&task->slow_task->completion); + + res =3D TMF_RESP_FUNC_FAILED; + + if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) { + if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) { + pr_err("TMF (%d) task timeout for %016llx and not done\n", + tmf->tmf, SAS_ADDR(device->sas_addr)); + break; + } + pr_warn("TMF (%d) task timeout for %016llx and done\n", + tmf->tmf, SAS_ADDR(device->sas_addr)); + } + + if (task->task_status.resp =3D=3D SAS_TASK_COMPLETE && + task->task_status.stat =3D=3D TMF_RESP_FUNC_COMPLETE) { + res =3D TMF_RESP_FUNC_COMPLETE; + break; + } + + if (task->task_status.resp =3D=3D SAS_TASK_COMPLETE && + task->task_status.stat =3D=3D TMF_RESP_FUNC_SUCC) { + res =3D TMF_RESP_FUNC_SUCC; + break; + } + + if (task->task_status.resp =3D=3D SAS_TASK_COMPLETE && + task->task_status.stat =3D=3D SAS_DATA_UNDERRUN) { + /* no error, but return the number of bytes of + * underrun + */ + pr_warn("TMF (%d) task to dev %016llx resp: 0x%x sts 0x%x underrun\n", + tmf->tmf, SAS_ADDR(device->sas_addr), + task->task_status.resp, + task->task_status.stat); + res =3D task->task_status.residual; + break; + } + + if (task->task_status.resp =3D=3D SAS_TASK_COMPLETE && + task->task_status.stat =3D=3D SAS_DATA_OVERRUN) { + pr_warn("TMF (%d) task blocked task error %016llx\n", + tmf->tmf, SAS_ADDR(device->sas_addr)); + res =3D -EMSGSIZE; + break; + } + + if (task->task_status.resp =3D=3D SAS_TASK_COMPLETE && + task->task_status.stat =3D=3D SAS_OPEN_REJECT) { + pr_warn("TMF (%d) task open reject failed %016llx\n", + tmf->tmf, SAS_ADDR(device->sas_addr)); + res =3D -EIO; + } else { + pr_warn("TMF (%d) task to dev %016llx resp: 0x%x status 0x%x\n", + tmf->tmf, SAS_ADDR(device->sas_addr), + task->task_status.resp, + task->task_status.stat); + } + sas_free_task(task); + task =3D NULL; + } + + if (retry =3D=3D TASK_RETRY) + pr_warn("executing TMF (%d) for %016llx failed after %d attempts!\n", + tmf->tmf, SAS_ADDR(device->sas_addr), TASK_RETRY); + sas_free_task(task); + + return res; +} + /* * Tell an upper layer that it needs to initiate an abort for a given task. * This should only ever be called by an LLDD. --=20 2.26.2 From nobody Tue Jun 30 04:37:39 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B5753C433F5 for ; Tue, 25 Jan 2022 11:44:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1354387AbiAYLoD (ORCPT ); Tue, 25 Jan 2022 06:44:03 -0500 Received: from frasgout.his.huawei.com ([185.176.79.56]:4500 "EHLO frasgout.his.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1382389AbiAYLi6 (ORCPT ); Tue, 25 Jan 2022 06:38:58 -0500 Received: from fraeml702-chm.china.huawei.com (unknown [172.18.147.200]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4JjlGt32kGz6864m; Tue, 25 Jan 2022 19:38:30 +0800 (CST) Received: from lhreml724-chm.china.huawei.com (10.201.108.75) by fraeml702-chm.china.huawei.com (10.206.15.51) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2308.21; Tue, 25 Jan 2022 12:38:52 +0100 Received: from localhost.localdomain (10.69.192.58) by lhreml724-chm.china.huawei.com (10.201.108.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 11:38:48 +0000 From: John Garry To: , , , , , CC: , , , , , , , , John Garry Subject: [PATCH 08/16] scsi: libsas: Add sas_execute_ssp_tmf() Date: Tue, 25 Jan 2022 19:32:44 +0800 Message-ID: <1643110372-85470-9-git-send-email-john.garry@huawei.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1643110372-85470-1-git-send-email-john.garry@huawei.com> References: <1643110372-85470-1-git-send-email-john.garry@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.69.192.58] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To lhreml724-chm.china.huawei.com (10.201.108.75) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a function to issue an SSP TMF. Add a temp prototype to keep make W=3D1 happy. Signed-off-by: John Garry Reported-by: Damien Le Moal Tested-by: liyihang6@hisilicon.com --- drivers/scsi/libsas/sas_scsi_host.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_= scsi_host.c index 93ca6da63104..cfdf4a031be0 100644 --- a/drivers/scsi/libsas/sas_scsi_host.c +++ b/drivers/scsi/libsas/sas_scsi_host.c @@ -938,6 +938,11 @@ int sas_execute_tmf(struct domain_device *device, void= *parameter, task->dev =3D device; task->task_proto =3D device->tproto; =20 + if (dev_is_sata(device)) { + } else { + memcpy(&task->ssp_task, parameter, para_len); + } + task->task_done =3D sas_task_internal_done; task->tmf =3D tmf; =20 @@ -1023,6 +1028,21 @@ int sas_execute_tmf(struct domain_device *device, vo= id *parameter, return res; } =20 +int sas_execute_ssp_tmf(struct domain_device *device, u8 *lun, + struct sas_tmf_task *tmf); +int sas_execute_ssp_tmf(struct domain_device *device, u8 *lun, + struct sas_tmf_task *tmf) +{ + struct sas_ssp_task ssp_task; + + if (!(device->tproto & SAS_PROTOCOL_SSP)) + return TMF_RESP_FUNC_ESUPP; + + memcpy(ssp_task.LUN, lun, 8); + + return sas_execute_tmf(device, &ssp_task, sizeof(ssp_task), -1, tmf); +} + /* * Tell an upper layer that it needs to initiate an abort for a given task. * This should only ever be called by an LLDD. --=20 2.26.2 From nobody Tue Jun 30 04:37:39 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id F2362C433F5 for ; Tue, 25 Jan 2022 11:44:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1378450AbiAYLog (ORCPT ); Tue, 25 Jan 2022 06:44:36 -0500 Received: from frasgout.his.huawei.com ([185.176.79.56]:4501 "EHLO frasgout.his.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1351199AbiAYLjC (ORCPT ); Tue, 25 Jan 2022 06:39:02 -0500 Received: from fraeml701-chm.china.huawei.com (unknown [172.18.147.206]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4JjlCR0PN6z6842f; Tue, 25 Jan 2022 19:35:31 +0800 (CST) Received: from lhreml724-chm.china.huawei.com (10.201.108.75) by fraeml701-chm.china.huawei.com (10.206.15.50) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2308.21; Tue, 25 Jan 2022 12:38:55 +0100 Received: from localhost.localdomain (10.69.192.58) by lhreml724-chm.china.huawei.com (10.201.108.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 11:38:52 +0000 From: John Garry To: , , , , , CC: , , , , , , , , John Garry Subject: [PATCH 09/16] scsi: libsas: Add TMF handler exec complete callback Date: Tue, 25 Jan 2022 19:32:45 +0800 Message-ID: <1643110372-85470-10-git-send-email-john.garry@huawei.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1643110372-85470-1-git-send-email-john.garry@huawei.com> References: <1643110372-85470-1-git-send-email-john.garry@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.69.192.58] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To lhreml724-chm.china.huawei.com (10.201.108.75) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The pm8001 TMF handler has some special processing when the TMF completes, so add a callback and fill it in for the pm8001 driver. Signed-off-by: John Garry Reported-by: Damien Le Moal Tested-by: liyihang6@hisilicon.com --- drivers/scsi/libsas/sas_scsi_host.c | 3 +++ drivers/scsi/pm8001/pm8001_init.c | 1 + drivers/scsi/pm8001/pm8001_sas.c | 14 ++++++++++++++ drivers/scsi/pm8001/pm8001_sas.h | 1 + include/scsi/libsas.h | 3 +++ 5 files changed, 22 insertions(+) diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_= scsi_host.c index cfdf4a031be0..79a0a90cb359 100644 --- a/drivers/scsi/libsas/sas_scsi_host.c +++ b/drivers/scsi/libsas/sas_scsi_host.c @@ -960,6 +960,9 @@ int sas_execute_tmf(struct domain_device *device, void = *parameter, =20 wait_for_completion(&task->slow_task->completion); =20 + if (i->dft->lldd_tmf_exec_complete) + i->dft->lldd_tmf_exec_complete(device); + res =3D TMF_RESP_FUNC_FAILED; =20 if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) { diff --git a/drivers/scsi/pm8001/pm8001_init.c b/drivers/scsi/pm8001/pm8001= _init.c index b8cf1bae4040..8eef8f4de42f 100644 --- a/drivers/scsi/pm8001/pm8001_init.c +++ b/drivers/scsi/pm8001/pm8001_init.c @@ -128,6 +128,7 @@ static struct sas_domain_function_template pm8001_trans= port_ops =3D { .lldd_lu_reset =3D pm8001_lu_reset, .lldd_query_task =3D pm8001_query_task, .lldd_port_formed =3D pm8001_port_formed, + .lldd_tmf_exec_complete =3D pm8001_setds_completion, }; =20 /** diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_= sas.c index 323b172243b8..06e5d5741ae2 100644 --- a/drivers/scsi/pm8001/pm8001_sas.c +++ b/drivers/scsi/pm8001/pm8001_sas.c @@ -1375,3 +1375,17 @@ void pm8001_port_formed(struct asd_sas_phy *sas_phy) } sas_port->lldd_port =3D port; } + +void pm8001_setds_completion(struct domain_device *dev) +{ + struct pm8001_hba_info *pm8001_ha =3D pm8001_find_ha_by_dev(dev); + struct pm8001_device *pm8001_dev =3D dev->lldd_dev; + DECLARE_COMPLETION_ONSTACK(completion_setstate); + + if (pm8001_ha->chip_id !=3D chip_8001) { + pm8001_dev->setds_completion =3D &completion_setstate; + PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha, + pm8001_dev, DS_OPERATIONAL); + wait_for_completion(&completion_setstate); + } +} diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_= sas.h index 0b1086042ca6..c19c9c80206c 100644 --- a/drivers/scsi/pm8001/pm8001_sas.h +++ b/drivers/scsi/pm8001/pm8001_sas.h @@ -742,6 +742,7 @@ pm8001_ccb_task_free_done(struct pm8001_hba_info *pm800= 1_ha, smp_mb(); /*in order to force CPU ordering*/ task->task_done(task); } +void pm8001_setds_completion(struct domain_device *dev); =20 #endif =20 diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index 802b4e04e3a1..9c2e58cbadc5 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h @@ -654,6 +654,9 @@ struct sas_domain_function_template { int (*lldd_lu_reset)(struct domain_device *, u8 *lun); int (*lldd_query_task)(struct sas_task *); =20 + /* Special TMF callbacks */ + void (*lldd_tmf_exec_complete)(struct domain_device *dev); + /* Port and Adapter management */ int (*lldd_clear_nexus_port)(struct asd_sas_port *); int (*lldd_clear_nexus_ha)(struct sas_ha_struct *); --=20 2.26.2 From nobody Tue Jun 30 04:37:39 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 83C89C4332F for ; Tue, 25 Jan 2022 11:44:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1383003AbiAYLop (ORCPT ); Tue, 25 Jan 2022 06:44:45 -0500 Received: from frasgout.his.huawei.com ([185.176.79.56]:4502 "EHLO frasgout.his.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1382409AbiAYLjJ (ORCPT ); Tue, 25 Jan 2022 06:39:09 -0500 Received: from fraeml745-chm.china.huawei.com (unknown [172.18.147.206]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4JjlBX12p1z687WJ; Tue, 25 Jan 2022 19:34:44 +0800 (CST) Received: from lhreml724-chm.china.huawei.com (10.201.108.75) by fraeml745-chm.china.huawei.com (10.206.15.226) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 12:38:59 +0100 Received: from localhost.localdomain (10.69.192.58) by lhreml724-chm.china.huawei.com (10.201.108.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 11:38:55 +0000 From: John Garry To: , , , , , CC: , , , , , , , , John Garry Subject: [PATCH 10/16] scsi: libsas: Add TMF handler aborted callback Date: Tue, 25 Jan 2022 19:32:46 +0800 Message-ID: <1643110372-85470-11-git-send-email-john.garry@huawei.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1643110372-85470-1-git-send-email-john.garry@huawei.com> References: <1643110372-85470-1-git-send-email-john.garry@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.69.192.58] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To lhreml724-chm.china.huawei.com (10.201.108.75) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The hisi_sas TMF handler has some special processing when the TMF is aborted, so add a callback and fill it in for the hisi_sas driver. Signed-off-by: John Garry Reported-by: Damien Le Moal Tested-by: liyihang6@hisilicon.com --- drivers/scsi/hisi_sas/hisi_sas_main.c | 20 ++++++++++++++++++++ drivers/scsi/libsas/sas_scsi_host.c | 2 ++ include/scsi/libsas.h | 1 + 3 files changed, 23 insertions(+) diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/= hisi_sas_main.c index 4f146aa50423..a2c03cb6414f 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_main.c +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c @@ -671,6 +671,25 @@ static struct hisi_sas_device *hisi_sas_alloc_dev(stru= ct domain_device *device) return sas_dev; } =20 +static void hisi_sas_tmf_aborted(struct sas_task *task) +{ + struct hisi_sas_slot *slot =3D task->lldd_task; + struct domain_device *device =3D task->dev; + struct hisi_sas_device *sas_dev =3D device->lldd_dev; + struct hisi_hba *hisi_hba =3D sas_dev->hisi_hba; + + if (slot) { + struct hisi_sas_cq *cq =3D + &hisi_hba->cq[slot->dlvry_queue]; + /* + * sync irq to avoid free'ing task + * before using task in IO completion + */ + synchronize_irq(cq->irq_no); + slot->task =3D NULL; + } +} + #define HISI_SAS_DISK_RECOVER_CNT 3 static int hisi_sas_init_device(struct domain_device *device) { @@ -2327,6 +2346,7 @@ static struct sas_domain_function_template hisi_sas_t= ransport_ops =3D { .lldd_clear_nexus_ha =3D hisi_sas_clear_nexus_ha, .lldd_port_formed =3D hisi_sas_port_formed, .lldd_write_gpio =3D hisi_sas_write_gpio, + .lldd_tmf_aborted =3D hisi_sas_tmf_aborted, }; =20 void hisi_sas_init_mem(struct hisi_hba *hisi_hba) diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_= scsi_host.c index 79a0a90cb359..956b4387c1b8 100644 --- a/drivers/scsi/libsas/sas_scsi_host.c +++ b/drivers/scsi/libsas/sas_scsi_host.c @@ -969,6 +969,8 @@ int sas_execute_tmf(struct domain_device *device, void = *parameter, if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) { pr_err("TMF (%d) task timeout for %016llx and not done\n", tmf->tmf, SAS_ADDR(device->sas_addr)); + if (i->dft->lldd_tmf_aborted) + i->dft->lldd_tmf_aborted(task); break; } pr_warn("TMF (%d) task timeout for %016llx and done\n", diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index 9c2e58cbadc5..1e5ecfb2f36e 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h @@ -656,6 +656,7 @@ struct sas_domain_function_template { =20 /* Special TMF callbacks */ void (*lldd_tmf_exec_complete)(struct domain_device *dev); + void (*lldd_tmf_aborted)(struct sas_task *task); =20 /* Port and Adapter management */ int (*lldd_clear_nexus_port)(struct asd_sas_port *); --=20 2.26.2 From nobody Tue Jun 30 04:37:39 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id DB05FC433F5 for ; Tue, 25 Jan 2022 11:46:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1384375AbiAYLps (ORCPT ); Tue, 25 Jan 2022 06:45:48 -0500 Received: from frasgout.his.huawei.com ([185.176.79.56]:4505 "EHLO frasgout.his.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1354216AbiAYLky (ORCPT ); Tue, 25 Jan 2022 06:40:54 -0500 Received: from fraeml744-chm.china.huawei.com (unknown [172.18.147.201]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4JjlH52hXXz685x5; Tue, 25 Jan 2022 19:38:41 +0800 (CST) Received: from lhreml724-chm.china.huawei.com (10.201.108.75) by fraeml744-chm.china.huawei.com (10.206.15.225) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 12:39:03 +0100 Received: from localhost.localdomain (10.69.192.58) by lhreml724-chm.china.huawei.com (10.201.108.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 11:38:59 +0000 From: John Garry To: , , , , , CC: , , , , , , , , John Garry Subject: [PATCH 11/16] scsi: libsas: Add sas_abort_task_set() Date: Tue, 25 Jan 2022 19:32:47 +0800 Message-ID: <1643110372-85470-12-git-send-email-john.garry@huawei.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1643110372-85470-1-git-send-email-john.garry@huawei.com> References: <1643110372-85470-1-git-send-email-john.garry@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.69.192.58] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To lhreml724-chm.china.huawei.com (10.201.108.75) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a generic implementation of abort task set TMF handler, and use in LLDDs. Signed-off-by: John Garry Reported-by: Damien Le Moal Tested-by: liyihang6@hisilicon.com --- drivers/scsi/hisi_sas/hisi_sas_main.c | 5 +---- drivers/scsi/libsas/sas_scsi_host.c | 16 ++++++++++++---- drivers/scsi/mvsas/mv_init.c | 2 +- drivers/scsi/mvsas/mv_sas.c | 11 ----------- drivers/scsi/mvsas/mv_sas.h | 1 - drivers/scsi/pm8001/pm8001_init.c | 2 +- drivers/scsi/pm8001/pm8001_sas.c | 8 -------- drivers/scsi/pm8001/pm8001_sas.h | 1 - include/scsi/libsas.h | 2 ++ 9 files changed, 17 insertions(+), 31 deletions(-) diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/= hisi_sas_main.c index a2c03cb6414f..7bf0d400d11f 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_main.c +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c @@ -1793,7 +1793,6 @@ static int hisi_sas_abort_task_set(struct domain_devi= ce *device, u8 *lun) { struct hisi_hba *hisi_hba =3D dev_to_hisi_hba(device); struct device *dev =3D hisi_hba->dev; - struct sas_tmf_task tmf_task; int rc; =20 rc =3D hisi_sas_internal_task_abort(hisi_hba, device, @@ -1804,9 +1803,7 @@ static int hisi_sas_abort_task_set(struct domain_devi= ce *device, u8 *lun) } hisi_sas_dereg_device(hisi_hba, device); =20 - tmf_task.tmf =3D TMF_ABORT_TASK_SET; - rc =3D hisi_sas_debug_issue_ssp_tmf(device, lun, &tmf_task); - + rc =3D sas_abort_task_set(device, lun); if (rc =3D=3D TMF_RESP_FUNC_COMPLETE) hisi_sas_release_task(hisi_hba, device); =20 diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_= scsi_host.c index 956b4387c1b8..b18cbb617710 100644 --- a/drivers/scsi/libsas/sas_scsi_host.c +++ b/drivers/scsi/libsas/sas_scsi_host.c @@ -1033,10 +1033,8 @@ int sas_execute_tmf(struct domain_device *device, vo= id *parameter, return res; } =20 -int sas_execute_ssp_tmf(struct domain_device *device, u8 *lun, - struct sas_tmf_task *tmf); -int sas_execute_ssp_tmf(struct domain_device *device, u8 *lun, - struct sas_tmf_task *tmf) +static int sas_execute_ssp_tmf(struct domain_device *device, u8 *lun, + struct sas_tmf_task *tmf) { struct sas_ssp_task ssp_task; =20 @@ -1048,6 +1046,16 @@ int sas_execute_ssp_tmf(struct domain_device *device= , u8 *lun, return sas_execute_tmf(device, &ssp_task, sizeof(ssp_task), -1, tmf); } =20 +int sas_abort_task_set(struct domain_device *dev, u8 *lun) +{ + struct sas_tmf_task tmf_task =3D { + .tmf =3D TMF_ABORT_TASK_SET, + }; + + return sas_execute_ssp_tmf(dev, lun, &tmf_task); +} +EXPORT_SYMBOL_GPL(sas_abort_task_set); + /* * Tell an upper layer that it needs to initiate an abort for a given task. * This should only ever be called by an LLDD. diff --git a/drivers/scsi/mvsas/mv_init.c b/drivers/scsi/mvsas/mv_init.c index 21429e3a3632..484ad2f41f48 100644 --- a/drivers/scsi/mvsas/mv_init.c +++ b/drivers/scsi/mvsas/mv_init.c @@ -63,7 +63,7 @@ static struct sas_domain_function_template mvs_transport_= ops =3D { .lldd_control_phy =3D mvs_phy_control, =20 .lldd_abort_task =3D mvs_abort_task, - .lldd_abort_task_set =3D mvs_abort_task_set, + .lldd_abort_task_set =3D sas_abort_task_set, .lldd_clear_task_set =3D mvs_clear_task_set, .lldd_I_T_nexus_reset =3D mvs_I_T_nexus_reset, .lldd_lu_reset =3D mvs_lu_reset, diff --git a/drivers/scsi/mvsas/mv_sas.c b/drivers/scsi/mvsas/mv_sas.c index 5105d55eb00c..3b2aa7117eb4 100644 --- a/drivers/scsi/mvsas/mv_sas.c +++ b/drivers/scsi/mvsas/mv_sas.c @@ -1539,17 +1539,6 @@ int mvs_abort_task(struct sas_task *task) return rc; } =20 -int mvs_abort_task_set(struct domain_device *dev, u8 *lun) -{ - int rc; - struct sas_tmf_task tmf_task; - - tmf_task.tmf =3D TMF_ABORT_TASK_SET; - rc =3D mvs_debug_issue_ssp_tmf(dev, lun, &tmf_task); - - return rc; -} - int mvs_clear_task_set(struct domain_device *dev, u8 *lun) { int rc =3D TMF_RESP_FUNC_FAILED; diff --git a/drivers/scsi/mvsas/mv_sas.h b/drivers/scsi/mvsas/mv_sas.h index fa654c73beee..0bee63596208 100644 --- a/drivers/scsi/mvsas/mv_sas.h +++ b/drivers/scsi/mvsas/mv_sas.h @@ -440,7 +440,6 @@ void mvs_scan_start(struct Scsi_Host *shost); int mvs_scan_finished(struct Scsi_Host *shost, unsigned long time); int mvs_queue_command(struct sas_task *task, gfp_t gfp_flags); int mvs_abort_task(struct sas_task *task); -int mvs_abort_task_set(struct domain_device *dev, u8 *lun); int mvs_clear_task_set(struct domain_device *dev, u8 * lun); void mvs_port_formed(struct asd_sas_phy *sas_phy); void mvs_port_deformed(struct asd_sas_phy *sas_phy); diff --git a/drivers/scsi/pm8001/pm8001_init.c b/drivers/scsi/pm8001/pm8001= _init.c index 8eef8f4de42f..65489c52c50a 100644 --- a/drivers/scsi/pm8001/pm8001_init.c +++ b/drivers/scsi/pm8001/pm8001_init.c @@ -122,7 +122,7 @@ static struct sas_domain_function_template pm8001_trans= port_ops =3D { .lldd_control_phy =3D pm8001_phy_control, =20 .lldd_abort_task =3D pm8001_abort_task, - .lldd_abort_task_set =3D pm8001_abort_task_set, + .lldd_abort_task_set =3D sas_abort_task_set, .lldd_clear_task_set =3D pm8001_clear_task_set, .lldd_I_T_nexus_reset =3D pm8001_I_T_nexus_reset, .lldd_lu_reset =3D pm8001_lu_reset, diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_= sas.c index 06e5d5741ae2..c142bd0ce634 100644 --- a/drivers/scsi/pm8001/pm8001_sas.c +++ b/drivers/scsi/pm8001/pm8001_sas.c @@ -1341,14 +1341,6 @@ int pm8001_abort_task(struct sas_task *task) return rc; } =20 -int pm8001_abort_task_set(struct domain_device *dev, u8 *lun) -{ - struct sas_tmf_task tmf_task; - - tmf_task.tmf =3D TMF_ABORT_TASK_SET; - return pm8001_issue_ssp_tmf(dev, lun, &tmf_task); -} - int pm8001_clear_task_set(struct domain_device *dev, u8 *lun) { struct sas_tmf_task tmf_task; diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_= sas.h index c19c9c80206c..817a37608133 100644 --- a/drivers/scsi/pm8001/pm8001_sas.h +++ b/drivers/scsi/pm8001/pm8001_sas.h @@ -644,7 +644,6 @@ void pm8001_scan_start(struct Scsi_Host *shost); int pm8001_scan_finished(struct Scsi_Host *shost, unsigned long time); int pm8001_queue_command(struct sas_task *task, gfp_t gfp_flags); int pm8001_abort_task(struct sas_task *task); -int pm8001_abort_task_set(struct domain_device *dev, u8 *lun); int pm8001_clear_task_set(struct domain_device *dev, u8 *lun); int pm8001_dev_found(struct domain_device *dev); void pm8001_dev_gone(struct domain_device *dev); diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index 1e5ecfb2f36e..434437b0e89c 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h @@ -724,6 +724,8 @@ struct sas_phy *sas_get_local_phy(struct domain_device = *dev); =20 int sas_request_addr(struct Scsi_Host *shost, u8 *addr); =20 +int sas_abort_task_set(struct domain_device *dev, u8 *lun); + int sas_notify_port_event(struct asd_sas_phy *phy, enum port_event event, gfp_t gfp_flags); int sas_notify_phy_event(struct asd_sas_phy *phy, enum phy_event event, --=20 2.26.2 From nobody Tue Jun 30 04:37:39 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E3D52C433F5 for ; Tue, 25 Jan 2022 11:44:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1383155AbiAYLov (ORCPT ); Tue, 25 Jan 2022 06:44:51 -0500 Received: from frasgout.his.huawei.com ([185.176.79.56]:4503 "EHLO frasgout.his.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1382459AbiAYLjQ (ORCPT ); Tue, 25 Jan 2022 06:39:16 -0500 Received: from fraeml743-chm.china.huawei.com (unknown [172.18.147.226]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4JjlBg2Z72z67wsC; Tue, 25 Jan 2022 19:34:51 +0800 (CST) Received: from lhreml724-chm.china.huawei.com (10.201.108.75) by fraeml743-chm.china.huawei.com (10.206.15.224) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 12:39:07 +0100 Received: from localhost.localdomain (10.69.192.58) by lhreml724-chm.china.huawei.com (10.201.108.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 11:39:03 +0000 From: John Garry To: , , , , , CC: , , , , , , , , John Garry Subject: [PATCH 12/16] scsi: libsas: Add sas_clear_task_set() Date: Tue, 25 Jan 2022 19:32:48 +0800 Message-ID: <1643110372-85470-13-git-send-email-john.garry@huawei.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1643110372-85470-1-git-send-email-john.garry@huawei.com> References: <1643110372-85470-1-git-send-email-john.garry@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.69.192.58] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To lhreml724-chm.china.huawei.com (10.201.108.75) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a generic implementation of clear task set TMF handler, and use in LLDDs. Signed-off-by: John Garry Reported-by: Damien Le Moal Tested-by: liyihang6@hisilicon.com --- drivers/scsi/hisi_sas/hisi_sas_main.c | 5 +---- drivers/scsi/libsas/sas_scsi_host.c | 10 ++++++++++ drivers/scsi/mvsas/mv_init.c | 2 +- drivers/scsi/mvsas/mv_sas.c | 11 ----------- drivers/scsi/mvsas/mv_sas.h | 1 - drivers/scsi/pm8001/pm8001_sas.c | 4 +--- include/scsi/libsas.h | 1 + 7 files changed, 14 insertions(+), 20 deletions(-) diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/= hisi_sas_main.c index 7bf0d400d11f..12919b063572 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_main.c +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c @@ -695,7 +695,6 @@ static int hisi_sas_init_device(struct domain_device *d= evice) { int rc =3D TMF_RESP_FUNC_COMPLETE; struct scsi_lun lun; - struct sas_tmf_task tmf_task; int retry =3D HISI_SAS_DISK_RECOVER_CNT; struct hisi_hba *hisi_hba =3D dev_to_hisi_hba(device); struct device *dev =3D hisi_hba->dev; @@ -705,10 +704,8 @@ static int hisi_sas_init_device(struct domain_device *= device) case SAS_END_DEVICE: int_to_scsilun(0, &lun); =20 - tmf_task.tmf =3D TMF_CLEAR_TASK_SET; while (retry-- > 0) { - rc =3D hisi_sas_debug_issue_ssp_tmf(device, lun.scsi_lun, - &tmf_task); + rc =3D sas_clear_task_set(device, lun.scsi_lun); if (rc =3D=3D TMF_RESP_FUNC_COMPLETE) { hisi_sas_release_task(hisi_hba, device); break; diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_= scsi_host.c index b18cbb617710..5520c857598b 100644 --- a/drivers/scsi/libsas/sas_scsi_host.c +++ b/drivers/scsi/libsas/sas_scsi_host.c @@ -1056,6 +1056,16 @@ int sas_abort_task_set(struct domain_device *dev, u8= *lun) } EXPORT_SYMBOL_GPL(sas_abort_task_set); =20 +int sas_clear_task_set(struct domain_device *dev, u8 *lun) +{ + struct sas_tmf_task tmf_task =3D { + .tmf =3D TMF_CLEAR_TASK_SET, + }; + + return sas_execute_ssp_tmf(dev, lun, &tmf_task); +} +EXPORT_SYMBOL_GPL(sas_clear_task_set); + /* * Tell an upper layer that it needs to initiate an abort for a given task. * This should only ever be called by an LLDD. diff --git a/drivers/scsi/mvsas/mv_init.c b/drivers/scsi/mvsas/mv_init.c index 484ad2f41f48..dac66dddfaf6 100644 --- a/drivers/scsi/mvsas/mv_init.c +++ b/drivers/scsi/mvsas/mv_init.c @@ -64,7 +64,7 @@ static struct sas_domain_function_template mvs_transport_= ops =3D { =20 .lldd_abort_task =3D mvs_abort_task, .lldd_abort_task_set =3D sas_abort_task_set, - .lldd_clear_task_set =3D mvs_clear_task_set, + .lldd_clear_task_set =3D sas_clear_task_set, .lldd_I_T_nexus_reset =3D mvs_I_T_nexus_reset, .lldd_lu_reset =3D mvs_lu_reset, .lldd_query_task =3D mvs_query_task, diff --git a/drivers/scsi/mvsas/mv_sas.c b/drivers/scsi/mvsas/mv_sas.c index 3b2aa7117eb4..146005d2d75c 100644 --- a/drivers/scsi/mvsas/mv_sas.c +++ b/drivers/scsi/mvsas/mv_sas.c @@ -1539,17 +1539,6 @@ int mvs_abort_task(struct sas_task *task) return rc; } =20 -int mvs_clear_task_set(struct domain_device *dev, u8 *lun) -{ - int rc =3D TMF_RESP_FUNC_FAILED; - struct sas_tmf_task tmf_task; - - tmf_task.tmf =3D TMF_CLEAR_TASK_SET; - rc =3D mvs_debug_issue_ssp_tmf(dev, lun, &tmf_task); - - return rc; -} - static int mvs_sata_done(struct mvs_info *mvi, struct sas_task *task, u32 slot_idx, int err) { diff --git a/drivers/scsi/mvsas/mv_sas.h b/drivers/scsi/mvsas/mv_sas.h index 0bee63596208..509d8f32a04f 100644 --- a/drivers/scsi/mvsas/mv_sas.h +++ b/drivers/scsi/mvsas/mv_sas.h @@ -440,7 +440,6 @@ void mvs_scan_start(struct Scsi_Host *shost); int mvs_scan_finished(struct Scsi_Host *shost, unsigned long time); int mvs_queue_command(struct sas_task *task, gfp_t gfp_flags); int mvs_abort_task(struct sas_task *task); -int mvs_clear_task_set(struct domain_device *dev, u8 * lun); void mvs_port_formed(struct asd_sas_phy *sas_phy); void mvs_port_deformed(struct asd_sas_phy *sas_phy); int mvs_dev_found(struct domain_device *dev); diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_= sas.c index c142bd0ce634..3547e8538670 100644 --- a/drivers/scsi/pm8001/pm8001_sas.c +++ b/drivers/scsi/pm8001/pm8001_sas.c @@ -1343,14 +1343,12 @@ int pm8001_abort_task(struct sas_task *task) =20 int pm8001_clear_task_set(struct domain_device *dev, u8 *lun) { - struct sas_tmf_task tmf_task; struct pm8001_device *pm8001_dev =3D dev->lldd_dev; struct pm8001_hba_info *pm8001_ha =3D pm8001_find_ha_by_dev(dev); =20 pm8001_dbg(pm8001_ha, EH, "I_T_L_Q clear task set[%x]\n", pm8001_dev->device_id); - tmf_task.tmf =3D TMF_CLEAR_TASK_SET; - return pm8001_issue_ssp_tmf(dev, lun, &tmf_task); + return sas_clear_task_set(dev, lun); } =20 void pm8001_port_formed(struct asd_sas_phy *sas_phy) diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index 434437b0e89c..710f93ddc5d4 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h @@ -725,6 +725,7 @@ struct sas_phy *sas_get_local_phy(struct domain_device = *dev); int sas_request_addr(struct Scsi_Host *shost, u8 *addr); =20 int sas_abort_task_set(struct domain_device *dev, u8 *lun); +int sas_clear_task_set(struct domain_device *dev, u8 *lun); =20 int sas_notify_port_event(struct asd_sas_phy *phy, enum port_event event, gfp_t gfp_flags); --=20 2.26.2 From nobody Tue Jun 30 04:37:39 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3850AC433FE for ; Tue, 25 Jan 2022 11:45:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1383426AbiAYLpH (ORCPT ); Tue, 25 Jan 2022 06:45:07 -0500 Received: from frasgout.his.huawei.com ([185.176.79.56]:4504 "EHLO frasgout.his.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1382511AbiAYLjV (ORCPT ); Tue, 25 Jan 2022 06:39:21 -0500 Received: from fraeml742-chm.china.huawei.com (unknown [172.18.147.207]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4JjlCj6XJlz686my; Tue, 25 Jan 2022 19:35:45 +0800 (CST) Received: from lhreml724-chm.china.huawei.com (10.201.108.75) by fraeml742-chm.china.huawei.com (10.206.15.223) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 12:39:10 +0100 Received: from localhost.localdomain (10.69.192.58) by lhreml724-chm.china.huawei.com (10.201.108.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 11:39:06 +0000 From: John Garry To: , , , , , CC: , , , , , , , , John Garry Subject: [PATCH 13/16] scsi: libsas: Add sas_lu_reset() Date: Tue, 25 Jan 2022 19:32:49 +0800 Message-ID: <1643110372-85470-14-git-send-email-john.garry@huawei.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1643110372-85470-1-git-send-email-john.garry@huawei.com> References: <1643110372-85470-1-git-send-email-john.garry@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.69.192.58] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To lhreml724-chm.china.huawei.com (10.201.108.75) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a generic implementation of LU reset TMF handler, and use in LLDDs. Signed-off-by: John Garry Reported-by: Damien Le Moal Tested-by: liyihang6@hisilicon.com --- drivers/scsi/hisi_sas/hisi_sas_main.c | 4 +--- drivers/scsi/libsas/sas_scsi_host.c | 10 ++++++++++ drivers/scsi/mvsas/mv_sas.c | 4 +--- drivers/scsi/pm8001/pm8001_sas.c | 4 +--- include/scsi/libsas.h | 1 + 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/= hisi_sas_main.c index 12919b063572..858f4b2aa211 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_main.c +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c @@ -1938,9 +1938,7 @@ static int hisi_sas_lu_reset(struct domain_device *de= vice, u8 *lun) hisi_sas_release_task(hisi_hba, device); sas_put_local_phy(phy); } else { - struct sas_tmf_task tmf_task =3D { .tmf =3D TMF_LU_RESET }; - - rc =3D hisi_sas_debug_issue_ssp_tmf(device, lun, &tmf_task); + rc =3D sas_lu_reset(device, lun); if (rc =3D=3D TMF_RESP_FUNC_COMPLETE) hisi_sas_release_task(hisi_hba, device); } diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_= scsi_host.c index 5520c857598b..a7beca31d1e8 100644 --- a/drivers/scsi/libsas/sas_scsi_host.c +++ b/drivers/scsi/libsas/sas_scsi_host.c @@ -1066,6 +1066,16 @@ int sas_clear_task_set(struct domain_device *dev, u8= *lun) } EXPORT_SYMBOL_GPL(sas_clear_task_set); =20 +int sas_lu_reset(struct domain_device *dev, u8 *lun) +{ + struct sas_tmf_task tmf_task =3D { + .tmf =3D TMF_LU_RESET, + }; + + return sas_execute_ssp_tmf(dev, lun, &tmf_task); +} +EXPORT_SYMBOL_GPL(sas_lu_reset); + /* * Tell an upper layer that it needs to initiate an abort for a given task. * This should only ever be called by an LLDD. diff --git a/drivers/scsi/mvsas/mv_sas.c b/drivers/scsi/mvsas/mv_sas.c index 146005d2d75c..61bf4d1e8355 100644 --- a/drivers/scsi/mvsas/mv_sas.c +++ b/drivers/scsi/mvsas/mv_sas.c @@ -1384,13 +1384,11 @@ int mvs_lu_reset(struct domain_device *dev, u8 *lun) { unsigned long flags; int rc =3D TMF_RESP_FUNC_FAILED; - struct sas_tmf_task tmf_task; struct mvs_device * mvi_dev =3D dev->lldd_dev; struct mvs_info *mvi =3D mvi_dev->mvi_info; =20 - tmf_task.tmf =3D TMF_LU_RESET; mvi_dev->dev_status =3D MVS_DEV_EH; - rc =3D mvs_debug_issue_ssp_tmf(dev, lun, &tmf_task); + rc =3D sas_lu_reset(dev, lun); if (rc =3D=3D TMF_RESP_FUNC_COMPLETE) { spin_lock_irqsave(&mvi->lock, flags); mvs_release_task(mvi, dev); diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_= sas.c index 3547e8538670..afea130807f2 100644 --- a/drivers/scsi/pm8001/pm8001_sas.c +++ b/drivers/scsi/pm8001/pm8001_sas.c @@ -1111,7 +1111,6 @@ int pm8001_I_T_nexus_event_handler(struct domain_devi= ce *dev) int pm8001_lu_reset(struct domain_device *dev, u8 *lun) { int rc =3D TMF_RESP_FUNC_FAILED; - struct sas_tmf_task tmf_task; struct pm8001_device *pm8001_dev =3D dev->lldd_dev; struct pm8001_hba_info *pm8001_ha =3D pm8001_find_ha_by_dev(dev); DECLARE_COMPLETION_ONSTACK(completion_setstate); @@ -1126,8 +1125,7 @@ int pm8001_lu_reset(struct domain_device *dev, u8 *lu= n) pm8001_dev, DS_OPERATIONAL); wait_for_completion(&completion_setstate); } else { - tmf_task.tmf =3D TMF_LU_RESET; - rc =3D pm8001_issue_ssp_tmf(dev, lun, &tmf_task); + rc =3D sas_lu_reset(dev, lun); } /* If failed, fall-through I_T_Nexus reset */ pm8001_dbg(pm8001_ha, EH, "for device[%x]:rc=3D%d\n", diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index 710f93ddc5d4..12caf688806c 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h @@ -726,6 +726,7 @@ int sas_request_addr(struct Scsi_Host *shost, u8 *addr); =20 int sas_abort_task_set(struct domain_device *dev, u8 *lun); int sas_clear_task_set(struct domain_device *dev, u8 *lun); +int sas_lu_reset(struct domain_device *dev, u8 *lun); =20 int sas_notify_port_event(struct asd_sas_phy *phy, enum port_event event, gfp_t gfp_flags); --=20 2.26.2 From nobody Tue Jun 30 04:37:39 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 919AFC433FE for ; Tue, 25 Jan 2022 11:45:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1383972AbiAYLpc (ORCPT ); Tue, 25 Jan 2022 06:45:32 -0500 Received: from frasgout.his.huawei.com ([185.176.79.56]:4508 "EHLO frasgout.his.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1354561AbiAYLky (ORCPT ); Tue, 25 Jan 2022 06:40:54 -0500 Received: from fraeml741-chm.china.huawei.com (unknown [172.18.147.207]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4JjlBp3Kq6z68994; Tue, 25 Jan 2022 19:34:58 +0800 (CST) Received: from lhreml724-chm.china.huawei.com (10.201.108.75) by fraeml741-chm.china.huawei.com (10.206.15.222) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 12:39:14 +0100 Received: from localhost.localdomain (10.69.192.58) by lhreml724-chm.china.huawei.com (10.201.108.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 11:39:10 +0000 From: John Garry To: , , , , , CC: , , , , , , , , John Garry Subject: [PATCH 14/16] scsi: libsas: Add sas_query_task() Date: Tue, 25 Jan 2022 19:32:50 +0800 Message-ID: <1643110372-85470-15-git-send-email-john.garry@huawei.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1643110372-85470-1-git-send-email-john.garry@huawei.com> References: <1643110372-85470-1-git-send-email-john.garry@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.69.192.58] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To lhreml724-chm.china.huawei.com (10.201.108.75) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a generic implementation of query task TMF handler, and use in LLDDs. Signed-off-by: John Garry Reported-by: Damien Le Moal Tested-by: liyihang6@hisilicon.com --- drivers/scsi/hisi_sas/hisi_sas_main.c | 12 +----------- drivers/scsi/libsas/sas_scsi_host.c | 16 ++++++++++++++++ drivers/scsi/mvsas/mv_sas.c | 9 +-------- drivers/scsi/pm8001/pm8001_sas.c | 7 +------ include/scsi/libsas.h | 1 + 5 files changed, 20 insertions(+), 25 deletions(-) diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/= hisi_sas_main.c index 858f4b2aa211..c2a6d143b6ba 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_main.c +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c @@ -1993,23 +1993,13 @@ static int hisi_sas_clear_nexus_ha(struct sas_ha_st= ruct *sas_ha) =20 static int hisi_sas_query_task(struct sas_task *task) { - struct scsi_lun lun; - struct sas_tmf_task tmf_task; int rc =3D TMF_RESP_FUNC_FAILED; =20 if (task->lldd_task && task->task_proto & SAS_PROTOCOL_SSP) { - struct scsi_cmnd *cmnd =3D task->uldd_task; - struct domain_device *device =3D task->dev; struct hisi_sas_slot *slot =3D task->lldd_task; u32 tag =3D slot->idx; =20 - int_to_scsilun(cmnd->device->lun, &lun); - tmf_task.tmf =3D TMF_QUERY_TASK; - tmf_task.tag_of_task_to_be_managed =3D tag; - - rc =3D hisi_sas_debug_issue_ssp_tmf(device, - lun.scsi_lun, - &tmf_task); + rc =3D sas_query_task(task, tag); switch (rc) { /* The task is still in Lun, release it then */ case TMF_RESP_FUNC_SUCC: diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_= scsi_host.c index a7beca31d1e8..b2051a1411f3 100644 --- a/drivers/scsi/libsas/sas_scsi_host.c +++ b/drivers/scsi/libsas/sas_scsi_host.c @@ -1076,6 +1076,22 @@ int sas_lu_reset(struct domain_device *dev, u8 *lun) } EXPORT_SYMBOL_GPL(sas_lu_reset); =20 +int sas_query_task(struct sas_task *task, u16 tag) +{ + struct sas_tmf_task tmf_task =3D { + .tmf =3D TMF_QUERY_TASK, + .tag_of_task_to_be_managed =3D tag, + }; + struct scsi_cmnd *cmnd =3D task->uldd_task; + struct domain_device *dev =3D task->dev; + struct scsi_lun lun; + + int_to_scsilun(cmnd->device->lun, &lun); + + return sas_execute_ssp_tmf(dev, lun.scsi_lun, &tmf_task); +} +EXPORT_SYMBOL_GPL(sas_query_task); + /* * Tell an upper layer that it needs to initiate an abort for a given task. * This should only ever be called by an LLDD. diff --git a/drivers/scsi/mvsas/mv_sas.c b/drivers/scsi/mvsas/mv_sas.c index 61bf4d1e8355..bf97de75da89 100644 --- a/drivers/scsi/mvsas/mv_sas.c +++ b/drivers/scsi/mvsas/mv_sas.c @@ -1425,27 +1425,20 @@ int mvs_I_T_nexus_reset(struct domain_device *dev) int mvs_query_task(struct sas_task *task) { u32 tag; - struct scsi_lun lun; - struct sas_tmf_task tmf_task; int rc =3D TMF_RESP_FUNC_FAILED; =20 if (task->lldd_task && task->task_proto & SAS_PROTOCOL_SSP) { - struct scsi_cmnd * cmnd =3D (struct scsi_cmnd *)task->uldd_task; struct domain_device *dev =3D task->dev; struct mvs_device *mvi_dev =3D (struct mvs_device *)dev->lldd_dev; struct mvs_info *mvi =3D mvi_dev->mvi_info; =20 - int_to_scsilun(cmnd->device->lun, &lun); rc =3D mvs_find_tag(mvi, task, &tag); if (rc =3D=3D 0) { rc =3D TMF_RESP_FUNC_FAILED; return rc; } =20 - tmf_task.tmf =3D TMF_QUERY_TASK; - tmf_task.tag_of_task_to_be_managed =3D cpu_to_le16(tag); - - rc =3D mvs_debug_issue_ssp_tmf(dev, lun.scsi_lun, &tmf_task); + rc =3D sas_query_task(task, tag); switch (rc) { /* The task is still in Lun, release it then */ case TMF_RESP_FUNC_SUCC: diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_= sas.c index afea130807f2..baa919951db6 100644 --- a/drivers/scsi/pm8001/pm8001_sas.c +++ b/drivers/scsi/pm8001/pm8001_sas.c @@ -1137,8 +1137,6 @@ int pm8001_lu_reset(struct domain_device *dev, u8 *lu= n) int pm8001_query_task(struct sas_task *task) { u32 tag =3D 0xdeadbeef; - struct scsi_lun lun; - struct sas_tmf_task tmf_task; int rc =3D TMF_RESP_FUNC_FAILED; if (unlikely(!task || !task->lldd_task || !task->dev)) return rc; @@ -1149,17 +1147,14 @@ int pm8001_query_task(struct sas_task *task) struct pm8001_hba_info *pm8001_ha =3D pm8001_find_ha_by_dev(dev); =20 - int_to_scsilun(cmnd->device->lun, &lun); rc =3D pm8001_find_tag(task, &tag); if (rc =3D=3D 0) { rc =3D TMF_RESP_FUNC_FAILED; return rc; } pm8001_dbg(pm8001_ha, EH, "Query:[%16ph]\n", cmnd->cmnd); - tmf_task.tmf =3D TMF_QUERY_TASK; - tmf_task.tag_of_task_to_be_managed =3D tag; =20 - rc =3D pm8001_issue_ssp_tmf(dev, lun.scsi_lun, &tmf_task); + rc =3D sas_query_task(task, tag); switch (rc) { /* The task is still in Lun, release it then */ case TMF_RESP_FUNC_SUCC: diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index 12caf688806c..7d524907d546 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h @@ -727,6 +727,7 @@ int sas_request_addr(struct Scsi_Host *shost, u8 *addr); int sas_abort_task_set(struct domain_device *dev, u8 *lun); int sas_clear_task_set(struct domain_device *dev, u8 *lun); int sas_lu_reset(struct domain_device *dev, u8 *lun); +int sas_query_task(struct sas_task *task, u16 tag); =20 int sas_notify_port_event(struct asd_sas_phy *phy, enum port_event event, gfp_t gfp_flags); --=20 2.26.2 From nobody Tue Jun 30 04:37:39 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D4869C4167E for ; Tue, 25 Jan 2022 11:54:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1384560AbiAYLp4 (ORCPT ); Tue, 25 Jan 2022 06:45:56 -0500 Received: from frasgout.his.huawei.com ([185.176.79.56]:4506 "EHLO frasgout.his.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1354323AbiAYLky (ORCPT ); Tue, 25 Jan 2022 06:40:54 -0500 Received: from fraeml739-chm.china.huawei.com (unknown [172.18.147.200]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4JjlBt1nfDz6896K; Tue, 25 Jan 2022 19:35:02 +0800 (CST) Received: from lhreml724-chm.china.huawei.com (10.201.108.75) by fraeml739-chm.china.huawei.com (10.206.15.220) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 12:39:18 +0100 Received: from localhost.localdomain (10.69.192.58) by lhreml724-chm.china.huawei.com (10.201.108.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 11:39:14 +0000 From: John Garry To: , , , , , CC: , , , , , , , , John Garry Subject: [PATCH 15/16] scsi: libsas: Add sas_abort_task() Date: Tue, 25 Jan 2022 19:32:51 +0800 Message-ID: <1643110372-85470-16-git-send-email-john.garry@huawei.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1643110372-85470-1-git-send-email-john.garry@huawei.com> References: <1643110372-85470-1-git-send-email-john.garry@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.69.192.58] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To lhreml724-chm.china.huawei.com (10.201.108.75) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a generic implementation of abort task TMF handler, and use in LLDDs. With that, some LLDDs custom TMF functions can now be deleted. Signed-off-by: John Garry Reported-by: Damien Le Moal Tested-by: liyihang6@hisilicon.com --- drivers/scsi/hisi_sas/hisi_sas_main.c | 27 +----- drivers/scsi/libsas/sas_scsi_host.c | 16 ++++ drivers/scsi/mvsas/mv_sas.c | 118 +------------------------- drivers/scsi/pm8001/pm8001_sas.c | 111 +----------------------- include/scsi/libsas.h | 1 + 5 files changed, 20 insertions(+), 253 deletions(-) diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/= hisi_sas_main.c index c2a6d143b6ba..359a5718fc59 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_main.c +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c @@ -10,8 +10,6 @@ #define DEV_IS_GONE(dev) \ ((!dev) || (dev->dev_type =3D=3D SAS_PHY_UNUSED)) =20 -static int hisi_sas_debug_issue_ssp_tmf(struct domain_device *device, - u8 *lun, struct sas_tmf_task *tmf); static int hisi_sas_internal_task_abort(struct hisi_hba *hisi_hba, struct domain_device *device, @@ -1421,20 +1419,6 @@ static int hisi_sas_softreset_ata_disk(struct domain= _device *device) return rc; } =20 -static int hisi_sas_debug_issue_ssp_tmf(struct domain_device *device, - u8 *lun, struct sas_tmf_task *tmf) -{ - struct sas_ssp_task ssp_task; - - if (!(device->tproto & SAS_PROTOCOL_SSP)) - return TMF_RESP_FUNC_ESUPP; - - memcpy(ssp_task.LUN, lun, 8); - - return hisi_sas_exec_internal_tmf_task(device, &ssp_task, - sizeof(ssp_task), tmf); -} - static void hisi_sas_refresh_port_id(struct hisi_hba *hisi_hba) { u32 state =3D hisi_hba->hw->get_phys_state(hisi_hba); @@ -1680,8 +1664,6 @@ static int hisi_sas_controller_reset(struct hisi_hba = *hisi_hba) =20 static int hisi_sas_abort_task(struct sas_task *task) { - struct scsi_lun lun; - struct sas_tmf_task tmf_task; struct domain_device *device =3D task->dev; struct hisi_sas_device *sas_dev =3D device->lldd_dev; struct hisi_hba *hisi_hba; @@ -1716,18 +1698,11 @@ static int hisi_sas_abort_task(struct sas_task *tas= k) spin_unlock_irqrestore(&task->task_state_lock, flags); =20 if (task->lldd_task && task->task_proto & SAS_PROTOCOL_SSP) { - struct scsi_cmnd *cmnd =3D task->uldd_task; struct hisi_sas_slot *slot =3D task->lldd_task; u16 tag =3D slot->idx; int rc2; =20 - int_to_scsilun(cmnd->device->lun, &lun); - tmf_task.tmf =3D TMF_ABORT_TASK; - tmf_task.tag_of_task_to_be_managed =3D tag; - - rc =3D hisi_sas_debug_issue_ssp_tmf(task->dev, lun.scsi_lun, - &tmf_task); - + rc =3D sas_abort_task(task, tag); rc2 =3D hisi_sas_internal_task_abort(hisi_hba, device, HISI_SAS_INT_ABT_CMD, tag, false); diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_= scsi_host.c index b2051a1411f3..3e2e3bcbbf67 100644 --- a/drivers/scsi/libsas/sas_scsi_host.c +++ b/drivers/scsi/libsas/sas_scsi_host.c @@ -1092,6 +1092,22 @@ int sas_query_task(struct sas_task *task, u16 tag) } EXPORT_SYMBOL_GPL(sas_query_task); =20 +int sas_abort_task(struct sas_task *task, u16 tag) +{ + struct sas_tmf_task tmf_task =3D { + .tmf =3D TMF_ABORT_TASK, + .tag_of_task_to_be_managed =3D tag, + }; + struct scsi_cmnd *cmnd =3D task->uldd_task; + struct domain_device *dev =3D task->dev; + struct scsi_lun lun; + + int_to_scsilun(cmnd->device->lun, &lun); + + return sas_execute_ssp_tmf(dev, lun.scsi_lun, &tmf_task); +} +EXPORT_SYMBOL_GPL(sas_abort_task); + /* * Tell an upper layer that it needs to initiate an abort for a given task. * This should only ever be called by an LLDD. diff --git a/drivers/scsi/mvsas/mv_sas.c b/drivers/scsi/mvsas/mv_sas.c index bf97de75da89..627186a52f7b 100644 --- a/drivers/scsi/mvsas/mv_sas.c +++ b/drivers/scsi/mvsas/mv_sas.c @@ -1257,114 +1257,6 @@ void mvs_dev_gone(struct domain_device *dev) mvs_dev_gone_notify(dev); } =20 -static void mvs_task_done(struct sas_task *task) -{ - if (!del_timer(&task->slow_task->timer)) - return; - complete(&task->slow_task->completion); -} - -static void mvs_tmf_timedout(struct timer_list *t) -{ - struct sas_task_slow *slow =3D from_timer(slow, t, timer); - struct sas_task *task =3D slow->task; - - task->task_state_flags |=3D SAS_TASK_STATE_ABORTED; - complete(&task->slow_task->completion); -} - -#define MVS_TASK_TIMEOUT 20 -static int mvs_exec_internal_tmf_task(struct domain_device *dev, - void *parameter, u32 para_len, struct sas_tmf_task *tmf) -{ - int res, retry; - struct sas_task *task =3D NULL; - - for (retry =3D 0; retry < 3; retry++) { - task =3D sas_alloc_slow_task(GFP_KERNEL); - if (!task) - return -ENOMEM; - - task->dev =3D dev; - task->task_proto =3D dev->tproto; - - memcpy(&task->ssp_task, parameter, para_len); - task->task_done =3D mvs_task_done; - - task->slow_task->timer.function =3D mvs_tmf_timedout; - task->slow_task->timer.expires =3D jiffies + MVS_TASK_TIMEOUT*HZ; - add_timer(&task->slow_task->timer); - - task->tmf =3D tmf; - - res =3D mvs_queue_command(task, GFP_KERNEL); - - if (res) { - del_timer(&task->slow_task->timer); - mv_printk("executing internal task failed:%d\n", res); - goto ex_err; - } - - wait_for_completion(&task->slow_task->completion); - res =3D TMF_RESP_FUNC_FAILED; - /* Even TMF timed out, return direct. */ - if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) { - if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) { - mv_printk("TMF task[%x] timeout.\n", tmf->tmf); - goto ex_err; - } - } - - if (task->task_status.resp =3D=3D SAS_TASK_COMPLETE && - task->task_status.stat =3D=3D SAS_SAM_STAT_GOOD) { - res =3D TMF_RESP_FUNC_COMPLETE; - break; - } - - if (task->task_status.resp =3D=3D SAS_TASK_COMPLETE && - task->task_status.stat =3D=3D SAS_DATA_UNDERRUN) { - /* no error, but return the number of bytes of - * underrun */ - res =3D task->task_status.residual; - break; - } - - if (task->task_status.resp =3D=3D SAS_TASK_COMPLETE && - task->task_status.stat =3D=3D SAS_DATA_OVERRUN) { - mv_dprintk("blocked task error.\n"); - res =3D -EMSGSIZE; - break; - } else { - mv_dprintk(" task to dev %016llx response: 0x%x " - "status 0x%x\n", - SAS_ADDR(dev->sas_addr), - task->task_status.resp, - task->task_status.stat); - sas_free_task(task); - task =3D NULL; - - } - } -ex_err: - BUG_ON(retry =3D=3D 3 && task !=3D NULL); - sas_free_task(task); - return res; -} - -static int mvs_debug_issue_ssp_tmf(struct domain_device *dev, - u8 *lun, struct sas_tmf_task *tmf) -{ - struct sas_ssp_task ssp_task; - if (!(dev->tproto & SAS_PROTOCOL_SSP)) - return TMF_RESP_FUNC_ESUPP; - - memcpy(ssp_task.LUN, lun, 8); - - return mvs_exec_internal_tmf_task(dev, &ssp_task, - sizeof(ssp_task), tmf); -} - - /* Standard mandates link reset for ATA (type 0) and hard reset for SSP (type 1) , only for RECOVERY */ static int mvs_debug_I_T_nexus_reset(struct domain_device *dev) @@ -1455,8 +1347,6 @@ int mvs_query_task(struct sas_task *task) /* mandatory SAM-3, still need free task/slot info */ int mvs_abort_task(struct sas_task *task) { - struct scsi_lun lun; - struct sas_tmf_task tmf_task; struct domain_device *dev =3D task->dev; struct mvs_device *mvi_dev =3D (struct mvs_device *)dev->lldd_dev; struct mvs_info *mvi; @@ -1480,9 +1370,6 @@ int mvs_abort_task(struct sas_task *task) spin_unlock_irqrestore(&task->task_state_lock, flags); mvi_dev->dev_status =3D MVS_DEV_EH; if (task->lldd_task && task->task_proto & SAS_PROTOCOL_SSP) { - struct scsi_cmnd * cmnd =3D (struct scsi_cmnd *)task->uldd_task; - - int_to_scsilun(cmnd->device->lun, &lun); rc =3D mvs_find_tag(mvi, task, &tag); if (rc =3D=3D 0) { mv_printk("No such tag in %s\n", __func__); @@ -1490,10 +1377,7 @@ int mvs_abort_task(struct sas_task *task) return rc; } =20 - tmf_task.tmf =3D TMF_ABORT_TASK; - tmf_task.tag_of_task_to_be_managed =3D cpu_to_le16(tag); - - rc =3D mvs_debug_issue_ssp_tmf(dev, lun.scsi_lun, &tmf_task); + rc =3D sas_abort_task(task, tag); =20 /* if successful, clear the task and callback forwards.*/ if (rc =3D=3D TMF_RESP_FUNC_COMPLETE) { diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_= sas.c index baa919951db6..6607a8919d1d 100644 --- a/drivers/scsi/pm8001/pm8001_sas.c +++ b/drivers/scsi/pm8001/pm8001_sas.c @@ -709,97 +709,6 @@ static void pm8001_tmf_timedout(struct timer_list *t) } =20 #define PM8001_TASK_TIMEOUT 20 -/** - * pm8001_exec_internal_tmf_task - execute some task management commands. - * @dev: the wanted device. - * @tmf: which task management wanted to be take. - * @para_len: para_len. - * @parameter: ssp task parameter. - * - * when errors or exception happened, we may want to do something, for ex= ample - * abort the issued task which result in this exception, it is done by ca= lling - * this function, note it is also with the task execute interface. - */ -static int pm8001_exec_internal_tmf_task(struct domain_device *dev, - void *parameter, u32 para_len, struct sas_tmf_task *tmf) -{ - int res, retry; - struct sas_task *task =3D NULL; - struct pm8001_hba_info *pm8001_ha =3D pm8001_find_ha_by_dev(dev); - struct pm8001_device *pm8001_dev =3D dev->lldd_dev; - DECLARE_COMPLETION_ONSTACK(completion_setstate); - - for (retry =3D 0; retry < 3; retry++) { - task =3D sas_alloc_slow_task(GFP_KERNEL); - if (!task) - return -ENOMEM; - - task->dev =3D dev; - task->task_proto =3D dev->tproto; - memcpy(&task->ssp_task, parameter, para_len); - task->task_done =3D pm8001_task_done; - task->slow_task->timer.function =3D pm8001_tmf_timedout; - task->slow_task->timer.expires =3D jiffies + PM8001_TASK_TIMEOUT*HZ; - add_timer(&task->slow_task->timer); - - task->tmf =3D tmf; - - res =3D pm8001_queue_command(task, GFP_KERNEL); - - if (res) { - del_timer(&task->slow_task->timer); - pm8001_dbg(pm8001_ha, FAIL, "Executing internal task failed\n"); - goto ex_err; - } - wait_for_completion(&task->slow_task->completion); - if (pm8001_ha->chip_id !=3D chip_8001) { - pm8001_dev->setds_completion =3D &completion_setstate; - PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha, - pm8001_dev, DS_OPERATIONAL); - wait_for_completion(&completion_setstate); - } - res =3D -TMF_RESP_FUNC_FAILED; - /* Even TMF timed out, return direct. */ - if (task->task_state_flags & SAS_TASK_STATE_ABORTED) { - pm8001_dbg(pm8001_ha, FAIL, "TMF task[%x]timeout.\n", - tmf->tmf); - goto ex_err; - } - - if (task->task_status.resp =3D=3D SAS_TASK_COMPLETE && - task->task_status.stat =3D=3D SAS_SAM_STAT_GOOD) { - res =3D TMF_RESP_FUNC_COMPLETE; - break; - } - - if (task->task_status.resp =3D=3D SAS_TASK_COMPLETE && - task->task_status.stat =3D=3D SAS_DATA_UNDERRUN) { - /* no error, but return the number of bytes of - * underrun */ - res =3D task->task_status.residual; - break; - } - - if (task->task_status.resp =3D=3D SAS_TASK_COMPLETE && - task->task_status.stat =3D=3D SAS_DATA_OVERRUN) { - pm8001_dbg(pm8001_ha, FAIL, "Blocked task error.\n"); - res =3D -EMSGSIZE; - break; - } else { - pm8001_dbg(pm8001_ha, EH, - " Task to dev %016llx response:0x%x status 0x%x\n", - SAS_ADDR(dev->sas_addr), - task->task_status.resp, - task->task_status.stat); - sas_free_task(task); - task =3D NULL; - } - } -ex_err: - BUG_ON(retry =3D=3D 3 && task !=3D NULL); - sas_free_task(task); - return res; -} =20 static int pm8001_exec_internal_task_abort(struct pm8001_hba_info *pm8001_ha, @@ -908,18 +817,6 @@ void pm8001_dev_gone(struct domain_device *dev) pm8001_dev_gone_notify(dev); } =20 -static int pm8001_issue_ssp_tmf(struct domain_device *dev, - u8 *lun, struct sas_tmf_task *tmf) -{ - struct sas_ssp_task ssp_task; - if (!(dev->tproto & SAS_PROTOCOL_SSP)) - return TMF_RESP_FUNC_ESUPP; - - memcpy((u8 *)&ssp_task.LUN, lun, 8); - return pm8001_exec_internal_tmf_task(dev, &ssp_task, sizeof(ssp_task), - tmf); -} - /* retry commands by ha, by task and/or by device */ void pm8001_open_reject_retry( struct pm8001_hba_info *pm8001_ha, @@ -1180,9 +1077,7 @@ int pm8001_abort_task(struct sas_task *task) u32 tag; struct domain_device *dev ; struct pm8001_hba_info *pm8001_ha; - struct scsi_lun lun; struct pm8001_device *pm8001_dev; - struct sas_tmf_task tmf_task; int rc =3D TMF_RESP_FUNC_FAILED, ret; u32 phy_id, port_id; struct sas_task_slow slow_task; @@ -1218,11 +1113,7 @@ int pm8001_abort_task(struct sas_task *task) } spin_unlock_irqrestore(&task->task_state_lock, flags); if (task->task_proto & SAS_PROTOCOL_SSP) { - struct scsi_cmnd *cmnd =3D task->uldd_task; - int_to_scsilun(cmnd->device->lun, &lun); - tmf_task.tmf =3D TMF_ABORT_TASK; - tmf_task.tag_of_task_to_be_managed =3D tag; - rc =3D pm8001_issue_ssp_tmf(dev, lun.scsi_lun, &tmf_task); + rc =3D sas_abort_task(task, tag); pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev, pm8001_dev->sas_device, 0, tag); } else if (task->task_proto & SAS_PROTOCOL_SATA || diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index 7d524907d546..8a9ffe689d1f 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h @@ -728,6 +728,7 @@ int sas_abort_task_set(struct domain_device *dev, u8 *l= un); int sas_clear_task_set(struct domain_device *dev, u8 *lun); int sas_lu_reset(struct domain_device *dev, u8 *lun); int sas_query_task(struct sas_task *task, u16 tag); +int sas_abort_task(struct sas_task *task, u16 tag); =20 int sas_notify_port_event(struct asd_sas_phy *phy, enum port_event event, gfp_t gfp_flags); --=20 2.26.2 From nobody Tue Jun 30 04:37:39 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E2D7FC46467 for ; Tue, 25 Jan 2022 11:54:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231603AbiAYLqA (ORCPT ); Tue, 25 Jan 2022 06:46:00 -0500 Received: from frasgout.his.huawei.com ([185.176.79.56]:4507 "EHLO frasgout.his.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1354559AbiAYLky (ORCPT ); Tue, 25 Jan 2022 06:40:54 -0500 Received: from fraeml740-chm.china.huawei.com (unknown [172.18.147.200]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4JjlBy0XdNz6F8gY; Tue, 25 Jan 2022 19:35:06 +0800 (CST) Received: from lhreml724-chm.china.huawei.com (10.201.108.75) by fraeml740-chm.china.huawei.com (10.206.15.221) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 12:39:21 +0100 Received: from localhost.localdomain (10.69.192.58) by lhreml724-chm.china.huawei.com (10.201.108.75) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.21; Tue, 25 Jan 2022 11:39:18 +0000 From: John Garry To: , , , , , CC: , , , , , , , , John Garry Subject: [PATCH 16/16] scsi: libsas: Add sas_execute_ata_cmd() Date: Tue, 25 Jan 2022 19:32:52 +0800 Message-ID: <1643110372-85470-17-git-send-email-john.garry@huawei.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1643110372-85470-1-git-send-email-john.garry@huawei.com> References: <1643110372-85470-1-git-send-email-john.garry@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.69.192.58] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To lhreml724-chm.china.huawei.com (10.201.108.75) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a function to execute an ATA command using the TMF code, and use in the hisi_sas driver. That driver needs to be able to issue the command on a specific phy, so add an interface for that. With that, hisi_sas_exec_internal_tmf_task() may be deleted. Signed-off-by: John Garry Reported-by: Damien Le Moal Tested-by: liyihang6@hisilicon.com --- drivers/scsi/hisi_sas/hisi_sas_main.c | 129 +------------------------ drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 5 +- drivers/scsi/libsas/sas_ata.c | 8 ++ drivers/scsi/libsas/sas_scsi_host.c | 6 ++ include/scsi/libsas.h | 10 +- 5 files changed, 26 insertions(+), 132 deletions(-) diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/= hisi_sas_main.c index 359a5718fc59..c32af187e452 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_main.c +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c @@ -1245,124 +1245,7 @@ static void hisi_sas_tmf_timedout(struct timer_list= *t) complete(&task->slow_task->completion); } =20 -#define TASK_TIMEOUT (20 * HZ) -#define TASK_RETRY 3 #define INTERNAL_ABORT_TIMEOUT (6 * HZ) -static int hisi_sas_exec_internal_tmf_task(struct domain_device *device, - void *parameter, u32 para_len, - struct sas_tmf_task *tmf) -{ - struct hisi_sas_device *sas_dev =3D device->lldd_dev; - struct hisi_hba *hisi_hba =3D sas_dev->hisi_hba; - struct device *dev =3D hisi_hba->dev; - struct sas_task *task; - int res, retry; - - for (retry =3D 0; retry < TASK_RETRY; retry++) { - task =3D sas_alloc_slow_task(GFP_KERNEL); - if (!task) - return -ENOMEM; - - task->dev =3D device; - task->task_proto =3D device->tproto; - - if (dev_is_sata(device)) { - task->ata_task.device_control_reg_update =3D 1; - memcpy(&task->ata_task.fis, parameter, para_len); - } else { - memcpy(&task->ssp_task, parameter, para_len); - } - task->task_done =3D hisi_sas_task_done; - - task->slow_task->timer.function =3D hisi_sas_tmf_timedout; - task->slow_task->timer.expires =3D jiffies + TASK_TIMEOUT; - add_timer(&task->slow_task->timer); - - task->tmf =3D tmf; - - res =3D hisi_sas_queue_command(task, GFP_KERNEL); - if (res) { - del_timer_sync(&task->slow_task->timer); - dev_err(dev, "abort tmf: executing internal task failed: %d\n", - res); - goto ex_err; - } - - wait_for_completion(&task->slow_task->completion); - res =3D TMF_RESP_FUNC_FAILED; - /* Even TMF timed out, return direct. */ - if ((task->task_state_flags & SAS_TASK_STATE_ABORTED)) { - if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) { - struct hisi_sas_slot *slot =3D task->lldd_task; - - dev_err(dev, "abort tmf: TMF task timeout and not done\n"); - if (slot) { - struct hisi_sas_cq *cq =3D - &hisi_hba->cq[slot->dlvry_queue]; - /* - * sync irq to avoid free'ing task - * before using task in IO completion - */ - synchronize_irq(cq->irq_no); - slot->task =3D NULL; - } - - goto ex_err; - } else - dev_err(dev, "abort tmf: TMF task timeout\n"); - } - - if (task->task_status.resp =3D=3D SAS_TASK_COMPLETE && - task->task_status.stat =3D=3D TMF_RESP_FUNC_COMPLETE) { - res =3D TMF_RESP_FUNC_COMPLETE; - break; - } - - if (task->task_status.resp =3D=3D SAS_TASK_COMPLETE && - task->task_status.stat =3D=3D TMF_RESP_FUNC_SUCC) { - res =3D TMF_RESP_FUNC_SUCC; - break; - } - - if (task->task_status.resp =3D=3D SAS_TASK_COMPLETE && - task->task_status.stat =3D=3D SAS_DATA_UNDERRUN) { - /* no error, but return the number of bytes of - * underrun - */ - dev_warn(dev, "abort tmf: task to dev %016llx resp: 0x%x sts 0x%x under= run\n", - SAS_ADDR(device->sas_addr), - task->task_status.resp, - task->task_status.stat); - res =3D task->task_status.residual; - break; - } - - if (task->task_status.resp =3D=3D SAS_TASK_COMPLETE && - task->task_status.stat =3D=3D SAS_DATA_OVERRUN) { - dev_warn(dev, "abort tmf: blocked task error\n"); - res =3D -EMSGSIZE; - break; - } - - if (task->task_status.resp =3D=3D SAS_TASK_COMPLETE && - task->task_status.stat =3D=3D SAS_OPEN_REJECT) { - dev_warn(dev, "abort tmf: open reject failed\n"); - res =3D -EIO; - } else { - dev_warn(dev, "abort tmf: task to dev %016llx resp: 0x%x status 0x%x\n", - SAS_ADDR(device->sas_addr), - task->task_status.resp, - task->task_status.stat); - } - sas_free_task(task); - task =3D NULL; - } -ex_err: - if (retry =3D=3D TASK_RETRY) - dev_warn(dev, "abort tmf: executing internal task failed!\n"); - sas_free_task(task); - return res; -} =20 static void hisi_sas_fill_ata_reset_cmd(struct ata_device *dev, bool reset, int pmp, u8 *fis) @@ -1386,13 +1269,12 @@ static int hisi_sas_softreset_ata_disk(struct domai= n_device *device) int rc =3D TMF_RESP_FUNC_FAILED; struct hisi_hba *hisi_hba =3D dev_to_hisi_hba(device); struct device *dev =3D hisi_hba->dev; - int s =3D sizeof(struct host_to_dev_fis); =20 ata_for_each_link(link, ap, EDGE) { int pmp =3D sata_srst_pmp(link); =20 hisi_sas_fill_ata_reset_cmd(link->device, 1, pmp, fis); - rc =3D hisi_sas_exec_internal_tmf_task(device, fis, s, NULL); + rc =3D sas_execute_ata_cmd(device, fis, -1); if (rc !=3D TMF_RESP_FUNC_COMPLETE) break; } @@ -1402,8 +1284,7 @@ static int hisi_sas_softreset_ata_disk(struct domain_= device *device) int pmp =3D sata_srst_pmp(link); =20 hisi_sas_fill_ata_reset_cmd(link->device, 0, pmp, fis); - rc =3D hisi_sas_exec_internal_tmf_task(device, fis, - s, NULL); + rc =3D sas_execute_ata_cmd(device, fis, -1); if (rc !=3D TMF_RESP_FUNC_COMPLETE) dev_err(dev, "ata disk %016llx de-reset failed\n", SAS_ADDR(device->sas_addr)); @@ -1513,10 +1394,8 @@ static void hisi_sas_send_ata_reset_each_phy(struct = hisi_hba *hisi_hba, struct asd_sas_port *sas_port, struct domain_device *device) { - struct sas_tmf_task tmf_task =3D { .force_phy =3D 1 }; struct ata_port *ap =3D device->sata_dev.ap; struct device *dev =3D hisi_hba->dev; - int s =3D sizeof(struct host_to_dev_fis); int rc =3D TMF_RESP_FUNC_FAILED; struct ata_link *link; u8 fis[20] =3D {0}; @@ -1529,10 +1408,8 @@ static void hisi_sas_send_ata_reset_each_phy(struct = hisi_hba *hisi_hba, ata_for_each_link(link, ap, EDGE) { int pmp =3D sata_srst_pmp(link); =20 - tmf_task.phy_id =3D i; hisi_sas_fill_ata_reset_cmd(link->device, 1, pmp, fis); - rc =3D hisi_sas_exec_internal_tmf_task(device, fis, s, - &tmf_task); + rc =3D sas_execute_ata_cmd(device, fis, i); if (rc !=3D TMF_RESP_FUNC_COMPLETE) { dev_err(dev, "phy%d ata reset failed rc=3D%d\n", i, rc); diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c b/drivers/scsi/hisi_sas= /hisi_sas_v2_hw.c index ef5d8f64edd8..d8f58d92df4a 100644 --- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c +++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c @@ -2492,6 +2492,7 @@ static void prep_ata_v2_hw(struct hisi_hba *hisi_hba, struct hisi_sas_cmd_hdr *hdr =3D slot->cmd_hdr; struct asd_sas_port *sas_port =3D device->port; struct hisi_sas_port *port =3D to_hisi_sas_port(sas_port); + struct sas_ata_task *ata_task =3D &task->ata_task; struct sas_tmf_task *tmf =3D slot->tmf; u8 *buf_cmd; int has_data =3D 0, hdr_tag =3D 0; @@ -2505,9 +2506,9 @@ static void prep_ata_v2_hw(struct hisi_hba *hisi_hba, else dw0 |=3D 4 << CMD_HDR_CMD_OFF; =20 - if (tmf && tmf->force_phy) { + if (tmf && ata_task->force_phy) { dw0 |=3D CMD_HDR_FORCE_PHY_MSK; - dw0 |=3D (1 << tmf->phy_id) << CMD_HDR_PHY_ID_OFF; + dw0 |=3D (1 << ata_task->force_phy_id) << CMD_HDR_PHY_ID_OFF; } =20 hdr->dw0 =3D cpu_to_le32(dw0); diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c index a315715b3622..350d5e29e25c 100644 --- a/drivers/scsi/libsas/sas_ata.c +++ b/drivers/scsi/libsas/sas_ata.c @@ -856,3 +856,11 @@ void sas_ata_wait_eh(struct domain_device *dev) ap =3D dev->sata_dev.ap; ata_port_wait_eh(ap); } + +int sas_execute_ata_cmd(struct domain_device *device, u8 *fis, int force_p= hy_id) +{ + struct sas_tmf_task tmf_task =3D {}; + return sas_execute_tmf(device, fis, sizeof(struct host_to_dev_fis), + force_phy_id, &tmf_task); +} +EXPORT_SYMBOL_GPL(sas_execute_ata_cmd); diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_= scsi_host.c index 3e2e3bcbbf67..7cc80a025702 100644 --- a/drivers/scsi/libsas/sas_scsi_host.c +++ b/drivers/scsi/libsas/sas_scsi_host.c @@ -939,6 +939,12 @@ int sas_execute_tmf(struct domain_device *device, void= *parameter, task->task_proto =3D device->tproto; =20 if (dev_is_sata(device)) { + task->ata_task.device_control_reg_update =3D 1; + if (force_phy_id >=3D 0) { + task->ata_task.force_phy =3D true; + task->ata_task.force_phy_id =3D force_phy_id; + } + memcpy(&task->ata_task.fis, parameter, para_len); } else { memcpy(&task->ssp_task, parameter, para_len); } diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index 8a9ffe689d1f..02d28cd691e4 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h @@ -553,6 +553,9 @@ struct sas_ata_task { u8 stp_affil_pol:1; =20 u8 device_control_reg_update:1; + + bool force_phy; + int force_phy_id; }; =20 struct sas_smp_task { @@ -580,10 +583,6 @@ struct sas_ssp_task { struct sas_tmf_task { u8 tmf; u16 tag_of_task_to_be_managed; - - /* Temp */ - int force_phy; - int phy_id; }; =20 struct sas_task { @@ -729,10 +728,13 @@ int sas_clear_task_set(struct domain_device *dev, u8 = *lun); int sas_lu_reset(struct domain_device *dev, u8 *lun); int sas_query_task(struct sas_task *task, u16 tag); int sas_abort_task(struct sas_task *task, u16 tag); +int sas_execute_ata_cmd(struct domain_device *device, u8 *fis, + int force_phy_id); =20 int sas_notify_port_event(struct asd_sas_phy *phy, enum port_event event, gfp_t gfp_flags); int sas_notify_phy_event(struct asd_sas_phy *phy, enum phy_event event, gfp_t gfp_flags); =20 + #endif /* _SASLIB_H_ */ --=20 2.26.2