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