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