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