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