1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _SCSI_SCSI_TCQ_H 3*4882a593Smuzhiyun #define _SCSI_SCSI_TCQ_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <linux/blkdev.h> 6*4882a593Smuzhiyun #include <scsi/scsi_cmnd.h> 7*4882a593Smuzhiyun #include <scsi/scsi_device.h> 8*4882a593Smuzhiyun #include <scsi/scsi_host.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #define SCSI_NO_TAG (-1) /* identify no tag in use */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #ifdef CONFIG_BLOCK 14*4882a593Smuzhiyun /** 15*4882a593Smuzhiyun * scsi_host_find_tag - find the tagged command by host 16*4882a593Smuzhiyun * @shost: pointer to scsi_host 17*4882a593Smuzhiyun * @tag: tag 18*4882a593Smuzhiyun * 19*4882a593Smuzhiyun * Note: for devices using multiple hardware queues tag must have been 20*4882a593Smuzhiyun * generated by blk_mq_unique_tag(). 21*4882a593Smuzhiyun **/ scsi_host_find_tag(struct Scsi_Host * shost,int tag)22*4882a593Smuzhiyunstatic inline struct scsi_cmnd *scsi_host_find_tag(struct Scsi_Host *shost, 23*4882a593Smuzhiyun int tag) 24*4882a593Smuzhiyun { 25*4882a593Smuzhiyun struct request *req = NULL; 26*4882a593Smuzhiyun u16 hwq; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun if (tag == SCSI_NO_TAG) 29*4882a593Smuzhiyun return NULL; 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun hwq = blk_mq_unique_tag_to_hwq(tag); 32*4882a593Smuzhiyun if (hwq < shost->tag_set.nr_hw_queues) { 33*4882a593Smuzhiyun req = blk_mq_tag_to_rq(shost->tag_set.tags[hwq], 34*4882a593Smuzhiyun blk_mq_unique_tag_to_tag(tag)); 35*4882a593Smuzhiyun } 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun if (!req || !blk_mq_request_started(req)) 38*4882a593Smuzhiyun return NULL; 39*4882a593Smuzhiyun return blk_mq_rq_to_pdu(req); 40*4882a593Smuzhiyun } 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun #endif /* CONFIG_BLOCK */ 43*4882a593Smuzhiyun #endif /* _SCSI_SCSI_TCQ_H */ 44