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