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 static sector_t get_sdebug_capacity(void)
828 if (scsi_debug_virtual_gb > 0)
829 return 2048 * 1024 * scsi_debug_virtual_gb;
831 return sdebug_store_sectors;
834 #define SDEBUG_READCAP_ARR_SZ 8
835 static int resp_readcap(struct scsi_cmnd * scp,
836 struct sdebug_dev_info * devip)
838 unsigned char arr[SDEBUG_READCAP_ARR_SZ];
842 if ((errsts = check_readiness(scp, 1, devip)))
844 /* following just in case virtual_gb changed */
845 sdebug_capacity = get_sdebug_capacity();
846 memset(arr, 0, SDEBUG_READCAP_ARR_SZ);
847 if (sdebug_capacity < 0xffffffff) {
848 capac = (unsigned int)sdebug_capacity - 1;
849 arr[0] = (capac >> 24);
850 arr[1] = (capac >> 16) & 0xff;
851 arr[2] = (capac >> 8) & 0xff;
852 arr[3] = capac & 0xff;
859 arr[6] = (SECT_SIZE_PER(target) >> 8) & 0xff;
860 arr[7] = SECT_SIZE_PER(target) & 0xff;
861 return fill_from_dev_buffer(scp, arr, SDEBUG_READCAP_ARR_SZ);
864 #define SDEBUG_READCAP16_ARR_SZ 32
865 static int resp_readcap16(struct scsi_cmnd * scp,
866 struct sdebug_dev_info * devip)
868 unsigned char *cmd = (unsigned char *)scp->cmnd;
869 unsigned char arr[SDEBUG_READCAP16_ARR_SZ];
870 unsigned long long capac;
871 int errsts, k, alloc_len;
873 if ((errsts = check_readiness(scp, 1, devip)))
875 alloc_len = ((cmd[10] << 24) + (cmd[11] << 16) + (cmd[12] << 8)
877 /* following just in case virtual_gb changed */
878 sdebug_capacity = get_sdebug_capacity();
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) && (!sdebug_capacity))
1173 sdebug_capacity = get_sdebug_capacity();
1176 if (sdebug_capacity > 0xfffffffe) {
1182 ap[0] = (sdebug_capacity >> 24) & 0xff;
1183 ap[1] = (sdebug_capacity >> 16) & 0xff;
1184 ap[2] = (sdebug_capacity >> 8) & 0xff;
1185 ap[3] = sdebug_capacity & 0xff;
1187 ap[6] = (SECT_SIZE_PER(target) >> 8) & 0xff;
1188 ap[7] = SECT_SIZE_PER(target) & 0xff;
1191 } else if (16 == bd_len) {
1192 unsigned long long capac = sdebug_capacity;
1194 for (k = 0; k < 8; ++k, capac >>= 8)
1195 ap[7 - k] = capac & 0xff;
1196 ap[12] = (SECT_SIZE_PER(target) >> 24) & 0xff;
1197 ap[13] = (SECT_SIZE_PER(target) >> 16) & 0xff;
1198 ap[14] = (SECT_SIZE_PER(target) >> 8) & 0xff;
1199 ap[15] = SECT_SIZE_PER(target) & 0xff;
1204 if ((subpcode > 0x0) && (subpcode < 0xff) && (0x19 != pcode)) {
1205 /* TODO: Control Extension page */
1206 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1208 return check_condition_result;
1211 case 0x1: /* Read-Write error recovery page, direct access */
1212 len = resp_err_recov_pg(ap, pcontrol, target);
1215 case 0x2: /* Disconnect-Reconnect page, all devices */
1216 len = resp_disconnect_pg(ap, pcontrol, target);
1219 case 0x3: /* Format device page, direct access */
1220 len = resp_format_pg(ap, pcontrol, target);
1223 case 0x8: /* Caching page, direct access */
1224 len = resp_caching_pg(ap, pcontrol, target);
1227 case 0xa: /* Control Mode page, all devices */
1228 len = resp_ctrl_m_pg(ap, pcontrol, target);
1231 case 0x19: /* if spc==1 then sas phy, control+discover */
1232 if ((subpcode > 0x2) && (subpcode < 0xff)) {
1233 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1234 INVALID_FIELD_IN_CDB, 0);
1235 return check_condition_result;
1238 if ((0x0 == subpcode) || (0xff == subpcode))
1239 len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
1240 if ((0x1 == subpcode) || (0xff == subpcode))
1241 len += resp_sas_pcd_m_spg(ap + len, pcontrol, target,
1243 if ((0x2 == subpcode) || (0xff == subpcode))
1244 len += resp_sas_sha_m_spg(ap + len, pcontrol);
1247 case 0x1c: /* Informational Exceptions Mode page, all devices */
1248 len = resp_iec_m_pg(ap, pcontrol, target);
1251 case 0x3f: /* Read all Mode pages */
1252 if ((0 == subpcode) || (0xff == subpcode)) {
1253 len = resp_err_recov_pg(ap, pcontrol, target);
1254 len += resp_disconnect_pg(ap + len, pcontrol, target);
1255 len += resp_format_pg(ap + len, pcontrol, target);
1256 len += resp_caching_pg(ap + len, pcontrol, target);
1257 len += resp_ctrl_m_pg(ap + len, pcontrol, target);
1258 len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
1259 if (0xff == subpcode) {
1260 len += resp_sas_pcd_m_spg(ap + len, pcontrol,
1261 target, target_dev_id);
1262 len += resp_sas_sha_m_spg(ap + len, pcontrol);
1264 len += resp_iec_m_pg(ap + len, pcontrol, target);
1266 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1267 INVALID_FIELD_IN_CDB, 0);
1268 return check_condition_result;
1273 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1275 return check_condition_result;
1278 arr[0] = offset - 1;
1280 arr[0] = ((offset - 2) >> 8) & 0xff;
1281 arr[1] = (offset - 2) & 0xff;
1283 return fill_from_dev_buffer(scp, arr, min(alloc_len, offset));
1286 #define SDEBUG_MAX_MSELECT_SZ 512
1288 static int resp_mode_select(struct scsi_cmnd * scp, int mselect6,
1289 struct sdebug_dev_info * devip)
1291 int pf, sp, ps, md_len, bd_len, off, spf, pg_len;
1292 int param_len, res, errsts, mpage;
1293 unsigned char arr[SDEBUG_MAX_MSELECT_SZ];
1294 unsigned char *cmd = (unsigned char *)scp->cmnd;
1296 if ((errsts = check_readiness(scp, 1, devip)))
1298 memset(arr, 0, sizeof(arr));
1301 param_len = mselect6 ? cmd[4] : ((cmd[7] << 8) + cmd[8]);
1302 if ((0 == pf) || sp || (param_len > SDEBUG_MAX_MSELECT_SZ)) {
1303 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1304 INVALID_FIELD_IN_CDB, 0);
1305 return check_condition_result;
1307 res = fetch_to_dev_buffer(scp, arr, param_len);
1309 return (DID_ERROR << 16);
1310 else if ((res < param_len) &&
1311 (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
1312 printk(KERN_INFO "scsi_debug: mode_select: cdb indicated=%d, "
1313 " IO sent=%d bytes\n", param_len, res);
1314 md_len = mselect6 ? (arr[0] + 1) : ((arr[0] << 8) + arr[1] + 2);
1315 bd_len = mselect6 ? arr[3] : ((arr[6] << 8) + arr[7]);
1317 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1318 INVALID_FIELD_IN_PARAM_LIST, 0);
1319 return check_condition_result;
1321 off = bd_len + (mselect6 ? 4 : 8);
1322 mpage = arr[off] & 0x3f;
1323 ps = !!(arr[off] & 0x80);
1325 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1326 INVALID_FIELD_IN_PARAM_LIST, 0);
1327 return check_condition_result;
1329 spf = !!(arr[off] & 0x40);
1330 pg_len = spf ? ((arr[off + 2] << 8) + arr[off + 3] + 4) :
1332 if ((pg_len + off) > param_len) {
1333 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1334 PARAMETER_LIST_LENGTH_ERR, 0);
1335 return check_condition_result;
1338 case 0xa: /* Control Mode page */
1339 if (ctrl_m_pg[1] == arr[off + 1]) {
1340 memcpy(ctrl_m_pg + 2, arr + off + 2,
1341 sizeof(ctrl_m_pg) - 2);
1342 scsi_debug_dsense = !!(ctrl_m_pg[2] & 0x4);
1346 case 0x1c: /* Informational Exceptions Mode page */
1347 if (iec_m_pg[1] == arr[off + 1]) {
1348 memcpy(iec_m_pg + 2, arr + off + 2,
1349 sizeof(iec_m_pg) - 2);
1356 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1357 INVALID_FIELD_IN_PARAM_LIST, 0);
1358 return check_condition_result;
1361 static int resp_temp_l_pg(unsigned char * arr)
1363 unsigned char temp_l_pg[] = {0x0, 0x0, 0x3, 0x2, 0x0, 38,
1364 0x0, 0x1, 0x3, 0x2, 0x0, 65,
1367 memcpy(arr, temp_l_pg, sizeof(temp_l_pg));
1368 return sizeof(temp_l_pg);
1371 static int resp_ie_l_pg(unsigned char * arr)
1373 unsigned char ie_l_pg[] = {0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 38,
1376 memcpy(arr, ie_l_pg, sizeof(ie_l_pg));
1377 if (iec_m_pg[2] & 0x4) { /* TEST bit set */
1378 arr[4] = THRESHOLD_EXCEEDED;
1381 return sizeof(ie_l_pg);
1384 #define SDEBUG_MAX_LSENSE_SZ 512
1386 static int resp_log_sense(struct scsi_cmnd * scp,
1387 struct sdebug_dev_info * devip)
1389 int ppc, sp, pcontrol, pcode, subpcode, alloc_len, errsts, len, n;
1390 unsigned char arr[SDEBUG_MAX_LSENSE_SZ];
1391 unsigned char *cmd = (unsigned char *)scp->cmnd;
1393 if ((errsts = check_readiness(scp, 1, devip)))
1395 memset(arr, 0, sizeof(arr));
1399 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1400 INVALID_FIELD_IN_CDB, 0);
1401 return check_condition_result;
1403 pcontrol = (cmd[2] & 0xc0) >> 6;
1404 pcode = cmd[2] & 0x3f;
1405 subpcode = cmd[3] & 0xff;
1406 alloc_len = (cmd[7] << 8) + cmd[8];
1408 if (0 == subpcode) {
1410 case 0x0: /* Supported log pages log page */
1412 arr[n++] = 0x0; /* this page */
1413 arr[n++] = 0xd; /* Temperature */
1414 arr[n++] = 0x2f; /* Informational exceptions */
1417 case 0xd: /* Temperature log page */
1418 arr[3] = resp_temp_l_pg(arr + 4);
1420 case 0x2f: /* Informational exceptions log page */
1421 arr[3] = resp_ie_l_pg(arr + 4);
1424 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1425 INVALID_FIELD_IN_CDB, 0);
1426 return check_condition_result;
1428 } else if (0xff == subpcode) {
1432 case 0x0: /* Supported log pages and subpages log page */
1435 arr[n++] = 0x0; /* 0,0 page */
1437 arr[n++] = 0xff; /* this page */
1439 arr[n++] = 0x0; /* Temperature */
1441 arr[n++] = 0x0; /* Informational exceptions */
1444 case 0xd: /* Temperature subpages */
1447 arr[n++] = 0x0; /* Temperature */
1450 case 0x2f: /* Informational exceptions subpages */
1453 arr[n++] = 0x0; /* Informational exceptions */
1457 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1458 INVALID_FIELD_IN_CDB, 0);
1459 return check_condition_result;
1462 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1463 INVALID_FIELD_IN_CDB, 0);
1464 return check_condition_result;
1466 len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len);
1467 return fill_from_dev_buffer(scp, arr,
1468 min(len, SDEBUG_MAX_INQ_ARR_SZ));
1471 static int resp_read(struct scsi_cmnd * SCpnt, unsigned long long lba,
1472 unsigned int num, struct sdebug_dev_info * devip)
1474 unsigned long iflags;
1475 unsigned int block, from_bottom;
1476 unsigned long long u;
1479 if (lba + num > sdebug_capacity) {
1480 mk_sense_buffer(devip, ILLEGAL_REQUEST, ADDR_OUT_OF_RANGE,
1482 return check_condition_result;
1484 /* transfer length excessive (tie in to block limits VPD page) */
1485 if (num > sdebug_store_sectors) {
1486 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1488 return check_condition_result;
1490 if ((SCSI_DEBUG_OPT_MEDIUM_ERR & scsi_debug_opts) &&
1491 (lba <= OPT_MEDIUM_ERR_ADDR) &&
1492 ((lba + num) > OPT_MEDIUM_ERR_ADDR)) {
1493 /* claim unrecoverable read error */
1494 mk_sense_buffer(devip, MEDIUM_ERROR, UNRECOVERED_READ_ERR,
1496 /* set info field and valid bit for fixed descriptor */
1497 if (0x70 == (devip->sense_buff[0] & 0x7f)) {
1498 devip->sense_buff[0] |= 0x80; /* Valid bit */
1499 ret = OPT_MEDIUM_ERR_ADDR;
1500 devip->sense_buff[3] = (ret >> 24) & 0xff;
1501 devip->sense_buff[4] = (ret >> 16) & 0xff;
1502 devip->sense_buff[5] = (ret >> 8) & 0xff;
1503 devip->sense_buff[6] = ret & 0xff;
1505 return check_condition_result;
1507 read_lock_irqsave(&atomic_rw, iflags);
1508 if ((lba + num) <= sdebug_store_sectors)
1509 ret = fill_from_dev_buffer(SCpnt,
1510 fake_storep + (lba * SECT_SIZE),
1513 /* modulo when one arg is 64 bits needs do_div() */
1515 block = do_div(u, sdebug_store_sectors);
1517 if ((block + num) > sdebug_store_sectors)
1518 from_bottom = (block + num) - sdebug_store_sectors;
1519 ret = fill_from_dev_buffer(SCpnt,
1520 fake_storep + (block * SECT_SIZE),
1521 (num - from_bottom) * SECT_SIZE);
1522 if ((0 == ret) && (from_bottom > 0))
1523 ret = fill_from_dev_buffer(SCpnt, fake_storep,
1524 from_bottom * SECT_SIZE);
1526 read_unlock_irqrestore(&atomic_rw, iflags);
1530 static int resp_write(struct scsi_cmnd * SCpnt, unsigned long long lba,
1531 unsigned int num, struct sdebug_dev_info * devip)
1533 unsigned long iflags;
1534 unsigned int block, to_bottom;
1535 unsigned long long u;
1538 if (lba + num > sdebug_capacity) {
1539 mk_sense_buffer(devip, ILLEGAL_REQUEST, ADDR_OUT_OF_RANGE,
1541 return check_condition_result;
1543 /* transfer length excessive (tie in to block limits VPD page) */
1544 if (num > sdebug_store_sectors) {
1545 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1547 return check_condition_result;
1550 write_lock_irqsave(&atomic_rw, iflags);
1551 if ((lba + num) <= sdebug_store_sectors)
1552 res = fetch_to_dev_buffer(SCpnt,
1553 fake_storep + (lba * SECT_SIZE),
1556 /* modulo when one arg is 64 bits needs do_div() */
1558 block = do_div(u, sdebug_store_sectors);
1560 if ((block + num) > sdebug_store_sectors)
1561 to_bottom = (block + num) - sdebug_store_sectors;
1562 res = fetch_to_dev_buffer(SCpnt,
1563 fake_storep + (block * SECT_SIZE),
1564 (num - to_bottom) * SECT_SIZE);
1565 if ((0 == res) && (to_bottom > 0))
1566 res = fetch_to_dev_buffer(SCpnt, fake_storep,
1567 to_bottom * SECT_SIZE);
1569 write_unlock_irqrestore(&atomic_rw, iflags);
1571 return (DID_ERROR << 16);
1572 else if ((res < (num * SECT_SIZE)) &&
1573 (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
1574 printk(KERN_INFO "scsi_debug: write: cdb indicated=%u, "
1575 " IO sent=%d bytes\n", num * SECT_SIZE, res);
1579 #define SDEBUG_RLUN_ARR_SZ 256
1581 static int resp_report_luns(struct scsi_cmnd * scp,
1582 struct sdebug_dev_info * devip)
1584 unsigned int alloc_len;
1585 int lun_cnt, i, upper, num, n, wlun, lun;
1586 unsigned char *cmd = (unsigned char *)scp->cmnd;
1587 int select_report = (int)cmd[2];
1588 struct scsi_lun *one_lun;
1589 unsigned char arr[SDEBUG_RLUN_ARR_SZ];
1590 unsigned char * max_addr;
1592 alloc_len = cmd[9] + (cmd[8] << 8) + (cmd[7] << 16) + (cmd[6] << 24);
1593 if ((alloc_len < 4) || (select_report > 2)) {
1594 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1596 return check_condition_result;
1598 /* can produce response with up to 16k luns (lun 0 to lun 16383) */
1599 memset(arr, 0, SDEBUG_RLUN_ARR_SZ);
1600 lun_cnt = scsi_debug_max_luns;
1601 if (1 == select_report)
1603 else if (scsi_debug_no_lun_0 && (lun_cnt > 0))
1605 wlun = (select_report > 0) ? 1 : 0;
1606 num = lun_cnt + wlun;
1607 arr[2] = ((sizeof(struct scsi_lun) * num) >> 8) & 0xff;
1608 arr[3] = (sizeof(struct scsi_lun) * num) & 0xff;
1609 n = min((int)((SDEBUG_RLUN_ARR_SZ - 8) /
1610 sizeof(struct scsi_lun)), num);
1615 one_lun = (struct scsi_lun *) &arr[8];
1616 max_addr = arr + SDEBUG_RLUN_ARR_SZ;
1617 for (i = 0, lun = (scsi_debug_no_lun_0 ? 1 : 0);
1618 ((i < lun_cnt) && ((unsigned char *)(one_lun + i) < max_addr));
1620 upper = (lun >> 8) & 0x3f;
1622 one_lun[i].scsi_lun[0] =
1623 (upper | (SAM2_LUN_ADDRESS_METHOD << 6));
1624 one_lun[i].scsi_lun[1] = lun & 0xff;
1627 one_lun[i].scsi_lun[0] = (SAM2_WLUN_REPORT_LUNS >> 8) & 0xff;
1628 one_lun[i].scsi_lun[1] = SAM2_WLUN_REPORT_LUNS & 0xff;
1631 alloc_len = (unsigned char *)(one_lun + i) - arr;
1632 return fill_from_dev_buffer(scp, arr,
1633 min((int)alloc_len, SDEBUG_RLUN_ARR_SZ));
1636 static int resp_xdwriteread(struct scsi_cmnd *scp, unsigned long long lba,
1637 unsigned int num, struct sdebug_dev_info *devip)
1640 unsigned char *kaddr, *buf;
1641 unsigned int offset;
1642 struct scatterlist *sg;
1643 struct scsi_data_buffer *sdb = scsi_in(scp);
1645 /* better not to use temporary buffer. */
1646 buf = kmalloc(scsi_bufflen(scp), GFP_ATOMIC);
1650 scsi_sg_copy_to_buffer(scp, buf, scsi_bufflen(scp));
1653 for_each_sg(sdb->table.sgl, sg, sdb->table.nents, i) {
1654 kaddr = (unsigned char *)kmap_atomic(sg_page(sg), KM_USER0);
1658 for (j = 0; j < sg->length; j++)
1659 *(kaddr + sg->offset + j) ^= *(buf + offset + j);
1661 offset += sg->length;
1662 kunmap_atomic(kaddr, KM_USER0);
1671 /* When timer goes off this function is called. */
1672 static void timer_intr_handler(unsigned long indx)
1674 struct sdebug_queued_cmd * sqcp;
1675 unsigned long iflags;
1677 if (indx >= SCSI_DEBUG_CANQUEUE) {
1678 printk(KERN_ERR "scsi_debug:timer_intr_handler: indx too "
1682 spin_lock_irqsave(&queued_arr_lock, iflags);
1683 sqcp = &queued_arr[(int)indx];
1684 if (! sqcp->in_use) {
1685 printk(KERN_ERR "scsi_debug:timer_intr_handler: Unexpected "
1687 spin_unlock_irqrestore(&queued_arr_lock, iflags);
1691 if (sqcp->done_funct) {
1692 sqcp->a_cmnd->result = sqcp->scsi_result;
1693 sqcp->done_funct(sqcp->a_cmnd); /* callback to mid level */
1695 sqcp->done_funct = NULL;
1696 spin_unlock_irqrestore(&queued_arr_lock, iflags);
1699 static int scsi_debug_slave_alloc(struct scsi_device * sdp)
1701 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1702 printk(KERN_INFO "scsi_debug: slave_alloc <%u %u %u %u>\n",
1703 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
1704 set_bit(QUEUE_FLAG_BIDI, &sdp->request_queue->queue_flags);
1708 static int scsi_debug_slave_configure(struct scsi_device * sdp)
1710 struct sdebug_dev_info * devip;
1712 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1713 printk(KERN_INFO "scsi_debug: slave_configure <%u %u %u %u>\n",
1714 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
1715 if (sdp->host->max_cmd_len != SCSI_DEBUG_MAX_CMD_LEN)
1716 sdp->host->max_cmd_len = SCSI_DEBUG_MAX_CMD_LEN;
1717 devip = devInfoReg(sdp);
1719 return 1; /* no resources, will be marked offline */
1720 sdp->hostdata = devip;
1721 if (sdp->host->cmd_per_lun)
1722 scsi_adjust_queue_depth(sdp, SDEBUG_TAGGED_QUEUING,
1723 sdp->host->cmd_per_lun);
1724 blk_queue_max_segment_size(sdp->request_queue, 256 * 1024);
1728 static void scsi_debug_slave_destroy(struct scsi_device * sdp)
1730 struct sdebug_dev_info * devip =
1731 (struct sdebug_dev_info *)sdp->hostdata;
1733 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1734 printk(KERN_INFO "scsi_debug: slave_destroy <%u %u %u %u>\n",
1735 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
1737 /* make this slot avaliable for re-use */
1739 sdp->hostdata = NULL;
1743 struct sdebug_dev_info *sdebug_device_create(struct sdebug_host_info *sdbg_host,
1746 struct sdebug_dev_info *devip;
1748 devip = kzalloc(sizeof(*devip), flags);
1750 devip->sdbg_host = sdbg_host;
1751 list_add_tail(&devip->dev_list, &sdbg_host->dev_info_list);
1756 static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev)
1758 struct sdebug_host_info * sdbg_host;
1759 struct sdebug_dev_info * open_devip = NULL;
1760 struct sdebug_dev_info * devip =
1761 (struct sdebug_dev_info *)sdev->hostdata;
1765 sdbg_host = *(struct sdebug_host_info **)shost_priv(sdev->host);
1767 printk(KERN_ERR "Host info NULL\n");
1770 list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) {
1771 if ((devip->used) && (devip->channel == sdev->channel) &&
1772 (devip->target == sdev->id) &&
1773 (devip->lun == sdev->lun))
1776 if ((!devip->used) && (!open_devip))
1780 if (!open_devip) { /* try and make a new one */
1781 open_devip = sdebug_device_create(sdbg_host, GFP_ATOMIC);
1783 printk(KERN_ERR "%s: out of memory at line %d\n",
1784 __FUNCTION__, __LINE__);
1789 open_devip->channel = sdev->channel;
1790 open_devip->target = sdev->id;
1791 open_devip->lun = sdev->lun;
1792 open_devip->sdbg_host = sdbg_host;
1793 open_devip->reset = 1;
1794 open_devip->used = 1;
1795 memset(open_devip->sense_buff, 0, SDEBUG_SENSE_LEN);
1796 if (scsi_debug_dsense)
1797 open_devip->sense_buff[0] = 0x72;
1799 open_devip->sense_buff[0] = 0x70;
1800 open_devip->sense_buff[7] = 0xa;
1802 if (sdev->lun == SAM2_WLUN_REPORT_LUNS)
1803 open_devip->wlun = SAM2_WLUN_REPORT_LUNS & 0xff;
1808 static void mk_sense_buffer(struct sdebug_dev_info * devip, int key,
1811 unsigned char *sbuff;
1813 sbuff = devip->sense_buff;
1814 memset(sbuff, 0, SDEBUG_SENSE_LEN);
1816 scsi_build_sense_buffer(scsi_debug_dsense, sbuff, key, asc, asq);
1818 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1819 printk(KERN_INFO "scsi_debug: [sense_key,asc,ascq]: "
1820 "[0x%x,0x%x,0x%x]\n", key, asc, asq);
1823 static int scsi_debug_abort(struct scsi_cmnd * SCpnt)
1825 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1826 printk(KERN_INFO "scsi_debug: abort\n");
1828 stop_queued_cmnd(SCpnt);
1832 static int scsi_debug_biosparam(struct scsi_device *sdev,
1833 struct block_device * bdev, sector_t capacity, int *info)
1838 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1839 printk(KERN_INFO "scsi_debug: biosparam\n");
1840 buf = scsi_bios_ptable(bdev);
1842 res = scsi_partsize(buf, capacity,
1843 &info[2], &info[0], &info[1]);
1848 info[0] = sdebug_heads;
1849 info[1] = sdebug_sectors_per;
1850 info[2] = sdebug_cylinders_per;
1854 static int scsi_debug_device_reset(struct scsi_cmnd * SCpnt)
1856 struct sdebug_dev_info * devip;
1858 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1859 printk(KERN_INFO "scsi_debug: device_reset\n");
1862 devip = devInfoReg(SCpnt->device);
1869 static int scsi_debug_bus_reset(struct scsi_cmnd * SCpnt)
1871 struct sdebug_host_info *sdbg_host;
1872 struct sdebug_dev_info * dev_info;
1873 struct scsi_device * sdp;
1874 struct Scsi_Host * hp;
1876 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1877 printk(KERN_INFO "scsi_debug: bus_reset\n");
1879 if (SCpnt && ((sdp = SCpnt->device)) && ((hp = sdp->host))) {
1880 sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
1882 list_for_each_entry(dev_info,
1883 &sdbg_host->dev_info_list,
1885 dev_info->reset = 1;
1891 static int scsi_debug_host_reset(struct scsi_cmnd * SCpnt)
1893 struct sdebug_host_info * sdbg_host;
1894 struct sdebug_dev_info * dev_info;
1896 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1897 printk(KERN_INFO "scsi_debug: host_reset\n");
1899 spin_lock(&sdebug_host_list_lock);
1900 list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
1901 list_for_each_entry(dev_info, &sdbg_host->dev_info_list,
1903 dev_info->reset = 1;
1905 spin_unlock(&sdebug_host_list_lock);
1910 /* Returns 1 if found 'cmnd' and deleted its timer. else returns 0 */
1911 static int stop_queued_cmnd(struct scsi_cmnd * cmnd)
1913 unsigned long iflags;
1915 struct sdebug_queued_cmd * sqcp;
1917 spin_lock_irqsave(&queued_arr_lock, iflags);
1918 for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
1919 sqcp = &queued_arr[k];
1920 if (sqcp->in_use && (cmnd == sqcp->a_cmnd)) {
1921 del_timer_sync(&sqcp->cmnd_timer);
1923 sqcp->a_cmnd = NULL;
1927 spin_unlock_irqrestore(&queued_arr_lock, iflags);
1928 return (k < SCSI_DEBUG_CANQUEUE) ? 1 : 0;
1931 /* Deletes (stops) timers of all queued commands */
1932 static void stop_all_queued(void)
1934 unsigned long iflags;
1936 struct sdebug_queued_cmd * sqcp;
1938 spin_lock_irqsave(&queued_arr_lock, iflags);
1939 for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
1940 sqcp = &queued_arr[k];
1941 if (sqcp->in_use && sqcp->a_cmnd) {
1942 del_timer_sync(&sqcp->cmnd_timer);
1944 sqcp->a_cmnd = NULL;
1947 spin_unlock_irqrestore(&queued_arr_lock, iflags);
1950 /* Initializes timers in queued array */
1951 static void __init init_all_queued(void)
1953 unsigned long iflags;
1955 struct sdebug_queued_cmd * sqcp;
1957 spin_lock_irqsave(&queued_arr_lock, iflags);
1958 for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
1959 sqcp = &queued_arr[k];
1960 init_timer(&sqcp->cmnd_timer);
1962 sqcp->a_cmnd = NULL;
1964 spin_unlock_irqrestore(&queued_arr_lock, iflags);
1967 static void __init sdebug_build_parts(unsigned char *ramp,
1968 unsigned int store_size)
1970 struct partition * pp;
1971 int starts[SDEBUG_MAX_PARTS + 2];
1972 int sectors_per_part, num_sectors, k;
1973 int heads_by_sects, start_sec, end_sec;
1975 /* assume partition table already zeroed */
1976 if ((scsi_debug_num_parts < 1) || (store_size < 1048576))
1978 if (scsi_debug_num_parts > SDEBUG_MAX_PARTS) {
1979 scsi_debug_num_parts = SDEBUG_MAX_PARTS;
1980 printk(KERN_WARNING "scsi_debug:build_parts: reducing "
1981 "partitions to %d\n", SDEBUG_MAX_PARTS);
1983 num_sectors = (int)sdebug_store_sectors;
1984 sectors_per_part = (num_sectors - sdebug_sectors_per)
1985 / scsi_debug_num_parts;
1986 heads_by_sects = sdebug_heads * sdebug_sectors_per;
1987 starts[0] = sdebug_sectors_per;
1988 for (k = 1; k < scsi_debug_num_parts; ++k)
1989 starts[k] = ((k * sectors_per_part) / heads_by_sects)
1991 starts[scsi_debug_num_parts] = num_sectors;
1992 starts[scsi_debug_num_parts + 1] = 0;
1994 ramp[510] = 0x55; /* magic partition markings */
1996 pp = (struct partition *)(ramp + 0x1be);
1997 for (k = 0; starts[k + 1]; ++k, ++pp) {
1998 start_sec = starts[k];
1999 end_sec = starts[k + 1] - 1;
2002 pp->cyl = start_sec / heads_by_sects;
2003 pp->head = (start_sec - (pp->cyl * heads_by_sects))
2004 / sdebug_sectors_per;
2005 pp->sector = (start_sec % sdebug_sectors_per) + 1;
2007 pp->end_cyl = end_sec / heads_by_sects;
2008 pp->end_head = (end_sec - (pp->end_cyl * heads_by_sects))
2009 / sdebug_sectors_per;
2010 pp->end_sector = (end_sec % sdebug_sectors_per) + 1;
2012 pp->start_sect = start_sec;
2013 pp->nr_sects = end_sec - start_sec + 1;
2014 pp->sys_ind = 0x83; /* plain Linux partition */
2018 static int schedule_resp(struct scsi_cmnd * cmnd,
2019 struct sdebug_dev_info * devip,
2020 done_funct_t done, int scsi_result, int delta_jiff)
2022 if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) && cmnd) {
2024 struct scsi_device * sdp = cmnd->device;
2026 printk(KERN_INFO "scsi_debug: <%u %u %u %u> "
2027 "non-zero result=0x%x\n", sdp->host->host_no,
2028 sdp->channel, sdp->id, sdp->lun, scsi_result);
2031 if (cmnd && devip) {
2032 /* simulate autosense by this driver */
2033 if (SAM_STAT_CHECK_CONDITION == (scsi_result & 0xff))
2034 memcpy(cmnd->sense_buffer, devip->sense_buff,
2035 (SCSI_SENSE_BUFFERSIZE > SDEBUG_SENSE_LEN) ?
2036 SDEBUG_SENSE_LEN : SCSI_SENSE_BUFFERSIZE);
2038 if (delta_jiff <= 0) {
2040 cmnd->result = scsi_result;
2045 unsigned long iflags;
2047 struct sdebug_queued_cmd * sqcp = NULL;
2049 spin_lock_irqsave(&queued_arr_lock, iflags);
2050 for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
2051 sqcp = &queued_arr[k];
2055 if (k >= SCSI_DEBUG_CANQUEUE) {
2056 spin_unlock_irqrestore(&queued_arr_lock, iflags);
2057 printk(KERN_WARNING "scsi_debug: can_queue exceeded\n");
2058 return 1; /* report busy to mid level */
2061 sqcp->a_cmnd = cmnd;
2062 sqcp->scsi_result = scsi_result;
2063 sqcp->done_funct = done;
2064 sqcp->cmnd_timer.function = timer_intr_handler;
2065 sqcp->cmnd_timer.data = k;
2066 sqcp->cmnd_timer.expires = jiffies + delta_jiff;
2067 add_timer(&sqcp->cmnd_timer);
2068 spin_unlock_irqrestore(&queued_arr_lock, iflags);
2075 /* Note: The following macros create attribute files in the
2076 /sys/module/scsi_debug/parameters directory. Unfortunately this
2077 driver is unaware of a change and cannot trigger auxiliary actions
2078 as it can when the corresponding attribute in the
2079 /sys/bus/pseudo/drivers/scsi_debug directory is changed.
2081 module_param_named(add_host, scsi_debug_add_host, int, S_IRUGO | S_IWUSR);
2082 module_param_named(delay, scsi_debug_delay, int, S_IRUGO | S_IWUSR);
2083 module_param_named(dev_size_mb, scsi_debug_dev_size_mb, int, S_IRUGO);
2084 module_param_named(dsense, scsi_debug_dsense, int, S_IRUGO | S_IWUSR);
2085 module_param_named(every_nth, scsi_debug_every_nth, int, S_IRUGO | S_IWUSR);
2086 module_param_named(fake_rw, scsi_debug_fake_rw, int, S_IRUGO | S_IWUSR);
2087 module_param_named(max_luns, scsi_debug_max_luns, int, S_IRUGO | S_IWUSR);
2088 module_param_named(no_lun_0, scsi_debug_no_lun_0, int, S_IRUGO | S_IWUSR);
2089 module_param_named(num_parts, scsi_debug_num_parts, int, S_IRUGO);
2090 module_param_named(num_tgts, scsi_debug_num_tgts, int, S_IRUGO | S_IWUSR);
2091 module_param_named(opts, scsi_debug_opts, int, S_IRUGO | S_IWUSR);
2092 module_param_named(ptype, scsi_debug_ptype, int, S_IRUGO | S_IWUSR);
2093 module_param_named(scsi_level, scsi_debug_scsi_level, int, S_IRUGO);
2094 module_param_named(virtual_gb, scsi_debug_virtual_gb, int, S_IRUGO | S_IWUSR);
2095 module_param_named(vpd_use_hostno, scsi_debug_vpd_use_hostno, int,
2098 MODULE_AUTHOR("Eric Youngdale + Douglas Gilbert");
2099 MODULE_DESCRIPTION("SCSI debug adapter driver");
2100 MODULE_LICENSE("GPL");
2101 MODULE_VERSION(SCSI_DEBUG_VERSION);
2103 MODULE_PARM_DESC(add_host, "0..127 hosts allowed(def=1)");
2104 MODULE_PARM_DESC(delay, "# of jiffies to delay response(def=1)");
2105 MODULE_PARM_DESC(dev_size_mb, "size in MB of ram shared by devs(def=8)");
2106 MODULE_PARM_DESC(dsense, "use descriptor sense format(def=0 -> fixed)");
2107 MODULE_PARM_DESC(every_nth, "timeout every nth command(def=0)");
2108 MODULE_PARM_DESC(fake_rw, "fake reads/writes instead of copying (def=0)");
2109 MODULE_PARM_DESC(max_luns, "number of LUNs per target to simulate(def=1)");
2110 MODULE_PARM_DESC(no_lun_0, "no LU number 0 (def=0 -> have lun 0)");
2111 MODULE_PARM_DESC(num_parts, "number of partitions(def=0)");
2112 MODULE_PARM_DESC(num_tgts, "number of targets per host to simulate(def=1)");
2113 MODULE_PARM_DESC(opts, "1->noise, 2->medium_err, 4->timeout, 8->recovered_err... (def=0)");
2114 MODULE_PARM_DESC(ptype, "SCSI peripheral type(def=0[disk])");
2115 MODULE_PARM_DESC(scsi_level, "SCSI level to simulate(def=5[SPC-3])");
2116 MODULE_PARM_DESC(virtual_gb, "virtual gigabyte size (def=0 -> use dev_size_mb)");
2117 MODULE_PARM_DESC(vpd_use_hostno, "0 -> dev ids ignore hostno (def=1 -> unique dev ids)");
2120 static char sdebug_info[256];
2122 static const char * scsi_debug_info(struct Scsi_Host * shp)
2124 sprintf(sdebug_info, "scsi_debug, version %s [%s], "
2125 "dev_size_mb=%d, opts=0x%x", SCSI_DEBUG_VERSION,
2126 scsi_debug_version_date, scsi_debug_dev_size_mb,
2131 /* scsi_debug_proc_info
2132 * Used if the driver currently has no own support for /proc/scsi
2134 static int scsi_debug_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset,
2135 int length, int inout)
2137 int len, pos, begin;
2140 orig_length = length;
2144 int minLen = length > 15 ? 15 : length;
2146 if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
2148 memcpy(arr, buffer, minLen);
2150 if (1 != sscanf(arr, "%d", &pos))
2152 scsi_debug_opts = pos;
2153 if (scsi_debug_every_nth != 0)
2154 scsi_debug_cmnd_count = 0;
2158 pos = len = sprintf(buffer, "scsi_debug adapter driver, version "
2160 "num_tgts=%d, shared (ram) size=%d MB, opts=0x%x, "
2161 "every_nth=%d(curr:%d)\n"
2162 "delay=%d, max_luns=%d, scsi_level=%d\n"
2163 "sector_size=%d bytes, cylinders=%d, heads=%d, sectors=%d\n"
2164 "number of aborts=%d, device_reset=%d, bus_resets=%d, "
2166 SCSI_DEBUG_VERSION, scsi_debug_version_date, scsi_debug_num_tgts,
2167 scsi_debug_dev_size_mb, scsi_debug_opts, scsi_debug_every_nth,
2168 scsi_debug_cmnd_count, scsi_debug_delay,
2169 scsi_debug_max_luns, scsi_debug_scsi_level,
2170 SECT_SIZE, sdebug_cylinders_per, sdebug_heads, sdebug_sectors_per,
2171 num_aborts, num_dev_resets, num_bus_resets, num_host_resets);
2176 *start = buffer + (offset - begin); /* Start of wanted data */
2177 len -= (offset - begin);
2183 static ssize_t sdebug_delay_show(struct device_driver * ddp, char * buf)
2185 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_delay);
2188 static ssize_t sdebug_delay_store(struct device_driver * ddp,
2189 const char * buf, size_t count)
2194 if (1 == sscanf(buf, "%10s", work)) {
2195 if ((1 == sscanf(work, "%d", &delay)) && (delay >= 0)) {
2196 scsi_debug_delay = delay;
2202 DRIVER_ATTR(delay, S_IRUGO | S_IWUSR, sdebug_delay_show,
2203 sdebug_delay_store);
2205 static ssize_t sdebug_opts_show(struct device_driver * ddp, char * buf)
2207 return scnprintf(buf, PAGE_SIZE, "0x%x\n", scsi_debug_opts);
2210 static ssize_t sdebug_opts_store(struct device_driver * ddp,
2211 const char * buf, size_t count)
2216 if (1 == sscanf(buf, "%10s", work)) {
2217 if (0 == strnicmp(work,"0x", 2)) {
2218 if (1 == sscanf(&work[2], "%x", &opts))
2221 if (1 == sscanf(work, "%d", &opts))
2227 scsi_debug_opts = opts;
2228 scsi_debug_cmnd_count = 0;
2231 DRIVER_ATTR(opts, S_IRUGO | S_IWUSR, sdebug_opts_show,
2234 static ssize_t sdebug_ptype_show(struct device_driver * ddp, char * buf)
2236 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_ptype);
2238 static ssize_t sdebug_ptype_store(struct device_driver * ddp,
2239 const char * buf, size_t count)
2243 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2244 scsi_debug_ptype = n;
2249 DRIVER_ATTR(ptype, S_IRUGO | S_IWUSR, sdebug_ptype_show, sdebug_ptype_store);
2251 static ssize_t sdebug_dsense_show(struct device_driver * ddp, char * buf)
2253 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dsense);
2255 static ssize_t sdebug_dsense_store(struct device_driver * ddp,
2256 const char * buf, size_t count)
2260 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2261 scsi_debug_dsense = n;
2266 DRIVER_ATTR(dsense, S_IRUGO | S_IWUSR, sdebug_dsense_show,
2267 sdebug_dsense_store);
2269 static ssize_t sdebug_fake_rw_show(struct device_driver * ddp, char * buf)
2271 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_fake_rw);
2273 static ssize_t sdebug_fake_rw_store(struct device_driver * ddp,
2274 const char * buf, size_t count)
2278 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2279 scsi_debug_fake_rw = n;
2284 DRIVER_ATTR(fake_rw, S_IRUGO | S_IWUSR, sdebug_fake_rw_show,
2285 sdebug_fake_rw_store);
2287 static ssize_t sdebug_no_lun_0_show(struct device_driver * ddp, char * buf)
2289 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_no_lun_0);
2291 static ssize_t sdebug_no_lun_0_store(struct device_driver * ddp,
2292 const char * buf, size_t count)
2296 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2297 scsi_debug_no_lun_0 = n;
2302 DRIVER_ATTR(no_lun_0, S_IRUGO | S_IWUSR, sdebug_no_lun_0_show,
2303 sdebug_no_lun_0_store);
2305 static ssize_t sdebug_num_tgts_show(struct device_driver * ddp, char * buf)
2307 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_num_tgts);
2309 static ssize_t sdebug_num_tgts_store(struct device_driver * ddp,
2310 const char * buf, size_t count)
2314 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2315 scsi_debug_num_tgts = n;
2316 sdebug_max_tgts_luns();
2321 DRIVER_ATTR(num_tgts, S_IRUGO | S_IWUSR, sdebug_num_tgts_show,
2322 sdebug_num_tgts_store);
2324 static ssize_t sdebug_dev_size_mb_show(struct device_driver * ddp, char * buf)
2326 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dev_size_mb);
2328 DRIVER_ATTR(dev_size_mb, S_IRUGO, sdebug_dev_size_mb_show, NULL);
2330 static ssize_t sdebug_num_parts_show(struct device_driver * ddp, char * buf)
2332 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_num_parts);
2334 DRIVER_ATTR(num_parts, S_IRUGO, sdebug_num_parts_show, NULL);
2336 static ssize_t sdebug_every_nth_show(struct device_driver * ddp, char * buf)
2338 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_every_nth);
2340 static ssize_t sdebug_every_nth_store(struct device_driver * ddp,
2341 const char * buf, size_t count)
2345 if ((count > 0) && (1 == sscanf(buf, "%d", &nth))) {
2346 scsi_debug_every_nth = nth;
2347 scsi_debug_cmnd_count = 0;
2352 DRIVER_ATTR(every_nth, S_IRUGO | S_IWUSR, sdebug_every_nth_show,
2353 sdebug_every_nth_store);
2355 static ssize_t sdebug_max_luns_show(struct device_driver * ddp, char * buf)
2357 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_max_luns);
2359 static ssize_t sdebug_max_luns_store(struct device_driver * ddp,
2360 const char * buf, size_t count)
2364 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2365 scsi_debug_max_luns = n;
2366 sdebug_max_tgts_luns();
2371 DRIVER_ATTR(max_luns, S_IRUGO | S_IWUSR, sdebug_max_luns_show,
2372 sdebug_max_luns_store);
2374 static ssize_t sdebug_scsi_level_show(struct device_driver * ddp, char * buf)
2376 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_scsi_level);
2378 DRIVER_ATTR(scsi_level, S_IRUGO, sdebug_scsi_level_show, NULL);
2380 static ssize_t sdebug_virtual_gb_show(struct device_driver * ddp, char * buf)
2382 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_virtual_gb);
2384 static ssize_t sdebug_virtual_gb_store(struct device_driver * ddp,
2385 const char * buf, size_t count)
2389 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2390 scsi_debug_virtual_gb = n;
2392 sdebug_capacity = get_sdebug_capacity();
2398 DRIVER_ATTR(virtual_gb, S_IRUGO | S_IWUSR, sdebug_virtual_gb_show,
2399 sdebug_virtual_gb_store);
2401 static ssize_t sdebug_add_host_show(struct device_driver * ddp, char * buf)
2403 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_add_host);
2406 static ssize_t sdebug_add_host_store(struct device_driver * ddp,
2407 const char * buf, size_t count)
2411 if (sscanf(buf, "%d", &delta_hosts) != 1)
2413 if (delta_hosts > 0) {
2415 sdebug_add_adapter();
2416 } while (--delta_hosts);
2417 } else if (delta_hosts < 0) {
2419 sdebug_remove_adapter();
2420 } while (++delta_hosts);
2424 DRIVER_ATTR(add_host, S_IRUGO | S_IWUSR, sdebug_add_host_show,
2425 sdebug_add_host_store);
2427 static ssize_t sdebug_vpd_use_hostno_show(struct device_driver * ddp,
2430 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_vpd_use_hostno);
2432 static ssize_t sdebug_vpd_use_hostno_store(struct device_driver * ddp,
2433 const char * buf, size_t count)
2437 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2438 scsi_debug_vpd_use_hostno = n;
2443 DRIVER_ATTR(vpd_use_hostno, S_IRUGO | S_IWUSR, sdebug_vpd_use_hostno_show,
2444 sdebug_vpd_use_hostno_store);
2446 /* Note: The following function creates attribute files in the
2447 /sys/bus/pseudo/drivers/scsi_debug directory. The advantage of these
2448 files (over those found in the /sys/module/scsi_debug/parameters
2449 directory) is that auxiliary actions can be triggered when an attribute
2450 is changed. For example see: sdebug_add_host_store() above.
2452 static int do_create_driverfs_files(void)
2456 ret = driver_create_file(&sdebug_driverfs_driver, &driver_attr_add_host);
2457 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_delay);
2458 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dev_size_mb);
2459 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dsense);
2460 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_every_nth);
2461 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_fake_rw);
2462 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_max_luns);
2463 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_no_lun_0);
2464 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_num_parts);
2465 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_num_tgts);
2466 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_ptype);
2467 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_opts);
2468 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_scsi_level);
2469 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_virtual_gb);
2470 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_vpd_use_hostno);
2474 static void do_remove_driverfs_files(void)
2476 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_vpd_use_hostno);
2477 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_virtual_gb);
2478 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_scsi_level);
2479 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_opts);
2480 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_ptype);
2481 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_num_tgts);
2482 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_num_parts);
2483 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_no_lun_0);
2484 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_max_luns);
2485 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_fake_rw);
2486 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_every_nth);
2487 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dsense);
2488 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dev_size_mb);
2489 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_delay);
2490 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_add_host);
2493 static int __init scsi_debug_init(void)
2500 if (scsi_debug_dev_size_mb < 1)
2501 scsi_debug_dev_size_mb = 1; /* force minimum 1 MB ramdisk */
2502 sz = (unsigned int)scsi_debug_dev_size_mb * 1048576;
2503 sdebug_store_sectors = sz / SECT_SIZE;
2504 sdebug_capacity = get_sdebug_capacity();
2506 /* play around with geometry, don't waste too much on track 0 */
2508 sdebug_sectors_per = 32;
2509 if (scsi_debug_dev_size_mb >= 16)
2511 else if (scsi_debug_dev_size_mb >= 256)
2513 sdebug_cylinders_per = (unsigned long)sdebug_capacity /
2514 (sdebug_sectors_per * sdebug_heads);
2515 if (sdebug_cylinders_per >= 1024) {
2516 /* other LLDs do this; implies >= 1GB ram disk ... */
2518 sdebug_sectors_per = 63;
2519 sdebug_cylinders_per = (unsigned long)sdebug_capacity /
2520 (sdebug_sectors_per * sdebug_heads);
2523 fake_storep = vmalloc(sz);
2524 if (NULL == fake_storep) {
2525 printk(KERN_ERR "scsi_debug_init: out of memory, 1\n");
2528 memset(fake_storep, 0, sz);
2529 if (scsi_debug_num_parts > 0)
2530 sdebug_build_parts(fake_storep, sz);
2532 ret = device_register(&pseudo_primary);
2534 printk(KERN_WARNING "scsi_debug: device_register error: %d\n",
2538 ret = bus_register(&pseudo_lld_bus);
2540 printk(KERN_WARNING "scsi_debug: bus_register error: %d\n",
2544 ret = driver_register(&sdebug_driverfs_driver);
2546 printk(KERN_WARNING "scsi_debug: driver_register error: %d\n",
2550 ret = do_create_driverfs_files();
2552 printk(KERN_WARNING "scsi_debug: driver_create_file error: %d\n",
2559 host_to_add = scsi_debug_add_host;
2560 scsi_debug_add_host = 0;
2562 for (k = 0; k < host_to_add; k++) {
2563 if (sdebug_add_adapter()) {
2564 printk(KERN_ERR "scsi_debug_init: "
2565 "sdebug_add_adapter failed k=%d\n", k);
2570 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
2571 printk(KERN_INFO "scsi_debug_init: built %d host(s)\n",
2572 scsi_debug_add_host);
2577 do_remove_driverfs_files();
2578 driver_unregister(&sdebug_driverfs_driver);
2580 bus_unregister(&pseudo_lld_bus);
2582 device_unregister(&pseudo_primary);
2589 static void __exit scsi_debug_exit(void)
2591 int k = scsi_debug_add_host;
2595 sdebug_remove_adapter();
2596 do_remove_driverfs_files();
2597 driver_unregister(&sdebug_driverfs_driver);
2598 bus_unregister(&pseudo_lld_bus);
2599 device_unregister(&pseudo_primary);
2604 device_initcall(scsi_debug_init);
2605 module_exit(scsi_debug_exit);
2607 static void pseudo_0_release(struct device * dev)
2609 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2610 printk(KERN_INFO "scsi_debug: pseudo_0_release() called\n");
2613 static struct device pseudo_primary = {
2614 .bus_id = "pseudo_0",
2615 .release = pseudo_0_release,
2618 static int pseudo_lld_bus_match(struct device *dev,
2619 struct device_driver *dev_driver)
2624 static struct bus_type pseudo_lld_bus = {
2626 .match = pseudo_lld_bus_match,
2627 .probe = sdebug_driver_probe,
2628 .remove = sdebug_driver_remove,
2631 static void sdebug_release_adapter(struct device * dev)
2633 struct sdebug_host_info *sdbg_host;
2635 sdbg_host = to_sdebug_host(dev);
2639 static int sdebug_add_adapter(void)
2641 int k, devs_per_host;
2643 struct sdebug_host_info *sdbg_host;
2644 struct sdebug_dev_info *sdbg_devinfo, *tmp;
2646 sdbg_host = kzalloc(sizeof(*sdbg_host),GFP_KERNEL);
2647 if (NULL == sdbg_host) {
2648 printk(KERN_ERR "%s: out of memory at line %d\n",
2649 __FUNCTION__, __LINE__);
2653 INIT_LIST_HEAD(&sdbg_host->dev_info_list);
2655 devs_per_host = scsi_debug_num_tgts * scsi_debug_max_luns;
2656 for (k = 0; k < devs_per_host; k++) {
2657 sdbg_devinfo = sdebug_device_create(sdbg_host, GFP_KERNEL);
2658 if (!sdbg_devinfo) {
2659 printk(KERN_ERR "%s: out of memory at line %d\n",
2660 __FUNCTION__, __LINE__);
2666 spin_lock(&sdebug_host_list_lock);
2667 list_add_tail(&sdbg_host->host_list, &sdebug_host_list);
2668 spin_unlock(&sdebug_host_list_lock);
2670 sdbg_host->dev.bus = &pseudo_lld_bus;
2671 sdbg_host->dev.parent = &pseudo_primary;
2672 sdbg_host->dev.release = &sdebug_release_adapter;
2673 sprintf(sdbg_host->dev.bus_id, "adapter%d", scsi_debug_add_host);
2675 error = device_register(&sdbg_host->dev);
2680 ++scsi_debug_add_host;
2684 list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
2686 list_del(&sdbg_devinfo->dev_list);
2687 kfree(sdbg_devinfo);
2694 static void sdebug_remove_adapter(void)
2696 struct sdebug_host_info * sdbg_host = NULL;
2698 spin_lock(&sdebug_host_list_lock);
2699 if (!list_empty(&sdebug_host_list)) {
2700 sdbg_host = list_entry(sdebug_host_list.prev,
2701 struct sdebug_host_info, host_list);
2702 list_del(&sdbg_host->host_list);
2704 spin_unlock(&sdebug_host_list_lock);
2709 device_unregister(&sdbg_host->dev);
2710 --scsi_debug_add_host;
2714 int scsi_debug_queuecommand(struct scsi_cmnd *SCpnt, done_funct_t done)
2716 unsigned char *cmd = (unsigned char *) SCpnt->cmnd;
2719 unsigned long long lba;
2721 int target = SCpnt->device->id;
2722 struct sdebug_dev_info *devip = NULL;
2723 int inj_recovered = 0;
2724 int inj_transport = 0;
2725 int delay_override = 0;
2727 scsi_set_resid(SCpnt, 0);
2728 if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) && cmd) {
2729 printk(KERN_INFO "scsi_debug: cmd ");
2730 for (k = 0, len = SCpnt->cmd_len; k < len; ++k)
2731 printk("%02x ", (int)cmd[k]);
2735 if (target == SCpnt->device->host->hostt->this_id) {
2736 printk(KERN_INFO "scsi_debug: initiator's id used as "
2738 return schedule_resp(SCpnt, NULL, done,
2739 DID_NO_CONNECT << 16, 0);
2742 if ((SCpnt->device->lun >= scsi_debug_max_luns) &&
2743 (SCpnt->device->lun != SAM2_WLUN_REPORT_LUNS))
2744 return schedule_resp(SCpnt, NULL, done,
2745 DID_NO_CONNECT << 16, 0);
2746 devip = devInfoReg(SCpnt->device);
2748 return schedule_resp(SCpnt, NULL, done,
2749 DID_NO_CONNECT << 16, 0);
2751 if ((scsi_debug_every_nth != 0) &&
2752 (++scsi_debug_cmnd_count >= abs(scsi_debug_every_nth))) {
2753 scsi_debug_cmnd_count = 0;
2754 if (scsi_debug_every_nth < -1)
2755 scsi_debug_every_nth = -1;
2756 if (SCSI_DEBUG_OPT_TIMEOUT & scsi_debug_opts)
2757 return 0; /* ignore command causing timeout */
2758 else if (SCSI_DEBUG_OPT_RECOVERED_ERR & scsi_debug_opts)
2759 inj_recovered = 1; /* to reads and writes below */
2760 else if (SCSI_DEBUG_OPT_TRANSPORT_ERR & scsi_debug_opts)
2761 inj_transport = 1; /* to reads and writes below */
2768 case TEST_UNIT_READY:
2770 break; /* only allowable wlun commands */
2772 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2773 printk(KERN_INFO "scsi_debug: Opcode: 0x%x "
2774 "not supported for wlun\n", *cmd);
2775 mk_sense_buffer(devip, ILLEGAL_REQUEST,
2777 errsts = check_condition_result;
2778 return schedule_resp(SCpnt, devip, done, errsts,
2784 case INQUIRY: /* mandatory, ignore unit attention */
2786 errsts = resp_inquiry(SCpnt, target, devip);
2788 case REQUEST_SENSE: /* mandatory, ignore unit attention */
2790 errsts = resp_requests(SCpnt, devip);
2792 case REZERO_UNIT: /* actually this is REWIND for SSC */
2794 errsts = resp_start_stop(SCpnt, devip);
2796 case ALLOW_MEDIUM_REMOVAL:
2797 errsts = check_readiness(SCpnt, 1, devip);
2800 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2801 printk(KERN_INFO "scsi_debug: Medium removal %s\n",
2802 cmd[4] ? "inhibited" : "enabled");
2804 case SEND_DIAGNOSTIC: /* mandatory */
2805 errsts = check_readiness(SCpnt, 1, devip);
2807 case TEST_UNIT_READY: /* mandatory */
2809 errsts = check_readiness(SCpnt, 0, devip);
2812 errsts = check_readiness(SCpnt, 1, devip);
2815 errsts = check_readiness(SCpnt, 1, devip);
2818 errsts = check_readiness(SCpnt, 1, devip);
2821 errsts = check_readiness(SCpnt, 1, devip);
2824 errsts = resp_readcap(SCpnt, devip);
2826 case SERVICE_ACTION_IN:
2827 if (SAI_READ_CAPACITY_16 != cmd[1]) {
2828 mk_sense_buffer(devip, ILLEGAL_REQUEST,
2830 errsts = check_condition_result;
2833 errsts = resp_readcap16(SCpnt, devip);
2835 case MAINTENANCE_IN:
2836 if (MI_REPORT_TARGET_PGS != cmd[1]) {
2837 mk_sense_buffer(devip, ILLEGAL_REQUEST,
2839 errsts = check_condition_result;
2842 errsts = resp_report_tgtpgs(SCpnt, devip);
2848 errsts = check_readiness(SCpnt, 0, devip);
2851 if (scsi_debug_fake_rw)
2853 get_data_transfer_info(cmd, &lba, &num);
2854 errsts = resp_read(SCpnt, lba, num, devip);
2855 if (inj_recovered && (0 == errsts)) {
2856 mk_sense_buffer(devip, RECOVERED_ERROR,
2857 THRESHOLD_EXCEEDED, 0);
2858 errsts = check_condition_result;
2859 } else if (inj_transport && (0 == errsts)) {
2860 mk_sense_buffer(devip, ABORTED_COMMAND,
2861 TRANSPORT_PROBLEM, ACK_NAK_TO);
2862 errsts = check_condition_result;
2865 case REPORT_LUNS: /* mandatory, ignore unit attention */
2867 errsts = resp_report_luns(SCpnt, devip);
2869 case VERIFY: /* 10 byte SBC-2 command */
2870 errsts = check_readiness(SCpnt, 0, devip);
2876 errsts = check_readiness(SCpnt, 0, devip);
2879 if (scsi_debug_fake_rw)
2881 get_data_transfer_info(cmd, &lba, &num);
2882 errsts = resp_write(SCpnt, lba, num, devip);
2883 if (inj_recovered && (0 == errsts)) {
2884 mk_sense_buffer(devip, RECOVERED_ERROR,
2885 THRESHOLD_EXCEEDED, 0);
2886 errsts = check_condition_result;
2891 errsts = resp_mode_sense(SCpnt, target, devip);
2894 errsts = resp_mode_select(SCpnt, 1, devip);
2896 case MODE_SELECT_10:
2897 errsts = resp_mode_select(SCpnt, 0, devip);
2900 errsts = resp_log_sense(SCpnt, devip);
2902 case SYNCHRONIZE_CACHE:
2904 errsts = check_readiness(SCpnt, 0, devip);
2907 errsts = check_readiness(SCpnt, 1, devip);
2909 case XDWRITEREAD_10:
2910 if (!scsi_bidi_cmnd(SCpnt)) {
2911 mk_sense_buffer(devip, ILLEGAL_REQUEST,
2912 INVALID_FIELD_IN_CDB, 0);
2913 errsts = check_condition_result;
2917 errsts = check_readiness(SCpnt, 0, devip);
2920 if (scsi_debug_fake_rw)
2922 get_data_transfer_info(cmd, &lba, &num);
2923 errsts = resp_read(SCpnt, lba, num, devip);
2926 errsts = resp_write(SCpnt, lba, num, devip);
2929 errsts = resp_xdwriteread(SCpnt, lba, num, devip);
2932 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2933 printk(KERN_INFO "scsi_debug: Opcode: 0x%x not "
2934 "supported\n", *cmd);
2935 errsts = check_readiness(SCpnt, 1, devip);
2937 break; /* Unit attention takes precedence */
2938 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_OPCODE, 0);
2939 errsts = check_condition_result;
2942 return schedule_resp(SCpnt, devip, done, errsts,
2943 (delay_override ? 0 : scsi_debug_delay));
2946 static struct scsi_host_template sdebug_driver_template = {
2947 .proc_info = scsi_debug_proc_info,
2948 .proc_name = sdebug_proc_name,
2949 .name = "SCSI DEBUG",
2950 .info = scsi_debug_info,
2951 .slave_alloc = scsi_debug_slave_alloc,
2952 .slave_configure = scsi_debug_slave_configure,
2953 .slave_destroy = scsi_debug_slave_destroy,
2954 .ioctl = scsi_debug_ioctl,
2955 .queuecommand = scsi_debug_queuecommand,
2956 .eh_abort_handler = scsi_debug_abort,
2957 .eh_bus_reset_handler = scsi_debug_bus_reset,
2958 .eh_device_reset_handler = scsi_debug_device_reset,
2959 .eh_host_reset_handler = scsi_debug_host_reset,
2960 .bios_param = scsi_debug_biosparam,
2961 .can_queue = SCSI_DEBUG_CANQUEUE,
2963 .sg_tablesize = 256,
2965 .max_sectors = 0xffff,
2966 .use_clustering = DISABLE_CLUSTERING,
2967 .module = THIS_MODULE,
2970 static int sdebug_driver_probe(struct device * dev)
2973 struct sdebug_host_info *sdbg_host;
2974 struct Scsi_Host *hpnt;
2976 sdbg_host = to_sdebug_host(dev);
2978 hpnt = scsi_host_alloc(&sdebug_driver_template, sizeof(sdbg_host));
2980 printk(KERN_ERR "%s: scsi_register failed\n", __FUNCTION__);
2985 sdbg_host->shost = hpnt;
2986 *((struct sdebug_host_info **)hpnt->hostdata) = sdbg_host;
2987 if ((hpnt->this_id >= 0) && (scsi_debug_num_tgts > hpnt->this_id))
2988 hpnt->max_id = scsi_debug_num_tgts + 1;
2990 hpnt->max_id = scsi_debug_num_tgts;
2991 hpnt->max_lun = SAM2_WLUN_REPORT_LUNS; /* = scsi_debug_max_luns; */
2993 error = scsi_add_host(hpnt, &sdbg_host->dev);
2995 printk(KERN_ERR "%s: scsi_add_host failed\n", __FUNCTION__);
2997 scsi_host_put(hpnt);
2999 scsi_scan_host(hpnt);
3005 static int sdebug_driver_remove(struct device * dev)
3007 struct sdebug_host_info *sdbg_host;
3008 struct sdebug_dev_info *sdbg_devinfo, *tmp;
3010 sdbg_host = to_sdebug_host(dev);
3013 printk(KERN_ERR "%s: Unable to locate host info\n",
3018 scsi_remove_host(sdbg_host->shost);
3020 list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
3022 list_del(&sdbg_devinfo->dev_list);
3023 kfree(sdbg_devinfo);
3026 scsi_host_put(sdbg_host->shost);
3030 static void sdebug_max_tgts_luns(void)
3032 struct sdebug_host_info * sdbg_host;
3033 struct Scsi_Host *hpnt;
3035 spin_lock(&sdebug_host_list_lock);
3036 list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
3037 hpnt = sdbg_host->shost;
3038 if ((hpnt->this_id >= 0) &&
3039 (scsi_debug_num_tgts > hpnt->this_id))
3040 hpnt->max_id = scsi_debug_num_tgts + 1;
3042 hpnt->max_id = scsi_debug_num_tgts;
3043 hpnt->max_lun = SAM2_WLUN_REPORT_LUNS; /* scsi_debug_max_luns; */
3045 spin_unlock(&sdebug_host_list_lock);