xref: /openbmc/linux/drivers/scsi/sd.h (revision d80210f2)
1aa91696eSMartin K. Petersen #ifndef _SCSI_DISK_H
2aa91696eSMartin K. Petersen #define _SCSI_DISK_H
3aa91696eSMartin K. Petersen 
4aa91696eSMartin K. Petersen /*
5aa91696eSMartin K. Petersen  * More than enough for everybody ;)  The huge number of majors
6aa91696eSMartin K. Petersen  * is a leftover from 16bit dev_t days, we don't really need that
7aa91696eSMartin K. Petersen  * much numberspace.
8aa91696eSMartin K. Petersen  */
9aa91696eSMartin K. Petersen #define SD_MAJORS	16
10aa91696eSMartin K. Petersen 
11aa91696eSMartin K. Petersen /*
12aa91696eSMartin K. Petersen  * Time out in seconds for disks and Magneto-opticals (which are slower).
13aa91696eSMartin K. Petersen  */
14aa91696eSMartin K. Petersen #define SD_TIMEOUT		(30 * HZ)
15aa91696eSMartin K. Petersen #define SD_MOD_TIMEOUT		(75 * HZ)
167e660100SJames Bottomley /*
177e660100SJames Bottomley  * Flush timeout is a multiplier over the standard device timeout which is
187e660100SJames Bottomley  * user modifiable via sysfs but initially set to SD_TIMEOUT
197e660100SJames Bottomley  */
207e660100SJames Bottomley #define SD_FLUSH_TIMEOUT_MULTIPLIER	2
215db44863SMartin K. Petersen #define SD_WRITE_SAME_TIMEOUT	(120 * HZ)
22aa91696eSMartin K. Petersen 
23aa91696eSMartin K. Petersen /*
24aa91696eSMartin K. Petersen  * Number of allowed retries
25aa91696eSMartin K. Petersen  */
26aa91696eSMartin K. Petersen #define SD_MAX_RETRIES		5
27aa91696eSMartin K. Petersen #define SD_PASSTHROUGH_RETRIES	1
2818a4d0a2SMartin K. Petersen #define SD_MAX_MEDIUM_TIMEOUTS	2
29aa91696eSMartin K. Petersen 
30aa91696eSMartin K. Petersen /*
31aa91696eSMartin K. Petersen  * Size of the initial data buffer for mode and read capacity data
32aa91696eSMartin K. Petersen  */
33aa91696eSMartin K. Petersen #define SD_BUF_SIZE		512
34aa91696eSMartin K. Petersen 
3518351070SLinus Torvalds /*
3618351070SLinus Torvalds  * Number of sectors at the end of the device to avoid multi-sector
3718351070SLinus Torvalds  * accesses to in the case of last_sector_bug
3818351070SLinus Torvalds  */
3918351070SLinus Torvalds #define SD_LAST_BUGGY_SECTORS	8
4018351070SLinus Torvalds 
414e7392ecSMartin K. Petersen enum {
424e7392ecSMartin K. Petersen 	SD_EXT_CDB_SIZE = 32,	/* Extended CDB size */
434e7392ecSMartin K. Petersen 	SD_MEMPOOL_SIZE = 2,	/* CDB pool size */
444e7392ecSMartin K. Petersen };
454e7392ecSMartin K. Petersen 
46c98a0eb0SMartin K. Petersen enum {
47bcdb247cSMartin K. Petersen 	SD_DEF_XFER_BLOCKS = 0xffff,
48bcdb247cSMartin K. Petersen 	SD_MAX_XFER_BLOCKS = 0xffffffff,
495db44863SMartin K. Petersen 	SD_MAX_WS10_BLOCKS = 0xffff,
505db44863SMartin K. Petersen 	SD_MAX_WS16_BLOCKS = 0x7fffff,
515db44863SMartin K. Petersen };
525db44863SMartin K. Petersen 
535db44863SMartin K. Petersen enum {
54c98a0eb0SMartin K. Petersen 	SD_LBP_FULL = 0,	/* Full logical block provisioning */
55c98a0eb0SMartin K. Petersen 	SD_LBP_UNMAP,		/* Use UNMAP command */
56c98a0eb0SMartin K. Petersen 	SD_LBP_WS16,		/* Use WRITE SAME(16) with UNMAP bit */
57c98a0eb0SMartin K. Petersen 	SD_LBP_WS10,		/* Use WRITE SAME(10) with UNMAP bit */
58c98a0eb0SMartin K. Petersen 	SD_LBP_ZERO,		/* Use WRITE SAME(10) with zero payload */
59c98a0eb0SMartin K. Petersen 	SD_LBP_DISABLE,		/* Discard disabled due to failed cmd */
60c98a0eb0SMartin K. Petersen };
61c98a0eb0SMartin K. Petersen 
62e6bd9312SMartin K. Petersen enum {
63e6bd9312SMartin K. Petersen 	SD_ZERO_WRITE = 0,	/* Use WRITE(10/16) command */
64e6bd9312SMartin K. Petersen 	SD_ZERO_WS,		/* Use WRITE SAME(10/16) command */
65e6bd9312SMartin K. Petersen 	SD_ZERO_WS16_UNMAP,	/* Use WRITE SAME(16) with UNMAP */
66e6bd9312SMartin K. Petersen 	SD_ZERO_WS10_UNMAP,	/* Use WRITE SAME(10) with UNMAP */
67e6bd9312SMartin K. Petersen };
68e6bd9312SMartin K. Petersen 
69aa91696eSMartin K. Petersen struct scsi_disk {
70aa91696eSMartin K. Petersen 	struct scsi_driver *driver;	/* always &sd_template */
71aa91696eSMartin K. Petersen 	struct scsi_device *device;
72aa91696eSMartin K. Petersen 	struct device	dev;
73aa91696eSMartin K. Petersen 	struct gendisk	*disk;
74d80210f2SChristoph Hellwig 	struct opal_dev *opal_dev;
7589d94756SHannes Reinecke #ifdef CONFIG_BLK_DEV_ZONED
7689d94756SHannes Reinecke 	unsigned int	nr_zones;
7789d94756SHannes Reinecke 	unsigned int	zone_blocks;
7889d94756SHannes Reinecke 	unsigned int	zone_shift;
7989d94756SHannes Reinecke 	unsigned long	*zones_wlock;
8089d94756SHannes Reinecke 	unsigned int	zones_optimal_open;
8189d94756SHannes Reinecke 	unsigned int	zones_optimal_nonseq;
8289d94756SHannes Reinecke 	unsigned int	zones_max_open;
8389d94756SHannes Reinecke #endif
84409f3499SArnd Bergmann 	atomic_t	openers;
85f08bb1e0SMartin K. Petersen 	sector_t	capacity;	/* size in logical blocks */
86bcdb247cSMartin K. Petersen 	u32		max_xfer_blocks;
87ca369d51SMartin K. Petersen 	u32		opt_xfer_blocks;
88c98a0eb0SMartin K. Petersen 	u32		max_ws_blocks;
89c98a0eb0SMartin K. Petersen 	u32		max_unmap_blocks;
90c98a0eb0SMartin K. Petersen 	u32		unmap_granularity;
91c98a0eb0SMartin K. Petersen 	u32		unmap_alignment;
92aa91696eSMartin K. Petersen 	u32		index;
93526f7c79SMartin K. Petersen 	unsigned int	physical_block_size;
9418a4d0a2SMartin K. Petersen 	unsigned int	max_medium_access_timeouts;
9518a4d0a2SMartin K. Petersen 	unsigned int	medium_access_timed_out;
96aa91696eSMartin K. Petersen 	u8		media_present;
97aa91696eSMartin K. Petersen 	u8		write_prot;
98e0597d70SMartin K. Petersen 	u8		protection_type;/* Data Integrity Field */
99c98a0eb0SMartin K. Petersen 	u8		provisioning_mode;
100e6bd9312SMartin K. Petersen 	u8		zeroing_mode;
101e0597d70SMartin K. Petersen 	unsigned	ATO : 1;	/* state of disk ATO bit */
10239c60a09SJames Bottomley 	unsigned	cache_override : 1; /* temp override of WCE,RCD */
103aa91696eSMartin K. Petersen 	unsigned	WCE : 1;	/* state of disk WCE bit */
104aa91696eSMartin K. Petersen 	unsigned	RCD : 1;	/* state of disk RCD bit, unused */
105aa91696eSMartin K. Petersen 	unsigned	DPOFUA : 1;	/* state of disk DPOFUA bit */
10670a9b873SMartin K. Petersen 	unsigned	first_scan : 1;
107c98a0eb0SMartin K. Petersen 	unsigned	lbpme : 1;
108c98a0eb0SMartin K. Petersen 	unsigned	lbprz : 1;
109c98a0eb0SMartin K. Petersen 	unsigned	lbpu : 1;
110c98a0eb0SMartin K. Petersen 	unsigned	lbpws : 1;
111c98a0eb0SMartin K. Petersen 	unsigned	lbpws10 : 1;
112c98a0eb0SMartin K. Petersen 	unsigned	lbpvpd : 1;
11366c28f97SMartin K. Petersen 	unsigned	ws10 : 1;
1145db44863SMartin K. Petersen 	unsigned	ws16 : 1;
11589d94756SHannes Reinecke 	unsigned	rc_basis: 2;
11689d94756SHannes Reinecke 	unsigned	zoned: 2;
11789d94756SHannes Reinecke 	unsigned	urswrz : 1;
118d80210f2SChristoph Hellwig 	unsigned	security : 1;
1197a38dc0bSHannes Reinecke 	unsigned	ignore_medium_access_errors : 1;
120aa91696eSMartin K. Petersen };
121aa91696eSMartin K. Petersen #define to_scsi_disk(obj) container_of(obj,struct scsi_disk,dev)
122aa91696eSMartin K. Petersen 
1235b635da1SMartin K. Petersen static inline struct scsi_disk *scsi_disk(struct gendisk *disk)
1245b635da1SMartin K. Petersen {
1255b635da1SMartin K. Petersen 	return container_of(disk->private_data, struct scsi_disk, driver);
1265b635da1SMartin K. Petersen }
1275b635da1SMartin K. Petersen 
128aa91696eSMartin K. Petersen #define sd_printk(prefix, sdsk, fmt, a...)				\
129aa91696eSMartin K. Petersen         (sdsk)->disk ?							\
13022e0d994SHannes Reinecke 	      sdev_prefix_printk(prefix, (sdsk)->device,		\
13122e0d994SHannes Reinecke 				 (sdsk)->disk->disk_name, fmt, ##a) :	\
132aa91696eSMartin K. Petersen 	      sdev_printk(prefix, (sdsk)->device, fmt, ##a)
133aa91696eSMartin K. Petersen 
134b2bff6ceSMartin K. Petersen #define sd_first_printk(prefix, sdsk, fmt, a...)			\
135b2bff6ceSMartin K. Petersen 	do {								\
136b2bff6ceSMartin K. Petersen 		if ((sdkp)->first_scan)					\
137b2bff6ceSMartin K. Petersen 			sd_printk(prefix, sdsk, fmt, ##a);		\
138b2bff6ceSMartin K. Petersen 	} while (0)
139b2bff6ceSMartin K. Petersen 
14018a4d0a2SMartin K. Petersen static inline int scsi_medium_access_command(struct scsi_cmnd *scmd)
14118a4d0a2SMartin K. Petersen {
14218a4d0a2SMartin K. Petersen 	switch (scmd->cmnd[0]) {
14318a4d0a2SMartin K. Petersen 	case READ_6:
14418a4d0a2SMartin K. Petersen 	case READ_10:
14518a4d0a2SMartin K. Petersen 	case READ_12:
14618a4d0a2SMartin K. Petersen 	case READ_16:
14718a4d0a2SMartin K. Petersen 	case SYNCHRONIZE_CACHE:
14818a4d0a2SMartin K. Petersen 	case VERIFY:
14918a4d0a2SMartin K. Petersen 	case VERIFY_12:
15018a4d0a2SMartin K. Petersen 	case VERIFY_16:
15118a4d0a2SMartin K. Petersen 	case WRITE_6:
15218a4d0a2SMartin K. Petersen 	case WRITE_10:
15318a4d0a2SMartin K. Petersen 	case WRITE_12:
15418a4d0a2SMartin K. Petersen 	case WRITE_16:
15518a4d0a2SMartin K. Petersen 	case WRITE_SAME:
15618a4d0a2SMartin K. Petersen 	case WRITE_SAME_16:
15718a4d0a2SMartin K. Petersen 	case UNMAP:
15818a4d0a2SMartin K. Petersen 		return 1;
15918a4d0a2SMartin K. Petersen 	case VARIABLE_LENGTH_CMD:
16018a4d0a2SMartin K. Petersen 		switch (scmd->cmnd[9]) {
16118a4d0a2SMartin K. Petersen 		case READ_32:
16218a4d0a2SMartin K. Petersen 		case VERIFY_32:
16318a4d0a2SMartin K. Petersen 		case WRITE_32:
16418a4d0a2SMartin K. Petersen 		case WRITE_SAME_32:
16518a4d0a2SMartin K. Petersen 			return 1;
16618a4d0a2SMartin K. Petersen 		}
16718a4d0a2SMartin K. Petersen 	}
16818a4d0a2SMartin K. Petersen 
16918a4d0a2SMartin K. Petersen 	return 0;
17018a4d0a2SMartin K. Petersen }
17118a4d0a2SMartin K. Petersen 
172f08bb1e0SMartin K. Petersen static inline sector_t logical_to_sectors(struct scsi_device *sdev, sector_t blocks)
173f08bb1e0SMartin K. Petersen {
174f08bb1e0SMartin K. Petersen 	return blocks << (ilog2(sdev->sector_size) - 9);
175f08bb1e0SMartin K. Petersen }
176f08bb1e0SMartin K. Petersen 
1776b7e9cdeSMartin K. Petersen static inline unsigned int logical_to_bytes(struct scsi_device *sdev, sector_t blocks)
1786b7e9cdeSMartin K. Petersen {
1796b7e9cdeSMartin K. Petersen 	return blocks * sdev->sector_size;
1806b7e9cdeSMartin K. Petersen }
1816b7e9cdeSMartin K. Petersen 
1826eadc612SDamien Le Moal static inline sector_t bytes_to_logical(struct scsi_device *sdev, unsigned int bytes)
1836eadc612SDamien Le Moal {
1846eadc612SDamien Le Moal 	return bytes >> ilog2(sdev->sector_size);
1856eadc612SDamien Le Moal }
1866eadc612SDamien Le Moal 
18789d94756SHannes Reinecke static inline sector_t sectors_to_logical(struct scsi_device *sdev, sector_t sector)
18889d94756SHannes Reinecke {
18989d94756SHannes Reinecke 	return sector >> (ilog2(sdev->sector_size) - 9);
19089d94756SHannes Reinecke }
19189d94756SHannes Reinecke 
192e0597d70SMartin K. Petersen /*
193c611529eSMartin K. Petersen  * Look up the DIX operation based on whether the command is read or
194c611529eSMartin K. Petersen  * write and whether dix and dif are enabled.
195c611529eSMartin K. Petersen  */
196c611529eSMartin K. Petersen static inline unsigned int sd_prot_op(bool write, bool dix, bool dif)
197c611529eSMartin K. Petersen {
198c611529eSMartin K. Petersen 	/* Lookup table: bit 2 (write), bit 1 (dix), bit 0 (dif) */
199c611529eSMartin K. Petersen 	const unsigned int ops[] = {	/* wrt dix dif */
200c611529eSMartin K. Petersen 		SCSI_PROT_NORMAL,	/*  0	0   0  */
201c611529eSMartin K. Petersen 		SCSI_PROT_READ_STRIP,	/*  0	0   1  */
202c611529eSMartin K. Petersen 		SCSI_PROT_READ_INSERT,	/*  0	1   0  */
203c611529eSMartin K. Petersen 		SCSI_PROT_READ_PASS,	/*  0	1   1  */
204c611529eSMartin K. Petersen 		SCSI_PROT_NORMAL,	/*  1	0   0  */
205c611529eSMartin K. Petersen 		SCSI_PROT_WRITE_INSERT, /*  1	0   1  */
206c611529eSMartin K. Petersen 		SCSI_PROT_WRITE_STRIP,	/*  1	1   0  */
207c611529eSMartin K. Petersen 		SCSI_PROT_WRITE_PASS,	/*  1	1   1  */
208c611529eSMartin K. Petersen 	};
209c611529eSMartin K. Petersen 
210c611529eSMartin K. Petersen 	return ops[write << 2 | dix << 1 | dif];
211c611529eSMartin K. Petersen }
212c611529eSMartin K. Petersen 
213c611529eSMartin K. Petersen /*
214c611529eSMartin K. Petersen  * Returns a mask of the protection flags that are valid for a given DIX
215c611529eSMartin K. Petersen  * operation.
216c611529eSMartin K. Petersen  */
217c611529eSMartin K. Petersen static inline unsigned int sd_prot_flag_mask(unsigned int prot_op)
218c611529eSMartin K. Petersen {
219c611529eSMartin K. Petersen 	const unsigned int flag_mask[] = {
220c611529eSMartin K. Petersen 		[SCSI_PROT_NORMAL]		= 0,
221c611529eSMartin K. Petersen 
222c611529eSMartin K. Petersen 		[SCSI_PROT_READ_STRIP]		= SCSI_PROT_TRANSFER_PI |
223c611529eSMartin K. Petersen 						  SCSI_PROT_GUARD_CHECK |
224c611529eSMartin K. Petersen 						  SCSI_PROT_REF_CHECK |
225c611529eSMartin K. Petersen 						  SCSI_PROT_REF_INCREMENT,
226c611529eSMartin K. Petersen 
227c611529eSMartin K. Petersen 		[SCSI_PROT_READ_INSERT]		= SCSI_PROT_REF_INCREMENT |
228c611529eSMartin K. Petersen 						  SCSI_PROT_IP_CHECKSUM,
229c611529eSMartin K. Petersen 
230c611529eSMartin K. Petersen 		[SCSI_PROT_READ_PASS]		= SCSI_PROT_TRANSFER_PI |
231c611529eSMartin K. Petersen 						  SCSI_PROT_GUARD_CHECK |
232c611529eSMartin K. Petersen 						  SCSI_PROT_REF_CHECK |
233c611529eSMartin K. Petersen 						  SCSI_PROT_REF_INCREMENT |
234c611529eSMartin K. Petersen 						  SCSI_PROT_IP_CHECKSUM,
235c611529eSMartin K. Petersen 
236c611529eSMartin K. Petersen 		[SCSI_PROT_WRITE_INSERT]	= SCSI_PROT_TRANSFER_PI |
237c611529eSMartin K. Petersen 						  SCSI_PROT_REF_INCREMENT,
238c611529eSMartin K. Petersen 
239c611529eSMartin K. Petersen 		[SCSI_PROT_WRITE_STRIP]		= SCSI_PROT_GUARD_CHECK |
240c611529eSMartin K. Petersen 						  SCSI_PROT_REF_CHECK |
241c611529eSMartin K. Petersen 						  SCSI_PROT_REF_INCREMENT |
242c611529eSMartin K. Petersen 						  SCSI_PROT_IP_CHECKSUM,
243c611529eSMartin K. Petersen 
244c611529eSMartin K. Petersen 		[SCSI_PROT_WRITE_PASS]		= SCSI_PROT_TRANSFER_PI |
245c611529eSMartin K. Petersen 						  SCSI_PROT_GUARD_CHECK |
246c611529eSMartin K. Petersen 						  SCSI_PROT_REF_CHECK |
247c611529eSMartin K. Petersen 						  SCSI_PROT_REF_INCREMENT |
248c611529eSMartin K. Petersen 						  SCSI_PROT_IP_CHECKSUM,
249c611529eSMartin K. Petersen 	};
250c611529eSMartin K. Petersen 
251c611529eSMartin K. Petersen 	return flag_mask[prot_op];
252c611529eSMartin K. Petersen }
253c611529eSMartin K. Petersen 
2544c393e6eSJames Bottomley #ifdef CONFIG_BLK_DEV_INTEGRITY
255af55ff67SMartin K. Petersen 
256af55ff67SMartin K. Petersen extern void sd_dif_config_host(struct scsi_disk *);
257c611529eSMartin K. Petersen extern void sd_dif_prepare(struct scsi_cmnd *scmd);
258af55ff67SMartin K. Petersen extern void sd_dif_complete(struct scsi_cmnd *, unsigned int);
259af55ff67SMartin K. Petersen 
260af55ff67SMartin K. Petersen #else /* CONFIG_BLK_DEV_INTEGRITY */
261af55ff67SMartin K. Petersen 
2624c393e6eSJames Bottomley static inline void sd_dif_config_host(struct scsi_disk *disk)
2634c393e6eSJames Bottomley {
2644c393e6eSJames Bottomley }
265c611529eSMartin K. Petersen static inline int sd_dif_prepare(struct scsi_cmnd *scmd)
2664c393e6eSJames Bottomley {
2674c393e6eSJames Bottomley 	return 0;
2684c393e6eSJames Bottomley }
2694c393e6eSJames Bottomley static inline void sd_dif_complete(struct scsi_cmnd *cmd, unsigned int a)
2704c393e6eSJames Bottomley {
2714c393e6eSJames Bottomley }
272af55ff67SMartin K. Petersen 
273af55ff67SMartin K. Petersen #endif /* CONFIG_BLK_DEV_INTEGRITY */
274af55ff67SMartin K. Petersen 
27589d94756SHannes Reinecke static inline int sd_is_zoned(struct scsi_disk *sdkp)
27689d94756SHannes Reinecke {
27789d94756SHannes Reinecke 	return sdkp->zoned == 1 || sdkp->device->type == TYPE_ZBC;
27889d94756SHannes Reinecke }
27989d94756SHannes Reinecke 
28089d94756SHannes Reinecke #ifdef CONFIG_BLK_DEV_ZONED
28189d94756SHannes Reinecke 
28289d94756SHannes Reinecke extern int sd_zbc_read_zones(struct scsi_disk *sdkp, unsigned char *buffer);
28389d94756SHannes Reinecke extern void sd_zbc_remove(struct scsi_disk *sdkp);
28489d94756SHannes Reinecke extern void sd_zbc_print_zones(struct scsi_disk *sdkp);
285a90dfdc2SDamien Le Moal extern int sd_zbc_write_lock_zone(struct scsi_cmnd *cmd);
286a90dfdc2SDamien Le Moal extern void sd_zbc_write_unlock_zone(struct scsi_cmnd *cmd);
28789d94756SHannes Reinecke extern int sd_zbc_setup_report_cmnd(struct scsi_cmnd *cmd);
28889d94756SHannes Reinecke extern int sd_zbc_setup_reset_cmnd(struct scsi_cmnd *cmd);
28989d94756SHannes Reinecke extern void sd_zbc_complete(struct scsi_cmnd *cmd, unsigned int good_bytes,
29089d94756SHannes Reinecke 			    struct scsi_sense_hdr *sshdr);
29189d94756SHannes Reinecke 
29289d94756SHannes Reinecke #else /* CONFIG_BLK_DEV_ZONED */
29389d94756SHannes Reinecke 
29489d94756SHannes Reinecke static inline int sd_zbc_read_zones(struct scsi_disk *sdkp,
29589d94756SHannes Reinecke 				    unsigned char *buf)
29689d94756SHannes Reinecke {
29789d94756SHannes Reinecke 	return 0;
29889d94756SHannes Reinecke }
29989d94756SHannes Reinecke 
30089d94756SHannes Reinecke static inline void sd_zbc_remove(struct scsi_disk *sdkp) {}
30189d94756SHannes Reinecke 
30289d94756SHannes Reinecke static inline void sd_zbc_print_zones(struct scsi_disk *sdkp) {}
30389d94756SHannes Reinecke 
304a90dfdc2SDamien Le Moal static inline int sd_zbc_write_lock_zone(struct scsi_cmnd *cmd)
30589d94756SHannes Reinecke {
30689d94756SHannes Reinecke 	/* Let the drive fail requests */
30789d94756SHannes Reinecke 	return BLKPREP_OK;
30889d94756SHannes Reinecke }
30989d94756SHannes Reinecke 
310a90dfdc2SDamien Le Moal static inline void sd_zbc_write_unlock_zone(struct scsi_cmnd *cmd) {}
31189d94756SHannes Reinecke 
31289d94756SHannes Reinecke static inline int sd_zbc_setup_report_cmnd(struct scsi_cmnd *cmd)
31389d94756SHannes Reinecke {
31489d94756SHannes Reinecke 	return BLKPREP_INVALID;
31589d94756SHannes Reinecke }
31689d94756SHannes Reinecke 
31789d94756SHannes Reinecke static inline int sd_zbc_setup_reset_cmnd(struct scsi_cmnd *cmd)
31889d94756SHannes Reinecke {
31989d94756SHannes Reinecke 	return BLKPREP_INVALID;
32089d94756SHannes Reinecke }
32189d94756SHannes Reinecke 
32289d94756SHannes Reinecke static inline void sd_zbc_complete(struct scsi_cmnd *cmd,
32389d94756SHannes Reinecke 				   unsigned int good_bytes,
32489d94756SHannes Reinecke 				   struct scsi_sense_hdr *sshdr) {}
32589d94756SHannes Reinecke 
32689d94756SHannes Reinecke #endif /* CONFIG_BLK_DEV_ZONED */
32789d94756SHannes Reinecke 
328aa91696eSMartin K. Petersen #endif /* _SCSI_DISK_H */
329