]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blob - drivers/scsi/scsi_debug.c
Merge tag 'seccomp-v5.7-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees...
[mirror_ubuntu-jammy-kernel.git] / drivers / scsi / scsi_debug.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 * vvvvvvvvvvvvvvvvvvvvvvv Original vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
4 * Copyright (C) 1992 Eric Youngdale
5 * Simulate a host adapter with 2 disks attached. Do a lot of checking
6 * to make sure that we are not getting blocks mixed up, and PANIC if
7 * anything out of the ordinary is seen.
8 * ^^^^^^^^^^^^^^^^^^^^^^^ Original ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
9 *
10 * Copyright (C) 2001 - 2018 Douglas Gilbert
11 *
12 * For documentation see http://sg.danny.cz/sg/sdebug26.html
13 */
14
15
16 #define pr_fmt(fmt) KBUILD_MODNAME ":%s: " fmt, __func__
17
18 #include <linux/module.h>
19
20 #include <linux/kernel.h>
21 #include <linux/errno.h>
22 #include <linux/jiffies.h>
23 #include <linux/slab.h>
24 #include <linux/types.h>
25 #include <linux/string.h>
26 #include <linux/genhd.h>
27 #include <linux/fs.h>
28 #include <linux/init.h>
29 #include <linux/proc_fs.h>
30 #include <linux/vmalloc.h>
31 #include <linux/moduleparam.h>
32 #include <linux/scatterlist.h>
33 #include <linux/blkdev.h>
34 #include <linux/crc-t10dif.h>
35 #include <linux/spinlock.h>
36 #include <linux/interrupt.h>
37 #include <linux/atomic.h>
38 #include <linux/hrtimer.h>
39 #include <linux/uuid.h>
40 #include <linux/t10-pi.h>
41 #include <linux/msdos_partition.h>
42
43 #include <net/checksum.h>
44
45 #include <asm/unaligned.h>
46
47 #include <scsi/scsi.h>
48 #include <scsi/scsi_cmnd.h>
49 #include <scsi/scsi_device.h>
50 #include <scsi/scsi_host.h>
51 #include <scsi/scsicam.h>
52 #include <scsi/scsi_eh.h>
53 #include <scsi/scsi_tcq.h>
54 #include <scsi/scsi_dbg.h>
55
56 #include "sd.h"
57 #include "scsi_logging.h"
58
59 /* make sure inq_product_rev string corresponds to this version */
60 #define SDEBUG_VERSION "0188" /* format to fit INQUIRY revision field */
61 static const char *sdebug_version_date = "20190125";
62
63 #define MY_NAME "scsi_debug"
64
65 /* Additional Sense Code (ASC) */
66 #define NO_ADDITIONAL_SENSE 0x0
67 #define LOGICAL_UNIT_NOT_READY 0x4
68 #define LOGICAL_UNIT_COMMUNICATION_FAILURE 0x8
69 #define UNRECOVERED_READ_ERR 0x11
70 #define PARAMETER_LIST_LENGTH_ERR 0x1a
71 #define INVALID_OPCODE 0x20
72 #define LBA_OUT_OF_RANGE 0x21
73 #define INVALID_FIELD_IN_CDB 0x24
74 #define INVALID_FIELD_IN_PARAM_LIST 0x26
75 #define WRITE_PROTECTED 0x27
76 #define UA_RESET_ASC 0x29
77 #define UA_CHANGED_ASC 0x2a
78 #define TARGET_CHANGED_ASC 0x3f
79 #define LUNS_CHANGED_ASCQ 0x0e
80 #define INSUFF_RES_ASC 0x55
81 #define INSUFF_RES_ASCQ 0x3
82 #define POWER_ON_RESET_ASCQ 0x0
83 #define BUS_RESET_ASCQ 0x2 /* scsi bus reset occurred */
84 #define MODE_CHANGED_ASCQ 0x1 /* mode parameters changed */
85 #define CAPACITY_CHANGED_ASCQ 0x9
86 #define SAVING_PARAMS_UNSUP 0x39
87 #define TRANSPORT_PROBLEM 0x4b
88 #define THRESHOLD_EXCEEDED 0x5d
89 #define LOW_POWER_COND_ON 0x5e
90 #define MISCOMPARE_VERIFY_ASC 0x1d
91 #define MICROCODE_CHANGED_ASCQ 0x1 /* with TARGET_CHANGED_ASC */
92 #define MICROCODE_CHANGED_WO_RESET_ASCQ 0x16
93 #define WRITE_ERROR_ASC 0xc
94
95 /* Additional Sense Code Qualifier (ASCQ) */
96 #define ACK_NAK_TO 0x3
97
98 /* Default values for driver parameters */
99 #define DEF_NUM_HOST 1
100 #define DEF_NUM_TGTS 1
101 #define DEF_MAX_LUNS 1
102 /* With these defaults, this driver will make 1 host with 1 target
103 * (id 0) containing 1 logical unit (lun 0). That is 1 device.
104 */
105 #define DEF_ATO 1
106 #define DEF_CDB_LEN 10
107 #define DEF_JDELAY 1 /* if > 0 unit is a jiffy */
108 #define DEF_DEV_SIZE_MB 8
109 #define DEF_DIF 0
110 #define DEF_DIX 0
111 #define DEF_D_SENSE 0
112 #define DEF_EVERY_NTH 0
113 #define DEF_FAKE_RW 0
114 #define DEF_GUARD 0
115 #define DEF_HOST_LOCK 0
116 #define DEF_LBPU 0
117 #define DEF_LBPWS 0
118 #define DEF_LBPWS10 0
119 #define DEF_LBPRZ 1
120 #define DEF_LOWEST_ALIGNED 0
121 #define DEF_NDELAY 0 /* if > 0 unit is a nanosecond */
122 #define DEF_NO_LUN_0 0
123 #define DEF_NUM_PARTS 0
124 #define DEF_OPTS 0
125 #define DEF_OPT_BLKS 1024
126 #define DEF_PHYSBLK_EXP 0
127 #define DEF_OPT_XFERLEN_EXP 0
128 #define DEF_PTYPE TYPE_DISK
129 #define DEF_REMOVABLE false
130 #define DEF_SCSI_LEVEL 7 /* INQUIRY, byte2 [6->SPC-4; 7->SPC-5] */
131 #define DEF_SECTOR_SIZE 512
132 #define DEF_UNMAP_ALIGNMENT 0
133 #define DEF_UNMAP_GRANULARITY 1
134 #define DEF_UNMAP_MAX_BLOCKS 0xFFFFFFFF
135 #define DEF_UNMAP_MAX_DESC 256
136 #define DEF_VIRTUAL_GB 0
137 #define DEF_VPD_USE_HOSTNO 1
138 #define DEF_WRITESAME_LENGTH 0xFFFF
139 #define DEF_STRICT 0
140 #define DEF_STATISTICS false
141 #define DEF_SUBMIT_QUEUES 1
142 #define DEF_UUID_CTL 0
143 #define JDELAY_OVERRIDDEN -9999
144
145 #define SDEBUG_LUN_0_VAL 0
146
147 /* bit mask values for sdebug_opts */
148 #define SDEBUG_OPT_NOISE 1
149 #define SDEBUG_OPT_MEDIUM_ERR 2
150 #define SDEBUG_OPT_TIMEOUT 4
151 #define SDEBUG_OPT_RECOVERED_ERR 8
152 #define SDEBUG_OPT_TRANSPORT_ERR 16
153 #define SDEBUG_OPT_DIF_ERR 32
154 #define SDEBUG_OPT_DIX_ERR 64
155 #define SDEBUG_OPT_MAC_TIMEOUT 128
156 #define SDEBUG_OPT_SHORT_TRANSFER 0x100
157 #define SDEBUG_OPT_Q_NOISE 0x200
158 #define SDEBUG_OPT_ALL_TSF 0x400
159 #define SDEBUG_OPT_RARE_TSF 0x800
160 #define SDEBUG_OPT_N_WCE 0x1000
161 #define SDEBUG_OPT_RESET_NOISE 0x2000
162 #define SDEBUG_OPT_NO_CDB_NOISE 0x4000
163 #define SDEBUG_OPT_HOST_BUSY 0x8000
164 #define SDEBUG_OPT_CMD_ABORT 0x10000
165 #define SDEBUG_OPT_ALL_NOISE (SDEBUG_OPT_NOISE | SDEBUG_OPT_Q_NOISE | \
166 SDEBUG_OPT_RESET_NOISE)
167 #define SDEBUG_OPT_ALL_INJECTING (SDEBUG_OPT_RECOVERED_ERR | \
168 SDEBUG_OPT_TRANSPORT_ERR | \
169 SDEBUG_OPT_DIF_ERR | SDEBUG_OPT_DIX_ERR | \
170 SDEBUG_OPT_SHORT_TRANSFER | \
171 SDEBUG_OPT_HOST_BUSY | \
172 SDEBUG_OPT_CMD_ABORT)
173 /* When "every_nth" > 0 then modulo "every_nth" commands:
174 * - a missing response is simulated if SDEBUG_OPT_TIMEOUT is set
175 * - a RECOVERED_ERROR is simulated on successful read and write
176 * commands if SDEBUG_OPT_RECOVERED_ERR is set.
177 * - a TRANSPORT_ERROR is simulated on successful read and write
178 * commands if SDEBUG_OPT_TRANSPORT_ERR is set.
179 * - similarly for DIF_ERR, DIX_ERR, SHORT_TRANSFER, HOST_BUSY and
180 * CMD_ABORT
181 *
182 * When "every_nth" < 0 then after "- every_nth" commands the selected
183 * error will be injected. The error will be injected on every subsequent
184 * command until some other action occurs; for example, the user writing
185 * a new value (other than -1 or 1) to every_nth:
186 * echo 0 > /sys/bus/pseudo/drivers/scsi_debug/every_nth
187 */
188
189 /* As indicated in SAM-5 and SPC-4 Unit Attentions (UAs) are returned in
190 * priority order. In the subset implemented here lower numbers have higher
191 * priority. The UA numbers should be a sequence starting from 0 with
192 * SDEBUG_NUM_UAS being 1 higher than the highest numbered UA. */
193 #define SDEBUG_UA_POR 0 /* Power on, reset, or bus device reset */
194 #define SDEBUG_UA_BUS_RESET 1
195 #define SDEBUG_UA_MODE_CHANGED 2
196 #define SDEBUG_UA_CAPACITY_CHANGED 3
197 #define SDEBUG_UA_LUNS_CHANGED 4
198 #define SDEBUG_UA_MICROCODE_CHANGED 5 /* simulate firmware change */
199 #define SDEBUG_UA_MICROCODE_CHANGED_WO_RESET 6
200 #define SDEBUG_NUM_UAS 7
201
202 /* when 1==SDEBUG_OPT_MEDIUM_ERR, a medium error is simulated at this
203 * sector on read commands: */
204 #define OPT_MEDIUM_ERR_ADDR 0x1234 /* that's sector 4660 in decimal */
205 #define OPT_MEDIUM_ERR_NUM 10 /* number of consecutive medium errs */
206
207 /* If REPORT LUNS has luns >= 256 it can choose "flat space" (value 1)
208 * or "peripheral device" addressing (value 0) */
209 #define SAM2_LUN_ADDRESS_METHOD 0
210
211 /* SDEBUG_CANQUEUE is the maximum number of commands that can be queued
212 * (for response) per submit queue at one time. Can be reduced by max_queue
213 * option. Command responses are not queued when jdelay=0 and ndelay=0. The
214 * per-device DEF_CMD_PER_LUN can be changed via sysfs:
215 * /sys/class/scsi_device/<h:c:t:l>/device/queue_depth
216 * but cannot exceed SDEBUG_CANQUEUE .
217 */
218 #define SDEBUG_CANQUEUE_WORDS 3 /* a WORD is bits in a long */
219 #define SDEBUG_CANQUEUE (SDEBUG_CANQUEUE_WORDS * BITS_PER_LONG)
220 #define DEF_CMD_PER_LUN 255
221
222 #define F_D_IN 1
223 #define F_D_OUT 2
224 #define F_D_OUT_MAYBE 4 /* WRITE SAME, NDOB bit */
225 #define F_D_UNKN 8
226 #define F_RL_WLUN_OK 0x10
227 #define F_SKIP_UA 0x20
228 #define F_DELAY_OVERR 0x40
229 #define F_SA_LOW 0x80 /* cdb byte 1, bits 4 to 0 */
230 #define F_SA_HIGH 0x100 /* as used by variable length cdbs */
231 #define F_INV_OP 0x200
232 #define F_FAKE_RW 0x400
233 #define F_M_ACCESS 0x800 /* media access */
234 #define F_SSU_DELAY 0x1000
235 #define F_SYNC_DELAY 0x2000
236
237 #define FF_RESPOND (F_RL_WLUN_OK | F_SKIP_UA | F_DELAY_OVERR)
238 #define FF_MEDIA_IO (F_M_ACCESS | F_FAKE_RW)
239 #define FF_SA (F_SA_HIGH | F_SA_LOW)
240 #define F_LONG_DELAY (F_SSU_DELAY | F_SYNC_DELAY)
241
242 #define SDEBUG_MAX_PARTS 4
243
244 #define SDEBUG_MAX_CMD_LEN 32
245
246
247 struct sdebug_dev_info {
248 struct list_head dev_list;
249 unsigned int channel;
250 unsigned int target;
251 u64 lun;
252 uuid_t lu_name;
253 struct sdebug_host_info *sdbg_host;
254 unsigned long uas_bm[1];
255 atomic_t num_in_q;
256 atomic_t stopped;
257 bool used;
258 };
259
260 struct sdebug_host_info {
261 struct list_head host_list;
262 struct Scsi_Host *shost;
263 struct device dev;
264 struct list_head dev_info_list;
265 };
266
267 #define to_sdebug_host(d) \
268 container_of(d, struct sdebug_host_info, dev)
269
270 enum sdeb_defer_type {SDEB_DEFER_NONE = 0, SDEB_DEFER_HRT = 1,
271 SDEB_DEFER_WQ = 2};
272
273 struct sdebug_defer {
274 struct hrtimer hrt;
275 struct execute_work ew;
276 int sqa_idx; /* index of sdebug_queue array */
277 int qc_idx; /* index of sdebug_queued_cmd array within sqa_idx */
278 int issuing_cpu;
279 bool init_hrt;
280 bool init_wq;
281 bool aborted; /* true when blk_abort_request() already called */
282 enum sdeb_defer_type defer_t;
283 };
284
285 struct sdebug_queued_cmd {
286 /* corresponding bit set in in_use_bm[] in owning struct sdebug_queue
287 * instance indicates this slot is in use.
288 */
289 struct sdebug_defer *sd_dp;
290 struct scsi_cmnd *a_cmnd;
291 unsigned int inj_recovered:1;
292 unsigned int inj_transport:1;
293 unsigned int inj_dif:1;
294 unsigned int inj_dix:1;
295 unsigned int inj_short:1;
296 unsigned int inj_host_busy:1;
297 unsigned int inj_cmd_abort:1;
298 };
299
300 struct sdebug_queue {
301 struct sdebug_queued_cmd qc_arr[SDEBUG_CANQUEUE];
302 unsigned long in_use_bm[SDEBUG_CANQUEUE_WORDS];
303 spinlock_t qc_lock;
304 atomic_t blocked; /* to temporarily stop more being queued */
305 };
306
307 static atomic_t sdebug_cmnd_count; /* number of incoming commands */
308 static atomic_t sdebug_completions; /* count of deferred completions */
309 static atomic_t sdebug_miss_cpus; /* submission + completion cpus differ */
310 static atomic_t sdebug_a_tsf; /* 'almost task set full' counter */
311
312 struct opcode_info_t {
313 u8 num_attached; /* 0 if this is it (i.e. a leaf); use 0xff */
314 /* for terminating element */
315 u8 opcode; /* if num_attached > 0, preferred */
316 u16 sa; /* service action */
317 u32 flags; /* OR-ed set of SDEB_F_* */
318 int (*pfp)(struct scsi_cmnd *, struct sdebug_dev_info *);
319 const struct opcode_info_t *arrp; /* num_attached elements or NULL */
320 u8 len_mask[16]; /* len_mask[0]-->cdb_len, then mask for cdb */
321 /* 1 to min(cdb_len, 15); ignore cdb[15...] */
322 };
323
324 /* SCSI opcodes (first byte of cdb) of interest mapped onto these indexes */
325 enum sdeb_opcode_index {
326 SDEB_I_INVALID_OPCODE = 0,
327 SDEB_I_INQUIRY = 1,
328 SDEB_I_REPORT_LUNS = 2,
329 SDEB_I_REQUEST_SENSE = 3,
330 SDEB_I_TEST_UNIT_READY = 4,
331 SDEB_I_MODE_SENSE = 5, /* 6, 10 */
332 SDEB_I_MODE_SELECT = 6, /* 6, 10 */
333 SDEB_I_LOG_SENSE = 7,
334 SDEB_I_READ_CAPACITY = 8, /* 10; 16 is in SA_IN(16) */
335 SDEB_I_READ = 9, /* 6, 10, 12, 16 */
336 SDEB_I_WRITE = 10, /* 6, 10, 12, 16 */
337 SDEB_I_START_STOP = 11,
338 SDEB_I_SERV_ACT_IN_16 = 12, /* add ...SERV_ACT_IN_12 if needed */
339 SDEB_I_SERV_ACT_OUT_16 = 13, /* add ...SERV_ACT_OUT_12 if needed */
340 SDEB_I_MAINT_IN = 14,
341 SDEB_I_MAINT_OUT = 15,
342 SDEB_I_VERIFY = 16, /* 10 only */
343 SDEB_I_VARIABLE_LEN = 17, /* READ(32), WRITE(32), WR_SCAT(32) */
344 SDEB_I_RESERVE = 18, /* 6, 10 */
345 SDEB_I_RELEASE = 19, /* 6, 10 */
346 SDEB_I_ALLOW_REMOVAL = 20, /* PREVENT ALLOW MEDIUM REMOVAL */
347 SDEB_I_REZERO_UNIT = 21, /* REWIND in SSC */
348 SDEB_I_ATA_PT = 22, /* 12, 16 */
349 SDEB_I_SEND_DIAG = 23,
350 SDEB_I_UNMAP = 24,
351 SDEB_I_WRITE_BUFFER = 25,
352 SDEB_I_WRITE_SAME = 26, /* 10, 16 */
353 SDEB_I_SYNC_CACHE = 27, /* 10, 16 */
354 SDEB_I_COMP_WRITE = 28,
355 SDEB_I_LAST_ELEMENT = 29, /* keep this last (previous + 1) */
356 };
357
358
359 static const unsigned char opcode_ind_arr[256] = {
360 /* 0x0; 0x0->0x1f: 6 byte cdbs */
361 SDEB_I_TEST_UNIT_READY, SDEB_I_REZERO_UNIT, 0, SDEB_I_REQUEST_SENSE,
362 0, 0, 0, 0,
363 SDEB_I_READ, 0, SDEB_I_WRITE, 0, 0, 0, 0, 0,
364 0, 0, SDEB_I_INQUIRY, 0, 0, SDEB_I_MODE_SELECT, SDEB_I_RESERVE,
365 SDEB_I_RELEASE,
366 0, 0, SDEB_I_MODE_SENSE, SDEB_I_START_STOP, 0, SDEB_I_SEND_DIAG,
367 SDEB_I_ALLOW_REMOVAL, 0,
368 /* 0x20; 0x20->0x3f: 10 byte cdbs */
369 0, 0, 0, 0, 0, SDEB_I_READ_CAPACITY, 0, 0,
370 SDEB_I_READ, 0, SDEB_I_WRITE, 0, 0, 0, 0, SDEB_I_VERIFY,
371 0, 0, 0, 0, 0, SDEB_I_SYNC_CACHE, 0, 0,
372 0, 0, 0, SDEB_I_WRITE_BUFFER, 0, 0, 0, 0,
373 /* 0x40; 0x40->0x5f: 10 byte cdbs */
374 0, SDEB_I_WRITE_SAME, SDEB_I_UNMAP, 0, 0, 0, 0, 0,
375 0, 0, 0, 0, 0, SDEB_I_LOG_SENSE, 0, 0,
376 0, 0, 0, 0, 0, SDEB_I_MODE_SELECT, SDEB_I_RESERVE,
377 SDEB_I_RELEASE,
378 0, 0, SDEB_I_MODE_SENSE, 0, 0, 0, 0, 0,
379 /* 0x60; 0x60->0x7d are reserved, 0x7e is "extended cdb" */
380 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
381 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
382 0, SDEB_I_VARIABLE_LEN,
383 /* 0x80; 0x80->0x9f: 16 byte cdbs */
384 0, 0, 0, 0, 0, SDEB_I_ATA_PT, 0, 0,
385 SDEB_I_READ, SDEB_I_COMP_WRITE, SDEB_I_WRITE, 0, 0, 0, 0, 0,
386 0, SDEB_I_SYNC_CACHE, 0, SDEB_I_WRITE_SAME, 0, 0, 0, 0,
387 0, 0, 0, 0, 0, 0, SDEB_I_SERV_ACT_IN_16, SDEB_I_SERV_ACT_OUT_16,
388 /* 0xa0; 0xa0->0xbf: 12 byte cdbs */
389 SDEB_I_REPORT_LUNS, SDEB_I_ATA_PT, 0, SDEB_I_MAINT_IN,
390 SDEB_I_MAINT_OUT, 0, 0, 0,
391 SDEB_I_READ, 0 /* SDEB_I_SERV_ACT_OUT_12 */, SDEB_I_WRITE,
392 0 /* SDEB_I_SERV_ACT_IN_12 */, 0, 0, 0, 0,
393 0, 0, 0, 0, 0, 0, 0, 0,
394 0, 0, 0, 0, 0, 0, 0, 0,
395 /* 0xc0; 0xc0->0xff: vendor specific */
396 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
397 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
398 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
399 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
400 };
401
402 /*
403 * The following "response" functions return the SCSI mid-level's 4 byte
404 * tuple-in-an-int. To handle commands with an IMMED bit, for a faster
405 * command completion, they can mask their return value with
406 * SDEG_RES_IMMED_MASK .
407 */
408 #define SDEG_RES_IMMED_MASK 0x40000000
409
410 static int resp_inquiry(struct scsi_cmnd *, struct sdebug_dev_info *);
411 static int resp_report_luns(struct scsi_cmnd *, struct sdebug_dev_info *);
412 static int resp_requests(struct scsi_cmnd *, struct sdebug_dev_info *);
413 static int resp_mode_sense(struct scsi_cmnd *, struct sdebug_dev_info *);
414 static int resp_mode_select(struct scsi_cmnd *, struct sdebug_dev_info *);
415 static int resp_log_sense(struct scsi_cmnd *, struct sdebug_dev_info *);
416 static int resp_readcap(struct scsi_cmnd *, struct sdebug_dev_info *);
417 static int resp_read_dt0(struct scsi_cmnd *, struct sdebug_dev_info *);
418 static int resp_write_dt0(struct scsi_cmnd *, struct sdebug_dev_info *);
419 static int resp_write_scat(struct scsi_cmnd *, struct sdebug_dev_info *);
420 static int resp_start_stop(struct scsi_cmnd *, struct sdebug_dev_info *);
421 static int resp_readcap16(struct scsi_cmnd *, struct sdebug_dev_info *);
422 static int resp_get_lba_status(struct scsi_cmnd *, struct sdebug_dev_info *);
423 static int resp_report_tgtpgs(struct scsi_cmnd *, struct sdebug_dev_info *);
424 static int resp_unmap(struct scsi_cmnd *, struct sdebug_dev_info *);
425 static int resp_rsup_opcodes(struct scsi_cmnd *, struct sdebug_dev_info *);
426 static int resp_rsup_tmfs(struct scsi_cmnd *, struct sdebug_dev_info *);
427 static int resp_write_same_10(struct scsi_cmnd *, struct sdebug_dev_info *);
428 static int resp_write_same_16(struct scsi_cmnd *, struct sdebug_dev_info *);
429 static int resp_comp_write(struct scsi_cmnd *, struct sdebug_dev_info *);
430 static int resp_write_buffer(struct scsi_cmnd *, struct sdebug_dev_info *);
431 static int resp_sync_cache(struct scsi_cmnd *, struct sdebug_dev_info *);
432
433 /*
434 * The following are overflow arrays for cdbs that "hit" the same index in
435 * the opcode_info_arr array. The most time sensitive (or commonly used) cdb
436 * should be placed in opcode_info_arr[], the others should be placed here.
437 */
438 static const struct opcode_info_t msense_iarr[] = {
439 {0, 0x1a, 0, F_D_IN, NULL, NULL,
440 {6, 0xe8, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
441 };
442
443 static const struct opcode_info_t mselect_iarr[] = {
444 {0, 0x15, 0, F_D_OUT, NULL, NULL,
445 {6, 0xf1, 0, 0, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
446 };
447
448 static const struct opcode_info_t read_iarr[] = {
449 {0, 0x28, 0, F_D_IN | FF_MEDIA_IO, resp_read_dt0, NULL,/* READ(10) */
450 {10, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7, 0, 0,
451 0, 0, 0, 0} },
452 {0, 0x8, 0, F_D_IN | FF_MEDIA_IO, resp_read_dt0, NULL, /* READ(6) */
453 {6, 0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
454 {0, 0xa8, 0, F_D_IN | FF_MEDIA_IO, resp_read_dt0, NULL,/* READ(12) */
455 {12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf,
456 0xc7, 0, 0, 0, 0} },
457 };
458
459 static const struct opcode_info_t write_iarr[] = {
460 {0, 0x2a, 0, F_D_OUT | FF_MEDIA_IO, resp_write_dt0, /* WRITE(10) */
461 NULL, {10, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7,
462 0, 0, 0, 0, 0, 0} },
463 {0, 0xa, 0, F_D_OUT | FF_MEDIA_IO, resp_write_dt0, /* WRITE(6) */
464 NULL, {6, 0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0,
465 0, 0, 0} },
466 {0, 0xaa, 0, F_D_OUT | FF_MEDIA_IO, resp_write_dt0, /* WRITE(12) */
467 NULL, {12, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
468 0xbf, 0xc7, 0, 0, 0, 0} },
469 };
470
471 static const struct opcode_info_t sa_in_16_iarr[] = {
472 {0, 0x9e, 0x12, F_SA_LOW | F_D_IN, resp_get_lba_status, NULL,
473 {16, 0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
474 0xff, 0xff, 0xff, 0, 0xc7} }, /* GET LBA STATUS(16) */
475 };
476
477 static const struct opcode_info_t vl_iarr[] = { /* VARIABLE LENGTH */
478 {0, 0x7f, 0xb, F_SA_HIGH | F_D_OUT | FF_MEDIA_IO, resp_write_dt0,
479 NULL, {32, 0xc7, 0, 0, 0, 0, 0x3f, 0x18, 0x0, 0xb, 0xfa,
480 0, 0xff, 0xff, 0xff, 0xff} }, /* WRITE(32) */
481 {0, 0x7f, 0x11, F_SA_HIGH | F_D_OUT | FF_MEDIA_IO, resp_write_scat,
482 NULL, {32, 0xc7, 0, 0, 0, 0, 0x3f, 0x18, 0x0, 0x11, 0xf8,
483 0, 0xff, 0xff, 0x0, 0x0} }, /* WRITE SCATTERED(32) */
484 };
485
486 static const struct opcode_info_t maint_in_iarr[] = { /* MAINT IN */
487 {0, 0xa3, 0xc, F_SA_LOW | F_D_IN, resp_rsup_opcodes, NULL,
488 {12, 0xc, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0,
489 0xc7, 0, 0, 0, 0} }, /* REPORT SUPPORTED OPERATION CODES */
490 {0, 0xa3, 0xd, F_SA_LOW | F_D_IN, resp_rsup_tmfs, NULL,
491 {12, 0xd, 0x80, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0xc7, 0, 0,
492 0, 0} }, /* REPORTED SUPPORTED TASK MANAGEMENT FUNCTIONS */
493 };
494
495 static const struct opcode_info_t write_same_iarr[] = {
496 {0, 0x93, 0, F_D_OUT_MAYBE | FF_MEDIA_IO, resp_write_same_16, NULL,
497 {16, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
498 0xff, 0xff, 0xff, 0x3f, 0xc7} }, /* WRITE SAME(16) */
499 };
500
501 static const struct opcode_info_t reserve_iarr[] = {
502 {0, 0x16, 0, F_D_OUT, NULL, NULL, /* RESERVE(6) */
503 {6, 0x1f, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
504 };
505
506 static const struct opcode_info_t release_iarr[] = {
507 {0, 0x17, 0, F_D_OUT, NULL, NULL, /* RELEASE(6) */
508 {6, 0x1f, 0xff, 0, 0, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
509 };
510
511 static const struct opcode_info_t sync_cache_iarr[] = {
512 {0, 0x91, 0, F_SYNC_DELAY | F_M_ACCESS, resp_sync_cache, NULL,
513 {16, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
514 0xff, 0xff, 0xff, 0xff, 0x3f, 0xc7} }, /* SYNC_CACHE (16) */
515 };
516
517
518 /* This array is accessed via SDEB_I_* values. Make sure all are mapped,
519 * plus the terminating elements for logic that scans this table such as
520 * REPORT SUPPORTED OPERATION CODES. */
521 static const struct opcode_info_t opcode_info_arr[SDEB_I_LAST_ELEMENT + 1] = {
522 /* 0 */
523 {0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL, /* unknown opcodes */
524 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
525 {0, 0x12, 0, FF_RESPOND | F_D_IN, resp_inquiry, NULL, /* INQUIRY */
526 {6, 0xe3, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
527 {0, 0xa0, 0, FF_RESPOND | F_D_IN, resp_report_luns, NULL,
528 {12, 0xe3, 0xff, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0xc7, 0, 0,
529 0, 0} }, /* REPORT LUNS */
530 {0, 0x3, 0, FF_RESPOND | F_D_IN, resp_requests, NULL,
531 {6, 0xe1, 0, 0, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
532 {0, 0x0, 0, F_M_ACCESS | F_RL_WLUN_OK, NULL, NULL,/* TEST UNIT READY */
533 {6, 0, 0, 0, 0, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
534 /* 5 */
535 {ARRAY_SIZE(msense_iarr), 0x5a, 0, F_D_IN, /* MODE SENSE(10) */
536 resp_mode_sense, msense_iarr, {10, 0xf8, 0xff, 0xff, 0, 0, 0,
537 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
538 {ARRAY_SIZE(mselect_iarr), 0x55, 0, F_D_OUT, /* MODE SELECT(10) */
539 resp_mode_select, mselect_iarr, {10, 0xf1, 0, 0, 0, 0, 0, 0xff,
540 0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
541 {0, 0x4d, 0, F_D_IN, resp_log_sense, NULL, /* LOG SENSE */
542 {10, 0xe3, 0xff, 0xff, 0, 0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0, 0,
543 0, 0, 0} },
544 {0, 0x25, 0, F_D_IN, resp_readcap, NULL, /* READ CAPACITY(10) */
545 {10, 0xe1, 0xff, 0xff, 0xff, 0xff, 0, 0, 0x1, 0xc7, 0, 0, 0, 0,
546 0, 0} },
547 {ARRAY_SIZE(read_iarr), 0x88, 0, F_D_IN | FF_MEDIA_IO, /* READ(16) */
548 resp_read_dt0, read_iarr, {16, 0xfe, 0xff, 0xff, 0xff, 0xff,
549 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7} },
550 /* 10 */
551 {ARRAY_SIZE(write_iarr), 0x8a, 0, F_D_OUT | FF_MEDIA_IO,
552 resp_write_dt0, write_iarr, /* WRITE(16) */
553 {16, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
554 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7} },
555 {0, 0x1b, 0, F_SSU_DELAY, resp_start_stop, NULL,/* START STOP UNIT */
556 {6, 0x1, 0, 0xf, 0xf7, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
557 {ARRAY_SIZE(sa_in_16_iarr), 0x9e, 0x10, F_SA_LOW | F_D_IN,
558 resp_readcap16, sa_in_16_iarr, /* SA_IN(16), READ CAPACITY(16) */
559 {16, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
560 0xff, 0xff, 0xff, 0xff, 0x1, 0xc7} },
561 {0, 0x9f, 0x12, F_SA_LOW | F_D_OUT | FF_MEDIA_IO, resp_write_scat,
562 NULL, {16, 0x12, 0xf9, 0x0, 0xff, 0xff, 0, 0, 0xff, 0xff, 0xff,
563 0xff, 0xff, 0xff, 0xff, 0xc7} }, /* SA_OUT(16), WRITE SCAT(16) */
564 {ARRAY_SIZE(maint_in_iarr), 0xa3, 0xa, F_SA_LOW | F_D_IN,
565 resp_report_tgtpgs, /* MAINT IN, REPORT TARGET PORT GROUPS */
566 maint_in_iarr, {12, 0xea, 0, 0, 0, 0, 0xff, 0xff, 0xff,
567 0xff, 0, 0xc7, 0, 0, 0, 0} },
568 /* 15 */
569 {0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL, /* MAINT OUT */
570 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
571 {0, 0x2f, 0, F_D_OUT_MAYBE | FF_MEDIA_IO, NULL, NULL, /* VERIFY(10) */
572 {10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7,
573 0, 0, 0, 0, 0, 0} },
574 {ARRAY_SIZE(vl_iarr), 0x7f, 0x9, F_SA_HIGH | F_D_IN | FF_MEDIA_IO,
575 resp_read_dt0, vl_iarr, /* VARIABLE LENGTH, READ(32) */
576 {32, 0xc7, 0, 0, 0, 0, 0x3f, 0x18, 0x0, 0x9, 0xfe, 0, 0xff, 0xff,
577 0xff, 0xff} },
578 {ARRAY_SIZE(reserve_iarr), 0x56, 0, F_D_OUT,
579 NULL, reserve_iarr, /* RESERVE(10) <no response function> */
580 {10, 0xff, 0xff, 0xff, 0, 0, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0,
581 0} },
582 {ARRAY_SIZE(release_iarr), 0x57, 0, F_D_OUT,
583 NULL, release_iarr, /* RELEASE(10) <no response function> */
584 {10, 0x13, 0xff, 0xff, 0, 0, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0,
585 0} },
586 /* 20 */
587 {0, 0x1e, 0, 0, NULL, NULL, /* ALLOW REMOVAL */
588 {6, 0, 0, 0, 0x3, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
589 {0, 0x1, 0, 0, resp_start_stop, NULL, /* REWIND ?? */
590 {6, 0x1, 0, 0, 0, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
591 {0, 0, 0, F_INV_OP | FF_RESPOND, NULL, NULL, /* ATA_PT */
592 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
593 {0, 0x1d, F_D_OUT, 0, NULL, NULL, /* SEND DIAGNOSTIC */
594 {6, 0xf7, 0, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
595 {0, 0x42, 0, F_D_OUT | FF_MEDIA_IO, resp_unmap, NULL, /* UNMAP */
596 {10, 0x1, 0, 0, 0, 0, 0x3f, 0xff, 0xff, 0xc7, 0, 0, 0, 0, 0, 0} },
597 /* 25 */
598 {0, 0x3b, 0, F_D_OUT_MAYBE, resp_write_buffer, NULL,
599 {10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0, 0,
600 0, 0, 0, 0} }, /* WRITE_BUFFER */
601 {ARRAY_SIZE(write_same_iarr), 0x41, 0, F_D_OUT_MAYBE | FF_MEDIA_IO,
602 resp_write_same_10, write_same_iarr, /* WRITE SAME(10) */
603 {10, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7, 0,
604 0, 0, 0, 0, 0} },
605 {ARRAY_SIZE(sync_cache_iarr), 0x35, 0, F_SYNC_DELAY | F_M_ACCESS,
606 resp_sync_cache, sync_cache_iarr,
607 {10, 0x7, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xc7, 0, 0,
608 0, 0, 0, 0} }, /* SYNC_CACHE (10) */
609 {0, 0x89, 0, F_D_OUT | FF_MEDIA_IO, resp_comp_write, NULL,
610 {16, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0,
611 0, 0xff, 0x3f, 0xc7} }, /* COMPARE AND WRITE */
612
613 /* 29 */
614 {0xff, 0, 0, 0, NULL, NULL, /* terminating element */
615 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} },
616 };
617
618 static int sdebug_add_host = DEF_NUM_HOST;
619 static int sdebug_ato = DEF_ATO;
620 static int sdebug_cdb_len = DEF_CDB_LEN;
621 static int sdebug_jdelay = DEF_JDELAY; /* if > 0 then unit is jiffies */
622 static int sdebug_dev_size_mb = DEF_DEV_SIZE_MB;
623 static int sdebug_dif = DEF_DIF;
624 static int sdebug_dix = DEF_DIX;
625 static int sdebug_dsense = DEF_D_SENSE;
626 static int sdebug_every_nth = DEF_EVERY_NTH;
627 static int sdebug_fake_rw = DEF_FAKE_RW;
628 static unsigned int sdebug_guard = DEF_GUARD;
629 static int sdebug_lowest_aligned = DEF_LOWEST_ALIGNED;
630 static int sdebug_max_luns = DEF_MAX_LUNS;
631 static int sdebug_max_queue = SDEBUG_CANQUEUE; /* per submit queue */
632 static unsigned int sdebug_medium_error_start = OPT_MEDIUM_ERR_ADDR;
633 static int sdebug_medium_error_count = OPT_MEDIUM_ERR_NUM;
634 static atomic_t retired_max_queue; /* if > 0 then was prior max_queue */
635 static int sdebug_ndelay = DEF_NDELAY; /* if > 0 then unit is nanoseconds */
636 static int sdebug_no_lun_0 = DEF_NO_LUN_0;
637 static int sdebug_no_uld;
638 static int sdebug_num_parts = DEF_NUM_PARTS;
639 static int sdebug_num_tgts = DEF_NUM_TGTS; /* targets per host */
640 static int sdebug_opt_blks = DEF_OPT_BLKS;
641 static int sdebug_opts = DEF_OPTS;
642 static int sdebug_physblk_exp = DEF_PHYSBLK_EXP;
643 static int sdebug_opt_xferlen_exp = DEF_OPT_XFERLEN_EXP;
644 static int sdebug_ptype = DEF_PTYPE; /* SCSI peripheral device type */
645 static int sdebug_scsi_level = DEF_SCSI_LEVEL;
646 static int sdebug_sector_size = DEF_SECTOR_SIZE;
647 static int sdebug_virtual_gb = DEF_VIRTUAL_GB;
648 static int sdebug_vpd_use_hostno = DEF_VPD_USE_HOSTNO;
649 static unsigned int sdebug_lbpu = DEF_LBPU;
650 static unsigned int sdebug_lbpws = DEF_LBPWS;
651 static unsigned int sdebug_lbpws10 = DEF_LBPWS10;
652 static unsigned int sdebug_lbprz = DEF_LBPRZ;
653 static unsigned int sdebug_unmap_alignment = DEF_UNMAP_ALIGNMENT;
654 static unsigned int sdebug_unmap_granularity = DEF_UNMAP_GRANULARITY;
655 static unsigned int sdebug_unmap_max_blocks = DEF_UNMAP_MAX_BLOCKS;
656 static unsigned int sdebug_unmap_max_desc = DEF_UNMAP_MAX_DESC;
657 static unsigned int sdebug_write_same_length = DEF_WRITESAME_LENGTH;
658 static int sdebug_uuid_ctl = DEF_UUID_CTL;
659 static bool sdebug_removable = DEF_REMOVABLE;
660 static bool sdebug_clustering;
661 static bool sdebug_host_lock = DEF_HOST_LOCK;
662 static bool sdebug_strict = DEF_STRICT;
663 static bool sdebug_any_injecting_opt;
664 static bool sdebug_verbose;
665 static bool have_dif_prot;
666 static bool write_since_sync;
667 static bool sdebug_statistics = DEF_STATISTICS;
668 static bool sdebug_wp;
669
670 static unsigned int sdebug_store_sectors;
671 static sector_t sdebug_capacity; /* in sectors */
672
673 /* old BIOS stuff, kernel may get rid of them but some mode sense pages
674 may still need them */
675 static int sdebug_heads; /* heads per disk */
676 static int sdebug_cylinders_per; /* cylinders per surface */
677 static int sdebug_sectors_per; /* sectors per cylinder */
678
679 static LIST_HEAD(sdebug_host_list);
680 static DEFINE_SPINLOCK(sdebug_host_list_lock);
681
682 static unsigned char *fake_storep; /* ramdisk storage */
683 static struct t10_pi_tuple *dif_storep; /* protection info */
684 static void *map_storep; /* provisioning map */
685
686 static unsigned long map_size;
687 static int num_aborts;
688 static int num_dev_resets;
689 static int num_target_resets;
690 static int num_bus_resets;
691 static int num_host_resets;
692 static int dix_writes;
693 static int dix_reads;
694 static int dif_errors;
695
696 static int submit_queues = DEF_SUBMIT_QUEUES; /* > 1 for multi-queue (mq) */
697 static struct sdebug_queue *sdebug_q_arr; /* ptr to array of submit queues */
698
699 static DEFINE_RWLOCK(atomic_rw);
700
701 static char sdebug_proc_name[] = MY_NAME;
702 static const char *my_name = MY_NAME;
703
704 static struct bus_type pseudo_lld_bus;
705
706 static struct device_driver sdebug_driverfs_driver = {
707 .name = sdebug_proc_name,
708 .bus = &pseudo_lld_bus,
709 };
710
711 static const int check_condition_result =
712 (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
713
714 static const int illegal_condition_result =
715 (DRIVER_SENSE << 24) | (DID_ABORT << 16) | SAM_STAT_CHECK_CONDITION;
716
717 static const int device_qfull_result =
718 (DID_OK << 16) | (COMMAND_COMPLETE << 8) | SAM_STAT_TASK_SET_FULL;
719
720
721 /* Only do the extra work involved in logical block provisioning if one or
722 * more of the lbpu, lbpws or lbpws10 parameters are given and we are doing
723 * real reads and writes (i.e. not skipping them for speed).
724 */
725 static inline bool scsi_debug_lbp(void)
726 {
727 return 0 == sdebug_fake_rw &&
728 (sdebug_lbpu || sdebug_lbpws || sdebug_lbpws10);
729 }
730
731 static void *lba2fake_store(unsigned long long lba)
732 {
733 lba = do_div(lba, sdebug_store_sectors);
734
735 return fake_storep + lba * sdebug_sector_size;
736 }
737
738 static struct t10_pi_tuple *dif_store(sector_t sector)
739 {
740 sector = sector_div(sector, sdebug_store_sectors);
741
742 return dif_storep + sector;
743 }
744
745 static void sdebug_max_tgts_luns(void)
746 {
747 struct sdebug_host_info *sdbg_host;
748 struct Scsi_Host *hpnt;
749
750 spin_lock(&sdebug_host_list_lock);
751 list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
752 hpnt = sdbg_host->shost;
753 if ((hpnt->this_id >= 0) &&
754 (sdebug_num_tgts > hpnt->this_id))
755 hpnt->max_id = sdebug_num_tgts + 1;
756 else
757 hpnt->max_id = sdebug_num_tgts;
758 /* sdebug_max_luns; */
759 hpnt->max_lun = SCSI_W_LUN_REPORT_LUNS + 1;
760 }
761 spin_unlock(&sdebug_host_list_lock);
762 }
763
764 enum sdeb_cmd_data {SDEB_IN_DATA = 0, SDEB_IN_CDB = 1};
765
766 /* Set in_bit to -1 to indicate no bit position of invalid field */
767 static void mk_sense_invalid_fld(struct scsi_cmnd *scp,
768 enum sdeb_cmd_data c_d,
769 int in_byte, int in_bit)
770 {
771 unsigned char *sbuff;
772 u8 sks[4];
773 int sl, asc;
774
775 sbuff = scp->sense_buffer;
776 if (!sbuff) {
777 sdev_printk(KERN_ERR, scp->device,
778 "%s: sense_buffer is NULL\n", __func__);
779 return;
780 }
781 asc = c_d ? INVALID_FIELD_IN_CDB : INVALID_FIELD_IN_PARAM_LIST;
782 memset(sbuff, 0, SCSI_SENSE_BUFFERSIZE);
783 scsi_build_sense_buffer(sdebug_dsense, sbuff, ILLEGAL_REQUEST, asc, 0);
784 memset(sks, 0, sizeof(sks));
785 sks[0] = 0x80;
786 if (c_d)
787 sks[0] |= 0x40;
788 if (in_bit >= 0) {
789 sks[0] |= 0x8;
790 sks[0] |= 0x7 & in_bit;
791 }
792 put_unaligned_be16(in_byte, sks + 1);
793 if (sdebug_dsense) {
794 sl = sbuff[7] + 8;
795 sbuff[7] = sl;
796 sbuff[sl] = 0x2;
797 sbuff[sl + 1] = 0x6;
798 memcpy(sbuff + sl + 4, sks, 3);
799 } else
800 memcpy(sbuff + 15, sks, 3);
801 if (sdebug_verbose)
802 sdev_printk(KERN_INFO, scp->device, "%s: [sense_key,asc,ascq"
803 "]: [0x5,0x%x,0x0] %c byte=%d, bit=%d\n",
804 my_name, asc, c_d ? 'C' : 'D', in_byte, in_bit);
805 }
806
807 static void mk_sense_buffer(struct scsi_cmnd *scp, int key, int asc, int asq)
808 {
809 unsigned char *sbuff;
810
811 sbuff = scp->sense_buffer;
812 if (!sbuff) {
813 sdev_printk(KERN_ERR, scp->device,
814 "%s: sense_buffer is NULL\n", __func__);
815 return;
816 }
817 memset(sbuff, 0, SCSI_SENSE_BUFFERSIZE);
818
819 scsi_build_sense_buffer(sdebug_dsense, sbuff, key, asc, asq);
820
821 if (sdebug_verbose)
822 sdev_printk(KERN_INFO, scp->device,
823 "%s: [sense_key,asc,ascq]: [0x%x,0x%x,0x%x]\n",
824 my_name, key, asc, asq);
825 }
826
827 static void mk_sense_invalid_opcode(struct scsi_cmnd *scp)
828 {
829 mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_OPCODE, 0);
830 }
831
832 static int scsi_debug_ioctl(struct scsi_device *dev, unsigned int cmd,
833 void __user *arg)
834 {
835 if (sdebug_verbose) {
836 if (0x1261 == cmd)
837 sdev_printk(KERN_INFO, dev,
838 "%s: BLKFLSBUF [0x1261]\n", __func__);
839 else if (0x5331 == cmd)
840 sdev_printk(KERN_INFO, dev,
841 "%s: CDROM_GET_CAPABILITY [0x5331]\n",
842 __func__);
843 else
844 sdev_printk(KERN_INFO, dev, "%s: cmd=0x%x\n",
845 __func__, cmd);
846 }
847 return -EINVAL;
848 /* return -ENOTTY; // correct return but upsets fdisk */
849 }
850
851 static void config_cdb_len(struct scsi_device *sdev)
852 {
853 switch (sdebug_cdb_len) {
854 case 6: /* suggest 6 byte READ, WRITE and MODE SENSE/SELECT */
855 sdev->use_10_for_rw = false;
856 sdev->use_16_for_rw = false;
857 sdev->use_10_for_ms = false;
858 break;
859 case 10: /* suggest 10 byte RWs and 6 byte MODE SENSE/SELECT */
860 sdev->use_10_for_rw = true;
861 sdev->use_16_for_rw = false;
862 sdev->use_10_for_ms = false;
863 break;
864 case 12: /* suggest 10 byte RWs and 10 byte MODE SENSE/SELECT */
865 sdev->use_10_for_rw = true;
866 sdev->use_16_for_rw = false;
867 sdev->use_10_for_ms = true;
868 break;
869 case 16:
870 sdev->use_10_for_rw = false;
871 sdev->use_16_for_rw = true;
872 sdev->use_10_for_ms = true;
873 break;
874 case 32: /* No knobs to suggest this so same as 16 for now */
875 sdev->use_10_for_rw = false;
876 sdev->use_16_for_rw = true;
877 sdev->use_10_for_ms = true;
878 break;
879 default:
880 pr_warn("unexpected cdb_len=%d, force to 10\n",
881 sdebug_cdb_len);
882 sdev->use_10_for_rw = true;
883 sdev->use_16_for_rw = false;
884 sdev->use_10_for_ms = false;
885 sdebug_cdb_len = 10;
886 break;
887 }
888 }
889
890 static void all_config_cdb_len(void)
891 {
892 struct sdebug_host_info *sdbg_host;
893 struct Scsi_Host *shost;
894 struct scsi_device *sdev;
895
896 spin_lock(&sdebug_host_list_lock);
897 list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
898 shost = sdbg_host->shost;
899 shost_for_each_device(sdev, shost) {
900 config_cdb_len(sdev);
901 }
902 }
903 spin_unlock(&sdebug_host_list_lock);
904 }
905
906 static void clear_luns_changed_on_target(struct sdebug_dev_info *devip)
907 {
908 struct sdebug_host_info *sdhp;
909 struct sdebug_dev_info *dp;
910
911 spin_lock(&sdebug_host_list_lock);
912 list_for_each_entry(sdhp, &sdebug_host_list, host_list) {
913 list_for_each_entry(dp, &sdhp->dev_info_list, dev_list) {
914 if ((devip->sdbg_host == dp->sdbg_host) &&
915 (devip->target == dp->target))
916 clear_bit(SDEBUG_UA_LUNS_CHANGED, dp->uas_bm);
917 }
918 }
919 spin_unlock(&sdebug_host_list_lock);
920 }
921
922 static int make_ua(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
923 {
924 int k;
925
926 k = find_first_bit(devip->uas_bm, SDEBUG_NUM_UAS);
927 if (k != SDEBUG_NUM_UAS) {
928 const char *cp = NULL;
929
930 switch (k) {
931 case SDEBUG_UA_POR:
932 mk_sense_buffer(scp, UNIT_ATTENTION, UA_RESET_ASC,
933 POWER_ON_RESET_ASCQ);
934 if (sdebug_verbose)
935 cp = "power on reset";
936 break;
937 case SDEBUG_UA_BUS_RESET:
938 mk_sense_buffer(scp, UNIT_ATTENTION, UA_RESET_ASC,
939 BUS_RESET_ASCQ);
940 if (sdebug_verbose)
941 cp = "bus reset";
942 break;
943 case SDEBUG_UA_MODE_CHANGED:
944 mk_sense_buffer(scp, UNIT_ATTENTION, UA_CHANGED_ASC,
945 MODE_CHANGED_ASCQ);
946 if (sdebug_verbose)
947 cp = "mode parameters changed";
948 break;
949 case SDEBUG_UA_CAPACITY_CHANGED:
950 mk_sense_buffer(scp, UNIT_ATTENTION, UA_CHANGED_ASC,
951 CAPACITY_CHANGED_ASCQ);
952 if (sdebug_verbose)
953 cp = "capacity data changed";
954 break;
955 case SDEBUG_UA_MICROCODE_CHANGED:
956 mk_sense_buffer(scp, UNIT_ATTENTION,
957 TARGET_CHANGED_ASC,
958 MICROCODE_CHANGED_ASCQ);
959 if (sdebug_verbose)
960 cp = "microcode has been changed";
961 break;
962 case SDEBUG_UA_MICROCODE_CHANGED_WO_RESET:
963 mk_sense_buffer(scp, UNIT_ATTENTION,
964 TARGET_CHANGED_ASC,
965 MICROCODE_CHANGED_WO_RESET_ASCQ);
966 if (sdebug_verbose)
967 cp = "microcode has been changed without reset";
968 break;
969 case SDEBUG_UA_LUNS_CHANGED:
970 /*
971 * SPC-3 behavior is to report a UNIT ATTENTION with
972 * ASC/ASCQ REPORTED LUNS DATA HAS CHANGED on every LUN
973 * on the target, until a REPORT LUNS command is
974 * received. SPC-4 behavior is to report it only once.
975 * NOTE: sdebug_scsi_level does not use the same
976 * values as struct scsi_device->scsi_level.
977 */
978 if (sdebug_scsi_level >= 6) /* SPC-4 and above */
979 clear_luns_changed_on_target(devip);
980 mk_sense_buffer(scp, UNIT_ATTENTION,
981 TARGET_CHANGED_ASC,
982 LUNS_CHANGED_ASCQ);
983 if (sdebug_verbose)
984 cp = "reported luns data has changed";
985 break;
986 default:
987 pr_warn("unexpected unit attention code=%d\n", k);
988 if (sdebug_verbose)
989 cp = "unknown";
990 break;
991 }
992 clear_bit(k, devip->uas_bm);
993 if (sdebug_verbose)
994 sdev_printk(KERN_INFO, scp->device,
995 "%s reports: Unit attention: %s\n",
996 my_name, cp);
997 return check_condition_result;
998 }
999 return 0;
1000 }
1001
1002 /* Build SCSI "data-in" buffer. Returns 0 if ok else (DID_ERROR << 16). */
1003 static int fill_from_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
1004 int arr_len)
1005 {
1006 int act_len;
1007 struct scsi_data_buffer *sdb = &scp->sdb;
1008
1009 if (!sdb->length)
1010 return 0;
1011 if (scp->sc_data_direction != DMA_FROM_DEVICE)
1012 return DID_ERROR << 16;
1013
1014 act_len = sg_copy_from_buffer(sdb->table.sgl, sdb->table.nents,
1015 arr, arr_len);
1016 scsi_set_resid(scp, scsi_bufflen(scp) - act_len);
1017
1018 return 0;
1019 }
1020
1021 /* Partial build of SCSI "data-in" buffer. Returns 0 if ok else
1022 * (DID_ERROR << 16). Can write to offset in data-in buffer. If multiple
1023 * calls, not required to write in ascending offset order. Assumes resid
1024 * set to scsi_bufflen() prior to any calls.
1025 */
1026 static int p_fill_from_dev_buffer(struct scsi_cmnd *scp, const void *arr,
1027 int arr_len, unsigned int off_dst)
1028 {
1029 unsigned int act_len, n;
1030 struct scsi_data_buffer *sdb = &scp->sdb;
1031 off_t skip = off_dst;
1032
1033 if (sdb->length <= off_dst)
1034 return 0;
1035 if (scp->sc_data_direction != DMA_FROM_DEVICE)
1036 return DID_ERROR << 16;
1037
1038 act_len = sg_pcopy_from_buffer(sdb->table.sgl, sdb->table.nents,
1039 arr, arr_len, skip);
1040 pr_debug("%s: off_dst=%u, scsi_bufflen=%u, act_len=%u, resid=%d\n",
1041 __func__, off_dst, scsi_bufflen(scp), act_len,
1042 scsi_get_resid(scp));
1043 n = scsi_bufflen(scp) - (off_dst + act_len);
1044 scsi_set_resid(scp, min(scsi_get_resid(scp), n));
1045 return 0;
1046 }
1047
1048 /* Fetches from SCSI "data-out" buffer. Returns number of bytes fetched into
1049 * 'arr' or -1 if error.
1050 */
1051 static int fetch_to_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
1052 int arr_len)
1053 {
1054 if (!scsi_bufflen(scp))
1055 return 0;
1056 if (scp->sc_data_direction != DMA_TO_DEVICE)
1057 return -1;
1058
1059 return scsi_sg_copy_to_buffer(scp, arr, arr_len);
1060 }
1061
1062
1063 static char sdebug_inq_vendor_id[9] = "Linux ";
1064 static char sdebug_inq_product_id[17] = "scsi_debug ";
1065 static char sdebug_inq_product_rev[5] = SDEBUG_VERSION;
1066 /* Use some locally assigned NAAs for SAS addresses. */
1067 static const u64 naa3_comp_a = 0x3222222000000000ULL;
1068 static const u64 naa3_comp_b = 0x3333333000000000ULL;
1069 static const u64 naa3_comp_c = 0x3111111000000000ULL;
1070
1071 /* Device identification VPD page. Returns number of bytes placed in arr */
1072 static int inquiry_vpd_83(unsigned char *arr, int port_group_id,
1073 int target_dev_id, int dev_id_num,
1074 const char *dev_id_str, int dev_id_str_len,
1075 const uuid_t *lu_name)
1076 {
1077 int num, port_a;
1078 char b[32];
1079
1080 port_a = target_dev_id + 1;
1081 /* T10 vendor identifier field format (faked) */
1082 arr[0] = 0x2; /* ASCII */
1083 arr[1] = 0x1;
1084 arr[2] = 0x0;
1085 memcpy(&arr[4], sdebug_inq_vendor_id, 8);
1086 memcpy(&arr[12], sdebug_inq_product_id, 16);
1087 memcpy(&arr[28], dev_id_str, dev_id_str_len);
1088 num = 8 + 16 + dev_id_str_len;
1089 arr[3] = num;
1090 num += 4;
1091 if (dev_id_num >= 0) {
1092 if (sdebug_uuid_ctl) {
1093 /* Locally assigned UUID */
1094 arr[num++] = 0x1; /* binary (not necessarily sas) */
1095 arr[num++] = 0xa; /* PIV=0, lu, naa */
1096 arr[num++] = 0x0;
1097 arr[num++] = 0x12;
1098 arr[num++] = 0x10; /* uuid type=1, locally assigned */
1099 arr[num++] = 0x0;
1100 memcpy(arr + num, lu_name, 16);
1101 num += 16;
1102 } else {
1103 /* NAA-3, Logical unit identifier (binary) */
1104 arr[num++] = 0x1; /* binary (not necessarily sas) */
1105 arr[num++] = 0x3; /* PIV=0, lu, naa */
1106 arr[num++] = 0x0;
1107 arr[num++] = 0x8;
1108 put_unaligned_be64(naa3_comp_b + dev_id_num, arr + num);
1109 num += 8;
1110 }
1111 /* Target relative port number */
1112 arr[num++] = 0x61; /* proto=sas, binary */
1113 arr[num++] = 0x94; /* PIV=1, target port, rel port */
1114 arr[num++] = 0x0; /* reserved */
1115 arr[num++] = 0x4; /* length */
1116 arr[num++] = 0x0; /* reserved */
1117 arr[num++] = 0x0; /* reserved */
1118 arr[num++] = 0x0;
1119 arr[num++] = 0x1; /* relative port A */
1120 }
1121 /* NAA-3, Target port identifier */
1122 arr[num++] = 0x61; /* proto=sas, binary */
1123 arr[num++] = 0x93; /* piv=1, target port, naa */
1124 arr[num++] = 0x0;
1125 arr[num++] = 0x8;
1126 put_unaligned_be64(naa3_comp_a + port_a, arr + num);
1127 num += 8;
1128 /* NAA-3, Target port group identifier */
1129 arr[num++] = 0x61; /* proto=sas, binary */
1130 arr[num++] = 0x95; /* piv=1, target port group id */
1131 arr[num++] = 0x0;
1132 arr[num++] = 0x4;
1133 arr[num++] = 0;
1134 arr[num++] = 0;
1135 put_unaligned_be16(port_group_id, arr + num);
1136 num += 2;
1137 /* NAA-3, Target device identifier */
1138 arr[num++] = 0x61; /* proto=sas, binary */
1139 arr[num++] = 0xa3; /* piv=1, target device, naa */
1140 arr[num++] = 0x0;
1141 arr[num++] = 0x8;
1142 put_unaligned_be64(naa3_comp_a + target_dev_id, arr + num);
1143 num += 8;
1144 /* SCSI name string: Target device identifier */
1145 arr[num++] = 0x63; /* proto=sas, UTF-8 */
1146 arr[num++] = 0xa8; /* piv=1, target device, SCSI name string */
1147 arr[num++] = 0x0;
1148 arr[num++] = 24;
1149 memcpy(arr + num, "naa.32222220", 12);
1150 num += 12;
1151 snprintf(b, sizeof(b), "%08X", target_dev_id);
1152 memcpy(arr + num, b, 8);
1153 num += 8;
1154 memset(arr + num, 0, 4);
1155 num += 4;
1156 return num;
1157 }
1158
1159 static unsigned char vpd84_data[] = {
1160 /* from 4th byte */ 0x22,0x22,0x22,0x0,0xbb,0x0,
1161 0x22,0x22,0x22,0x0,0xbb,0x1,
1162 0x22,0x22,0x22,0x0,0xbb,0x2,
1163 };
1164
1165 /* Software interface identification VPD page */
1166 static int inquiry_vpd_84(unsigned char *arr)
1167 {
1168 memcpy(arr, vpd84_data, sizeof(vpd84_data));
1169 return sizeof(vpd84_data);
1170 }
1171
1172 /* Management network addresses VPD page */
1173 static int inquiry_vpd_85(unsigned char *arr)
1174 {
1175 int num = 0;
1176 const char *na1 = "https://www.kernel.org/config";
1177 const char *na2 = "http://www.kernel.org/log";
1178 int plen, olen;
1179
1180 arr[num++] = 0x1; /* lu, storage config */
1181 arr[num++] = 0x0; /* reserved */
1182 arr[num++] = 0x0;
1183 olen = strlen(na1);
1184 plen = olen + 1;
1185 if (plen % 4)
1186 plen = ((plen / 4) + 1) * 4;
1187 arr[num++] = plen; /* length, null termianted, padded */
1188 memcpy(arr + num, na1, olen);
1189 memset(arr + num + olen, 0, plen - olen);
1190 num += plen;
1191
1192 arr[num++] = 0x4; /* lu, logging */
1193 arr[num++] = 0x0; /* reserved */
1194 arr[num++] = 0x0;
1195 olen = strlen(na2);
1196 plen = olen + 1;
1197 if (plen % 4)
1198 plen = ((plen / 4) + 1) * 4;
1199 arr[num++] = plen; /* length, null terminated, padded */
1200 memcpy(arr + num, na2, olen);
1201 memset(arr + num + olen, 0, plen - olen);
1202 num += plen;
1203
1204 return num;
1205 }
1206
1207 /* SCSI ports VPD page */
1208 static int inquiry_vpd_88(unsigned char *arr, int target_dev_id)
1209 {
1210 int num = 0;
1211 int port_a, port_b;
1212
1213 port_a = target_dev_id + 1;
1214 port_b = port_a + 1;
1215 arr[num++] = 0x0; /* reserved */
1216 arr[num++] = 0x0; /* reserved */
1217 arr[num++] = 0x0;
1218 arr[num++] = 0x1; /* relative port 1 (primary) */
1219 memset(arr + num, 0, 6);
1220 num += 6;
1221 arr[num++] = 0x0;
1222 arr[num++] = 12; /* length tp descriptor */
1223 /* naa-5 target port identifier (A) */
1224 arr[num++] = 0x61; /* proto=sas, binary */
1225 arr[num++] = 0x93; /* PIV=1, target port, NAA */
1226 arr[num++] = 0x0; /* reserved */
1227 arr[num++] = 0x8; /* length */
1228 put_unaligned_be64(naa3_comp_a + port_a, arr + num);
1229 num += 8;
1230 arr[num++] = 0x0; /* reserved */
1231 arr[num++] = 0x0; /* reserved */
1232 arr[num++] = 0x0;
1233 arr[num++] = 0x2; /* relative port 2 (secondary) */
1234 memset(arr + num, 0, 6);
1235 num += 6;
1236 arr[num++] = 0x0;
1237 arr[num++] = 12; /* length tp descriptor */
1238 /* naa-5 target port identifier (B) */
1239 arr[num++] = 0x61; /* proto=sas, binary */
1240 arr[num++] = 0x93; /* PIV=1, target port, NAA */
1241 arr[num++] = 0x0; /* reserved */
1242 arr[num++] = 0x8; /* length */
1243 put_unaligned_be64(naa3_comp_a + port_b, arr + num);
1244 num += 8;
1245
1246 return num;
1247 }
1248
1249
1250 static unsigned char vpd89_data[] = {
1251 /* from 4th byte */ 0,0,0,0,
1252 'l','i','n','u','x',' ',' ',' ',
1253 'S','A','T',' ','s','c','s','i','_','d','e','b','u','g',' ',' ',
1254 '1','2','3','4',
1255 0x34,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
1256 0xec,0,0,0,
1257 0x5a,0xc,0xff,0x3f,0x37,0xc8,0x10,0,0,0,0,0,0x3f,0,0,0,
1258 0,0,0,0,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x20,0x20,0x20,0x20,
1259 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0,0,0,0x40,0x4,0,0x2e,0x33,
1260 0x38,0x31,0x20,0x20,0x20,0x20,0x54,0x53,0x38,0x33,0x30,0x30,0x33,0x31,
1261 0x53,0x41,
1262 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
1263 0x20,0x20,
1264 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
1265 0x10,0x80,
1266 0,0,0,0x2f,0,0,0,0x2,0,0x2,0x7,0,0xff,0xff,0x1,0,
1267 0x3f,0,0xc1,0xff,0x3e,0,0x10,0x1,0xb0,0xf8,0x50,0x9,0,0,0x7,0,
1268 0x3,0,0x78,0,0x78,0,0xf0,0,0x78,0,0,0,0,0,0,0,
1269 0,0,0,0,0,0,0,0,0x2,0,0,0,0,0,0,0,
1270 0x7e,0,0x1b,0,0x6b,0x34,0x1,0x7d,0x3,0x40,0x69,0x34,0x1,0x3c,0x3,0x40,
1271 0x7f,0x40,0,0,0,0,0xfe,0xfe,0,0,0,0,0,0xfe,0,0,
1272 0,0,0,0,0,0,0,0,0xb0,0xf8,0x50,0x9,0,0,0,0,
1273 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1274 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1275 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1276 0x1,0,0xb0,0xf8,0x50,0x9,0xb0,0xf8,0x50,0x9,0x20,0x20,0x2,0,0xb6,0x42,
1277 0,0x80,0x8a,0,0x6,0x3c,0xa,0x3c,0xff,0xff,0xc6,0x7,0,0x1,0,0x8,
1278 0xf0,0xf,0,0x10,0x2,0,0x30,0,0,0,0,0,0,0,0x6,0xfe,
1279 0,0,0x2,0,0x50,0,0x8a,0,0x4f,0x95,0,0,0x21,0,0xb,0,
1280 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1281 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1282 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1283 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1284 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1285 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1286 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1287 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1288 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1289 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1290 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1291 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa5,0x51,
1292 };
1293
1294 /* ATA Information VPD page */
1295 static int inquiry_vpd_89(unsigned char *arr)
1296 {
1297 memcpy(arr, vpd89_data, sizeof(vpd89_data));
1298 return sizeof(vpd89_data);
1299 }
1300
1301
1302 static unsigned char vpdb0_data[] = {
1303 /* from 4th byte */ 0,0,0,4, 0,0,0x4,0, 0,0,0,64,
1304 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1305 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1306 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1307 };
1308
1309 /* Block limits VPD page (SBC-3) */
1310 static int inquiry_vpd_b0(unsigned char *arr)
1311 {
1312 unsigned int gran;
1313
1314 memcpy(arr, vpdb0_data, sizeof(vpdb0_data));
1315
1316 /* Optimal transfer length granularity */
1317 if (sdebug_opt_xferlen_exp != 0 &&
1318 sdebug_physblk_exp < sdebug_opt_xferlen_exp)
1319 gran = 1 << sdebug_opt_xferlen_exp;
1320 else
1321 gran = 1 << sdebug_physblk_exp;
1322 put_unaligned_be16(gran, arr + 2);
1323
1324 /* Maximum Transfer Length */
1325 if (sdebug_store_sectors > 0x400)
1326 put_unaligned_be32(sdebug_store_sectors, arr + 4);
1327
1328 /* Optimal Transfer Length */
1329 put_unaligned_be32(sdebug_opt_blks, &arr[8]);
1330
1331 if (sdebug_lbpu) {
1332 /* Maximum Unmap LBA Count */
1333 put_unaligned_be32(sdebug_unmap_max_blocks, &arr[16]);
1334
1335 /* Maximum Unmap Block Descriptor Count */
1336 put_unaligned_be32(sdebug_unmap_max_desc, &arr[20]);
1337 }
1338
1339 /* Unmap Granularity Alignment */
1340 if (sdebug_unmap_alignment) {
1341 put_unaligned_be32(sdebug_unmap_alignment, &arr[28]);
1342 arr[28] |= 0x80; /* UGAVALID */
1343 }
1344
1345 /* Optimal Unmap Granularity */
1346 put_unaligned_be32(sdebug_unmap_granularity, &arr[24]);
1347
1348 /* Maximum WRITE SAME Length */
1349 put_unaligned_be64(sdebug_write_same_length, &arr[32]);
1350
1351 return 0x3c; /* Mandatory page length for Logical Block Provisioning */
1352
1353 return sizeof(vpdb0_data);
1354 }
1355
1356 /* Block device characteristics VPD page (SBC-3) */
1357 static int inquiry_vpd_b1(unsigned char *arr)
1358 {
1359 memset(arr, 0, 0x3c);
1360 arr[0] = 0;
1361 arr[1] = 1; /* non rotating medium (e.g. solid state) */
1362 arr[2] = 0;
1363 arr[3] = 5; /* less than 1.8" */
1364
1365 return 0x3c;
1366 }
1367
1368 /* Logical block provisioning VPD page (SBC-4) */
1369 static int inquiry_vpd_b2(unsigned char *arr)
1370 {
1371 memset(arr, 0, 0x4);
1372 arr[0] = 0; /* threshold exponent */
1373 if (sdebug_lbpu)
1374 arr[1] = 1 << 7;
1375 if (sdebug_lbpws)
1376 arr[1] |= 1 << 6;
1377 if (sdebug_lbpws10)
1378 arr[1] |= 1 << 5;
1379 if (sdebug_lbprz && scsi_debug_lbp())
1380 arr[1] |= (sdebug_lbprz & 0x7) << 2; /* sbc4r07 and later */
1381 /* anc_sup=0; dp=0 (no provisioning group descriptor) */
1382 /* minimum_percentage=0; provisioning_type=0 (unknown) */
1383 /* threshold_percentage=0 */
1384 return 0x4;
1385 }
1386
1387 #define SDEBUG_LONG_INQ_SZ 96
1388 #define SDEBUG_MAX_INQ_ARR_SZ 584
1389
1390 static int resp_inquiry(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
1391 {
1392 unsigned char pq_pdt;
1393 unsigned char *arr;
1394 unsigned char *cmd = scp->cmnd;
1395 int alloc_len, n, ret;
1396 bool have_wlun, is_disk;
1397
1398 alloc_len = get_unaligned_be16(cmd + 3);
1399 arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_ATOMIC);
1400 if (! arr)
1401 return DID_REQUEUE << 16;
1402 is_disk = (sdebug_ptype == TYPE_DISK);
1403 have_wlun = scsi_is_wlun(scp->device->lun);
1404 if (have_wlun)
1405 pq_pdt = TYPE_WLUN; /* present, wlun */
1406 else if (sdebug_no_lun_0 && (devip->lun == SDEBUG_LUN_0_VAL))
1407 pq_pdt = 0x7f; /* not present, PQ=3, PDT=0x1f */
1408 else
1409 pq_pdt = (sdebug_ptype & 0x1f);
1410 arr[0] = pq_pdt;
1411 if (0x2 & cmd[1]) { /* CMDDT bit set */
1412 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 1);
1413 kfree(arr);
1414 return check_condition_result;
1415 } else if (0x1 & cmd[1]) { /* EVPD bit set */
1416 int lu_id_num, port_group_id, target_dev_id, len;
1417 char lu_id_str[6];
1418 int host_no = devip->sdbg_host->shost->host_no;
1419
1420 port_group_id = (((host_no + 1) & 0x7f) << 8) +
1421 (devip->channel & 0x7f);
1422 if (sdebug_vpd_use_hostno == 0)
1423 host_no = 0;
1424 lu_id_num = have_wlun ? -1 : (((host_no + 1) * 2000) +
1425 (devip->target * 1000) + devip->lun);
1426 target_dev_id = ((host_no + 1) * 2000) +
1427 (devip->target * 1000) - 3;
1428 len = scnprintf(lu_id_str, 6, "%d", lu_id_num);
1429 if (0 == cmd[2]) { /* supported vital product data pages */
1430 arr[1] = cmd[2]; /*sanity */
1431 n = 4;
1432 arr[n++] = 0x0; /* this page */
1433 arr[n++] = 0x80; /* unit serial number */
1434 arr[n++] = 0x83; /* device identification */
1435 arr[n++] = 0x84; /* software interface ident. */
1436 arr[n++] = 0x85; /* management network addresses */
1437 arr[n++] = 0x86; /* extended inquiry */
1438 arr[n++] = 0x87; /* mode page policy */
1439 arr[n++] = 0x88; /* SCSI ports */
1440 if (is_disk) { /* SBC only */
1441 arr[n++] = 0x89; /* ATA information */
1442 arr[n++] = 0xb0; /* Block limits */
1443 arr[n++] = 0xb1; /* Block characteristics */
1444 arr[n++] = 0xb2; /* Logical Block Prov */
1445 }
1446 arr[3] = n - 4; /* number of supported VPD pages */
1447 } else if (0x80 == cmd[2]) { /* unit serial number */
1448 arr[1] = cmd[2]; /*sanity */
1449 arr[3] = len;
1450 memcpy(&arr[4], lu_id_str, len);
1451 } else if (0x83 == cmd[2]) { /* device identification */
1452 arr[1] = cmd[2]; /*sanity */
1453 arr[3] = inquiry_vpd_83(&arr[4], port_group_id,
1454 target_dev_id, lu_id_num,
1455 lu_id_str, len,
1456 &devip->lu_name);
1457 } else if (0x84 == cmd[2]) { /* Software interface ident. */
1458 arr[1] = cmd[2]; /*sanity */
1459 arr[3] = inquiry_vpd_84(&arr[4]);
1460 } else if (0x85 == cmd[2]) { /* Management network addresses */
1461 arr[1] = cmd[2]; /*sanity */
1462 arr[3] = inquiry_vpd_85(&arr[4]);
1463 } else if (0x86 == cmd[2]) { /* extended inquiry */
1464 arr[1] = cmd[2]; /*sanity */
1465 arr[3] = 0x3c; /* number of following entries */
1466 if (sdebug_dif == T10_PI_TYPE3_PROTECTION)
1467 arr[4] = 0x4; /* SPT: GRD_CHK:1 */
1468 else if (have_dif_prot)
1469 arr[4] = 0x5; /* SPT: GRD_CHK:1, REF_CHK:1 */
1470 else
1471 arr[4] = 0x0; /* no protection stuff */
1472 arr[5] = 0x7; /* head of q, ordered + simple q's */
1473 } else if (0x87 == cmd[2]) { /* mode page policy */
1474 arr[1] = cmd[2]; /*sanity */
1475 arr[3] = 0x8; /* number of following entries */
1476 arr[4] = 0x2; /* disconnect-reconnect mp */
1477 arr[6] = 0x80; /* mlus, shared */
1478 arr[8] = 0x18; /* protocol specific lu */
1479 arr[10] = 0x82; /* mlus, per initiator port */
1480 } else if (0x88 == cmd[2]) { /* SCSI Ports */
1481 arr[1] = cmd[2]; /*sanity */
1482 arr[3] = inquiry_vpd_88(&arr[4], target_dev_id);
1483 } else if (is_disk && 0x89 == cmd[2]) { /* ATA information */
1484 arr[1] = cmd[2]; /*sanity */
1485 n = inquiry_vpd_89(&arr[4]);
1486 put_unaligned_be16(n, arr + 2);
1487 } else if (is_disk && 0xb0 == cmd[2]) { /* Block limits */
1488 arr[1] = cmd[2]; /*sanity */
1489 arr[3] = inquiry_vpd_b0(&arr[4]);
1490 } else if (is_disk && 0xb1 == cmd[2]) { /* Block char. */
1491 arr[1] = cmd[2]; /*sanity */
1492 arr[3] = inquiry_vpd_b1(&arr[4]);
1493 } else if (is_disk && 0xb2 == cmd[2]) { /* LB Prov. */
1494 arr[1] = cmd[2]; /*sanity */
1495 arr[3] = inquiry_vpd_b2(&arr[4]);
1496 } else {
1497 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, -1);
1498 kfree(arr);
1499 return check_condition_result;
1500 }
1501 len = min(get_unaligned_be16(arr + 2) + 4, alloc_len);
1502 ret = fill_from_dev_buffer(scp, arr,
1503 min(len, SDEBUG_MAX_INQ_ARR_SZ));
1504 kfree(arr);
1505 return ret;
1506 }
1507 /* drops through here for a standard inquiry */
1508 arr[1] = sdebug_removable ? 0x80 : 0; /* Removable disk */
1509 arr[2] = sdebug_scsi_level;
1510 arr[3] = 2; /* response_data_format==2 */
1511 arr[4] = SDEBUG_LONG_INQ_SZ - 5;
1512 arr[5] = (int)have_dif_prot; /* PROTECT bit */
1513 if (sdebug_vpd_use_hostno == 0)
1514 arr[5] |= 0x10; /* claim: implicit TPGS */
1515 arr[6] = 0x10; /* claim: MultiP */
1516 /* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */
1517 arr[7] = 0xa; /* claim: LINKED + CMDQUE */
1518 memcpy(&arr[8], sdebug_inq_vendor_id, 8);
1519 memcpy(&arr[16], sdebug_inq_product_id, 16);
1520 memcpy(&arr[32], sdebug_inq_product_rev, 4);
1521 /* Use Vendor Specific area to place driver date in ASCII hex */
1522 memcpy(&arr[36], sdebug_version_date, 8);
1523 /* version descriptors (2 bytes each) follow */
1524 put_unaligned_be16(0xc0, arr + 58); /* SAM-6 no version claimed */
1525 put_unaligned_be16(0x5c0, arr + 60); /* SPC-5 no version claimed */
1526 n = 62;
1527 if (is_disk) { /* SBC-4 no version claimed */
1528 put_unaligned_be16(0x600, arr + n);
1529 n += 2;
1530 } else if (sdebug_ptype == TYPE_TAPE) { /* SSC-4 rev 3 */
1531 put_unaligned_be16(0x525, arr + n);
1532 n += 2;
1533 }
1534 put_unaligned_be16(0x2100, arr + n); /* SPL-4 no version claimed */
1535 ret = fill_from_dev_buffer(scp, arr,
1536 min(alloc_len, SDEBUG_LONG_INQ_SZ));
1537 kfree(arr);
1538 return ret;
1539 }
1540
1541 static unsigned char iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
1542 0, 0, 0x0, 0x0};
1543
1544 static int resp_requests(struct scsi_cmnd *scp,
1545 struct sdebug_dev_info *devip)
1546 {
1547 unsigned char *sbuff;
1548 unsigned char *cmd = scp->cmnd;
1549 unsigned char arr[SCSI_SENSE_BUFFERSIZE];
1550 bool dsense;
1551 int len = 18;
1552
1553 memset(arr, 0, sizeof(arr));
1554 dsense = !!(cmd[1] & 1);
1555 sbuff = scp->sense_buffer;
1556 if ((iec_m_pg[2] & 0x4) && (6 == (iec_m_pg[3] & 0xf))) {
1557 if (dsense) {
1558 arr[0] = 0x72;
1559 arr[1] = 0x0; /* NO_SENSE in sense_key */
1560 arr[2] = THRESHOLD_EXCEEDED;
1561 arr[3] = 0xff; /* TEST set and MRIE==6 */
1562 len = 8;
1563 } else {
1564 arr[0] = 0x70;
1565 arr[2] = 0x0; /* NO_SENSE in sense_key */
1566 arr[7] = 0xa; /* 18 byte sense buffer */
1567 arr[12] = THRESHOLD_EXCEEDED;
1568 arr[13] = 0xff; /* TEST set and MRIE==6 */
1569 }
1570 } else {
1571 memcpy(arr, sbuff, SCSI_SENSE_BUFFERSIZE);
1572 if (arr[0] >= 0x70 && dsense == sdebug_dsense)
1573 ; /* have sense and formats match */
1574 else if (arr[0] <= 0x70) {
1575 if (dsense) {
1576 memset(arr, 0, 8);
1577 arr[0] = 0x72;
1578 len = 8;
1579 } else {
1580 memset(arr, 0, 18);
1581 arr[0] = 0x70;
1582 arr[7] = 0xa;
1583 }
1584 } else if (dsense) {
1585 memset(arr, 0, 8);
1586 arr[0] = 0x72;
1587 arr[1] = sbuff[2]; /* sense key */
1588 arr[2] = sbuff[12]; /* asc */
1589 arr[3] = sbuff[13]; /* ascq */
1590 len = 8;
1591 } else {
1592 memset(arr, 0, 18);
1593 arr[0] = 0x70;
1594 arr[2] = sbuff[1];
1595 arr[7] = 0xa;
1596 arr[12] = sbuff[1];
1597 arr[13] = sbuff[3];
1598 }
1599
1600 }
1601 mk_sense_buffer(scp, 0, NO_ADDITIONAL_SENSE, 0);
1602 return fill_from_dev_buffer(scp, arr, len);
1603 }
1604
1605 static int resp_start_stop(struct scsi_cmnd *scp,
1606 struct sdebug_dev_info *devip)
1607 {
1608 unsigned char *cmd = scp->cmnd;
1609 int power_cond, stop;
1610 bool changing;
1611
1612 power_cond = (cmd[4] & 0xf0) >> 4;
1613 if (power_cond) {
1614 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 4, 7);
1615 return check_condition_result;
1616 }
1617 stop = !(cmd[4] & 1);
1618 changing = atomic_read(&devip->stopped) == !stop;
1619 atomic_xchg(&devip->stopped, stop);
1620 if (!changing || cmd[1] & 0x1) /* state unchanged or IMMED set */
1621 return SDEG_RES_IMMED_MASK;
1622 else
1623 return 0;
1624 }
1625
1626 static sector_t get_sdebug_capacity(void)
1627 {
1628 static const unsigned int gibibyte = 1073741824;
1629
1630 if (sdebug_virtual_gb > 0)
1631 return (sector_t)sdebug_virtual_gb *
1632 (gibibyte / sdebug_sector_size);
1633 else
1634 return sdebug_store_sectors;
1635 }
1636
1637 #define SDEBUG_READCAP_ARR_SZ 8
1638 static int resp_readcap(struct scsi_cmnd *scp,
1639 struct sdebug_dev_info *devip)
1640 {
1641 unsigned char arr[SDEBUG_READCAP_ARR_SZ];
1642 unsigned int capac;
1643
1644 /* following just in case virtual_gb changed */
1645 sdebug_capacity = get_sdebug_capacity();
1646 memset(arr, 0, SDEBUG_READCAP_ARR_SZ);
1647 if (sdebug_capacity < 0xffffffff) {
1648 capac = (unsigned int)sdebug_capacity - 1;
1649 put_unaligned_be32(capac, arr + 0);
1650 } else
1651 put_unaligned_be32(0xffffffff, arr + 0);
1652 put_unaligned_be16(sdebug_sector_size, arr + 6);
1653 return fill_from_dev_buffer(scp, arr, SDEBUG_READCAP_ARR_SZ);
1654 }
1655
1656 #define SDEBUG_READCAP16_ARR_SZ 32
1657 static int resp_readcap16(struct scsi_cmnd *scp,
1658 struct sdebug_dev_info *devip)
1659 {
1660 unsigned char *cmd = scp->cmnd;
1661 unsigned char arr[SDEBUG_READCAP16_ARR_SZ];
1662 int alloc_len;
1663
1664 alloc_len = get_unaligned_be32(cmd + 10);
1665 /* following just in case virtual_gb changed */
1666 sdebug_capacity = get_sdebug_capacity();
1667 memset(arr, 0, SDEBUG_READCAP16_ARR_SZ);
1668 put_unaligned_be64((u64)(sdebug_capacity - 1), arr + 0);
1669 put_unaligned_be32(sdebug_sector_size, arr + 8);
1670 arr[13] = sdebug_physblk_exp & 0xf;
1671 arr[14] = (sdebug_lowest_aligned >> 8) & 0x3f;
1672
1673 if (scsi_debug_lbp()) {
1674 arr[14] |= 0x80; /* LBPME */
1675 /* from sbc4r07, this LBPRZ field is 1 bit, but the LBPRZ in
1676 * the LB Provisioning VPD page is 3 bits. Note that lbprz=2
1677 * in the wider field maps to 0 in this field.
1678 */
1679 if (sdebug_lbprz & 1) /* precisely what the draft requires */
1680 arr[14] |= 0x40;
1681 }
1682
1683 arr[15] = sdebug_lowest_aligned & 0xff;
1684
1685 if (have_dif_prot) {
1686 arr[12] = (sdebug_dif - 1) << 1; /* P_TYPE */
1687 arr[12] |= 1; /* PROT_EN */
1688 }
1689
1690 return fill_from_dev_buffer(scp, arr,
1691 min(alloc_len, SDEBUG_READCAP16_ARR_SZ));
1692 }
1693
1694 #define SDEBUG_MAX_TGTPGS_ARR_SZ 1412
1695
1696 static int resp_report_tgtpgs(struct scsi_cmnd *scp,
1697 struct sdebug_dev_info *devip)
1698 {
1699 unsigned char *cmd = scp->cmnd;
1700 unsigned char *arr;
1701 int host_no = devip->sdbg_host->shost->host_no;
1702 int n, ret, alen, rlen;
1703 int port_group_a, port_group_b, port_a, port_b;
1704
1705 alen = get_unaligned_be32(cmd + 6);
1706 arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_ATOMIC);
1707 if (! arr)
1708 return DID_REQUEUE << 16;
1709 /*
1710 * EVPD page 0x88 states we have two ports, one
1711 * real and a fake port with no device connected.
1712 * So we create two port groups with one port each
1713 * and set the group with port B to unavailable.
1714 */
1715 port_a = 0x1; /* relative port A */
1716 port_b = 0x2; /* relative port B */
1717 port_group_a = (((host_no + 1) & 0x7f) << 8) +
1718 (devip->channel & 0x7f);
1719 port_group_b = (((host_no + 1) & 0x7f) << 8) +
1720 (devip->channel & 0x7f) + 0x80;
1721
1722 /*
1723 * The asymmetric access state is cycled according to the host_id.
1724 */
1725 n = 4;
1726 if (sdebug_vpd_use_hostno == 0) {
1727 arr[n++] = host_no % 3; /* Asymm access state */
1728 arr[n++] = 0x0F; /* claim: all states are supported */
1729 } else {
1730 arr[n++] = 0x0; /* Active/Optimized path */
1731 arr[n++] = 0x01; /* only support active/optimized paths */
1732 }
1733 put_unaligned_be16(port_group_a, arr + n);
1734 n += 2;
1735 arr[n++] = 0; /* Reserved */
1736 arr[n++] = 0; /* Status code */
1737 arr[n++] = 0; /* Vendor unique */
1738 arr[n++] = 0x1; /* One port per group */
1739 arr[n++] = 0; /* Reserved */
1740 arr[n++] = 0; /* Reserved */
1741 put_unaligned_be16(port_a, arr + n);
1742 n += 2;
1743 arr[n++] = 3; /* Port unavailable */
1744 arr[n++] = 0x08; /* claim: only unavailalbe paths are supported */
1745 put_unaligned_be16(port_group_b, arr + n);
1746 n += 2;
1747 arr[n++] = 0; /* Reserved */
1748 arr[n++] = 0; /* Status code */
1749 arr[n++] = 0; /* Vendor unique */
1750 arr[n++] = 0x1; /* One port per group */
1751 arr[n++] = 0; /* Reserved */
1752 arr[n++] = 0; /* Reserved */
1753 put_unaligned_be16(port_b, arr + n);
1754 n += 2;
1755
1756 rlen = n - 4;
1757 put_unaligned_be32(rlen, arr + 0);
1758
1759 /*
1760 * Return the smallest value of either
1761 * - The allocated length
1762 * - The constructed command length
1763 * - The maximum array size
1764 */
1765 rlen = min(alen,n);
1766 ret = fill_from_dev_buffer(scp, arr,
1767 min(rlen, SDEBUG_MAX_TGTPGS_ARR_SZ));
1768 kfree(arr);
1769 return ret;
1770 }
1771
1772 static int resp_rsup_opcodes(struct scsi_cmnd *scp,
1773 struct sdebug_dev_info *devip)
1774 {
1775 bool rctd;
1776 u8 reporting_opts, req_opcode, sdeb_i, supp;
1777 u16 req_sa, u;
1778 u32 alloc_len, a_len;
1779 int k, offset, len, errsts, count, bump, na;
1780 const struct opcode_info_t *oip;
1781 const struct opcode_info_t *r_oip;
1782 u8 *arr;
1783 u8 *cmd = scp->cmnd;
1784
1785 rctd = !!(cmd[2] & 0x80);
1786 reporting_opts = cmd[2] & 0x7;
1787 req_opcode = cmd[3];
1788 req_sa = get_unaligned_be16(cmd + 4);
1789 alloc_len = get_unaligned_be32(cmd + 6);
1790 if (alloc_len < 4 || alloc_len > 0xffff) {
1791 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1);
1792 return check_condition_result;
1793 }
1794 if (alloc_len > 8192)
1795 a_len = 8192;
1796 else
1797 a_len = alloc_len;
1798 arr = kzalloc((a_len < 256) ? 320 : a_len + 64, GFP_ATOMIC);
1799 if (NULL == arr) {
1800 mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
1801 INSUFF_RES_ASCQ);
1802 return check_condition_result;
1803 }
1804 switch (reporting_opts) {
1805 case 0: /* all commands */
1806 /* count number of commands */
1807 for (count = 0, oip = opcode_info_arr;
1808 oip->num_attached != 0xff; ++oip) {
1809 if (F_INV_OP & oip->flags)
1810 continue;
1811 count += (oip->num_attached + 1);
1812 }
1813 bump = rctd ? 20 : 8;
1814 put_unaligned_be32(count * bump, arr);
1815 for (offset = 4, oip = opcode_info_arr;
1816 oip->num_attached != 0xff && offset < a_len; ++oip) {
1817 if (F_INV_OP & oip->flags)
1818 continue;
1819 na = oip->num_attached;
1820 arr[offset] = oip->opcode;
1821 put_unaligned_be16(oip->sa, arr + offset + 2);
1822 if (rctd)
1823 arr[offset + 5] |= 0x2;
1824 if (FF_SA & oip->flags)
1825 arr[offset + 5] |= 0x1;
1826 put_unaligned_be16(oip->len_mask[0], arr + offset + 6);
1827 if (rctd)
1828 put_unaligned_be16(0xa, arr + offset + 8);
1829 r_oip = oip;
1830 for (k = 0, oip = oip->arrp; k < na; ++k, ++oip) {
1831 if (F_INV_OP & oip->flags)
1832 continue;
1833 offset += bump;
1834 arr[offset] = oip->opcode;
1835 put_unaligned_be16(oip->sa, arr + offset + 2);
1836 if (rctd)
1837 arr[offset + 5] |= 0x2;
1838 if (FF_SA & oip->flags)
1839 arr[offset + 5] |= 0x1;
1840 put_unaligned_be16(oip->len_mask[0],
1841 arr + offset + 6);
1842 if (rctd)
1843 put_unaligned_be16(0xa,
1844 arr + offset + 8);
1845 }
1846 oip = r_oip;
1847 offset += bump;
1848 }
1849 break;
1850 case 1: /* one command: opcode only */
1851 case 2: /* one command: opcode plus service action */
1852 case 3: /* one command: if sa==0 then opcode only else opcode+sa */
1853 sdeb_i = opcode_ind_arr[req_opcode];
1854 oip = &opcode_info_arr[sdeb_i];
1855 if (F_INV_OP & oip->flags) {
1856 supp = 1;
1857 offset = 4;
1858 } else {
1859 if (1 == reporting_opts) {
1860 if (FF_SA & oip->flags) {
1861 mk_sense_invalid_fld(scp, SDEB_IN_CDB,
1862 2, 2);
1863 kfree(arr);
1864 return check_condition_result;
1865 }
1866 req_sa = 0;
1867 } else if (2 == reporting_opts &&
1868 0 == (FF_SA & oip->flags)) {
1869 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 4, -1);
1870 kfree(arr); /* point at requested sa */
1871 return check_condition_result;
1872 }
1873 if (0 == (FF_SA & oip->flags) &&
1874 req_opcode == oip->opcode)
1875 supp = 3;
1876 else if (0 == (FF_SA & oip->flags)) {
1877 na = oip->num_attached;
1878 for (k = 0, oip = oip->arrp; k < na;
1879 ++k, ++oip) {
1880 if (req_opcode == oip->opcode)
1881 break;
1882 }
1883 supp = (k >= na) ? 1 : 3;
1884 } else if (req_sa != oip->sa) {
1885 na = oip->num_attached;
1886 for (k = 0, oip = oip->arrp; k < na;
1887 ++k, ++oip) {
1888 if (req_sa == oip->sa)
1889 break;
1890 }
1891 supp = (k >= na) ? 1 : 3;
1892 } else
1893 supp = 3;
1894 if (3 == supp) {
1895 u = oip->len_mask[0];
1896 put_unaligned_be16(u, arr + 2);
1897 arr[4] = oip->opcode;
1898 for (k = 1; k < u; ++k)
1899 arr[4 + k] = (k < 16) ?
1900 oip->len_mask[k] : 0xff;
1901 offset = 4 + u;
1902 } else
1903 offset = 4;
1904 }
1905 arr[1] = (rctd ? 0x80 : 0) | supp;
1906 if (rctd) {
1907 put_unaligned_be16(0xa, arr + offset);
1908 offset += 12;
1909 }
1910 break;
1911 default:
1912 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 2);
1913 kfree(arr);
1914 return check_condition_result;
1915 }
1916 offset = (offset < a_len) ? offset : a_len;
1917 len = (offset < alloc_len) ? offset : alloc_len;
1918 errsts = fill_from_dev_buffer(scp, arr, len);
1919 kfree(arr);
1920 return errsts;
1921 }
1922
1923 static int resp_rsup_tmfs(struct scsi_cmnd *scp,
1924 struct sdebug_dev_info *devip)
1925 {
1926 bool repd;
1927 u32 alloc_len, len;
1928 u8 arr[16];
1929 u8 *cmd = scp->cmnd;
1930
1931 memset(arr, 0, sizeof(arr));
1932 repd = !!(cmd[2] & 0x80);
1933 alloc_len = get_unaligned_be32(cmd + 6);
1934 if (alloc_len < 4) {
1935 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1);
1936 return check_condition_result;
1937 }
1938 arr[0] = 0xc8; /* ATS | ATSS | LURS */
1939 arr[1] = 0x1; /* ITNRS */
1940 if (repd) {
1941 arr[3] = 0xc;
1942 len = 16;
1943 } else
1944 len = 4;
1945
1946 len = (len < alloc_len) ? len : alloc_len;
1947 return fill_from_dev_buffer(scp, arr, len);
1948 }
1949
1950 /* <<Following mode page info copied from ST318451LW>> */
1951
1952 static int resp_err_recov_pg(unsigned char *p, int pcontrol, int target)
1953 { /* Read-Write Error Recovery page for mode_sense */
1954 unsigned char err_recov_pg[] = {0x1, 0xa, 0xc0, 11, 240, 0, 0, 0,
1955 5, 0, 0xff, 0xff};
1956
1957 memcpy(p, err_recov_pg, sizeof(err_recov_pg));
1958 if (1 == pcontrol)
1959 memset(p + 2, 0, sizeof(err_recov_pg) - 2);
1960 return sizeof(err_recov_pg);
1961 }
1962
1963 static int resp_disconnect_pg(unsigned char *p, int pcontrol, int target)
1964 { /* Disconnect-Reconnect page for mode_sense */
1965 unsigned char disconnect_pg[] = {0x2, 0xe, 128, 128, 0, 10, 0, 0,
1966 0, 0, 0, 0, 0, 0, 0, 0};
1967
1968 memcpy(p, disconnect_pg, sizeof(disconnect_pg));
1969 if (1 == pcontrol)
1970 memset(p + 2, 0, sizeof(disconnect_pg) - 2);
1971 return sizeof(disconnect_pg);
1972 }
1973
1974 static int resp_format_pg(unsigned char *p, int pcontrol, int target)
1975 { /* Format device page for mode_sense */
1976 unsigned char format_pg[] = {0x3, 0x16, 0, 0, 0, 0, 0, 0,
1977 0, 0, 0, 0, 0, 0, 0, 0,
1978 0, 0, 0, 0, 0x40, 0, 0, 0};
1979
1980 memcpy(p, format_pg, sizeof(format_pg));
1981 put_unaligned_be16(sdebug_sectors_per, p + 10);
1982 put_unaligned_be16(sdebug_sector_size, p + 12);
1983 if (sdebug_removable)
1984 p[20] |= 0x20; /* should agree with INQUIRY */
1985 if (1 == pcontrol)
1986 memset(p + 2, 0, sizeof(format_pg) - 2);
1987 return sizeof(format_pg);
1988 }
1989
1990 static unsigned char caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
1991 0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0,
1992 0, 0, 0, 0};
1993
1994 static int resp_caching_pg(unsigned char *p, int pcontrol, int target)
1995 { /* Caching page for mode_sense */
1996 unsigned char ch_caching_pg[] = {/* 0x8, 18, */ 0x4, 0, 0, 0, 0, 0,
1997 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1998 unsigned char d_caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
1999 0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0, 0, 0, 0, 0};
2000
2001 if (SDEBUG_OPT_N_WCE & sdebug_opts)
2002 caching_pg[2] &= ~0x4; /* set WCE=0 (default WCE=1) */
2003 memcpy(p, caching_pg, sizeof(caching_pg));
2004 if (1 == pcontrol)
2005 memcpy(p + 2, ch_caching_pg, sizeof(ch_caching_pg));
2006 else if (2 == pcontrol)
2007 memcpy(p, d_caching_pg, sizeof(d_caching_pg));
2008 return sizeof(caching_pg);
2009 }
2010
2011 static unsigned char ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
2012 0, 0, 0x2, 0x4b};
2013
2014 static int resp_ctrl_m_pg(unsigned char *p, int pcontrol, int target)
2015 { /* Control mode page for mode_sense */
2016 unsigned char ch_ctrl_m_pg[] = {/* 0xa, 10, */ 0x6, 0, 0, 0, 0, 0,
2017 0, 0, 0, 0};
2018 unsigned char d_ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
2019 0, 0, 0x2, 0x4b};
2020
2021 if (sdebug_dsense)
2022 ctrl_m_pg[2] |= 0x4;
2023 else
2024 ctrl_m_pg[2] &= ~0x4;
2025
2026 if (sdebug_ato)
2027 ctrl_m_pg[5] |= 0x80; /* ATO=1 */
2028
2029 memcpy(p, ctrl_m_pg, sizeof(ctrl_m_pg));
2030 if (1 == pcontrol)
2031 memcpy(p + 2, ch_ctrl_m_pg, sizeof(ch_ctrl_m_pg));
2032 else if (2 == pcontrol)
2033 memcpy(p, d_ctrl_m_pg, sizeof(d_ctrl_m_pg));
2034 return sizeof(ctrl_m_pg);
2035 }
2036
2037
2038 static int resp_iec_m_pg(unsigned char *p, int pcontrol, int target)
2039 { /* Informational Exceptions control mode page for mode_sense */
2040 unsigned char ch_iec_m_pg[] = {/* 0x1c, 0xa, */ 0x4, 0xf, 0, 0, 0, 0,
2041 0, 0, 0x0, 0x0};
2042 unsigned char d_iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
2043 0, 0, 0x0, 0x0};
2044
2045 memcpy(p, iec_m_pg, sizeof(iec_m_pg));
2046 if (1 == pcontrol)
2047 memcpy(p + 2, ch_iec_m_pg, sizeof(ch_iec_m_pg));
2048 else if (2 == pcontrol)
2049 memcpy(p, d_iec_m_pg, sizeof(d_iec_m_pg));
2050 return sizeof(iec_m_pg);
2051 }
2052
2053 static int resp_sas_sf_m_pg(unsigned char *p, int pcontrol, int target)
2054 { /* SAS SSP mode page - short format for mode_sense */
2055 unsigned char sas_sf_m_pg[] = {0x19, 0x6,
2056 0x6, 0x0, 0x7, 0xd0, 0x0, 0x0};
2057
2058 memcpy(p, sas_sf_m_pg, sizeof(sas_sf_m_pg));
2059 if (1 == pcontrol)
2060 memset(p + 2, 0, sizeof(sas_sf_m_pg) - 2);
2061 return sizeof(sas_sf_m_pg);
2062 }
2063
2064
2065 static int resp_sas_pcd_m_spg(unsigned char *p, int pcontrol, int target,
2066 int target_dev_id)
2067 { /* SAS phy control and discover mode page for mode_sense */
2068 unsigned char sas_pcd_m_pg[] = {0x59, 0x1, 0, 0x64, 0, 0x6, 0, 2,
2069 0, 0, 0, 0, 0x10, 0x9, 0x8, 0x0,
2070 0, 0, 0, 0, 0, 0, 0, 0, /* insert SAS addr */
2071 0, 0, 0, 0, 0, 0, 0, 0, /* insert SAS addr */
2072 0x2, 0, 0, 0, 0, 0, 0, 0,
2073 0x88, 0x99, 0, 0, 0, 0, 0, 0,
2074 0, 0, 0, 0, 0, 0, 0, 0,
2075 0, 1, 0, 0, 0x10, 0x9, 0x8, 0x0,
2076 0, 0, 0, 0, 0, 0, 0, 0, /* insert SAS addr */
2077 0, 0, 0, 0, 0, 0, 0, 0, /* insert SAS addr */
2078 0x3, 0, 0, 0, 0, 0, 0, 0,
2079 0x88, 0x99, 0, 0, 0, 0, 0, 0,
2080 0, 0, 0, 0, 0, 0, 0, 0,
2081 };
2082 int port_a, port_b;
2083
2084 put_unaligned_be64(naa3_comp_a, sas_pcd_m_pg + 16);
2085 put_unaligned_be64(naa3_comp_c + 1, sas_pcd_m_pg + 24);
2086 put_unaligned_be64(naa3_comp_a, sas_pcd_m_pg + 64);
2087 put_unaligned_be64(naa3_comp_c + 1, sas_pcd_m_pg + 72);
2088 port_a = target_dev_id + 1;
2089 port_b = port_a + 1;
2090 memcpy(p, sas_pcd_m_pg, sizeof(sas_pcd_m_pg));
2091 put_unaligned_be32(port_a, p + 20);
2092 put_unaligned_be32(port_b, p + 48 + 20);
2093 if (1 == pcontrol)
2094 memset(p + 4, 0, sizeof(sas_pcd_m_pg) - 4);
2095 return sizeof(sas_pcd_m_pg);
2096 }
2097
2098 static int resp_sas_sha_m_spg(unsigned char *p, int pcontrol)
2099 { /* SAS SSP shared protocol specific port mode subpage */
2100 unsigned char sas_sha_m_pg[] = {0x59, 0x2, 0, 0xc, 0, 0x6, 0x10, 0,
2101 0, 0, 0, 0, 0, 0, 0, 0,
2102 };
2103
2104 memcpy(p, sas_sha_m_pg, sizeof(sas_sha_m_pg));
2105 if (1 == pcontrol)
2106 memset(p + 4, 0, sizeof(sas_sha_m_pg) - 4);
2107 return sizeof(sas_sha_m_pg);
2108 }
2109
2110 #define SDEBUG_MAX_MSENSE_SZ 256
2111
2112 static int resp_mode_sense(struct scsi_cmnd *scp,
2113 struct sdebug_dev_info *devip)
2114 {
2115 int pcontrol, pcode, subpcode, bd_len;
2116 unsigned char dev_spec;
2117 int alloc_len, offset, len, target_dev_id;
2118 int target = scp->device->id;
2119 unsigned char *ap;
2120 unsigned char arr[SDEBUG_MAX_MSENSE_SZ];
2121 unsigned char *cmd = scp->cmnd;
2122 bool dbd, llbaa, msense_6, is_disk, bad_pcode;
2123
2124 dbd = !!(cmd[1] & 0x8); /* disable block descriptors */
2125 pcontrol = (cmd[2] & 0xc0) >> 6;
2126 pcode = cmd[2] & 0x3f;
2127 subpcode = cmd[3];
2128 msense_6 = (MODE_SENSE == cmd[0]);
2129 llbaa = msense_6 ? false : !!(cmd[1] & 0x10);
2130 is_disk = (sdebug_ptype == TYPE_DISK);
2131 if (is_disk && !dbd)
2132 bd_len = llbaa ? 16 : 8;
2133 else
2134 bd_len = 0;
2135 alloc_len = msense_6 ? cmd[4] : get_unaligned_be16(cmd + 7);
2136 memset(arr, 0, SDEBUG_MAX_MSENSE_SZ);
2137 if (0x3 == pcontrol) { /* Saving values not supported */
2138 mk_sense_buffer(scp, ILLEGAL_REQUEST, SAVING_PARAMS_UNSUP, 0);
2139 return check_condition_result;
2140 }
2141 target_dev_id = ((devip->sdbg_host->shost->host_no + 1) * 2000) +
2142 (devip->target * 1000) - 3;
2143 /* for disks set DPOFUA bit and clear write protect (WP) bit */
2144 if (is_disk) {
2145 dev_spec = 0x10; /* =0x90 if WP=1 implies read-only */
2146 if (sdebug_wp)
2147 dev_spec |= 0x80;
2148 } else
2149 dev_spec = 0x0;
2150 if (msense_6) {
2151 arr[2] = dev_spec;
2152 arr[3] = bd_len;
2153 offset = 4;
2154 } else {
2155 arr[3] = dev_spec;
2156 if (16 == bd_len)
2157 arr[4] = 0x1; /* set LONGLBA bit */
2158 arr[7] = bd_len; /* assume 255 or less */
2159 offset = 8;
2160 }
2161 ap = arr + offset;
2162 if ((bd_len > 0) && (!sdebug_capacity))
2163 sdebug_capacity = get_sdebug_capacity();
2164
2165 if (8 == bd_len) {
2166 if (sdebug_capacity > 0xfffffffe)
2167 put_unaligned_be32(0xffffffff, ap + 0);
2168 else
2169 put_unaligned_be32(sdebug_capacity, ap + 0);
2170 put_unaligned_be16(sdebug_sector_size, ap + 6);
2171 offset += bd_len;
2172 ap = arr + offset;
2173 } else if (16 == bd_len) {
2174 put_unaligned_be64((u64)sdebug_capacity, ap + 0);
2175 put_unaligned_be32(sdebug_sector_size, ap + 12);
2176 offset += bd_len;
2177 ap = arr + offset;
2178 }
2179
2180 if ((subpcode > 0x0) && (subpcode < 0xff) && (0x19 != pcode)) {
2181 /* TODO: Control Extension page */
2182 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
2183 return check_condition_result;
2184 }
2185 bad_pcode = false;
2186
2187 switch (pcode) {
2188 case 0x1: /* Read-Write error recovery page, direct access */
2189 len = resp_err_recov_pg(ap, pcontrol, target);
2190 offset += len;
2191 break;
2192 case 0x2: /* Disconnect-Reconnect page, all devices */
2193 len = resp_disconnect_pg(ap, pcontrol, target);
2194 offset += len;
2195 break;
2196 case 0x3: /* Format device page, direct access */
2197 if (is_disk) {
2198 len = resp_format_pg(ap, pcontrol, target);
2199 offset += len;
2200 } else
2201 bad_pcode = true;
2202 break;
2203 case 0x8: /* Caching page, direct access */
2204 if (is_disk) {
2205 len = resp_caching_pg(ap, pcontrol, target);
2206 offset += len;
2207 } else
2208 bad_pcode = true;
2209 break;
2210 case 0xa: /* Control Mode page, all devices */
2211 len = resp_ctrl_m_pg(ap, pcontrol, target);
2212 offset += len;
2213 break;
2214 case 0x19: /* if spc==1 then sas phy, control+discover */
2215 if ((subpcode > 0x2) && (subpcode < 0xff)) {
2216 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
2217 return check_condition_result;
2218 }
2219 len = 0;
2220 if ((0x0 == subpcode) || (0xff == subpcode))
2221 len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
2222 if ((0x1 == subpcode) || (0xff == subpcode))
2223 len += resp_sas_pcd_m_spg(ap + len, pcontrol, target,
2224 target_dev_id);
2225 if ((0x2 == subpcode) || (0xff == subpcode))
2226 len += resp_sas_sha_m_spg(ap + len, pcontrol);
2227 offset += len;
2228 break;
2229 case 0x1c: /* Informational Exceptions Mode page, all devices */
2230 len = resp_iec_m_pg(ap, pcontrol, target);
2231 offset += len;
2232 break;
2233 case 0x3f: /* Read all Mode pages */
2234 if ((0 == subpcode) || (0xff == subpcode)) {
2235 len = resp_err_recov_pg(ap, pcontrol, target);
2236 len += resp_disconnect_pg(ap + len, pcontrol, target);
2237 if (is_disk) {
2238 len += resp_format_pg(ap + len, pcontrol,
2239 target);
2240 len += resp_caching_pg(ap + len, pcontrol,
2241 target);
2242 }
2243 len += resp_ctrl_m_pg(ap + len, pcontrol, target);
2244 len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
2245 if (0xff == subpcode) {
2246 len += resp_sas_pcd_m_spg(ap + len, pcontrol,
2247 target, target_dev_id);
2248 len += resp_sas_sha_m_spg(ap + len, pcontrol);
2249 }
2250 len += resp_iec_m_pg(ap + len, pcontrol, target);
2251 offset += len;
2252 } else {
2253 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
2254 return check_condition_result;
2255 }
2256 break;
2257 default:
2258 bad_pcode = true;
2259 break;
2260 }
2261 if (bad_pcode) {
2262 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 5);
2263 return check_condition_result;
2264 }
2265 if (msense_6)
2266 arr[0] = offset - 1;
2267 else
2268 put_unaligned_be16((offset - 2), arr + 0);
2269 return fill_from_dev_buffer(scp, arr, min(alloc_len, offset));
2270 }
2271
2272 #define SDEBUG_MAX_MSELECT_SZ 512
2273
2274 static int resp_mode_select(struct scsi_cmnd *scp,
2275 struct sdebug_dev_info *devip)
2276 {
2277 int pf, sp, ps, md_len, bd_len, off, spf, pg_len;
2278 int param_len, res, mpage;
2279 unsigned char arr[SDEBUG_MAX_MSELECT_SZ];
2280 unsigned char *cmd = scp->cmnd;
2281 int mselect6 = (MODE_SELECT == cmd[0]);
2282
2283 memset(arr, 0, sizeof(arr));
2284 pf = cmd[1] & 0x10;
2285 sp = cmd[1] & 0x1;
2286 param_len = mselect6 ? cmd[4] : get_unaligned_be16(cmd + 7);
2287 if ((0 == pf) || sp || (param_len > SDEBUG_MAX_MSELECT_SZ)) {
2288 mk_sense_invalid_fld(scp, SDEB_IN_CDB, mselect6 ? 4 : 7, -1);
2289 return check_condition_result;
2290 }
2291 res = fetch_to_dev_buffer(scp, arr, param_len);
2292 if (-1 == res)
2293 return DID_ERROR << 16;
2294 else if (sdebug_verbose && (res < param_len))
2295 sdev_printk(KERN_INFO, scp->device,
2296 "%s: cdb indicated=%d, IO sent=%d bytes\n",
2297 __func__, param_len, res);
2298 md_len = mselect6 ? (arr[0] + 1) : (get_unaligned_be16(arr + 0) + 2);
2299 bd_len = mselect6 ? arr[3] : get_unaligned_be16(arr + 6);
2300 if (md_len > 2) {
2301 mk_sense_invalid_fld(scp, SDEB_IN_DATA, 0, -1);
2302 return check_condition_result;
2303 }
2304 off = bd_len + (mselect6 ? 4 : 8);
2305 mpage = arr[off] & 0x3f;
2306 ps = !!(arr[off] & 0x80);
2307 if (ps) {
2308 mk_sense_invalid_fld(scp, SDEB_IN_DATA, off, 7);
2309 return check_condition_result;
2310 }
2311 spf = !!(arr[off] & 0x40);
2312 pg_len = spf ? (get_unaligned_be16(arr + off + 2) + 4) :
2313 (arr[off + 1] + 2);
2314 if ((pg_len + off) > param_len) {
2315 mk_sense_buffer(scp, ILLEGAL_REQUEST,
2316 PARAMETER_LIST_LENGTH_ERR, 0);
2317 return check_condition_result;
2318 }
2319 switch (mpage) {
2320 case 0x8: /* Caching Mode page */
2321 if (caching_pg[1] == arr[off + 1]) {
2322 memcpy(caching_pg + 2, arr + off + 2,
2323 sizeof(caching_pg) - 2);
2324 goto set_mode_changed_ua;
2325 }
2326 break;
2327 case 0xa: /* Control Mode page */
2328 if (ctrl_m_pg[1] == arr[off + 1]) {
2329 memcpy(ctrl_m_pg + 2, arr + off + 2,
2330 sizeof(ctrl_m_pg) - 2);
2331 if (ctrl_m_pg[4] & 0x8)
2332 sdebug_wp = true;
2333 else
2334 sdebug_wp = false;
2335 sdebug_dsense = !!(ctrl_m_pg[2] & 0x4);
2336 goto set_mode_changed_ua;
2337 }
2338 break;
2339 case 0x1c: /* Informational Exceptions Mode page */
2340 if (iec_m_pg[1] == arr[off + 1]) {
2341 memcpy(iec_m_pg + 2, arr + off + 2,
2342 sizeof(iec_m_pg) - 2);
2343 goto set_mode_changed_ua;
2344 }
2345 break;
2346 default:
2347 break;
2348 }
2349 mk_sense_invalid_fld(scp, SDEB_IN_DATA, off, 5);
2350 return check_condition_result;
2351 set_mode_changed_ua:
2352 set_bit(SDEBUG_UA_MODE_CHANGED, devip->uas_bm);
2353 return 0;
2354 }
2355
2356 static int resp_temp_l_pg(unsigned char *arr)
2357 {
2358 unsigned char temp_l_pg[] = {0x0, 0x0, 0x3, 0x2, 0x0, 38,
2359 0x0, 0x1, 0x3, 0x2, 0x0, 65,
2360 };
2361
2362 memcpy(arr, temp_l_pg, sizeof(temp_l_pg));
2363 return sizeof(temp_l_pg);
2364 }
2365
2366 static int resp_ie_l_pg(unsigned char *arr)
2367 {
2368 unsigned char ie_l_pg[] = {0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 38,
2369 };
2370
2371 memcpy(arr, ie_l_pg, sizeof(ie_l_pg));
2372 if (iec_m_pg[2] & 0x4) { /* TEST bit set */
2373 arr[4] = THRESHOLD_EXCEEDED;
2374 arr[5] = 0xff;
2375 }
2376 return sizeof(ie_l_pg);
2377 }
2378
2379 #define SDEBUG_MAX_LSENSE_SZ 512
2380
2381 static int resp_log_sense(struct scsi_cmnd *scp,
2382 struct sdebug_dev_info *devip)
2383 {
2384 int ppc, sp, pcode, subpcode, alloc_len, len, n;
2385 unsigned char arr[SDEBUG_MAX_LSENSE_SZ];
2386 unsigned char *cmd = scp->cmnd;
2387
2388 memset(arr, 0, sizeof(arr));
2389 ppc = cmd[1] & 0x2;
2390 sp = cmd[1] & 0x1;
2391 if (ppc || sp) {
2392 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, ppc ? 1 : 0);
2393 return check_condition_result;
2394 }
2395 pcode = cmd[2] & 0x3f;
2396 subpcode = cmd[3] & 0xff;
2397 alloc_len = get_unaligned_be16(cmd + 7);
2398 arr[0] = pcode;
2399 if (0 == subpcode) {
2400 switch (pcode) {
2401 case 0x0: /* Supported log pages log page */
2402 n = 4;
2403 arr[n++] = 0x0; /* this page */
2404 arr[n++] = 0xd; /* Temperature */
2405 arr[n++] = 0x2f; /* Informational exceptions */
2406 arr[3] = n - 4;
2407 break;
2408 case 0xd: /* Temperature log page */
2409 arr[3] = resp_temp_l_pg(arr + 4);
2410 break;
2411 case 0x2f: /* Informational exceptions log page */
2412 arr[3] = resp_ie_l_pg(arr + 4);
2413 break;
2414 default:
2415 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 5);
2416 return check_condition_result;
2417 }
2418 } else if (0xff == subpcode) {
2419 arr[0] |= 0x40;
2420 arr[1] = subpcode;
2421 switch (pcode) {
2422 case 0x0: /* Supported log pages and subpages log page */
2423 n = 4;
2424 arr[n++] = 0x0;
2425 arr[n++] = 0x0; /* 0,0 page */
2426 arr[n++] = 0x0;
2427 arr[n++] = 0xff; /* this page */
2428 arr[n++] = 0xd;
2429 arr[n++] = 0x0; /* Temperature */
2430 arr[n++] = 0x2f;
2431 arr[n++] = 0x0; /* Informational exceptions */
2432 arr[3] = n - 4;
2433 break;
2434 case 0xd: /* Temperature subpages */
2435 n = 4;
2436 arr[n++] = 0xd;
2437 arr[n++] = 0x0; /* Temperature */
2438 arr[3] = n - 4;
2439 break;
2440 case 0x2f: /* Informational exceptions subpages */
2441 n = 4;
2442 arr[n++] = 0x2f;
2443 arr[n++] = 0x0; /* Informational exceptions */
2444 arr[3] = n - 4;
2445 break;
2446 default:
2447 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, 5);
2448 return check_condition_result;
2449 }
2450 } else {
2451 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 3, -1);
2452 return check_condition_result;
2453 }
2454 len = min(get_unaligned_be16(arr + 2) + 4, alloc_len);
2455 return fill_from_dev_buffer(scp, arr,
2456 min(len, SDEBUG_MAX_INQ_ARR_SZ));
2457 }
2458
2459 static inline int check_device_access_params(struct scsi_cmnd *scp,
2460 unsigned long long lba, unsigned int num, bool write)
2461 {
2462 if (lba + num > sdebug_capacity) {
2463 mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
2464 return check_condition_result;
2465 }
2466 /* transfer length excessive (tie in to block limits VPD page) */
2467 if (num > sdebug_store_sectors) {
2468 /* needs work to find which cdb byte 'num' comes from */
2469 mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
2470 return check_condition_result;
2471 }
2472 if (write && unlikely(sdebug_wp)) {
2473 mk_sense_buffer(scp, DATA_PROTECT, WRITE_PROTECTED, 0x2);
2474 return check_condition_result;
2475 }
2476 return 0;
2477 }
2478
2479 /* Returns number of bytes copied or -1 if error. */
2480 static int do_device_access(struct scsi_cmnd *scmd, u32 sg_skip, u64 lba,
2481 u32 num, bool do_write)
2482 {
2483 int ret;
2484 u64 block, rest = 0;
2485 struct scsi_data_buffer *sdb = &scmd->sdb;
2486 enum dma_data_direction dir;
2487
2488 if (do_write) {
2489 dir = DMA_TO_DEVICE;
2490 write_since_sync = true;
2491 } else {
2492 dir = DMA_FROM_DEVICE;
2493 }
2494
2495 if (!sdb->length)
2496 return 0;
2497 if (scmd->sc_data_direction != dir)
2498 return -1;
2499
2500 block = do_div(lba, sdebug_store_sectors);
2501 if (block + num > sdebug_store_sectors)
2502 rest = block + num - sdebug_store_sectors;
2503
2504 ret = sg_copy_buffer(sdb->table.sgl, sdb->table.nents,
2505 fake_storep + (block * sdebug_sector_size),
2506 (num - rest) * sdebug_sector_size, sg_skip, do_write);
2507 if (ret != (num - rest) * sdebug_sector_size)
2508 return ret;
2509
2510 if (rest) {
2511 ret += sg_copy_buffer(sdb->table.sgl, sdb->table.nents,
2512 fake_storep, rest * sdebug_sector_size,
2513 sg_skip + ((num - rest) * sdebug_sector_size),
2514 do_write);
2515 }
2516
2517 return ret;
2518 }
2519
2520 /* If lba2fake_store(lba,num) compares equal to arr(num), then copy top half of
2521 * arr into lba2fake_store(lba,num) and return true. If comparison fails then
2522 * return false. */
2523 static bool comp_write_worker(u64 lba, u32 num, const u8 *arr)
2524 {
2525 bool res;
2526 u64 block, rest = 0;
2527 u32 store_blks = sdebug_store_sectors;
2528 u32 lb_size = sdebug_sector_size;
2529
2530 block = do_div(lba, store_blks);
2531 if (block + num > store_blks)
2532 rest = block + num - store_blks;
2533
2534 res = !memcmp(fake_storep + (block * lb_size), arr,
2535 (num - rest) * lb_size);
2536 if (!res)
2537 return res;
2538 if (rest)
2539 res = memcmp(fake_storep, arr + ((num - rest) * lb_size),
2540 rest * lb_size);
2541 if (!res)
2542 return res;
2543 arr += num * lb_size;
2544 memcpy(fake_storep + (block * lb_size), arr, (num - rest) * lb_size);
2545 if (rest)
2546 memcpy(fake_storep, arr + ((num - rest) * lb_size),
2547 rest * lb_size);
2548 return res;
2549 }
2550
2551 static __be16 dif_compute_csum(const void *buf, int len)
2552 {
2553 __be16 csum;
2554
2555 if (sdebug_guard)
2556 csum = (__force __be16)ip_compute_csum(buf, len);
2557 else
2558 csum = cpu_to_be16(crc_t10dif(buf, len));
2559
2560 return csum;
2561 }
2562
2563 static int dif_verify(struct t10_pi_tuple *sdt, const void *data,
2564 sector_t sector, u32 ei_lba)
2565 {
2566 __be16 csum = dif_compute_csum(data, sdebug_sector_size);
2567
2568 if (sdt->guard_tag != csum) {
2569 pr_err("GUARD check failed on sector %lu rcvd 0x%04x, data 0x%04x\n",
2570 (unsigned long)sector,
2571 be16_to_cpu(sdt->guard_tag),
2572 be16_to_cpu(csum));
2573 return 0x01;
2574 }
2575 if (sdebug_dif == T10_PI_TYPE1_PROTECTION &&
2576 be32_to_cpu(sdt->ref_tag) != (sector & 0xffffffff)) {
2577 pr_err("REF check failed on sector %lu\n",
2578 (unsigned long)sector);
2579 return 0x03;
2580 }
2581 if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
2582 be32_to_cpu(sdt->ref_tag) != ei_lba) {
2583 pr_err("REF check failed on sector %lu\n",
2584 (unsigned long)sector);
2585 return 0x03;
2586 }
2587 return 0;
2588 }
2589
2590 static void dif_copy_prot(struct scsi_cmnd *SCpnt, sector_t sector,
2591 unsigned int sectors, bool read)
2592 {
2593 size_t resid;
2594 void *paddr;
2595 const void *dif_store_end = dif_storep + sdebug_store_sectors;
2596 struct sg_mapping_iter miter;
2597
2598 /* Bytes of protection data to copy into sgl */
2599 resid = sectors * sizeof(*dif_storep);
2600
2601 sg_miter_start(&miter, scsi_prot_sglist(SCpnt),
2602 scsi_prot_sg_count(SCpnt), SG_MITER_ATOMIC |
2603 (read ? SG_MITER_TO_SG : SG_MITER_FROM_SG));
2604
2605 while (sg_miter_next(&miter) && resid > 0) {
2606 size_t len = min(miter.length, resid);
2607 void *start = dif_store(sector);
2608 size_t rest = 0;
2609
2610 if (dif_store_end < start + len)
2611 rest = start + len - dif_store_end;
2612
2613 paddr = miter.addr;
2614
2615 if (read)
2616 memcpy(paddr, start, len - rest);
2617 else
2618 memcpy(start, paddr, len - rest);
2619
2620 if (rest) {
2621 if (read)
2622 memcpy(paddr + len - rest, dif_storep, rest);
2623 else
2624 memcpy(dif_storep, paddr + len - rest, rest);
2625 }
2626
2627 sector += len / sizeof(*dif_storep);
2628 resid -= len;
2629 }
2630 sg_miter_stop(&miter);
2631 }
2632
2633 static int prot_verify_read(struct scsi_cmnd *SCpnt, sector_t start_sec,
2634 unsigned int sectors, u32 ei_lba)
2635 {
2636 unsigned int i;
2637 struct t10_pi_tuple *sdt;
2638 sector_t sector;
2639
2640 for (i = 0; i < sectors; i++, ei_lba++) {
2641 int ret;
2642
2643 sector = start_sec + i;
2644 sdt = dif_store(sector);
2645
2646 if (sdt->app_tag == cpu_to_be16(0xffff))
2647 continue;
2648
2649 ret = dif_verify(sdt, lba2fake_store(sector), sector, ei_lba);
2650 if (ret) {
2651 dif_errors++;
2652 return ret;
2653 }
2654 }
2655
2656 dif_copy_prot(SCpnt, start_sec, sectors, true);
2657 dix_reads++;
2658
2659 return 0;
2660 }
2661
2662 static int resp_read_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
2663 {
2664 u8 *cmd = scp->cmnd;
2665 struct sdebug_queued_cmd *sqcp;
2666 u64 lba;
2667 u32 num;
2668 u32 ei_lba;
2669 unsigned long iflags;
2670 int ret;
2671 bool check_prot;
2672
2673 switch (cmd[0]) {
2674 case READ_16:
2675 ei_lba = 0;
2676 lba = get_unaligned_be64(cmd + 2);
2677 num = get_unaligned_be32(cmd + 10);
2678 check_prot = true;
2679 break;
2680 case READ_10:
2681 ei_lba = 0;
2682 lba = get_unaligned_be32(cmd + 2);
2683 num = get_unaligned_be16(cmd + 7);
2684 check_prot = true;
2685 break;
2686 case READ_6:
2687 ei_lba = 0;
2688 lba = (u32)cmd[3] | (u32)cmd[2] << 8 |
2689 (u32)(cmd[1] & 0x1f) << 16;
2690 num = (0 == cmd[4]) ? 256 : cmd[4];
2691 check_prot = true;
2692 break;
2693 case READ_12:
2694 ei_lba = 0;
2695 lba = get_unaligned_be32(cmd + 2);
2696 num = get_unaligned_be32(cmd + 6);
2697 check_prot = true;
2698 break;
2699 case XDWRITEREAD_10:
2700 ei_lba = 0;
2701 lba = get_unaligned_be32(cmd + 2);
2702 num = get_unaligned_be16(cmd + 7);
2703 check_prot = false;
2704 break;
2705 default: /* assume READ(32) */
2706 lba = get_unaligned_be64(cmd + 12);
2707 ei_lba = get_unaligned_be32(cmd + 20);
2708 num = get_unaligned_be32(cmd + 28);
2709 check_prot = false;
2710 break;
2711 }
2712 if (unlikely(have_dif_prot && check_prot)) {
2713 if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
2714 (cmd[1] & 0xe0)) {
2715 mk_sense_invalid_opcode(scp);
2716 return check_condition_result;
2717 }
2718 if ((sdebug_dif == T10_PI_TYPE1_PROTECTION ||
2719 sdebug_dif == T10_PI_TYPE3_PROTECTION) &&
2720 (cmd[1] & 0xe0) == 0)
2721 sdev_printk(KERN_ERR, scp->device, "Unprotected RD "
2722 "to DIF device\n");
2723 }
2724 if (unlikely(sdebug_any_injecting_opt)) {
2725 sqcp = (struct sdebug_queued_cmd *)scp->host_scribble;
2726
2727 if (sqcp) {
2728 if (sqcp->inj_short)
2729 num /= 2;
2730 }
2731 } else
2732 sqcp = NULL;
2733
2734 ret = check_device_access_params(scp, lba, num, false);
2735 if (ret)
2736 return ret;
2737 if (unlikely((SDEBUG_OPT_MEDIUM_ERR & sdebug_opts) &&
2738 (lba <= (sdebug_medium_error_start + sdebug_medium_error_count - 1)) &&
2739 ((lba + num) > sdebug_medium_error_start))) {
2740 /* claim unrecoverable read error */
2741 mk_sense_buffer(scp, MEDIUM_ERROR, UNRECOVERED_READ_ERR, 0);
2742 /* set info field and valid bit for fixed descriptor */
2743 if (0x70 == (scp->sense_buffer[0] & 0x7f)) {
2744 scp->sense_buffer[0] |= 0x80; /* Valid bit */
2745 ret = (lba < OPT_MEDIUM_ERR_ADDR)
2746 ? OPT_MEDIUM_ERR_ADDR : (int)lba;
2747 put_unaligned_be32(ret, scp->sense_buffer + 3);
2748 }
2749 scsi_set_resid(scp, scsi_bufflen(scp));
2750 return check_condition_result;
2751 }
2752
2753 read_lock_irqsave(&atomic_rw, iflags);
2754
2755 /* DIX + T10 DIF */
2756 if (unlikely(sdebug_dix && scsi_prot_sg_count(scp))) {
2757 int prot_ret = prot_verify_read(scp, lba, num, ei_lba);
2758
2759 if (prot_ret) {
2760 read_unlock_irqrestore(&atomic_rw, iflags);
2761 mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, prot_ret);
2762 return illegal_condition_result;
2763 }
2764 }
2765
2766 ret = do_device_access(scp, 0, lba, num, false);
2767 read_unlock_irqrestore(&atomic_rw, iflags);
2768 if (unlikely(ret == -1))
2769 return DID_ERROR << 16;
2770
2771 scsi_set_resid(scp, scsi_bufflen(scp) - ret);
2772
2773 if (unlikely(sqcp)) {
2774 if (sqcp->inj_recovered) {
2775 mk_sense_buffer(scp, RECOVERED_ERROR,
2776 THRESHOLD_EXCEEDED, 0);
2777 return check_condition_result;
2778 } else if (sqcp->inj_transport) {
2779 mk_sense_buffer(scp, ABORTED_COMMAND,
2780 TRANSPORT_PROBLEM, ACK_NAK_TO);
2781 return check_condition_result;
2782 } else if (sqcp->inj_dif) {
2783 /* Logical block guard check failed */
2784 mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
2785 return illegal_condition_result;
2786 } else if (sqcp->inj_dix) {
2787 mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
2788 return illegal_condition_result;
2789 }
2790 }
2791 return 0;
2792 }
2793
2794 static void dump_sector(unsigned char *buf, int len)
2795 {
2796 int i, j, n;
2797
2798 pr_err(">>> Sector Dump <<<\n");
2799 for (i = 0 ; i < len ; i += 16) {
2800 char b[128];
2801
2802 for (j = 0, n = 0; j < 16; j++) {
2803 unsigned char c = buf[i+j];
2804
2805 if (c >= 0x20 && c < 0x7e)
2806 n += scnprintf(b + n, sizeof(b) - n,
2807 " %c ", buf[i+j]);
2808 else
2809 n += scnprintf(b + n, sizeof(b) - n,
2810 "%02x ", buf[i+j]);
2811 }
2812 pr_err("%04d: %s\n", i, b);
2813 }
2814 }
2815
2816 static int prot_verify_write(struct scsi_cmnd *SCpnt, sector_t start_sec,
2817 unsigned int sectors, u32 ei_lba)
2818 {
2819 int ret;
2820 struct t10_pi_tuple *sdt;
2821 void *daddr;
2822 sector_t sector = start_sec;
2823 int ppage_offset;
2824 int dpage_offset;
2825 struct sg_mapping_iter diter;
2826 struct sg_mapping_iter piter;
2827
2828 BUG_ON(scsi_sg_count(SCpnt) == 0);
2829 BUG_ON(scsi_prot_sg_count(SCpnt) == 0);
2830
2831 sg_miter_start(&piter, scsi_prot_sglist(SCpnt),
2832 scsi_prot_sg_count(SCpnt),
2833 SG_MITER_ATOMIC | SG_MITER_FROM_SG);
2834 sg_miter_start(&diter, scsi_sglist(SCpnt), scsi_sg_count(SCpnt),
2835 SG_MITER_ATOMIC | SG_MITER_FROM_SG);
2836
2837 /* For each protection page */
2838 while (sg_miter_next(&piter)) {
2839 dpage_offset = 0;
2840 if (WARN_ON(!sg_miter_next(&diter))) {
2841 ret = 0x01;
2842 goto out;
2843 }
2844
2845 for (ppage_offset = 0; ppage_offset < piter.length;
2846 ppage_offset += sizeof(struct t10_pi_tuple)) {
2847 /* If we're at the end of the current
2848 * data page advance to the next one
2849 */
2850 if (dpage_offset >= diter.length) {
2851 if (WARN_ON(!sg_miter_next(&diter))) {
2852 ret = 0x01;
2853 goto out;
2854 }
2855 dpage_offset = 0;
2856 }
2857
2858 sdt = piter.addr + ppage_offset;
2859 daddr = diter.addr + dpage_offset;
2860
2861 ret = dif_verify(sdt, daddr, sector, ei_lba);
2862 if (ret) {
2863 dump_sector(daddr, sdebug_sector_size);
2864 goto out;
2865 }
2866
2867 sector++;
2868 ei_lba++;
2869 dpage_offset += sdebug_sector_size;
2870 }
2871 diter.consumed = dpage_offset;
2872 sg_miter_stop(&diter);
2873 }
2874 sg_miter_stop(&piter);
2875
2876 dif_copy_prot(SCpnt, start_sec, sectors, false);
2877 dix_writes++;
2878
2879 return 0;
2880
2881 out:
2882 dif_errors++;
2883 sg_miter_stop(&diter);
2884 sg_miter_stop(&piter);
2885 return ret;
2886 }
2887
2888 static unsigned long lba_to_map_index(sector_t lba)
2889 {
2890 if (sdebug_unmap_alignment)
2891 lba += sdebug_unmap_granularity - sdebug_unmap_alignment;
2892 sector_div(lba, sdebug_unmap_granularity);
2893 return lba;
2894 }
2895
2896 static sector_t map_index_to_lba(unsigned long index)
2897 {
2898 sector_t lba = index * sdebug_unmap_granularity;
2899
2900 if (sdebug_unmap_alignment)
2901 lba -= sdebug_unmap_granularity - sdebug_unmap_alignment;
2902 return lba;
2903 }
2904
2905 static unsigned int map_state(sector_t lba, unsigned int *num)
2906 {
2907 sector_t end;
2908 unsigned int mapped;
2909 unsigned long index;
2910 unsigned long next;
2911
2912 index = lba_to_map_index(lba);
2913 mapped = test_bit(index, map_storep);
2914
2915 if (mapped)
2916 next = find_next_zero_bit(map_storep, map_size, index);
2917 else
2918 next = find_next_bit(map_storep, map_size, index);
2919
2920 end = min_t(sector_t, sdebug_store_sectors, map_index_to_lba(next));
2921 *num = end - lba;
2922 return mapped;
2923 }
2924
2925 static void map_region(sector_t lba, unsigned int len)
2926 {
2927 sector_t end = lba + len;
2928
2929 while (lba < end) {
2930 unsigned long index = lba_to_map_index(lba);
2931
2932 if (index < map_size)
2933 set_bit(index, map_storep);
2934
2935 lba = map_index_to_lba(index + 1);
2936 }
2937 }
2938
2939 static void unmap_region(sector_t lba, unsigned int len)
2940 {
2941 sector_t end = lba + len;
2942
2943 while (lba < end) {
2944 unsigned long index = lba_to_map_index(lba);
2945
2946 if (lba == map_index_to_lba(index) &&
2947 lba + sdebug_unmap_granularity <= end &&
2948 index < map_size) {
2949 clear_bit(index, map_storep);
2950 if (sdebug_lbprz) { /* for LBPRZ=2 return 0xff_s */
2951 memset(fake_storep +
2952 lba * sdebug_sector_size,
2953 (sdebug_lbprz & 1) ? 0 : 0xff,
2954 sdebug_sector_size *
2955 sdebug_unmap_granularity);
2956 }
2957 if (dif_storep) {
2958 memset(dif_storep + lba, 0xff,
2959 sizeof(*dif_storep) *
2960 sdebug_unmap_granularity);
2961 }
2962 }
2963 lba = map_index_to_lba(index + 1);
2964 }
2965 }
2966
2967 static int resp_write_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
2968 {
2969 u8 *cmd = scp->cmnd;
2970 u64 lba;
2971 u32 num;
2972 u32 ei_lba;
2973 unsigned long iflags;
2974 int ret;
2975 bool check_prot;
2976
2977 switch (cmd[0]) {
2978 case WRITE_16:
2979 ei_lba = 0;
2980 lba = get_unaligned_be64(cmd + 2);
2981 num = get_unaligned_be32(cmd + 10);
2982 check_prot = true;
2983 break;
2984 case WRITE_10:
2985 ei_lba = 0;
2986 lba = get_unaligned_be32(cmd + 2);
2987 num = get_unaligned_be16(cmd + 7);
2988 check_prot = true;
2989 break;
2990 case WRITE_6:
2991 ei_lba = 0;
2992 lba = (u32)cmd[3] | (u32)cmd[2] << 8 |
2993 (u32)(cmd[1] & 0x1f) << 16;
2994 num = (0 == cmd[4]) ? 256 : cmd[4];
2995 check_prot = true;
2996 break;
2997 case WRITE_12:
2998 ei_lba = 0;
2999 lba = get_unaligned_be32(cmd + 2);
3000 num = get_unaligned_be32(cmd + 6);
3001 check_prot = true;
3002 break;
3003 case 0x53: /* XDWRITEREAD(10) */
3004 ei_lba = 0;
3005 lba = get_unaligned_be32(cmd + 2);
3006 num = get_unaligned_be16(cmd + 7);
3007 check_prot = false;
3008 break;
3009 default: /* assume WRITE(32) */
3010 lba = get_unaligned_be64(cmd + 12);
3011 ei_lba = get_unaligned_be32(cmd + 20);
3012 num = get_unaligned_be32(cmd + 28);
3013 check_prot = false;
3014 break;
3015 }
3016 if (unlikely(have_dif_prot && check_prot)) {
3017 if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
3018 (cmd[1] & 0xe0)) {
3019 mk_sense_invalid_opcode(scp);
3020 return check_condition_result;
3021 }
3022 if ((sdebug_dif == T10_PI_TYPE1_PROTECTION ||
3023 sdebug_dif == T10_PI_TYPE3_PROTECTION) &&
3024 (cmd[1] & 0xe0) == 0)
3025 sdev_printk(KERN_ERR, scp->device, "Unprotected WR "
3026 "to DIF device\n");
3027 }
3028 ret = check_device_access_params(scp, lba, num, true);
3029 if (ret)
3030 return ret;
3031 write_lock_irqsave(&atomic_rw, iflags);
3032
3033 /* DIX + T10 DIF */
3034 if (unlikely(sdebug_dix && scsi_prot_sg_count(scp))) {
3035 int prot_ret = prot_verify_write(scp, lba, num, ei_lba);
3036
3037 if (prot_ret) {
3038 write_unlock_irqrestore(&atomic_rw, iflags);
3039 mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, prot_ret);
3040 return illegal_condition_result;
3041 }
3042 }
3043
3044 ret = do_device_access(scp, 0, lba, num, true);
3045 if (unlikely(scsi_debug_lbp()))
3046 map_region(lba, num);
3047 write_unlock_irqrestore(&atomic_rw, iflags);
3048 if (unlikely(-1 == ret))
3049 return DID_ERROR << 16;
3050 else if (unlikely(sdebug_verbose &&
3051 (ret < (num * sdebug_sector_size))))
3052 sdev_printk(KERN_INFO, scp->device,
3053 "%s: write: cdb indicated=%u, IO sent=%d bytes\n",
3054 my_name, num * sdebug_sector_size, ret);
3055
3056 if (unlikely(sdebug_any_injecting_opt)) {
3057 struct sdebug_queued_cmd *sqcp =
3058 (struct sdebug_queued_cmd *)scp->host_scribble;
3059
3060 if (sqcp) {
3061 if (sqcp->inj_recovered) {
3062 mk_sense_buffer(scp, RECOVERED_ERROR,
3063 THRESHOLD_EXCEEDED, 0);
3064 return check_condition_result;
3065 } else if (sqcp->inj_dif) {
3066 /* Logical block guard check failed */
3067 mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
3068 return illegal_condition_result;
3069 } else if (sqcp->inj_dix) {
3070 mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
3071 return illegal_condition_result;
3072 }
3073 }
3074 }
3075 return 0;
3076 }
3077
3078 /*
3079 * T10 has only specified WRITE SCATTERED(16) and WRITE SCATTERED(32).
3080 * No READ GATHERED yet (requires bidi or long cdb holding gather list).
3081 */
3082 static int resp_write_scat(struct scsi_cmnd *scp,
3083 struct sdebug_dev_info *devip)
3084 {
3085 u8 *cmd = scp->cmnd;
3086 u8 *lrdp = NULL;
3087 u8 *up;
3088 u8 wrprotect;
3089 u16 lbdof, num_lrd, k;
3090 u32 num, num_by, bt_len, lbdof_blen, sg_off, cum_lb;
3091 u32 lb_size = sdebug_sector_size;
3092 u32 ei_lba;
3093 u64 lba;
3094 unsigned long iflags;
3095 int ret, res;
3096 bool is_16;
3097 static const u32 lrd_size = 32; /* + parameter list header size */
3098
3099 if (cmd[0] == VARIABLE_LENGTH_CMD) {
3100 is_16 = false;
3101 wrprotect = (cmd[10] >> 5) & 0x7;
3102 lbdof = get_unaligned_be16(cmd + 12);
3103 num_lrd = get_unaligned_be16(cmd + 16);
3104 bt_len = get_unaligned_be32(cmd + 28);
3105 } else { /* that leaves WRITE SCATTERED(16) */
3106 is_16 = true;
3107 wrprotect = (cmd[2] >> 5) & 0x7;
3108 lbdof = get_unaligned_be16(cmd + 4);
3109 num_lrd = get_unaligned_be16(cmd + 8);
3110 bt_len = get_unaligned_be32(cmd + 10);
3111 if (unlikely(have_dif_prot)) {
3112 if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
3113 wrprotect) {
3114 mk_sense_invalid_opcode(scp);
3115 return illegal_condition_result;
3116 }
3117 if ((sdebug_dif == T10_PI_TYPE1_PROTECTION ||
3118 sdebug_dif == T10_PI_TYPE3_PROTECTION) &&
3119 wrprotect == 0)
3120 sdev_printk(KERN_ERR, scp->device,
3121 "Unprotected WR to DIF device\n");
3122 }
3123 }
3124 if ((num_lrd == 0) || (bt_len == 0))
3125 return 0; /* T10 says these do-nothings are not errors */
3126 if (lbdof == 0) {
3127 if (sdebug_verbose)
3128 sdev_printk(KERN_INFO, scp->device,
3129 "%s: %s: LB Data Offset field bad\n",
3130 my_name, __func__);
3131 mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
3132 return illegal_condition_result;
3133 }
3134 lbdof_blen = lbdof * lb_size;
3135 if ((lrd_size + (num_lrd * lrd_size)) > lbdof_blen) {
3136 if (sdebug_verbose)
3137 sdev_printk(KERN_INFO, scp->device,
3138 "%s: %s: LBA range descriptors don't fit\n",
3139 my_name, __func__);
3140 mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
3141 return illegal_condition_result;
3142 }
3143 lrdp = kzalloc(lbdof_blen, GFP_ATOMIC);
3144 if (lrdp == NULL)
3145 return SCSI_MLQUEUE_HOST_BUSY;
3146 if (sdebug_verbose)
3147 sdev_printk(KERN_INFO, scp->device,
3148 "%s: %s: Fetch header+scatter_list, lbdof_blen=%u\n",
3149 my_name, __func__, lbdof_blen);
3150 res = fetch_to_dev_buffer(scp, lrdp, lbdof_blen);
3151 if (res == -1) {
3152 ret = DID_ERROR << 16;
3153 goto err_out;
3154 }
3155
3156 write_lock_irqsave(&atomic_rw, iflags);
3157 sg_off = lbdof_blen;
3158 /* Spec says Buffer xfer Length field in number of LBs in dout */
3159 cum_lb = 0;
3160 for (k = 0, up = lrdp + lrd_size; k < num_lrd; ++k, up += lrd_size) {
3161 lba = get_unaligned_be64(up + 0);
3162 num = get_unaligned_be32(up + 8);
3163 if (sdebug_verbose)
3164 sdev_printk(KERN_INFO, scp->device,
3165 "%s: %s: k=%d LBA=0x%llx num=%u sg_off=%u\n",
3166 my_name, __func__, k, lba, num, sg_off);
3167 if (num == 0)
3168 continue;
3169 ret = check_device_access_params(scp, lba, num, true);
3170 if (ret)
3171 goto err_out_unlock;
3172 num_by = num * lb_size;
3173 ei_lba = is_16 ? 0 : get_unaligned_be32(up + 12);
3174
3175 if ((cum_lb + num) > bt_len) {
3176 if (sdebug_verbose)
3177 sdev_printk(KERN_INFO, scp->device,
3178 "%s: %s: sum of blocks > data provided\n",
3179 my_name, __func__);
3180 mk_sense_buffer(scp, ILLEGAL_REQUEST, WRITE_ERROR_ASC,
3181 0);
3182 ret = illegal_condition_result;
3183 goto err_out_unlock;
3184 }
3185
3186 /* DIX + T10 DIF */
3187 if (unlikely(sdebug_dix && scsi_prot_sg_count(scp))) {
3188 int prot_ret = prot_verify_write(scp, lba, num,
3189 ei_lba);
3190
3191 if (prot_ret) {
3192 mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10,
3193 prot_ret);
3194 ret = illegal_condition_result;
3195 goto err_out_unlock;
3196 }
3197 }
3198
3199 ret = do_device_access(scp, sg_off, lba, num, true);
3200 if (unlikely(scsi_debug_lbp()))
3201 map_region(lba, num);
3202 if (unlikely(-1 == ret)) {
3203 ret = DID_ERROR << 16;
3204 goto err_out_unlock;
3205 } else if (unlikely(sdebug_verbose && (ret < num_by)))
3206 sdev_printk(KERN_INFO, scp->device,
3207 "%s: write: cdb indicated=%u, IO sent=%d bytes\n",
3208 my_name, num_by, ret);
3209
3210 if (unlikely(sdebug_any_injecting_opt)) {
3211 struct sdebug_queued_cmd *sqcp =
3212 (struct sdebug_queued_cmd *)scp->host_scribble;
3213
3214 if (sqcp) {
3215 if (sqcp->inj_recovered) {
3216 mk_sense_buffer(scp, RECOVERED_ERROR,
3217 THRESHOLD_EXCEEDED, 0);
3218 ret = illegal_condition_result;
3219 goto err_out_unlock;
3220 } else if (sqcp->inj_dif) {
3221 /* Logical block guard check failed */
3222 mk_sense_buffer(scp, ABORTED_COMMAND,
3223 0x10, 1);
3224 ret = illegal_condition_result;
3225 goto err_out_unlock;
3226 } else if (sqcp->inj_dix) {
3227 mk_sense_buffer(scp, ILLEGAL_REQUEST,
3228 0x10, 1);
3229 ret = illegal_condition_result;
3230 goto err_out_unlock;
3231 }
3232 }
3233 }
3234 sg_off += num_by;
3235 cum_lb += num;
3236 }
3237 ret = 0;
3238 err_out_unlock:
3239 write_unlock_irqrestore(&atomic_rw, iflags);
3240 err_out:
3241 kfree(lrdp);
3242 return ret;
3243 }
3244
3245 static int resp_write_same(struct scsi_cmnd *scp, u64 lba, u32 num,
3246 u32 ei_lba, bool unmap, bool ndob)
3247 {
3248 int ret;
3249 unsigned long iflags;
3250 unsigned long long i;
3251 u32 lb_size = sdebug_sector_size;
3252 u64 block, lbaa;
3253 u8 *fs1p;
3254
3255 ret = check_device_access_params(scp, lba, num, true);
3256 if (ret)
3257 return ret;
3258
3259 write_lock_irqsave(&atomic_rw, iflags);
3260
3261 if (unmap && scsi_debug_lbp()) {
3262 unmap_region(lba, num);
3263 goto out;
3264 }
3265 lbaa = lba;
3266 block = do_div(lbaa, sdebug_store_sectors);
3267 /* if ndob then zero 1 logical block, else fetch 1 logical block */
3268 fs1p = fake_storep + (block * lb_size);
3269 if (ndob) {
3270 memset(fs1p, 0, lb_size);
3271 ret = 0;
3272 } else
3273 ret = fetch_to_dev_buffer(scp, fs1p, lb_size);
3274
3275 if (-1 == ret) {
3276 write_unlock_irqrestore(&atomic_rw, iflags);
3277 return DID_ERROR << 16;
3278 } else if (sdebug_verbose && !ndob && (ret < lb_size))
3279 sdev_printk(KERN_INFO, scp->device,
3280 "%s: %s: lb size=%u, IO sent=%d bytes\n",
3281 my_name, "write same", lb_size, ret);
3282
3283 /* Copy first sector to remaining blocks */
3284 for (i = 1 ; i < num ; i++) {
3285 lbaa = lba + i;
3286 block = do_div(lbaa, sdebug_store_sectors);
3287 memmove(fake_storep + (block * lb_size), fs1p, lb_size);
3288 }
3289 if (scsi_debug_lbp())
3290 map_region(lba, num);
3291 out:
3292 write_unlock_irqrestore(&atomic_rw, iflags);
3293
3294 return 0;
3295 }
3296
3297 static int resp_write_same_10(struct scsi_cmnd *scp,
3298 struct sdebug_dev_info *devip)
3299 {
3300 u8 *cmd = scp->cmnd;
3301 u32 lba;
3302 u16 num;
3303 u32 ei_lba = 0;
3304 bool unmap = false;
3305
3306 if (cmd[1] & 0x8) {
3307 if (sdebug_lbpws10 == 0) {
3308 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 3);
3309 return check_condition_result;
3310 } else
3311 unmap = true;
3312 }
3313 lba = get_unaligned_be32(cmd + 2);
3314 num = get_unaligned_be16(cmd + 7);
3315 if (num > sdebug_write_same_length) {
3316 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 7, -1);
3317 return check_condition_result;
3318 }
3319 return resp_write_same(scp, lba, num, ei_lba, unmap, false);
3320 }
3321
3322 static int resp_write_same_16(struct scsi_cmnd *scp,
3323 struct sdebug_dev_info *devip)
3324 {
3325 u8 *cmd = scp->cmnd;
3326 u64 lba;
3327 u32 num;
3328 u32 ei_lba = 0;
3329 bool unmap = false;
3330 bool ndob = false;
3331
3332 if (cmd[1] & 0x8) { /* UNMAP */
3333 if (sdebug_lbpws == 0) {
3334 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 3);
3335 return check_condition_result;
3336 } else
3337 unmap = true;
3338 }
3339 if (cmd[1] & 0x1) /* NDOB (no data-out buffer, assumes zeroes) */
3340 ndob = true;
3341 lba = get_unaligned_be64(cmd + 2);
3342 num = get_unaligned_be32(cmd + 10);
3343 if (num > sdebug_write_same_length) {
3344 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 10, -1);
3345 return check_condition_result;
3346 }
3347 return resp_write_same(scp, lba, num, ei_lba, unmap, ndob);
3348 }
3349
3350 /* Note the mode field is in the same position as the (lower) service action
3351 * field. For the Report supported operation codes command, SPC-4 suggests
3352 * each mode of this command should be reported separately; for future. */
3353 static int resp_write_buffer(struct scsi_cmnd *scp,
3354 struct sdebug_dev_info *devip)
3355 {
3356 u8 *cmd = scp->cmnd;
3357 struct scsi_device *sdp = scp->device;
3358 struct sdebug_dev_info *dp;
3359 u8 mode;
3360
3361 mode = cmd[1] & 0x1f;
3362 switch (mode) {
3363 case 0x4: /* download microcode (MC) and activate (ACT) */
3364 /* set UAs on this device only */
3365 set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
3366 set_bit(SDEBUG_UA_MICROCODE_CHANGED, devip->uas_bm);
3367 break;
3368 case 0x5: /* download MC, save and ACT */
3369 set_bit(SDEBUG_UA_MICROCODE_CHANGED_WO_RESET, devip->uas_bm);
3370 break;
3371 case 0x6: /* download MC with offsets and ACT */
3372 /* set UAs on most devices (LUs) in this target */
3373 list_for_each_entry(dp,
3374 &devip->sdbg_host->dev_info_list,
3375 dev_list)
3376 if (dp->target == sdp->id) {
3377 set_bit(SDEBUG_UA_BUS_RESET, dp->uas_bm);
3378 if (devip != dp)
3379 set_bit(SDEBUG_UA_MICROCODE_CHANGED,
3380 dp->uas_bm);
3381 }
3382 break;
3383 case 0x7: /* download MC with offsets, save, and ACT */
3384 /* set UA on all devices (LUs) in this target */
3385 list_for_each_entry(dp,
3386 &devip->sdbg_host->dev_info_list,
3387 dev_list)
3388 if (dp->target == sdp->id)
3389 set_bit(SDEBUG_UA_MICROCODE_CHANGED_WO_RESET,
3390 dp->uas_bm);
3391 break;
3392 default:
3393 /* do nothing for this command for other mode values */
3394 break;
3395 }
3396 return 0;
3397 }
3398
3399 static int resp_comp_write(struct scsi_cmnd *scp,
3400 struct sdebug_dev_info *devip)
3401 {
3402 u8 *cmd = scp->cmnd;
3403 u8 *arr;
3404 u8 *fake_storep_hold;
3405 u64 lba;
3406 u32 dnum;
3407 u32 lb_size = sdebug_sector_size;
3408 u8 num;
3409 unsigned long iflags;
3410 int ret;
3411 int retval = 0;
3412
3413 lba = get_unaligned_be64(cmd + 2);
3414 num = cmd[13]; /* 1 to a maximum of 255 logical blocks */
3415 if (0 == num)
3416 return 0; /* degenerate case, not an error */
3417 if (sdebug_dif == T10_PI_TYPE2_PROTECTION &&
3418 (cmd[1] & 0xe0)) {
3419 mk_sense_invalid_opcode(scp);
3420 return check_condition_result;
3421 }
3422 if ((sdebug_dif == T10_PI_TYPE1_PROTECTION ||
3423 sdebug_dif == T10_PI_TYPE3_PROTECTION) &&
3424 (cmd[1] & 0xe0) == 0)
3425 sdev_printk(KERN_ERR, scp->device, "Unprotected WR "
3426 "to DIF device\n");
3427 ret = check_device_access_params(scp, lba, num, false);
3428 if (ret)
3429 return ret;
3430 dnum = 2 * num;
3431 arr = kcalloc(lb_size, dnum, GFP_ATOMIC);
3432 if (NULL == arr) {
3433 mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
3434 INSUFF_RES_ASCQ);
3435 return check_condition_result;
3436 }
3437
3438 write_lock_irqsave(&atomic_rw, iflags);
3439
3440 /* trick do_device_access() to fetch both compare and write buffers
3441 * from data-in into arr. Safe (atomic) since write_lock held. */
3442 fake_storep_hold = fake_storep;
3443 fake_storep = arr;
3444 ret = do_device_access(scp, 0, 0, dnum, true);
3445 fake_storep = fake_storep_hold;
3446 if (ret == -1) {
3447 retval = DID_ERROR << 16;
3448 goto cleanup;
3449 } else if (sdebug_verbose && (ret < (dnum * lb_size)))
3450 sdev_printk(KERN_INFO, scp->device, "%s: compare_write: cdb "
3451 "indicated=%u, IO sent=%d bytes\n", my_name,
3452 dnum * lb_size, ret);
3453 if (!comp_write_worker(lba, num, arr)) {
3454 mk_sense_buffer(scp, MISCOMPARE, MISCOMPARE_VERIFY_ASC, 0);
3455 retval = check_condition_result;
3456 goto cleanup;
3457 }
3458 if (scsi_debug_lbp())
3459 map_region(lba, num);
3460 cleanup:
3461 write_unlock_irqrestore(&atomic_rw, iflags);
3462 kfree(arr);
3463 return retval;
3464 }
3465
3466 struct unmap_block_desc {
3467 __be64 lba;
3468 __be32 blocks;
3469 __be32 __reserved;
3470 };
3471
3472 static int resp_unmap(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
3473 {
3474 unsigned char *buf;
3475 struct unmap_block_desc *desc;
3476 unsigned int i, payload_len, descriptors;
3477 int ret;
3478 unsigned long iflags;
3479
3480
3481 if (!scsi_debug_lbp())
3482 return 0; /* fib and say its done */
3483 payload_len = get_unaligned_be16(scp->cmnd + 7);
3484 BUG_ON(scsi_bufflen(scp) != payload_len);
3485
3486 descriptors = (payload_len - 8) / 16;
3487 if (descriptors > sdebug_unmap_max_desc) {
3488 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 7, -1);
3489 return check_condition_result;
3490 }
3491
3492 buf = kzalloc(scsi_bufflen(scp), GFP_ATOMIC);
3493 if (!buf) {
3494 mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
3495 INSUFF_RES_ASCQ);
3496 return check_condition_result;
3497 }
3498
3499 scsi_sg_copy_to_buffer(scp, buf, scsi_bufflen(scp));
3500
3501 BUG_ON(get_unaligned_be16(&buf[0]) != payload_len - 2);
3502 BUG_ON(get_unaligned_be16(&buf[2]) != descriptors * 16);
3503
3504 desc = (void *)&buf[8];
3505
3506 write_lock_irqsave(&atomic_rw, iflags);
3507
3508 for (i = 0 ; i < descriptors ; i++) {
3509 unsigned long long lba = get_unaligned_be64(&desc[i].lba);
3510 unsigned int num = get_unaligned_be32(&desc[i].blocks);
3511
3512 ret = check_device_access_params(scp, lba, num, true);
3513 if (ret)
3514 goto out;
3515
3516 unmap_region(lba, num);
3517 }
3518
3519 ret = 0;
3520
3521 out:
3522 write_unlock_irqrestore(&atomic_rw, iflags);
3523 kfree(buf);
3524
3525 return ret;
3526 }
3527
3528 #define SDEBUG_GET_LBA_STATUS_LEN 32
3529
3530 static int resp_get_lba_status(struct scsi_cmnd *scp,
3531 struct sdebug_dev_info *devip)
3532 {
3533 u8 *cmd = scp->cmnd;
3534 u64 lba;
3535 u32 alloc_len, mapped, num;
3536 u8 arr[SDEBUG_GET_LBA_STATUS_LEN];
3537 int ret;
3538
3539 lba = get_unaligned_be64(cmd + 2);
3540 alloc_len = get_unaligned_be32(cmd + 10);
3541
3542 if (alloc_len < 24)
3543 return 0;
3544
3545 ret = check_device_access_params(scp, lba, 1, false);
3546 if (ret)
3547 return ret;
3548
3549 if (scsi_debug_lbp())
3550 mapped = map_state(lba, &num);
3551 else {
3552 mapped = 1;
3553 /* following just in case virtual_gb changed */
3554 sdebug_capacity = get_sdebug_capacity();
3555 if (sdebug_capacity - lba <= 0xffffffff)
3556 num = sdebug_capacity - lba;
3557 else
3558 num = 0xffffffff;
3559 }
3560
3561 memset(arr, 0, SDEBUG_GET_LBA_STATUS_LEN);
3562 put_unaligned_be32(20, arr); /* Parameter Data Length */
3563 put_unaligned_be64(lba, arr + 8); /* LBA */
3564 put_unaligned_be32(num, arr + 16); /* Number of blocks */
3565 arr[20] = !mapped; /* prov_stat=0: mapped; 1: dealloc */
3566
3567 return fill_from_dev_buffer(scp, arr, SDEBUG_GET_LBA_STATUS_LEN);
3568 }
3569
3570 static int resp_sync_cache(struct scsi_cmnd *scp,
3571 struct sdebug_dev_info *devip)
3572 {
3573 int res = 0;
3574 u64 lba;
3575 u32 num_blocks;
3576 u8 *cmd = scp->cmnd;
3577
3578 if (cmd[0] == SYNCHRONIZE_CACHE) { /* 10 byte cdb */
3579 lba = get_unaligned_be32(cmd + 2);
3580 num_blocks = get_unaligned_be16(cmd + 7);
3581 } else { /* SYNCHRONIZE_CACHE(16) */
3582 lba = get_unaligned_be64(cmd + 2);
3583 num_blocks = get_unaligned_be32(cmd + 10);
3584 }
3585 if (lba + num_blocks > sdebug_capacity) {
3586 mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
3587 return check_condition_result;
3588 }
3589 if (!write_since_sync || cmd[1] & 0x2)
3590 res = SDEG_RES_IMMED_MASK;
3591 else /* delay if write_since_sync and IMMED clear */
3592 write_since_sync = false;
3593 return res;
3594 }
3595
3596 #define RL_BUCKET_ELEMS 8
3597
3598 /* Even though each pseudo target has a REPORT LUNS "well known logical unit"
3599 * (W-LUN), the normal Linux scanning logic does not associate it with a
3600 * device (e.g. /dev/sg7). The following magic will make that association:
3601 * "cd /sys/class/scsi_host/host<n> ; echo '- - 49409' > scan"
3602 * where <n> is a host number. If there are multiple targets in a host then
3603 * the above will associate a W-LUN to each target. To only get a W-LUN
3604 * for target 2, then use "echo '- 2 49409' > scan" .
3605 */
3606 static int resp_report_luns(struct scsi_cmnd *scp,
3607 struct sdebug_dev_info *devip)
3608 {
3609 unsigned char *cmd = scp->cmnd;
3610 unsigned int alloc_len;
3611 unsigned char select_report;
3612 u64 lun;
3613 struct scsi_lun *lun_p;
3614 u8 arr[RL_BUCKET_ELEMS * sizeof(struct scsi_lun)];
3615 unsigned int lun_cnt; /* normal LUN count (max: 256) */
3616 unsigned int wlun_cnt; /* report luns W-LUN count */
3617 unsigned int tlun_cnt; /* total LUN count */
3618 unsigned int rlen; /* response length (in bytes) */
3619 int k, j, n, res;
3620 unsigned int off_rsp = 0;
3621 const int sz_lun = sizeof(struct scsi_lun);
3622
3623 clear_luns_changed_on_target(devip);
3624
3625 select_report = cmd[2];
3626 alloc_len = get_unaligned_be32(cmd + 6);
3627
3628 if (alloc_len < 4) {
3629 pr_err("alloc len too small %d\n", alloc_len);
3630 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 6, -1);
3631 return check_condition_result;
3632 }
3633
3634 switch (select_report) {
3635 case 0: /* all LUNs apart from W-LUNs */
3636 lun_cnt = sdebug_max_luns;
3637 wlun_cnt = 0;
3638 break;
3639 case 1: /* only W-LUNs */
3640 lun_cnt = 0;
3641 wlun_cnt = 1;
3642 break;
3643 case 2: /* all LUNs */
3644 lun_cnt = sdebug_max_luns;
3645 wlun_cnt = 1;
3646 break;
3647 case 0x10: /* only administrative LUs */
3648 case 0x11: /* see SPC-5 */
3649 case 0x12: /* only subsiduary LUs owned by referenced LU */
3650 default:
3651 pr_debug("select report invalid %d\n", select_report);
3652 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 2, -1);
3653 return check_condition_result;
3654 }
3655
3656 if (sdebug_no_lun_0 && (lun_cnt > 0))
3657 --lun_cnt;
3658
3659 tlun_cnt = lun_cnt + wlun_cnt;
3660 rlen = tlun_cnt * sz_lun; /* excluding 8 byte header */
3661 scsi_set_resid(scp, scsi_bufflen(scp));
3662 pr_debug("select_report %d luns = %d wluns = %d no_lun0 %d\n",
3663 select_report, lun_cnt, wlun_cnt, sdebug_no_lun_0);
3664
3665 /* loops rely on sizeof response header same as sizeof lun (both 8) */
3666 lun = sdebug_no_lun_0 ? 1 : 0;
3667 for (k = 0, j = 0, res = 0; true; ++k, j = 0) {
3668 memset(arr, 0, sizeof(arr));
3669 lun_p = (struct scsi_lun *)&arr[0];
3670 if (k == 0) {
3671 put_unaligned_be32(rlen, &arr[0]);
3672 ++lun_p;
3673 j = 1;
3674 }
3675 for ( ; j < RL_BUCKET_ELEMS; ++j, ++lun_p) {
3676 if ((k * RL_BUCKET_ELEMS) + j > lun_cnt)
3677 break;
3678 int_to_scsilun(lun++, lun_p);
3679 }
3680 if (j < RL_BUCKET_ELEMS)
3681 break;
3682 n = j * sz_lun;
3683 res = p_fill_from_dev_buffer(scp, arr, n, off_rsp);
3684 if (res)
3685 return res;
3686 off_rsp += n;
3687 }
3688 if (wlun_cnt) {
3689 int_to_scsilun(SCSI_W_LUN_REPORT_LUNS, lun_p);
3690 ++j;
3691 }
3692 if (j > 0)
3693 res = p_fill_from_dev_buffer(scp, arr, j * sz_lun, off_rsp);
3694 return res;
3695 }
3696
3697 static struct sdebug_queue *get_queue(struct scsi_cmnd *cmnd)
3698 {
3699 u32 tag = blk_mq_unique_tag(cmnd->request);
3700 u16 hwq = blk_mq_unique_tag_to_hwq(tag);
3701
3702 pr_debug("tag=%#x, hwq=%d\n", tag, hwq);
3703 if (WARN_ON_ONCE(hwq >= submit_queues))
3704 hwq = 0;
3705 return sdebug_q_arr + hwq;
3706 }
3707
3708 /* Queued (deferred) command completions converge here. */
3709 static void sdebug_q_cmd_complete(struct sdebug_defer *sd_dp)
3710 {
3711 bool aborted = sd_dp->aborted;
3712 int qc_idx;
3713 int retiring = 0;
3714 unsigned long iflags;
3715 struct sdebug_queue *sqp;
3716 struct sdebug_queued_cmd *sqcp;
3717 struct scsi_cmnd *scp;
3718 struct sdebug_dev_info *devip;
3719
3720 sd_dp->defer_t = SDEB_DEFER_NONE;
3721 if (unlikely(aborted))
3722 sd_dp->aborted = false;
3723 qc_idx = sd_dp->qc_idx;
3724 sqp = sdebug_q_arr + sd_dp->sqa_idx;
3725 if (sdebug_statistics) {
3726 atomic_inc(&sdebug_completions);
3727 if (raw_smp_processor_id() != sd_dp->issuing_cpu)
3728 atomic_inc(&sdebug_miss_cpus);
3729 }
3730 if (unlikely((qc_idx < 0) || (qc_idx >= SDEBUG_CANQUEUE))) {
3731 pr_err("wild qc_idx=%d\n", qc_idx);
3732 return;
3733 }
3734 spin_lock_irqsave(&sqp->qc_lock, iflags);
3735 sqcp = &sqp->qc_arr[qc_idx];
3736 scp = sqcp->a_cmnd;
3737 if (unlikely(scp == NULL)) {
3738 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
3739 pr_err("scp is NULL, sqa_idx=%d, qc_idx=%d\n",
3740 sd_dp->sqa_idx, qc_idx);
3741 return;
3742 }
3743 devip = (struct sdebug_dev_info *)scp->device->hostdata;
3744 if (likely(devip))
3745 atomic_dec(&devip->num_in_q);
3746 else
3747 pr_err("devip=NULL\n");
3748 if (unlikely(atomic_read(&retired_max_queue) > 0))
3749 retiring = 1;
3750
3751 sqcp->a_cmnd = NULL;
3752 if (unlikely(!test_and_clear_bit(qc_idx, sqp->in_use_bm))) {
3753 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
3754 pr_err("Unexpected completion\n");
3755 return;
3756 }
3757
3758 if (unlikely(retiring)) { /* user has reduced max_queue */
3759 int k, retval;
3760
3761 retval = atomic_read(&retired_max_queue);
3762 if (qc_idx >= retval) {
3763 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
3764 pr_err("index %d too large\n", retval);
3765 return;
3766 }
3767 k = find_last_bit(sqp->in_use_bm, retval);
3768 if ((k < sdebug_max_queue) || (k == retval))
3769 atomic_set(&retired_max_queue, 0);
3770 else
3771 atomic_set(&retired_max_queue, k + 1);
3772 }
3773 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
3774 if (unlikely(aborted)) {
3775 if (sdebug_verbose)
3776 pr_info("bypassing scsi_done() due to aborted cmd\n");
3777 return;
3778 }
3779 scp->scsi_done(scp); /* callback to mid level */
3780 }
3781
3782 /* When high resolution timer goes off this function is called. */
3783 static enum hrtimer_restart sdebug_q_cmd_hrt_complete(struct hrtimer *timer)
3784 {
3785 struct sdebug_defer *sd_dp = container_of(timer, struct sdebug_defer,
3786 hrt);
3787 sdebug_q_cmd_complete(sd_dp);
3788 return HRTIMER_NORESTART;
3789 }
3790
3791 /* When work queue schedules work, it calls this function. */
3792 static void sdebug_q_cmd_wq_complete(struct work_struct *work)
3793 {
3794 struct sdebug_defer *sd_dp = container_of(work, struct sdebug_defer,
3795 ew.work);
3796 sdebug_q_cmd_complete(sd_dp);
3797 }
3798
3799 static bool got_shared_uuid;
3800 static uuid_t shared_uuid;
3801
3802 static struct sdebug_dev_info *sdebug_device_create(
3803 struct sdebug_host_info *sdbg_host, gfp_t flags)
3804 {
3805 struct sdebug_dev_info *devip;
3806
3807 devip = kzalloc(sizeof(*devip), flags);
3808 if (devip) {
3809 if (sdebug_uuid_ctl == 1)
3810 uuid_gen(&devip->lu_name);
3811 else if (sdebug_uuid_ctl == 2) {
3812 if (got_shared_uuid)
3813 devip->lu_name = shared_uuid;
3814 else {
3815 uuid_gen(&shared_uuid);
3816 got_shared_uuid = true;
3817 devip->lu_name = shared_uuid;
3818 }
3819 }
3820 devip->sdbg_host = sdbg_host;
3821 list_add_tail(&devip->dev_list, &sdbg_host->dev_info_list);
3822 }
3823 return devip;
3824 }
3825
3826 static struct sdebug_dev_info *find_build_dev_info(struct scsi_device *sdev)
3827 {
3828 struct sdebug_host_info *sdbg_host;
3829 struct sdebug_dev_info *open_devip = NULL;
3830 struct sdebug_dev_info *devip;
3831
3832 sdbg_host = *(struct sdebug_host_info **)shost_priv(sdev->host);
3833 if (!sdbg_host) {
3834 pr_err("Host info NULL\n");
3835 return NULL;
3836 }
3837 list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) {
3838 if ((devip->used) && (devip->channel == sdev->channel) &&
3839 (devip->target == sdev->id) &&
3840 (devip->lun == sdev->lun))
3841 return devip;
3842 else {
3843 if ((!devip->used) && (!open_devip))
3844 open_devip = devip;
3845 }
3846 }
3847 if (!open_devip) { /* try and make a new one */
3848 open_devip = sdebug_device_create(sdbg_host, GFP_ATOMIC);
3849 if (!open_devip) {
3850 pr_err("out of memory at line %d\n", __LINE__);
3851 return NULL;
3852 }
3853 }
3854
3855 open_devip->channel = sdev->channel;
3856 open_devip->target = sdev->id;
3857 open_devip->lun = sdev->lun;
3858 open_devip->sdbg_host = sdbg_host;
3859 atomic_set(&open_devip->num_in_q, 0);
3860 set_bit(SDEBUG_UA_POR, open_devip->uas_bm);
3861 open_devip->used = true;
3862 return open_devip;
3863 }
3864
3865 static int scsi_debug_slave_alloc(struct scsi_device *sdp)
3866 {
3867 if (sdebug_verbose)
3868 pr_info("slave_alloc <%u %u %u %llu>\n",
3869 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
3870 return 0;
3871 }
3872
3873 static int scsi_debug_slave_configure(struct scsi_device *sdp)
3874 {
3875 struct sdebug_dev_info *devip =
3876 (struct sdebug_dev_info *)sdp->hostdata;
3877
3878 if (sdebug_verbose)
3879 pr_info("slave_configure <%u %u %u %llu>\n",
3880 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
3881 if (sdp->host->max_cmd_len != SDEBUG_MAX_CMD_LEN)
3882 sdp->host->max_cmd_len = SDEBUG_MAX_CMD_LEN;
3883 if (devip == NULL) {
3884 devip = find_build_dev_info(sdp);
3885 if (devip == NULL)
3886 return 1; /* no resources, will be marked offline */
3887 }
3888 sdp->hostdata = devip;
3889 if (sdebug_no_uld)
3890 sdp->no_uld_attach = 1;
3891 config_cdb_len(sdp);
3892 return 0;
3893 }
3894
3895 static void scsi_debug_slave_destroy(struct scsi_device *sdp)
3896 {
3897 struct sdebug_dev_info *devip =
3898 (struct sdebug_dev_info *)sdp->hostdata;
3899
3900 if (sdebug_verbose)
3901 pr_info("slave_destroy <%u %u %u %llu>\n",
3902 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
3903 if (devip) {
3904 /* make this slot available for re-use */
3905 devip->used = false;
3906 sdp->hostdata = NULL;
3907 }
3908 }
3909
3910 static void stop_qc_helper(struct sdebug_defer *sd_dp,
3911 enum sdeb_defer_type defer_t)
3912 {
3913 if (!sd_dp)
3914 return;
3915 if (defer_t == SDEB_DEFER_HRT)
3916 hrtimer_cancel(&sd_dp->hrt);
3917 else if (defer_t == SDEB_DEFER_WQ)
3918 cancel_work_sync(&sd_dp->ew.work);
3919 }
3920
3921 /* If @cmnd found deletes its timer or work queue and returns true; else
3922 returns false */
3923 static bool stop_queued_cmnd(struct scsi_cmnd *cmnd)
3924 {
3925 unsigned long iflags;
3926 int j, k, qmax, r_qmax;
3927 enum sdeb_defer_type l_defer_t;
3928 struct sdebug_queue *sqp;
3929 struct sdebug_queued_cmd *sqcp;
3930 struct sdebug_dev_info *devip;
3931 struct sdebug_defer *sd_dp;
3932
3933 for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
3934 spin_lock_irqsave(&sqp->qc_lock, iflags);
3935 qmax = sdebug_max_queue;
3936 r_qmax = atomic_read(&retired_max_queue);
3937 if (r_qmax > qmax)
3938 qmax = r_qmax;
3939 for (k = 0; k < qmax; ++k) {
3940 if (test_bit(k, sqp->in_use_bm)) {
3941 sqcp = &sqp->qc_arr[k];
3942 if (cmnd != sqcp->a_cmnd)
3943 continue;
3944 /* found */
3945 devip = (struct sdebug_dev_info *)
3946 cmnd->device->hostdata;
3947 if (devip)
3948 atomic_dec(&devip->num_in_q);
3949 sqcp->a_cmnd = NULL;
3950 sd_dp = sqcp->sd_dp;
3951 if (sd_dp) {
3952 l_defer_t = sd_dp->defer_t;
3953 sd_dp->defer_t = SDEB_DEFER_NONE;
3954 } else
3955 l_defer_t = SDEB_DEFER_NONE;
3956 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
3957 stop_qc_helper(sd_dp, l_defer_t);
3958 clear_bit(k, sqp->in_use_bm);
3959 return true;
3960 }
3961 }
3962 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
3963 }
3964 return false;
3965 }
3966
3967 /* Deletes (stops) timers or work queues of all queued commands */
3968 static void stop_all_queued(void)
3969 {
3970 unsigned long iflags;
3971 int j, k;
3972 enum sdeb_defer_type l_defer_t;
3973 struct sdebug_queue *sqp;
3974 struct sdebug_queued_cmd *sqcp;
3975 struct sdebug_dev_info *devip;
3976 struct sdebug_defer *sd_dp;
3977
3978 for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
3979 spin_lock_irqsave(&sqp->qc_lock, iflags);
3980 for (k = 0; k < SDEBUG_CANQUEUE; ++k) {
3981 if (test_bit(k, sqp->in_use_bm)) {
3982 sqcp = &sqp->qc_arr[k];
3983 if (sqcp->a_cmnd == NULL)
3984 continue;
3985 devip = (struct sdebug_dev_info *)
3986 sqcp->a_cmnd->device->hostdata;
3987 if (devip)
3988 atomic_dec(&devip->num_in_q);
3989 sqcp->a_cmnd = NULL;
3990 sd_dp = sqcp->sd_dp;
3991 if (sd_dp) {
3992 l_defer_t = sd_dp->defer_t;
3993 sd_dp->defer_t = SDEB_DEFER_NONE;
3994 } else
3995 l_defer_t = SDEB_DEFER_NONE;
3996 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
3997 stop_qc_helper(sd_dp, l_defer_t);
3998 clear_bit(k, sqp->in_use_bm);
3999 spin_lock_irqsave(&sqp->qc_lock, iflags);
4000 }
4001 }
4002 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
4003 }
4004 }
4005
4006 /* Free queued command memory on heap */
4007 static void free_all_queued(void)
4008 {
4009 int j, k;
4010 struct sdebug_queue *sqp;
4011 struct sdebug_queued_cmd *sqcp;
4012
4013 for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
4014 for (k = 0; k < SDEBUG_CANQUEUE; ++k) {
4015 sqcp = &sqp->qc_arr[k];
4016 kfree(sqcp->sd_dp);
4017 sqcp->sd_dp = NULL;
4018 }
4019 }
4020 }
4021
4022 static int scsi_debug_abort(struct scsi_cmnd *SCpnt)
4023 {
4024 bool ok;
4025
4026 ++num_aborts;
4027 if (SCpnt) {
4028 ok = stop_queued_cmnd(SCpnt);
4029 if (SCpnt->device && (SDEBUG_OPT_ALL_NOISE & sdebug_opts))
4030 sdev_printk(KERN_INFO, SCpnt->device,
4031 "%s: command%s found\n", __func__,
4032 ok ? "" : " not");
4033 }
4034 return SUCCESS;
4035 }
4036
4037 static int scsi_debug_device_reset(struct scsi_cmnd *SCpnt)
4038 {
4039 ++num_dev_resets;
4040 if (SCpnt && SCpnt->device) {
4041 struct scsi_device *sdp = SCpnt->device;
4042 struct sdebug_dev_info *devip =
4043 (struct sdebug_dev_info *)sdp->hostdata;
4044
4045 if (SDEBUG_OPT_ALL_NOISE & sdebug_opts)
4046 sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
4047 if (devip)
4048 set_bit(SDEBUG_UA_POR, devip->uas_bm);
4049 }
4050 return SUCCESS;
4051 }
4052
4053 static int scsi_debug_target_reset(struct scsi_cmnd *SCpnt)
4054 {
4055 struct sdebug_host_info *sdbg_host;
4056 struct sdebug_dev_info *devip;
4057 struct scsi_device *sdp;
4058 struct Scsi_Host *hp;
4059 int k = 0;
4060
4061 ++num_target_resets;
4062 if (!SCpnt)
4063 goto lie;
4064 sdp = SCpnt->device;
4065 if (!sdp)
4066 goto lie;
4067 if (SDEBUG_OPT_ALL_NOISE & sdebug_opts)
4068 sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
4069 hp = sdp->host;
4070 if (!hp)
4071 goto lie;
4072 sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
4073 if (sdbg_host) {
4074 list_for_each_entry(devip,
4075 &sdbg_host->dev_info_list,
4076 dev_list)
4077 if (devip->target == sdp->id) {
4078 set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
4079 ++k;
4080 }
4081 }
4082 if (SDEBUG_OPT_RESET_NOISE & sdebug_opts)
4083 sdev_printk(KERN_INFO, sdp,
4084 "%s: %d device(s) found in target\n", __func__, k);
4085 lie:
4086 return SUCCESS;
4087 }
4088
4089 static int scsi_debug_bus_reset(struct scsi_cmnd *SCpnt)
4090 {
4091 struct sdebug_host_info *sdbg_host;
4092 struct sdebug_dev_info *devip;
4093 struct scsi_device *sdp;
4094 struct Scsi_Host *hp;
4095 int k = 0;
4096
4097 ++num_bus_resets;
4098 if (!(SCpnt && SCpnt->device))
4099 goto lie;
4100 sdp = SCpnt->device;
4101 if (SDEBUG_OPT_ALL_NOISE & sdebug_opts)
4102 sdev_printk(KERN_INFO, sdp, "%s\n", __func__);
4103 hp = sdp->host;
4104 if (hp) {
4105 sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
4106 if (sdbg_host) {
4107 list_for_each_entry(devip,
4108 &sdbg_host->dev_info_list,
4109 dev_list) {
4110 set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
4111 ++k;
4112 }
4113 }
4114 }
4115 if (SDEBUG_OPT_RESET_NOISE & sdebug_opts)
4116 sdev_printk(KERN_INFO, sdp,
4117 "%s: %d device(s) found in host\n", __func__, k);
4118 lie:
4119 return SUCCESS;
4120 }
4121
4122 static int scsi_debug_host_reset(struct scsi_cmnd *SCpnt)
4123 {
4124 struct sdebug_host_info *sdbg_host;
4125 struct sdebug_dev_info *devip;
4126 int k = 0;
4127
4128 ++num_host_resets;
4129 if ((SCpnt->device) && (SDEBUG_OPT_ALL_NOISE & sdebug_opts))
4130 sdev_printk(KERN_INFO, SCpnt->device, "%s\n", __func__);
4131 spin_lock(&sdebug_host_list_lock);
4132 list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
4133 list_for_each_entry(devip, &sdbg_host->dev_info_list,
4134 dev_list) {
4135 set_bit(SDEBUG_UA_BUS_RESET, devip->uas_bm);
4136 ++k;
4137 }
4138 }
4139 spin_unlock(&sdebug_host_list_lock);
4140 stop_all_queued();
4141 if (SDEBUG_OPT_RESET_NOISE & sdebug_opts)
4142 sdev_printk(KERN_INFO, SCpnt->device,
4143 "%s: %d device(s) found\n", __func__, k);
4144 return SUCCESS;
4145 }
4146
4147 static void __init sdebug_build_parts(unsigned char *ramp,
4148 unsigned long store_size)
4149 {
4150 struct msdos_partition *pp;
4151 int starts[SDEBUG_MAX_PARTS + 2];
4152 int sectors_per_part, num_sectors, k;
4153 int heads_by_sects, start_sec, end_sec;
4154
4155 /* assume partition table already zeroed */
4156 if ((sdebug_num_parts < 1) || (store_size < 1048576))
4157 return;
4158 if (sdebug_num_parts > SDEBUG_MAX_PARTS) {
4159 sdebug_num_parts = SDEBUG_MAX_PARTS;
4160 pr_warn("reducing partitions to %d\n", SDEBUG_MAX_PARTS);
4161 }
4162 num_sectors = (int)sdebug_store_sectors;
4163 sectors_per_part = (num_sectors - sdebug_sectors_per)
4164 / sdebug_num_parts;
4165 heads_by_sects = sdebug_heads * sdebug_sectors_per;
4166 starts[0] = sdebug_sectors_per;
4167 for (k = 1; k < sdebug_num_parts; ++k)
4168 starts[k] = ((k * sectors_per_part) / heads_by_sects)
4169 * heads_by_sects;
4170 starts[sdebug_num_parts] = num_sectors;
4171 starts[sdebug_num_parts + 1] = 0;
4172
4173 ramp[510] = 0x55; /* magic partition markings */
4174 ramp[511] = 0xAA;
4175 pp = (struct msdos_partition *)(ramp + 0x1be);
4176 for (k = 0; starts[k + 1]; ++k, ++pp) {
4177 start_sec = starts[k];
4178 end_sec = starts[k + 1] - 1;
4179 pp->boot_ind = 0;
4180
4181 pp->cyl = start_sec / heads_by_sects;
4182 pp->head = (start_sec - (pp->cyl * heads_by_sects))
4183 / sdebug_sectors_per;
4184 pp->sector = (start_sec % sdebug_sectors_per) + 1;
4185
4186 pp->end_cyl = end_sec / heads_by_sects;
4187 pp->end_head = (end_sec - (pp->end_cyl * heads_by_sects))
4188 / sdebug_sectors_per;
4189 pp->end_sector = (end_sec % sdebug_sectors_per) + 1;
4190
4191 pp->start_sect = cpu_to_le32(start_sec);
4192 pp->nr_sects = cpu_to_le32(end_sec - start_sec + 1);
4193 pp->sys_ind = 0x83; /* plain Linux partition */
4194 }
4195 }
4196
4197 static void block_unblock_all_queues(bool block)
4198 {
4199 int j;
4200 struct sdebug_queue *sqp;
4201
4202 for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp)
4203 atomic_set(&sqp->blocked, (int)block);
4204 }
4205
4206 /* Adjust (by rounding down) the sdebug_cmnd_count so abs(every_nth)-1
4207 * commands will be processed normally before triggers occur.
4208 */
4209 static void tweak_cmnd_count(void)
4210 {
4211 int count, modulo;
4212
4213 modulo = abs(sdebug_every_nth);
4214 if (modulo < 2)
4215 return;
4216 block_unblock_all_queues(true);
4217 count = atomic_read(&sdebug_cmnd_count);
4218 atomic_set(&sdebug_cmnd_count, (count / modulo) * modulo);
4219 block_unblock_all_queues(false);
4220 }
4221
4222 static void clear_queue_stats(void)
4223 {
4224 atomic_set(&sdebug_cmnd_count, 0);
4225 atomic_set(&sdebug_completions, 0);
4226 atomic_set(&sdebug_miss_cpus, 0);
4227 atomic_set(&sdebug_a_tsf, 0);
4228 }
4229
4230 static void setup_inject(struct sdebug_queue *sqp,
4231 struct sdebug_queued_cmd *sqcp)
4232 {
4233 if ((atomic_read(&sdebug_cmnd_count) % abs(sdebug_every_nth)) > 0) {
4234 if (sdebug_every_nth > 0)
4235 sqcp->inj_recovered = sqcp->inj_transport
4236 = sqcp->inj_dif
4237 = sqcp->inj_dix = sqcp->inj_short
4238 = sqcp->inj_host_busy = sqcp->inj_cmd_abort = 0;
4239 return;
4240 }
4241 sqcp->inj_recovered = !!(SDEBUG_OPT_RECOVERED_ERR & sdebug_opts);
4242 sqcp->inj_transport = !!(SDEBUG_OPT_TRANSPORT_ERR & sdebug_opts);
4243 sqcp->inj_dif = !!(SDEBUG_OPT_DIF_ERR & sdebug_opts);
4244 sqcp->inj_dix = !!(SDEBUG_OPT_DIX_ERR & sdebug_opts);
4245 sqcp->inj_short = !!(SDEBUG_OPT_SHORT_TRANSFER & sdebug_opts);
4246 sqcp->inj_host_busy = !!(SDEBUG_OPT_HOST_BUSY & sdebug_opts);
4247 sqcp->inj_cmd_abort = !!(SDEBUG_OPT_CMD_ABORT & sdebug_opts);
4248 }
4249
4250 /* Complete the processing of the thread that queued a SCSI command to this
4251 * driver. It either completes the command by calling cmnd_done() or
4252 * schedules a hr timer or work queue then returns 0. Returns
4253 * SCSI_MLQUEUE_HOST_BUSY if temporarily out of resources.
4254 */
4255 static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip,
4256 int scsi_result,
4257 int (*pfp)(struct scsi_cmnd *,
4258 struct sdebug_dev_info *),
4259 int delta_jiff, int ndelay)
4260 {
4261 unsigned long iflags;
4262 int k, num_in_q, qdepth, inject;
4263 struct sdebug_queue *sqp;
4264 struct sdebug_queued_cmd *sqcp;
4265 struct scsi_device *sdp;
4266 struct sdebug_defer *sd_dp;
4267
4268 if (unlikely(devip == NULL)) {
4269 if (scsi_result == 0)
4270 scsi_result = DID_NO_CONNECT << 16;
4271 goto respond_in_thread;
4272 }
4273 sdp = cmnd->device;
4274
4275 if (delta_jiff == 0)
4276 goto respond_in_thread;
4277
4278 /* schedule the response at a later time if resources permit */
4279 sqp = get_queue(cmnd);
4280 spin_lock_irqsave(&sqp->qc_lock, iflags);
4281 if (unlikely(atomic_read(&sqp->blocked))) {
4282 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
4283 return SCSI_MLQUEUE_HOST_BUSY;
4284 }
4285 num_in_q = atomic_read(&devip->num_in_q);
4286 qdepth = cmnd->device->queue_depth;
4287 inject = 0;
4288 if (unlikely((qdepth > 0) && (num_in_q >= qdepth))) {
4289 if (scsi_result) {
4290 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
4291 goto respond_in_thread;
4292 } else
4293 scsi_result = device_qfull_result;
4294 } else if (unlikely(sdebug_every_nth &&
4295 (SDEBUG_OPT_RARE_TSF & sdebug_opts) &&
4296 (scsi_result == 0))) {
4297 if ((num_in_q == (qdepth - 1)) &&
4298 (atomic_inc_return(&sdebug_a_tsf) >=
4299 abs(sdebug_every_nth))) {
4300 atomic_set(&sdebug_a_tsf, 0);
4301 inject = 1;
4302 scsi_result = device_qfull_result;
4303 }
4304 }
4305
4306 k = find_first_zero_bit(sqp->in_use_bm, sdebug_max_queue);
4307 if (unlikely(k >= sdebug_max_queue)) {
4308 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
4309 if (scsi_result)
4310 goto respond_in_thread;
4311 else if (SDEBUG_OPT_ALL_TSF & sdebug_opts)
4312 scsi_result = device_qfull_result;
4313 if (SDEBUG_OPT_Q_NOISE & sdebug_opts)
4314 sdev_printk(KERN_INFO, sdp,
4315 "%s: max_queue=%d exceeded, %s\n",
4316 __func__, sdebug_max_queue,
4317 (scsi_result ? "status: TASK SET FULL" :
4318 "report: host busy"));
4319 if (scsi_result)
4320 goto respond_in_thread;
4321 else
4322 return SCSI_MLQUEUE_HOST_BUSY;
4323 }
4324 __set_bit(k, sqp->in_use_bm);
4325 atomic_inc(&devip->num_in_q);
4326 sqcp = &sqp->qc_arr[k];
4327 sqcp->a_cmnd = cmnd;
4328 cmnd->host_scribble = (unsigned char *)sqcp;
4329 sd_dp = sqcp->sd_dp;
4330 spin_unlock_irqrestore(&sqp->qc_lock, iflags);
4331 if (unlikely(sdebug_every_nth && sdebug_any_injecting_opt))
4332 setup_inject(sqp, sqcp);
4333 if (sd_dp == NULL) {
4334 sd_dp = kzalloc(sizeof(*sd_dp), GFP_ATOMIC);
4335 if (sd_dp == NULL)
4336 return SCSI_MLQUEUE_HOST_BUSY;
4337 }
4338
4339 cmnd->result = pfp != NULL ? pfp(cmnd, devip) : 0;
4340 if (cmnd->result & SDEG_RES_IMMED_MASK) {
4341 /*
4342 * This is the F_DELAY_OVERR case. No delay.
4343 */
4344 cmnd->result &= ~SDEG_RES_IMMED_MASK;
4345 delta_jiff = ndelay = 0;
4346 }
4347 if (cmnd->result == 0 && scsi_result != 0)
4348 cmnd->result = scsi_result;
4349
4350 if (unlikely(sdebug_verbose && cmnd->result))
4351 sdev_printk(KERN_INFO, sdp, "%s: non-zero result=0x%x\n",
4352 __func__, cmnd->result);
4353
4354 if (delta_jiff > 0 || ndelay > 0) {
4355 ktime_t kt;
4356
4357 if (delta_jiff > 0) {
4358 kt = ns_to_ktime((u64)delta_jiff * (NSEC_PER_SEC / HZ));
4359 } else
4360 kt = ndelay;
4361 if (!sd_dp->init_hrt) {
4362 sd_dp->init_hrt = true;
4363 sqcp->sd_dp = sd_dp;
4364 hrtimer_init(&sd_dp->hrt, CLOCK_MONOTONIC,
4365 HRTIMER_MODE_REL_PINNED);
4366 sd_dp->hrt.function = sdebug_q_cmd_hrt_complete;
4367 sd_dp->sqa_idx = sqp - sdebug_q_arr;
4368 sd_dp->qc_idx = k;
4369 }
4370 if (sdebug_statistics)
4371 sd_dp->issuing_cpu = raw_smp_processor_id();
4372 sd_dp->defer_t = SDEB_DEFER_HRT;
4373 hrtimer_start(&sd_dp->hrt, kt, HRTIMER_MODE_REL_PINNED);
4374 } else { /* jdelay < 0, use work queue */
4375 if (!sd_dp->init_wq) {
4376 sd_dp->init_wq = true;
4377 sqcp->sd_dp = sd_dp;
4378 sd_dp->sqa_idx = sqp - sdebug_q_arr;
4379 sd_dp->qc_idx = k;
4380 INIT_WORK(&sd_dp->ew.work, sdebug_q_cmd_wq_complete);
4381 }
4382 if (sdebug_statistics)
4383 sd_dp->issuing_cpu = raw_smp_processor_id();
4384 sd_dp->defer_t = SDEB_DEFER_WQ;
4385 if (unlikely(sqcp->inj_cmd_abort))
4386 sd_dp->aborted = true;
4387 schedule_work(&sd_dp->ew.work);
4388 if (unlikely(sqcp->inj_cmd_abort)) {
4389 sdev_printk(KERN_INFO, sdp, "abort request tag %d\n",
4390 cmnd->request->tag);
4391 blk_abort_request(cmnd->request);
4392 }
4393 }
4394 if (unlikely((SDEBUG_OPT_Q_NOISE & sdebug_opts) &&
4395 (scsi_result == device_qfull_result)))
4396 sdev_printk(KERN_INFO, sdp,
4397 "%s: num_in_q=%d +1, %s%s\n", __func__,
4398 num_in_q, (inject ? "<inject> " : ""),
4399 "status: TASK SET FULL");
4400 return 0;
4401
4402 respond_in_thread: /* call back to mid-layer using invocation thread */
4403 cmnd->result = pfp != NULL ? pfp(cmnd, devip) : 0;
4404 cmnd->result &= ~SDEG_RES_IMMED_MASK;
4405 if (cmnd->result == 0 && scsi_result != 0)
4406 cmnd->result = scsi_result;
4407 cmnd->scsi_done(cmnd);
4408 return 0;
4409 }
4410
4411 /* Note: The following macros create attribute files in the
4412 /sys/module/scsi_debug/parameters directory. Unfortunately this
4413 driver is unaware of a change and cannot trigger auxiliary actions
4414 as it can when the corresponding attribute in the
4415 /sys/bus/pseudo/drivers/scsi_debug directory is changed.
4416 */
4417 module_param_named(add_host, sdebug_add_host, int, S_IRUGO | S_IWUSR);
4418 module_param_named(ato, sdebug_ato, int, S_IRUGO);
4419 module_param_named(cdb_len, sdebug_cdb_len, int, 0644);
4420 module_param_named(clustering, sdebug_clustering, bool, S_IRUGO | S_IWUSR);
4421 module_param_named(delay, sdebug_jdelay, int, S_IRUGO | S_IWUSR);
4422 module_param_named(dev_size_mb, sdebug_dev_size_mb, int, S_IRUGO);
4423 module_param_named(dif, sdebug_dif, int, S_IRUGO);
4424 module_param_named(dix, sdebug_dix, int, S_IRUGO);
4425 module_param_named(dsense, sdebug_dsense, int, S_IRUGO | S_IWUSR);
4426 module_param_named(every_nth, sdebug_every_nth, int, S_IRUGO | S_IWUSR);
4427 module_param_named(fake_rw, sdebug_fake_rw, int, S_IRUGO | S_IWUSR);
4428 module_param_named(guard, sdebug_guard, uint, S_IRUGO);
4429 module_param_named(host_lock, sdebug_host_lock, bool, S_IRUGO | S_IWUSR);
4430 module_param_string(inq_vendor, sdebug_inq_vendor_id,
4431 sizeof(sdebug_inq_vendor_id), S_IRUGO|S_IWUSR);
4432 module_param_string(inq_product, sdebug_inq_product_id,
4433 sizeof(sdebug_inq_product_id), S_IRUGO|S_IWUSR);
4434 module_param_string(inq_rev, sdebug_inq_product_rev,
4435 sizeof(sdebug_inq_product_rev), S_IRUGO|S_IWUSR);
4436 module_param_named(lbpu, sdebug_lbpu, int, S_IRUGO);
4437 module_param_named(lbpws, sdebug_lbpws, int, S_IRUGO);
4438 module_param_named(lbpws10, sdebug_lbpws10, int, S_IRUGO);
4439 module_param_named(lbprz, sdebug_lbprz, int, S_IRUGO);
4440 module_param_named(lowest_aligned, sdebug_lowest_aligned, int, S_IRUGO);
4441 module_param_named(max_luns, sdebug_max_luns, int, S_IRUGO | S_IWUSR);
4442 module_param_named(max_queue, sdebug_max_queue, int, S_IRUGO | S_IWUSR);
4443 module_param_named(medium_error_start, sdebug_medium_error_start, int, S_IRUGO | S_IWUSR);
4444 module_param_named(medium_error_count, sdebug_medium_error_count, int, S_IRUGO | S_IWUSR);
4445 module_param_named(ndelay, sdebug_ndelay, int, S_IRUGO | S_IWUSR);
4446 module_param_named(no_lun_0, sdebug_no_lun_0, int, S_IRUGO | S_IWUSR);
4447 module_param_named(no_uld, sdebug_no_uld, int, S_IRUGO);
4448 module_param_named(num_parts, sdebug_num_parts, int, S_IRUGO);
4449 module_param_named(num_tgts, sdebug_num_tgts, int, S_IRUGO | S_IWUSR);
4450 module_param_named(opt_blks, sdebug_opt_blks, int, S_IRUGO);
4451 module_param_named(opts, sdebug_opts, int, S_IRUGO | S_IWUSR);
4452 module_param_named(physblk_exp, sdebug_physblk_exp, int, S_IRUGO);
4453 module_param_named(opt_xferlen_exp, sdebug_opt_xferlen_exp, int, S_IRUGO);
4454 module_param_named(ptype, sdebug_ptype, int, S_IRUGO | S_IWUSR);
4455 module_param_named(removable, sdebug_removable, bool, S_IRUGO | S_IWUSR);
4456 module_param_named(scsi_level, sdebug_scsi_level, int, S_IRUGO);
4457 module_param_named(sector_size, sdebug_sector_size, int, S_IRUGO);
4458 module_param_named(statistics, sdebug_statistics, bool, S_IRUGO | S_IWUSR);
4459 module_param_named(strict, sdebug_strict, bool, S_IRUGO | S_IWUSR);
4460 module_param_named(submit_queues, submit_queues, int, S_IRUGO);
4461 module_param_named(unmap_alignment, sdebug_unmap_alignment, int, S_IRUGO);
4462 module_param_named(unmap_granularity, sdebug_unmap_granularity, int, S_IRUGO);
4463 module_param_named(unmap_max_blocks, sdebug_unmap_max_blocks, int, S_IRUGO);
4464 module_param_named(unmap_max_desc, sdebug_unmap_max_desc, int, S_IRUGO);
4465 module_param_named(virtual_gb, sdebug_virtual_gb, int, S_IRUGO | S_IWUSR);
4466 module_param_named(uuid_ctl, sdebug_uuid_ctl, int, S_IRUGO);
4467 module_param_named(vpd_use_hostno, sdebug_vpd_use_hostno, int,
4468 S_IRUGO | S_IWUSR);
4469 module_param_named(wp, sdebug_wp, bool, S_IRUGO | S_IWUSR);
4470 module_param_named(write_same_length, sdebug_write_same_length, int,
4471 S_IRUGO | S_IWUSR);
4472
4473 MODULE_AUTHOR("Eric Youngdale + Douglas Gilbert");
4474 MODULE_DESCRIPTION("SCSI debug adapter driver");
4475 MODULE_LICENSE("GPL");
4476 MODULE_VERSION(SDEBUG_VERSION);
4477
4478 MODULE_PARM_DESC(add_host, "0..127 hosts allowed(def=1)");
4479 MODULE_PARM_DESC(ato, "application tag ownership: 0=disk 1=host (def=1)");
4480 MODULE_PARM_DESC(cdb_len, "suggest CDB lengths to drivers (def=10)");
4481 MODULE_PARM_DESC(clustering, "when set enables larger transfers (def=0)");
4482 MODULE_PARM_DESC(delay, "response delay (def=1 jiffy); 0:imm, -1,-2:tiny");
4483 MODULE_PARM_DESC(dev_size_mb, "size in MiB of ram shared by devs(def=8)");
4484 MODULE_PARM_DESC(dif, "data integrity field type: 0-3 (def=0)");
4485 MODULE_PARM_DESC(dix, "data integrity extensions mask (def=0)");
4486 MODULE_PARM_DESC(dsense, "use descriptor sense format(def=0 -> fixed)");
4487 MODULE_PARM_DESC(every_nth, "timeout every nth command(def=0)");
4488 MODULE_PARM_DESC(fake_rw, "fake reads/writes instead of copying (def=0)");
4489 MODULE_PARM_DESC(guard, "protection checksum: 0=crc, 1=ip (def=0)");
4490 MODULE_PARM_DESC(host_lock, "host_lock is ignored (def=0)");
4491 MODULE_PARM_DESC(inq_vendor, "SCSI INQUIRY vendor string (def=\"Linux\")");
4492 MODULE_PARM_DESC(inq_product, "SCSI INQUIRY product string (def=\"scsi_debug\")");
4493 MODULE_PARM_DESC(inq_rev, "SCSI INQUIRY revision string (def=\""
4494 SDEBUG_VERSION "\")");
4495 MODULE_PARM_DESC(lbpu, "enable LBP, support UNMAP command (def=0)");
4496 MODULE_PARM_DESC(lbpws, "enable LBP, support WRITE SAME(16) with UNMAP bit (def=0)");
4497 MODULE_PARM_DESC(lbpws10, "enable LBP, support WRITE SAME(10) with UNMAP bit (def=0)");
4498 MODULE_PARM_DESC(lbprz,
4499 "on read unmapped LBs return 0 when 1 (def), return 0xff when 2");
4500 MODULE_PARM_DESC(lowest_aligned, "lowest aligned lba (def=0)");
4501 MODULE_PARM_DESC(max_luns, "number of LUNs per target to simulate(def=1)");
4502 MODULE_PARM_DESC(max_queue, "max number of queued commands (1 to max(def))");
4503 MODULE_PARM_DESC(medium_error_start, "starting sector number to return MEDIUM error");
4504 MODULE_PARM_DESC(medium_error_count, "count of sectors to return follow on MEDIUM error");
4505 MODULE_PARM_DESC(ndelay, "response delay in nanoseconds (def=0 -> ignore)");
4506 MODULE_PARM_DESC(no_lun_0, "no LU number 0 (def=0 -> have lun 0)");
4507 MODULE_PARM_DESC(no_uld, "stop ULD (e.g. sd driver) attaching (def=0))");
4508 MODULE_PARM_DESC(num_parts, "number of partitions(def=0)");
4509 MODULE_PARM_DESC(num_tgts, "number of targets per host to simulate(def=1)");
4510 MODULE_PARM_DESC(opt_blks, "optimal transfer length in blocks (def=1024)");
4511 MODULE_PARM_DESC(opts, "1->noise, 2->medium_err, 4->timeout, 8->recovered_err... (def=0)");
4512 MODULE_PARM_DESC(physblk_exp, "physical block exponent (def=0)");
4513 MODULE_PARM_DESC(opt_xferlen_exp, "optimal transfer length granularity exponent (def=physblk_exp)");
4514 MODULE_PARM_DESC(ptype, "SCSI peripheral type(def=0[disk])");
4515 MODULE_PARM_DESC(removable, "claim to have removable media (def=0)");
4516 MODULE_PARM_DESC(scsi_level, "SCSI level to simulate(def=7[SPC-5])");
4517 MODULE_PARM_DESC(sector_size, "logical block size in bytes (def=512)");
4518 MODULE_PARM_DESC(statistics, "collect statistics on commands, queues (def=0)");
4519 MODULE_PARM_DESC(strict, "stricter checks: reserved field in cdb (def=0)");
4520 MODULE_PARM_DESC(submit_queues, "support for block multi-queue (def=1)");
4521 MODULE_PARM_DESC(unmap_alignment, "lowest aligned thin provisioning lba (def=0)");
4522 MODULE_PARM_DESC(unmap_granularity, "thin provisioning granularity in blocks (def=1)");
4523 MODULE_PARM_DESC(unmap_max_blocks, "max # of blocks can be unmapped in one cmd (def=0xffffffff)");
4524 MODULE_PARM_DESC(unmap_max_desc, "max # of ranges that can be unmapped in one cmd (def=256)");
4525 MODULE_PARM_DESC(uuid_ctl,
4526 "1->use uuid for lu name, 0->don't, 2->all use same (def=0)");
4527 MODULE_PARM_DESC(virtual_gb, "virtual gigabyte (GiB) size (def=0 -> use dev_size_mb)");
4528 MODULE_PARM_DESC(vpd_use_hostno, "0 -> dev ids ignore hostno (def=1 -> unique dev ids)");
4529 MODULE_PARM_DESC(wp, "Write Protect (def=0)");
4530 MODULE_PARM_DESC(write_same_length, "Maximum blocks per WRITE SAME cmd (def=0xffff)");
4531
4532 #define SDEBUG_INFO_LEN 256
4533 static char sdebug_info[SDEBUG_INFO_LEN];
4534
4535 static const char *scsi_debug_info(struct Scsi_Host *shp)
4536 {
4537 int k;
4538
4539 k = scnprintf(sdebug_info, SDEBUG_INFO_LEN, "%s: version %s [%s]\n",
4540 my_name, SDEBUG_VERSION, sdebug_version_date);
4541 if (k >= (SDEBUG_INFO_LEN - 1))
4542 return sdebug_info;
4543 scnprintf(sdebug_info + k, SDEBUG_INFO_LEN - k,
4544 " dev_size_mb=%d, opts=0x%x, submit_queues=%d, %s=%d",
4545 sdebug_dev_size_mb, sdebug_opts, submit_queues,
4546 "statistics", (int)sdebug_statistics);
4547 return sdebug_info;
4548 }
4549
4550 /* 'echo <val> > /proc/scsi/scsi_debug/<host_id>' writes to opts */
4551 static int scsi_debug_write_info(struct Scsi_Host *host, char *buffer,
4552 int length)
4553 {
4554 char arr[16];
4555 int opts;
4556 int minLen = length > 15 ? 15 : length;
4557
4558 if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
4559 return -EACCES;
4560 memcpy(arr, buffer, minLen);
4561 arr[minLen] = '\0';
4562 if (1 != sscanf(arr, "%d", &opts))
4563 return -EINVAL;
4564 sdebug_opts = opts;
4565 sdebug_verbose = !!(SDEBUG_OPT_NOISE & opts);
4566 sdebug_any_injecting_opt = !!(SDEBUG_OPT_ALL_INJECTING & opts);
4567 if (sdebug_every_nth != 0)
4568 tweak_cmnd_count();
4569 return length;
4570 }
4571
4572 /* Output seen with 'cat /proc/scsi/scsi_debug/<host_id>'. It will be the
4573 * same for each scsi_debug host (if more than one). Some of the counters
4574 * output are not atomics so might be inaccurate in a busy system. */
4575 static int scsi_debug_show_info(struct seq_file *m, struct Scsi_Host *host)
4576 {
4577 int f, j, l;
4578 struct sdebug_queue *sqp;
4579
4580 seq_printf(m, "scsi_debug adapter driver, version %s [%s]\n",
4581 SDEBUG_VERSION, sdebug_version_date);
4582 seq_printf(m, "num_tgts=%d, %ssize=%d MB, opts=0x%x, every_nth=%d\n",
4583 sdebug_num_tgts, "shared (ram) ", sdebug_dev_size_mb,
4584 sdebug_opts, sdebug_every_nth);
4585 seq_printf(m, "delay=%d, ndelay=%d, max_luns=%d, sector_size=%d %s\n",
4586 sdebug_jdelay, sdebug_ndelay, sdebug_max_luns,
4587 sdebug_sector_size, "bytes");
4588 seq_printf(m, "cylinders=%d, heads=%d, sectors=%d, command aborts=%d\n",
4589 sdebug_cylinders_per, sdebug_heads, sdebug_sectors_per,
4590 num_aborts);
4591 seq_printf(m, "RESETs: device=%d, target=%d, bus=%d, host=%d\n",
4592 num_dev_resets, num_target_resets, num_bus_resets,
4593 num_host_resets);
4594 seq_printf(m, "dix_reads=%d, dix_writes=%d, dif_errors=%d\n",
4595 dix_reads, dix_writes, dif_errors);
4596 seq_printf(m, "usec_in_jiffy=%lu, statistics=%d\n", TICK_NSEC / 1000,
4597 sdebug_statistics);
4598 seq_printf(m, "cmnd_count=%d, completions=%d, %s=%d, a_tsf=%d\n",
4599 atomic_read(&sdebug_cmnd_count),
4600 atomic_read(&sdebug_completions),
4601 "miss_cpus", atomic_read(&sdebug_miss_cpus),
4602 atomic_read(&sdebug_a_tsf));
4603
4604 seq_printf(m, "submit_queues=%d\n", submit_queues);
4605 for (j = 0, sqp = sdebug_q_arr; j < submit_queues; ++j, ++sqp) {
4606 seq_printf(m, " queue %d:\n", j);
4607 f = find_first_bit(sqp->in_use_bm, sdebug_max_queue);
4608 if (f != sdebug_max_queue) {
4609 l = find_last_bit(sqp->in_use_bm, sdebug_max_queue);
4610 seq_printf(m, " in_use_bm BUSY: %s: %d,%d\n",
4611 "first,last bits", f, l);
4612 }
4613 }
4614 return 0;
4615 }
4616
4617 static ssize_t delay_show(struct device_driver *ddp, char *buf)
4618 {
4619 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_jdelay);
4620 }
4621 /* Returns -EBUSY if jdelay is being changed and commands are queued. The unit
4622 * of delay is jiffies.
4623 */
4624 static ssize_t delay_store(struct device_driver *ddp, const char *buf,
4625 size_t count)
4626 {
4627 int jdelay, res;
4628
4629 if (count > 0 && sscanf(buf, "%d", &jdelay) == 1) {
4630 res = count;
4631 if (sdebug_jdelay != jdelay) {
4632 int j, k;
4633 struct sdebug_queue *sqp;
4634
4635 block_unblock_all_queues(true);
4636 for (j = 0, sqp = sdebug_q_arr; j < submit_queues;
4637 ++j, ++sqp) {
4638 k = find_first_bit(sqp->in_use_bm,
4639 sdebug_max_queue);
4640 if (k != sdebug_max_queue) {
4641 res = -EBUSY; /* queued commands */
4642 break;
4643 }
4644 }
4645 if (res > 0) {
4646 sdebug_jdelay = jdelay;
4647 sdebug_ndelay = 0;
4648 }
4649 block_unblock_all_queues(false);
4650 }
4651 return res;
4652 }
4653 return -EINVAL;
4654 }
4655 static DRIVER_ATTR_RW(delay);
4656
4657 static ssize_t ndelay_show(struct device_driver *ddp, char *buf)
4658 {
4659 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_ndelay);
4660 }
4661 /* Returns -EBUSY if ndelay is being changed and commands are queued */
4662 /* If > 0 and accepted then sdebug_jdelay is set to JDELAY_OVERRIDDEN */
4663 static ssize_t ndelay_store(struct device_driver *ddp, const char *buf,
4664 size_t count)
4665 {
4666 int ndelay, res;
4667
4668 if ((count > 0) && (1 == sscanf(buf, "%d", &ndelay)) &&
4669 (ndelay >= 0) && (ndelay < (1000 * 1000 * 1000))) {
4670 res = count;
4671 if (sdebug_ndelay != ndelay) {
4672 int j, k;
4673 struct sdebug_queue *sqp;
4674
4675 block_unblock_all_queues(true);
4676 for (j = 0, sqp = sdebug_q_arr; j < submit_queues;
4677 ++j, ++sqp) {
4678 k = find_first_bit(sqp->in_use_bm,
4679 sdebug_max_queue);
4680 if (k != sdebug_max_queue) {
4681 res = -EBUSY; /* queued commands */
4682 break;
4683 }
4684 }
4685 if (res > 0) {
4686 sdebug_ndelay = ndelay;
4687 sdebug_jdelay = ndelay ? JDELAY_OVERRIDDEN
4688 : DEF_JDELAY;
4689 }
4690 block_unblock_all_queues(false);
4691 }
4692 return res;
4693 }
4694 return -EINVAL;
4695 }
4696 static DRIVER_ATTR_RW(ndelay);
4697
4698 static ssize_t opts_show(struct device_driver *ddp, char *buf)
4699 {
4700 return scnprintf(buf, PAGE_SIZE, "0x%x\n", sdebug_opts);
4701 }
4702
4703 static ssize_t opts_store(struct device_driver *ddp, const char *buf,
4704 size_t count)
4705 {
4706 int opts;
4707 char work[20];
4708
4709 if (sscanf(buf, "%10s", work) == 1) {
4710 if (strncasecmp(work, "0x", 2) == 0) {
4711 if (kstrtoint(work + 2, 16, &opts) == 0)
4712 goto opts_done;
4713 } else {
4714 if (kstrtoint(work, 10, &opts) == 0)
4715 goto opts_done;
4716 }
4717 }
4718 return -EINVAL;
4719 opts_done:
4720 sdebug_opts = opts;
4721 sdebug_verbose = !!(SDEBUG_OPT_NOISE & opts);
4722 sdebug_any_injecting_opt = !!(SDEBUG_OPT_ALL_INJECTING & opts);
4723 tweak_cmnd_count();
4724 return count;
4725 }
4726 static DRIVER_ATTR_RW(opts);
4727
4728 static ssize_t ptype_show(struct device_driver *ddp, char *buf)
4729 {
4730 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_ptype);
4731 }
4732 static ssize_t ptype_store(struct device_driver *ddp, const char *buf,
4733 size_t count)
4734 {
4735 int n;
4736
4737 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
4738 sdebug_ptype = n;
4739 return count;
4740 }
4741 return -EINVAL;
4742 }
4743 static DRIVER_ATTR_RW(ptype);
4744
4745 static ssize_t dsense_show(struct device_driver *ddp, char *buf)
4746 {
4747 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dsense);
4748 }
4749 static ssize_t dsense_store(struct device_driver *ddp, const char *buf,
4750 size_t count)
4751 {
4752 int n;
4753
4754 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
4755 sdebug_dsense = n;
4756 return count;
4757 }
4758 return -EINVAL;
4759 }
4760 static DRIVER_ATTR_RW(dsense);
4761
4762 static ssize_t fake_rw_show(struct device_driver *ddp, char *buf)
4763 {
4764 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_fake_rw);
4765 }
4766 static ssize_t fake_rw_store(struct device_driver *ddp, const char *buf,
4767 size_t count)
4768 {
4769 int n;
4770
4771 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
4772 n = (n > 0);
4773 sdebug_fake_rw = (sdebug_fake_rw > 0);
4774 if (sdebug_fake_rw != n) {
4775 if ((0 == n) && (NULL == fake_storep)) {
4776 unsigned long sz =
4777 (unsigned long)sdebug_dev_size_mb *
4778 1048576;
4779
4780 fake_storep = vzalloc(sz);
4781 if (NULL == fake_storep) {
4782 pr_err("out of memory, 9\n");
4783 return -ENOMEM;
4784 }
4785 }
4786 sdebug_fake_rw = n;
4787 }
4788 return count;
4789 }
4790 return -EINVAL;
4791 }
4792 static DRIVER_ATTR_RW(fake_rw);
4793
4794 static ssize_t no_lun_0_show(struct device_driver *ddp, char *buf)
4795 {
4796 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_no_lun_0);
4797 }
4798 static ssize_t no_lun_0_store(struct device_driver *ddp, const char *buf,
4799 size_t count)
4800 {
4801 int n;
4802
4803 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
4804 sdebug_no_lun_0 = n;
4805 return count;
4806 }
4807 return -EINVAL;
4808 }
4809 static DRIVER_ATTR_RW(no_lun_0);
4810
4811 static ssize_t num_tgts_show(struct device_driver *ddp, char *buf)
4812 {
4813 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_num_tgts);
4814 }
4815 static ssize_t num_tgts_store(struct device_driver *ddp, const char *buf,
4816 size_t count)
4817 {
4818 int n;
4819
4820 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
4821 sdebug_num_tgts = n;
4822 sdebug_max_tgts_luns();
4823 return count;
4824 }
4825 return -EINVAL;
4826 }
4827 static DRIVER_ATTR_RW(num_tgts);
4828
4829 static ssize_t dev_size_mb_show(struct device_driver *ddp, char *buf)
4830 {
4831 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dev_size_mb);
4832 }
4833 static DRIVER_ATTR_RO(dev_size_mb);
4834
4835 static ssize_t num_parts_show(struct device_driver *ddp, char *buf)
4836 {
4837 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_num_parts);
4838 }
4839 static DRIVER_ATTR_RO(num_parts);
4840
4841 static ssize_t every_nth_show(struct device_driver *ddp, char *buf)
4842 {
4843 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_every_nth);
4844 }
4845 static ssize_t every_nth_store(struct device_driver *ddp, const char *buf,
4846 size_t count)
4847 {
4848 int nth;
4849
4850 if ((count > 0) && (1 == sscanf(buf, "%d", &nth))) {
4851 sdebug_every_nth = nth;
4852 if (nth && !sdebug_statistics) {
4853 pr_info("every_nth needs statistics=1, set it\n");
4854 sdebug_statistics = true;
4855 }
4856 tweak_cmnd_count();
4857 return count;
4858 }
4859 return -EINVAL;
4860 }
4861 static DRIVER_ATTR_RW(every_nth);
4862
4863 static ssize_t max_luns_show(struct device_driver *ddp, char *buf)
4864 {
4865 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_max_luns);
4866 }
4867 static ssize_t max_luns_store(struct device_driver *ddp, const char *buf,
4868 size_t count)
4869 {
4870 int n;
4871 bool changed;
4872
4873 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
4874 if (n > 256) {
4875 pr_warn("max_luns can be no more than 256\n");
4876 return -EINVAL;
4877 }
4878 changed = (sdebug_max_luns != n);
4879 sdebug_max_luns = n;
4880 sdebug_max_tgts_luns();
4881 if (changed && (sdebug_scsi_level >= 5)) { /* >= SPC-3 */
4882 struct sdebug_host_info *sdhp;
4883 struct sdebug_dev_info *dp;
4884
4885 spin_lock(&sdebug_host_list_lock);
4886 list_for_each_entry(sdhp, &sdebug_host_list,
4887 host_list) {
4888 list_for_each_entry(dp, &sdhp->dev_info_list,
4889 dev_list) {
4890 set_bit(SDEBUG_UA_LUNS_CHANGED,
4891 dp->uas_bm);
4892 }
4893 }
4894 spin_unlock(&sdebug_host_list_lock);
4895 }
4896 return count;
4897 }
4898 return -EINVAL;
4899 }
4900 static DRIVER_ATTR_RW(max_luns);
4901
4902 static ssize_t max_queue_show(struct device_driver *ddp, char *buf)
4903 {
4904 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_max_queue);
4905 }
4906 /* N.B. max_queue can be changed while there are queued commands. In flight
4907 * commands beyond the new max_queue will be completed. */
4908 static ssize_t max_queue_store(struct device_driver *ddp, const char *buf,
4909 size_t count)
4910 {
4911 int j, n, k, a;
4912 struct sdebug_queue *sqp;
4913
4914 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n > 0) &&
4915 (n <= SDEBUG_CANQUEUE)) {
4916 block_unblock_all_queues(true);
4917 k = 0;
4918 for (j = 0, sqp = sdebug_q_arr; j < submit_queues;
4919 ++j, ++sqp) {
4920 a = find_last_bit(sqp->in_use_bm, SDEBUG_CANQUEUE);
4921 if (a > k)
4922 k = a;
4923 }
4924 sdebug_max_queue = n;
4925 if (k == SDEBUG_CANQUEUE)
4926 atomic_set(&retired_max_queue, 0);
4927 else if (k >= n)
4928 atomic_set(&retired_max_queue, k + 1);
4929 else
4930 atomic_set(&retired_max_queue, 0);
4931 block_unblock_all_queues(false);
4932 return count;
4933 }
4934 return -EINVAL;
4935 }
4936 static DRIVER_ATTR_RW(max_queue);
4937
4938 static ssize_t no_uld_show(struct device_driver *ddp, char *buf)
4939 {
4940 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_no_uld);
4941 }
4942 static DRIVER_ATTR_RO(no_uld);
4943
4944 static ssize_t scsi_level_show(struct device_driver *ddp, char *buf)
4945 {
4946 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_scsi_level);
4947 }
4948 static DRIVER_ATTR_RO(scsi_level);
4949
4950 static ssize_t virtual_gb_show(struct device_driver *ddp, char *buf)
4951 {
4952 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_virtual_gb);
4953 }
4954 static ssize_t virtual_gb_store(struct device_driver *ddp, const char *buf,
4955 size_t count)
4956 {
4957 int n;
4958 bool changed;
4959
4960 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
4961 changed = (sdebug_virtual_gb != n);
4962 sdebug_virtual_gb = n;
4963 sdebug_capacity = get_sdebug_capacity();
4964 if (changed) {
4965 struct sdebug_host_info *sdhp;
4966 struct sdebug_dev_info *dp;
4967
4968 spin_lock(&sdebug_host_list_lock);
4969 list_for_each_entry(sdhp, &sdebug_host_list,
4970 host_list) {
4971 list_for_each_entry(dp, &sdhp->dev_info_list,
4972 dev_list) {
4973 set_bit(SDEBUG_UA_CAPACITY_CHANGED,
4974 dp->uas_bm);
4975 }
4976 }
4977 spin_unlock(&sdebug_host_list_lock);
4978 }
4979 return count;
4980 }
4981 return -EINVAL;
4982 }
4983 static DRIVER_ATTR_RW(virtual_gb);
4984
4985 static ssize_t add_host_show(struct device_driver *ddp, char *buf)
4986 {
4987 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_add_host);
4988 }
4989
4990 static int sdebug_add_adapter(void);
4991 static void sdebug_remove_adapter(void);
4992
4993 static ssize_t add_host_store(struct device_driver *ddp, const char *buf,
4994 size_t count)
4995 {
4996 int delta_hosts;
4997
4998 if (sscanf(buf, "%d", &delta_hosts) != 1)
4999 return -EINVAL;
5000 if (delta_hosts > 0) {
5001 do {
5002 sdebug_add_adapter();
5003 } while (--delta_hosts);
5004 } else if (delta_hosts < 0) {
5005 do {
5006 sdebug_remove_adapter();
5007 } while (++delta_hosts);
5008 }
5009 return count;
5010 }
5011 static DRIVER_ATTR_RW(add_host);
5012
5013 static ssize_t vpd_use_hostno_show(struct device_driver *ddp, char *buf)
5014 {
5015 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_vpd_use_hostno);
5016 }
5017 static ssize_t vpd_use_hostno_store(struct device_driver *ddp, const char *buf,
5018 size_t count)
5019 {
5020 int n;
5021
5022 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
5023 sdebug_vpd_use_hostno = n;
5024 return count;
5025 }
5026 return -EINVAL;
5027 }
5028 static DRIVER_ATTR_RW(vpd_use_hostno);
5029
5030 static ssize_t statistics_show(struct device_driver *ddp, char *buf)
5031 {
5032 return scnprintf(buf, PAGE_SIZE, "%d\n", (int)sdebug_statistics);
5033 }
5034 static ssize_t statistics_store(struct device_driver *ddp, const char *buf,
5035 size_t count)
5036 {
5037 int n;
5038
5039 if ((count > 0) && (sscanf(buf, "%d", &n) == 1) && (n >= 0)) {
5040 if (n > 0)
5041 sdebug_statistics = true;
5042 else {
5043 clear_queue_stats();
5044 sdebug_statistics = false;
5045 }
5046 return count;
5047 }
5048 return -EINVAL;
5049 }
5050 static DRIVER_ATTR_RW(statistics);
5051
5052 static ssize_t sector_size_show(struct device_driver *ddp, char *buf)
5053 {
5054 return scnprintf(buf, PAGE_SIZE, "%u\n", sdebug_sector_size);
5055 }
5056 static DRIVER_ATTR_RO(sector_size);
5057
5058 static ssize_t submit_queues_show(struct device_driver *ddp, char *buf)
5059 {
5060 return scnprintf(buf, PAGE_SIZE, "%d\n", submit_queues);
5061 }
5062 static DRIVER_ATTR_RO(submit_queues);
5063
5064 static ssize_t dix_show(struct device_driver *ddp, char *buf)
5065 {
5066 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dix);
5067 }
5068 static DRIVER_ATTR_RO(dix);
5069
5070 static ssize_t dif_show(struct device_driver *ddp, char *buf)
5071 {
5072 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_dif);
5073 }
5074 static DRIVER_ATTR_RO(dif);
5075
5076 static ssize_t guard_show(struct device_driver *ddp, char *buf)
5077 {
5078 return scnprintf(buf, PAGE_SIZE, "%u\n", sdebug_guard);
5079 }
5080 static DRIVER_ATTR_RO(guard);
5081
5082 static ssize_t ato_show(struct device_driver *ddp, char *buf)
5083 {
5084 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_ato);
5085 }
5086 static DRIVER_ATTR_RO(ato);
5087
5088 static ssize_t map_show(struct device_driver *ddp, char *buf)
5089 {
5090 ssize_t count;
5091
5092 if (!scsi_debug_lbp())
5093 return scnprintf(buf, PAGE_SIZE, "0-%u\n",
5094 sdebug_store_sectors);
5095
5096 count = scnprintf(buf, PAGE_SIZE - 1, "%*pbl",
5097 (int)map_size, map_storep);
5098 buf[count++] = '\n';
5099 buf[count] = '\0';
5100
5101 return count;
5102 }
5103 static DRIVER_ATTR_RO(map);
5104
5105 static ssize_t removable_show(struct device_driver *ddp, char *buf)
5106 {
5107 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_removable ? 1 : 0);
5108 }
5109 static ssize_t removable_store(struct device_driver *ddp, const char *buf,
5110 size_t count)
5111 {
5112 int n;
5113
5114 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
5115 sdebug_removable = (n > 0);
5116 return count;
5117 }
5118 return -EINVAL;
5119 }
5120 static DRIVER_ATTR_RW(removable);
5121
5122 static ssize_t host_lock_show(struct device_driver *ddp, char *buf)
5123 {
5124 return scnprintf(buf, PAGE_SIZE, "%d\n", !!sdebug_host_lock);
5125 }
5126 /* N.B. sdebug_host_lock does nothing, kept for backward compatibility */
5127 static ssize_t host_lock_store(struct device_driver *ddp, const char *buf,
5128 size_t count)
5129 {
5130 int n;
5131
5132 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
5133 sdebug_host_lock = (n > 0);
5134 return count;
5135 }
5136 return -EINVAL;
5137 }
5138 static DRIVER_ATTR_RW(host_lock);
5139
5140 static ssize_t strict_show(struct device_driver *ddp, char *buf)
5141 {
5142 return scnprintf(buf, PAGE_SIZE, "%d\n", !!sdebug_strict);
5143 }
5144 static ssize_t strict_store(struct device_driver *ddp, const char *buf,
5145 size_t count)
5146 {
5147 int n;
5148
5149 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
5150 sdebug_strict = (n > 0);
5151 return count;
5152 }
5153 return -EINVAL;
5154 }
5155 static DRIVER_ATTR_RW(strict);
5156
5157 static ssize_t uuid_ctl_show(struct device_driver *ddp, char *buf)
5158 {
5159 return scnprintf(buf, PAGE_SIZE, "%d\n", !!sdebug_uuid_ctl);
5160 }
5161 static DRIVER_ATTR_RO(uuid_ctl);
5162
5163 static ssize_t cdb_len_show(struct device_driver *ddp, char *buf)
5164 {
5165 return scnprintf(buf, PAGE_SIZE, "%d\n", sdebug_cdb_len);
5166 }
5167 static ssize_t cdb_len_store(struct device_driver *ddp, const char *buf,
5168 size_t count)
5169 {
5170 int ret, n;
5171
5172 ret = kstrtoint(buf, 0, &n);
5173 if (ret)
5174 return ret;
5175 sdebug_cdb_len = n;
5176 all_config_cdb_len();
5177 return count;
5178 }
5179 static DRIVER_ATTR_RW(cdb_len);
5180
5181
5182 /* Note: The following array creates attribute files in the
5183 /sys/bus/pseudo/drivers/scsi_debug directory. The advantage of these
5184 files (over those found in the /sys/module/scsi_debug/parameters
5185 directory) is that auxiliary actions can be triggered when an attribute
5186 is changed. For example see: sdebug_add_host_store() above.
5187 */
5188
5189 static struct attribute *sdebug_drv_attrs[] = {
5190 &driver_attr_delay.attr,
5191 &driver_attr_opts.attr,
5192 &driver_attr_ptype.attr,
5193 &driver_attr_dsense.attr,
5194 &driver_attr_fake_rw.attr,
5195 &driver_attr_no_lun_0.attr,
5196 &driver_attr_num_tgts.attr,
5197 &driver_attr_dev_size_mb.attr,
5198 &driver_attr_num_parts.attr,
5199 &driver_attr_every_nth.attr,
5200 &driver_attr_max_luns.attr,
5201 &driver_attr_max_queue.attr,
5202 &driver_attr_no_uld.attr,
5203 &driver_attr_scsi_level.attr,
5204 &driver_attr_virtual_gb.attr,
5205 &driver_attr_add_host.attr,
5206 &driver_attr_vpd_use_hostno.attr,
5207 &driver_attr_sector_size.attr,
5208 &driver_attr_statistics.attr,
5209 &driver_attr_submit_queues.attr,
5210 &driver_attr_dix.attr,
5211 &driver_attr_dif.attr,
5212 &driver_attr_guard.attr,
5213 &driver_attr_ato.attr,
5214 &driver_attr_map.attr,
5215 &driver_attr_removable.attr,
5216 &driver_attr_host_lock.attr,
5217 &driver_attr_ndelay.attr,
5218 &driver_attr_strict.attr,
5219 &driver_attr_uuid_ctl.attr,
5220 &driver_attr_cdb_len.attr,
5221 NULL,
5222 };
5223 ATTRIBUTE_GROUPS(sdebug_drv);
5224
5225 static struct device *pseudo_primary;
5226
5227 static int __init scsi_debug_init(void)
5228 {
5229 unsigned long sz;
5230 int host_to_add;
5231 int k;
5232 int ret;
5233
5234 atomic_set(&retired_max_queue, 0);
5235
5236 if (sdebug_ndelay >= 1000 * 1000 * 1000) {
5237 pr_warn("ndelay must be less than 1 second, ignored\n");
5238 sdebug_ndelay = 0;
5239 } else if (sdebug_ndelay > 0)
5240 sdebug_jdelay = JDELAY_OVERRIDDEN;
5241
5242 switch (sdebug_sector_size) {
5243 case 512:
5244 case 1024:
5245 case 2048:
5246 case 4096:
5247 break;
5248 default:
5249 pr_err("invalid sector_size %d\n", sdebug_sector_size);
5250 return -EINVAL;
5251 }
5252
5253 switch (sdebug_dif) {
5254 case T10_PI_TYPE0_PROTECTION:
5255 break;
5256 case T10_PI_TYPE1_PROTECTION:
5257 case T10_PI_TYPE2_PROTECTION:
5258 case T10_PI_TYPE3_PROTECTION:
5259 have_dif_prot = true;
5260 break;
5261
5262 default:
5263 pr_err("dif must be 0, 1, 2 or 3\n");
5264 return -EINVAL;
5265 }
5266
5267 if (sdebug_num_tgts < 0) {
5268 pr_err("num_tgts must be >= 0\n");
5269 return -EINVAL;
5270 }
5271
5272 if (sdebug_guard > 1) {
5273 pr_err("guard must be 0 or 1\n");
5274 return -EINVAL;
5275 }
5276
5277 if (sdebug_ato > 1) {
5278 pr_err("ato must be 0 or 1\n");
5279 return -EINVAL;
5280 }
5281
5282 if (sdebug_physblk_exp > 15) {
5283 pr_err("invalid physblk_exp %u\n", sdebug_physblk_exp);
5284 return -EINVAL;
5285 }
5286 if (sdebug_max_luns > 256) {
5287 pr_warn("max_luns can be no more than 256, use default\n");
5288 sdebug_max_luns = DEF_MAX_LUNS;
5289 }
5290
5291 if (sdebug_lowest_aligned > 0x3fff) {
5292 pr_err("lowest_aligned too big: %u\n", sdebug_lowest_aligned);
5293 return -EINVAL;
5294 }
5295
5296 if (submit_queues < 1) {
5297 pr_err("submit_queues must be 1 or more\n");
5298 return -EINVAL;
5299 }
5300 sdebug_q_arr = kcalloc(submit_queues, sizeof(struct sdebug_queue),
5301 GFP_KERNEL);
5302 if (sdebug_q_arr == NULL)
5303 return -ENOMEM;
5304 for (k = 0; k < submit_queues; ++k)
5305 spin_lock_init(&sdebug_q_arr[k].qc_lock);
5306
5307 if (sdebug_dev_size_mb < 1)
5308 sdebug_dev_size_mb = 1; /* force minimum 1 MB ramdisk */
5309 sz = (unsigned long)sdebug_dev_size_mb * 1048576;
5310 sdebug_store_sectors = sz / sdebug_sector_size;
5311 sdebug_capacity = get_sdebug_capacity();
5312
5313 /* play around with geometry, don't waste too much on track 0 */
5314 sdebug_heads = 8;
5315 sdebug_sectors_per = 32;
5316 if (sdebug_dev_size_mb >= 256)
5317 sdebug_heads = 64;
5318 else if (sdebug_dev_size_mb >= 16)
5319 sdebug_heads = 32;
5320 sdebug_cylinders_per = (unsigned long)sdebug_capacity /
5321 (sdebug_sectors_per * sdebug_heads);
5322 if (sdebug_cylinders_per >= 1024) {
5323 /* other LLDs do this; implies >= 1GB ram disk ... */
5324 sdebug_heads = 255;
5325 sdebug_sectors_per = 63;
5326 sdebug_cylinders_per = (unsigned long)sdebug_capacity /
5327 (sdebug_sectors_per * sdebug_heads);
5328 }
5329
5330 if (sdebug_fake_rw == 0) {
5331 fake_storep = vzalloc(sz);
5332 if (NULL == fake_storep) {
5333 pr_err("out of memory, 1\n");
5334 ret = -ENOMEM;
5335 goto free_q_arr;
5336 }
5337 if (sdebug_num_parts > 0)
5338 sdebug_build_parts(fake_storep, sz);
5339 }
5340
5341 if (sdebug_dix) {
5342 int dif_size;
5343
5344 dif_size = sdebug_store_sectors * sizeof(struct t10_pi_tuple);
5345 dif_storep = vmalloc(dif_size);
5346
5347 pr_err("dif_storep %u bytes @ %p\n", dif_size, dif_storep);
5348
5349 if (dif_storep == NULL) {
5350 pr_err("out of mem. (DIX)\n");
5351 ret = -ENOMEM;
5352 goto free_vm;
5353 }
5354
5355 memset(dif_storep, 0xff, dif_size);
5356 }
5357
5358 /* Logical Block Provisioning */
5359 if (scsi_debug_lbp()) {
5360 sdebug_unmap_max_blocks =
5361 clamp(sdebug_unmap_max_blocks, 0U, 0xffffffffU);
5362
5363 sdebug_unmap_max_desc =
5364 clamp(sdebug_unmap_max_desc, 0U, 256U);
5365
5366 sdebug_unmap_granularity =
5367 clamp(sdebug_unmap_granularity, 1U, 0xffffffffU);
5368
5369 if (sdebug_unmap_alignment &&
5370 sdebug_unmap_granularity <=
5371 sdebug_unmap_alignment) {
5372 pr_err("ERR: unmap_granularity <= unmap_alignment\n");
5373 ret = -EINVAL;
5374 goto free_vm;
5375 }
5376
5377 map_size = lba_to_map_index(sdebug_store_sectors - 1) + 1;
5378 map_storep = vmalloc(array_size(sizeof(long),
5379 BITS_TO_LONGS(map_size)));
5380
5381 pr_info("%lu provisioning blocks\n", map_size);
5382
5383 if (map_storep == NULL) {
5384 pr_err("out of mem. (MAP)\n");
5385 ret = -ENOMEM;
5386 goto free_vm;
5387 }
5388
5389 bitmap_zero(map_storep, map_size);
5390
5391 /* Map first 1KB for partition table */
5392 if (sdebug_num_parts)
5393 map_region(0, 2);
5394 }
5395
5396 pseudo_primary = root_device_register("pseudo_0");
5397 if (IS_ERR(pseudo_primary)) {
5398 pr_warn("root_device_register() error\n");
5399 ret = PTR_ERR(pseudo_primary);
5400 goto free_vm;
5401 }
5402 ret = bus_register(&pseudo_lld_bus);
5403 if (ret < 0) {
5404 pr_warn("bus_register error: %d\n", ret);
5405 goto dev_unreg;
5406 }
5407 ret = driver_register(&sdebug_driverfs_driver);
5408 if (ret < 0) {
5409 pr_warn("driver_register error: %d\n", ret);
5410 goto bus_unreg;
5411 }
5412
5413 host_to_add = sdebug_add_host;
5414 sdebug_add_host = 0;
5415
5416 for (k = 0; k < host_to_add; k++) {
5417 if (sdebug_add_adapter()) {
5418 pr_err("sdebug_add_adapter failed k=%d\n", k);
5419 break;
5420 }
5421 }
5422
5423 if (sdebug_verbose)
5424 pr_info("built %d host(s)\n", sdebug_add_host);
5425
5426 return 0;
5427
5428 bus_unreg:
5429 bus_unregister(&pseudo_lld_bus);
5430 dev_unreg:
5431 root_device_unregister(pseudo_primary);
5432 free_vm:
5433 vfree(map_storep);
5434 vfree(dif_storep);
5435 vfree(fake_storep);
5436 free_q_arr:
5437 kfree(sdebug_q_arr);
5438 return ret;
5439 }
5440
5441 static void __exit scsi_debug_exit(void)
5442 {
5443 int k = sdebug_add_host;
5444
5445 stop_all_queued();
5446 for (; k; k--)
5447 sdebug_remove_adapter();
5448 free_all_queued();
5449 driver_unregister(&sdebug_driverfs_driver);
5450 bus_unregister(&pseudo_lld_bus);
5451 root_device_unregister(pseudo_primary);
5452
5453 vfree(map_storep);
5454 vfree(dif_storep);
5455 vfree(fake_storep);
5456 kfree(sdebug_q_arr);
5457 }
5458
5459 device_initcall(scsi_debug_init);
5460 module_exit(scsi_debug_exit);
5461
5462 static void sdebug_release_adapter(struct device *dev)
5463 {
5464 struct sdebug_host_info *sdbg_host;
5465
5466 sdbg_host = to_sdebug_host(dev);
5467 kfree(sdbg_host);
5468 }
5469
5470 static int sdebug_add_adapter(void)
5471 {
5472 int k, devs_per_host;
5473 int error = 0;
5474 struct sdebug_host_info *sdbg_host;
5475 struct sdebug_dev_info *sdbg_devinfo, *tmp;
5476
5477 sdbg_host = kzalloc(sizeof(*sdbg_host), GFP_KERNEL);
5478 if (sdbg_host == NULL) {
5479 pr_err("out of memory at line %d\n", __LINE__);
5480 return -ENOMEM;
5481 }
5482
5483 INIT_LIST_HEAD(&sdbg_host->dev_info_list);
5484
5485 devs_per_host = sdebug_num_tgts * sdebug_max_luns;
5486 for (k = 0; k < devs_per_host; k++) {
5487 sdbg_devinfo = sdebug_device_create(sdbg_host, GFP_KERNEL);
5488 if (!sdbg_devinfo) {
5489 pr_err("out of memory at line %d\n", __LINE__);
5490 error = -ENOMEM;
5491 goto clean;
5492 }
5493 }
5494
5495 spin_lock(&sdebug_host_list_lock);
5496 list_add_tail(&sdbg_host->host_list, &sdebug_host_list);
5497 spin_unlock(&sdebug_host_list_lock);
5498
5499 sdbg_host->dev.bus = &pseudo_lld_bus;
5500 sdbg_host->dev.parent = pseudo_primary;
5501 sdbg_host->dev.release = &sdebug_release_adapter;
5502 dev_set_name(&sdbg_host->dev, "adapter%d", sdebug_add_host);
5503
5504 error = device_register(&sdbg_host->dev);
5505
5506 if (error)
5507 goto clean;
5508
5509 ++sdebug_add_host;
5510 return error;
5511
5512 clean:
5513 list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
5514 dev_list) {
5515 list_del(&sdbg_devinfo->dev_list);
5516 kfree(sdbg_devinfo);
5517 }
5518
5519 kfree(sdbg_host);
5520 return error;
5521 }
5522
5523 static void sdebug_remove_adapter(void)
5524 {
5525 struct sdebug_host_info *sdbg_host = NULL;
5526
5527 spin_lock(&sdebug_host_list_lock);
5528 if (!list_empty(&sdebug_host_list)) {
5529 sdbg_host = list_entry(sdebug_host_list.prev,
5530 struct sdebug_host_info, host_list);
5531 list_del(&sdbg_host->host_list);
5532 }
5533 spin_unlock(&sdebug_host_list_lock);
5534
5535 if (!sdbg_host)
5536 return;
5537
5538 device_unregister(&sdbg_host->dev);
5539 --sdebug_add_host;
5540 }
5541
5542 static int sdebug_change_qdepth(struct scsi_device *sdev, int qdepth)
5543 {
5544 int num_in_q = 0;
5545 struct sdebug_dev_info *devip;
5546
5547 block_unblock_all_queues(true);
5548 devip = (struct sdebug_dev_info *)sdev->hostdata;
5549 if (NULL == devip) {
5550 block_unblock_all_queues(false);
5551 return -ENODEV;
5552 }
5553 num_in_q = atomic_read(&devip->num_in_q);
5554
5555 if (qdepth < 1)
5556 qdepth = 1;
5557 /* allow to exceed max host qc_arr elements for testing */
5558 if (qdepth > SDEBUG_CANQUEUE + 10)
5559 qdepth = SDEBUG_CANQUEUE + 10;
5560 scsi_change_queue_depth(sdev, qdepth);
5561
5562 if (SDEBUG_OPT_Q_NOISE & sdebug_opts) {
5563 sdev_printk(KERN_INFO, sdev, "%s: qdepth=%d, num_in_q=%d\n",
5564 __func__, qdepth, num_in_q);
5565 }
5566 block_unblock_all_queues(false);
5567 return sdev->queue_depth;
5568 }
5569
5570 static bool fake_timeout(struct scsi_cmnd *scp)
5571 {
5572 if (0 == (atomic_read(&sdebug_cmnd_count) % abs(sdebug_every_nth))) {
5573 if (sdebug_every_nth < -1)
5574 sdebug_every_nth = -1;
5575 if (SDEBUG_OPT_TIMEOUT & sdebug_opts)
5576 return true; /* ignore command causing timeout */
5577 else if (SDEBUG_OPT_MAC_TIMEOUT & sdebug_opts &&
5578 scsi_medium_access_command(scp))
5579 return true; /* time out reads and writes */
5580 }
5581 return false;
5582 }
5583
5584 static bool fake_host_busy(struct scsi_cmnd *scp)
5585 {
5586 return (sdebug_opts & SDEBUG_OPT_HOST_BUSY) &&
5587 (atomic_read(&sdebug_cmnd_count) % abs(sdebug_every_nth)) == 0;
5588 }
5589
5590 static int scsi_debug_queuecommand(struct Scsi_Host *shost,
5591 struct scsi_cmnd *scp)
5592 {
5593 u8 sdeb_i;
5594 struct scsi_device *sdp = scp->device;
5595 const struct opcode_info_t *oip;
5596 const struct opcode_info_t *r_oip;
5597 struct sdebug_dev_info *devip;
5598 u8 *cmd = scp->cmnd;
5599 int (*r_pfp)(struct scsi_cmnd *, struct sdebug_dev_info *);
5600 int (*pfp)(struct scsi_cmnd *, struct sdebug_dev_info *) = NULL;
5601 int k, na;
5602 int errsts = 0;
5603 u32 flags;
5604 u16 sa;
5605 u8 opcode = cmd[0];
5606 bool has_wlun_rl;
5607
5608 scsi_set_resid(scp, 0);
5609 if (sdebug_statistics)
5610 atomic_inc(&sdebug_cmnd_count);
5611 if (unlikely(sdebug_verbose &&
5612 !(SDEBUG_OPT_NO_CDB_NOISE & sdebug_opts))) {
5613 char b[120];
5614 int n, len, sb;
5615
5616 len = scp->cmd_len;
5617 sb = (int)sizeof(b);
5618 if (len > 32)
5619 strcpy(b, "too long, over 32 bytes");
5620 else {
5621 for (k = 0, n = 0; k < len && n < sb; ++k)
5622 n += scnprintf(b + n, sb - n, "%02x ",
5623 (u32)cmd[k]);
5624 }
5625 sdev_printk(KERN_INFO, sdp, "%s: tag=%#x, cmd %s\n", my_name,
5626 blk_mq_unique_tag(scp->request), b);
5627 }
5628 if (fake_host_busy(scp))
5629 return SCSI_MLQUEUE_HOST_BUSY;
5630 has_wlun_rl = (sdp->lun == SCSI_W_LUN_REPORT_LUNS);
5631 if (unlikely((sdp->lun >= sdebug_max_luns) && !has_wlun_rl))
5632 goto err_out;
5633
5634 sdeb_i = opcode_ind_arr[opcode]; /* fully mapped */
5635 oip = &opcode_info_arr[sdeb_i]; /* safe if table consistent */
5636 devip = (struct sdebug_dev_info *)sdp->hostdata;
5637 if (unlikely(!devip)) {
5638 devip = find_build_dev_info(sdp);
5639 if (NULL == devip)
5640 goto err_out;
5641 }
5642 na = oip->num_attached;
5643 r_pfp = oip->pfp;
5644 if (na) { /* multiple commands with this opcode */
5645 r_oip = oip;
5646 if (FF_SA & r_oip->flags) {
5647 if (F_SA_LOW & oip->flags)
5648 sa = 0x1f & cmd[1];
5649 else
5650 sa = get_unaligned_be16(cmd + 8);
5651 for (k = 0; k <= na; oip = r_oip->arrp + k++) {
5652 if (opcode == oip->opcode && sa == oip->sa)
5653 break;
5654 }
5655 } else { /* since no service action only check opcode */
5656 for (k = 0; k <= na; oip = r_oip->arrp + k++) {
5657 if (opcode == oip->opcode)
5658 break;
5659 }
5660 }
5661 if (k > na) {
5662 if (F_SA_LOW & r_oip->flags)
5663 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 1, 4);
5664 else if (F_SA_HIGH & r_oip->flags)
5665 mk_sense_invalid_fld(scp, SDEB_IN_CDB, 8, 7);
5666 else
5667 mk_sense_invalid_opcode(scp);
5668 goto check_cond;
5669 }
5670 } /* else (when na==0) we assume the oip is a match */
5671 flags = oip->flags;
5672 if (unlikely(F_INV_OP & flags)) {
5673 mk_sense_invalid_opcode(scp);
5674 goto check_cond;
5675 }
5676 if (unlikely(has_wlun_rl && !(F_RL_WLUN_OK & flags))) {
5677 if (sdebug_verbose)
5678 sdev_printk(KERN_INFO, sdp, "%s: Opcode 0x%x not%s\n",
5679 my_name, opcode, " supported for wlun");
5680 mk_sense_invalid_opcode(scp);
5681 goto check_cond;
5682 }
5683 if (unlikely(sdebug_strict)) { /* check cdb against mask */
5684 u8 rem;
5685 int j;
5686
5687 for (k = 1; k < oip->len_mask[0] && k < 16; ++k) {
5688 rem = ~oip->len_mask[k] & cmd[k];
5689 if (rem) {
5690 for (j = 7; j >= 0; --j, rem <<= 1) {
5691 if (0x80 & rem)
5692 break;
5693 }
5694 mk_sense_invalid_fld(scp, SDEB_IN_CDB, k, j);
5695 goto check_cond;
5696 }
5697 }
5698 }
5699 if (unlikely(!(F_SKIP_UA & flags) &&
5700 find_first_bit(devip->uas_bm,
5701 SDEBUG_NUM_UAS) != SDEBUG_NUM_UAS)) {
5702 errsts = make_ua(scp, devip);
5703 if (errsts)
5704 goto check_cond;
5705 }
5706 if (unlikely((F_M_ACCESS & flags) && atomic_read(&devip->stopped))) {
5707 mk_sense_buffer(scp, NOT_READY, LOGICAL_UNIT_NOT_READY, 0x2);
5708 if (sdebug_verbose)
5709 sdev_printk(KERN_INFO, sdp, "%s reports: Not ready: "
5710 "%s\n", my_name, "initializing command "
5711 "required");
5712 errsts = check_condition_result;
5713 goto fini;
5714 }
5715 if (sdebug_fake_rw && (F_FAKE_RW & flags))
5716 goto fini;
5717 if (unlikely(sdebug_every_nth)) {
5718 if (fake_timeout(scp))
5719 return 0; /* ignore command: make trouble */
5720 }
5721 if (likely(oip->pfp))
5722 pfp = oip->pfp; /* calls a resp_* function */
5723 else
5724 pfp = r_pfp; /* if leaf function ptr NULL, try the root's */
5725
5726 fini:
5727 if (F_DELAY_OVERR & flags)
5728 return schedule_resp(scp, devip, errsts, pfp, 0, 0);
5729 else if ((flags & F_LONG_DELAY) && (sdebug_jdelay > 0 ||
5730 sdebug_ndelay > 10000)) {
5731 /*
5732 * Skip long delays if ndelay <= 10 microseconds. Otherwise
5733 * for Start Stop Unit (SSU) want at least 1 second delay and
5734 * if sdebug_jdelay>1 want a long delay of that many seconds.
5735 * For Synchronize Cache want 1/20 of SSU's delay.
5736 */
5737 int jdelay = (sdebug_jdelay < 2) ? 1 : sdebug_jdelay;
5738 int denom = (flags & F_SYNC_DELAY) ? 20 : 1;
5739
5740 jdelay = mult_frac(USER_HZ * jdelay, HZ, denom * USER_HZ);
5741 return schedule_resp(scp, devip, errsts, pfp, jdelay, 0);
5742 } else
5743 return schedule_resp(scp, devip, errsts, pfp, sdebug_jdelay,
5744 sdebug_ndelay);
5745 check_cond:
5746 return schedule_resp(scp, devip, check_condition_result, NULL, 0, 0);
5747 err_out:
5748 return schedule_resp(scp, NULL, DID_NO_CONNECT << 16, NULL, 0, 0);
5749 }
5750
5751 static struct scsi_host_template sdebug_driver_template = {
5752 .show_info = scsi_debug_show_info,
5753 .write_info = scsi_debug_write_info,
5754 .proc_name = sdebug_proc_name,
5755 .name = "SCSI DEBUG",
5756 .info = scsi_debug_info,
5757 .slave_alloc = scsi_debug_slave_alloc,
5758 .slave_configure = scsi_debug_slave_configure,
5759 .slave_destroy = scsi_debug_slave_destroy,
5760 .ioctl = scsi_debug_ioctl,
5761 .queuecommand = scsi_debug_queuecommand,
5762 .change_queue_depth = sdebug_change_qdepth,
5763 .eh_abort_handler = scsi_debug_abort,
5764 .eh_device_reset_handler = scsi_debug_device_reset,
5765 .eh_target_reset_handler = scsi_debug_target_reset,
5766 .eh_bus_reset_handler = scsi_debug_bus_reset,
5767 .eh_host_reset_handler = scsi_debug_host_reset,
5768 .can_queue = SDEBUG_CANQUEUE,
5769 .this_id = 7,
5770 .sg_tablesize = SG_MAX_SEGMENTS,
5771 .cmd_per_lun = DEF_CMD_PER_LUN,
5772 .max_sectors = -1U,
5773 .max_segment_size = -1U,
5774 .module = THIS_MODULE,
5775 .track_queue_depth = 1,
5776 };
5777
5778 static int sdebug_driver_probe(struct device *dev)
5779 {
5780 int error = 0;
5781 struct sdebug_host_info *sdbg_host;
5782 struct Scsi_Host *hpnt;
5783 int hprot;
5784
5785 sdbg_host = to_sdebug_host(dev);
5786
5787 sdebug_driver_template.can_queue = sdebug_max_queue;
5788 if (!sdebug_clustering)
5789 sdebug_driver_template.dma_boundary = PAGE_SIZE - 1;
5790
5791 hpnt = scsi_host_alloc(&sdebug_driver_template, sizeof(sdbg_host));
5792 if (NULL == hpnt) {
5793 pr_err("scsi_host_alloc failed\n");
5794 error = -ENODEV;
5795 return error;
5796 }
5797 if (submit_queues > nr_cpu_ids) {
5798 pr_warn("%s: trim submit_queues (was %d) to nr_cpu_ids=%u\n",
5799 my_name, submit_queues, nr_cpu_ids);
5800 submit_queues = nr_cpu_ids;
5801 }
5802 /* Decide whether to tell scsi subsystem that we want mq */
5803 /* Following should give the same answer for each host */
5804 hpnt->nr_hw_queues = submit_queues;
5805
5806 sdbg_host->shost = hpnt;
5807 *((struct sdebug_host_info **)hpnt->hostdata) = sdbg_host;
5808 if ((hpnt->this_id >= 0) && (sdebug_num_tgts > hpnt->this_id))
5809 hpnt->max_id = sdebug_num_tgts + 1;
5810 else
5811 hpnt->max_id = sdebug_num_tgts;
5812 /* = sdebug_max_luns; */
5813 hpnt->max_lun = SCSI_W_LUN_REPORT_LUNS + 1;
5814
5815 hprot = 0;
5816
5817 switch (sdebug_dif) {
5818
5819 case T10_PI_TYPE1_PROTECTION:
5820 hprot = SHOST_DIF_TYPE1_PROTECTION;
5821 if (sdebug_dix)
5822 hprot |= SHOST_DIX_TYPE1_PROTECTION;
5823 break;
5824
5825 case T10_PI_TYPE2_PROTECTION:
5826 hprot = SHOST_DIF_TYPE2_PROTECTION;
5827 if (sdebug_dix)
5828 hprot |= SHOST_DIX_TYPE2_PROTECTION;
5829 break;
5830
5831 case T10_PI_TYPE3_PROTECTION:
5832 hprot = SHOST_DIF_TYPE3_PROTECTION;
5833 if (sdebug_dix)
5834 hprot |= SHOST_DIX_TYPE3_PROTECTION;
5835 break;
5836
5837 default:
5838 if (sdebug_dix)
5839 hprot |= SHOST_DIX_TYPE0_PROTECTION;
5840 break;
5841 }
5842
5843 scsi_host_set_prot(hpnt, hprot);
5844
5845 if (have_dif_prot || sdebug_dix)
5846 pr_info("host protection%s%s%s%s%s%s%s\n",
5847 (hprot & SHOST_DIF_TYPE1_PROTECTION) ? " DIF1" : "",
5848 (hprot & SHOST_DIF_TYPE2_PROTECTION) ? " DIF2" : "",
5849 (hprot & SHOST_DIF_TYPE3_PROTECTION) ? " DIF3" : "",
5850 (hprot & SHOST_DIX_TYPE0_PROTECTION) ? " DIX0" : "",
5851 (hprot & SHOST_DIX_TYPE1_PROTECTION) ? " DIX1" : "",
5852 (hprot & SHOST_DIX_TYPE2_PROTECTION) ? " DIX2" : "",
5853 (hprot & SHOST_DIX_TYPE3_PROTECTION) ? " DIX3" : "");
5854
5855 if (sdebug_guard == 1)
5856 scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_IP);
5857 else
5858 scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_CRC);
5859
5860 sdebug_verbose = !!(SDEBUG_OPT_NOISE & sdebug_opts);
5861 sdebug_any_injecting_opt = !!(SDEBUG_OPT_ALL_INJECTING & sdebug_opts);
5862 if (sdebug_every_nth) /* need stats counters for every_nth */
5863 sdebug_statistics = true;
5864 error = scsi_add_host(hpnt, &sdbg_host->dev);
5865 if (error) {
5866 pr_err("scsi_add_host failed\n");
5867 error = -ENODEV;
5868 scsi_host_put(hpnt);
5869 } else
5870 scsi_scan_host(hpnt);
5871
5872 return error;
5873 }
5874
5875 static int sdebug_driver_remove(struct device *dev)
5876 {
5877 struct sdebug_host_info *sdbg_host;
5878 struct sdebug_dev_info *sdbg_devinfo, *tmp;
5879
5880 sdbg_host = to_sdebug_host(dev);
5881
5882 if (!sdbg_host) {
5883 pr_err("Unable to locate host info\n");
5884 return -ENODEV;
5885 }
5886
5887 scsi_remove_host(sdbg_host->shost);
5888
5889 list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
5890 dev_list) {
5891 list_del(&sdbg_devinfo->dev_list);
5892 kfree(sdbg_devinfo);
5893 }
5894
5895 scsi_host_put(sdbg_host->shost);
5896 return 0;
5897 }
5898
5899 static int pseudo_lld_bus_match(struct device *dev,
5900 struct device_driver *dev_driver)
5901 {
5902 return 1;
5903 }
5904
5905 static struct bus_type pseudo_lld_bus = {
5906 .name = "pseudo",
5907 .match = pseudo_lld_bus_match,
5908 .probe = sdebug_driver_probe,
5909 .remove = sdebug_driver_remove,
5910 .drv_groups = sdebug_drv_groups,
5911 };