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 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
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
15 * For documentation see http://www.torque.net/sg/sdebug26.html
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]
28 #include <linux/module.h>
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>
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>
45 #include <net/checksum.h>
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>
55 #include "scsi_logging.h"
57 #define SCSI_DEBUG_VERSION "1.81"
58 static const char * scsi_debug_version_date = "20070104";
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
75 /* Additional Sense Code Qualifier (ASCQ) */
76 #define ACK_NAK_TO 0x3
78 #define SDEBUG_TAGGED_QUEUING 0 /* 0 | MSG_SIMPLE_TAG | MSG_ORDERED_TAG */
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.
88 #define DEF_DEV_SIZE_MB 8
89 #define DEF_EVERY_NTH 0
90 #define DEF_NUM_PARTS 0
92 #define DEF_SCSI_LEVEL 5 /* INQUIRY, byte2 [5->SPC-3] */
95 #define DEF_NO_LUN_0 0
96 #define DEF_VIRTUAL_GB 0
98 #define DEF_VPD_USE_HOSTNO 1
99 #define DEF_SECTOR_SIZE 512
104 #define DEF_PHYSBLK_EXP 0
105 #define DEF_LOWEST_ALIGNED 0
107 /* bit mask values for scsi_debug_opts */
108 #define SCSI_DEBUG_OPT_NOISE 1
109 #define SCSI_DEBUG_OPT_MEDIUM_ERR 2
110 #define SCSI_DEBUG_OPT_TIMEOUT 4
111 #define SCSI_DEBUG_OPT_RECOVERED_ERR 8
112 #define SCSI_DEBUG_OPT_TRANSPORT_ERR 16
113 #define SCSI_DEBUG_OPT_DIF_ERR 32
114 #define SCSI_DEBUG_OPT_DIX_ERR 64
115 /* When "every_nth" > 0 then modulo "every_nth" commands:
116 * - a no response is simulated if SCSI_DEBUG_OPT_TIMEOUT is set
117 * - a RECOVERED_ERROR is simulated on successful read and write
118 * commands if SCSI_DEBUG_OPT_RECOVERED_ERR is set.
119 * - a TRANSPORT_ERROR is simulated on successful read and write
120 * commands if SCSI_DEBUG_OPT_TRANSPORT_ERR is set.
122 * When "every_nth" < 0 then after "- every_nth" commands:
123 * - a no response is simulated if SCSI_DEBUG_OPT_TIMEOUT is set
124 * - a RECOVERED_ERROR is simulated on successful read and write
125 * commands if SCSI_DEBUG_OPT_RECOVERED_ERR is set.
126 * - a TRANSPORT_ERROR is simulated on successful read and write
127 * commands if SCSI_DEBUG_OPT_TRANSPORT_ERR is set.
128 * This will continue until some other action occurs (e.g. the user
129 * writing a new value (other than -1 or 1) to every_nth via sysfs).
132 /* when 1==SCSI_DEBUG_OPT_MEDIUM_ERR, a medium error is simulated at this
133 * sector on read commands: */
134 #define OPT_MEDIUM_ERR_ADDR 0x1234 /* that's sector 4660 in decimal */
136 /* If REPORT LUNS has luns >= 256 it can choose "flat space" (value 1)
137 * or "peripheral device" addressing (value 0) */
138 #define SAM2_LUN_ADDRESS_METHOD 0
139 #define SAM2_WLUN_REPORT_LUNS 0xc101
141 static int scsi_debug_add_host = DEF_NUM_HOST;
142 static int scsi_debug_delay = DEF_DELAY;
143 static int scsi_debug_dev_size_mb = DEF_DEV_SIZE_MB;
144 static int scsi_debug_every_nth = DEF_EVERY_NTH;
145 static int scsi_debug_max_luns = DEF_MAX_LUNS;
146 static int scsi_debug_num_parts = DEF_NUM_PARTS;
147 static int scsi_debug_num_tgts = DEF_NUM_TGTS; /* targets per host */
148 static int scsi_debug_opts = DEF_OPTS;
149 static int scsi_debug_scsi_level = DEF_SCSI_LEVEL;
150 static int scsi_debug_ptype = DEF_PTYPE; /* SCSI peripheral type (0==disk) */
151 static int scsi_debug_dsense = DEF_D_SENSE;
152 static int scsi_debug_no_lun_0 = DEF_NO_LUN_0;
153 static int scsi_debug_virtual_gb = DEF_VIRTUAL_GB;
154 static int scsi_debug_fake_rw = DEF_FAKE_RW;
155 static int scsi_debug_vpd_use_hostno = DEF_VPD_USE_HOSTNO;
156 static int scsi_debug_sector_size = DEF_SECTOR_SIZE;
157 static int scsi_debug_dix = DEF_DIX;
158 static int scsi_debug_dif = DEF_DIF;
159 static int scsi_debug_guard = DEF_GUARD;
160 static int scsi_debug_ato = DEF_ATO;
161 static int scsi_debug_physblk_exp = DEF_PHYSBLK_EXP;
162 static int scsi_debug_lowest_aligned = DEF_LOWEST_ALIGNED;
164 static int scsi_debug_cmnd_count = 0;
166 #define DEV_READONLY(TGT) (0)
167 #define DEV_REMOVEABLE(TGT) (0)
169 static unsigned int sdebug_store_sectors;
170 static sector_t sdebug_capacity; /* in sectors */
172 /* old BIOS stuff, kernel may get rid of them but some mode sense pages
173 may still need them */
174 static int sdebug_heads; /* heads per disk */
175 static int sdebug_cylinders_per; /* cylinders per surface */
176 static int sdebug_sectors_per; /* sectors per cylinder */
178 #define SDEBUG_MAX_PARTS 4
180 #define SDEBUG_SENSE_LEN 32
182 #define SCSI_DEBUG_CANQUEUE 255
183 #define SCSI_DEBUG_MAX_CMD_LEN 16
185 struct sdebug_dev_info {
186 struct list_head dev_list;
187 unsigned char sense_buff[SDEBUG_SENSE_LEN]; /* weak nexus */
188 unsigned int channel;
191 struct sdebug_host_info *sdbg_host;
198 struct sdebug_host_info {
199 struct list_head host_list;
200 struct Scsi_Host *shost;
202 struct list_head dev_info_list;
205 #define to_sdebug_host(d) \
206 container_of(d, struct sdebug_host_info, dev)
208 static LIST_HEAD(sdebug_host_list);
209 static DEFINE_SPINLOCK(sdebug_host_list_lock);
211 typedef void (* done_funct_t) (struct scsi_cmnd *);
213 struct sdebug_queued_cmd {
215 struct timer_list cmnd_timer;
216 done_funct_t done_funct;
217 struct scsi_cmnd * a_cmnd;
220 static struct sdebug_queued_cmd queued_arr[SCSI_DEBUG_CANQUEUE];
222 static unsigned char * fake_storep; /* ramdisk storage */
223 static unsigned char *dif_storep; /* protection info */
225 static int num_aborts = 0;
226 static int num_dev_resets = 0;
227 static int num_bus_resets = 0;
228 static int num_host_resets = 0;
229 static int dix_writes;
230 static int dix_reads;
231 static int dif_errors;
233 static DEFINE_SPINLOCK(queued_arr_lock);
234 static DEFINE_RWLOCK(atomic_rw);
236 static char sdebug_proc_name[] = "scsi_debug";
238 static struct bus_type pseudo_lld_bus;
240 static inline sector_t dif_offset(sector_t sector)
245 static struct device_driver sdebug_driverfs_driver = {
246 .name = sdebug_proc_name,
247 .bus = &pseudo_lld_bus,
250 static const int check_condition_result =
251 (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
253 static const int illegal_condition_result =
254 (DRIVER_SENSE << 24) | (DID_ABORT << 16) | SAM_STAT_CHECK_CONDITION;
256 static unsigned char ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
258 static unsigned char iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
261 static int sdebug_add_adapter(void);
262 static void sdebug_remove_adapter(void);
264 static void sdebug_max_tgts_luns(void)
266 struct sdebug_host_info *sdbg_host;
267 struct Scsi_Host *hpnt;
269 spin_lock(&sdebug_host_list_lock);
270 list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
271 hpnt = sdbg_host->shost;
272 if ((hpnt->this_id >= 0) &&
273 (scsi_debug_num_tgts > hpnt->this_id))
274 hpnt->max_id = scsi_debug_num_tgts + 1;
276 hpnt->max_id = scsi_debug_num_tgts;
277 /* scsi_debug_max_luns; */
278 hpnt->max_lun = SAM2_WLUN_REPORT_LUNS;
280 spin_unlock(&sdebug_host_list_lock);
283 static void mk_sense_buffer(struct sdebug_dev_info *devip, int key,
286 unsigned char *sbuff;
288 sbuff = devip->sense_buff;
289 memset(sbuff, 0, SDEBUG_SENSE_LEN);
291 scsi_build_sense_buffer(scsi_debug_dsense, sbuff, key, asc, asq);
293 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
294 printk(KERN_INFO "scsi_debug: [sense_key,asc,ascq]: "
295 "[0x%x,0x%x,0x%x]\n", key, asc, asq);
298 static void get_data_transfer_info(unsigned char *cmd,
299 unsigned long long *lba, unsigned int *num)
304 *lba = (u64)cmd[9] | (u64)cmd[8] << 8 |
305 (u64)cmd[7] << 16 | (u64)cmd[6] << 24 |
306 (u64)cmd[5] << 32 | (u64)cmd[4] << 40 |
307 (u64)cmd[3] << 48 | (u64)cmd[2] << 56;
309 *num = (u32)cmd[13] | (u32)cmd[12] << 8 | (u32)cmd[11] << 16 |
314 *lba = (u32)cmd[5] | (u32)cmd[4] << 8 | (u32)cmd[3] << 16 |
317 *num = (u32)cmd[9] | (u32)cmd[8] << 8 | (u32)cmd[7] << 16 |
323 *lba = (u32)cmd[5] | (u32)cmd[4] << 8 | (u32)cmd[3] << 16 |
326 *num = (u32)cmd[8] | (u32)cmd[7] << 8;
330 *lba = (u32)cmd[3] | (u32)cmd[2] << 8 |
331 (u32)(cmd[1] & 0x1f) << 16;
332 *num = (0 == cmd[4]) ? 256 : cmd[4];
339 static int scsi_debug_ioctl(struct scsi_device *dev, int cmd, void __user *arg)
341 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
342 printk(KERN_INFO "scsi_debug: ioctl: cmd=0x%x\n", cmd);
345 /* return -ENOTTY; // correct return but upsets fdisk */
348 static int check_readiness(struct scsi_cmnd * SCpnt, int reset_only,
349 struct sdebug_dev_info * devip)
352 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
353 printk(KERN_INFO "scsi_debug: Reporting Unit "
354 "attention: power on reset\n");
356 mk_sense_buffer(devip, UNIT_ATTENTION, POWERON_RESET, 0);
357 return check_condition_result;
359 if ((0 == reset_only) && devip->stopped) {
360 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
361 printk(KERN_INFO "scsi_debug: Reporting Not "
362 "ready: initializing command required\n");
363 mk_sense_buffer(devip, NOT_READY, LOGICAL_UNIT_NOT_READY,
365 return check_condition_result;
370 /* Returns 0 if ok else (DID_ERROR << 16). Sets scp->resid . */
371 static int fill_from_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
375 struct scsi_data_buffer *sdb = scsi_in(scp);
379 if (!(scsi_bidi_cmnd(scp) || scp->sc_data_direction == DMA_FROM_DEVICE))
380 return (DID_ERROR << 16);
382 act_len = sg_copy_from_buffer(sdb->table.sgl, sdb->table.nents,
385 sdb->resid -= act_len;
387 sdb->resid = scsi_bufflen(scp) - act_len;
392 /* Returns number of bytes fetched into 'arr' or -1 if error. */
393 static int fetch_to_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
396 if (!scsi_bufflen(scp))
398 if (!(scsi_bidi_cmnd(scp) || scp->sc_data_direction == DMA_TO_DEVICE))
401 return scsi_sg_copy_to_buffer(scp, arr, arr_len);
405 static const char * inq_vendor_id = "Linux ";
406 static const char * inq_product_id = "scsi_debug ";
407 static const char * inq_product_rev = "0004";
409 static int inquiry_evpd_83(unsigned char * arr, int port_group_id,
410 int target_dev_id, int dev_id_num,
411 const char * dev_id_str,
417 port_a = target_dev_id + 1;
418 /* T10 vendor identifier field format (faked) */
419 arr[0] = 0x2; /* ASCII */
422 memcpy(&arr[4], inq_vendor_id, 8);
423 memcpy(&arr[12], inq_product_id, 16);
424 memcpy(&arr[28], dev_id_str, dev_id_str_len);
425 num = 8 + 16 + dev_id_str_len;
428 if (dev_id_num >= 0) {
429 /* NAA-5, Logical unit identifier (binary) */
430 arr[num++] = 0x1; /* binary (not necessarily sas) */
431 arr[num++] = 0x3; /* PIV=0, lu, naa */
434 arr[num++] = 0x53; /* naa-5 ieee company id=0x333333 (fake) */
438 arr[num++] = (dev_id_num >> 24);
439 arr[num++] = (dev_id_num >> 16) & 0xff;
440 arr[num++] = (dev_id_num >> 8) & 0xff;
441 arr[num++] = dev_id_num & 0xff;
442 /* Target relative port number */
443 arr[num++] = 0x61; /* proto=sas, binary */
444 arr[num++] = 0x94; /* PIV=1, target port, rel port */
445 arr[num++] = 0x0; /* reserved */
446 arr[num++] = 0x4; /* length */
447 arr[num++] = 0x0; /* reserved */
448 arr[num++] = 0x0; /* reserved */
450 arr[num++] = 0x1; /* relative port A */
452 /* NAA-5, Target port identifier */
453 arr[num++] = 0x61; /* proto=sas, binary */
454 arr[num++] = 0x93; /* piv=1, target port, naa */
457 arr[num++] = 0x52; /* naa-5, company id=0x222222 (fake) */
461 arr[num++] = (port_a >> 24);
462 arr[num++] = (port_a >> 16) & 0xff;
463 arr[num++] = (port_a >> 8) & 0xff;
464 arr[num++] = port_a & 0xff;
465 /* NAA-5, Target port group identifier */
466 arr[num++] = 0x61; /* proto=sas, binary */
467 arr[num++] = 0x95; /* piv=1, target port group id */
472 arr[num++] = (port_group_id >> 8) & 0xff;
473 arr[num++] = port_group_id & 0xff;
474 /* NAA-5, Target device identifier */
475 arr[num++] = 0x61; /* proto=sas, binary */
476 arr[num++] = 0xa3; /* piv=1, target device, naa */
479 arr[num++] = 0x52; /* naa-5, company id=0x222222 (fake) */
483 arr[num++] = (target_dev_id >> 24);
484 arr[num++] = (target_dev_id >> 16) & 0xff;
485 arr[num++] = (target_dev_id >> 8) & 0xff;
486 arr[num++] = target_dev_id & 0xff;
487 /* SCSI name string: Target device identifier */
488 arr[num++] = 0x63; /* proto=sas, UTF-8 */
489 arr[num++] = 0xa8; /* piv=1, target device, SCSI name string */
492 memcpy(arr + num, "naa.52222220", 12);
494 snprintf(b, sizeof(b), "%08X", target_dev_id);
495 memcpy(arr + num, b, 8);
497 memset(arr + num, 0, 4);
503 static unsigned char vpd84_data[] = {
504 /* from 4th byte */ 0x22,0x22,0x22,0x0,0xbb,0x0,
505 0x22,0x22,0x22,0x0,0xbb,0x1,
506 0x22,0x22,0x22,0x0,0xbb,0x2,
509 static int inquiry_evpd_84(unsigned char * arr)
511 memcpy(arr, vpd84_data, sizeof(vpd84_data));
512 return sizeof(vpd84_data);
515 static int inquiry_evpd_85(unsigned char * arr)
518 const char * na1 = "https://www.kernel.org/config";
519 const char * na2 = "http://www.kernel.org/log";
522 arr[num++] = 0x1; /* lu, storage config */
523 arr[num++] = 0x0; /* reserved */
528 plen = ((plen / 4) + 1) * 4;
529 arr[num++] = plen; /* length, null termianted, padded */
530 memcpy(arr + num, na1, olen);
531 memset(arr + num + olen, 0, plen - olen);
534 arr[num++] = 0x4; /* lu, logging */
535 arr[num++] = 0x0; /* reserved */
540 plen = ((plen / 4) + 1) * 4;
541 arr[num++] = plen; /* length, null terminated, padded */
542 memcpy(arr + num, na2, olen);
543 memset(arr + num + olen, 0, plen - olen);
549 /* SCSI ports VPD page */
550 static int inquiry_evpd_88(unsigned char * arr, int target_dev_id)
555 port_a = target_dev_id + 1;
557 arr[num++] = 0x0; /* reserved */
558 arr[num++] = 0x0; /* reserved */
560 arr[num++] = 0x1; /* relative port 1 (primary) */
561 memset(arr + num, 0, 6);
564 arr[num++] = 12; /* length tp descriptor */
565 /* naa-5 target port identifier (A) */
566 arr[num++] = 0x61; /* proto=sas, binary */
567 arr[num++] = 0x93; /* PIV=1, target port, NAA */
568 arr[num++] = 0x0; /* reserved */
569 arr[num++] = 0x8; /* length */
570 arr[num++] = 0x52; /* NAA-5, company_id=0x222222 (fake) */
574 arr[num++] = (port_a >> 24);
575 arr[num++] = (port_a >> 16) & 0xff;
576 arr[num++] = (port_a >> 8) & 0xff;
577 arr[num++] = port_a & 0xff;
579 arr[num++] = 0x0; /* reserved */
580 arr[num++] = 0x0; /* reserved */
582 arr[num++] = 0x2; /* relative port 2 (secondary) */
583 memset(arr + num, 0, 6);
586 arr[num++] = 12; /* length tp descriptor */
587 /* naa-5 target port identifier (B) */
588 arr[num++] = 0x61; /* proto=sas, binary */
589 arr[num++] = 0x93; /* PIV=1, target port, NAA */
590 arr[num++] = 0x0; /* reserved */
591 arr[num++] = 0x8; /* length */
592 arr[num++] = 0x52; /* NAA-5, company_id=0x222222 (fake) */
596 arr[num++] = (port_b >> 24);
597 arr[num++] = (port_b >> 16) & 0xff;
598 arr[num++] = (port_b >> 8) & 0xff;
599 arr[num++] = port_b & 0xff;
605 static unsigned char vpd89_data[] = {
606 /* from 4th byte */ 0,0,0,0,
607 'l','i','n','u','x',' ',' ',' ',
608 'S','A','T',' ','s','c','s','i','_','d','e','b','u','g',' ',' ',
610 0x34,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
612 0x5a,0xc,0xff,0x3f,0x37,0xc8,0x10,0,0,0,0,0,0x3f,0,0,0,
613 0,0,0,0,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x20,0x20,0x20,0x20,
614 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0,0,0,0x40,0x4,0,0x2e,0x33,
615 0x38,0x31,0x20,0x20,0x20,0x20,0x54,0x53,0x38,0x33,0x30,0x30,0x33,0x31,
617 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
619 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
621 0,0,0,0x2f,0,0,0,0x2,0,0x2,0x7,0,0xff,0xff,0x1,0,
622 0x3f,0,0xc1,0xff,0x3e,0,0x10,0x1,0xb0,0xf8,0x50,0x9,0,0,0x7,0,
623 0x3,0,0x78,0,0x78,0,0xf0,0,0x78,0,0,0,0,0,0,0,
624 0,0,0,0,0,0,0,0,0x2,0,0,0,0,0,0,0,
625 0x7e,0,0x1b,0,0x6b,0x34,0x1,0x7d,0x3,0x40,0x69,0x34,0x1,0x3c,0x3,0x40,
626 0x7f,0x40,0,0,0,0,0xfe,0xfe,0,0,0,0,0,0xfe,0,0,
627 0,0,0,0,0,0,0,0,0xb0,0xf8,0x50,0x9,0,0,0,0,
628 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
629 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
630 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
631 0x1,0,0xb0,0xf8,0x50,0x9,0xb0,0xf8,0x50,0x9,0x20,0x20,0x2,0,0xb6,0x42,
632 0,0x80,0x8a,0,0x6,0x3c,0xa,0x3c,0xff,0xff,0xc6,0x7,0,0x1,0,0x8,
633 0xf0,0xf,0,0x10,0x2,0,0x30,0,0,0,0,0,0,0,0x6,0xfe,
634 0,0,0x2,0,0x50,0,0x8a,0,0x4f,0x95,0,0,0x21,0,0xb,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,0,0,
643 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
644 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
645 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
646 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa5,0x51,
649 static int inquiry_evpd_89(unsigned char * arr)
651 memcpy(arr, vpd89_data, sizeof(vpd89_data));
652 return sizeof(vpd89_data);
656 static unsigned char vpdb0_data[] = {
657 /* from 4th byte */ 0,0,0,4,
662 static int inquiry_evpd_b0(unsigned char * arr)
666 memcpy(arr, vpdb0_data, sizeof(vpdb0_data));
667 gran = 1 << scsi_debug_physblk_exp;
668 arr[2] = (gran >> 8) & 0xff;
669 arr[3] = gran & 0xff;
670 if (sdebug_store_sectors > 0x400) {
671 arr[4] = (sdebug_store_sectors >> 24) & 0xff;
672 arr[5] = (sdebug_store_sectors >> 16) & 0xff;
673 arr[6] = (sdebug_store_sectors >> 8) & 0xff;
674 arr[7] = sdebug_store_sectors & 0xff;
676 return sizeof(vpdb0_data);
679 static int inquiry_evpd_b1(unsigned char *arr)
681 memset(arr, 0, 0x3c);
688 #define SDEBUG_LONG_INQ_SZ 96
689 #define SDEBUG_MAX_INQ_ARR_SZ 584
691 static int resp_inquiry(struct scsi_cmnd * scp, int target,
692 struct sdebug_dev_info * devip)
694 unsigned char pq_pdt;
696 unsigned char *cmd = (unsigned char *)scp->cmnd;
697 int alloc_len, n, ret;
699 alloc_len = (cmd[3] << 8) + cmd[4];
700 arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_ATOMIC);
702 return DID_REQUEUE << 16;
704 pq_pdt = 0x1e; /* present, wlun */
705 else if (scsi_debug_no_lun_0 && (0 == devip->lun))
706 pq_pdt = 0x7f; /* not present, no device type */
708 pq_pdt = (scsi_debug_ptype & 0x1f);
710 if (0x2 & cmd[1]) { /* CMDDT bit set */
711 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
714 return check_condition_result;
715 } else if (0x1 & cmd[1]) { /* EVPD bit set */
716 int lu_id_num, port_group_id, target_dev_id, len;
718 int host_no = devip->sdbg_host->shost->host_no;
720 port_group_id = (((host_no + 1) & 0x7f) << 8) +
721 (devip->channel & 0x7f);
722 if (0 == scsi_debug_vpd_use_hostno)
724 lu_id_num = devip->wlun ? -1 : (((host_no + 1) * 2000) +
725 (devip->target * 1000) + devip->lun);
726 target_dev_id = ((host_no + 1) * 2000) +
727 (devip->target * 1000) - 3;
728 len = scnprintf(lu_id_str, 6, "%d", lu_id_num);
729 if (0 == cmd[2]) { /* supported vital product data pages */
730 arr[1] = cmd[2]; /*sanity */
732 arr[n++] = 0x0; /* this page */
733 arr[n++] = 0x80; /* unit serial number */
734 arr[n++] = 0x83; /* device identification */
735 arr[n++] = 0x84; /* software interface ident. */
736 arr[n++] = 0x85; /* management network addresses */
737 arr[n++] = 0x86; /* extended inquiry */
738 arr[n++] = 0x87; /* mode page policy */
739 arr[n++] = 0x88; /* SCSI ports */
740 arr[n++] = 0x89; /* ATA information */
741 arr[n++] = 0xb0; /* Block limits (SBC) */
742 arr[n++] = 0xb1; /* Block characteristics (SBC) */
743 arr[3] = n - 4; /* number of supported VPD pages */
744 } else if (0x80 == cmd[2]) { /* unit serial number */
745 arr[1] = cmd[2]; /*sanity */
747 memcpy(&arr[4], lu_id_str, len);
748 } else if (0x83 == cmd[2]) { /* device identification */
749 arr[1] = cmd[2]; /*sanity */
750 arr[3] = inquiry_evpd_83(&arr[4], port_group_id,
751 target_dev_id, lu_id_num,
753 } else if (0x84 == cmd[2]) { /* Software interface ident. */
754 arr[1] = cmd[2]; /*sanity */
755 arr[3] = inquiry_evpd_84(&arr[4]);
756 } else if (0x85 == cmd[2]) { /* Management network addresses */
757 arr[1] = cmd[2]; /*sanity */
758 arr[3] = inquiry_evpd_85(&arr[4]);
759 } else if (0x86 == cmd[2]) { /* extended inquiry */
760 arr[1] = cmd[2]; /*sanity */
761 arr[3] = 0x3c; /* number of following entries */
762 if (scsi_debug_dif == SD_DIF_TYPE3_PROTECTION)
763 arr[4] = 0x4; /* SPT: GRD_CHK:1 */
764 else if (scsi_debug_dif)
765 arr[4] = 0x5; /* SPT: GRD_CHK:1, REF_CHK:1 */
767 arr[4] = 0x0; /* no protection stuff */
768 arr[5] = 0x7; /* head of q, ordered + simple q's */
769 } else if (0x87 == cmd[2]) { /* mode page policy */
770 arr[1] = cmd[2]; /*sanity */
771 arr[3] = 0x8; /* number of following entries */
772 arr[4] = 0x2; /* disconnect-reconnect mp */
773 arr[6] = 0x80; /* mlus, shared */
774 arr[8] = 0x18; /* protocol specific lu */
775 arr[10] = 0x82; /* mlus, per initiator port */
776 } else if (0x88 == cmd[2]) { /* SCSI Ports */
777 arr[1] = cmd[2]; /*sanity */
778 arr[3] = inquiry_evpd_88(&arr[4], target_dev_id);
779 } else if (0x89 == cmd[2]) { /* ATA information */
780 arr[1] = cmd[2]; /*sanity */
781 n = inquiry_evpd_89(&arr[4]);
784 } else if (0xb0 == cmd[2]) { /* Block limits (SBC) */
785 arr[1] = cmd[2]; /*sanity */
786 arr[3] = inquiry_evpd_b0(&arr[4]);
787 } else if (0xb1 == cmd[2]) { /* Block characteristics (SBC) */
788 arr[1] = cmd[2]; /*sanity */
789 arr[3] = inquiry_evpd_b1(&arr[4]);
791 /* Illegal request, invalid field in cdb */
792 mk_sense_buffer(devip, ILLEGAL_REQUEST,
793 INVALID_FIELD_IN_CDB, 0);
795 return check_condition_result;
797 len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len);
798 ret = fill_from_dev_buffer(scp, arr,
799 min(len, SDEBUG_MAX_INQ_ARR_SZ));
803 /* drops through here for a standard inquiry */
804 arr[1] = DEV_REMOVEABLE(target) ? 0x80 : 0; /* Removable disk */
805 arr[2] = scsi_debug_scsi_level;
806 arr[3] = 2; /* response_data_format==2 */
807 arr[4] = SDEBUG_LONG_INQ_SZ - 5;
808 arr[5] = scsi_debug_dif ? 1 : 0; /* PROTECT bit */
809 if (0 == scsi_debug_vpd_use_hostno)
810 arr[5] = 0x10; /* claim: implicit TGPS */
811 arr[6] = 0x10; /* claim: MultiP */
812 /* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */
813 arr[7] = 0xa; /* claim: LINKED + CMDQUE */
814 memcpy(&arr[8], inq_vendor_id, 8);
815 memcpy(&arr[16], inq_product_id, 16);
816 memcpy(&arr[32], inq_product_rev, 4);
817 /* version descriptors (2 bytes each) follow */
818 arr[58] = 0x0; arr[59] = 0x77; /* SAM-3 ANSI */
819 arr[60] = 0x3; arr[61] = 0x14; /* SPC-3 ANSI */
821 if (scsi_debug_ptype == 0) {
822 arr[n++] = 0x3; arr[n++] = 0x3d; /* SBC-2 ANSI */
823 } else if (scsi_debug_ptype == 1) {
824 arr[n++] = 0x3; arr[n++] = 0x60; /* SSC-2 no version */
826 arr[n++] = 0xc; arr[n++] = 0xf; /* SAS-1.1 rev 10 */
827 ret = fill_from_dev_buffer(scp, arr,
828 min(alloc_len, SDEBUG_LONG_INQ_SZ));
833 static int resp_requests(struct scsi_cmnd * scp,
834 struct sdebug_dev_info * devip)
836 unsigned char * sbuff;
837 unsigned char *cmd = (unsigned char *)scp->cmnd;
838 unsigned char arr[SDEBUG_SENSE_LEN];
842 memset(arr, 0, sizeof(arr));
843 if (devip->reset == 1)
844 mk_sense_buffer(devip, 0, NO_ADDITIONAL_SENSE, 0);
845 want_dsense = !!(cmd[1] & 1) || scsi_debug_dsense;
846 sbuff = devip->sense_buff;
847 if ((iec_m_pg[2] & 0x4) && (6 == (iec_m_pg[3] & 0xf))) {
850 arr[1] = 0x0; /* NO_SENSE in sense_key */
851 arr[2] = THRESHOLD_EXCEEDED;
852 arr[3] = 0xff; /* TEST set and MRIE==6 */
855 arr[2] = 0x0; /* NO_SENSE in sense_key */
856 arr[7] = 0xa; /* 18 byte sense buffer */
857 arr[12] = THRESHOLD_EXCEEDED;
858 arr[13] = 0xff; /* TEST set and MRIE==6 */
861 memcpy(arr, sbuff, SDEBUG_SENSE_LEN);
862 if ((cmd[1] & 1) && (! scsi_debug_dsense)) {
863 /* DESC bit set and sense_buff in fixed format */
864 memset(arr, 0, sizeof(arr));
866 arr[1] = sbuff[2]; /* sense key */
867 arr[2] = sbuff[12]; /* asc */
868 arr[3] = sbuff[13]; /* ascq */
872 mk_sense_buffer(devip, 0, NO_ADDITIONAL_SENSE, 0);
873 return fill_from_dev_buffer(scp, arr, len);
876 static int resp_start_stop(struct scsi_cmnd * scp,
877 struct sdebug_dev_info * devip)
879 unsigned char *cmd = (unsigned char *)scp->cmnd;
880 int power_cond, errsts, start;
882 if ((errsts = check_readiness(scp, 1, devip)))
884 power_cond = (cmd[4] & 0xf0) >> 4;
886 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
888 return check_condition_result;
891 if (start == devip->stopped)
892 devip->stopped = !start;
896 static sector_t get_sdebug_capacity(void)
898 if (scsi_debug_virtual_gb > 0)
899 return 2048 * 1024 * (sector_t)scsi_debug_virtual_gb;
901 return sdebug_store_sectors;
904 #define SDEBUG_READCAP_ARR_SZ 8
905 static int resp_readcap(struct scsi_cmnd * scp,
906 struct sdebug_dev_info * devip)
908 unsigned char arr[SDEBUG_READCAP_ARR_SZ];
912 if ((errsts = check_readiness(scp, 1, devip)))
914 /* following just in case virtual_gb changed */
915 sdebug_capacity = get_sdebug_capacity();
916 memset(arr, 0, SDEBUG_READCAP_ARR_SZ);
917 if (sdebug_capacity < 0xffffffff) {
918 capac = (unsigned int)sdebug_capacity - 1;
919 arr[0] = (capac >> 24);
920 arr[1] = (capac >> 16) & 0xff;
921 arr[2] = (capac >> 8) & 0xff;
922 arr[3] = capac & 0xff;
929 arr[6] = (scsi_debug_sector_size >> 8) & 0xff;
930 arr[7] = scsi_debug_sector_size & 0xff;
931 return fill_from_dev_buffer(scp, arr, SDEBUG_READCAP_ARR_SZ);
934 #define SDEBUG_READCAP16_ARR_SZ 32
935 static int resp_readcap16(struct scsi_cmnd * scp,
936 struct sdebug_dev_info * devip)
938 unsigned char *cmd = (unsigned char *)scp->cmnd;
939 unsigned char arr[SDEBUG_READCAP16_ARR_SZ];
940 unsigned long long capac;
941 int errsts, k, alloc_len;
943 if ((errsts = check_readiness(scp, 1, devip)))
945 alloc_len = ((cmd[10] << 24) + (cmd[11] << 16) + (cmd[12] << 8)
947 /* following just in case virtual_gb changed */
948 sdebug_capacity = get_sdebug_capacity();
949 memset(arr, 0, SDEBUG_READCAP16_ARR_SZ);
950 capac = sdebug_capacity - 1;
951 for (k = 0; k < 8; ++k, capac >>= 8)
952 arr[7 - k] = capac & 0xff;
953 arr[8] = (scsi_debug_sector_size >> 24) & 0xff;
954 arr[9] = (scsi_debug_sector_size >> 16) & 0xff;
955 arr[10] = (scsi_debug_sector_size >> 8) & 0xff;
956 arr[11] = scsi_debug_sector_size & 0xff;
957 arr[13] = scsi_debug_physblk_exp & 0xf;
958 arr[14] = (scsi_debug_lowest_aligned >> 8) & 0x3f;
959 arr[15] = scsi_debug_lowest_aligned & 0xff;
961 if (scsi_debug_dif) {
962 arr[12] = (scsi_debug_dif - 1) << 1; /* P_TYPE */
963 arr[12] |= 1; /* PROT_EN */
966 return fill_from_dev_buffer(scp, arr,
967 min(alloc_len, SDEBUG_READCAP16_ARR_SZ));
970 #define SDEBUG_MAX_TGTPGS_ARR_SZ 1412
972 static int resp_report_tgtpgs(struct scsi_cmnd * scp,
973 struct sdebug_dev_info * devip)
975 unsigned char *cmd = (unsigned char *)scp->cmnd;
977 int host_no = devip->sdbg_host->shost->host_no;
978 int n, ret, alen, rlen;
979 int port_group_a, port_group_b, port_a, port_b;
981 alen = ((cmd[6] << 24) + (cmd[7] << 16) + (cmd[8] << 8)
984 arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_ATOMIC);
986 return DID_REQUEUE << 16;
988 * EVPD page 0x88 states we have two ports, one
989 * real and a fake port with no device connected.
990 * So we create two port groups with one port each
991 * and set the group with port B to unavailable.
993 port_a = 0x1; /* relative port A */
994 port_b = 0x2; /* relative port B */
995 port_group_a = (((host_no + 1) & 0x7f) << 8) +
996 (devip->channel & 0x7f);
997 port_group_b = (((host_no + 1) & 0x7f) << 8) +
998 (devip->channel & 0x7f) + 0x80;
1001 * The asymmetric access state is cycled according to the host_id.
1004 if (0 == scsi_debug_vpd_use_hostno) {
1005 arr[n++] = host_no % 3; /* Asymm access state */
1006 arr[n++] = 0x0F; /* claim: all states are supported */
1008 arr[n++] = 0x0; /* Active/Optimized path */
1009 arr[n++] = 0x01; /* claim: only support active/optimized paths */
1011 arr[n++] = (port_group_a >> 8) & 0xff;
1012 arr[n++] = port_group_a & 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_a >> 8) & 0xff;
1020 arr[n++] = port_a & 0xff;
1021 arr[n++] = 3; /* Port unavailable */
1022 arr[n++] = 0x08; /* claim: only unavailalbe paths are supported */
1023 arr[n++] = (port_group_b >> 8) & 0xff;
1024 arr[n++] = port_group_b & 0xff;
1025 arr[n++] = 0; /* Reserved */
1026 arr[n++] = 0; /* Status code */
1027 arr[n++] = 0; /* Vendor unique */
1028 arr[n++] = 0x1; /* One port per group */
1029 arr[n++] = 0; /* Reserved */
1030 arr[n++] = 0; /* Reserved */
1031 arr[n++] = (port_b >> 8) & 0xff;
1032 arr[n++] = port_b & 0xff;
1035 arr[0] = (rlen >> 24) & 0xff;
1036 arr[1] = (rlen >> 16) & 0xff;
1037 arr[2] = (rlen >> 8) & 0xff;
1038 arr[3] = rlen & 0xff;
1041 * Return the smallest value of either
1042 * - The allocated length
1043 * - The constructed command length
1044 * - The maximum array size
1047 ret = fill_from_dev_buffer(scp, arr,
1048 min(rlen, SDEBUG_MAX_TGTPGS_ARR_SZ));
1053 /* <<Following mode page info copied from ST318451LW>> */
1055 static int resp_err_recov_pg(unsigned char * p, int pcontrol, int target)
1056 { /* Read-Write Error Recovery page for mode_sense */
1057 unsigned char err_recov_pg[] = {0x1, 0xa, 0xc0, 11, 240, 0, 0, 0,
1060 memcpy(p, err_recov_pg, sizeof(err_recov_pg));
1062 memset(p + 2, 0, sizeof(err_recov_pg) - 2);
1063 return sizeof(err_recov_pg);
1066 static int resp_disconnect_pg(unsigned char * p, int pcontrol, int target)
1067 { /* Disconnect-Reconnect page for mode_sense */
1068 unsigned char disconnect_pg[] = {0x2, 0xe, 128, 128, 0, 10, 0, 0,
1069 0, 0, 0, 0, 0, 0, 0, 0};
1071 memcpy(p, disconnect_pg, sizeof(disconnect_pg));
1073 memset(p + 2, 0, sizeof(disconnect_pg) - 2);
1074 return sizeof(disconnect_pg);
1077 static int resp_format_pg(unsigned char * p, int pcontrol, int target)
1078 { /* Format device page for mode_sense */
1079 unsigned char format_pg[] = {0x3, 0x16, 0, 0, 0, 0, 0, 0,
1080 0, 0, 0, 0, 0, 0, 0, 0,
1081 0, 0, 0, 0, 0x40, 0, 0, 0};
1083 memcpy(p, format_pg, sizeof(format_pg));
1084 p[10] = (sdebug_sectors_per >> 8) & 0xff;
1085 p[11] = sdebug_sectors_per & 0xff;
1086 p[12] = (scsi_debug_sector_size >> 8) & 0xff;
1087 p[13] = scsi_debug_sector_size & 0xff;
1088 if (DEV_REMOVEABLE(target))
1089 p[20] |= 0x20; /* should agree with INQUIRY */
1091 memset(p + 2, 0, sizeof(format_pg) - 2);
1092 return sizeof(format_pg);
1095 static int resp_caching_pg(unsigned char * p, int pcontrol, int target)
1096 { /* Caching page for mode_sense */
1097 unsigned char caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
1098 0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0, 0, 0, 0, 0};
1100 memcpy(p, caching_pg, sizeof(caching_pg));
1102 memset(p + 2, 0, sizeof(caching_pg) - 2);
1103 return sizeof(caching_pg);
1106 static int resp_ctrl_m_pg(unsigned char * p, int pcontrol, int target)
1107 { /* Control mode page for mode_sense */
1108 unsigned char ch_ctrl_m_pg[] = {/* 0xa, 10, */ 0x6, 0, 0, 0, 0, 0,
1110 unsigned char d_ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
1113 if (scsi_debug_dsense)
1114 ctrl_m_pg[2] |= 0x4;
1116 ctrl_m_pg[2] &= ~0x4;
1119 ctrl_m_pg[5] |= 0x80; /* ATO=1 */
1121 memcpy(p, ctrl_m_pg, sizeof(ctrl_m_pg));
1123 memcpy(p + 2, ch_ctrl_m_pg, sizeof(ch_ctrl_m_pg));
1124 else if (2 == pcontrol)
1125 memcpy(p, d_ctrl_m_pg, sizeof(d_ctrl_m_pg));
1126 return sizeof(ctrl_m_pg);
1130 static int resp_iec_m_pg(unsigned char * p, int pcontrol, int target)
1131 { /* Informational Exceptions control mode page for mode_sense */
1132 unsigned char ch_iec_m_pg[] = {/* 0x1c, 0xa, */ 0x4, 0xf, 0, 0, 0, 0,
1134 unsigned char d_iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
1137 memcpy(p, iec_m_pg, sizeof(iec_m_pg));
1139 memcpy(p + 2, ch_iec_m_pg, sizeof(ch_iec_m_pg));
1140 else if (2 == pcontrol)
1141 memcpy(p, d_iec_m_pg, sizeof(d_iec_m_pg));
1142 return sizeof(iec_m_pg);
1145 static int resp_sas_sf_m_pg(unsigned char * p, int pcontrol, int target)
1146 { /* SAS SSP mode page - short format for mode_sense */
1147 unsigned char sas_sf_m_pg[] = {0x19, 0x6,
1148 0x6, 0x0, 0x7, 0xd0, 0x0, 0x0};
1150 memcpy(p, sas_sf_m_pg, sizeof(sas_sf_m_pg));
1152 memset(p + 2, 0, sizeof(sas_sf_m_pg) - 2);
1153 return sizeof(sas_sf_m_pg);
1157 static int resp_sas_pcd_m_spg(unsigned char * p, int pcontrol, int target,
1159 { /* SAS phy control and discover mode page for mode_sense */
1160 unsigned char sas_pcd_m_pg[] = {0x59, 0x1, 0, 0x64, 0, 0x6, 0, 2,
1161 0, 0, 0, 0, 0x10, 0x9, 0x8, 0x0,
1162 0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0,
1163 0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1,
1164 0x2, 0, 0, 0, 0, 0, 0, 0,
1165 0x88, 0x99, 0, 0, 0, 0, 0, 0,
1166 0, 0, 0, 0, 0, 0, 0, 0,
1167 0, 1, 0, 0, 0x10, 0x9, 0x8, 0x0,
1168 0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0,
1169 0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1,
1170 0x3, 0, 0, 0, 0, 0, 0, 0,
1171 0x88, 0x99, 0, 0, 0, 0, 0, 0,
1172 0, 0, 0, 0, 0, 0, 0, 0,
1176 port_a = target_dev_id + 1;
1177 port_b = port_a + 1;
1178 memcpy(p, sas_pcd_m_pg, sizeof(sas_pcd_m_pg));
1179 p[20] = (port_a >> 24);
1180 p[21] = (port_a >> 16) & 0xff;
1181 p[22] = (port_a >> 8) & 0xff;
1182 p[23] = port_a & 0xff;
1183 p[48 + 20] = (port_b >> 24);
1184 p[48 + 21] = (port_b >> 16) & 0xff;
1185 p[48 + 22] = (port_b >> 8) & 0xff;
1186 p[48 + 23] = port_b & 0xff;
1188 memset(p + 4, 0, sizeof(sas_pcd_m_pg) - 4);
1189 return sizeof(sas_pcd_m_pg);
1192 static int resp_sas_sha_m_spg(unsigned char * p, int pcontrol)
1193 { /* SAS SSP shared protocol specific port mode subpage */
1194 unsigned char sas_sha_m_pg[] = {0x59, 0x2, 0, 0xc, 0, 0x6, 0x10, 0,
1195 0, 0, 0, 0, 0, 0, 0, 0,
1198 memcpy(p, sas_sha_m_pg, sizeof(sas_sha_m_pg));
1200 memset(p + 4, 0, sizeof(sas_sha_m_pg) - 4);
1201 return sizeof(sas_sha_m_pg);
1204 #define SDEBUG_MAX_MSENSE_SZ 256
1206 static int resp_mode_sense(struct scsi_cmnd * scp, int target,
1207 struct sdebug_dev_info * devip)
1209 unsigned char dbd, llbaa;
1210 int pcontrol, pcode, subpcode, bd_len;
1211 unsigned char dev_spec;
1212 int k, alloc_len, msense_6, offset, len, errsts, target_dev_id;
1214 unsigned char arr[SDEBUG_MAX_MSENSE_SZ];
1215 unsigned char *cmd = (unsigned char *)scp->cmnd;
1217 if ((errsts = check_readiness(scp, 1, devip)))
1219 dbd = !!(cmd[1] & 0x8);
1220 pcontrol = (cmd[2] & 0xc0) >> 6;
1221 pcode = cmd[2] & 0x3f;
1223 msense_6 = (MODE_SENSE == cmd[0]);
1224 llbaa = msense_6 ? 0 : !!(cmd[1] & 0x10);
1225 if ((0 == scsi_debug_ptype) && (0 == dbd))
1226 bd_len = llbaa ? 16 : 8;
1229 alloc_len = msense_6 ? cmd[4] : ((cmd[7] << 8) | cmd[8]);
1230 memset(arr, 0, SDEBUG_MAX_MSENSE_SZ);
1231 if (0x3 == pcontrol) { /* Saving values not supported */
1232 mk_sense_buffer(devip, ILLEGAL_REQUEST, SAVING_PARAMS_UNSUP,
1234 return check_condition_result;
1236 target_dev_id = ((devip->sdbg_host->shost->host_no + 1) * 2000) +
1237 (devip->target * 1000) - 3;
1238 /* set DPOFUA bit for disks */
1239 if (0 == scsi_debug_ptype)
1240 dev_spec = (DEV_READONLY(target) ? 0x80 : 0x0) | 0x10;
1250 arr[4] = 0x1; /* set LONGLBA bit */
1251 arr[7] = bd_len; /* assume 255 or less */
1255 if ((bd_len > 0) && (!sdebug_capacity))
1256 sdebug_capacity = get_sdebug_capacity();
1259 if (sdebug_capacity > 0xfffffffe) {
1265 ap[0] = (sdebug_capacity >> 24) & 0xff;
1266 ap[1] = (sdebug_capacity >> 16) & 0xff;
1267 ap[2] = (sdebug_capacity >> 8) & 0xff;
1268 ap[3] = sdebug_capacity & 0xff;
1270 ap[6] = (scsi_debug_sector_size >> 8) & 0xff;
1271 ap[7] = scsi_debug_sector_size & 0xff;
1274 } else if (16 == bd_len) {
1275 unsigned long long capac = sdebug_capacity;
1277 for (k = 0; k < 8; ++k, capac >>= 8)
1278 ap[7 - k] = capac & 0xff;
1279 ap[12] = (scsi_debug_sector_size >> 24) & 0xff;
1280 ap[13] = (scsi_debug_sector_size >> 16) & 0xff;
1281 ap[14] = (scsi_debug_sector_size >> 8) & 0xff;
1282 ap[15] = scsi_debug_sector_size & 0xff;
1287 if ((subpcode > 0x0) && (subpcode < 0xff) && (0x19 != pcode)) {
1288 /* TODO: Control Extension page */
1289 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1291 return check_condition_result;
1294 case 0x1: /* Read-Write error recovery page, direct access */
1295 len = resp_err_recov_pg(ap, pcontrol, target);
1298 case 0x2: /* Disconnect-Reconnect page, all devices */
1299 len = resp_disconnect_pg(ap, pcontrol, target);
1302 case 0x3: /* Format device page, direct access */
1303 len = resp_format_pg(ap, pcontrol, target);
1306 case 0x8: /* Caching page, direct access */
1307 len = resp_caching_pg(ap, pcontrol, target);
1310 case 0xa: /* Control Mode page, all devices */
1311 len = resp_ctrl_m_pg(ap, pcontrol, target);
1314 case 0x19: /* if spc==1 then sas phy, control+discover */
1315 if ((subpcode > 0x2) && (subpcode < 0xff)) {
1316 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1317 INVALID_FIELD_IN_CDB, 0);
1318 return check_condition_result;
1321 if ((0x0 == subpcode) || (0xff == subpcode))
1322 len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
1323 if ((0x1 == subpcode) || (0xff == subpcode))
1324 len += resp_sas_pcd_m_spg(ap + len, pcontrol, target,
1326 if ((0x2 == subpcode) || (0xff == subpcode))
1327 len += resp_sas_sha_m_spg(ap + len, pcontrol);
1330 case 0x1c: /* Informational Exceptions Mode page, all devices */
1331 len = resp_iec_m_pg(ap, pcontrol, target);
1334 case 0x3f: /* Read all Mode pages */
1335 if ((0 == subpcode) || (0xff == subpcode)) {
1336 len = resp_err_recov_pg(ap, pcontrol, target);
1337 len += resp_disconnect_pg(ap + len, pcontrol, target);
1338 len += resp_format_pg(ap + len, pcontrol, target);
1339 len += resp_caching_pg(ap + len, pcontrol, target);
1340 len += resp_ctrl_m_pg(ap + len, pcontrol, target);
1341 len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
1342 if (0xff == subpcode) {
1343 len += resp_sas_pcd_m_spg(ap + len, pcontrol,
1344 target, target_dev_id);
1345 len += resp_sas_sha_m_spg(ap + len, pcontrol);
1347 len += resp_iec_m_pg(ap + len, pcontrol, target);
1349 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1350 INVALID_FIELD_IN_CDB, 0);
1351 return check_condition_result;
1356 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1358 return check_condition_result;
1361 arr[0] = offset - 1;
1363 arr[0] = ((offset - 2) >> 8) & 0xff;
1364 arr[1] = (offset - 2) & 0xff;
1366 return fill_from_dev_buffer(scp, arr, min(alloc_len, offset));
1369 #define SDEBUG_MAX_MSELECT_SZ 512
1371 static int resp_mode_select(struct scsi_cmnd * scp, int mselect6,
1372 struct sdebug_dev_info * devip)
1374 int pf, sp, ps, md_len, bd_len, off, spf, pg_len;
1375 int param_len, res, errsts, mpage;
1376 unsigned char arr[SDEBUG_MAX_MSELECT_SZ];
1377 unsigned char *cmd = (unsigned char *)scp->cmnd;
1379 if ((errsts = check_readiness(scp, 1, devip)))
1381 memset(arr, 0, sizeof(arr));
1384 param_len = mselect6 ? cmd[4] : ((cmd[7] << 8) + cmd[8]);
1385 if ((0 == pf) || sp || (param_len > SDEBUG_MAX_MSELECT_SZ)) {
1386 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1387 INVALID_FIELD_IN_CDB, 0);
1388 return check_condition_result;
1390 res = fetch_to_dev_buffer(scp, arr, param_len);
1392 return (DID_ERROR << 16);
1393 else if ((res < param_len) &&
1394 (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
1395 printk(KERN_INFO "scsi_debug: mode_select: cdb indicated=%d, "
1396 " IO sent=%d bytes\n", param_len, res);
1397 md_len = mselect6 ? (arr[0] + 1) : ((arr[0] << 8) + arr[1] + 2);
1398 bd_len = mselect6 ? arr[3] : ((arr[6] << 8) + arr[7]);
1400 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1401 INVALID_FIELD_IN_PARAM_LIST, 0);
1402 return check_condition_result;
1404 off = bd_len + (mselect6 ? 4 : 8);
1405 mpage = arr[off] & 0x3f;
1406 ps = !!(arr[off] & 0x80);
1408 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1409 INVALID_FIELD_IN_PARAM_LIST, 0);
1410 return check_condition_result;
1412 spf = !!(arr[off] & 0x40);
1413 pg_len = spf ? ((arr[off + 2] << 8) + arr[off + 3] + 4) :
1415 if ((pg_len + off) > param_len) {
1416 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1417 PARAMETER_LIST_LENGTH_ERR, 0);
1418 return check_condition_result;
1421 case 0xa: /* Control Mode page */
1422 if (ctrl_m_pg[1] == arr[off + 1]) {
1423 memcpy(ctrl_m_pg + 2, arr + off + 2,
1424 sizeof(ctrl_m_pg) - 2);
1425 scsi_debug_dsense = !!(ctrl_m_pg[2] & 0x4);
1429 case 0x1c: /* Informational Exceptions Mode page */
1430 if (iec_m_pg[1] == arr[off + 1]) {
1431 memcpy(iec_m_pg + 2, arr + off + 2,
1432 sizeof(iec_m_pg) - 2);
1439 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1440 INVALID_FIELD_IN_PARAM_LIST, 0);
1441 return check_condition_result;
1444 static int resp_temp_l_pg(unsigned char * arr)
1446 unsigned char temp_l_pg[] = {0x0, 0x0, 0x3, 0x2, 0x0, 38,
1447 0x0, 0x1, 0x3, 0x2, 0x0, 65,
1450 memcpy(arr, temp_l_pg, sizeof(temp_l_pg));
1451 return sizeof(temp_l_pg);
1454 static int resp_ie_l_pg(unsigned char * arr)
1456 unsigned char ie_l_pg[] = {0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 38,
1459 memcpy(arr, ie_l_pg, sizeof(ie_l_pg));
1460 if (iec_m_pg[2] & 0x4) { /* TEST bit set */
1461 arr[4] = THRESHOLD_EXCEEDED;
1464 return sizeof(ie_l_pg);
1467 #define SDEBUG_MAX_LSENSE_SZ 512
1469 static int resp_log_sense(struct scsi_cmnd * scp,
1470 struct sdebug_dev_info * devip)
1472 int ppc, sp, pcontrol, pcode, subpcode, alloc_len, errsts, len, n;
1473 unsigned char arr[SDEBUG_MAX_LSENSE_SZ];
1474 unsigned char *cmd = (unsigned char *)scp->cmnd;
1476 if ((errsts = check_readiness(scp, 1, devip)))
1478 memset(arr, 0, sizeof(arr));
1482 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1483 INVALID_FIELD_IN_CDB, 0);
1484 return check_condition_result;
1486 pcontrol = (cmd[2] & 0xc0) >> 6;
1487 pcode = cmd[2] & 0x3f;
1488 subpcode = cmd[3] & 0xff;
1489 alloc_len = (cmd[7] << 8) + cmd[8];
1491 if (0 == subpcode) {
1493 case 0x0: /* Supported log pages log page */
1495 arr[n++] = 0x0; /* this page */
1496 arr[n++] = 0xd; /* Temperature */
1497 arr[n++] = 0x2f; /* Informational exceptions */
1500 case 0xd: /* Temperature log page */
1501 arr[3] = resp_temp_l_pg(arr + 4);
1503 case 0x2f: /* Informational exceptions log page */
1504 arr[3] = resp_ie_l_pg(arr + 4);
1507 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1508 INVALID_FIELD_IN_CDB, 0);
1509 return check_condition_result;
1511 } else if (0xff == subpcode) {
1515 case 0x0: /* Supported log pages and subpages log page */
1518 arr[n++] = 0x0; /* 0,0 page */
1520 arr[n++] = 0xff; /* this page */
1522 arr[n++] = 0x0; /* Temperature */
1524 arr[n++] = 0x0; /* Informational exceptions */
1527 case 0xd: /* Temperature subpages */
1530 arr[n++] = 0x0; /* Temperature */
1533 case 0x2f: /* Informational exceptions subpages */
1536 arr[n++] = 0x0; /* Informational exceptions */
1540 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1541 INVALID_FIELD_IN_CDB, 0);
1542 return check_condition_result;
1545 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1546 INVALID_FIELD_IN_CDB, 0);
1547 return check_condition_result;
1549 len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len);
1550 return fill_from_dev_buffer(scp, arr,
1551 min(len, SDEBUG_MAX_INQ_ARR_SZ));
1554 static int check_device_access_params(struct sdebug_dev_info *devi,
1555 unsigned long long lba, unsigned int num)
1557 if (lba + num > sdebug_capacity) {
1558 mk_sense_buffer(devi, ILLEGAL_REQUEST, ADDR_OUT_OF_RANGE, 0);
1559 return check_condition_result;
1561 /* transfer length excessive (tie in to block limits VPD page) */
1562 if (num > sdebug_store_sectors) {
1563 mk_sense_buffer(devi, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
1564 return check_condition_result;
1569 static int do_device_access(struct scsi_cmnd *scmd,
1570 struct sdebug_dev_info *devi,
1571 unsigned long long lba, unsigned int num, int write)
1574 unsigned int block, rest = 0;
1575 int (*func)(struct scsi_cmnd *, unsigned char *, int);
1577 func = write ? fetch_to_dev_buffer : fill_from_dev_buffer;
1579 block = do_div(lba, sdebug_store_sectors);
1580 if (block + num > sdebug_store_sectors)
1581 rest = block + num - sdebug_store_sectors;
1583 ret = func(scmd, fake_storep + (block * scsi_debug_sector_size),
1584 (num - rest) * scsi_debug_sector_size);
1586 ret = func(scmd, fake_storep, rest * scsi_debug_sector_size);
1591 static int prot_verify_read(struct scsi_cmnd *SCpnt, sector_t start_sec,
1592 unsigned int sectors)
1594 unsigned int i, resid;
1595 struct scatterlist *psgl;
1596 struct sd_dif_tuple *sdt;
1598 sector_t tmp_sec = start_sec;
1601 start_sec = do_div(tmp_sec, sdebug_store_sectors);
1603 sdt = (struct sd_dif_tuple *)(dif_storep + dif_offset(start_sec));
1605 for (i = 0 ; i < sectors ; i++) {
1608 if (sdt[i].app_tag == 0xffff)
1611 sector = start_sec + i;
1613 switch (scsi_debug_guard) {
1615 csum = ip_compute_csum(fake_storep +
1616 sector * scsi_debug_sector_size,
1617 scsi_debug_sector_size);
1620 csum = crc_t10dif(fake_storep +
1621 sector * scsi_debug_sector_size,
1622 scsi_debug_sector_size);
1623 csum = cpu_to_be16(csum);
1629 if (sdt[i].guard_tag != csum) {
1630 printk(KERN_ERR "%s: GUARD check failed on sector %lu" \
1631 " rcvd 0x%04x, data 0x%04x\n", __func__,
1632 (unsigned long)sector,
1633 be16_to_cpu(sdt[i].guard_tag),
1639 if (scsi_debug_dif != SD_DIF_TYPE3_PROTECTION &&
1640 be32_to_cpu(sdt[i].ref_tag) != (sector & 0xffffffff)) {
1641 printk(KERN_ERR "%s: REF check failed on sector %lu\n",
1642 __func__, (unsigned long)sector);
1648 resid = sectors * 8; /* Bytes of protection data to copy into sgl */
1651 scsi_for_each_prot_sg(SCpnt, psgl, scsi_prot_sg_count(SCpnt), i) {
1652 int len = min(psgl->length, resid);
1654 paddr = kmap_atomic(sg_page(psgl), KM_IRQ0) + psgl->offset;
1655 memcpy(paddr, dif_storep + dif_offset(sector), len);
1658 if (sector >= sdebug_store_sectors) {
1661 sector = do_div(tmp_sec, sdebug_store_sectors);
1664 kunmap_atomic(paddr, KM_IRQ0);
1672 static int resp_read(struct scsi_cmnd *SCpnt, unsigned long long lba,
1673 unsigned int num, struct sdebug_dev_info *devip)
1675 unsigned long iflags;
1678 ret = check_device_access_params(devip, lba, num);
1682 if ((SCSI_DEBUG_OPT_MEDIUM_ERR & scsi_debug_opts) &&
1683 (lba <= OPT_MEDIUM_ERR_ADDR) &&
1684 ((lba + num) > OPT_MEDIUM_ERR_ADDR)) {
1685 /* claim unrecoverable read error */
1686 mk_sense_buffer(devip, MEDIUM_ERROR, UNRECOVERED_READ_ERR,
1688 /* set info field and valid bit for fixed descriptor */
1689 if (0x70 == (devip->sense_buff[0] & 0x7f)) {
1690 devip->sense_buff[0] |= 0x80; /* Valid bit */
1691 ret = OPT_MEDIUM_ERR_ADDR;
1692 devip->sense_buff[3] = (ret >> 24) & 0xff;
1693 devip->sense_buff[4] = (ret >> 16) & 0xff;
1694 devip->sense_buff[5] = (ret >> 8) & 0xff;
1695 devip->sense_buff[6] = ret & 0xff;
1697 return check_condition_result;
1701 if (scsi_debug_dix && scsi_prot_sg_count(SCpnt)) {
1702 int prot_ret = prot_verify_read(SCpnt, lba, num);
1705 mk_sense_buffer(devip, ABORTED_COMMAND, 0x10, prot_ret);
1706 return illegal_condition_result;
1710 read_lock_irqsave(&atomic_rw, iflags);
1711 ret = do_device_access(SCpnt, devip, lba, num, 0);
1712 read_unlock_irqrestore(&atomic_rw, iflags);
1716 void dump_sector(unsigned char *buf, int len)
1720 printk(KERN_ERR ">>> Sector Dump <<<\n");
1722 for (i = 0 ; i < len ; i += 16) {
1723 printk(KERN_ERR "%04d: ", i);
1725 for (j = 0 ; j < 16 ; j++) {
1726 unsigned char c = buf[i+j];
1727 if (c >= 0x20 && c < 0x7e)
1728 printk(" %c ", buf[i+j]);
1730 printk("%02x ", buf[i+j]);
1737 static int prot_verify_write(struct scsi_cmnd *SCpnt, sector_t start_sec,
1738 unsigned int sectors)
1741 struct sd_dif_tuple *sdt;
1742 struct scatterlist *dsgl = scsi_sglist(SCpnt);
1743 struct scatterlist *psgl = scsi_prot_sglist(SCpnt);
1744 void *daddr, *paddr;
1745 sector_t tmp_sec = start_sec;
1748 unsigned short csum;
1750 sector = do_div(tmp_sec, sdebug_store_sectors);
1752 if (((SCpnt->cmnd[1] >> 5) & 7) != 1) {
1753 printk(KERN_WARNING "scsi_debug: WRPROTECT != 1\n");
1757 BUG_ON(scsi_sg_count(SCpnt) == 0);
1758 BUG_ON(scsi_prot_sg_count(SCpnt) == 0);
1760 paddr = kmap_atomic(sg_page(psgl), KM_IRQ1) + psgl->offset;
1763 /* For each data page */
1764 scsi_for_each_sg(SCpnt, dsgl, scsi_sg_count(SCpnt), i) {
1765 daddr = kmap_atomic(sg_page(dsgl), KM_IRQ0) + dsgl->offset;
1767 /* For each sector-sized chunk in data page */
1768 for (j = 0 ; j < dsgl->length ; j += scsi_debug_sector_size) {
1770 /* If we're at the end of the current
1771 * protection page advance to the next one
1773 if (ppage_offset >= psgl->length) {
1774 kunmap_atomic(paddr, KM_IRQ1);
1775 psgl = sg_next(psgl);
1776 BUG_ON(psgl == NULL);
1777 paddr = kmap_atomic(sg_page(psgl), KM_IRQ1)
1782 sdt = paddr + ppage_offset;
1784 switch (scsi_debug_guard) {
1786 csum = ip_compute_csum(daddr,
1787 scsi_debug_sector_size);
1790 csum = cpu_to_be16(crc_t10dif(daddr,
1791 scsi_debug_sector_size));
1799 if (sdt->guard_tag != csum) {
1801 "%s: GUARD check failed on sector %lu " \
1802 "rcvd 0x%04x, calculated 0x%04x\n",
1803 __func__, (unsigned long)sector,
1804 be16_to_cpu(sdt->guard_tag),
1807 dump_sector(daddr, scsi_debug_sector_size);
1811 if (scsi_debug_dif != SD_DIF_TYPE3_PROTECTION &&
1812 be32_to_cpu(sdt->ref_tag)
1813 != (start_sec & 0xffffffff)) {
1815 "%s: REF check failed on sector %lu\n",
1816 __func__, (unsigned long)sector);
1818 dump_sector(daddr, scsi_debug_sector_size);
1822 /* Would be great to copy this in bigger
1823 * chunks. However, for the sake of
1824 * correctness we need to verify each sector
1825 * before writing it to "stable" storage
1827 memcpy(dif_storep + dif_offset(sector), sdt, 8);
1831 if (sector == sdebug_store_sectors)
1832 sector = 0; /* Force wrap */
1835 daddr += scsi_debug_sector_size;
1836 ppage_offset += sizeof(struct sd_dif_tuple);
1839 kunmap_atomic(daddr, KM_IRQ0);
1842 kunmap_atomic(paddr, KM_IRQ1);
1850 kunmap_atomic(daddr, KM_IRQ0);
1851 kunmap_atomic(paddr, KM_IRQ1);
1855 static int resp_write(struct scsi_cmnd *SCpnt, unsigned long long lba,
1856 unsigned int num, struct sdebug_dev_info *devip)
1858 unsigned long iflags;
1861 ret = check_device_access_params(devip, lba, num);
1866 if (scsi_debug_dix && scsi_prot_sg_count(SCpnt)) {
1867 int prot_ret = prot_verify_write(SCpnt, lba, num);
1870 mk_sense_buffer(devip, ILLEGAL_REQUEST, 0x10, prot_ret);
1871 return illegal_condition_result;
1875 write_lock_irqsave(&atomic_rw, iflags);
1876 ret = do_device_access(SCpnt, devip, lba, num, 1);
1877 write_unlock_irqrestore(&atomic_rw, iflags);
1879 return (DID_ERROR << 16);
1880 else if ((ret < (num * scsi_debug_sector_size)) &&
1881 (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
1882 printk(KERN_INFO "scsi_debug: write: cdb indicated=%u, "
1883 " IO sent=%d bytes\n", num * scsi_debug_sector_size, ret);
1887 #define SDEBUG_RLUN_ARR_SZ 256
1889 static int resp_report_luns(struct scsi_cmnd * scp,
1890 struct sdebug_dev_info * devip)
1892 unsigned int alloc_len;
1893 int lun_cnt, i, upper, num, n, wlun, lun;
1894 unsigned char *cmd = (unsigned char *)scp->cmnd;
1895 int select_report = (int)cmd[2];
1896 struct scsi_lun *one_lun;
1897 unsigned char arr[SDEBUG_RLUN_ARR_SZ];
1898 unsigned char * max_addr;
1900 alloc_len = cmd[9] + (cmd[8] << 8) + (cmd[7] << 16) + (cmd[6] << 24);
1901 if ((alloc_len < 4) || (select_report > 2)) {
1902 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1904 return check_condition_result;
1906 /* can produce response with up to 16k luns (lun 0 to lun 16383) */
1907 memset(arr, 0, SDEBUG_RLUN_ARR_SZ);
1908 lun_cnt = scsi_debug_max_luns;
1909 if (1 == select_report)
1911 else if (scsi_debug_no_lun_0 && (lun_cnt > 0))
1913 wlun = (select_report > 0) ? 1 : 0;
1914 num = lun_cnt + wlun;
1915 arr[2] = ((sizeof(struct scsi_lun) * num) >> 8) & 0xff;
1916 arr[3] = (sizeof(struct scsi_lun) * num) & 0xff;
1917 n = min((int)((SDEBUG_RLUN_ARR_SZ - 8) /
1918 sizeof(struct scsi_lun)), num);
1923 one_lun = (struct scsi_lun *) &arr[8];
1924 max_addr = arr + SDEBUG_RLUN_ARR_SZ;
1925 for (i = 0, lun = (scsi_debug_no_lun_0 ? 1 : 0);
1926 ((i < lun_cnt) && ((unsigned char *)(one_lun + i) < max_addr));
1928 upper = (lun >> 8) & 0x3f;
1930 one_lun[i].scsi_lun[0] =
1931 (upper | (SAM2_LUN_ADDRESS_METHOD << 6));
1932 one_lun[i].scsi_lun[1] = lun & 0xff;
1935 one_lun[i].scsi_lun[0] = (SAM2_WLUN_REPORT_LUNS >> 8) & 0xff;
1936 one_lun[i].scsi_lun[1] = SAM2_WLUN_REPORT_LUNS & 0xff;
1939 alloc_len = (unsigned char *)(one_lun + i) - arr;
1940 return fill_from_dev_buffer(scp, arr,
1941 min((int)alloc_len, SDEBUG_RLUN_ARR_SZ));
1944 static int resp_xdwriteread(struct scsi_cmnd *scp, unsigned long long lba,
1945 unsigned int num, struct sdebug_dev_info *devip)
1948 unsigned char *kaddr, *buf;
1949 unsigned int offset;
1950 struct scatterlist *sg;
1951 struct scsi_data_buffer *sdb = scsi_in(scp);
1953 /* better not to use temporary buffer. */
1954 buf = kmalloc(scsi_bufflen(scp), GFP_ATOMIC);
1958 scsi_sg_copy_to_buffer(scp, buf, scsi_bufflen(scp));
1961 for_each_sg(sdb->table.sgl, sg, sdb->table.nents, i) {
1962 kaddr = (unsigned char *)kmap_atomic(sg_page(sg), KM_USER0);
1966 for (j = 0; j < sg->length; j++)
1967 *(kaddr + sg->offset + j) ^= *(buf + offset + j);
1969 offset += sg->length;
1970 kunmap_atomic(kaddr, KM_USER0);
1979 /* When timer goes off this function is called. */
1980 static void timer_intr_handler(unsigned long indx)
1982 struct sdebug_queued_cmd * sqcp;
1983 unsigned long iflags;
1985 if (indx >= SCSI_DEBUG_CANQUEUE) {
1986 printk(KERN_ERR "scsi_debug:timer_intr_handler: indx too "
1990 spin_lock_irqsave(&queued_arr_lock, iflags);
1991 sqcp = &queued_arr[(int)indx];
1992 if (! sqcp->in_use) {
1993 printk(KERN_ERR "scsi_debug:timer_intr_handler: Unexpected "
1995 spin_unlock_irqrestore(&queued_arr_lock, iflags);
1999 if (sqcp->done_funct) {
2000 sqcp->a_cmnd->result = sqcp->scsi_result;
2001 sqcp->done_funct(sqcp->a_cmnd); /* callback to mid level */
2003 sqcp->done_funct = NULL;
2004 spin_unlock_irqrestore(&queued_arr_lock, iflags);
2008 static struct sdebug_dev_info *
2009 sdebug_device_create(struct sdebug_host_info *sdbg_host, gfp_t flags)
2011 struct sdebug_dev_info *devip;
2013 devip = kzalloc(sizeof(*devip), flags);
2015 devip->sdbg_host = sdbg_host;
2016 list_add_tail(&devip->dev_list, &sdbg_host->dev_info_list);
2021 static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev)
2023 struct sdebug_host_info * sdbg_host;
2024 struct sdebug_dev_info * open_devip = NULL;
2025 struct sdebug_dev_info * devip =
2026 (struct sdebug_dev_info *)sdev->hostdata;
2030 sdbg_host = *(struct sdebug_host_info **)shost_priv(sdev->host);
2032 printk(KERN_ERR "Host info NULL\n");
2035 list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) {
2036 if ((devip->used) && (devip->channel == sdev->channel) &&
2037 (devip->target == sdev->id) &&
2038 (devip->lun == sdev->lun))
2041 if ((!devip->used) && (!open_devip))
2045 if (!open_devip) { /* try and make a new one */
2046 open_devip = sdebug_device_create(sdbg_host, GFP_ATOMIC);
2048 printk(KERN_ERR "%s: out of memory at line %d\n",
2049 __func__, __LINE__);
2054 open_devip->channel = sdev->channel;
2055 open_devip->target = sdev->id;
2056 open_devip->lun = sdev->lun;
2057 open_devip->sdbg_host = sdbg_host;
2058 open_devip->reset = 1;
2059 open_devip->used = 1;
2060 memset(open_devip->sense_buff, 0, SDEBUG_SENSE_LEN);
2061 if (scsi_debug_dsense)
2062 open_devip->sense_buff[0] = 0x72;
2064 open_devip->sense_buff[0] = 0x70;
2065 open_devip->sense_buff[7] = 0xa;
2067 if (sdev->lun == SAM2_WLUN_REPORT_LUNS)
2068 open_devip->wlun = SAM2_WLUN_REPORT_LUNS & 0xff;
2073 static int scsi_debug_slave_alloc(struct scsi_device *sdp)
2075 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2076 printk(KERN_INFO "scsi_debug: slave_alloc <%u %u %u %u>\n",
2077 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
2078 queue_flag_set_unlocked(QUEUE_FLAG_BIDI, sdp->request_queue);
2082 static int scsi_debug_slave_configure(struct scsi_device *sdp)
2084 struct sdebug_dev_info *devip;
2086 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2087 printk(KERN_INFO "scsi_debug: slave_configure <%u %u %u %u>\n",
2088 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
2089 if (sdp->host->max_cmd_len != SCSI_DEBUG_MAX_CMD_LEN)
2090 sdp->host->max_cmd_len = SCSI_DEBUG_MAX_CMD_LEN;
2091 devip = devInfoReg(sdp);
2093 return 1; /* no resources, will be marked offline */
2094 sdp->hostdata = devip;
2095 if (sdp->host->cmd_per_lun)
2096 scsi_adjust_queue_depth(sdp, SDEBUG_TAGGED_QUEUING,
2097 sdp->host->cmd_per_lun);
2098 blk_queue_max_segment_size(sdp->request_queue, 256 * 1024);
2102 static void scsi_debug_slave_destroy(struct scsi_device *sdp)
2104 struct sdebug_dev_info *devip =
2105 (struct sdebug_dev_info *)sdp->hostdata;
2107 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2108 printk(KERN_INFO "scsi_debug: slave_destroy <%u %u %u %u>\n",
2109 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
2111 /* make this slot avaliable for re-use */
2113 sdp->hostdata = NULL;
2117 /* Returns 1 if found 'cmnd' and deleted its timer. else returns 0 */
2118 static int stop_queued_cmnd(struct scsi_cmnd *cmnd)
2120 unsigned long iflags;
2122 struct sdebug_queued_cmd *sqcp;
2124 spin_lock_irqsave(&queued_arr_lock, iflags);
2125 for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
2126 sqcp = &queued_arr[k];
2127 if (sqcp->in_use && (cmnd == sqcp->a_cmnd)) {
2128 del_timer_sync(&sqcp->cmnd_timer);
2130 sqcp->a_cmnd = NULL;
2134 spin_unlock_irqrestore(&queued_arr_lock, iflags);
2135 return (k < SCSI_DEBUG_CANQUEUE) ? 1 : 0;
2138 /* Deletes (stops) timers of all queued commands */
2139 static void stop_all_queued(void)
2141 unsigned long iflags;
2143 struct sdebug_queued_cmd *sqcp;
2145 spin_lock_irqsave(&queued_arr_lock, iflags);
2146 for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
2147 sqcp = &queued_arr[k];
2148 if (sqcp->in_use && sqcp->a_cmnd) {
2149 del_timer_sync(&sqcp->cmnd_timer);
2151 sqcp->a_cmnd = NULL;
2154 spin_unlock_irqrestore(&queued_arr_lock, iflags);
2157 static int scsi_debug_abort(struct scsi_cmnd * SCpnt)
2159 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2160 printk(KERN_INFO "scsi_debug: abort\n");
2162 stop_queued_cmnd(SCpnt);
2166 static int scsi_debug_biosparam(struct scsi_device *sdev,
2167 struct block_device * bdev, sector_t capacity, int *info)
2172 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2173 printk(KERN_INFO "scsi_debug: biosparam\n");
2174 buf = scsi_bios_ptable(bdev);
2176 res = scsi_partsize(buf, capacity,
2177 &info[2], &info[0], &info[1]);
2182 info[0] = sdebug_heads;
2183 info[1] = sdebug_sectors_per;
2184 info[2] = sdebug_cylinders_per;
2188 static int scsi_debug_device_reset(struct scsi_cmnd * SCpnt)
2190 struct sdebug_dev_info * devip;
2192 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2193 printk(KERN_INFO "scsi_debug: device_reset\n");
2196 devip = devInfoReg(SCpnt->device);
2203 static int scsi_debug_bus_reset(struct scsi_cmnd * SCpnt)
2205 struct sdebug_host_info *sdbg_host;
2206 struct sdebug_dev_info * dev_info;
2207 struct scsi_device * sdp;
2208 struct Scsi_Host * hp;
2210 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2211 printk(KERN_INFO "scsi_debug: bus_reset\n");
2213 if (SCpnt && ((sdp = SCpnt->device)) && ((hp = sdp->host))) {
2214 sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
2216 list_for_each_entry(dev_info,
2217 &sdbg_host->dev_info_list,
2219 dev_info->reset = 1;
2225 static int scsi_debug_host_reset(struct scsi_cmnd * SCpnt)
2227 struct sdebug_host_info * sdbg_host;
2228 struct sdebug_dev_info * dev_info;
2230 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2231 printk(KERN_INFO "scsi_debug: host_reset\n");
2233 spin_lock(&sdebug_host_list_lock);
2234 list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
2235 list_for_each_entry(dev_info, &sdbg_host->dev_info_list,
2237 dev_info->reset = 1;
2239 spin_unlock(&sdebug_host_list_lock);
2244 /* Initializes timers in queued array */
2245 static void __init init_all_queued(void)
2247 unsigned long iflags;
2249 struct sdebug_queued_cmd * sqcp;
2251 spin_lock_irqsave(&queued_arr_lock, iflags);
2252 for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
2253 sqcp = &queued_arr[k];
2254 init_timer(&sqcp->cmnd_timer);
2256 sqcp->a_cmnd = NULL;
2258 spin_unlock_irqrestore(&queued_arr_lock, iflags);
2261 static void __init sdebug_build_parts(unsigned char *ramp,
2262 unsigned long store_size)
2264 struct partition * pp;
2265 int starts[SDEBUG_MAX_PARTS + 2];
2266 int sectors_per_part, num_sectors, k;
2267 int heads_by_sects, start_sec, end_sec;
2269 /* assume partition table already zeroed */
2270 if ((scsi_debug_num_parts < 1) || (store_size < 1048576))
2272 if (scsi_debug_num_parts > SDEBUG_MAX_PARTS) {
2273 scsi_debug_num_parts = SDEBUG_MAX_PARTS;
2274 printk(KERN_WARNING "scsi_debug:build_parts: reducing "
2275 "partitions to %d\n", SDEBUG_MAX_PARTS);
2277 num_sectors = (int)sdebug_store_sectors;
2278 sectors_per_part = (num_sectors - sdebug_sectors_per)
2279 / scsi_debug_num_parts;
2280 heads_by_sects = sdebug_heads * sdebug_sectors_per;
2281 starts[0] = sdebug_sectors_per;
2282 for (k = 1; k < scsi_debug_num_parts; ++k)
2283 starts[k] = ((k * sectors_per_part) / heads_by_sects)
2285 starts[scsi_debug_num_parts] = num_sectors;
2286 starts[scsi_debug_num_parts + 1] = 0;
2288 ramp[510] = 0x55; /* magic partition markings */
2290 pp = (struct partition *)(ramp + 0x1be);
2291 for (k = 0; starts[k + 1]; ++k, ++pp) {
2292 start_sec = starts[k];
2293 end_sec = starts[k + 1] - 1;
2296 pp->cyl = start_sec / heads_by_sects;
2297 pp->head = (start_sec - (pp->cyl * heads_by_sects))
2298 / sdebug_sectors_per;
2299 pp->sector = (start_sec % sdebug_sectors_per) + 1;
2301 pp->end_cyl = end_sec / heads_by_sects;
2302 pp->end_head = (end_sec - (pp->end_cyl * heads_by_sects))
2303 / sdebug_sectors_per;
2304 pp->end_sector = (end_sec % sdebug_sectors_per) + 1;
2306 pp->start_sect = start_sec;
2307 pp->nr_sects = end_sec - start_sec + 1;
2308 pp->sys_ind = 0x83; /* plain Linux partition */
2312 static int schedule_resp(struct scsi_cmnd * cmnd,
2313 struct sdebug_dev_info * devip,
2314 done_funct_t done, int scsi_result, int delta_jiff)
2316 if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) && cmnd) {
2318 struct scsi_device * sdp = cmnd->device;
2320 printk(KERN_INFO "scsi_debug: <%u %u %u %u> "
2321 "non-zero result=0x%x\n", sdp->host->host_no,
2322 sdp->channel, sdp->id, sdp->lun, scsi_result);
2325 if (cmnd && devip) {
2326 /* simulate autosense by this driver */
2327 if (SAM_STAT_CHECK_CONDITION == (scsi_result & 0xff))
2328 memcpy(cmnd->sense_buffer, devip->sense_buff,
2329 (SCSI_SENSE_BUFFERSIZE > SDEBUG_SENSE_LEN) ?
2330 SDEBUG_SENSE_LEN : SCSI_SENSE_BUFFERSIZE);
2332 if (delta_jiff <= 0) {
2334 cmnd->result = scsi_result;
2339 unsigned long iflags;
2341 struct sdebug_queued_cmd * sqcp = NULL;
2343 spin_lock_irqsave(&queued_arr_lock, iflags);
2344 for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
2345 sqcp = &queued_arr[k];
2349 if (k >= SCSI_DEBUG_CANQUEUE) {
2350 spin_unlock_irqrestore(&queued_arr_lock, iflags);
2351 printk(KERN_WARNING "scsi_debug: can_queue exceeded\n");
2352 return 1; /* report busy to mid level */
2355 sqcp->a_cmnd = cmnd;
2356 sqcp->scsi_result = scsi_result;
2357 sqcp->done_funct = done;
2358 sqcp->cmnd_timer.function = timer_intr_handler;
2359 sqcp->cmnd_timer.data = k;
2360 sqcp->cmnd_timer.expires = jiffies + delta_jiff;
2361 add_timer(&sqcp->cmnd_timer);
2362 spin_unlock_irqrestore(&queued_arr_lock, iflags);
2368 /* Note: The following macros create attribute files in the
2369 /sys/module/scsi_debug/parameters directory. Unfortunately this
2370 driver is unaware of a change and cannot trigger auxiliary actions
2371 as it can when the corresponding attribute in the
2372 /sys/bus/pseudo/drivers/scsi_debug directory is changed.
2374 module_param_named(add_host, scsi_debug_add_host, int, S_IRUGO | S_IWUSR);
2375 module_param_named(delay, scsi_debug_delay, int, S_IRUGO | S_IWUSR);
2376 module_param_named(dev_size_mb, scsi_debug_dev_size_mb, int, S_IRUGO);
2377 module_param_named(dsense, scsi_debug_dsense, int, S_IRUGO | S_IWUSR);
2378 module_param_named(every_nth, scsi_debug_every_nth, int, S_IRUGO | S_IWUSR);
2379 module_param_named(fake_rw, scsi_debug_fake_rw, int, S_IRUGO | S_IWUSR);
2380 module_param_named(max_luns, scsi_debug_max_luns, int, S_IRUGO | S_IWUSR);
2381 module_param_named(no_lun_0, scsi_debug_no_lun_0, int, S_IRUGO | S_IWUSR);
2382 module_param_named(num_parts, scsi_debug_num_parts, int, S_IRUGO);
2383 module_param_named(num_tgts, scsi_debug_num_tgts, int, S_IRUGO | S_IWUSR);
2384 module_param_named(opts, scsi_debug_opts, int, S_IRUGO | S_IWUSR);
2385 module_param_named(ptype, scsi_debug_ptype, int, S_IRUGO | S_IWUSR);
2386 module_param_named(scsi_level, scsi_debug_scsi_level, int, S_IRUGO);
2387 module_param_named(virtual_gb, scsi_debug_virtual_gb, int, S_IRUGO | S_IWUSR);
2388 module_param_named(vpd_use_hostno, scsi_debug_vpd_use_hostno, int,
2390 module_param_named(sector_size, scsi_debug_sector_size, int, S_IRUGO);
2391 module_param_named(dix, scsi_debug_dix, int, S_IRUGO);
2392 module_param_named(dif, scsi_debug_dif, int, S_IRUGO);
2393 module_param_named(guard, scsi_debug_guard, int, S_IRUGO);
2394 module_param_named(ato, scsi_debug_ato, int, S_IRUGO);
2395 module_param_named(physblk_exp, scsi_debug_physblk_exp, int, S_IRUGO);
2396 module_param_named(lowest_aligned, scsi_debug_lowest_aligned, int, S_IRUGO);
2398 MODULE_AUTHOR("Eric Youngdale + Douglas Gilbert");
2399 MODULE_DESCRIPTION("SCSI debug adapter driver");
2400 MODULE_LICENSE("GPL");
2401 MODULE_VERSION(SCSI_DEBUG_VERSION);
2403 MODULE_PARM_DESC(add_host, "0..127 hosts allowed(def=1)");
2404 MODULE_PARM_DESC(delay, "# of jiffies to delay response(def=1)");
2405 MODULE_PARM_DESC(dev_size_mb, "size in MB of ram shared by devs(def=8)");
2406 MODULE_PARM_DESC(dsense, "use descriptor sense format(def=0 -> fixed)");
2407 MODULE_PARM_DESC(every_nth, "timeout every nth command(def=0)");
2408 MODULE_PARM_DESC(fake_rw, "fake reads/writes instead of copying (def=0)");
2409 MODULE_PARM_DESC(max_luns, "number of LUNs per target to simulate(def=1)");
2410 MODULE_PARM_DESC(no_lun_0, "no LU number 0 (def=0 -> have lun 0)");
2411 MODULE_PARM_DESC(num_parts, "number of partitions(def=0)");
2412 MODULE_PARM_DESC(num_tgts, "number of targets per host to simulate(def=1)");
2413 MODULE_PARM_DESC(opts, "1->noise, 2->medium_err, 4->timeout, 8->recovered_err... (def=0)");
2414 MODULE_PARM_DESC(ptype, "SCSI peripheral type(def=0[disk])");
2415 MODULE_PARM_DESC(scsi_level, "SCSI level to simulate(def=5[SPC-3])");
2416 MODULE_PARM_DESC(virtual_gb, "virtual gigabyte size (def=0 -> use dev_size_mb)");
2417 MODULE_PARM_DESC(vpd_use_hostno, "0 -> dev ids ignore hostno (def=1 -> unique dev ids)");
2418 MODULE_PARM_DESC(sector_size, "logical block size in bytes (def=512)");
2419 MODULE_PARM_DESC(physblk_exp, "physical block exponent (def=0)");
2420 MODULE_PARM_DESC(lowest_aligned, "lowest aligned lba (def=0)");
2421 MODULE_PARM_DESC(dix, "data integrity extensions mask (def=0)");
2422 MODULE_PARM_DESC(dif, "data integrity field type: 0-3 (def=0)");
2423 MODULE_PARM_DESC(guard, "protection checksum: 0=crc, 1=ip (def=0)");
2424 MODULE_PARM_DESC(ato, "application tag ownership: 0=disk 1=host (def=1)");
2426 static char sdebug_info[256];
2428 static const char * scsi_debug_info(struct Scsi_Host * shp)
2430 sprintf(sdebug_info, "scsi_debug, version %s [%s], "
2431 "dev_size_mb=%d, opts=0x%x", SCSI_DEBUG_VERSION,
2432 scsi_debug_version_date, scsi_debug_dev_size_mb,
2437 /* scsi_debug_proc_info
2438 * Used if the driver currently has no own support for /proc/scsi
2440 static int scsi_debug_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset,
2441 int length, int inout)
2443 int len, pos, begin;
2446 orig_length = length;
2450 int minLen = length > 15 ? 15 : length;
2452 if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
2454 memcpy(arr, buffer, minLen);
2456 if (1 != sscanf(arr, "%d", &pos))
2458 scsi_debug_opts = pos;
2459 if (scsi_debug_every_nth != 0)
2460 scsi_debug_cmnd_count = 0;
2464 pos = len = sprintf(buffer, "scsi_debug adapter driver, version "
2466 "num_tgts=%d, shared (ram) size=%d MB, opts=0x%x, "
2467 "every_nth=%d(curr:%d)\n"
2468 "delay=%d, max_luns=%d, scsi_level=%d\n"
2469 "sector_size=%d bytes, cylinders=%d, heads=%d, sectors=%d\n"
2470 "number of aborts=%d, device_reset=%d, bus_resets=%d, "
2471 "host_resets=%d\ndix_reads=%d dix_writes=%d dif_errors=%d\n",
2472 SCSI_DEBUG_VERSION, scsi_debug_version_date, scsi_debug_num_tgts,
2473 scsi_debug_dev_size_mb, scsi_debug_opts, scsi_debug_every_nth,
2474 scsi_debug_cmnd_count, scsi_debug_delay,
2475 scsi_debug_max_luns, scsi_debug_scsi_level,
2476 scsi_debug_sector_size, sdebug_cylinders_per, sdebug_heads,
2477 sdebug_sectors_per, num_aborts, num_dev_resets, num_bus_resets,
2478 num_host_resets, dix_reads, dix_writes, dif_errors);
2483 *start = buffer + (offset - begin); /* Start of wanted data */
2484 len -= (offset - begin);
2490 static ssize_t sdebug_delay_show(struct device_driver * ddp, char * buf)
2492 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_delay);
2495 static ssize_t sdebug_delay_store(struct device_driver * ddp,
2496 const char * buf, size_t count)
2501 if (1 == sscanf(buf, "%10s", work)) {
2502 if ((1 == sscanf(work, "%d", &delay)) && (delay >= 0)) {
2503 scsi_debug_delay = delay;
2509 DRIVER_ATTR(delay, S_IRUGO | S_IWUSR, sdebug_delay_show,
2510 sdebug_delay_store);
2512 static ssize_t sdebug_opts_show(struct device_driver * ddp, char * buf)
2514 return scnprintf(buf, PAGE_SIZE, "0x%x\n", scsi_debug_opts);
2517 static ssize_t sdebug_opts_store(struct device_driver * ddp,
2518 const char * buf, size_t count)
2523 if (1 == sscanf(buf, "%10s", work)) {
2524 if (0 == strnicmp(work,"0x", 2)) {
2525 if (1 == sscanf(&work[2], "%x", &opts))
2528 if (1 == sscanf(work, "%d", &opts))
2534 scsi_debug_opts = opts;
2535 scsi_debug_cmnd_count = 0;
2538 DRIVER_ATTR(opts, S_IRUGO | S_IWUSR, sdebug_opts_show,
2541 static ssize_t sdebug_ptype_show(struct device_driver * ddp, char * buf)
2543 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_ptype);
2545 static ssize_t sdebug_ptype_store(struct device_driver * ddp,
2546 const char * buf, size_t count)
2550 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2551 scsi_debug_ptype = n;
2556 DRIVER_ATTR(ptype, S_IRUGO | S_IWUSR, sdebug_ptype_show, sdebug_ptype_store);
2558 static ssize_t sdebug_dsense_show(struct device_driver * ddp, char * buf)
2560 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dsense);
2562 static ssize_t sdebug_dsense_store(struct device_driver * ddp,
2563 const char * buf, size_t count)
2567 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2568 scsi_debug_dsense = n;
2573 DRIVER_ATTR(dsense, S_IRUGO | S_IWUSR, sdebug_dsense_show,
2574 sdebug_dsense_store);
2576 static ssize_t sdebug_fake_rw_show(struct device_driver * ddp, char * buf)
2578 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_fake_rw);
2580 static ssize_t sdebug_fake_rw_store(struct device_driver * ddp,
2581 const char * buf, size_t count)
2585 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2586 scsi_debug_fake_rw = n;
2591 DRIVER_ATTR(fake_rw, S_IRUGO | S_IWUSR, sdebug_fake_rw_show,
2592 sdebug_fake_rw_store);
2594 static ssize_t sdebug_no_lun_0_show(struct device_driver * ddp, char * buf)
2596 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_no_lun_0);
2598 static ssize_t sdebug_no_lun_0_store(struct device_driver * ddp,
2599 const char * buf, size_t count)
2603 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2604 scsi_debug_no_lun_0 = n;
2609 DRIVER_ATTR(no_lun_0, S_IRUGO | S_IWUSR, sdebug_no_lun_0_show,
2610 sdebug_no_lun_0_store);
2612 static ssize_t sdebug_num_tgts_show(struct device_driver * ddp, char * buf)
2614 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_num_tgts);
2616 static ssize_t sdebug_num_tgts_store(struct device_driver * ddp,
2617 const char * buf, size_t count)
2621 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2622 scsi_debug_num_tgts = n;
2623 sdebug_max_tgts_luns();
2628 DRIVER_ATTR(num_tgts, S_IRUGO | S_IWUSR, sdebug_num_tgts_show,
2629 sdebug_num_tgts_store);
2631 static ssize_t sdebug_dev_size_mb_show(struct device_driver * ddp, char * buf)
2633 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dev_size_mb);
2635 DRIVER_ATTR(dev_size_mb, S_IRUGO, sdebug_dev_size_mb_show, NULL);
2637 static ssize_t sdebug_num_parts_show(struct device_driver * ddp, char * buf)
2639 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_num_parts);
2641 DRIVER_ATTR(num_parts, S_IRUGO, sdebug_num_parts_show, NULL);
2643 static ssize_t sdebug_every_nth_show(struct device_driver * ddp, char * buf)
2645 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_every_nth);
2647 static ssize_t sdebug_every_nth_store(struct device_driver * ddp,
2648 const char * buf, size_t count)
2652 if ((count > 0) && (1 == sscanf(buf, "%d", &nth))) {
2653 scsi_debug_every_nth = nth;
2654 scsi_debug_cmnd_count = 0;
2659 DRIVER_ATTR(every_nth, S_IRUGO | S_IWUSR, sdebug_every_nth_show,
2660 sdebug_every_nth_store);
2662 static ssize_t sdebug_max_luns_show(struct device_driver * ddp, char * buf)
2664 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_max_luns);
2666 static ssize_t sdebug_max_luns_store(struct device_driver * ddp,
2667 const char * buf, size_t count)
2671 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2672 scsi_debug_max_luns = n;
2673 sdebug_max_tgts_luns();
2678 DRIVER_ATTR(max_luns, S_IRUGO | S_IWUSR, sdebug_max_luns_show,
2679 sdebug_max_luns_store);
2681 static ssize_t sdebug_scsi_level_show(struct device_driver * ddp, char * buf)
2683 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_scsi_level);
2685 DRIVER_ATTR(scsi_level, S_IRUGO, sdebug_scsi_level_show, NULL);
2687 static ssize_t sdebug_virtual_gb_show(struct device_driver * ddp, char * buf)
2689 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_virtual_gb);
2691 static ssize_t sdebug_virtual_gb_store(struct device_driver * ddp,
2692 const char * buf, size_t count)
2696 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2697 scsi_debug_virtual_gb = n;
2699 sdebug_capacity = get_sdebug_capacity();
2705 DRIVER_ATTR(virtual_gb, S_IRUGO | S_IWUSR, sdebug_virtual_gb_show,
2706 sdebug_virtual_gb_store);
2708 static ssize_t sdebug_add_host_show(struct device_driver * ddp, char * buf)
2710 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_add_host);
2713 static ssize_t sdebug_add_host_store(struct device_driver * ddp,
2714 const char * buf, size_t count)
2718 if (sscanf(buf, "%d", &delta_hosts) != 1)
2720 if (delta_hosts > 0) {
2722 sdebug_add_adapter();
2723 } while (--delta_hosts);
2724 } else if (delta_hosts < 0) {
2726 sdebug_remove_adapter();
2727 } while (++delta_hosts);
2731 DRIVER_ATTR(add_host, S_IRUGO | S_IWUSR, sdebug_add_host_show,
2732 sdebug_add_host_store);
2734 static ssize_t sdebug_vpd_use_hostno_show(struct device_driver * ddp,
2737 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_vpd_use_hostno);
2739 static ssize_t sdebug_vpd_use_hostno_store(struct device_driver * ddp,
2740 const char * buf, size_t count)
2744 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2745 scsi_debug_vpd_use_hostno = n;
2750 DRIVER_ATTR(vpd_use_hostno, S_IRUGO | S_IWUSR, sdebug_vpd_use_hostno_show,
2751 sdebug_vpd_use_hostno_store);
2753 static ssize_t sdebug_sector_size_show(struct device_driver * ddp, char * buf)
2755 return scnprintf(buf, PAGE_SIZE, "%u\n", scsi_debug_sector_size);
2757 DRIVER_ATTR(sector_size, S_IRUGO, sdebug_sector_size_show, NULL);
2759 static ssize_t sdebug_dix_show(struct device_driver *ddp, char *buf)
2761 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dix);
2763 DRIVER_ATTR(dix, S_IRUGO, sdebug_dix_show, NULL);
2765 static ssize_t sdebug_dif_show(struct device_driver *ddp, char *buf)
2767 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dif);
2769 DRIVER_ATTR(dif, S_IRUGO, sdebug_dif_show, NULL);
2771 static ssize_t sdebug_guard_show(struct device_driver *ddp, char *buf)
2773 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_guard);
2775 DRIVER_ATTR(guard, S_IRUGO, sdebug_guard_show, NULL);
2777 static ssize_t sdebug_ato_show(struct device_driver *ddp, char *buf)
2779 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_ato);
2781 DRIVER_ATTR(ato, S_IRUGO, sdebug_ato_show, NULL);
2784 /* Note: The following function creates attribute files in the
2785 /sys/bus/pseudo/drivers/scsi_debug directory. The advantage of these
2786 files (over those found in the /sys/module/scsi_debug/parameters
2787 directory) is that auxiliary actions can be triggered when an attribute
2788 is changed. For example see: sdebug_add_host_store() above.
2790 static int do_create_driverfs_files(void)
2794 ret = driver_create_file(&sdebug_driverfs_driver, &driver_attr_add_host);
2795 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_delay);
2796 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dev_size_mb);
2797 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dsense);
2798 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_every_nth);
2799 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_fake_rw);
2800 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_max_luns);
2801 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_no_lun_0);
2802 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_num_parts);
2803 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_num_tgts);
2804 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_ptype);
2805 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_opts);
2806 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_scsi_level);
2807 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_virtual_gb);
2808 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_vpd_use_hostno);
2809 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_sector_size);
2810 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dix);
2811 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dif);
2812 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_guard);
2813 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_ato);
2817 static void do_remove_driverfs_files(void)
2819 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_ato);
2820 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_guard);
2821 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dif);
2822 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dix);
2823 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_sector_size);
2824 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_vpd_use_hostno);
2825 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_virtual_gb);
2826 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_scsi_level);
2827 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_opts);
2828 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_ptype);
2829 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_num_tgts);
2830 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_num_parts);
2831 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_no_lun_0);
2832 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_max_luns);
2833 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_fake_rw);
2834 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_every_nth);
2835 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dsense);
2836 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dev_size_mb);
2837 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_delay);
2838 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_add_host);
2841 static void pseudo_0_release(struct device *dev)
2843 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2844 printk(KERN_INFO "scsi_debug: pseudo_0_release() called\n");
2847 static struct device pseudo_primary = {
2848 .init_name = "pseudo_0",
2849 .release = pseudo_0_release,
2852 static int __init scsi_debug_init(void)
2859 switch (scsi_debug_sector_size) {
2866 printk(KERN_ERR "scsi_debug_init: invalid sector_size %d\n",
2867 scsi_debug_sector_size);
2871 switch (scsi_debug_dif) {
2873 case SD_DIF_TYPE0_PROTECTION:
2874 case SD_DIF_TYPE1_PROTECTION:
2875 case SD_DIF_TYPE3_PROTECTION:
2879 printk(KERN_ERR "scsi_debug_init: dif must be 0, 1 or 3\n");
2883 if (scsi_debug_guard > 1) {
2884 printk(KERN_ERR "scsi_debug_init: guard must be 0 or 1\n");
2888 if (scsi_debug_ato > 1) {
2889 printk(KERN_ERR "scsi_debug_init: ato must be 0 or 1\n");
2893 if (scsi_debug_physblk_exp > 15) {
2894 printk(KERN_ERR "scsi_debug_init: invalid physblk_exp %u\n",
2895 scsi_debug_physblk_exp);
2899 if (scsi_debug_lowest_aligned > 0x3fff) {
2900 printk(KERN_ERR "scsi_debug_init: lowest_aligned too big: %u\n",
2901 scsi_debug_lowest_aligned);
2905 if (scsi_debug_dev_size_mb < 1)
2906 scsi_debug_dev_size_mb = 1; /* force minimum 1 MB ramdisk */
2907 sz = (unsigned long)scsi_debug_dev_size_mb * 1048576;
2908 sdebug_store_sectors = sz / scsi_debug_sector_size;
2909 sdebug_capacity = get_sdebug_capacity();
2911 /* play around with geometry, don't waste too much on track 0 */
2913 sdebug_sectors_per = 32;
2914 if (scsi_debug_dev_size_mb >= 16)
2916 else if (scsi_debug_dev_size_mb >= 256)
2918 sdebug_cylinders_per = (unsigned long)sdebug_capacity /
2919 (sdebug_sectors_per * sdebug_heads);
2920 if (sdebug_cylinders_per >= 1024) {
2921 /* other LLDs do this; implies >= 1GB ram disk ... */
2923 sdebug_sectors_per = 63;
2924 sdebug_cylinders_per = (unsigned long)sdebug_capacity /
2925 (sdebug_sectors_per * sdebug_heads);
2928 fake_storep = vmalloc(sz);
2929 if (NULL == fake_storep) {
2930 printk(KERN_ERR "scsi_debug_init: out of memory, 1\n");
2933 memset(fake_storep, 0, sz);
2934 if (scsi_debug_num_parts > 0)
2935 sdebug_build_parts(fake_storep, sz);
2937 if (scsi_debug_dif) {
2940 dif_size = sdebug_store_sectors * sizeof(struct sd_dif_tuple);
2941 dif_storep = vmalloc(dif_size);
2943 printk(KERN_ERR "scsi_debug_init: dif_storep %u bytes @ %p\n",
2944 dif_size, dif_storep);
2946 if (dif_storep == NULL) {
2947 printk(KERN_ERR "scsi_debug_init: out of mem. (DIX)\n");
2952 memset(dif_storep, 0xff, dif_size);
2955 ret = device_register(&pseudo_primary);
2957 printk(KERN_WARNING "scsi_debug: device_register error: %d\n",
2961 ret = bus_register(&pseudo_lld_bus);
2963 printk(KERN_WARNING "scsi_debug: bus_register error: %d\n",
2967 ret = driver_register(&sdebug_driverfs_driver);
2969 printk(KERN_WARNING "scsi_debug: driver_register error: %d\n",
2973 ret = do_create_driverfs_files();
2975 printk(KERN_WARNING "scsi_debug: driver_create_file error: %d\n",
2982 host_to_add = scsi_debug_add_host;
2983 scsi_debug_add_host = 0;
2985 for (k = 0; k < host_to_add; k++) {
2986 if (sdebug_add_adapter()) {
2987 printk(KERN_ERR "scsi_debug_init: "
2988 "sdebug_add_adapter failed k=%d\n", k);
2993 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
2994 printk(KERN_INFO "scsi_debug_init: built %d host(s)\n",
2995 scsi_debug_add_host);
3000 do_remove_driverfs_files();
3001 driver_unregister(&sdebug_driverfs_driver);
3003 bus_unregister(&pseudo_lld_bus);
3005 device_unregister(&pseudo_primary);
3014 static void __exit scsi_debug_exit(void)
3016 int k = scsi_debug_add_host;
3020 sdebug_remove_adapter();
3021 do_remove_driverfs_files();
3022 driver_unregister(&sdebug_driverfs_driver);
3023 bus_unregister(&pseudo_lld_bus);
3024 device_unregister(&pseudo_primary);
3032 device_initcall(scsi_debug_init);
3033 module_exit(scsi_debug_exit);
3035 static void sdebug_release_adapter(struct device * dev)
3037 struct sdebug_host_info *sdbg_host;
3039 sdbg_host = to_sdebug_host(dev);
3043 static int sdebug_add_adapter(void)
3045 int k, devs_per_host;
3047 struct sdebug_host_info *sdbg_host;
3048 struct sdebug_dev_info *sdbg_devinfo, *tmp;
3050 sdbg_host = kzalloc(sizeof(*sdbg_host),GFP_KERNEL);
3051 if (NULL == sdbg_host) {
3052 printk(KERN_ERR "%s: out of memory at line %d\n",
3053 __func__, __LINE__);
3057 INIT_LIST_HEAD(&sdbg_host->dev_info_list);
3059 devs_per_host = scsi_debug_num_tgts * scsi_debug_max_luns;
3060 for (k = 0; k < devs_per_host; k++) {
3061 sdbg_devinfo = sdebug_device_create(sdbg_host, GFP_KERNEL);
3062 if (!sdbg_devinfo) {
3063 printk(KERN_ERR "%s: out of memory at line %d\n",
3064 __func__, __LINE__);
3070 spin_lock(&sdebug_host_list_lock);
3071 list_add_tail(&sdbg_host->host_list, &sdebug_host_list);
3072 spin_unlock(&sdebug_host_list_lock);
3074 sdbg_host->dev.bus = &pseudo_lld_bus;
3075 sdbg_host->dev.parent = &pseudo_primary;
3076 sdbg_host->dev.release = &sdebug_release_adapter;
3077 dev_set_name(&sdbg_host->dev, "adapter%d", scsi_debug_add_host);
3079 error = device_register(&sdbg_host->dev);
3084 ++scsi_debug_add_host;
3088 list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
3090 list_del(&sdbg_devinfo->dev_list);
3091 kfree(sdbg_devinfo);
3098 static void sdebug_remove_adapter(void)
3100 struct sdebug_host_info * sdbg_host = NULL;
3102 spin_lock(&sdebug_host_list_lock);
3103 if (!list_empty(&sdebug_host_list)) {
3104 sdbg_host = list_entry(sdebug_host_list.prev,
3105 struct sdebug_host_info, host_list);
3106 list_del(&sdbg_host->host_list);
3108 spin_unlock(&sdebug_host_list_lock);
3113 device_unregister(&sdbg_host->dev);
3114 --scsi_debug_add_host;
3118 int scsi_debug_queuecommand(struct scsi_cmnd *SCpnt, done_funct_t done)
3120 unsigned char *cmd = (unsigned char *) SCpnt->cmnd;
3123 unsigned long long lba;
3125 int target = SCpnt->device->id;
3126 struct sdebug_dev_info *devip = NULL;
3127 int inj_recovered = 0;
3128 int inj_transport = 0;
3131 int delay_override = 0;
3133 scsi_set_resid(SCpnt, 0);
3134 if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) && cmd) {
3135 printk(KERN_INFO "scsi_debug: cmd ");
3136 for (k = 0, len = SCpnt->cmd_len; k < len; ++k)
3137 printk("%02x ", (int)cmd[k]);
3141 if (target == SCpnt->device->host->hostt->this_id) {
3142 printk(KERN_INFO "scsi_debug: initiator's id used as "
3144 return schedule_resp(SCpnt, NULL, done,
3145 DID_NO_CONNECT << 16, 0);
3148 if ((SCpnt->device->lun >= scsi_debug_max_luns) &&
3149 (SCpnt->device->lun != SAM2_WLUN_REPORT_LUNS))
3150 return schedule_resp(SCpnt, NULL, done,
3151 DID_NO_CONNECT << 16, 0);
3152 devip = devInfoReg(SCpnt->device);
3154 return schedule_resp(SCpnt, NULL, done,
3155 DID_NO_CONNECT << 16, 0);
3157 if ((scsi_debug_every_nth != 0) &&
3158 (++scsi_debug_cmnd_count >= abs(scsi_debug_every_nth))) {
3159 scsi_debug_cmnd_count = 0;
3160 if (scsi_debug_every_nth < -1)
3161 scsi_debug_every_nth = -1;
3162 if (SCSI_DEBUG_OPT_TIMEOUT & scsi_debug_opts)
3163 return 0; /* ignore command causing timeout */
3164 else if (SCSI_DEBUG_OPT_RECOVERED_ERR & scsi_debug_opts)
3165 inj_recovered = 1; /* to reads and writes below */
3166 else if (SCSI_DEBUG_OPT_TRANSPORT_ERR & scsi_debug_opts)
3167 inj_transport = 1; /* to reads and writes below */
3168 else if (SCSI_DEBUG_OPT_DIF_ERR & scsi_debug_opts)
3169 inj_dif = 1; /* to reads and writes below */
3170 else if (SCSI_DEBUG_OPT_DIX_ERR & scsi_debug_opts)
3171 inj_dix = 1; /* to reads and writes below */
3178 case TEST_UNIT_READY:
3180 break; /* only allowable wlun commands */
3182 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
3183 printk(KERN_INFO "scsi_debug: Opcode: 0x%x "
3184 "not supported for wlun\n", *cmd);
3185 mk_sense_buffer(devip, ILLEGAL_REQUEST,
3187 errsts = check_condition_result;
3188 return schedule_resp(SCpnt, devip, done, errsts,
3194 case INQUIRY: /* mandatory, ignore unit attention */
3196 errsts = resp_inquiry(SCpnt, target, devip);
3198 case REQUEST_SENSE: /* mandatory, ignore unit attention */
3200 errsts = resp_requests(SCpnt, devip);
3202 case REZERO_UNIT: /* actually this is REWIND for SSC */
3204 errsts = resp_start_stop(SCpnt, devip);
3206 case ALLOW_MEDIUM_REMOVAL:
3207 errsts = check_readiness(SCpnt, 1, devip);
3210 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
3211 printk(KERN_INFO "scsi_debug: Medium removal %s\n",
3212 cmd[4] ? "inhibited" : "enabled");
3214 case SEND_DIAGNOSTIC: /* mandatory */
3215 errsts = check_readiness(SCpnt, 1, devip);
3217 case TEST_UNIT_READY: /* mandatory */
3219 errsts = check_readiness(SCpnt, 0, devip);
3222 errsts = check_readiness(SCpnt, 1, devip);
3225 errsts = check_readiness(SCpnt, 1, devip);
3228 errsts = check_readiness(SCpnt, 1, devip);
3231 errsts = check_readiness(SCpnt, 1, devip);
3234 errsts = resp_readcap(SCpnt, devip);
3236 case SERVICE_ACTION_IN:
3237 if (SAI_READ_CAPACITY_16 != cmd[1]) {
3238 mk_sense_buffer(devip, ILLEGAL_REQUEST,
3240 errsts = check_condition_result;
3243 errsts = resp_readcap16(SCpnt, devip);
3245 case MAINTENANCE_IN:
3246 if (MI_REPORT_TARGET_PGS != cmd[1]) {
3247 mk_sense_buffer(devip, ILLEGAL_REQUEST,
3249 errsts = check_condition_result;
3252 errsts = resp_report_tgtpgs(SCpnt, devip);
3258 errsts = check_readiness(SCpnt, 0, devip);
3261 if (scsi_debug_fake_rw)
3263 get_data_transfer_info(cmd, &lba, &num);
3264 errsts = resp_read(SCpnt, lba, num, devip);
3265 if (inj_recovered && (0 == errsts)) {
3266 mk_sense_buffer(devip, RECOVERED_ERROR,
3267 THRESHOLD_EXCEEDED, 0);
3268 errsts = check_condition_result;
3269 } else if (inj_transport && (0 == errsts)) {
3270 mk_sense_buffer(devip, ABORTED_COMMAND,
3271 TRANSPORT_PROBLEM, ACK_NAK_TO);
3272 errsts = check_condition_result;
3273 } else if (inj_dif && (0 == errsts)) {
3274 mk_sense_buffer(devip, ABORTED_COMMAND, 0x10, 1);
3275 errsts = illegal_condition_result;
3276 } else if (inj_dix && (0 == errsts)) {
3277 mk_sense_buffer(devip, ILLEGAL_REQUEST, 0x10, 1);
3278 errsts = illegal_condition_result;
3281 case REPORT_LUNS: /* mandatory, ignore unit attention */
3283 errsts = resp_report_luns(SCpnt, devip);
3285 case VERIFY: /* 10 byte SBC-2 command */
3286 errsts = check_readiness(SCpnt, 0, devip);
3292 errsts = check_readiness(SCpnt, 0, devip);
3295 if (scsi_debug_fake_rw)
3297 get_data_transfer_info(cmd, &lba, &num);
3298 errsts = resp_write(SCpnt, lba, num, devip);
3299 if (inj_recovered && (0 == errsts)) {
3300 mk_sense_buffer(devip, RECOVERED_ERROR,
3301 THRESHOLD_EXCEEDED, 0);
3302 errsts = check_condition_result;
3303 } else if (inj_dif && (0 == errsts)) {
3304 mk_sense_buffer(devip, ABORTED_COMMAND, 0x10, 1);
3305 errsts = illegal_condition_result;
3306 } else if (inj_dix && (0 == errsts)) {
3307 mk_sense_buffer(devip, ILLEGAL_REQUEST, 0x10, 1);
3308 errsts = illegal_condition_result;
3313 errsts = resp_mode_sense(SCpnt, target, devip);
3316 errsts = resp_mode_select(SCpnt, 1, devip);
3318 case MODE_SELECT_10:
3319 errsts = resp_mode_select(SCpnt, 0, devip);
3322 errsts = resp_log_sense(SCpnt, devip);
3324 case SYNCHRONIZE_CACHE:
3326 errsts = check_readiness(SCpnt, 0, devip);
3329 errsts = check_readiness(SCpnt, 1, devip);
3331 case XDWRITEREAD_10:
3332 if (!scsi_bidi_cmnd(SCpnt)) {
3333 mk_sense_buffer(devip, ILLEGAL_REQUEST,
3334 INVALID_FIELD_IN_CDB, 0);
3335 errsts = check_condition_result;
3339 errsts = check_readiness(SCpnt, 0, devip);
3342 if (scsi_debug_fake_rw)
3344 get_data_transfer_info(cmd, &lba, &num);
3345 errsts = resp_read(SCpnt, lba, num, devip);
3348 errsts = resp_write(SCpnt, lba, num, devip);
3351 errsts = resp_xdwriteread(SCpnt, lba, num, devip);
3354 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
3355 printk(KERN_INFO "scsi_debug: Opcode: 0x%x not "
3356 "supported\n", *cmd);
3357 errsts = check_readiness(SCpnt, 1, devip);
3359 break; /* Unit attention takes precedence */
3360 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_OPCODE, 0);
3361 errsts = check_condition_result;
3364 return schedule_resp(SCpnt, devip, done, errsts,
3365 (delay_override ? 0 : scsi_debug_delay));
3368 static struct scsi_host_template sdebug_driver_template = {
3369 .proc_info = scsi_debug_proc_info,
3370 .proc_name = sdebug_proc_name,
3371 .name = "SCSI DEBUG",
3372 .info = scsi_debug_info,
3373 .slave_alloc = scsi_debug_slave_alloc,
3374 .slave_configure = scsi_debug_slave_configure,
3375 .slave_destroy = scsi_debug_slave_destroy,
3376 .ioctl = scsi_debug_ioctl,
3377 .queuecommand = scsi_debug_queuecommand,
3378 .eh_abort_handler = scsi_debug_abort,
3379 .eh_bus_reset_handler = scsi_debug_bus_reset,
3380 .eh_device_reset_handler = scsi_debug_device_reset,
3381 .eh_host_reset_handler = scsi_debug_host_reset,
3382 .bios_param = scsi_debug_biosparam,
3383 .can_queue = SCSI_DEBUG_CANQUEUE,
3385 .sg_tablesize = 256,
3387 .max_sectors = 0xffff,
3388 .use_clustering = DISABLE_CLUSTERING,
3389 .module = THIS_MODULE,
3392 static int sdebug_driver_probe(struct device * dev)
3395 struct sdebug_host_info *sdbg_host;
3396 struct Scsi_Host *hpnt;
3399 sdbg_host = to_sdebug_host(dev);
3401 hpnt = scsi_host_alloc(&sdebug_driver_template, sizeof(sdbg_host));
3403 printk(KERN_ERR "%s: scsi_register failed\n", __func__);
3408 sdbg_host->shost = hpnt;
3409 *((struct sdebug_host_info **)hpnt->hostdata) = sdbg_host;
3410 if ((hpnt->this_id >= 0) && (scsi_debug_num_tgts > hpnt->this_id))
3411 hpnt->max_id = scsi_debug_num_tgts + 1;
3413 hpnt->max_id = scsi_debug_num_tgts;
3414 hpnt->max_lun = SAM2_WLUN_REPORT_LUNS; /* = scsi_debug_max_luns; */
3418 switch (scsi_debug_dif) {
3420 case SD_DIF_TYPE1_PROTECTION:
3421 host_prot = SHOST_DIF_TYPE1_PROTECTION;
3423 host_prot |= SHOST_DIX_TYPE1_PROTECTION;
3426 case SD_DIF_TYPE2_PROTECTION:
3427 host_prot = SHOST_DIF_TYPE2_PROTECTION;
3429 host_prot |= SHOST_DIX_TYPE2_PROTECTION;
3432 case SD_DIF_TYPE3_PROTECTION:
3433 host_prot = SHOST_DIF_TYPE3_PROTECTION;
3435 host_prot |= SHOST_DIX_TYPE3_PROTECTION;
3440 host_prot |= SHOST_DIX_TYPE0_PROTECTION;
3444 scsi_host_set_prot(hpnt, host_prot);
3446 printk(KERN_INFO "scsi_debug: host protection%s%s%s%s%s%s%s\n",
3447 (host_prot & SHOST_DIF_TYPE1_PROTECTION) ? " DIF1" : "",
3448 (host_prot & SHOST_DIF_TYPE2_PROTECTION) ? " DIF2" : "",
3449 (host_prot & SHOST_DIF_TYPE3_PROTECTION) ? " DIF3" : "",
3450 (host_prot & SHOST_DIX_TYPE0_PROTECTION) ? " DIX0" : "",
3451 (host_prot & SHOST_DIX_TYPE1_PROTECTION) ? " DIX1" : "",
3452 (host_prot & SHOST_DIX_TYPE2_PROTECTION) ? " DIX2" : "",
3453 (host_prot & SHOST_DIX_TYPE3_PROTECTION) ? " DIX3" : "");
3455 if (scsi_debug_guard == 1)
3456 scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_IP);
3458 scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_CRC);
3460 error = scsi_add_host(hpnt, &sdbg_host->dev);
3462 printk(KERN_ERR "%s: scsi_add_host failed\n", __func__);
3464 scsi_host_put(hpnt);
3466 scsi_scan_host(hpnt);
3472 static int sdebug_driver_remove(struct device * dev)
3474 struct sdebug_host_info *sdbg_host;
3475 struct sdebug_dev_info *sdbg_devinfo, *tmp;
3477 sdbg_host = to_sdebug_host(dev);
3480 printk(KERN_ERR "%s: Unable to locate host info\n",
3485 scsi_remove_host(sdbg_host->shost);
3487 list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
3489 list_del(&sdbg_devinfo->dev_list);
3490 kfree(sdbg_devinfo);
3493 scsi_host_put(sdbg_host->shost);
3497 static int pseudo_lld_bus_match(struct device *dev,
3498 struct device_driver *dev_driver)
3503 static struct bus_type pseudo_lld_bus = {
3505 .match = pseudo_lld_bus_match,
3506 .probe = sdebug_driver_probe,
3507 .remove = sdebug_driver_remove,