From nobody Tue Dec 16 21:17:46 2025 Received: from mail.cybernetics.com (mail.cybernetics.com [72.215.153.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 13BBE27A12B for ; Mon, 10 Nov 2025 15:55:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=72.215.153.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762790125; cv=none; b=BKPn1Qlkf8bs7XPIiiogTKKpYQTmID9FkR+SHL9GbdMTu7lHdMTZ/lCem7iYTtahP9WTozeL4d3anU69ULDATIgXmbUT1tbJMWCiGCzDwAcU0ji435UNEQZqhIdbv1GraJmlK2OMoB5H1n+NNuoHHHLO3PKNgzvBG+02cyWWmh8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1762790125; c=relaxed/simple; bh=prwM2erQJBoAUiKcky6/s46AeDF3eHYC6Vq40o7tYOI=; h=Message-ID:Date:MIME-Version:Subject:From:To:Cc:References: In-Reply-To:Content-Type; b=VGNkM4xeqmsfRV7AhXhrsmQoV5T9AdfTS4+CArmpaaY4t2Tffv6LHnLAv9J5SYhZzuSVeCEM7s8gotao9Xhkoh85dH5R0261Yx/JL/LLwjUmngggQn0eiOSs3DdFMIwrxfgrydAY3nFlI9tIYQCfGW5AHhStF7gX4RWoqUUrtFc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=cybernetics.com; spf=pass smtp.mailfrom=cybernetics.com; dkim=pass (1024-bit key) header.d=cybernetics.com header.i=@cybernetics.com header.b=Xk8vrMgZ; arc=none smtp.client-ip=72.215.153.18 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=cybernetics.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=cybernetics.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=cybernetics.com header.i=@cybernetics.com header.b="Xk8vrMgZ" Received: from cybernetics.com ([10.10.4.126]) by mail.cybernetics.com with ESMTP id WJd5cWeT332vPg8I; Mon, 10 Nov 2025 10:55:22 -0500 (EST) X-Barracuda-Envelope-From: tonyb@cybernetics.com X-Barracuda-RBL-Trusted-Forwarder: 10.10.4.126 X-ASG-Whitelist: Client DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=cybernetics.com; s=mail; bh=RsvdXDvFlxutXVLeJjSGyKGTWr1UCiHzYOJ6OB1CC7M=; h=Content-Transfer-Encoding:Content-Type:In-Reply-To:References:Cc:To:From: Content-Language:Subject:MIME-Version:Date:Message-ID; b=Xk8vrMgZi7OIvWVJI09y CsECjShel9u3A99N94t+1iiEhXtGIV4QqJt+oARYaIDmz7eg8Db0C6Sl1Gn8mz05UXcbuOStz+pYK KHpCDyMh7/AEouwQtV70DlQ0eWSLvzYcH3OvZBvZBym/6Sv4Q6xCZ/9TF3i1domFLOEeOrINO4= Received: from [10.157.2.224] (HELO [192.168.200.1]) by cybernetics.com (CommuniGate SPEC SMTP 8.0.5) with ESMTPS id 14272443; Mon, 10 Nov 2025 10:55:22 -0500 Message-ID: <1a221699-969b-4f28-8ea4-395d2f7a7c0a@cybernetics.com> X-Barracuda-RBL-Trusted-Forwarder: 10.157.2.224 Date: Mon, 10 Nov 2025 10:55:22 -0500 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH v3 07/16] scsi: qla2xxx: fix term exchange when cmd_sent_to_fw == 1 Content-Language: en-US X-ASG-Orig-Subj: [PATCH v3 07/16] scsi: qla2xxx: fix term exchange when cmd_sent_to_fw == 1 From: Tony Battersby To: Nilesh Javali , GR-QLogic-Storage-Upstream@marvell.com, "James E.J. Bottomley" , "Martin K. Petersen" Cc: linux-scsi , target-devel@vger.kernel.org, scst-devel@lists.sourceforge.net, "linux-kernel@vger.kernel.org" , Dmitry Bogdanov , Xose Vazquez Perez References: In-Reply-To: Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: UNKNOWN[10.10.4.126] X-Barracuda-Start-Time: 1762790122 X-Barracuda-URL: https://10.10.4.122:443/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at cybernetics.com X-Barracuda-Scan-Msg-Size: 3622 X-ASG-Debug-ID: 1762790122-1cf439139110cd60001-xx1T2L Content-Type: text/plain; charset="utf-8" (target mode) Properly set the nport_handle field of the terminate exchange message. Previously when this field was not set properly, the term exchange would fail when cmd_sent_to_fw =3D=3D 1 but work when cmd_sent_to_fw =3D=3D 0 (i.= e. it would fail when the HW was actively transferring data or status for the cmd but work when the HW was idle). With this change, term exchange works in any cmd state, which now makes it possible to abort a command that is locked up in the HW. Signed-off-by: Tony Battersby --- v2 -> v3: no changes v1 -> v2: no changes drivers/scsi/qla2xxx/qla_target.c | 52 ++++++++++++++++++------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_t= arget.c index 72c74f8f5375..b700bfc642b3 100644 --- a/drivers/scsi/qla2xxx/qla_target.c +++ b/drivers/scsi/qla2xxx/qla_target.c @@ -3622,14 +3622,35 @@ static int __qlt_send_term_exchange(struct qla_qpai= r *qpair, struct qla_tgt_cmd *cmd, struct atio_from_isp *atio) { - struct scsi_qla_host *vha =3D qpair->vha; struct ctio7_to_24xx *ctio24; - request_t *pkt; - int ret =3D 0; + struct scsi_qla_host *vha; + uint16_t loop_id; uint16_t temp; =20 - if (cmd) + if (cmd) { vha =3D cmd->vha; + loop_id =3D cmd->loop_id; + } else { + port_id_t id =3D be_to_port_id(atio->u.isp24.fcp_hdr.s_id); + struct qla_hw_data *ha; + struct fc_port *sess; + unsigned long flags; + + vha =3D qpair->vha; + ha =3D vha->hw; + + /* + * CTIO7_NHANDLE_UNRECOGNIZED works when aborting an idle + * command but not when aborting a command with an active CTIO + * exchange. + */ + loop_id =3D CTIO7_NHANDLE_UNRECOGNIZED; + spin_lock_irqsave(&ha->tgt.sess_lock, flags); + sess =3D qla2x00_find_fcport_by_nportid(vha, &id, 1); + if (sess) + loop_id =3D sess->loop_id; + spin_unlock_irqrestore(&ha->tgt.sess_lock, flags); + } =20 if (cmd) { ql_dbg(ql_dbg_tgt_mgt, vha, 0xe009, @@ -3642,31 +3663,20 @@ static int __qlt_send_term_exchange(struct qla_qpai= r *qpair, vha->vp_idx, le32_to_cpu(atio->u.isp24.exchange_addr)); } =20 - pkt =3D (request_t *)qla2x00_alloc_iocbs_ready(qpair, NULL); - if (pkt =3D=3D NULL) { + ctio24 =3D qla2x00_alloc_iocbs_ready(qpair, NULL); + if (!ctio24) { ql_dbg(ql_dbg_tgt, vha, 0xe050, "qla_target(%d): %s failed: unable to allocate " "request packet\n", vha->vp_idx, __func__); return -ENOMEM; } =20 - if (cmd !=3D NULL) { - if (cmd->state < QLA_TGT_STATE_PROCESSED) { - ql_dbg(ql_dbg_tgt, vha, 0xe051, - "qla_target(%d): Terminating cmd %p with " - "incorrect state %d\n", vha->vp_idx, cmd, - cmd->state); - } else - ret =3D 1; - } - qpair->tgt_counters.num_term_xchg_sent++; - pkt->entry_count =3D 1; - pkt->handle =3D QLA_TGT_SKIP_HANDLE | CTIO_COMPLETION_HANDLE_MARK; =20 - ctio24 =3D (struct ctio7_to_24xx *)pkt; ctio24->entry_type =3D CTIO_TYPE7; - ctio24->nport_handle =3D cpu_to_le16(CTIO7_NHANDLE_UNRECOGNIZED); + ctio24->entry_count =3D 1; + ctio24->handle =3D QLA_TGT_SKIP_HANDLE | CTIO_COMPLETION_HANDLE_MARK; + ctio24->nport_handle =3D cpu_to_le16(loop_id); ctio24->timeout =3D cpu_to_le16(QLA_TGT_TIMEOUT); ctio24->vp_index =3D vha->vp_idx; ctio24->initiator_id =3D be_id_to_le(atio->u.isp24.fcp_hdr.s_id); @@ -3683,7 +3693,7 @@ static int __qlt_send_term_exchange(struct qla_qpair = *qpair, qpair->reqq_start_iocbs(qpair); else qla2x00_start_iocbs(vha, qpair->req); - return ret; + return 0; } =20 static void qlt_send_term_exchange(struct qla_qpair *qpair, --=20 2.43.0