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