xref: /openbmc/linux/drivers/scsi/scsi_debug.c (revision 28898873)
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://www.torque.net/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/types.h>
34 #include <linux/string.h>
35 #include <linux/genhd.h>
36 #include <linux/fs.h>
37 #include <linux/init.h>
38 #include <linux/proc_fs.h>
39 #include <linux/vmalloc.h>
40 #include <linux/moduleparam.h>
41 #include <linux/scatterlist.h>
42 #include <linux/blkdev.h>
43 
44 #include <scsi/scsi.h>
45 #include <scsi/scsi_cmnd.h>
46 #include <scsi/scsi_device.h>
47 #include <scsi/scsi_host.h>
48 #include <scsi/scsicam.h>
49 #include <scsi/scsi_eh.h>
50 
51 #include <linux/stat.h>
52 
53 #include "scsi_logging.h"
54 
55 #define SCSI_DEBUG_VERSION "1.81"
56 static const char * scsi_debug_version_date = "20070104";
57 
58 /* Additional Sense Code (ASC) */
59 #define NO_ADDITIONAL_SENSE 0x0
60 #define LOGICAL_UNIT_NOT_READY 0x4
61 #define UNRECOVERED_READ_ERR 0x11
62 #define PARAMETER_LIST_LENGTH_ERR 0x1a
63 #define INVALID_OPCODE 0x20
64 #define ADDR_OUT_OF_RANGE 0x21
65 #define INVALID_FIELD_IN_CDB 0x24
66 #define INVALID_FIELD_IN_PARAM_LIST 0x26
67 #define POWERON_RESET 0x29
68 #define SAVING_PARAMS_UNSUP 0x39
69 #define TRANSPORT_PROBLEM 0x4b
70 #define THRESHOLD_EXCEEDED 0x5d
71 #define LOW_POWER_COND_ON 0x5e
72 
73 /* Additional Sense Code Qualifier (ASCQ) */
74 #define ACK_NAK_TO 0x3
75 
76 #define SDEBUG_TAGGED_QUEUING 0 /* 0 | MSG_SIMPLE_TAG | MSG_ORDERED_TAG */
77 
78 /* Default values for driver parameters */
79 #define DEF_NUM_HOST   1
80 #define DEF_NUM_TGTS   1
81 #define DEF_MAX_LUNS   1
82 /* With these defaults, this driver will make 1 host with 1 target
83  * (id 0) containing 1 logical unit (lun 0). That is 1 device.
84  */
85 #define DEF_DELAY   1
86 #define DEF_DEV_SIZE_MB   8
87 #define DEF_EVERY_NTH   0
88 #define DEF_NUM_PARTS   0
89 #define DEF_OPTS   0
90 #define DEF_SCSI_LEVEL   5    /* INQUIRY, byte2 [5->SPC-3] */
91 #define DEF_PTYPE   0
92 #define DEF_D_SENSE   0
93 #define DEF_NO_LUN_0   0
94 #define DEF_VIRTUAL_GB   0
95 #define DEF_FAKE_RW	0
96 #define DEF_VPD_USE_HOSTNO 1
97 
98 /* bit mask values for scsi_debug_opts */
99 #define SCSI_DEBUG_OPT_NOISE   1
100 #define SCSI_DEBUG_OPT_MEDIUM_ERR   2
101 #define SCSI_DEBUG_OPT_TIMEOUT   4
102 #define SCSI_DEBUG_OPT_RECOVERED_ERR   8
103 #define SCSI_DEBUG_OPT_TRANSPORT_ERR   16
104 /* When "every_nth" > 0 then modulo "every_nth" commands:
105  *   - a no response is simulated if SCSI_DEBUG_OPT_TIMEOUT is set
106  *   - a RECOVERED_ERROR is simulated on successful read and write
107  *     commands if SCSI_DEBUG_OPT_RECOVERED_ERR is set.
108  *   - a TRANSPORT_ERROR is simulated on successful read and write
109  *     commands if SCSI_DEBUG_OPT_TRANSPORT_ERR is set.
110  *
111  * When "every_nth" < 0 then after "- every_nth" commands:
112  *   - a no response is simulated if SCSI_DEBUG_OPT_TIMEOUT is set
113  *   - a RECOVERED_ERROR is simulated on successful read and write
114  *     commands if SCSI_DEBUG_OPT_RECOVERED_ERR is set.
115  *   - a TRANSPORT_ERROR is simulated on successful read and write
116  *     commands if SCSI_DEBUG_OPT_TRANSPORT_ERR is set.
117  * This will continue until some other action occurs (e.g. the user
118  * writing a new value (other than -1 or 1) to every_nth via sysfs).
119  */
120 
121 /* when 1==SCSI_DEBUG_OPT_MEDIUM_ERR, a medium error is simulated at this
122  * sector on read commands: */
123 #define OPT_MEDIUM_ERR_ADDR   0x1234 /* that's sector 4660 in decimal */
124 
125 /* If REPORT LUNS has luns >= 256 it can choose "flat space" (value 1)
126  * or "peripheral device" addressing (value 0) */
127 #define SAM2_LUN_ADDRESS_METHOD 0
128 #define SAM2_WLUN_REPORT_LUNS 0xc101
129 
130 static int scsi_debug_add_host = DEF_NUM_HOST;
131 static int scsi_debug_delay = DEF_DELAY;
132 static int scsi_debug_dev_size_mb = DEF_DEV_SIZE_MB;
133 static int scsi_debug_every_nth = DEF_EVERY_NTH;
134 static int scsi_debug_max_luns = DEF_MAX_LUNS;
135 static int scsi_debug_num_parts = DEF_NUM_PARTS;
136 static int scsi_debug_num_tgts = DEF_NUM_TGTS; /* targets per host */
137 static int scsi_debug_opts = DEF_OPTS;
138 static int scsi_debug_scsi_level = DEF_SCSI_LEVEL;
139 static int scsi_debug_ptype = DEF_PTYPE; /* SCSI peripheral type (0==disk) */
140 static int scsi_debug_dsense = DEF_D_SENSE;
141 static int scsi_debug_no_lun_0 = DEF_NO_LUN_0;
142 static int scsi_debug_virtual_gb = DEF_VIRTUAL_GB;
143 static int scsi_debug_fake_rw = DEF_FAKE_RW;
144 static int scsi_debug_vpd_use_hostno = DEF_VPD_USE_HOSTNO;
145 
146 static int scsi_debug_cmnd_count = 0;
147 
148 #define DEV_READONLY(TGT)      (0)
149 #define DEV_REMOVEABLE(TGT)    (0)
150 
151 static unsigned int sdebug_store_sectors;
152 static sector_t sdebug_capacity;	/* in sectors */
153 
154 /* old BIOS stuff, kernel may get rid of them but some mode sense pages
155    may still need them */
156 static int sdebug_heads;		/* heads per disk */
157 static int sdebug_cylinders_per;	/* cylinders per surface */
158 static int sdebug_sectors_per;		/* sectors per cylinder */
159 
160 /* default sector size is 512 bytes, 2**9 bytes */
161 #define POW2_SECT_SIZE 9
162 #define SECT_SIZE (1 << POW2_SECT_SIZE)
163 #define SECT_SIZE_PER(TGT) SECT_SIZE
164 
165 #define SDEBUG_MAX_PARTS 4
166 
167 #define SDEBUG_SENSE_LEN 32
168 
169 #define SCSI_DEBUG_CANQUEUE  255
170 #define SCSI_DEBUG_MAX_CMD_LEN 16
171 
172 struct sdebug_dev_info {
173 	struct list_head dev_list;
174 	unsigned char sense_buff[SDEBUG_SENSE_LEN];	/* weak nexus */
175 	unsigned int channel;
176 	unsigned int target;
177 	unsigned int lun;
178 	struct sdebug_host_info *sdbg_host;
179 	unsigned int wlun;
180 	char reset;
181 	char stopped;
182 	char used;
183 };
184 
185 struct sdebug_host_info {
186 	struct list_head host_list;
187 	struct Scsi_Host *shost;
188 	struct device dev;
189 	struct list_head dev_info_list;
190 };
191 
192 #define to_sdebug_host(d)	\
193 	container_of(d, struct sdebug_host_info, dev)
194 
195 static LIST_HEAD(sdebug_host_list);
196 static DEFINE_SPINLOCK(sdebug_host_list_lock);
197 
198 typedef void (* done_funct_t) (struct scsi_cmnd *);
199 
200 struct sdebug_queued_cmd {
201 	int in_use;
202 	struct timer_list cmnd_timer;
203 	done_funct_t done_funct;
204 	struct scsi_cmnd * a_cmnd;
205 	int scsi_result;
206 };
207 static struct sdebug_queued_cmd queued_arr[SCSI_DEBUG_CANQUEUE];
208 
209 static unsigned char * fake_storep;	/* ramdisk storage */
210 
211 static int num_aborts = 0;
212 static int num_dev_resets = 0;
213 static int num_bus_resets = 0;
214 static int num_host_resets = 0;
215 
216 static DEFINE_SPINLOCK(queued_arr_lock);
217 static DEFINE_RWLOCK(atomic_rw);
218 
219 static char sdebug_proc_name[] = "scsi_debug";
220 
221 static int sdebug_driver_probe(struct device *);
222 static int sdebug_driver_remove(struct device *);
223 static struct bus_type pseudo_lld_bus;
224 
225 static struct device_driver sdebug_driverfs_driver = {
226 	.name 		= sdebug_proc_name,
227 	.bus		= &pseudo_lld_bus,
228 };
229 
230 static const int check_condition_result =
231 		(DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
232 
233 static unsigned char ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
234 				    0, 0, 0x2, 0x4b};
235 static unsigned char iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
236 			           0, 0, 0x0, 0x0};
237 
238 static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev);
239 static void mk_sense_buffer(struct sdebug_dev_info * devip, int key,
240 			    int asc, int asq);
241 static void stop_all_queued(void);
242 static int stop_queued_cmnd(struct scsi_cmnd * cmnd);
243 
244 static int sdebug_add_adapter(void);
245 static void sdebug_remove_adapter(void);
246 static void sdebug_max_tgts_luns(void);
247 
248 static struct device pseudo_primary;
249 static struct bus_type pseudo_lld_bus;
250 
251 static void get_data_transfer_info(unsigned char *cmd,
252 				   unsigned long long *lba, unsigned int *num)
253 {
254 	switch (*cmd) {
255 	case WRITE_16:
256 	case READ_16:
257 		*lba = (u64)cmd[9] | (u64)cmd[8] << 8 |
258 			(u64)cmd[7] << 16 | (u64)cmd[6] << 24 |
259 			(u64)cmd[5] << 32 | (u64)cmd[4] << 40 |
260 			(u64)cmd[3] << 48 | (u64)cmd[2] << 56;
261 
262 		*num = (u32)cmd[13] | (u32)cmd[12] << 8 | (u32)cmd[11] << 16 |
263 			(u32)cmd[10] << 24;
264 		break;
265 	case WRITE_12:
266 	case READ_12:
267 		*lba = (u32)cmd[5] | (u32)cmd[4] << 8 | (u32)cmd[3] << 16 |
268 			(u32)cmd[2] << 24;
269 
270 		*num = (u32)cmd[9] | (u32)cmd[8] << 8 | (u32)cmd[7] << 16 |
271 			(u32)cmd[6] << 24;
272 		break;
273 	case WRITE_10:
274 	case READ_10:
275 	case XDWRITEREAD_10:
276 		*lba = (u32)cmd[5] | (u32)cmd[4] << 8 |	(u32)cmd[3] << 16 |
277 			(u32)cmd[2] << 24;
278 
279 		*num = (u32)cmd[8] | (u32)cmd[7] << 8;
280 		break;
281 	case WRITE_6:
282 	case READ_6:
283 		*lba = (u32)cmd[3] | (u32)cmd[2] << 8 |
284 			(u32)(cmd[1] & 0x1f) << 16;
285 		*num = (0 == cmd[4]) ? 256 : cmd[4];
286 		break;
287 	default:
288 		break;
289 	}
290 }
291 
292 static int scsi_debug_ioctl(struct scsi_device *dev, int cmd, void __user *arg)
293 {
294 	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
295 		printk(KERN_INFO "scsi_debug: ioctl: cmd=0x%x\n", cmd);
296 	}
297 	return -EINVAL;
298 	/* return -ENOTTY; // correct return but upsets fdisk */
299 }
300 
301 static int check_readiness(struct scsi_cmnd * SCpnt, int reset_only,
302 			   struct sdebug_dev_info * devip)
303 {
304 	if (devip->reset) {
305 		if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
306 			printk(KERN_INFO "scsi_debug: Reporting Unit "
307 			       "attention: power on reset\n");
308 		devip->reset = 0;
309 		mk_sense_buffer(devip, UNIT_ATTENTION, POWERON_RESET, 0);
310 		return check_condition_result;
311 	}
312 	if ((0 == reset_only) && devip->stopped) {
313 		if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
314 			printk(KERN_INFO "scsi_debug: Reporting Not "
315 			       "ready: initializing command required\n");
316 		mk_sense_buffer(devip, NOT_READY, LOGICAL_UNIT_NOT_READY,
317 				0x2);
318 		return check_condition_result;
319 	}
320 	return 0;
321 }
322 
323 /* Returns 0 if ok else (DID_ERROR << 16). Sets scp->resid . */
324 static int fill_from_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
325 				int arr_len)
326 {
327 	int act_len;
328 	struct scsi_data_buffer *sdb = scsi_in(scp);
329 
330 	if (!sdb->length)
331 		return 0;
332 	if (!(scsi_bidi_cmnd(scp) || scp->sc_data_direction == DMA_FROM_DEVICE))
333 		return (DID_ERROR << 16);
334 
335 	act_len = sg_copy_from_buffer(sdb->table.sgl, sdb->table.nents,
336 				      arr, arr_len);
337 	if (sdb->resid)
338 		sdb->resid -= act_len;
339 	else
340 		sdb->resid = scsi_bufflen(scp) - act_len;
341 
342 	return 0;
343 }
344 
345 /* Returns number of bytes fetched into 'arr' or -1 if error. */
346 static int fetch_to_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
347 			       int arr_len)
348 {
349 	if (!scsi_bufflen(scp))
350 		return 0;
351 	if (!(scsi_bidi_cmnd(scp) || scp->sc_data_direction == DMA_TO_DEVICE))
352 		return -1;
353 
354 	return scsi_sg_copy_to_buffer(scp, arr, arr_len);
355 }
356 
357 
358 static const char * inq_vendor_id = "Linux   ";
359 static const char * inq_product_id = "scsi_debug      ";
360 static const char * inq_product_rev = "0004";
361 
362 static int inquiry_evpd_83(unsigned char * arr, int port_group_id,
363 			   int target_dev_id, int dev_id_num,
364 			   const char * dev_id_str,
365 			   int dev_id_str_len)
366 {
367 	int num, port_a;
368 	char b[32];
369 
370 	port_a = target_dev_id + 1;
371 	/* T10 vendor identifier field format (faked) */
372 	arr[0] = 0x2;	/* ASCII */
373 	arr[1] = 0x1;
374 	arr[2] = 0x0;
375 	memcpy(&arr[4], inq_vendor_id, 8);
376 	memcpy(&arr[12], inq_product_id, 16);
377 	memcpy(&arr[28], dev_id_str, dev_id_str_len);
378 	num = 8 + 16 + dev_id_str_len;
379 	arr[3] = num;
380 	num += 4;
381 	if (dev_id_num >= 0) {
382 		/* NAA-5, Logical unit identifier (binary) */
383 		arr[num++] = 0x1;	/* binary (not necessarily sas) */
384 		arr[num++] = 0x3;	/* PIV=0, lu, naa */
385 		arr[num++] = 0x0;
386 		arr[num++] = 0x8;
387 		arr[num++] = 0x53;  /* naa-5 ieee company id=0x333333 (fake) */
388 		arr[num++] = 0x33;
389 		arr[num++] = 0x33;
390 		arr[num++] = 0x30;
391 		arr[num++] = (dev_id_num >> 24);
392 		arr[num++] = (dev_id_num >> 16) & 0xff;
393 		arr[num++] = (dev_id_num >> 8) & 0xff;
394 		arr[num++] = dev_id_num & 0xff;
395 		/* Target relative port number */
396 		arr[num++] = 0x61;	/* proto=sas, binary */
397 		arr[num++] = 0x94;	/* PIV=1, target port, rel port */
398 		arr[num++] = 0x0;	/* reserved */
399 		arr[num++] = 0x4;	/* length */
400 		arr[num++] = 0x0;	/* reserved */
401 		arr[num++] = 0x0;	/* reserved */
402 		arr[num++] = 0x0;
403 		arr[num++] = 0x1;	/* relative port A */
404 	}
405 	/* NAA-5, Target port identifier */
406 	arr[num++] = 0x61;	/* proto=sas, binary */
407 	arr[num++] = 0x93;	/* piv=1, target port, naa */
408 	arr[num++] = 0x0;
409 	arr[num++] = 0x8;
410 	arr[num++] = 0x52;	/* naa-5, company id=0x222222 (fake) */
411 	arr[num++] = 0x22;
412 	arr[num++] = 0x22;
413 	arr[num++] = 0x20;
414 	arr[num++] = (port_a >> 24);
415 	arr[num++] = (port_a >> 16) & 0xff;
416 	arr[num++] = (port_a >> 8) & 0xff;
417 	arr[num++] = port_a & 0xff;
418 	/* NAA-5, Target port group identifier */
419 	arr[num++] = 0x61;	/* proto=sas, binary */
420 	arr[num++] = 0x95;	/* piv=1, target port group id */
421 	arr[num++] = 0x0;
422 	arr[num++] = 0x4;
423 	arr[num++] = 0;
424 	arr[num++] = 0;
425 	arr[num++] = (port_group_id >> 8) & 0xff;
426 	arr[num++] = port_group_id & 0xff;
427 	/* NAA-5, Target device identifier */
428 	arr[num++] = 0x61;	/* proto=sas, binary */
429 	arr[num++] = 0xa3;	/* piv=1, target device, naa */
430 	arr[num++] = 0x0;
431 	arr[num++] = 0x8;
432 	arr[num++] = 0x52;	/* naa-5, company id=0x222222 (fake) */
433 	arr[num++] = 0x22;
434 	arr[num++] = 0x22;
435 	arr[num++] = 0x20;
436 	arr[num++] = (target_dev_id >> 24);
437 	arr[num++] = (target_dev_id >> 16) & 0xff;
438 	arr[num++] = (target_dev_id >> 8) & 0xff;
439 	arr[num++] = target_dev_id & 0xff;
440 	/* SCSI name string: Target device identifier */
441 	arr[num++] = 0x63;	/* proto=sas, UTF-8 */
442 	arr[num++] = 0xa8;	/* piv=1, target device, SCSI name string */
443 	arr[num++] = 0x0;
444 	arr[num++] = 24;
445 	memcpy(arr + num, "naa.52222220", 12);
446 	num += 12;
447 	snprintf(b, sizeof(b), "%08X", target_dev_id);
448 	memcpy(arr + num, b, 8);
449 	num += 8;
450 	memset(arr + num, 0, 4);
451 	num += 4;
452 	return num;
453 }
454 
455 
456 static unsigned char vpd84_data[] = {
457 /* from 4th byte */ 0x22,0x22,0x22,0x0,0xbb,0x0,
458     0x22,0x22,0x22,0x0,0xbb,0x1,
459     0x22,0x22,0x22,0x0,0xbb,0x2,
460 };
461 
462 static int inquiry_evpd_84(unsigned char * arr)
463 {
464 	memcpy(arr, vpd84_data, sizeof(vpd84_data));
465 	return sizeof(vpd84_data);
466 }
467 
468 static int inquiry_evpd_85(unsigned char * arr)
469 {
470 	int num = 0;
471 	const char * na1 = "https://www.kernel.org/config";
472 	const char * na2 = "http://www.kernel.org/log";
473 	int plen, olen;
474 
475 	arr[num++] = 0x1;	/* lu, storage config */
476 	arr[num++] = 0x0;	/* reserved */
477 	arr[num++] = 0x0;
478 	olen = strlen(na1);
479 	plen = olen + 1;
480 	if (plen % 4)
481 		plen = ((plen / 4) + 1) * 4;
482 	arr[num++] = plen;	/* length, null termianted, padded */
483 	memcpy(arr + num, na1, olen);
484 	memset(arr + num + olen, 0, plen - olen);
485 	num += plen;
486 
487 	arr[num++] = 0x4;	/* lu, logging */
488 	arr[num++] = 0x0;	/* reserved */
489 	arr[num++] = 0x0;
490 	olen = strlen(na2);
491 	plen = olen + 1;
492 	if (plen % 4)
493 		plen = ((plen / 4) + 1) * 4;
494 	arr[num++] = plen;	/* length, null terminated, padded */
495 	memcpy(arr + num, na2, olen);
496 	memset(arr + num + olen, 0, plen - olen);
497 	num += plen;
498 
499 	return num;
500 }
501 
502 /* SCSI ports VPD page */
503 static int inquiry_evpd_88(unsigned char * arr, int target_dev_id)
504 {
505 	int num = 0;
506 	int port_a, port_b;
507 
508 	port_a = target_dev_id + 1;
509 	port_b = port_a + 1;
510 	arr[num++] = 0x0;	/* reserved */
511 	arr[num++] = 0x0;	/* reserved */
512 	arr[num++] = 0x0;
513 	arr[num++] = 0x1;	/* relative port 1 (primary) */
514 	memset(arr + num, 0, 6);
515 	num += 6;
516 	arr[num++] = 0x0;
517 	arr[num++] = 12;	/* length tp descriptor */
518 	/* naa-5 target port identifier (A) */
519 	arr[num++] = 0x61;	/* proto=sas, binary */
520 	arr[num++] = 0x93;	/* PIV=1, target port, NAA */
521 	arr[num++] = 0x0;	/* reserved */
522 	arr[num++] = 0x8;	/* length */
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++] = (port_a >> 24);
528 	arr[num++] = (port_a >> 16) & 0xff;
529 	arr[num++] = (port_a >> 8) & 0xff;
530 	arr[num++] = port_a & 0xff;
531 
532 	arr[num++] = 0x0;	/* reserved */
533 	arr[num++] = 0x0;	/* reserved */
534 	arr[num++] = 0x0;
535 	arr[num++] = 0x2;	/* relative port 2 (secondary) */
536 	memset(arr + num, 0, 6);
537 	num += 6;
538 	arr[num++] = 0x0;
539 	arr[num++] = 12;	/* length tp descriptor */
540 	/* naa-5 target port identifier (B) */
541 	arr[num++] = 0x61;	/* proto=sas, binary */
542 	arr[num++] = 0x93;	/* PIV=1, target port, NAA */
543 	arr[num++] = 0x0;	/* reserved */
544 	arr[num++] = 0x8;	/* length */
545 	arr[num++] = 0x52;	/* NAA-5, company_id=0x222222 (fake) */
546 	arr[num++] = 0x22;
547 	arr[num++] = 0x22;
548 	arr[num++] = 0x20;
549 	arr[num++] = (port_b >> 24);
550 	arr[num++] = (port_b >> 16) & 0xff;
551 	arr[num++] = (port_b >> 8) & 0xff;
552 	arr[num++] = port_b & 0xff;
553 
554 	return num;
555 }
556 
557 
558 static unsigned char vpd89_data[] = {
559 /* from 4th byte */ 0,0,0,0,
560 'l','i','n','u','x',' ',' ',' ',
561 'S','A','T',' ','s','c','s','i','_','d','e','b','u','g',' ',' ',
562 '1','2','3','4',
563 0x34,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
564 0xec,0,0,0,
565 0x5a,0xc,0xff,0x3f,0x37,0xc8,0x10,0,0,0,0,0,0x3f,0,0,0,
566 0,0,0,0,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x20,0x20,0x20,0x20,
567 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0,0,0,0x40,0x4,0,0x2e,0x33,
568 0x38,0x31,0x20,0x20,0x20,0x20,0x54,0x53,0x38,0x33,0x30,0x30,0x33,0x31,
569 0x53,0x41,
570 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
571 0x20,0x20,
572 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
573 0x10,0x80,
574 0,0,0,0x2f,0,0,0,0x2,0,0x2,0x7,0,0xff,0xff,0x1,0,
575 0x3f,0,0xc1,0xff,0x3e,0,0x10,0x1,0xb0,0xf8,0x50,0x9,0,0,0x7,0,
576 0x3,0,0x78,0,0x78,0,0xf0,0,0x78,0,0,0,0,0,0,0,
577 0,0,0,0,0,0,0,0,0x2,0,0,0,0,0,0,0,
578 0x7e,0,0x1b,0,0x6b,0x34,0x1,0x7d,0x3,0x40,0x69,0x34,0x1,0x3c,0x3,0x40,
579 0x7f,0x40,0,0,0,0,0xfe,0xfe,0,0,0,0,0,0xfe,0,0,
580 0,0,0,0,0,0,0,0,0xb0,0xf8,0x50,0x9,0,0,0,0,
581 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
582 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
583 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
584 0x1,0,0xb0,0xf8,0x50,0x9,0xb0,0xf8,0x50,0x9,0x20,0x20,0x2,0,0xb6,0x42,
585 0,0x80,0x8a,0,0x6,0x3c,0xa,0x3c,0xff,0xff,0xc6,0x7,0,0x1,0,0x8,
586 0xf0,0xf,0,0x10,0x2,0,0x30,0,0,0,0,0,0,0,0x6,0xfe,
587 0,0,0x2,0,0x50,0,0x8a,0,0x4f,0x95,0,0,0x21,0,0xb,0,
588 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
589 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
590 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
591 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
592 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
593 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
594 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
595 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
596 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
597 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
598 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
599 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa5,0x51,
600 };
601 
602 static int inquiry_evpd_89(unsigned char * arr)
603 {
604 	memcpy(arr, vpd89_data, sizeof(vpd89_data));
605 	return sizeof(vpd89_data);
606 }
607 
608 
609 static unsigned char vpdb0_data[] = {
610 	/* from 4th byte */ 0,0,0,4,
611 	0,0,0x4,0,
612 	0,0,0,64,
613 };
614 
615 static int inquiry_evpd_b0(unsigned char * arr)
616 {
617 	memcpy(arr, vpdb0_data, sizeof(vpdb0_data));
618 	if (sdebug_store_sectors > 0x400) {
619 		arr[4] = (sdebug_store_sectors >> 24) & 0xff;
620 		arr[5] = (sdebug_store_sectors >> 16) & 0xff;
621 		arr[6] = (sdebug_store_sectors >> 8) & 0xff;
622 		arr[7] = sdebug_store_sectors & 0xff;
623 	}
624 	return sizeof(vpdb0_data);
625 }
626 
627 
628 #define SDEBUG_LONG_INQ_SZ 96
629 #define SDEBUG_MAX_INQ_ARR_SZ 584
630 
631 static int resp_inquiry(struct scsi_cmnd * scp, int target,
632 			struct sdebug_dev_info * devip)
633 {
634 	unsigned char pq_pdt;
635 	unsigned char * arr;
636 	unsigned char *cmd = (unsigned char *)scp->cmnd;
637 	int alloc_len, n, ret;
638 
639 	alloc_len = (cmd[3] << 8) + cmd[4];
640 	arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_ATOMIC);
641 	if (! arr)
642 		return DID_REQUEUE << 16;
643 	if (devip->wlun)
644 		pq_pdt = 0x1e;	/* present, wlun */
645 	else if (scsi_debug_no_lun_0 && (0 == devip->lun))
646 		pq_pdt = 0x7f;	/* not present, no device type */
647 	else
648 		pq_pdt = (scsi_debug_ptype & 0x1f);
649 	arr[0] = pq_pdt;
650 	if (0x2 & cmd[1]) {  /* CMDDT bit set */
651 		mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
652 			       	0);
653 		kfree(arr);
654 		return check_condition_result;
655 	} else if (0x1 & cmd[1]) {  /* EVPD bit set */
656 		int lu_id_num, port_group_id, target_dev_id, len;
657 		char lu_id_str[6];
658 		int host_no = devip->sdbg_host->shost->host_no;
659 
660 		port_group_id = (((host_no + 1) & 0x7f) << 8) +
661 		    (devip->channel & 0x7f);
662 		if (0 == scsi_debug_vpd_use_hostno)
663 			host_no = 0;
664 		lu_id_num = devip->wlun ? -1 : (((host_no + 1) * 2000) +
665 			    (devip->target * 1000) + devip->lun);
666 		target_dev_id = ((host_no + 1) * 2000) +
667 				 (devip->target * 1000) - 3;
668 		len = scnprintf(lu_id_str, 6, "%d", lu_id_num);
669 		if (0 == cmd[2]) { /* supported vital product data pages */
670 			arr[1] = cmd[2];	/*sanity */
671 			n = 4;
672 			arr[n++] = 0x0;   /* this page */
673 			arr[n++] = 0x80;  /* unit serial number */
674 			arr[n++] = 0x83;  /* device identification */
675 			arr[n++] = 0x84;  /* software interface ident. */
676 			arr[n++] = 0x85;  /* management network addresses */
677 			arr[n++] = 0x86;  /* extended inquiry */
678 			arr[n++] = 0x87;  /* mode page policy */
679 			arr[n++] = 0x88;  /* SCSI ports */
680 			arr[n++] = 0x89;  /* ATA information */
681 			arr[n++] = 0xb0;  /* Block limits (SBC) */
682 			arr[3] = n - 4;	  /* number of supported VPD pages */
683 		} else if (0x80 == cmd[2]) { /* unit serial number */
684 			arr[1] = cmd[2];	/*sanity */
685 			arr[3] = len;
686 			memcpy(&arr[4], lu_id_str, len);
687 		} else if (0x83 == cmd[2]) { /* device identification */
688 			arr[1] = cmd[2];	/*sanity */
689 			arr[3] = inquiry_evpd_83(&arr[4], port_group_id,
690 						 target_dev_id, lu_id_num,
691 						 lu_id_str, len);
692 		} else if (0x84 == cmd[2]) { /* Software interface ident. */
693 			arr[1] = cmd[2];	/*sanity */
694 			arr[3] = inquiry_evpd_84(&arr[4]);
695 		} else if (0x85 == cmd[2]) { /* Management network addresses */
696 			arr[1] = cmd[2];	/*sanity */
697 			arr[3] = inquiry_evpd_85(&arr[4]);
698 		} else if (0x86 == cmd[2]) { /* extended inquiry */
699 			arr[1] = cmd[2];	/*sanity */
700 			arr[3] = 0x3c;	/* number of following entries */
701 			arr[4] = 0x0;   /* no protection stuff */
702 			arr[5] = 0x7;   /* head of q, ordered + simple q's */
703 		} else if (0x87 == cmd[2]) { /* mode page policy */
704 			arr[1] = cmd[2];	/*sanity */
705 			arr[3] = 0x8;	/* number of following entries */
706 			arr[4] = 0x2;	/* disconnect-reconnect mp */
707 			arr[6] = 0x80;	/* mlus, shared */
708 			arr[8] = 0x18;	 /* protocol specific lu */
709 			arr[10] = 0x82;	 /* mlus, per initiator port */
710 		} else if (0x88 == cmd[2]) { /* SCSI Ports */
711 			arr[1] = cmd[2];	/*sanity */
712 			arr[3] = inquiry_evpd_88(&arr[4], target_dev_id);
713 		} else if (0x89 == cmd[2]) { /* ATA information */
714 			arr[1] = cmd[2];        /*sanity */
715 			n = inquiry_evpd_89(&arr[4]);
716 			arr[2] = (n >> 8);
717 			arr[3] = (n & 0xff);
718 		} else if (0xb0 == cmd[2]) { /* Block limits (SBC) */
719 			arr[1] = cmd[2];        /*sanity */
720 			arr[3] = inquiry_evpd_b0(&arr[4]);
721 		} else {
722 			/* Illegal request, invalid field in cdb */
723 			mk_sense_buffer(devip, ILLEGAL_REQUEST,
724 					INVALID_FIELD_IN_CDB, 0);
725 			kfree(arr);
726 			return check_condition_result;
727 		}
728 		len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len);
729 		ret = fill_from_dev_buffer(scp, arr,
730 			    min(len, SDEBUG_MAX_INQ_ARR_SZ));
731 		kfree(arr);
732 		return ret;
733 	}
734 	/* drops through here for a standard inquiry */
735 	arr[1] = DEV_REMOVEABLE(target) ? 0x80 : 0;	/* Removable disk */
736 	arr[2] = scsi_debug_scsi_level;
737 	arr[3] = 2;    /* response_data_format==2 */
738 	arr[4] = SDEBUG_LONG_INQ_SZ - 5;
739 	if (0 == scsi_debug_vpd_use_hostno)
740 		arr[5] = 0x10; /* claim: implicit TGPS */
741 	arr[6] = 0x10; /* claim: MultiP */
742 	/* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */
743 	arr[7] = 0xa; /* claim: LINKED + CMDQUE */
744 	memcpy(&arr[8], inq_vendor_id, 8);
745 	memcpy(&arr[16], inq_product_id, 16);
746 	memcpy(&arr[32], inq_product_rev, 4);
747 	/* version descriptors (2 bytes each) follow */
748 	arr[58] = 0x0; arr[59] = 0x77; /* SAM-3 ANSI */
749 	arr[60] = 0x3; arr[61] = 0x14;  /* SPC-3 ANSI */
750 	n = 62;
751 	if (scsi_debug_ptype == 0) {
752 		arr[n++] = 0x3; arr[n++] = 0x3d; /* SBC-2 ANSI */
753 	} else if (scsi_debug_ptype == 1) {
754 		arr[n++] = 0x3; arr[n++] = 0x60; /* SSC-2 no version */
755 	}
756 	arr[n++] = 0xc; arr[n++] = 0xf;  /* SAS-1.1 rev 10 */
757 	ret = fill_from_dev_buffer(scp, arr,
758 			    min(alloc_len, SDEBUG_LONG_INQ_SZ));
759 	kfree(arr);
760 	return ret;
761 }
762 
763 static int resp_requests(struct scsi_cmnd * scp,
764 			 struct sdebug_dev_info * devip)
765 {
766 	unsigned char * sbuff;
767 	unsigned char *cmd = (unsigned char *)scp->cmnd;
768 	unsigned char arr[SDEBUG_SENSE_LEN];
769 	int want_dsense;
770 	int len = 18;
771 
772 	memset(arr, 0, sizeof(arr));
773 	if (devip->reset == 1)
774 		mk_sense_buffer(devip, 0, NO_ADDITIONAL_SENSE, 0);
775 	want_dsense = !!(cmd[1] & 1) || scsi_debug_dsense;
776 	sbuff = devip->sense_buff;
777 	if ((iec_m_pg[2] & 0x4) && (6 == (iec_m_pg[3] & 0xf))) {
778 		if (want_dsense) {
779 			arr[0] = 0x72;
780 			arr[1] = 0x0;		/* NO_SENSE in sense_key */
781 			arr[2] = THRESHOLD_EXCEEDED;
782 			arr[3] = 0xff;		/* TEST set and MRIE==6 */
783 		} else {
784 			arr[0] = 0x70;
785 			arr[2] = 0x0;		/* NO_SENSE in sense_key */
786 			arr[7] = 0xa;   	/* 18 byte sense buffer */
787 			arr[12] = THRESHOLD_EXCEEDED;
788 			arr[13] = 0xff;		/* TEST set and MRIE==6 */
789 		}
790 	} else {
791 		memcpy(arr, sbuff, SDEBUG_SENSE_LEN);
792 		if ((cmd[1] & 1) && (! scsi_debug_dsense)) {
793 			/* DESC bit set and sense_buff in fixed format */
794 			memset(arr, 0, sizeof(arr));
795 			arr[0] = 0x72;
796 			arr[1] = sbuff[2];     /* sense key */
797 			arr[2] = sbuff[12];    /* asc */
798 			arr[3] = sbuff[13];    /* ascq */
799 			len = 8;
800 		}
801 	}
802 	mk_sense_buffer(devip, 0, NO_ADDITIONAL_SENSE, 0);
803 	return fill_from_dev_buffer(scp, arr, len);
804 }
805 
806 static int resp_start_stop(struct scsi_cmnd * scp,
807 			   struct sdebug_dev_info * devip)
808 {
809 	unsigned char *cmd = (unsigned char *)scp->cmnd;
810 	int power_cond, errsts, start;
811 
812 	if ((errsts = check_readiness(scp, 1, devip)))
813 		return errsts;
814 	power_cond = (cmd[4] & 0xf0) >> 4;
815 	if (power_cond) {
816 		mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
817 			       	0);
818 		return check_condition_result;
819 	}
820 	start = cmd[4] & 1;
821 	if (start == devip->stopped)
822 		devip->stopped = !start;
823 	return 0;
824 }
825 
826 static sector_t get_sdebug_capacity(void)
827 {
828 	if (scsi_debug_virtual_gb > 0)
829 		return 2048 * 1024 * scsi_debug_virtual_gb;
830 	else
831 		return sdebug_store_sectors;
832 }
833 
834 #define SDEBUG_READCAP_ARR_SZ 8
835 static int resp_readcap(struct scsi_cmnd * scp,
836 			struct sdebug_dev_info * devip)
837 {
838 	unsigned char arr[SDEBUG_READCAP_ARR_SZ];
839 	unsigned int capac;
840 	int errsts;
841 
842 	if ((errsts = check_readiness(scp, 1, devip)))
843 		return errsts;
844 	/* following just in case virtual_gb changed */
845 	sdebug_capacity = get_sdebug_capacity();
846 	memset(arr, 0, SDEBUG_READCAP_ARR_SZ);
847 	if (sdebug_capacity < 0xffffffff) {
848 		capac = (unsigned int)sdebug_capacity - 1;
849 		arr[0] = (capac >> 24);
850 		arr[1] = (capac >> 16) & 0xff;
851 		arr[2] = (capac >> 8) & 0xff;
852 		arr[3] = capac & 0xff;
853 	} else {
854 		arr[0] = 0xff;
855 		arr[1] = 0xff;
856 		arr[2] = 0xff;
857 		arr[3] = 0xff;
858 	}
859 	arr[6] = (SECT_SIZE_PER(target) >> 8) & 0xff;
860 	arr[7] = SECT_SIZE_PER(target) & 0xff;
861 	return fill_from_dev_buffer(scp, arr, SDEBUG_READCAP_ARR_SZ);
862 }
863 
864 #define SDEBUG_READCAP16_ARR_SZ 32
865 static int resp_readcap16(struct scsi_cmnd * scp,
866 			  struct sdebug_dev_info * devip)
867 {
868 	unsigned char *cmd = (unsigned char *)scp->cmnd;
869 	unsigned char arr[SDEBUG_READCAP16_ARR_SZ];
870 	unsigned long long capac;
871 	int errsts, k, alloc_len;
872 
873 	if ((errsts = check_readiness(scp, 1, devip)))
874 		return errsts;
875 	alloc_len = ((cmd[10] << 24) + (cmd[11] << 16) + (cmd[12] << 8)
876 		     + cmd[13]);
877 	/* following just in case virtual_gb changed */
878 	sdebug_capacity = get_sdebug_capacity();
879 	memset(arr, 0, SDEBUG_READCAP16_ARR_SZ);
880 	capac = sdebug_capacity - 1;
881 	for (k = 0; k < 8; ++k, capac >>= 8)
882 		arr[7 - k] = capac & 0xff;
883 	arr[8] = (SECT_SIZE_PER(target) >> 24) & 0xff;
884 	arr[9] = (SECT_SIZE_PER(target) >> 16) & 0xff;
885 	arr[10] = (SECT_SIZE_PER(target) >> 8) & 0xff;
886 	arr[11] = SECT_SIZE_PER(target) & 0xff;
887 	return fill_from_dev_buffer(scp, arr,
888 				    min(alloc_len, SDEBUG_READCAP16_ARR_SZ));
889 }
890 
891 #define SDEBUG_MAX_TGTPGS_ARR_SZ 1412
892 
893 static int resp_report_tgtpgs(struct scsi_cmnd * scp,
894 			      struct sdebug_dev_info * devip)
895 {
896 	unsigned char *cmd = (unsigned char *)scp->cmnd;
897 	unsigned char * arr;
898 	int host_no = devip->sdbg_host->shost->host_no;
899 	int n, ret, alen, rlen;
900 	int port_group_a, port_group_b, port_a, port_b;
901 
902 	alen = ((cmd[6] << 24) + (cmd[7] << 16) + (cmd[8] << 8)
903 		+ cmd[9]);
904 
905 	arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_ATOMIC);
906 	if (! arr)
907 		return DID_REQUEUE << 16;
908 	/*
909 	 * EVPD page 0x88 states we have two ports, one
910 	 * real and a fake port with no device connected.
911 	 * So we create two port groups with one port each
912 	 * and set the group with port B to unavailable.
913 	 */
914 	port_a = 0x1; /* relative port A */
915 	port_b = 0x2; /* relative port B */
916 	port_group_a = (((host_no + 1) & 0x7f) << 8) +
917 	    (devip->channel & 0x7f);
918 	port_group_b = (((host_no + 1) & 0x7f) << 8) +
919 	    (devip->channel & 0x7f) + 0x80;
920 
921 	/*
922 	 * The asymmetric access state is cycled according to the host_id.
923 	 */
924 	n = 4;
925 	if (0 == scsi_debug_vpd_use_hostno) {
926 	    arr[n++] = host_no % 3; /* Asymm access state */
927 	    arr[n++] = 0x0F; /* claim: all states are supported */
928 	} else {
929 	    arr[n++] = 0x0; /* Active/Optimized path */
930 	    arr[n++] = 0x01; /* claim: only support active/optimized paths */
931 	}
932 	arr[n++] = (port_group_a >> 8) & 0xff;
933 	arr[n++] = port_group_a & 0xff;
934 	arr[n++] = 0;    /* Reserved */
935 	arr[n++] = 0;    /* Status code */
936 	arr[n++] = 0;    /* Vendor unique */
937 	arr[n++] = 0x1;  /* One port per group */
938 	arr[n++] = 0;    /* Reserved */
939 	arr[n++] = 0;    /* Reserved */
940 	arr[n++] = (port_a >> 8) & 0xff;
941 	arr[n++] = port_a & 0xff;
942 	arr[n++] = 3;    /* Port unavailable */
943 	arr[n++] = 0x08; /* claim: only unavailalbe paths are supported */
944 	arr[n++] = (port_group_b >> 8) & 0xff;
945 	arr[n++] = port_group_b & 0xff;
946 	arr[n++] = 0;    /* Reserved */
947 	arr[n++] = 0;    /* Status code */
948 	arr[n++] = 0;    /* Vendor unique */
949 	arr[n++] = 0x1;  /* One port per group */
950 	arr[n++] = 0;    /* Reserved */
951 	arr[n++] = 0;    /* Reserved */
952 	arr[n++] = (port_b >> 8) & 0xff;
953 	arr[n++] = port_b & 0xff;
954 
955 	rlen = n - 4;
956 	arr[0] = (rlen >> 24) & 0xff;
957 	arr[1] = (rlen >> 16) & 0xff;
958 	arr[2] = (rlen >> 8) & 0xff;
959 	arr[3] = rlen & 0xff;
960 
961 	/*
962 	 * Return the smallest value of either
963 	 * - The allocated length
964 	 * - The constructed command length
965 	 * - The maximum array size
966 	 */
967 	rlen = min(alen,n);
968 	ret = fill_from_dev_buffer(scp, arr,
969 				   min(rlen, SDEBUG_MAX_TGTPGS_ARR_SZ));
970 	kfree(arr);
971 	return ret;
972 }
973 
974 /* <<Following mode page info copied from ST318451LW>> */
975 
976 static int resp_err_recov_pg(unsigned char * p, int pcontrol, int target)
977 {	/* Read-Write Error Recovery page for mode_sense */
978 	unsigned char err_recov_pg[] = {0x1, 0xa, 0xc0, 11, 240, 0, 0, 0,
979 					5, 0, 0xff, 0xff};
980 
981 	memcpy(p, err_recov_pg, sizeof(err_recov_pg));
982 	if (1 == pcontrol)
983 		memset(p + 2, 0, sizeof(err_recov_pg) - 2);
984 	return sizeof(err_recov_pg);
985 }
986 
987 static int resp_disconnect_pg(unsigned char * p, int pcontrol, int target)
988 { 	/* Disconnect-Reconnect page for mode_sense */
989 	unsigned char disconnect_pg[] = {0x2, 0xe, 128, 128, 0, 10, 0, 0,
990 					 0, 0, 0, 0, 0, 0, 0, 0};
991 
992 	memcpy(p, disconnect_pg, sizeof(disconnect_pg));
993 	if (1 == pcontrol)
994 		memset(p + 2, 0, sizeof(disconnect_pg) - 2);
995 	return sizeof(disconnect_pg);
996 }
997 
998 static int resp_format_pg(unsigned char * p, int pcontrol, int target)
999 {       /* Format device page for mode_sense */
1000         unsigned char format_pg[] = {0x3, 0x16, 0, 0, 0, 0, 0, 0,
1001                                      0, 0, 0, 0, 0, 0, 0, 0,
1002                                      0, 0, 0, 0, 0x40, 0, 0, 0};
1003 
1004         memcpy(p, format_pg, sizeof(format_pg));
1005         p[10] = (sdebug_sectors_per >> 8) & 0xff;
1006         p[11] = sdebug_sectors_per & 0xff;
1007         p[12] = (SECT_SIZE >> 8) & 0xff;
1008         p[13] = SECT_SIZE & 0xff;
1009         if (DEV_REMOVEABLE(target))
1010                 p[20] |= 0x20; /* should agree with INQUIRY */
1011         if (1 == pcontrol)
1012                 memset(p + 2, 0, sizeof(format_pg) - 2);
1013         return sizeof(format_pg);
1014 }
1015 
1016 static int resp_caching_pg(unsigned char * p, int pcontrol, int target)
1017 { 	/* Caching page for mode_sense */
1018 	unsigned char caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
1019 		0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0,     0, 0, 0, 0};
1020 
1021 	memcpy(p, caching_pg, sizeof(caching_pg));
1022 	if (1 == pcontrol)
1023 		memset(p + 2, 0, sizeof(caching_pg) - 2);
1024 	return sizeof(caching_pg);
1025 }
1026 
1027 static int resp_ctrl_m_pg(unsigned char * p, int pcontrol, int target)
1028 { 	/* Control mode page for mode_sense */
1029 	unsigned char ch_ctrl_m_pg[] = {/* 0xa, 10, */ 0x6, 0, 0, 0, 0, 0,
1030 				        0, 0, 0, 0};
1031 	unsigned char d_ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
1032 				     0, 0, 0x2, 0x4b};
1033 
1034 	if (scsi_debug_dsense)
1035 		ctrl_m_pg[2] |= 0x4;
1036 	else
1037 		ctrl_m_pg[2] &= ~0x4;
1038 	memcpy(p, ctrl_m_pg, sizeof(ctrl_m_pg));
1039 	if (1 == pcontrol)
1040 		memcpy(p + 2, ch_ctrl_m_pg, sizeof(ch_ctrl_m_pg));
1041 	else if (2 == pcontrol)
1042 		memcpy(p, d_ctrl_m_pg, sizeof(d_ctrl_m_pg));
1043 	return sizeof(ctrl_m_pg);
1044 }
1045 
1046 
1047 static int resp_iec_m_pg(unsigned char * p, int pcontrol, int target)
1048 {	/* Informational Exceptions control mode page for mode_sense */
1049 	unsigned char ch_iec_m_pg[] = {/* 0x1c, 0xa, */ 0x4, 0xf, 0, 0, 0, 0,
1050 				       0, 0, 0x0, 0x0};
1051 	unsigned char d_iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
1052 				      0, 0, 0x0, 0x0};
1053 
1054 	memcpy(p, iec_m_pg, sizeof(iec_m_pg));
1055 	if (1 == pcontrol)
1056 		memcpy(p + 2, ch_iec_m_pg, sizeof(ch_iec_m_pg));
1057 	else if (2 == pcontrol)
1058 		memcpy(p, d_iec_m_pg, sizeof(d_iec_m_pg));
1059 	return sizeof(iec_m_pg);
1060 }
1061 
1062 static int resp_sas_sf_m_pg(unsigned char * p, int pcontrol, int target)
1063 {	/* SAS SSP mode page - short format for mode_sense */
1064 	unsigned char sas_sf_m_pg[] = {0x19, 0x6,
1065 		0x6, 0x0, 0x7, 0xd0, 0x0, 0x0};
1066 
1067 	memcpy(p, sas_sf_m_pg, sizeof(sas_sf_m_pg));
1068 	if (1 == pcontrol)
1069 		memset(p + 2, 0, sizeof(sas_sf_m_pg) - 2);
1070 	return sizeof(sas_sf_m_pg);
1071 }
1072 
1073 
1074 static int resp_sas_pcd_m_spg(unsigned char * p, int pcontrol, int target,
1075 			      int target_dev_id)
1076 {	/* SAS phy control and discover mode page for mode_sense */
1077 	unsigned char sas_pcd_m_pg[] = {0x59, 0x1, 0, 0x64, 0, 0x6, 0, 2,
1078 		    0, 0, 0, 0, 0x10, 0x9, 0x8, 0x0,
1079 		    0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0,
1080 		    0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1,
1081 		    0x2, 0, 0, 0, 0, 0, 0, 0,
1082 		    0x88, 0x99, 0, 0, 0, 0, 0, 0,
1083 		    0, 0, 0, 0, 0, 0, 0, 0,
1084 		    0, 1, 0, 0, 0x10, 0x9, 0x8, 0x0,
1085 		    0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0,
1086 		    0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1,
1087 		    0x3, 0, 0, 0, 0, 0, 0, 0,
1088 		    0x88, 0x99, 0, 0, 0, 0, 0, 0,
1089 		    0, 0, 0, 0, 0, 0, 0, 0,
1090 		};
1091 	int port_a, port_b;
1092 
1093 	port_a = target_dev_id + 1;
1094 	port_b = port_a + 1;
1095 	memcpy(p, sas_pcd_m_pg, sizeof(sas_pcd_m_pg));
1096 	p[20] = (port_a >> 24);
1097 	p[21] = (port_a >> 16) & 0xff;
1098 	p[22] = (port_a >> 8) & 0xff;
1099 	p[23] = port_a & 0xff;
1100 	p[48 + 20] = (port_b >> 24);
1101 	p[48 + 21] = (port_b >> 16) & 0xff;
1102 	p[48 + 22] = (port_b >> 8) & 0xff;
1103 	p[48 + 23] = port_b & 0xff;
1104 	if (1 == pcontrol)
1105 		memset(p + 4, 0, sizeof(sas_pcd_m_pg) - 4);
1106 	return sizeof(sas_pcd_m_pg);
1107 }
1108 
1109 static int resp_sas_sha_m_spg(unsigned char * p, int pcontrol)
1110 {	/* SAS SSP shared protocol specific port mode subpage */
1111 	unsigned char sas_sha_m_pg[] = {0x59, 0x2, 0, 0xc, 0, 0x6, 0x10, 0,
1112 		    0, 0, 0, 0, 0, 0, 0, 0,
1113 		};
1114 
1115 	memcpy(p, sas_sha_m_pg, sizeof(sas_sha_m_pg));
1116 	if (1 == pcontrol)
1117 		memset(p + 4, 0, sizeof(sas_sha_m_pg) - 4);
1118 	return sizeof(sas_sha_m_pg);
1119 }
1120 
1121 #define SDEBUG_MAX_MSENSE_SZ 256
1122 
1123 static int resp_mode_sense(struct scsi_cmnd * scp, int target,
1124 			   struct sdebug_dev_info * devip)
1125 {
1126 	unsigned char dbd, llbaa;
1127 	int pcontrol, pcode, subpcode, bd_len;
1128 	unsigned char dev_spec;
1129 	int k, alloc_len, msense_6, offset, len, errsts, target_dev_id;
1130 	unsigned char * ap;
1131 	unsigned char arr[SDEBUG_MAX_MSENSE_SZ];
1132 	unsigned char *cmd = (unsigned char *)scp->cmnd;
1133 
1134 	if ((errsts = check_readiness(scp, 1, devip)))
1135 		return errsts;
1136 	dbd = !!(cmd[1] & 0x8);
1137 	pcontrol = (cmd[2] & 0xc0) >> 6;
1138 	pcode = cmd[2] & 0x3f;
1139 	subpcode = cmd[3];
1140 	msense_6 = (MODE_SENSE == cmd[0]);
1141 	llbaa = msense_6 ? 0 : !!(cmd[1] & 0x10);
1142 	if ((0 == scsi_debug_ptype) && (0 == dbd))
1143 		bd_len = llbaa ? 16 : 8;
1144 	else
1145 		bd_len = 0;
1146 	alloc_len = msense_6 ? cmd[4] : ((cmd[7] << 8) | cmd[8]);
1147 	memset(arr, 0, SDEBUG_MAX_MSENSE_SZ);
1148 	if (0x3 == pcontrol) {  /* Saving values not supported */
1149 		mk_sense_buffer(devip, ILLEGAL_REQUEST, SAVING_PARAMS_UNSUP,
1150 			       	0);
1151 		return check_condition_result;
1152 	}
1153 	target_dev_id = ((devip->sdbg_host->shost->host_no + 1) * 2000) +
1154 			(devip->target * 1000) - 3;
1155 	/* set DPOFUA bit for disks */
1156 	if (0 == scsi_debug_ptype)
1157 		dev_spec = (DEV_READONLY(target) ? 0x80 : 0x0) | 0x10;
1158 	else
1159 		dev_spec = 0x0;
1160 	if (msense_6) {
1161 		arr[2] = dev_spec;
1162 		arr[3] = bd_len;
1163 		offset = 4;
1164 	} else {
1165 		arr[3] = dev_spec;
1166 		if (16 == bd_len)
1167 			arr[4] = 0x1;	/* set LONGLBA bit */
1168 		arr[7] = bd_len;	/* assume 255 or less */
1169 		offset = 8;
1170 	}
1171 	ap = arr + offset;
1172 	if ((bd_len > 0) && (!sdebug_capacity))
1173 		sdebug_capacity = get_sdebug_capacity();
1174 
1175 	if (8 == bd_len) {
1176 		if (sdebug_capacity > 0xfffffffe) {
1177 			ap[0] = 0xff;
1178 			ap[1] = 0xff;
1179 			ap[2] = 0xff;
1180 			ap[3] = 0xff;
1181 		} else {
1182 			ap[0] = (sdebug_capacity >> 24) & 0xff;
1183 			ap[1] = (sdebug_capacity >> 16) & 0xff;
1184 			ap[2] = (sdebug_capacity >> 8) & 0xff;
1185 			ap[3] = sdebug_capacity & 0xff;
1186 		}
1187         	ap[6] = (SECT_SIZE_PER(target) >> 8) & 0xff;
1188         	ap[7] = SECT_SIZE_PER(target) & 0xff;
1189 		offset += bd_len;
1190 		ap = arr + offset;
1191 	} else if (16 == bd_len) {
1192 		unsigned long long capac = sdebug_capacity;
1193 
1194         	for (k = 0; k < 8; ++k, capac >>= 8)
1195                 	ap[7 - k] = capac & 0xff;
1196         	ap[12] = (SECT_SIZE_PER(target) >> 24) & 0xff;
1197         	ap[13] = (SECT_SIZE_PER(target) >> 16) & 0xff;
1198         	ap[14] = (SECT_SIZE_PER(target) >> 8) & 0xff;
1199         	ap[15] = SECT_SIZE_PER(target) & 0xff;
1200 		offset += bd_len;
1201 		ap = arr + offset;
1202 	}
1203 
1204 	if ((subpcode > 0x0) && (subpcode < 0xff) && (0x19 != pcode)) {
1205 		/* TODO: Control Extension page */
1206 		mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1207 			       	0);
1208 		return check_condition_result;
1209 	}
1210 	switch (pcode) {
1211 	case 0x1:	/* Read-Write error recovery page, direct access */
1212 		len = resp_err_recov_pg(ap, pcontrol, target);
1213 		offset += len;
1214 		break;
1215 	case 0x2:	/* Disconnect-Reconnect page, all devices */
1216 		len = resp_disconnect_pg(ap, pcontrol, target);
1217 		offset += len;
1218 		break;
1219         case 0x3:       /* Format device page, direct access */
1220                 len = resp_format_pg(ap, pcontrol, target);
1221                 offset += len;
1222                 break;
1223 	case 0x8:	/* Caching page, direct access */
1224 		len = resp_caching_pg(ap, pcontrol, target);
1225 		offset += len;
1226 		break;
1227 	case 0xa:	/* Control Mode page, all devices */
1228 		len = resp_ctrl_m_pg(ap, pcontrol, target);
1229 		offset += len;
1230 		break;
1231 	case 0x19:	/* if spc==1 then sas phy, control+discover */
1232 		if ((subpcode > 0x2) && (subpcode < 0xff)) {
1233 		        mk_sense_buffer(devip, ILLEGAL_REQUEST,
1234 					INVALID_FIELD_IN_CDB, 0);
1235 			return check_condition_result;
1236 	        }
1237 		len = 0;
1238 		if ((0x0 == subpcode) || (0xff == subpcode))
1239 			len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
1240 		if ((0x1 == subpcode) || (0xff == subpcode))
1241 			len += resp_sas_pcd_m_spg(ap + len, pcontrol, target,
1242 						  target_dev_id);
1243 		if ((0x2 == subpcode) || (0xff == subpcode))
1244 			len += resp_sas_sha_m_spg(ap + len, pcontrol);
1245 		offset += len;
1246 		break;
1247 	case 0x1c:	/* Informational Exceptions Mode page, all devices */
1248 		len = resp_iec_m_pg(ap, pcontrol, target);
1249 		offset += len;
1250 		break;
1251 	case 0x3f:	/* Read all Mode pages */
1252 		if ((0 == subpcode) || (0xff == subpcode)) {
1253 			len = resp_err_recov_pg(ap, pcontrol, target);
1254 			len += resp_disconnect_pg(ap + len, pcontrol, target);
1255 			len += resp_format_pg(ap + len, pcontrol, target);
1256 			len += resp_caching_pg(ap + len, pcontrol, target);
1257 			len += resp_ctrl_m_pg(ap + len, pcontrol, target);
1258 			len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
1259 			if (0xff == subpcode) {
1260 				len += resp_sas_pcd_m_spg(ap + len, pcontrol,
1261 						  target, target_dev_id);
1262 				len += resp_sas_sha_m_spg(ap + len, pcontrol);
1263 			}
1264 			len += resp_iec_m_pg(ap + len, pcontrol, target);
1265 		} else {
1266 			mk_sense_buffer(devip, ILLEGAL_REQUEST,
1267 					INVALID_FIELD_IN_CDB, 0);
1268 			return check_condition_result;
1269                 }
1270 		offset += len;
1271 		break;
1272 	default:
1273 		mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1274 			       	0);
1275 		return check_condition_result;
1276 	}
1277 	if (msense_6)
1278 		arr[0] = offset - 1;
1279 	else {
1280 		arr[0] = ((offset - 2) >> 8) & 0xff;
1281 		arr[1] = (offset - 2) & 0xff;
1282 	}
1283 	return fill_from_dev_buffer(scp, arr, min(alloc_len, offset));
1284 }
1285 
1286 #define SDEBUG_MAX_MSELECT_SZ 512
1287 
1288 static int resp_mode_select(struct scsi_cmnd * scp, int mselect6,
1289 			    struct sdebug_dev_info * devip)
1290 {
1291 	int pf, sp, ps, md_len, bd_len, off, spf, pg_len;
1292 	int param_len, res, errsts, mpage;
1293 	unsigned char arr[SDEBUG_MAX_MSELECT_SZ];
1294 	unsigned char *cmd = (unsigned char *)scp->cmnd;
1295 
1296 	if ((errsts = check_readiness(scp, 1, devip)))
1297 		return errsts;
1298 	memset(arr, 0, sizeof(arr));
1299 	pf = cmd[1] & 0x10;
1300 	sp = cmd[1] & 0x1;
1301 	param_len = mselect6 ? cmd[4] : ((cmd[7] << 8) + cmd[8]);
1302 	if ((0 == pf) || sp || (param_len > SDEBUG_MAX_MSELECT_SZ)) {
1303 		mk_sense_buffer(devip, ILLEGAL_REQUEST,
1304 				INVALID_FIELD_IN_CDB, 0);
1305 		return check_condition_result;
1306 	}
1307         res = fetch_to_dev_buffer(scp, arr, param_len);
1308         if (-1 == res)
1309                 return (DID_ERROR << 16);
1310         else if ((res < param_len) &&
1311                  (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
1312                 printk(KERN_INFO "scsi_debug: mode_select: cdb indicated=%d, "
1313                        " IO sent=%d bytes\n", param_len, res);
1314 	md_len = mselect6 ? (arr[0] + 1) : ((arr[0] << 8) + arr[1] + 2);
1315 	bd_len = mselect6 ? arr[3] : ((arr[6] << 8) + arr[7]);
1316 	if (md_len > 2) {
1317 		mk_sense_buffer(devip, ILLEGAL_REQUEST,
1318 				INVALID_FIELD_IN_PARAM_LIST, 0);
1319 		return check_condition_result;
1320 	}
1321 	off = bd_len + (mselect6 ? 4 : 8);
1322 	mpage = arr[off] & 0x3f;
1323 	ps = !!(arr[off] & 0x80);
1324 	if (ps) {
1325 		mk_sense_buffer(devip, ILLEGAL_REQUEST,
1326 				INVALID_FIELD_IN_PARAM_LIST, 0);
1327 		return check_condition_result;
1328 	}
1329 	spf = !!(arr[off] & 0x40);
1330 	pg_len = spf ? ((arr[off + 2] << 8) + arr[off + 3] + 4) :
1331 		       (arr[off + 1] + 2);
1332 	if ((pg_len + off) > param_len) {
1333 		mk_sense_buffer(devip, ILLEGAL_REQUEST,
1334 				PARAMETER_LIST_LENGTH_ERR, 0);
1335 		return check_condition_result;
1336 	}
1337 	switch (mpage) {
1338 	case 0xa:      /* Control Mode page */
1339 		if (ctrl_m_pg[1] == arr[off + 1]) {
1340 			memcpy(ctrl_m_pg + 2, arr + off + 2,
1341 			       sizeof(ctrl_m_pg) - 2);
1342 			scsi_debug_dsense = !!(ctrl_m_pg[2] & 0x4);
1343 			return 0;
1344 		}
1345 		break;
1346 	case 0x1c:      /* Informational Exceptions Mode page */
1347 		if (iec_m_pg[1] == arr[off + 1]) {
1348 			memcpy(iec_m_pg + 2, arr + off + 2,
1349 			       sizeof(iec_m_pg) - 2);
1350 			return 0;
1351 		}
1352 		break;
1353 	default:
1354 		break;
1355 	}
1356 	mk_sense_buffer(devip, ILLEGAL_REQUEST,
1357 			INVALID_FIELD_IN_PARAM_LIST, 0);
1358 	return check_condition_result;
1359 }
1360 
1361 static int resp_temp_l_pg(unsigned char * arr)
1362 {
1363 	unsigned char temp_l_pg[] = {0x0, 0x0, 0x3, 0x2, 0x0, 38,
1364 				     0x0, 0x1, 0x3, 0x2, 0x0, 65,
1365 		};
1366 
1367         memcpy(arr, temp_l_pg, sizeof(temp_l_pg));
1368         return sizeof(temp_l_pg);
1369 }
1370 
1371 static int resp_ie_l_pg(unsigned char * arr)
1372 {
1373 	unsigned char ie_l_pg[] = {0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 38,
1374 		};
1375 
1376         memcpy(arr, ie_l_pg, sizeof(ie_l_pg));
1377 	if (iec_m_pg[2] & 0x4) {	/* TEST bit set */
1378 		arr[4] = THRESHOLD_EXCEEDED;
1379 		arr[5] = 0xff;
1380 	}
1381         return sizeof(ie_l_pg);
1382 }
1383 
1384 #define SDEBUG_MAX_LSENSE_SZ 512
1385 
1386 static int resp_log_sense(struct scsi_cmnd * scp,
1387                           struct sdebug_dev_info * devip)
1388 {
1389 	int ppc, sp, pcontrol, pcode, subpcode, alloc_len, errsts, len, n;
1390 	unsigned char arr[SDEBUG_MAX_LSENSE_SZ];
1391 	unsigned char *cmd = (unsigned char *)scp->cmnd;
1392 
1393 	if ((errsts = check_readiness(scp, 1, devip)))
1394 		return errsts;
1395 	memset(arr, 0, sizeof(arr));
1396 	ppc = cmd[1] & 0x2;
1397 	sp = cmd[1] & 0x1;
1398 	if (ppc || sp) {
1399 		mk_sense_buffer(devip, ILLEGAL_REQUEST,
1400 				INVALID_FIELD_IN_CDB, 0);
1401 		return check_condition_result;
1402 	}
1403 	pcontrol = (cmd[2] & 0xc0) >> 6;
1404 	pcode = cmd[2] & 0x3f;
1405 	subpcode = cmd[3] & 0xff;
1406 	alloc_len = (cmd[7] << 8) + cmd[8];
1407 	arr[0] = pcode;
1408 	if (0 == subpcode) {
1409 		switch (pcode) {
1410 		case 0x0:	/* Supported log pages log page */
1411 			n = 4;
1412 			arr[n++] = 0x0;		/* this page */
1413 			arr[n++] = 0xd;		/* Temperature */
1414 			arr[n++] = 0x2f;	/* Informational exceptions */
1415 			arr[3] = n - 4;
1416 			break;
1417 		case 0xd:	/* Temperature log page */
1418 			arr[3] = resp_temp_l_pg(arr + 4);
1419 			break;
1420 		case 0x2f:	/* Informational exceptions log page */
1421 			arr[3] = resp_ie_l_pg(arr + 4);
1422 			break;
1423 		default:
1424 			mk_sense_buffer(devip, ILLEGAL_REQUEST,
1425 					INVALID_FIELD_IN_CDB, 0);
1426 			return check_condition_result;
1427 		}
1428 	} else if (0xff == subpcode) {
1429 		arr[0] |= 0x40;
1430 		arr[1] = subpcode;
1431 		switch (pcode) {
1432 		case 0x0:	/* Supported log pages and subpages log page */
1433 			n = 4;
1434 			arr[n++] = 0x0;
1435 			arr[n++] = 0x0;		/* 0,0 page */
1436 			arr[n++] = 0x0;
1437 			arr[n++] = 0xff;	/* this page */
1438 			arr[n++] = 0xd;
1439 			arr[n++] = 0x0;		/* Temperature */
1440 			arr[n++] = 0x2f;
1441 			arr[n++] = 0x0;	/* Informational exceptions */
1442 			arr[3] = n - 4;
1443 			break;
1444 		case 0xd:	/* Temperature subpages */
1445 			n = 4;
1446 			arr[n++] = 0xd;
1447 			arr[n++] = 0x0;		/* Temperature */
1448 			arr[3] = n - 4;
1449 			break;
1450 		case 0x2f:	/* Informational exceptions subpages */
1451 			n = 4;
1452 			arr[n++] = 0x2f;
1453 			arr[n++] = 0x0;		/* Informational exceptions */
1454 			arr[3] = n - 4;
1455 			break;
1456 		default:
1457 			mk_sense_buffer(devip, ILLEGAL_REQUEST,
1458 					INVALID_FIELD_IN_CDB, 0);
1459 			return check_condition_result;
1460 		}
1461 	} else {
1462 		mk_sense_buffer(devip, ILLEGAL_REQUEST,
1463 				INVALID_FIELD_IN_CDB, 0);
1464 		return check_condition_result;
1465 	}
1466 	len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len);
1467 	return fill_from_dev_buffer(scp, arr,
1468 		    min(len, SDEBUG_MAX_INQ_ARR_SZ));
1469 }
1470 
1471 static int resp_read(struct scsi_cmnd * SCpnt, unsigned long long lba,
1472 		     unsigned int num, struct sdebug_dev_info * devip)
1473 {
1474 	unsigned long iflags;
1475 	unsigned int block, from_bottom;
1476 	unsigned long long u;
1477 	int ret;
1478 
1479 	if (lba + num > sdebug_capacity) {
1480 		mk_sense_buffer(devip, ILLEGAL_REQUEST, ADDR_OUT_OF_RANGE,
1481 				0);
1482 		return check_condition_result;
1483 	}
1484 	/* transfer length excessive (tie in to block limits VPD page) */
1485 	if (num > sdebug_store_sectors) {
1486 		mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1487 				0);
1488 		return check_condition_result;
1489 	}
1490 	if ((SCSI_DEBUG_OPT_MEDIUM_ERR & scsi_debug_opts) &&
1491 	    (lba <= OPT_MEDIUM_ERR_ADDR) &&
1492 	    ((lba + num) > OPT_MEDIUM_ERR_ADDR)) {
1493 		/* claim unrecoverable read error */
1494 		mk_sense_buffer(devip, MEDIUM_ERROR, UNRECOVERED_READ_ERR,
1495 				0);
1496 		/* set info field and valid bit for fixed descriptor */
1497 		if (0x70 == (devip->sense_buff[0] & 0x7f)) {
1498 			devip->sense_buff[0] |= 0x80;	/* Valid bit */
1499 			ret = OPT_MEDIUM_ERR_ADDR;
1500 			devip->sense_buff[3] = (ret >> 24) & 0xff;
1501 			devip->sense_buff[4] = (ret >> 16) & 0xff;
1502 			devip->sense_buff[5] = (ret >> 8) & 0xff;
1503 			devip->sense_buff[6] = ret & 0xff;
1504 		}
1505 		return check_condition_result;
1506 	}
1507 	read_lock_irqsave(&atomic_rw, iflags);
1508 	if ((lba + num) <= sdebug_store_sectors)
1509 		ret = fill_from_dev_buffer(SCpnt,
1510 					   fake_storep + (lba * SECT_SIZE),
1511 			   		   num * SECT_SIZE);
1512 	else {
1513 		/* modulo when one arg is 64 bits needs do_div() */
1514 		u = lba;
1515 		block = do_div(u, sdebug_store_sectors);
1516 		from_bottom = 0;
1517 		if ((block + num) > sdebug_store_sectors)
1518 			from_bottom = (block + num) - sdebug_store_sectors;
1519 		ret = fill_from_dev_buffer(SCpnt,
1520 					   fake_storep + (block * SECT_SIZE),
1521 			   		   (num - from_bottom) * SECT_SIZE);
1522 		if ((0 == ret) && (from_bottom > 0))
1523 			ret = fill_from_dev_buffer(SCpnt, fake_storep,
1524 						   from_bottom * SECT_SIZE);
1525 	}
1526 	read_unlock_irqrestore(&atomic_rw, iflags);
1527 	return ret;
1528 }
1529 
1530 static int resp_write(struct scsi_cmnd * SCpnt, unsigned long long lba,
1531 		      unsigned int num, struct sdebug_dev_info * devip)
1532 {
1533 	unsigned long iflags;
1534 	unsigned int block, to_bottom;
1535 	unsigned long long u;
1536 	int res;
1537 
1538 	if (lba + num > sdebug_capacity) {
1539 		mk_sense_buffer(devip, ILLEGAL_REQUEST, ADDR_OUT_OF_RANGE,
1540 			       	0);
1541 		return check_condition_result;
1542 	}
1543 	/* transfer length excessive (tie in to block limits VPD page) */
1544 	if (num > sdebug_store_sectors) {
1545 		mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1546 				0);
1547 		return check_condition_result;
1548 	}
1549 
1550 	write_lock_irqsave(&atomic_rw, iflags);
1551 	if ((lba + num) <= sdebug_store_sectors)
1552 		res = fetch_to_dev_buffer(SCpnt,
1553 					  fake_storep + (lba * SECT_SIZE),
1554 			   		  num * SECT_SIZE);
1555 	else {
1556 		/* modulo when one arg is 64 bits needs do_div() */
1557 		u = lba;
1558 		block = do_div(u, sdebug_store_sectors);
1559 		to_bottom = 0;
1560 		if ((block + num) > sdebug_store_sectors)
1561 			to_bottom = (block + num) - sdebug_store_sectors;
1562 		res = fetch_to_dev_buffer(SCpnt,
1563 					  fake_storep + (block * SECT_SIZE),
1564 			   		  (num - to_bottom) * SECT_SIZE);
1565 		if ((0 == res) && (to_bottom > 0))
1566 			res = fetch_to_dev_buffer(SCpnt, fake_storep,
1567 						  to_bottom * SECT_SIZE);
1568 	}
1569 	write_unlock_irqrestore(&atomic_rw, iflags);
1570 	if (-1 == res)
1571 		return (DID_ERROR << 16);
1572 	else if ((res < (num * SECT_SIZE)) &&
1573 		 (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
1574 		printk(KERN_INFO "scsi_debug: write: cdb indicated=%u, "
1575 		       " IO sent=%d bytes\n", num * SECT_SIZE, res);
1576 	return 0;
1577 }
1578 
1579 #define SDEBUG_RLUN_ARR_SZ 256
1580 
1581 static int resp_report_luns(struct scsi_cmnd * scp,
1582 			    struct sdebug_dev_info * devip)
1583 {
1584 	unsigned int alloc_len;
1585 	int lun_cnt, i, upper, num, n, wlun, lun;
1586 	unsigned char *cmd = (unsigned char *)scp->cmnd;
1587 	int select_report = (int)cmd[2];
1588 	struct scsi_lun *one_lun;
1589 	unsigned char arr[SDEBUG_RLUN_ARR_SZ];
1590 	unsigned char * max_addr;
1591 
1592 	alloc_len = cmd[9] + (cmd[8] << 8) + (cmd[7] << 16) + (cmd[6] << 24);
1593 	if ((alloc_len < 4) || (select_report > 2)) {
1594 		mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1595 			       	0);
1596 		return check_condition_result;
1597 	}
1598 	/* can produce response with up to 16k luns (lun 0 to lun 16383) */
1599 	memset(arr, 0, SDEBUG_RLUN_ARR_SZ);
1600 	lun_cnt = scsi_debug_max_luns;
1601 	if (1 == select_report)
1602 		lun_cnt = 0;
1603 	else if (scsi_debug_no_lun_0 && (lun_cnt > 0))
1604 		--lun_cnt;
1605 	wlun = (select_report > 0) ? 1 : 0;
1606 	num = lun_cnt + wlun;
1607 	arr[2] = ((sizeof(struct scsi_lun) * num) >> 8) & 0xff;
1608 	arr[3] = (sizeof(struct scsi_lun) * num) & 0xff;
1609 	n = min((int)((SDEBUG_RLUN_ARR_SZ - 8) /
1610 			    sizeof(struct scsi_lun)), num);
1611 	if (n < num) {
1612 		wlun = 0;
1613 		lun_cnt = n;
1614 	}
1615 	one_lun = (struct scsi_lun *) &arr[8];
1616 	max_addr = arr + SDEBUG_RLUN_ARR_SZ;
1617 	for (i = 0, lun = (scsi_debug_no_lun_0 ? 1 : 0);
1618              ((i < lun_cnt) && ((unsigned char *)(one_lun + i) < max_addr));
1619 	     i++, lun++) {
1620 		upper = (lun >> 8) & 0x3f;
1621 		if (upper)
1622 			one_lun[i].scsi_lun[0] =
1623 			    (upper | (SAM2_LUN_ADDRESS_METHOD << 6));
1624 		one_lun[i].scsi_lun[1] = lun & 0xff;
1625 	}
1626 	if (wlun) {
1627 		one_lun[i].scsi_lun[0] = (SAM2_WLUN_REPORT_LUNS >> 8) & 0xff;
1628 		one_lun[i].scsi_lun[1] = SAM2_WLUN_REPORT_LUNS & 0xff;
1629 		i++;
1630 	}
1631 	alloc_len = (unsigned char *)(one_lun + i) - arr;
1632 	return fill_from_dev_buffer(scp, arr,
1633 				    min((int)alloc_len, SDEBUG_RLUN_ARR_SZ));
1634 }
1635 
1636 static int resp_xdwriteread(struct scsi_cmnd *scp, unsigned long long lba,
1637 			    unsigned int num, struct sdebug_dev_info *devip)
1638 {
1639 	int i, j, ret = -1;
1640 	unsigned char *kaddr, *buf;
1641 	unsigned int offset;
1642 	struct scatterlist *sg;
1643 	struct scsi_data_buffer *sdb = scsi_in(scp);
1644 
1645 	/* better not to use temporary buffer. */
1646 	buf = kmalloc(scsi_bufflen(scp), GFP_ATOMIC);
1647 	if (!buf)
1648 		return ret;
1649 
1650 	scsi_sg_copy_to_buffer(scp, buf, scsi_bufflen(scp));
1651 
1652 	offset = 0;
1653 	for_each_sg(sdb->table.sgl, sg, sdb->table.nents, i) {
1654 		kaddr = (unsigned char *)kmap_atomic(sg_page(sg), KM_USER0);
1655 		if (!kaddr)
1656 			goto out;
1657 
1658 		for (j = 0; j < sg->length; j++)
1659 			*(kaddr + sg->offset + j) ^= *(buf + offset + j);
1660 
1661 		offset += sg->length;
1662 		kunmap_atomic(kaddr, KM_USER0);
1663 	}
1664 	ret = 0;
1665 out:
1666 	kfree(buf);
1667 
1668 	return ret;
1669 }
1670 
1671 /* When timer goes off this function is called. */
1672 static void timer_intr_handler(unsigned long indx)
1673 {
1674 	struct sdebug_queued_cmd * sqcp;
1675 	unsigned long iflags;
1676 
1677 	if (indx >= SCSI_DEBUG_CANQUEUE) {
1678 		printk(KERN_ERR "scsi_debug:timer_intr_handler: indx too "
1679 		       "large\n");
1680 		return;
1681 	}
1682 	spin_lock_irqsave(&queued_arr_lock, iflags);
1683 	sqcp = &queued_arr[(int)indx];
1684 	if (! sqcp->in_use) {
1685 		printk(KERN_ERR "scsi_debug:timer_intr_handler: Unexpected "
1686 		       "interrupt\n");
1687 		spin_unlock_irqrestore(&queued_arr_lock, iflags);
1688 		return;
1689 	}
1690 	sqcp->in_use = 0;
1691 	if (sqcp->done_funct) {
1692 		sqcp->a_cmnd->result = sqcp->scsi_result;
1693 		sqcp->done_funct(sqcp->a_cmnd); /* callback to mid level */
1694 	}
1695 	sqcp->done_funct = NULL;
1696 	spin_unlock_irqrestore(&queued_arr_lock, iflags);
1697 }
1698 
1699 static int scsi_debug_slave_alloc(struct scsi_device * sdp)
1700 {
1701 	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1702 		printk(KERN_INFO "scsi_debug: slave_alloc <%u %u %u %u>\n",
1703 		       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
1704 	set_bit(QUEUE_FLAG_BIDI, &sdp->request_queue->queue_flags);
1705 	return 0;
1706 }
1707 
1708 static int scsi_debug_slave_configure(struct scsi_device * sdp)
1709 {
1710 	struct sdebug_dev_info * devip;
1711 
1712 	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1713 		printk(KERN_INFO "scsi_debug: slave_configure <%u %u %u %u>\n",
1714 		       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
1715 	if (sdp->host->max_cmd_len != SCSI_DEBUG_MAX_CMD_LEN)
1716 		sdp->host->max_cmd_len = SCSI_DEBUG_MAX_CMD_LEN;
1717 	devip = devInfoReg(sdp);
1718 	if (NULL == devip)
1719 		return 1;	/* no resources, will be marked offline */
1720 	sdp->hostdata = devip;
1721 	if (sdp->host->cmd_per_lun)
1722 		scsi_adjust_queue_depth(sdp, SDEBUG_TAGGED_QUEUING,
1723 					sdp->host->cmd_per_lun);
1724 	blk_queue_max_segment_size(sdp->request_queue, 256 * 1024);
1725 	return 0;
1726 }
1727 
1728 static void scsi_debug_slave_destroy(struct scsi_device * sdp)
1729 {
1730 	struct sdebug_dev_info * devip =
1731 				(struct sdebug_dev_info *)sdp->hostdata;
1732 
1733 	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1734 		printk(KERN_INFO "scsi_debug: slave_destroy <%u %u %u %u>\n",
1735 		       sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
1736 	if (devip) {
1737 		/* make this slot avaliable for re-use */
1738 		devip->used = 0;
1739 		sdp->hostdata = NULL;
1740 	}
1741 }
1742 
1743 struct sdebug_dev_info *sdebug_device_create(struct sdebug_host_info *sdbg_host,
1744 					     gfp_t flags)
1745 {
1746 	struct sdebug_dev_info *devip;
1747 
1748 	devip = kzalloc(sizeof(*devip), flags);
1749 	if (devip) {
1750 		devip->sdbg_host = sdbg_host;
1751 		list_add_tail(&devip->dev_list, &sdbg_host->dev_info_list);
1752 	}
1753 	return devip;
1754 }
1755 
1756 static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev)
1757 {
1758 	struct sdebug_host_info * sdbg_host;
1759 	struct sdebug_dev_info * open_devip = NULL;
1760 	struct sdebug_dev_info * devip =
1761 			(struct sdebug_dev_info *)sdev->hostdata;
1762 
1763 	if (devip)
1764 		return devip;
1765 	sdbg_host = *(struct sdebug_host_info **)shost_priv(sdev->host);
1766 	if (!sdbg_host) {
1767                 printk(KERN_ERR "Host info NULL\n");
1768 		return NULL;
1769         }
1770 	list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) {
1771 		if ((devip->used) && (devip->channel == sdev->channel) &&
1772                     (devip->target == sdev->id) &&
1773                     (devip->lun == sdev->lun))
1774                         return devip;
1775 		else {
1776 			if ((!devip->used) && (!open_devip))
1777 				open_devip = devip;
1778 		}
1779 	}
1780 	if (!open_devip) { /* try and make a new one */
1781 		open_devip = sdebug_device_create(sdbg_host, GFP_ATOMIC);
1782 		if (!open_devip) {
1783 			printk(KERN_ERR "%s: out of memory at line %d\n",
1784 				__FUNCTION__, __LINE__);
1785 			return NULL;
1786 		}
1787 	}
1788 
1789 	open_devip->channel = sdev->channel;
1790 	open_devip->target = sdev->id;
1791 	open_devip->lun = sdev->lun;
1792 	open_devip->sdbg_host = sdbg_host;
1793 	open_devip->reset = 1;
1794 	open_devip->used = 1;
1795 	memset(open_devip->sense_buff, 0, SDEBUG_SENSE_LEN);
1796 	if (scsi_debug_dsense)
1797 		open_devip->sense_buff[0] = 0x72;
1798 	else {
1799 		open_devip->sense_buff[0] = 0x70;
1800 		open_devip->sense_buff[7] = 0xa;
1801 	}
1802 	if (sdev->lun == SAM2_WLUN_REPORT_LUNS)
1803 		open_devip->wlun = SAM2_WLUN_REPORT_LUNS & 0xff;
1804 
1805 	return open_devip;
1806 }
1807 
1808 static void mk_sense_buffer(struct sdebug_dev_info * devip, int key,
1809 			    int asc, int asq)
1810 {
1811 	unsigned char *sbuff;
1812 
1813 	sbuff = devip->sense_buff;
1814 	memset(sbuff, 0, SDEBUG_SENSE_LEN);
1815 
1816 	scsi_build_sense_buffer(scsi_debug_dsense, sbuff, key, asc, asq);
1817 
1818 	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1819 		printk(KERN_INFO "scsi_debug:    [sense_key,asc,ascq]: "
1820 		      "[0x%x,0x%x,0x%x]\n", key, asc, asq);
1821 }
1822 
1823 static int scsi_debug_abort(struct scsi_cmnd * SCpnt)
1824 {
1825 	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1826 		printk(KERN_INFO "scsi_debug: abort\n");
1827 	++num_aborts;
1828 	stop_queued_cmnd(SCpnt);
1829 	return SUCCESS;
1830 }
1831 
1832 static int scsi_debug_biosparam(struct scsi_device *sdev,
1833 		struct block_device * bdev, sector_t capacity, int *info)
1834 {
1835 	int res;
1836 	unsigned char *buf;
1837 
1838 	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1839 		printk(KERN_INFO "scsi_debug: biosparam\n");
1840 	buf = scsi_bios_ptable(bdev);
1841 	if (buf) {
1842 		res = scsi_partsize(buf, capacity,
1843 				    &info[2], &info[0], &info[1]);
1844 		kfree(buf);
1845 		if (! res)
1846 			return res;
1847 	}
1848 	info[0] = sdebug_heads;
1849 	info[1] = sdebug_sectors_per;
1850 	info[2] = sdebug_cylinders_per;
1851 	return 0;
1852 }
1853 
1854 static int scsi_debug_device_reset(struct scsi_cmnd * SCpnt)
1855 {
1856 	struct sdebug_dev_info * devip;
1857 
1858 	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1859 		printk(KERN_INFO "scsi_debug: device_reset\n");
1860 	++num_dev_resets;
1861 	if (SCpnt) {
1862 		devip = devInfoReg(SCpnt->device);
1863 		if (devip)
1864 			devip->reset = 1;
1865 	}
1866 	return SUCCESS;
1867 }
1868 
1869 static int scsi_debug_bus_reset(struct scsi_cmnd * SCpnt)
1870 {
1871 	struct sdebug_host_info *sdbg_host;
1872         struct sdebug_dev_info * dev_info;
1873         struct scsi_device * sdp;
1874         struct Scsi_Host * hp;
1875 
1876 	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1877 		printk(KERN_INFO "scsi_debug: bus_reset\n");
1878 	++num_bus_resets;
1879 	if (SCpnt && ((sdp = SCpnt->device)) && ((hp = sdp->host))) {
1880 		sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
1881 		if (sdbg_host) {
1882 			list_for_each_entry(dev_info,
1883                                             &sdbg_host->dev_info_list,
1884                                             dev_list)
1885 				dev_info->reset = 1;
1886 		}
1887 	}
1888 	return SUCCESS;
1889 }
1890 
1891 static int scsi_debug_host_reset(struct scsi_cmnd * SCpnt)
1892 {
1893 	struct sdebug_host_info * sdbg_host;
1894         struct sdebug_dev_info * dev_info;
1895 
1896 	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1897 		printk(KERN_INFO "scsi_debug: host_reset\n");
1898 	++num_host_resets;
1899         spin_lock(&sdebug_host_list_lock);
1900         list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
1901                 list_for_each_entry(dev_info, &sdbg_host->dev_info_list,
1902                                     dev_list)
1903                         dev_info->reset = 1;
1904         }
1905         spin_unlock(&sdebug_host_list_lock);
1906 	stop_all_queued();
1907 	return SUCCESS;
1908 }
1909 
1910 /* Returns 1 if found 'cmnd' and deleted its timer. else returns 0 */
1911 static int stop_queued_cmnd(struct scsi_cmnd * cmnd)
1912 {
1913 	unsigned long iflags;
1914 	int k;
1915 	struct sdebug_queued_cmd * sqcp;
1916 
1917 	spin_lock_irqsave(&queued_arr_lock, iflags);
1918 	for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
1919 		sqcp = &queued_arr[k];
1920 		if (sqcp->in_use && (cmnd == sqcp->a_cmnd)) {
1921 			del_timer_sync(&sqcp->cmnd_timer);
1922 			sqcp->in_use = 0;
1923 			sqcp->a_cmnd = NULL;
1924 			break;
1925 		}
1926 	}
1927 	spin_unlock_irqrestore(&queued_arr_lock, iflags);
1928 	return (k < SCSI_DEBUG_CANQUEUE) ? 1 : 0;
1929 }
1930 
1931 /* Deletes (stops) timers of all queued commands */
1932 static void stop_all_queued(void)
1933 {
1934 	unsigned long iflags;
1935 	int k;
1936 	struct sdebug_queued_cmd * sqcp;
1937 
1938 	spin_lock_irqsave(&queued_arr_lock, iflags);
1939 	for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
1940 		sqcp = &queued_arr[k];
1941 		if (sqcp->in_use && sqcp->a_cmnd) {
1942 			del_timer_sync(&sqcp->cmnd_timer);
1943 			sqcp->in_use = 0;
1944 			sqcp->a_cmnd = NULL;
1945 		}
1946 	}
1947 	spin_unlock_irqrestore(&queued_arr_lock, iflags);
1948 }
1949 
1950 /* Initializes timers in queued array */
1951 static void __init init_all_queued(void)
1952 {
1953 	unsigned long iflags;
1954 	int k;
1955 	struct sdebug_queued_cmd * sqcp;
1956 
1957 	spin_lock_irqsave(&queued_arr_lock, iflags);
1958 	for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
1959 		sqcp = &queued_arr[k];
1960 		init_timer(&sqcp->cmnd_timer);
1961 		sqcp->in_use = 0;
1962 		sqcp->a_cmnd = NULL;
1963 	}
1964 	spin_unlock_irqrestore(&queued_arr_lock, iflags);
1965 }
1966 
1967 static void __init sdebug_build_parts(unsigned char *ramp,
1968 				      unsigned int store_size)
1969 {
1970 	struct partition * pp;
1971 	int starts[SDEBUG_MAX_PARTS + 2];
1972 	int sectors_per_part, num_sectors, k;
1973 	int heads_by_sects, start_sec, end_sec;
1974 
1975 	/* assume partition table already zeroed */
1976 	if ((scsi_debug_num_parts < 1) || (store_size < 1048576))
1977 		return;
1978 	if (scsi_debug_num_parts > SDEBUG_MAX_PARTS) {
1979 		scsi_debug_num_parts = SDEBUG_MAX_PARTS;
1980 		printk(KERN_WARNING "scsi_debug:build_parts: reducing "
1981 				    "partitions to %d\n", SDEBUG_MAX_PARTS);
1982 	}
1983 	num_sectors = (int)sdebug_store_sectors;
1984 	sectors_per_part = (num_sectors - sdebug_sectors_per)
1985 			   / scsi_debug_num_parts;
1986 	heads_by_sects = sdebug_heads * sdebug_sectors_per;
1987         starts[0] = sdebug_sectors_per;
1988 	for (k = 1; k < scsi_debug_num_parts; ++k)
1989 		starts[k] = ((k * sectors_per_part) / heads_by_sects)
1990 			    * heads_by_sects;
1991 	starts[scsi_debug_num_parts] = num_sectors;
1992 	starts[scsi_debug_num_parts + 1] = 0;
1993 
1994 	ramp[510] = 0x55;	/* magic partition markings */
1995 	ramp[511] = 0xAA;
1996 	pp = (struct partition *)(ramp + 0x1be);
1997 	for (k = 0; starts[k + 1]; ++k, ++pp) {
1998 		start_sec = starts[k];
1999 		end_sec = starts[k + 1] - 1;
2000 		pp->boot_ind = 0;
2001 
2002 		pp->cyl = start_sec / heads_by_sects;
2003 		pp->head = (start_sec - (pp->cyl * heads_by_sects))
2004 			   / sdebug_sectors_per;
2005 		pp->sector = (start_sec % sdebug_sectors_per) + 1;
2006 
2007 		pp->end_cyl = end_sec / heads_by_sects;
2008 		pp->end_head = (end_sec - (pp->end_cyl * heads_by_sects))
2009 			       / sdebug_sectors_per;
2010 		pp->end_sector = (end_sec % sdebug_sectors_per) + 1;
2011 
2012 		pp->start_sect = start_sec;
2013 		pp->nr_sects = end_sec - start_sec + 1;
2014 		pp->sys_ind = 0x83;	/* plain Linux partition */
2015 	}
2016 }
2017 
2018 static int schedule_resp(struct scsi_cmnd * cmnd,
2019 			 struct sdebug_dev_info * devip,
2020 			 done_funct_t done, int scsi_result, int delta_jiff)
2021 {
2022 	if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) && cmnd) {
2023 		if (scsi_result) {
2024 			struct scsi_device * sdp = cmnd->device;
2025 
2026 			printk(KERN_INFO "scsi_debug:    <%u %u %u %u> "
2027 			       "non-zero result=0x%x\n", sdp->host->host_no,
2028 			       sdp->channel, sdp->id, sdp->lun, scsi_result);
2029 		}
2030 	}
2031 	if (cmnd && devip) {
2032 		/* simulate autosense by this driver */
2033 		if (SAM_STAT_CHECK_CONDITION == (scsi_result & 0xff))
2034 			memcpy(cmnd->sense_buffer, devip->sense_buff,
2035 			       (SCSI_SENSE_BUFFERSIZE > SDEBUG_SENSE_LEN) ?
2036 			       SDEBUG_SENSE_LEN : SCSI_SENSE_BUFFERSIZE);
2037 	}
2038 	if (delta_jiff <= 0) {
2039 		if (cmnd)
2040 			cmnd->result = scsi_result;
2041 		if (done)
2042 			done(cmnd);
2043 		return 0;
2044 	} else {
2045 		unsigned long iflags;
2046 		int k;
2047 		struct sdebug_queued_cmd * sqcp = NULL;
2048 
2049 		spin_lock_irqsave(&queued_arr_lock, iflags);
2050 		for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
2051 			sqcp = &queued_arr[k];
2052 			if (! sqcp->in_use)
2053 				break;
2054 		}
2055 		if (k >= SCSI_DEBUG_CANQUEUE) {
2056 			spin_unlock_irqrestore(&queued_arr_lock, iflags);
2057 			printk(KERN_WARNING "scsi_debug: can_queue exceeded\n");
2058 			return 1;	/* report busy to mid level */
2059 		}
2060 		sqcp->in_use = 1;
2061 		sqcp->a_cmnd = cmnd;
2062 		sqcp->scsi_result = scsi_result;
2063 		sqcp->done_funct = done;
2064 		sqcp->cmnd_timer.function = timer_intr_handler;
2065 		sqcp->cmnd_timer.data = k;
2066 		sqcp->cmnd_timer.expires = jiffies + delta_jiff;
2067 		add_timer(&sqcp->cmnd_timer);
2068 		spin_unlock_irqrestore(&queued_arr_lock, iflags);
2069 		if (cmnd)
2070 			cmnd->result = 0;
2071 		return 0;
2072 	}
2073 }
2074 
2075 /* Note: The following macros create attribute files in the
2076    /sys/module/scsi_debug/parameters directory. Unfortunately this
2077    driver is unaware of a change and cannot trigger auxiliary actions
2078    as it can when the corresponding attribute in the
2079    /sys/bus/pseudo/drivers/scsi_debug directory is changed.
2080  */
2081 module_param_named(add_host, scsi_debug_add_host, int, S_IRUGO | S_IWUSR);
2082 module_param_named(delay, scsi_debug_delay, int, S_IRUGO | S_IWUSR);
2083 module_param_named(dev_size_mb, scsi_debug_dev_size_mb, int, S_IRUGO);
2084 module_param_named(dsense, scsi_debug_dsense, int, S_IRUGO | S_IWUSR);
2085 module_param_named(every_nth, scsi_debug_every_nth, int, S_IRUGO | S_IWUSR);
2086 module_param_named(fake_rw, scsi_debug_fake_rw, int, S_IRUGO | S_IWUSR);
2087 module_param_named(max_luns, scsi_debug_max_luns, int, S_IRUGO | S_IWUSR);
2088 module_param_named(no_lun_0, scsi_debug_no_lun_0, int, S_IRUGO | S_IWUSR);
2089 module_param_named(num_parts, scsi_debug_num_parts, int, S_IRUGO);
2090 module_param_named(num_tgts, scsi_debug_num_tgts, int, S_IRUGO | S_IWUSR);
2091 module_param_named(opts, scsi_debug_opts, int, S_IRUGO | S_IWUSR);
2092 module_param_named(ptype, scsi_debug_ptype, int, S_IRUGO | S_IWUSR);
2093 module_param_named(scsi_level, scsi_debug_scsi_level, int, S_IRUGO);
2094 module_param_named(virtual_gb, scsi_debug_virtual_gb, int, S_IRUGO | S_IWUSR);
2095 module_param_named(vpd_use_hostno, scsi_debug_vpd_use_hostno, int,
2096 		   S_IRUGO | S_IWUSR);
2097 
2098 MODULE_AUTHOR("Eric Youngdale + Douglas Gilbert");
2099 MODULE_DESCRIPTION("SCSI debug adapter driver");
2100 MODULE_LICENSE("GPL");
2101 MODULE_VERSION(SCSI_DEBUG_VERSION);
2102 
2103 MODULE_PARM_DESC(add_host, "0..127 hosts allowed(def=1)");
2104 MODULE_PARM_DESC(delay, "# of jiffies to delay response(def=1)");
2105 MODULE_PARM_DESC(dev_size_mb, "size in MB of ram shared by devs(def=8)");
2106 MODULE_PARM_DESC(dsense, "use descriptor sense format(def=0 -> fixed)");
2107 MODULE_PARM_DESC(every_nth, "timeout every nth command(def=0)");
2108 MODULE_PARM_DESC(fake_rw, "fake reads/writes instead of copying (def=0)");
2109 MODULE_PARM_DESC(max_luns, "number of LUNs per target to simulate(def=1)");
2110 MODULE_PARM_DESC(no_lun_0, "no LU number 0 (def=0 -> have lun 0)");
2111 MODULE_PARM_DESC(num_parts, "number of partitions(def=0)");
2112 MODULE_PARM_DESC(num_tgts, "number of targets per host to simulate(def=1)");
2113 MODULE_PARM_DESC(opts, "1->noise, 2->medium_err, 4->timeout, 8->recovered_err... (def=0)");
2114 MODULE_PARM_DESC(ptype, "SCSI peripheral type(def=0[disk])");
2115 MODULE_PARM_DESC(scsi_level, "SCSI level to simulate(def=5[SPC-3])");
2116 MODULE_PARM_DESC(virtual_gb, "virtual gigabyte size (def=0 -> use dev_size_mb)");
2117 MODULE_PARM_DESC(vpd_use_hostno, "0 -> dev ids ignore hostno (def=1 -> unique dev ids)");
2118 
2119 
2120 static char sdebug_info[256];
2121 
2122 static const char * scsi_debug_info(struct Scsi_Host * shp)
2123 {
2124 	sprintf(sdebug_info, "scsi_debug, version %s [%s], "
2125 		"dev_size_mb=%d, opts=0x%x", SCSI_DEBUG_VERSION,
2126 		scsi_debug_version_date, scsi_debug_dev_size_mb,
2127 		scsi_debug_opts);
2128 	return sdebug_info;
2129 }
2130 
2131 /* scsi_debug_proc_info
2132  * Used if the driver currently has no own support for /proc/scsi
2133  */
2134 static int scsi_debug_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset,
2135 				int length, int inout)
2136 {
2137 	int len, pos, begin;
2138 	int orig_length;
2139 
2140 	orig_length = length;
2141 
2142 	if (inout == 1) {
2143 		char arr[16];
2144 		int minLen = length > 15 ? 15 : length;
2145 
2146 		if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
2147 			return -EACCES;
2148 		memcpy(arr, buffer, minLen);
2149 		arr[minLen] = '\0';
2150 		if (1 != sscanf(arr, "%d", &pos))
2151 			return -EINVAL;
2152 		scsi_debug_opts = pos;
2153 		if (scsi_debug_every_nth != 0)
2154                         scsi_debug_cmnd_count = 0;
2155 		return length;
2156 	}
2157 	begin = 0;
2158 	pos = len = sprintf(buffer, "scsi_debug adapter driver, version "
2159 	    "%s [%s]\n"
2160 	    "num_tgts=%d, shared (ram) size=%d MB, opts=0x%x, "
2161 	    "every_nth=%d(curr:%d)\n"
2162 	    "delay=%d, max_luns=%d, scsi_level=%d\n"
2163 	    "sector_size=%d bytes, cylinders=%d, heads=%d, sectors=%d\n"
2164 	    "number of aborts=%d, device_reset=%d, bus_resets=%d, "
2165 	    "host_resets=%d\n",
2166 	    SCSI_DEBUG_VERSION, scsi_debug_version_date, scsi_debug_num_tgts,
2167 	    scsi_debug_dev_size_mb, scsi_debug_opts, scsi_debug_every_nth,
2168 	    scsi_debug_cmnd_count, scsi_debug_delay,
2169 	    scsi_debug_max_luns, scsi_debug_scsi_level,
2170 	    SECT_SIZE, sdebug_cylinders_per, sdebug_heads, sdebug_sectors_per,
2171 	    num_aborts, num_dev_resets, num_bus_resets, num_host_resets);
2172 	if (pos < offset) {
2173 		len = 0;
2174 		begin = pos;
2175 	}
2176 	*start = buffer + (offset - begin);	/* Start of wanted data */
2177 	len -= (offset - begin);
2178 	if (len > length)
2179 		len = length;
2180 	return len;
2181 }
2182 
2183 static ssize_t sdebug_delay_show(struct device_driver * ddp, char * buf)
2184 {
2185         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_delay);
2186 }
2187 
2188 static ssize_t sdebug_delay_store(struct device_driver * ddp,
2189 				  const char * buf, size_t count)
2190 {
2191         int delay;
2192 	char work[20];
2193 
2194         if (1 == sscanf(buf, "%10s", work)) {
2195 		if ((1 == sscanf(work, "%d", &delay)) && (delay >= 0)) {
2196 			scsi_debug_delay = delay;
2197 			return count;
2198 		}
2199 	}
2200 	return -EINVAL;
2201 }
2202 DRIVER_ATTR(delay, S_IRUGO | S_IWUSR, sdebug_delay_show,
2203 	    sdebug_delay_store);
2204 
2205 static ssize_t sdebug_opts_show(struct device_driver * ddp, char * buf)
2206 {
2207         return scnprintf(buf, PAGE_SIZE, "0x%x\n", scsi_debug_opts);
2208 }
2209 
2210 static ssize_t sdebug_opts_store(struct device_driver * ddp,
2211 				 const char * buf, size_t count)
2212 {
2213         int opts;
2214 	char work[20];
2215 
2216         if (1 == sscanf(buf, "%10s", work)) {
2217 		if (0 == strnicmp(work,"0x", 2)) {
2218 			if (1 == sscanf(&work[2], "%x", &opts))
2219 				goto opts_done;
2220 		} else {
2221 			if (1 == sscanf(work, "%d", &opts))
2222 				goto opts_done;
2223 		}
2224 	}
2225 	return -EINVAL;
2226 opts_done:
2227 	scsi_debug_opts = opts;
2228 	scsi_debug_cmnd_count = 0;
2229 	return count;
2230 }
2231 DRIVER_ATTR(opts, S_IRUGO | S_IWUSR, sdebug_opts_show,
2232 	    sdebug_opts_store);
2233 
2234 static ssize_t sdebug_ptype_show(struct device_driver * ddp, char * buf)
2235 {
2236         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_ptype);
2237 }
2238 static ssize_t sdebug_ptype_store(struct device_driver * ddp,
2239 				  const char * buf, size_t count)
2240 {
2241         int n;
2242 
2243 	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2244 		scsi_debug_ptype = n;
2245 		return count;
2246 	}
2247 	return -EINVAL;
2248 }
2249 DRIVER_ATTR(ptype, S_IRUGO | S_IWUSR, sdebug_ptype_show, sdebug_ptype_store);
2250 
2251 static ssize_t sdebug_dsense_show(struct device_driver * ddp, char * buf)
2252 {
2253         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dsense);
2254 }
2255 static ssize_t sdebug_dsense_store(struct device_driver * ddp,
2256 				  const char * buf, size_t count)
2257 {
2258         int n;
2259 
2260 	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2261 		scsi_debug_dsense = n;
2262 		return count;
2263 	}
2264 	return -EINVAL;
2265 }
2266 DRIVER_ATTR(dsense, S_IRUGO | S_IWUSR, sdebug_dsense_show,
2267 	    sdebug_dsense_store);
2268 
2269 static ssize_t sdebug_fake_rw_show(struct device_driver * ddp, char * buf)
2270 {
2271         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_fake_rw);
2272 }
2273 static ssize_t sdebug_fake_rw_store(struct device_driver * ddp,
2274 				    const char * buf, size_t count)
2275 {
2276         int n;
2277 
2278 	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2279 		scsi_debug_fake_rw = n;
2280 		return count;
2281 	}
2282 	return -EINVAL;
2283 }
2284 DRIVER_ATTR(fake_rw, S_IRUGO | S_IWUSR, sdebug_fake_rw_show,
2285 	    sdebug_fake_rw_store);
2286 
2287 static ssize_t sdebug_no_lun_0_show(struct device_driver * ddp, char * buf)
2288 {
2289         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_no_lun_0);
2290 }
2291 static ssize_t sdebug_no_lun_0_store(struct device_driver * ddp,
2292 				     const char * buf, size_t count)
2293 {
2294         int n;
2295 
2296 	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2297 		scsi_debug_no_lun_0 = n;
2298 		return count;
2299 	}
2300 	return -EINVAL;
2301 }
2302 DRIVER_ATTR(no_lun_0, S_IRUGO | S_IWUSR, sdebug_no_lun_0_show,
2303 	    sdebug_no_lun_0_store);
2304 
2305 static ssize_t sdebug_num_tgts_show(struct device_driver * ddp, char * buf)
2306 {
2307         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_num_tgts);
2308 }
2309 static ssize_t sdebug_num_tgts_store(struct device_driver * ddp,
2310 				     const char * buf, size_t count)
2311 {
2312         int n;
2313 
2314 	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2315 		scsi_debug_num_tgts = n;
2316 		sdebug_max_tgts_luns();
2317 		return count;
2318 	}
2319 	return -EINVAL;
2320 }
2321 DRIVER_ATTR(num_tgts, S_IRUGO | S_IWUSR, sdebug_num_tgts_show,
2322 	    sdebug_num_tgts_store);
2323 
2324 static ssize_t sdebug_dev_size_mb_show(struct device_driver * ddp, char * buf)
2325 {
2326         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dev_size_mb);
2327 }
2328 DRIVER_ATTR(dev_size_mb, S_IRUGO, sdebug_dev_size_mb_show, NULL);
2329 
2330 static ssize_t sdebug_num_parts_show(struct device_driver * ddp, char * buf)
2331 {
2332         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_num_parts);
2333 }
2334 DRIVER_ATTR(num_parts, S_IRUGO, sdebug_num_parts_show, NULL);
2335 
2336 static ssize_t sdebug_every_nth_show(struct device_driver * ddp, char * buf)
2337 {
2338         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_every_nth);
2339 }
2340 static ssize_t sdebug_every_nth_store(struct device_driver * ddp,
2341 				      const char * buf, size_t count)
2342 {
2343         int nth;
2344 
2345 	if ((count > 0) && (1 == sscanf(buf, "%d", &nth))) {
2346 		scsi_debug_every_nth = nth;
2347 		scsi_debug_cmnd_count = 0;
2348 		return count;
2349 	}
2350 	return -EINVAL;
2351 }
2352 DRIVER_ATTR(every_nth, S_IRUGO | S_IWUSR, sdebug_every_nth_show,
2353 	    sdebug_every_nth_store);
2354 
2355 static ssize_t sdebug_max_luns_show(struct device_driver * ddp, char * buf)
2356 {
2357         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_max_luns);
2358 }
2359 static ssize_t sdebug_max_luns_store(struct device_driver * ddp,
2360 				     const char * buf, size_t count)
2361 {
2362         int n;
2363 
2364 	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2365 		scsi_debug_max_luns = n;
2366 		sdebug_max_tgts_luns();
2367 		return count;
2368 	}
2369 	return -EINVAL;
2370 }
2371 DRIVER_ATTR(max_luns, S_IRUGO | S_IWUSR, sdebug_max_luns_show,
2372 	    sdebug_max_luns_store);
2373 
2374 static ssize_t sdebug_scsi_level_show(struct device_driver * ddp, char * buf)
2375 {
2376         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_scsi_level);
2377 }
2378 DRIVER_ATTR(scsi_level, S_IRUGO, sdebug_scsi_level_show, NULL);
2379 
2380 static ssize_t sdebug_virtual_gb_show(struct device_driver * ddp, char * buf)
2381 {
2382         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_virtual_gb);
2383 }
2384 static ssize_t sdebug_virtual_gb_store(struct device_driver * ddp,
2385 				       const char * buf, size_t count)
2386 {
2387         int n;
2388 
2389 	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2390 		scsi_debug_virtual_gb = n;
2391 
2392 		sdebug_capacity = get_sdebug_capacity();
2393 
2394 		return count;
2395 	}
2396 	return -EINVAL;
2397 }
2398 DRIVER_ATTR(virtual_gb, S_IRUGO | S_IWUSR, sdebug_virtual_gb_show,
2399 	    sdebug_virtual_gb_store);
2400 
2401 static ssize_t sdebug_add_host_show(struct device_driver * ddp, char * buf)
2402 {
2403         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_add_host);
2404 }
2405 
2406 static ssize_t sdebug_add_host_store(struct device_driver * ddp,
2407 				     const char * buf, size_t count)
2408 {
2409 	int delta_hosts;
2410 
2411 	if (sscanf(buf, "%d", &delta_hosts) != 1)
2412 		return -EINVAL;
2413 	if (delta_hosts > 0) {
2414 		do {
2415 			sdebug_add_adapter();
2416 		} while (--delta_hosts);
2417 	} else if (delta_hosts < 0) {
2418 		do {
2419 			sdebug_remove_adapter();
2420 		} while (++delta_hosts);
2421 	}
2422 	return count;
2423 }
2424 DRIVER_ATTR(add_host, S_IRUGO | S_IWUSR, sdebug_add_host_show,
2425 	    sdebug_add_host_store);
2426 
2427 static ssize_t sdebug_vpd_use_hostno_show(struct device_driver * ddp,
2428 					  char * buf)
2429 {
2430 	return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_vpd_use_hostno);
2431 }
2432 static ssize_t sdebug_vpd_use_hostno_store(struct device_driver * ddp,
2433 					   const char * buf, size_t count)
2434 {
2435 	int n;
2436 
2437 	if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2438 		scsi_debug_vpd_use_hostno = n;
2439 		return count;
2440 	}
2441 	return -EINVAL;
2442 }
2443 DRIVER_ATTR(vpd_use_hostno, S_IRUGO | S_IWUSR, sdebug_vpd_use_hostno_show,
2444 	    sdebug_vpd_use_hostno_store);
2445 
2446 /* Note: The following function creates attribute files in the
2447    /sys/bus/pseudo/drivers/scsi_debug directory. The advantage of these
2448    files (over those found in the /sys/module/scsi_debug/parameters
2449    directory) is that auxiliary actions can be triggered when an attribute
2450    is changed. For example see: sdebug_add_host_store() above.
2451  */
2452 static int do_create_driverfs_files(void)
2453 {
2454 	int ret;
2455 
2456 	ret = driver_create_file(&sdebug_driverfs_driver, &driver_attr_add_host);
2457 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_delay);
2458 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dev_size_mb);
2459 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dsense);
2460 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_every_nth);
2461 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_fake_rw);
2462 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_max_luns);
2463 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_no_lun_0);
2464 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_num_parts);
2465 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_num_tgts);
2466 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_ptype);
2467 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_opts);
2468 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_scsi_level);
2469 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_virtual_gb);
2470 	ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_vpd_use_hostno);
2471 	return ret;
2472 }
2473 
2474 static void do_remove_driverfs_files(void)
2475 {
2476 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_vpd_use_hostno);
2477 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_virtual_gb);
2478 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_scsi_level);
2479 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_opts);
2480 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_ptype);
2481 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_num_tgts);
2482 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_num_parts);
2483 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_no_lun_0);
2484 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_max_luns);
2485 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_fake_rw);
2486 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_every_nth);
2487 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dsense);
2488 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dev_size_mb);
2489 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_delay);
2490 	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_add_host);
2491 }
2492 
2493 static int __init scsi_debug_init(void)
2494 {
2495 	unsigned int sz;
2496 	int host_to_add;
2497 	int k;
2498 	int ret;
2499 
2500 	if (scsi_debug_dev_size_mb < 1)
2501 		scsi_debug_dev_size_mb = 1;  /* force minimum 1 MB ramdisk */
2502 	sz = (unsigned int)scsi_debug_dev_size_mb * 1048576;
2503 	sdebug_store_sectors = sz / SECT_SIZE;
2504 	sdebug_capacity = get_sdebug_capacity();
2505 
2506 	/* play around with geometry, don't waste too much on track 0 */
2507 	sdebug_heads = 8;
2508 	sdebug_sectors_per = 32;
2509 	if (scsi_debug_dev_size_mb >= 16)
2510 		sdebug_heads = 32;
2511 	else if (scsi_debug_dev_size_mb >= 256)
2512 		sdebug_heads = 64;
2513 	sdebug_cylinders_per = (unsigned long)sdebug_capacity /
2514 			       (sdebug_sectors_per * sdebug_heads);
2515 	if (sdebug_cylinders_per >= 1024) {
2516 		/* other LLDs do this; implies >= 1GB ram disk ... */
2517 		sdebug_heads = 255;
2518 		sdebug_sectors_per = 63;
2519 		sdebug_cylinders_per = (unsigned long)sdebug_capacity /
2520 			       (sdebug_sectors_per * sdebug_heads);
2521 	}
2522 
2523 	fake_storep = vmalloc(sz);
2524 	if (NULL == fake_storep) {
2525 		printk(KERN_ERR "scsi_debug_init: out of memory, 1\n");
2526 		return -ENOMEM;
2527 	}
2528 	memset(fake_storep, 0, sz);
2529 	if (scsi_debug_num_parts > 0)
2530 		sdebug_build_parts(fake_storep, sz);
2531 
2532 	ret = device_register(&pseudo_primary);
2533 	if (ret < 0) {
2534 		printk(KERN_WARNING "scsi_debug: device_register error: %d\n",
2535 			ret);
2536 		goto free_vm;
2537 	}
2538 	ret = bus_register(&pseudo_lld_bus);
2539 	if (ret < 0) {
2540 		printk(KERN_WARNING "scsi_debug: bus_register error: %d\n",
2541 			ret);
2542 		goto dev_unreg;
2543 	}
2544 	ret = driver_register(&sdebug_driverfs_driver);
2545 	if (ret < 0) {
2546 		printk(KERN_WARNING "scsi_debug: driver_register error: %d\n",
2547 			ret);
2548 		goto bus_unreg;
2549 	}
2550 	ret = do_create_driverfs_files();
2551 	if (ret < 0) {
2552 		printk(KERN_WARNING "scsi_debug: driver_create_file error: %d\n",
2553 			ret);
2554 		goto del_files;
2555 	}
2556 
2557 	init_all_queued();
2558 
2559 	host_to_add = scsi_debug_add_host;
2560         scsi_debug_add_host = 0;
2561 
2562         for (k = 0; k < host_to_add; k++) {
2563                 if (sdebug_add_adapter()) {
2564                         printk(KERN_ERR "scsi_debug_init: "
2565                                "sdebug_add_adapter failed k=%d\n", k);
2566                         break;
2567                 }
2568         }
2569 
2570 	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
2571 		printk(KERN_INFO "scsi_debug_init: built %d host(s)\n",
2572 		       scsi_debug_add_host);
2573 	}
2574 	return 0;
2575 
2576 del_files:
2577 	do_remove_driverfs_files();
2578 	driver_unregister(&sdebug_driverfs_driver);
2579 bus_unreg:
2580 	bus_unregister(&pseudo_lld_bus);
2581 dev_unreg:
2582 	device_unregister(&pseudo_primary);
2583 free_vm:
2584 	vfree(fake_storep);
2585 
2586 	return ret;
2587 }
2588 
2589 static void __exit scsi_debug_exit(void)
2590 {
2591 	int k = scsi_debug_add_host;
2592 
2593 	stop_all_queued();
2594 	for (; k; k--)
2595 		sdebug_remove_adapter();
2596 	do_remove_driverfs_files();
2597 	driver_unregister(&sdebug_driverfs_driver);
2598 	bus_unregister(&pseudo_lld_bus);
2599 	device_unregister(&pseudo_primary);
2600 
2601 	vfree(fake_storep);
2602 }
2603 
2604 device_initcall(scsi_debug_init);
2605 module_exit(scsi_debug_exit);
2606 
2607 static void pseudo_0_release(struct device * dev)
2608 {
2609 	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2610 		printk(KERN_INFO "scsi_debug: pseudo_0_release() called\n");
2611 }
2612 
2613 static struct device pseudo_primary = {
2614 	.bus_id		= "pseudo_0",
2615 	.release	= pseudo_0_release,
2616 };
2617 
2618 static int pseudo_lld_bus_match(struct device *dev,
2619                           struct device_driver *dev_driver)
2620 {
2621         return 1;
2622 }
2623 
2624 static struct bus_type pseudo_lld_bus = {
2625         .name = "pseudo",
2626         .match = pseudo_lld_bus_match,
2627 	.probe = sdebug_driver_probe,
2628 	.remove = sdebug_driver_remove,
2629 };
2630 
2631 static void sdebug_release_adapter(struct device * dev)
2632 {
2633         struct sdebug_host_info *sdbg_host;
2634 
2635 	sdbg_host = to_sdebug_host(dev);
2636         kfree(sdbg_host);
2637 }
2638 
2639 static int sdebug_add_adapter(void)
2640 {
2641 	int k, devs_per_host;
2642         int error = 0;
2643         struct sdebug_host_info *sdbg_host;
2644 	struct sdebug_dev_info *sdbg_devinfo, *tmp;
2645 
2646         sdbg_host = kzalloc(sizeof(*sdbg_host),GFP_KERNEL);
2647         if (NULL == sdbg_host) {
2648                 printk(KERN_ERR "%s: out of memory at line %d\n",
2649                        __FUNCTION__, __LINE__);
2650                 return -ENOMEM;
2651         }
2652 
2653         INIT_LIST_HEAD(&sdbg_host->dev_info_list);
2654 
2655 	devs_per_host = scsi_debug_num_tgts * scsi_debug_max_luns;
2656         for (k = 0; k < devs_per_host; k++) {
2657 		sdbg_devinfo = sdebug_device_create(sdbg_host, GFP_KERNEL);
2658 		if (!sdbg_devinfo) {
2659                         printk(KERN_ERR "%s: out of memory at line %d\n",
2660                                __FUNCTION__, __LINE__);
2661                         error = -ENOMEM;
2662 			goto clean;
2663                 }
2664         }
2665 
2666         spin_lock(&sdebug_host_list_lock);
2667         list_add_tail(&sdbg_host->host_list, &sdebug_host_list);
2668         spin_unlock(&sdebug_host_list_lock);
2669 
2670         sdbg_host->dev.bus = &pseudo_lld_bus;
2671         sdbg_host->dev.parent = &pseudo_primary;
2672         sdbg_host->dev.release = &sdebug_release_adapter;
2673         sprintf(sdbg_host->dev.bus_id, "adapter%d", scsi_debug_add_host);
2674 
2675         error = device_register(&sdbg_host->dev);
2676 
2677         if (error)
2678 		goto clean;
2679 
2680 	++scsi_debug_add_host;
2681         return error;
2682 
2683 clean:
2684 	list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
2685 				 dev_list) {
2686 		list_del(&sdbg_devinfo->dev_list);
2687 		kfree(sdbg_devinfo);
2688 	}
2689 
2690 	kfree(sdbg_host);
2691         return error;
2692 }
2693 
2694 static void sdebug_remove_adapter(void)
2695 {
2696         struct sdebug_host_info * sdbg_host = NULL;
2697 
2698         spin_lock(&sdebug_host_list_lock);
2699         if (!list_empty(&sdebug_host_list)) {
2700                 sdbg_host = list_entry(sdebug_host_list.prev,
2701                                        struct sdebug_host_info, host_list);
2702 		list_del(&sdbg_host->host_list);
2703 	}
2704         spin_unlock(&sdebug_host_list_lock);
2705 
2706 	if (!sdbg_host)
2707 		return;
2708 
2709         device_unregister(&sdbg_host->dev);
2710         --scsi_debug_add_host;
2711 }
2712 
2713 static
2714 int scsi_debug_queuecommand(struct scsi_cmnd *SCpnt, done_funct_t done)
2715 {
2716 	unsigned char *cmd = (unsigned char *) SCpnt->cmnd;
2717 	int len, k;
2718 	unsigned int num;
2719 	unsigned long long lba;
2720 	int errsts = 0;
2721 	int target = SCpnt->device->id;
2722 	struct sdebug_dev_info *devip = NULL;
2723 	int inj_recovered = 0;
2724 	int inj_transport = 0;
2725 	int delay_override = 0;
2726 
2727 	scsi_set_resid(SCpnt, 0);
2728 	if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) && cmd) {
2729 		printk(KERN_INFO "scsi_debug: cmd ");
2730 		for (k = 0, len = SCpnt->cmd_len; k < len; ++k)
2731 			printk("%02x ", (int)cmd[k]);
2732 		printk("\n");
2733 	}
2734 
2735 	if (target == SCpnt->device->host->hostt->this_id) {
2736 		printk(KERN_INFO "scsi_debug: initiator's id used as "
2737 		       "target!\n");
2738 		return schedule_resp(SCpnt, NULL, done,
2739 				     DID_NO_CONNECT << 16, 0);
2740 	}
2741 
2742 	if ((SCpnt->device->lun >= scsi_debug_max_luns) &&
2743 	    (SCpnt->device->lun != SAM2_WLUN_REPORT_LUNS))
2744 		return schedule_resp(SCpnt, NULL, done,
2745 				     DID_NO_CONNECT << 16, 0);
2746 	devip = devInfoReg(SCpnt->device);
2747 	if (NULL == devip)
2748 		return schedule_resp(SCpnt, NULL, done,
2749 				     DID_NO_CONNECT << 16, 0);
2750 
2751 	if ((scsi_debug_every_nth != 0) &&
2752 	    (++scsi_debug_cmnd_count >= abs(scsi_debug_every_nth))) {
2753 		scsi_debug_cmnd_count = 0;
2754 		if (scsi_debug_every_nth < -1)
2755 			scsi_debug_every_nth = -1;
2756 		if (SCSI_DEBUG_OPT_TIMEOUT & scsi_debug_opts)
2757 			return 0; /* ignore command causing timeout */
2758 		else if (SCSI_DEBUG_OPT_RECOVERED_ERR & scsi_debug_opts)
2759 			inj_recovered = 1; /* to reads and writes below */
2760 		else if (SCSI_DEBUG_OPT_TRANSPORT_ERR & scsi_debug_opts)
2761 			inj_transport = 1; /* to reads and writes below */
2762 	}
2763 
2764 	if (devip->wlun) {
2765 		switch (*cmd) {
2766 		case INQUIRY:
2767 		case REQUEST_SENSE:
2768 		case TEST_UNIT_READY:
2769 		case REPORT_LUNS:
2770 			break;  /* only allowable wlun commands */
2771 		default:
2772 			if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2773 				printk(KERN_INFO "scsi_debug: Opcode: 0x%x "
2774 				       "not supported for wlun\n", *cmd);
2775 			mk_sense_buffer(devip, ILLEGAL_REQUEST,
2776 					INVALID_OPCODE, 0);
2777 			errsts = check_condition_result;
2778 			return schedule_resp(SCpnt, devip, done, errsts,
2779 					     0);
2780 		}
2781 	}
2782 
2783 	switch (*cmd) {
2784 	case INQUIRY:     /* mandatory, ignore unit attention */
2785 		delay_override = 1;
2786 		errsts = resp_inquiry(SCpnt, target, devip);
2787 		break;
2788 	case REQUEST_SENSE:	/* mandatory, ignore unit attention */
2789 		delay_override = 1;
2790 		errsts = resp_requests(SCpnt, devip);
2791 		break;
2792 	case REZERO_UNIT:	/* actually this is REWIND for SSC */
2793 	case START_STOP:
2794 		errsts = resp_start_stop(SCpnt, devip);
2795 		break;
2796 	case ALLOW_MEDIUM_REMOVAL:
2797 		errsts = check_readiness(SCpnt, 1, devip);
2798 		if (errsts)
2799 			break;
2800 		if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2801 			printk(KERN_INFO "scsi_debug: Medium removal %s\n",
2802 			       cmd[4] ? "inhibited" : "enabled");
2803 		break;
2804 	case SEND_DIAGNOSTIC:     /* mandatory */
2805 		errsts = check_readiness(SCpnt, 1, devip);
2806 		break;
2807 	case TEST_UNIT_READY:     /* mandatory */
2808 		delay_override = 1;
2809 		errsts = check_readiness(SCpnt, 0, devip);
2810 		break;
2811 	case RESERVE:
2812 		errsts = check_readiness(SCpnt, 1, devip);
2813 		break;
2814 	case RESERVE_10:
2815 		errsts = check_readiness(SCpnt, 1, devip);
2816 		break;
2817 	case RELEASE:
2818 		errsts = check_readiness(SCpnt, 1, devip);
2819 		break;
2820 	case RELEASE_10:
2821 		errsts = check_readiness(SCpnt, 1, devip);
2822 		break;
2823 	case READ_CAPACITY:
2824 		errsts = resp_readcap(SCpnt, devip);
2825 		break;
2826 	case SERVICE_ACTION_IN:
2827 		if (SAI_READ_CAPACITY_16 != cmd[1]) {
2828 			mk_sense_buffer(devip, ILLEGAL_REQUEST,
2829 					INVALID_OPCODE, 0);
2830 			errsts = check_condition_result;
2831 			break;
2832 		}
2833 		errsts = resp_readcap16(SCpnt, devip);
2834 		break;
2835 	case MAINTENANCE_IN:
2836 		if (MI_REPORT_TARGET_PGS != cmd[1]) {
2837 			mk_sense_buffer(devip, ILLEGAL_REQUEST,
2838 					INVALID_OPCODE, 0);
2839 			errsts = check_condition_result;
2840 			break;
2841 		}
2842 		errsts = resp_report_tgtpgs(SCpnt, devip);
2843 		break;
2844 	case READ_16:
2845 	case READ_12:
2846 	case READ_10:
2847 	case READ_6:
2848 		errsts = check_readiness(SCpnt, 0, devip);
2849 		if (errsts)
2850 			break;
2851 		if (scsi_debug_fake_rw)
2852 			break;
2853 		get_data_transfer_info(cmd, &lba, &num);
2854 		errsts = resp_read(SCpnt, lba, num, devip);
2855 		if (inj_recovered && (0 == errsts)) {
2856 			mk_sense_buffer(devip, RECOVERED_ERROR,
2857 					THRESHOLD_EXCEEDED, 0);
2858 			errsts = check_condition_result;
2859 		} else if (inj_transport && (0 == errsts)) {
2860 			mk_sense_buffer(devip, ABORTED_COMMAND,
2861 					TRANSPORT_PROBLEM, ACK_NAK_TO);
2862 			errsts = check_condition_result;
2863 		}
2864 		break;
2865 	case REPORT_LUNS:	/* mandatory, ignore unit attention */
2866 		delay_override = 1;
2867 		errsts = resp_report_luns(SCpnt, devip);
2868 		break;
2869 	case VERIFY:		/* 10 byte SBC-2 command */
2870 		errsts = check_readiness(SCpnt, 0, devip);
2871 		break;
2872 	case WRITE_16:
2873 	case WRITE_12:
2874 	case WRITE_10:
2875 	case WRITE_6:
2876 		errsts = check_readiness(SCpnt, 0, devip);
2877 		if (errsts)
2878 			break;
2879 		if (scsi_debug_fake_rw)
2880 			break;
2881 		get_data_transfer_info(cmd, &lba, &num);
2882 		errsts = resp_write(SCpnt, lba, num, devip);
2883 		if (inj_recovered && (0 == errsts)) {
2884 			mk_sense_buffer(devip, RECOVERED_ERROR,
2885 					THRESHOLD_EXCEEDED, 0);
2886 			errsts = check_condition_result;
2887 		}
2888 		break;
2889 	case MODE_SENSE:
2890 	case MODE_SENSE_10:
2891 		errsts = resp_mode_sense(SCpnt, target, devip);
2892 		break;
2893 	case MODE_SELECT:
2894 		errsts = resp_mode_select(SCpnt, 1, devip);
2895 		break;
2896 	case MODE_SELECT_10:
2897 		errsts = resp_mode_select(SCpnt, 0, devip);
2898 		break;
2899 	case LOG_SENSE:
2900 		errsts = resp_log_sense(SCpnt, devip);
2901 		break;
2902 	case SYNCHRONIZE_CACHE:
2903 		delay_override = 1;
2904 		errsts = check_readiness(SCpnt, 0, devip);
2905 		break;
2906 	case WRITE_BUFFER:
2907 		errsts = check_readiness(SCpnt, 1, devip);
2908 		break;
2909 	case XDWRITEREAD_10:
2910 		if (!scsi_bidi_cmnd(SCpnt)) {
2911 			mk_sense_buffer(devip, ILLEGAL_REQUEST,
2912 					INVALID_FIELD_IN_CDB, 0);
2913 			errsts = check_condition_result;
2914 			break;
2915 		}
2916 
2917 		errsts = check_readiness(SCpnt, 0, devip);
2918 		if (errsts)
2919 			break;
2920 		if (scsi_debug_fake_rw)
2921 			break;
2922 		get_data_transfer_info(cmd, &lba, &num);
2923 		errsts = resp_read(SCpnt, lba, num, devip);
2924 		if (errsts)
2925 			break;
2926 		errsts = resp_write(SCpnt, lba, num, devip);
2927 		if (errsts)
2928 			break;
2929 		errsts = resp_xdwriteread(SCpnt, lba, num, devip);
2930 		break;
2931 	default:
2932 		if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2933 			printk(KERN_INFO "scsi_debug: Opcode: 0x%x not "
2934 			       "supported\n", *cmd);
2935 		errsts = check_readiness(SCpnt, 1, devip);
2936 		if (errsts)
2937 			break;	/* Unit attention takes precedence */
2938 		mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_OPCODE, 0);
2939 		errsts = check_condition_result;
2940 		break;
2941 	}
2942 	return schedule_resp(SCpnt, devip, done, errsts,
2943 			     (delay_override ? 0 : scsi_debug_delay));
2944 }
2945 
2946 static struct scsi_host_template sdebug_driver_template = {
2947 	.proc_info =		scsi_debug_proc_info,
2948 	.proc_name =		sdebug_proc_name,
2949 	.name =			"SCSI DEBUG",
2950 	.info =			scsi_debug_info,
2951 	.slave_alloc =		scsi_debug_slave_alloc,
2952 	.slave_configure =	scsi_debug_slave_configure,
2953 	.slave_destroy =	scsi_debug_slave_destroy,
2954 	.ioctl =		scsi_debug_ioctl,
2955 	.queuecommand =		scsi_debug_queuecommand,
2956 	.eh_abort_handler =	scsi_debug_abort,
2957 	.eh_bus_reset_handler = scsi_debug_bus_reset,
2958 	.eh_device_reset_handler = scsi_debug_device_reset,
2959 	.eh_host_reset_handler = scsi_debug_host_reset,
2960 	.bios_param =		scsi_debug_biosparam,
2961 	.can_queue =		SCSI_DEBUG_CANQUEUE,
2962 	.this_id =		7,
2963 	.sg_tablesize =		256,
2964 	.cmd_per_lun =		16,
2965 	.max_sectors =		0xffff,
2966 	.use_clustering = 	DISABLE_CLUSTERING,
2967 	.module =		THIS_MODULE,
2968 };
2969 
2970 static int sdebug_driver_probe(struct device * dev)
2971 {
2972         int error = 0;
2973         struct sdebug_host_info *sdbg_host;
2974         struct Scsi_Host *hpnt;
2975 
2976 	sdbg_host = to_sdebug_host(dev);
2977 
2978         hpnt = scsi_host_alloc(&sdebug_driver_template, sizeof(sdbg_host));
2979         if (NULL == hpnt) {
2980                 printk(KERN_ERR "%s: scsi_register failed\n", __FUNCTION__);
2981                 error = -ENODEV;
2982 		return error;
2983         }
2984 
2985         sdbg_host->shost = hpnt;
2986 	*((struct sdebug_host_info **)hpnt->hostdata) = sdbg_host;
2987 	if ((hpnt->this_id >= 0) && (scsi_debug_num_tgts > hpnt->this_id))
2988 		hpnt->max_id = scsi_debug_num_tgts + 1;
2989 	else
2990 		hpnt->max_id = scsi_debug_num_tgts;
2991 	hpnt->max_lun = SAM2_WLUN_REPORT_LUNS;	/* = scsi_debug_max_luns; */
2992 
2993         error = scsi_add_host(hpnt, &sdbg_host->dev);
2994         if (error) {
2995                 printk(KERN_ERR "%s: scsi_add_host failed\n", __FUNCTION__);
2996                 error = -ENODEV;
2997 		scsi_host_put(hpnt);
2998         } else
2999 		scsi_scan_host(hpnt);
3000 
3001 
3002         return error;
3003 }
3004 
3005 static int sdebug_driver_remove(struct device * dev)
3006 {
3007         struct sdebug_host_info *sdbg_host;
3008 	struct sdebug_dev_info *sdbg_devinfo, *tmp;
3009 
3010 	sdbg_host = to_sdebug_host(dev);
3011 
3012 	if (!sdbg_host) {
3013 		printk(KERN_ERR "%s: Unable to locate host info\n",
3014 		       __FUNCTION__);
3015 		return -ENODEV;
3016 	}
3017 
3018         scsi_remove_host(sdbg_host->shost);
3019 
3020 	list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
3021 				 dev_list) {
3022                 list_del(&sdbg_devinfo->dev_list);
3023                 kfree(sdbg_devinfo);
3024         }
3025 
3026         scsi_host_put(sdbg_host->shost);
3027         return 0;
3028 }
3029 
3030 static void sdebug_max_tgts_luns(void)
3031 {
3032 	struct sdebug_host_info * sdbg_host;
3033 	struct Scsi_Host *hpnt;
3034 
3035 	spin_lock(&sdebug_host_list_lock);
3036 	list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
3037 		hpnt = sdbg_host->shost;
3038 		if ((hpnt->this_id >= 0) &&
3039 		    (scsi_debug_num_tgts > hpnt->this_id))
3040 			hpnt->max_id = scsi_debug_num_tgts + 1;
3041 		else
3042 			hpnt->max_id = scsi_debug_num_tgts;
3043 		hpnt->max_lun = SAM2_WLUN_REPORT_LUNS; /* scsi_debug_max_luns; */
3044 	}
3045 	spin_unlock(&sdebug_host_list_lock);
3046 }
3047