162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef _SCSI_SCSI_TCQ_H
362306a36Sopenharmony_ci#define _SCSI_SCSI_TCQ_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <linux/blkdev.h>
662306a36Sopenharmony_ci#include <scsi/scsi_cmnd.h>
762306a36Sopenharmony_ci#include <scsi/scsi_device.h>
862306a36Sopenharmony_ci#include <scsi/scsi_host.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#define SCSI_NO_TAG	(-1)    /* identify no tag in use */
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#ifdef CONFIG_BLOCK
1462306a36Sopenharmony_ci/**
1562306a36Sopenharmony_ci * scsi_host_find_tag - find the tagged command by host
1662306a36Sopenharmony_ci * @shost:	pointer to scsi_host
1762306a36Sopenharmony_ci * @tag:	tag
1862306a36Sopenharmony_ci *
1962306a36Sopenharmony_ci * Note: for devices using multiple hardware queues tag must have been
2062306a36Sopenharmony_ci * generated by blk_mq_unique_tag().
2162306a36Sopenharmony_ci **/
2262306a36Sopenharmony_cistatic inline struct scsi_cmnd *scsi_host_find_tag(struct Scsi_Host *shost,
2362306a36Sopenharmony_ci		int tag)
2462306a36Sopenharmony_ci{
2562306a36Sopenharmony_ci	struct request *req = NULL;
2662306a36Sopenharmony_ci	u16 hwq;
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci	if (tag == SCSI_NO_TAG)
2962306a36Sopenharmony_ci		return NULL;
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	hwq = blk_mq_unique_tag_to_hwq(tag);
3262306a36Sopenharmony_ci	if (hwq < shost->tag_set.nr_hw_queues) {
3362306a36Sopenharmony_ci		req = blk_mq_tag_to_rq(shost->tag_set.tags[hwq],
3462306a36Sopenharmony_ci					blk_mq_unique_tag_to_tag(tag));
3562306a36Sopenharmony_ci	}
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	if (!req || !blk_mq_request_started(req))
3862306a36Sopenharmony_ci		return NULL;
3962306a36Sopenharmony_ci	return blk_mq_rq_to_pdu(req);
4062306a36Sopenharmony_ci}
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci#endif /* CONFIG_BLOCK */
4362306a36Sopenharmony_ci#endif /* _SCSI_SCSI_TCQ_H */
44