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>
44 #include <scsi/scsi.h>
45 #include <scsi/scsi_cmnd.h>
46 #include <scsi/scsi_device.h>
47 #include <scsi/scsi_host.h>
48 #include <scsi/scsicam.h>
49 #include <scsi/scsi_eh.h>
51 #include <linux/stat.h>
53 #include "scsi_logging.h"
55 #define SCSI_DEBUG_VERSION "1.81"
56 static const char * scsi_debug_version_date = "20070104";
58 /* Additional Sense Code (ASC) */
59 #define NO_ADDITIONAL_SENSE 0x0
60 #define LOGICAL_UNIT_NOT_READY 0x4
61 #define UNRECOVERED_READ_ERR 0x11
62 #define PARAMETER_LIST_LENGTH_ERR 0x1a
63 #define INVALID_OPCODE 0x20
64 #define ADDR_OUT_OF_RANGE 0x21
65 #define INVALID_FIELD_IN_CDB 0x24
66 #define INVALID_FIELD_IN_PARAM_LIST 0x26
67 #define POWERON_RESET 0x29
68 #define SAVING_PARAMS_UNSUP 0x39
69 #define TRANSPORT_PROBLEM 0x4b
70 #define THRESHOLD_EXCEEDED 0x5d
71 #define LOW_POWER_COND_ON 0x5e
73 /* Additional Sense Code Qualifier (ASCQ) */
74 #define ACK_NAK_TO 0x3
76 #define SDEBUG_TAGGED_QUEUING 0 /* 0 | MSG_SIMPLE_TAG | MSG_ORDERED_TAG */
78 /* Default values for driver parameters */
79 #define DEF_NUM_HOST 1
80 #define DEF_NUM_TGTS 1
81 #define DEF_MAX_LUNS 1
82 /* With these defaults, this driver will make 1 host with 1 target
83 * (id 0) containing 1 logical unit (lun 0). That is 1 device.
86 #define DEF_DEV_SIZE_MB 8
87 #define DEF_EVERY_NTH 0
88 #define DEF_NUM_PARTS 0
90 #define DEF_SCSI_LEVEL 5 /* INQUIRY, byte2 [5->SPC-3] */
93 #define DEF_NO_LUN_0 0
94 #define DEF_VIRTUAL_GB 0
96 #define DEF_VPD_USE_HOSTNO 1
98 /* bit mask values for scsi_debug_opts */
99 #define SCSI_DEBUG_OPT_NOISE 1
100 #define SCSI_DEBUG_OPT_MEDIUM_ERR 2
101 #define SCSI_DEBUG_OPT_TIMEOUT 4
102 #define SCSI_DEBUG_OPT_RECOVERED_ERR 8
103 #define SCSI_DEBUG_OPT_TRANSPORT_ERR 16
104 /* When "every_nth" > 0 then modulo "every_nth" commands:
105 * - a no response is simulated if SCSI_DEBUG_OPT_TIMEOUT is set
106 * - a RECOVERED_ERROR is simulated on successful read and write
107 * commands if SCSI_DEBUG_OPT_RECOVERED_ERR is set.
108 * - a TRANSPORT_ERROR is simulated on successful read and write
109 * commands if SCSI_DEBUG_OPT_TRANSPORT_ERR is set.
111 * When "every_nth" < 0 then after "- every_nth" commands:
112 * - a no response is simulated if SCSI_DEBUG_OPT_TIMEOUT is set
113 * - a RECOVERED_ERROR is simulated on successful read and write
114 * commands if SCSI_DEBUG_OPT_RECOVERED_ERR is set.
115 * - a TRANSPORT_ERROR is simulated on successful read and write
116 * commands if SCSI_DEBUG_OPT_TRANSPORT_ERR is set.
117 * This will continue until some other action occurs (e.g. the user
118 * writing a new value (other than -1 or 1) to every_nth via sysfs).
121 /* when 1==SCSI_DEBUG_OPT_MEDIUM_ERR, a medium error is simulated at this
122 * sector on read commands: */
123 #define OPT_MEDIUM_ERR_ADDR 0x1234 /* that's sector 4660 in decimal */
125 /* If REPORT LUNS has luns >= 256 it can choose "flat space" (value 1)
126 * or "peripheral device" addressing (value 0) */
127 #define SAM2_LUN_ADDRESS_METHOD 0
128 #define SAM2_WLUN_REPORT_LUNS 0xc101
130 static int scsi_debug_add_host = DEF_NUM_HOST;
131 static int scsi_debug_delay = DEF_DELAY;
132 static int scsi_debug_dev_size_mb = DEF_DEV_SIZE_MB;
133 static int scsi_debug_every_nth = DEF_EVERY_NTH;
134 static int scsi_debug_max_luns = DEF_MAX_LUNS;
135 static int scsi_debug_num_parts = DEF_NUM_PARTS;
136 static int scsi_debug_num_tgts = DEF_NUM_TGTS; /* targets per host */
137 static int scsi_debug_opts = DEF_OPTS;
138 static int scsi_debug_scsi_level = DEF_SCSI_LEVEL;
139 static int scsi_debug_ptype = DEF_PTYPE; /* SCSI peripheral type (0==disk) */
140 static int scsi_debug_dsense = DEF_D_SENSE;
141 static int scsi_debug_no_lun_0 = DEF_NO_LUN_0;
142 static int scsi_debug_virtual_gb = DEF_VIRTUAL_GB;
143 static int scsi_debug_fake_rw = DEF_FAKE_RW;
144 static int scsi_debug_vpd_use_hostno = DEF_VPD_USE_HOSTNO;
146 static int scsi_debug_cmnd_count = 0;
148 #define DEV_READONLY(TGT) (0)
149 #define DEV_REMOVEABLE(TGT) (0)
151 static unsigned int sdebug_store_sectors;
152 static sector_t sdebug_capacity; /* in sectors */
154 /* old BIOS stuff, kernel may get rid of them but some mode sense pages
155 may still need them */
156 static int sdebug_heads; /* heads per disk */
157 static int sdebug_cylinders_per; /* cylinders per surface */
158 static int sdebug_sectors_per; /* sectors per cylinder */
160 /* default sector size is 512 bytes, 2**9 bytes */
161 #define POW2_SECT_SIZE 9
162 #define SECT_SIZE (1 << POW2_SECT_SIZE)
163 #define SECT_SIZE_PER(TGT) SECT_SIZE
165 #define SDEBUG_MAX_PARTS 4
167 #define SDEBUG_SENSE_LEN 32
169 #define SCSI_DEBUG_CANQUEUE 255
170 #define SCSI_DEBUG_MAX_CMD_LEN 16
172 struct sdebug_dev_info {
173 struct list_head dev_list;
174 unsigned char sense_buff[SDEBUG_SENSE_LEN]; /* weak nexus */
175 unsigned int channel;
178 struct sdebug_host_info *sdbg_host;
185 struct sdebug_host_info {
186 struct list_head host_list;
187 struct Scsi_Host *shost;
189 struct list_head dev_info_list;
192 #define to_sdebug_host(d) \
193 container_of(d, struct sdebug_host_info, dev)
195 static LIST_HEAD(sdebug_host_list);
196 static DEFINE_SPINLOCK(sdebug_host_list_lock);
198 typedef void (* done_funct_t) (struct scsi_cmnd *);
200 struct sdebug_queued_cmd {
202 struct timer_list cmnd_timer;
203 done_funct_t done_funct;
204 struct scsi_cmnd * a_cmnd;
207 static struct sdebug_queued_cmd queued_arr[SCSI_DEBUG_CANQUEUE];
209 static unsigned char * fake_storep; /* ramdisk storage */
211 static int num_aborts = 0;
212 static int num_dev_resets = 0;
213 static int num_bus_resets = 0;
214 static int num_host_resets = 0;
216 static DEFINE_SPINLOCK(queued_arr_lock);
217 static DEFINE_RWLOCK(atomic_rw);
219 static char sdebug_proc_name[] = "scsi_debug";
221 static int sdebug_driver_probe(struct device *);
222 static int sdebug_driver_remove(struct device *);
223 static struct bus_type pseudo_lld_bus;
225 static struct device_driver sdebug_driverfs_driver = {
226 .name = sdebug_proc_name,
227 .bus = &pseudo_lld_bus,
230 static const int check_condition_result =
231 (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
233 static unsigned char ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
235 static unsigned char iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
238 static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev);
239 static void mk_sense_buffer(struct sdebug_dev_info * devip, int key,
241 static void stop_all_queued(void);
242 static int stop_queued_cmnd(struct scsi_cmnd * cmnd);
244 static int sdebug_add_adapter(void);
245 static void sdebug_remove_adapter(void);
246 static void sdebug_max_tgts_luns(void);
248 static struct device pseudo_primary;
249 static struct bus_type pseudo_lld_bus;
251 static void get_data_transfer_info(unsigned char *cmd,
252 unsigned long long *lba, unsigned int *num)
257 *lba = (u64)cmd[9] | (u64)cmd[8] << 8 |
258 (u64)cmd[7] << 16 | (u64)cmd[6] << 24 |
259 (u64)cmd[5] << 32 | (u64)cmd[4] << 40 |
260 (u64)cmd[3] << 48 | (u64)cmd[2] << 56;
262 *num = (u32)cmd[13] | (u32)cmd[12] << 8 | (u32)cmd[11] << 16 |
267 *lba = (u32)cmd[5] | (u32)cmd[4] << 8 | (u32)cmd[3] << 16 |
270 *num = (u32)cmd[9] | (u32)cmd[8] << 8 | (u32)cmd[7] << 16 |
276 *lba = (u32)cmd[5] | (u32)cmd[4] << 8 | (u32)cmd[3] << 16 |
279 *num = (u32)cmd[8] | (u32)cmd[7] << 8;
283 *lba = (u32)cmd[3] | (u32)cmd[2] << 8 |
284 (u32)(cmd[1] & 0x1f) << 16;
285 *num = (0 == cmd[4]) ? 256 : cmd[4];
292 static int scsi_debug_ioctl(struct scsi_device *dev, int cmd, void __user *arg)
294 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
295 printk(KERN_INFO "scsi_debug: ioctl: cmd=0x%x\n", cmd);
298 /* return -ENOTTY; // correct return but upsets fdisk */
301 static int check_readiness(struct scsi_cmnd * SCpnt, int reset_only,
302 struct sdebug_dev_info * devip)
305 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
306 printk(KERN_INFO "scsi_debug: Reporting Unit "
307 "attention: power on reset\n");
309 mk_sense_buffer(devip, UNIT_ATTENTION, POWERON_RESET, 0);
310 return check_condition_result;
312 if ((0 == reset_only) && devip->stopped) {
313 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
314 printk(KERN_INFO "scsi_debug: Reporting Not "
315 "ready: initializing command required\n");
316 mk_sense_buffer(devip, NOT_READY, LOGICAL_UNIT_NOT_READY,
318 return check_condition_result;
323 /* Returns 0 if ok else (DID_ERROR << 16). Sets scp->resid . */
324 static int fill_from_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
328 struct scsi_data_buffer *sdb = scsi_in(scp);
332 if (!(scsi_bidi_cmnd(scp) || scp->sc_data_direction == DMA_FROM_DEVICE))
333 return (DID_ERROR << 16);
335 act_len = sg_copy_from_buffer(sdb->table.sgl, sdb->table.nents,
338 sdb->resid -= act_len;
340 sdb->resid = scsi_bufflen(scp) - act_len;
345 /* Returns number of bytes fetched into 'arr' or -1 if error. */
346 static int fetch_to_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
349 if (!scsi_bufflen(scp))
351 if (!(scsi_bidi_cmnd(scp) || scp->sc_data_direction == DMA_TO_DEVICE))
354 return scsi_sg_copy_to_buffer(scp, arr, arr_len);
358 static const char * inq_vendor_id = "Linux ";
359 static const char * inq_product_id = "scsi_debug ";
360 static const char * inq_product_rev = "0004";
362 static int inquiry_evpd_83(unsigned char * arr, int port_group_id,
363 int target_dev_id, int dev_id_num,
364 const char * dev_id_str,
370 port_a = target_dev_id + 1;
371 /* T10 vendor identifier field format (faked) */
372 arr[0] = 0x2; /* ASCII */
375 memcpy(&arr[4], inq_vendor_id, 8);
376 memcpy(&arr[12], inq_product_id, 16);
377 memcpy(&arr[28], dev_id_str, dev_id_str_len);
378 num = 8 + 16 + dev_id_str_len;
381 if (dev_id_num >= 0) {
382 /* NAA-5, Logical unit identifier (binary) */
383 arr[num++] = 0x1; /* binary (not necessarily sas) */
384 arr[num++] = 0x3; /* PIV=0, lu, naa */
387 arr[num++] = 0x53; /* naa-5 ieee company id=0x333333 (fake) */
391 arr[num++] = (dev_id_num >> 24);
392 arr[num++] = (dev_id_num >> 16) & 0xff;
393 arr[num++] = (dev_id_num >> 8) & 0xff;
394 arr[num++] = dev_id_num & 0xff;
395 /* Target relative port number */
396 arr[num++] = 0x61; /* proto=sas, binary */
397 arr[num++] = 0x94; /* PIV=1, target port, rel port */
398 arr[num++] = 0x0; /* reserved */
399 arr[num++] = 0x4; /* length */
400 arr[num++] = 0x0; /* reserved */
401 arr[num++] = 0x0; /* reserved */
403 arr[num++] = 0x1; /* relative port A */
405 /* NAA-5, Target port identifier */
406 arr[num++] = 0x61; /* proto=sas, binary */
407 arr[num++] = 0x93; /* piv=1, target port, naa */
410 arr[num++] = 0x52; /* naa-5, company id=0x222222 (fake) */
414 arr[num++] = (port_a >> 24);
415 arr[num++] = (port_a >> 16) & 0xff;
416 arr[num++] = (port_a >> 8) & 0xff;
417 arr[num++] = port_a & 0xff;
418 /* NAA-5, Target port group identifier */
419 arr[num++] = 0x61; /* proto=sas, binary */
420 arr[num++] = 0x95; /* piv=1, target port group id */
425 arr[num++] = (port_group_id >> 8) & 0xff;
426 arr[num++] = port_group_id & 0xff;
427 /* NAA-5, Target device identifier */
428 arr[num++] = 0x61; /* proto=sas, binary */
429 arr[num++] = 0xa3; /* piv=1, target device, naa */
432 arr[num++] = 0x52; /* naa-5, company id=0x222222 (fake) */
436 arr[num++] = (target_dev_id >> 24);
437 arr[num++] = (target_dev_id >> 16) & 0xff;
438 arr[num++] = (target_dev_id >> 8) & 0xff;
439 arr[num++] = target_dev_id & 0xff;
440 /* SCSI name string: Target device identifier */
441 arr[num++] = 0x63; /* proto=sas, UTF-8 */
442 arr[num++] = 0xa8; /* piv=1, target device, SCSI name string */
445 memcpy(arr + num, "naa.52222220", 12);
447 snprintf(b, sizeof(b), "%08X", target_dev_id);
448 memcpy(arr + num, b, 8);
450 memset(arr + num, 0, 4);
456 static unsigned char vpd84_data[] = {
457 /* from 4th byte */ 0x22,0x22,0x22,0x0,0xbb,0x0,
458 0x22,0x22,0x22,0x0,0xbb,0x1,
459 0x22,0x22,0x22,0x0,0xbb,0x2,
462 static int inquiry_evpd_84(unsigned char * arr)
464 memcpy(arr, vpd84_data, sizeof(vpd84_data));
465 return sizeof(vpd84_data);
468 static int inquiry_evpd_85(unsigned char * arr)
471 const char * na1 = "https://www.kernel.org/config";
472 const char * na2 = "http://www.kernel.org/log";
475 arr[num++] = 0x1; /* lu, storage config */
476 arr[num++] = 0x0; /* reserved */
481 plen = ((plen / 4) + 1) * 4;
482 arr[num++] = plen; /* length, null termianted, padded */
483 memcpy(arr + num, na1, olen);
484 memset(arr + num + olen, 0, plen - olen);
487 arr[num++] = 0x4; /* lu, logging */
488 arr[num++] = 0x0; /* reserved */
493 plen = ((plen / 4) + 1) * 4;
494 arr[num++] = plen; /* length, null terminated, padded */
495 memcpy(arr + num, na2, olen);
496 memset(arr + num + olen, 0, plen - olen);
502 /* SCSI ports VPD page */
503 static int inquiry_evpd_88(unsigned char * arr, int target_dev_id)
508 port_a = target_dev_id + 1;
510 arr[num++] = 0x0; /* reserved */
511 arr[num++] = 0x0; /* reserved */
513 arr[num++] = 0x1; /* relative port 1 (primary) */
514 memset(arr + num, 0, 6);
517 arr[num++] = 12; /* length tp descriptor */
518 /* naa-5 target port identifier (A) */
519 arr[num++] = 0x61; /* proto=sas, binary */
520 arr[num++] = 0x93; /* PIV=1, target port, NAA */
521 arr[num++] = 0x0; /* reserved */
522 arr[num++] = 0x8; /* length */
523 arr[num++] = 0x52; /* NAA-5, company_id=0x222222 (fake) */
527 arr[num++] = (port_a >> 24);
528 arr[num++] = (port_a >> 16) & 0xff;
529 arr[num++] = (port_a >> 8) & 0xff;
530 arr[num++] = port_a & 0xff;
532 arr[num++] = 0x0; /* reserved */
533 arr[num++] = 0x0; /* reserved */
535 arr[num++] = 0x2; /* relative port 2 (secondary) */
536 memset(arr + num, 0, 6);
539 arr[num++] = 12; /* length tp descriptor */
540 /* naa-5 target port identifier (B) */
541 arr[num++] = 0x61; /* proto=sas, binary */
542 arr[num++] = 0x93; /* PIV=1, target port, NAA */
543 arr[num++] = 0x0; /* reserved */
544 arr[num++] = 0x8; /* length */
545 arr[num++] = 0x52; /* NAA-5, company_id=0x222222 (fake) */
549 arr[num++] = (port_b >> 24);
550 arr[num++] = (port_b >> 16) & 0xff;
551 arr[num++] = (port_b >> 8) & 0xff;
552 arr[num++] = port_b & 0xff;
558 static unsigned char vpd89_data[] = {
559 /* from 4th byte */ 0,0,0,0,
560 'l','i','n','u','x',' ',' ',' ',
561 'S','A','T',' ','s','c','s','i','_','d','e','b','u','g',' ',' ',
563 0x34,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
565 0x5a,0xc,0xff,0x3f,0x37,0xc8,0x10,0,0,0,0,0,0x3f,0,0,0,
566 0,0,0,0,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x20,0x20,0x20,0x20,
567 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0,0,0,0x40,0x4,0,0x2e,0x33,
568 0x38,0x31,0x20,0x20,0x20,0x20,0x54,0x53,0x38,0x33,0x30,0x30,0x33,0x31,
570 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
572 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
574 0,0,0,0x2f,0,0,0,0x2,0,0x2,0x7,0,0xff,0xff,0x1,0,
575 0x3f,0,0xc1,0xff,0x3e,0,0x10,0x1,0xb0,0xf8,0x50,0x9,0,0,0x7,0,
576 0x3,0,0x78,0,0x78,0,0xf0,0,0x78,0,0,0,0,0,0,0,
577 0,0,0,0,0,0,0,0,0x2,0,0,0,0,0,0,0,
578 0x7e,0,0x1b,0,0x6b,0x34,0x1,0x7d,0x3,0x40,0x69,0x34,0x1,0x3c,0x3,0x40,
579 0x7f,0x40,0,0,0,0,0xfe,0xfe,0,0,0,0,0,0xfe,0,0,
580 0,0,0,0,0,0,0,0,0xb0,0xf8,0x50,0x9,0,0,0,0,
581 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
582 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
583 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
584 0x1,0,0xb0,0xf8,0x50,0x9,0xb0,0xf8,0x50,0x9,0x20,0x20,0x2,0,0xb6,0x42,
585 0,0x80,0x8a,0,0x6,0x3c,0xa,0x3c,0xff,0xff,0xc6,0x7,0,0x1,0,0x8,
586 0xf0,0xf,0,0x10,0x2,0,0x30,0,0,0,0,0,0,0,0x6,0xfe,
587 0,0,0x2,0,0x50,0,0x8a,0,0x4f,0x95,0,0,0x21,0,0xb,0,
588 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
589 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
590 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
591 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
592 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
593 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
594 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
595 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
596 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
597 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
598 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
599 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa5,0x51,
602 static int inquiry_evpd_89(unsigned char * arr)
604 memcpy(arr, vpd89_data, sizeof(vpd89_data));
605 return sizeof(vpd89_data);
609 static unsigned char vpdb0_data[] = {
610 /* from 4th byte */ 0,0,0,4,
615 static int inquiry_evpd_b0(unsigned char * arr)
617 memcpy(arr, vpdb0_data, sizeof(vpdb0_data));
618 if (sdebug_store_sectors > 0x400) {
619 arr[4] = (sdebug_store_sectors >> 24) & 0xff;
620 arr[5] = (sdebug_store_sectors >> 16) & 0xff;
621 arr[6] = (sdebug_store_sectors >> 8) & 0xff;
622 arr[7] = sdebug_store_sectors & 0xff;
624 return sizeof(vpdb0_data);
628 #define SDEBUG_LONG_INQ_SZ 96
629 #define SDEBUG_MAX_INQ_ARR_SZ 584
631 static int resp_inquiry(struct scsi_cmnd * scp, int target,
632 struct sdebug_dev_info * devip)
634 unsigned char pq_pdt;
636 unsigned char *cmd = (unsigned char *)scp->cmnd;
637 int alloc_len, n, ret;
639 alloc_len = (cmd[3] << 8) + cmd[4];
640 arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_ATOMIC);
642 return DID_REQUEUE << 16;
644 pq_pdt = 0x1e; /* present, wlun */
645 else if (scsi_debug_no_lun_0 && (0 == devip->lun))
646 pq_pdt = 0x7f; /* not present, no device type */
648 pq_pdt = (scsi_debug_ptype & 0x1f);
650 if (0x2 & cmd[1]) { /* CMDDT bit set */
651 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
654 return check_condition_result;
655 } else if (0x1 & cmd[1]) { /* EVPD bit set */
656 int lu_id_num, port_group_id, target_dev_id, len;
658 int host_no = devip->sdbg_host->shost->host_no;
660 port_group_id = (((host_no + 1) & 0x7f) << 8) +
661 (devip->channel & 0x7f);
662 if (0 == scsi_debug_vpd_use_hostno)
664 lu_id_num = devip->wlun ? -1 : (((host_no + 1) * 2000) +
665 (devip->target * 1000) + devip->lun);
666 target_dev_id = ((host_no + 1) * 2000) +
667 (devip->target * 1000) - 3;
668 len = scnprintf(lu_id_str, 6, "%d", lu_id_num);
669 if (0 == cmd[2]) { /* supported vital product data pages */
670 arr[1] = cmd[2]; /*sanity */
672 arr[n++] = 0x0; /* this page */
673 arr[n++] = 0x80; /* unit serial number */
674 arr[n++] = 0x83; /* device identification */
675 arr[n++] = 0x84; /* software interface ident. */
676 arr[n++] = 0x85; /* management network addresses */
677 arr[n++] = 0x86; /* extended inquiry */
678 arr[n++] = 0x87; /* mode page policy */
679 arr[n++] = 0x88; /* SCSI ports */
680 arr[n++] = 0x89; /* ATA information */
681 arr[n++] = 0xb0; /* Block limits (SBC) */
682 arr[3] = n - 4; /* number of supported VPD pages */
683 } else if (0x80 == cmd[2]) { /* unit serial number */
684 arr[1] = cmd[2]; /*sanity */
686 memcpy(&arr[4], lu_id_str, len);
687 } else if (0x83 == cmd[2]) { /* device identification */
688 arr[1] = cmd[2]; /*sanity */
689 arr[3] = inquiry_evpd_83(&arr[4], port_group_id,
690 target_dev_id, lu_id_num,
692 } else if (0x84 == cmd[2]) { /* Software interface ident. */
693 arr[1] = cmd[2]; /*sanity */
694 arr[3] = inquiry_evpd_84(&arr[4]);
695 } else if (0x85 == cmd[2]) { /* Management network addresses */
696 arr[1] = cmd[2]; /*sanity */
697 arr[3] = inquiry_evpd_85(&arr[4]);
698 } else if (0x86 == cmd[2]) { /* extended inquiry */
699 arr[1] = cmd[2]; /*sanity */
700 arr[3] = 0x3c; /* number of following entries */
701 arr[4] = 0x0; /* no protection stuff */
702 arr[5] = 0x7; /* head of q, ordered + simple q's */
703 } else if (0x87 == cmd[2]) { /* mode page policy */
704 arr[1] = cmd[2]; /*sanity */
705 arr[3] = 0x8; /* number of following entries */
706 arr[4] = 0x2; /* disconnect-reconnect mp */
707 arr[6] = 0x80; /* mlus, shared */
708 arr[8] = 0x18; /* protocol specific lu */
709 arr[10] = 0x82; /* mlus, per initiator port */
710 } else if (0x88 == cmd[2]) { /* SCSI Ports */
711 arr[1] = cmd[2]; /*sanity */
712 arr[3] = inquiry_evpd_88(&arr[4], target_dev_id);
713 } else if (0x89 == cmd[2]) { /* ATA information */
714 arr[1] = cmd[2]; /*sanity */
715 n = inquiry_evpd_89(&arr[4]);
718 } else if (0xb0 == cmd[2]) { /* Block limits (SBC) */
719 arr[1] = cmd[2]; /*sanity */
720 arr[3] = inquiry_evpd_b0(&arr[4]);
722 /* Illegal request, invalid field in cdb */
723 mk_sense_buffer(devip, ILLEGAL_REQUEST,
724 INVALID_FIELD_IN_CDB, 0);
726 return check_condition_result;
728 len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len);
729 ret = fill_from_dev_buffer(scp, arr,
730 min(len, SDEBUG_MAX_INQ_ARR_SZ));
734 /* drops through here for a standard inquiry */
735 arr[1] = DEV_REMOVEABLE(target) ? 0x80 : 0; /* Removable disk */
736 arr[2] = scsi_debug_scsi_level;
737 arr[3] = 2; /* response_data_format==2 */
738 arr[4] = SDEBUG_LONG_INQ_SZ - 5;
739 if (0 == scsi_debug_vpd_use_hostno)
740 arr[5] = 0x10; /* claim: implicit TGPS */
741 arr[6] = 0x10; /* claim: MultiP */
742 /* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */
743 arr[7] = 0xa; /* claim: LINKED + CMDQUE */
744 memcpy(&arr[8], inq_vendor_id, 8);
745 memcpy(&arr[16], inq_product_id, 16);
746 memcpy(&arr[32], inq_product_rev, 4);
747 /* version descriptors (2 bytes each) follow */
748 arr[58] = 0x0; arr[59] = 0x77; /* SAM-3 ANSI */
749 arr[60] = 0x3; arr[61] = 0x14; /* SPC-3 ANSI */
751 if (scsi_debug_ptype == 0) {
752 arr[n++] = 0x3; arr[n++] = 0x3d; /* SBC-2 ANSI */
753 } else if (scsi_debug_ptype == 1) {
754 arr[n++] = 0x3; arr[n++] = 0x60; /* SSC-2 no version */
756 arr[n++] = 0xc; arr[n++] = 0xf; /* SAS-1.1 rev 10 */
757 ret = fill_from_dev_buffer(scp, arr,
758 min(alloc_len, SDEBUG_LONG_INQ_SZ));
763 static int resp_requests(struct scsi_cmnd * scp,
764 struct sdebug_dev_info * devip)
766 unsigned char * sbuff;
767 unsigned char *cmd = (unsigned char *)scp->cmnd;
768 unsigned char arr[SDEBUG_SENSE_LEN];
772 memset(arr, 0, sizeof(arr));
773 if (devip->reset == 1)
774 mk_sense_buffer(devip, 0, NO_ADDITIONAL_SENSE, 0);
775 want_dsense = !!(cmd[1] & 1) || scsi_debug_dsense;
776 sbuff = devip->sense_buff;
777 if ((iec_m_pg[2] & 0x4) && (6 == (iec_m_pg[3] & 0xf))) {
780 arr[1] = 0x0; /* NO_SENSE in sense_key */
781 arr[2] = THRESHOLD_EXCEEDED;
782 arr[3] = 0xff; /* TEST set and MRIE==6 */
785 arr[2] = 0x0; /* NO_SENSE in sense_key */
786 arr[7] = 0xa; /* 18 byte sense buffer */
787 arr[12] = THRESHOLD_EXCEEDED;
788 arr[13] = 0xff; /* TEST set and MRIE==6 */
791 memcpy(arr, sbuff, SDEBUG_SENSE_LEN);
792 if ((cmd[1] & 1) && (! scsi_debug_dsense)) {
793 /* DESC bit set and sense_buff in fixed format */
794 memset(arr, 0, sizeof(arr));
796 arr[1] = sbuff[2]; /* sense key */
797 arr[2] = sbuff[12]; /* asc */
798 arr[3] = sbuff[13]; /* ascq */
802 mk_sense_buffer(devip, 0, NO_ADDITIONAL_SENSE, 0);
803 return fill_from_dev_buffer(scp, arr, len);
806 static int resp_start_stop(struct scsi_cmnd * scp,
807 struct sdebug_dev_info * devip)
809 unsigned char *cmd = (unsigned char *)scp->cmnd;
810 int power_cond, errsts, start;
812 if ((errsts = check_readiness(scp, 1, devip)))
814 power_cond = (cmd[4] & 0xf0) >> 4;
816 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
818 return check_condition_result;
821 if (start == devip->stopped)
822 devip->stopped = !start;
826 #define SDEBUG_READCAP_ARR_SZ 8
827 static int resp_readcap(struct scsi_cmnd * scp,
828 struct sdebug_dev_info * devip)
830 unsigned char arr[SDEBUG_READCAP_ARR_SZ];
834 if ((errsts = check_readiness(scp, 1, devip)))
836 /* following just in case virtual_gb changed */
837 if (scsi_debug_virtual_gb > 0) {
838 sdebug_capacity = 2048 * 1024;
839 sdebug_capacity *= scsi_debug_virtual_gb;
841 sdebug_capacity = sdebug_store_sectors;
842 memset(arr, 0, SDEBUG_READCAP_ARR_SZ);
843 if (sdebug_capacity < 0xffffffff) {
844 capac = (unsigned int)sdebug_capacity - 1;
845 arr[0] = (capac >> 24);
846 arr[1] = (capac >> 16) & 0xff;
847 arr[2] = (capac >> 8) & 0xff;
848 arr[3] = capac & 0xff;
855 arr[6] = (SECT_SIZE_PER(target) >> 8) & 0xff;
856 arr[7] = SECT_SIZE_PER(target) & 0xff;
857 return fill_from_dev_buffer(scp, arr, SDEBUG_READCAP_ARR_SZ);
860 #define SDEBUG_READCAP16_ARR_SZ 32
861 static int resp_readcap16(struct scsi_cmnd * scp,
862 struct sdebug_dev_info * devip)
864 unsigned char *cmd = (unsigned char *)scp->cmnd;
865 unsigned char arr[SDEBUG_READCAP16_ARR_SZ];
866 unsigned long long capac;
867 int errsts, k, alloc_len;
869 if ((errsts = check_readiness(scp, 1, devip)))
871 alloc_len = ((cmd[10] << 24) + (cmd[11] << 16) + (cmd[12] << 8)
873 /* following just in case virtual_gb changed */
874 if (scsi_debug_virtual_gb > 0) {
875 sdebug_capacity = 2048 * 1024;
876 sdebug_capacity *= scsi_debug_virtual_gb;
878 sdebug_capacity = sdebug_store_sectors;
879 memset(arr, 0, SDEBUG_READCAP16_ARR_SZ);
880 capac = sdebug_capacity - 1;
881 for (k = 0; k < 8; ++k, capac >>= 8)
882 arr[7 - k] = capac & 0xff;
883 arr[8] = (SECT_SIZE_PER(target) >> 24) & 0xff;
884 arr[9] = (SECT_SIZE_PER(target) >> 16) & 0xff;
885 arr[10] = (SECT_SIZE_PER(target) >> 8) & 0xff;
886 arr[11] = SECT_SIZE_PER(target) & 0xff;
887 return fill_from_dev_buffer(scp, arr,
888 min(alloc_len, SDEBUG_READCAP16_ARR_SZ));
891 #define SDEBUG_MAX_TGTPGS_ARR_SZ 1412
893 static int resp_report_tgtpgs(struct scsi_cmnd * scp,
894 struct sdebug_dev_info * devip)
896 unsigned char *cmd = (unsigned char *)scp->cmnd;
898 int host_no = devip->sdbg_host->shost->host_no;
899 int n, ret, alen, rlen;
900 int port_group_a, port_group_b, port_a, port_b;
902 alen = ((cmd[6] << 24) + (cmd[7] << 16) + (cmd[8] << 8)
905 arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_ATOMIC);
907 return DID_REQUEUE << 16;
909 * EVPD page 0x88 states we have two ports, one
910 * real and a fake port with no device connected.
911 * So we create two port groups with one port each
912 * and set the group with port B to unavailable.
914 port_a = 0x1; /* relative port A */
915 port_b = 0x2; /* relative port B */
916 port_group_a = (((host_no + 1) & 0x7f) << 8) +
917 (devip->channel & 0x7f);
918 port_group_b = (((host_no + 1) & 0x7f) << 8) +
919 (devip->channel & 0x7f) + 0x80;
922 * The asymmetric access state is cycled according to the host_id.
925 if (0 == scsi_debug_vpd_use_hostno) {
926 arr[n++] = host_no % 3; /* Asymm access state */
927 arr[n++] = 0x0F; /* claim: all states are supported */
929 arr[n++] = 0x0; /* Active/Optimized path */
930 arr[n++] = 0x01; /* claim: only support active/optimized paths */
932 arr[n++] = (port_group_a >> 8) & 0xff;
933 arr[n++] = port_group_a & 0xff;
934 arr[n++] = 0; /* Reserved */
935 arr[n++] = 0; /* Status code */
936 arr[n++] = 0; /* Vendor unique */
937 arr[n++] = 0x1; /* One port per group */
938 arr[n++] = 0; /* Reserved */
939 arr[n++] = 0; /* Reserved */
940 arr[n++] = (port_a >> 8) & 0xff;
941 arr[n++] = port_a & 0xff;
942 arr[n++] = 3; /* Port unavailable */
943 arr[n++] = 0x08; /* claim: only unavailalbe paths are supported */
944 arr[n++] = (port_group_b >> 8) & 0xff;
945 arr[n++] = port_group_b & 0xff;
946 arr[n++] = 0; /* Reserved */
947 arr[n++] = 0; /* Status code */
948 arr[n++] = 0; /* Vendor unique */
949 arr[n++] = 0x1; /* One port per group */
950 arr[n++] = 0; /* Reserved */
951 arr[n++] = 0; /* Reserved */
952 arr[n++] = (port_b >> 8) & 0xff;
953 arr[n++] = port_b & 0xff;
956 arr[0] = (rlen >> 24) & 0xff;
957 arr[1] = (rlen >> 16) & 0xff;
958 arr[2] = (rlen >> 8) & 0xff;
959 arr[3] = rlen & 0xff;
962 * Return the smallest value of either
963 * - The allocated length
964 * - The constructed command length
965 * - The maximum array size
968 ret = fill_from_dev_buffer(scp, arr,
969 min(rlen, SDEBUG_MAX_TGTPGS_ARR_SZ));
974 /* <<Following mode page info copied from ST318451LW>> */
976 static int resp_err_recov_pg(unsigned char * p, int pcontrol, int target)
977 { /* Read-Write Error Recovery page for mode_sense */
978 unsigned char err_recov_pg[] = {0x1, 0xa, 0xc0, 11, 240, 0, 0, 0,
981 memcpy(p, err_recov_pg, sizeof(err_recov_pg));
983 memset(p + 2, 0, sizeof(err_recov_pg) - 2);
984 return sizeof(err_recov_pg);
987 static int resp_disconnect_pg(unsigned char * p, int pcontrol, int target)
988 { /* Disconnect-Reconnect page for mode_sense */
989 unsigned char disconnect_pg[] = {0x2, 0xe, 128, 128, 0, 10, 0, 0,
990 0, 0, 0, 0, 0, 0, 0, 0};
992 memcpy(p, disconnect_pg, sizeof(disconnect_pg));
994 memset(p + 2, 0, sizeof(disconnect_pg) - 2);
995 return sizeof(disconnect_pg);
998 static int resp_format_pg(unsigned char * p, int pcontrol, int target)
999 { /* Format device page for mode_sense */
1000 unsigned char format_pg[] = {0x3, 0x16, 0, 0, 0, 0, 0, 0,
1001 0, 0, 0, 0, 0, 0, 0, 0,
1002 0, 0, 0, 0, 0x40, 0, 0, 0};
1004 memcpy(p, format_pg, sizeof(format_pg));
1005 p[10] = (sdebug_sectors_per >> 8) & 0xff;
1006 p[11] = sdebug_sectors_per & 0xff;
1007 p[12] = (SECT_SIZE >> 8) & 0xff;
1008 p[13] = SECT_SIZE & 0xff;
1009 if (DEV_REMOVEABLE(target))
1010 p[20] |= 0x20; /* should agree with INQUIRY */
1012 memset(p + 2, 0, sizeof(format_pg) - 2);
1013 return sizeof(format_pg);
1016 static int resp_caching_pg(unsigned char * p, int pcontrol, int target)
1017 { /* Caching page for mode_sense */
1018 unsigned char caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
1019 0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0, 0, 0, 0, 0};
1021 memcpy(p, caching_pg, sizeof(caching_pg));
1023 memset(p + 2, 0, sizeof(caching_pg) - 2);
1024 return sizeof(caching_pg);
1027 static int resp_ctrl_m_pg(unsigned char * p, int pcontrol, int target)
1028 { /* Control mode page for mode_sense */
1029 unsigned char ch_ctrl_m_pg[] = {/* 0xa, 10, */ 0x6, 0, 0, 0, 0, 0,
1031 unsigned char d_ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
1034 if (scsi_debug_dsense)
1035 ctrl_m_pg[2] |= 0x4;
1037 ctrl_m_pg[2] &= ~0x4;
1038 memcpy(p, ctrl_m_pg, sizeof(ctrl_m_pg));
1040 memcpy(p + 2, ch_ctrl_m_pg, sizeof(ch_ctrl_m_pg));
1041 else if (2 == pcontrol)
1042 memcpy(p, d_ctrl_m_pg, sizeof(d_ctrl_m_pg));
1043 return sizeof(ctrl_m_pg);
1047 static int resp_iec_m_pg(unsigned char * p, int pcontrol, int target)
1048 { /* Informational Exceptions control mode page for mode_sense */
1049 unsigned char ch_iec_m_pg[] = {/* 0x1c, 0xa, */ 0x4, 0xf, 0, 0, 0, 0,
1051 unsigned char d_iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
1054 memcpy(p, iec_m_pg, sizeof(iec_m_pg));
1056 memcpy(p + 2, ch_iec_m_pg, sizeof(ch_iec_m_pg));
1057 else if (2 == pcontrol)
1058 memcpy(p, d_iec_m_pg, sizeof(d_iec_m_pg));
1059 return sizeof(iec_m_pg);
1062 static int resp_sas_sf_m_pg(unsigned char * p, int pcontrol, int target)
1063 { /* SAS SSP mode page - short format for mode_sense */
1064 unsigned char sas_sf_m_pg[] = {0x19, 0x6,
1065 0x6, 0x0, 0x7, 0xd0, 0x0, 0x0};
1067 memcpy(p, sas_sf_m_pg, sizeof(sas_sf_m_pg));
1069 memset(p + 2, 0, sizeof(sas_sf_m_pg) - 2);
1070 return sizeof(sas_sf_m_pg);
1074 static int resp_sas_pcd_m_spg(unsigned char * p, int pcontrol, int target,
1076 { /* SAS phy control and discover mode page for mode_sense */
1077 unsigned char sas_pcd_m_pg[] = {0x59, 0x1, 0, 0x64, 0, 0x6, 0, 2,
1078 0, 0, 0, 0, 0x10, 0x9, 0x8, 0x0,
1079 0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0,
1080 0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1,
1081 0x2, 0, 0, 0, 0, 0, 0, 0,
1082 0x88, 0x99, 0, 0, 0, 0, 0, 0,
1083 0, 0, 0, 0, 0, 0, 0, 0,
1084 0, 1, 0, 0, 0x10, 0x9, 0x8, 0x0,
1085 0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0,
1086 0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1,
1087 0x3, 0, 0, 0, 0, 0, 0, 0,
1088 0x88, 0x99, 0, 0, 0, 0, 0, 0,
1089 0, 0, 0, 0, 0, 0, 0, 0,
1093 port_a = target_dev_id + 1;
1094 port_b = port_a + 1;
1095 memcpy(p, sas_pcd_m_pg, sizeof(sas_pcd_m_pg));
1096 p[20] = (port_a >> 24);
1097 p[21] = (port_a >> 16) & 0xff;
1098 p[22] = (port_a >> 8) & 0xff;
1099 p[23] = port_a & 0xff;
1100 p[48 + 20] = (port_b >> 24);
1101 p[48 + 21] = (port_b >> 16) & 0xff;
1102 p[48 + 22] = (port_b >> 8) & 0xff;
1103 p[48 + 23] = port_b & 0xff;
1105 memset(p + 4, 0, sizeof(sas_pcd_m_pg) - 4);
1106 return sizeof(sas_pcd_m_pg);
1109 static int resp_sas_sha_m_spg(unsigned char * p, int pcontrol)
1110 { /* SAS SSP shared protocol specific port mode subpage */
1111 unsigned char sas_sha_m_pg[] = {0x59, 0x2, 0, 0xc, 0, 0x6, 0x10, 0,
1112 0, 0, 0, 0, 0, 0, 0, 0,
1115 memcpy(p, sas_sha_m_pg, sizeof(sas_sha_m_pg));
1117 memset(p + 4, 0, sizeof(sas_sha_m_pg) - 4);
1118 return sizeof(sas_sha_m_pg);
1121 #define SDEBUG_MAX_MSENSE_SZ 256
1123 static int resp_mode_sense(struct scsi_cmnd * scp, int target,
1124 struct sdebug_dev_info * devip)
1126 unsigned char dbd, llbaa;
1127 int pcontrol, pcode, subpcode, bd_len;
1128 unsigned char dev_spec;
1129 int k, alloc_len, msense_6, offset, len, errsts, target_dev_id;
1131 unsigned char arr[SDEBUG_MAX_MSENSE_SZ];
1132 unsigned char *cmd = (unsigned char *)scp->cmnd;
1134 if ((errsts = check_readiness(scp, 1, devip)))
1136 dbd = !!(cmd[1] & 0x8);
1137 pcontrol = (cmd[2] & 0xc0) >> 6;
1138 pcode = cmd[2] & 0x3f;
1140 msense_6 = (MODE_SENSE == cmd[0]);
1141 llbaa = msense_6 ? 0 : !!(cmd[1] & 0x10);
1142 if ((0 == scsi_debug_ptype) && (0 == dbd))
1143 bd_len = llbaa ? 16 : 8;
1146 alloc_len = msense_6 ? cmd[4] : ((cmd[7] << 8) | cmd[8]);
1147 memset(arr, 0, SDEBUG_MAX_MSENSE_SZ);
1148 if (0x3 == pcontrol) { /* Saving values not supported */
1149 mk_sense_buffer(devip, ILLEGAL_REQUEST, SAVING_PARAMS_UNSUP,
1151 return check_condition_result;
1153 target_dev_id = ((devip->sdbg_host->shost->host_no + 1) * 2000) +
1154 (devip->target * 1000) - 3;
1155 /* set DPOFUA bit for disks */
1156 if (0 == scsi_debug_ptype)
1157 dev_spec = (DEV_READONLY(target) ? 0x80 : 0x0) | 0x10;
1167 arr[4] = 0x1; /* set LONGLBA bit */
1168 arr[7] = bd_len; /* assume 255 or less */
1172 if ((bd_len > 0) && (0 == sdebug_capacity)) {
1173 if (scsi_debug_virtual_gb > 0) {
1174 sdebug_capacity = 2048 * 1024;
1175 sdebug_capacity *= scsi_debug_virtual_gb;
1177 sdebug_capacity = sdebug_store_sectors;
1180 if (sdebug_capacity > 0xfffffffe) {
1186 ap[0] = (sdebug_capacity >> 24) & 0xff;
1187 ap[1] = (sdebug_capacity >> 16) & 0xff;
1188 ap[2] = (sdebug_capacity >> 8) & 0xff;
1189 ap[3] = sdebug_capacity & 0xff;
1191 ap[6] = (SECT_SIZE_PER(target) >> 8) & 0xff;
1192 ap[7] = SECT_SIZE_PER(target) & 0xff;
1195 } else if (16 == bd_len) {
1196 unsigned long long capac = sdebug_capacity;
1198 for (k = 0; k < 8; ++k, capac >>= 8)
1199 ap[7 - k] = capac & 0xff;
1200 ap[12] = (SECT_SIZE_PER(target) >> 24) & 0xff;
1201 ap[13] = (SECT_SIZE_PER(target) >> 16) & 0xff;
1202 ap[14] = (SECT_SIZE_PER(target) >> 8) & 0xff;
1203 ap[15] = SECT_SIZE_PER(target) & 0xff;
1208 if ((subpcode > 0x0) && (subpcode < 0xff) && (0x19 != pcode)) {
1209 /* TODO: Control Extension page */
1210 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1212 return check_condition_result;
1215 case 0x1: /* Read-Write error recovery page, direct access */
1216 len = resp_err_recov_pg(ap, pcontrol, target);
1219 case 0x2: /* Disconnect-Reconnect page, all devices */
1220 len = resp_disconnect_pg(ap, pcontrol, target);
1223 case 0x3: /* Format device page, direct access */
1224 len = resp_format_pg(ap, pcontrol, target);
1227 case 0x8: /* Caching page, direct access */
1228 len = resp_caching_pg(ap, pcontrol, target);
1231 case 0xa: /* Control Mode page, all devices */
1232 len = resp_ctrl_m_pg(ap, pcontrol, target);
1235 case 0x19: /* if spc==1 then sas phy, control+discover */
1236 if ((subpcode > 0x2) && (subpcode < 0xff)) {
1237 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1238 INVALID_FIELD_IN_CDB, 0);
1239 return check_condition_result;
1242 if ((0x0 == subpcode) || (0xff == subpcode))
1243 len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
1244 if ((0x1 == subpcode) || (0xff == subpcode))
1245 len += resp_sas_pcd_m_spg(ap + len, pcontrol, target,
1247 if ((0x2 == subpcode) || (0xff == subpcode))
1248 len += resp_sas_sha_m_spg(ap + len, pcontrol);
1251 case 0x1c: /* Informational Exceptions Mode page, all devices */
1252 len = resp_iec_m_pg(ap, pcontrol, target);
1255 case 0x3f: /* Read all Mode pages */
1256 if ((0 == subpcode) || (0xff == subpcode)) {
1257 len = resp_err_recov_pg(ap, pcontrol, target);
1258 len += resp_disconnect_pg(ap + len, pcontrol, target);
1259 len += resp_format_pg(ap + len, pcontrol, target);
1260 len += resp_caching_pg(ap + len, pcontrol, target);
1261 len += resp_ctrl_m_pg(ap + len, pcontrol, target);
1262 len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
1263 if (0xff == subpcode) {
1264 len += resp_sas_pcd_m_spg(ap + len, pcontrol,
1265 target, target_dev_id);
1266 len += resp_sas_sha_m_spg(ap + len, pcontrol);
1268 len += resp_iec_m_pg(ap + len, pcontrol, target);
1270 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1271 INVALID_FIELD_IN_CDB, 0);
1272 return check_condition_result;
1277 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1279 return check_condition_result;
1282 arr[0] = offset - 1;
1284 arr[0] = ((offset - 2) >> 8) & 0xff;
1285 arr[1] = (offset - 2) & 0xff;
1287 return fill_from_dev_buffer(scp, arr, min(alloc_len, offset));
1290 #define SDEBUG_MAX_MSELECT_SZ 512
1292 static int resp_mode_select(struct scsi_cmnd * scp, int mselect6,
1293 struct sdebug_dev_info * devip)
1295 int pf, sp, ps, md_len, bd_len, off, spf, pg_len;
1296 int param_len, res, errsts, mpage;
1297 unsigned char arr[SDEBUG_MAX_MSELECT_SZ];
1298 unsigned char *cmd = (unsigned char *)scp->cmnd;
1300 if ((errsts = check_readiness(scp, 1, devip)))
1302 memset(arr, 0, sizeof(arr));
1305 param_len = mselect6 ? cmd[4] : ((cmd[7] << 8) + cmd[8]);
1306 if ((0 == pf) || sp || (param_len > SDEBUG_MAX_MSELECT_SZ)) {
1307 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1308 INVALID_FIELD_IN_CDB, 0);
1309 return check_condition_result;
1311 res = fetch_to_dev_buffer(scp, arr, param_len);
1313 return (DID_ERROR << 16);
1314 else if ((res < param_len) &&
1315 (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
1316 printk(KERN_INFO "scsi_debug: mode_select: cdb indicated=%d, "
1317 " IO sent=%d bytes\n", param_len, res);
1318 md_len = mselect6 ? (arr[0] + 1) : ((arr[0] << 8) + arr[1] + 2);
1319 bd_len = mselect6 ? arr[3] : ((arr[6] << 8) + arr[7]);
1321 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1322 INVALID_FIELD_IN_PARAM_LIST, 0);
1323 return check_condition_result;
1325 off = bd_len + (mselect6 ? 4 : 8);
1326 mpage = arr[off] & 0x3f;
1327 ps = !!(arr[off] & 0x80);
1329 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1330 INVALID_FIELD_IN_PARAM_LIST, 0);
1331 return check_condition_result;
1333 spf = !!(arr[off] & 0x40);
1334 pg_len = spf ? ((arr[off + 2] << 8) + arr[off + 3] + 4) :
1336 if ((pg_len + off) > param_len) {
1337 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1338 PARAMETER_LIST_LENGTH_ERR, 0);
1339 return check_condition_result;
1342 case 0xa: /* Control Mode page */
1343 if (ctrl_m_pg[1] == arr[off + 1]) {
1344 memcpy(ctrl_m_pg + 2, arr + off + 2,
1345 sizeof(ctrl_m_pg) - 2);
1346 scsi_debug_dsense = !!(ctrl_m_pg[2] & 0x4);
1350 case 0x1c: /* Informational Exceptions Mode page */
1351 if (iec_m_pg[1] == arr[off + 1]) {
1352 memcpy(iec_m_pg + 2, arr + off + 2,
1353 sizeof(iec_m_pg) - 2);
1360 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1361 INVALID_FIELD_IN_PARAM_LIST, 0);
1362 return check_condition_result;
1365 static int resp_temp_l_pg(unsigned char * arr)
1367 unsigned char temp_l_pg[] = {0x0, 0x0, 0x3, 0x2, 0x0, 38,
1368 0x0, 0x1, 0x3, 0x2, 0x0, 65,
1371 memcpy(arr, temp_l_pg, sizeof(temp_l_pg));
1372 return sizeof(temp_l_pg);
1375 static int resp_ie_l_pg(unsigned char * arr)
1377 unsigned char ie_l_pg[] = {0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 38,
1380 memcpy(arr, ie_l_pg, sizeof(ie_l_pg));
1381 if (iec_m_pg[2] & 0x4) { /* TEST bit set */
1382 arr[4] = THRESHOLD_EXCEEDED;
1385 return sizeof(ie_l_pg);
1388 #define SDEBUG_MAX_LSENSE_SZ 512
1390 static int resp_log_sense(struct scsi_cmnd * scp,
1391 struct sdebug_dev_info * devip)
1393 int ppc, sp, pcontrol, pcode, subpcode, alloc_len, errsts, len, n;
1394 unsigned char arr[SDEBUG_MAX_LSENSE_SZ];
1395 unsigned char *cmd = (unsigned char *)scp->cmnd;
1397 if ((errsts = check_readiness(scp, 1, devip)))
1399 memset(arr, 0, sizeof(arr));
1403 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1404 INVALID_FIELD_IN_CDB, 0);
1405 return check_condition_result;
1407 pcontrol = (cmd[2] & 0xc0) >> 6;
1408 pcode = cmd[2] & 0x3f;
1409 subpcode = cmd[3] & 0xff;
1410 alloc_len = (cmd[7] << 8) + cmd[8];
1412 if (0 == subpcode) {
1414 case 0x0: /* Supported log pages log page */
1416 arr[n++] = 0x0; /* this page */
1417 arr[n++] = 0xd; /* Temperature */
1418 arr[n++] = 0x2f; /* Informational exceptions */
1421 case 0xd: /* Temperature log page */
1422 arr[3] = resp_temp_l_pg(arr + 4);
1424 case 0x2f: /* Informational exceptions log page */
1425 arr[3] = resp_ie_l_pg(arr + 4);
1428 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1429 INVALID_FIELD_IN_CDB, 0);
1430 return check_condition_result;
1432 } else if (0xff == subpcode) {
1436 case 0x0: /* Supported log pages and subpages log page */
1439 arr[n++] = 0x0; /* 0,0 page */
1441 arr[n++] = 0xff; /* this page */
1443 arr[n++] = 0x0; /* Temperature */
1445 arr[n++] = 0x0; /* Informational exceptions */
1448 case 0xd: /* Temperature subpages */
1451 arr[n++] = 0x0; /* Temperature */
1454 case 0x2f: /* Informational exceptions subpages */
1457 arr[n++] = 0x0; /* Informational exceptions */
1461 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1462 INVALID_FIELD_IN_CDB, 0);
1463 return check_condition_result;
1466 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1467 INVALID_FIELD_IN_CDB, 0);
1468 return check_condition_result;
1470 len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len);
1471 return fill_from_dev_buffer(scp, arr,
1472 min(len, SDEBUG_MAX_INQ_ARR_SZ));
1475 static int resp_read(struct scsi_cmnd * SCpnt, unsigned long long lba,
1476 unsigned int num, struct sdebug_dev_info * devip)
1478 unsigned long iflags;
1479 unsigned int block, from_bottom;
1480 unsigned long long u;
1483 if (lba + num > sdebug_capacity) {
1484 mk_sense_buffer(devip, ILLEGAL_REQUEST, ADDR_OUT_OF_RANGE,
1486 return check_condition_result;
1488 /* transfer length excessive (tie in to block limits VPD page) */
1489 if (num > sdebug_store_sectors) {
1490 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1492 return check_condition_result;
1494 if ((SCSI_DEBUG_OPT_MEDIUM_ERR & scsi_debug_opts) &&
1495 (lba <= OPT_MEDIUM_ERR_ADDR) &&
1496 ((lba + num) > OPT_MEDIUM_ERR_ADDR)) {
1497 /* claim unrecoverable read error */
1498 mk_sense_buffer(devip, MEDIUM_ERROR, UNRECOVERED_READ_ERR,
1500 /* set info field and valid bit for fixed descriptor */
1501 if (0x70 == (devip->sense_buff[0] & 0x7f)) {
1502 devip->sense_buff[0] |= 0x80; /* Valid bit */
1503 ret = OPT_MEDIUM_ERR_ADDR;
1504 devip->sense_buff[3] = (ret >> 24) & 0xff;
1505 devip->sense_buff[4] = (ret >> 16) & 0xff;
1506 devip->sense_buff[5] = (ret >> 8) & 0xff;
1507 devip->sense_buff[6] = ret & 0xff;
1509 return check_condition_result;
1511 read_lock_irqsave(&atomic_rw, iflags);
1512 if ((lba + num) <= sdebug_store_sectors)
1513 ret = fill_from_dev_buffer(SCpnt,
1514 fake_storep + (lba * SECT_SIZE),
1517 /* modulo when one arg is 64 bits needs do_div() */
1519 block = do_div(u, sdebug_store_sectors);
1521 if ((block + num) > sdebug_store_sectors)
1522 from_bottom = (block + num) - sdebug_store_sectors;
1523 ret = fill_from_dev_buffer(SCpnt,
1524 fake_storep + (block * SECT_SIZE),
1525 (num - from_bottom) * SECT_SIZE);
1526 if ((0 == ret) && (from_bottom > 0))
1527 ret = fill_from_dev_buffer(SCpnt, fake_storep,
1528 from_bottom * SECT_SIZE);
1530 read_unlock_irqrestore(&atomic_rw, iflags);
1534 static int resp_write(struct scsi_cmnd * SCpnt, unsigned long long lba,
1535 unsigned int num, struct sdebug_dev_info * devip)
1537 unsigned long iflags;
1538 unsigned int block, to_bottom;
1539 unsigned long long u;
1542 if (lba + num > sdebug_capacity) {
1543 mk_sense_buffer(devip, ILLEGAL_REQUEST, ADDR_OUT_OF_RANGE,
1545 return check_condition_result;
1547 /* transfer length excessive (tie in to block limits VPD page) */
1548 if (num > sdebug_store_sectors) {
1549 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1551 return check_condition_result;
1554 write_lock_irqsave(&atomic_rw, iflags);
1555 if ((lba + num) <= sdebug_store_sectors)
1556 res = fetch_to_dev_buffer(SCpnt,
1557 fake_storep + (lba * SECT_SIZE),
1560 /* modulo when one arg is 64 bits needs do_div() */
1562 block = do_div(u, sdebug_store_sectors);
1564 if ((block + num) > sdebug_store_sectors)
1565 to_bottom = (block + num) - sdebug_store_sectors;
1566 res = fetch_to_dev_buffer(SCpnt,
1567 fake_storep + (block * SECT_SIZE),
1568 (num - to_bottom) * SECT_SIZE);
1569 if ((0 == res) && (to_bottom > 0))
1570 res = fetch_to_dev_buffer(SCpnt, fake_storep,
1571 to_bottom * SECT_SIZE);
1573 write_unlock_irqrestore(&atomic_rw, iflags);
1575 return (DID_ERROR << 16);
1576 else if ((res < (num * SECT_SIZE)) &&
1577 (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
1578 printk(KERN_INFO "scsi_debug: write: cdb indicated=%u, "
1579 " IO sent=%d bytes\n", num * SECT_SIZE, res);
1583 #define SDEBUG_RLUN_ARR_SZ 256
1585 static int resp_report_luns(struct scsi_cmnd * scp,
1586 struct sdebug_dev_info * devip)
1588 unsigned int alloc_len;
1589 int lun_cnt, i, upper, num, n, wlun, lun;
1590 unsigned char *cmd = (unsigned char *)scp->cmnd;
1591 int select_report = (int)cmd[2];
1592 struct scsi_lun *one_lun;
1593 unsigned char arr[SDEBUG_RLUN_ARR_SZ];
1594 unsigned char * max_addr;
1596 alloc_len = cmd[9] + (cmd[8] << 8) + (cmd[7] << 16) + (cmd[6] << 24);
1597 if ((alloc_len < 4) || (select_report > 2)) {
1598 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1600 return check_condition_result;
1602 /* can produce response with up to 16k luns (lun 0 to lun 16383) */
1603 memset(arr, 0, SDEBUG_RLUN_ARR_SZ);
1604 lun_cnt = scsi_debug_max_luns;
1605 if (1 == select_report)
1607 else if (scsi_debug_no_lun_0 && (lun_cnt > 0))
1609 wlun = (select_report > 0) ? 1 : 0;
1610 num = lun_cnt + wlun;
1611 arr[2] = ((sizeof(struct scsi_lun) * num) >> 8) & 0xff;
1612 arr[3] = (sizeof(struct scsi_lun) * num) & 0xff;
1613 n = min((int)((SDEBUG_RLUN_ARR_SZ - 8) /
1614 sizeof(struct scsi_lun)), num);
1619 one_lun = (struct scsi_lun *) &arr[8];
1620 max_addr = arr + SDEBUG_RLUN_ARR_SZ;
1621 for (i = 0, lun = (scsi_debug_no_lun_0 ? 1 : 0);
1622 ((i < lun_cnt) && ((unsigned char *)(one_lun + i) < max_addr));
1624 upper = (lun >> 8) & 0x3f;
1626 one_lun[i].scsi_lun[0] =
1627 (upper | (SAM2_LUN_ADDRESS_METHOD << 6));
1628 one_lun[i].scsi_lun[1] = lun & 0xff;
1631 one_lun[i].scsi_lun[0] = (SAM2_WLUN_REPORT_LUNS >> 8) & 0xff;
1632 one_lun[i].scsi_lun[1] = SAM2_WLUN_REPORT_LUNS & 0xff;
1635 alloc_len = (unsigned char *)(one_lun + i) - arr;
1636 return fill_from_dev_buffer(scp, arr,
1637 min((int)alloc_len, SDEBUG_RLUN_ARR_SZ));
1640 static int resp_xdwriteread(struct scsi_cmnd *scp, unsigned long long lba,
1641 unsigned int num, struct sdebug_dev_info *devip)
1644 unsigned char *kaddr, *buf;
1645 unsigned int offset;
1646 struct scatterlist *sg;
1647 struct scsi_data_buffer *sdb = scsi_in(scp);
1649 /* better not to use temporary buffer. */
1650 buf = kmalloc(scsi_bufflen(scp), GFP_ATOMIC);
1654 scsi_sg_copy_to_buffer(scp, buf, scsi_bufflen(scp));
1657 for_each_sg(sdb->table.sgl, sg, sdb->table.nents, i) {
1658 kaddr = (unsigned char *)kmap_atomic(sg_page(sg), KM_USER0);
1662 for (j = 0; j < sg->length; j++)
1663 *(kaddr + sg->offset + j) ^= *(buf + offset + j);
1665 offset += sg->length;
1666 kunmap_atomic(kaddr, KM_USER0);
1675 /* When timer goes off this function is called. */
1676 static void timer_intr_handler(unsigned long indx)
1678 struct sdebug_queued_cmd * sqcp;
1679 unsigned long iflags;
1681 if (indx >= SCSI_DEBUG_CANQUEUE) {
1682 printk(KERN_ERR "scsi_debug:timer_intr_handler: indx too "
1686 spin_lock_irqsave(&queued_arr_lock, iflags);
1687 sqcp = &queued_arr[(int)indx];
1688 if (! sqcp->in_use) {
1689 printk(KERN_ERR "scsi_debug:timer_intr_handler: Unexpected "
1691 spin_unlock_irqrestore(&queued_arr_lock, iflags);
1695 if (sqcp->done_funct) {
1696 sqcp->a_cmnd->result = sqcp->scsi_result;
1697 sqcp->done_funct(sqcp->a_cmnd); /* callback to mid level */
1699 sqcp->done_funct = NULL;
1700 spin_unlock_irqrestore(&queued_arr_lock, iflags);
1703 static int scsi_debug_slave_alloc(struct scsi_device * sdp)
1705 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1706 printk(KERN_INFO "scsi_debug: slave_alloc <%u %u %u %u>\n",
1707 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
1708 set_bit(QUEUE_FLAG_BIDI, &sdp->request_queue->queue_flags);
1712 static int scsi_debug_slave_configure(struct scsi_device * sdp)
1714 struct sdebug_dev_info * devip;
1716 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1717 printk(KERN_INFO "scsi_debug: slave_configure <%u %u %u %u>\n",
1718 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
1719 if (sdp->host->max_cmd_len != SCSI_DEBUG_MAX_CMD_LEN)
1720 sdp->host->max_cmd_len = SCSI_DEBUG_MAX_CMD_LEN;
1721 devip = devInfoReg(sdp);
1723 return 1; /* no resources, will be marked offline */
1724 sdp->hostdata = devip;
1725 if (sdp->host->cmd_per_lun)
1726 scsi_adjust_queue_depth(sdp, SDEBUG_TAGGED_QUEUING,
1727 sdp->host->cmd_per_lun);
1728 blk_queue_max_segment_size(sdp->request_queue, 256 * 1024);
1732 static void scsi_debug_slave_destroy(struct scsi_device * sdp)
1734 struct sdebug_dev_info * devip =
1735 (struct sdebug_dev_info *)sdp->hostdata;
1737 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1738 printk(KERN_INFO "scsi_debug: slave_destroy <%u %u %u %u>\n",
1739 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
1741 /* make this slot avaliable for re-use */
1743 sdp->hostdata = NULL;
1747 struct sdebug_dev_info *sdebug_device_create(struct sdebug_host_info *sdbg_host,
1750 struct sdebug_dev_info *devip;
1752 devip = kzalloc(sizeof(*devip), flags);
1754 devip->sdbg_host = sdbg_host;
1755 list_add_tail(&devip->dev_list, &sdbg_host->dev_info_list);
1760 static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev)
1762 struct sdebug_host_info * sdbg_host;
1763 struct sdebug_dev_info * open_devip = NULL;
1764 struct sdebug_dev_info * devip =
1765 (struct sdebug_dev_info *)sdev->hostdata;
1769 sdbg_host = *(struct sdebug_host_info **)shost_priv(sdev->host);
1771 printk(KERN_ERR "Host info NULL\n");
1774 list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) {
1775 if ((devip->used) && (devip->channel == sdev->channel) &&
1776 (devip->target == sdev->id) &&
1777 (devip->lun == sdev->lun))
1780 if ((!devip->used) && (!open_devip))
1784 if (!open_devip) { /* try and make a new one */
1785 open_devip = sdebug_device_create(sdbg_host, GFP_ATOMIC);
1787 printk(KERN_ERR "%s: out of memory at line %d\n",
1788 __FUNCTION__, __LINE__);
1793 open_devip->channel = sdev->channel;
1794 open_devip->target = sdev->id;
1795 open_devip->lun = sdev->lun;
1796 open_devip->sdbg_host = sdbg_host;
1797 open_devip->reset = 1;
1798 open_devip->used = 1;
1799 memset(open_devip->sense_buff, 0, SDEBUG_SENSE_LEN);
1800 if (scsi_debug_dsense)
1801 open_devip->sense_buff[0] = 0x72;
1803 open_devip->sense_buff[0] = 0x70;
1804 open_devip->sense_buff[7] = 0xa;
1806 if (sdev->lun == SAM2_WLUN_REPORT_LUNS)
1807 open_devip->wlun = SAM2_WLUN_REPORT_LUNS & 0xff;
1812 static void mk_sense_buffer(struct sdebug_dev_info * devip, int key,
1815 unsigned char *sbuff;
1817 sbuff = devip->sense_buff;
1818 memset(sbuff, 0, SDEBUG_SENSE_LEN);
1820 scsi_build_sense_buffer(scsi_debug_dsense, sbuff, key, asc, asq);
1822 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1823 printk(KERN_INFO "scsi_debug: [sense_key,asc,ascq]: "
1824 "[0x%x,0x%x,0x%x]\n", key, asc, asq);
1827 static int scsi_debug_abort(struct scsi_cmnd * SCpnt)
1829 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1830 printk(KERN_INFO "scsi_debug: abort\n");
1832 stop_queued_cmnd(SCpnt);
1836 static int scsi_debug_biosparam(struct scsi_device *sdev,
1837 struct block_device * bdev, sector_t capacity, int *info)
1842 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1843 printk(KERN_INFO "scsi_debug: biosparam\n");
1844 buf = scsi_bios_ptable(bdev);
1846 res = scsi_partsize(buf, capacity,
1847 &info[2], &info[0], &info[1]);
1852 info[0] = sdebug_heads;
1853 info[1] = sdebug_sectors_per;
1854 info[2] = sdebug_cylinders_per;
1858 static int scsi_debug_device_reset(struct scsi_cmnd * SCpnt)
1860 struct sdebug_dev_info * devip;
1862 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1863 printk(KERN_INFO "scsi_debug: device_reset\n");
1866 devip = devInfoReg(SCpnt->device);
1873 static int scsi_debug_bus_reset(struct scsi_cmnd * SCpnt)
1875 struct sdebug_host_info *sdbg_host;
1876 struct sdebug_dev_info * dev_info;
1877 struct scsi_device * sdp;
1878 struct Scsi_Host * hp;
1880 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1881 printk(KERN_INFO "scsi_debug: bus_reset\n");
1883 if (SCpnt && ((sdp = SCpnt->device)) && ((hp = sdp->host))) {
1884 sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
1886 list_for_each_entry(dev_info,
1887 &sdbg_host->dev_info_list,
1889 dev_info->reset = 1;
1895 static int scsi_debug_host_reset(struct scsi_cmnd * SCpnt)
1897 struct sdebug_host_info * sdbg_host;
1898 struct sdebug_dev_info * dev_info;
1900 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1901 printk(KERN_INFO "scsi_debug: host_reset\n");
1903 spin_lock(&sdebug_host_list_lock);
1904 list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
1905 list_for_each_entry(dev_info, &sdbg_host->dev_info_list,
1907 dev_info->reset = 1;
1909 spin_unlock(&sdebug_host_list_lock);
1914 /* Returns 1 if found 'cmnd' and deleted its timer. else returns 0 */
1915 static int stop_queued_cmnd(struct scsi_cmnd * cmnd)
1917 unsigned long iflags;
1919 struct sdebug_queued_cmd * sqcp;
1921 spin_lock_irqsave(&queued_arr_lock, iflags);
1922 for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
1923 sqcp = &queued_arr[k];
1924 if (sqcp->in_use && (cmnd == sqcp->a_cmnd)) {
1925 del_timer_sync(&sqcp->cmnd_timer);
1927 sqcp->a_cmnd = NULL;
1931 spin_unlock_irqrestore(&queued_arr_lock, iflags);
1932 return (k < SCSI_DEBUG_CANQUEUE) ? 1 : 0;
1935 /* Deletes (stops) timers of all queued commands */
1936 static void stop_all_queued(void)
1938 unsigned long iflags;
1940 struct sdebug_queued_cmd * sqcp;
1942 spin_lock_irqsave(&queued_arr_lock, iflags);
1943 for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
1944 sqcp = &queued_arr[k];
1945 if (sqcp->in_use && sqcp->a_cmnd) {
1946 del_timer_sync(&sqcp->cmnd_timer);
1948 sqcp->a_cmnd = NULL;
1951 spin_unlock_irqrestore(&queued_arr_lock, iflags);
1954 /* Initializes timers in queued array */
1955 static void __init init_all_queued(void)
1957 unsigned long iflags;
1959 struct sdebug_queued_cmd * sqcp;
1961 spin_lock_irqsave(&queued_arr_lock, iflags);
1962 for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
1963 sqcp = &queued_arr[k];
1964 init_timer(&sqcp->cmnd_timer);
1966 sqcp->a_cmnd = NULL;
1968 spin_unlock_irqrestore(&queued_arr_lock, iflags);
1971 static void __init sdebug_build_parts(unsigned char *ramp,
1972 unsigned int store_size)
1974 struct partition * pp;
1975 int starts[SDEBUG_MAX_PARTS + 2];
1976 int sectors_per_part, num_sectors, k;
1977 int heads_by_sects, start_sec, end_sec;
1979 /* assume partition table already zeroed */
1980 if ((scsi_debug_num_parts < 1) || (store_size < 1048576))
1982 if (scsi_debug_num_parts > SDEBUG_MAX_PARTS) {
1983 scsi_debug_num_parts = SDEBUG_MAX_PARTS;
1984 printk(KERN_WARNING "scsi_debug:build_parts: reducing "
1985 "partitions to %d\n", SDEBUG_MAX_PARTS);
1987 num_sectors = (int)sdebug_store_sectors;
1988 sectors_per_part = (num_sectors - sdebug_sectors_per)
1989 / scsi_debug_num_parts;
1990 heads_by_sects = sdebug_heads * sdebug_sectors_per;
1991 starts[0] = sdebug_sectors_per;
1992 for (k = 1; k < scsi_debug_num_parts; ++k)
1993 starts[k] = ((k * sectors_per_part) / heads_by_sects)
1995 starts[scsi_debug_num_parts] = num_sectors;
1996 starts[scsi_debug_num_parts + 1] = 0;
1998 ramp[510] = 0x55; /* magic partition markings */
2000 pp = (struct partition *)(ramp + 0x1be);
2001 for (k = 0; starts[k + 1]; ++k, ++pp) {
2002 start_sec = starts[k];
2003 end_sec = starts[k + 1] - 1;
2006 pp->cyl = start_sec / heads_by_sects;
2007 pp->head = (start_sec - (pp->cyl * heads_by_sects))
2008 / sdebug_sectors_per;
2009 pp->sector = (start_sec % sdebug_sectors_per) + 1;
2011 pp->end_cyl = end_sec / heads_by_sects;
2012 pp->end_head = (end_sec - (pp->end_cyl * heads_by_sects))
2013 / sdebug_sectors_per;
2014 pp->end_sector = (end_sec % sdebug_sectors_per) + 1;
2016 pp->start_sect = start_sec;
2017 pp->nr_sects = end_sec - start_sec + 1;
2018 pp->sys_ind = 0x83; /* plain Linux partition */
2022 static int schedule_resp(struct scsi_cmnd * cmnd,
2023 struct sdebug_dev_info * devip,
2024 done_funct_t done, int scsi_result, int delta_jiff)
2026 if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) && cmnd) {
2028 struct scsi_device * sdp = cmnd->device;
2030 printk(KERN_INFO "scsi_debug: <%u %u %u %u> "
2031 "non-zero result=0x%x\n", sdp->host->host_no,
2032 sdp->channel, sdp->id, sdp->lun, scsi_result);
2035 if (cmnd && devip) {
2036 /* simulate autosense by this driver */
2037 if (SAM_STAT_CHECK_CONDITION == (scsi_result & 0xff))
2038 memcpy(cmnd->sense_buffer, devip->sense_buff,
2039 (SCSI_SENSE_BUFFERSIZE > SDEBUG_SENSE_LEN) ?
2040 SDEBUG_SENSE_LEN : SCSI_SENSE_BUFFERSIZE);
2042 if (delta_jiff <= 0) {
2044 cmnd->result = scsi_result;
2049 unsigned long iflags;
2051 struct sdebug_queued_cmd * sqcp = NULL;
2053 spin_lock_irqsave(&queued_arr_lock, iflags);
2054 for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
2055 sqcp = &queued_arr[k];
2059 if (k >= SCSI_DEBUG_CANQUEUE) {
2060 spin_unlock_irqrestore(&queued_arr_lock, iflags);
2061 printk(KERN_WARNING "scsi_debug: can_queue exceeded\n");
2062 return 1; /* report busy to mid level */
2065 sqcp->a_cmnd = cmnd;
2066 sqcp->scsi_result = scsi_result;
2067 sqcp->done_funct = done;
2068 sqcp->cmnd_timer.function = timer_intr_handler;
2069 sqcp->cmnd_timer.data = k;
2070 sqcp->cmnd_timer.expires = jiffies + delta_jiff;
2071 add_timer(&sqcp->cmnd_timer);
2072 spin_unlock_irqrestore(&queued_arr_lock, iflags);
2079 /* Note: The following macros create attribute files in the
2080 /sys/module/scsi_debug/parameters directory. Unfortunately this
2081 driver is unaware of a change and cannot trigger auxiliary actions
2082 as it can when the corresponding attribute in the
2083 /sys/bus/pseudo/drivers/scsi_debug directory is changed.
2085 module_param_named(add_host, scsi_debug_add_host, int, S_IRUGO | S_IWUSR);
2086 module_param_named(delay, scsi_debug_delay, int, S_IRUGO | S_IWUSR);
2087 module_param_named(dev_size_mb, scsi_debug_dev_size_mb, int, S_IRUGO);
2088 module_param_named(dsense, scsi_debug_dsense, int, S_IRUGO | S_IWUSR);
2089 module_param_named(every_nth, scsi_debug_every_nth, int, S_IRUGO | S_IWUSR);
2090 module_param_named(fake_rw, scsi_debug_fake_rw, int, S_IRUGO | S_IWUSR);
2091 module_param_named(max_luns, scsi_debug_max_luns, int, S_IRUGO | S_IWUSR);
2092 module_param_named(no_lun_0, scsi_debug_no_lun_0, int, S_IRUGO | S_IWUSR);
2093 module_param_named(num_parts, scsi_debug_num_parts, int, S_IRUGO);
2094 module_param_named(num_tgts, scsi_debug_num_tgts, int, S_IRUGO | S_IWUSR);
2095 module_param_named(opts, scsi_debug_opts, int, S_IRUGO | S_IWUSR);
2096 module_param_named(ptype, scsi_debug_ptype, int, S_IRUGO | S_IWUSR);
2097 module_param_named(scsi_level, scsi_debug_scsi_level, int, S_IRUGO);
2098 module_param_named(virtual_gb, scsi_debug_virtual_gb, int, S_IRUGO | S_IWUSR);
2099 module_param_named(vpd_use_hostno, scsi_debug_vpd_use_hostno, int,
2102 MODULE_AUTHOR("Eric Youngdale + Douglas Gilbert");
2103 MODULE_DESCRIPTION("SCSI debug adapter driver");
2104 MODULE_LICENSE("GPL");
2105 MODULE_VERSION(SCSI_DEBUG_VERSION);
2107 MODULE_PARM_DESC(add_host, "0..127 hosts allowed(def=1)");
2108 MODULE_PARM_DESC(delay, "# of jiffies to delay response(def=1)");
2109 MODULE_PARM_DESC(dev_size_mb, "size in MB of ram shared by devs(def=8)");
2110 MODULE_PARM_DESC(dsense, "use descriptor sense format(def=0 -> fixed)");
2111 MODULE_PARM_DESC(every_nth, "timeout every nth command(def=0)");
2112 MODULE_PARM_DESC(fake_rw, "fake reads/writes instead of copying (def=0)");
2113 MODULE_PARM_DESC(max_luns, "number of LUNs per target to simulate(def=1)");
2114 MODULE_PARM_DESC(no_lun_0, "no LU number 0 (def=0 -> have lun 0)");
2115 MODULE_PARM_DESC(num_parts, "number of partitions(def=0)");
2116 MODULE_PARM_DESC(num_tgts, "number of targets per host to simulate(def=1)");
2117 MODULE_PARM_DESC(opts, "1->noise, 2->medium_err, 4->timeout, 8->recovered_err... (def=0)");
2118 MODULE_PARM_DESC(ptype, "SCSI peripheral type(def=0[disk])");
2119 MODULE_PARM_DESC(scsi_level, "SCSI level to simulate(def=5[SPC-3])");
2120 MODULE_PARM_DESC(virtual_gb, "virtual gigabyte size (def=0 -> use dev_size_mb)");
2121 MODULE_PARM_DESC(vpd_use_hostno, "0 -> dev ids ignore hostno (def=1 -> unique dev ids)");
2124 static char sdebug_info[256];
2126 static const char * scsi_debug_info(struct Scsi_Host * shp)
2128 sprintf(sdebug_info, "scsi_debug, version %s [%s], "
2129 "dev_size_mb=%d, opts=0x%x", SCSI_DEBUG_VERSION,
2130 scsi_debug_version_date, scsi_debug_dev_size_mb,
2135 /* scsi_debug_proc_info
2136 * Used if the driver currently has no own support for /proc/scsi
2138 static int scsi_debug_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset,
2139 int length, int inout)
2141 int len, pos, begin;
2144 orig_length = length;
2148 int minLen = length > 15 ? 15 : length;
2150 if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
2152 memcpy(arr, buffer, minLen);
2154 if (1 != sscanf(arr, "%d", &pos))
2156 scsi_debug_opts = pos;
2157 if (scsi_debug_every_nth != 0)
2158 scsi_debug_cmnd_count = 0;
2162 pos = len = sprintf(buffer, "scsi_debug adapter driver, version "
2164 "num_tgts=%d, shared (ram) size=%d MB, opts=0x%x, "
2165 "every_nth=%d(curr:%d)\n"
2166 "delay=%d, max_luns=%d, scsi_level=%d\n"
2167 "sector_size=%d bytes, cylinders=%d, heads=%d, sectors=%d\n"
2168 "number of aborts=%d, device_reset=%d, bus_resets=%d, "
2170 SCSI_DEBUG_VERSION, scsi_debug_version_date, scsi_debug_num_tgts,
2171 scsi_debug_dev_size_mb, scsi_debug_opts, scsi_debug_every_nth,
2172 scsi_debug_cmnd_count, scsi_debug_delay,
2173 scsi_debug_max_luns, scsi_debug_scsi_level,
2174 SECT_SIZE, sdebug_cylinders_per, sdebug_heads, sdebug_sectors_per,
2175 num_aborts, num_dev_resets, num_bus_resets, num_host_resets);
2180 *start = buffer + (offset - begin); /* Start of wanted data */
2181 len -= (offset - begin);
2187 static ssize_t sdebug_delay_show(struct device_driver * ddp, char * buf)
2189 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_delay);
2192 static ssize_t sdebug_delay_store(struct device_driver * ddp,
2193 const char * buf, size_t count)
2198 if (1 == sscanf(buf, "%10s", work)) {
2199 if ((1 == sscanf(work, "%d", &delay)) && (delay >= 0)) {
2200 scsi_debug_delay = delay;
2206 DRIVER_ATTR(delay, S_IRUGO | S_IWUSR, sdebug_delay_show,
2207 sdebug_delay_store);
2209 static ssize_t sdebug_opts_show(struct device_driver * ddp, char * buf)
2211 return scnprintf(buf, PAGE_SIZE, "0x%x\n", scsi_debug_opts);
2214 static ssize_t sdebug_opts_store(struct device_driver * ddp,
2215 const char * buf, size_t count)
2220 if (1 == sscanf(buf, "%10s", work)) {
2221 if (0 == strnicmp(work,"0x", 2)) {
2222 if (1 == sscanf(&work[2], "%x", &opts))
2225 if (1 == sscanf(work, "%d", &opts))
2231 scsi_debug_opts = opts;
2232 scsi_debug_cmnd_count = 0;
2235 DRIVER_ATTR(opts, S_IRUGO | S_IWUSR, sdebug_opts_show,
2238 static ssize_t sdebug_ptype_show(struct device_driver * ddp, char * buf)
2240 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_ptype);
2242 static ssize_t sdebug_ptype_store(struct device_driver * ddp,
2243 const char * buf, size_t count)
2247 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2248 scsi_debug_ptype = n;
2253 DRIVER_ATTR(ptype, S_IRUGO | S_IWUSR, sdebug_ptype_show, sdebug_ptype_store);
2255 static ssize_t sdebug_dsense_show(struct device_driver * ddp, char * buf)
2257 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dsense);
2259 static ssize_t sdebug_dsense_store(struct device_driver * ddp,
2260 const char * buf, size_t count)
2264 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2265 scsi_debug_dsense = n;
2270 DRIVER_ATTR(dsense, S_IRUGO | S_IWUSR, sdebug_dsense_show,
2271 sdebug_dsense_store);
2273 static ssize_t sdebug_fake_rw_show(struct device_driver * ddp, char * buf)
2275 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_fake_rw);
2277 static ssize_t sdebug_fake_rw_store(struct device_driver * ddp,
2278 const char * buf, size_t count)
2282 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2283 scsi_debug_fake_rw = n;
2288 DRIVER_ATTR(fake_rw, S_IRUGO | S_IWUSR, sdebug_fake_rw_show,
2289 sdebug_fake_rw_store);
2291 static ssize_t sdebug_no_lun_0_show(struct device_driver * ddp, char * buf)
2293 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_no_lun_0);
2295 static ssize_t sdebug_no_lun_0_store(struct device_driver * ddp,
2296 const char * buf, size_t count)
2300 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2301 scsi_debug_no_lun_0 = n;
2306 DRIVER_ATTR(no_lun_0, S_IRUGO | S_IWUSR, sdebug_no_lun_0_show,
2307 sdebug_no_lun_0_store);
2309 static ssize_t sdebug_num_tgts_show(struct device_driver * ddp, char * buf)
2311 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_num_tgts);
2313 static ssize_t sdebug_num_tgts_store(struct device_driver * ddp,
2314 const char * buf, size_t count)
2318 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2319 scsi_debug_num_tgts = n;
2320 sdebug_max_tgts_luns();
2325 DRIVER_ATTR(num_tgts, S_IRUGO | S_IWUSR, sdebug_num_tgts_show,
2326 sdebug_num_tgts_store);
2328 static ssize_t sdebug_dev_size_mb_show(struct device_driver * ddp, char * buf)
2330 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dev_size_mb);
2332 DRIVER_ATTR(dev_size_mb, S_IRUGO, sdebug_dev_size_mb_show, NULL);
2334 static ssize_t sdebug_num_parts_show(struct device_driver * ddp, char * buf)
2336 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_num_parts);
2338 DRIVER_ATTR(num_parts, S_IRUGO, sdebug_num_parts_show, NULL);
2340 static ssize_t sdebug_every_nth_show(struct device_driver * ddp, char * buf)
2342 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_every_nth);
2344 static ssize_t sdebug_every_nth_store(struct device_driver * ddp,
2345 const char * buf, size_t count)
2349 if ((count > 0) && (1 == sscanf(buf, "%d", &nth))) {
2350 scsi_debug_every_nth = nth;
2351 scsi_debug_cmnd_count = 0;
2356 DRIVER_ATTR(every_nth, S_IRUGO | S_IWUSR, sdebug_every_nth_show,
2357 sdebug_every_nth_store);
2359 static ssize_t sdebug_max_luns_show(struct device_driver * ddp, char * buf)
2361 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_max_luns);
2363 static ssize_t sdebug_max_luns_store(struct device_driver * ddp,
2364 const char * buf, size_t count)
2368 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2369 scsi_debug_max_luns = n;
2370 sdebug_max_tgts_luns();
2375 DRIVER_ATTR(max_luns, S_IRUGO | S_IWUSR, sdebug_max_luns_show,
2376 sdebug_max_luns_store);
2378 static ssize_t sdebug_scsi_level_show(struct device_driver * ddp, char * buf)
2380 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_scsi_level);
2382 DRIVER_ATTR(scsi_level, S_IRUGO, sdebug_scsi_level_show, NULL);
2384 static ssize_t sdebug_virtual_gb_show(struct device_driver * ddp, char * buf)
2386 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_virtual_gb);
2388 static ssize_t sdebug_virtual_gb_store(struct device_driver * ddp,
2389 const char * buf, size_t count)
2393 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2394 scsi_debug_virtual_gb = n;
2395 if (scsi_debug_virtual_gb > 0) {
2396 sdebug_capacity = 2048 * 1024;
2397 sdebug_capacity *= scsi_debug_virtual_gb;
2399 sdebug_capacity = sdebug_store_sectors;
2404 DRIVER_ATTR(virtual_gb, S_IRUGO | S_IWUSR, sdebug_virtual_gb_show,
2405 sdebug_virtual_gb_store);
2407 static ssize_t sdebug_add_host_show(struct device_driver * ddp, char * buf)
2409 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_add_host);
2412 static ssize_t sdebug_add_host_store(struct device_driver * ddp,
2413 const char * buf, size_t count)
2417 if (sscanf(buf, "%d", &delta_hosts) != 1)
2419 if (delta_hosts > 0) {
2421 sdebug_add_adapter();
2422 } while (--delta_hosts);
2423 } else if (delta_hosts < 0) {
2425 sdebug_remove_adapter();
2426 } while (++delta_hosts);
2430 DRIVER_ATTR(add_host, S_IRUGO | S_IWUSR, sdebug_add_host_show,
2431 sdebug_add_host_store);
2433 static ssize_t sdebug_vpd_use_hostno_show(struct device_driver * ddp,
2436 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_vpd_use_hostno);
2438 static ssize_t sdebug_vpd_use_hostno_store(struct device_driver * ddp,
2439 const char * buf, size_t count)
2443 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2444 scsi_debug_vpd_use_hostno = n;
2449 DRIVER_ATTR(vpd_use_hostno, S_IRUGO | S_IWUSR, sdebug_vpd_use_hostno_show,
2450 sdebug_vpd_use_hostno_store);
2452 /* Note: The following function creates attribute files in the
2453 /sys/bus/pseudo/drivers/scsi_debug directory. The advantage of these
2454 files (over those found in the /sys/module/scsi_debug/parameters
2455 directory) is that auxiliary actions can be triggered when an attribute
2456 is changed. For example see: sdebug_add_host_store() above.
2458 static int do_create_driverfs_files(void)
2462 ret = driver_create_file(&sdebug_driverfs_driver, &driver_attr_add_host);
2463 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_delay);
2464 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dev_size_mb);
2465 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dsense);
2466 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_every_nth);
2467 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_fake_rw);
2468 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_max_luns);
2469 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_no_lun_0);
2470 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_num_parts);
2471 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_num_tgts);
2472 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_ptype);
2473 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_opts);
2474 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_scsi_level);
2475 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_virtual_gb);
2476 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_vpd_use_hostno);
2480 static void do_remove_driverfs_files(void)
2482 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_vpd_use_hostno);
2483 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_virtual_gb);
2484 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_scsi_level);
2485 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_opts);
2486 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_ptype);
2487 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_num_tgts);
2488 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_num_parts);
2489 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_no_lun_0);
2490 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_max_luns);
2491 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_fake_rw);
2492 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_every_nth);
2493 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dsense);
2494 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dev_size_mb);
2495 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_delay);
2496 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_add_host);
2499 static int __init scsi_debug_init(void)
2506 if (scsi_debug_dev_size_mb < 1)
2507 scsi_debug_dev_size_mb = 1; /* force minimum 1 MB ramdisk */
2508 sz = (unsigned int)scsi_debug_dev_size_mb * 1048576;
2509 sdebug_store_sectors = sz / SECT_SIZE;
2510 if (scsi_debug_virtual_gb > 0) {
2511 sdebug_capacity = 2048 * 1024;
2512 sdebug_capacity *= scsi_debug_virtual_gb;
2514 sdebug_capacity = sdebug_store_sectors;
2516 /* play around with geometry, don't waste too much on track 0 */
2518 sdebug_sectors_per = 32;
2519 if (scsi_debug_dev_size_mb >= 16)
2521 else if (scsi_debug_dev_size_mb >= 256)
2523 sdebug_cylinders_per = (unsigned long)sdebug_capacity /
2524 (sdebug_sectors_per * sdebug_heads);
2525 if (sdebug_cylinders_per >= 1024) {
2526 /* other LLDs do this; implies >= 1GB ram disk ... */
2528 sdebug_sectors_per = 63;
2529 sdebug_cylinders_per = (unsigned long)sdebug_capacity /
2530 (sdebug_sectors_per * sdebug_heads);
2533 fake_storep = vmalloc(sz);
2534 if (NULL == fake_storep) {
2535 printk(KERN_ERR "scsi_debug_init: out of memory, 1\n");
2538 memset(fake_storep, 0, sz);
2539 if (scsi_debug_num_parts > 0)
2540 sdebug_build_parts(fake_storep, sz);
2542 ret = device_register(&pseudo_primary);
2544 printk(KERN_WARNING "scsi_debug: device_register error: %d\n",
2548 ret = bus_register(&pseudo_lld_bus);
2550 printk(KERN_WARNING "scsi_debug: bus_register error: %d\n",
2554 ret = driver_register(&sdebug_driverfs_driver);
2556 printk(KERN_WARNING "scsi_debug: driver_register error: %d\n",
2560 ret = do_create_driverfs_files();
2562 printk(KERN_WARNING "scsi_debug: driver_create_file error: %d\n",
2569 host_to_add = scsi_debug_add_host;
2570 scsi_debug_add_host = 0;
2572 for (k = 0; k < host_to_add; k++) {
2573 if (sdebug_add_adapter()) {
2574 printk(KERN_ERR "scsi_debug_init: "
2575 "sdebug_add_adapter failed k=%d\n", k);
2580 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
2581 printk(KERN_INFO "scsi_debug_init: built %d host(s)\n",
2582 scsi_debug_add_host);
2587 do_remove_driverfs_files();
2588 driver_unregister(&sdebug_driverfs_driver);
2590 bus_unregister(&pseudo_lld_bus);
2592 device_unregister(&pseudo_primary);
2599 static void __exit scsi_debug_exit(void)
2601 int k = scsi_debug_add_host;
2605 sdebug_remove_adapter();
2606 do_remove_driverfs_files();
2607 driver_unregister(&sdebug_driverfs_driver);
2608 bus_unregister(&pseudo_lld_bus);
2609 device_unregister(&pseudo_primary);
2614 device_initcall(scsi_debug_init);
2615 module_exit(scsi_debug_exit);
2617 static void pseudo_0_release(struct device * dev)
2619 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2620 printk(KERN_INFO "scsi_debug: pseudo_0_release() called\n");
2623 static struct device pseudo_primary = {
2624 .bus_id = "pseudo_0",
2625 .release = pseudo_0_release,
2628 static int pseudo_lld_bus_match(struct device *dev,
2629 struct device_driver *dev_driver)
2634 static struct bus_type pseudo_lld_bus = {
2636 .match = pseudo_lld_bus_match,
2637 .probe = sdebug_driver_probe,
2638 .remove = sdebug_driver_remove,
2641 static void sdebug_release_adapter(struct device * dev)
2643 struct sdebug_host_info *sdbg_host;
2645 sdbg_host = to_sdebug_host(dev);
2649 static int sdebug_add_adapter(void)
2651 int k, devs_per_host;
2653 struct sdebug_host_info *sdbg_host;
2654 struct sdebug_dev_info *sdbg_devinfo, *tmp;
2656 sdbg_host = kzalloc(sizeof(*sdbg_host),GFP_KERNEL);
2657 if (NULL == sdbg_host) {
2658 printk(KERN_ERR "%s: out of memory at line %d\n",
2659 __FUNCTION__, __LINE__);
2663 INIT_LIST_HEAD(&sdbg_host->dev_info_list);
2665 devs_per_host = scsi_debug_num_tgts * scsi_debug_max_luns;
2666 for (k = 0; k < devs_per_host; k++) {
2667 sdbg_devinfo = sdebug_device_create(sdbg_host, GFP_KERNEL);
2668 if (!sdbg_devinfo) {
2669 printk(KERN_ERR "%s: out of memory at line %d\n",
2670 __FUNCTION__, __LINE__);
2676 spin_lock(&sdebug_host_list_lock);
2677 list_add_tail(&sdbg_host->host_list, &sdebug_host_list);
2678 spin_unlock(&sdebug_host_list_lock);
2680 sdbg_host->dev.bus = &pseudo_lld_bus;
2681 sdbg_host->dev.parent = &pseudo_primary;
2682 sdbg_host->dev.release = &sdebug_release_adapter;
2683 sprintf(sdbg_host->dev.bus_id, "adapter%d", scsi_debug_add_host);
2685 error = device_register(&sdbg_host->dev);
2690 ++scsi_debug_add_host;
2694 list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
2696 list_del(&sdbg_devinfo->dev_list);
2697 kfree(sdbg_devinfo);
2704 static void sdebug_remove_adapter(void)
2706 struct sdebug_host_info * sdbg_host = NULL;
2708 spin_lock(&sdebug_host_list_lock);
2709 if (!list_empty(&sdebug_host_list)) {
2710 sdbg_host = list_entry(sdebug_host_list.prev,
2711 struct sdebug_host_info, host_list);
2712 list_del(&sdbg_host->host_list);
2714 spin_unlock(&sdebug_host_list_lock);
2719 device_unregister(&sdbg_host->dev);
2720 --scsi_debug_add_host;
2724 int scsi_debug_queuecommand(struct scsi_cmnd *SCpnt, done_funct_t done)
2726 unsigned char *cmd = (unsigned char *) SCpnt->cmnd;
2729 unsigned long long lba;
2731 int target = SCpnt->device->id;
2732 struct sdebug_dev_info *devip = NULL;
2733 int inj_recovered = 0;
2734 int inj_transport = 0;
2735 int delay_override = 0;
2737 scsi_set_resid(SCpnt, 0);
2738 if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) && cmd) {
2739 printk(KERN_INFO "scsi_debug: cmd ");
2740 for (k = 0, len = SCpnt->cmd_len; k < len; ++k)
2741 printk("%02x ", (int)cmd[k]);
2745 if (target == SCpnt->device->host->hostt->this_id) {
2746 printk(KERN_INFO "scsi_debug: initiator's id used as "
2748 return schedule_resp(SCpnt, NULL, done,
2749 DID_NO_CONNECT << 16, 0);
2752 if ((SCpnt->device->lun >= scsi_debug_max_luns) &&
2753 (SCpnt->device->lun != SAM2_WLUN_REPORT_LUNS))
2754 return schedule_resp(SCpnt, NULL, done,
2755 DID_NO_CONNECT << 16, 0);
2756 devip = devInfoReg(SCpnt->device);
2758 return schedule_resp(SCpnt, NULL, done,
2759 DID_NO_CONNECT << 16, 0);
2761 if ((scsi_debug_every_nth != 0) &&
2762 (++scsi_debug_cmnd_count >= abs(scsi_debug_every_nth))) {
2763 scsi_debug_cmnd_count = 0;
2764 if (scsi_debug_every_nth < -1)
2765 scsi_debug_every_nth = -1;
2766 if (SCSI_DEBUG_OPT_TIMEOUT & scsi_debug_opts)
2767 return 0; /* ignore command causing timeout */
2768 else if (SCSI_DEBUG_OPT_RECOVERED_ERR & scsi_debug_opts)
2769 inj_recovered = 1; /* to reads and writes below */
2770 else if (SCSI_DEBUG_OPT_TRANSPORT_ERR & scsi_debug_opts)
2771 inj_transport = 1; /* to reads and writes below */
2778 case TEST_UNIT_READY:
2780 break; /* only allowable wlun commands */
2782 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2783 printk(KERN_INFO "scsi_debug: Opcode: 0x%x "
2784 "not supported for wlun\n", *cmd);
2785 mk_sense_buffer(devip, ILLEGAL_REQUEST,
2787 errsts = check_condition_result;
2788 return schedule_resp(SCpnt, devip, done, errsts,
2794 case INQUIRY: /* mandatory, ignore unit attention */
2796 errsts = resp_inquiry(SCpnt, target, devip);
2798 case REQUEST_SENSE: /* mandatory, ignore unit attention */
2800 errsts = resp_requests(SCpnt, devip);
2802 case REZERO_UNIT: /* actually this is REWIND for SSC */
2804 errsts = resp_start_stop(SCpnt, devip);
2806 case ALLOW_MEDIUM_REMOVAL:
2807 errsts = check_readiness(SCpnt, 1, devip);
2810 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2811 printk(KERN_INFO "scsi_debug: Medium removal %s\n",
2812 cmd[4] ? "inhibited" : "enabled");
2814 case SEND_DIAGNOSTIC: /* mandatory */
2815 errsts = check_readiness(SCpnt, 1, devip);
2817 case TEST_UNIT_READY: /* mandatory */
2819 errsts = check_readiness(SCpnt, 0, devip);
2822 errsts = check_readiness(SCpnt, 1, devip);
2825 errsts = check_readiness(SCpnt, 1, devip);
2828 errsts = check_readiness(SCpnt, 1, devip);
2831 errsts = check_readiness(SCpnt, 1, devip);
2834 errsts = resp_readcap(SCpnt, devip);
2836 case SERVICE_ACTION_IN:
2837 if (SAI_READ_CAPACITY_16 != cmd[1]) {
2838 mk_sense_buffer(devip, ILLEGAL_REQUEST,
2840 errsts = check_condition_result;
2843 errsts = resp_readcap16(SCpnt, devip);
2845 case MAINTENANCE_IN:
2846 if (MI_REPORT_TARGET_PGS != cmd[1]) {
2847 mk_sense_buffer(devip, ILLEGAL_REQUEST,
2849 errsts = check_condition_result;
2852 errsts = resp_report_tgtpgs(SCpnt, devip);
2858 errsts = check_readiness(SCpnt, 0, devip);
2861 if (scsi_debug_fake_rw)
2863 get_data_transfer_info(cmd, &lba, &num);
2864 errsts = resp_read(SCpnt, lba, num, devip);
2865 if (inj_recovered && (0 == errsts)) {
2866 mk_sense_buffer(devip, RECOVERED_ERROR,
2867 THRESHOLD_EXCEEDED, 0);
2868 errsts = check_condition_result;
2869 } else if (inj_transport && (0 == errsts)) {
2870 mk_sense_buffer(devip, ABORTED_COMMAND,
2871 TRANSPORT_PROBLEM, ACK_NAK_TO);
2872 errsts = check_condition_result;
2875 case REPORT_LUNS: /* mandatory, ignore unit attention */
2877 errsts = resp_report_luns(SCpnt, devip);
2879 case VERIFY: /* 10 byte SBC-2 command */
2880 errsts = check_readiness(SCpnt, 0, devip);
2886 errsts = check_readiness(SCpnt, 0, devip);
2889 if (scsi_debug_fake_rw)
2891 get_data_transfer_info(cmd, &lba, &num);
2892 errsts = resp_write(SCpnt, lba, num, devip);
2893 if (inj_recovered && (0 == errsts)) {
2894 mk_sense_buffer(devip, RECOVERED_ERROR,
2895 THRESHOLD_EXCEEDED, 0);
2896 errsts = check_condition_result;
2901 errsts = resp_mode_sense(SCpnt, target, devip);
2904 errsts = resp_mode_select(SCpnt, 1, devip);
2906 case MODE_SELECT_10:
2907 errsts = resp_mode_select(SCpnt, 0, devip);
2910 errsts = resp_log_sense(SCpnt, devip);
2912 case SYNCHRONIZE_CACHE:
2914 errsts = check_readiness(SCpnt, 0, devip);
2917 errsts = check_readiness(SCpnt, 1, devip);
2919 case XDWRITEREAD_10:
2920 if (!scsi_bidi_cmnd(SCpnt)) {
2921 mk_sense_buffer(devip, ILLEGAL_REQUEST,
2922 INVALID_FIELD_IN_CDB, 0);
2923 errsts = check_condition_result;
2927 errsts = check_readiness(SCpnt, 0, devip);
2930 if (scsi_debug_fake_rw)
2932 get_data_transfer_info(cmd, &lba, &num);
2933 errsts = resp_read(SCpnt, lba, num, devip);
2936 errsts = resp_write(SCpnt, lba, num, devip);
2939 errsts = resp_xdwriteread(SCpnt, lba, num, devip);
2942 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2943 printk(KERN_INFO "scsi_debug: Opcode: 0x%x not "
2944 "supported\n", *cmd);
2945 errsts = check_readiness(SCpnt, 1, devip);
2947 break; /* Unit attention takes precedence */
2948 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_OPCODE, 0);
2949 errsts = check_condition_result;
2952 return schedule_resp(SCpnt, devip, done, errsts,
2953 (delay_override ? 0 : scsi_debug_delay));
2956 static struct scsi_host_template sdebug_driver_template = {
2957 .proc_info = scsi_debug_proc_info,
2958 .proc_name = sdebug_proc_name,
2959 .name = "SCSI DEBUG",
2960 .info = scsi_debug_info,
2961 .slave_alloc = scsi_debug_slave_alloc,
2962 .slave_configure = scsi_debug_slave_configure,
2963 .slave_destroy = scsi_debug_slave_destroy,
2964 .ioctl = scsi_debug_ioctl,
2965 .queuecommand = scsi_debug_queuecommand,
2966 .eh_abort_handler = scsi_debug_abort,
2967 .eh_bus_reset_handler = scsi_debug_bus_reset,
2968 .eh_device_reset_handler = scsi_debug_device_reset,
2969 .eh_host_reset_handler = scsi_debug_host_reset,
2970 .bios_param = scsi_debug_biosparam,
2971 .can_queue = SCSI_DEBUG_CANQUEUE,
2973 .sg_tablesize = 256,
2975 .max_sectors = 0xffff,
2976 .use_clustering = DISABLE_CLUSTERING,
2977 .module = THIS_MODULE,
2980 static int sdebug_driver_probe(struct device * dev)
2983 struct sdebug_host_info *sdbg_host;
2984 struct Scsi_Host *hpnt;
2986 sdbg_host = to_sdebug_host(dev);
2988 hpnt = scsi_host_alloc(&sdebug_driver_template, sizeof(sdbg_host));
2990 printk(KERN_ERR "%s: scsi_register failed\n", __FUNCTION__);
2995 sdbg_host->shost = hpnt;
2996 *((struct sdebug_host_info **)hpnt->hostdata) = sdbg_host;
2997 if ((hpnt->this_id >= 0) && (scsi_debug_num_tgts > hpnt->this_id))
2998 hpnt->max_id = scsi_debug_num_tgts + 1;
3000 hpnt->max_id = scsi_debug_num_tgts;
3001 hpnt->max_lun = SAM2_WLUN_REPORT_LUNS; /* = scsi_debug_max_luns; */
3003 error = scsi_add_host(hpnt, &sdbg_host->dev);
3005 printk(KERN_ERR "%s: scsi_add_host failed\n", __FUNCTION__);
3007 scsi_host_put(hpnt);
3009 scsi_scan_host(hpnt);
3015 static int sdebug_driver_remove(struct device * dev)
3017 struct sdebug_host_info *sdbg_host;
3018 struct sdebug_dev_info *sdbg_devinfo, *tmp;
3020 sdbg_host = to_sdebug_host(dev);
3023 printk(KERN_ERR "%s: Unable to locate host info\n",
3028 scsi_remove_host(sdbg_host->shost);
3030 list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
3032 list_del(&sdbg_devinfo->dev_list);
3033 kfree(sdbg_devinfo);
3036 scsi_host_put(sdbg_host->shost);
3040 static void sdebug_max_tgts_luns(void)
3042 struct sdebug_host_info * sdbg_host;
3043 struct Scsi_Host *hpnt;
3045 spin_lock(&sdebug_host_list_lock);
3046 list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
3047 hpnt = sdbg_host->shost;
3048 if ((hpnt->this_id >= 0) &&
3049 (scsi_debug_num_tgts > hpnt->this_id))
3050 hpnt->max_id = scsi_debug_num_tgts + 1;
3052 hpnt->max_id = scsi_debug_num_tgts;
3053 hpnt->max_lun = SAM2_WLUN_REPORT_LUNS; /* scsi_debug_max_luns; */
3055 spin_unlock(&sdebug_host_list_lock);