sd.h 6.0 KB
Newer Older
1
/* SPDX-License-Identifier: GPL-2.0 */
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#ifndef _SCSI_DISK_H
#define _SCSI_DISK_H

/*
 * More than enough for everybody ;)  The huge number of majors
 * is a leftover from 16bit dev_t days, we don't really need that
 * much numberspace.
 */
#define SD_MAJORS	16

/*
 * Time out in seconds for disks and Magneto-opticals (which are slower).
 */
#define SD_TIMEOUT		(30 * HZ)
#define SD_MOD_TIMEOUT		(75 * HZ)
17 18 19 20 21
/*
 * Flush timeout is a multiplier over the standard device timeout which is
 * user modifiable via sysfs but initially set to SD_TIMEOUT
 */
#define SD_FLUSH_TIMEOUT_MULTIPLIER	2
22
#define SD_WRITE_SAME_TIMEOUT	(120 * HZ)
23 24 25 26 27 28

/*
 * Number of allowed retries
 */
#define SD_MAX_RETRIES		5
#define SD_PASSTHROUGH_RETRIES	1
29
#define SD_MAX_MEDIUM_TIMEOUTS	2
30 31 32 33 34 35

/*
 * Size of the initial data buffer for mode and read capacity data
 */
#define SD_BUF_SIZE		512

36 37 38 39 40 41
/*
 * Number of sectors at the end of the device to avoid multi-sector
 * accesses to in the case of last_sector_bug
 */
#define SD_LAST_BUGGY_SECTORS	8

42 43 44 45 46
enum {
	SD_EXT_CDB_SIZE = 32,	/* Extended CDB size */
	SD_MEMPOOL_SIZE = 2,	/* CDB pool size */
};

47
enum {
M
Martin K. Petersen 已提交
48 49
	SD_DEF_XFER_BLOCKS = 0xffff,
	SD_MAX_XFER_BLOCKS = 0xffffffff,
50 51 52 53
	SD_MAX_WS10_BLOCKS = 0xffff,
	SD_MAX_WS16_BLOCKS = 0x7fffff,
};

54 55 56 57 58 59 60 61 62
enum {
	SD_LBP_FULL = 0,	/* Full logical block provisioning */
	SD_LBP_UNMAP,		/* Use UNMAP command */
	SD_LBP_WS16,		/* Use WRITE SAME(16) with UNMAP bit */
	SD_LBP_WS10,		/* Use WRITE SAME(10) with UNMAP bit */
	SD_LBP_ZERO,		/* Use WRITE SAME(10) with zero payload */
	SD_LBP_DISABLE,		/* Discard disabled due to failed cmd */
};

63 64 65 66 67 68 69
enum {
	SD_ZERO_WRITE = 0,	/* Use WRITE(10/16) command */
	SD_ZERO_WS,		/* Use WRITE SAME(10/16) command */
	SD_ZERO_WS16_UNMAP,	/* Use WRITE SAME(16) with UNMAP */
	SD_ZERO_WS10_UNMAP,	/* Use WRITE SAME(10) with UNMAP */
};

70 71 72
struct scsi_disk {
	struct scsi_driver *driver;	/* always &sd_template */
	struct scsi_device *device;
73
	struct device	dev;
74
	struct gendisk	*disk;
75
	struct opal_dev *opal_dev;
76
#ifdef CONFIG_BLK_DEV_ZONED
77 78 79 80 81
	u32		nr_zones;
	u32		zone_blocks;
	u32		zones_optimal_open;
	u32		zones_optimal_nonseq;
	u32		zones_max_open;
82
#endif
A
Arnd Bergmann 已提交
83
	atomic_t	openers;
84
	sector_t	capacity;	/* size in logical blocks */
M
Martin K. Petersen 已提交
85
	u32		max_xfer_blocks;
86
	u32		opt_xfer_blocks;
87 88 89 90
	u32		max_ws_blocks;
	u32		max_unmap_blocks;
	u32		unmap_granularity;
	u32		unmap_alignment;
91
	u32		index;
92
	unsigned int	physical_block_size;
93 94
	unsigned int	max_medium_access_timeouts;
	unsigned int	medium_access_timed_out;
95 96
	u8		media_present;
	u8		write_prot;
97
	u8		protection_type;/* Data Integrity Field */
98
	u8		provisioning_mode;
99
	u8		zeroing_mode;
100
	unsigned	ATO : 1;	/* state of disk ATO bit */
101
	unsigned	cache_override : 1; /* temp override of WCE,RCD */
102 103 104
	unsigned	WCE : 1;	/* state of disk WCE bit */
	unsigned	RCD : 1;	/* state of disk RCD bit, unused */
	unsigned	DPOFUA : 1;	/* state of disk DPOFUA bit */
105
	unsigned	first_scan : 1;
106 107 108 109 110 111
	unsigned	lbpme : 1;
	unsigned	lbprz : 1;
	unsigned	lbpu : 1;
	unsigned	lbpws : 1;
	unsigned	lbpws10 : 1;
	unsigned	lbpvpd : 1;
112
	unsigned	ws10 : 1;
113
	unsigned	ws16 : 1;
114 115 116
	unsigned	rc_basis: 2;
	unsigned	zoned: 2;
	unsigned	urswrz : 1;
117
	unsigned	security : 1;
118
	unsigned	ignore_medium_access_errors : 1;
119
};
120
#define to_scsi_disk(obj) container_of(obj,struct scsi_disk,dev)
121

122 123 124 125 126
static inline struct scsi_disk *scsi_disk(struct gendisk *disk)
{
	return container_of(disk->private_data, struct scsi_disk, driver);
}

127 128
#define sd_printk(prefix, sdsk, fmt, a...)				\
        (sdsk)->disk ?							\
129 130 131
	      sdev_prefix_printk(prefix, (sdsk)->device,		\
				 (sdsk)->disk->disk_name, fmt, ##a) :	\
	      sdev_printk(prefix, (sdsk)->device, fmt, ##a)
132

133 134
#define sd_first_printk(prefix, sdsk, fmt, a...)			\
	do {								\
135
		if ((sdsk)->first_scan)					\
136 137 138
			sd_printk(prefix, sdsk, fmt, ##a);		\
	} while (0)

139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
static inline int scsi_medium_access_command(struct scsi_cmnd *scmd)
{
	switch (scmd->cmnd[0]) {
	case READ_6:
	case READ_10:
	case READ_12:
	case READ_16:
	case SYNCHRONIZE_CACHE:
	case VERIFY:
	case VERIFY_12:
	case VERIFY_16:
	case WRITE_6:
	case WRITE_10:
	case WRITE_12:
	case WRITE_16:
	case WRITE_SAME:
	case WRITE_SAME_16:
	case UNMAP:
		return 1;
	case VARIABLE_LENGTH_CMD:
		switch (scmd->cmnd[9]) {
		case READ_32:
		case VERIFY_32:
		case WRITE_32:
		case WRITE_SAME_32:
			return 1;
		}
	}

	return 0;
}

171 172 173 174 175
static inline sector_t logical_to_sectors(struct scsi_device *sdev, sector_t blocks)
{
	return blocks << (ilog2(sdev->sector_size) - 9);
}

176 177 178 179 180
static inline unsigned int logical_to_bytes(struct scsi_device *sdev, sector_t blocks)
{
	return blocks * sdev->sector_size;
}

181 182 183 184 185
static inline sector_t bytes_to_logical(struct scsi_device *sdev, unsigned int bytes)
{
	return bytes >> ilog2(sdev->sector_size);
}

186 187 188 189 190
static inline sector_t sectors_to_logical(struct scsi_device *sdev, sector_t sector)
{
	return sector >> (ilog2(sdev->sector_size) - 9);
}

191
#ifdef CONFIG_BLK_DEV_INTEGRITY
192 193 194 195 196

extern void sd_dif_config_host(struct scsi_disk *);

#else /* CONFIG_BLK_DEV_INTEGRITY */

197 198 199
static inline void sd_dif_config_host(struct scsi_disk *disk)
{
}
200 201 202

#endif /* CONFIG_BLK_DEV_INTEGRITY */

203 204 205 206 207 208 209 210 211
static inline int sd_is_zoned(struct scsi_disk *sdkp)
{
	return sdkp->zoned == 1 || sdkp->device->type == TYPE_ZBC;
}

#ifdef CONFIG_BLK_DEV_ZONED

extern int sd_zbc_read_zones(struct scsi_disk *sdkp, unsigned char *buffer);
extern void sd_zbc_print_zones(struct scsi_disk *sdkp);
212
extern blk_status_t sd_zbc_setup_reset_cmnd(struct scsi_cmnd *cmd);
213 214
extern void sd_zbc_complete(struct scsi_cmnd *cmd, unsigned int good_bytes,
			    struct scsi_sense_hdr *sshdr);
215
extern int sd_zbc_report_zones(struct gendisk *disk, sector_t sector,
216
			       struct blk_zone *zones, unsigned int *nr_zones);
217 218 219 220 221 222 223 224 225 226 227

#else /* CONFIG_BLK_DEV_ZONED */

static inline int sd_zbc_read_zones(struct scsi_disk *sdkp,
				    unsigned char *buf)
{
	return 0;
}

static inline void sd_zbc_print_zones(struct scsi_disk *sdkp) {}

228
static inline blk_status_t sd_zbc_setup_reset_cmnd(struct scsi_cmnd *cmd)
229
{
230
	return BLK_STS_TARGET;
231 232 233 234 235 236
}

static inline void sd_zbc_complete(struct scsi_cmnd *cmd,
				   unsigned int good_bytes,
				   struct scsi_sense_hdr *sshdr) {}

237 238
#define sd_zbc_report_zones NULL

239 240
#endif /* CONFIG_BLK_DEV_ZONED */

241
#endif /* _SCSI_DISK_H */