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