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