patch-2_6_7-vs1_9_1_12
[linux-2.6.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/sdebug25.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/config.h>
28 #include <linux/module.h>
29
30 #include <linux/kernel.h>
31 #include <linux/sched.h>
32 #include <linux/errno.h>
33 #include <linux/timer.h>
34 #include <linux/types.h>
35 #include <linux/string.h>
36 #include <linux/genhd.h>
37 #include <linux/fs.h>
38 #include <linux/init.h>
39 #include <linux/proc_fs.h>
40 #include <linux/smp_lock.h>
41 #include <linux/vmalloc.h>
42 #include <linux/moduleparam.h>
43
44 #include <linux/blkdev.h>
45 #include "scsi.h"
46 #include "hosts.h"
47 #include <scsi/scsicam.h>
48
49 #include <linux/stat.h>
50
51 #ifndef LINUX_VERSION_CODE
52 #include <linux/version.h>
53 #endif
54
55 #include "scsi_logging.h"
56 #include "scsi_debug.h"
57
58 static const char * scsi_debug_version_str = "Version: 1.71 (20031007)";
59
60 /* Additional Sense Code (ASC) used */
61 #define NO_ADDED_SENSE 0x0
62 #define UNRECOVERED_READ_ERR 0x11
63 #define INVALID_OPCODE 0x20
64 #define ADDR_OUT_OF_RANGE 0x21
65 #define INVALID_FIELD_IN_CDB 0x24
66 #define POWERON_RESET 0x29
67 #define SAVING_PARAMS_UNSUP 0x39
68 #define THRESHHOLD_EXCEEDED 0x5d
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_DEV_SIZE_MB   8
80 #define DEF_EVERY_NTH   0
81 #define DEF_DELAY   1
82 #define DEF_SCSI_LEVEL   3
83 #define DEF_OPTS   0
84
85 /* bit mask values for scsi_debug_opts */
86 #define SCSI_DEBUG_OPT_NOISE   1
87 #define SCSI_DEBUG_OPT_MEDIUM_ERR   2
88 #define SCSI_DEBUG_OPT_TIMEOUT   4
89 #define SCSI_DEBUG_OPT_RECOVERED_ERR   8
90 /* When "every_nth" > 0 then modulo "every_nth" commands:
91  *   - a no response is simulated if SCSI_DEBUG_OPT_TIMEOUT is set
92  *   - a RECOVERED_ERROR is simulated on successful read and write
93  *     commands if SCSI_DEBUG_OPT_RECOVERED_ERR is set.
94  */
95
96 /* when 1==SCSI_DEBUG_OPT_MEDIUM_ERR, a medium error is simulated at this
97  * sector on read commands: */
98 #define OPT_MEDIUM_ERR_ADDR   0x1234 /* that's sector 4660 in decimal */
99
100 /* If REPORT LUNS has luns >= 256 it can choose "flat space" (value 1)
101  * or "peripheral device" addressing (value 0) */
102 #define SAM2_LUN_ADDRESS_METHOD 0
103
104 static int scsi_debug_dev_size_mb = DEF_DEV_SIZE_MB;
105 static int scsi_debug_num_tgts = DEF_NUM_TGTS; /* targets per host */
106 static int scsi_debug_opts = DEF_OPTS;
107 static int scsi_debug_every_nth = DEF_EVERY_NTH;
108 static int scsi_debug_cmnd_count = 0;
109 static int scsi_debug_delay = DEF_DELAY;
110 static int scsi_debug_max_luns = DEF_MAX_LUNS;
111 static int scsi_debug_scsi_level = DEF_SCSI_LEVEL;
112 static int scsi_debug_add_host = DEF_NUM_HOST;
113
114 #define DEV_READONLY(TGT)      (0)
115 #define DEV_REMOVEABLE(TGT)    (0)
116 #define PERIPH_DEVICE_TYPE(TGT) (TYPE_DISK);
117
118 static unsigned long sdebug_store_size; /* in bytes */
119 static sector_t sdebug_capacity;        /* in sectors */
120
121 /* old BIOS stuff, kernel may get rid of them but some mode sense pages
122    may still need them */
123 static int sdebug_heads;                /* heads per disk */
124 static int sdebug_cylinders_per;        /* cylinders per surface */
125 static int sdebug_sectors_per;          /* sectors per cylinder */
126
127 /* default sector size is 512 bytes, 2**9 bytes */
128 #define POW2_SECT_SIZE 9
129 #define SECT_SIZE (1 << POW2_SECT_SIZE)
130 #define SECT_SIZE_PER(TGT) SECT_SIZE
131
132 #define SDEBUG_SENSE_LEN 32
133
134 struct sdebug_dev_info {
135         struct list_head dev_list;
136         unsigned char sense_buff[SDEBUG_SENSE_LEN];     /* weak nexus */
137         unsigned int channel;
138         unsigned int target;
139         unsigned int lun;
140         struct sdebug_host_info *sdbg_host;
141         char reset;
142         char used;
143 };
144
145 struct sdebug_host_info {
146         struct list_head host_list;
147         struct Scsi_Host *shost;
148         struct device dev;
149         struct list_head dev_info_list;
150 };
151
152 #define to_sdebug_host(d)       \
153         container_of(d, struct sdebug_host_info, dev)
154
155 static LIST_HEAD(sdebug_host_list);
156 static spinlock_t sdebug_host_list_lock = SPIN_LOCK_UNLOCKED;
157
158 typedef void (* done_funct_t) (struct scsi_cmnd *);
159
160 struct sdebug_queued_cmd {
161         int in_use;
162         struct timer_list cmnd_timer;
163         done_funct_t done_funct;
164         struct scsi_cmnd * a_cmnd;
165         int scsi_result;
166 };
167 static struct sdebug_queued_cmd queued_arr[SCSI_DEBUG_CANQUEUE];
168
169 static Scsi_Host_Template sdebug_driver_template = {
170         .proc_info =            scsi_debug_proc_info,
171         .name =                 "SCSI DEBUG",
172         .info =                 scsi_debug_info,
173         .slave_alloc =          scsi_debug_slave_alloc,
174         .slave_configure =      scsi_debug_slave_configure,
175         .slave_destroy =        scsi_debug_slave_destroy,
176         .ioctl =                scsi_debug_ioctl,
177         .queuecommand =         scsi_debug_queuecommand,
178         .eh_abort_handler =     scsi_debug_abort,
179         .eh_bus_reset_handler = scsi_debug_bus_reset,
180         .eh_device_reset_handler = scsi_debug_device_reset,
181         .eh_host_reset_handler = scsi_debug_host_reset,
182         .bios_param =           scsi_debug_biosparam,
183         .can_queue =            SCSI_DEBUG_CANQUEUE,
184         .this_id =              7,
185         .sg_tablesize =         64,
186         .cmd_per_lun =          3,
187         .max_sectors =          4096,
188         .unchecked_isa_dma =    0,
189         .use_clustering =       ENABLE_CLUSTERING,
190         .module =               THIS_MODULE,
191 };
192
193 static unsigned char * fake_storep;     /* ramdisk storage */
194
195 static unsigned char spare_buff[SDEBUG_SENSE_LEN];
196
197 static int num_aborts = 0;
198 static int num_dev_resets = 0;
199 static int num_bus_resets = 0;
200 static int num_host_resets = 0;
201
202 static spinlock_t queued_arr_lock = SPIN_LOCK_UNLOCKED;
203 static rwlock_t atomic_rw = RW_LOCK_UNLOCKED;
204
205 static char sdebug_proc_name[] = "scsi_debug";
206
207 static int sdebug_driver_probe(struct device *);
208 static int sdebug_driver_remove(struct device *);
209 static struct bus_type pseudo_lld_bus;
210
211 static struct device_driver sdebug_driverfs_driver = {
212         .name           = sdebug_proc_name,
213         .bus            = &pseudo_lld_bus,
214         .probe          = sdebug_driver_probe,
215         .remove         = sdebug_driver_remove,
216 };
217
218 static const int check_condition_result = 
219                 (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
220
221 /* function declarations */
222 static int resp_inquiry(unsigned char * cmd, int target, unsigned char * buff,
223                         int bufflen, struct sdebug_dev_info * devip);
224 static int resp_mode_sense(unsigned char * cmd, int target,
225                            unsigned char * buff, int bufflen,
226                            struct sdebug_dev_info * devip);
227 static int resp_read(struct scsi_cmnd * SCpnt, int upper_blk, int block, 
228                      int num, struct sdebug_dev_info * devip);
229 static int resp_write(struct scsi_cmnd * SCpnt, int upper_blk, int block,
230                       int num, struct sdebug_dev_info * devip);
231 static int resp_report_luns(unsigned char * cmd, unsigned char * buff,
232                             int bufflen, struct sdebug_dev_info * devip);
233 static void timer_intr_handler(unsigned long);
234 static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev);
235 static void mk_sense_buffer(struct sdebug_dev_info * devip, int key, 
236                             int asc, int asq, int inbandLen);
237 static int check_reset(struct scsi_cmnd * SCpnt, 
238                        struct sdebug_dev_info * devip);
239 static int schedule_resp(struct scsi_cmnd * cmnd, 
240                          struct sdebug_dev_info * devip, 
241                          done_funct_t done, int scsi_result, int delta_jiff);
242 static void init_all_queued(void);
243 static void stop_all_queued(void);
244 static int stop_queued_cmnd(struct scsi_cmnd * cmnd);
245 static int inquiry_evpd_83(unsigned char * arr, int dev_id_num,
246                            const char * dev_id_str, int dev_id_str_len);
247 static void do_create_driverfs_files(void);
248 static void do_remove_driverfs_files(void);
249
250 static int sdebug_add_adapter(void);
251 static void sdebug_remove_adapter(void);
252 static struct device pseudo_primary;
253 static struct bus_type pseudo_lld_bus;
254
255 static unsigned char * scatg2virt(const struct scatterlist * sclp)
256 {
257         if (NULL == sclp)
258                 return NULL;
259         else if (sclp->page)
260                 return (unsigned char *)page_address(sclp->page) + 
261                        sclp->offset;
262         else
263                 return NULL;
264 }
265
266 static
267 int scsi_debug_queuecommand(struct scsi_cmnd * SCpnt, done_funct_t done)
268 {
269         unsigned char *cmd = (unsigned char *) SCpnt->cmnd;
270         int block, upper_blk, num;
271         unsigned char *buff;
272         int errsts = 0;
273         int target = SCpnt->device->id;
274         int bufflen = SCpnt->request_bufflen;
275         unsigned long capac;
276         struct sdebug_dev_info * devip = NULL;
277         unsigned char * sbuff;
278         int inj_recovered = 0;
279
280         if (done == NULL)
281                 return 0;       /* assume mid level reprocessing command */
282
283         if (SCpnt->use_sg) { /* just use first element */
284                 struct scatterlist *sgpnt = (struct scatterlist *)
285                                                 SCpnt->request_buffer;
286
287                 buff = scatg2virt(&sgpnt[0]);
288                 bufflen = sgpnt[0].length;
289                 /* READ and WRITE process scatterlist themselves */
290         }
291         else 
292                 buff = (unsigned char *) SCpnt->request_buffer;
293         if (NULL == buff) {
294                 buff = spare_buff;      /* assume cmd moves no data */
295                 bufflen = SDEBUG_SENSE_LEN;
296         }
297
298
299         if(target == sdebug_driver_template.this_id) {
300                 printk(KERN_INFO "scsi_debug: initiator's id used as "
301                        "target!\n");
302                 return schedule_resp(SCpnt, NULL, done,
303                                      DID_NO_CONNECT << 16, 0);
304         }
305
306         if (SCpnt->device->lun >= scsi_debug_max_luns)
307                 return schedule_resp(SCpnt, NULL, done, 
308                                      DID_NO_CONNECT << 16, 0);
309         devip = devInfoReg(SCpnt->device);
310         if (NULL == devip)
311                 return schedule_resp(SCpnt, NULL, done, 
312                                      DID_NO_CONNECT << 16, 0);
313
314         if ((scsi_debug_every_nth > 0) &&
315             (++scsi_debug_cmnd_count >= scsi_debug_every_nth)) {
316                 scsi_debug_cmnd_count =0;
317                 if (SCSI_DEBUG_OPT_TIMEOUT & scsi_debug_opts)
318                         return 0; /* ignore command causing timeout */
319                 else if (SCSI_DEBUG_OPT_RECOVERED_ERR & scsi_debug_opts)
320                         inj_recovered = 1; /* to reads and writes below */
321         }
322
323         switch (*cmd) {
324         case INQUIRY:     /* mandatory */
325                 errsts = resp_inquiry(cmd, target, buff, bufflen, devip);
326                 break;
327         case REQUEST_SENSE:     /* mandatory */
328                 /* Since this driver indicates autosense by placing the
329                  * sense buffer in the scsi_cmnd structure in the response
330                  * (when SAM_STAT_CHECK_CONDITION is set), the mid level
331                  * shouldn't need to call REQUEST_SENSE */
332                 if (devip) {
333                         sbuff = devip->sense_buff;
334                         memcpy(buff, sbuff, (bufflen < SDEBUG_SENSE_LEN) ? 
335                                              bufflen : SDEBUG_SENSE_LEN);
336                         mk_sense_buffer(devip, 0, NO_ADDED_SENSE, 0, 7);
337                 } else {
338                         memset(buff, 0, bufflen);
339                         buff[0] = 0x70;
340                 }
341                 break;
342         case START_STOP:
343                 errsts = check_reset(SCpnt, devip);
344                 break;
345         case ALLOW_MEDIUM_REMOVAL:
346                 if ((errsts = check_reset(SCpnt, devip)))
347                         break;
348                 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
349                         printk("\tMedium removal %s\n",
350                                cmd[4] ? "inhibited" : "enabled");
351                 break;
352         case SEND_DIAGNOSTIC:     /* mandatory */
353                 memset(buff, 0, bufflen);
354                 break;
355         case TEST_UNIT_READY:     /* mandatory */
356                 memset(buff, 0, bufflen);
357                 break;
358         case RESERVE:
359                 errsts = check_reset(SCpnt, devip);
360                 memset(buff, 0, bufflen);
361                 break;
362         case RESERVE_10:
363                 errsts = check_reset(SCpnt, devip);
364                 memset(buff, 0, bufflen);
365                 break;
366         case RELEASE:
367                 errsts = check_reset(SCpnt, devip);
368                 memset(buff, 0, bufflen);
369                 break;
370         case RELEASE_10:
371                 errsts = check_reset(SCpnt, devip);
372                 memset(buff, 0, bufflen);
373                 break;
374         case READ_CAPACITY:
375                 errsts = check_reset(SCpnt, devip);
376                 memset(buff, 0, bufflen);
377                 if (bufflen > 7) {
378                         capac = (unsigned long)sdebug_capacity - 1;
379                         buff[0] = (capac >> 24);
380                         buff[1] = (capac >> 16) & 0xff;
381                         buff[2] = (capac >> 8) & 0xff;
382                         buff[3] = capac & 0xff;
383                         buff[6] = (SECT_SIZE_PER(target) >> 8) & 0xff;
384                         buff[7] = SECT_SIZE_PER(target) & 0xff;
385                 }
386                 break;
387         case READ_16:
388         case READ_12:
389         case READ_10:
390         case READ_6:
391                 if ((errsts = check_reset(SCpnt, devip)))
392                         break;
393                 upper_blk = 0;
394                 if ((*cmd) == READ_16) {
395                         upper_blk = cmd[5] + (cmd[4] << 8) + 
396                                     (cmd[3] << 16) + (cmd[2] << 24);
397                         block = cmd[9] + (cmd[8] << 8) + 
398                                 (cmd[7] << 16) + (cmd[6] << 24);
399                         num = cmd[13] + (cmd[12] << 8) + 
400                                 (cmd[11] << 16) + (cmd[10] << 24);
401                 } else if ((*cmd) == READ_12) {
402                         block = cmd[5] + (cmd[4] << 8) + 
403                                 (cmd[3] << 16) + (cmd[2] << 24);
404                         num = cmd[9] + (cmd[8] << 8) + 
405                                 (cmd[7] << 16) + (cmd[6] << 24);
406                 } else if ((*cmd) == READ_10) {
407                         block = cmd[5] + (cmd[4] << 8) + 
408                                 (cmd[3] << 16) + (cmd[2] << 24);
409                         num = cmd[8] + (cmd[7] << 8);
410                 } else {
411                         block = cmd[3] + (cmd[2] << 8) + 
412                                 ((cmd[1] & 0x1f) << 16);
413                         num = cmd[4];
414                 }
415                 errsts = resp_read(SCpnt, upper_blk, block, num, devip);
416                 if (inj_recovered && (0 == errsts)) {
417                         mk_sense_buffer(devip, RECOVERED_ERROR, 
418                                         THRESHHOLD_EXCEEDED, 0, 18);
419                         errsts = check_condition_result;
420                 }
421                 break;
422         case REPORT_LUNS:
423                 errsts = resp_report_luns(cmd, buff, bufflen, devip);
424                 break;
425         case WRITE_16:
426         case WRITE_12:
427         case WRITE_10:
428         case WRITE_6:
429                 if ((errsts = check_reset(SCpnt, devip)))
430                         break;
431                 upper_blk = 0;
432                 if ((*cmd) == WRITE_16) {
433                         upper_blk = cmd[5] + (cmd[4] << 8) + 
434                                     (cmd[3] << 16) + (cmd[2] << 24);
435                         block = cmd[9] + (cmd[8] << 8) + 
436                                 (cmd[7] << 16) + (cmd[6] << 24);
437                         num = cmd[13] + (cmd[12] << 8) + 
438                                 (cmd[11] << 16) + (cmd[10] << 24);
439                 } else if ((*cmd) == WRITE_12) {
440                         block = cmd[5] + (cmd[4] << 8) + 
441                                 (cmd[3] << 16) + (cmd[2] << 24);
442                         num = cmd[9] + (cmd[8] << 8) + 
443                                 (cmd[7] << 16) + (cmd[6] << 24);
444                 } else if ((*cmd) == WRITE_10) {
445                         block = cmd[5] + (cmd[4] << 8) + 
446                                 (cmd[3] << 16) + (cmd[2] << 24);
447                         num = cmd[8] + (cmd[7] << 8);
448                 } else {
449                         block = cmd[3] + (cmd[2] << 8) + 
450                                 ((cmd[1] & 0x1f) << 16);
451                         num = cmd[4];
452                 }
453                 errsts = resp_write(SCpnt, upper_blk, block, num, devip);
454                 if (inj_recovered && (0 == errsts)) {
455                         mk_sense_buffer(devip, RECOVERED_ERROR, 
456                                         THRESHHOLD_EXCEEDED, 0, 18);
457                         errsts = check_condition_result;
458                 }
459                 break;
460         case MODE_SENSE:
461         case MODE_SENSE_10:
462                 errsts = resp_mode_sense(cmd, target, buff, bufflen, devip);
463                 break;
464         case SYNCHRONIZE_CACHE:
465                 memset(buff, 0, bufflen);
466                 break;
467         default:
468                 if ((errsts = check_reset(SCpnt, devip)))
469                         break;
470                 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_OPCODE, 0, 18);
471                 errsts = check_condition_result;
472                 break;
473         }
474         return schedule_resp(SCpnt, devip, done, errsts, scsi_debug_delay);
475 }
476
477 static int scsi_debug_ioctl(struct scsi_device *dev, int cmd, void *arg)
478 {
479         if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
480                 printk(KERN_INFO "scsi_debug: ioctl: cmd=0x%x\n", cmd);
481         }
482         return -EINVAL;
483         /* return -ENOTTY; // correct return but upsets fdisk */
484 }
485
486 static int check_reset(struct scsi_cmnd * SCpnt, struct sdebug_dev_info * devip)
487 {
488         if (devip->reset) {
489                 devip->reset = 0;
490                 mk_sense_buffer(devip, UNIT_ATTENTION, POWERON_RESET, 0, 18);
491                 return check_condition_result;
492         }
493         return 0;
494 }
495
496 #define SDEBUG_LONG_INQ_SZ 58
497 #define SDEBUG_MAX_INQ_ARR_SZ 128
498
499 static const char * vendor_id = "Linux   ";
500 static const char * product_id = "scsi_debug      ";
501 static const char * product_rev = "0004";
502
503 static int inquiry_evpd_83(unsigned char * arr, int dev_id_num, 
504                            const char * dev_id_str, int dev_id_str_len)
505 {
506         int num;
507
508         /* Two identification descriptors: */
509         /* T10 vendor identifier field format (faked) */
510         arr[0] = 0x2;   /* ASCII */
511         arr[1] = 0x1;
512         arr[2] = 0x0;
513         memcpy(&arr[4], vendor_id, 8);
514         memcpy(&arr[12], product_id, 16);
515         memcpy(&arr[28], dev_id_str, dev_id_str_len);
516         num = 8 + 16 + dev_id_str_len;
517         arr[3] = num;
518         num += 4;
519         /* NAA IEEE registered identifier (faked) */
520         arr[num] = 0x1; /* binary */
521         arr[num + 1] = 0x3;
522         arr[num + 2] = 0x0;
523         arr[num + 3] = 0x8;
524         arr[num + 4] = 0x51;    /* ieee company id=0x123456 (faked) */
525         arr[num + 5] = 0x23;
526         arr[num + 6] = 0x45;
527         arr[num + 7] = 0x60;
528         arr[num + 8] = (dev_id_num >> 24);
529         arr[num + 9] = (dev_id_num >> 16) & 0xff;
530         arr[num + 10] = (dev_id_num >> 8) & 0xff;
531         arr[num + 11] = dev_id_num & 0xff;
532         return num + 12;
533 }
534
535 static int resp_inquiry(unsigned char * cmd, int target, unsigned char * buff,
536                         int bufflen, struct sdebug_dev_info * devip)
537 {
538         unsigned char pq_pdt;
539         unsigned char arr[SDEBUG_MAX_INQ_ARR_SZ];
540         int min_len = bufflen > SDEBUG_MAX_INQ_ARR_SZ ? 
541                         SDEBUG_MAX_INQ_ARR_SZ : bufflen;
542
543         if (bufflen < cmd[4])
544                 printk(KERN_INFO "scsi_debug: inquiry: bufflen=%d "
545                        "< alloc_length=%d\n", bufflen, (int)cmd[4]);
546         memset(buff, 0, bufflen);
547         memset(arr, 0, SDEBUG_MAX_INQ_ARR_SZ);
548         pq_pdt = PERIPH_DEVICE_TYPE(target);
549         arr[0] = pq_pdt;
550         if (0x2 & cmd[1]) {  /* CMDDT bit set */
551                 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
552                                 0, 18);
553                 return check_condition_result;
554         } else if (0x1 & cmd[1]) {  /* EVPD bit set */
555                 int dev_id_num, len;
556                 char dev_id_str[6];
557                 
558                 dev_id_num = ((devip->sdbg_host->shost->host_no + 1) * 2000) +
559                              (devip->target * 1000) + devip->lun;
560                 len = scnprintf(dev_id_str, 6, "%d", dev_id_num);
561                 if (0 == cmd[2]) { /* supported vital product data pages */
562                         arr[3] = 3;
563                         arr[4] = 0x0; /* this page */
564                         arr[5] = 0x80; /* unit serial number */
565                         arr[6] = 0x83; /* device identification */
566                 } else if (0x80 == cmd[2]) { /* unit serial number */
567                         arr[1] = 0x80;
568                         arr[3] = len;
569                         memcpy(&arr[4], dev_id_str, len);
570                 } else if (0x83 == cmd[2]) { /* device identification */
571                         arr[1] = 0x83;
572                         arr[3] = inquiry_evpd_83(&arr[4], dev_id_num,
573                                                  dev_id_str, len);
574                 } else {
575                         /* Illegal request, invalid field in cdb */
576                         mk_sense_buffer(devip, ILLEGAL_REQUEST, 
577                                         INVALID_FIELD_IN_CDB, 0, 18);
578                         return check_condition_result;
579                 }
580                 memcpy(buff, arr, min_len); 
581                 return 0;
582         }
583         /* drops through here for a standard inquiry */
584         arr[1] = DEV_REMOVEABLE(target) ? 0x80 : 0;     /* Removable disk */
585         arr[2] = scsi_debug_scsi_level;
586         arr[4] = SDEBUG_LONG_INQ_SZ - 5;
587         arr[7] = 0x3a; /* claim: WBUS16, SYNC, LINKED + CMDQUE */
588         memcpy(&arr[8], vendor_id, 8);
589         memcpy(&arr[16], product_id, 16);
590         memcpy(&arr[32], product_rev, 4);
591         memcpy(buff, arr, min_len);
592         return 0;
593 }
594
595 /* <<Following mode page info copied from ST318451LW>> */ 
596
597 static int resp_err_recov_pg(unsigned char * p, int pcontrol, int target)
598 {       /* Read-Write Error Recovery page for mode_sense */
599         unsigned char err_recov_pg[] = {0x1, 0xa, 0xc0, 11, 240, 0, 0, 0, 
600                                         5, 0, 0xff, 0xff};
601
602         memcpy(p, err_recov_pg, sizeof(err_recov_pg));
603         if (1 == pcontrol)
604                 memset(p + 2, 0, sizeof(err_recov_pg) - 2);
605         return sizeof(err_recov_pg);
606 }
607
608 static int resp_disconnect_pg(unsigned char * p, int pcontrol, int target)
609 {       /* Disconnect-Reconnect page for mode_sense */
610         unsigned char disconnect_pg[] = {0x2, 0xe, 128, 128, 0, 10, 0, 0, 
611                                          0, 0, 0, 0, 0, 0, 0, 0};
612
613         memcpy(p, disconnect_pg, sizeof(disconnect_pg));
614         if (1 == pcontrol)
615                 memset(p + 2, 0, sizeof(disconnect_pg) - 2);
616         return sizeof(disconnect_pg);
617 }
618
619 static int resp_format_pg(unsigned char * p, int pcontrol, int target)
620 {       /* Format device page for mode_sense */
621         unsigned char format_pg[] = {0x3, 0x16, 0, 0, 0, 0, 0, 0,
622                                      0, 0, 0, 0, 0, 0, 0, 0,
623                                      0, 0, 0, 0, 0x40, 0, 0, 0};
624
625         memcpy(p, format_pg, sizeof(format_pg));
626         p[10] = (sdebug_sectors_per >> 8) & 0xff;
627         p[11] = sdebug_sectors_per & 0xff;
628         p[12] = (SECT_SIZE >> 8) & 0xff;
629         p[13] = SECT_SIZE & 0xff;
630         if (DEV_REMOVEABLE(target))
631                 p[20] |= 0x20; /* should agree with INQUIRY */
632         if (1 == pcontrol)
633                 memset(p + 2, 0, sizeof(format_pg) - 2);
634         return sizeof(format_pg);
635 }
636
637 static int resp_caching_pg(unsigned char * p, int pcontrol, int target)
638 {       /* Caching page for mode_sense */
639         unsigned char caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0, 
640                 0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0,     0, 0, 0, 0};
641
642         memcpy(p, caching_pg, sizeof(caching_pg));
643         if (1 == pcontrol)
644                 memset(p + 2, 0, sizeof(caching_pg) - 2);
645         return sizeof(caching_pg);
646 }
647
648 static int resp_ctrl_m_pg(unsigned char * p, int pcontrol, int target)
649 {       /* Control mode page for mode_sense */
650         unsigned char ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
651                                      0, 0, 0x2, 0x4b};
652
653         memcpy(p, ctrl_m_pg, sizeof(ctrl_m_pg));
654         if (1 == pcontrol)
655                 memset(p + 2, 0, sizeof(ctrl_m_pg) - 2);
656         return sizeof(ctrl_m_pg);
657 }
658
659 static int resp_iec_m_pg(unsigned char * p, int pcontrol, int target)
660 {       /* Informational Exceptions control mode page for mode_sense */
661         unsigned char iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
662                                     0, 0, 0x0, 0x0};
663         memcpy(p, iec_m_pg, sizeof(iec_m_pg));
664         if (1 == pcontrol)
665                 memset(p + 2, 0, sizeof(iec_m_pg) - 2);
666         return sizeof(iec_m_pg);
667 }
668
669 #define SDEBUG_MAX_MSENSE_SZ 256
670
671 static int resp_mode_sense(unsigned char * cmd, int target,
672                            unsigned char * buff, int bufflen,
673                            struct sdebug_dev_info * devip)
674 {
675         unsigned char dbd;
676         int pcontrol, pcode;
677         unsigned char dev_spec;
678         int alloc_len, msense_6, offset, len;
679         unsigned char * ap;
680         unsigned char arr[SDEBUG_MAX_MSENSE_SZ];
681         int min_len = bufflen > SDEBUG_MAX_MSENSE_SZ ? 
682                         SDEBUG_MAX_MSENSE_SZ : bufflen;
683
684         SCSI_LOG_LLQUEUE(3, printk("Mode sense ...(%p %d)\n", buff, bufflen));
685         dbd = cmd[1] & 0x8;
686         pcontrol = (cmd[2] & 0xc0) >> 6;
687         pcode = cmd[2] & 0x3f;
688         msense_6 = (MODE_SENSE == cmd[0]);
689         alloc_len = msense_6 ? cmd[4] : ((cmd[7] << 8) | cmd[8]);
690         /* printk(KERN_INFO "msense: dbd=%d pcontrol=%d pcode=%d "
691                 "msense_6=%d alloc_len=%d\n", dbd, pcontrol, pcode, "
692                 "msense_6, alloc_len); */
693         if (bufflen < alloc_len)
694                 printk(KERN_INFO "scsi_debug: mode_sense: bufflen=%d "
695                        "< alloc_length=%d\n", bufflen, alloc_len);
696         memset(buff, 0, bufflen);
697         memset(arr, 0, SDEBUG_MAX_MSENSE_SZ);
698         if (0x3 == pcontrol) {  /* Saving values not supported */
699                 mk_sense_buffer(devip, ILLEGAL_REQUEST, SAVING_PARAMS_UNSUP,
700                                 0, 18);
701                 return check_condition_result;
702         }
703         dev_spec = DEV_READONLY(target) ? 0x80 : 0x0;
704         if (msense_6) {
705                 arr[2] = dev_spec;
706                 offset = 4;
707         } else {
708                 arr[3] = dev_spec;
709                 offset = 8;
710         }
711         ap = arr + offset;
712
713         switch (pcode) {
714         case 0x1:       /* Read-Write error recovery page, direct access */
715                 len = resp_err_recov_pg(ap, pcontrol, target);
716                 offset += len;
717                 break;
718         case 0x2:       /* Disconnect-Reconnect page, all devices */
719                 len = resp_disconnect_pg(ap, pcontrol, target);
720                 offset += len;
721                 break;
722         case 0x3:       /* Format device page, direct access */
723                 len = resp_format_pg(ap, pcontrol, target);
724                 offset += len;
725                 break;
726         case 0x8:       /* Caching page, direct access */
727                 len = resp_caching_pg(ap, pcontrol, target);
728                 offset += len;
729                 break;
730         case 0xa:       /* Control Mode page, all devices */
731                 len = resp_ctrl_m_pg(ap, pcontrol, target);
732                 offset += len;
733                 break;
734         case 0x1c:      /* Informational Exceptions Mode page, all devices */
735                 len = resp_iec_m_pg(ap, pcontrol, target);
736                 offset += len;
737                 break;
738         case 0x3f:      /* Read all Mode pages */
739                 len = resp_err_recov_pg(ap, pcontrol, target);
740                 len += resp_disconnect_pg(ap + len, pcontrol, target);
741                 len += resp_format_pg(ap + len, pcontrol, target);
742                 len += resp_caching_pg(ap + len, pcontrol, target);
743                 len += resp_ctrl_m_pg(ap + len, pcontrol, target);
744                 len += resp_iec_m_pg(ap + len, pcontrol, target);
745                 offset += len;
746                 break;
747         default:
748                 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
749                                 0, 18);
750                 return check_condition_result;
751         }
752         if (msense_6)
753                 arr[0] = offset - 1;
754         else {
755                 offset -= 2;
756                 arr[0] = (offset >> 8) & 0xff; 
757                 arr[1] = offset & 0xff; 
758         }
759         memcpy(buff, arr, min_len);
760         return 0;
761 }
762
763 static int resp_read(struct scsi_cmnd * SCpnt, int upper_blk, int block, 
764                      int num, struct sdebug_dev_info * devip)
765 {
766         unsigned char *buff = (unsigned char *) SCpnt->request_buffer;
767         int nbytes, sgcount;
768         struct scatterlist *sgpnt = NULL;
769         int bufflen = SCpnt->request_bufflen;
770         unsigned long iflags;
771
772         if (upper_blk || (block + num > sdebug_capacity)) {
773                 mk_sense_buffer(devip, ILLEGAL_REQUEST, ADDR_OUT_OF_RANGE, 
774                                 0, 18);
775                 return check_condition_result;
776         }
777         if ((SCSI_DEBUG_OPT_MEDIUM_ERR & scsi_debug_opts) &&
778             (block <= OPT_MEDIUM_ERR_ADDR) && 
779             ((block + num) > OPT_MEDIUM_ERR_ADDR)) {
780                 mk_sense_buffer(devip, MEDIUM_ERROR, UNRECOVERED_READ_ERR, 
781                                 0, 18);
782                 /* claim unrecoverable read error */
783                 return check_condition_result;
784         }
785         read_lock_irqsave(&atomic_rw, iflags);
786         sgcount = 0;
787         nbytes = bufflen;
788         /* printk(KERN_INFO "scsi_debug_read: block=%d, tot_bufflen=%d\n", 
789                block, bufflen); */
790         if (SCpnt->use_sg) {
791                 sgcount = 0;
792                 sgpnt = (struct scatterlist *) buff;
793                 buff = scatg2virt(&sgpnt[sgcount]);
794                 bufflen = sgpnt[sgcount].length;
795         }
796         do {
797                 memcpy(buff, fake_storep + (block * SECT_SIZE), bufflen);
798                 nbytes -= bufflen;
799                 if (SCpnt->use_sg) {
800                         block += bufflen >> POW2_SECT_SIZE;
801                         sgcount++;
802                         if (nbytes) {
803                                 buff = scatg2virt(&sgpnt[sgcount]);
804                                 bufflen = sgpnt[sgcount].length;
805                         }
806                 } else if (nbytes > 0)
807                         printk(KERN_WARNING "scsi_debug:resp_read: unexpected "
808                                "nbytes=%d\n", nbytes);
809         } while (nbytes);
810         read_unlock_irqrestore(&atomic_rw, iflags);
811         return 0;
812 }
813
814 static int resp_write(struct scsi_cmnd * SCpnt, int upper_blk, int block,
815                       int num, struct sdebug_dev_info * devip)
816 {
817         unsigned char *buff = (unsigned char *) SCpnt->request_buffer;
818         int nbytes, sgcount;
819         struct scatterlist *sgpnt = NULL;
820         int bufflen = SCpnt->request_bufflen;
821         unsigned long iflags;
822
823         if (upper_blk || (block + num > sdebug_capacity)) {
824                 mk_sense_buffer(devip, ILLEGAL_REQUEST, ADDR_OUT_OF_RANGE,
825                                 0, 18);
826                 return check_condition_result;
827         }
828
829         write_lock_irqsave(&atomic_rw, iflags);
830         sgcount = 0;
831         nbytes = bufflen;
832         if (SCpnt->use_sg) {
833                 sgcount = 0;
834                 sgpnt = (struct scatterlist *) buff;
835                 buff = scatg2virt(&sgpnt[sgcount]);
836                 bufflen = sgpnt[sgcount].length;
837         }
838         do {
839                 memcpy(fake_storep + (block * SECT_SIZE), buff, bufflen);
840
841                 nbytes -= bufflen;
842                 if (SCpnt->use_sg) {
843                         block += bufflen >> POW2_SECT_SIZE;
844                         sgcount++;
845                         if (nbytes) {
846                                 buff = scatg2virt(&sgpnt[sgcount]);
847                                 bufflen = sgpnt[sgcount].length;
848                         }
849                 } else if (nbytes > 0)
850                         printk(KERN_WARNING "scsi_debug:resp_write: "
851                                "unexpected nbytes=%d\n", nbytes);
852         } while (nbytes);
853         write_unlock_irqrestore(&atomic_rw, iflags);
854         return 0;
855 }
856
857 static int resp_report_luns(unsigned char * cmd, unsigned char * buff,
858                             int bufflen, struct sdebug_dev_info * devip)
859 {
860         unsigned int alloc_len; 
861         int lun_cnt, i, upper;
862         int select_report = (int)cmd[2];
863         struct scsi_lun *one_lun;
864
865         alloc_len = cmd[9] + (cmd[8] << 8) + (cmd[7] << 16) + (cmd[6] << 24);
866         if ((alloc_len < 16) || (select_report > 2)) {
867                 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
868                                 0, 18);
869                 return check_condition_result;
870         }
871         if (bufflen > 8) { /* can produce response with up to 16k luns 
872                               (lun 0 to lun 16383) */
873                 memset(buff, 0, bufflen);
874                 lun_cnt = scsi_debug_max_luns;
875                 buff[2] = ((sizeof(struct scsi_lun) * lun_cnt) >> 8) & 0xff;
876                 buff[3] = (sizeof(struct scsi_lun) * lun_cnt) & 0xff;
877                 lun_cnt = min((int)((bufflen - 8) / sizeof(struct scsi_lun)), 
878                               lun_cnt);
879                 one_lun = (struct scsi_lun *) &buff[8];
880                 for (i = 0; i < lun_cnt; i++) {
881                         upper = (i >> 8) & 0x3f;
882                         if (upper)
883                                 one_lun[i].scsi_lun[0] = 
884                                     (upper | (SAM2_LUN_ADDRESS_METHOD << 6));
885                         one_lun[i].scsi_lun[1] = i & 0xff;
886                 }
887         }
888         return 0;
889 }
890
891 /* When timer goes off this function is called. */
892 static void timer_intr_handler(unsigned long indx)
893 {
894         struct sdebug_queued_cmd * sqcp;
895         unsigned long iflags;
896
897         if (indx >= SCSI_DEBUG_CANQUEUE) {
898                 printk(KERN_ERR "scsi_debug:timer_intr_handler: indx too "
899                        "large\n");
900                 return;
901         }
902         spin_lock_irqsave(&queued_arr_lock, iflags);
903         sqcp = &queued_arr[(int)indx];
904         if (! sqcp->in_use) {
905                 printk(KERN_ERR "scsi_debug:timer_intr_handler: Unexpected "
906                        "interrupt\n");
907                 spin_unlock_irqrestore(&queued_arr_lock, iflags);
908                 return;
909         }
910         sqcp->in_use = 0;
911         if (sqcp->done_funct) {
912                 sqcp->a_cmnd->result = sqcp->scsi_result;
913                 sqcp->done_funct(sqcp->a_cmnd); /* callback to mid level */
914         }
915         sqcp->done_funct = NULL;
916         spin_unlock_irqrestore(&queued_arr_lock, iflags);
917 }
918
919 static int scsi_debug_slave_alloc(struct scsi_device * sdp)
920 {
921         if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
922                 printk(KERN_INFO "scsi_debug: slave_alloc <%u %u %u %u>\n",
923                        sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
924         return 0;
925 }
926
927 static int scsi_debug_slave_configure(struct scsi_device * sdp)
928 {
929         struct sdebug_dev_info * devip; 
930
931         if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
932                 printk(KERN_INFO "scsi_debug: slave_configure <%u %u %u %u>\n",
933                        sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
934         if (sdp->host->max_cmd_len != SCSI_DEBUG_MAX_CMD_LEN)
935                 sdp->host->max_cmd_len = SCSI_DEBUG_MAX_CMD_LEN;
936         devip = devInfoReg(sdp);
937         sdp->hostdata = devip;
938         if (sdp->host->cmd_per_lun)
939                 scsi_adjust_queue_depth(sdp, SDEBUG_TAGGED_QUEUING, 
940                                         sdp->host->cmd_per_lun);
941         return 0;
942 }
943
944 static void scsi_debug_slave_destroy(struct scsi_device * sdp)
945 {
946         struct sdebug_dev_info * devip = 
947                                 (struct sdebug_dev_info *)sdp->hostdata;
948
949         if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
950                 printk(KERN_INFO "scsi_debug: slave_destroy <%u %u %u %u>\n",
951                        sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
952         if (devip) {
953                 /* make this slot avaliable for re-use */
954                 devip->used = 0;
955                 sdp->hostdata = NULL;
956         }
957 }
958
959 static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev)
960 {
961         struct sdebug_host_info * sdbg_host;
962         struct sdebug_dev_info * open_devip = NULL;
963         struct sdebug_dev_info * devip =
964                         (struct sdebug_dev_info *)sdev->hostdata;
965
966         if (devip)
967                 return devip;
968         sdbg_host = *(struct sdebug_host_info **) sdev->host->hostdata;
969         if(! sdbg_host) {
970                 printk(KERN_ERR "Host info NULL\n");
971                 return NULL;
972         }
973         list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) {
974                 if ((devip->used) && (devip->channel == sdev->channel) &&
975                     (devip->target == sdev->id) &&
976                     (devip->lun == sdev->lun))
977                         return devip;
978                 else {
979                         if ((!devip->used) && (!open_devip))
980                                 open_devip = devip;
981                 }
982         }
983         if (open_devip) {
984                 open_devip->channel = sdev->channel;
985                 open_devip->target = sdev->id;
986                 open_devip->lun = sdev->lun;
987                 open_devip->sdbg_host = sdbg_host;
988                 open_devip->reset = 1;
989                 open_devip->used = 1;
990                 memset(open_devip->sense_buff, 0, SDEBUG_SENSE_LEN);
991                 open_devip->sense_buff[0] = 0x70;
992                 return open_devip;
993         }
994         return NULL;
995 }
996
997 static void mk_sense_buffer(struct sdebug_dev_info * devip, int key, 
998                             int asc, int asq, int inbandLen)
999 {
1000         unsigned char * sbuff;
1001
1002         sbuff = devip->sense_buff;
1003         memset(sbuff, 0, SDEBUG_SENSE_LEN);
1004         if (inbandLen > SDEBUG_SENSE_LEN)
1005                 inbandLen = SDEBUG_SENSE_LEN;
1006         sbuff[0] = 0x70;
1007         sbuff[2] = key;
1008         sbuff[7] = (inbandLen > 7) ? (inbandLen - 8) : 0;
1009         sbuff[12] = asc;
1010         sbuff[13] = asq;
1011 }
1012
1013 static int scsi_debug_abort(struct scsi_cmnd * SCpnt)
1014 {
1015         if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1016                 printk(KERN_INFO "scsi_debug: abort\n");
1017         ++num_aborts;
1018         stop_queued_cmnd(SCpnt);
1019         return SUCCESS;
1020 }
1021
1022 static int scsi_debug_biosparam(struct scsi_device *sdev,
1023                 struct block_device * bdev, sector_t capacity, int *info)
1024 {
1025         int res;
1026         unsigned char *buf;
1027
1028         if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1029                 printk(KERN_INFO "scsi_debug: biosparam\n");
1030         buf = scsi_bios_ptable(bdev);
1031         if (buf) {
1032                 res = scsi_partsize(buf, capacity, 
1033                                     &info[2], &info[0], &info[1]);
1034                 kfree(buf);
1035                 if (! res)
1036                         return res;
1037         }
1038         info[0] = sdebug_heads;
1039         info[1] = sdebug_sectors_per;
1040         info[2] = sdebug_cylinders_per;
1041         return 0;
1042 }
1043
1044 static int scsi_debug_device_reset(struct scsi_cmnd * SCpnt)
1045 {
1046         struct sdebug_dev_info * devip;
1047
1048         if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1049                 printk(KERN_INFO "scsi_debug: device_reset\n");
1050         ++num_dev_resets;
1051         if (SCpnt) {
1052                 devip = devInfoReg(SCpnt->device);
1053                 if (devip)
1054                         devip->reset = 1;
1055         }
1056         return SUCCESS;
1057 }
1058
1059 static int scsi_debug_bus_reset(struct scsi_cmnd * SCpnt)
1060 {
1061         struct sdebug_host_info *sdbg_host;
1062         struct sdebug_dev_info * dev_info;
1063         struct scsi_device * sdp;
1064         struct Scsi_Host * hp;
1065
1066         if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1067                 printk(KERN_INFO "scsi_debug: bus_reset\n");
1068         ++num_bus_resets;
1069         if (SCpnt && ((sdp = SCpnt->device)) && ((hp = sdp->host))) {
1070                 sdbg_host = *(struct sdebug_host_info **) hp->hostdata;
1071                 if (sdbg_host) {
1072                         list_for_each_entry(dev_info,
1073                                             &sdbg_host->dev_info_list,
1074                                             dev_list)
1075                                 dev_info->reset = 1;
1076                 }
1077         }
1078         return SUCCESS;
1079 }
1080
1081 static int scsi_debug_host_reset(struct scsi_cmnd * SCpnt)
1082 {
1083         struct sdebug_host_info * sdbg_host;
1084         struct sdebug_dev_info * dev_info;
1085
1086         if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1087                 printk(KERN_INFO "scsi_debug: host_reset\n");
1088         ++num_host_resets;
1089         spin_lock(&sdebug_host_list_lock);
1090         list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
1091                 list_for_each_entry(dev_info, &sdbg_host->dev_info_list,
1092                                     dev_list)
1093                         dev_info->reset = 1;
1094         }
1095         spin_unlock(&sdebug_host_list_lock);
1096         stop_all_queued();
1097         return SUCCESS;
1098 }
1099
1100 /* Returns 1 if found 'cmnd' and deleted its timer. else returns 0 */
1101 static int stop_queued_cmnd(struct scsi_cmnd * cmnd)
1102 {
1103         unsigned long iflags;
1104         int k;
1105         struct sdebug_queued_cmd * sqcp;
1106
1107         spin_lock_irqsave(&queued_arr_lock, iflags);
1108         for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
1109                 sqcp = &queued_arr[k];
1110                 if (sqcp->in_use && (cmnd == sqcp->a_cmnd)) {
1111                         del_timer_sync(&sqcp->cmnd_timer);
1112                         sqcp->in_use = 0;
1113                         sqcp->a_cmnd = NULL;
1114                         break;
1115                 }
1116         }
1117         spin_unlock_irqrestore(&queued_arr_lock, iflags);
1118         return (k < SCSI_DEBUG_CANQUEUE) ? 1 : 0;
1119 }
1120
1121 /* Deletes (stops) timers of all queued commands */
1122 static void stop_all_queued(void)
1123 {
1124         unsigned long iflags;
1125         int k;
1126         struct sdebug_queued_cmd * sqcp;
1127
1128         spin_lock_irqsave(&queued_arr_lock, iflags);
1129         for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
1130                 sqcp = &queued_arr[k];
1131                 if (sqcp->in_use && sqcp->a_cmnd) {
1132                         del_timer_sync(&sqcp->cmnd_timer);
1133                         sqcp->in_use = 0;
1134                         sqcp->a_cmnd = NULL;
1135                 }
1136         }
1137         spin_unlock_irqrestore(&queued_arr_lock, iflags);
1138 }
1139
1140 /* Initializes timers in queued array */
1141 static void init_all_queued(void)
1142 {
1143         unsigned long iflags;
1144         int k;
1145         struct sdebug_queued_cmd * sqcp;
1146
1147         spin_lock_irqsave(&queued_arr_lock, iflags);
1148         for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
1149                 sqcp = &queued_arr[k];
1150                 init_timer(&sqcp->cmnd_timer);
1151                 sqcp->in_use = 0;
1152                 sqcp->a_cmnd = NULL;
1153         }
1154         spin_unlock_irqrestore(&queued_arr_lock, iflags);
1155 }
1156
1157 static int schedule_resp(struct scsi_cmnd * cmnd, 
1158                          struct sdebug_dev_info * devip,
1159                          done_funct_t done, int scsi_result, int delta_jiff)
1160 {
1161         int k, num; 
1162
1163         if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) && cmnd) {
1164                 printk(KERN_INFO "scsi_debug: cmd ");
1165                 for (k = 0, num = cmnd->cmd_len; k < num; ++k)
1166                         printk("%02x ", (int)cmnd->cmnd[k]);
1167                 printk("\n");
1168                 if (scsi_result) {
1169                         struct scsi_device * sdp = cmnd->device;
1170
1171                         printk(KERN_INFO "scsi_debug: ... <%u %u %u %u> "
1172                                "non-zero result=0x%x\n", sdp->host->host_no,
1173                                sdp->channel, sdp->id, sdp->lun, scsi_result);
1174                 }
1175         }
1176         if (cmnd && devip) {
1177                 /* simulate autosense by this driver */
1178                 if (SAM_STAT_CHECK_CONDITION == (scsi_result & 0xff))
1179                         memcpy(cmnd->sense_buffer, devip->sense_buff, 
1180                                (SCSI_SENSE_BUFFERSIZE > SDEBUG_SENSE_LEN) ?
1181                                SDEBUG_SENSE_LEN : SCSI_SENSE_BUFFERSIZE);
1182         }
1183         if (delta_jiff <= 0) {
1184                 if (cmnd)
1185                         cmnd->result = scsi_result;
1186                 if (done)
1187                         done(cmnd);
1188                 return 0;
1189         } else {
1190                 unsigned long iflags;
1191                 int k;
1192                 struct sdebug_queued_cmd * sqcp = NULL;
1193
1194                 spin_lock_irqsave(&queued_arr_lock, iflags);
1195                 for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
1196                         sqcp = &queued_arr[k];
1197                         if (! sqcp->in_use)
1198                                 break;
1199                 }
1200                 if (k >= SCSI_DEBUG_CANQUEUE) {
1201                         spin_unlock_irqrestore(&queued_arr_lock, iflags);
1202                         printk(KERN_WARNING "scsi_debug: can_queue exceeded\n");
1203                         return 1;       /* report busy to mid level */
1204                 }
1205                 sqcp->in_use = 1;
1206                 sqcp->a_cmnd = cmnd;
1207                 sqcp->scsi_result = scsi_result;
1208                 sqcp->done_funct = done;
1209                 sqcp->cmnd_timer.function = timer_intr_handler;
1210                 sqcp->cmnd_timer.data = k;
1211                 sqcp->cmnd_timer.expires = jiffies + delta_jiff;
1212                 add_timer(&sqcp->cmnd_timer);
1213                 spin_unlock_irqrestore(&queued_arr_lock, iflags);
1214                 if (cmnd)
1215                         cmnd->result = 0;
1216                 return 0;
1217         }
1218 }
1219
1220 /* Set 'perm' (4th argument) to 0 to disable module_param's definition
1221  * of sysfs parameters (which module_param doesn't yet support).
1222  * Sysfs parameters defined explicitly below. 
1223  */
1224 module_param_named(num_tgts, scsi_debug_num_tgts, int, 0);
1225 module_param_named(max_luns, scsi_debug_max_luns, int, 0);
1226 module_param_named(scsi_level, scsi_debug_scsi_level, int, 0);
1227 module_param_named(dev_size_mb, scsi_debug_dev_size_mb, int, 0);
1228 module_param_named(opts, scsi_debug_opts, int, 0); /* perm=0644 */
1229 module_param_named(every_nth, scsi_debug_every_nth, int, 0);
1230 module_param_named(delay, scsi_debug_delay, int, 0); /* perm=0644 */
1231 module_param_named(add_host, scsi_debug_add_host, int, 0); /* perm=0644 */
1232
1233 MODULE_AUTHOR("Eric Youngdale + Douglas Gilbert");
1234 MODULE_DESCRIPTION("SCSI debug adapter driver");
1235 MODULE_LICENSE("GPL");
1236
1237 MODULE_PARM_DESC(num_tgts, "number of SCSI targets per host to simulate");
1238 MODULE_PARM_DESC(max_luns, "number of SCSI LUNs per target to simulate");
1239 MODULE_PARM_DESC(scsi_level, "SCSI level to simulate");
1240 MODULE_PARM_DESC(dev_size_mb, "size in MB of ram shared by devs");
1241 MODULE_PARM_DESC(opts, "1->noise, 2->medium_error, 4->...");
1242 MODULE_PARM_DESC(every_nth, "timeout every nth command(def=100)");
1243 MODULE_PARM_DESC(delay, "# of jiffies to delay response(def=1)");
1244 MODULE_PARM_DESC(add_host, "0..127 hosts allowed(def=1)");
1245
1246
1247 static char sdebug_info[256];
1248
1249 static const char * scsi_debug_info(struct Scsi_Host * shp)
1250 {
1251         sprintf(sdebug_info, "scsi_debug, %s, num_tgts=%d, "
1252                 "dev_size_mb=%d, opts=0x%x", scsi_debug_version_str,
1253                 scsi_debug_num_tgts, scsi_debug_dev_size_mb,
1254                 scsi_debug_opts);
1255         return sdebug_info;
1256 }
1257
1258 /* scsi_debug_proc_info
1259  * Used if the driver currently has no own support for /proc/scsi
1260  */
1261 static int scsi_debug_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset,
1262                                 int length, int inout)
1263 {
1264         int len, pos, begin;
1265         int orig_length;
1266
1267         orig_length = length;
1268
1269         if (inout == 1) {
1270                 char arr[16];
1271                 int minLen = length > 15 ? 15 : length;
1272
1273                 if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
1274                         return -EACCES;
1275                 memcpy(arr, buffer, minLen);
1276                 arr[minLen] = '\0';
1277                 if (1 != sscanf(arr, "%d", &pos))
1278                         return -EINVAL;
1279                 scsi_debug_opts = pos;
1280                 if (scsi_debug_every_nth > 0)
1281                         scsi_debug_cmnd_count = 0;
1282                 return length;
1283         }
1284         begin = 0;
1285         pos = len = sprintf(buffer, "scsi_debug adapter driver, %s\n"
1286             "num_tgts=%d, shared (ram) size=%d MB, opts=0x%x, "
1287             "every_nth=%d(curr:%d)\n"
1288             "delay=%d, max_luns=%d, scsi_level=%d\n"
1289             "sector_size=%d bytes, cylinders=%d, heads=%d, sectors=%d\n"
1290             "number of aborts=%d, device_reset=%d, bus_resets=%d, " 
1291             "host_resets=%d\n",
1292             scsi_debug_version_str, scsi_debug_num_tgts, 
1293             scsi_debug_dev_size_mb, scsi_debug_opts, scsi_debug_every_nth,
1294             scsi_debug_cmnd_count, scsi_debug_delay,
1295             scsi_debug_max_luns, scsi_debug_scsi_level,
1296             SECT_SIZE, sdebug_cylinders_per, sdebug_heads, sdebug_sectors_per,
1297             num_aborts, num_dev_resets, num_bus_resets, num_host_resets);
1298         if (pos < offset) {
1299                 len = 0;
1300                 begin = pos;
1301         }
1302         *start = buffer + (offset - begin);     /* Start of wanted data */
1303         len -= (offset - begin);
1304         if (len > length)
1305                 len = length;
1306         return len;
1307 }
1308
1309 static ssize_t sdebug_delay_show(struct device_driver * ddp, char * buf) 
1310 {
1311         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_delay);
1312 }
1313
1314 static ssize_t sdebug_delay_store(struct device_driver * ddp, 
1315                                   const char * buf, size_t count)
1316 {
1317         int delay;
1318         char work[20];
1319
1320         if (1 == sscanf(buf, "%10s", work)) {
1321                 if ((1 == sscanf(work, "%d", &delay)) && (delay >= 0)) {
1322                         scsi_debug_delay = delay;
1323                         return count;
1324                 }
1325         }
1326         return -EINVAL;
1327 }
1328 DRIVER_ATTR(delay, S_IRUGO | S_IWUSR, sdebug_delay_show, 
1329             sdebug_delay_store)
1330
1331 static ssize_t sdebug_opts_show(struct device_driver * ddp, char * buf) 
1332 {
1333         return scnprintf(buf, PAGE_SIZE, "0x%x\n", scsi_debug_opts);
1334 }
1335
1336 static ssize_t sdebug_opts_store(struct device_driver * ddp, 
1337                                  const char * buf, size_t count)
1338 {
1339         int opts;
1340         char work[20];
1341
1342         if (1 == sscanf(buf, "%10s", work)) {
1343                 if (0 == strnicmp(work,"0x", 2)) {
1344                         if (1 == sscanf(&work[2], "%x", &opts))
1345                                 goto opts_done;
1346                 } else {
1347                         if (1 == sscanf(work, "%d", &opts))
1348                                 goto opts_done;
1349                 }
1350         }
1351         return -EINVAL;
1352 opts_done:
1353         scsi_debug_opts = opts;
1354         scsi_debug_cmnd_count = 0;
1355         return count;
1356 }
1357 DRIVER_ATTR(opts, S_IRUGO | S_IWUSR, sdebug_opts_show, 
1358             sdebug_opts_store)
1359
1360 static ssize_t sdebug_num_tgts_show(struct device_driver * ddp, char * buf) 
1361 {
1362         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_num_tgts);
1363 }
1364 static ssize_t sdebug_num_tgts_store(struct device_driver * ddp, 
1365                                      const char * buf, size_t count)
1366 {
1367         int n;
1368
1369         if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
1370                 scsi_debug_num_tgts = n;
1371                 return count;
1372         }
1373         return -EINVAL;
1374 }
1375 DRIVER_ATTR(num_tgts, S_IRUGO | S_IWUSR, sdebug_num_tgts_show, 
1376             sdebug_num_tgts_store) 
1377
1378 static ssize_t sdebug_dev_size_mb_show(struct device_driver * ddp, char * buf) 
1379 {
1380         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dev_size_mb);
1381 }
1382 DRIVER_ATTR(dev_size_mb, S_IRUGO, sdebug_dev_size_mb_show, NULL) 
1383
1384 static ssize_t sdebug_every_nth_show(struct device_driver * ddp, char * buf) 
1385 {
1386         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_every_nth);
1387 }
1388 static ssize_t sdebug_every_nth_store(struct device_driver * ddp, 
1389                                       const char * buf, size_t count)
1390 {
1391         int nth;
1392
1393         if ((count > 0) && (1 == sscanf(buf, "%d", &nth)) && (nth >= 0)) {
1394                 scsi_debug_every_nth = nth;
1395                 scsi_debug_cmnd_count = 0;
1396                 return count;
1397         }
1398         return -EINVAL;
1399 }
1400 DRIVER_ATTR(every_nth, S_IRUGO | S_IWUSR, sdebug_every_nth_show,
1401             sdebug_every_nth_store) 
1402
1403 static ssize_t sdebug_max_luns_show(struct device_driver * ddp, char * buf) 
1404 {
1405         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_max_luns);
1406 }
1407 static ssize_t sdebug_max_luns_store(struct device_driver * ddp, 
1408                                      const char * buf, size_t count)
1409 {
1410         int n;
1411
1412         if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
1413                 scsi_debug_max_luns = n;
1414                 return count;
1415         }
1416         return -EINVAL;
1417 }
1418 DRIVER_ATTR(max_luns, S_IRUGO | S_IWUSR, sdebug_max_luns_show, 
1419             sdebug_max_luns_store) 
1420
1421 static ssize_t sdebug_scsi_level_show(struct device_driver * ddp, char * buf) 
1422 {
1423         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_scsi_level);
1424 }
1425 DRIVER_ATTR(scsi_level, S_IRUGO, sdebug_scsi_level_show, NULL) 
1426
1427 static ssize_t sdebug_add_host_show(struct device_driver * ddp, char * buf) 
1428 {
1429         return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_add_host);
1430 }
1431
1432 static ssize_t sdebug_add_host_store(struct device_driver * ddp, 
1433                                      const char * buf, size_t count)
1434 {
1435         int delta_hosts;
1436         char work[20];
1437
1438         if (1 != sscanf(buf, "%10s", work))
1439                 return -EINVAL;
1440         {       /* temporary hack around sscanf() problem with -ve nums */
1441                 int neg = 0;
1442
1443                 if ('-' == *work)
1444                         neg = 1;
1445                 if (1 != sscanf(work + neg, "%d", &delta_hosts))
1446                         return -EINVAL;
1447                 if (neg)
1448                         delta_hosts = -delta_hosts;
1449         }
1450         if (delta_hosts > 0) {
1451                 do {
1452                         sdebug_add_adapter();
1453                 } while (--delta_hosts);
1454         } else if (delta_hosts < 0) {
1455                 do {
1456                         sdebug_remove_adapter();
1457                 } while (++delta_hosts);
1458         }
1459         return count;
1460 }
1461 DRIVER_ATTR(add_host, S_IRUGO | S_IWUSR, sdebug_add_host_show, 
1462             sdebug_add_host_store)
1463
1464 static void do_create_driverfs_files(void)
1465 {
1466         driver_create_file(&sdebug_driverfs_driver, &driver_attr_delay);
1467         driver_create_file(&sdebug_driverfs_driver, &driver_attr_opts);
1468         driver_create_file(&sdebug_driverfs_driver, &driver_attr_num_tgts);
1469         driver_create_file(&sdebug_driverfs_driver, &driver_attr_dev_size_mb);
1470         driver_create_file(&sdebug_driverfs_driver, &driver_attr_every_nth);
1471         driver_create_file(&sdebug_driverfs_driver, &driver_attr_max_luns);
1472         driver_create_file(&sdebug_driverfs_driver, &driver_attr_scsi_level);
1473         driver_create_file(&sdebug_driverfs_driver, &driver_attr_add_host);
1474 }
1475
1476 static void do_remove_driverfs_files(void)
1477 {
1478         driver_remove_file(&sdebug_driverfs_driver, &driver_attr_add_host);
1479         driver_remove_file(&sdebug_driverfs_driver, &driver_attr_scsi_level);
1480         driver_remove_file(&sdebug_driverfs_driver, &driver_attr_max_luns);
1481         driver_remove_file(&sdebug_driverfs_driver, &driver_attr_every_nth);
1482         driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dev_size_mb);
1483         driver_remove_file(&sdebug_driverfs_driver, &driver_attr_num_tgts);
1484         driver_remove_file(&sdebug_driverfs_driver, &driver_attr_opts);
1485         driver_remove_file(&sdebug_driverfs_driver, &driver_attr_delay);
1486 }
1487
1488 static int __init scsi_debug_init(void)
1489 {
1490         unsigned long sz;
1491         int host_to_add;
1492         int k;
1493
1494         sdebug_store_size = (unsigned long)scsi_debug_dev_size_mb * 1048576;
1495         sdebug_capacity = sdebug_store_size / SECT_SIZE;
1496
1497         /* play around with geometry, don't waste too much on track 0 */
1498         sdebug_heads = 8;
1499         sdebug_sectors_per = 32;
1500         if (scsi_debug_dev_size_mb >= 16) 
1501                 sdebug_heads = 32;
1502         else if (scsi_debug_dev_size_mb >= 256)
1503                 sdebug_heads = 64;
1504         sdebug_cylinders_per = (unsigned long)sdebug_capacity / 
1505                                (sdebug_sectors_per * sdebug_heads);
1506         if (sdebug_cylinders_per >= 1024) { 
1507                 /* other LLDs do this; implies >= 1GB ram disk ... */
1508                 sdebug_heads = 255;
1509                 sdebug_sectors_per = 63;
1510                 sdebug_cylinders_per = (unsigned long)sdebug_capacity / 
1511                                (sdebug_sectors_per * sdebug_heads);
1512         }
1513
1514         sz = sdebug_store_size;
1515         fake_storep = vmalloc(sz);
1516         if (NULL == fake_storep) {
1517                 printk(KERN_ERR "scsi_debug_init: out of memory, 1\n");
1518                 return -ENOMEM;
1519         }
1520         memset(fake_storep, 0, sz);
1521
1522         init_all_queued();
1523
1524         device_register(&pseudo_primary);
1525         bus_register(&pseudo_lld_bus);
1526         driver_register(&sdebug_driverfs_driver);
1527         do_create_driverfs_files();
1528
1529         sdebug_driver_template.proc_name = (char *)sdebug_proc_name;
1530
1531         host_to_add = scsi_debug_add_host;
1532         scsi_debug_add_host = 0;
1533
1534         for (k = 0; k < host_to_add; k++) {
1535                 if (sdebug_add_adapter()) {
1536                         printk(KERN_ERR "scsi_debug_init: "
1537                                "sdebug_add_adapter failed k=%d\n", k);
1538                         break;
1539                 }
1540         }
1541
1542         if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
1543                 printk(KERN_INFO "scsi_debug_init: built %d host(s)\n",
1544                        scsi_debug_add_host);
1545         }
1546         return 0;
1547 }
1548
1549 static void __exit scsi_debug_exit(void)
1550 {
1551         int k = scsi_debug_add_host;
1552
1553         stop_all_queued();
1554         for (; k; k--)
1555                 sdebug_remove_adapter();
1556         do_remove_driverfs_files();
1557         driver_unregister(&sdebug_driverfs_driver);
1558         bus_unregister(&pseudo_lld_bus);
1559         device_unregister(&pseudo_primary);
1560
1561         vfree(fake_storep);
1562 }
1563
1564 device_initcall(scsi_debug_init);
1565 module_exit(scsi_debug_exit);
1566
1567 void pseudo_0_release(struct device * dev)
1568 {
1569         if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1570                 printk(KERN_INFO "scsi_debug: pseudo_0_release() called\n");
1571 }
1572
1573 static struct device pseudo_primary = {
1574         .bus_id         = "pseudo_0",
1575         .release        = pseudo_0_release,
1576 };
1577
1578 static int pseudo_lld_bus_match(struct device *dev, 
1579                           struct device_driver *dev_driver)
1580 {
1581         return 1;
1582 }
1583
1584 static struct bus_type pseudo_lld_bus = {
1585         .name = "pseudo",
1586         .match = pseudo_lld_bus_match,
1587 };
1588
1589 static void sdebug_release_adapter(struct device * dev)
1590 {
1591         struct sdebug_host_info *sdbg_host;
1592
1593         sdbg_host = to_sdebug_host(dev);
1594         kfree(sdbg_host);
1595 }
1596
1597 static int sdebug_add_adapter(void)
1598 {
1599         int k, devs_per_host;
1600         int error = 0;
1601         struct sdebug_host_info *sdbg_host;
1602         struct sdebug_dev_info *sdbg_devinfo;
1603         struct list_head *lh, *lh_sf;
1604
1605         sdbg_host = kmalloc(sizeof(*sdbg_host),GFP_KERNEL);
1606
1607         if (NULL == sdbg_host) {
1608                 printk(KERN_ERR "%s: out of memory at line %d\n",
1609                        __FUNCTION__, __LINE__);
1610                 return -ENOMEM;
1611         }
1612
1613         memset(sdbg_host, 0, sizeof(*sdbg_host));
1614         INIT_LIST_HEAD(&sdbg_host->dev_info_list);
1615
1616         devs_per_host = scsi_debug_num_tgts * scsi_debug_max_luns;
1617         for (k = 0; k < devs_per_host; k++) {
1618                 sdbg_devinfo = kmalloc(sizeof(*sdbg_devinfo),GFP_KERNEL);
1619                 if (NULL == sdbg_devinfo) {
1620                         printk(KERN_ERR "%s: out of memory at line %d\n",
1621                                __FUNCTION__, __LINE__);
1622                         error = -ENOMEM;
1623                         goto clean;
1624                 }
1625                 memset(sdbg_devinfo, 0, sizeof(*sdbg_devinfo));
1626                 sdbg_devinfo->sdbg_host = sdbg_host;
1627                 list_add_tail(&sdbg_devinfo->dev_list,
1628                               &sdbg_host->dev_info_list);
1629         }
1630
1631         spin_lock(&sdebug_host_list_lock);
1632         list_add_tail(&sdbg_host->host_list, &sdebug_host_list);
1633         spin_unlock(&sdebug_host_list_lock);
1634
1635         sdbg_host->dev.bus = &pseudo_lld_bus;
1636         sdbg_host->dev.parent = &pseudo_primary;
1637         sdbg_host->dev.release = &sdebug_release_adapter;
1638         sprintf(sdbg_host->dev.bus_id, "adapter%d", scsi_debug_add_host);
1639
1640         error = device_register(&sdbg_host->dev);
1641
1642         if (error)
1643                 goto clean;
1644
1645         ++scsi_debug_add_host;
1646         return error;
1647
1648 clean:
1649         list_for_each_safe(lh, lh_sf, &sdbg_host->dev_info_list) {
1650                 sdbg_devinfo = list_entry(lh, struct sdebug_dev_info,
1651                                           dev_list);
1652                 list_del(&sdbg_devinfo->dev_list);
1653                 kfree(sdbg_devinfo);
1654         }
1655
1656         kfree(sdbg_host);
1657         return error;
1658 }
1659
1660 static void sdebug_remove_adapter(void)
1661 {
1662         struct sdebug_host_info * sdbg_host = NULL;
1663
1664         spin_lock(&sdebug_host_list_lock);
1665         if (!list_empty(&sdebug_host_list)) {
1666                 sdbg_host = list_entry(sdebug_host_list.prev,
1667                                        struct sdebug_host_info, host_list);
1668                 list_del(&sdbg_host->host_list);
1669         }
1670         spin_unlock(&sdebug_host_list_lock);
1671
1672         if (!sdbg_host)
1673                 return;
1674
1675         device_unregister(&sdbg_host->dev);
1676         --scsi_debug_add_host;
1677 }
1678
1679 static int sdebug_driver_probe(struct device * dev)
1680 {
1681         int error = 0;
1682         struct sdebug_host_info *sdbg_host;
1683         struct Scsi_Host *hpnt;
1684
1685         sdbg_host = to_sdebug_host(dev);
1686
1687         hpnt = scsi_host_alloc(&sdebug_driver_template, sizeof(sdbg_host));
1688         if (NULL == hpnt) {
1689                 printk(KERN_ERR "%s: scsi_register failed\n", __FUNCTION__);
1690                 error = -ENODEV;
1691                 return error;
1692         }
1693
1694         sdbg_host->shost = hpnt;
1695         *((struct sdebug_host_info **)hpnt->hostdata) = sdbg_host;
1696         if ((hpnt->this_id >= 0) && (scsi_debug_num_tgts > hpnt->this_id))
1697                 hpnt->max_id = scsi_debug_num_tgts + 1;
1698         else
1699                 hpnt->max_id = scsi_debug_num_tgts;
1700         hpnt->max_lun = scsi_debug_max_luns;
1701
1702         error = scsi_add_host(hpnt, &sdbg_host->dev);
1703         if (error) {
1704                 printk(KERN_ERR "%s: scsi_add_host failed\n", __FUNCTION__);
1705                 error = -ENODEV;
1706                 scsi_host_put(hpnt);
1707         } else
1708                 scsi_scan_host(hpnt);
1709
1710
1711         return error;
1712 }
1713
1714 static int sdebug_driver_remove(struct device * dev)
1715 {
1716         struct list_head *lh, *lh_sf;
1717         struct sdebug_host_info *sdbg_host;
1718         struct sdebug_dev_info *sdbg_devinfo;
1719
1720         sdbg_host = to_sdebug_host(dev);
1721
1722         if (!sdbg_host) {
1723                 printk(KERN_ERR "%s: Unable to locate host info\n",
1724                        __FUNCTION__);
1725                 return -ENODEV;
1726         }
1727
1728         scsi_remove_host(sdbg_host->shost);
1729
1730         list_for_each_safe(lh, lh_sf, &sdbg_host->dev_info_list) {
1731                 sdbg_devinfo = list_entry(lh, struct sdebug_dev_info,
1732                                           dev_list);
1733                 list_del(&sdbg_devinfo->dev_list);
1734                 kfree(sdbg_devinfo);
1735         }
1736
1737         scsi_host_put(sdbg_host->shost);
1738         return 0;
1739 }