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_size; /* in bytes */
152 static unsigned int sdebug_store_sectors;
153 static sector_t sdebug_capacity; /* in sectors */
155 /* old BIOS stuff, kernel may get rid of them but some mode sense pages
156 may still need them */
157 static int sdebug_heads; /* heads per disk */
158 static int sdebug_cylinders_per; /* cylinders per surface */
159 static int sdebug_sectors_per; /* sectors per cylinder */
161 /* default sector size is 512 bytes, 2**9 bytes */
162 #define POW2_SECT_SIZE 9
163 #define SECT_SIZE (1 << POW2_SECT_SIZE)
164 #define SECT_SIZE_PER(TGT) SECT_SIZE
166 #define SDEBUG_MAX_PARTS 4
168 #define SDEBUG_SENSE_LEN 32
170 #define SCSI_DEBUG_CANQUEUE 255
171 #define SCSI_DEBUG_MAX_CMD_LEN 16
173 struct sdebug_dev_info {
174 struct list_head dev_list;
175 unsigned char sense_buff[SDEBUG_SENSE_LEN]; /* weak nexus */
176 unsigned int channel;
179 struct sdebug_host_info *sdbg_host;
186 struct sdebug_host_info {
187 struct list_head host_list;
188 struct Scsi_Host *shost;
190 struct list_head dev_info_list;
193 #define to_sdebug_host(d) \
194 container_of(d, struct sdebug_host_info, dev)
196 static LIST_HEAD(sdebug_host_list);
197 static DEFINE_SPINLOCK(sdebug_host_list_lock);
199 typedef void (* done_funct_t) (struct scsi_cmnd *);
201 struct sdebug_queued_cmd {
203 struct timer_list cmnd_timer;
204 done_funct_t done_funct;
205 struct scsi_cmnd * a_cmnd;
208 static struct sdebug_queued_cmd queued_arr[SCSI_DEBUG_CANQUEUE];
210 static unsigned char * fake_storep; /* ramdisk storage */
212 static int num_aborts = 0;
213 static int num_dev_resets = 0;
214 static int num_bus_resets = 0;
215 static int num_host_resets = 0;
217 static DEFINE_SPINLOCK(queued_arr_lock);
218 static DEFINE_RWLOCK(atomic_rw);
220 static char sdebug_proc_name[] = "scsi_debug";
222 static int sdebug_driver_probe(struct device *);
223 static int sdebug_driver_remove(struct device *);
224 static struct bus_type pseudo_lld_bus;
226 static struct device_driver sdebug_driverfs_driver = {
227 .name = sdebug_proc_name,
228 .bus = &pseudo_lld_bus,
231 static const int check_condition_result =
232 (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
234 static unsigned char ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
236 static unsigned char iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
239 static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev);
240 static void mk_sense_buffer(struct sdebug_dev_info * devip, int key,
242 static void stop_all_queued(void);
243 static int stop_queued_cmnd(struct scsi_cmnd * cmnd);
245 static int sdebug_add_adapter(void);
246 static void sdebug_remove_adapter(void);
247 static void sdebug_max_tgts_luns(void);
249 static struct device pseudo_primary;
250 static struct bus_type pseudo_lld_bus;
252 static void get_data_transfer_info(unsigned char *cmd,
253 unsigned long long *lba, unsigned int *num)
258 *lba = (u64)cmd[9] | (u64)cmd[8] << 8 |
259 (u64)cmd[7] << 16 | (u64)cmd[6] << 24 |
260 (u64)cmd[5] << 32 | (u64)cmd[4] << 40 |
261 (u64)cmd[3] << 48 | (u64)cmd[2] << 56;
263 *num = (u32)cmd[13] | (u32)cmd[12] << 8 | (u32)cmd[11] << 16 |
268 *lba = (u32)cmd[5] | (u32)cmd[4] << 8 | (u32)cmd[3] << 16 |
271 *num = (u32)cmd[9] | (u32)cmd[8] << 8 | (u32)cmd[7] << 16 |
277 *lba = (u32)cmd[5] | (u32)cmd[4] << 8 | (u32)cmd[3] << 16 |
280 *num = (u32)cmd[8] | (u32)cmd[7] << 8;
284 *lba = (u32)cmd[3] | (u32)cmd[2] << 8 |
285 (u32)(cmd[1] & 0x1f) << 16;
286 *num = (0 == cmd[4]) ? 256 : cmd[4];
293 static int scsi_debug_ioctl(struct scsi_device *dev, int cmd, void __user *arg)
295 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
296 printk(KERN_INFO "scsi_debug: ioctl: cmd=0x%x\n", cmd);
299 /* return -ENOTTY; // correct return but upsets fdisk */
302 static int check_readiness(struct scsi_cmnd * SCpnt, int reset_only,
303 struct sdebug_dev_info * devip)
306 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
307 printk(KERN_INFO "scsi_debug: Reporting Unit "
308 "attention: power on reset\n");
310 mk_sense_buffer(devip, UNIT_ATTENTION, POWERON_RESET, 0);
311 return check_condition_result;
313 if ((0 == reset_only) && devip->stopped) {
314 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
315 printk(KERN_INFO "scsi_debug: Reporting Not "
316 "ready: initializing command required\n");
317 mk_sense_buffer(devip, NOT_READY, LOGICAL_UNIT_NOT_READY,
319 return check_condition_result;
324 /* Returns 0 if ok else (DID_ERROR << 16). Sets scp->resid . */
325 static int fill_from_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
329 struct scsi_data_buffer *sdb = scsi_in(scp);
333 if (!(scsi_bidi_cmnd(scp) || scp->sc_data_direction == DMA_FROM_DEVICE))
334 return (DID_ERROR << 16);
336 act_len = sg_copy_from_buffer(sdb->table.sgl, sdb->table.nents,
339 sdb->resid -= act_len;
341 sdb->resid = scsi_bufflen(scp) - act_len;
346 /* Returns number of bytes fetched into 'arr' or -1 if error. */
347 static int fetch_to_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
350 if (!scsi_bufflen(scp))
352 if (!(scsi_bidi_cmnd(scp) || scp->sc_data_direction == DMA_TO_DEVICE))
355 return scsi_sg_copy_to_buffer(scp, arr, arr_len);
359 static const char * inq_vendor_id = "Linux ";
360 static const char * inq_product_id = "scsi_debug ";
361 static const char * inq_product_rev = "0004";
363 static int inquiry_evpd_83(unsigned char * arr, int port_group_id,
364 int target_dev_id, int dev_id_num,
365 const char * dev_id_str,
371 port_a = target_dev_id + 1;
372 /* T10 vendor identifier field format (faked) */
373 arr[0] = 0x2; /* ASCII */
376 memcpy(&arr[4], inq_vendor_id, 8);
377 memcpy(&arr[12], inq_product_id, 16);
378 memcpy(&arr[28], dev_id_str, dev_id_str_len);
379 num = 8 + 16 + dev_id_str_len;
382 if (dev_id_num >= 0) {
383 /* NAA-5, Logical unit identifier (binary) */
384 arr[num++] = 0x1; /* binary (not necessarily sas) */
385 arr[num++] = 0x3; /* PIV=0, lu, naa */
388 arr[num++] = 0x53; /* naa-5 ieee company id=0x333333 (fake) */
392 arr[num++] = (dev_id_num >> 24);
393 arr[num++] = (dev_id_num >> 16) & 0xff;
394 arr[num++] = (dev_id_num >> 8) & 0xff;
395 arr[num++] = dev_id_num & 0xff;
396 /* Target relative port number */
397 arr[num++] = 0x61; /* proto=sas, binary */
398 arr[num++] = 0x94; /* PIV=1, target port, rel port */
399 arr[num++] = 0x0; /* reserved */
400 arr[num++] = 0x4; /* length */
401 arr[num++] = 0x0; /* reserved */
402 arr[num++] = 0x0; /* reserved */
404 arr[num++] = 0x1; /* relative port A */
406 /* NAA-5, Target port identifier */
407 arr[num++] = 0x61; /* proto=sas, binary */
408 arr[num++] = 0x93; /* piv=1, target port, naa */
411 arr[num++] = 0x52; /* naa-5, company id=0x222222 (fake) */
415 arr[num++] = (port_a >> 24);
416 arr[num++] = (port_a >> 16) & 0xff;
417 arr[num++] = (port_a >> 8) & 0xff;
418 arr[num++] = port_a & 0xff;
419 /* NAA-5, Target port group identifier */
420 arr[num++] = 0x61; /* proto=sas, binary */
421 arr[num++] = 0x95; /* piv=1, target port group id */
426 arr[num++] = (port_group_id >> 8) & 0xff;
427 arr[num++] = port_group_id & 0xff;
428 /* NAA-5, Target device identifier */
429 arr[num++] = 0x61; /* proto=sas, binary */
430 arr[num++] = 0xa3; /* piv=1, target device, naa */
433 arr[num++] = 0x52; /* naa-5, company id=0x222222 (fake) */
437 arr[num++] = (target_dev_id >> 24);
438 arr[num++] = (target_dev_id >> 16) & 0xff;
439 arr[num++] = (target_dev_id >> 8) & 0xff;
440 arr[num++] = target_dev_id & 0xff;
441 /* SCSI name string: Target device identifier */
442 arr[num++] = 0x63; /* proto=sas, UTF-8 */
443 arr[num++] = 0xa8; /* piv=1, target device, SCSI name string */
446 memcpy(arr + num, "naa.52222220", 12);
448 snprintf(b, sizeof(b), "%08X", target_dev_id);
449 memcpy(arr + num, b, 8);
451 memset(arr + num, 0, 4);
457 static unsigned char vpd84_data[] = {
458 /* from 4th byte */ 0x22,0x22,0x22,0x0,0xbb,0x0,
459 0x22,0x22,0x22,0x0,0xbb,0x1,
460 0x22,0x22,0x22,0x0,0xbb,0x2,
463 static int inquiry_evpd_84(unsigned char * arr)
465 memcpy(arr, vpd84_data, sizeof(vpd84_data));
466 return sizeof(vpd84_data);
469 static int inquiry_evpd_85(unsigned char * arr)
472 const char * na1 = "https://www.kernel.org/config";
473 const char * na2 = "http://www.kernel.org/log";
476 arr[num++] = 0x1; /* lu, storage config */
477 arr[num++] = 0x0; /* reserved */
482 plen = ((plen / 4) + 1) * 4;
483 arr[num++] = plen; /* length, null termianted, padded */
484 memcpy(arr + num, na1, olen);
485 memset(arr + num + olen, 0, plen - olen);
488 arr[num++] = 0x4; /* lu, logging */
489 arr[num++] = 0x0; /* reserved */
494 plen = ((plen / 4) + 1) * 4;
495 arr[num++] = plen; /* length, null terminated, padded */
496 memcpy(arr + num, na2, olen);
497 memset(arr + num + olen, 0, plen - olen);
503 /* SCSI ports VPD page */
504 static int inquiry_evpd_88(unsigned char * arr, int target_dev_id)
509 port_a = target_dev_id + 1;
511 arr[num++] = 0x0; /* reserved */
512 arr[num++] = 0x0; /* reserved */
514 arr[num++] = 0x1; /* relative port 1 (primary) */
515 memset(arr + num, 0, 6);
518 arr[num++] = 12; /* length tp descriptor */
519 /* naa-5 target port identifier (A) */
520 arr[num++] = 0x61; /* proto=sas, binary */
521 arr[num++] = 0x93; /* PIV=1, target port, NAA */
522 arr[num++] = 0x0; /* reserved */
523 arr[num++] = 0x8; /* length */
524 arr[num++] = 0x52; /* NAA-5, company_id=0x222222 (fake) */
528 arr[num++] = (port_a >> 24);
529 arr[num++] = (port_a >> 16) & 0xff;
530 arr[num++] = (port_a >> 8) & 0xff;
531 arr[num++] = port_a & 0xff;
533 arr[num++] = 0x0; /* reserved */
534 arr[num++] = 0x0; /* reserved */
536 arr[num++] = 0x2; /* relative port 2 (secondary) */
537 memset(arr + num, 0, 6);
540 arr[num++] = 12; /* length tp descriptor */
541 /* naa-5 target port identifier (B) */
542 arr[num++] = 0x61; /* proto=sas, binary */
543 arr[num++] = 0x93; /* PIV=1, target port, NAA */
544 arr[num++] = 0x0; /* reserved */
545 arr[num++] = 0x8; /* length */
546 arr[num++] = 0x52; /* NAA-5, company_id=0x222222 (fake) */
550 arr[num++] = (port_b >> 24);
551 arr[num++] = (port_b >> 16) & 0xff;
552 arr[num++] = (port_b >> 8) & 0xff;
553 arr[num++] = port_b & 0xff;
559 static unsigned char vpd89_data[] = {
560 /* from 4th byte */ 0,0,0,0,
561 'l','i','n','u','x',' ',' ',' ',
562 'S','A','T',' ','s','c','s','i','_','d','e','b','u','g',' ',' ',
564 0x34,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
566 0x5a,0xc,0xff,0x3f,0x37,0xc8,0x10,0,0,0,0,0,0x3f,0,0,0,
567 0,0,0,0,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x20,0x20,0x20,0x20,
568 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0,0,0,0x40,0x4,0,0x2e,0x33,
569 0x38,0x31,0x20,0x20,0x20,0x20,0x54,0x53,0x38,0x33,0x30,0x30,0x33,0x31,
571 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
573 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
575 0,0,0,0x2f,0,0,0,0x2,0,0x2,0x7,0,0xff,0xff,0x1,0,
576 0x3f,0,0xc1,0xff,0x3e,0,0x10,0x1,0xb0,0xf8,0x50,0x9,0,0,0x7,0,
577 0x3,0,0x78,0,0x78,0,0xf0,0,0x78,0,0,0,0,0,0,0,
578 0,0,0,0,0,0,0,0,0x2,0,0,0,0,0,0,0,
579 0x7e,0,0x1b,0,0x6b,0x34,0x1,0x7d,0x3,0x40,0x69,0x34,0x1,0x3c,0x3,0x40,
580 0x7f,0x40,0,0,0,0,0xfe,0xfe,0,0,0,0,0,0xfe,0,0,
581 0,0,0,0,0,0,0,0,0xb0,0xf8,0x50,0x9,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 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
585 0x1,0,0xb0,0xf8,0x50,0x9,0xb0,0xf8,0x50,0x9,0x20,0x20,0x2,0,0xb6,0x42,
586 0,0x80,0x8a,0,0x6,0x3c,0xa,0x3c,0xff,0xff,0xc6,0x7,0,0x1,0,0x8,
587 0xf0,0xf,0,0x10,0x2,0,0x30,0,0,0,0,0,0,0,0x6,0xfe,
588 0,0,0x2,0,0x50,0,0x8a,0,0x4f,0x95,0,0,0x21,0,0xb,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,0,0,
600 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa5,0x51,
603 static int inquiry_evpd_89(unsigned char * arr)
605 memcpy(arr, vpd89_data, sizeof(vpd89_data));
606 return sizeof(vpd89_data);
610 static unsigned char vpdb0_data[] = {
611 /* from 4th byte */ 0,0,0,4,
616 static int inquiry_evpd_b0(unsigned char * arr)
618 memcpy(arr, vpdb0_data, sizeof(vpdb0_data));
619 if (sdebug_store_sectors > 0x400) {
620 arr[4] = (sdebug_store_sectors >> 24) & 0xff;
621 arr[5] = (sdebug_store_sectors >> 16) & 0xff;
622 arr[6] = (sdebug_store_sectors >> 8) & 0xff;
623 arr[7] = sdebug_store_sectors & 0xff;
625 return sizeof(vpdb0_data);
629 #define SDEBUG_LONG_INQ_SZ 96
630 #define SDEBUG_MAX_INQ_ARR_SZ 584
632 static int resp_inquiry(struct scsi_cmnd * scp, int target,
633 struct sdebug_dev_info * devip)
635 unsigned char pq_pdt;
637 unsigned char *cmd = (unsigned char *)scp->cmnd;
638 int alloc_len, n, ret;
640 alloc_len = (cmd[3] << 8) + cmd[4];
641 arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_ATOMIC);
643 return DID_REQUEUE << 16;
645 pq_pdt = 0x1e; /* present, wlun */
646 else if (scsi_debug_no_lun_0 && (0 == devip->lun))
647 pq_pdt = 0x7f; /* not present, no device type */
649 pq_pdt = (scsi_debug_ptype & 0x1f);
651 if (0x2 & cmd[1]) { /* CMDDT bit set */
652 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
655 return check_condition_result;
656 } else if (0x1 & cmd[1]) { /* EVPD bit set */
657 int lu_id_num, port_group_id, target_dev_id, len;
659 int host_no = devip->sdbg_host->shost->host_no;
661 port_group_id = (((host_no + 1) & 0x7f) << 8) +
662 (devip->channel & 0x7f);
663 if (0 == scsi_debug_vpd_use_hostno)
665 lu_id_num = devip->wlun ? -1 : (((host_no + 1) * 2000) +
666 (devip->target * 1000) + devip->lun);
667 target_dev_id = ((host_no + 1) * 2000) +
668 (devip->target * 1000) - 3;
669 len = scnprintf(lu_id_str, 6, "%d", lu_id_num);
670 if (0 == cmd[2]) { /* supported vital product data pages */
671 arr[1] = cmd[2]; /*sanity */
673 arr[n++] = 0x0; /* this page */
674 arr[n++] = 0x80; /* unit serial number */
675 arr[n++] = 0x83; /* device identification */
676 arr[n++] = 0x84; /* software interface ident. */
677 arr[n++] = 0x85; /* management network addresses */
678 arr[n++] = 0x86; /* extended inquiry */
679 arr[n++] = 0x87; /* mode page policy */
680 arr[n++] = 0x88; /* SCSI ports */
681 arr[n++] = 0x89; /* ATA information */
682 arr[n++] = 0xb0; /* Block limits (SBC) */
683 arr[3] = n - 4; /* number of supported VPD pages */
684 } else if (0x80 == cmd[2]) { /* unit serial number */
685 arr[1] = cmd[2]; /*sanity */
687 memcpy(&arr[4], lu_id_str, len);
688 } else if (0x83 == cmd[2]) { /* device identification */
689 arr[1] = cmd[2]; /*sanity */
690 arr[3] = inquiry_evpd_83(&arr[4], port_group_id,
691 target_dev_id, lu_id_num,
693 } else if (0x84 == cmd[2]) { /* Software interface ident. */
694 arr[1] = cmd[2]; /*sanity */
695 arr[3] = inquiry_evpd_84(&arr[4]);
696 } else if (0x85 == cmd[2]) { /* Management network addresses */
697 arr[1] = cmd[2]; /*sanity */
698 arr[3] = inquiry_evpd_85(&arr[4]);
699 } else if (0x86 == cmd[2]) { /* extended inquiry */
700 arr[1] = cmd[2]; /*sanity */
701 arr[3] = 0x3c; /* number of following entries */
702 arr[4] = 0x0; /* no protection stuff */
703 arr[5] = 0x7; /* head of q, ordered + simple q's */
704 } else if (0x87 == cmd[2]) { /* mode page policy */
705 arr[1] = cmd[2]; /*sanity */
706 arr[3] = 0x8; /* number of following entries */
707 arr[4] = 0x2; /* disconnect-reconnect mp */
708 arr[6] = 0x80; /* mlus, shared */
709 arr[8] = 0x18; /* protocol specific lu */
710 arr[10] = 0x82; /* mlus, per initiator port */
711 } else if (0x88 == cmd[2]) { /* SCSI Ports */
712 arr[1] = cmd[2]; /*sanity */
713 arr[3] = inquiry_evpd_88(&arr[4], target_dev_id);
714 } else if (0x89 == cmd[2]) { /* ATA information */
715 arr[1] = cmd[2]; /*sanity */
716 n = inquiry_evpd_89(&arr[4]);
719 } else if (0xb0 == cmd[2]) { /* Block limits (SBC) */
720 arr[1] = cmd[2]; /*sanity */
721 arr[3] = inquiry_evpd_b0(&arr[4]);
723 /* Illegal request, invalid field in cdb */
724 mk_sense_buffer(devip, ILLEGAL_REQUEST,
725 INVALID_FIELD_IN_CDB, 0);
727 return check_condition_result;
729 len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len);
730 ret = fill_from_dev_buffer(scp, arr,
731 min(len, SDEBUG_MAX_INQ_ARR_SZ));
735 /* drops through here for a standard inquiry */
736 arr[1] = DEV_REMOVEABLE(target) ? 0x80 : 0; /* Removable disk */
737 arr[2] = scsi_debug_scsi_level;
738 arr[3] = 2; /* response_data_format==2 */
739 arr[4] = SDEBUG_LONG_INQ_SZ - 5;
740 if (0 == scsi_debug_vpd_use_hostno)
741 arr[5] = 0x10; /* claim: implicit TGPS */
742 arr[6] = 0x10; /* claim: MultiP */
743 /* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */
744 arr[7] = 0xa; /* claim: LINKED + CMDQUE */
745 memcpy(&arr[8], inq_vendor_id, 8);
746 memcpy(&arr[16], inq_product_id, 16);
747 memcpy(&arr[32], inq_product_rev, 4);
748 /* version descriptors (2 bytes each) follow */
749 arr[58] = 0x0; arr[59] = 0x77; /* SAM-3 ANSI */
750 arr[60] = 0x3; arr[61] = 0x14; /* SPC-3 ANSI */
752 if (scsi_debug_ptype == 0) {
753 arr[n++] = 0x3; arr[n++] = 0x3d; /* SBC-2 ANSI */
754 } else if (scsi_debug_ptype == 1) {
755 arr[n++] = 0x3; arr[n++] = 0x60; /* SSC-2 no version */
757 arr[n++] = 0xc; arr[n++] = 0xf; /* SAS-1.1 rev 10 */
758 ret = fill_from_dev_buffer(scp, arr,
759 min(alloc_len, SDEBUG_LONG_INQ_SZ));
764 static int resp_requests(struct scsi_cmnd * scp,
765 struct sdebug_dev_info * devip)
767 unsigned char * sbuff;
768 unsigned char *cmd = (unsigned char *)scp->cmnd;
769 unsigned char arr[SDEBUG_SENSE_LEN];
773 memset(arr, 0, sizeof(arr));
774 if (devip->reset == 1)
775 mk_sense_buffer(devip, 0, NO_ADDITIONAL_SENSE, 0);
776 want_dsense = !!(cmd[1] & 1) || scsi_debug_dsense;
777 sbuff = devip->sense_buff;
778 if ((iec_m_pg[2] & 0x4) && (6 == (iec_m_pg[3] & 0xf))) {
781 arr[1] = 0x0; /* NO_SENSE in sense_key */
782 arr[2] = THRESHOLD_EXCEEDED;
783 arr[3] = 0xff; /* TEST set and MRIE==6 */
786 arr[2] = 0x0; /* NO_SENSE in sense_key */
787 arr[7] = 0xa; /* 18 byte sense buffer */
788 arr[12] = THRESHOLD_EXCEEDED;
789 arr[13] = 0xff; /* TEST set and MRIE==6 */
792 memcpy(arr, sbuff, SDEBUG_SENSE_LEN);
793 if ((cmd[1] & 1) && (! scsi_debug_dsense)) {
794 /* DESC bit set and sense_buff in fixed format */
795 memset(arr, 0, sizeof(arr));
797 arr[1] = sbuff[2]; /* sense key */
798 arr[2] = sbuff[12]; /* asc */
799 arr[3] = sbuff[13]; /* ascq */
803 mk_sense_buffer(devip, 0, NO_ADDITIONAL_SENSE, 0);
804 return fill_from_dev_buffer(scp, arr, len);
807 static int resp_start_stop(struct scsi_cmnd * scp,
808 struct sdebug_dev_info * devip)
810 unsigned char *cmd = (unsigned char *)scp->cmnd;
811 int power_cond, errsts, start;
813 if ((errsts = check_readiness(scp, 1, devip)))
815 power_cond = (cmd[4] & 0xf0) >> 4;
817 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
819 return check_condition_result;
822 if (start == devip->stopped)
823 devip->stopped = !start;
827 #define SDEBUG_READCAP_ARR_SZ 8
828 static int resp_readcap(struct scsi_cmnd * scp,
829 struct sdebug_dev_info * devip)
831 unsigned char arr[SDEBUG_READCAP_ARR_SZ];
835 if ((errsts = check_readiness(scp, 1, devip)))
837 /* following just in case virtual_gb changed */
838 if (scsi_debug_virtual_gb > 0) {
839 sdebug_capacity = 2048 * 1024;
840 sdebug_capacity *= scsi_debug_virtual_gb;
842 sdebug_capacity = sdebug_store_sectors;
843 memset(arr, 0, SDEBUG_READCAP_ARR_SZ);
844 if (sdebug_capacity < 0xffffffff) {
845 capac = (unsigned int)sdebug_capacity - 1;
846 arr[0] = (capac >> 24);
847 arr[1] = (capac >> 16) & 0xff;
848 arr[2] = (capac >> 8) & 0xff;
849 arr[3] = capac & 0xff;
856 arr[6] = (SECT_SIZE_PER(target) >> 8) & 0xff;
857 arr[7] = SECT_SIZE_PER(target) & 0xff;
858 return fill_from_dev_buffer(scp, arr, SDEBUG_READCAP_ARR_SZ);
861 #define SDEBUG_READCAP16_ARR_SZ 32
862 static int resp_readcap16(struct scsi_cmnd * scp,
863 struct sdebug_dev_info * devip)
865 unsigned char *cmd = (unsigned char *)scp->cmnd;
866 unsigned char arr[SDEBUG_READCAP16_ARR_SZ];
867 unsigned long long capac;
868 int errsts, k, alloc_len;
870 if ((errsts = check_readiness(scp, 1, devip)))
872 alloc_len = ((cmd[10] << 24) + (cmd[11] << 16) + (cmd[12] << 8)
874 /* following just in case virtual_gb changed */
875 if (scsi_debug_virtual_gb > 0) {
876 sdebug_capacity = 2048 * 1024;
877 sdebug_capacity *= scsi_debug_virtual_gb;
879 sdebug_capacity = sdebug_store_sectors;
880 memset(arr, 0, SDEBUG_READCAP16_ARR_SZ);
881 capac = sdebug_capacity - 1;
882 for (k = 0; k < 8; ++k, capac >>= 8)
883 arr[7 - k] = capac & 0xff;
884 arr[8] = (SECT_SIZE_PER(target) >> 24) & 0xff;
885 arr[9] = (SECT_SIZE_PER(target) >> 16) & 0xff;
886 arr[10] = (SECT_SIZE_PER(target) >> 8) & 0xff;
887 arr[11] = SECT_SIZE_PER(target) & 0xff;
888 return fill_from_dev_buffer(scp, arr,
889 min(alloc_len, SDEBUG_READCAP16_ARR_SZ));
892 #define SDEBUG_MAX_TGTPGS_ARR_SZ 1412
894 static int resp_report_tgtpgs(struct scsi_cmnd * scp,
895 struct sdebug_dev_info * devip)
897 unsigned char *cmd = (unsigned char *)scp->cmnd;
899 int host_no = devip->sdbg_host->shost->host_no;
900 int n, ret, alen, rlen;
901 int port_group_a, port_group_b, port_a, port_b;
903 alen = ((cmd[6] << 24) + (cmd[7] << 16) + (cmd[8] << 8)
906 arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_ATOMIC);
908 return DID_REQUEUE << 16;
910 * EVPD page 0x88 states we have two ports, one
911 * real and a fake port with no device connected.
912 * So we create two port groups with one port each
913 * and set the group with port B to unavailable.
915 port_a = 0x1; /* relative port A */
916 port_b = 0x2; /* relative port B */
917 port_group_a = (((host_no + 1) & 0x7f) << 8) +
918 (devip->channel & 0x7f);
919 port_group_b = (((host_no + 1) & 0x7f) << 8) +
920 (devip->channel & 0x7f) + 0x80;
923 * The asymmetric access state is cycled according to the host_id.
926 if (0 == scsi_debug_vpd_use_hostno) {
927 arr[n++] = host_no % 3; /* Asymm access state */
928 arr[n++] = 0x0F; /* claim: all states are supported */
930 arr[n++] = 0x0; /* Active/Optimized path */
931 arr[n++] = 0x01; /* claim: only support active/optimized paths */
933 arr[n++] = (port_group_a >> 8) & 0xff;
934 arr[n++] = port_group_a & 0xff;
935 arr[n++] = 0; /* Reserved */
936 arr[n++] = 0; /* Status code */
937 arr[n++] = 0; /* Vendor unique */
938 arr[n++] = 0x1; /* One port per group */
939 arr[n++] = 0; /* Reserved */
940 arr[n++] = 0; /* Reserved */
941 arr[n++] = (port_a >> 8) & 0xff;
942 arr[n++] = port_a & 0xff;
943 arr[n++] = 3; /* Port unavailable */
944 arr[n++] = 0x08; /* claim: only unavailalbe paths are supported */
945 arr[n++] = (port_group_b >> 8) & 0xff;
946 arr[n++] = port_group_b & 0xff;
947 arr[n++] = 0; /* Reserved */
948 arr[n++] = 0; /* Status code */
949 arr[n++] = 0; /* Vendor unique */
950 arr[n++] = 0x1; /* One port per group */
951 arr[n++] = 0; /* Reserved */
952 arr[n++] = 0; /* Reserved */
953 arr[n++] = (port_b >> 8) & 0xff;
954 arr[n++] = port_b & 0xff;
957 arr[0] = (rlen >> 24) & 0xff;
958 arr[1] = (rlen >> 16) & 0xff;
959 arr[2] = (rlen >> 8) & 0xff;
960 arr[3] = rlen & 0xff;
963 * Return the smallest value of either
964 * - The allocated length
965 * - The constructed command length
966 * - The maximum array size
969 ret = fill_from_dev_buffer(scp, arr,
970 min(rlen, SDEBUG_MAX_TGTPGS_ARR_SZ));
975 /* <<Following mode page info copied from ST318451LW>> */
977 static int resp_err_recov_pg(unsigned char * p, int pcontrol, int target)
978 { /* Read-Write Error Recovery page for mode_sense */
979 unsigned char err_recov_pg[] = {0x1, 0xa, 0xc0, 11, 240, 0, 0, 0,
982 memcpy(p, err_recov_pg, sizeof(err_recov_pg));
984 memset(p + 2, 0, sizeof(err_recov_pg) - 2);
985 return sizeof(err_recov_pg);
988 static int resp_disconnect_pg(unsigned char * p, int pcontrol, int target)
989 { /* Disconnect-Reconnect page for mode_sense */
990 unsigned char disconnect_pg[] = {0x2, 0xe, 128, 128, 0, 10, 0, 0,
991 0, 0, 0, 0, 0, 0, 0, 0};
993 memcpy(p, disconnect_pg, sizeof(disconnect_pg));
995 memset(p + 2, 0, sizeof(disconnect_pg) - 2);
996 return sizeof(disconnect_pg);
999 static int resp_format_pg(unsigned char * p, int pcontrol, int target)
1000 { /* Format device page for mode_sense */
1001 unsigned char format_pg[] = {0x3, 0x16, 0, 0, 0, 0, 0, 0,
1002 0, 0, 0, 0, 0, 0, 0, 0,
1003 0, 0, 0, 0, 0x40, 0, 0, 0};
1005 memcpy(p, format_pg, sizeof(format_pg));
1006 p[10] = (sdebug_sectors_per >> 8) & 0xff;
1007 p[11] = sdebug_sectors_per & 0xff;
1008 p[12] = (SECT_SIZE >> 8) & 0xff;
1009 p[13] = SECT_SIZE & 0xff;
1010 if (DEV_REMOVEABLE(target))
1011 p[20] |= 0x20; /* should agree with INQUIRY */
1013 memset(p + 2, 0, sizeof(format_pg) - 2);
1014 return sizeof(format_pg);
1017 static int resp_caching_pg(unsigned char * p, int pcontrol, int target)
1018 { /* Caching page for mode_sense */
1019 unsigned char caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
1020 0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0, 0, 0, 0, 0};
1022 memcpy(p, caching_pg, sizeof(caching_pg));
1024 memset(p + 2, 0, sizeof(caching_pg) - 2);
1025 return sizeof(caching_pg);
1028 static int resp_ctrl_m_pg(unsigned char * p, int pcontrol, int target)
1029 { /* Control mode page for mode_sense */
1030 unsigned char ch_ctrl_m_pg[] = {/* 0xa, 10, */ 0x6, 0, 0, 0, 0, 0,
1032 unsigned char d_ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
1035 if (scsi_debug_dsense)
1036 ctrl_m_pg[2] |= 0x4;
1038 ctrl_m_pg[2] &= ~0x4;
1039 memcpy(p, ctrl_m_pg, sizeof(ctrl_m_pg));
1041 memcpy(p + 2, ch_ctrl_m_pg, sizeof(ch_ctrl_m_pg));
1042 else if (2 == pcontrol)
1043 memcpy(p, d_ctrl_m_pg, sizeof(d_ctrl_m_pg));
1044 return sizeof(ctrl_m_pg);
1048 static int resp_iec_m_pg(unsigned char * p, int pcontrol, int target)
1049 { /* Informational Exceptions control mode page for mode_sense */
1050 unsigned char ch_iec_m_pg[] = {/* 0x1c, 0xa, */ 0x4, 0xf, 0, 0, 0, 0,
1052 unsigned char d_iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
1055 memcpy(p, iec_m_pg, sizeof(iec_m_pg));
1057 memcpy(p + 2, ch_iec_m_pg, sizeof(ch_iec_m_pg));
1058 else if (2 == pcontrol)
1059 memcpy(p, d_iec_m_pg, sizeof(d_iec_m_pg));
1060 return sizeof(iec_m_pg);
1063 static int resp_sas_sf_m_pg(unsigned char * p, int pcontrol, int target)
1064 { /* SAS SSP mode page - short format for mode_sense */
1065 unsigned char sas_sf_m_pg[] = {0x19, 0x6,
1066 0x6, 0x0, 0x7, 0xd0, 0x0, 0x0};
1068 memcpy(p, sas_sf_m_pg, sizeof(sas_sf_m_pg));
1070 memset(p + 2, 0, sizeof(sas_sf_m_pg) - 2);
1071 return sizeof(sas_sf_m_pg);
1075 static int resp_sas_pcd_m_spg(unsigned char * p, int pcontrol, int target,
1077 { /* SAS phy control and discover mode page for mode_sense */
1078 unsigned char sas_pcd_m_pg[] = {0x59, 0x1, 0, 0x64, 0, 0x6, 0, 2,
1079 0, 0, 0, 0, 0x10, 0x9, 0x8, 0x0,
1080 0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0,
1081 0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1,
1082 0x2, 0, 0, 0, 0, 0, 0, 0,
1083 0x88, 0x99, 0, 0, 0, 0, 0, 0,
1084 0, 0, 0, 0, 0, 0, 0, 0,
1085 0, 1, 0, 0, 0x10, 0x9, 0x8, 0x0,
1086 0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0,
1087 0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1,
1088 0x3, 0, 0, 0, 0, 0, 0, 0,
1089 0x88, 0x99, 0, 0, 0, 0, 0, 0,
1090 0, 0, 0, 0, 0, 0, 0, 0,
1094 port_a = target_dev_id + 1;
1095 port_b = port_a + 1;
1096 memcpy(p, sas_pcd_m_pg, sizeof(sas_pcd_m_pg));
1097 p[20] = (port_a >> 24);
1098 p[21] = (port_a >> 16) & 0xff;
1099 p[22] = (port_a >> 8) & 0xff;
1100 p[23] = port_a & 0xff;
1101 p[48 + 20] = (port_b >> 24);
1102 p[48 + 21] = (port_b >> 16) & 0xff;
1103 p[48 + 22] = (port_b >> 8) & 0xff;
1104 p[48 + 23] = port_b & 0xff;
1106 memset(p + 4, 0, sizeof(sas_pcd_m_pg) - 4);
1107 return sizeof(sas_pcd_m_pg);
1110 static int resp_sas_sha_m_spg(unsigned char * p, int pcontrol)
1111 { /* SAS SSP shared protocol specific port mode subpage */
1112 unsigned char sas_sha_m_pg[] = {0x59, 0x2, 0, 0xc, 0, 0x6, 0x10, 0,
1113 0, 0, 0, 0, 0, 0, 0, 0,
1116 memcpy(p, sas_sha_m_pg, sizeof(sas_sha_m_pg));
1118 memset(p + 4, 0, sizeof(sas_sha_m_pg) - 4);
1119 return sizeof(sas_sha_m_pg);
1122 #define SDEBUG_MAX_MSENSE_SZ 256
1124 static int resp_mode_sense(struct scsi_cmnd * scp, int target,
1125 struct sdebug_dev_info * devip)
1127 unsigned char dbd, llbaa;
1128 int pcontrol, pcode, subpcode, bd_len;
1129 unsigned char dev_spec;
1130 int k, alloc_len, msense_6, offset, len, errsts, target_dev_id;
1132 unsigned char arr[SDEBUG_MAX_MSENSE_SZ];
1133 unsigned char *cmd = (unsigned char *)scp->cmnd;
1135 if ((errsts = check_readiness(scp, 1, devip)))
1137 dbd = !!(cmd[1] & 0x8);
1138 pcontrol = (cmd[2] & 0xc0) >> 6;
1139 pcode = cmd[2] & 0x3f;
1141 msense_6 = (MODE_SENSE == cmd[0]);
1142 llbaa = msense_6 ? 0 : !!(cmd[1] & 0x10);
1143 if ((0 == scsi_debug_ptype) && (0 == dbd))
1144 bd_len = llbaa ? 16 : 8;
1147 alloc_len = msense_6 ? cmd[4] : ((cmd[7] << 8) | cmd[8]);
1148 memset(arr, 0, SDEBUG_MAX_MSENSE_SZ);
1149 if (0x3 == pcontrol) { /* Saving values not supported */
1150 mk_sense_buffer(devip, ILLEGAL_REQUEST, SAVING_PARAMS_UNSUP,
1152 return check_condition_result;
1154 target_dev_id = ((devip->sdbg_host->shost->host_no + 1) * 2000) +
1155 (devip->target * 1000) - 3;
1156 /* set DPOFUA bit for disks */
1157 if (0 == scsi_debug_ptype)
1158 dev_spec = (DEV_READONLY(target) ? 0x80 : 0x0) | 0x10;
1168 arr[4] = 0x1; /* set LONGLBA bit */
1169 arr[7] = bd_len; /* assume 255 or less */
1173 if ((bd_len > 0) && (0 == sdebug_capacity)) {
1174 if (scsi_debug_virtual_gb > 0) {
1175 sdebug_capacity = 2048 * 1024;
1176 sdebug_capacity *= scsi_debug_virtual_gb;
1178 sdebug_capacity = sdebug_store_sectors;
1181 if (sdebug_capacity > 0xfffffffe) {
1187 ap[0] = (sdebug_capacity >> 24) & 0xff;
1188 ap[1] = (sdebug_capacity >> 16) & 0xff;
1189 ap[2] = (sdebug_capacity >> 8) & 0xff;
1190 ap[3] = sdebug_capacity & 0xff;
1192 ap[6] = (SECT_SIZE_PER(target) >> 8) & 0xff;
1193 ap[7] = SECT_SIZE_PER(target) & 0xff;
1196 } else if (16 == bd_len) {
1197 unsigned long long capac = sdebug_capacity;
1199 for (k = 0; k < 8; ++k, capac >>= 8)
1200 ap[7 - k] = capac & 0xff;
1201 ap[12] = (SECT_SIZE_PER(target) >> 24) & 0xff;
1202 ap[13] = (SECT_SIZE_PER(target) >> 16) & 0xff;
1203 ap[14] = (SECT_SIZE_PER(target) >> 8) & 0xff;
1204 ap[15] = SECT_SIZE_PER(target) & 0xff;
1209 if ((subpcode > 0x0) && (subpcode < 0xff) && (0x19 != pcode)) {
1210 /* TODO: Control Extension page */
1211 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1213 return check_condition_result;
1216 case 0x1: /* Read-Write error recovery page, direct access */
1217 len = resp_err_recov_pg(ap, pcontrol, target);
1220 case 0x2: /* Disconnect-Reconnect page, all devices */
1221 len = resp_disconnect_pg(ap, pcontrol, target);
1224 case 0x3: /* Format device page, direct access */
1225 len = resp_format_pg(ap, pcontrol, target);
1228 case 0x8: /* Caching page, direct access */
1229 len = resp_caching_pg(ap, pcontrol, target);
1232 case 0xa: /* Control Mode page, all devices */
1233 len = resp_ctrl_m_pg(ap, pcontrol, target);
1236 case 0x19: /* if spc==1 then sas phy, control+discover */
1237 if ((subpcode > 0x2) && (subpcode < 0xff)) {
1238 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1239 INVALID_FIELD_IN_CDB, 0);
1240 return check_condition_result;
1243 if ((0x0 == subpcode) || (0xff == subpcode))
1244 len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
1245 if ((0x1 == subpcode) || (0xff == subpcode))
1246 len += resp_sas_pcd_m_spg(ap + len, pcontrol, target,
1248 if ((0x2 == subpcode) || (0xff == subpcode))
1249 len += resp_sas_sha_m_spg(ap + len, pcontrol);
1252 case 0x1c: /* Informational Exceptions Mode page, all devices */
1253 len = resp_iec_m_pg(ap, pcontrol, target);
1256 case 0x3f: /* Read all Mode pages */
1257 if ((0 == subpcode) || (0xff == subpcode)) {
1258 len = resp_err_recov_pg(ap, pcontrol, target);
1259 len += resp_disconnect_pg(ap + len, pcontrol, target);
1260 len += resp_format_pg(ap + len, pcontrol, target);
1261 len += resp_caching_pg(ap + len, pcontrol, target);
1262 len += resp_ctrl_m_pg(ap + len, pcontrol, target);
1263 len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
1264 if (0xff == subpcode) {
1265 len += resp_sas_pcd_m_spg(ap + len, pcontrol,
1266 target, target_dev_id);
1267 len += resp_sas_sha_m_spg(ap + len, pcontrol);
1269 len += resp_iec_m_pg(ap + len, pcontrol, target);
1271 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1272 INVALID_FIELD_IN_CDB, 0);
1273 return check_condition_result;
1278 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1280 return check_condition_result;
1283 arr[0] = offset - 1;
1285 arr[0] = ((offset - 2) >> 8) & 0xff;
1286 arr[1] = (offset - 2) & 0xff;
1288 return fill_from_dev_buffer(scp, arr, min(alloc_len, offset));
1291 #define SDEBUG_MAX_MSELECT_SZ 512
1293 static int resp_mode_select(struct scsi_cmnd * scp, int mselect6,
1294 struct sdebug_dev_info * devip)
1296 int pf, sp, ps, md_len, bd_len, off, spf, pg_len;
1297 int param_len, res, errsts, mpage;
1298 unsigned char arr[SDEBUG_MAX_MSELECT_SZ];
1299 unsigned char *cmd = (unsigned char *)scp->cmnd;
1301 if ((errsts = check_readiness(scp, 1, devip)))
1303 memset(arr, 0, sizeof(arr));
1306 param_len = mselect6 ? cmd[4] : ((cmd[7] << 8) + cmd[8]);
1307 if ((0 == pf) || sp || (param_len > SDEBUG_MAX_MSELECT_SZ)) {
1308 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1309 INVALID_FIELD_IN_CDB, 0);
1310 return check_condition_result;
1312 res = fetch_to_dev_buffer(scp, arr, param_len);
1314 return (DID_ERROR << 16);
1315 else if ((res < param_len) &&
1316 (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
1317 printk(KERN_INFO "scsi_debug: mode_select: cdb indicated=%d, "
1318 " IO sent=%d bytes\n", param_len, res);
1319 md_len = mselect6 ? (arr[0] + 1) : ((arr[0] << 8) + arr[1] + 2);
1320 bd_len = mselect6 ? arr[3] : ((arr[6] << 8) + arr[7]);
1322 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1323 INVALID_FIELD_IN_PARAM_LIST, 0);
1324 return check_condition_result;
1326 off = bd_len + (mselect6 ? 4 : 8);
1327 mpage = arr[off] & 0x3f;
1328 ps = !!(arr[off] & 0x80);
1330 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1331 INVALID_FIELD_IN_PARAM_LIST, 0);
1332 return check_condition_result;
1334 spf = !!(arr[off] & 0x40);
1335 pg_len = spf ? ((arr[off + 2] << 8) + arr[off + 3] + 4) :
1337 if ((pg_len + off) > param_len) {
1338 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1339 PARAMETER_LIST_LENGTH_ERR, 0);
1340 return check_condition_result;
1343 case 0xa: /* Control Mode page */
1344 if (ctrl_m_pg[1] == arr[off + 1]) {
1345 memcpy(ctrl_m_pg + 2, arr + off + 2,
1346 sizeof(ctrl_m_pg) - 2);
1347 scsi_debug_dsense = !!(ctrl_m_pg[2] & 0x4);
1351 case 0x1c: /* Informational Exceptions Mode page */
1352 if (iec_m_pg[1] == arr[off + 1]) {
1353 memcpy(iec_m_pg + 2, arr + off + 2,
1354 sizeof(iec_m_pg) - 2);
1361 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1362 INVALID_FIELD_IN_PARAM_LIST, 0);
1363 return check_condition_result;
1366 static int resp_temp_l_pg(unsigned char * arr)
1368 unsigned char temp_l_pg[] = {0x0, 0x0, 0x3, 0x2, 0x0, 38,
1369 0x0, 0x1, 0x3, 0x2, 0x0, 65,
1372 memcpy(arr, temp_l_pg, sizeof(temp_l_pg));
1373 return sizeof(temp_l_pg);
1376 static int resp_ie_l_pg(unsigned char * arr)
1378 unsigned char ie_l_pg[] = {0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 38,
1381 memcpy(arr, ie_l_pg, sizeof(ie_l_pg));
1382 if (iec_m_pg[2] & 0x4) { /* TEST bit set */
1383 arr[4] = THRESHOLD_EXCEEDED;
1386 return sizeof(ie_l_pg);
1389 #define SDEBUG_MAX_LSENSE_SZ 512
1391 static int resp_log_sense(struct scsi_cmnd * scp,
1392 struct sdebug_dev_info * devip)
1394 int ppc, sp, pcontrol, pcode, subpcode, alloc_len, errsts, len, n;
1395 unsigned char arr[SDEBUG_MAX_LSENSE_SZ];
1396 unsigned char *cmd = (unsigned char *)scp->cmnd;
1398 if ((errsts = check_readiness(scp, 1, devip)))
1400 memset(arr, 0, sizeof(arr));
1404 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1405 INVALID_FIELD_IN_CDB, 0);
1406 return check_condition_result;
1408 pcontrol = (cmd[2] & 0xc0) >> 6;
1409 pcode = cmd[2] & 0x3f;
1410 subpcode = cmd[3] & 0xff;
1411 alloc_len = (cmd[7] << 8) + cmd[8];
1413 if (0 == subpcode) {
1415 case 0x0: /* Supported log pages log page */
1417 arr[n++] = 0x0; /* this page */
1418 arr[n++] = 0xd; /* Temperature */
1419 arr[n++] = 0x2f; /* Informational exceptions */
1422 case 0xd: /* Temperature log page */
1423 arr[3] = resp_temp_l_pg(arr + 4);
1425 case 0x2f: /* Informational exceptions log page */
1426 arr[3] = resp_ie_l_pg(arr + 4);
1429 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1430 INVALID_FIELD_IN_CDB, 0);
1431 return check_condition_result;
1433 } else if (0xff == subpcode) {
1437 case 0x0: /* Supported log pages and subpages log page */
1440 arr[n++] = 0x0; /* 0,0 page */
1442 arr[n++] = 0xff; /* this page */
1444 arr[n++] = 0x0; /* Temperature */
1446 arr[n++] = 0x0; /* Informational exceptions */
1449 case 0xd: /* Temperature subpages */
1452 arr[n++] = 0x0; /* Temperature */
1455 case 0x2f: /* Informational exceptions subpages */
1458 arr[n++] = 0x0; /* Informational exceptions */
1462 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1463 INVALID_FIELD_IN_CDB, 0);
1464 return check_condition_result;
1467 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1468 INVALID_FIELD_IN_CDB, 0);
1469 return check_condition_result;
1471 len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len);
1472 return fill_from_dev_buffer(scp, arr,
1473 min(len, SDEBUG_MAX_INQ_ARR_SZ));
1476 static int resp_read(struct scsi_cmnd * SCpnt, unsigned long long lba,
1477 unsigned int num, struct sdebug_dev_info * devip)
1479 unsigned long iflags;
1480 unsigned int block, from_bottom;
1481 unsigned long long u;
1484 if (lba + num > sdebug_capacity) {
1485 mk_sense_buffer(devip, ILLEGAL_REQUEST, ADDR_OUT_OF_RANGE,
1487 return check_condition_result;
1489 /* transfer length excessive (tie in to block limits VPD page) */
1490 if (num > sdebug_store_sectors) {
1491 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1493 return check_condition_result;
1495 if ((SCSI_DEBUG_OPT_MEDIUM_ERR & scsi_debug_opts) &&
1496 (lba <= OPT_MEDIUM_ERR_ADDR) &&
1497 ((lba + num) > OPT_MEDIUM_ERR_ADDR)) {
1498 /* claim unrecoverable read error */
1499 mk_sense_buffer(devip, MEDIUM_ERROR, UNRECOVERED_READ_ERR,
1501 /* set info field and valid bit for fixed descriptor */
1502 if (0x70 == (devip->sense_buff[0] & 0x7f)) {
1503 devip->sense_buff[0] |= 0x80; /* Valid bit */
1504 ret = OPT_MEDIUM_ERR_ADDR;
1505 devip->sense_buff[3] = (ret >> 24) & 0xff;
1506 devip->sense_buff[4] = (ret >> 16) & 0xff;
1507 devip->sense_buff[5] = (ret >> 8) & 0xff;
1508 devip->sense_buff[6] = ret & 0xff;
1510 return check_condition_result;
1512 read_lock_irqsave(&atomic_rw, iflags);
1513 if ((lba + num) <= sdebug_store_sectors)
1514 ret = fill_from_dev_buffer(SCpnt,
1515 fake_storep + (lba * SECT_SIZE),
1518 /* modulo when one arg is 64 bits needs do_div() */
1520 block = do_div(u, sdebug_store_sectors);
1522 if ((block + num) > sdebug_store_sectors)
1523 from_bottom = (block + num) - sdebug_store_sectors;
1524 ret = fill_from_dev_buffer(SCpnt,
1525 fake_storep + (block * SECT_SIZE),
1526 (num - from_bottom) * SECT_SIZE);
1527 if ((0 == ret) && (from_bottom > 0))
1528 ret = fill_from_dev_buffer(SCpnt, fake_storep,
1529 from_bottom * SECT_SIZE);
1531 read_unlock_irqrestore(&atomic_rw, iflags);
1535 static int resp_write(struct scsi_cmnd * SCpnt, unsigned long long lba,
1536 unsigned int num, struct sdebug_dev_info * devip)
1538 unsigned long iflags;
1539 unsigned int block, to_bottom;
1540 unsigned long long u;
1543 if (lba + num > sdebug_capacity) {
1544 mk_sense_buffer(devip, ILLEGAL_REQUEST, ADDR_OUT_OF_RANGE,
1546 return check_condition_result;
1548 /* transfer length excessive (tie in to block limits VPD page) */
1549 if (num > sdebug_store_sectors) {
1550 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1552 return check_condition_result;
1555 write_lock_irqsave(&atomic_rw, iflags);
1556 if ((lba + num) <= sdebug_store_sectors)
1557 res = fetch_to_dev_buffer(SCpnt,
1558 fake_storep + (lba * SECT_SIZE),
1561 /* modulo when one arg is 64 bits needs do_div() */
1563 block = do_div(u, sdebug_store_sectors);
1565 if ((block + num) > sdebug_store_sectors)
1566 to_bottom = (block + num) - sdebug_store_sectors;
1567 res = fetch_to_dev_buffer(SCpnt,
1568 fake_storep + (block * SECT_SIZE),
1569 (num - to_bottom) * SECT_SIZE);
1570 if ((0 == res) && (to_bottom > 0))
1571 res = fetch_to_dev_buffer(SCpnt, fake_storep,
1572 to_bottom * SECT_SIZE);
1574 write_unlock_irqrestore(&atomic_rw, iflags);
1576 return (DID_ERROR << 16);
1577 else if ((res < (num * SECT_SIZE)) &&
1578 (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
1579 printk(KERN_INFO "scsi_debug: write: cdb indicated=%u, "
1580 " IO sent=%d bytes\n", num * SECT_SIZE, res);
1584 #define SDEBUG_RLUN_ARR_SZ 256
1586 static int resp_report_luns(struct scsi_cmnd * scp,
1587 struct sdebug_dev_info * devip)
1589 unsigned int alloc_len;
1590 int lun_cnt, i, upper, num, n, wlun, lun;
1591 unsigned char *cmd = (unsigned char *)scp->cmnd;
1592 int select_report = (int)cmd[2];
1593 struct scsi_lun *one_lun;
1594 unsigned char arr[SDEBUG_RLUN_ARR_SZ];
1595 unsigned char * max_addr;
1597 alloc_len = cmd[9] + (cmd[8] << 8) + (cmd[7] << 16) + (cmd[6] << 24);
1598 if ((alloc_len < 4) || (select_report > 2)) {
1599 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1601 return check_condition_result;
1603 /* can produce response with up to 16k luns (lun 0 to lun 16383) */
1604 memset(arr, 0, SDEBUG_RLUN_ARR_SZ);
1605 lun_cnt = scsi_debug_max_luns;
1606 if (1 == select_report)
1608 else if (scsi_debug_no_lun_0 && (lun_cnt > 0))
1610 wlun = (select_report > 0) ? 1 : 0;
1611 num = lun_cnt + wlun;
1612 arr[2] = ((sizeof(struct scsi_lun) * num) >> 8) & 0xff;
1613 arr[3] = (sizeof(struct scsi_lun) * num) & 0xff;
1614 n = min((int)((SDEBUG_RLUN_ARR_SZ - 8) /
1615 sizeof(struct scsi_lun)), num);
1620 one_lun = (struct scsi_lun *) &arr[8];
1621 max_addr = arr + SDEBUG_RLUN_ARR_SZ;
1622 for (i = 0, lun = (scsi_debug_no_lun_0 ? 1 : 0);
1623 ((i < lun_cnt) && ((unsigned char *)(one_lun + i) < max_addr));
1625 upper = (lun >> 8) & 0x3f;
1627 one_lun[i].scsi_lun[0] =
1628 (upper | (SAM2_LUN_ADDRESS_METHOD << 6));
1629 one_lun[i].scsi_lun[1] = lun & 0xff;
1632 one_lun[i].scsi_lun[0] = (SAM2_WLUN_REPORT_LUNS >> 8) & 0xff;
1633 one_lun[i].scsi_lun[1] = SAM2_WLUN_REPORT_LUNS & 0xff;
1636 alloc_len = (unsigned char *)(one_lun + i) - arr;
1637 return fill_from_dev_buffer(scp, arr,
1638 min((int)alloc_len, SDEBUG_RLUN_ARR_SZ));
1641 static int resp_xdwriteread(struct scsi_cmnd *scp, unsigned long long lba,
1642 unsigned int num, struct sdebug_dev_info *devip)
1645 unsigned char *kaddr, *buf;
1646 unsigned int offset;
1647 struct scatterlist *sg;
1648 struct scsi_data_buffer *sdb = scsi_in(scp);
1650 /* better not to use temporary buffer. */
1651 buf = kmalloc(scsi_bufflen(scp), GFP_ATOMIC);
1655 scsi_sg_copy_to_buffer(scp, buf, scsi_bufflen(scp));
1658 for_each_sg(sdb->table.sgl, sg, sdb->table.nents, i) {
1659 kaddr = (unsigned char *)kmap_atomic(sg_page(sg), KM_USER0);
1663 for (j = 0; j < sg->length; j++)
1664 *(kaddr + sg->offset + j) ^= *(buf + offset + j);
1666 offset += sg->length;
1667 kunmap_atomic(kaddr, KM_USER0);
1676 /* When timer goes off this function is called. */
1677 static void timer_intr_handler(unsigned long indx)
1679 struct sdebug_queued_cmd * sqcp;
1680 unsigned long iflags;
1682 if (indx >= SCSI_DEBUG_CANQUEUE) {
1683 printk(KERN_ERR "scsi_debug:timer_intr_handler: indx too "
1687 spin_lock_irqsave(&queued_arr_lock, iflags);
1688 sqcp = &queued_arr[(int)indx];
1689 if (! sqcp->in_use) {
1690 printk(KERN_ERR "scsi_debug:timer_intr_handler: Unexpected "
1692 spin_unlock_irqrestore(&queued_arr_lock, iflags);
1696 if (sqcp->done_funct) {
1697 sqcp->a_cmnd->result = sqcp->scsi_result;
1698 sqcp->done_funct(sqcp->a_cmnd); /* callback to mid level */
1700 sqcp->done_funct = NULL;
1701 spin_unlock_irqrestore(&queued_arr_lock, iflags);
1704 static int scsi_debug_slave_alloc(struct scsi_device * sdp)
1706 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1707 printk(KERN_INFO "scsi_debug: slave_alloc <%u %u %u %u>\n",
1708 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
1709 set_bit(QUEUE_FLAG_BIDI, &sdp->request_queue->queue_flags);
1713 static int scsi_debug_slave_configure(struct scsi_device * sdp)
1715 struct sdebug_dev_info * devip;
1717 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1718 printk(KERN_INFO "scsi_debug: slave_configure <%u %u %u %u>\n",
1719 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
1720 if (sdp->host->max_cmd_len != SCSI_DEBUG_MAX_CMD_LEN)
1721 sdp->host->max_cmd_len = SCSI_DEBUG_MAX_CMD_LEN;
1722 devip = devInfoReg(sdp);
1724 return 1; /* no resources, will be marked offline */
1725 sdp->hostdata = devip;
1726 if (sdp->host->cmd_per_lun)
1727 scsi_adjust_queue_depth(sdp, SDEBUG_TAGGED_QUEUING,
1728 sdp->host->cmd_per_lun);
1729 blk_queue_max_segment_size(sdp->request_queue, 256 * 1024);
1733 static void scsi_debug_slave_destroy(struct scsi_device * sdp)
1735 struct sdebug_dev_info * devip =
1736 (struct sdebug_dev_info *)sdp->hostdata;
1738 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1739 printk(KERN_INFO "scsi_debug: slave_destroy <%u %u %u %u>\n",
1740 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
1742 /* make this slot avaliable for re-use */
1744 sdp->hostdata = NULL;
1748 struct sdebug_dev_info *sdebug_device_create(struct sdebug_host_info *sdbg_host,
1751 struct sdebug_dev_info *devip;
1753 devip = kzalloc(sizeof(*devip), flags);
1755 devip->sdbg_host = sdbg_host;
1756 list_add_tail(&devip->dev_list, &sdbg_host->dev_info_list);
1761 static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev)
1763 struct sdebug_host_info * sdbg_host;
1764 struct sdebug_dev_info * open_devip = NULL;
1765 struct sdebug_dev_info * devip =
1766 (struct sdebug_dev_info *)sdev->hostdata;
1770 sdbg_host = *(struct sdebug_host_info **)shost_priv(sdev->host);
1772 printk(KERN_ERR "Host info NULL\n");
1775 list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) {
1776 if ((devip->used) && (devip->channel == sdev->channel) &&
1777 (devip->target == sdev->id) &&
1778 (devip->lun == sdev->lun))
1781 if ((!devip->used) && (!open_devip))
1785 if (!open_devip) { /* try and make a new one */
1786 open_devip = sdebug_device_create(sdbg_host, GFP_ATOMIC);
1788 printk(KERN_ERR "%s: out of memory at line %d\n",
1789 __FUNCTION__, __LINE__);
1794 open_devip->channel = sdev->channel;
1795 open_devip->target = sdev->id;
1796 open_devip->lun = sdev->lun;
1797 open_devip->sdbg_host = sdbg_host;
1798 open_devip->reset = 1;
1799 open_devip->used = 1;
1800 memset(open_devip->sense_buff, 0, SDEBUG_SENSE_LEN);
1801 if (scsi_debug_dsense)
1802 open_devip->sense_buff[0] = 0x72;
1804 open_devip->sense_buff[0] = 0x70;
1805 open_devip->sense_buff[7] = 0xa;
1807 if (sdev->lun == SAM2_WLUN_REPORT_LUNS)
1808 open_devip->wlun = SAM2_WLUN_REPORT_LUNS & 0xff;
1813 static void mk_sense_buffer(struct sdebug_dev_info * devip, int key,
1816 unsigned char *sbuff;
1818 sbuff = devip->sense_buff;
1819 memset(sbuff, 0, SDEBUG_SENSE_LEN);
1821 scsi_build_sense_buffer(scsi_debug_dsense, sbuff, key, asc, asq);
1823 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1824 printk(KERN_INFO "scsi_debug: [sense_key,asc,ascq]: "
1825 "[0x%x,0x%x,0x%x]\n", key, asc, asq);
1828 static int scsi_debug_abort(struct scsi_cmnd * SCpnt)
1830 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1831 printk(KERN_INFO "scsi_debug: abort\n");
1833 stop_queued_cmnd(SCpnt);
1837 static int scsi_debug_biosparam(struct scsi_device *sdev,
1838 struct block_device * bdev, sector_t capacity, int *info)
1843 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1844 printk(KERN_INFO "scsi_debug: biosparam\n");
1845 buf = scsi_bios_ptable(bdev);
1847 res = scsi_partsize(buf, capacity,
1848 &info[2], &info[0], &info[1]);
1853 info[0] = sdebug_heads;
1854 info[1] = sdebug_sectors_per;
1855 info[2] = sdebug_cylinders_per;
1859 static int scsi_debug_device_reset(struct scsi_cmnd * SCpnt)
1861 struct sdebug_dev_info * devip;
1863 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1864 printk(KERN_INFO "scsi_debug: device_reset\n");
1867 devip = devInfoReg(SCpnt->device);
1874 static int scsi_debug_bus_reset(struct scsi_cmnd * SCpnt)
1876 struct sdebug_host_info *sdbg_host;
1877 struct sdebug_dev_info * dev_info;
1878 struct scsi_device * sdp;
1879 struct Scsi_Host * hp;
1881 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1882 printk(KERN_INFO "scsi_debug: bus_reset\n");
1884 if (SCpnt && ((sdp = SCpnt->device)) && ((hp = sdp->host))) {
1885 sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
1887 list_for_each_entry(dev_info,
1888 &sdbg_host->dev_info_list,
1890 dev_info->reset = 1;
1896 static int scsi_debug_host_reset(struct scsi_cmnd * SCpnt)
1898 struct sdebug_host_info * sdbg_host;
1899 struct sdebug_dev_info * dev_info;
1901 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1902 printk(KERN_INFO "scsi_debug: host_reset\n");
1904 spin_lock(&sdebug_host_list_lock);
1905 list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
1906 list_for_each_entry(dev_info, &sdbg_host->dev_info_list,
1908 dev_info->reset = 1;
1910 spin_unlock(&sdebug_host_list_lock);
1915 /* Returns 1 if found 'cmnd' and deleted its timer. else returns 0 */
1916 static int stop_queued_cmnd(struct scsi_cmnd * cmnd)
1918 unsigned long iflags;
1920 struct sdebug_queued_cmd * sqcp;
1922 spin_lock_irqsave(&queued_arr_lock, iflags);
1923 for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
1924 sqcp = &queued_arr[k];
1925 if (sqcp->in_use && (cmnd == sqcp->a_cmnd)) {
1926 del_timer_sync(&sqcp->cmnd_timer);
1928 sqcp->a_cmnd = NULL;
1932 spin_unlock_irqrestore(&queued_arr_lock, iflags);
1933 return (k < SCSI_DEBUG_CANQUEUE) ? 1 : 0;
1936 /* Deletes (stops) timers of all queued commands */
1937 static void stop_all_queued(void)
1939 unsigned long iflags;
1941 struct sdebug_queued_cmd * sqcp;
1943 spin_lock_irqsave(&queued_arr_lock, iflags);
1944 for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
1945 sqcp = &queued_arr[k];
1946 if (sqcp->in_use && sqcp->a_cmnd) {
1947 del_timer_sync(&sqcp->cmnd_timer);
1949 sqcp->a_cmnd = NULL;
1952 spin_unlock_irqrestore(&queued_arr_lock, iflags);
1955 /* Initializes timers in queued array */
1956 static void __init init_all_queued(void)
1958 unsigned long iflags;
1960 struct sdebug_queued_cmd * sqcp;
1962 spin_lock_irqsave(&queued_arr_lock, iflags);
1963 for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
1964 sqcp = &queued_arr[k];
1965 init_timer(&sqcp->cmnd_timer);
1967 sqcp->a_cmnd = NULL;
1969 spin_unlock_irqrestore(&queued_arr_lock, iflags);
1972 static void __init sdebug_build_parts(unsigned char * ramp)
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) || (sdebug_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 sdebug_store_size = (unsigned int)scsi_debug_dev_size_mb * 1048576;
2509 sdebug_store_sectors = sdebug_store_size / 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 sz = sdebug_store_size;
2534 fake_storep = vmalloc(sz);
2535 if (NULL == fake_storep) {
2536 printk(KERN_ERR "scsi_debug_init: out of memory, 1\n");
2539 memset(fake_storep, 0, sz);
2540 if (scsi_debug_num_parts > 0)
2541 sdebug_build_parts(fake_storep);
2543 ret = device_register(&pseudo_primary);
2545 printk(KERN_WARNING "scsi_debug: device_register error: %d\n",
2549 ret = bus_register(&pseudo_lld_bus);
2551 printk(KERN_WARNING "scsi_debug: bus_register error: %d\n",
2555 ret = driver_register(&sdebug_driverfs_driver);
2557 printk(KERN_WARNING "scsi_debug: driver_register error: %d\n",
2561 ret = do_create_driverfs_files();
2563 printk(KERN_WARNING "scsi_debug: driver_create_file error: %d\n",
2570 host_to_add = scsi_debug_add_host;
2571 scsi_debug_add_host = 0;
2573 for (k = 0; k < host_to_add; k++) {
2574 if (sdebug_add_adapter()) {
2575 printk(KERN_ERR "scsi_debug_init: "
2576 "sdebug_add_adapter failed k=%d\n", k);
2581 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
2582 printk(KERN_INFO "scsi_debug_init: built %d host(s)\n",
2583 scsi_debug_add_host);
2588 do_remove_driverfs_files();
2589 driver_unregister(&sdebug_driverfs_driver);
2591 bus_unregister(&pseudo_lld_bus);
2593 device_unregister(&pseudo_primary);
2600 static void __exit scsi_debug_exit(void)
2602 int k = scsi_debug_add_host;
2606 sdebug_remove_adapter();
2607 do_remove_driverfs_files();
2608 driver_unregister(&sdebug_driverfs_driver);
2609 bus_unregister(&pseudo_lld_bus);
2610 device_unregister(&pseudo_primary);
2615 device_initcall(scsi_debug_init);
2616 module_exit(scsi_debug_exit);
2618 static void pseudo_0_release(struct device * dev)
2620 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2621 printk(KERN_INFO "scsi_debug: pseudo_0_release() called\n");
2624 static struct device pseudo_primary = {
2625 .bus_id = "pseudo_0",
2626 .release = pseudo_0_release,
2629 static int pseudo_lld_bus_match(struct device *dev,
2630 struct device_driver *dev_driver)
2635 static struct bus_type pseudo_lld_bus = {
2637 .match = pseudo_lld_bus_match,
2638 .probe = sdebug_driver_probe,
2639 .remove = sdebug_driver_remove,
2642 static void sdebug_release_adapter(struct device * dev)
2644 struct sdebug_host_info *sdbg_host;
2646 sdbg_host = to_sdebug_host(dev);
2650 static int sdebug_add_adapter(void)
2652 int k, devs_per_host;
2654 struct sdebug_host_info *sdbg_host;
2655 struct sdebug_dev_info *sdbg_devinfo, *tmp;
2657 sdbg_host = kzalloc(sizeof(*sdbg_host),GFP_KERNEL);
2658 if (NULL == sdbg_host) {
2659 printk(KERN_ERR "%s: out of memory at line %d\n",
2660 __FUNCTION__, __LINE__);
2664 INIT_LIST_HEAD(&sdbg_host->dev_info_list);
2666 devs_per_host = scsi_debug_num_tgts * scsi_debug_max_luns;
2667 for (k = 0; k < devs_per_host; k++) {
2668 sdbg_devinfo = sdebug_device_create(sdbg_host, GFP_KERNEL);
2669 if (!sdbg_devinfo) {
2670 printk(KERN_ERR "%s: out of memory at line %d\n",
2671 __FUNCTION__, __LINE__);
2677 spin_lock(&sdebug_host_list_lock);
2678 list_add_tail(&sdbg_host->host_list, &sdebug_host_list);
2679 spin_unlock(&sdebug_host_list_lock);
2681 sdbg_host->dev.bus = &pseudo_lld_bus;
2682 sdbg_host->dev.parent = &pseudo_primary;
2683 sdbg_host->dev.release = &sdebug_release_adapter;
2684 sprintf(sdbg_host->dev.bus_id, "adapter%d", scsi_debug_add_host);
2686 error = device_register(&sdbg_host->dev);
2691 ++scsi_debug_add_host;
2695 list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
2697 list_del(&sdbg_devinfo->dev_list);
2698 kfree(sdbg_devinfo);
2705 static void sdebug_remove_adapter(void)
2707 struct sdebug_host_info * sdbg_host = NULL;
2709 spin_lock(&sdebug_host_list_lock);
2710 if (!list_empty(&sdebug_host_list)) {
2711 sdbg_host = list_entry(sdebug_host_list.prev,
2712 struct sdebug_host_info, host_list);
2713 list_del(&sdbg_host->host_list);
2715 spin_unlock(&sdebug_host_list_lock);
2720 device_unregister(&sdbg_host->dev);
2721 --scsi_debug_add_host;
2725 int scsi_debug_queuecommand(struct scsi_cmnd *SCpnt, done_funct_t done)
2727 unsigned char *cmd = (unsigned char *) SCpnt->cmnd;
2730 unsigned long long lba;
2732 int target = SCpnt->device->id;
2733 struct sdebug_dev_info *devip = NULL;
2734 int inj_recovered = 0;
2735 int inj_transport = 0;
2736 int delay_override = 0;
2738 scsi_set_resid(SCpnt, 0);
2739 if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) && cmd) {
2740 printk(KERN_INFO "scsi_debug: cmd ");
2741 for (k = 0, len = SCpnt->cmd_len; k < len; ++k)
2742 printk("%02x ", (int)cmd[k]);
2746 if (target == SCpnt->device->host->hostt->this_id) {
2747 printk(KERN_INFO "scsi_debug: initiator's id used as "
2749 return schedule_resp(SCpnt, NULL, done,
2750 DID_NO_CONNECT << 16, 0);
2753 if ((SCpnt->device->lun >= scsi_debug_max_luns) &&
2754 (SCpnt->device->lun != SAM2_WLUN_REPORT_LUNS))
2755 return schedule_resp(SCpnt, NULL, done,
2756 DID_NO_CONNECT << 16, 0);
2757 devip = devInfoReg(SCpnt->device);
2759 return schedule_resp(SCpnt, NULL, done,
2760 DID_NO_CONNECT << 16, 0);
2762 if ((scsi_debug_every_nth != 0) &&
2763 (++scsi_debug_cmnd_count >= abs(scsi_debug_every_nth))) {
2764 scsi_debug_cmnd_count = 0;
2765 if (scsi_debug_every_nth < -1)
2766 scsi_debug_every_nth = -1;
2767 if (SCSI_DEBUG_OPT_TIMEOUT & scsi_debug_opts)
2768 return 0; /* ignore command causing timeout */
2769 else if (SCSI_DEBUG_OPT_RECOVERED_ERR & scsi_debug_opts)
2770 inj_recovered = 1; /* to reads and writes below */
2771 else if (SCSI_DEBUG_OPT_TRANSPORT_ERR & scsi_debug_opts)
2772 inj_transport = 1; /* to reads and writes below */
2779 case TEST_UNIT_READY:
2781 break; /* only allowable wlun commands */
2783 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2784 printk(KERN_INFO "scsi_debug: Opcode: 0x%x "
2785 "not supported for wlun\n", *cmd);
2786 mk_sense_buffer(devip, ILLEGAL_REQUEST,
2788 errsts = check_condition_result;
2789 return schedule_resp(SCpnt, devip, done, errsts,
2795 case INQUIRY: /* mandatory, ignore unit attention */
2797 errsts = resp_inquiry(SCpnt, target, devip);
2799 case REQUEST_SENSE: /* mandatory, ignore unit attention */
2801 errsts = resp_requests(SCpnt, devip);
2803 case REZERO_UNIT: /* actually this is REWIND for SSC */
2805 errsts = resp_start_stop(SCpnt, devip);
2807 case ALLOW_MEDIUM_REMOVAL:
2808 errsts = check_readiness(SCpnt, 1, devip);
2811 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2812 printk(KERN_INFO "scsi_debug: Medium removal %s\n",
2813 cmd[4] ? "inhibited" : "enabled");
2815 case SEND_DIAGNOSTIC: /* mandatory */
2816 errsts = check_readiness(SCpnt, 1, devip);
2818 case TEST_UNIT_READY: /* mandatory */
2820 errsts = check_readiness(SCpnt, 0, devip);
2823 errsts = check_readiness(SCpnt, 1, devip);
2826 errsts = check_readiness(SCpnt, 1, devip);
2829 errsts = check_readiness(SCpnt, 1, devip);
2832 errsts = check_readiness(SCpnt, 1, devip);
2835 errsts = resp_readcap(SCpnt, devip);
2837 case SERVICE_ACTION_IN:
2838 if (SAI_READ_CAPACITY_16 != cmd[1]) {
2839 mk_sense_buffer(devip, ILLEGAL_REQUEST,
2841 errsts = check_condition_result;
2844 errsts = resp_readcap16(SCpnt, devip);
2846 case MAINTENANCE_IN:
2847 if (MI_REPORT_TARGET_PGS != cmd[1]) {
2848 mk_sense_buffer(devip, ILLEGAL_REQUEST,
2850 errsts = check_condition_result;
2853 errsts = resp_report_tgtpgs(SCpnt, devip);
2859 errsts = check_readiness(SCpnt, 0, devip);
2862 if (scsi_debug_fake_rw)
2864 get_data_transfer_info(cmd, &lba, &num);
2865 errsts = resp_read(SCpnt, lba, num, devip);
2866 if (inj_recovered && (0 == errsts)) {
2867 mk_sense_buffer(devip, RECOVERED_ERROR,
2868 THRESHOLD_EXCEEDED, 0);
2869 errsts = check_condition_result;
2870 } else if (inj_transport && (0 == errsts)) {
2871 mk_sense_buffer(devip, ABORTED_COMMAND,
2872 TRANSPORT_PROBLEM, ACK_NAK_TO);
2873 errsts = check_condition_result;
2876 case REPORT_LUNS: /* mandatory, ignore unit attention */
2878 errsts = resp_report_luns(SCpnt, devip);
2880 case VERIFY: /* 10 byte SBC-2 command */
2881 errsts = check_readiness(SCpnt, 0, devip);
2887 errsts = check_readiness(SCpnt, 0, devip);
2890 if (scsi_debug_fake_rw)
2892 get_data_transfer_info(cmd, &lba, &num);
2893 errsts = resp_write(SCpnt, lba, num, devip);
2894 if (inj_recovered && (0 == errsts)) {
2895 mk_sense_buffer(devip, RECOVERED_ERROR,
2896 THRESHOLD_EXCEEDED, 0);
2897 errsts = check_condition_result;
2902 errsts = resp_mode_sense(SCpnt, target, devip);
2905 errsts = resp_mode_select(SCpnt, 1, devip);
2907 case MODE_SELECT_10:
2908 errsts = resp_mode_select(SCpnt, 0, devip);
2911 errsts = resp_log_sense(SCpnt, devip);
2913 case SYNCHRONIZE_CACHE:
2915 errsts = check_readiness(SCpnt, 0, devip);
2918 errsts = check_readiness(SCpnt, 1, devip);
2920 case XDWRITEREAD_10:
2921 if (!scsi_bidi_cmnd(SCpnt)) {
2922 mk_sense_buffer(devip, ILLEGAL_REQUEST,
2923 INVALID_FIELD_IN_CDB, 0);
2924 errsts = check_condition_result;
2928 errsts = check_readiness(SCpnt, 0, devip);
2931 if (scsi_debug_fake_rw)
2933 get_data_transfer_info(cmd, &lba, &num);
2934 errsts = resp_read(SCpnt, lba, num, devip);
2937 errsts = resp_write(SCpnt, lba, num, devip);
2940 errsts = resp_xdwriteread(SCpnt, lba, num, devip);
2943 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2944 printk(KERN_INFO "scsi_debug: Opcode: 0x%x not "
2945 "supported\n", *cmd);
2946 errsts = check_readiness(SCpnt, 1, devip);
2948 break; /* Unit attention takes precedence */
2949 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_OPCODE, 0);
2950 errsts = check_condition_result;
2953 return schedule_resp(SCpnt, devip, done, errsts,
2954 (delay_override ? 0 : scsi_debug_delay));
2957 static struct scsi_host_template sdebug_driver_template = {
2958 .proc_info = scsi_debug_proc_info,
2959 .proc_name = sdebug_proc_name,
2960 .name = "SCSI DEBUG",
2961 .info = scsi_debug_info,
2962 .slave_alloc = scsi_debug_slave_alloc,
2963 .slave_configure = scsi_debug_slave_configure,
2964 .slave_destroy = scsi_debug_slave_destroy,
2965 .ioctl = scsi_debug_ioctl,
2966 .queuecommand = scsi_debug_queuecommand,
2967 .eh_abort_handler = scsi_debug_abort,
2968 .eh_bus_reset_handler = scsi_debug_bus_reset,
2969 .eh_device_reset_handler = scsi_debug_device_reset,
2970 .eh_host_reset_handler = scsi_debug_host_reset,
2971 .bios_param = scsi_debug_biosparam,
2972 .can_queue = SCSI_DEBUG_CANQUEUE,
2974 .sg_tablesize = 256,
2976 .max_sectors = 0xffff,
2977 .use_clustering = DISABLE_CLUSTERING,
2978 .module = THIS_MODULE,
2981 static int sdebug_driver_probe(struct device * dev)
2984 struct sdebug_host_info *sdbg_host;
2985 struct Scsi_Host *hpnt;
2987 sdbg_host = to_sdebug_host(dev);
2989 hpnt = scsi_host_alloc(&sdebug_driver_template, sizeof(sdbg_host));
2991 printk(KERN_ERR "%s: scsi_register failed\n", __FUNCTION__);
2996 sdbg_host->shost = hpnt;
2997 *((struct sdebug_host_info **)hpnt->hostdata) = sdbg_host;
2998 if ((hpnt->this_id >= 0) && (scsi_debug_num_tgts > hpnt->this_id))
2999 hpnt->max_id = scsi_debug_num_tgts + 1;
3001 hpnt->max_id = scsi_debug_num_tgts;
3002 hpnt->max_lun = SAM2_WLUN_REPORT_LUNS; /* = scsi_debug_max_luns; */
3004 error = scsi_add_host(hpnt, &sdbg_host->dev);
3006 printk(KERN_ERR "%s: scsi_add_host failed\n", __FUNCTION__);
3008 scsi_host_put(hpnt);
3010 scsi_scan_host(hpnt);
3016 static int sdebug_driver_remove(struct device * dev)
3018 struct sdebug_host_info *sdbg_host;
3019 struct sdebug_dev_info *sdbg_devinfo, *tmp;
3021 sdbg_host = to_sdebug_host(dev);
3024 printk(KERN_ERR "%s: Unable to locate host info\n",
3029 scsi_remove_host(sdbg_host->shost);
3031 list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
3033 list_del(&sdbg_devinfo->dev_list);
3034 kfree(sdbg_devinfo);
3037 scsi_host_put(sdbg_host->shost);
3041 static void sdebug_max_tgts_luns(void)
3043 struct sdebug_host_info * sdbg_host;
3044 struct Scsi_Host *hpnt;
3046 spin_lock(&sdebug_host_list_lock);
3047 list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
3048 hpnt = sdbg_host->shost;
3049 if ((hpnt->this_id >= 0) &&
3050 (scsi_debug_num_tgts > hpnt->this_id))
3051 hpnt->max_id = scsi_debug_num_tgts + 1;
3053 hpnt->max_id = scsi_debug_num_tgts;
3054 hpnt->max_lun = SAM2_WLUN_REPORT_LUNS; /* scsi_debug_max_luns; */
3056 spin_unlock(&sdebug_host_list_lock);