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