Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : #ifndef _SCSI_DISK_H 3 : : #define _SCSI_DISK_H 4 : : 5 : : /* 6 : : * More than enough for everybody ;) The huge number of majors 7 : : * is a leftover from 16bit dev_t days, we don't really need that 8 : : * much numberspace. 9 : : */ 10 : : #define SD_MAJORS 16 11 : : 12 : : /* 13 : : * Time out in seconds for disks and Magneto-opticals (which are slower). 14 : : */ 15 : : #define SD_TIMEOUT (30 * HZ) 16 : : #define SD_MOD_TIMEOUT (75 * HZ) 17 : : /* 18 : : * Flush timeout is a multiplier over the standard device timeout which is 19 : : * user modifiable via sysfs but initially set to SD_TIMEOUT 20 : : */ 21 : : #define SD_FLUSH_TIMEOUT_MULTIPLIER 2 22 : : #define SD_WRITE_SAME_TIMEOUT (120 * HZ) 23 : : 24 : : /* 25 : : * Number of allowed retries 26 : : */ 27 : : #define SD_MAX_RETRIES 5 28 : : #define SD_PASSTHROUGH_RETRIES 1 29 : : #define SD_MAX_MEDIUM_TIMEOUTS 2 30 : : 31 : : /* 32 : : * Size of the initial data buffer for mode and read capacity data 33 : : */ 34 : : #define SD_BUF_SIZE 512 35 : : 36 : : /* 37 : : * Number of sectors at the end of the device to avoid multi-sector 38 : : * accesses to in the case of last_sector_bug 39 : : */ 40 : : #define SD_LAST_BUGGY_SECTORS 8 41 : : 42 : : enum { 43 : : SD_EXT_CDB_SIZE = 32, /* Extended CDB size */ 44 : : SD_MEMPOOL_SIZE = 2, /* CDB pool size */ 45 : : }; 46 : : 47 : : enum { 48 : : SD_DEF_XFER_BLOCKS = 0xffff, 49 : : SD_MAX_XFER_BLOCKS = 0xffffffff, 50 : : SD_MAX_WS10_BLOCKS = 0xffff, 51 : : SD_MAX_WS16_BLOCKS = 0x7fffff, 52 : : }; 53 : : 54 : : enum { 55 : : SD_LBP_FULL = 0, /* Full logical block provisioning */ 56 : : SD_LBP_UNMAP, /* Use UNMAP command */ 57 : : SD_LBP_WS16, /* Use WRITE SAME(16) with UNMAP bit */ 58 : : SD_LBP_WS10, /* Use WRITE SAME(10) with UNMAP bit */ 59 : : SD_LBP_ZERO, /* Use WRITE SAME(10) with zero payload */ 60 : : SD_LBP_DISABLE, /* Discard disabled due to failed cmd */ 61 : : }; 62 : : 63 : : enum { 64 : : SD_ZERO_WRITE = 0, /* Use WRITE(10/16) command */ 65 : : SD_ZERO_WS, /* Use WRITE SAME(10/16) command */ 66 : : SD_ZERO_WS16_UNMAP, /* Use WRITE SAME(16) with UNMAP */ 67 : : SD_ZERO_WS10_UNMAP, /* Use WRITE SAME(10) with UNMAP */ 68 : : }; 69 : : 70 : : struct scsi_disk { 71 : : struct scsi_driver *driver; /* always &sd_template */ 72 : : 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 : : u32 nr_zones; 78 : : u32 zone_blocks; 79 : : u32 zones_optimal_open; 80 : : u32 zones_optimal_nonseq; 81 : : u32 zones_max_open; 82 : : #endif 83 : : atomic_t openers; 84 : : sector_t capacity; /* size in logical blocks */ 85 : : u32 max_xfer_blocks; 86 : : u32 opt_xfer_blocks; 87 : : u32 max_ws_blocks; 88 : : u32 max_unmap_blocks; 89 : : u32 unmap_granularity; 90 : : u32 unmap_alignment; 91 : : u32 index; 92 : : unsigned int physical_block_size; 93 : : unsigned int max_medium_access_timeouts; 94 : : unsigned int medium_access_timed_out; 95 : : u8 media_present; 96 : : 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 : : unsigned WCE : 1; /* state of disk WCE bit */ 103 : : unsigned RCD : 1; /* state of disk RCD bit, unused */ 104 : : unsigned DPOFUA : 1; /* state of disk DPOFUA bit */ 105 : : unsigned first_scan : 1; 106 : : unsigned lbpme : 1; 107 : : unsigned lbprz : 1; 108 : : unsigned lbpu : 1; 109 : : unsigned lbpws : 1; 110 : : unsigned lbpws10 : 1; 111 : : unsigned lbpvpd : 1; 112 : : unsigned ws10 : 1; 113 : : unsigned ws16 : 1; 114 : : unsigned rc_basis: 2; 115 : : unsigned zoned: 2; 116 : : 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 : : static inline struct scsi_disk *scsi_disk(struct gendisk *disk) 123 : : { 124 : 0 : return container_of(disk->private_data, struct scsi_disk, driver); 125 : : } 126 : : 127 : : #define sd_printk(prefix, sdsk, fmt, a...) \ 128 : : (sdsk)->disk ? \ 129 : : sdev_prefix_printk(prefix, (sdsk)->device, \ 130 : : (sdsk)->disk->disk_name, fmt, ##a) : \ 131 : : sdev_printk(prefix, (sdsk)->device, fmt, ##a) 132 : : 133 : : #define sd_first_printk(prefix, sdsk, fmt, a...) \ 134 : : do { \ 135 : : if ((sdsk)->first_scan) \ 136 : : sd_printk(prefix, sdsk, fmt, ##a); \ 137 : : } while (0) 138 : : 139 : 0 : static inline int scsi_medium_access_command(struct scsi_cmnd *scmd) 140 : : { 141 : 0 : switch (scmd->cmnd[0]) { 142 : : case READ_6: 143 : : case READ_10: 144 : : case READ_12: 145 : : case READ_16: 146 : : case SYNCHRONIZE_CACHE: 147 : : case VERIFY: 148 : : case VERIFY_12: 149 : : case VERIFY_16: 150 : : case WRITE_6: 151 : : case WRITE_10: 152 : : case WRITE_12: 153 : : case WRITE_16: 154 : : case WRITE_SAME: 155 : : case WRITE_SAME_16: 156 : : case UNMAP: 157 : : return 1; 158 : : case VARIABLE_LENGTH_CMD: 159 : 0 : switch (scmd->cmnd[9]) { 160 : : case READ_32: 161 : : case VERIFY_32: 162 : : case WRITE_32: 163 : : case WRITE_SAME_32: 164 : : return 1; 165 : : } 166 : : } 167 : : 168 : 0 : return 0; 169 : : } 170 : : 171 : 0 : static inline sector_t logical_to_sectors(struct scsi_device *sdev, sector_t blocks) 172 : : { 173 : 0 : return blocks << (ilog2(sdev->sector_size) - 9); 174 : : } 175 : : 176 : : static inline unsigned int logical_to_bytes(struct scsi_device *sdev, sector_t blocks) 177 : : { 178 : 0 : return blocks * sdev->sector_size; 179 : : } 180 : : 181 : 0 : static inline sector_t bytes_to_logical(struct scsi_device *sdev, unsigned int bytes) 182 : : { 183 : 0 : return bytes >> ilog2(sdev->sector_size); 184 : : } 185 : : 186 : 0 : static inline sector_t sectors_to_logical(struct scsi_device *sdev, sector_t sector) 187 : : { 188 : 0 : return sector >> (ilog2(sdev->sector_size) - 9); 189 : : } 190 : : 191 : : #ifdef CONFIG_BLK_DEV_INTEGRITY 192 : : 193 : : extern void sd_dif_config_host(struct scsi_disk *); 194 : : 195 : : #else /* CONFIG_BLK_DEV_INTEGRITY */ 196 : : 197 : : static inline void sd_dif_config_host(struct scsi_disk *disk) 198 : : { 199 : : } 200 : : 201 : : #endif /* CONFIG_BLK_DEV_INTEGRITY */ 202 : : 203 : : static inline int sd_is_zoned(struct scsi_disk *sdkp) 204 : : { 205 : 0 : return sdkp->zoned == 1 || sdkp->device->type == TYPE_ZBC; 206 : : } 207 : : 208 : : #ifdef CONFIG_BLK_DEV_ZONED 209 : : 210 : : extern int sd_zbc_read_zones(struct scsi_disk *sdkp, unsigned char *buffer); 211 : : extern void sd_zbc_print_zones(struct scsi_disk *sdkp); 212 : : extern blk_status_t sd_zbc_setup_reset_cmnd(struct scsi_cmnd *cmd, bool all); 213 : : extern void sd_zbc_complete(struct scsi_cmnd *cmd, unsigned int good_bytes, 214 : : 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 : : #else /* CONFIG_BLK_DEV_ZONED */ 219 : : 220 : : static inline int sd_zbc_read_zones(struct scsi_disk *sdkp, 221 : : unsigned char *buf) 222 : : { 223 : : return 0; 224 : : } 225 : : 226 : : static inline void sd_zbc_print_zones(struct scsi_disk *sdkp) {} 227 : : 228 : : static inline blk_status_t sd_zbc_setup_reset_cmnd(struct scsi_cmnd *cmd, 229 : : bool all) 230 : : { 231 : : return BLK_STS_TARGET; 232 : : } 233 : : 234 : : static inline void sd_zbc_complete(struct scsi_cmnd *cmd, 235 : : unsigned int good_bytes, 236 : : struct scsi_sense_hdr *sshdr) {} 237 : : 238 : : #define sd_zbc_report_zones NULL 239 : : 240 : : #endif /* CONFIG_BLK_DEV_ZONED */ 241 : : 242 : : #endif /* _SCSI_DISK_H */