1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2aa91696eSMartin K. Petersen #ifndef _SCSI_DISK_H 3aa91696eSMartin K. Petersen #define _SCSI_DISK_H 4aa91696eSMartin K. Petersen 5aa91696eSMartin K. Petersen /* 6aa91696eSMartin K. Petersen * More than enough for everybody ;) The huge number of majors 7aa91696eSMartin K. Petersen * is a leftover from 16bit dev_t days, we don't really need that 8aa91696eSMartin K. Petersen * much numberspace. 9aa91696eSMartin K. Petersen */ 10aa91696eSMartin K. Petersen #define SD_MAJORS 16 11aa91696eSMartin K. Petersen 12aa91696eSMartin K. Petersen /* 13aa91696eSMartin K. Petersen * Time out in seconds for disks and Magneto-opticals (which are slower). 14aa91696eSMartin K. Petersen */ 15aa91696eSMartin K. Petersen #define SD_TIMEOUT (30 * HZ) 16aa91696eSMartin K. Petersen #define SD_MOD_TIMEOUT (75 * HZ) 177e660100SJames Bottomley /* 187e660100SJames Bottomley * Flush timeout is a multiplier over the standard device timeout which is 197e660100SJames Bottomley * user modifiable via sysfs but initially set to SD_TIMEOUT 207e660100SJames Bottomley */ 217e660100SJames Bottomley #define SD_FLUSH_TIMEOUT_MULTIPLIER 2 225db44863SMartin K. Petersen #define SD_WRITE_SAME_TIMEOUT (120 * HZ) 23aa91696eSMartin K. Petersen 24aa91696eSMartin K. Petersen /* 25aa91696eSMartin K. Petersen * Number of allowed retries 26aa91696eSMartin K. Petersen */ 27aa91696eSMartin K. Petersen #define SD_MAX_RETRIES 5 28aa91696eSMartin K. Petersen #define SD_PASSTHROUGH_RETRIES 1 2918a4d0a2SMartin K. Petersen #define SD_MAX_MEDIUM_TIMEOUTS 2 30aa91696eSMartin K. Petersen 31aa91696eSMartin K. Petersen /* 32aa91696eSMartin K. Petersen * Size of the initial data buffer for mode and read capacity data 33aa91696eSMartin K. Petersen */ 34aa91696eSMartin K. Petersen #define SD_BUF_SIZE 512 35aa91696eSMartin K. Petersen 3618351070SLinus Torvalds /* 3718351070SLinus Torvalds * Number of sectors at the end of the device to avoid multi-sector 3818351070SLinus Torvalds * accesses to in the case of last_sector_bug 3918351070SLinus Torvalds */ 4018351070SLinus Torvalds #define SD_LAST_BUGGY_SECTORS 8 4118351070SLinus Torvalds 424e7392ecSMartin K. Petersen enum { 434e7392ecSMartin K. Petersen SD_EXT_CDB_SIZE = 32, /* Extended CDB size */ 444e7392ecSMartin K. Petersen SD_MEMPOOL_SIZE = 2, /* CDB pool size */ 454e7392ecSMartin K. Petersen }; 464e7392ecSMartin K. Petersen 47c98a0eb0SMartin K. Petersen enum { 48bcdb247cSMartin K. Petersen SD_DEF_XFER_BLOCKS = 0xffff, 49bcdb247cSMartin K. Petersen SD_MAX_XFER_BLOCKS = 0xffffffff, 505db44863SMartin K. Petersen SD_MAX_WS10_BLOCKS = 0xffff, 515db44863SMartin K. Petersen SD_MAX_WS16_BLOCKS = 0x7fffff, 525db44863SMartin K. Petersen }; 535db44863SMartin K. Petersen 545db44863SMartin K. Petersen enum { 55c98a0eb0SMartin K. Petersen SD_LBP_FULL = 0, /* Full logical block provisioning */ 56c98a0eb0SMartin K. Petersen SD_LBP_UNMAP, /* Use UNMAP command */ 57c98a0eb0SMartin K. Petersen SD_LBP_WS16, /* Use WRITE SAME(16) with UNMAP bit */ 58c98a0eb0SMartin K. Petersen SD_LBP_WS10, /* Use WRITE SAME(10) with UNMAP bit */ 59c98a0eb0SMartin K. Petersen SD_LBP_ZERO, /* Use WRITE SAME(10) with zero payload */ 60c98a0eb0SMartin K. Petersen SD_LBP_DISABLE, /* Discard disabled due to failed cmd */ 61c98a0eb0SMartin K. Petersen }; 62c98a0eb0SMartin K. Petersen 63e6bd9312SMartin K. Petersen enum { 64e6bd9312SMartin K. Petersen SD_ZERO_WRITE = 0, /* Use WRITE(10/16) command */ 65e6bd9312SMartin K. Petersen SD_ZERO_WS, /* Use WRITE SAME(10/16) command */ 66e6bd9312SMartin K. Petersen SD_ZERO_WS16_UNMAP, /* Use WRITE SAME(16) with UNMAP */ 67e6bd9312SMartin K. Petersen SD_ZERO_WS10_UNMAP, /* Use WRITE SAME(10) with UNMAP */ 68e6bd9312SMartin K. Petersen }; 69e6bd9312SMartin K. Petersen 70aa91696eSMartin K. Petersen struct scsi_disk { 71aa91696eSMartin K. Petersen struct scsi_driver *driver; /* always &sd_template */ 72aa91696eSMartin K. Petersen struct scsi_device *device; 73aa91696eSMartin K. Petersen struct device dev; 74aa91696eSMartin K. Petersen struct gendisk *disk; 75d80210f2SChristoph Hellwig struct opal_dev *opal_dev; 7689d94756SHannes Reinecke #ifdef CONFIG_BLK_DEV_ZONED 77354f1132SBart Van Assche u32 nr_zones; 78354f1132SBart Van Assche u32 zone_blocks; 79354f1132SBart Van Assche u32 zones_optimal_open; 80354f1132SBart Van Assche u32 zones_optimal_nonseq; 81354f1132SBart Van Assche u32 zones_max_open; 825795eb44SJohannes Thumshirn u32 *zones_wp_offset; 835795eb44SJohannes Thumshirn spinlock_t zones_wp_offset_lock; 845795eb44SJohannes Thumshirn u32 *rev_wp_offset; 855795eb44SJohannes Thumshirn struct mutex rev_mutex; 865795eb44SJohannes Thumshirn struct work_struct zone_wp_offset_work; 875795eb44SJohannes Thumshirn char *zone_wp_update_buf; 8889d94756SHannes Reinecke #endif 89409f3499SArnd Bergmann atomic_t openers; 90f08bb1e0SMartin K. Petersen sector_t capacity; /* size in logical blocks */ 91bcdb247cSMartin K. Petersen u32 max_xfer_blocks; 92ca369d51SMartin K. Petersen u32 opt_xfer_blocks; 93c98a0eb0SMartin K. Petersen u32 max_ws_blocks; 94c98a0eb0SMartin K. Petersen u32 max_unmap_blocks; 95c98a0eb0SMartin K. Petersen u32 unmap_granularity; 96c98a0eb0SMartin K. Petersen u32 unmap_alignment; 97aa91696eSMartin K. Petersen u32 index; 98526f7c79SMartin K. Petersen unsigned int physical_block_size; 9918a4d0a2SMartin K. Petersen unsigned int max_medium_access_timeouts; 10018a4d0a2SMartin K. Petersen unsigned int medium_access_timed_out; 101aa91696eSMartin K. Petersen u8 media_present; 102aa91696eSMartin K. Petersen u8 write_prot; 103e0597d70SMartin K. Petersen u8 protection_type;/* Data Integrity Field */ 104c98a0eb0SMartin K. Petersen u8 provisioning_mode; 105e6bd9312SMartin K. Petersen u8 zeroing_mode; 106e0597d70SMartin K. Petersen unsigned ATO : 1; /* state of disk ATO bit */ 10739c60a09SJames Bottomley unsigned cache_override : 1; /* temp override of WCE,RCD */ 108aa91696eSMartin K. Petersen unsigned WCE : 1; /* state of disk WCE bit */ 109aa91696eSMartin K. Petersen unsigned RCD : 1; /* state of disk RCD bit, unused */ 110aa91696eSMartin K. Petersen unsigned DPOFUA : 1; /* state of disk DPOFUA bit */ 11170a9b873SMartin K. Petersen unsigned first_scan : 1; 112c98a0eb0SMartin K. Petersen unsigned lbpme : 1; 113c98a0eb0SMartin K. Petersen unsigned lbprz : 1; 114c98a0eb0SMartin K. Petersen unsigned lbpu : 1; 115c98a0eb0SMartin K. Petersen unsigned lbpws : 1; 116c98a0eb0SMartin K. Petersen unsigned lbpws10 : 1; 117c98a0eb0SMartin K. Petersen unsigned lbpvpd : 1; 11866c28f97SMartin K. Petersen unsigned ws10 : 1; 1195db44863SMartin K. Petersen unsigned ws16 : 1; 12089d94756SHannes Reinecke unsigned rc_basis: 2; 12189d94756SHannes Reinecke unsigned zoned: 2; 12289d94756SHannes Reinecke unsigned urswrz : 1; 123d80210f2SChristoph Hellwig unsigned security : 1; 1247a38dc0bSHannes Reinecke unsigned ignore_medium_access_errors : 1; 125aa91696eSMartin K. Petersen }; 126aa91696eSMartin K. Petersen #define to_scsi_disk(obj) container_of(obj,struct scsi_disk,dev) 127aa91696eSMartin K. Petersen 1285b635da1SMartin K. Petersen static inline struct scsi_disk *scsi_disk(struct gendisk *disk) 1295b635da1SMartin K. Petersen { 1305b635da1SMartin K. Petersen return container_of(disk->private_data, struct scsi_disk, driver); 1315b635da1SMartin K. Petersen } 1325b635da1SMartin K. Petersen 133aa91696eSMartin K. Petersen #define sd_printk(prefix, sdsk, fmt, a...) \ 134aa91696eSMartin K. Petersen (sdsk)->disk ? \ 13522e0d994SHannes Reinecke sdev_prefix_printk(prefix, (sdsk)->device, \ 13622e0d994SHannes Reinecke (sdsk)->disk->disk_name, fmt, ##a) : \ 137aa91696eSMartin K. Petersen sdev_printk(prefix, (sdsk)->device, fmt, ##a) 138aa91696eSMartin K. Petersen 139b2bff6ceSMartin K. Petersen #define sd_first_printk(prefix, sdsk, fmt, a...) \ 140b2bff6ceSMartin K. Petersen do { \ 141df46cac3SDietmar Hahn if ((sdsk)->first_scan) \ 142b2bff6ceSMartin K. Petersen sd_printk(prefix, sdsk, fmt, ##a); \ 143b2bff6ceSMartin K. Petersen } while (0) 144b2bff6ceSMartin K. Petersen 14518a4d0a2SMartin K. Petersen static inline int scsi_medium_access_command(struct scsi_cmnd *scmd) 14618a4d0a2SMartin K. Petersen { 14718a4d0a2SMartin K. Petersen switch (scmd->cmnd[0]) { 14818a4d0a2SMartin K. Petersen case READ_6: 14918a4d0a2SMartin K. Petersen case READ_10: 15018a4d0a2SMartin K. Petersen case READ_12: 15118a4d0a2SMartin K. Petersen case READ_16: 15218a4d0a2SMartin K. Petersen case SYNCHRONIZE_CACHE: 15318a4d0a2SMartin K. Petersen case VERIFY: 15418a4d0a2SMartin K. Petersen case VERIFY_12: 15518a4d0a2SMartin K. Petersen case VERIFY_16: 15618a4d0a2SMartin K. Petersen case WRITE_6: 15718a4d0a2SMartin K. Petersen case WRITE_10: 15818a4d0a2SMartin K. Petersen case WRITE_12: 15918a4d0a2SMartin K. Petersen case WRITE_16: 16018a4d0a2SMartin K. Petersen case WRITE_SAME: 16118a4d0a2SMartin K. Petersen case WRITE_SAME_16: 16218a4d0a2SMartin K. Petersen case UNMAP: 16318a4d0a2SMartin K. Petersen return 1; 16418a4d0a2SMartin K. Petersen case VARIABLE_LENGTH_CMD: 16518a4d0a2SMartin K. Petersen switch (scmd->cmnd[9]) { 16618a4d0a2SMartin K. Petersen case READ_32: 16718a4d0a2SMartin K. Petersen case VERIFY_32: 16818a4d0a2SMartin K. Petersen case WRITE_32: 16918a4d0a2SMartin K. Petersen case WRITE_SAME_32: 17018a4d0a2SMartin K. Petersen return 1; 17118a4d0a2SMartin K. Petersen } 17218a4d0a2SMartin K. Petersen } 17318a4d0a2SMartin K. Petersen 17418a4d0a2SMartin K. Petersen return 0; 17518a4d0a2SMartin K. Petersen } 17618a4d0a2SMartin K. Petersen 177f08bb1e0SMartin K. Petersen static inline sector_t logical_to_sectors(struct scsi_device *sdev, sector_t blocks) 178f08bb1e0SMartin K. Petersen { 179f08bb1e0SMartin K. Petersen return blocks << (ilog2(sdev->sector_size) - 9); 180f08bb1e0SMartin K. Petersen } 181f08bb1e0SMartin K. Petersen 1826b7e9cdeSMartin K. Petersen static inline unsigned int logical_to_bytes(struct scsi_device *sdev, sector_t blocks) 1836b7e9cdeSMartin K. Petersen { 1846b7e9cdeSMartin K. Petersen return blocks * sdev->sector_size; 1856b7e9cdeSMartin K. Petersen } 1866b7e9cdeSMartin K. Petersen 1876eadc612SDamien Le Moal static inline sector_t bytes_to_logical(struct scsi_device *sdev, unsigned int bytes) 1886eadc612SDamien Le Moal { 1896eadc612SDamien Le Moal return bytes >> ilog2(sdev->sector_size); 1906eadc612SDamien Le Moal } 1916eadc612SDamien Le Moal 19289d94756SHannes Reinecke static inline sector_t sectors_to_logical(struct scsi_device *sdev, sector_t sector) 19389d94756SHannes Reinecke { 19489d94756SHannes Reinecke return sector >> (ilog2(sdev->sector_size) - 9); 19589d94756SHannes Reinecke } 19689d94756SHannes Reinecke 1974c393e6eSJames Bottomley #ifdef CONFIG_BLK_DEV_INTEGRITY 198af55ff67SMartin K. Petersen 199af55ff67SMartin K. Petersen extern void sd_dif_config_host(struct scsi_disk *); 200af55ff67SMartin K. Petersen 201af55ff67SMartin K. Petersen #else /* CONFIG_BLK_DEV_INTEGRITY */ 202af55ff67SMartin K. Petersen 2034c393e6eSJames Bottomley static inline void sd_dif_config_host(struct scsi_disk *disk) 2044c393e6eSJames Bottomley { 2054c393e6eSJames Bottomley } 206af55ff67SMartin K. Petersen 207af55ff67SMartin K. Petersen #endif /* CONFIG_BLK_DEV_INTEGRITY */ 208af55ff67SMartin K. Petersen 20989d94756SHannes Reinecke static inline int sd_is_zoned(struct scsi_disk *sdkp) 21089d94756SHannes Reinecke { 21189d94756SHannes Reinecke return sdkp->zoned == 1 || sdkp->device->type == TYPE_ZBC; 21289d94756SHannes Reinecke } 21389d94756SHannes Reinecke 21489d94756SHannes Reinecke #ifdef CONFIG_BLK_DEV_ZONED 21589d94756SHannes Reinecke 2165795eb44SJohannes Thumshirn int sd_zbc_init_disk(struct scsi_disk *sdkp); 2175795eb44SJohannes Thumshirn void sd_zbc_release_disk(struct scsi_disk *sdkp); 21889d94756SHannes Reinecke extern int sd_zbc_read_zones(struct scsi_disk *sdkp, unsigned char *buffer); 21989d94756SHannes Reinecke extern void sd_zbc_print_zones(struct scsi_disk *sdkp); 220ad512f20SAjay Joshi blk_status_t sd_zbc_setup_zone_mgmt_cmnd(struct scsi_cmnd *cmd, 221ad512f20SAjay Joshi unsigned char op, bool all); 2225795eb44SJohannes Thumshirn unsigned int sd_zbc_complete(struct scsi_cmnd *cmd, unsigned int good_bytes, 22389d94756SHannes Reinecke struct scsi_sense_hdr *sshdr); 224d4100351SChristoph Hellwig int sd_zbc_report_zones(struct gendisk *disk, sector_t sector, 225d4100351SChristoph Hellwig unsigned int nr_zones, report_zones_cb cb, void *data); 22689d94756SHannes Reinecke 2275795eb44SJohannes Thumshirn blk_status_t sd_zbc_prepare_zone_append(struct scsi_cmnd *cmd, sector_t *lba, 2285795eb44SJohannes Thumshirn unsigned int nr_blocks); 2295795eb44SJohannes Thumshirn 23089d94756SHannes Reinecke #else /* CONFIG_BLK_DEV_ZONED */ 23189d94756SHannes Reinecke 2325795eb44SJohannes Thumshirn static inline int sd_zbc_init(void) 2335795eb44SJohannes Thumshirn { 2345795eb44SJohannes Thumshirn return 0; 2355795eb44SJohannes Thumshirn } 2365795eb44SJohannes Thumshirn 2375795eb44SJohannes Thumshirn static inline int sd_zbc_init_disk(struct scsi_disk *sdkp) 2385795eb44SJohannes Thumshirn { 2395795eb44SJohannes Thumshirn return 0; 2405795eb44SJohannes Thumshirn } 2415795eb44SJohannes Thumshirn 2425795eb44SJohannes Thumshirn static inline void sd_zbc_exit(void) {} 2435795eb44SJohannes Thumshirn static inline void sd_zbc_release_disk(struct scsi_disk *sdkp) {} 2445795eb44SJohannes Thumshirn 24589d94756SHannes Reinecke static inline int sd_zbc_read_zones(struct scsi_disk *sdkp, 24689d94756SHannes Reinecke unsigned char *buf) 24789d94756SHannes Reinecke { 24889d94756SHannes Reinecke return 0; 24989d94756SHannes Reinecke } 25089d94756SHannes Reinecke 25189d94756SHannes Reinecke static inline void sd_zbc_print_zones(struct scsi_disk *sdkp) {} 25289d94756SHannes Reinecke 253ad512f20SAjay Joshi static inline blk_status_t sd_zbc_setup_zone_mgmt_cmnd(struct scsi_cmnd *cmd, 254ad512f20SAjay Joshi unsigned char op, 255d81e9d49SChaitanya Kulkarni bool all) 25689d94756SHannes Reinecke { 257159b2cbfSChristoph Hellwig return BLK_STS_TARGET; 25889d94756SHannes Reinecke } 25989d94756SHannes Reinecke 2605795eb44SJohannes Thumshirn static inline unsigned int sd_zbc_complete(struct scsi_cmnd *cmd, 2615795eb44SJohannes Thumshirn unsigned int good_bytes, struct scsi_sense_hdr *sshdr) 2625795eb44SJohannes Thumshirn { 2635795eb44SJohannes Thumshirn return 0; 2645795eb44SJohannes Thumshirn } 2655795eb44SJohannes Thumshirn 2665795eb44SJohannes Thumshirn static inline blk_status_t sd_zbc_prepare_zone_append(struct scsi_cmnd *cmd, 2675795eb44SJohannes Thumshirn sector_t *lba, 2685795eb44SJohannes Thumshirn unsigned int nr_blocks) 2695795eb44SJohannes Thumshirn { 2705795eb44SJohannes Thumshirn return BLK_STS_TARGET; 2715795eb44SJohannes Thumshirn } 27289d94756SHannes Reinecke 273e76239a3SChristoph Hellwig #define sd_zbc_report_zones NULL 274e76239a3SChristoph Hellwig 27589d94756SHannes Reinecke #endif /* CONFIG_BLK_DEV_ZONED */ 27689d94756SHannes Reinecke 277a35989a0SDamien Le Moal void sd_print_sense_hdr(struct scsi_disk *sdkp, struct scsi_sense_hdr *sshdr); 278a35989a0SDamien Le Moal void sd_print_result(const struct scsi_disk *sdkp, const char *msg, int result); 279a35989a0SDamien Le Moal 280aa91696eSMartin K. Petersen #endif /* _SCSI_DISK_H */ 281