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