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 */
|