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://sg.danny.cz/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/slab.h>
34 #include <linux/types.h>
35 #include <linux/string.h>
36 #include <linux/genhd.h>
38 #include <linux/init.h>
39 #include <linux/proc_fs.h>
40 #include <linux/vmalloc.h>
41 #include <linux/moduleparam.h>
42 #include <linux/scatterlist.h>
43 #include <linux/blkdev.h>
44 #include <linux/crc-t10dif.h>
46 #include <net/checksum.h>
48 #include <asm/unaligned.h>
50 #include <scsi/scsi.h>
51 #include <scsi/scsi_cmnd.h>
52 #include <scsi/scsi_device.h>
53 #include <scsi/scsi_host.h>
54 #include <scsi/scsicam.h>
55 #include <scsi/scsi_eh.h>
56 #include <scsi/scsi_dbg.h>
59 #include "scsi_logging.h"
61 #define SCSI_DEBUG_VERSION "1.82"
62 static const char * scsi_debug_version_date = "20100324";
64 /* Additional Sense Code (ASC) */
65 #define NO_ADDITIONAL_SENSE 0x0
66 #define LOGICAL_UNIT_NOT_READY 0x4
67 #define UNRECOVERED_READ_ERR 0x11
68 #define PARAMETER_LIST_LENGTH_ERR 0x1a
69 #define INVALID_OPCODE 0x20
70 #define ADDR_OUT_OF_RANGE 0x21
71 #define INVALID_COMMAND_OPCODE 0x20
72 #define INVALID_FIELD_IN_CDB 0x24
73 #define INVALID_FIELD_IN_PARAM_LIST 0x26
74 #define POWERON_RESET 0x29
75 #define SAVING_PARAMS_UNSUP 0x39
76 #define TRANSPORT_PROBLEM 0x4b
77 #define THRESHOLD_EXCEEDED 0x5d
78 #define LOW_POWER_COND_ON 0x5e
80 /* Additional Sense Code Qualifier (ASCQ) */
81 #define ACK_NAK_TO 0x3
83 #define SDEBUG_TAGGED_QUEUING 0 /* 0 | MSG_SIMPLE_TAG | MSG_ORDERED_TAG */
85 /* Default values for driver parameters */
86 #define DEF_NUM_HOST 1
87 #define DEF_NUM_TGTS 1
88 #define DEF_MAX_LUNS 1
89 /* With these defaults, this driver will make 1 host with 1 target
90 * (id 0) containing 1 logical unit (lun 0). That is 1 device.
94 #define DEF_DEV_SIZE_MB 8
98 #define DEF_EVERY_NTH 0
103 #define DEF_LBPWS10 0
105 #define DEF_LOWEST_ALIGNED 0
106 #define DEF_NO_LUN_0 0
107 #define DEF_NUM_PARTS 0
109 #define DEF_OPT_BLKS 64
110 #define DEF_PHYSBLK_EXP 0
112 #define DEF_REMOVABLE false
113 #define DEF_SCSI_LEVEL 5 /* INQUIRY, byte2 [5->SPC-3] */
114 #define DEF_SECTOR_SIZE 512
115 #define DEF_UNMAP_ALIGNMENT 0
116 #define DEF_UNMAP_GRANULARITY 1
117 #define DEF_UNMAP_MAX_BLOCKS 0xFFFFFFFF
118 #define DEF_UNMAP_MAX_DESC 256
119 #define DEF_VIRTUAL_GB 0
120 #define DEF_VPD_USE_HOSTNO 1
121 #define DEF_WRITESAME_LENGTH 0xFFFF
123 /* bit mask values for scsi_debug_opts */
124 #define SCSI_DEBUG_OPT_NOISE 1
125 #define SCSI_DEBUG_OPT_MEDIUM_ERR 2
126 #define SCSI_DEBUG_OPT_TIMEOUT 4
127 #define SCSI_DEBUG_OPT_RECOVERED_ERR 8
128 #define SCSI_DEBUG_OPT_TRANSPORT_ERR 16
129 #define SCSI_DEBUG_OPT_DIF_ERR 32
130 #define SCSI_DEBUG_OPT_DIX_ERR 64
131 #define SCSI_DEBUG_OPT_MAC_TIMEOUT 128
132 /* When "every_nth" > 0 then modulo "every_nth" commands:
133 * - a no response is simulated if SCSI_DEBUG_OPT_TIMEOUT is set
134 * - a RECOVERED_ERROR is simulated on successful read and write
135 * commands if SCSI_DEBUG_OPT_RECOVERED_ERR is set.
136 * - a TRANSPORT_ERROR is simulated on successful read and write
137 * commands if SCSI_DEBUG_OPT_TRANSPORT_ERR is set.
139 * When "every_nth" < 0 then after "- every_nth" commands:
140 * - a no response is simulated if SCSI_DEBUG_OPT_TIMEOUT is set
141 * - a RECOVERED_ERROR is simulated on successful read and write
142 * commands if SCSI_DEBUG_OPT_RECOVERED_ERR is set.
143 * - a TRANSPORT_ERROR is simulated on successful read and write
144 * commands if SCSI_DEBUG_OPT_TRANSPORT_ERR is set.
145 * This will continue until some other action occurs (e.g. the user
146 * writing a new value (other than -1 or 1) to every_nth via sysfs).
149 /* when 1==SCSI_DEBUG_OPT_MEDIUM_ERR, a medium error is simulated at this
150 * sector on read commands: */
151 #define OPT_MEDIUM_ERR_ADDR 0x1234 /* that's sector 4660 in decimal */
152 #define OPT_MEDIUM_ERR_NUM 10 /* number of consecutive medium errs */
154 /* If REPORT LUNS has luns >= 256 it can choose "flat space" (value 1)
155 * or "peripheral device" addressing (value 0) */
156 #define SAM2_LUN_ADDRESS_METHOD 0
157 #define SAM2_WLUN_REPORT_LUNS 0xc101
159 /* Can queue up to this number of commands. Typically commands that
160 * that have a non-zero delay are queued. */
161 #define SCSI_DEBUG_CANQUEUE 255
163 static int scsi_debug_add_host = DEF_NUM_HOST;
164 static int scsi_debug_ato = DEF_ATO;
165 static int scsi_debug_delay = DEF_DELAY;
166 static int scsi_debug_dev_size_mb = DEF_DEV_SIZE_MB;
167 static int scsi_debug_dif = DEF_DIF;
168 static int scsi_debug_dix = DEF_DIX;
169 static int scsi_debug_dsense = DEF_D_SENSE;
170 static int scsi_debug_every_nth = DEF_EVERY_NTH;
171 static int scsi_debug_fake_rw = DEF_FAKE_RW;
172 static int scsi_debug_guard = DEF_GUARD;
173 static int scsi_debug_lowest_aligned = DEF_LOWEST_ALIGNED;
174 static int scsi_debug_max_luns = DEF_MAX_LUNS;
175 static int scsi_debug_max_queue = SCSI_DEBUG_CANQUEUE;
176 static int scsi_debug_no_lun_0 = DEF_NO_LUN_0;
177 static int scsi_debug_no_uld = 0;
178 static int scsi_debug_num_parts = DEF_NUM_PARTS;
179 static int scsi_debug_num_tgts = DEF_NUM_TGTS; /* targets per host */
180 static int scsi_debug_opt_blks = DEF_OPT_BLKS;
181 static int scsi_debug_opts = DEF_OPTS;
182 static int scsi_debug_physblk_exp = DEF_PHYSBLK_EXP;
183 static int scsi_debug_ptype = DEF_PTYPE; /* SCSI peripheral type (0==disk) */
184 static int scsi_debug_scsi_level = DEF_SCSI_LEVEL;
185 static int scsi_debug_sector_size = DEF_SECTOR_SIZE;
186 static int scsi_debug_virtual_gb = DEF_VIRTUAL_GB;
187 static int scsi_debug_vpd_use_hostno = DEF_VPD_USE_HOSTNO;
188 static unsigned int scsi_debug_lbpu = DEF_LBPU;
189 static unsigned int scsi_debug_lbpws = DEF_LBPWS;
190 static unsigned int scsi_debug_lbpws10 = DEF_LBPWS10;
191 static unsigned int scsi_debug_lbprz = DEF_LBPRZ;
192 static unsigned int scsi_debug_unmap_alignment = DEF_UNMAP_ALIGNMENT;
193 static unsigned int scsi_debug_unmap_granularity = DEF_UNMAP_GRANULARITY;
194 static unsigned int scsi_debug_unmap_max_blocks = DEF_UNMAP_MAX_BLOCKS;
195 static unsigned int scsi_debug_unmap_max_desc = DEF_UNMAP_MAX_DESC;
196 static unsigned int scsi_debug_write_same_length = DEF_WRITESAME_LENGTH;
197 static bool scsi_debug_removable = DEF_REMOVABLE;
199 static int scsi_debug_cmnd_count = 0;
201 #define DEV_READONLY(TGT) (0)
203 static unsigned int sdebug_store_sectors;
204 static sector_t sdebug_capacity; /* in sectors */
206 /* old BIOS stuff, kernel may get rid of them but some mode sense pages
207 may still need them */
208 static int sdebug_heads; /* heads per disk */
209 static int sdebug_cylinders_per; /* cylinders per surface */
210 static int sdebug_sectors_per; /* sectors per cylinder */
212 #define SDEBUG_MAX_PARTS 4
214 #define SDEBUG_SENSE_LEN 32
216 #define SCSI_DEBUG_MAX_CMD_LEN 32
218 static unsigned int scsi_debug_lbp(void)
220 return scsi_debug_lbpu | scsi_debug_lbpws | scsi_debug_lbpws10;
223 struct sdebug_dev_info {
224 struct list_head dev_list;
225 unsigned char sense_buff[SDEBUG_SENSE_LEN]; /* weak nexus */
226 unsigned int channel;
229 struct sdebug_host_info *sdbg_host;
236 struct sdebug_host_info {
237 struct list_head host_list;
238 struct Scsi_Host *shost;
240 struct list_head dev_info_list;
243 #define to_sdebug_host(d) \
244 container_of(d, struct sdebug_host_info, dev)
246 static LIST_HEAD(sdebug_host_list);
247 static DEFINE_SPINLOCK(sdebug_host_list_lock);
249 typedef void (* done_funct_t) (struct scsi_cmnd *);
251 struct sdebug_queued_cmd {
253 struct timer_list cmnd_timer;
254 done_funct_t done_funct;
255 struct scsi_cmnd * a_cmnd;
258 static struct sdebug_queued_cmd queued_arr[SCSI_DEBUG_CANQUEUE];
260 static unsigned char * fake_storep; /* ramdisk storage */
261 static struct sd_dif_tuple *dif_storep; /* protection info */
262 static void *map_storep; /* provisioning map */
264 static unsigned long map_size;
265 static int num_aborts = 0;
266 static int num_dev_resets = 0;
267 static int num_bus_resets = 0;
268 static int num_host_resets = 0;
269 static int dix_writes;
270 static int dix_reads;
271 static int dif_errors;
273 static DEFINE_SPINLOCK(queued_arr_lock);
274 static DEFINE_RWLOCK(atomic_rw);
276 static char sdebug_proc_name[] = "scsi_debug";
278 static struct bus_type pseudo_lld_bus;
280 static struct device_driver sdebug_driverfs_driver = {
281 .name = sdebug_proc_name,
282 .bus = &pseudo_lld_bus,
285 static const int check_condition_result =
286 (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
288 static const int illegal_condition_result =
289 (DRIVER_SENSE << 24) | (DID_ABORT << 16) | SAM_STAT_CHECK_CONDITION;
291 static unsigned char ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
293 static unsigned char iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
296 static int sdebug_add_adapter(void);
297 static void sdebug_remove_adapter(void);
299 static void sdebug_max_tgts_luns(void)
301 struct sdebug_host_info *sdbg_host;
302 struct Scsi_Host *hpnt;
304 spin_lock(&sdebug_host_list_lock);
305 list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
306 hpnt = sdbg_host->shost;
307 if ((hpnt->this_id >= 0) &&
308 (scsi_debug_num_tgts > hpnt->this_id))
309 hpnt->max_id = scsi_debug_num_tgts + 1;
311 hpnt->max_id = scsi_debug_num_tgts;
312 /* scsi_debug_max_luns; */
313 hpnt->max_lun = SAM2_WLUN_REPORT_LUNS;
315 spin_unlock(&sdebug_host_list_lock);
318 static void mk_sense_buffer(struct sdebug_dev_info *devip, int key,
321 unsigned char *sbuff;
323 sbuff = devip->sense_buff;
324 memset(sbuff, 0, SDEBUG_SENSE_LEN);
326 scsi_build_sense_buffer(scsi_debug_dsense, sbuff, key, asc, asq);
328 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
329 printk(KERN_INFO "scsi_debug: [sense_key,asc,ascq]: "
330 "[0x%x,0x%x,0x%x]\n", key, asc, asq);
333 static void get_data_transfer_info(unsigned char *cmd,
334 unsigned long long *lba, unsigned int *num,
340 case VARIABLE_LENGTH_CMD:
341 *lba = (u64)cmd[19] | (u64)cmd[18] << 8 |
342 (u64)cmd[17] << 16 | (u64)cmd[16] << 24 |
343 (u64)cmd[15] << 32 | (u64)cmd[14] << 40 |
344 (u64)cmd[13] << 48 | (u64)cmd[12] << 56;
346 *ei_lba = (u32)cmd[23] | (u32)cmd[22] << 8 |
347 (u32)cmd[21] << 16 | (u32)cmd[20] << 24;
349 *num = (u32)cmd[31] | (u32)cmd[30] << 8 | (u32)cmd[29] << 16 |
356 *lba = (u64)cmd[9] | (u64)cmd[8] << 8 |
357 (u64)cmd[7] << 16 | (u64)cmd[6] << 24 |
358 (u64)cmd[5] << 32 | (u64)cmd[4] << 40 |
359 (u64)cmd[3] << 48 | (u64)cmd[2] << 56;
361 *num = (u32)cmd[13] | (u32)cmd[12] << 8 | (u32)cmd[11] << 16 |
366 *lba = (u32)cmd[5] | (u32)cmd[4] << 8 | (u32)cmd[3] << 16 |
369 *num = (u32)cmd[9] | (u32)cmd[8] << 8 | (u32)cmd[7] << 16 |
376 *lba = (u32)cmd[5] | (u32)cmd[4] << 8 | (u32)cmd[3] << 16 |
379 *num = (u32)cmd[8] | (u32)cmd[7] << 8;
383 *lba = (u32)cmd[3] | (u32)cmd[2] << 8 |
384 (u32)(cmd[1] & 0x1f) << 16;
385 *num = (0 == cmd[4]) ? 256 : cmd[4];
392 static int scsi_debug_ioctl(struct scsi_device *dev, int cmd, void __user *arg)
394 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
395 printk(KERN_INFO "scsi_debug: ioctl: cmd=0x%x\n", cmd);
398 /* return -ENOTTY; // correct return but upsets fdisk */
401 static int check_readiness(struct scsi_cmnd * SCpnt, int reset_only,
402 struct sdebug_dev_info * devip)
405 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
406 printk(KERN_INFO "scsi_debug: Reporting Unit "
407 "attention: power on reset\n");
409 mk_sense_buffer(devip, UNIT_ATTENTION, POWERON_RESET, 0);
410 return check_condition_result;
412 if ((0 == reset_only) && devip->stopped) {
413 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
414 printk(KERN_INFO "scsi_debug: Reporting Not "
415 "ready: initializing command required\n");
416 mk_sense_buffer(devip, NOT_READY, LOGICAL_UNIT_NOT_READY,
418 return check_condition_result;
423 /* Returns 0 if ok else (DID_ERROR << 16). Sets scp->resid . */
424 static int fill_from_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
428 struct scsi_data_buffer *sdb = scsi_in(scp);
432 if (!(scsi_bidi_cmnd(scp) || scp->sc_data_direction == DMA_FROM_DEVICE))
433 return (DID_ERROR << 16);
435 act_len = sg_copy_from_buffer(sdb->table.sgl, sdb->table.nents,
438 sdb->resid -= act_len;
440 sdb->resid = scsi_bufflen(scp) - act_len;
445 /* Returns number of bytes fetched into 'arr' or -1 if error. */
446 static int fetch_to_dev_buffer(struct scsi_cmnd *scp, unsigned char *arr,
449 if (!scsi_bufflen(scp))
451 if (!(scsi_bidi_cmnd(scp) || scp->sc_data_direction == DMA_TO_DEVICE))
454 return scsi_sg_copy_to_buffer(scp, arr, arr_len);
458 static const char * inq_vendor_id = "Linux ";
459 static const char * inq_product_id = "scsi_debug ";
460 static const char * inq_product_rev = "0004";
462 static int inquiry_evpd_83(unsigned char * arr, int port_group_id,
463 int target_dev_id, int dev_id_num,
464 const char * dev_id_str,
470 port_a = target_dev_id + 1;
471 /* T10 vendor identifier field format (faked) */
472 arr[0] = 0x2; /* ASCII */
475 memcpy(&arr[4], inq_vendor_id, 8);
476 memcpy(&arr[12], inq_product_id, 16);
477 memcpy(&arr[28], dev_id_str, dev_id_str_len);
478 num = 8 + 16 + dev_id_str_len;
481 if (dev_id_num >= 0) {
482 /* NAA-5, Logical unit identifier (binary) */
483 arr[num++] = 0x1; /* binary (not necessarily sas) */
484 arr[num++] = 0x3; /* PIV=0, lu, naa */
487 arr[num++] = 0x53; /* naa-5 ieee company id=0x333333 (fake) */
491 arr[num++] = (dev_id_num >> 24);
492 arr[num++] = (dev_id_num >> 16) & 0xff;
493 arr[num++] = (dev_id_num >> 8) & 0xff;
494 arr[num++] = dev_id_num & 0xff;
495 /* Target relative port number */
496 arr[num++] = 0x61; /* proto=sas, binary */
497 arr[num++] = 0x94; /* PIV=1, target port, rel port */
498 arr[num++] = 0x0; /* reserved */
499 arr[num++] = 0x4; /* length */
500 arr[num++] = 0x0; /* reserved */
501 arr[num++] = 0x0; /* reserved */
503 arr[num++] = 0x1; /* relative port A */
505 /* NAA-5, Target port identifier */
506 arr[num++] = 0x61; /* proto=sas, binary */
507 arr[num++] = 0x93; /* piv=1, target port, naa */
510 arr[num++] = 0x52; /* naa-5, company id=0x222222 (fake) */
514 arr[num++] = (port_a >> 24);
515 arr[num++] = (port_a >> 16) & 0xff;
516 arr[num++] = (port_a >> 8) & 0xff;
517 arr[num++] = port_a & 0xff;
518 /* NAA-5, Target port group identifier */
519 arr[num++] = 0x61; /* proto=sas, binary */
520 arr[num++] = 0x95; /* piv=1, target port group id */
525 arr[num++] = (port_group_id >> 8) & 0xff;
526 arr[num++] = port_group_id & 0xff;
527 /* NAA-5, Target device identifier */
528 arr[num++] = 0x61; /* proto=sas, binary */
529 arr[num++] = 0xa3; /* piv=1, target device, naa */
532 arr[num++] = 0x52; /* naa-5, company id=0x222222 (fake) */
536 arr[num++] = (target_dev_id >> 24);
537 arr[num++] = (target_dev_id >> 16) & 0xff;
538 arr[num++] = (target_dev_id >> 8) & 0xff;
539 arr[num++] = target_dev_id & 0xff;
540 /* SCSI name string: Target device identifier */
541 arr[num++] = 0x63; /* proto=sas, UTF-8 */
542 arr[num++] = 0xa8; /* piv=1, target device, SCSI name string */
545 memcpy(arr + num, "naa.52222220", 12);
547 snprintf(b, sizeof(b), "%08X", target_dev_id);
548 memcpy(arr + num, b, 8);
550 memset(arr + num, 0, 4);
556 static unsigned char vpd84_data[] = {
557 /* from 4th byte */ 0x22,0x22,0x22,0x0,0xbb,0x0,
558 0x22,0x22,0x22,0x0,0xbb,0x1,
559 0x22,0x22,0x22,0x0,0xbb,0x2,
562 static int inquiry_evpd_84(unsigned char * arr)
564 memcpy(arr, vpd84_data, sizeof(vpd84_data));
565 return sizeof(vpd84_data);
568 static int inquiry_evpd_85(unsigned char * arr)
571 const char * na1 = "https://www.kernel.org/config";
572 const char * na2 = "http://www.kernel.org/log";
575 arr[num++] = 0x1; /* lu, storage config */
576 arr[num++] = 0x0; /* reserved */
581 plen = ((plen / 4) + 1) * 4;
582 arr[num++] = plen; /* length, null termianted, padded */
583 memcpy(arr + num, na1, olen);
584 memset(arr + num + olen, 0, plen - olen);
587 arr[num++] = 0x4; /* lu, logging */
588 arr[num++] = 0x0; /* reserved */
593 plen = ((plen / 4) + 1) * 4;
594 arr[num++] = plen; /* length, null terminated, padded */
595 memcpy(arr + num, na2, olen);
596 memset(arr + num + olen, 0, plen - olen);
602 /* SCSI ports VPD page */
603 static int inquiry_evpd_88(unsigned char * arr, int target_dev_id)
608 port_a = target_dev_id + 1;
610 arr[num++] = 0x0; /* reserved */
611 arr[num++] = 0x0; /* reserved */
613 arr[num++] = 0x1; /* relative port 1 (primary) */
614 memset(arr + num, 0, 6);
617 arr[num++] = 12; /* length tp descriptor */
618 /* naa-5 target port identifier (A) */
619 arr[num++] = 0x61; /* proto=sas, binary */
620 arr[num++] = 0x93; /* PIV=1, target port, NAA */
621 arr[num++] = 0x0; /* reserved */
622 arr[num++] = 0x8; /* length */
623 arr[num++] = 0x52; /* NAA-5, company_id=0x222222 (fake) */
627 arr[num++] = (port_a >> 24);
628 arr[num++] = (port_a >> 16) & 0xff;
629 arr[num++] = (port_a >> 8) & 0xff;
630 arr[num++] = port_a & 0xff;
632 arr[num++] = 0x0; /* reserved */
633 arr[num++] = 0x0; /* reserved */
635 arr[num++] = 0x2; /* relative port 2 (secondary) */
636 memset(arr + num, 0, 6);
639 arr[num++] = 12; /* length tp descriptor */
640 /* naa-5 target port identifier (B) */
641 arr[num++] = 0x61; /* proto=sas, binary */
642 arr[num++] = 0x93; /* PIV=1, target port, NAA */
643 arr[num++] = 0x0; /* reserved */
644 arr[num++] = 0x8; /* length */
645 arr[num++] = 0x52; /* NAA-5, company_id=0x222222 (fake) */
649 arr[num++] = (port_b >> 24);
650 arr[num++] = (port_b >> 16) & 0xff;
651 arr[num++] = (port_b >> 8) & 0xff;
652 arr[num++] = port_b & 0xff;
658 static unsigned char vpd89_data[] = {
659 /* from 4th byte */ 0,0,0,0,
660 'l','i','n','u','x',' ',' ',' ',
661 'S','A','T',' ','s','c','s','i','_','d','e','b','u','g',' ',' ',
663 0x34,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
665 0x5a,0xc,0xff,0x3f,0x37,0xc8,0x10,0,0,0,0,0,0x3f,0,0,0,
666 0,0,0,0,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x20,0x20,0x20,0x20,
667 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0,0,0,0x40,0x4,0,0x2e,0x33,
668 0x38,0x31,0x20,0x20,0x20,0x20,0x54,0x53,0x38,0x33,0x30,0x30,0x33,0x31,
670 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
672 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
674 0,0,0,0x2f,0,0,0,0x2,0,0x2,0x7,0,0xff,0xff,0x1,0,
675 0x3f,0,0xc1,0xff,0x3e,0,0x10,0x1,0xb0,0xf8,0x50,0x9,0,0,0x7,0,
676 0x3,0,0x78,0,0x78,0,0xf0,0,0x78,0,0,0,0,0,0,0,
677 0,0,0,0,0,0,0,0,0x2,0,0,0,0,0,0,0,
678 0x7e,0,0x1b,0,0x6b,0x34,0x1,0x7d,0x3,0x40,0x69,0x34,0x1,0x3c,0x3,0x40,
679 0x7f,0x40,0,0,0,0,0xfe,0xfe,0,0,0,0,0,0xfe,0,0,
680 0,0,0,0,0,0,0,0,0xb0,0xf8,0x50,0x9,0,0,0,0,
681 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
682 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
683 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
684 0x1,0,0xb0,0xf8,0x50,0x9,0xb0,0xf8,0x50,0x9,0x20,0x20,0x2,0,0xb6,0x42,
685 0,0x80,0x8a,0,0x6,0x3c,0xa,0x3c,0xff,0xff,0xc6,0x7,0,0x1,0,0x8,
686 0xf0,0xf,0,0x10,0x2,0,0x30,0,0,0,0,0,0,0,0x6,0xfe,
687 0,0,0x2,0,0x50,0,0x8a,0,0x4f,0x95,0,0,0x21,0,0xb,0,
688 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
689 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
690 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
691 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
692 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
693 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
694 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
695 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
696 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
697 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
698 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
699 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa5,0x51,
702 static int inquiry_evpd_89(unsigned char * arr)
704 memcpy(arr, vpd89_data, sizeof(vpd89_data));
705 return sizeof(vpd89_data);
709 /* Block limits VPD page (SBC-3) */
710 static unsigned char vpdb0_data[] = {
711 /* from 4th byte */ 0,0,0,4, 0,0,0x4,0, 0,0,0,64,
712 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
713 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
714 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
717 static int inquiry_evpd_b0(unsigned char * arr)
721 memcpy(arr, vpdb0_data, sizeof(vpdb0_data));
723 /* Optimal transfer length granularity */
724 gran = 1 << scsi_debug_physblk_exp;
725 arr[2] = (gran >> 8) & 0xff;
726 arr[3] = gran & 0xff;
728 /* Maximum Transfer Length */
729 if (sdebug_store_sectors > 0x400) {
730 arr[4] = (sdebug_store_sectors >> 24) & 0xff;
731 arr[5] = (sdebug_store_sectors >> 16) & 0xff;
732 arr[6] = (sdebug_store_sectors >> 8) & 0xff;
733 arr[7] = sdebug_store_sectors & 0xff;
736 /* Optimal Transfer Length */
737 put_unaligned_be32(scsi_debug_opt_blks, &arr[8]);
739 if (scsi_debug_lbpu) {
740 /* Maximum Unmap LBA Count */
741 put_unaligned_be32(scsi_debug_unmap_max_blocks, &arr[16]);
743 /* Maximum Unmap Block Descriptor Count */
744 put_unaligned_be32(scsi_debug_unmap_max_desc, &arr[20]);
747 /* Unmap Granularity Alignment */
748 if (scsi_debug_unmap_alignment) {
749 put_unaligned_be32(scsi_debug_unmap_alignment, &arr[28]);
750 arr[28] |= 0x80; /* UGAVALID */
753 /* Optimal Unmap Granularity */
754 put_unaligned_be32(scsi_debug_unmap_granularity, &arr[24]);
756 /* Maximum WRITE SAME Length */
757 put_unaligned_be64(scsi_debug_write_same_length, &arr[32]);
759 return 0x3c; /* Mandatory page length for Logical Block Provisioning */
761 return sizeof(vpdb0_data);
764 /* Block device characteristics VPD page (SBC-3) */
765 static int inquiry_evpd_b1(unsigned char *arr)
767 memset(arr, 0, 0x3c);
769 arr[1] = 1; /* non rotating medium (e.g. solid state) */
771 arr[3] = 5; /* less than 1.8" */
776 /* Logical block provisioning VPD page (SBC-3) */
777 static int inquiry_evpd_b2(unsigned char *arr)
780 arr[0] = 0; /* threshold exponent */
785 if (scsi_debug_lbpws)
788 if (scsi_debug_lbpws10)
791 if (scsi_debug_lbprz)
797 #define SDEBUG_LONG_INQ_SZ 96
798 #define SDEBUG_MAX_INQ_ARR_SZ 584
800 static int resp_inquiry(struct scsi_cmnd * scp, int target,
801 struct sdebug_dev_info * devip)
803 unsigned char pq_pdt;
805 unsigned char *cmd = (unsigned char *)scp->cmnd;
806 int alloc_len, n, ret;
808 alloc_len = (cmd[3] << 8) + cmd[4];
809 arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_ATOMIC);
811 return DID_REQUEUE << 16;
813 pq_pdt = 0x1e; /* present, wlun */
814 else if (scsi_debug_no_lun_0 && (0 == devip->lun))
815 pq_pdt = 0x7f; /* not present, no device type */
817 pq_pdt = (scsi_debug_ptype & 0x1f);
819 if (0x2 & cmd[1]) { /* CMDDT bit set */
820 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
823 return check_condition_result;
824 } else if (0x1 & cmd[1]) { /* EVPD bit set */
825 int lu_id_num, port_group_id, target_dev_id, len;
827 int host_no = devip->sdbg_host->shost->host_no;
829 port_group_id = (((host_no + 1) & 0x7f) << 8) +
830 (devip->channel & 0x7f);
831 if (0 == scsi_debug_vpd_use_hostno)
833 lu_id_num = devip->wlun ? -1 : (((host_no + 1) * 2000) +
834 (devip->target * 1000) + devip->lun);
835 target_dev_id = ((host_no + 1) * 2000) +
836 (devip->target * 1000) - 3;
837 len = scnprintf(lu_id_str, 6, "%d", lu_id_num);
838 if (0 == cmd[2]) { /* supported vital product data pages */
839 arr[1] = cmd[2]; /*sanity */
841 arr[n++] = 0x0; /* this page */
842 arr[n++] = 0x80; /* unit serial number */
843 arr[n++] = 0x83; /* device identification */
844 arr[n++] = 0x84; /* software interface ident. */
845 arr[n++] = 0x85; /* management network addresses */
846 arr[n++] = 0x86; /* extended inquiry */
847 arr[n++] = 0x87; /* mode page policy */
848 arr[n++] = 0x88; /* SCSI ports */
849 arr[n++] = 0x89; /* ATA information */
850 arr[n++] = 0xb0; /* Block limits (SBC) */
851 arr[n++] = 0xb1; /* Block characteristics (SBC) */
852 if (scsi_debug_lbp()) /* Logical Block Prov. (SBC) */
854 arr[3] = n - 4; /* number of supported VPD pages */
855 } else if (0x80 == cmd[2]) { /* unit serial number */
856 arr[1] = cmd[2]; /*sanity */
858 memcpy(&arr[4], lu_id_str, len);
859 } else if (0x83 == cmd[2]) { /* device identification */
860 arr[1] = cmd[2]; /*sanity */
861 arr[3] = inquiry_evpd_83(&arr[4], port_group_id,
862 target_dev_id, lu_id_num,
864 } else if (0x84 == cmd[2]) { /* Software interface ident. */
865 arr[1] = cmd[2]; /*sanity */
866 arr[3] = inquiry_evpd_84(&arr[4]);
867 } else if (0x85 == cmd[2]) { /* Management network addresses */
868 arr[1] = cmd[2]; /*sanity */
869 arr[3] = inquiry_evpd_85(&arr[4]);
870 } else if (0x86 == cmd[2]) { /* extended inquiry */
871 arr[1] = cmd[2]; /*sanity */
872 arr[3] = 0x3c; /* number of following entries */
873 if (scsi_debug_dif == SD_DIF_TYPE3_PROTECTION)
874 arr[4] = 0x4; /* SPT: GRD_CHK:1 */
875 else if (scsi_debug_dif)
876 arr[4] = 0x5; /* SPT: GRD_CHK:1, REF_CHK:1 */
878 arr[4] = 0x0; /* no protection stuff */
879 arr[5] = 0x7; /* head of q, ordered + simple q's */
880 } else if (0x87 == cmd[2]) { /* mode page policy */
881 arr[1] = cmd[2]; /*sanity */
882 arr[3] = 0x8; /* number of following entries */
883 arr[4] = 0x2; /* disconnect-reconnect mp */
884 arr[6] = 0x80; /* mlus, shared */
885 arr[8] = 0x18; /* protocol specific lu */
886 arr[10] = 0x82; /* mlus, per initiator port */
887 } else if (0x88 == cmd[2]) { /* SCSI Ports */
888 arr[1] = cmd[2]; /*sanity */
889 arr[3] = inquiry_evpd_88(&arr[4], target_dev_id);
890 } else if (0x89 == cmd[2]) { /* ATA information */
891 arr[1] = cmd[2]; /*sanity */
892 n = inquiry_evpd_89(&arr[4]);
895 } else if (0xb0 == cmd[2]) { /* Block limits (SBC) */
896 arr[1] = cmd[2]; /*sanity */
897 arr[3] = inquiry_evpd_b0(&arr[4]);
898 } else if (0xb1 == cmd[2]) { /* Block characteristics (SBC) */
899 arr[1] = cmd[2]; /*sanity */
900 arr[3] = inquiry_evpd_b1(&arr[4]);
901 } else if (0xb2 == cmd[2]) { /* Logical Block Prov. (SBC) */
902 arr[1] = cmd[2]; /*sanity */
903 arr[3] = inquiry_evpd_b2(&arr[4]);
905 /* Illegal request, invalid field in cdb */
906 mk_sense_buffer(devip, ILLEGAL_REQUEST,
907 INVALID_FIELD_IN_CDB, 0);
909 return check_condition_result;
911 len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len);
912 ret = fill_from_dev_buffer(scp, arr,
913 min(len, SDEBUG_MAX_INQ_ARR_SZ));
917 /* drops through here for a standard inquiry */
918 arr[1] = scsi_debug_removable ? 0x80 : 0; /* Removable disk */
919 arr[2] = scsi_debug_scsi_level;
920 arr[3] = 2; /* response_data_format==2 */
921 arr[4] = SDEBUG_LONG_INQ_SZ - 5;
922 arr[5] = scsi_debug_dif ? 1 : 0; /* PROTECT bit */
923 if (0 == scsi_debug_vpd_use_hostno)
924 arr[5] = 0x10; /* claim: implicit TGPS */
925 arr[6] = 0x10; /* claim: MultiP */
926 /* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */
927 arr[7] = 0xa; /* claim: LINKED + CMDQUE */
928 memcpy(&arr[8], inq_vendor_id, 8);
929 memcpy(&arr[16], inq_product_id, 16);
930 memcpy(&arr[32], inq_product_rev, 4);
931 /* version descriptors (2 bytes each) follow */
932 arr[58] = 0x0; arr[59] = 0x77; /* SAM-3 ANSI */
933 arr[60] = 0x3; arr[61] = 0x14; /* SPC-3 ANSI */
935 if (scsi_debug_ptype == 0) {
936 arr[n++] = 0x3; arr[n++] = 0x3d; /* SBC-2 ANSI */
937 } else if (scsi_debug_ptype == 1) {
938 arr[n++] = 0x3; arr[n++] = 0x60; /* SSC-2 no version */
940 arr[n++] = 0xc; arr[n++] = 0xf; /* SAS-1.1 rev 10 */
941 ret = fill_from_dev_buffer(scp, arr,
942 min(alloc_len, SDEBUG_LONG_INQ_SZ));
947 static int resp_requests(struct scsi_cmnd * scp,
948 struct sdebug_dev_info * devip)
950 unsigned char * sbuff;
951 unsigned char *cmd = (unsigned char *)scp->cmnd;
952 unsigned char arr[SDEBUG_SENSE_LEN];
956 memset(arr, 0, sizeof(arr));
957 if (devip->reset == 1)
958 mk_sense_buffer(devip, 0, NO_ADDITIONAL_SENSE, 0);
959 want_dsense = !!(cmd[1] & 1) || scsi_debug_dsense;
960 sbuff = devip->sense_buff;
961 if ((iec_m_pg[2] & 0x4) && (6 == (iec_m_pg[3] & 0xf))) {
964 arr[1] = 0x0; /* NO_SENSE in sense_key */
965 arr[2] = THRESHOLD_EXCEEDED;
966 arr[3] = 0xff; /* TEST set and MRIE==6 */
969 arr[2] = 0x0; /* NO_SENSE in sense_key */
970 arr[7] = 0xa; /* 18 byte sense buffer */
971 arr[12] = THRESHOLD_EXCEEDED;
972 arr[13] = 0xff; /* TEST set and MRIE==6 */
975 memcpy(arr, sbuff, SDEBUG_SENSE_LEN);
976 if ((cmd[1] & 1) && (! scsi_debug_dsense)) {
977 /* DESC bit set and sense_buff in fixed format */
978 memset(arr, 0, sizeof(arr));
980 arr[1] = sbuff[2]; /* sense key */
981 arr[2] = sbuff[12]; /* asc */
982 arr[3] = sbuff[13]; /* ascq */
986 mk_sense_buffer(devip, 0, NO_ADDITIONAL_SENSE, 0);
987 return fill_from_dev_buffer(scp, arr, len);
990 static int resp_start_stop(struct scsi_cmnd * scp,
991 struct sdebug_dev_info * devip)
993 unsigned char *cmd = (unsigned char *)scp->cmnd;
994 int power_cond, errsts, start;
996 if ((errsts = check_readiness(scp, 1, devip)))
998 power_cond = (cmd[4] & 0xf0) >> 4;
1000 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1002 return check_condition_result;
1005 if (start == devip->stopped)
1006 devip->stopped = !start;
1010 static sector_t get_sdebug_capacity(void)
1012 if (scsi_debug_virtual_gb > 0)
1013 return (sector_t)scsi_debug_virtual_gb *
1014 (1073741824 / scsi_debug_sector_size);
1016 return sdebug_store_sectors;
1019 #define SDEBUG_READCAP_ARR_SZ 8
1020 static int resp_readcap(struct scsi_cmnd * scp,
1021 struct sdebug_dev_info * devip)
1023 unsigned char arr[SDEBUG_READCAP_ARR_SZ];
1027 if ((errsts = check_readiness(scp, 1, devip)))
1029 /* following just in case virtual_gb changed */
1030 sdebug_capacity = get_sdebug_capacity();
1031 memset(arr, 0, SDEBUG_READCAP_ARR_SZ);
1032 if (sdebug_capacity < 0xffffffff) {
1033 capac = (unsigned int)sdebug_capacity - 1;
1034 arr[0] = (capac >> 24);
1035 arr[1] = (capac >> 16) & 0xff;
1036 arr[2] = (capac >> 8) & 0xff;
1037 arr[3] = capac & 0xff;
1044 arr[6] = (scsi_debug_sector_size >> 8) & 0xff;
1045 arr[7] = scsi_debug_sector_size & 0xff;
1046 return fill_from_dev_buffer(scp, arr, SDEBUG_READCAP_ARR_SZ);
1049 #define SDEBUG_READCAP16_ARR_SZ 32
1050 static int resp_readcap16(struct scsi_cmnd * scp,
1051 struct sdebug_dev_info * devip)
1053 unsigned char *cmd = (unsigned char *)scp->cmnd;
1054 unsigned char arr[SDEBUG_READCAP16_ARR_SZ];
1055 unsigned long long capac;
1056 int errsts, k, alloc_len;
1058 if ((errsts = check_readiness(scp, 1, devip)))
1060 alloc_len = ((cmd[10] << 24) + (cmd[11] << 16) + (cmd[12] << 8)
1062 /* following just in case virtual_gb changed */
1063 sdebug_capacity = get_sdebug_capacity();
1064 memset(arr, 0, SDEBUG_READCAP16_ARR_SZ);
1065 capac = sdebug_capacity - 1;
1066 for (k = 0; k < 8; ++k, capac >>= 8)
1067 arr[7 - k] = capac & 0xff;
1068 arr[8] = (scsi_debug_sector_size >> 24) & 0xff;
1069 arr[9] = (scsi_debug_sector_size >> 16) & 0xff;
1070 arr[10] = (scsi_debug_sector_size >> 8) & 0xff;
1071 arr[11] = scsi_debug_sector_size & 0xff;
1072 arr[13] = scsi_debug_physblk_exp & 0xf;
1073 arr[14] = (scsi_debug_lowest_aligned >> 8) & 0x3f;
1075 if (scsi_debug_lbp()) {
1076 arr[14] |= 0x80; /* LBPME */
1077 if (scsi_debug_lbprz)
1078 arr[14] |= 0x40; /* LBPRZ */
1081 arr[15] = scsi_debug_lowest_aligned & 0xff;
1083 if (scsi_debug_dif) {
1084 arr[12] = (scsi_debug_dif - 1) << 1; /* P_TYPE */
1085 arr[12] |= 1; /* PROT_EN */
1088 return fill_from_dev_buffer(scp, arr,
1089 min(alloc_len, SDEBUG_READCAP16_ARR_SZ));
1092 #define SDEBUG_MAX_TGTPGS_ARR_SZ 1412
1094 static int resp_report_tgtpgs(struct scsi_cmnd * scp,
1095 struct sdebug_dev_info * devip)
1097 unsigned char *cmd = (unsigned char *)scp->cmnd;
1098 unsigned char * arr;
1099 int host_no = devip->sdbg_host->shost->host_no;
1100 int n, ret, alen, rlen;
1101 int port_group_a, port_group_b, port_a, port_b;
1103 alen = ((cmd[6] << 24) + (cmd[7] << 16) + (cmd[8] << 8)
1106 arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_ATOMIC);
1108 return DID_REQUEUE << 16;
1110 * EVPD page 0x88 states we have two ports, one
1111 * real and a fake port with no device connected.
1112 * So we create two port groups with one port each
1113 * and set the group with port B to unavailable.
1115 port_a = 0x1; /* relative port A */
1116 port_b = 0x2; /* relative port B */
1117 port_group_a = (((host_no + 1) & 0x7f) << 8) +
1118 (devip->channel & 0x7f);
1119 port_group_b = (((host_no + 1) & 0x7f) << 8) +
1120 (devip->channel & 0x7f) + 0x80;
1123 * The asymmetric access state is cycled according to the host_id.
1126 if (0 == scsi_debug_vpd_use_hostno) {
1127 arr[n++] = host_no % 3; /* Asymm access state */
1128 arr[n++] = 0x0F; /* claim: all states are supported */
1130 arr[n++] = 0x0; /* Active/Optimized path */
1131 arr[n++] = 0x01; /* claim: only support active/optimized paths */
1133 arr[n++] = (port_group_a >> 8) & 0xff;
1134 arr[n++] = port_group_a & 0xff;
1135 arr[n++] = 0; /* Reserved */
1136 arr[n++] = 0; /* Status code */
1137 arr[n++] = 0; /* Vendor unique */
1138 arr[n++] = 0x1; /* One port per group */
1139 arr[n++] = 0; /* Reserved */
1140 arr[n++] = 0; /* Reserved */
1141 arr[n++] = (port_a >> 8) & 0xff;
1142 arr[n++] = port_a & 0xff;
1143 arr[n++] = 3; /* Port unavailable */
1144 arr[n++] = 0x08; /* claim: only unavailalbe paths are supported */
1145 arr[n++] = (port_group_b >> 8) & 0xff;
1146 arr[n++] = port_group_b & 0xff;
1147 arr[n++] = 0; /* Reserved */
1148 arr[n++] = 0; /* Status code */
1149 arr[n++] = 0; /* Vendor unique */
1150 arr[n++] = 0x1; /* One port per group */
1151 arr[n++] = 0; /* Reserved */
1152 arr[n++] = 0; /* Reserved */
1153 arr[n++] = (port_b >> 8) & 0xff;
1154 arr[n++] = port_b & 0xff;
1157 arr[0] = (rlen >> 24) & 0xff;
1158 arr[1] = (rlen >> 16) & 0xff;
1159 arr[2] = (rlen >> 8) & 0xff;
1160 arr[3] = rlen & 0xff;
1163 * Return the smallest value of either
1164 * - The allocated length
1165 * - The constructed command length
1166 * - The maximum array size
1169 ret = fill_from_dev_buffer(scp, arr,
1170 min(rlen, SDEBUG_MAX_TGTPGS_ARR_SZ));
1175 /* <<Following mode page info copied from ST318451LW>> */
1177 static int resp_err_recov_pg(unsigned char * p, int pcontrol, int target)
1178 { /* Read-Write Error Recovery page for mode_sense */
1179 unsigned char err_recov_pg[] = {0x1, 0xa, 0xc0, 11, 240, 0, 0, 0,
1182 memcpy(p, err_recov_pg, sizeof(err_recov_pg));
1184 memset(p + 2, 0, sizeof(err_recov_pg) - 2);
1185 return sizeof(err_recov_pg);
1188 static int resp_disconnect_pg(unsigned char * p, int pcontrol, int target)
1189 { /* Disconnect-Reconnect page for mode_sense */
1190 unsigned char disconnect_pg[] = {0x2, 0xe, 128, 128, 0, 10, 0, 0,
1191 0, 0, 0, 0, 0, 0, 0, 0};
1193 memcpy(p, disconnect_pg, sizeof(disconnect_pg));
1195 memset(p + 2, 0, sizeof(disconnect_pg) - 2);
1196 return sizeof(disconnect_pg);
1199 static int resp_format_pg(unsigned char * p, int pcontrol, int target)
1200 { /* Format device page for mode_sense */
1201 unsigned char format_pg[] = {0x3, 0x16, 0, 0, 0, 0, 0, 0,
1202 0, 0, 0, 0, 0, 0, 0, 0,
1203 0, 0, 0, 0, 0x40, 0, 0, 0};
1205 memcpy(p, format_pg, sizeof(format_pg));
1206 p[10] = (sdebug_sectors_per >> 8) & 0xff;
1207 p[11] = sdebug_sectors_per & 0xff;
1208 p[12] = (scsi_debug_sector_size >> 8) & 0xff;
1209 p[13] = scsi_debug_sector_size & 0xff;
1210 if (scsi_debug_removable)
1211 p[20] |= 0x20; /* should agree with INQUIRY */
1213 memset(p + 2, 0, sizeof(format_pg) - 2);
1214 return sizeof(format_pg);
1217 static int resp_caching_pg(unsigned char * p, int pcontrol, int target)
1218 { /* Caching page for mode_sense */
1219 unsigned char caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
1220 0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0, 0, 0, 0, 0};
1222 memcpy(p, caching_pg, sizeof(caching_pg));
1224 memset(p + 2, 0, sizeof(caching_pg) - 2);
1225 return sizeof(caching_pg);
1228 static int resp_ctrl_m_pg(unsigned char * p, int pcontrol, int target)
1229 { /* Control mode page for mode_sense */
1230 unsigned char ch_ctrl_m_pg[] = {/* 0xa, 10, */ 0x6, 0, 0, 0, 0, 0,
1232 unsigned char d_ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
1235 if (scsi_debug_dsense)
1236 ctrl_m_pg[2] |= 0x4;
1238 ctrl_m_pg[2] &= ~0x4;
1241 ctrl_m_pg[5] |= 0x80; /* ATO=1 */
1243 memcpy(p, ctrl_m_pg, sizeof(ctrl_m_pg));
1245 memcpy(p + 2, ch_ctrl_m_pg, sizeof(ch_ctrl_m_pg));
1246 else if (2 == pcontrol)
1247 memcpy(p, d_ctrl_m_pg, sizeof(d_ctrl_m_pg));
1248 return sizeof(ctrl_m_pg);
1252 static int resp_iec_m_pg(unsigned char * p, int pcontrol, int target)
1253 { /* Informational Exceptions control mode page for mode_sense */
1254 unsigned char ch_iec_m_pg[] = {/* 0x1c, 0xa, */ 0x4, 0xf, 0, 0, 0, 0,
1256 unsigned char d_iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
1259 memcpy(p, iec_m_pg, sizeof(iec_m_pg));
1261 memcpy(p + 2, ch_iec_m_pg, sizeof(ch_iec_m_pg));
1262 else if (2 == pcontrol)
1263 memcpy(p, d_iec_m_pg, sizeof(d_iec_m_pg));
1264 return sizeof(iec_m_pg);
1267 static int resp_sas_sf_m_pg(unsigned char * p, int pcontrol, int target)
1268 { /* SAS SSP mode page - short format for mode_sense */
1269 unsigned char sas_sf_m_pg[] = {0x19, 0x6,
1270 0x6, 0x0, 0x7, 0xd0, 0x0, 0x0};
1272 memcpy(p, sas_sf_m_pg, sizeof(sas_sf_m_pg));
1274 memset(p + 2, 0, sizeof(sas_sf_m_pg) - 2);
1275 return sizeof(sas_sf_m_pg);
1279 static int resp_sas_pcd_m_spg(unsigned char * p, int pcontrol, int target,
1281 { /* SAS phy control and discover mode page for mode_sense */
1282 unsigned char sas_pcd_m_pg[] = {0x59, 0x1, 0, 0x64, 0, 0x6, 0, 2,
1283 0, 0, 0, 0, 0x10, 0x9, 0x8, 0x0,
1284 0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0,
1285 0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1,
1286 0x2, 0, 0, 0, 0, 0, 0, 0,
1287 0x88, 0x99, 0, 0, 0, 0, 0, 0,
1288 0, 0, 0, 0, 0, 0, 0, 0,
1289 0, 1, 0, 0, 0x10, 0x9, 0x8, 0x0,
1290 0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0,
1291 0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1,
1292 0x3, 0, 0, 0, 0, 0, 0, 0,
1293 0x88, 0x99, 0, 0, 0, 0, 0, 0,
1294 0, 0, 0, 0, 0, 0, 0, 0,
1298 port_a = target_dev_id + 1;
1299 port_b = port_a + 1;
1300 memcpy(p, sas_pcd_m_pg, sizeof(sas_pcd_m_pg));
1301 p[20] = (port_a >> 24);
1302 p[21] = (port_a >> 16) & 0xff;
1303 p[22] = (port_a >> 8) & 0xff;
1304 p[23] = port_a & 0xff;
1305 p[48 + 20] = (port_b >> 24);
1306 p[48 + 21] = (port_b >> 16) & 0xff;
1307 p[48 + 22] = (port_b >> 8) & 0xff;
1308 p[48 + 23] = port_b & 0xff;
1310 memset(p + 4, 0, sizeof(sas_pcd_m_pg) - 4);
1311 return sizeof(sas_pcd_m_pg);
1314 static int resp_sas_sha_m_spg(unsigned char * p, int pcontrol)
1315 { /* SAS SSP shared protocol specific port mode subpage */
1316 unsigned char sas_sha_m_pg[] = {0x59, 0x2, 0, 0xc, 0, 0x6, 0x10, 0,
1317 0, 0, 0, 0, 0, 0, 0, 0,
1320 memcpy(p, sas_sha_m_pg, sizeof(sas_sha_m_pg));
1322 memset(p + 4, 0, sizeof(sas_sha_m_pg) - 4);
1323 return sizeof(sas_sha_m_pg);
1326 #define SDEBUG_MAX_MSENSE_SZ 256
1328 static int resp_mode_sense(struct scsi_cmnd * scp, int target,
1329 struct sdebug_dev_info * devip)
1331 unsigned char dbd, llbaa;
1332 int pcontrol, pcode, subpcode, bd_len;
1333 unsigned char dev_spec;
1334 int k, alloc_len, msense_6, offset, len, errsts, target_dev_id;
1336 unsigned char arr[SDEBUG_MAX_MSENSE_SZ];
1337 unsigned char *cmd = (unsigned char *)scp->cmnd;
1339 if ((errsts = check_readiness(scp, 1, devip)))
1341 dbd = !!(cmd[1] & 0x8);
1342 pcontrol = (cmd[2] & 0xc0) >> 6;
1343 pcode = cmd[2] & 0x3f;
1345 msense_6 = (MODE_SENSE == cmd[0]);
1346 llbaa = msense_6 ? 0 : !!(cmd[1] & 0x10);
1347 if ((0 == scsi_debug_ptype) && (0 == dbd))
1348 bd_len = llbaa ? 16 : 8;
1351 alloc_len = msense_6 ? cmd[4] : ((cmd[7] << 8) | cmd[8]);
1352 memset(arr, 0, SDEBUG_MAX_MSENSE_SZ);
1353 if (0x3 == pcontrol) { /* Saving values not supported */
1354 mk_sense_buffer(devip, ILLEGAL_REQUEST, SAVING_PARAMS_UNSUP,
1356 return check_condition_result;
1358 target_dev_id = ((devip->sdbg_host->shost->host_no + 1) * 2000) +
1359 (devip->target * 1000) - 3;
1360 /* set DPOFUA bit for disks */
1361 if (0 == scsi_debug_ptype)
1362 dev_spec = (DEV_READONLY(target) ? 0x80 : 0x0) | 0x10;
1372 arr[4] = 0x1; /* set LONGLBA bit */
1373 arr[7] = bd_len; /* assume 255 or less */
1377 if ((bd_len > 0) && (!sdebug_capacity))
1378 sdebug_capacity = get_sdebug_capacity();
1381 if (sdebug_capacity > 0xfffffffe) {
1387 ap[0] = (sdebug_capacity >> 24) & 0xff;
1388 ap[1] = (sdebug_capacity >> 16) & 0xff;
1389 ap[2] = (sdebug_capacity >> 8) & 0xff;
1390 ap[3] = sdebug_capacity & 0xff;
1392 ap[6] = (scsi_debug_sector_size >> 8) & 0xff;
1393 ap[7] = scsi_debug_sector_size & 0xff;
1396 } else if (16 == bd_len) {
1397 unsigned long long capac = sdebug_capacity;
1399 for (k = 0; k < 8; ++k, capac >>= 8)
1400 ap[7 - k] = capac & 0xff;
1401 ap[12] = (scsi_debug_sector_size >> 24) & 0xff;
1402 ap[13] = (scsi_debug_sector_size >> 16) & 0xff;
1403 ap[14] = (scsi_debug_sector_size >> 8) & 0xff;
1404 ap[15] = scsi_debug_sector_size & 0xff;
1409 if ((subpcode > 0x0) && (subpcode < 0xff) && (0x19 != pcode)) {
1410 /* TODO: Control Extension page */
1411 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1413 return check_condition_result;
1416 case 0x1: /* Read-Write error recovery page, direct access */
1417 len = resp_err_recov_pg(ap, pcontrol, target);
1420 case 0x2: /* Disconnect-Reconnect page, all devices */
1421 len = resp_disconnect_pg(ap, pcontrol, target);
1424 case 0x3: /* Format device page, direct access */
1425 len = resp_format_pg(ap, pcontrol, target);
1428 case 0x8: /* Caching page, direct access */
1429 len = resp_caching_pg(ap, pcontrol, target);
1432 case 0xa: /* Control Mode page, all devices */
1433 len = resp_ctrl_m_pg(ap, pcontrol, target);
1436 case 0x19: /* if spc==1 then sas phy, control+discover */
1437 if ((subpcode > 0x2) && (subpcode < 0xff)) {
1438 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1439 INVALID_FIELD_IN_CDB, 0);
1440 return check_condition_result;
1443 if ((0x0 == subpcode) || (0xff == subpcode))
1444 len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
1445 if ((0x1 == subpcode) || (0xff == subpcode))
1446 len += resp_sas_pcd_m_spg(ap + len, pcontrol, target,
1448 if ((0x2 == subpcode) || (0xff == subpcode))
1449 len += resp_sas_sha_m_spg(ap + len, pcontrol);
1452 case 0x1c: /* Informational Exceptions Mode page, all devices */
1453 len = resp_iec_m_pg(ap, pcontrol, target);
1456 case 0x3f: /* Read all Mode pages */
1457 if ((0 == subpcode) || (0xff == subpcode)) {
1458 len = resp_err_recov_pg(ap, pcontrol, target);
1459 len += resp_disconnect_pg(ap + len, pcontrol, target);
1460 len += resp_format_pg(ap + len, pcontrol, target);
1461 len += resp_caching_pg(ap + len, pcontrol, target);
1462 len += resp_ctrl_m_pg(ap + len, pcontrol, target);
1463 len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
1464 if (0xff == subpcode) {
1465 len += resp_sas_pcd_m_spg(ap + len, pcontrol,
1466 target, target_dev_id);
1467 len += resp_sas_sha_m_spg(ap + len, pcontrol);
1469 len += resp_iec_m_pg(ap + len, pcontrol, target);
1471 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1472 INVALID_FIELD_IN_CDB, 0);
1473 return check_condition_result;
1478 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1480 return check_condition_result;
1483 arr[0] = offset - 1;
1485 arr[0] = ((offset - 2) >> 8) & 0xff;
1486 arr[1] = (offset - 2) & 0xff;
1488 return fill_from_dev_buffer(scp, arr, min(alloc_len, offset));
1491 #define SDEBUG_MAX_MSELECT_SZ 512
1493 static int resp_mode_select(struct scsi_cmnd * scp, int mselect6,
1494 struct sdebug_dev_info * devip)
1496 int pf, sp, ps, md_len, bd_len, off, spf, pg_len;
1497 int param_len, res, errsts, mpage;
1498 unsigned char arr[SDEBUG_MAX_MSELECT_SZ];
1499 unsigned char *cmd = (unsigned char *)scp->cmnd;
1501 if ((errsts = check_readiness(scp, 1, devip)))
1503 memset(arr, 0, sizeof(arr));
1506 param_len = mselect6 ? cmd[4] : ((cmd[7] << 8) + cmd[8]);
1507 if ((0 == pf) || sp || (param_len > SDEBUG_MAX_MSELECT_SZ)) {
1508 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1509 INVALID_FIELD_IN_CDB, 0);
1510 return check_condition_result;
1512 res = fetch_to_dev_buffer(scp, arr, param_len);
1514 return (DID_ERROR << 16);
1515 else if ((res < param_len) &&
1516 (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
1517 printk(KERN_INFO "scsi_debug: mode_select: cdb indicated=%d, "
1518 " IO sent=%d bytes\n", param_len, res);
1519 md_len = mselect6 ? (arr[0] + 1) : ((arr[0] << 8) + arr[1] + 2);
1520 bd_len = mselect6 ? arr[3] : ((arr[6] << 8) + arr[7]);
1522 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1523 INVALID_FIELD_IN_PARAM_LIST, 0);
1524 return check_condition_result;
1526 off = bd_len + (mselect6 ? 4 : 8);
1527 mpage = arr[off] & 0x3f;
1528 ps = !!(arr[off] & 0x80);
1530 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1531 INVALID_FIELD_IN_PARAM_LIST, 0);
1532 return check_condition_result;
1534 spf = !!(arr[off] & 0x40);
1535 pg_len = spf ? ((arr[off + 2] << 8) + arr[off + 3] + 4) :
1537 if ((pg_len + off) > param_len) {
1538 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1539 PARAMETER_LIST_LENGTH_ERR, 0);
1540 return check_condition_result;
1543 case 0xa: /* Control Mode page */
1544 if (ctrl_m_pg[1] == arr[off + 1]) {
1545 memcpy(ctrl_m_pg + 2, arr + off + 2,
1546 sizeof(ctrl_m_pg) - 2);
1547 scsi_debug_dsense = !!(ctrl_m_pg[2] & 0x4);
1551 case 0x1c: /* Informational Exceptions Mode page */
1552 if (iec_m_pg[1] == arr[off + 1]) {
1553 memcpy(iec_m_pg + 2, arr + off + 2,
1554 sizeof(iec_m_pg) - 2);
1561 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1562 INVALID_FIELD_IN_PARAM_LIST, 0);
1563 return check_condition_result;
1566 static int resp_temp_l_pg(unsigned char * arr)
1568 unsigned char temp_l_pg[] = {0x0, 0x0, 0x3, 0x2, 0x0, 38,
1569 0x0, 0x1, 0x3, 0x2, 0x0, 65,
1572 memcpy(arr, temp_l_pg, sizeof(temp_l_pg));
1573 return sizeof(temp_l_pg);
1576 static int resp_ie_l_pg(unsigned char * arr)
1578 unsigned char ie_l_pg[] = {0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 38,
1581 memcpy(arr, ie_l_pg, sizeof(ie_l_pg));
1582 if (iec_m_pg[2] & 0x4) { /* TEST bit set */
1583 arr[4] = THRESHOLD_EXCEEDED;
1586 return sizeof(ie_l_pg);
1589 #define SDEBUG_MAX_LSENSE_SZ 512
1591 static int resp_log_sense(struct scsi_cmnd * scp,
1592 struct sdebug_dev_info * devip)
1594 int ppc, sp, pcontrol, pcode, subpcode, alloc_len, errsts, len, n;
1595 unsigned char arr[SDEBUG_MAX_LSENSE_SZ];
1596 unsigned char *cmd = (unsigned char *)scp->cmnd;
1598 if ((errsts = check_readiness(scp, 1, devip)))
1600 memset(arr, 0, sizeof(arr));
1604 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1605 INVALID_FIELD_IN_CDB, 0);
1606 return check_condition_result;
1608 pcontrol = (cmd[2] & 0xc0) >> 6;
1609 pcode = cmd[2] & 0x3f;
1610 subpcode = cmd[3] & 0xff;
1611 alloc_len = (cmd[7] << 8) + cmd[8];
1613 if (0 == subpcode) {
1615 case 0x0: /* Supported log pages log page */
1617 arr[n++] = 0x0; /* this page */
1618 arr[n++] = 0xd; /* Temperature */
1619 arr[n++] = 0x2f; /* Informational exceptions */
1622 case 0xd: /* Temperature log page */
1623 arr[3] = resp_temp_l_pg(arr + 4);
1625 case 0x2f: /* Informational exceptions log page */
1626 arr[3] = resp_ie_l_pg(arr + 4);
1629 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1630 INVALID_FIELD_IN_CDB, 0);
1631 return check_condition_result;
1633 } else if (0xff == subpcode) {
1637 case 0x0: /* Supported log pages and subpages log page */
1640 arr[n++] = 0x0; /* 0,0 page */
1642 arr[n++] = 0xff; /* this page */
1644 arr[n++] = 0x0; /* Temperature */
1646 arr[n++] = 0x0; /* Informational exceptions */
1649 case 0xd: /* Temperature subpages */
1652 arr[n++] = 0x0; /* Temperature */
1655 case 0x2f: /* Informational exceptions subpages */
1658 arr[n++] = 0x0; /* Informational exceptions */
1662 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1663 INVALID_FIELD_IN_CDB, 0);
1664 return check_condition_result;
1667 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1668 INVALID_FIELD_IN_CDB, 0);
1669 return check_condition_result;
1671 len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len);
1672 return fill_from_dev_buffer(scp, arr,
1673 min(len, SDEBUG_MAX_INQ_ARR_SZ));
1676 static int check_device_access_params(struct sdebug_dev_info *devi,
1677 unsigned long long lba, unsigned int num)
1679 if (lba + num > sdebug_capacity) {
1680 mk_sense_buffer(devi, ILLEGAL_REQUEST, ADDR_OUT_OF_RANGE, 0);
1681 return check_condition_result;
1683 /* transfer length excessive (tie in to block limits VPD page) */
1684 if (num > sdebug_store_sectors) {
1685 mk_sense_buffer(devi, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
1686 return check_condition_result;
1691 static int do_device_access(struct scsi_cmnd *scmd,
1692 struct sdebug_dev_info *devi,
1693 unsigned long long lba, unsigned int num, int write)
1696 unsigned long long block, rest = 0;
1697 int (*func)(struct scsi_cmnd *, unsigned char *, int);
1699 func = write ? fetch_to_dev_buffer : fill_from_dev_buffer;
1701 block = do_div(lba, sdebug_store_sectors);
1702 if (block + num > sdebug_store_sectors)
1703 rest = block + num - sdebug_store_sectors;
1705 ret = func(scmd, fake_storep + (block * scsi_debug_sector_size),
1706 (num - rest) * scsi_debug_sector_size);
1708 ret = func(scmd, fake_storep, rest * scsi_debug_sector_size);
1713 static u16 dif_compute_csum(const void *buf, int len)
1717 switch (scsi_debug_guard) {
1719 csum = ip_compute_csum(buf, len);
1722 csum = cpu_to_be16(crc_t10dif(buf, len));
1728 static int dif_verify(struct sd_dif_tuple *sdt, const void *data,
1729 sector_t sector, u32 ei_lba)
1731 u16 csum = dif_compute_csum(data, scsi_debug_sector_size);
1733 if (sdt->guard_tag != csum) {
1734 pr_err("%s: GUARD check failed on sector %lu rcvd 0x%04x, data 0x%04x\n",
1736 (unsigned long)sector,
1737 be16_to_cpu(sdt->guard_tag),
1741 if (scsi_debug_dif == SD_DIF_TYPE1_PROTECTION &&
1742 be32_to_cpu(sdt->ref_tag) != (sector & 0xffffffff)) {
1743 pr_err("%s: REF check failed on sector %lu\n",
1744 __func__, (unsigned long)sector);
1747 if (scsi_debug_dif == SD_DIF_TYPE2_PROTECTION &&
1748 be32_to_cpu(sdt->ref_tag) != ei_lba) {
1749 pr_err("%s: REF check failed on sector %lu\n",
1750 __func__, (unsigned long)sector);
1757 static int prot_verify_read(struct scsi_cmnd *SCpnt, sector_t start_sec,
1758 unsigned int sectors, u32 ei_lba)
1760 unsigned int i, resid;
1761 struct scatterlist *psgl;
1762 struct sd_dif_tuple *sdt;
1764 sector_t tmp_sec = start_sec;
1767 start_sec = do_div(tmp_sec, sdebug_store_sectors);
1769 sdt = dif_storep + start_sec;
1771 for (i = 0 ; i < sectors ; i++) {
1774 if (sdt[i].app_tag == 0xffff)
1777 sector = start_sec + i;
1779 ret = dif_verify(&sdt[i],
1780 fake_storep + sector * scsi_debug_sector_size,
1790 /* Bytes of protection data to copy into sgl */
1791 resid = sectors * sizeof(*dif_storep);
1794 scsi_for_each_prot_sg(SCpnt, psgl, scsi_prot_sg_count(SCpnt), i) {
1795 int len = min(psgl->length, resid);
1797 paddr = kmap_atomic(sg_page(psgl)) + psgl->offset;
1798 memcpy(paddr, dif_storep + sector, len);
1800 sector += len / sizeof(*dif_storep);
1801 if (sector >= sdebug_store_sectors) {
1804 sector = do_div(tmp_sec, sdebug_store_sectors);
1807 kunmap_atomic(paddr);
1815 static int resp_read(struct scsi_cmnd *SCpnt, unsigned long long lba,
1816 unsigned int num, struct sdebug_dev_info *devip,
1819 unsigned long iflags;
1822 ret = check_device_access_params(devip, lba, num);
1826 if ((SCSI_DEBUG_OPT_MEDIUM_ERR & scsi_debug_opts) &&
1827 (lba <= (OPT_MEDIUM_ERR_ADDR + OPT_MEDIUM_ERR_NUM - 1)) &&
1828 ((lba + num) > OPT_MEDIUM_ERR_ADDR)) {
1829 /* claim unrecoverable read error */
1830 mk_sense_buffer(devip, MEDIUM_ERROR, UNRECOVERED_READ_ERR, 0);
1831 /* set info field and valid bit for fixed descriptor */
1832 if (0x70 == (devip->sense_buff[0] & 0x7f)) {
1833 devip->sense_buff[0] |= 0x80; /* Valid bit */
1834 ret = (lba < OPT_MEDIUM_ERR_ADDR)
1835 ? OPT_MEDIUM_ERR_ADDR : (int)lba;
1836 devip->sense_buff[3] = (ret >> 24) & 0xff;
1837 devip->sense_buff[4] = (ret >> 16) & 0xff;
1838 devip->sense_buff[5] = (ret >> 8) & 0xff;
1839 devip->sense_buff[6] = ret & 0xff;
1841 scsi_set_resid(SCpnt, scsi_bufflen(SCpnt));
1842 return check_condition_result;
1846 if (scsi_debug_dix && scsi_prot_sg_count(SCpnt)) {
1847 int prot_ret = prot_verify_read(SCpnt, lba, num, ei_lba);
1850 mk_sense_buffer(devip, ABORTED_COMMAND, 0x10, prot_ret);
1851 return illegal_condition_result;
1855 read_lock_irqsave(&atomic_rw, iflags);
1856 ret = do_device_access(SCpnt, devip, lba, num, 0);
1857 read_unlock_irqrestore(&atomic_rw, iflags);
1861 void dump_sector(unsigned char *buf, int len)
1865 printk(KERN_ERR ">>> Sector Dump <<<\n");
1867 for (i = 0 ; i < len ; i += 16) {
1868 printk(KERN_ERR "%04d: ", i);
1870 for (j = 0 ; j < 16 ; j++) {
1871 unsigned char c = buf[i+j];
1872 if (c >= 0x20 && c < 0x7e)
1873 printk(" %c ", buf[i+j]);
1875 printk("%02x ", buf[i+j]);
1882 static int prot_verify_write(struct scsi_cmnd *SCpnt, sector_t start_sec,
1883 unsigned int sectors, u32 ei_lba)
1886 struct sd_dif_tuple *sdt;
1887 struct scatterlist *dsgl = scsi_sglist(SCpnt);
1888 struct scatterlist *psgl = scsi_prot_sglist(SCpnt);
1889 void *daddr, *paddr;
1890 sector_t tmp_sec = start_sec;
1894 sector = do_div(tmp_sec, sdebug_store_sectors);
1896 BUG_ON(scsi_sg_count(SCpnt) == 0);
1897 BUG_ON(scsi_prot_sg_count(SCpnt) == 0);
1901 /* For each data page */
1902 scsi_for_each_sg(SCpnt, dsgl, scsi_sg_count(SCpnt), i) {
1903 daddr = kmap_atomic(sg_page(dsgl)) + dsgl->offset;
1904 paddr = kmap_atomic(sg_page(psgl)) + psgl->offset;
1906 /* For each sector-sized chunk in data page */
1907 for (j = 0; j < dsgl->length; j += scsi_debug_sector_size) {
1909 /* If we're at the end of the current
1910 * protection page advance to the next one
1912 if (ppage_offset >= psgl->length) {
1913 kunmap_atomic(paddr);
1914 psgl = sg_next(psgl);
1915 BUG_ON(psgl == NULL);
1916 paddr = kmap_atomic(sg_page(psgl))
1921 sdt = paddr + ppage_offset;
1923 ret = dif_verify(sdt, daddr + j, start_sec, ei_lba);
1925 dump_sector(daddr + j, scsi_debug_sector_size);
1929 /* Would be great to copy this in bigger
1930 * chunks. However, for the sake of
1931 * correctness we need to verify each sector
1932 * before writing it to "stable" storage
1934 memcpy(dif_storep + sector, sdt, sizeof(*sdt));
1938 if (sector == sdebug_store_sectors)
1939 sector = 0; /* Force wrap */
1943 ppage_offset += sizeof(struct sd_dif_tuple);
1946 kunmap_atomic(paddr);
1947 kunmap_atomic(daddr);
1956 kunmap_atomic(paddr);
1957 kunmap_atomic(daddr);
1961 static unsigned long lba_to_map_index(sector_t lba)
1963 if (scsi_debug_unmap_alignment) {
1964 lba += scsi_debug_unmap_granularity -
1965 scsi_debug_unmap_alignment;
1967 do_div(lba, scsi_debug_unmap_granularity);
1972 static sector_t map_index_to_lba(unsigned long index)
1974 return index * scsi_debug_unmap_granularity -
1975 scsi_debug_unmap_alignment;
1978 static unsigned int map_state(sector_t lba, unsigned int *num)
1981 unsigned int mapped;
1982 unsigned long index;
1985 index = lba_to_map_index(lba);
1986 mapped = test_bit(index, map_storep);
1989 next = find_next_zero_bit(map_storep, map_size, index);
1991 next = find_next_bit(map_storep, map_size, index);
1993 end = min_t(sector_t, sdebug_store_sectors, map_index_to_lba(next));
1999 static void map_region(sector_t lba, unsigned int len)
2001 sector_t end = lba + len;
2004 unsigned long index = lba_to_map_index(lba);
2006 if (index < map_size)
2007 set_bit(index, map_storep);
2009 lba = map_index_to_lba(index + 1);
2013 static void unmap_region(sector_t lba, unsigned int len)
2015 sector_t end = lba + len;
2018 unsigned long index = lba_to_map_index(lba);
2020 if (lba == map_index_to_lba(index) &&
2021 lba + scsi_debug_unmap_granularity <= end &&
2023 clear_bit(index, map_storep);
2024 if (scsi_debug_lbprz) {
2025 memset(fake_storep +
2026 lba * scsi_debug_sector_size, 0,
2027 scsi_debug_sector_size *
2028 scsi_debug_unmap_granularity);
2031 memset(dif_storep + lba, 0xff,
2032 sizeof(*dif_storep) *
2033 scsi_debug_unmap_granularity);
2036 lba = map_index_to_lba(index + 1);
2040 static int resp_write(struct scsi_cmnd *SCpnt, unsigned long long lba,
2041 unsigned int num, struct sdebug_dev_info *devip,
2044 unsigned long iflags;
2047 ret = check_device_access_params(devip, lba, num);
2052 if (scsi_debug_dix && scsi_prot_sg_count(SCpnt)) {
2053 int prot_ret = prot_verify_write(SCpnt, lba, num, ei_lba);
2056 mk_sense_buffer(devip, ILLEGAL_REQUEST, 0x10, prot_ret);
2057 return illegal_condition_result;
2061 write_lock_irqsave(&atomic_rw, iflags);
2062 ret = do_device_access(SCpnt, devip, lba, num, 1);
2063 if (scsi_debug_lbp())
2064 map_region(lba, num);
2065 write_unlock_irqrestore(&atomic_rw, iflags);
2067 return (DID_ERROR << 16);
2068 else if ((ret < (num * scsi_debug_sector_size)) &&
2069 (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
2070 printk(KERN_INFO "scsi_debug: write: cdb indicated=%u, "
2071 " IO sent=%d bytes\n", num * scsi_debug_sector_size, ret);
2076 static int resp_write_same(struct scsi_cmnd *scmd, unsigned long long lba,
2077 unsigned int num, struct sdebug_dev_info *devip,
2078 u32 ei_lba, unsigned int unmap)
2080 unsigned long iflags;
2081 unsigned long long i;
2084 ret = check_device_access_params(devip, lba, num);
2088 if (num > scsi_debug_write_same_length) {
2089 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
2091 return check_condition_result;
2094 write_lock_irqsave(&atomic_rw, iflags);
2096 if (unmap && scsi_debug_lbp()) {
2097 unmap_region(lba, num);
2101 /* Else fetch one logical block */
2102 ret = fetch_to_dev_buffer(scmd,
2103 fake_storep + (lba * scsi_debug_sector_size),
2104 scsi_debug_sector_size);
2107 write_unlock_irqrestore(&atomic_rw, iflags);
2108 return (DID_ERROR << 16);
2109 } else if ((ret < (num * scsi_debug_sector_size)) &&
2110 (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
2111 printk(KERN_INFO "scsi_debug: write same: cdb indicated=%u, "
2112 " IO sent=%d bytes\n", num * scsi_debug_sector_size, ret);
2114 /* Copy first sector to remaining blocks */
2115 for (i = 1 ; i < num ; i++)
2116 memcpy(fake_storep + ((lba + i) * scsi_debug_sector_size),
2117 fake_storep + (lba * scsi_debug_sector_size),
2118 scsi_debug_sector_size);
2120 if (scsi_debug_lbp())
2121 map_region(lba, num);
2123 write_unlock_irqrestore(&atomic_rw, iflags);
2128 struct unmap_block_desc {
2134 static int resp_unmap(struct scsi_cmnd * scmd, struct sdebug_dev_info * devip)
2137 struct unmap_block_desc *desc;
2138 unsigned int i, payload_len, descriptors;
2141 ret = check_readiness(scmd, 1, devip);
2145 payload_len = get_unaligned_be16(&scmd->cmnd[7]);
2146 BUG_ON(scsi_bufflen(scmd) != payload_len);
2148 descriptors = (payload_len - 8) / 16;
2150 buf = kmalloc(scsi_bufflen(scmd), GFP_ATOMIC);
2152 return check_condition_result;
2154 scsi_sg_copy_to_buffer(scmd, buf, scsi_bufflen(scmd));
2156 BUG_ON(get_unaligned_be16(&buf[0]) != payload_len - 2);
2157 BUG_ON(get_unaligned_be16(&buf[2]) != descriptors * 16);
2159 desc = (void *)&buf[8];
2161 for (i = 0 ; i < descriptors ; i++) {
2162 unsigned long long lba = get_unaligned_be64(&desc[i].lba);
2163 unsigned int num = get_unaligned_be32(&desc[i].blocks);
2165 ret = check_device_access_params(devip, lba, num);
2169 unmap_region(lba, num);
2180 #define SDEBUG_GET_LBA_STATUS_LEN 32
2182 static int resp_get_lba_status(struct scsi_cmnd * scmd,
2183 struct sdebug_dev_info * devip)
2185 unsigned long long lba;
2186 unsigned int alloc_len, mapped, num;
2187 unsigned char arr[SDEBUG_GET_LBA_STATUS_LEN];
2190 ret = check_readiness(scmd, 1, devip);
2194 lba = get_unaligned_be64(&scmd->cmnd[2]);
2195 alloc_len = get_unaligned_be32(&scmd->cmnd[10]);
2200 ret = check_device_access_params(devip, lba, 1);
2204 mapped = map_state(lba, &num);
2206 memset(arr, 0, SDEBUG_GET_LBA_STATUS_LEN);
2207 put_unaligned_be32(20, &arr[0]); /* Parameter Data Length */
2208 put_unaligned_be64(lba, &arr[8]); /* LBA */
2209 put_unaligned_be32(num, &arr[16]); /* Number of blocks */
2210 arr[20] = !mapped; /* mapped = 0, unmapped = 1 */
2212 return fill_from_dev_buffer(scmd, arr, SDEBUG_GET_LBA_STATUS_LEN);
2215 #define SDEBUG_RLUN_ARR_SZ 256
2217 static int resp_report_luns(struct scsi_cmnd * scp,
2218 struct sdebug_dev_info * devip)
2220 unsigned int alloc_len;
2221 int lun_cnt, i, upper, num, n, wlun, lun;
2222 unsigned char *cmd = (unsigned char *)scp->cmnd;
2223 int select_report = (int)cmd[2];
2224 struct scsi_lun *one_lun;
2225 unsigned char arr[SDEBUG_RLUN_ARR_SZ];
2226 unsigned char * max_addr;
2228 alloc_len = cmd[9] + (cmd[8] << 8) + (cmd[7] << 16) + (cmd[6] << 24);
2229 if ((alloc_len < 4) || (select_report > 2)) {
2230 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
2232 return check_condition_result;
2234 /* can produce response with up to 16k luns (lun 0 to lun 16383) */
2235 memset(arr, 0, SDEBUG_RLUN_ARR_SZ);
2236 lun_cnt = scsi_debug_max_luns;
2237 if (1 == select_report)
2239 else if (scsi_debug_no_lun_0 && (lun_cnt > 0))
2241 wlun = (select_report > 0) ? 1 : 0;
2242 num = lun_cnt + wlun;
2243 arr[2] = ((sizeof(struct scsi_lun) * num) >> 8) & 0xff;
2244 arr[3] = (sizeof(struct scsi_lun) * num) & 0xff;
2245 n = min((int)((SDEBUG_RLUN_ARR_SZ - 8) /
2246 sizeof(struct scsi_lun)), num);
2251 one_lun = (struct scsi_lun *) &arr[8];
2252 max_addr = arr + SDEBUG_RLUN_ARR_SZ;
2253 for (i = 0, lun = (scsi_debug_no_lun_0 ? 1 : 0);
2254 ((i < lun_cnt) && ((unsigned char *)(one_lun + i) < max_addr));
2256 upper = (lun >> 8) & 0x3f;
2258 one_lun[i].scsi_lun[0] =
2259 (upper | (SAM2_LUN_ADDRESS_METHOD << 6));
2260 one_lun[i].scsi_lun[1] = lun & 0xff;
2263 one_lun[i].scsi_lun[0] = (SAM2_WLUN_REPORT_LUNS >> 8) & 0xff;
2264 one_lun[i].scsi_lun[1] = SAM2_WLUN_REPORT_LUNS & 0xff;
2267 alloc_len = (unsigned char *)(one_lun + i) - arr;
2268 return fill_from_dev_buffer(scp, arr,
2269 min((int)alloc_len, SDEBUG_RLUN_ARR_SZ));
2272 static int resp_xdwriteread(struct scsi_cmnd *scp, unsigned long long lba,
2273 unsigned int num, struct sdebug_dev_info *devip)
2276 unsigned char *kaddr, *buf;
2277 unsigned int offset;
2278 struct scatterlist *sg;
2279 struct scsi_data_buffer *sdb = scsi_in(scp);
2281 /* better not to use temporary buffer. */
2282 buf = kmalloc(scsi_bufflen(scp), GFP_ATOMIC);
2286 scsi_sg_copy_to_buffer(scp, buf, scsi_bufflen(scp));
2289 for_each_sg(sdb->table.sgl, sg, sdb->table.nents, i) {
2290 kaddr = (unsigned char *)kmap_atomic(sg_page(sg));
2294 for (j = 0; j < sg->length; j++)
2295 *(kaddr + sg->offset + j) ^= *(buf + offset + j);
2297 offset += sg->length;
2298 kunmap_atomic(kaddr);
2307 /* When timer goes off this function is called. */
2308 static void timer_intr_handler(unsigned long indx)
2310 struct sdebug_queued_cmd * sqcp;
2311 unsigned long iflags;
2313 if (indx >= scsi_debug_max_queue) {
2314 printk(KERN_ERR "scsi_debug:timer_intr_handler: indx too "
2318 spin_lock_irqsave(&queued_arr_lock, iflags);
2319 sqcp = &queued_arr[(int)indx];
2320 if (! sqcp->in_use) {
2321 printk(KERN_ERR "scsi_debug:timer_intr_handler: Unexpected "
2323 spin_unlock_irqrestore(&queued_arr_lock, iflags);
2327 if (sqcp->done_funct) {
2328 sqcp->a_cmnd->result = sqcp->scsi_result;
2329 sqcp->done_funct(sqcp->a_cmnd); /* callback to mid level */
2331 sqcp->done_funct = NULL;
2332 spin_unlock_irqrestore(&queued_arr_lock, iflags);
2336 static struct sdebug_dev_info *
2337 sdebug_device_create(struct sdebug_host_info *sdbg_host, gfp_t flags)
2339 struct sdebug_dev_info *devip;
2341 devip = kzalloc(sizeof(*devip), flags);
2343 devip->sdbg_host = sdbg_host;
2344 list_add_tail(&devip->dev_list, &sdbg_host->dev_info_list);
2349 static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev)
2351 struct sdebug_host_info * sdbg_host;
2352 struct sdebug_dev_info * open_devip = NULL;
2353 struct sdebug_dev_info * devip =
2354 (struct sdebug_dev_info *)sdev->hostdata;
2358 sdbg_host = *(struct sdebug_host_info **)shost_priv(sdev->host);
2360 printk(KERN_ERR "Host info NULL\n");
2363 list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) {
2364 if ((devip->used) && (devip->channel == sdev->channel) &&
2365 (devip->target == sdev->id) &&
2366 (devip->lun == sdev->lun))
2369 if ((!devip->used) && (!open_devip))
2373 if (!open_devip) { /* try and make a new one */
2374 open_devip = sdebug_device_create(sdbg_host, GFP_ATOMIC);
2376 printk(KERN_ERR "%s: out of memory at line %d\n",
2377 __func__, __LINE__);
2382 open_devip->channel = sdev->channel;
2383 open_devip->target = sdev->id;
2384 open_devip->lun = sdev->lun;
2385 open_devip->sdbg_host = sdbg_host;
2386 open_devip->reset = 1;
2387 open_devip->used = 1;
2388 memset(open_devip->sense_buff, 0, SDEBUG_SENSE_LEN);
2389 if (scsi_debug_dsense)
2390 open_devip->sense_buff[0] = 0x72;
2392 open_devip->sense_buff[0] = 0x70;
2393 open_devip->sense_buff[7] = 0xa;
2395 if (sdev->lun == SAM2_WLUN_REPORT_LUNS)
2396 open_devip->wlun = SAM2_WLUN_REPORT_LUNS & 0xff;
2401 static int scsi_debug_slave_alloc(struct scsi_device *sdp)
2403 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2404 printk(KERN_INFO "scsi_debug: slave_alloc <%u %u %u %u>\n",
2405 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
2406 queue_flag_set_unlocked(QUEUE_FLAG_BIDI, sdp->request_queue);
2410 static int scsi_debug_slave_configure(struct scsi_device *sdp)
2412 struct sdebug_dev_info *devip;
2414 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2415 printk(KERN_INFO "scsi_debug: slave_configure <%u %u %u %u>\n",
2416 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
2417 if (sdp->host->max_cmd_len != SCSI_DEBUG_MAX_CMD_LEN)
2418 sdp->host->max_cmd_len = SCSI_DEBUG_MAX_CMD_LEN;
2419 devip = devInfoReg(sdp);
2421 return 1; /* no resources, will be marked offline */
2422 sdp->hostdata = devip;
2423 if (sdp->host->cmd_per_lun)
2424 scsi_adjust_queue_depth(sdp, SDEBUG_TAGGED_QUEUING,
2425 sdp->host->cmd_per_lun);
2426 blk_queue_max_segment_size(sdp->request_queue, 256 * 1024);
2427 if (scsi_debug_no_uld)
2428 sdp->no_uld_attach = 1;
2432 static void scsi_debug_slave_destroy(struct scsi_device *sdp)
2434 struct sdebug_dev_info *devip =
2435 (struct sdebug_dev_info *)sdp->hostdata;
2437 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2438 printk(KERN_INFO "scsi_debug: slave_destroy <%u %u %u %u>\n",
2439 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
2441 /* make this slot available for re-use */
2443 sdp->hostdata = NULL;
2447 /* Returns 1 if found 'cmnd' and deleted its timer. else returns 0 */
2448 static int stop_queued_cmnd(struct scsi_cmnd *cmnd)
2450 unsigned long iflags;
2452 struct sdebug_queued_cmd *sqcp;
2454 spin_lock_irqsave(&queued_arr_lock, iflags);
2455 for (k = 0; k < scsi_debug_max_queue; ++k) {
2456 sqcp = &queued_arr[k];
2457 if (sqcp->in_use && (cmnd == sqcp->a_cmnd)) {
2458 del_timer_sync(&sqcp->cmnd_timer);
2460 sqcp->a_cmnd = NULL;
2464 spin_unlock_irqrestore(&queued_arr_lock, iflags);
2465 return (k < scsi_debug_max_queue) ? 1 : 0;
2468 /* Deletes (stops) timers of all queued commands */
2469 static void stop_all_queued(void)
2471 unsigned long iflags;
2473 struct sdebug_queued_cmd *sqcp;
2475 spin_lock_irqsave(&queued_arr_lock, iflags);
2476 for (k = 0; k < scsi_debug_max_queue; ++k) {
2477 sqcp = &queued_arr[k];
2478 if (sqcp->in_use && sqcp->a_cmnd) {
2479 del_timer_sync(&sqcp->cmnd_timer);
2481 sqcp->a_cmnd = NULL;
2484 spin_unlock_irqrestore(&queued_arr_lock, iflags);
2487 static int scsi_debug_abort(struct scsi_cmnd * SCpnt)
2489 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2490 printk(KERN_INFO "scsi_debug: abort\n");
2492 stop_queued_cmnd(SCpnt);
2496 static int scsi_debug_biosparam(struct scsi_device *sdev,
2497 struct block_device * bdev, sector_t capacity, int *info)
2502 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2503 printk(KERN_INFO "scsi_debug: biosparam\n");
2504 buf = scsi_bios_ptable(bdev);
2506 res = scsi_partsize(buf, capacity,
2507 &info[2], &info[0], &info[1]);
2512 info[0] = sdebug_heads;
2513 info[1] = sdebug_sectors_per;
2514 info[2] = sdebug_cylinders_per;
2518 static int scsi_debug_device_reset(struct scsi_cmnd * SCpnt)
2520 struct sdebug_dev_info * devip;
2522 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2523 printk(KERN_INFO "scsi_debug: device_reset\n");
2526 devip = devInfoReg(SCpnt->device);
2533 static int scsi_debug_bus_reset(struct scsi_cmnd * SCpnt)
2535 struct sdebug_host_info *sdbg_host;
2536 struct sdebug_dev_info * dev_info;
2537 struct scsi_device * sdp;
2538 struct Scsi_Host * hp;
2540 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2541 printk(KERN_INFO "scsi_debug: bus_reset\n");
2543 if (SCpnt && ((sdp = SCpnt->device)) && ((hp = sdp->host))) {
2544 sdbg_host = *(struct sdebug_host_info **)shost_priv(hp);
2546 list_for_each_entry(dev_info,
2547 &sdbg_host->dev_info_list,
2549 dev_info->reset = 1;
2555 static int scsi_debug_host_reset(struct scsi_cmnd * SCpnt)
2557 struct sdebug_host_info * sdbg_host;
2558 struct sdebug_dev_info * dev_info;
2560 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2561 printk(KERN_INFO "scsi_debug: host_reset\n");
2563 spin_lock(&sdebug_host_list_lock);
2564 list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
2565 list_for_each_entry(dev_info, &sdbg_host->dev_info_list,
2567 dev_info->reset = 1;
2569 spin_unlock(&sdebug_host_list_lock);
2574 /* Initializes timers in queued array */
2575 static void __init init_all_queued(void)
2577 unsigned long iflags;
2579 struct sdebug_queued_cmd * sqcp;
2581 spin_lock_irqsave(&queued_arr_lock, iflags);
2582 for (k = 0; k < scsi_debug_max_queue; ++k) {
2583 sqcp = &queued_arr[k];
2584 init_timer(&sqcp->cmnd_timer);
2586 sqcp->a_cmnd = NULL;
2588 spin_unlock_irqrestore(&queued_arr_lock, iflags);
2591 static void __init sdebug_build_parts(unsigned char *ramp,
2592 unsigned long store_size)
2594 struct partition * pp;
2595 int starts[SDEBUG_MAX_PARTS + 2];
2596 int sectors_per_part, num_sectors, k;
2597 int heads_by_sects, start_sec, end_sec;
2599 /* assume partition table already zeroed */
2600 if ((scsi_debug_num_parts < 1) || (store_size < 1048576))
2602 if (scsi_debug_num_parts > SDEBUG_MAX_PARTS) {
2603 scsi_debug_num_parts = SDEBUG_MAX_PARTS;
2604 printk(KERN_WARNING "scsi_debug:build_parts: reducing "
2605 "partitions to %d\n", SDEBUG_MAX_PARTS);
2607 num_sectors = (int)sdebug_store_sectors;
2608 sectors_per_part = (num_sectors - sdebug_sectors_per)
2609 / scsi_debug_num_parts;
2610 heads_by_sects = sdebug_heads * sdebug_sectors_per;
2611 starts[0] = sdebug_sectors_per;
2612 for (k = 1; k < scsi_debug_num_parts; ++k)
2613 starts[k] = ((k * sectors_per_part) / heads_by_sects)
2615 starts[scsi_debug_num_parts] = num_sectors;
2616 starts[scsi_debug_num_parts + 1] = 0;
2618 ramp[510] = 0x55; /* magic partition markings */
2620 pp = (struct partition *)(ramp + 0x1be);
2621 for (k = 0; starts[k + 1]; ++k, ++pp) {
2622 start_sec = starts[k];
2623 end_sec = starts[k + 1] - 1;
2626 pp->cyl = start_sec / heads_by_sects;
2627 pp->head = (start_sec - (pp->cyl * heads_by_sects))
2628 / sdebug_sectors_per;
2629 pp->sector = (start_sec % sdebug_sectors_per) + 1;
2631 pp->end_cyl = end_sec / heads_by_sects;
2632 pp->end_head = (end_sec - (pp->end_cyl * heads_by_sects))
2633 / sdebug_sectors_per;
2634 pp->end_sector = (end_sec % sdebug_sectors_per) + 1;
2636 pp->start_sect = start_sec;
2637 pp->nr_sects = end_sec - start_sec + 1;
2638 pp->sys_ind = 0x83; /* plain Linux partition */
2642 static int schedule_resp(struct scsi_cmnd * cmnd,
2643 struct sdebug_dev_info * devip,
2644 done_funct_t done, int scsi_result, int delta_jiff)
2646 if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) && cmnd) {
2648 struct scsi_device * sdp = cmnd->device;
2650 printk(KERN_INFO "scsi_debug: <%u %u %u %u> "
2651 "non-zero result=0x%x\n", sdp->host->host_no,
2652 sdp->channel, sdp->id, sdp->lun, scsi_result);
2655 if (cmnd && devip) {
2656 /* simulate autosense by this driver */
2657 if (SAM_STAT_CHECK_CONDITION == (scsi_result & 0xff))
2658 memcpy(cmnd->sense_buffer, devip->sense_buff,
2659 (SCSI_SENSE_BUFFERSIZE > SDEBUG_SENSE_LEN) ?
2660 SDEBUG_SENSE_LEN : SCSI_SENSE_BUFFERSIZE);
2662 if (delta_jiff <= 0) {
2664 cmnd->result = scsi_result;
2669 unsigned long iflags;
2671 struct sdebug_queued_cmd * sqcp = NULL;
2673 spin_lock_irqsave(&queued_arr_lock, iflags);
2674 for (k = 0; k < scsi_debug_max_queue; ++k) {
2675 sqcp = &queued_arr[k];
2679 if (k >= scsi_debug_max_queue) {
2680 spin_unlock_irqrestore(&queued_arr_lock, iflags);
2681 printk(KERN_WARNING "scsi_debug: can_queue exceeded\n");
2682 return 1; /* report busy to mid level */
2685 sqcp->a_cmnd = cmnd;
2686 sqcp->scsi_result = scsi_result;
2687 sqcp->done_funct = done;
2688 sqcp->cmnd_timer.function = timer_intr_handler;
2689 sqcp->cmnd_timer.data = k;
2690 sqcp->cmnd_timer.expires = jiffies + delta_jiff;
2691 add_timer(&sqcp->cmnd_timer);
2692 spin_unlock_irqrestore(&queued_arr_lock, iflags);
2698 /* Note: The following macros create attribute files in the
2699 /sys/module/scsi_debug/parameters directory. Unfortunately this
2700 driver is unaware of a change and cannot trigger auxiliary actions
2701 as it can when the corresponding attribute in the
2702 /sys/bus/pseudo/drivers/scsi_debug directory is changed.
2704 module_param_named(add_host, scsi_debug_add_host, int, S_IRUGO | S_IWUSR);
2705 module_param_named(ato, scsi_debug_ato, int, S_IRUGO);
2706 module_param_named(delay, scsi_debug_delay, int, S_IRUGO | S_IWUSR);
2707 module_param_named(dev_size_mb, scsi_debug_dev_size_mb, int, S_IRUGO);
2708 module_param_named(dif, scsi_debug_dif, int, S_IRUGO);
2709 module_param_named(dix, scsi_debug_dix, int, S_IRUGO);
2710 module_param_named(dsense, scsi_debug_dsense, int, S_IRUGO | S_IWUSR);
2711 module_param_named(every_nth, scsi_debug_every_nth, int, S_IRUGO | S_IWUSR);
2712 module_param_named(fake_rw, scsi_debug_fake_rw, int, S_IRUGO | S_IWUSR);
2713 module_param_named(guard, scsi_debug_guard, int, S_IRUGO);
2714 module_param_named(lbpu, scsi_debug_lbpu, int, S_IRUGO);
2715 module_param_named(lbpws, scsi_debug_lbpws, int, S_IRUGO);
2716 module_param_named(lbpws10, scsi_debug_lbpws10, int, S_IRUGO);
2717 module_param_named(lbprz, scsi_debug_lbprz, int, S_IRUGO);
2718 module_param_named(lowest_aligned, scsi_debug_lowest_aligned, int, S_IRUGO);
2719 module_param_named(max_luns, scsi_debug_max_luns, int, S_IRUGO | S_IWUSR);
2720 module_param_named(max_queue, scsi_debug_max_queue, int, S_IRUGO | S_IWUSR);
2721 module_param_named(no_lun_0, scsi_debug_no_lun_0, int, S_IRUGO | S_IWUSR);
2722 module_param_named(no_uld, scsi_debug_no_uld, int, S_IRUGO);
2723 module_param_named(num_parts, scsi_debug_num_parts, int, S_IRUGO);
2724 module_param_named(num_tgts, scsi_debug_num_tgts, int, S_IRUGO | S_IWUSR);
2725 module_param_named(opt_blks, scsi_debug_opt_blks, int, S_IRUGO);
2726 module_param_named(opts, scsi_debug_opts, int, S_IRUGO | S_IWUSR);
2727 module_param_named(physblk_exp, scsi_debug_physblk_exp, int, S_IRUGO);
2728 module_param_named(ptype, scsi_debug_ptype, int, S_IRUGO | S_IWUSR);
2729 module_param_named(removable, scsi_debug_removable, bool, S_IRUGO | S_IWUSR);
2730 module_param_named(scsi_level, scsi_debug_scsi_level, int, S_IRUGO);
2731 module_param_named(sector_size, scsi_debug_sector_size, int, S_IRUGO);
2732 module_param_named(unmap_alignment, scsi_debug_unmap_alignment, int, S_IRUGO);
2733 module_param_named(unmap_granularity, scsi_debug_unmap_granularity, int, S_IRUGO);
2734 module_param_named(unmap_max_blocks, scsi_debug_unmap_max_blocks, int, S_IRUGO);
2735 module_param_named(unmap_max_desc, scsi_debug_unmap_max_desc, int, S_IRUGO);
2736 module_param_named(virtual_gb, scsi_debug_virtual_gb, int, S_IRUGO | S_IWUSR);
2737 module_param_named(vpd_use_hostno, scsi_debug_vpd_use_hostno, int,
2739 module_param_named(write_same_length, scsi_debug_write_same_length, int,
2742 MODULE_AUTHOR("Eric Youngdale + Douglas Gilbert");
2743 MODULE_DESCRIPTION("SCSI debug adapter driver");
2744 MODULE_LICENSE("GPL");
2745 MODULE_VERSION(SCSI_DEBUG_VERSION);
2747 MODULE_PARM_DESC(add_host, "0..127 hosts allowed(def=1)");
2748 MODULE_PARM_DESC(ato, "application tag ownership: 0=disk 1=host (def=1)");
2749 MODULE_PARM_DESC(delay, "# of jiffies to delay response(def=1)");
2750 MODULE_PARM_DESC(dev_size_mb, "size in MB of ram shared by devs(def=8)");
2751 MODULE_PARM_DESC(dif, "data integrity field type: 0-3 (def=0)");
2752 MODULE_PARM_DESC(dix, "data integrity extensions mask (def=0)");
2753 MODULE_PARM_DESC(dsense, "use descriptor sense format(def=0 -> fixed)");
2754 MODULE_PARM_DESC(every_nth, "timeout every nth command(def=0)");
2755 MODULE_PARM_DESC(fake_rw, "fake reads/writes instead of copying (def=0)");
2756 MODULE_PARM_DESC(guard, "protection checksum: 0=crc, 1=ip (def=0)");
2757 MODULE_PARM_DESC(lbpu, "enable LBP, support UNMAP command (def=0)");
2758 MODULE_PARM_DESC(lbpws, "enable LBP, support WRITE SAME(16) with UNMAP bit (def=0)");
2759 MODULE_PARM_DESC(lbpws10, "enable LBP, support WRITE SAME(10) with UNMAP bit (def=0)");
2760 MODULE_PARM_DESC(lbprz, "unmapped blocks return 0 on read (def=1)");
2761 MODULE_PARM_DESC(lowest_aligned, "lowest aligned lba (def=0)");
2762 MODULE_PARM_DESC(max_luns, "number of LUNs per target to simulate(def=1)");
2763 MODULE_PARM_DESC(max_queue, "max number of queued commands (1 to 255(def))");
2764 MODULE_PARM_DESC(no_lun_0, "no LU number 0 (def=0 -> have lun 0)");
2765 MODULE_PARM_DESC(no_uld, "stop ULD (e.g. sd driver) attaching (def=0))");
2766 MODULE_PARM_DESC(num_parts, "number of partitions(def=0)");
2767 MODULE_PARM_DESC(num_tgts, "number of targets per host to simulate(def=1)");
2768 MODULE_PARM_DESC(opt_blks, "optimal transfer length in block (def=64)");
2769 MODULE_PARM_DESC(opts, "1->noise, 2->medium_err, 4->timeout, 8->recovered_err... (def=0)");
2770 MODULE_PARM_DESC(physblk_exp, "physical block exponent (def=0)");
2771 MODULE_PARM_DESC(ptype, "SCSI peripheral type(def=0[disk])");
2772 MODULE_PARM_DESC(removable, "claim to have removable media (def=0)");
2773 MODULE_PARM_DESC(scsi_level, "SCSI level to simulate(def=5[SPC-3])");
2774 MODULE_PARM_DESC(sector_size, "logical block size in bytes (def=512)");
2775 MODULE_PARM_DESC(unmap_alignment, "lowest aligned thin provisioning lba (def=0)");
2776 MODULE_PARM_DESC(unmap_granularity, "thin provisioning granularity in blocks (def=1)");
2777 MODULE_PARM_DESC(unmap_max_blocks, "max # of blocks can be unmapped in one cmd (def=0xffffffff)");
2778 MODULE_PARM_DESC(unmap_max_desc, "max # of ranges that can be unmapped in one cmd (def=256)");
2779 MODULE_PARM_DESC(virtual_gb, "virtual gigabyte size (def=0 -> use dev_size_mb)");
2780 MODULE_PARM_DESC(vpd_use_hostno, "0 -> dev ids ignore hostno (def=1 -> unique dev ids)");
2781 MODULE_PARM_DESC(write_same_length, "Maximum blocks per WRITE SAME cmd (def=0xffff)");
2783 static char sdebug_info[256];
2785 static const char * scsi_debug_info(struct Scsi_Host * shp)
2787 sprintf(sdebug_info, "scsi_debug, version %s [%s], "
2788 "dev_size_mb=%d, opts=0x%x", SCSI_DEBUG_VERSION,
2789 scsi_debug_version_date, scsi_debug_dev_size_mb,
2794 /* scsi_debug_proc_info
2795 * Used if the driver currently has no own support for /proc/scsi
2797 static int scsi_debug_write_info(struct Scsi_Host *host, char *buffer, int length)
2801 int minLen = length > 15 ? 15 : length;
2803 if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
2805 memcpy(arr, buffer, minLen);
2807 if (1 != sscanf(arr, "%d", &opts))
2809 scsi_debug_opts = opts;
2810 if (scsi_debug_every_nth != 0)
2811 scsi_debug_cmnd_count = 0;
2815 static int scsi_debug_show_info(struct seq_file *m, struct Scsi_Host *host)
2817 seq_printf(m, "scsi_debug adapter driver, version "
2819 "num_tgts=%d, shared (ram) size=%d MB, opts=0x%x, "
2820 "every_nth=%d(curr:%d)\n"
2821 "delay=%d, max_luns=%d, scsi_level=%d\n"
2822 "sector_size=%d bytes, cylinders=%d, heads=%d, sectors=%d\n"
2823 "number of aborts=%d, device_reset=%d, bus_resets=%d, "
2824 "host_resets=%d\ndix_reads=%d dix_writes=%d dif_errors=%d\n",
2825 SCSI_DEBUG_VERSION, scsi_debug_version_date, scsi_debug_num_tgts,
2826 scsi_debug_dev_size_mb, scsi_debug_opts, scsi_debug_every_nth,
2827 scsi_debug_cmnd_count, scsi_debug_delay,
2828 scsi_debug_max_luns, scsi_debug_scsi_level,
2829 scsi_debug_sector_size, sdebug_cylinders_per, sdebug_heads,
2830 sdebug_sectors_per, num_aborts, num_dev_resets, num_bus_resets,
2831 num_host_resets, dix_reads, dix_writes, dif_errors);
2835 static ssize_t sdebug_delay_show(struct device_driver * ddp, char * buf)
2837 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_delay);
2840 static ssize_t sdebug_delay_store(struct device_driver * ddp,
2841 const char * buf, size_t count)
2846 if (1 == sscanf(buf, "%10s", work)) {
2847 if ((1 == sscanf(work, "%d", &delay)) && (delay >= 0)) {
2848 scsi_debug_delay = delay;
2854 DRIVER_ATTR(delay, S_IRUGO | S_IWUSR, sdebug_delay_show,
2855 sdebug_delay_store);
2857 static ssize_t sdebug_opts_show(struct device_driver * ddp, char * buf)
2859 return scnprintf(buf, PAGE_SIZE, "0x%x\n", scsi_debug_opts);
2862 static ssize_t sdebug_opts_store(struct device_driver * ddp,
2863 const char * buf, size_t count)
2868 if (1 == sscanf(buf, "%10s", work)) {
2869 if (0 == strnicmp(work,"0x", 2)) {
2870 if (1 == sscanf(&work[2], "%x", &opts))
2873 if (1 == sscanf(work, "%d", &opts))
2879 scsi_debug_opts = opts;
2880 scsi_debug_cmnd_count = 0;
2883 DRIVER_ATTR(opts, S_IRUGO | S_IWUSR, sdebug_opts_show,
2886 static ssize_t sdebug_ptype_show(struct device_driver * ddp, char * buf)
2888 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_ptype);
2890 static ssize_t sdebug_ptype_store(struct device_driver * ddp,
2891 const char * buf, size_t count)
2895 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2896 scsi_debug_ptype = n;
2901 DRIVER_ATTR(ptype, S_IRUGO | S_IWUSR, sdebug_ptype_show, sdebug_ptype_store);
2903 static ssize_t sdebug_dsense_show(struct device_driver * ddp, char * buf)
2905 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dsense);
2907 static ssize_t sdebug_dsense_store(struct device_driver * ddp,
2908 const char * buf, size_t count)
2912 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2913 scsi_debug_dsense = n;
2918 DRIVER_ATTR(dsense, S_IRUGO | S_IWUSR, sdebug_dsense_show,
2919 sdebug_dsense_store);
2921 static ssize_t sdebug_fake_rw_show(struct device_driver * ddp, char * buf)
2923 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_fake_rw);
2925 static ssize_t sdebug_fake_rw_store(struct device_driver * ddp,
2926 const char * buf, size_t count)
2930 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2931 scsi_debug_fake_rw = n;
2936 DRIVER_ATTR(fake_rw, S_IRUGO | S_IWUSR, sdebug_fake_rw_show,
2937 sdebug_fake_rw_store);
2939 static ssize_t sdebug_no_lun_0_show(struct device_driver * ddp, char * buf)
2941 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_no_lun_0);
2943 static ssize_t sdebug_no_lun_0_store(struct device_driver * ddp,
2944 const char * buf, size_t count)
2948 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2949 scsi_debug_no_lun_0 = n;
2954 DRIVER_ATTR(no_lun_0, S_IRUGO | S_IWUSR, sdebug_no_lun_0_show,
2955 sdebug_no_lun_0_store);
2957 static ssize_t sdebug_num_tgts_show(struct device_driver * ddp, char * buf)
2959 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_num_tgts);
2961 static ssize_t sdebug_num_tgts_store(struct device_driver * ddp,
2962 const char * buf, size_t count)
2966 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2967 scsi_debug_num_tgts = n;
2968 sdebug_max_tgts_luns();
2973 DRIVER_ATTR(num_tgts, S_IRUGO | S_IWUSR, sdebug_num_tgts_show,
2974 sdebug_num_tgts_store);
2976 static ssize_t sdebug_dev_size_mb_show(struct device_driver * ddp, char * buf)
2978 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dev_size_mb);
2980 DRIVER_ATTR(dev_size_mb, S_IRUGO, sdebug_dev_size_mb_show, NULL);
2982 static ssize_t sdebug_num_parts_show(struct device_driver * ddp, char * buf)
2984 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_num_parts);
2986 DRIVER_ATTR(num_parts, S_IRUGO, sdebug_num_parts_show, NULL);
2988 static ssize_t sdebug_every_nth_show(struct device_driver * ddp, char * buf)
2990 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_every_nth);
2992 static ssize_t sdebug_every_nth_store(struct device_driver * ddp,
2993 const char * buf, size_t count)
2997 if ((count > 0) && (1 == sscanf(buf, "%d", &nth))) {
2998 scsi_debug_every_nth = nth;
2999 scsi_debug_cmnd_count = 0;
3004 DRIVER_ATTR(every_nth, S_IRUGO | S_IWUSR, sdebug_every_nth_show,
3005 sdebug_every_nth_store);
3007 static ssize_t sdebug_max_luns_show(struct device_driver * ddp, char * buf)
3009 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_max_luns);
3011 static ssize_t sdebug_max_luns_store(struct device_driver * ddp,
3012 const char * buf, size_t count)
3016 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
3017 scsi_debug_max_luns = n;
3018 sdebug_max_tgts_luns();
3023 DRIVER_ATTR(max_luns, S_IRUGO | S_IWUSR, sdebug_max_luns_show,
3024 sdebug_max_luns_store);
3026 static ssize_t sdebug_max_queue_show(struct device_driver * ddp, char * buf)
3028 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_max_queue);
3030 static ssize_t sdebug_max_queue_store(struct device_driver * ddp,
3031 const char * buf, size_t count)
3035 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n > 0) &&
3036 (n <= SCSI_DEBUG_CANQUEUE)) {
3037 scsi_debug_max_queue = n;
3042 DRIVER_ATTR(max_queue, S_IRUGO | S_IWUSR, sdebug_max_queue_show,
3043 sdebug_max_queue_store);
3045 static ssize_t sdebug_no_uld_show(struct device_driver * ddp, char * buf)
3047 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_no_uld);
3049 DRIVER_ATTR(no_uld, S_IRUGO, sdebug_no_uld_show, NULL);
3051 static ssize_t sdebug_scsi_level_show(struct device_driver * ddp, char * buf)
3053 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_scsi_level);
3055 DRIVER_ATTR(scsi_level, S_IRUGO, sdebug_scsi_level_show, NULL);
3057 static ssize_t sdebug_virtual_gb_show(struct device_driver * ddp, char * buf)
3059 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_virtual_gb);
3061 static ssize_t sdebug_virtual_gb_store(struct device_driver * ddp,
3062 const char * buf, size_t count)
3066 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
3067 scsi_debug_virtual_gb = n;
3069 sdebug_capacity = get_sdebug_capacity();
3075 DRIVER_ATTR(virtual_gb, S_IRUGO | S_IWUSR, sdebug_virtual_gb_show,
3076 sdebug_virtual_gb_store);
3078 static ssize_t sdebug_add_host_show(struct device_driver * ddp, char * buf)
3080 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_add_host);
3083 static ssize_t sdebug_add_host_store(struct device_driver * ddp,
3084 const char * buf, size_t count)
3088 if (sscanf(buf, "%d", &delta_hosts) != 1)
3090 if (delta_hosts > 0) {
3092 sdebug_add_adapter();
3093 } while (--delta_hosts);
3094 } else if (delta_hosts < 0) {
3096 sdebug_remove_adapter();
3097 } while (++delta_hosts);
3101 DRIVER_ATTR(add_host, S_IRUGO | S_IWUSR, sdebug_add_host_show,
3102 sdebug_add_host_store);
3104 static ssize_t sdebug_vpd_use_hostno_show(struct device_driver * ddp,
3107 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_vpd_use_hostno);
3109 static ssize_t sdebug_vpd_use_hostno_store(struct device_driver * ddp,
3110 const char * buf, size_t count)
3114 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
3115 scsi_debug_vpd_use_hostno = n;
3120 DRIVER_ATTR(vpd_use_hostno, S_IRUGO | S_IWUSR, sdebug_vpd_use_hostno_show,
3121 sdebug_vpd_use_hostno_store);
3123 static ssize_t sdebug_sector_size_show(struct device_driver * ddp, char * buf)
3125 return scnprintf(buf, PAGE_SIZE, "%u\n", scsi_debug_sector_size);
3127 DRIVER_ATTR(sector_size, S_IRUGO, sdebug_sector_size_show, NULL);
3129 static ssize_t sdebug_dix_show(struct device_driver *ddp, char *buf)
3131 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dix);
3133 DRIVER_ATTR(dix, S_IRUGO, sdebug_dix_show, NULL);
3135 static ssize_t sdebug_dif_show(struct device_driver *ddp, char *buf)
3137 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dif);
3139 DRIVER_ATTR(dif, S_IRUGO, sdebug_dif_show, NULL);
3141 static ssize_t sdebug_guard_show(struct device_driver *ddp, char *buf)
3143 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_guard);
3145 DRIVER_ATTR(guard, S_IRUGO, sdebug_guard_show, NULL);
3147 static ssize_t sdebug_ato_show(struct device_driver *ddp, char *buf)
3149 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_ato);
3151 DRIVER_ATTR(ato, S_IRUGO, sdebug_ato_show, NULL);
3153 static ssize_t sdebug_map_show(struct device_driver *ddp, char *buf)
3157 if (!scsi_debug_lbp())
3158 return scnprintf(buf, PAGE_SIZE, "0-%u\n",
3159 sdebug_store_sectors);
3161 count = bitmap_scnlistprintf(buf, PAGE_SIZE, map_storep, map_size);
3163 buf[count++] = '\n';
3168 DRIVER_ATTR(map, S_IRUGO, sdebug_map_show, NULL);
3170 static ssize_t sdebug_removable_show(struct device_driver *ddp,
3173 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_removable ? 1 : 0);
3175 static ssize_t sdebug_removable_store(struct device_driver *ddp,
3176 const char *buf, size_t count)
3180 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
3181 scsi_debug_removable = (n > 0);
3186 DRIVER_ATTR(removable, S_IRUGO | S_IWUSR, sdebug_removable_show,
3187 sdebug_removable_store);
3190 /* Note: The following function creates attribute files in the
3191 /sys/bus/pseudo/drivers/scsi_debug directory. The advantage of these
3192 files (over those found in the /sys/module/scsi_debug/parameters
3193 directory) is that auxiliary actions can be triggered when an attribute
3194 is changed. For example see: sdebug_add_host_store() above.
3196 static int do_create_driverfs_files(void)
3200 ret = driver_create_file(&sdebug_driverfs_driver, &driver_attr_add_host);
3201 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_delay);
3202 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dev_size_mb);
3203 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dsense);
3204 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_every_nth);
3205 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_fake_rw);
3206 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_max_luns);
3207 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_max_queue);
3208 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_no_lun_0);
3209 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_no_uld);
3210 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_num_parts);
3211 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_num_tgts);
3212 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_ptype);
3213 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_opts);
3214 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_removable);
3215 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_scsi_level);
3216 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_virtual_gb);
3217 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_vpd_use_hostno);
3218 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_sector_size);
3219 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dix);
3220 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dif);
3221 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_guard);
3222 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_ato);
3223 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_map);
3227 static void do_remove_driverfs_files(void)
3229 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_map);
3230 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_ato);
3231 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_guard);
3232 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dif);
3233 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dix);
3234 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_sector_size);
3235 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_vpd_use_hostno);
3236 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_virtual_gb);
3237 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_scsi_level);
3238 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_opts);
3239 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_ptype);
3240 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_removable);
3241 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_num_tgts);
3242 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_num_parts);
3243 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_no_uld);
3244 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_no_lun_0);
3245 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_max_queue);
3246 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_max_luns);
3247 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_fake_rw);
3248 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_every_nth);
3249 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dsense);
3250 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dev_size_mb);
3251 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_delay);
3252 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_add_host);
3255 struct device *pseudo_primary;
3257 static int __init scsi_debug_init(void)
3264 switch (scsi_debug_sector_size) {
3271 printk(KERN_ERR "scsi_debug_init: invalid sector_size %d\n",
3272 scsi_debug_sector_size);
3276 switch (scsi_debug_dif) {
3278 case SD_DIF_TYPE0_PROTECTION:
3279 case SD_DIF_TYPE1_PROTECTION:
3280 case SD_DIF_TYPE2_PROTECTION:
3281 case SD_DIF_TYPE3_PROTECTION:
3285 printk(KERN_ERR "scsi_debug_init: dif must be 0, 1, 2 or 3\n");
3289 if (scsi_debug_guard > 1) {
3290 printk(KERN_ERR "scsi_debug_init: guard must be 0 or 1\n");
3294 if (scsi_debug_ato > 1) {
3295 printk(KERN_ERR "scsi_debug_init: ato must be 0 or 1\n");
3299 if (scsi_debug_physblk_exp > 15) {
3300 printk(KERN_ERR "scsi_debug_init: invalid physblk_exp %u\n",
3301 scsi_debug_physblk_exp);
3305 if (scsi_debug_lowest_aligned > 0x3fff) {
3306 printk(KERN_ERR "scsi_debug_init: lowest_aligned too big: %u\n",
3307 scsi_debug_lowest_aligned);
3311 if (scsi_debug_dev_size_mb < 1)
3312 scsi_debug_dev_size_mb = 1; /* force minimum 1 MB ramdisk */
3313 sz = (unsigned long)scsi_debug_dev_size_mb * 1048576;
3314 sdebug_store_sectors = sz / scsi_debug_sector_size;
3315 sdebug_capacity = get_sdebug_capacity();
3317 /* play around with geometry, don't waste too much on track 0 */
3319 sdebug_sectors_per = 32;
3320 if (scsi_debug_dev_size_mb >= 16)
3322 else if (scsi_debug_dev_size_mb >= 256)
3324 sdebug_cylinders_per = (unsigned long)sdebug_capacity /
3325 (sdebug_sectors_per * sdebug_heads);
3326 if (sdebug_cylinders_per >= 1024) {
3327 /* other LLDs do this; implies >= 1GB ram disk ... */
3329 sdebug_sectors_per = 63;
3330 sdebug_cylinders_per = (unsigned long)sdebug_capacity /
3331 (sdebug_sectors_per * sdebug_heads);
3334 fake_storep = vmalloc(sz);
3335 if (NULL == fake_storep) {
3336 printk(KERN_ERR "scsi_debug_init: out of memory, 1\n");
3339 memset(fake_storep, 0, sz);
3340 if (scsi_debug_num_parts > 0)
3341 sdebug_build_parts(fake_storep, sz);
3343 if (scsi_debug_dix) {
3346 dif_size = sdebug_store_sectors * sizeof(struct sd_dif_tuple);
3347 dif_storep = vmalloc(dif_size);
3349 printk(KERN_ERR "scsi_debug_init: dif_storep %u bytes @ %p\n",
3350 dif_size, dif_storep);
3352 if (dif_storep == NULL) {
3353 printk(KERN_ERR "scsi_debug_init: out of mem. (DIX)\n");
3358 memset(dif_storep, 0xff, dif_size);
3361 /* Logical Block Provisioning */
3362 if (scsi_debug_lbp()) {
3363 scsi_debug_unmap_max_blocks =
3364 clamp(scsi_debug_unmap_max_blocks, 0U, 0xffffffffU);
3366 scsi_debug_unmap_max_desc =
3367 clamp(scsi_debug_unmap_max_desc, 0U, 256U);
3369 scsi_debug_unmap_granularity =
3370 clamp(scsi_debug_unmap_granularity, 1U, 0xffffffffU);
3372 if (scsi_debug_unmap_alignment &&
3373 scsi_debug_unmap_granularity <=
3374 scsi_debug_unmap_alignment) {
3376 "%s: ERR: unmap_granularity <= unmap_alignment\n",
3381 map_size = lba_to_map_index(sdebug_store_sectors - 1) + 1;
3382 map_storep = vmalloc(BITS_TO_LONGS(map_size) * sizeof(long));
3384 printk(KERN_INFO "scsi_debug_init: %lu provisioning blocks\n",
3387 if (map_storep == NULL) {
3388 printk(KERN_ERR "scsi_debug_init: out of mem. (MAP)\n");
3393 bitmap_zero(map_storep, map_size);
3395 /* Map first 1KB for partition table */
3396 if (scsi_debug_num_parts)
3400 pseudo_primary = root_device_register("pseudo_0");
3401 if (IS_ERR(pseudo_primary)) {
3402 printk(KERN_WARNING "scsi_debug: root_device_register() error\n");
3403 ret = PTR_ERR(pseudo_primary);
3406 ret = bus_register(&pseudo_lld_bus);
3408 printk(KERN_WARNING "scsi_debug: bus_register error: %d\n",
3412 ret = driver_register(&sdebug_driverfs_driver);
3414 printk(KERN_WARNING "scsi_debug: driver_register error: %d\n",
3418 ret = do_create_driverfs_files();
3420 printk(KERN_WARNING "scsi_debug: driver_create_file error: %d\n",
3427 host_to_add = scsi_debug_add_host;
3428 scsi_debug_add_host = 0;
3430 for (k = 0; k < host_to_add; k++) {
3431 if (sdebug_add_adapter()) {
3432 printk(KERN_ERR "scsi_debug_init: "
3433 "sdebug_add_adapter failed k=%d\n", k);
3438 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
3439 printk(KERN_INFO "scsi_debug_init: built %d host(s)\n",
3440 scsi_debug_add_host);
3445 do_remove_driverfs_files();
3446 driver_unregister(&sdebug_driverfs_driver);
3448 bus_unregister(&pseudo_lld_bus);
3450 root_device_unregister(pseudo_primary);
3461 static void __exit scsi_debug_exit(void)
3463 int k = scsi_debug_add_host;
3467 sdebug_remove_adapter();
3468 do_remove_driverfs_files();
3469 driver_unregister(&sdebug_driverfs_driver);
3470 bus_unregister(&pseudo_lld_bus);
3471 root_device_unregister(pseudo_primary);
3479 device_initcall(scsi_debug_init);
3480 module_exit(scsi_debug_exit);
3482 static void sdebug_release_adapter(struct device * dev)
3484 struct sdebug_host_info *sdbg_host;
3486 sdbg_host = to_sdebug_host(dev);
3490 static int sdebug_add_adapter(void)
3492 int k, devs_per_host;
3494 struct sdebug_host_info *sdbg_host;
3495 struct sdebug_dev_info *sdbg_devinfo, *tmp;
3497 sdbg_host = kzalloc(sizeof(*sdbg_host),GFP_KERNEL);
3498 if (NULL == sdbg_host) {
3499 printk(KERN_ERR "%s: out of memory at line %d\n",
3500 __func__, __LINE__);
3504 INIT_LIST_HEAD(&sdbg_host->dev_info_list);
3506 devs_per_host = scsi_debug_num_tgts * scsi_debug_max_luns;
3507 for (k = 0; k < devs_per_host; k++) {
3508 sdbg_devinfo = sdebug_device_create(sdbg_host, GFP_KERNEL);
3509 if (!sdbg_devinfo) {
3510 printk(KERN_ERR "%s: out of memory at line %d\n",
3511 __func__, __LINE__);
3517 spin_lock(&sdebug_host_list_lock);
3518 list_add_tail(&sdbg_host->host_list, &sdebug_host_list);
3519 spin_unlock(&sdebug_host_list_lock);
3521 sdbg_host->dev.bus = &pseudo_lld_bus;
3522 sdbg_host->dev.parent = pseudo_primary;
3523 sdbg_host->dev.release = &sdebug_release_adapter;
3524 dev_set_name(&sdbg_host->dev, "adapter%d", scsi_debug_add_host);
3526 error = device_register(&sdbg_host->dev);
3531 ++scsi_debug_add_host;
3535 list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
3537 list_del(&sdbg_devinfo->dev_list);
3538 kfree(sdbg_devinfo);
3545 static void sdebug_remove_adapter(void)
3547 struct sdebug_host_info * sdbg_host = NULL;
3549 spin_lock(&sdebug_host_list_lock);
3550 if (!list_empty(&sdebug_host_list)) {
3551 sdbg_host = list_entry(sdebug_host_list.prev,
3552 struct sdebug_host_info, host_list);
3553 list_del(&sdbg_host->host_list);
3555 spin_unlock(&sdebug_host_list_lock);
3560 device_unregister(&sdbg_host->dev);
3561 --scsi_debug_add_host;
3565 int scsi_debug_queuecommand_lck(struct scsi_cmnd *SCpnt, done_funct_t done)
3567 unsigned char *cmd = (unsigned char *) SCpnt->cmnd;
3570 unsigned long long lba;
3573 int target = SCpnt->device->id;
3574 struct sdebug_dev_info *devip = NULL;
3575 int inj_recovered = 0;
3576 int inj_transport = 0;
3579 int delay_override = 0;
3582 scsi_set_resid(SCpnt, 0);
3583 if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) && cmd) {
3584 printk(KERN_INFO "scsi_debug: cmd ");
3585 for (k = 0, len = SCpnt->cmd_len; k < len; ++k)
3586 printk("%02x ", (int)cmd[k]);
3590 if (target == SCpnt->device->host->hostt->this_id) {
3591 printk(KERN_INFO "scsi_debug: initiator's id used as "
3593 return schedule_resp(SCpnt, NULL, done,
3594 DID_NO_CONNECT << 16, 0);
3597 if ((SCpnt->device->lun >= scsi_debug_max_luns) &&
3598 (SCpnt->device->lun != SAM2_WLUN_REPORT_LUNS))
3599 return schedule_resp(SCpnt, NULL, done,
3600 DID_NO_CONNECT << 16, 0);
3601 devip = devInfoReg(SCpnt->device);
3603 return schedule_resp(SCpnt, NULL, done,
3604 DID_NO_CONNECT << 16, 0);
3606 if ((scsi_debug_every_nth != 0) &&
3607 (++scsi_debug_cmnd_count >= abs(scsi_debug_every_nth))) {
3608 scsi_debug_cmnd_count = 0;
3609 if (scsi_debug_every_nth < -1)
3610 scsi_debug_every_nth = -1;
3611 if (SCSI_DEBUG_OPT_TIMEOUT & scsi_debug_opts)
3612 return 0; /* ignore command causing timeout */
3613 else if (SCSI_DEBUG_OPT_MAC_TIMEOUT & scsi_debug_opts &&
3614 scsi_medium_access_command(SCpnt))
3615 return 0; /* time out reads and writes */
3616 else if (SCSI_DEBUG_OPT_RECOVERED_ERR & scsi_debug_opts)
3617 inj_recovered = 1; /* to reads and writes below */
3618 else if (SCSI_DEBUG_OPT_TRANSPORT_ERR & scsi_debug_opts)
3619 inj_transport = 1; /* to reads and writes below */
3620 else if (SCSI_DEBUG_OPT_DIF_ERR & scsi_debug_opts)
3621 inj_dif = 1; /* to reads and writes below */
3622 else if (SCSI_DEBUG_OPT_DIX_ERR & scsi_debug_opts)
3623 inj_dix = 1; /* to reads and writes below */
3630 case TEST_UNIT_READY:
3632 break; /* only allowable wlun commands */
3634 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
3635 printk(KERN_INFO "scsi_debug: Opcode: 0x%x "
3636 "not supported for wlun\n", *cmd);
3637 mk_sense_buffer(devip, ILLEGAL_REQUEST,
3639 errsts = check_condition_result;
3640 return schedule_resp(SCpnt, devip, done, errsts,
3646 case INQUIRY: /* mandatory, ignore unit attention */
3648 errsts = resp_inquiry(SCpnt, target, devip);
3650 case REQUEST_SENSE: /* mandatory, ignore unit attention */
3652 errsts = resp_requests(SCpnt, devip);
3654 case REZERO_UNIT: /* actually this is REWIND for SSC */
3656 errsts = resp_start_stop(SCpnt, devip);
3658 case ALLOW_MEDIUM_REMOVAL:
3659 errsts = check_readiness(SCpnt, 1, devip);
3662 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
3663 printk(KERN_INFO "scsi_debug: Medium removal %s\n",
3664 cmd[4] ? "inhibited" : "enabled");
3666 case SEND_DIAGNOSTIC: /* mandatory */
3667 errsts = check_readiness(SCpnt, 1, devip);
3669 case TEST_UNIT_READY: /* mandatory */
3671 errsts = check_readiness(SCpnt, 0, devip);
3674 errsts = check_readiness(SCpnt, 1, devip);
3677 errsts = check_readiness(SCpnt, 1, devip);
3680 errsts = check_readiness(SCpnt, 1, devip);
3683 errsts = check_readiness(SCpnt, 1, devip);
3686 errsts = resp_readcap(SCpnt, devip);
3688 case SERVICE_ACTION_IN:
3689 if (cmd[1] == SAI_READ_CAPACITY_16)
3690 errsts = resp_readcap16(SCpnt, devip);
3691 else if (cmd[1] == SAI_GET_LBA_STATUS) {
3693 if (scsi_debug_lbp() == 0) {
3694 mk_sense_buffer(devip, ILLEGAL_REQUEST,
3695 INVALID_COMMAND_OPCODE, 0);
3696 errsts = check_condition_result;
3698 errsts = resp_get_lba_status(SCpnt, devip);
3700 mk_sense_buffer(devip, ILLEGAL_REQUEST,
3702 errsts = check_condition_result;
3705 case MAINTENANCE_IN:
3706 if (MI_REPORT_TARGET_PGS != cmd[1]) {
3707 mk_sense_buffer(devip, ILLEGAL_REQUEST,
3709 errsts = check_condition_result;
3712 errsts = resp_report_tgtpgs(SCpnt, devip);
3717 /* READ{10,12,16} and DIF Type 2 are natural enemies */
3718 if (scsi_debug_dif == SD_DIF_TYPE2_PROTECTION &&
3720 mk_sense_buffer(devip, ILLEGAL_REQUEST,
3721 INVALID_COMMAND_OPCODE, 0);
3722 errsts = check_condition_result;
3726 if ((scsi_debug_dif == SD_DIF_TYPE1_PROTECTION ||
3727 scsi_debug_dif == SD_DIF_TYPE3_PROTECTION) &&
3728 (cmd[1] & 0xe0) == 0)
3729 printk(KERN_ERR "Unprotected RD/WR to DIF device\n");
3734 errsts = check_readiness(SCpnt, 0, devip);
3737 if (scsi_debug_fake_rw)
3739 get_data_transfer_info(cmd, &lba, &num, &ei_lba);
3740 errsts = resp_read(SCpnt, lba, num, devip, ei_lba);
3741 if (inj_recovered && (0 == errsts)) {
3742 mk_sense_buffer(devip, RECOVERED_ERROR,
3743 THRESHOLD_EXCEEDED, 0);
3744 errsts = check_condition_result;
3745 } else if (inj_transport && (0 == errsts)) {
3746 mk_sense_buffer(devip, ABORTED_COMMAND,
3747 TRANSPORT_PROBLEM, ACK_NAK_TO);
3748 errsts = check_condition_result;
3749 } else if (inj_dif && (0 == errsts)) {
3750 mk_sense_buffer(devip, ABORTED_COMMAND, 0x10, 1);
3751 errsts = illegal_condition_result;
3752 } else if (inj_dix && (0 == errsts)) {
3753 mk_sense_buffer(devip, ILLEGAL_REQUEST, 0x10, 1);
3754 errsts = illegal_condition_result;
3757 case REPORT_LUNS: /* mandatory, ignore unit attention */
3759 errsts = resp_report_luns(SCpnt, devip);
3761 case VERIFY: /* 10 byte SBC-2 command */
3762 errsts = check_readiness(SCpnt, 0, devip);
3767 /* WRITE{10,12,16} and DIF Type 2 are natural enemies */
3768 if (scsi_debug_dif == SD_DIF_TYPE2_PROTECTION &&
3770 mk_sense_buffer(devip, ILLEGAL_REQUEST,
3771 INVALID_COMMAND_OPCODE, 0);
3772 errsts = check_condition_result;
3776 if ((scsi_debug_dif == SD_DIF_TYPE1_PROTECTION ||
3777 scsi_debug_dif == SD_DIF_TYPE3_PROTECTION) &&
3778 (cmd[1] & 0xe0) == 0)
3779 printk(KERN_ERR "Unprotected RD/WR to DIF device\n");
3784 errsts = check_readiness(SCpnt, 0, devip);
3787 if (scsi_debug_fake_rw)
3789 get_data_transfer_info(cmd, &lba, &num, &ei_lba);
3790 errsts = resp_write(SCpnt, lba, num, devip, ei_lba);
3791 if (inj_recovered && (0 == errsts)) {
3792 mk_sense_buffer(devip, RECOVERED_ERROR,
3793 THRESHOLD_EXCEEDED, 0);
3794 errsts = check_condition_result;
3795 } else if (inj_dif && (0 == errsts)) {
3796 mk_sense_buffer(devip, ABORTED_COMMAND, 0x10, 1);
3797 errsts = illegal_condition_result;
3798 } else if (inj_dix && (0 == errsts)) {
3799 mk_sense_buffer(devip, ILLEGAL_REQUEST, 0x10, 1);
3800 errsts = illegal_condition_result;
3806 if ((*cmd == WRITE_SAME_16 && scsi_debug_lbpws == 0) ||
3807 (*cmd == WRITE_SAME && scsi_debug_lbpws10 == 0)) {
3808 mk_sense_buffer(devip, ILLEGAL_REQUEST,
3809 INVALID_FIELD_IN_CDB, 0);
3810 errsts = check_condition_result;
3816 errsts = check_readiness(SCpnt, 0, devip);
3819 get_data_transfer_info(cmd, &lba, &num, &ei_lba);
3820 errsts = resp_write_same(SCpnt, lba, num, devip, ei_lba, unmap);
3823 errsts = check_readiness(SCpnt, 0, devip);
3827 if (scsi_debug_unmap_max_desc == 0 || scsi_debug_lbpu == 0) {
3828 mk_sense_buffer(devip, ILLEGAL_REQUEST,
3829 INVALID_COMMAND_OPCODE, 0);
3830 errsts = check_condition_result;
3832 errsts = resp_unmap(SCpnt, devip);
3836 errsts = resp_mode_sense(SCpnt, target, devip);
3839 errsts = resp_mode_select(SCpnt, 1, devip);
3841 case MODE_SELECT_10:
3842 errsts = resp_mode_select(SCpnt, 0, devip);
3845 errsts = resp_log_sense(SCpnt, devip);
3847 case SYNCHRONIZE_CACHE:
3849 errsts = check_readiness(SCpnt, 0, devip);
3852 errsts = check_readiness(SCpnt, 1, devip);
3854 case XDWRITEREAD_10:
3855 if (!scsi_bidi_cmnd(SCpnt)) {
3856 mk_sense_buffer(devip, ILLEGAL_REQUEST,
3857 INVALID_FIELD_IN_CDB, 0);
3858 errsts = check_condition_result;
3862 errsts = check_readiness(SCpnt, 0, devip);
3865 if (scsi_debug_fake_rw)
3867 get_data_transfer_info(cmd, &lba, &num, &ei_lba);
3868 errsts = resp_read(SCpnt, lba, num, devip, ei_lba);
3871 errsts = resp_write(SCpnt, lba, num, devip, ei_lba);
3874 errsts = resp_xdwriteread(SCpnt, lba, num, devip);
3876 case VARIABLE_LENGTH_CMD:
3877 if (scsi_debug_dif == SD_DIF_TYPE2_PROTECTION) {
3879 if ((cmd[10] & 0xe0) == 0)
3881 "Unprotected RD/WR to DIF device\n");
3883 if (cmd[9] == READ_32) {
3884 BUG_ON(SCpnt->cmd_len < 32);
3888 if (cmd[9] == WRITE_32) {
3889 BUG_ON(SCpnt->cmd_len < 32);
3894 mk_sense_buffer(devip, ILLEGAL_REQUEST,
3895 INVALID_FIELD_IN_CDB, 0);
3896 errsts = check_condition_result;
3900 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
3901 printk(KERN_INFO "scsi_debug: Opcode: 0x%x not "
3902 "supported\n", *cmd);
3903 errsts = check_readiness(SCpnt, 1, devip);
3905 break; /* Unit attention takes precedence */
3906 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_OPCODE, 0);
3907 errsts = check_condition_result;
3910 return schedule_resp(SCpnt, devip, done, errsts,
3911 (delay_override ? 0 : scsi_debug_delay));
3914 static DEF_SCSI_QCMD(scsi_debug_queuecommand)
3916 static struct scsi_host_template sdebug_driver_template = {
3917 .show_info = scsi_debug_show_info,
3918 .write_info = scsi_debug_write_info,
3919 .proc_name = sdebug_proc_name,
3920 .name = "SCSI DEBUG",
3921 .info = scsi_debug_info,
3922 .slave_alloc = scsi_debug_slave_alloc,
3923 .slave_configure = scsi_debug_slave_configure,
3924 .slave_destroy = scsi_debug_slave_destroy,
3925 .ioctl = scsi_debug_ioctl,
3926 .queuecommand = scsi_debug_queuecommand,
3927 .eh_abort_handler = scsi_debug_abort,
3928 .eh_bus_reset_handler = scsi_debug_bus_reset,
3929 .eh_device_reset_handler = scsi_debug_device_reset,
3930 .eh_host_reset_handler = scsi_debug_host_reset,
3931 .bios_param = scsi_debug_biosparam,
3932 .can_queue = SCSI_DEBUG_CANQUEUE,
3934 .sg_tablesize = 256,
3936 .max_sectors = 0xffff,
3937 .use_clustering = DISABLE_CLUSTERING,
3938 .module = THIS_MODULE,
3941 static int sdebug_driver_probe(struct device * dev)
3944 struct sdebug_host_info *sdbg_host;
3945 struct Scsi_Host *hpnt;
3948 sdbg_host = to_sdebug_host(dev);
3950 sdebug_driver_template.can_queue = scsi_debug_max_queue;
3951 hpnt = scsi_host_alloc(&sdebug_driver_template, sizeof(sdbg_host));
3953 printk(KERN_ERR "%s: scsi_register failed\n", __func__);
3958 sdbg_host->shost = hpnt;
3959 *((struct sdebug_host_info **)hpnt->hostdata) = sdbg_host;
3960 if ((hpnt->this_id >= 0) && (scsi_debug_num_tgts > hpnt->this_id))
3961 hpnt->max_id = scsi_debug_num_tgts + 1;
3963 hpnt->max_id = scsi_debug_num_tgts;
3964 hpnt->max_lun = SAM2_WLUN_REPORT_LUNS; /* = scsi_debug_max_luns; */
3968 switch (scsi_debug_dif) {
3970 case SD_DIF_TYPE1_PROTECTION:
3971 host_prot = SHOST_DIF_TYPE1_PROTECTION;
3973 host_prot |= SHOST_DIX_TYPE1_PROTECTION;
3976 case SD_DIF_TYPE2_PROTECTION:
3977 host_prot = SHOST_DIF_TYPE2_PROTECTION;
3979 host_prot |= SHOST_DIX_TYPE2_PROTECTION;
3982 case SD_DIF_TYPE3_PROTECTION:
3983 host_prot = SHOST_DIF_TYPE3_PROTECTION;
3985 host_prot |= SHOST_DIX_TYPE3_PROTECTION;
3990 host_prot |= SHOST_DIX_TYPE0_PROTECTION;
3994 scsi_host_set_prot(hpnt, host_prot);
3996 printk(KERN_INFO "scsi_debug: host protection%s%s%s%s%s%s%s\n",
3997 (host_prot & SHOST_DIF_TYPE1_PROTECTION) ? " DIF1" : "",
3998 (host_prot & SHOST_DIF_TYPE2_PROTECTION) ? " DIF2" : "",
3999 (host_prot & SHOST_DIF_TYPE3_PROTECTION) ? " DIF3" : "",
4000 (host_prot & SHOST_DIX_TYPE0_PROTECTION) ? " DIX0" : "",
4001 (host_prot & SHOST_DIX_TYPE1_PROTECTION) ? " DIX1" : "",
4002 (host_prot & SHOST_DIX_TYPE2_PROTECTION) ? " DIX2" : "",
4003 (host_prot & SHOST_DIX_TYPE3_PROTECTION) ? " DIX3" : "");
4005 if (scsi_debug_guard == 1)
4006 scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_IP);
4008 scsi_host_set_guard(hpnt, SHOST_DIX_GUARD_CRC);
4010 error = scsi_add_host(hpnt, &sdbg_host->dev);
4012 printk(KERN_ERR "%s: scsi_add_host failed\n", __func__);
4014 scsi_host_put(hpnt);
4016 scsi_scan_host(hpnt);
4022 static int sdebug_driver_remove(struct device * dev)
4024 struct sdebug_host_info *sdbg_host;
4025 struct sdebug_dev_info *sdbg_devinfo, *tmp;
4027 sdbg_host = to_sdebug_host(dev);
4030 printk(KERN_ERR "%s: Unable to locate host info\n",
4035 scsi_remove_host(sdbg_host->shost);
4037 list_for_each_entry_safe(sdbg_devinfo, tmp, &sdbg_host->dev_info_list,
4039 list_del(&sdbg_devinfo->dev_list);
4040 kfree(sdbg_devinfo);
4043 scsi_host_put(sdbg_host->shost);
4047 static int pseudo_lld_bus_match(struct device *dev,
4048 struct device_driver *dev_driver)
4053 static struct bus_type pseudo_lld_bus = {
4055 .match = pseudo_lld_bus_match,
4056 .probe = sdebug_driver_probe,
4057 .remove = sdebug_driver_remove,