xref: /openbmc/linux/drivers/scsi/scsi_debug.c (revision a361cc00)
1 /*
2  * vvvvvvvvvvvvvvvvvvvvvvv Original vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
3  *  Copyright (C) 1992  Eric Youngdale
4  *  Simulate a host adapter with 2 disks attached.  Do a lot of checking
5  *  to make sure that we are not getting blocks mixed up, and PANIC if
6  *  anything out of the ordinary is seen.
7  * ^^^^^^^^^^^^^^^^^^^^^^^ Original ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
8  *
9  *  This version is more generic, simulating a variable number of disk
10  *  (or disk like devices) sharing a common amount of RAM. To be more
11  *  realistic, the simulated devices have the transport attributes of
12  *  SAS disks.
13  *
14  *
15  *  For documentation see http://sg.danny.cz/sg/sdebug26.html
16  *
17  *   D. Gilbert (dpg) work for Magneto-Optical device test [20010421]
18  *   dpg: work for devfs large number of disks [20010809]
19  *        forked for lk 2.5 series [20011216, 20020101]
20  *        use vmalloc() more inquiry+mode_sense [20020302]
21  *        add timers for delayed responses [20020721]
22  *   Patrick Mansfield <patmans@us.ibm.com> max_luns+scsi_level [20021031]
23  *   Mike Anderson <andmike@us.ibm.com> sysfs work [20021118]
24  *   dpg: change style of boot options to "scsi_debug.num_tgts=2" and
25  *        module options to "modprobe scsi_debug num_tgts=2" [20021221]
26  */
27 
28 #include <linux/module.h>
29 
30 #include <linux/kernel.h>
31 #include <linux/errno.h>
32 #include <linux/timer.h>
33 #include <linux/slab.h>
34 #include <linux/types.h>
35 #include <linux/string.h>
36 #include <linux/genhd.h>
37 #include <linux/fs.h>
38 #include <linux/init.h>
39 #include <linux/proc_fs.h>
40 #include <linux/vmalloc.h>
41 #include <linux/moduleparam.h>
42 #include <linux/scatterlist.h>
43 #include <linux/blkdev.h>
44 #include <linux/crc-t10dif.h>
45 
46 #include <net/checksum.h>
47 
48 #include <asm/unaligned.h>
49 
50 #include <scsi/scsi.h>
51 #include <scsi/scsi_cmnd.h>
52 #include <scsi/scsi_device.h>
53 #include <scsi/scsi_host.h>
54 #include <scsi/scsicam.h>
55 #include <scsi/scsi_eh.h>
56 #include <scsi/scsi_dbg.h>
57 
58 #include "sd.h"
59 #include "scsi_logging.h"
60 
61 #define SCSI_DEBUG_VERSION "1.82"
62 static const char * scsi_debug_version_date = "20100324";
63 
64 /* Additional Sense Code (ASC) */
65 #define NO_ADDITIONAL_SENSE 0x0
66 #define LOGICAL_UNIT_NOT_READY 0x4
67 #define UNRECOVERED_READ_ERR 0x11
68 #define PARAMETER_LIST_LENGTH_ERR 0x1a
69 #define INVALID_OPCODE 0x20
70 #define ADDR_OUT_OF_RANGE 0x21
71 #define INVALID_COMMAND_OPCODE 0x20
72 #define INVALID_FIELD_IN_CDB 0x24
73 #define INVALID_FIELD_IN_PARAM_LIST 0x26
74 #define POWERON_RESET 0x29
75 #define SAVING_PARAMS_UNSUP 0x39
76 #define TRANSPORT_PROBLEM 0x4b
77 #define THRESHOLD_EXCEEDED 0x5d
78 #define LOW_POWER_COND_ON 0x5e
79 
80 /* Additional Sense Code Qualifier (ASCQ) */
81 #define ACK_NAK_TO 0x3
82 
83 #define SDEBUG_TAGGED_QUEUING 0 /* 0 | MSG_SIMPLE_TAG | MSG_ORDERED_TAG */
84 
85 /* Default values for driver parameters */
86 #define DEF_NUM_HOST   1
87 #define DEF_NUM_TGTS   1
88 #define DEF_MAX_LUNS   1
89 /* With these defaults, this driver will make 1 host with 1 target
90  * (id 0) containing 1 logical unit (lun 0). That is 1 device.
91  */
92 #define DEF_DELAY   1
93 #define DEF_DEV_SIZE_MB   8
94 #define DEF_EVERY_NTH   0
95 #define DEF_NUM_PARTS   0
96 #define DEF_OPTS   0
97 #define DEF_SCSI_LEVEL   5    /* INQUIRY, byte2 [5->SPC-3] */
98 #define DEF_PTYPE   0
99 #define DEF_D_SENSE   0
100 #define DEF_NO_LUN_0   0
101 #define DEF_VIRTUAL_GB   0
102 #define DEF_FAKE_RW	0
103 #define DEF_VPD_USE_HOSTNO 1
104 #define DEF_SECTOR_SIZE 512
105 #define DEF_DIX 0
106 #define DEF_DIF 0
107 #define DEF_GUARD 0
108 #define DEF_ATO 1
109 #define DEF_PHYSBLK_EXP 0
110 #define DEF_LOWEST_ALIGNED 0
111 #define DEF_OPT_BLKS 64
112 #define DEF_UNMAP_MAX_BLOCKS 0xFFFFFFFF
113 #define DEF_UNMAP_MAX_DESC 256
114 #define DEF_UNMAP_GRANULARITY 1
115 #define DEF_UNMAP_ALIGNMENT 0
116 #define DEF_TPWS 0
117 #define DEF_TPU 0
118 
119 /* bit mask values for scsi_debug_opts */
120 #define SCSI_DEBUG_OPT_NOISE   1
121 #define SCSI_DEBUG_OPT_MEDIUM_ERR   2
122 #define SCSI_DEBUG_OPT_TIMEOUT   4
123 #define SCSI_DEBUG_OPT_RECOVERED_ERR   8
124 #define SCSI_DEBUG_OPT_TRANSPORT_ERR   16
125 #define SCSI_DEBUG_OPT_DIF_ERR   32
126 #define SCSI_DEBUG_OPT_DIX_ERR   64
127 /* When "every_nth" > 0 then modulo "every_nth" commands:
128  *   - a no response is simulated if SCSI_DEBUG_OPT_TIMEOUT is set
129  *   - a RECOVERED_ERROR is simulated on successful read and write
130  *     commands if SCSI_DEBUG_OPT_RECOVERED_ERR is set.
131  *   - a TRANSPORT_ERROR is simulated on successful read and write
132  *     commands if SCSI_DEBUG_OPT_TRANSPORT_ERR is set.
133  *
134  * When "every_nth" < 0 then after "- every_nth" commands:
135  *   - a no response is simulated if SCSI_DEBUG_OPT_TIMEOUT is set
136  *   - a RECOVERED_ERROR is simulated on successful read and write
137  *     commands if SCSI_DEBUG_OPT_RECOVERED_ERR is set.
138  *   - a TRANSPORT_ERROR is simulated on successful read and write
139  *     commands if SCSI_DEBUG_OPT_TRANSPORT_ERR is set.
140  * This will continue until some other action occurs (e.g. the user
141  * writing a new value (other than -1 or 1) to every_nth via sysfs).
142  */
143 
144 /* when 1==SCSI_DEBUG_OPT_MEDIUM_ERR, a medium error is simulated at this
145  * sector on read commands: */
146 #define OPT_MEDIUM_ERR_ADDR   0x1234 /* that's sector 4660 in decimal */
147 
148 /* If REPORT LUNS has luns >= 256 it can choose "flat space" (value 1)
149  * or "peripheral device" addressing (value 0) */
150 #define SAM2_LUN_ADDRESS_METHOD 0
151 #define SAM2_WLUN_REPORT_LUNS 0xc101
152 
153 /* Can queue up to this number of commands. Typically commands that
154  * that have a non-zero delay are queued. */
155 #define SCSI_DEBUG_CANQUEUE  255
156 
157 static int scsi_debug_add_host = DEF_NUM_HOST;
158 static int scsi_debug_delay = DEF_DELAY;
159 static int scsi_debug_dev_size_mb = DEF_DEV_SIZE_MB;
160 static int scsi_debug_every_nth = DEF_EVERY_NTH;
161 static int scsi_debug_max_luns = DEF_MAX_LUNS;
162 static int scsi_debug_max_queue = SCSI_DEBUG_CANQUEUE;
163 static int scsi_debug_num_parts = DEF_NUM_PARTS;
164 static int scsi_debug_no_uld = 0;
165 static int scsi_debug_num_tgts = DEF_NUM_TGTS; /* targets per host */
166 static int scsi_debug_opts = DEF_OPTS;
167 static int scsi_debug_scsi_level = DEF_SCSI_LEVEL;
168 static int scsi_debug_ptype = DEF_PTYPE; /* SCSI peripheral type (0==disk) */
169 static int scsi_debug_dsense = DEF_D_SENSE;
170 static int scsi_debug_no_lun_0 = DEF_NO_LUN_0;
171 static int scsi_debug_virtual_gb = DEF_VIRTUAL_GB;
172 static int scsi_debug_fake_rw = DEF_FAKE_RW;
173 static int scsi_debug_vpd_use_hostno = DEF_VPD_USE_HOSTNO;
174 static int scsi_debug_sector_size = DEF_SECTOR_SIZE;
175 static int scsi_debug_dix = DEF_DIX;
176 static int scsi_debug_dif = DEF_DIF;
177 static int scsi_debug_guard = DEF_GUARD;
178 static int scsi_debug_ato = DEF_ATO;
179 static int scsi_debug_physblk_exp = DEF_PHYSBLK_EXP;
180 static int scsi_debug_lowest_aligned = DEF_LOWEST_ALIGNED;
181 static int scsi_debug_opt_blks = DEF_OPT_BLKS;
182 static unsigned int scsi_debug_unmap_max_desc = DEF_UNMAP_MAX_DESC;
183 static unsigned int scsi_debug_unmap_max_blocks = DEF_UNMAP_MAX_BLOCKS;
184 static unsigned int scsi_debug_unmap_granularity = DEF_UNMAP_GRANULARITY;
185 static unsigned int scsi_debug_unmap_alignment = DEF_UNMAP_ALIGNMENT;
186 static unsigned int scsi_debug_tpws = DEF_TPWS;
187 static unsigned int scsi_debug_tpu = DEF_TPU;
188 
189 static int scsi_debug_cmnd_count = 0;
190 
191 #define DEV_READONLY(TGT)      (0)
192 #define DEV_REMOVEABLE(TGT)    (0)
193 
194 static unsigned int sdebug_store_sectors;
195 static sector_t sdebug_capacity;	/* in sectors */
196 
197 /* old BIOS stuff, kernel may get rid of them but some mode sense pages
198    may still need them */
199 static int sdebug_heads;		/* heads per disk */
200 static int sdebug_cylinders_per;	/* cylinders per surface */
201 static int sdebug_sectors_per;		/* sectors per cylinder */
202 
203 #define SDEBUG_MAX_PARTS 4
204 
205 #define SDEBUG_SENSE_LEN 32
206 
207 #define SCSI_DEBUG_MAX_CMD_LEN 32
208 
209 struct sdebug_dev_info {
210 	struct list_head dev_list;
211 	unsigned char sense_buff[SDEBUG_SENSE_LEN];	/* weak nexus */
212 	unsigned int channel;
213 	unsigned int target;
214 	unsigned int lun;
215 	struct sdebug_host_info *sdbg_host;
216 	unsigned int wlun;
217 	char reset;
218 	char stopped;
219 	char used;
220 };
221 
222 struct sdebug_host_info {
223 	struct list_head host_list;
224 	struct Scsi_Host *shost;
225 	struct device dev;
226 	struct list_head dev_info_list;
227 };
228 
229 #define to_sdebug_host(d)	\
230 	container_of(d, struct sdebug_host_info, dev)
231 
232 static LIST_HEAD(sdebug_host_list);
233 static DEFINE_SPINLOCK(sdebug_host_list_lock);
234 
235 typedef void (* done_funct_t) (struct scsi_cmnd *);
236 
237 struct sdebug_queued_cmd {
238 	int in_use;
239 	struct timer_list cmnd_timer;
240 	done_funct_t done_funct;
241 	struct scsi_cmnd * a_cmnd;
242 	int scsi_result;
243 };
244 static struct sdebug_queued_cmd queued_arr[SCSI_DEBUG_CANQUEUE];
245 
246 static unsigned char * fake_storep;	/* ramdisk storage */
247 static unsigned char *dif_storep;	/* protection info */
248 static void *map_storep;		/* provisioning map */
249 
250 static unsigned long map_size;
251 static int num_aborts = 0;
252 static int num_dev_resets = 0;
253 static int num_bus_resets = 0;
254 static int num_host_resets = 0;
255 static int dix_writes;
256 static int dix_reads;
257 static int dif_errors;
258 
259 static DEFINE_SPINLOCK(queued_arr_lock);
260 static DEFINE_RWLOCK(atomic_rw);
261 
262 static char sdebug_proc_name[] = "scsi_debug";
263 
264 static struct bus_type pseudo_lld_bus;
265 
266 static inline sector_t dif_offset(sector_t sector)
267 {
268 	return sector << 3;
269 }
270 
271 static struct device_driver sdebug_driverfs_driver = {
272 	.name 		= sdebug_proc_name,
273 	.bus		= &pseudo_lld_bus,
274 };
275 
276 static const int check_condition_result =
277 		(DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
278 
279 static const int illegal_condition_result =
280 	(DRIVER_SENSE << 24) | (DID_ABORT << 16) | SAM_STAT_CHECK_CONDITION;
281 
282 static unsigned char ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
283 				    0, 0, 0x2, 0x4b};
284 static unsigned char iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
285 			           0, 0, 0x0, 0x0};
286 
287 static int sdebug_add_adapter(void);
288 static void sdebug_remove_adapter(void);
289 
290 static void sdebug_max_tgts_luns(void)
291 {
292 	struct sdebug_host_info *sdbg_host;
293 	struct Scsi_Host *hpnt;
294 
295 	spin_lock(&sdebug_host_list_lock);
296 	list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
297 		hpnt = sdbg_host->shost;
298 		if ((hpnt->this_id >= 0) &&
299 		    (scsi_debug_num_tgts > hpnt->this_id))
300 			hpnt->max_id = scsi_debug_num_tgts + 1;
301 		else
302 			hpnt->max_id = scsi_debug_num_tgts;
303 		/* scsi_debug_max_luns; */
304 		hpnt->max_lun = SAM2_WLUN_REPORT_LUNS;
305 	}
306 	spin_unlock(&sdebug_host_list_lock);
307 }
308 
309 static void mk_sense_buffer(struct sdebug_dev_info *devip, int key,
310 			    int asc, int asq)
311 {
312 	unsigned char *sbuff;
313 
314 	sbuff = devip->sense_buff;
315 	memset(sbuff, 0, SDEBUG_SENSE_LEN);
316 
317 	scsi_build_sense_buffer(scsi_debug_dsense, sbuff, key, asc, asq);
318 
319 	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
320 		printk(KERN_INFO "scsi_debug:    [sense_key,asc,ascq]: "
321 		      "[0x%x,0x%x,0x%x]\n", key, asc, asq);
322 }
323 
324 static void get_data_transfer_info(unsigned char *cmd,
325 				   unsigned long long *lba, unsigned int *num,
326 				   u32 *ei_lba)
327 {
328 	*ei_lba = 0;
329 
330 	switch (*cmd) {
331 	case VARIABLE_LENGTH_CMD:
332 		*lba = (u64)cmd[19] | (u64)cmd[18] << 8 |
333 			(u64)cmd[17] << 16 | (u64)cmd[16] << 24 |
334 			(u64)cmd[15] << 32 | (u64)cmd[14] << 40 |
335 			(u64)cmd[13] << 48 | (u64)cmd[12] << 56;
336 
337 		*ei_lba = (u32)cmd[23] | (u32)cmd[22] << 8 |
338 			(u32)cmd[21] << 16 | (u32)cmd[20] << 24;
339 
340 		*num = (u32)cmd[31] | (u32)cmd[30] << 8 | (u32)cmd[29] << 16 |
341 			(u32)cmd[28] << 24;
342 		break;
343 
344 	case WRITE_SAME_16:
345 	case WRITE_16:
346 	case READ_16:
347 		*lba = (u64)cmd[9] | (u64)cmd[8] << 8 |
348 			(u64)cmd[7] << 16 | (u64)cmd[6] << 24 |
349 			(u64)cmd[5] << 32 | (u64)cmd[4] << 40 |
350 			(u64)cmd[3] << 48 | (u64)cmd[2] << 56;
351 
352 		*num = (u32)cmd[13] | (u32)cmd[12] << 8 | (u32)cmd[11] << 16 |
353 			(u32)cmd[10] << 24;
354 		break;
355 	case WRITE_12:
356 	case READ_12:
357 		*lba = (u32)cmd[5] | (u32)cmd[4] << 8 | (u32)cmd[3] << 16 |
358 			(u32)cmd[2] << 24;
359 
360 		*num = (u32)cmd[9] | (u32)cmd[8] << 8 | (u32)cmd[7] << 16 |
361 			(u32)cmd[6] << 24;
362 		break;
363 	case WRITE_SAME:
364 	case WRITE_10:
365 	case READ_10:
366 	case XDWRITEREAD_10:
367 		*lba = (u32)cmd[5] | (u32)cmd[4] << 8 |	(u32)cmd[3] << 16 |
368 			(u32)cmd[2] << 24;
369 
370 		*num = (u32)cmd[8] | (u32)cmd[7] << 8;
371 		break;
372 	case WRITE_6:
373 	case READ_6:
374 		*lba = (u32)cmd[3] | (u32)cmd[2] << 8 |
375 			(u32)(cmd[1] & 0x1f) << 16;
376 		*num = (0 == cmd[4]) ? 256 : cmd[4];
377 		break;
378 	default:
379 		break;
380 	}
381 }
382 
383 static int scsi_debug_ioctl(struct scsi_device *dev, int cmd, void __user *arg)
384 {
385 	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
386 		printk(KERN_INFO "scsi_debug: ioctl: cmd=0x%x\n", cmd);
387 	}
388 	return -EINVAL;
389 	/* return -ENOTTY; // correct return but upsets fdisk */
390 }
391 
392 static int check_readiness(struct scsi_cmnd * SCpnt, int reset_only,
393 			   struct sdebug_dev_info * devip)
394 {
395 	if (devip->reset) {
396 		if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
397 			printk(KERN_INFO "scsi_debug: Reporting Unit "
398 			       "attention: power on reset\n");
399 		devip->reset = 0;
400 		mk_sense_buffer(devip, UNIT_ATTENTION, POWERON_RESET, 0);
401 		return check_condition_result;
402 	}
403 	if ((0 == reset_only) && devip->stopped) {
404 		if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
405 			printk(KERN_INFO "scsi_debug: Reporting Not "
406 			       "ready: initializing command required\n");
407 		mk_sense_buffer(devip, NOT_READY, LOGICAL_UNIT_NOT_READY,
408 				0x2);
409 		return check_condition_result;
410 	}
411 	return 0;
412 }
413 
414 /* Returns 0 if ok else (DID_ERROR << 16). Sets scp->resid . */
415 static int fill_from_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
416 				int arr_len)
417 {
418 	int act_len;
419 	struct scsi_data_buffer *sdb = scsi_in(scp);
420 
421 	if (!sdb->length)
422 		return 0;
423 	if (!(scsi_bidi_cmnd(scp) || scp->sc_data_direction == DMA_FROM_DEVICE))
424 		return (DID_ERROR << 16);
425 
426 	act_len = sg_copy_from_buffer(sdb->table.sgl, sdb->table.nents,
427 				      arr, arr_len);
428 	if (sdb->resid)
429 		sdb->resid -= act_len;
430 	else
431 		sdb->resid = scsi_bufflen(scp) - act_len;
432 
433 	return 0;
434 }
435 
436 /* Returns number of bytes fetched into 'arr' or -1 if error. */
437 static int fetch_to_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
438 			       int arr_len)
439 {
440 	if (!scsi_bufflen(scp))
441 		return 0;
442 	if (!(scsi_bidi_cmnd(scp) || scp->sc_data_direction == DMA_TO_DEVICE))
443 		return -1;
444 
445 	return scsi_sg_copy_to_buffer(scp, arr, arr_len);
446 }
447 
448 
449 static const char * inq_vendor_id = "Linux   ";
450 static const char * inq_product_id = "scsi_debug      ";
451 static const char * inq_product_rev = "0004";
452 
453 static int inquiry_evpd_83(unsigned char * arr, int port_group_id,
454 			   int target_dev_id, int dev_id_num,
455 			   const char * dev_id_str,
456 			   int dev_id_str_len)
457 {
458 	int num, port_a;
459 	char b[32];
460 
461 	port_a = target_dev_id + 1;
462 	/* T10 vendor identifier field format (faked) */
463 	arr[0] = 0x2;	/* ASCII */
464 	arr[1] = 0x1;
465 	arr[2] = 0x0;
466 	memcpy(&arr[4], inq_vendor_id, 8);
467 	memcpy(&arr[12], inq_product_id, 16);
468 	memcpy(&arr[28], dev_id_str, dev_id_str_len);
469 	num = 8 + 16 + dev_id_str_len;
470 	arr[3] = num;
471 	num += 4;
472 	if (dev_id_num >= 0) {
473 		/* NAA-5, Logical unit identifier (binary) */
474 		arr[num++] = 0x1;	/* binary (not necessarily sas) */
475 		arr[num++] = 0x3;	/* PIV=0, lu, naa */
476 		arr[num++] = 0x0;
477 		arr[num++] = 0x8;
478 		arr[num++] = 0x53;  /* naa-5 ieee company id=0x333333 (fake) */
479 		arr[num++] = 0x33;
480 		arr[num++] = 0x33;
481 		arr[num++] = 0x30;
482 		arr[num++] = (dev_id_num >> 24);
483 		arr[num++] = (dev_id_num >> 16) & 0xff;
484 		arr[num++] = (dev_id_num >> 8) & 0xff;
485 		arr[num++] = dev_id_num & 0xff;
486 		/* Target relative port number */
487 		arr[num++] = 0x61;	/* proto=sas, binary */
488 		arr[num++] = 0x94;	/* PIV=1, target port, rel port */
489 		arr[num++] = 0x0;	/* reserved */
490 		arr[num++] = 0x4;	/* length */
491 		arr[num++] = 0x0;	/* reserved */
492 		arr[num++] = 0x0;	/* reserved */
493 		arr[num++] = 0x0;
494 		arr[num++] = 0x1;	/* relative port A */
495 	}
496 	/* NAA-5, Target port identifier */
497 	arr[num++] = 0x61;	/* proto=sas, binary */
498 	arr[num++] = 0x93;	/* piv=1, target port, naa */
499 	arr[num++] = 0x0;
500 	arr[num++] = 0x8;
501 	arr[num++] = 0x52;	/* naa-5, company id=0x222222 (fake) */
502 	arr[num++] = 0x22;
503 	arr[num++] = 0x22;
504 	arr[num++] = 0x20;
505 	arr[num++] = (port_a >> 24);
506 	arr[num++] = (port_a >> 16) & 0xff;
507 	arr[num++] = (port_a >> 8) & 0xff;
508 	arr[num++] = port_a & 0xff;
509 	/* NAA-5, Target port group identifier */
510 	arr[num++] = 0x61;	/* proto=sas, binary */
511 	arr[num++] = 0x95;	/* piv=1, target port group id */
512 	arr[num++] = 0x0;
513 	arr[num++] = 0x4;
514 	arr[num++] = 0;
515 	arr[num++] = 0;
516 	arr[num++] = (port_group_id >> 8) & 0xff;
517 	arr[num++] = port_group_id & 0xff;
518 	/* NAA-5, Target device identifier */
519 	arr[num++] = 0x61;	/* proto=sas, binary */
520 	arr[num++] = 0xa3;	/* piv=1, target device, naa */
521 	arr[num++] = 0x0;
522 	arr[num++] = 0x8;
523 	arr[num++] = 0x52;	/* naa-5, company id=0x222222 (fake) */
524 	arr[num++] = 0x22;
525 	arr[num++] = 0x22;
526 	arr[num++] = 0x20;
527 	arr[num++] = (target_dev_id >> 24);
528 	arr[num++] = (target_dev_id >> 16) & 0xff;
529 	arr[num++] = (target_dev_id >> 8) & 0xff;
530 	arr[num++] = target_dev_id & 0xff;
531 	/* SCSI name string: Target device identifier */
532 	arr[num++] = 0x63;	/* proto=sas, UTF-8 */
533 	arr[num++] = 0xa8;	/* piv=1, target device, SCSI name string */
534 	arr[num++] = 0x0;
535 	arr[num++] = 24;
536 	memcpy(arr + num, "naa.52222220", 12);
537 	num += 12;
538 	snprintf(b, sizeof(b), "%08X", target_dev_id);
539 	memcpy(arr + num, b, 8);
540 	num += 8;
541 	memset(arr + num, 0, 4);
542 	num += 4;
543 	return num;
544 }
545 
546 
547 static unsigned char vpd84_data[] = {
548 /* from 4th byte */ 0x22,0x22,0x22,0x0,0xbb,0x0,
549     0x22,0x22,0x22,0x0,0xbb,0x1,
550     0x22,0x22,0x22,0x0,0xbb,0x2,
551 };
552 
553 static int inquiry_evpd_84(unsigned char * arr)
554 {
555 	memcpy(arr, vpd84_data, sizeof(vpd84_data));
556 	return sizeof(vpd84_data);
557 }
558 
559 static int inquiry_evpd_85(unsigned char * arr)
560 {
561 	int num = 0;
562 	const char * na1 = "https://www.kernel.org/config";
563 	const char * na2 = "http://www.kernel.org/log";
564 	int plen, olen;
565 
566 	arr[num++] = 0x1;	/* lu, storage config */
567 	arr[num++] = 0x0;	/* reserved */
568 	arr[num++] = 0x0;
569 	olen = strlen(na1);
570 	plen = olen + 1;
571 	if (plen % 4)
572 		plen = ((plen / 4) + 1) * 4;
573 	arr[num++] = plen;	/* length, null termianted, padded */
574 	memcpy(arr + num, na1, olen);
575 	memset(arr + num + olen, 0, plen - olen);
576 	num += plen;
577 
578 	arr[num++] = 0x4;	/* lu, logging */
579 	arr[num++] = 0x0;	/* reserved */
580 	arr[num++] = 0x0;
581 	olen = strlen(na2);
582 	plen = olen + 1;
583 	if (plen % 4)
584 		plen = ((plen / 4) + 1) * 4;
585 	arr[num++] = plen;	/* length, null terminated, padded */
586 	memcpy(arr + num, na2, olen);
587 	memset(arr + num + olen, 0, plen - olen);
588 	num += plen;
589 
590 	return num;
591 }
592 
593 /* SCSI ports VPD page */
594 static int inquiry_evpd_88(unsigned char * arr, int target_dev_id)
595 {
596 	int num = 0;
597 	int port_a, port_b;
598 
599 	port_a = target_dev_id + 1;
600 	port_b = port_a + 1;
601 	arr[num++] = 0x0;	/* reserved */
602 	arr[num++] = 0x0;	/* reserved */
603 	arr[num++] = 0x0;
604 	arr[num++] = 0x1;	/* relative port 1 (primary) */
605 	memset(arr + num, 0, 6);
606 	num += 6;
607 	arr[num++] = 0x0;
608 	arr[num++] = 12;	/* length tp descriptor */
609 	/* naa-5 target port identifier (A) */
610 	arr[num++] = 0x61;	/* proto=sas, binary */
611 	arr[num++] = 0x93;	/* PIV=1, target port, NAA */
612 	arr[num++] = 0x0;	/* reserved */
613 	arr[num++] = 0x8;	/* length */
614 	arr[num++] = 0x52;	/* NAA-5, company_id=0x222222 (fake) */
615 	arr[num++] = 0x22;
616 	arr[num++] = 0x22;
617 	arr[num++] = 0x20;
618 	arr[num++] = (port_a >> 24);
619 	arr[num++] = (port_a >> 16) & 0xff;
620 	arr[num++] = (port_a >> 8) & 0xff;
621 	arr[num++] = port_a & 0xff;
622 
623 	arr[num++] = 0x0;	/* reserved */
624 	arr[num++] = 0x0;	/* reserved */
625 	arr[num++] = 0x0;
626 	arr[num++] = 0x2;	/* relative port 2 (secondary) */
627 	memset(arr + num, 0, 6);
628 	num += 6;
629 	arr[num++] = 0x0;
630 	arr[num++] = 12;	/* length tp descriptor */
631 	/* naa-5 target port identifier (B) */
632 	arr[num++] = 0x61;	/* proto=sas, binary */
633 	arr[num++] = 0x93;	/* PIV=1, target port, NAA */
634 	arr[num++] = 0x0;	/* reserved */
635 	arr[num++] = 0x8;	/* length */
636 	arr[num++] = 0x52;	/* NAA-5, company_id=0x222222 (fake) */
637 	arr[num++] = 0x22;
638 	arr[num++] = 0x22;
639 	arr[num++] = 0x20;
640 	arr[num++] = (port_b >> 24);
641 	arr[num++] = (port_b >> 16) & 0xff;
642 	arr[num++] = (port_b >> 8) & 0xff;
643 	arr[num++] = port_b & 0xff;
644 
645 	return num;
646 }
647 
648 
649 static unsigned char vpd89_data[] = {
650 /* from 4th byte */ 0,0,0,0,
651 'l','i','n','u','x',' ',' ',' ',
652 'S','A','T',' ','s','c','s','i','_','d','e','b','u','g',' ',' ',
653 '1','2','3','4',
654 0x34,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
655 0xec,0,0,0,
656 0x5a,0xc,0xff,0x3f,0x37,0xc8,0x10,0,0,0,0,0,0x3f,0,0,0,
657 0,0,0,0,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x20,0x20,0x20,0x20,
658 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0,0,0,0x40,0x4,0,0x2e,0x33,
659 0x38,0x31,0x20,0x20,0x20,0x20,0x54,0x53,0x38,0x33,0x30,0x30,0x33,0x31,
660 0x53,0x41,
661 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
662 0x20,0x20,
663 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
664 0x10,0x80,
665 0,0,0,0x2f,0,0,0,0x2,0,0x2,0x7,0,0xff,0xff,0x1,0,
666 0x3f,0,0xc1,0xff,0x3e,0,0x10,0x1,0xb0,0xf8,0x50,0x9,0,0,0x7,0,
667 0x3,0,0x78,0,0x78,0,0xf0,0,0x78,0,0,0,0,0,0,0,
668 0,0,0,0,0,0,0,0,0x2,0,0,0,0,0,0,0,
669 0x7e,0,0x1b,0,0x6b,0x34,0x1,0x7d,0x3,0x40,0x69,0x34,0x1,0x3c,0x3,0x40,
670 0x7f,0x40,0,0,0,0,0xfe,0xfe,0,0,0,0,0,0xfe,0,0,
671 0,0,0,0,0,0,0,0,0xb0,0xf8,0x50,0x9,0,0,0,0,
672 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
673 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
674 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
675 0x1,0,0xb0,0xf8,0x50,0x9,0xb0,0xf8,0x50,0x9,0x20,0x20,0x2,0,0xb6,0x42,
676 0,0x80,0x8a,0,0x6,0x3c,0xa,0x3c,0xff,0xff,0xc6,0x7,0,0x1,0,0x8,
677 0xf0,0xf,0,0x10,0x2,0,0x30,0,0,0,0,0,0,0,0x6,0xfe,
678 0,0,0x2,0,0x50,0,0x8a,0,0x4f,0x95,0,0,0x21,0,0xb,0,
679 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
680 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
681 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
682 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
683 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
684 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
685 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
686 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
687 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
688 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
689 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
690 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa5,0x51,
691 };
692 
693 static int inquiry_evpd_89(unsigned char * arr)
694 {
695 	memcpy(arr, vpd89_data, sizeof(vpd89_data));
696 	return sizeof(vpd89_data);
697 }
698 
699 
700 /* Block limits VPD page (SBC-3) */
701 static unsigned char vpdb0_data[] = {
702 	/* from 4th byte */ 0,0,0,4, 0,0,0x4,0, 0,0,0,64,
703 	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
704 	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
705 	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
706 };
707 
708 static int inquiry_evpd_b0(unsigned char * arr)
709 {
710 	unsigned int gran;
711 
712 	memcpy(arr, vpdb0_data, sizeof(vpdb0_data));
713 
714 	/* Optimal transfer length granularity */
715 	gran = 1 << scsi_debug_physblk_exp;
716 	arr[2] = (gran >> 8) & 0xff;
717 	arr[3] = gran & 0xff;
718 
719 	/* Maximum Transfer Length */
720 	if (sdebug_store_sectors > 0x400) {
721 		arr[4] = (sdebug_store_sectors >> 24) & 0xff;
722 		arr[5] = (sdebug_store_sectors >> 16) & 0xff;
723 		arr[6] = (sdebug_store_sectors >> 8) & 0xff;
724 		arr[7] = sdebug_store_sectors & 0xff;
725 	}
726 
727 	/* Optimal Transfer Length */
728 	put_unaligned_be32(scsi_debug_opt_blks, &arr[8]);
729 
730 	if (scsi_debug_tpu) {
731 		/* Maximum Unmap LBA Count */
732 		put_unaligned_be32(scsi_debug_unmap_max_blocks, &arr[16]);
733 
734 		/* Maximum Unmap Block Descriptor Count */
735 		put_unaligned_be32(scsi_debug_unmap_max_desc, &arr[20]);
736 	}
737 
738 	/* Unmap Granularity Alignment */
739 	if (scsi_debug_unmap_alignment) {
740 		put_unaligned_be32(scsi_debug_unmap_alignment, &arr[28]);
741 		arr[28] |= 0x80; /* UGAVALID */
742 	}
743 
744 	/* Optimal Unmap Granularity */
745 	put_unaligned_be32(scsi_debug_unmap_granularity, &arr[24]);
746 
747 	return 0x3c; /* Mandatory page length for thin provisioning */
748 
749 	return sizeof(vpdb0_data);
750 }
751 
752 /* Block device characteristics VPD page (SBC-3) */
753 static int inquiry_evpd_b1(unsigned char *arr)
754 {
755 	memset(arr, 0, 0x3c);
756 	arr[0] = 0;
757 	arr[1] = 1;	/* non rotating medium (e.g. solid state) */
758 	arr[2] = 0;
759 	arr[3] = 5;	/* less than 1.8" */
760 
761 	return 0x3c;
762 }
763 
764 /* Thin provisioning VPD page (SBC-3) */
765 static int inquiry_evpd_b2(unsigned char *arr)
766 {
767 	memset(arr, 0, 0x8);
768 	arr[0] = 0;			/* threshold exponent */
769 
770 	if (scsi_debug_tpu)
771 		arr[1] = 1 << 7;
772 
773 	if (scsi_debug_tpws)
774 		arr[1] |= 1 << 6;
775 
776 	return 0x8;
777 }
778 
779 #define SDEBUG_LONG_INQ_SZ 96
780 #define SDEBUG_MAX_INQ_ARR_SZ 584
781 
782 static int resp_inquiry(struct scsi_cmnd * scp, int target,
783 			struct sdebug_dev_info * devip)
784 {
785 	unsigned char pq_pdt;
786 	unsigned char * arr;
787 	unsigned char *cmd = (unsigned char *)scp->cmnd;
788 	int alloc_len, n, ret;
789 
790 	alloc_len = (cmd[3] << 8) + cmd[4];
791 	arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_ATOMIC);
792 	if (! arr)
793 		return DID_REQUEUE << 16;
794 	if (devip->wlun)
795 		pq_pdt = 0x1e;	/* present, wlun */
796 	else if (scsi_debug_no_lun_0 && (0 == devip->lun))
797 		pq_pdt = 0x7f;	/* not present, no device type */
798 	else
799 		pq_pdt = (scsi_debug_ptype & 0x1f);
800 	arr[0] = pq_pdt;
801 	if (0x2 & cmd[1]) {  /* CMDDT bit set */
802 		mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
803 			       	0);
804 		kfree(arr);
805 		return check_condition_result;
806 	} else if (0x1 & cmd[1]) {  /* EVPD bit set */
807 		int lu_id_num, port_group_id, target_dev_id, len;
808 		char lu_id_str[6];
809 		int host_no = devip->sdbg_host->shost->host_no;
810 
811 		port_group_id = (((host_no + 1) & 0x7f) << 8) +
812 		    (devip->channel & 0x7f);
813 		if (0 == scsi_debug_vpd_use_hostno)
814 			host_no = 0;
815 		lu_id_num = devip->wlun ? -1 : (((host_no + 1) * 2000) +
816 			    (devip->target * 1000) + devip->lun);
817 		target_dev_id = ((host_no + 1) * 2000) +
818 				 (devip->target * 1000) - 3;
819 		len = scnprintf(lu_id_str, 6, "%d", lu_id_num);
820 		if (0 == cmd[2]) { /* supported vital product data pages */
821 			arr[1] = cmd[2];	/*sanity */
822 			n = 4;
823 			arr[n++] = 0x0;   /* this page */
824 			arr[n++] = 0x80;  /* unit serial number */
825 			arr[n++] = 0x83;  /* device identification */
826 			arr[n++] = 0x84;  /* software interface ident. */
827 			arr[n++] = 0x85;  /* management network addresses */
828 			arr[n++] = 0x86;  /* extended inquiry */
829 			arr[n++] = 0x87;  /* mode page policy */
830 			arr[n++] = 0x88;  /* SCSI ports */
831 			arr[n++] = 0x89;  /* ATA information */
832 			arr[n++] = 0xb0;  /* Block limits (SBC) */
833 			arr[n++] = 0xb1;  /* Block characteristics (SBC) */
834 			arr[n++] = 0xb2;  /* Thin provisioning (SBC) */
835 			arr[3] = n - 4;	  /* number of supported VPD pages */
836 		} else if (0x80 == cmd[2]) { /* unit serial number */
837 			arr[1] = cmd[2];	/*sanity */
838 			arr[3] = len;
839 			memcpy(&arr[4], lu_id_str, len);
840 		} else if (0x83 == cmd[2]) { /* device identification */
841 			arr[1] = cmd[2];	/*sanity */
842 			arr[3] = inquiry_evpd_83(&arr[4], port_group_id,
843 						 target_dev_id, lu_id_num,
844 						 lu_id_str, len);
845 		} else if (0x84 == cmd[2]) { /* Software interface ident. */
846 			arr[1] = cmd[2];	/*sanity */
847 			arr[3] = inquiry_evpd_84(&arr[4]);
848 		} else if (0x85 == cmd[2]) { /* Management network addresses */
849 			arr[1] = cmd[2];	/*sanity */
850 			arr[3] = inquiry_evpd_85(&arr[4]);
851 		} else if (0x86 == cmd[2]) { /* extended inquiry */
852 			arr[1] = cmd[2];	/*sanity */
853 			arr[3] = 0x3c;	/* number of following entries */
854 			if (scsi_debug_dif == SD_DIF_TYPE3_PROTECTION)
855 				arr[4] = 0x4;	/* SPT: GRD_CHK:1 */
856 			else if (scsi_debug_dif)
857 				arr[4] = 0x5;   /* SPT: GRD_CHK:1, REF_CHK:1 */
858 			else
859 				arr[4] = 0x0;   /* no protection stuff */
860 			arr[5] = 0x7;   /* head of q, ordered + simple q's */
861 		} else if (0x87 == cmd[2]) { /* mode page policy */
862 			arr[1] = cmd[2];	/*sanity */
863 			arr[3] = 0x8;	/* number of following entries */
864 			arr[4] = 0x2;	/* disconnect-reconnect mp */
865 			arr[6] = 0x80;	/* mlus, shared */
866 			arr[8] = 0x18;	 /* protocol specific lu */
867 			arr[10] = 0x82;	 /* mlus, per initiator port */
868 		} else if (0x88 == cmd[2]) { /* SCSI Ports */
869 			arr[1] = cmd[2];	/*sanity */
870 			arr[3] = inquiry_evpd_88(&arr[4], target_dev_id);
871 		} else if (0x89 == cmd[2]) { /* ATA information */
872 			arr[1] = cmd[2];        /*sanity */
873 			n = inquiry_evpd_89(&arr[4]);
874 			arr[2] = (n >> 8);
875 			arr[3] = (n & 0xff);
876 		} else if (0xb0 == cmd[2]) { /* Block limits (SBC) */
877 			arr[1] = cmd[2];        /*sanity */
878 			arr[3] = inquiry_evpd_b0(&arr[4]);
879 		} else if (0xb1 == cmd[2]) { /* Block characteristics (SBC) */
880 			arr[1] = cmd[2];        /*sanity */
881 			arr[3] = inquiry_evpd_b1(&arr[4]);
882 		} else if (0xb2 == cmd[2]) { /* Thin provisioning (SBC) */
883 			arr[1] = cmd[2];        /*sanity */
884 			arr[3] = inquiry_evpd_b2(&arr[4]);
885 		} else {
886 			/* Illegal request, invalid field in cdb */
887 			mk_sense_buffer(devip, ILLEGAL_REQUEST,
888 					INVALID_FIELD_IN_CDB, 0);
889 			kfree(arr);
890 			return check_condition_result;
891 		}
892 		len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len);
893 		ret = fill_from_dev_buffer(scp, arr,
894 			    min(len, SDEBUG_MAX_INQ_ARR_SZ));
895 		kfree(arr);
896 		return ret;
897 	}
898 	/* drops through here for a standard inquiry */
899 	arr[1] = DEV_REMOVEABLE(target) ? 0x80 : 0;	/* Removable disk */
900 	arr[2] = scsi_debug_scsi_level;
901 	arr[3] = 2;    /* response_data_format==2 */
902 	arr[4] = SDEBUG_LONG_INQ_SZ - 5;
903 	arr[5] = scsi_debug_dif ? 1 : 0; /* PROTECT bit */
904 	if (0 == scsi_debug_vpd_use_hostno)
905 		arr[5] = 0x10; /* claim: implicit TGPS */
906 	arr[6] = 0x10; /* claim: MultiP */
907 	/* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */
908 	arr[7] = 0xa; /* claim: LINKED + CMDQUE */
909 	memcpy(&arr[8], inq_vendor_id, 8);
910 	memcpy(&arr[16], inq_product_id, 16);
911 	memcpy(&arr[32], inq_product_rev, 4);
912 	/* version descriptors (2 bytes each) follow */
913 	arr[58] = 0x0; arr[59] = 0x77; /* SAM-3 ANSI */
914 	arr[60] = 0x3; arr[61] = 0x14;  /* SPC-3 ANSI */
915 	n = 62;
916 	if (scsi_debug_ptype == 0) {
917 		arr[n++] = 0x3; arr[n++] = 0x3d; /* SBC-2 ANSI */
918 	} else if (scsi_debug_ptype == 1) {
919 		arr[n++] = 0x3; arr[n++] = 0x60; /* SSC-2 no version */
920 	}
921 	arr[n++] = 0xc; arr[n++] = 0xf;  /* SAS-1.1 rev 10 */
922 	ret = fill_from_dev_buffer(scp, arr,
923 			    min(alloc_len, SDEBUG_LONG_INQ_SZ));
924 	kfree(arr);
925 	return ret;
926 }
927 
928 static int resp_requests(struct scsi_cmnd * scp,
929 			 struct sdebug_dev_info * devip)
930 {
931 	unsigned char * sbuff;
932 	unsigned char *cmd = (unsigned char *)scp->cmnd;
933 	unsigned char arr[SDEBUG_SENSE_LEN];
934 	int want_dsense;
935 	int len = 18;
936 
937 	memset(arr, 0, sizeof(arr));
938 	if (devip->reset == 1)
939 		mk_sense_buffer(devip, 0, NO_ADDITIONAL_SENSE, 0);
940 	want_dsense = !!(cmd[1] & 1) || scsi_debug_dsense;
941 	sbuff = devip->sense_buff;
942 	if ((iec_m_pg[2] & 0x4) && (6 == (iec_m_pg[3] & 0xf))) {
943 		if (want_dsense) {
944 			arr[0] = 0x72;
945 			arr[1] = 0x0;		/* NO_SENSE in sense_key */
946 			arr[2] = THRESHOLD_EXCEEDED;
947 			arr[3] = 0xff;		/* TEST set and MRIE==6 */
948 		} else {
949 			arr[0] = 0x70;
950 			arr[2] = 0x0;		/* NO_SENSE in sense_key */
951 			arr[7] = 0xa;   	/* 18 byte sense buffer */
952 			arr[12] = THRESHOLD_EXCEEDED;
953 			arr[13] = 0xff;		/* TEST set and MRIE==6 */
954 		}
955 	} else {
956 		memcpy(arr, sbuff, SDEBUG_SENSE_LEN);
957 		if ((cmd[1] & 1) && (! scsi_debug_dsense)) {
958 			/* DESC bit set and sense_buff in fixed format */
959 			memset(arr, 0, sizeof(arr));
960 			arr[0] = 0x72;
961 			arr[1] = sbuff[2];     /* sense key */
962 			arr[2] = sbuff[12];    /* asc */
963 			arr[3] = sbuff[13];    /* ascq */
964 			len = 8;
965 		}
966 	}
967 	mk_sense_buffer(devip, 0, NO_ADDITIONAL_SENSE, 0);
968 	return fill_from_dev_buffer(scp, arr, len);
969 }
970 
971 static int resp_start_stop(struct scsi_cmnd * scp,
972 			   struct sdebug_dev_info * devip)
973 {
974 	unsigned char *cmd = (unsigned char *)scp->cmnd;
975 	int power_cond, errsts, start;
976 
977 	if ((errsts = check_readiness(scp, 1, devip)))
978 		return errsts;
979 	power_cond = (cmd[4] & 0xf0) >> 4;
980 	if (power_cond) {
981 		mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
982 			       	0);
983 		return check_condition_result;
984 	}
985 	start = cmd[4] & 1;
986 	if (start == devip->stopped)
987 		devip->stopped = !start;
988 	return 0;
989 }
990 
991 static sector_t get_sdebug_capacity(void)
992 {
993 	if (scsi_debug_virtual_gb > 0)
994 		return (sector_t)scsi_debug_virtual_gb *
995 			(1073741824 / scsi_debug_sector_size);
996 	else
997 		return sdebug_store_sectors;
998 }
999 
1000 #define SDEBUG_READCAP_ARR_SZ 8
1001 static int resp_readcap(struct scsi_cmnd * scp,
1002 			struct sdebug_dev_info * devip)
1003 {
1004 	unsigned char arr[SDEBUG_READCAP_ARR_SZ];
1005 	unsigned int capac;
1006 	int errsts;
1007 
1008 	if ((errsts = check_readiness(scp, 1, devip)))
1009 		return errsts;
1010 	/* following just in case virtual_gb changed */
1011 	sdebug_capacity = get_sdebug_capacity();
1012 	memset(arr, 0, SDEBUG_READCAP_ARR_SZ);
1013 	if (sdebug_capacity < 0xffffffff) {
1014 		capac = (unsigned int)sdebug_capacity - 1;
1015 		arr[0] = (capac >> 24);
1016 		arr[1] = (capac >> 16) & 0xff;
1017 		arr[2] = (capac >> 8) & 0xff;
1018 		arr[3] = capac & 0xff;
1019 	} else {
1020 		arr[0] = 0xff;
1021 		arr[1] = 0xff;
1022 		arr[2] = 0xff;
1023 		arr[3] = 0xff;
1024 	}
1025 	arr[6] = (scsi_debug_sector_size >> 8) & 0xff;
1026 	arr[7] = scsi_debug_sector_size & 0xff;
1027 	return fill_from_dev_buffer(scp, arr, SDEBUG_READCAP_ARR_SZ);
1028 }
1029 
1030 #define SDEBUG_READCAP16_ARR_SZ 32
1031 static int resp_readcap16(struct scsi_cmnd * scp,
1032 			  struct sdebug_dev_info * devip)
1033 {
1034 	unsigned char *cmd = (unsigned char *)scp->cmnd;
1035 	unsigned char arr[SDEBUG_READCAP16_ARR_SZ];
1036 	unsigned long long capac;
1037 	int errsts, k, alloc_len;
1038 
1039 	if ((errsts = check_readiness(scp, 1, devip)))
1040 		return errsts;
1041 	alloc_len = ((cmd[10] << 24) + (cmd[11] << 16) + (cmd[12] << 8)
1042 		     + cmd[13]);
1043 	/* following just in case virtual_gb changed */
1044 	sdebug_capacity = get_sdebug_capacity();
1045 	memset(arr, 0, SDEBUG_READCAP16_ARR_SZ);
1046 	capac = sdebug_capacity - 1;
1047 	for (k = 0; k < 8; ++k, capac >>= 8)
1048 		arr[7 - k] = capac & 0xff;
1049 	arr[8] = (scsi_debug_sector_size >> 24) & 0xff;
1050 	arr[9] = (scsi_debug_sector_size >> 16) & 0xff;
1051 	arr[10] = (scsi_debug_sector_size >> 8) & 0xff;
1052 	arr[11] = scsi_debug_sector_size & 0xff;
1053 	arr[13] = scsi_debug_physblk_exp & 0xf;
1054 	arr[14] = (scsi_debug_lowest_aligned >> 8) & 0x3f;
1055 
1056 	if (scsi_debug_tpu || scsi_debug_tpws)
1057 		arr[14] |= 0x80; /* TPE */
1058 
1059 	arr[15] = scsi_debug_lowest_aligned & 0xff;
1060 
1061 	if (scsi_debug_dif) {
1062 		arr[12] = (scsi_debug_dif - 1) << 1; /* P_TYPE */
1063 		arr[12] |= 1; /* PROT_EN */
1064 	}
1065 
1066 	return fill_from_dev_buffer(scp, arr,
1067 				    min(alloc_len, SDEBUG_READCAP16_ARR_SZ));
1068 }
1069 
1070 #define SDEBUG_MAX_TGTPGS_ARR_SZ 1412
1071 
1072 static int resp_report_tgtpgs(struct scsi_cmnd * scp,
1073 			      struct sdebug_dev_info * devip)
1074 {
1075 	unsigned char *cmd = (unsigned char *)scp->cmnd;
1076 	unsigned char * arr;
1077 	int host_no = devip->sdbg_host->shost->host_no;
1078 	int n, ret, alen, rlen;
1079 	int port_group_a, port_group_b, port_a, port_b;
1080 
1081 	alen = ((cmd[6] << 24) + (cmd[7] << 16) + (cmd[8] << 8)
1082 		+ cmd[9]);
1083 
1084 	arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_ATOMIC);
1085 	if (! arr)
1086 		return DID_REQUEUE << 16;
1087 	/*
1088 	 * EVPD page 0x88 states we have two ports, one
1089 	 * real and a fake port with no device connected.
1090 	 * So we create two port groups with one port each
1091 	 * and set the group with port B to unavailable.
1092 	 */
1093 	port_a = 0x1; /* relative port A */
1094 	port_b = 0x2; /* relative port B */
1095 	port_group_a = (((host_no + 1) & 0x7f) << 8) +
1096 	    (devip->channel & 0x7f);
1097 	port_group_b = (((host_no + 1) & 0x7f) << 8) +
1098 	    (devip->channel & 0x7f) + 0x80;
1099 
1100 	/*
1101 	 * The asymmetric access state is cycled according to the host_id.
1102 	 */
1103 	n = 4;
1104 	if (0 == scsi_debug_vpd_use_hostno) {
1105 	    arr[n++] = host_no % 3; /* Asymm access state */
1106 	    arr[n++] = 0x0F; /* claim: all states are supported */
1107 	} else {
1108 	    arr[n++] = 0x0; /* Active/Optimized path */
1109 	    arr[n++] = 0x01; /* claim: only support active/optimized paths */
1110 	}
1111 	arr[n++] = (port_group_a >> 8) & 0xff;
1112 	arr[n++] = port_group_a & 0xff;
1113 	arr[n++] = 0;    /* Reserved */
1114 	arr[n++] = 0;    /* Status code */
1115 	arr[n++] = 0;    /* Vendor unique */
1116 	arr[n++] = 0x1;  /* One port per group */
1117 	arr[n++] = 0;    /* Reserved */
1118 	arr[n++] = 0;    /* Reserved */
1119 	arr[n++] = (port_a >> 8) & 0xff;
1120 	arr[n++] = port_a & 0xff;
1121 	arr[n++] = 3;    /* Port unavailable */
1122 	arr[n++] = 0x08; /* claim: only unavailalbe paths are supported */
1123 	arr[n++] = (port_group_b >> 8) & 0xff;
1124 	arr[n++] = port_group_b & 0xff;
1125 	arr[n++] = 0;    /* Reserved */
1126 	arr[n++] = 0;    /* Status code */
1127 	arr[n++] = 0;    /* Vendor unique */
1128 	arr[n++] = 0x1;  /* One port per group */
1129 	arr[n++] = 0;    /* Reserved */
1130 	arr[n++] = 0;    /* Reserved */
1131 	arr[n++] = (port_b >> 8) & 0xff;
1132 	arr[n++] = port_b & 0xff;
1133 
1134 	rlen = n - 4;
1135 	arr[0] = (rlen >> 24) & 0xff;
1136 	arr[1] = (rlen >> 16) & 0xff;
1137 	arr[2] = (rlen >> 8) & 0xff;
1138 	arr[3] = rlen & 0xff;
1139 
1140 	/*
1141 	 * Return the smallest value of either
1142 	 * - The allocated length
1143 	 * - The constructed command length
1144 	 * - The maximum array size
1145 	 */
1146 	rlen = min(alen,n);
1147 	ret = fill_from_dev_buffer(scp, arr,
1148 				   min(rlen, SDEBUG_MAX_TGTPGS_ARR_SZ));
1149 	kfree(arr);
1150 	return ret;
1151 }
1152 
1153 /* <<Following mode page info copied from ST318451LW>> */
1154 
1155 static int resp_err_recov_pg(unsigned char * p, int pcontrol, int target)
1156 {	/* Read-Write Error Recovery page for mode_sense */
1157 	unsigned char err_recov_pg[] = {0x1, 0xa, 0xc0, 11, 240, 0, 0, 0,
1158 					5, 0, 0xff, 0xff};
1159 
1160 	memcpy(p, err_recov_pg, sizeof(err_recov_pg));
1161 	if (1 == pcontrol)
1162 		memset(p + 2, 0, sizeof(err_recov_pg) - 2);
1163 	return sizeof(err_recov_pg);
1164 }
1165 
1166 static int resp_disconnect_pg(unsigned char * p, int pcontrol, int target)
1167 { 	/* Disconnect-Reconnect page for mode_sense */
1168 	unsigned char disconnect_pg[] = {0x2, 0xe, 128, 128, 0, 10, 0, 0,
1169 					 0, 0, 0, 0, 0, 0, 0, 0};
1170 
1171 	memcpy(p, disconnect_pg, sizeof(disconnect_pg));
1172 	if (1 == pcontrol)
1173 		memset(p + 2, 0, sizeof(disconnect_pg) - 2);
1174 	return sizeof(disconnect_pg);
1175 }
1176 
1177 static int resp_format_pg(unsigned char * p, int pcontrol, int target)
1178 {       /* Format device page for mode_sense */
1179 	unsigned char format_pg[] = {0x3, 0x16, 0, 0, 0, 0, 0, 0,
1180 				     0, 0, 0, 0, 0, 0, 0, 0,
1181 				     0, 0, 0, 0, 0x40, 0, 0, 0};
1182 
1183 	memcpy(p, format_pg, sizeof(format_pg));
1184 	p[10] = (sdebug_sectors_per >> 8) & 0xff;
1185 	p[11] = sdebug_sectors_per & 0xff;
1186 	p[12] = (scsi_debug_sector_size >> 8) & 0xff;
1187 	p[13] = scsi_debug_sector_size & 0xff;
1188 	if (DEV_REMOVEABLE(target))
1189 		p[20] |= 0x20; /* should agree with INQUIRY */
1190 	if (1 == pcontrol)
1191 		memset(p + 2, 0, sizeof(format_pg) - 2);
1192 	return sizeof(format_pg);
1193 }
1194 
1195 static int resp_caching_pg(unsigned char * p, int pcontrol, int target)
1196 { 	/* Caching page for mode_sense */
1197 	unsigned char caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
1198 		0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0,     0, 0, 0, 0};
1199 
1200 	memcpy(p, caching_pg, sizeof(caching_pg));
1201 	if (1 == pcontrol)
1202 		memset(p + 2, 0, sizeof(caching_pg) - 2);
1203 	return sizeof(caching_pg);
1204 }
1205 
1206 static int resp_ctrl_m_pg(unsigned char * p, int pcontrol, int target)
1207 { 	/* Control mode page for mode_sense */
1208 	unsigned char ch_ctrl_m_pg[] = {/* 0xa, 10, */ 0x6, 0, 0, 0, 0, 0,
1209 				        0, 0, 0, 0};
1210 	unsigned char d_ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
1211 				     0, 0, 0x2, 0x4b};
1212 
1213 	if (scsi_debug_dsense)
1214 		ctrl_m_pg[2] |= 0x4;
1215 	else
1216 		ctrl_m_pg[2] &= ~0x4;
1217 
1218 	if (scsi_debug_ato)
1219 		ctrl_m_pg[5] |= 0x80; /* ATO=1 */
1220 
1221 	memcpy(p, ctrl_m_pg, sizeof(ctrl_m_pg));
1222 	if (1 == pcontrol)
1223 		memcpy(p + 2, ch_ctrl_m_pg, sizeof(ch_ctrl_m_pg));
1224 	else if (2 == pcontrol)
1225 		memcpy(p, d_ctrl_m_pg, sizeof(d_ctrl_m_pg));
1226 	return sizeof(ctrl_m_pg);
1227 }
1228 
1229 
1230 static int resp_iec_m_pg(unsigned char * p, int pcontrol, int target)
1231 {	/* Informational Exceptions control mode page for mode_sense */
1232 	unsigned char ch_iec_m_pg[] = {/* 0x1c, 0xa, */ 0x4, 0xf, 0, 0, 0, 0,
1233 				       0, 0, 0x0, 0x0};
1234 	unsigned char d_iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
1235 				      0, 0, 0x0, 0x0};
1236 
1237 	memcpy(p, iec_m_pg, sizeof(iec_m_pg));
1238 	if (1 == pcontrol)
1239 		memcpy(p + 2, ch_iec_m_pg, sizeof(ch_iec_m_pg));
1240 	else if (2 == pcontrol)
1241 		memcpy(p, d_iec_m_pg, sizeof(d_iec_m_pg));
1242 	return sizeof(iec_m_pg);
1243 }
1244 
1245 static int resp_sas_sf_m_pg(unsigned char * p, int pcontrol, int target)
1246 {	/* SAS SSP mode page - short format for mode_sense */
1247 	unsigned char sas_sf_m_pg[] = {0x19, 0x6,
1248 		0x6, 0x0, 0x7, 0xd0, 0x0, 0x0};
1249 
1250 	memcpy(p, sas_sf_m_pg, sizeof(sas_sf_m_pg));
1251 	if (1 == pcontrol)
1252 		memset(p + 2, 0, sizeof(sas_sf_m_pg) - 2);
1253 	return sizeof(sas_sf_m_pg);
1254 }
1255 
1256 
1257 static int resp_sas_pcd_m_spg(unsigned char * p, int pcontrol, int target,
1258 			      int target_dev_id)
1259 {	/* SAS phy control and discover mode page for mode_sense */
1260 	unsigned char sas_pcd_m_pg[] = {0x59, 0x1, 0, 0x64, 0, 0x6, 0, 2,
1261 		    0, 0, 0, 0, 0x10, 0x9, 0x8, 0x0,
1262 		    0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0,
1263 		    0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1,
1264 		    0x2, 0, 0, 0, 0, 0, 0, 0,
1265 		    0x88, 0x99, 0, 0, 0, 0, 0, 0,
1266 		    0, 0, 0, 0, 0, 0, 0, 0,
1267 		    0, 1, 0, 0, 0x10, 0x9, 0x8, 0x0,
1268 		    0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0,
1269 		    0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1,
1270 		    0x3, 0, 0, 0, 0, 0, 0, 0,
1271 		    0x88, 0x99, 0, 0, 0, 0, 0, 0,
1272 		    0, 0, 0, 0, 0, 0, 0, 0,
1273 		};
1274 	int port_a, port_b;
1275 
1276 	port_a = target_dev_id + 1;
1277 	port_b = port_a + 1;
1278 	memcpy(p, sas_pcd_m_pg, sizeof(sas_pcd_m_pg));
1279 	p[20] = (port_a >> 24);
1280 	p[21] = (port_a >> 16) & 0xff;
1281 	p[22] = (port_a >> 8) & 0xff;
1282 	p[23] = port_a & 0xff;
1283 	p[48 + 20] = (port_b >> 24);
1284 	p[48 + 21] = (port_b >> 16) & 0xff;
1285 	p[48 + 22] = (port_b >> 8) & 0xff;
1286 	p[48 + 23] = port_b & 0xff;
1287 	if (1 == pcontrol)
1288 		memset(p + 4, 0, sizeof(sas_pcd_m_pg) - 4);
1289 	return sizeof(sas_pcd_m_pg);
1290 }
1291 
1292 static int resp_sas_sha_m_spg(unsigned char * p, int pcontrol)
1293 {	/* SAS SSP shared protocol specific port mode subpage */
1294 	unsigned char sas_sha_m_pg[] = {0x59, 0x2, 0, 0xc, 0, 0x6, 0x10, 0,
1295 		    0, 0, 0, 0, 0, 0, 0, 0,
1296 		};
1297 
1298 	memcpy(p, sas_sha_m_pg, sizeof(sas_sha_m_pg));
1299 	if (1 == pcontrol)
1300 		memset(p + 4, 0, sizeof(sas_sha_m_pg) - 4);
1301 	return sizeof(sas_sha_m_pg);
1302 }
1303 
1304 #define SDEBUG_MAX_MSENSE_SZ 256
1305 
1306 static int resp_mode_sense(struct scsi_cmnd * scp, int target,
1307 			   struct sdebug_dev_info * devip)
1308 {
1309 	unsigned char dbd, llbaa;
1310 	int pcontrol, pcode, subpcode, bd_len;
1311 	unsigned char dev_spec;
1312 	int k, alloc_len, msense_6, offset, len, errsts, target_dev_id;
1313 	unsigned char * ap;
1314 	unsigned char arr[SDEBUG_MAX_MSENSE_SZ];
1315 	unsigned char *cmd = (unsigned char *)scp->cmnd;
1316 
1317 	if ((errsts = check_readiness(scp, 1, devip)))
1318 		return errsts;
1319 	dbd = !!(cmd[1] & 0x8);
1320 	pcontrol = (cmd[2] & 0xc0) >> 6;
1321 	pcode = cmd[2] & 0x3f;
1322 	subpcode = cmd[3];
1323 	msense_6 = (MODE_SENSE == cmd[0]);
1324 	llbaa = msense_6 ? 0 : !!(cmd[1] & 0x10);
1325 	if ((0 == scsi_debug_ptype) && (0 == dbd))
1326 		bd_len = llbaa ? 16 : 8;
1327 	else
1328 		bd_len = 0;
1329 	alloc_len = msense_6 ? cmd[4] : ((cmd[7] << 8) | cmd[8]);
1330 	memset(arr, 0, SDEBUG_MAX_MSENSE_SZ);
1331 	if (0x3 == pcontrol) {  /* Saving values not supported */
1332 		mk_sense_buffer(devip, ILLEGAL_REQUEST, SAVING_PARAMS_UNSUP,
1333 			       	0);
1334 		return check_condition_result;
1335 	}
1336 	target_dev_id = ((devip->sdbg_host->shost->host_no + 1) * 2000) +
1337 			(devip->target * 1000) - 3;
1338 	/* set DPOFUA bit for disks */
1339 	if (0 == scsi_debug_ptype)
1340 		dev_spec = (DEV_READONLY(target) ? 0x80 : 0x0) | 0x10;
1341 	else
1342 		dev_spec = 0x0;
1343 	if (msense_6) {
1344 		arr[2] = dev_spec;
1345 		arr[3] = bd_len;
1346 		offset = 4;
1347 	} else {
1348 		arr[3] = dev_spec;
1349 		if (16 == bd_len)
1350 			arr[4] = 0x1;	/* set LONGLBA bit */
1351 		arr[7] = bd_len;	/* assume 255 or less */
1352 		offset = 8;
1353 	}
1354 	ap = arr + offset;
1355 	if ((bd_len > 0) && (!sdebug_capacity))
1356 		sdebug_capacity = get_sdebug_capacity();
1357 
1358 	if (8 == bd_len) {
1359 		if (sdebug_capacity > 0xfffffffe) {
1360 			ap[0] = 0xff;
1361 			ap[1] = 0xff;
1362 			ap[2] = 0xff;
1363 			ap[3] = 0xff;
1364 		} else {
1365 			ap[0] = (sdebug_capacity >> 24) & 0xff;
1366 			ap[1] = (sdebug_capacity >> 16) & 0xff;
1367 			ap[2] = (sdebug_capacity >> 8) & 0xff;
1368 			ap[3] = sdebug_capacity & 0xff;
1369 		}
1370 		ap[6] = (scsi_debug_sector_size >> 8) & 0xff;
1371 		ap[7] = scsi_debug_sector_size & 0xff;
1372 		offset += bd_len;
1373 		ap = arr + offset;
1374 	} else if (16 == bd_len) {
1375 		unsigned long long capac = sdebug_capacity;
1376 
1377         	for (k = 0; k < 8; ++k, capac >>= 8)
1378                 	ap[7 - k] = capac & 0xff;
1379 		ap[12] = (scsi_debug_sector_size >> 24) & 0xff;
1380 		ap[13] = (scsi_debug_sector_size >> 16) & 0xff;
1381 		ap[14] = (scsi_debug_sector_size >> 8) & 0xff;
1382 		ap[15] = scsi_debug_sector_size & 0xff;
1383 		offset += bd_len;
1384 		ap = arr + offset;
1385 	}
1386 
1387 	if ((subpcode > 0x0) && (subpcode < 0xff) && (0x19 != pcode)) {
1388 		/* TODO: Control Extension page */
1389 		mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1390 			       	0);
1391 		return check_condition_result;
1392 	}
1393 	switch (pcode) {
1394 	case 0x1:	/* Read-Write error recovery page, direct access */
1395 		len = resp_err_recov_pg(ap, pcontrol, target);
1396 		offset += len;
1397 		break;
1398 	case 0x2:	/* Disconnect-Reconnect page, all devices */
1399 		len = resp_disconnect_pg(ap, pcontrol, target);
1400 		offset += len;
1401 		break;
1402         case 0x3:       /* Format device page, direct access */
1403                 len = resp_format_pg(ap, pcontrol, target);
1404                 offset += len;
1405                 break;
1406 	case 0x8:	/* Caching page, direct access */
1407 		len = resp_caching_pg(ap, pcontrol, target);
1408 		offset += len;
1409 		break;
1410 	case 0xa:	/* Control Mode page, all devices */
1411 		len = resp_ctrl_m_pg(ap, pcontrol, target);
1412 		offset += len;
1413 		break;
1414 	case 0x19:	/* if spc==1 then sas phy, control+discover */
1415 		if ((subpcode > 0x2) && (subpcode < 0xff)) {
1416 		        mk_sense_buffer(devip, ILLEGAL_REQUEST,
1417 					INVALID_FIELD_IN_CDB, 0);
1418 			return check_condition_result;
1419 	        }
1420 		len = 0;
1421 		if ((0x0 == subpcode) || (0xff == subpcode))
1422 			len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
1423 		if ((0x1 == subpcode) || (0xff == subpcode))
1424 			len += resp_sas_pcd_m_spg(ap + len, pcontrol, target,
1425 						  target_dev_id);
1426 		if ((0x2 == subpcode) || (0xff == subpcode))
1427 			len += resp_sas_sha_m_spg(ap + len, pcontrol);
1428 		offset += len;
1429 		break;
1430 	case 0x1c:	/* Informational Exceptions Mode page, all devices */
1431 		len = resp_iec_m_pg(ap, pcontrol, target);
1432 		offset += len;
1433 		break;
1434 	case 0x3f:	/* Read all Mode pages */
1435 		if ((0 == subpcode) || (0xff == subpcode)) {
1436 			len = resp_err_recov_pg(ap, pcontrol, target);
1437 			len += resp_disconnect_pg(ap + len, pcontrol, target);
1438 			len += resp_format_pg(ap + len, pcontrol, target);
1439 			len += resp_caching_pg(ap + len, pcontrol, target);
1440 			len += resp_ctrl_m_pg(ap + len, pcontrol, target);
1441 			len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
1442 			if (0xff == subpcode) {
1443 				len += resp_sas_pcd_m_spg(ap + len, pcontrol,
1444 						  target, target_dev_id);
1445 				len += resp_sas_sha_m_spg(ap + len, pcontrol);
1446 			}
1447 			len += resp_iec_m_pg(ap + len, pcontrol, target);
1448 		} else {
1449 			mk_sense_buffer(devip, ILLEGAL_REQUEST,
1450 					INVALID_FIELD_IN_CDB, 0);
1451 			return check_condition_result;
1452                 }
1453 		offset += len;
1454 		break;
1455 	default:
1456 		mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1457 			       	0);
1458 		return check_condition_result;
1459 	}
1460 	if (msense_6)
1461 		arr[0] = offset - 1;
1462 	else {
1463 		arr[0] = ((offset - 2) >> 8) & 0xff;
1464 		arr[1] = (offset - 2) & 0xff;
1465 	}
1466 	return fill_from_dev_buffer(scp, arr, min(alloc_len, offset));
1467 }
1468 
1469 #define SDEBUG_MAX_MSELECT_SZ 512
1470 
1471 static int resp_mode_select(struct scsi_cmnd * scp, int mselect6,
1472 			    struct sdebug_dev_info * devip)
1473 {
1474 	int pf, sp, ps, md_len, bd_len, off, spf, pg_len;
1475 	int param_len, res, errsts, mpage;
1476 	unsigned char arr[SDEBUG_MAX_MSELECT_SZ];
1477 	unsigned char *cmd = (unsigned char *)scp->cmnd;
1478 
1479 	if ((errsts = check_readiness(scp, 1, devip)))
1480 		return errsts;
1481 	memset(arr, 0, sizeof(arr));
1482 	pf = cmd[1] & 0x10;
1483 	sp = cmd[1] & 0x1;
1484 	param_len = mselect6 ? cmd[4] : ((cmd[7] << 8) + cmd[8]);
1485 	if ((0 == pf) || sp || (param_len > SDEBUG_MAX_MSELECT_SZ)) {
1486 		mk_sense_buffer(devip, ILLEGAL_REQUEST,
1487 				INVALID_FIELD_IN_CDB, 0);
1488 		return check_condition_result;
1489 	}
1490         res = fetch_to_dev_buffer(scp, arr, param_len);
1491         if (-1 == res)
1492                 return (DID_ERROR << 16);
1493         else if ((res < param_len) &&
1494                  (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
1495                 printk(KERN_INFO "scsi_debug: mode_select: cdb indicated=%d, "
1496                        " IO sent=%d bytes\n", param_len, res);
1497 	md_len = mselect6 ? (arr[0] + 1) : ((arr[0] << 8) + arr[1] + 2);
1498 	bd_len = mselect6 ? arr[3] : ((arr[6] << 8) + arr[7]);
1499 	if (md_len > 2) {
1500 		mk_sense_buffer(devip, ILLEGAL_REQUEST,
1501 				INVALID_FIELD_IN_PARAM_LIST, 0);
1502 		return check_condition_result;
1503 	}
1504 	off = bd_len + (mselect6 ? 4 : 8);
1505 	mpage = arr[off] & 0x3f;
1506 	ps = !!(arr[off] & 0x80);
1507 	if (ps) {
1508 		mk_sense_buffer(devip, ILLEGAL_REQUEST,
1509 				INVALID_FIELD_IN_PARAM_LIST, 0);
1510 		return check_condition_result;
1511 	}
1512 	spf = !!(arr[off] & 0x40);
1513 	pg_len = spf ? ((arr[off + 2] << 8) + arr[off + 3] + 4) :
1514 		       (arr[off + 1] + 2);
1515 	if ((pg_len + off) > param_len) {
1516 		mk_sense_buffer(devip, ILLEGAL_REQUEST,
1517 				PARAMETER_LIST_LENGTH_ERR, 0);
1518 		return check_condition_result;
1519 	}
1520 	switch (mpage) {
1521 	case 0xa:      /* Control Mode page */
1522 		if (ctrl_m_pg[1] == arr[off + 1]) {
1523 			memcpy(ctrl_m_pg + 2, arr + off + 2,
1524 			       sizeof(ctrl_m_pg) - 2);
1525 			scsi_debug_dsense = !!(ctrl_m_pg[2] & 0x4);
1526 			return 0;
1527 		}
1528 		break;
1529 	case 0x1c:      /* Informational Exceptions Mode page */
1530 		if (iec_m_pg[1] == arr[off + 1]) {
1531 			memcpy(iec_m_pg + 2, arr + off + 2,
1532 			       sizeof(iec_m_pg) - 2);
1533 			return 0;
1534 		}
1535 		break;
1536 	default:
1537 		break;
1538 	}
1539 	mk_sense_buffer(devip, ILLEGAL_REQUEST,
1540 			INVALID_FIELD_IN_PARAM_LIST, 0);
1541 	return check_condition_result;
1542 }
1543 
1544 static int resp_temp_l_pg(unsigned char * arr)
1545 {
1546 	unsigned char temp_l_pg[] = {0x0, 0x0, 0x3, 0x2, 0x0, 38,
1547 				     0x0, 0x1, 0x3, 0x2, 0x0, 65,
1548 		};
1549 
1550         memcpy(arr, temp_l_pg, sizeof(temp_l_pg));
1551         return sizeof(temp_l_pg);
1552 }
1553 
1554 static int resp_ie_l_pg(unsigned char * arr)
1555 {
1556 	unsigned char ie_l_pg[] = {0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 38,
1557 		};
1558 
1559         memcpy(arr, ie_l_pg, sizeof(ie_l_pg));
1560 	if (iec_m_pg[2] & 0x4) {	/* TEST bit set */
1561 		arr[4] = THRESHOLD_EXCEEDED;
1562 		arr[5] = 0xff;
1563 	}
1564         return sizeof(ie_l_pg);
1565 }
1566 
1567 #define SDEBUG_MAX_LSENSE_SZ 512
1568 
1569 static int resp_log_sense(struct scsi_cmnd * scp,
1570                           struct sdebug_dev_info * devip)
1571 {
1572 	int ppc, sp, pcontrol, pcode, subpcode, alloc_len, errsts, len, n;
1573 	unsigned char arr[SDEBUG_MAX_LSENSE_SZ];
1574 	unsigned char *cmd = (unsigned char *)scp->cmnd;
1575 
1576 	if ((errsts = check_readiness(scp, 1, devip)))
1577 		return errsts;
1578 	memset(arr, 0, sizeof(arr));
1579 	ppc = cmd[1] & 0x2;
1580 	sp = cmd[1] & 0x1;
1581 	if (ppc || sp) {
1582 		mk_sense_buffer(devip, ILLEGAL_REQUEST,
1583 				INVALID_FIELD_IN_CDB, 0);
1584 		return check_condition_result;
1585 	}
1586 	pcontrol = (cmd[2] & 0xc0) >> 6;
1587 	pcode = cmd[2] & 0x3f;
1588 	subpcode = cmd[3] & 0xff;
1589 	alloc_len = (cmd[7] << 8) + cmd[8];
1590 	arr[0] = pcode;
1591 	if (0 == subpcode) {
1592 		switch (pcode) {
1593 		case 0x0:	/* Supported log pages log page */
1594 			n = 4;
1595 			arr[n++] = 0x0;		/* this page */
1596 			arr[n++] = 0xd;		/* Temperature */
1597 			arr[n++] = 0x2f;	/* Informational exceptions */
1598 			arr[3] = n - 4;
1599 			break;
1600 		case 0xd:	/* Temperature log page */
1601 			arr[3] = resp_temp_l_pg(arr + 4);
1602 			break;
1603 		case 0x2f:	/* Informational exceptions log page */
1604 			arr[3] = resp_ie_l_pg(arr + 4);
1605 			break;
1606 		default:
1607 			mk_sense_buffer(devip, ILLEGAL_REQUEST,
1608 					INVALID_FIELD_IN_CDB, 0);
1609 			return check_condition_result;
1610 		}
1611 	} else if (0xff == subpcode) {
1612 		arr[0] |= 0x40;
1613 		arr[1] = subpcode;
1614 		switch (pcode) {
1615 		case 0x0:	/* Supported log pages and subpages log page */
1616 			n = 4;
1617 			arr[n++] = 0x0;
1618 			arr[n++] = 0x0;		/* 0,0 page */
1619 			arr[n++] = 0x0;
1620 			arr[n++] = 0xff;	/* this page */
1621 			arr[n++] = 0xd;
1622 			arr[n++] = 0x0;		/* Temperature */
1623 			arr[n++] = 0x2f;
1624 			arr[n++] = 0x0;	/* Informational exceptions */
1625 			arr[3] = n - 4;
1626 			break;
1627 		case 0xd:	/* Temperature subpages */
1628 			n = 4;
1629 			arr[n++] = 0xd;
1630 			arr[n++] = 0x0;		/* Temperature */
1631 			arr[3] = n - 4;
1632 			break;
1633 		case 0x2f:	/* Informational exceptions subpages */
1634 			n = 4;
1635 			arr[n++] = 0x2f;
1636 			arr[n++] = 0x0;		/* Informational exceptions */
1637 			arr[3] = n - 4;
1638 			break;
1639 		default:
1640 			mk_sense_buffer(devip, ILLEGAL_REQUEST,
1641 					INVALID_FIELD_IN_CDB, 0);
1642 			return check_condition_result;
1643 		}
1644 	} else {
1645 		mk_sense_buffer(devip, ILLEGAL_REQUEST,
1646 				INVALID_FIELD_IN_CDB, 0);
1647 		return check_condition_result;
1648 	}
1649 	len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len);
1650 	return fill_from_dev_buffer(scp, arr,
1651 		    min(len, SDEBUG_MAX_INQ_ARR_SZ));
1652 }
1653 
1654 static int check_device_access_params(struct sdebug_dev_info *devi,
1655 				      unsigned long long lba, unsigned int num)
1656 {
1657 	if (lba + num > sdebug_capacity) {
1658 		mk_sense_buffer(devi, ILLEGAL_REQUEST, ADDR_OUT_OF_RANGE, 0);
1659 		return check_condition_result;
1660 	}
1661 	/* transfer length excessive (tie in to block limits VPD page) */
1662 	if (num > sdebug_store_sectors) {
1663 		mk_sense_buffer(devi, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
1664 		return check_condition_result;
1665 	}
1666 	return 0;
1667 }
1668 
1669 static int do_device_access(struct scsi_cmnd *scmd,
1670 			    struct sdebug_dev_info *devi,
1671 			    unsigned long long lba, unsigned int num, int write)
1672 {
1673 	int ret;
1674 	unsigned long long block, rest = 0;
1675 	int (*func)(struct scsi_cmnd *, unsigned char *, int);
1676 
1677 	func = write ? fetch_to_dev_buffer : fill_from_dev_buffer;
1678 
1679 	block = do_div(lba, sdebug_store_sectors);
1680 	if (block + num > sdebug_store_sectors)
1681 		rest = block + num - sdebug_store_sectors;
1682 
1683 	ret = func(scmd, fake_storep + (block * scsi_debug_sector_size),
1684 		   (num - rest) * scsi_debug_sector_size);
1685 	if (!ret && rest)
1686 		ret = func(scmd, fake_storep, rest * scsi_debug_sector_size);
1687 
1688 	return ret;
1689 }
1690 
1691 static int prot_verify_read(struct scsi_cmnd *SCpnt, sector_t start_sec,
1692 			    unsigned int sectors, u32 ei_lba)
1693 {
1694 	unsigned int i, resid;
1695 	struct scatterlist *psgl;
1696 	struct sd_dif_tuple *sdt;
1697 	sector_t sector;
1698 	sector_t tmp_sec = start_sec;
1699 	void *paddr;
1700 
1701 	start_sec = do_div(tmp_sec, sdebug_store_sectors);
1702 
1703 	sdt = (struct sd_dif_tuple *)(dif_storep + dif_offset(start_sec));
1704 
1705 	for (i = 0 ; i < sectors ; i++) {
1706 		u16 csum;
1707 
1708 		if (sdt[i].app_tag == 0xffff)
1709 			continue;
1710 
1711 		sector = start_sec + i;
1712 
1713 		switch (scsi_debug_guard) {
1714 		case 1:
1715 			csum = ip_compute_csum(fake_storep +
1716 					       sector * scsi_debug_sector_size,
1717 					       scsi_debug_sector_size);
1718 			break;
1719 		case 0:
1720 			csum = crc_t10dif(fake_storep +
1721 					  sector * scsi_debug_sector_size,
1722 					  scsi_debug_sector_size);
1723 			csum = cpu_to_be16(csum);
1724 			break;
1725 		default:
1726 			BUG();
1727 		}
1728 
1729 		if (sdt[i].guard_tag != csum) {
1730 			printk(KERN_ERR "%s: GUARD check failed on sector %lu" \
1731 			       " rcvd 0x%04x, data 0x%04x\n", __func__,
1732 			       (unsigned long)sector,
1733 			       be16_to_cpu(sdt[i].guard_tag),
1734 			       be16_to_cpu(csum));
1735 			dif_errors++;
1736 			return 0x01;
1737 		}
1738 
1739 		if (scsi_debug_dif == SD_DIF_TYPE1_PROTECTION &&
1740 		    be32_to_cpu(sdt[i].ref_tag) != (sector & 0xffffffff)) {
1741 			printk(KERN_ERR "%s: REF check failed on sector %lu\n",
1742 			       __func__, (unsigned long)sector);
1743 			dif_errors++;
1744 			return 0x03;
1745 		}
1746 
1747 		if (scsi_debug_dif == SD_DIF_TYPE2_PROTECTION &&
1748 		    be32_to_cpu(sdt[i].ref_tag) != ei_lba) {
1749 			printk(KERN_ERR "%s: REF check failed on sector %lu\n",
1750 			       __func__, (unsigned long)sector);
1751 			dif_errors++;
1752 			return 0x03;
1753 		}
1754 
1755 		ei_lba++;
1756 	}
1757 
1758 	resid = sectors * 8; /* Bytes of protection data to copy into sgl */
1759 	sector = start_sec;
1760 
1761 	scsi_for_each_prot_sg(SCpnt, psgl, scsi_prot_sg_count(SCpnt), i) {
1762 		int len = min(psgl->length, resid);
1763 
1764 		paddr = kmap_atomic(sg_page(psgl), KM_IRQ0) + psgl->offset;
1765 		memcpy(paddr, dif_storep + dif_offset(sector), len);
1766 
1767 		sector += len >> 3;
1768 		if (sector >= sdebug_store_sectors) {
1769 			/* Force wrap */
1770 			tmp_sec = sector;
1771 			sector = do_div(tmp_sec, sdebug_store_sectors);
1772 		}
1773 		resid -= len;
1774 		kunmap_atomic(paddr, KM_IRQ0);
1775 	}
1776 
1777 	dix_reads++;
1778 
1779 	return 0;
1780 }
1781 
1782 static int resp_read(struct scsi_cmnd *SCpnt, unsigned long long lba,
1783 		     unsigned int num, struct sdebug_dev_info *devip,
1784 		     u32 ei_lba)
1785 {
1786 	unsigned long iflags;
1787 	int ret;
1788 
1789 	ret = check_device_access_params(devip, lba, num);
1790 	if (ret)
1791 		return ret;
1792 
1793 	if ((SCSI_DEBUG_OPT_MEDIUM_ERR & scsi_debug_opts) &&
1794 	    (lba <= OPT_MEDIUM_ERR_ADDR) &&
1795 	    ((lba + num) > OPT_MEDIUM_ERR_ADDR)) {
1796 		/* claim unrecoverable read error */
1797 		mk_sense_buffer(devip, MEDIUM_ERROR, UNRECOVERED_READ_ERR,
1798 				0);
1799 		/* set info field and valid bit for fixed descriptor */
1800 		if (0x70 == (devip->sense_buff[0] & 0x7f)) {
1801 			devip->sense_buff[0] |= 0x80;	/* Valid bit */
1802 			ret = OPT_MEDIUM_ERR_ADDR;
1803 			devip->sense_buff[3] = (ret >> 24) & 0xff;
1804 			devip->sense_buff[4] = (ret >> 16) & 0xff;
1805 			devip->sense_buff[5] = (ret >> 8) & 0xff;
1806 			devip->sense_buff[6] = ret & 0xff;
1807 		}
1808 	        scsi_set_resid(SCpnt, scsi_bufflen(SCpnt));
1809 		return check_condition_result;
1810 	}
1811 
1812 	/* DIX + T10 DIF */
1813 	if (scsi_debug_dix && scsi_prot_sg_count(SCpnt)) {
1814 		int prot_ret = prot_verify_read(SCpnt, lba, num, ei_lba);
1815 
1816 		if (prot_ret) {
1817 			mk_sense_buffer(devip, ABORTED_COMMAND, 0x10, prot_ret);
1818 			return illegal_condition_result;
1819 		}
1820 	}
1821 
1822 	read_lock_irqsave(&atomic_rw, iflags);
1823 	ret = do_device_access(SCpnt, devip, lba, num, 0);
1824 	read_unlock_irqrestore(&atomic_rw, iflags);
1825 	return ret;
1826 }
1827 
1828 void dump_sector(unsigned char *buf, int len)
1829 {
1830 	int i, j;
1831 
1832 	printk(KERN_ERR ">>> Sector Dump <<<\n");
1833 
1834 	for (i = 0 ; i < len ; i += 16) {
1835 		printk(KERN_ERR "%04d: ", i);
1836 
1837 		for (j = 0 ; j < 16 ; j++) {
1838 			unsigned char c = buf[i+j];
1839 			if (c >= 0x20 && c < 0x7e)
1840 				printk(" %c ", buf[i+j]);
1841 			else
1842 				printk("%02x ", buf[i+j]);
1843 		}
1844 
1845 		printk("\n");
1846 	}
1847 }
1848 
1849 static int prot_verify_write(struct scsi_cmnd *SCpnt, sector_t start_sec,
1850 			     unsigned int sectors, u32 ei_lba)
1851 {
1852 	int i, j, ret;
1853 	struct sd_dif_tuple *sdt;
1854 	struct scatterlist *dsgl = scsi_sglist(SCpnt);
1855 	struct scatterlist *psgl = scsi_prot_sglist(SCpnt);
1856 	void *daddr, *paddr;
1857 	sector_t tmp_sec = start_sec;
1858 	sector_t sector;
1859 	int ppage_offset;
1860 	unsigned short csum;
1861 
1862 	sector = do_div(tmp_sec, sdebug_store_sectors);
1863 
1864 	BUG_ON(scsi_sg_count(SCpnt) == 0);
1865 	BUG_ON(scsi_prot_sg_count(SCpnt) == 0);
1866 
1867 	paddr = kmap_atomic(sg_page(psgl), KM_IRQ1) + psgl->offset;
1868 	ppage_offset = 0;
1869 
1870 	/* For each data page */
1871 	scsi_for_each_sg(SCpnt, dsgl, scsi_sg_count(SCpnt), i) {
1872 		daddr = kmap_atomic(sg_page(dsgl), KM_IRQ0) + dsgl->offset;
1873 
1874 		/* For each sector-sized chunk in data page */
1875 		for (j = 0 ; j < dsgl->length ; j += scsi_debug_sector_size) {
1876 
1877 			/* If we're at the end of the current
1878 			 * protection page advance to the next one
1879 			 */
1880 			if (ppage_offset >= psgl->length) {
1881 				kunmap_atomic(paddr, KM_IRQ1);
1882 				psgl = sg_next(psgl);
1883 				BUG_ON(psgl == NULL);
1884 				paddr = kmap_atomic(sg_page(psgl), KM_IRQ1)
1885 					+ psgl->offset;
1886 				ppage_offset = 0;
1887 			}
1888 
1889 			sdt = paddr + ppage_offset;
1890 
1891 			switch (scsi_debug_guard) {
1892 			case 1:
1893 				csum = ip_compute_csum(daddr,
1894 						       scsi_debug_sector_size);
1895 				break;
1896 			case 0:
1897 				csum = cpu_to_be16(crc_t10dif(daddr,
1898 						      scsi_debug_sector_size));
1899 				break;
1900 			default:
1901 				BUG();
1902 				ret = 0;
1903 				goto out;
1904 			}
1905 
1906 			if (sdt->guard_tag != csum) {
1907 				printk(KERN_ERR
1908 				       "%s: GUARD check failed on sector %lu " \
1909 				       "rcvd 0x%04x, calculated 0x%04x\n",
1910 				       __func__, (unsigned long)sector,
1911 				       be16_to_cpu(sdt->guard_tag),
1912 				       be16_to_cpu(csum));
1913 				ret = 0x01;
1914 				dump_sector(daddr, scsi_debug_sector_size);
1915 				goto out;
1916 			}
1917 
1918 			if (scsi_debug_dif == SD_DIF_TYPE1_PROTECTION &&
1919 			    be32_to_cpu(sdt->ref_tag)
1920 			    != (start_sec & 0xffffffff)) {
1921 				printk(KERN_ERR
1922 				       "%s: REF check failed on sector %lu\n",
1923 				       __func__, (unsigned long)sector);
1924 				ret = 0x03;
1925 				dump_sector(daddr, scsi_debug_sector_size);
1926 				goto out;
1927 			}
1928 
1929 			if (scsi_debug_dif == SD_DIF_TYPE2_PROTECTION &&
1930 			    be32_to_cpu(sdt->ref_tag) != ei_lba) {
1931 				printk(KERN_ERR
1932 				       "%s: REF check failed on sector %lu\n",
1933 				       __func__, (unsigned long)sector);
1934 				ret = 0x03;
1935 				dump_sector(daddr, scsi_debug_sector_size);
1936 				goto out;
1937 			}
1938 
1939 			/* Would be great to copy this in bigger
1940 			 * chunks.  However, for the sake of
1941 			 * correctness we need to verify each sector
1942 			 * before writing it to "stable" storage
1943 			 */
1944 			memcpy(dif_storep + dif_offset(sector), sdt, 8);
1945 
1946 			sector++;
1947 
1948 			if (sector == sdebug_store_sectors)
1949 				sector = 0;	/* Force wrap */
1950 
1951 			start_sec++;
1952 			ei_lba++;
1953 			daddr += scsi_debug_sector_size;
1954 			ppage_offset += sizeof(struct sd_dif_tuple);
1955 		}
1956 
1957 		kunmap_atomic(daddr, KM_IRQ0);
1958 	}
1959 
1960 	kunmap_atomic(paddr, KM_IRQ1);
1961 
1962 	dix_writes++;
1963 
1964 	return 0;
1965 
1966 out:
1967 	dif_errors++;
1968 	kunmap_atomic(daddr, KM_IRQ0);
1969 	kunmap_atomic(paddr, KM_IRQ1);
1970 	return ret;
1971 }
1972 
1973 static unsigned int map_state(sector_t lba, unsigned int *num)
1974 {
1975 	unsigned int granularity, alignment, mapped;
1976 	sector_t block, next, end;
1977 
1978 	granularity = scsi_debug_unmap_granularity;
1979 	alignment = granularity - scsi_debug_unmap_alignment;
1980 	block = lba + alignment;
1981 	do_div(block, granularity);
1982 
1983 	mapped = test_bit(block, map_storep);
1984 
1985 	if (mapped)
1986 		next = find_next_zero_bit(map_storep, map_size, block);
1987 	else
1988 		next = find_next_bit(map_storep, map_size, block);
1989 
1990 	end = next * granularity - scsi_debug_unmap_alignment;
1991 	*num = end - lba;
1992 
1993 	return mapped;
1994 }
1995 
1996 static void map_region(sector_t lba, unsigned int len)
1997 {
1998 	unsigned int granularity, alignment;
1999 	sector_t end = lba + len;
2000 
2001 	granularity = scsi_debug_unmap_granularity;
2002 	alignment = granularity - scsi_debug_unmap_alignment;
2003 
2004 	while (lba < end) {
2005 		sector_t block, rem;
2006 
2007 		block = lba + alignment;
2008 		rem = do_div(block, granularity);
2009 
2010 		if (block < map_size)
2011 			set_bit(block, map_storep);
2012 
2013 		lba += granularity - rem;
2014 	}
2015 }
2016 
2017 static void unmap_region(sector_t lba, unsigned int len)
2018 {
2019 	unsigned int granularity, alignment;
2020 	sector_t end = lba + len;
2021 
2022 	granularity = scsi_debug_unmap_granularity;
2023 	alignment = granularity - scsi_debug_unmap_alignment;
2024 
2025 	while (lba < end) {
2026 		sector_t block, rem;
2027 
2028 		block = lba + alignment;
2029 		rem = do_div(block, granularity);
2030 
2031 		if (rem == 0 && lba + granularity <= end &&
2032 		    block < map_size)
2033 			clear_bit(block, map_storep);
2034 
2035 		lba += granularity - rem;
2036 	}
2037 }
2038 
2039 static int resp_write(struct scsi_cmnd *SCpnt, unsigned long long lba,
2040 		      unsigned int num, struct sdebug_dev_info *devip,
2041 		      u32 ei_lba)
2042 {
2043 	unsigned long iflags;
2044 	int ret;
2045 
2046 	ret = check_device_access_params(devip, lba, num);
2047 	if (ret)
2048 		return ret;
2049 
2050 	/* DIX + T10 DIF */
2051 	if (scsi_debug_dix && scsi_prot_sg_count(SCpnt)) {
2052 		int prot_ret = prot_verify_write(SCpnt, lba, num, ei_lba);
2053 
2054 		if (prot_ret) {
2055 			mk_sense_buffer(devip, ILLEGAL_REQUEST, 0x10, prot_ret);
2056 			return illegal_condition_result;
2057 		}
2058 	}
2059 
2060 	write_lock_irqsave(&atomic_rw, iflags);
2061 	ret = do_device_access(SCpnt, devip, lba, num, 1);
2062 	if (scsi_debug_unmap_granularity)
2063 		map_region(lba, num);
2064 	write_unlock_irqrestore(&atomic_rw, iflags);
2065 	if (-1 == ret)
2066 		return (DID_ERROR << 16);
2067 	else if ((ret < (num * scsi_debug_sector_size)) &&
2068 		 (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
2069 		printk(KERN_INFO "scsi_debug: write: cdb indicated=%u, "
2070 		       " IO sent=%d bytes\n", num * scsi_debug_sector_size, ret);
2071 
2072 	return 0;
2073 }
2074 
2075 static int resp_write_same(struct scsi_cmnd *scmd, unsigned long long lba,
2076 		      unsigned int num, struct sdebug_dev_info *devip,
2077 			   u32 ei_lba, unsigned int unmap)
2078 {
2079 	unsigned long iflags;
2080 	unsigned long long i;
2081 	int ret;
2082 
2083 	ret = check_device_access_params(devip, lba, num);
2084 	if (ret)
2085 		return ret;
2086 
2087 	write_lock_irqsave(&atomic_rw, iflags);
2088 
2089 	if (unmap && scsi_debug_unmap_granularity) {
2090 		unmap_region(lba, num);
2091 		goto out;
2092 	}
2093 
2094 	/* Else fetch one logical block */
2095 	ret = fetch_to_dev_buffer(scmd,
2096 				  fake_storep + (lba * scsi_debug_sector_size),
2097 				  scsi_debug_sector_size);
2098 
2099 	if (-1 == ret) {
2100 		write_unlock_irqrestore(&atomic_rw, iflags);
2101 		return (DID_ERROR << 16);
2102 	} else if ((ret < (num * scsi_debug_sector_size)) &&
2103 		 (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
2104 		printk(KERN_INFO "scsi_debug: write same: cdb indicated=%u, "
2105 		       " IO sent=%d bytes\n", num * scsi_debug_sector_size, ret);
2106 
2107 	/* Copy first sector to remaining blocks */
2108 	for (i = 1 ; i < num ; i++)
2109 		memcpy(fake_storep + ((lba + i) * scsi_debug_sector_size),
2110 		       fake_storep + (lba * scsi_debug_sector_size),
2111 		       scsi_debug_sector_size);
2112 
2113 	if (scsi_debug_unmap_granularity)
2114 		map_region(lba, num);
2115 out:
2116 	write_unlock_irqrestore(&atomic_rw, iflags);
2117 
2118 	return 0;
2119 }
2120 
2121 struct unmap_block_desc {
2122 	__be64	lba;
2123 	__be32	blocks;
2124 	__be32	__reserved;
2125 };
2126 
2127 static int resp_unmap(struct scsi_cmnd * scmd, struct sdebug_dev_info * devip)
2128 {
2129 	unsigned char *buf;
2130 	struct unmap_block_desc *desc;
2131 	unsigned int i, payload_len, descriptors;
2132 	int ret;
2133 
2134 	ret = check_readiness(scmd, 1, devip);
2135 	if (ret)
2136 		return ret;
2137 
2138 	payload_len = get_unaligned_be16(&scmd->cmnd[7]);
2139 	BUG_ON(scsi_bufflen(scmd) != payload_len);
2140 
2141 	descriptors = (payload_len - 8) / 16;
2142 
2143 	buf = kmalloc(scsi_bufflen(scmd), GFP_ATOMIC);
2144 	if (!buf)
2145 		return check_condition_result;
2146 
2147 	scsi_sg_copy_to_buffer(scmd, buf, scsi_bufflen(scmd));
2148 
2149 	BUG_ON(get_unaligned_be16(&buf[0]) != payload_len - 2);
2150 	BUG_ON(get_unaligned_be16(&buf[2]) != descriptors * 16);
2151 
2152 	desc = (void *)&buf[8];
2153 
2154 	for (i = 0 ; i < descriptors ; i++) {
2155 		unsigned long long lba = get_unaligned_be64(&desc[i].lba);
2156 		unsigned int num = get_unaligned_be32(&desc[i].blocks);
2157 
2158 		ret = check_device_access_params(devip, lba, num);
2159 		if (ret)
2160 			goto out;
2161 
2162 		unmap_region(lba, num);
2163 	}
2164 
2165 	ret = 0;
2166 
2167 out:
2168 	kfree(buf);
2169 
2170 	return ret;
2171 }
2172 
2173 #define SDEBUG_GET_LBA_STATUS_LEN 32
2174 
2175 static int resp_get_lba_status(struct scsi_cmnd * scmd,
2176 			       struct sdebug_dev_info * devip)
2177 {
2178 	unsigned long long lba;
2179 	unsigned int alloc_len, mapped, num;
2180 	unsigned char arr[SDEBUG_GET_LBA_STATUS_LEN];
2181 	int ret;
2182 
2183 	ret = check_readiness(scmd, 1, devip);
2184 	if (ret)
2185 		return ret;
2186 
2187 	lba = get_unaligned_be64(&scmd->cmnd[2]);
2188 	alloc_len = get_unaligned_be32(&scmd->cmnd[10]);
2189 
2190 	if (alloc_len < 24)
2191 		return 0;
2192 
2193 	ret = check_device_access_params(devip, lba, 1);
2194 	if (ret)
2195 		return ret;
2196 
2197 	mapped = map_state(lba, &num);
2198 
2199 	memset(arr, 0, SDEBUG_GET_LBA_STATUS_LEN);
2200 	put_unaligned_be32(16, &arr[0]);	/* Parameter Data Length */
2201 	put_unaligned_be64(lba, &arr[8]);	/* LBA */
2202 	put_unaligned_be32(num, &arr[16]);	/* Number of blocks */
2203 	arr[20] = !mapped;			/* mapped = 0, unmapped = 1 */
2204 
2205 	return fill_from_dev_buffer(scmd, arr, SDEBUG_GET_LBA_STATUS_LEN);
2206 }
2207 
2208 #define SDEBUG_RLUN_ARR_SZ 256
2209 
2210 static int resp_report_luns(struct scsi_cmnd * scp,
2211 			    struct sdebug_dev_info * devip)
2212 {
2213 	unsigned int alloc_len;
2214 	int lun_cnt, i, upper, num, n, wlun, lun;
2215 	unsigned char *cmd = (unsigned char *)scp->cmnd;
2216 	int select_report = (int)cmd[2];
2217 	struct scsi_lun *one_lun;
2218 	unsigned char arr[SDEBUG_RLUN_ARR_SZ];
2219 	unsigned char * max_addr;
2220 
2221 	alloc_len = cmd[9] + (cmd[8] << 8) + (cmd[7] << 16) + (cmd[6] << 24);
2222 	if ((alloc_len < 4) || (select_report > 2)) {
2223 		mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
2224 			       	0);
2225 		return check_condition_result;
2226 	}
2227 	/* can produce response with up to 16k luns (lun 0 to lun 16383) */
2228 	memset(arr, 0, SDEBUG_RLUN_ARR_SZ);
2229 	lun_cnt = scsi_debug_max_luns;
2230 	if (1 == select_report)
2231 		lun_cnt = 0;
2232 	else if (scsi_debug_no_lun_0 && (lun_cnt > 0))
2233 		--lun_cnt;
2234 	wlun = (select_report > 0) ? 1 : 0;
2235 	num = lun_cnt + wlun;
2236 	arr[2] = ((sizeof(struct scsi_lun) * num) >> 8) & 0xff;
2237 	arr[3] = (sizeof(struct scsi_lun) * num) & 0xff;
2238 	n = min((int)((SDEBUG_RLUN_ARR_SZ - 8) /
2239 			    sizeof(struct scsi_lun)), num);
2240 	if (n < num) {
2241 		wlun = 0;
2242 		lun_cnt = n;
2243 	}
2244 	one_lun = (struct scsi_lun *) &arr[8];
2245 	max_addr = arr + SDEBUG_RLUN_ARR_SZ;
2246 	for (i = 0, lun = (scsi_debug_no_lun_0 ? 1 : 0);
2247              ((i < lun_cnt) && ((unsigned char *)(one_lun + i) < max_addr));
2248 	     i++, lun++) {
2249 		upper = (lun >> 8) & 0x3f;
2250 		if (upper)
2251 			one_lun[i].scsi_lun[0] =
2252 			    (upper | (SAM2_LUN_ADDRESS_METHOD << 6));
2253 		one_lun[i].scsi_lun[1] = lun & 0xff;
2254 	}
2255 	if (wlun) {
2256 		one_lun[i].scsi_lun[0] = (SAM2_WLUN_REPORT_LUNS >> 8) & 0xff;
2257 		one_lun[i].scsi_lun[1] = SAM2_WLUN_REPORT_LUNS & 0xff;
2258 		i++;
2259 	}
2260 	alloc_len = (unsigned char *)(one_lun + i) - arr;
2261 	return fill_from_dev_buffer(scp, arr,
2262 				    min((int)alloc_len, SDEBUG_RLUN_ARR_SZ));
2263 }
2264 
2265 static int resp_xdwriteread(struct scsi_cmnd *scp, unsigned long long lba,
2266 			    unsigned int num, struct sdebug_dev_info *devip)
2267 {
2268 	int i, j, ret = -1;
2269 	unsigned char *kaddr, *buf;
2270 	unsigned int offset;
2271 	struct scatterlist *sg;
2272 	struct scsi_data_buffer *sdb = scsi_in(scp);
2273 
2274 	/* better not to use temporary buffer. */
2275 	buf = kmalloc(scsi_bufflen(scp), GFP_ATOMIC);
2276 	if (!buf)
2277 		return ret;
2278 
2279 	scsi_sg_copy_to_buffer(scp, buf, scsi_bufflen(scp));
2280 
2281 	offset = 0;
2282 	for_each_sg(sdb->table.sgl, sg, sdb->table.nents, i) {
2283 		kaddr = (unsigned char *)kmap_atomic(sg_page(sg), KM_USER0);
2284 		if (!kaddr)
2285 			goto out;
2286 
2287 		for (j = 0; j < sg->length; j++)
2288 			*(kaddr + sg->offset + j) ^= *(buf + offset + j);
2289 
2290 		offset += sg->length;
2291 		kunmap_atomic(kaddr, KM_USER0);
2292 	}
2293 	ret = 0;
2294 out:
2295 	kfree(buf);
2296 
2297 	return ret;
2298 }
2299 
2300 /* When timer goes off this function is called. */
2301 static void timer_intr_handler(unsigned long indx)
2302 {
2303 	struct sdebug_queued_cmd * sqcp;
2304 	unsigned long iflags;
2305 
2306 	if (indx >= scsi_debug_max_queue) {
2307 		printk(KERN_ERR "scsi_debug:timer_intr_handler: indx too "
2308 		       "large\n");
2309 		return;
2310 	}
2311 	spin_lock_irqsave(&queued_arr_lock, iflags);
2312 	sqcp = &queued_arr[(int)indx];
2313 	if (! sqcp->in_use) {
2314 		printk(KERN_ERR "scsi_debug:timer_intr_handler: Unexpected "
2315 		       "interrupt\n");
2316 		spin_unlock_irqrestore(&queued_arr_lock, iflags);
2317 		return;
2318 	}
2319 	sqcp->in_use = 0;
2320 	if (sqcp->done_funct) {
2321 		sqcp->a_cmnd->result = sqcp->scsi_result;
2322 		sqcp->done_funct(sqcp->a_cmnd); /* callback to mid level */
2323 	}
2324 	sqcp->done_funct = NULL;
2325 	spin_unlock_irqrestore(&queued_arr_lock, iflags);
2326 }
2327 
2328 
2329 static struct sdebug_dev_info *
2330 sdebug_device_create(struct sdebug_host_info *sdbg_host, gfp_t flags)
2331 {
2332 	struct sdebug_dev_info *devip;
2333 
2334 	devip = kzalloc(sizeof(*devip), flags);
2335 	if (devip) {
2336 		devip->sdbg_host = sdbg_host;
2337 		list_add_tail(&devip->dev_list, &sdbg_host->dev_info_list);
2338 	}
2339 	return devip;
2340 }
2341 
2342 static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev)
2343 {
2344 	struct sdebug_host_info * sdbg_host;
2345 	struct sdebug_dev_info * open_devip = NULL;
2346 	struct sdebug_dev_info * devip =
2347 			(struct sdebug_dev_info *)sdev->hostdata;
2348 
2349 	if (devip)
2350 		return devip;
2351 	sdbg_host = *(struct sdebug_host_info **)shost_priv(sdev->host);
2352 	if (!sdbg_host) {
2353                 printk(KERN_ERR "Host info NULL\n");
2354 		return NULL;
2355         }
2356 	list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) {
2357 		if ((devip->used) && (devip->channel == sdev->channel) &&
2358                     (devip->target == sdev->id) &&
2359                     (devip->lun == sdev->lun))
2360                         return devip;
2361 		else {
2362 			if ((!devip->used) && (!open_devip))
2363 				open_devip = devip;
2364 		}
2365 	}
2366 	if (!open_devip) { /* try and make a new one */
2367 		open_devip = sdebug_device_create(sdbg_host, GFP_ATOMIC);
2368 		if (!open_devip) {
2369 			printk(KERN_ERR "%s: out of memory at line %d\n",
2370 				__func__, __LINE__);
2371 			return NULL;
2372 		}
2373 	}
2374 
2375 	open_devip->channel = sdev->channel;
2376 	open_devip->target = sdev->id;
2377 	open_devip->lun = sdev->lun;
2378 	open_devip->sdbg_host = sdbg_host;
2379 	open_devip->reset = 1;
2380 	open_devip->used = 1;
2381 	memset(open_devip->sense_buff, 0, SDEBUG_SENSE_LEN);
2382 	if (scsi_debug_dsense)
2383 		open_devip->sense_buff[0] = 0x72;
2384 	else {
2385 		open_devip->sense_buff[0] = 0x70;
2386 		open_devip->sense_buff[7] = 0xa;
2387 	}
2388 	if (sdev->lun == SAM2_WLUN_REPORT_LUNS)
2389 		open_devip->wlun = SAM2_WLUN_REPORT_LUNS & 0xff;
2390 
2391 	return open_devip;
2392 }
2393 
2394 static int scsi_debug_slave_alloc(struct scsi_device *sdp)
2395 {
2396 	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2397 		printk(KERN_INFO "scsi_debug: slave_alloc <%u %u %u %u>\n",
2398 		       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
2399 	queue_flag_set_unlocked(QUEUE_FLAG_BIDI, sdp->request_queue);
2400 	return 0;
2401 }
2402 
2403 static int scsi_debug_slave_configure(struct scsi_device *sdp)
2404 {
2405 	struct sdebug_dev_info *devip;
2406 
2407 	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2408 		printk(KERN_INFO "scsi_debug: slave_configure <%u %u %u %u>\n",
2409 		       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
2410 	if (sdp->host->max_cmd_len != SCSI_DEBUG_MAX_CMD_LEN)
2411 		sdp->host->max_cmd_len = SCSI_DEBUG_MAX_CMD_LEN;
2412 	devip = devInfoReg(sdp);
2413 	if (NULL == devip)
2414 		return 1;	/* no resources, will be marked offline */
2415 	sdp->hostdata = devip;
2416 	if (sdp->host->cmd_per_lun)
2417 		scsi_adjust_queue_depth(sdp, SDEBUG_TAGGED_QUEUING,
2418 					sdp->host->cmd_per_lun);
2419 	blk_queue_max_segment_size(sdp->request_queue, 256 * 1024);
2420 	if (scsi_debug_no_uld)
2421 		sdp->no_uld_attach = 1;
2422 	return 0;
2423 }
2424 
2425 static void scsi_debug_slave_destroy(struct scsi_device *sdp)
2426 {
2427 	struct sdebug_dev_info *devip =
2428 		(struct sdebug_dev_info *)sdp->hostdata;
2429 
2430 	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2431 		printk(KERN_INFO "scsi_debug: slave_destroy <%u %u %u %u>\n",
2432 		       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
2433 	if (devip) {
2434 		/* make this slot avaliable for re-use */
2435 		devip->used = 0;
2436 		sdp->hostdata = NULL;
2437 	}
2438 }
2439 
2440 /* Returns 1 if found 'cmnd' and deleted its timer. else returns 0 */
2441 static int stop_queued_cmnd(struct scsi_cmnd *cmnd)
2442 {
2443 	unsigned long iflags;
2444 	int k;
2445 	struct sdebug_queued_cmd *sqcp;
2446 
2447 	spin_lock_irqsave(&queued_arr_lock, iflags);
2448 	for (k = 0; k < scsi_debug_max_queue; ++k) {
2449 		sqcp = &queued_arr[k];
2450 		if (sqcp->in_use && (cmnd == sqcp->a_cmnd)) {
2451 			del_timer_sync(&sqcp->cmnd_timer);
2452 			sqcp->in_use = 0;
2453 			sqcp->a_cmnd = NULL;
2454 			break;
2455 		}
2456 	}
2457 	spin_unlock_irqrestore(&queued_arr_lock, iflags);
2458 	return (k < scsi_debug_max_queue) ? 1 : 0;
2459 }
2460 
2461 /* Deletes (stops) timers of all queued commands */
2462 static void stop_all_queued(void)
2463 {
2464 	unsigned long iflags;
2465 	int k;
2466 	struct sdebug_queued_cmd *sqcp;
2467 
2468 	spin_lock_irqsave(&queued_arr_lock, iflags);
2469 	for (k = 0; k < scsi_debug_max_queue; ++k) {
2470 		sqcp = &queued_arr[k];
2471 		if (sqcp->in_use && sqcp->a_cmnd) {
2472 			del_timer_sync(&sqcp->cmnd_timer);
2473 			sqcp->in_use = 0;
2474 			sqcp->a_cmnd = NULL;
2475 		}
2476 	}
2477 	spin_unlock_irqrestore(&queued_arr_lock, iflags);
2478 }
2479 
2480 static int scsi_debug_abort(struct scsi_cmnd * SCpnt)
2481 {
2482 	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2483 		printk(KERN_INFO "scsi_debug: abort\n");
2484 	++num_aborts;
2485 	stop_queued_cmnd(SCpnt);
2486 	return SUCCESS;
2487 }
2488 
2489 static int scsi_debug_biosparam(struct scsi_device *sdev,
2490 		struct block_device * bdev, sector_t capacity, int *info)
2491 {
2492 	int res;
2493 	unsigned char *buf;
2494 
2495 	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2496 		printk(KERN_INFO "scsi_debug: biosparam\n");
2497 	buf = scsi_bios_ptable(bdev);
2498 	if (buf) {
2499 		res = scsi_partsize(buf, capacity,
2500 				    &info[2], &info[0], &info[1]);
2501 		kfree(buf);
2502 		if (! res)
2503 			return res;
2504 	}
2505 	info[0] = sdebug_heads;
2506 	info[1] = sdebug_sectors_per;
2507 	info[2] = sdebug_cylinders_per;
2508 	return 0;
2509 }
2510 
2511 static int scsi_debug_device_reset(struct scsi_cmnd * SCpnt)
2512 {
2513 	struct sdebug_dev_info * devip;
2514 
2515 	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2516 		printk(KERN_INFO "scsi_debug: device_reset\n");
2517 	++num_dev_resets;
2518 	if (SCpnt) {
2519 		devip = devInfoReg(SCpnt->device);
2520 		if (devip)
2521 			devip->reset = 1;
2522 	}
2523 	return SUCCESS;
2524 }
2525 
2526 static int scsi_debug_bus_reset(struct scsi_cmnd * SCpnt)
2527 {
2528 	struct sdebug_host_info *sdbg_host;
2529         struct sdebug_dev_info * dev_info;
2530         struct scsi_device * sdp;
2531         struct Scsi_Host * hp;
2532 
2533 	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2534 		printk(KERN_INFO "scsi_debug: bus_reset\n");
2535 	++num_bus_resets;
2536 	if (SCpnt && ((sdp = SCpnt->device)) && ((hp = sdp->host))) {
2537 		sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
2538 		if (sdbg_host) {
2539 			list_for_each_entry(dev_info,
2540                                             &sdbg_host->dev_info_list,
2541                                             dev_list)
2542 				dev_info->reset = 1;
2543 		}
2544 	}
2545 	return SUCCESS;
2546 }
2547 
2548 static int scsi_debug_host_reset(struct scsi_cmnd * SCpnt)
2549 {
2550 	struct sdebug_host_info * sdbg_host;
2551         struct sdebug_dev_info * dev_info;
2552 
2553 	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2554 		printk(KERN_INFO "scsi_debug: host_reset\n");
2555 	++num_host_resets;
2556         spin_lock(&sdebug_host_list_lock);
2557         list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
2558                 list_for_each_entry(dev_info, &sdbg_host->dev_info_list,
2559                                     dev_list)
2560                         dev_info->reset = 1;
2561         }
2562         spin_unlock(&sdebug_host_list_lock);
2563 	stop_all_queued();
2564 	return SUCCESS;
2565 }
2566 
2567 /* Initializes timers in queued array */
2568 static void __init init_all_queued(void)
2569 {
2570 	unsigned long iflags;
2571 	int k;
2572 	struct sdebug_queued_cmd * sqcp;
2573 
2574 	spin_lock_irqsave(&queued_arr_lock, iflags);
2575 	for (k = 0; k < scsi_debug_max_queue; ++k) {
2576 		sqcp = &queued_arr[k];
2577 		init_timer(&sqcp->cmnd_timer);
2578 		sqcp->in_use = 0;
2579 		sqcp->a_cmnd = NULL;
2580 	}
2581 	spin_unlock_irqrestore(&queued_arr_lock, iflags);
2582 }
2583 
2584 static void __init sdebug_build_parts(unsigned char *ramp,
2585 				      unsigned long store_size)
2586 {
2587 	struct partition * pp;
2588 	int starts[SDEBUG_MAX_PARTS + 2];
2589 	int sectors_per_part, num_sectors, k;
2590 	int heads_by_sects, start_sec, end_sec;
2591 
2592 	/* assume partition table already zeroed */
2593 	if ((scsi_debug_num_parts < 1) || (store_size < 1048576))
2594 		return;
2595 	if (scsi_debug_num_parts > SDEBUG_MAX_PARTS) {
2596 		scsi_debug_num_parts = SDEBUG_MAX_PARTS;
2597 		printk(KERN_WARNING "scsi_debug:build_parts: reducing "
2598 				    "partitions to %d\n", SDEBUG_MAX_PARTS);
2599 	}
2600 	num_sectors = (int)sdebug_store_sectors;
2601 	sectors_per_part = (num_sectors - sdebug_sectors_per)
2602 			   / scsi_debug_num_parts;
2603 	heads_by_sects = sdebug_heads * sdebug_sectors_per;
2604         starts[0] = sdebug_sectors_per;
2605 	for (k = 1; k < scsi_debug_num_parts; ++k)
2606 		starts[k] = ((k * sectors_per_part) / heads_by_sects)
2607 			    * heads_by_sects;
2608 	starts[scsi_debug_num_parts] = num_sectors;
2609 	starts[scsi_debug_num_parts + 1] = 0;
2610 
2611 	ramp[510] = 0x55;	/* magic partition markings */
2612 	ramp[511] = 0xAA;
2613 	pp = (struct partition *)(ramp + 0x1be);
2614 	for (k = 0; starts[k + 1]; ++k, ++pp) {
2615 		start_sec = starts[k];
2616 		end_sec = starts[k + 1] - 1;
2617 		pp->boot_ind = 0;
2618 
2619 		pp->cyl = start_sec / heads_by_sects;
2620 		pp->head = (start_sec - (pp->cyl * heads_by_sects))
2621 			   / sdebug_sectors_per;
2622 		pp->sector = (start_sec % sdebug_sectors_per) + 1;
2623 
2624 		pp->end_cyl = end_sec / heads_by_sects;
2625 		pp->end_head = (end_sec - (pp->end_cyl * heads_by_sects))
2626 			       / sdebug_sectors_per;
2627 		pp->end_sector = (end_sec % sdebug_sectors_per) + 1;
2628 
2629 		pp->start_sect = start_sec;
2630 		pp->nr_sects = end_sec - start_sec + 1;
2631 		pp->sys_ind = 0x83;	/* plain Linux partition */
2632 	}
2633 }
2634 
2635 static int schedule_resp(struct scsi_cmnd * cmnd,
2636 			 struct sdebug_dev_info * devip,
2637 			 done_funct_t done, int scsi_result, int delta_jiff)
2638 {
2639 	if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) && cmnd) {
2640 		if (scsi_result) {
2641 			struct scsi_device * sdp = cmnd->device;
2642 
2643 			printk(KERN_INFO "scsi_debug:    <%u %u %u %u> "
2644 			       "non-zero result=0x%x\n", sdp->host->host_no,
2645 			       sdp->channel, sdp->id, sdp->lun, scsi_result);
2646 		}
2647 	}
2648 	if (cmnd && devip) {
2649 		/* simulate autosense by this driver */
2650 		if (SAM_STAT_CHECK_CONDITION == (scsi_result & 0xff))
2651 			memcpy(cmnd->sense_buffer, devip->sense_buff,
2652 			       (SCSI_SENSE_BUFFERSIZE > SDEBUG_SENSE_LEN) ?
2653 			       SDEBUG_SENSE_LEN : SCSI_SENSE_BUFFERSIZE);
2654 	}
2655 	if (delta_jiff <= 0) {
2656 		if (cmnd)
2657 			cmnd->result = scsi_result;
2658 		if (done)
2659 			done(cmnd);
2660 		return 0;
2661 	} else {
2662 		unsigned long iflags;
2663 		int k;
2664 		struct sdebug_queued_cmd * sqcp = NULL;
2665 
2666 		spin_lock_irqsave(&queued_arr_lock, iflags);
2667 		for (k = 0; k < scsi_debug_max_queue; ++k) {
2668 			sqcp = &queued_arr[k];
2669 			if (! sqcp->in_use)
2670 				break;
2671 		}
2672 		if (k >= scsi_debug_max_queue) {
2673 			spin_unlock_irqrestore(&queued_arr_lock, iflags);
2674 			printk(KERN_WARNING "scsi_debug: can_queue exceeded\n");
2675 			return 1;	/* report busy to mid level */
2676 		}
2677 		sqcp->in_use = 1;
2678 		sqcp->a_cmnd = cmnd;
2679 		sqcp->scsi_result = scsi_result;
2680 		sqcp->done_funct = done;
2681 		sqcp->cmnd_timer.function = timer_intr_handler;
2682 		sqcp->cmnd_timer.data = k;
2683 		sqcp->cmnd_timer.expires = jiffies + delta_jiff;
2684 		add_timer(&sqcp->cmnd_timer);
2685 		spin_unlock_irqrestore(&queued_arr_lock, iflags);
2686 		if (cmnd)
2687 			cmnd->result = 0;
2688 		return 0;
2689 	}
2690 }
2691 /* Note: The following macros create attribute files in the
2692    /sys/module/scsi_debug/parameters directory. Unfortunately this
2693    driver is unaware of a change and cannot trigger auxiliary actions
2694    as it can when the corresponding attribute in the
2695    /sys/bus/pseudo/drivers/scsi_debug directory is changed.
2696  */
2697 module_param_named(add_host, scsi_debug_add_host, int, S_IRUGO | S_IWUSR);
2698 module_param_named(delay, scsi_debug_delay, int, S_IRUGO | S_IWUSR);
2699 module_param_named(dev_size_mb, scsi_debug_dev_size_mb, int, S_IRUGO);
2700 module_param_named(dsense, scsi_debug_dsense, int, S_IRUGO | S_IWUSR);
2701 module_param_named(every_nth, scsi_debug_every_nth, int, S_IRUGO | S_IWUSR);
2702 module_param_named(fake_rw, scsi_debug_fake_rw, int, S_IRUGO | S_IWUSR);
2703 module_param_named(max_luns, scsi_debug_max_luns, int, S_IRUGO | S_IWUSR);
2704 module_param_named(max_queue, scsi_debug_max_queue, int, S_IRUGO | S_IWUSR);
2705 module_param_named(no_lun_0, scsi_debug_no_lun_0, int, S_IRUGO | S_IWUSR);
2706 module_param_named(no_uld, scsi_debug_no_uld, int, S_IRUGO);
2707 module_param_named(num_parts, scsi_debug_num_parts, int, S_IRUGO);
2708 module_param_named(num_tgts, scsi_debug_num_tgts, int, S_IRUGO | S_IWUSR);
2709 module_param_named(opts, scsi_debug_opts, int, S_IRUGO | S_IWUSR);
2710 module_param_named(ptype, scsi_debug_ptype, int, S_IRUGO | S_IWUSR);
2711 module_param_named(scsi_level, scsi_debug_scsi_level, int, S_IRUGO);
2712 module_param_named(virtual_gb, scsi_debug_virtual_gb, int, S_IRUGO | S_IWUSR);
2713 module_param_named(vpd_use_hostno, scsi_debug_vpd_use_hostno, int,
2714 		   S_IRUGO | S_IWUSR);
2715 module_param_named(sector_size, scsi_debug_sector_size, int, S_IRUGO);
2716 module_param_named(dix, scsi_debug_dix, int, S_IRUGO);
2717 module_param_named(dif, scsi_debug_dif, int, S_IRUGO);
2718 module_param_named(guard, scsi_debug_guard, int, S_IRUGO);
2719 module_param_named(ato, scsi_debug_ato, int, S_IRUGO);
2720 module_param_named(physblk_exp, scsi_debug_physblk_exp, int, S_IRUGO);
2721 module_param_named(opt_blks, scsi_debug_opt_blks, int, S_IRUGO);
2722 module_param_named(lowest_aligned, scsi_debug_lowest_aligned, int, S_IRUGO);
2723 module_param_named(unmap_max_blocks, scsi_debug_unmap_max_blocks, int, S_IRUGO);
2724 module_param_named(unmap_max_desc, scsi_debug_unmap_max_desc, int, S_IRUGO);
2725 module_param_named(unmap_granularity, scsi_debug_unmap_granularity, int, S_IRUGO);
2726 module_param_named(unmap_alignment, scsi_debug_unmap_alignment, int, S_IRUGO);
2727 module_param_named(tpu, scsi_debug_tpu, int, S_IRUGO);
2728 module_param_named(tpws, scsi_debug_tpws, int, S_IRUGO);
2729 
2730 MODULE_AUTHOR("Eric Youngdale + Douglas Gilbert");
2731 MODULE_DESCRIPTION("SCSI debug adapter driver");
2732 MODULE_LICENSE("GPL");
2733 MODULE_VERSION(SCSI_DEBUG_VERSION);
2734 
2735 MODULE_PARM_DESC(add_host, "0..127 hosts allowed(def=1)");
2736 MODULE_PARM_DESC(delay, "# of jiffies to delay response(def=1)");
2737 MODULE_PARM_DESC(dev_size_mb, "size in MB of ram shared by devs(def=8)");
2738 MODULE_PARM_DESC(dsense, "use descriptor sense format(def=0 -> fixed)");
2739 MODULE_PARM_DESC(every_nth, "timeout every nth command(def=0)");
2740 MODULE_PARM_DESC(fake_rw, "fake reads/writes instead of copying (def=0)");
2741 MODULE_PARM_DESC(max_luns, "number of LUNs per target to simulate(def=1)");
2742 MODULE_PARM_DESC(max_queue, "max number of queued commands (1 to 255(def))");
2743 MODULE_PARM_DESC(no_lun_0, "no LU number 0 (def=0 -> have lun 0)");
2744 MODULE_PARM_DESC(no_uld, "stop ULD (e.g. sd driver) attaching (def=0))");
2745 MODULE_PARM_DESC(num_parts, "number of partitions(def=0)");
2746 MODULE_PARM_DESC(num_tgts, "number of targets per host to simulate(def=1)");
2747 MODULE_PARM_DESC(opts, "1->noise, 2->medium_err, 4->timeout, 8->recovered_err... (def=0)");
2748 MODULE_PARM_DESC(ptype, "SCSI peripheral type(def=0[disk])");
2749 MODULE_PARM_DESC(scsi_level, "SCSI level to simulate(def=5[SPC-3])");
2750 MODULE_PARM_DESC(virtual_gb, "virtual gigabyte size (def=0 -> use dev_size_mb)");
2751 MODULE_PARM_DESC(vpd_use_hostno, "0 -> dev ids ignore hostno (def=1 -> unique dev ids)");
2752 MODULE_PARM_DESC(sector_size, "logical block size in bytes (def=512)");
2753 MODULE_PARM_DESC(physblk_exp, "physical block exponent (def=0)");
2754 MODULE_PARM_DESC(opt_blks, "optimal transfer length in block (def=64)");
2755 MODULE_PARM_DESC(lowest_aligned, "lowest aligned lba (def=0)");
2756 MODULE_PARM_DESC(dix, "data integrity extensions mask (def=0)");
2757 MODULE_PARM_DESC(dif, "data integrity field type: 0-3 (def=0)");
2758 MODULE_PARM_DESC(guard, "protection checksum: 0=crc, 1=ip (def=0)");
2759 MODULE_PARM_DESC(ato, "application tag ownership: 0=disk 1=host (def=1)");
2760 MODULE_PARM_DESC(unmap_max_blocks, "max # of blocks can be unmapped in one cmd (def=0xffffffff)");
2761 MODULE_PARM_DESC(unmap_max_desc, "max # of ranges that can be unmapped in one cmd (def=256)");
2762 MODULE_PARM_DESC(unmap_granularity, "thin provisioning granularity in blocks (def=1)");
2763 MODULE_PARM_DESC(unmap_alignment, "lowest aligned thin provisioning lba (def=0)");
2764 MODULE_PARM_DESC(tpu, "enable TP, support UNMAP command (def=0)");
2765 MODULE_PARM_DESC(tpws, "enable TP, support WRITE SAME(16) with UNMAP bit (def=0)");
2766 
2767 static char sdebug_info[256];
2768 
2769 static const char * scsi_debug_info(struct Scsi_Host * shp)
2770 {
2771 	sprintf(sdebug_info, "scsi_debug, version %s [%s], "
2772 		"dev_size_mb=%d, opts=0x%x", SCSI_DEBUG_VERSION,
2773 		scsi_debug_version_date, scsi_debug_dev_size_mb,
2774 		scsi_debug_opts);
2775 	return sdebug_info;
2776 }
2777 
2778 /* scsi_debug_proc_info
2779  * Used if the driver currently has no own support for /proc/scsi
2780  */
2781 static int scsi_debug_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset,
2782 				int length, int inout)
2783 {
2784 	int len, pos, begin;
2785 	int orig_length;
2786 
2787 	orig_length = length;
2788 
2789 	if (inout == 1) {
2790 		char arr[16];
2791 		int minLen = length > 15 ? 15 : length;
2792 
2793 		if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
2794 			return -EACCES;
2795 		memcpy(arr, buffer, minLen);
2796 		arr[minLen] = '\0';
2797 		if (1 != sscanf(arr, "%d", &pos))
2798 			return -EINVAL;
2799 		scsi_debug_opts = pos;
2800 		if (scsi_debug_every_nth != 0)
2801                         scsi_debug_cmnd_count = 0;
2802 		return length;
2803 	}
2804 	begin = 0;
2805 	pos = len = sprintf(buffer, "scsi_debug adapter driver, version "
2806 	    "%s [%s]\n"
2807 	    "num_tgts=%d, shared (ram) size=%d MB, opts=0x%x, "
2808 	    "every_nth=%d(curr:%d)\n"
2809 	    "delay=%d, max_luns=%d, scsi_level=%d\n"
2810 	    "sector_size=%d bytes, cylinders=%d, heads=%d, sectors=%d\n"
2811 	    "number of aborts=%d, device_reset=%d, bus_resets=%d, "
2812 	    "host_resets=%d\ndix_reads=%d dix_writes=%d dif_errors=%d\n",
2813 	    SCSI_DEBUG_VERSION, scsi_debug_version_date, scsi_debug_num_tgts,
2814 	    scsi_debug_dev_size_mb, scsi_debug_opts, scsi_debug_every_nth,
2815 	    scsi_debug_cmnd_count, scsi_debug_delay,
2816 	    scsi_debug_max_luns, scsi_debug_scsi_level,
2817 	    scsi_debug_sector_size, sdebug_cylinders_per, sdebug_heads,
2818 	    sdebug_sectors_per, num_aborts, num_dev_resets, num_bus_resets,
2819 	    num_host_resets, dix_reads, dix_writes, dif_errors);
2820 	if (pos < offset) {
2821 		len = 0;
2822 		begin = pos;
2823 	}
2824 	*start = buffer + (offset - begin);	/* Start of wanted data */
2825 	len -= (offset - begin);
2826 	if (len > length)
2827 		len = length;
2828 	return len;
2829 }
2830 
2831 static ssize_t sdebug_delay_show(struct device_driver * ddp, char * buf)
2832 {
2833         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_delay);
2834 }
2835 
2836 static ssize_t sdebug_delay_store(struct device_driver * ddp,
2837 				  const char * buf, size_t count)
2838 {
2839         int delay;
2840 	char work[20];
2841 
2842         if (1 == sscanf(buf, "%10s", work)) {
2843 		if ((1 == sscanf(work, "%d", &delay)) && (delay >= 0)) {
2844 			scsi_debug_delay = delay;
2845 			return count;
2846 		}
2847 	}
2848 	return -EINVAL;
2849 }
2850 DRIVER_ATTR(delay, S_IRUGO | S_IWUSR, sdebug_delay_show,
2851 	    sdebug_delay_store);
2852 
2853 static ssize_t sdebug_opts_show(struct device_driver * ddp, char * buf)
2854 {
2855         return scnprintf(buf, PAGE_SIZE, "0x%x\n", scsi_debug_opts);
2856 }
2857 
2858 static ssize_t sdebug_opts_store(struct device_driver * ddp,
2859 				 const char * buf, size_t count)
2860 {
2861         int opts;
2862 	char work[20];
2863 
2864         if (1 == sscanf(buf, "%10s", work)) {
2865 		if (0 == strnicmp(work,"0x", 2)) {
2866 			if (1 == sscanf(&work[2], "%x", &opts))
2867 				goto opts_done;
2868 		} else {
2869 			if (1 == sscanf(work, "%d", &opts))
2870 				goto opts_done;
2871 		}
2872 	}
2873 	return -EINVAL;
2874 opts_done:
2875 	scsi_debug_opts = opts;
2876 	scsi_debug_cmnd_count = 0;
2877 	return count;
2878 }
2879 DRIVER_ATTR(opts, S_IRUGO | S_IWUSR, sdebug_opts_show,
2880 	    sdebug_opts_store);
2881 
2882 static ssize_t sdebug_ptype_show(struct device_driver * ddp, char * buf)
2883 {
2884         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_ptype);
2885 }
2886 static ssize_t sdebug_ptype_store(struct device_driver * ddp,
2887 				  const char * buf, size_t count)
2888 {
2889         int n;
2890 
2891 	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2892 		scsi_debug_ptype = n;
2893 		return count;
2894 	}
2895 	return -EINVAL;
2896 }
2897 DRIVER_ATTR(ptype, S_IRUGO | S_IWUSR, sdebug_ptype_show, sdebug_ptype_store);
2898 
2899 static ssize_t sdebug_dsense_show(struct device_driver * ddp, char * buf)
2900 {
2901         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dsense);
2902 }
2903 static ssize_t sdebug_dsense_store(struct device_driver * ddp,
2904 				  const char * buf, size_t count)
2905 {
2906         int n;
2907 
2908 	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2909 		scsi_debug_dsense = n;
2910 		return count;
2911 	}
2912 	return -EINVAL;
2913 }
2914 DRIVER_ATTR(dsense, S_IRUGO | S_IWUSR, sdebug_dsense_show,
2915 	    sdebug_dsense_store);
2916 
2917 static ssize_t sdebug_fake_rw_show(struct device_driver * ddp, char * buf)
2918 {
2919         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_fake_rw);
2920 }
2921 static ssize_t sdebug_fake_rw_store(struct device_driver * ddp,
2922 				    const char * buf, size_t count)
2923 {
2924         int n;
2925 
2926 	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2927 		scsi_debug_fake_rw = n;
2928 		return count;
2929 	}
2930 	return -EINVAL;
2931 }
2932 DRIVER_ATTR(fake_rw, S_IRUGO | S_IWUSR, sdebug_fake_rw_show,
2933 	    sdebug_fake_rw_store);
2934 
2935 static ssize_t sdebug_no_lun_0_show(struct device_driver * ddp, char * buf)
2936 {
2937         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_no_lun_0);
2938 }
2939 static ssize_t sdebug_no_lun_0_store(struct device_driver * ddp,
2940 				     const char * buf, size_t count)
2941 {
2942         int n;
2943 
2944 	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2945 		scsi_debug_no_lun_0 = n;
2946 		return count;
2947 	}
2948 	return -EINVAL;
2949 }
2950 DRIVER_ATTR(no_lun_0, S_IRUGO | S_IWUSR, sdebug_no_lun_0_show,
2951 	    sdebug_no_lun_0_store);
2952 
2953 static ssize_t sdebug_num_tgts_show(struct device_driver * ddp, char * buf)
2954 {
2955         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_num_tgts);
2956 }
2957 static ssize_t sdebug_num_tgts_store(struct device_driver * ddp,
2958 				     const char * buf, size_t count)
2959 {
2960         int n;
2961 
2962 	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2963 		scsi_debug_num_tgts = n;
2964 		sdebug_max_tgts_luns();
2965 		return count;
2966 	}
2967 	return -EINVAL;
2968 }
2969 DRIVER_ATTR(num_tgts, S_IRUGO | S_IWUSR, sdebug_num_tgts_show,
2970 	    sdebug_num_tgts_store);
2971 
2972 static ssize_t sdebug_dev_size_mb_show(struct device_driver * ddp, char * buf)
2973 {
2974         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dev_size_mb);
2975 }
2976 DRIVER_ATTR(dev_size_mb, S_IRUGO, sdebug_dev_size_mb_show, NULL);
2977 
2978 static ssize_t sdebug_num_parts_show(struct device_driver * ddp, char * buf)
2979 {
2980         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_num_parts);
2981 }
2982 DRIVER_ATTR(num_parts, S_IRUGO, sdebug_num_parts_show, NULL);
2983 
2984 static ssize_t sdebug_every_nth_show(struct device_driver * ddp, char * buf)
2985 {
2986         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_every_nth);
2987 }
2988 static ssize_t sdebug_every_nth_store(struct device_driver * ddp,
2989 				      const char * buf, size_t count)
2990 {
2991         int nth;
2992 
2993 	if ((count > 0) && (1 == sscanf(buf, "%d", &nth))) {
2994 		scsi_debug_every_nth = nth;
2995 		scsi_debug_cmnd_count = 0;
2996 		return count;
2997 	}
2998 	return -EINVAL;
2999 }
3000 DRIVER_ATTR(every_nth, S_IRUGO | S_IWUSR, sdebug_every_nth_show,
3001 	    sdebug_every_nth_store);
3002 
3003 static ssize_t sdebug_max_luns_show(struct device_driver * ddp, char * buf)
3004 {
3005         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_max_luns);
3006 }
3007 static ssize_t sdebug_max_luns_store(struct device_driver * ddp,
3008 				     const char * buf, size_t count)
3009 {
3010         int n;
3011 
3012 	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
3013 		scsi_debug_max_luns = n;
3014 		sdebug_max_tgts_luns();
3015 		return count;
3016 	}
3017 	return -EINVAL;
3018 }
3019 DRIVER_ATTR(max_luns, S_IRUGO | S_IWUSR, sdebug_max_luns_show,
3020 	    sdebug_max_luns_store);
3021 
3022 static ssize_t sdebug_max_queue_show(struct device_driver * ddp, char * buf)
3023 {
3024         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_max_queue);
3025 }
3026 static ssize_t sdebug_max_queue_store(struct device_driver * ddp,
3027 				      const char * buf, size_t count)
3028 {
3029         int n;
3030 
3031 	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n > 0) &&
3032 	    (n <= SCSI_DEBUG_CANQUEUE)) {
3033 		scsi_debug_max_queue = n;
3034 		return count;
3035 	}
3036 	return -EINVAL;
3037 }
3038 DRIVER_ATTR(max_queue, S_IRUGO | S_IWUSR, sdebug_max_queue_show,
3039 	    sdebug_max_queue_store);
3040 
3041 static ssize_t sdebug_no_uld_show(struct device_driver * ddp, char * buf)
3042 {
3043         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_no_uld);
3044 }
3045 DRIVER_ATTR(no_uld, S_IRUGO, sdebug_no_uld_show, NULL);
3046 
3047 static ssize_t sdebug_scsi_level_show(struct device_driver * ddp, char * buf)
3048 {
3049         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_scsi_level);
3050 }
3051 DRIVER_ATTR(scsi_level, S_IRUGO, sdebug_scsi_level_show, NULL);
3052 
3053 static ssize_t sdebug_virtual_gb_show(struct device_driver * ddp, char * buf)
3054 {
3055         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_virtual_gb);
3056 }
3057 static ssize_t sdebug_virtual_gb_store(struct device_driver * ddp,
3058 				       const char * buf, size_t count)
3059 {
3060         int n;
3061 
3062 	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
3063 		scsi_debug_virtual_gb = n;
3064 
3065 		sdebug_capacity = get_sdebug_capacity();
3066 
3067 		return count;
3068 	}
3069 	return -EINVAL;
3070 }
3071 DRIVER_ATTR(virtual_gb, S_IRUGO | S_IWUSR, sdebug_virtual_gb_show,
3072 	    sdebug_virtual_gb_store);
3073 
3074 static ssize_t sdebug_add_host_show(struct device_driver * ddp, char * buf)
3075 {
3076         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_add_host);
3077 }
3078 
3079 static ssize_t sdebug_add_host_store(struct device_driver * ddp,
3080 				     const char * buf, size_t count)
3081 {
3082 	int delta_hosts;
3083 
3084 	if (sscanf(buf, "%d", &delta_hosts) != 1)
3085 		return -EINVAL;
3086 	if (delta_hosts > 0) {
3087 		do {
3088 			sdebug_add_adapter();
3089 		} while (--delta_hosts);
3090 	} else if (delta_hosts < 0) {
3091 		do {
3092 			sdebug_remove_adapter();
3093 		} while (++delta_hosts);
3094 	}
3095 	return count;
3096 }
3097 DRIVER_ATTR(add_host, S_IRUGO | S_IWUSR, sdebug_add_host_show,
3098 	    sdebug_add_host_store);
3099 
3100 static ssize_t sdebug_vpd_use_hostno_show(struct device_driver * ddp,
3101 					  char * buf)
3102 {
3103 	return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_vpd_use_hostno);
3104 }
3105 static ssize_t sdebug_vpd_use_hostno_store(struct device_driver * ddp,
3106 					   const char * buf, size_t count)
3107 {
3108 	int n;
3109 
3110 	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
3111 		scsi_debug_vpd_use_hostno = n;
3112 		return count;
3113 	}
3114 	return -EINVAL;
3115 }
3116 DRIVER_ATTR(vpd_use_hostno, S_IRUGO | S_IWUSR, sdebug_vpd_use_hostno_show,
3117 	    sdebug_vpd_use_hostno_store);
3118 
3119 static ssize_t sdebug_sector_size_show(struct device_driver * ddp, char * buf)
3120 {
3121 	return scnprintf(buf, PAGE_SIZE, "%u\n", scsi_debug_sector_size);
3122 }
3123 DRIVER_ATTR(sector_size, S_IRUGO, sdebug_sector_size_show, NULL);
3124 
3125 static ssize_t sdebug_dix_show(struct device_driver *ddp, char *buf)
3126 {
3127 	return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dix);
3128 }
3129 DRIVER_ATTR(dix, S_IRUGO, sdebug_dix_show, NULL);
3130 
3131 static ssize_t sdebug_dif_show(struct device_driver *ddp, char *buf)
3132 {
3133 	return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dif);
3134 }
3135 DRIVER_ATTR(dif, S_IRUGO, sdebug_dif_show, NULL);
3136 
3137 static ssize_t sdebug_guard_show(struct device_driver *ddp, char *buf)
3138 {
3139 	return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_guard);
3140 }
3141 DRIVER_ATTR(guard, S_IRUGO, sdebug_guard_show, NULL);
3142 
3143 static ssize_t sdebug_ato_show(struct device_driver *ddp, char *buf)
3144 {
3145 	return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_ato);
3146 }
3147 DRIVER_ATTR(ato, S_IRUGO, sdebug_ato_show, NULL);
3148 
3149 static ssize_t sdebug_map_show(struct device_driver *ddp, char *buf)
3150 {
3151 	ssize_t count;
3152 
3153 	if (scsi_debug_tpu == 0 && scsi_debug_tpws == 0)
3154 		return scnprintf(buf, PAGE_SIZE, "0-%u\n",
3155 				 sdebug_store_sectors);
3156 
3157 	count = bitmap_scnlistprintf(buf, PAGE_SIZE, map_storep, map_size);
3158 
3159 	buf[count++] = '\n';
3160 	buf[count++] = 0;
3161 
3162 	return count;
3163 }
3164 DRIVER_ATTR(map, S_IRUGO, sdebug_map_show, NULL);
3165 
3166 
3167 /* Note: The following function creates attribute files in the
3168    /sys/bus/pseudo/drivers/scsi_debug directory. The advantage of these
3169    files (over those found in the /sys/module/scsi_debug/parameters
3170    directory) is that auxiliary actions can be triggered when an attribute
3171    is changed. For example see: sdebug_add_host_store() above.
3172  */
3173 static int do_create_driverfs_files(void)
3174 {
3175 	int ret;
3176 
3177 	ret = driver_create_file(&sdebug_driverfs_driver, &driver_attr_add_host);
3178 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_delay);
3179 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dev_size_mb);
3180 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dsense);
3181 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_every_nth);
3182 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_fake_rw);
3183 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_max_luns);
3184 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_max_queue);
3185 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_no_lun_0);
3186 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_no_uld);
3187 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_num_parts);
3188 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_num_tgts);
3189 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_ptype);
3190 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_opts);
3191 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_scsi_level);
3192 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_virtual_gb);
3193 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_vpd_use_hostno);
3194 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_sector_size);
3195 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dix);
3196 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dif);
3197 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_guard);
3198 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_ato);
3199 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_map);
3200 	return ret;
3201 }
3202 
3203 static void do_remove_driverfs_files(void)
3204 {
3205 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_map);
3206 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_ato);
3207 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_guard);
3208 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dif);
3209 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dix);
3210 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_sector_size);
3211 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_vpd_use_hostno);
3212 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_virtual_gb);
3213 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_scsi_level);
3214 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_opts);
3215 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_ptype);
3216 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_num_tgts);
3217 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_num_parts);
3218 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_no_uld);
3219 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_no_lun_0);
3220 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_max_queue);
3221 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_max_luns);
3222 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_fake_rw);
3223 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_every_nth);
3224 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dsense);
3225 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dev_size_mb);
3226 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_delay);
3227 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_add_host);
3228 }
3229 
3230 struct device *pseudo_primary;
3231 
3232 static int __init scsi_debug_init(void)
3233 {
3234 	unsigned long sz;
3235 	int host_to_add;
3236 	int k;
3237 	int ret;
3238 
3239 	switch (scsi_debug_sector_size) {
3240 	case  512:
3241 	case 1024:
3242 	case 2048:
3243 	case 4096:
3244 		break;
3245 	default:
3246 		printk(KERN_ERR "scsi_debug_init: invalid sector_size %d\n",
3247 		       scsi_debug_sector_size);
3248 		return -EINVAL;
3249 	}
3250 
3251 	switch (scsi_debug_dif) {
3252 
3253 	case SD_DIF_TYPE0_PROTECTION:
3254 	case SD_DIF_TYPE1_PROTECTION:
3255 	case SD_DIF_TYPE2_PROTECTION:
3256 	case SD_DIF_TYPE3_PROTECTION:
3257 		break;
3258 
3259 	default:
3260 		printk(KERN_ERR "scsi_debug_init: dif must be 0, 1, 2 or 3\n");
3261 		return -EINVAL;
3262 	}
3263 
3264 	if (scsi_debug_guard > 1) {
3265 		printk(KERN_ERR "scsi_debug_init: guard must be 0 or 1\n");
3266 		return -EINVAL;
3267 	}
3268 
3269 	if (scsi_debug_ato > 1) {
3270 		printk(KERN_ERR "scsi_debug_init: ato must be 0 or 1\n");
3271 		return -EINVAL;
3272 	}
3273 
3274 	if (scsi_debug_physblk_exp > 15) {
3275 		printk(KERN_ERR "scsi_debug_init: invalid physblk_exp %u\n",
3276 		       scsi_debug_physblk_exp);
3277 		return -EINVAL;
3278 	}
3279 
3280 	if (scsi_debug_lowest_aligned > 0x3fff) {
3281 		printk(KERN_ERR "scsi_debug_init: lowest_aligned too big: %u\n",
3282 		       scsi_debug_lowest_aligned);
3283 		return -EINVAL;
3284 	}
3285 
3286 	if (scsi_debug_dev_size_mb < 1)
3287 		scsi_debug_dev_size_mb = 1;  /* force minimum 1 MB ramdisk */
3288 	sz = (unsigned long)scsi_debug_dev_size_mb * 1048576;
3289 	sdebug_store_sectors = sz / scsi_debug_sector_size;
3290 	sdebug_capacity = get_sdebug_capacity();
3291 
3292 	/* play around with geometry, don't waste too much on track 0 */
3293 	sdebug_heads = 8;
3294 	sdebug_sectors_per = 32;
3295 	if (scsi_debug_dev_size_mb >= 16)
3296 		sdebug_heads = 32;
3297 	else if (scsi_debug_dev_size_mb >= 256)
3298 		sdebug_heads = 64;
3299 	sdebug_cylinders_per = (unsigned long)sdebug_capacity /
3300 			       (sdebug_sectors_per * sdebug_heads);
3301 	if (sdebug_cylinders_per >= 1024) {
3302 		/* other LLDs do this; implies >= 1GB ram disk ... */
3303 		sdebug_heads = 255;
3304 		sdebug_sectors_per = 63;
3305 		sdebug_cylinders_per = (unsigned long)sdebug_capacity /
3306 			       (sdebug_sectors_per * sdebug_heads);
3307 	}
3308 
3309 	fake_storep = vmalloc(sz);
3310 	if (NULL == fake_storep) {
3311 		printk(KERN_ERR "scsi_debug_init: out of memory, 1\n");
3312 		return -ENOMEM;
3313 	}
3314 	memset(fake_storep, 0, sz);
3315 	if (scsi_debug_num_parts > 0)
3316 		sdebug_build_parts(fake_storep, sz);
3317 
3318 	if (scsi_debug_dif) {
3319 		int dif_size;
3320 
3321 		dif_size = sdebug_store_sectors * sizeof(struct sd_dif_tuple);
3322 		dif_storep = vmalloc(dif_size);
3323 
3324 		printk(KERN_ERR "scsi_debug_init: dif_storep %u bytes @ %p\n",
3325 		       dif_size, dif_storep);
3326 
3327 		if (dif_storep == NULL) {
3328 			printk(KERN_ERR "scsi_debug_init: out of mem. (DIX)\n");
3329 			ret = -ENOMEM;
3330 			goto free_vm;
3331 		}
3332 
3333 		memset(dif_storep, 0xff, dif_size);
3334 	}
3335 
3336 	/* Thin Provisioning */
3337 	if (scsi_debug_tpu || scsi_debug_tpws) {
3338 		unsigned int map_bytes;
3339 
3340 		scsi_debug_unmap_max_blocks =
3341 			clamp(scsi_debug_unmap_max_blocks, 0U, 0xffffffffU);
3342 
3343 		scsi_debug_unmap_max_desc =
3344 			clamp(scsi_debug_unmap_max_desc, 0U, 256U);
3345 
3346 		scsi_debug_unmap_granularity =
3347 			clamp(scsi_debug_unmap_granularity, 1U, 0xffffffffU);
3348 
3349 		if (scsi_debug_unmap_alignment &&
3350 		    scsi_debug_unmap_granularity < scsi_debug_unmap_alignment) {
3351 			printk(KERN_ERR
3352 			       "%s: ERR: unmap_granularity < unmap_alignment\n",
3353 			       __func__);
3354 			return -EINVAL;
3355 		}
3356 
3357 		map_size = (sdebug_store_sectors / scsi_debug_unmap_granularity);
3358 		map_bytes = map_size >> 3;
3359 		map_storep = vmalloc(map_bytes);
3360 
3361 		printk(KERN_INFO "scsi_debug_init: %lu provisioning blocks\n",
3362 		       map_size);
3363 
3364 		if (map_storep == NULL) {
3365 			printk(KERN_ERR "scsi_debug_init: out of mem. (MAP)\n");
3366 			ret = -ENOMEM;
3367 			goto free_vm;
3368 		}
3369 
3370 		memset(map_storep, 0x0, map_bytes);
3371 
3372 		/* Map first 1KB for partition table */
3373 		if (scsi_debug_num_parts)
3374 			map_region(0, 2);
3375 	}
3376 
3377 	pseudo_primary = root_device_register("pseudo_0");
3378 	if (IS_ERR(pseudo_primary)) {
3379 		printk(KERN_WARNING "scsi_debug: root_device_register() error\n");
3380 		ret = PTR_ERR(pseudo_primary);
3381 		goto free_vm;
3382 	}
3383 	ret = bus_register(&pseudo_lld_bus);
3384 	if (ret < 0) {
3385 		printk(KERN_WARNING "scsi_debug: bus_register error: %d\n",
3386 			ret);
3387 		goto dev_unreg;
3388 	}
3389 	ret = driver_register(&sdebug_driverfs_driver);
3390 	if (ret < 0) {
3391 		printk(KERN_WARNING "scsi_debug: driver_register error: %d\n",
3392 			ret);
3393 		goto bus_unreg;
3394 	}
3395 	ret = do_create_driverfs_files();
3396 	if (ret < 0) {
3397 		printk(KERN_WARNING "scsi_debug: driver_create_file error: %d\n",
3398 			ret);
3399 		goto del_files;
3400 	}
3401 
3402 	init_all_queued();
3403 
3404 	host_to_add = scsi_debug_add_host;
3405         scsi_debug_add_host = 0;
3406 
3407         for (k = 0; k < host_to_add; k++) {
3408                 if (sdebug_add_adapter()) {
3409                         printk(KERN_ERR "scsi_debug_init: "
3410                                "sdebug_add_adapter failed k=%d\n", k);
3411                         break;
3412                 }
3413         }
3414 
3415 	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
3416 		printk(KERN_INFO "scsi_debug_init: built %d host(s)\n",
3417 		       scsi_debug_add_host);
3418 	}
3419 	return 0;
3420 
3421 del_files:
3422 	do_remove_driverfs_files();
3423 	driver_unregister(&sdebug_driverfs_driver);
3424 bus_unreg:
3425 	bus_unregister(&pseudo_lld_bus);
3426 dev_unreg:
3427 	root_device_unregister(pseudo_primary);
3428 free_vm:
3429 	if (map_storep)
3430 		vfree(map_storep);
3431 	if (dif_storep)
3432 		vfree(dif_storep);
3433 	vfree(fake_storep);
3434 
3435 	return ret;
3436 }
3437 
3438 static void __exit scsi_debug_exit(void)
3439 {
3440 	int k = scsi_debug_add_host;
3441 
3442 	stop_all_queued();
3443 	for (; k; k--)
3444 		sdebug_remove_adapter();
3445 	do_remove_driverfs_files();
3446 	driver_unregister(&sdebug_driverfs_driver);
3447 	bus_unregister(&pseudo_lld_bus);
3448 	root_device_unregister(pseudo_primary);
3449 
3450 	if (dif_storep)
3451 		vfree(dif_storep);
3452 
3453 	vfree(fake_storep);
3454 }
3455 
3456 device_initcall(scsi_debug_init);
3457 module_exit(scsi_debug_exit);
3458 
3459 static void sdebug_release_adapter(struct device * dev)
3460 {
3461         struct sdebug_host_info *sdbg_host;
3462 
3463 	sdbg_host = to_sdebug_host(dev);
3464         kfree(sdbg_host);
3465 }
3466 
3467 static int sdebug_add_adapter(void)
3468 {
3469 	int k, devs_per_host;
3470         int error = 0;
3471         struct sdebug_host_info *sdbg_host;
3472 	struct sdebug_dev_info *sdbg_devinfo, *tmp;
3473 
3474         sdbg_host = kzalloc(sizeof(*sdbg_host),GFP_KERNEL);
3475         if (NULL == sdbg_host) {
3476                 printk(KERN_ERR "%s: out of memory at line %d\n",
3477                        __func__, __LINE__);
3478                 return -ENOMEM;
3479         }
3480 
3481         INIT_LIST_HEAD(&sdbg_host->dev_info_list);
3482 
3483 	devs_per_host = scsi_debug_num_tgts * scsi_debug_max_luns;
3484         for (k = 0; k < devs_per_host; k++) {
3485 		sdbg_devinfo = sdebug_device_create(sdbg_host, GFP_KERNEL);
3486 		if (!sdbg_devinfo) {
3487                         printk(KERN_ERR "%s: out of memory at line %d\n",
3488                                __func__, __LINE__);
3489                         error = -ENOMEM;
3490 			goto clean;
3491                 }
3492         }
3493 
3494         spin_lock(&sdebug_host_list_lock);
3495         list_add_tail(&sdbg_host->host_list, &sdebug_host_list);
3496         spin_unlock(&sdebug_host_list_lock);
3497 
3498         sdbg_host->dev.bus = &pseudo_lld_bus;
3499         sdbg_host->dev.parent = pseudo_primary;
3500         sdbg_host->dev.release = &sdebug_release_adapter;
3501         dev_set_name(&sdbg_host->dev, "adapter%d", scsi_debug_add_host);
3502 
3503         error = device_register(&sdbg_host->dev);
3504 
3505         if (error)
3506 		goto clean;
3507 
3508 	++scsi_debug_add_host;
3509         return error;
3510 
3511 clean:
3512 	list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
3513 				 dev_list) {
3514 		list_del(&sdbg_devinfo->dev_list);
3515 		kfree(sdbg_devinfo);
3516 	}
3517 
3518 	kfree(sdbg_host);
3519         return error;
3520 }
3521 
3522 static void sdebug_remove_adapter(void)
3523 {
3524         struct sdebug_host_info * sdbg_host = NULL;
3525 
3526         spin_lock(&sdebug_host_list_lock);
3527         if (!list_empty(&sdebug_host_list)) {
3528                 sdbg_host = list_entry(sdebug_host_list.prev,
3529                                        struct sdebug_host_info, host_list);
3530 		list_del(&sdbg_host->host_list);
3531 	}
3532         spin_unlock(&sdebug_host_list_lock);
3533 
3534 	if (!sdbg_host)
3535 		return;
3536 
3537         device_unregister(&sdbg_host->dev);
3538         --scsi_debug_add_host;
3539 }
3540 
3541 static
3542 int scsi_debug_queuecommand_lck(struct scsi_cmnd *SCpnt, done_funct_t done)
3543 {
3544 	unsigned char *cmd = (unsigned char *) SCpnt->cmnd;
3545 	int len, k;
3546 	unsigned int num;
3547 	unsigned long long lba;
3548 	u32 ei_lba;
3549 	int errsts = 0;
3550 	int target = SCpnt->device->id;
3551 	struct sdebug_dev_info *devip = NULL;
3552 	int inj_recovered = 0;
3553 	int inj_transport = 0;
3554 	int inj_dif = 0;
3555 	int inj_dix = 0;
3556 	int delay_override = 0;
3557 	int unmap = 0;
3558 
3559 	scsi_set_resid(SCpnt, 0);
3560 	if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) && cmd) {
3561 		printk(KERN_INFO "scsi_debug: cmd ");
3562 		for (k = 0, len = SCpnt->cmd_len; k < len; ++k)
3563 			printk("%02x ", (int)cmd[k]);
3564 		printk("\n");
3565 	}
3566 
3567 	if (target == SCpnt->device->host->hostt->this_id) {
3568 		printk(KERN_INFO "scsi_debug: initiator's id used as "
3569 		       "target!\n");
3570 		return schedule_resp(SCpnt, NULL, done,
3571 				     DID_NO_CONNECT << 16, 0);
3572 	}
3573 
3574 	if ((SCpnt->device->lun >= scsi_debug_max_luns) &&
3575 	    (SCpnt->device->lun != SAM2_WLUN_REPORT_LUNS))
3576 		return schedule_resp(SCpnt, NULL, done,
3577 				     DID_NO_CONNECT << 16, 0);
3578 	devip = devInfoReg(SCpnt->device);
3579 	if (NULL == devip)
3580 		return schedule_resp(SCpnt, NULL, done,
3581 				     DID_NO_CONNECT << 16, 0);
3582 
3583 	if ((scsi_debug_every_nth != 0) &&
3584 	    (++scsi_debug_cmnd_count >= abs(scsi_debug_every_nth))) {
3585 		scsi_debug_cmnd_count = 0;
3586 		if (scsi_debug_every_nth < -1)
3587 			scsi_debug_every_nth = -1;
3588 		if (SCSI_DEBUG_OPT_TIMEOUT & scsi_debug_opts)
3589 			return 0; /* ignore command causing timeout */
3590 		else if (SCSI_DEBUG_OPT_RECOVERED_ERR & scsi_debug_opts)
3591 			inj_recovered = 1; /* to reads and writes below */
3592 		else if (SCSI_DEBUG_OPT_TRANSPORT_ERR & scsi_debug_opts)
3593 			inj_transport = 1; /* to reads and writes below */
3594 		else if (SCSI_DEBUG_OPT_DIF_ERR & scsi_debug_opts)
3595 			inj_dif = 1; /* to reads and writes below */
3596 		else if (SCSI_DEBUG_OPT_DIX_ERR & scsi_debug_opts)
3597 			inj_dix = 1; /* to reads and writes below */
3598 	}
3599 
3600 	if (devip->wlun) {
3601 		switch (*cmd) {
3602 		case INQUIRY:
3603 		case REQUEST_SENSE:
3604 		case TEST_UNIT_READY:
3605 		case REPORT_LUNS:
3606 			break;  /* only allowable wlun commands */
3607 		default:
3608 			if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
3609 				printk(KERN_INFO "scsi_debug: Opcode: 0x%x "
3610 				       "not supported for wlun\n", *cmd);
3611 			mk_sense_buffer(devip, ILLEGAL_REQUEST,
3612 					INVALID_OPCODE, 0);
3613 			errsts = check_condition_result;
3614 			return schedule_resp(SCpnt, devip, done, errsts,
3615 					     0);
3616 		}
3617 	}
3618 
3619 	switch (*cmd) {
3620 	case INQUIRY:     /* mandatory, ignore unit attention */
3621 		delay_override = 1;
3622 		errsts = resp_inquiry(SCpnt, target, devip);
3623 		break;
3624 	case REQUEST_SENSE:	/* mandatory, ignore unit attention */
3625 		delay_override = 1;
3626 		errsts = resp_requests(SCpnt, devip);
3627 		break;
3628 	case REZERO_UNIT:	/* actually this is REWIND for SSC */
3629 	case START_STOP:
3630 		errsts = resp_start_stop(SCpnt, devip);
3631 		break;
3632 	case ALLOW_MEDIUM_REMOVAL:
3633 		errsts = check_readiness(SCpnt, 1, devip);
3634 		if (errsts)
3635 			break;
3636 		if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
3637 			printk(KERN_INFO "scsi_debug: Medium removal %s\n",
3638 			       cmd[4] ? "inhibited" : "enabled");
3639 		break;
3640 	case SEND_DIAGNOSTIC:     /* mandatory */
3641 		errsts = check_readiness(SCpnt, 1, devip);
3642 		break;
3643 	case TEST_UNIT_READY:     /* mandatory */
3644 		delay_override = 1;
3645 		errsts = check_readiness(SCpnt, 0, devip);
3646 		break;
3647 	case RESERVE:
3648 		errsts = check_readiness(SCpnt, 1, devip);
3649 		break;
3650 	case RESERVE_10:
3651 		errsts = check_readiness(SCpnt, 1, devip);
3652 		break;
3653 	case RELEASE:
3654 		errsts = check_readiness(SCpnt, 1, devip);
3655 		break;
3656 	case RELEASE_10:
3657 		errsts = check_readiness(SCpnt, 1, devip);
3658 		break;
3659 	case READ_CAPACITY:
3660 		errsts = resp_readcap(SCpnt, devip);
3661 		break;
3662 	case SERVICE_ACTION_IN:
3663 		if (cmd[1] == SAI_READ_CAPACITY_16)
3664 			errsts = resp_readcap16(SCpnt, devip);
3665 		else if (cmd[1] == SAI_GET_LBA_STATUS) {
3666 
3667 			if (scsi_debug_tpu == 0 && scsi_debug_tpws == 0) {
3668 				mk_sense_buffer(devip, ILLEGAL_REQUEST,
3669 						INVALID_COMMAND_OPCODE, 0);
3670 				errsts = check_condition_result;
3671 			} else
3672 				errsts = resp_get_lba_status(SCpnt, devip);
3673 		} else {
3674 			mk_sense_buffer(devip, ILLEGAL_REQUEST,
3675 					INVALID_OPCODE, 0);
3676 			errsts = check_condition_result;
3677 		}
3678 		break;
3679 	case MAINTENANCE_IN:
3680 		if (MI_REPORT_TARGET_PGS != cmd[1]) {
3681 			mk_sense_buffer(devip, ILLEGAL_REQUEST,
3682 					INVALID_OPCODE, 0);
3683 			errsts = check_condition_result;
3684 			break;
3685 		}
3686 		errsts = resp_report_tgtpgs(SCpnt, devip);
3687 		break;
3688 	case READ_16:
3689 	case READ_12:
3690 	case READ_10:
3691 		/* READ{10,12,16} and DIF Type 2 are natural enemies */
3692 		if (scsi_debug_dif == SD_DIF_TYPE2_PROTECTION &&
3693 		    cmd[1] & 0xe0) {
3694 			mk_sense_buffer(devip, ILLEGAL_REQUEST,
3695 					INVALID_COMMAND_OPCODE, 0);
3696 			errsts = check_condition_result;
3697 			break;
3698 		}
3699 
3700 		if ((scsi_debug_dif == SD_DIF_TYPE1_PROTECTION ||
3701 		     scsi_debug_dif == SD_DIF_TYPE3_PROTECTION) &&
3702 		    (cmd[1] & 0xe0) == 0)
3703 			printk(KERN_ERR "Unprotected RD/WR to DIF device\n");
3704 
3705 		/* fall through */
3706 	case READ_6:
3707 read:
3708 		errsts = check_readiness(SCpnt, 0, devip);
3709 		if (errsts)
3710 			break;
3711 		if (scsi_debug_fake_rw)
3712 			break;
3713 		get_data_transfer_info(cmd, &lba, &num, &ei_lba);
3714 		errsts = resp_read(SCpnt, lba, num, devip, ei_lba);
3715 		if (inj_recovered && (0 == errsts)) {
3716 			mk_sense_buffer(devip, RECOVERED_ERROR,
3717 					THRESHOLD_EXCEEDED, 0);
3718 			errsts = check_condition_result;
3719 		} else if (inj_transport && (0 == errsts)) {
3720 			mk_sense_buffer(devip, ABORTED_COMMAND,
3721 					TRANSPORT_PROBLEM, ACK_NAK_TO);
3722 			errsts = check_condition_result;
3723 		} else if (inj_dif && (0 == errsts)) {
3724 			mk_sense_buffer(devip, ABORTED_COMMAND, 0x10, 1);
3725 			errsts = illegal_condition_result;
3726 		} else if (inj_dix && (0 == errsts)) {
3727 			mk_sense_buffer(devip, ILLEGAL_REQUEST, 0x10, 1);
3728 			errsts = illegal_condition_result;
3729 		}
3730 		break;
3731 	case REPORT_LUNS:	/* mandatory, ignore unit attention */
3732 		delay_override = 1;
3733 		errsts = resp_report_luns(SCpnt, devip);
3734 		break;
3735 	case VERIFY:		/* 10 byte SBC-2 command */
3736 		errsts = check_readiness(SCpnt, 0, devip);
3737 		break;
3738 	case WRITE_16:
3739 	case WRITE_12:
3740 	case WRITE_10:
3741 		/* WRITE{10,12,16} and DIF Type 2 are natural enemies */
3742 		if (scsi_debug_dif == SD_DIF_TYPE2_PROTECTION &&
3743 		    cmd[1] & 0xe0) {
3744 			mk_sense_buffer(devip, ILLEGAL_REQUEST,
3745 					INVALID_COMMAND_OPCODE, 0);
3746 			errsts = check_condition_result;
3747 			break;
3748 		}
3749 
3750 		if ((scsi_debug_dif == SD_DIF_TYPE1_PROTECTION ||
3751 		     scsi_debug_dif == SD_DIF_TYPE3_PROTECTION) &&
3752 		    (cmd[1] & 0xe0) == 0)
3753 			printk(KERN_ERR "Unprotected RD/WR to DIF device\n");
3754 
3755 		/* fall through */
3756 	case WRITE_6:
3757 write:
3758 		errsts = check_readiness(SCpnt, 0, devip);
3759 		if (errsts)
3760 			break;
3761 		if (scsi_debug_fake_rw)
3762 			break;
3763 		get_data_transfer_info(cmd, &lba, &num, &ei_lba);
3764 		errsts = resp_write(SCpnt, lba, num, devip, ei_lba);
3765 		if (inj_recovered && (0 == errsts)) {
3766 			mk_sense_buffer(devip, RECOVERED_ERROR,
3767 					THRESHOLD_EXCEEDED, 0);
3768 			errsts = check_condition_result;
3769 		} else if (inj_dif && (0 == errsts)) {
3770 			mk_sense_buffer(devip, ABORTED_COMMAND, 0x10, 1);
3771 			errsts = illegal_condition_result;
3772 		} else if (inj_dix && (0 == errsts)) {
3773 			mk_sense_buffer(devip, ILLEGAL_REQUEST, 0x10, 1);
3774 			errsts = illegal_condition_result;
3775 		}
3776 		break;
3777 	case WRITE_SAME_16:
3778 		if (cmd[1] & 0x8) {
3779 			if (scsi_debug_tpws == 0) {
3780 				mk_sense_buffer(devip, ILLEGAL_REQUEST,
3781 						INVALID_FIELD_IN_CDB, 0);
3782 				errsts = check_condition_result;
3783 			} else
3784 				unmap = 1;
3785 		}
3786 		if (errsts)
3787 			break;
3788 		/* fall through */
3789 	case WRITE_SAME:
3790 		errsts = check_readiness(SCpnt, 0, devip);
3791 		if (errsts)
3792 			break;
3793 		get_data_transfer_info(cmd, &lba, &num, &ei_lba);
3794 		errsts = resp_write_same(SCpnt, lba, num, devip, ei_lba, unmap);
3795 		break;
3796 	case UNMAP:
3797 		errsts = check_readiness(SCpnt, 0, devip);
3798 		if (errsts)
3799 			break;
3800 
3801 		if (scsi_debug_unmap_max_desc == 0 || scsi_debug_tpu == 0) {
3802 			mk_sense_buffer(devip, ILLEGAL_REQUEST,
3803 					INVALID_COMMAND_OPCODE, 0);
3804 			errsts = check_condition_result;
3805 		} else
3806 			errsts = resp_unmap(SCpnt, devip);
3807 		break;
3808 	case MODE_SENSE:
3809 	case MODE_SENSE_10:
3810 		errsts = resp_mode_sense(SCpnt, target, devip);
3811 		break;
3812 	case MODE_SELECT:
3813 		errsts = resp_mode_select(SCpnt, 1, devip);
3814 		break;
3815 	case MODE_SELECT_10:
3816 		errsts = resp_mode_select(SCpnt, 0, devip);
3817 		break;
3818 	case LOG_SENSE:
3819 		errsts = resp_log_sense(SCpnt, devip);
3820 		break;
3821 	case SYNCHRONIZE_CACHE:
3822 		delay_override = 1;
3823 		errsts = check_readiness(SCpnt, 0, devip);
3824 		break;
3825 	case WRITE_BUFFER:
3826 		errsts = check_readiness(SCpnt, 1, devip);
3827 		break;
3828 	case XDWRITEREAD_10:
3829 		if (!scsi_bidi_cmnd(SCpnt)) {
3830 			mk_sense_buffer(devip, ILLEGAL_REQUEST,
3831 					INVALID_FIELD_IN_CDB, 0);
3832 			errsts = check_condition_result;
3833 			break;
3834 		}
3835 
3836 		errsts = check_readiness(SCpnt, 0, devip);
3837 		if (errsts)
3838 			break;
3839 		if (scsi_debug_fake_rw)
3840 			break;
3841 		get_data_transfer_info(cmd, &lba, &num, &ei_lba);
3842 		errsts = resp_read(SCpnt, lba, num, devip, ei_lba);
3843 		if (errsts)
3844 			break;
3845 		errsts = resp_write(SCpnt, lba, num, devip, ei_lba);
3846 		if (errsts)
3847 			break;
3848 		errsts = resp_xdwriteread(SCpnt, lba, num, devip);
3849 		break;
3850 	case VARIABLE_LENGTH_CMD:
3851 		if (scsi_debug_dif == SD_DIF_TYPE2_PROTECTION) {
3852 
3853 			if ((cmd[10] & 0xe0) == 0)
3854 				printk(KERN_ERR
3855 				       "Unprotected RD/WR to DIF device\n");
3856 
3857 			if (cmd[9] == READ_32) {
3858 				BUG_ON(SCpnt->cmd_len < 32);
3859 				goto read;
3860 			}
3861 
3862 			if (cmd[9] == WRITE_32) {
3863 				BUG_ON(SCpnt->cmd_len < 32);
3864 				goto write;
3865 			}
3866 		}
3867 
3868 		mk_sense_buffer(devip, ILLEGAL_REQUEST,
3869 				INVALID_FIELD_IN_CDB, 0);
3870 		errsts = check_condition_result;
3871 		break;
3872 
3873 	default:
3874 		if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
3875 			printk(KERN_INFO "scsi_debug: Opcode: 0x%x not "
3876 			       "supported\n", *cmd);
3877 		errsts = check_readiness(SCpnt, 1, devip);
3878 		if (errsts)
3879 			break;	/* Unit attention takes precedence */
3880 		mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_OPCODE, 0);
3881 		errsts = check_condition_result;
3882 		break;
3883 	}
3884 	return schedule_resp(SCpnt, devip, done, errsts,
3885 			     (delay_override ? 0 : scsi_debug_delay));
3886 }
3887 
3888 static DEF_SCSI_QCMD(scsi_debug_queuecommand)
3889 
3890 static struct scsi_host_template sdebug_driver_template = {
3891 	.proc_info =		scsi_debug_proc_info,
3892 	.proc_name =		sdebug_proc_name,
3893 	.name =			"SCSI DEBUG",
3894 	.info =			scsi_debug_info,
3895 	.slave_alloc =		scsi_debug_slave_alloc,
3896 	.slave_configure =	scsi_debug_slave_configure,
3897 	.slave_destroy =	scsi_debug_slave_destroy,
3898 	.ioctl =		scsi_debug_ioctl,
3899 	.queuecommand =		scsi_debug_queuecommand,
3900 	.eh_abort_handler =	scsi_debug_abort,
3901 	.eh_bus_reset_handler = scsi_debug_bus_reset,
3902 	.eh_device_reset_handler = scsi_debug_device_reset,
3903 	.eh_host_reset_handler = scsi_debug_host_reset,
3904 	.bios_param =		scsi_debug_biosparam,
3905 	.can_queue =		SCSI_DEBUG_CANQUEUE,
3906 	.this_id =		7,
3907 	.sg_tablesize =		256,
3908 	.cmd_per_lun =		16,
3909 	.max_sectors =		0xffff,
3910 	.use_clustering = 	DISABLE_CLUSTERING,
3911 	.module =		THIS_MODULE,
3912 };
3913 
3914 static int sdebug_driver_probe(struct device * dev)
3915 {
3916         int error = 0;
3917         struct sdebug_host_info *sdbg_host;
3918         struct Scsi_Host *hpnt;
3919 	int host_prot;
3920 
3921 	sdbg_host = to_sdebug_host(dev);
3922 
3923 	sdebug_driver_template.can_queue = scsi_debug_max_queue;
3924 	hpnt = scsi_host_alloc(&sdebug_driver_template, sizeof(sdbg_host));
3925 	if (NULL == hpnt) {
3926 		printk(KERN_ERR "%s: scsi_register failed\n", __func__);
3927 		error = -ENODEV;
3928 		return error;
3929 	}
3930 
3931         sdbg_host->shost = hpnt;
3932 	*((struct sdebug_host_info **)hpnt->hostdata) = sdbg_host;
3933 	if ((hpnt->this_id >= 0) && (scsi_debug_num_tgts > hpnt->this_id))
3934 		hpnt->max_id = scsi_debug_num_tgts + 1;
3935 	else
3936 		hpnt->max_id = scsi_debug_num_tgts;
3937 	hpnt->max_lun = SAM2_WLUN_REPORT_LUNS;	/* = scsi_debug_max_luns; */
3938 
3939 	host_prot = 0;
3940 
3941 	switch (scsi_debug_dif) {
3942 
3943 	case SD_DIF_TYPE1_PROTECTION:
3944 		host_prot = SHOST_DIF_TYPE1_PROTECTION;
3945 		if (scsi_debug_dix)
3946 			host_prot |= SHOST_DIX_TYPE1_PROTECTION;
3947 		break;
3948 
3949 	case SD_DIF_TYPE2_PROTECTION:
3950 		host_prot = SHOST_DIF_TYPE2_PROTECTION;
3951 		if (scsi_debug_dix)
3952 			host_prot |= SHOST_DIX_TYPE2_PROTECTION;
3953 		break;
3954 
3955 	case SD_DIF_TYPE3_PROTECTION:
3956 		host_prot = SHOST_DIF_TYPE3_PROTECTION;
3957 		if (scsi_debug_dix)
3958 			host_prot |= SHOST_DIX_TYPE3_PROTECTION;
3959 		break;
3960 
3961 	default:
3962 		if (scsi_debug_dix)
3963 			host_prot |= SHOST_DIX_TYPE0_PROTECTION;
3964 		break;
3965 	}
3966 
3967 	scsi_host_set_prot(hpnt, host_prot);
3968 
3969 	printk(KERN_INFO "scsi_debug: host protection%s%s%s%s%s%s%s\n",
3970 	       (host_prot & SHOST_DIF_TYPE1_PROTECTION) ? " DIF1" : "",
3971 	       (host_prot & SHOST_DIF_TYPE2_PROTECTION) ? " DIF2" : "",
3972 	       (host_prot & SHOST_DIF_TYPE3_PROTECTION) ? " DIF3" : "",
3973 	       (host_prot & SHOST_DIX_TYPE0_PROTECTION) ? " DIX0" : "",
3974 	       (host_prot & SHOST_DIX_TYPE1_PROTECTION) ? " DIX1" : "",
3975 	       (host_prot & SHOST_DIX_TYPE2_PROTECTION) ? " DIX2" : "",
3976 	       (host_prot & SHOST_DIX_TYPE3_PROTECTION) ? " DIX3" : "");
3977 
3978 	if (scsi_debug_guard == 1)
3979 		scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_IP);
3980 	else
3981 		scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_CRC);
3982 
3983         error = scsi_add_host(hpnt, &sdbg_host->dev);
3984         if (error) {
3985                 printk(KERN_ERR "%s: scsi_add_host failed\n", __func__);
3986                 error = -ENODEV;
3987 		scsi_host_put(hpnt);
3988         } else
3989 		scsi_scan_host(hpnt);
3990 
3991 
3992         return error;
3993 }
3994 
3995 static int sdebug_driver_remove(struct device * dev)
3996 {
3997         struct sdebug_host_info *sdbg_host;
3998 	struct sdebug_dev_info *sdbg_devinfo, *tmp;
3999 
4000 	sdbg_host = to_sdebug_host(dev);
4001 
4002 	if (!sdbg_host) {
4003 		printk(KERN_ERR "%s: Unable to locate host info\n",
4004 		       __func__);
4005 		return -ENODEV;
4006 	}
4007 
4008         scsi_remove_host(sdbg_host->shost);
4009 
4010 	list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
4011 				 dev_list) {
4012                 list_del(&sdbg_devinfo->dev_list);
4013                 kfree(sdbg_devinfo);
4014         }
4015 
4016         scsi_host_put(sdbg_host->shost);
4017         return 0;
4018 }
4019 
4020 static int pseudo_lld_bus_match(struct device *dev,
4021 				struct device_driver *dev_driver)
4022 {
4023 	return 1;
4024 }
4025 
4026 static struct bus_type pseudo_lld_bus = {
4027 	.name = "pseudo",
4028 	.match = pseudo_lld_bus_match,
4029 	.probe = sdebug_driver_probe,
4030 	.remove = sdebug_driver_remove,
4031 };
4032