2 * linux/kernel/scsi_debug.c
3 * vvvvvvvvvvvvvvvvvvvvvvv Original vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
4 * Copyright (C) 1992 Eric Youngdale
5 * Simulate a host adapter with 2 disks attached. Do a lot of checking
6 * to make sure that we are not getting blocks mixed up, and PANIC if
7 * anything out of the ordinary is seen.
8 * ^^^^^^^^^^^^^^^^^^^^^^^ Original ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
10 * This version is more generic, simulating a variable number of disk
11 * (or disk like devices) sharing a common amount of RAM
14 * For documentation see http://www.torque.net/sg/sdebug26.html
16 * D. Gilbert (dpg) work for Magneto-Optical device test [20010421]
17 * dpg: work for devfs large number of disks [20010809]
18 * forked for lk 2.5 series [20011216, 20020101]
19 * use vmalloc() more inquiry+mode_sense [20020302]
20 * add timers for delayed responses [20020721]
21 * Patrick Mansfield <patmans@us.ibm.com> max_luns+scsi_level [20021031]
22 * Mike Anderson <andmike@us.ibm.com> sysfs work [20021118]
23 * dpg: change style of boot options to "scsi_debug.num_tgts=2" and
24 * module options to "modprobe scsi_debug num_tgts=2" [20021221]
27 #include <linux/module.h>
29 #include <linux/kernel.h>
30 #include <linux/sched.h>
31 #include <linux/errno.h>
32 #include <linux/timer.h>
33 #include <linux/types.h>
34 #include <linux/string.h>
35 #include <linux/genhd.h>
37 #include <linux/init.h>
38 #include <linux/proc_fs.h>
39 #include <linux/smp_lock.h>
40 #include <linux/vmalloc.h>
41 #include <linux/moduleparam.h>
43 #include <linux/blkdev.h>
45 #include <scsi/scsi_host.h>
46 #include <scsi/scsicam.h>
48 #include <linux/stat.h>
50 #include "scsi_logging.h"
51 #include "scsi_debug.h"
53 #define SCSI_DEBUG_VERSION "1.79"
54 static const char * scsi_debug_version_date = "20060604";
56 /* Additional Sense Code (ASC) used */
57 #define NO_ADDITIONAL_SENSE 0x0
58 #define LOGICAL_UNIT_NOT_READY 0x4
59 #define UNRECOVERED_READ_ERR 0x11
60 #define PARAMETER_LIST_LENGTH_ERR 0x1a
61 #define INVALID_OPCODE 0x20
62 #define ADDR_OUT_OF_RANGE 0x21
63 #define INVALID_FIELD_IN_CDB 0x24
64 #define INVALID_FIELD_IN_PARAM_LIST 0x26
65 #define POWERON_RESET 0x29
66 #define SAVING_PARAMS_UNSUP 0x39
67 #define THRESHOLD_EXCEEDED 0x5d
68 #define LOW_POWER_COND_ON 0x5e
70 #define SDEBUG_TAGGED_QUEUING 0 /* 0 | MSG_SIMPLE_TAG | MSG_ORDERED_TAG */
72 /* Default values for driver parameters */
73 #define DEF_NUM_HOST 1
74 #define DEF_NUM_TGTS 1
75 #define DEF_MAX_LUNS 1
76 /* With these defaults, this driver will make 1 host with 1 target
77 * (id 0) containing 1 logical unit (lun 0). That is 1 device.
80 #define DEF_DEV_SIZE_MB 8
81 #define DEF_EVERY_NTH 0
82 #define DEF_NUM_PARTS 0
84 #define DEF_SCSI_LEVEL 5 /* INQUIRY, byte2 [5->SPC-3] */
87 #define DEF_NO_LUN_0 0
88 #define DEF_VIRTUAL_GB 0
90 /* bit mask values for scsi_debug_opts */
91 #define SCSI_DEBUG_OPT_NOISE 1
92 #define SCSI_DEBUG_OPT_MEDIUM_ERR 2
93 #define SCSI_DEBUG_OPT_TIMEOUT 4
94 #define SCSI_DEBUG_OPT_RECOVERED_ERR 8
95 /* When "every_nth" > 0 then modulo "every_nth" commands:
96 * - a no response is simulated if SCSI_DEBUG_OPT_TIMEOUT is set
97 * - a RECOVERED_ERROR is simulated on successful read and write
98 * commands if SCSI_DEBUG_OPT_RECOVERED_ERR is set.
100 * When "every_nth" < 0 then after "- every_nth" commands:
101 * - a no response is simulated if SCSI_DEBUG_OPT_TIMEOUT is set
102 * - a RECOVERED_ERROR is simulated on successful read and write
103 * commands if SCSI_DEBUG_OPT_RECOVERED_ERR is set.
104 * This will continue until some other action occurs (e.g. the user
105 * writing a new value (other than -1 or 1) to every_nth via sysfs).
108 /* when 1==SCSI_DEBUG_OPT_MEDIUM_ERR, a medium error is simulated at this
109 * sector on read commands: */
110 #define OPT_MEDIUM_ERR_ADDR 0x1234 /* that's sector 4660 in decimal */
112 /* If REPORT LUNS has luns >= 256 it can choose "flat space" (value 1)
113 * or "peripheral device" addressing (value 0) */
114 #define SAM2_LUN_ADDRESS_METHOD 0
115 #define SAM2_WLUN_REPORT_LUNS 0xc101
117 static int scsi_debug_add_host = DEF_NUM_HOST;
118 static int scsi_debug_delay = DEF_DELAY;
119 static int scsi_debug_dev_size_mb = DEF_DEV_SIZE_MB;
120 static int scsi_debug_every_nth = DEF_EVERY_NTH;
121 static int scsi_debug_max_luns = DEF_MAX_LUNS;
122 static int scsi_debug_num_parts = DEF_NUM_PARTS;
123 static int scsi_debug_num_tgts = DEF_NUM_TGTS; /* targets per host */
124 static int scsi_debug_opts = DEF_OPTS;
125 static int scsi_debug_scsi_level = DEF_SCSI_LEVEL;
126 static int scsi_debug_ptype = DEF_PTYPE; /* SCSI peripheral type (0==disk) */
127 static int scsi_debug_dsense = DEF_D_SENSE;
128 static int scsi_debug_no_lun_0 = DEF_NO_LUN_0;
129 static int scsi_debug_virtual_gb = DEF_VIRTUAL_GB;
131 static int scsi_debug_cmnd_count = 0;
133 #define DEV_READONLY(TGT) (0)
134 #define DEV_REMOVEABLE(TGT) (0)
136 static unsigned int sdebug_store_size; /* in bytes */
137 static unsigned int sdebug_store_sectors;
138 static sector_t sdebug_capacity; /* in sectors */
140 /* old BIOS stuff, kernel may get rid of them but some mode sense pages
141 may still need them */
142 static int sdebug_heads; /* heads per disk */
143 static int sdebug_cylinders_per; /* cylinders per surface */
144 static int sdebug_sectors_per; /* sectors per cylinder */
146 /* default sector size is 512 bytes, 2**9 bytes */
147 #define POW2_SECT_SIZE 9
148 #define SECT_SIZE (1 << POW2_SECT_SIZE)
149 #define SECT_SIZE_PER(TGT) SECT_SIZE
151 #define SDEBUG_MAX_PARTS 4
153 #define SDEBUG_SENSE_LEN 32
155 struct sdebug_dev_info {
156 struct list_head dev_list;
157 unsigned char sense_buff[SDEBUG_SENSE_LEN]; /* weak nexus */
158 unsigned int channel;
161 struct sdebug_host_info *sdbg_host;
168 struct sdebug_host_info {
169 struct list_head host_list;
170 struct Scsi_Host *shost;
172 struct list_head dev_info_list;
175 #define to_sdebug_host(d) \
176 container_of(d, struct sdebug_host_info, dev)
178 static LIST_HEAD(sdebug_host_list);
179 static DEFINE_SPINLOCK(sdebug_host_list_lock);
181 typedef void (* done_funct_t) (struct scsi_cmnd *);
183 struct sdebug_queued_cmd {
185 struct timer_list cmnd_timer;
186 done_funct_t done_funct;
187 struct scsi_cmnd * a_cmnd;
190 static struct sdebug_queued_cmd queued_arr[SCSI_DEBUG_CANQUEUE];
192 static struct scsi_host_template sdebug_driver_template = {
193 .proc_info = scsi_debug_proc_info,
194 .name = "SCSI DEBUG",
195 .info = scsi_debug_info,
196 .slave_alloc = scsi_debug_slave_alloc,
197 .slave_configure = scsi_debug_slave_configure,
198 .slave_destroy = scsi_debug_slave_destroy,
199 .ioctl = scsi_debug_ioctl,
200 .queuecommand = scsi_debug_queuecommand,
201 .eh_abort_handler = scsi_debug_abort,
202 .eh_bus_reset_handler = scsi_debug_bus_reset,
203 .eh_device_reset_handler = scsi_debug_device_reset,
204 .eh_host_reset_handler = scsi_debug_host_reset,
205 .bios_param = scsi_debug_biosparam,
206 .can_queue = SCSI_DEBUG_CANQUEUE,
210 .max_sectors = 0xffff,
211 .unchecked_isa_dma = 0,
212 .use_clustering = ENABLE_CLUSTERING,
213 .module = THIS_MODULE,
216 static unsigned char * fake_storep; /* ramdisk storage */
218 static int num_aborts = 0;
219 static int num_dev_resets = 0;
220 static int num_bus_resets = 0;
221 static int num_host_resets = 0;
223 static DEFINE_SPINLOCK(queued_arr_lock);
224 static DEFINE_RWLOCK(atomic_rw);
226 static char sdebug_proc_name[] = "scsi_debug";
228 static int sdebug_driver_probe(struct device *);
229 static int sdebug_driver_remove(struct device *);
230 static struct bus_type pseudo_lld_bus;
232 static struct device_driver sdebug_driverfs_driver = {
233 .name = sdebug_proc_name,
234 .bus = &pseudo_lld_bus,
237 static const int check_condition_result =
238 (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
240 static unsigned char ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
242 static unsigned char iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
245 /* function declarations */
246 static int resp_inquiry(struct scsi_cmnd * SCpnt, int target,
247 struct sdebug_dev_info * devip);
248 static int resp_requests(struct scsi_cmnd * SCpnt,
249 struct sdebug_dev_info * devip);
250 static int resp_start_stop(struct scsi_cmnd * scp,
251 struct sdebug_dev_info * devip);
252 static int resp_readcap(struct scsi_cmnd * SCpnt,
253 struct sdebug_dev_info * devip);
254 static int resp_readcap16(struct scsi_cmnd * SCpnt,
255 struct sdebug_dev_info * devip);
256 static int resp_mode_sense(struct scsi_cmnd * scp, int target,
257 struct sdebug_dev_info * devip);
258 static int resp_mode_select(struct scsi_cmnd * scp, int mselect6,
259 struct sdebug_dev_info * devip);
260 static int resp_log_sense(struct scsi_cmnd * scp,
261 struct sdebug_dev_info * devip);
262 static int resp_read(struct scsi_cmnd * SCpnt, unsigned long long lba,
263 unsigned int num, struct sdebug_dev_info * devip);
264 static int resp_write(struct scsi_cmnd * SCpnt, unsigned long long lba,
265 unsigned int num, struct sdebug_dev_info * devip);
266 static int resp_report_luns(struct scsi_cmnd * SCpnt,
267 struct sdebug_dev_info * devip);
268 static int fill_from_dev_buffer(struct scsi_cmnd * scp, unsigned char * arr,
270 static int fetch_to_dev_buffer(struct scsi_cmnd * scp, unsigned char * arr,
272 static void timer_intr_handler(unsigned long);
273 static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev);
274 static void mk_sense_buffer(struct sdebug_dev_info * devip, int key,
276 static int check_readiness(struct scsi_cmnd * SCpnt, int reset_only,
277 struct sdebug_dev_info * devip);
278 static int schedule_resp(struct scsi_cmnd * cmnd,
279 struct sdebug_dev_info * devip,
280 done_funct_t done, int scsi_result, int delta_jiff);
281 static void __init sdebug_build_parts(unsigned char * ramp);
282 static void __init init_all_queued(void);
283 static void stop_all_queued(void);
284 static int stop_queued_cmnd(struct scsi_cmnd * cmnd);
285 static int inquiry_evpd_83(unsigned char * arr, int target_dev_id,
286 int dev_id_num, const char * dev_id_str,
288 static int inquiry_evpd_88(unsigned char * arr, int target_dev_id);
289 static int do_create_driverfs_files(void);
290 static void do_remove_driverfs_files(void);
292 static int sdebug_add_adapter(void);
293 static void sdebug_remove_adapter(void);
294 static void sdebug_max_tgts_luns(void);
296 static struct device pseudo_primary;
297 static struct bus_type pseudo_lld_bus;
301 int scsi_debug_queuecommand(struct scsi_cmnd * SCpnt, done_funct_t done)
303 unsigned char *cmd = (unsigned char *) SCpnt->cmnd;
306 unsigned long long lba;
308 int target = SCpnt->device->id;
309 struct sdebug_dev_info * devip = NULL;
310 int inj_recovered = 0;
311 int delay_override = 0;
314 return 0; /* assume mid level reprocessing command */
317 if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) && cmd) {
318 printk(KERN_INFO "scsi_debug: cmd ");
319 for (k = 0, len = SCpnt->cmd_len; k < len; ++k)
320 printk("%02x ", (int)cmd[k]);
323 if(target == sdebug_driver_template.this_id) {
324 printk(KERN_INFO "scsi_debug: initiator's id used as "
326 return schedule_resp(SCpnt, NULL, done,
327 DID_NO_CONNECT << 16, 0);
330 if ((SCpnt->device->lun >= scsi_debug_max_luns) &&
331 (SCpnt->device->lun != SAM2_WLUN_REPORT_LUNS))
332 return schedule_resp(SCpnt, NULL, done,
333 DID_NO_CONNECT << 16, 0);
334 devip = devInfoReg(SCpnt->device);
336 return schedule_resp(SCpnt, NULL, done,
337 DID_NO_CONNECT << 16, 0);
339 if ((scsi_debug_every_nth != 0) &&
340 (++scsi_debug_cmnd_count >= abs(scsi_debug_every_nth))) {
341 scsi_debug_cmnd_count = 0;
342 if (scsi_debug_every_nth < -1)
343 scsi_debug_every_nth = -1;
344 if (SCSI_DEBUG_OPT_TIMEOUT & scsi_debug_opts)
345 return 0; /* ignore command causing timeout */
346 else if (SCSI_DEBUG_OPT_RECOVERED_ERR & scsi_debug_opts)
347 inj_recovered = 1; /* to reads and writes below */
354 case TEST_UNIT_READY:
356 break; /* only allowable wlun commands */
358 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
359 printk(KERN_INFO "scsi_debug: Opcode: 0x%x "
360 "not supported for wlun\n", *cmd);
361 mk_sense_buffer(devip, ILLEGAL_REQUEST,
363 errsts = check_condition_result;
364 return schedule_resp(SCpnt, devip, done, errsts,
370 case INQUIRY: /* mandatory, ignore unit attention */
372 errsts = resp_inquiry(SCpnt, target, devip);
374 case REQUEST_SENSE: /* mandatory, ignore unit attention */
376 errsts = resp_requests(SCpnt, devip);
378 case REZERO_UNIT: /* actually this is REWIND for SSC */
380 errsts = resp_start_stop(SCpnt, devip);
382 case ALLOW_MEDIUM_REMOVAL:
383 if ((errsts = check_readiness(SCpnt, 1, devip)))
385 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
386 printk(KERN_INFO "scsi_debug: Medium removal %s\n",
387 cmd[4] ? "inhibited" : "enabled");
389 case SEND_DIAGNOSTIC: /* mandatory */
390 errsts = check_readiness(SCpnt, 1, devip);
392 case TEST_UNIT_READY: /* mandatory */
394 errsts = check_readiness(SCpnt, 0, devip);
397 errsts = check_readiness(SCpnt, 1, devip);
400 errsts = check_readiness(SCpnt, 1, devip);
403 errsts = check_readiness(SCpnt, 1, devip);
406 errsts = check_readiness(SCpnt, 1, devip);
409 errsts = resp_readcap(SCpnt, devip);
411 case SERVICE_ACTION_IN:
412 if (SAI_READ_CAPACITY_16 != cmd[1]) {
413 mk_sense_buffer(devip, ILLEGAL_REQUEST,
415 errsts = check_condition_result;
418 errsts = resp_readcap16(SCpnt, devip);
424 if ((errsts = check_readiness(SCpnt, 0, devip)))
426 if ((*cmd) == READ_16) {
427 for (lba = 0, j = 0; j < 8; ++j) {
432 num = cmd[13] + (cmd[12] << 8) +
433 (cmd[11] << 16) + (cmd[10] << 24);
434 } else if ((*cmd) == READ_12) {
435 lba = cmd[5] + (cmd[4] << 8) +
436 (cmd[3] << 16) + (cmd[2] << 24);
437 num = cmd[9] + (cmd[8] << 8) +
438 (cmd[7] << 16) + (cmd[6] << 24);
439 } else if ((*cmd) == READ_10) {
440 lba = cmd[5] + (cmd[4] << 8) +
441 (cmd[3] << 16) + (cmd[2] << 24);
442 num = cmd[8] + (cmd[7] << 8);
443 } else { /* READ (6) */
444 lba = cmd[3] + (cmd[2] << 8) +
445 ((cmd[1] & 0x1f) << 16);
446 num = (0 == cmd[4]) ? 256 : cmd[4];
448 errsts = resp_read(SCpnt, lba, num, devip);
449 if (inj_recovered && (0 == errsts)) {
450 mk_sense_buffer(devip, RECOVERED_ERROR,
451 THRESHOLD_EXCEEDED, 0);
452 errsts = check_condition_result;
455 case REPORT_LUNS: /* mandatory, ignore unit attention */
457 errsts = resp_report_luns(SCpnt, devip);
459 case VERIFY: /* 10 byte SBC-2 command */
460 errsts = check_readiness(SCpnt, 0, devip);
466 if ((errsts = check_readiness(SCpnt, 0, devip)))
468 if ((*cmd) == WRITE_16) {
469 for (lba = 0, j = 0; j < 8; ++j) {
474 num = cmd[13] + (cmd[12] << 8) +
475 (cmd[11] << 16) + (cmd[10] << 24);
476 } else if ((*cmd) == WRITE_12) {
477 lba = cmd[5] + (cmd[4] << 8) +
478 (cmd[3] << 16) + (cmd[2] << 24);
479 num = cmd[9] + (cmd[8] << 8) +
480 (cmd[7] << 16) + (cmd[6] << 24);
481 } else if ((*cmd) == WRITE_10) {
482 lba = cmd[5] + (cmd[4] << 8) +
483 (cmd[3] << 16) + (cmd[2] << 24);
484 num = cmd[8] + (cmd[7] << 8);
485 } else { /* WRITE (6) */
486 lba = cmd[3] + (cmd[2] << 8) +
487 ((cmd[1] & 0x1f) << 16);
488 num = (0 == cmd[4]) ? 256 : cmd[4];
490 errsts = resp_write(SCpnt, lba, num, devip);
491 if (inj_recovered && (0 == errsts)) {
492 mk_sense_buffer(devip, RECOVERED_ERROR,
493 THRESHOLD_EXCEEDED, 0);
494 errsts = check_condition_result;
499 errsts = resp_mode_sense(SCpnt, target, devip);
502 errsts = resp_mode_select(SCpnt, 1, devip);
505 errsts = resp_mode_select(SCpnt, 0, devip);
508 errsts = resp_log_sense(SCpnt, devip);
510 case SYNCHRONIZE_CACHE:
512 errsts = check_readiness(SCpnt, 0, devip);
515 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
516 printk(KERN_INFO "scsi_debug: Opcode: 0x%x not "
517 "supported\n", *cmd);
518 if ((errsts = check_readiness(SCpnt, 1, devip)))
519 break; /* Unit attention takes precedence */
520 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_OPCODE, 0);
521 errsts = check_condition_result;
524 return schedule_resp(SCpnt, devip, done, errsts,
525 (delay_override ? 0 : scsi_debug_delay));
528 static int scsi_debug_ioctl(struct scsi_device *dev, int cmd, void __user *arg)
530 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
531 printk(KERN_INFO "scsi_debug: ioctl: cmd=0x%x\n", cmd);
534 /* return -ENOTTY; // correct return but upsets fdisk */
537 static int check_readiness(struct scsi_cmnd * SCpnt, int reset_only,
538 struct sdebug_dev_info * devip)
541 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
542 printk(KERN_INFO "scsi_debug: Reporting Unit "
543 "attention: power on reset\n");
545 mk_sense_buffer(devip, UNIT_ATTENTION, POWERON_RESET, 0);
546 return check_condition_result;
548 if ((0 == reset_only) && devip->stopped) {
549 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
550 printk(KERN_INFO "scsi_debug: Reporting Not "
551 "ready: initializing command required\n");
552 mk_sense_buffer(devip, NOT_READY, LOGICAL_UNIT_NOT_READY,
554 return check_condition_result;
559 /* Returns 0 if ok else (DID_ERROR << 16). Sets scp->resid . */
560 static int fill_from_dev_buffer(struct scsi_cmnd * scp, unsigned char * arr,
563 int k, req_len, act_len, len, active;
566 struct scatterlist * sgpnt;
568 if (0 == scp->request_bufflen)
570 if (NULL == scp->request_buffer)
571 return (DID_ERROR << 16);
572 if (! ((scp->sc_data_direction == DMA_BIDIRECTIONAL) ||
573 (scp->sc_data_direction == DMA_FROM_DEVICE)))
574 return (DID_ERROR << 16);
575 if (0 == scp->use_sg) {
576 req_len = scp->request_bufflen;
577 act_len = (req_len < arr_len) ? req_len : arr_len;
578 memcpy(scp->request_buffer, arr, act_len);
580 scp->resid -= act_len;
582 scp->resid = req_len - act_len;
585 sgpnt = (struct scatterlist *)scp->request_buffer;
587 for (k = 0, req_len = 0, act_len = 0; k < scp->use_sg; ++k, ++sgpnt) {
589 kaddr = (unsigned char *)
590 kmap_atomic(sgpnt->page, KM_USER0);
592 return (DID_ERROR << 16);
593 kaddr_off = (unsigned char *)kaddr + sgpnt->offset;
595 if ((req_len + len) > arr_len) {
597 len = arr_len - req_len;
599 memcpy(kaddr_off, arr + req_len, len);
600 kunmap_atomic(kaddr, KM_USER0);
603 req_len += sgpnt->length;
606 scp->resid -= act_len;
608 scp->resid = req_len - act_len;
612 /* Returns number of bytes fetched into 'arr' or -1 if error. */
613 static int fetch_to_dev_buffer(struct scsi_cmnd * scp, unsigned char * arr,
616 int k, req_len, len, fin;
619 struct scatterlist * sgpnt;
621 if (0 == scp->request_bufflen)
623 if (NULL == scp->request_buffer)
625 if (! ((scp->sc_data_direction == DMA_BIDIRECTIONAL) ||
626 (scp->sc_data_direction == DMA_TO_DEVICE)))
628 if (0 == scp->use_sg) {
629 req_len = scp->request_bufflen;
630 len = (req_len < max_arr_len) ? req_len : max_arr_len;
631 memcpy(arr, scp->request_buffer, len);
634 sgpnt = (struct scatterlist *)scp->request_buffer;
635 for (k = 0, req_len = 0, fin = 0; k < scp->use_sg; ++k, ++sgpnt) {
636 kaddr = (unsigned char *)kmap_atomic(sgpnt->page, KM_USER0);
639 kaddr_off = (unsigned char *)kaddr + sgpnt->offset;
641 if ((req_len + len) > max_arr_len) {
642 len = max_arr_len - req_len;
645 memcpy(arr + req_len, kaddr_off, len);
646 kunmap_atomic(kaddr, KM_USER0);
648 return req_len + len;
649 req_len += sgpnt->length;
655 static const char * inq_vendor_id = "Linux ";
656 static const char * inq_product_id = "scsi_debug ";
657 static const char * inq_product_rev = "0004";
659 static int inquiry_evpd_83(unsigned char * arr, int target_dev_id,
660 int dev_id_num, const char * dev_id_str,
666 port_a = target_dev_id + 1;
667 /* T10 vendor identifier field format (faked) */
668 arr[0] = 0x2; /* ASCII */
671 memcpy(&arr[4], inq_vendor_id, 8);
672 memcpy(&arr[12], inq_product_id, 16);
673 memcpy(&arr[28], dev_id_str, dev_id_str_len);
674 num = 8 + 16 + dev_id_str_len;
677 if (dev_id_num >= 0) {
678 /* NAA-5, Logical unit identifier (binary) */
679 arr[num++] = 0x1; /* binary (not necessarily sas) */
680 arr[num++] = 0x3; /* PIV=0, lu, naa */
683 arr[num++] = 0x53; /* naa-5 ieee company id=0x333333 (fake) */
687 arr[num++] = (dev_id_num >> 24);
688 arr[num++] = (dev_id_num >> 16) & 0xff;
689 arr[num++] = (dev_id_num >> 8) & 0xff;
690 arr[num++] = dev_id_num & 0xff;
691 /* Target relative port number */
692 arr[num++] = 0x61; /* proto=sas, binary */
693 arr[num++] = 0x94; /* PIV=1, target port, rel port */
694 arr[num++] = 0x0; /* reserved */
695 arr[num++] = 0x4; /* length */
696 arr[num++] = 0x0; /* reserved */
697 arr[num++] = 0x0; /* reserved */
699 arr[num++] = 0x1; /* relative port A */
701 /* NAA-5, Target port identifier */
702 arr[num++] = 0x61; /* proto=sas, binary */
703 arr[num++] = 0x93; /* piv=1, target port, naa */
706 arr[num++] = 0x52; /* naa-5, company id=0x222222 (fake) */
710 arr[num++] = (port_a >> 24);
711 arr[num++] = (port_a >> 16) & 0xff;
712 arr[num++] = (port_a >> 8) & 0xff;
713 arr[num++] = port_a & 0xff;
714 /* NAA-5, Target device identifier */
715 arr[num++] = 0x61; /* proto=sas, binary */
716 arr[num++] = 0xa3; /* piv=1, target device, naa */
719 arr[num++] = 0x52; /* naa-5, company id=0x222222 (fake) */
723 arr[num++] = (target_dev_id >> 24);
724 arr[num++] = (target_dev_id >> 16) & 0xff;
725 arr[num++] = (target_dev_id >> 8) & 0xff;
726 arr[num++] = target_dev_id & 0xff;
727 /* SCSI name string: Target device identifier */
728 arr[num++] = 0x63; /* proto=sas, UTF-8 */
729 arr[num++] = 0xa8; /* piv=1, target device, SCSI name string */
732 memcpy(arr + num, "naa.52222220", 12);
734 snprintf(b, sizeof(b), "%08X", target_dev_id);
735 memcpy(arr + num, b, 8);
737 memset(arr + num, 0, 4);
743 static unsigned char vpd84_data[] = {
744 /* from 4th byte */ 0x22,0x22,0x22,0x0,0xbb,0x0,
745 0x22,0x22,0x22,0x0,0xbb,0x1,
746 0x22,0x22,0x22,0x0,0xbb,0x2,
749 static int inquiry_evpd_84(unsigned char * arr)
751 memcpy(arr, vpd84_data, sizeof(vpd84_data));
752 return sizeof(vpd84_data);
755 static int inquiry_evpd_85(unsigned char * arr)
758 const char * na1 = "https://www.kernel.org/config";
759 const char * na2 = "http://www.kernel.org/log";
762 arr[num++] = 0x1; /* lu, storage config */
763 arr[num++] = 0x0; /* reserved */
768 plen = ((plen / 4) + 1) * 4;
769 arr[num++] = plen; /* length, null termianted, padded */
770 memcpy(arr + num, na1, olen);
771 memset(arr + num + olen, 0, plen - olen);
774 arr[num++] = 0x4; /* lu, logging */
775 arr[num++] = 0x0; /* reserved */
780 plen = ((plen / 4) + 1) * 4;
781 arr[num++] = plen; /* length, null terminated, padded */
782 memcpy(arr + num, na2, olen);
783 memset(arr + num + olen, 0, plen - olen);
789 /* SCSI ports VPD page */
790 static int inquiry_evpd_88(unsigned char * arr, int target_dev_id)
795 port_a = target_dev_id + 1;
797 arr[num++] = 0x0; /* reserved */
798 arr[num++] = 0x0; /* reserved */
800 arr[num++] = 0x1; /* relative port 1 (primary) */
801 memset(arr + num, 0, 6);
804 arr[num++] = 12; /* length tp descriptor */
805 /* naa-5 target port identifier (A) */
806 arr[num++] = 0x61; /* proto=sas, binary */
807 arr[num++] = 0x93; /* PIV=1, target port, NAA */
808 arr[num++] = 0x0; /* reserved */
809 arr[num++] = 0x8; /* length */
810 arr[num++] = 0x52; /* NAA-5, company_id=0x222222 (fake) */
814 arr[num++] = (port_a >> 24);
815 arr[num++] = (port_a >> 16) & 0xff;
816 arr[num++] = (port_a >> 8) & 0xff;
817 arr[num++] = port_a & 0xff;
819 arr[num++] = 0x0; /* reserved */
820 arr[num++] = 0x0; /* reserved */
822 arr[num++] = 0x2; /* relative port 2 (secondary) */
823 memset(arr + num, 0, 6);
826 arr[num++] = 12; /* length tp descriptor */
827 /* naa-5 target port identifier (B) */
828 arr[num++] = 0x61; /* proto=sas, binary */
829 arr[num++] = 0x93; /* PIV=1, target port, NAA */
830 arr[num++] = 0x0; /* reserved */
831 arr[num++] = 0x8; /* length */
832 arr[num++] = 0x52; /* NAA-5, company_id=0x222222 (fake) */
836 arr[num++] = (port_b >> 24);
837 arr[num++] = (port_b >> 16) & 0xff;
838 arr[num++] = (port_b >> 8) & 0xff;
839 arr[num++] = port_b & 0xff;
845 static unsigned char vpd89_data[] = {
846 /* from 4th byte */ 0,0,0,0,
847 'l','i','n','u','x',' ',' ',' ',
848 'S','A','T',' ','s','c','s','i','_','d','e','b','u','g',' ',' ',
850 0x34,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
852 0x5a,0xc,0xff,0x3f,0x37,0xc8,0x10,0,0,0,0,0,0x3f,0,0,0,
853 0,0,0,0,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x20,0x20,0x20,0x20,
854 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0,0,0,0x40,0x4,0,0x2e,0x33,
855 0x38,0x31,0x20,0x20,0x20,0x20,0x54,0x53,0x38,0x33,0x30,0x30,0x33,0x31,
857 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
859 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
861 0,0,0,0x2f,0,0,0,0x2,0,0x2,0x7,0,0xff,0xff,0x1,0,
862 0x3f,0,0xc1,0xff,0x3e,0,0x10,0x1,0xb0,0xf8,0x50,0x9,0,0,0x7,0,
863 0x3,0,0x78,0,0x78,0,0xf0,0,0x78,0,0,0,0,0,0,0,
864 0,0,0,0,0,0,0,0,0x2,0,0,0,0,0,0,0,
865 0x7e,0,0x1b,0,0x6b,0x34,0x1,0x7d,0x3,0x40,0x69,0x34,0x1,0x3c,0x3,0x40,
866 0x7f,0x40,0,0,0,0,0xfe,0xfe,0,0,0,0,0,0xfe,0,0,
867 0,0,0,0,0,0,0,0,0xb0,0xf8,0x50,0x9,0,0,0,0,
868 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
869 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
870 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
871 0x1,0,0xb0,0xf8,0x50,0x9,0xb0,0xf8,0x50,0x9,0x20,0x20,0x2,0,0xb6,0x42,
872 0,0x80,0x8a,0,0x6,0x3c,0xa,0x3c,0xff,0xff,0xc6,0x7,0,0x1,0,0x8,
873 0xf0,0xf,0,0x10,0x2,0,0x30,0,0,0,0,0,0,0,0x6,0xfe,
874 0,0,0x2,0,0x50,0,0x8a,0,0x4f,0x95,0,0,0x21,0,0xb,0,
875 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
876 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
877 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
878 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
879 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
880 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
881 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
882 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
883 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
884 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
885 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
886 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa5,0x51,
889 static int inquiry_evpd_89(unsigned char * arr)
891 memcpy(arr, vpd89_data, sizeof(vpd89_data));
892 return sizeof(vpd89_data);
896 static unsigned char vpdb0_data[] = {
897 /* from 4th byte */ 0,0,0,4,
902 static int inquiry_evpd_b0(unsigned char * arr)
904 memcpy(arr, vpdb0_data, sizeof(vpdb0_data));
905 if (sdebug_store_sectors > 0x400) {
906 arr[4] = (sdebug_store_sectors >> 24) & 0xff;
907 arr[5] = (sdebug_store_sectors >> 16) & 0xff;
908 arr[6] = (sdebug_store_sectors >> 8) & 0xff;
909 arr[7] = sdebug_store_sectors & 0xff;
911 return sizeof(vpdb0_data);
915 #define SDEBUG_LONG_INQ_SZ 96
916 #define SDEBUG_MAX_INQ_ARR_SZ 584
918 static int resp_inquiry(struct scsi_cmnd * scp, int target,
919 struct sdebug_dev_info * devip)
921 unsigned char pq_pdt;
922 unsigned char arr[SDEBUG_MAX_INQ_ARR_SZ];
923 unsigned char *cmd = (unsigned char *)scp->cmnd;
926 alloc_len = (cmd[3] << 8) + cmd[4];
927 memset(arr, 0, SDEBUG_MAX_INQ_ARR_SZ);
929 pq_pdt = 0x1e; /* present, wlun */
930 else if (scsi_debug_no_lun_0 && (0 == devip->lun))
931 pq_pdt = 0x7f; /* not present, no device type */
933 pq_pdt = (scsi_debug_ptype & 0x1f);
935 if (0x2 & cmd[1]) { /* CMDDT bit set */
936 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
938 return check_condition_result;
939 } else if (0x1 & cmd[1]) { /* EVPD bit set */
940 int lu_id_num, target_dev_id, len;
942 int host_no = devip->sdbg_host->shost->host_no;
944 lu_id_num = devip->wlun ? -1 : (((host_no + 1) * 2000) +
945 (devip->target * 1000) + devip->lun);
946 target_dev_id = ((host_no + 1) * 2000) +
947 (devip->target * 1000) - 3;
948 len = scnprintf(lu_id_str, 6, "%d", lu_id_num);
949 if (0 == cmd[2]) { /* supported vital product data pages */
950 arr[1] = cmd[2]; /*sanity */
952 arr[n++] = 0x0; /* this page */
953 arr[n++] = 0x80; /* unit serial number */
954 arr[n++] = 0x83; /* device identification */
955 arr[n++] = 0x84; /* software interface ident. */
956 arr[n++] = 0x85; /* management network addresses */
957 arr[n++] = 0x86; /* extended inquiry */
958 arr[n++] = 0x87; /* mode page policy */
959 arr[n++] = 0x88; /* SCSI ports */
960 arr[n++] = 0x89; /* ATA information */
961 arr[n++] = 0xb0; /* Block limits (SBC) */
962 arr[3] = n - 4; /* number of supported VPD pages */
963 } else if (0x80 == cmd[2]) { /* unit serial number */
964 arr[1] = cmd[2]; /*sanity */
966 memcpy(&arr[4], lu_id_str, len);
967 } else if (0x83 == cmd[2]) { /* device identification */
968 arr[1] = cmd[2]; /*sanity */
969 arr[3] = inquiry_evpd_83(&arr[4], target_dev_id,
970 lu_id_num, lu_id_str, len);
971 } else if (0x84 == cmd[2]) { /* Software interface ident. */
972 arr[1] = cmd[2]; /*sanity */
973 arr[3] = inquiry_evpd_84(&arr[4]);
974 } else if (0x85 == cmd[2]) { /* Management network addresses */
975 arr[1] = cmd[2]; /*sanity */
976 arr[3] = inquiry_evpd_85(&arr[4]);
977 } else if (0x86 == cmd[2]) { /* extended inquiry */
978 arr[1] = cmd[2]; /*sanity */
979 arr[3] = 0x3c; /* number of following entries */
980 arr[4] = 0x0; /* no protection stuff */
981 arr[5] = 0x7; /* head of q, ordered + simple q's */
982 } else if (0x87 == cmd[2]) { /* mode page policy */
983 arr[1] = cmd[2]; /*sanity */
984 arr[3] = 0x8; /* number of following entries */
985 arr[4] = 0x2; /* disconnect-reconnect mp */
986 arr[6] = 0x80; /* mlus, shared */
987 arr[8] = 0x18; /* protocol specific lu */
988 arr[10] = 0x82; /* mlus, per initiator port */
989 } else if (0x88 == cmd[2]) { /* SCSI Ports */
990 arr[1] = cmd[2]; /*sanity */
991 arr[3] = inquiry_evpd_88(&arr[4], target_dev_id);
992 } else if (0x89 == cmd[2]) { /* ATA information */
993 arr[1] = cmd[2]; /*sanity */
994 n = inquiry_evpd_89(&arr[4]);
997 } else if (0xb0 == cmd[2]) { /* Block limits (SBC) */
998 arr[1] = cmd[2]; /*sanity */
999 arr[3] = inquiry_evpd_b0(&arr[4]);
1001 /* Illegal request, invalid field in cdb */
1002 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1003 INVALID_FIELD_IN_CDB, 0);
1004 return check_condition_result;
1006 len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len);
1007 return fill_from_dev_buffer(scp, arr,
1008 min(len, SDEBUG_MAX_INQ_ARR_SZ));
1010 /* drops through here for a standard inquiry */
1011 arr[1] = DEV_REMOVEABLE(target) ? 0x80 : 0; /* Removable disk */
1012 arr[2] = scsi_debug_scsi_level;
1013 arr[3] = 2; /* response_data_format==2 */
1014 arr[4] = SDEBUG_LONG_INQ_SZ - 5;
1015 arr[6] = 0x10; /* claim: MultiP */
1016 /* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */
1017 arr[7] = 0xa; /* claim: LINKED + CMDQUE */
1018 memcpy(&arr[8], inq_vendor_id, 8);
1019 memcpy(&arr[16], inq_product_id, 16);
1020 memcpy(&arr[32], inq_product_rev, 4);
1021 /* version descriptors (2 bytes each) follow */
1022 arr[58] = 0x0; arr[59] = 0x77; /* SAM-3 ANSI */
1023 arr[60] = 0x3; arr[61] = 0x14; /* SPC-3 ANSI */
1025 if (scsi_debug_ptype == 0) {
1026 arr[n++] = 0x3; arr[n++] = 0x3d; /* SBC-2 ANSI */
1027 } else if (scsi_debug_ptype == 1) {
1028 arr[n++] = 0x3; arr[n++] = 0x60; /* SSC-2 no version */
1030 arr[n++] = 0xc; arr[n++] = 0xf; /* SAS-1.1 rev 10 */
1031 return fill_from_dev_buffer(scp, arr,
1032 min(alloc_len, SDEBUG_LONG_INQ_SZ));
1035 static int resp_requests(struct scsi_cmnd * scp,
1036 struct sdebug_dev_info * devip)
1038 unsigned char * sbuff;
1039 unsigned char *cmd = (unsigned char *)scp->cmnd;
1040 unsigned char arr[SDEBUG_SENSE_LEN];
1044 memset(arr, 0, sizeof(arr));
1045 if (devip->reset == 1)
1046 mk_sense_buffer(devip, 0, NO_ADDITIONAL_SENSE, 0);
1047 want_dsense = !!(cmd[1] & 1) || scsi_debug_dsense;
1048 sbuff = devip->sense_buff;
1049 if ((iec_m_pg[2] & 0x4) && (6 == (iec_m_pg[3] & 0xf))) {
1052 arr[1] = 0x0; /* NO_SENSE in sense_key */
1053 arr[2] = THRESHOLD_EXCEEDED;
1054 arr[3] = 0xff; /* TEST set and MRIE==6 */
1057 arr[2] = 0x0; /* NO_SENSE in sense_key */
1058 arr[7] = 0xa; /* 18 byte sense buffer */
1059 arr[12] = THRESHOLD_EXCEEDED;
1060 arr[13] = 0xff; /* TEST set and MRIE==6 */
1062 } else if (devip->stopped) {
1065 arr[1] = 0x0; /* NO_SENSE in sense_key */
1066 arr[2] = LOW_POWER_COND_ON;
1067 arr[3] = 0x0; /* TEST set and MRIE==6 */
1070 arr[2] = 0x0; /* NO_SENSE in sense_key */
1071 arr[7] = 0xa; /* 18 byte sense buffer */
1072 arr[12] = LOW_POWER_COND_ON;
1073 arr[13] = 0x0; /* TEST set and MRIE==6 */
1076 memcpy(arr, sbuff, SDEBUG_SENSE_LEN);
1077 if ((cmd[1] & 1) && (! scsi_debug_dsense)) {
1078 /* DESC bit set and sense_buff in fixed format */
1079 memset(arr, 0, sizeof(arr));
1081 arr[1] = sbuff[2]; /* sense key */
1082 arr[2] = sbuff[12]; /* asc */
1083 arr[3] = sbuff[13]; /* ascq */
1087 mk_sense_buffer(devip, 0, NO_ADDITIONAL_SENSE, 0);
1088 return fill_from_dev_buffer(scp, arr, len);
1091 static int resp_start_stop(struct scsi_cmnd * scp,
1092 struct sdebug_dev_info * devip)
1094 unsigned char *cmd = (unsigned char *)scp->cmnd;
1095 int power_cond, errsts, start;
1097 if ((errsts = check_readiness(scp, 1, devip)))
1099 power_cond = (cmd[4] & 0xf0) >> 4;
1101 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1103 return check_condition_result;
1106 if (start == devip->stopped)
1107 devip->stopped = !start;
1111 #define SDEBUG_READCAP_ARR_SZ 8
1112 static int resp_readcap(struct scsi_cmnd * scp,
1113 struct sdebug_dev_info * devip)
1115 unsigned char arr[SDEBUG_READCAP_ARR_SZ];
1119 if ((errsts = check_readiness(scp, 1, devip)))
1121 /* following just in case virtual_gb changed */
1122 if (scsi_debug_virtual_gb > 0) {
1123 sdebug_capacity = 2048 * 1024;
1124 sdebug_capacity *= scsi_debug_virtual_gb;
1126 sdebug_capacity = sdebug_store_sectors;
1127 memset(arr, 0, SDEBUG_READCAP_ARR_SZ);
1128 if (sdebug_capacity < 0xffffffff) {
1129 capac = (unsigned int)sdebug_capacity - 1;
1130 arr[0] = (capac >> 24);
1131 arr[1] = (capac >> 16) & 0xff;
1132 arr[2] = (capac >> 8) & 0xff;
1133 arr[3] = capac & 0xff;
1140 arr[6] = (SECT_SIZE_PER(target) >> 8) & 0xff;
1141 arr[7] = SECT_SIZE_PER(target) & 0xff;
1142 return fill_from_dev_buffer(scp, arr, SDEBUG_READCAP_ARR_SZ);
1145 #define SDEBUG_READCAP16_ARR_SZ 32
1146 static int resp_readcap16(struct scsi_cmnd * scp,
1147 struct sdebug_dev_info * devip)
1149 unsigned char *cmd = (unsigned char *)scp->cmnd;
1150 unsigned char arr[SDEBUG_READCAP16_ARR_SZ];
1151 unsigned long long capac;
1152 int errsts, k, alloc_len;
1154 if ((errsts = check_readiness(scp, 1, devip)))
1156 alloc_len = ((cmd[10] << 24) + (cmd[11] << 16) + (cmd[12] << 8)
1158 /* following just in case virtual_gb changed */
1159 if (scsi_debug_virtual_gb > 0) {
1160 sdebug_capacity = 2048 * 1024;
1161 sdebug_capacity *= scsi_debug_virtual_gb;
1163 sdebug_capacity = sdebug_store_sectors;
1164 memset(arr, 0, SDEBUG_READCAP16_ARR_SZ);
1165 capac = sdebug_capacity - 1;
1166 for (k = 0; k < 8; ++k, capac >>= 8)
1167 arr[7 - k] = capac & 0xff;
1168 arr[8] = (SECT_SIZE_PER(target) >> 24) & 0xff;
1169 arr[9] = (SECT_SIZE_PER(target) >> 16) & 0xff;
1170 arr[10] = (SECT_SIZE_PER(target) >> 8) & 0xff;
1171 arr[11] = SECT_SIZE_PER(target) & 0xff;
1172 return fill_from_dev_buffer(scp, arr,
1173 min(alloc_len, SDEBUG_READCAP16_ARR_SZ));
1176 /* <<Following mode page info copied from ST318451LW>> */
1178 static int resp_err_recov_pg(unsigned char * p, int pcontrol, int target)
1179 { /* Read-Write Error Recovery page for mode_sense */
1180 unsigned char err_recov_pg[] = {0x1, 0xa, 0xc0, 11, 240, 0, 0, 0,
1183 memcpy(p, err_recov_pg, sizeof(err_recov_pg));
1185 memset(p + 2, 0, sizeof(err_recov_pg) - 2);
1186 return sizeof(err_recov_pg);
1189 static int resp_disconnect_pg(unsigned char * p, int pcontrol, int target)
1190 { /* Disconnect-Reconnect page for mode_sense */
1191 unsigned char disconnect_pg[] = {0x2, 0xe, 128, 128, 0, 10, 0, 0,
1192 0, 0, 0, 0, 0, 0, 0, 0};
1194 memcpy(p, disconnect_pg, sizeof(disconnect_pg));
1196 memset(p + 2, 0, sizeof(disconnect_pg) - 2);
1197 return sizeof(disconnect_pg);
1200 static int resp_format_pg(unsigned char * p, int pcontrol, int target)
1201 { /* Format device page for mode_sense */
1202 unsigned char format_pg[] = {0x3, 0x16, 0, 0, 0, 0, 0, 0,
1203 0, 0, 0, 0, 0, 0, 0, 0,
1204 0, 0, 0, 0, 0x40, 0, 0, 0};
1206 memcpy(p, format_pg, sizeof(format_pg));
1207 p[10] = (sdebug_sectors_per >> 8) & 0xff;
1208 p[11] = sdebug_sectors_per & 0xff;
1209 p[12] = (SECT_SIZE >> 8) & 0xff;
1210 p[13] = SECT_SIZE & 0xff;
1211 if (DEV_REMOVEABLE(target))
1212 p[20] |= 0x20; /* should agree with INQUIRY */
1214 memset(p + 2, 0, sizeof(format_pg) - 2);
1215 return sizeof(format_pg);
1218 static int resp_caching_pg(unsigned char * p, int pcontrol, int target)
1219 { /* Caching page for mode_sense */
1220 unsigned char caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
1221 0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0, 0, 0, 0, 0};
1223 memcpy(p, caching_pg, sizeof(caching_pg));
1225 memset(p + 2, 0, sizeof(caching_pg) - 2);
1226 return sizeof(caching_pg);
1229 static int resp_ctrl_m_pg(unsigned char * p, int pcontrol, int target)
1230 { /* Control mode page for mode_sense */
1231 unsigned char ch_ctrl_m_pg[] = {/* 0xa, 10, */ 0x6, 0, 0, 0, 0, 0,
1233 unsigned char d_ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
1236 if (scsi_debug_dsense)
1237 ctrl_m_pg[2] |= 0x4;
1239 ctrl_m_pg[2] &= ~0x4;
1240 memcpy(p, ctrl_m_pg, sizeof(ctrl_m_pg));
1242 memcpy(p + 2, ch_ctrl_m_pg, sizeof(ch_ctrl_m_pg));
1243 else if (2 == pcontrol)
1244 memcpy(p, d_ctrl_m_pg, sizeof(d_ctrl_m_pg));
1245 return sizeof(ctrl_m_pg);
1249 static int resp_iec_m_pg(unsigned char * p, int pcontrol, int target)
1250 { /* Informational Exceptions control mode page for mode_sense */
1251 unsigned char ch_iec_m_pg[] = {/* 0x1c, 0xa, */ 0x4, 0xf, 0, 0, 0, 0,
1253 unsigned char d_iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
1256 memcpy(p, iec_m_pg, sizeof(iec_m_pg));
1258 memcpy(p + 2, ch_iec_m_pg, sizeof(ch_iec_m_pg));
1259 else if (2 == pcontrol)
1260 memcpy(p, d_iec_m_pg, sizeof(d_iec_m_pg));
1261 return sizeof(iec_m_pg);
1264 static int resp_sas_sf_m_pg(unsigned char * p, int pcontrol, int target)
1265 { /* SAS SSP mode page - short format for mode_sense */
1266 unsigned char sas_sf_m_pg[] = {0x19, 0x6,
1267 0x6, 0x0, 0x7, 0xd0, 0x0, 0x0};
1269 memcpy(p, sas_sf_m_pg, sizeof(sas_sf_m_pg));
1271 memset(p + 2, 0, sizeof(sas_sf_m_pg) - 2);
1272 return sizeof(sas_sf_m_pg);
1276 static int resp_sas_pcd_m_spg(unsigned char * p, int pcontrol, int target,
1278 { /* SAS phy control and discover mode page for mode_sense */
1279 unsigned char sas_pcd_m_pg[] = {0x59, 0x1, 0, 0x64, 0, 0x6, 0, 2,
1280 0, 0, 0, 0, 0x10, 0x9, 0x8, 0x0,
1281 0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0,
1282 0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1,
1283 0x2, 0, 0, 0, 0, 0, 0, 0,
1284 0x88, 0x99, 0, 0, 0, 0, 0, 0,
1285 0, 0, 0, 0, 0, 0, 0, 0,
1286 0, 1, 0, 0, 0x10, 0x9, 0x8, 0x0,
1287 0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0,
1288 0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1,
1289 0x3, 0, 0, 0, 0, 0, 0, 0,
1290 0x88, 0x99, 0, 0, 0, 0, 0, 0,
1291 0, 0, 0, 0, 0, 0, 0, 0,
1295 port_a = target_dev_id + 1;
1296 port_b = port_a + 1;
1297 memcpy(p, sas_pcd_m_pg, sizeof(sas_pcd_m_pg));
1298 p[20] = (port_a >> 24);
1299 p[21] = (port_a >> 16) & 0xff;
1300 p[22] = (port_a >> 8) & 0xff;
1301 p[23] = port_a & 0xff;
1302 p[48 + 20] = (port_b >> 24);
1303 p[48 + 21] = (port_b >> 16) & 0xff;
1304 p[48 + 22] = (port_b >> 8) & 0xff;
1305 p[48 + 23] = port_b & 0xff;
1307 memset(p + 4, 0, sizeof(sas_pcd_m_pg) - 4);
1308 return sizeof(sas_pcd_m_pg);
1311 static int resp_sas_sha_m_spg(unsigned char * p, int pcontrol)
1312 { /* SAS SSP shared protocol specific port mode subpage */
1313 unsigned char sas_sha_m_pg[] = {0x59, 0x2, 0, 0xc, 0, 0x6, 0x10, 0,
1314 0, 0, 0, 0, 0, 0, 0, 0,
1317 memcpy(p, sas_sha_m_pg, sizeof(sas_sha_m_pg));
1319 memset(p + 4, 0, sizeof(sas_sha_m_pg) - 4);
1320 return sizeof(sas_sha_m_pg);
1323 #define SDEBUG_MAX_MSENSE_SZ 256
1325 static int resp_mode_sense(struct scsi_cmnd * scp, int target,
1326 struct sdebug_dev_info * devip)
1329 int pcontrol, pcode, subpcode;
1330 unsigned char dev_spec;
1331 int alloc_len, msense_6, offset, len, errsts, target_dev_id;
1333 unsigned char arr[SDEBUG_MAX_MSENSE_SZ];
1334 unsigned char *cmd = (unsigned char *)scp->cmnd;
1336 if ((errsts = check_readiness(scp, 1, devip)))
1339 pcontrol = (cmd[2] & 0xc0) >> 6;
1340 pcode = cmd[2] & 0x3f;
1342 msense_6 = (MODE_SENSE == cmd[0]);
1343 alloc_len = msense_6 ? cmd[4] : ((cmd[7] << 8) | cmd[8]);
1344 memset(arr, 0, SDEBUG_MAX_MSENSE_SZ);
1345 if (0x3 == pcontrol) { /* Saving values not supported */
1346 mk_sense_buffer(devip, ILLEGAL_REQUEST, SAVING_PARAMS_UNSUP,
1348 return check_condition_result;
1350 target_dev_id = ((devip->sdbg_host->shost->host_no + 1) * 2000) +
1351 (devip->target * 1000) - 3;
1352 dev_spec = DEV_READONLY(target) ? 0x80 : 0x0;
1362 if ((subpcode > 0x0) && (subpcode < 0xff) && (0x19 != pcode)) {
1363 /* TODO: Control Extension page */
1364 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1366 return check_condition_result;
1369 case 0x1: /* Read-Write error recovery page, direct access */
1370 len = resp_err_recov_pg(ap, pcontrol, target);
1373 case 0x2: /* Disconnect-Reconnect page, all devices */
1374 len = resp_disconnect_pg(ap, pcontrol, target);
1377 case 0x3: /* Format device page, direct access */
1378 len = resp_format_pg(ap, pcontrol, target);
1381 case 0x8: /* Caching page, direct access */
1382 len = resp_caching_pg(ap, pcontrol, target);
1385 case 0xa: /* Control Mode page, all devices */
1386 len = resp_ctrl_m_pg(ap, pcontrol, target);
1389 case 0x19: /* if spc==1 then sas phy, control+discover */
1390 if ((subpcode > 0x2) && (subpcode < 0xff)) {
1391 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1392 INVALID_FIELD_IN_CDB, 0);
1393 return check_condition_result;
1396 if ((0x0 == subpcode) || (0xff == subpcode))
1397 len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
1398 if ((0x1 == subpcode) || (0xff == subpcode))
1399 len += resp_sas_pcd_m_spg(ap + len, pcontrol, target,
1401 if ((0x2 == subpcode) || (0xff == subpcode))
1402 len += resp_sas_sha_m_spg(ap + len, pcontrol);
1405 case 0x1c: /* Informational Exceptions Mode page, all devices */
1406 len = resp_iec_m_pg(ap, pcontrol, target);
1409 case 0x3f: /* Read all Mode pages */
1410 if ((0 == subpcode) || (0xff == subpcode)) {
1411 len = resp_err_recov_pg(ap, pcontrol, target);
1412 len += resp_disconnect_pg(ap + len, pcontrol, target);
1413 len += resp_format_pg(ap + len, pcontrol, target);
1414 len += resp_caching_pg(ap + len, pcontrol, target);
1415 len += resp_ctrl_m_pg(ap + len, pcontrol, target);
1416 len += resp_sas_sf_m_pg(ap + len, pcontrol, target);
1417 if (0xff == subpcode) {
1418 len += resp_sas_pcd_m_spg(ap + len, pcontrol,
1419 target, target_dev_id);
1420 len += resp_sas_sha_m_spg(ap + len, pcontrol);
1422 len += resp_iec_m_pg(ap + len, pcontrol, target);
1424 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1425 INVALID_FIELD_IN_CDB, 0);
1426 return check_condition_result;
1431 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1433 return check_condition_result;
1436 arr[0] = offset - 1;
1438 arr[0] = ((offset - 2) >> 8) & 0xff;
1439 arr[1] = (offset - 2) & 0xff;
1441 return fill_from_dev_buffer(scp, arr, min(alloc_len, offset));
1444 #define SDEBUG_MAX_MSELECT_SZ 512
1446 static int resp_mode_select(struct scsi_cmnd * scp, int mselect6,
1447 struct sdebug_dev_info * devip)
1449 int pf, sp, ps, md_len, bd_len, off, spf, pg_len;
1450 int param_len, res, errsts, mpage;
1451 unsigned char arr[SDEBUG_MAX_MSELECT_SZ];
1452 unsigned char *cmd = (unsigned char *)scp->cmnd;
1454 if ((errsts = check_readiness(scp, 1, devip)))
1456 memset(arr, 0, sizeof(arr));
1459 param_len = mselect6 ? cmd[4] : ((cmd[7] << 8) + cmd[8]);
1460 if ((0 == pf) || sp || (param_len > SDEBUG_MAX_MSELECT_SZ)) {
1461 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1462 INVALID_FIELD_IN_CDB, 0);
1463 return check_condition_result;
1465 res = fetch_to_dev_buffer(scp, arr, param_len);
1467 return (DID_ERROR << 16);
1468 else if ((res < param_len) &&
1469 (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
1470 printk(KERN_INFO "scsi_debug: mode_select: cdb indicated=%d, "
1471 " IO sent=%d bytes\n", param_len, res);
1472 md_len = mselect6 ? (arr[0] + 1) : ((arr[0] << 8) + arr[1] + 2);
1473 bd_len = mselect6 ? arr[3] : ((arr[6] << 8) + arr[7]);
1474 if ((md_len > 2) || (0 != bd_len)) {
1475 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1476 INVALID_FIELD_IN_PARAM_LIST, 0);
1477 return check_condition_result;
1479 off = bd_len + (mselect6 ? 4 : 8);
1480 mpage = arr[off] & 0x3f;
1481 ps = !!(arr[off] & 0x80);
1483 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1484 INVALID_FIELD_IN_PARAM_LIST, 0);
1485 return check_condition_result;
1487 spf = !!(arr[off] & 0x40);
1488 pg_len = spf ? ((arr[off + 2] << 8) + arr[off + 3] + 4) :
1490 if ((pg_len + off) > param_len) {
1491 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1492 PARAMETER_LIST_LENGTH_ERR, 0);
1493 return check_condition_result;
1496 case 0xa: /* Control Mode page */
1497 if (ctrl_m_pg[1] == arr[off + 1]) {
1498 memcpy(ctrl_m_pg + 2, arr + off + 2,
1499 sizeof(ctrl_m_pg) - 2);
1500 scsi_debug_dsense = !!(ctrl_m_pg[2] & 0x4);
1504 case 0x1c: /* Informational Exceptions Mode page */
1505 if (iec_m_pg[1] == arr[off + 1]) {
1506 memcpy(iec_m_pg + 2, arr + off + 2,
1507 sizeof(iec_m_pg) - 2);
1514 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1515 INVALID_FIELD_IN_PARAM_LIST, 0);
1516 return check_condition_result;
1519 static int resp_temp_l_pg(unsigned char * arr)
1521 unsigned char temp_l_pg[] = {0x0, 0x0, 0x3, 0x2, 0x0, 38,
1522 0x0, 0x1, 0x3, 0x2, 0x0, 65,
1525 memcpy(arr, temp_l_pg, sizeof(temp_l_pg));
1526 return sizeof(temp_l_pg);
1529 static int resp_ie_l_pg(unsigned char * arr)
1531 unsigned char ie_l_pg[] = {0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 38,
1534 memcpy(arr, ie_l_pg, sizeof(ie_l_pg));
1535 if (iec_m_pg[2] & 0x4) { /* TEST bit set */
1536 arr[4] = THRESHOLD_EXCEEDED;
1539 return sizeof(ie_l_pg);
1542 #define SDEBUG_MAX_LSENSE_SZ 512
1544 static int resp_log_sense(struct scsi_cmnd * scp,
1545 struct sdebug_dev_info * devip)
1547 int ppc, sp, pcontrol, pcode, alloc_len, errsts, len, n;
1548 unsigned char arr[SDEBUG_MAX_LSENSE_SZ];
1549 unsigned char *cmd = (unsigned char *)scp->cmnd;
1551 if ((errsts = check_readiness(scp, 1, devip)))
1553 memset(arr, 0, sizeof(arr));
1557 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1558 INVALID_FIELD_IN_CDB, 0);
1559 return check_condition_result;
1561 pcontrol = (cmd[2] & 0xc0) >> 6;
1562 pcode = cmd[2] & 0x3f;
1563 alloc_len = (cmd[7] << 8) + cmd[8];
1566 case 0x0: /* Supported log pages log page */
1568 arr[n++] = 0x0; /* this page */
1569 arr[n++] = 0xd; /* Temperature */
1570 arr[n++] = 0x2f; /* Informational exceptions */
1573 case 0xd: /* Temperature log page */
1574 arr[3] = resp_temp_l_pg(arr + 4);
1576 case 0x2f: /* Informational exceptions log page */
1577 arr[3] = resp_ie_l_pg(arr + 4);
1580 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1581 INVALID_FIELD_IN_CDB, 0);
1582 return check_condition_result;
1584 len = min(((arr[2] << 8) + arr[3]) + 4, alloc_len);
1585 return fill_from_dev_buffer(scp, arr,
1586 min(len, SDEBUG_MAX_INQ_ARR_SZ));
1589 static int resp_read(struct scsi_cmnd * SCpnt, unsigned long long lba,
1590 unsigned int num, struct sdebug_dev_info * devip)
1592 unsigned long iflags;
1593 unsigned int block, from_bottom;
1594 unsigned long long u;
1597 if (lba + num > sdebug_capacity) {
1598 mk_sense_buffer(devip, ILLEGAL_REQUEST, ADDR_OUT_OF_RANGE,
1600 return check_condition_result;
1602 /* transfer length excessive (tie in to block limits VPD page) */
1603 if (num > sdebug_store_sectors) {
1604 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1606 return check_condition_result;
1608 if ((SCSI_DEBUG_OPT_MEDIUM_ERR & scsi_debug_opts) &&
1609 (lba <= OPT_MEDIUM_ERR_ADDR) &&
1610 ((lba + num) > OPT_MEDIUM_ERR_ADDR)) {
1611 /* claim unrecoverable read error */
1612 mk_sense_buffer(devip, MEDIUM_ERROR, UNRECOVERED_READ_ERR,
1614 /* set info field and valid bit for fixed descriptor */
1615 if (0x70 == (devip->sense_buff[0] & 0x7f)) {
1616 devip->sense_buff[0] |= 0x80; /* Valid bit */
1617 ret = OPT_MEDIUM_ERR_ADDR;
1618 devip->sense_buff[3] = (ret >> 24) & 0xff;
1619 devip->sense_buff[4] = (ret >> 16) & 0xff;
1620 devip->sense_buff[5] = (ret >> 8) & 0xff;
1621 devip->sense_buff[6] = ret & 0xff;
1623 return check_condition_result;
1625 read_lock_irqsave(&atomic_rw, iflags);
1626 if ((lba + num) <= sdebug_store_sectors)
1627 ret = fill_from_dev_buffer(SCpnt,
1628 fake_storep + (lba * SECT_SIZE),
1631 /* modulo when one arg is 64 bits needs do_div() */
1633 block = do_div(u, sdebug_store_sectors);
1635 if ((block + num) > sdebug_store_sectors)
1636 from_bottom = (block + num) - sdebug_store_sectors;
1637 ret = fill_from_dev_buffer(SCpnt,
1638 fake_storep + (block * SECT_SIZE),
1639 (num - from_bottom) * SECT_SIZE);
1640 if ((0 == ret) && (from_bottom > 0))
1641 ret = fill_from_dev_buffer(SCpnt, fake_storep,
1642 from_bottom * SECT_SIZE);
1644 read_unlock_irqrestore(&atomic_rw, iflags);
1648 static int resp_write(struct scsi_cmnd * SCpnt, unsigned long long lba,
1649 unsigned int num, struct sdebug_dev_info * devip)
1651 unsigned long iflags;
1652 unsigned int block, to_bottom;
1653 unsigned long long u;
1656 if (lba + num > sdebug_capacity) {
1657 mk_sense_buffer(devip, ILLEGAL_REQUEST, ADDR_OUT_OF_RANGE,
1659 return check_condition_result;
1661 /* transfer length excessive (tie in to block limits VPD page) */
1662 if (num > sdebug_store_sectors) {
1663 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1665 return check_condition_result;
1668 write_lock_irqsave(&atomic_rw, iflags);
1669 if ((lba + num) <= sdebug_store_sectors)
1670 res = fetch_to_dev_buffer(SCpnt,
1671 fake_storep + (lba * SECT_SIZE),
1674 /* modulo when one arg is 64 bits needs do_div() */
1676 block = do_div(u, sdebug_store_sectors);
1678 if ((block + num) > sdebug_store_sectors)
1679 to_bottom = (block + num) - sdebug_store_sectors;
1680 res = fetch_to_dev_buffer(SCpnt,
1681 fake_storep + (block * SECT_SIZE),
1682 (num - to_bottom) * SECT_SIZE);
1683 if ((0 == res) && (to_bottom > 0))
1684 res = fetch_to_dev_buffer(SCpnt, fake_storep,
1685 to_bottom * SECT_SIZE);
1687 write_unlock_irqrestore(&atomic_rw, iflags);
1689 return (DID_ERROR << 16);
1690 else if ((res < (num * SECT_SIZE)) &&
1691 (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts))
1692 printk(KERN_INFO "scsi_debug: write: cdb indicated=%u, "
1693 " IO sent=%d bytes\n", num * SECT_SIZE, res);
1697 #define SDEBUG_RLUN_ARR_SZ 256
1699 static int resp_report_luns(struct scsi_cmnd * scp,
1700 struct sdebug_dev_info * devip)
1702 unsigned int alloc_len;
1703 int lun_cnt, i, upper, num, n, wlun, lun;
1704 unsigned char *cmd = (unsigned char *)scp->cmnd;
1705 int select_report = (int)cmd[2];
1706 struct scsi_lun *one_lun;
1707 unsigned char arr[SDEBUG_RLUN_ARR_SZ];
1708 unsigned char * max_addr;
1710 alloc_len = cmd[9] + (cmd[8] << 8) + (cmd[7] << 16) + (cmd[6] << 24);
1711 if ((alloc_len < 4) || (select_report > 2)) {
1712 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1714 return check_condition_result;
1716 /* can produce response with up to 16k luns (lun 0 to lun 16383) */
1717 memset(arr, 0, SDEBUG_RLUN_ARR_SZ);
1718 lun_cnt = scsi_debug_max_luns;
1719 if (1 == select_report)
1721 else if (scsi_debug_no_lun_0 && (lun_cnt > 0))
1723 wlun = (select_report > 0) ? 1 : 0;
1724 num = lun_cnt + wlun;
1725 arr[2] = ((sizeof(struct scsi_lun) * num) >> 8) & 0xff;
1726 arr[3] = (sizeof(struct scsi_lun) * num) & 0xff;
1727 n = min((int)((SDEBUG_RLUN_ARR_SZ - 8) /
1728 sizeof(struct scsi_lun)), num);
1733 one_lun = (struct scsi_lun *) &arr[8];
1734 max_addr = arr + SDEBUG_RLUN_ARR_SZ;
1735 for (i = 0, lun = (scsi_debug_no_lun_0 ? 1 : 0);
1736 ((i < lun_cnt) && ((unsigned char *)(one_lun + i) < max_addr));
1738 upper = (lun >> 8) & 0x3f;
1740 one_lun[i].scsi_lun[0] =
1741 (upper | (SAM2_LUN_ADDRESS_METHOD << 6));
1742 one_lun[i].scsi_lun[1] = lun & 0xff;
1745 one_lun[i].scsi_lun[0] = (SAM2_WLUN_REPORT_LUNS >> 8) & 0xff;
1746 one_lun[i].scsi_lun[1] = SAM2_WLUN_REPORT_LUNS & 0xff;
1749 alloc_len = (unsigned char *)(one_lun + i) - arr;
1750 return fill_from_dev_buffer(scp, arr,
1751 min((int)alloc_len, SDEBUG_RLUN_ARR_SZ));
1754 /* When timer goes off this function is called. */
1755 static void timer_intr_handler(unsigned long indx)
1757 struct sdebug_queued_cmd * sqcp;
1758 unsigned long iflags;
1760 if (indx >= SCSI_DEBUG_CANQUEUE) {
1761 printk(KERN_ERR "scsi_debug:timer_intr_handler: indx too "
1765 spin_lock_irqsave(&queued_arr_lock, iflags);
1766 sqcp = &queued_arr[(int)indx];
1767 if (! sqcp->in_use) {
1768 printk(KERN_ERR "scsi_debug:timer_intr_handler: Unexpected "
1770 spin_unlock_irqrestore(&queued_arr_lock, iflags);
1774 if (sqcp->done_funct) {
1775 sqcp->a_cmnd->result = sqcp->scsi_result;
1776 sqcp->done_funct(sqcp->a_cmnd); /* callback to mid level */
1778 sqcp->done_funct = NULL;
1779 spin_unlock_irqrestore(&queued_arr_lock, iflags);
1782 static int scsi_debug_slave_alloc(struct scsi_device * sdp)
1784 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1785 printk(KERN_INFO "scsi_debug: slave_alloc <%u %u %u %u>\n",
1786 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
1790 static int scsi_debug_slave_configure(struct scsi_device * sdp)
1792 struct sdebug_dev_info * devip;
1794 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1795 printk(KERN_INFO "scsi_debug: slave_configure <%u %u %u %u>\n",
1796 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
1797 if (sdp->host->max_cmd_len != SCSI_DEBUG_MAX_CMD_LEN)
1798 sdp->host->max_cmd_len = SCSI_DEBUG_MAX_CMD_LEN;
1799 devip = devInfoReg(sdp);
1800 sdp->hostdata = devip;
1801 if (sdp->host->cmd_per_lun)
1802 scsi_adjust_queue_depth(sdp, SDEBUG_TAGGED_QUEUING,
1803 sdp->host->cmd_per_lun);
1804 blk_queue_max_segment_size(sdp->request_queue, 256 * 1024);
1808 static void scsi_debug_slave_destroy(struct scsi_device * sdp)
1810 struct sdebug_dev_info * devip =
1811 (struct sdebug_dev_info *)sdp->hostdata;
1813 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1814 printk(KERN_INFO "scsi_debug: slave_destroy <%u %u %u %u>\n",
1815 sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
1817 /* make this slot avaliable for re-use */
1819 sdp->hostdata = NULL;
1823 static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev)
1825 struct sdebug_host_info * sdbg_host;
1826 struct sdebug_dev_info * open_devip = NULL;
1827 struct sdebug_dev_info * devip =
1828 (struct sdebug_dev_info *)sdev->hostdata;
1832 sdbg_host = *(struct sdebug_host_info **) sdev->host->hostdata;
1834 printk(KERN_ERR "Host info NULL\n");
1837 list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) {
1838 if ((devip->used) && (devip->channel == sdev->channel) &&
1839 (devip->target == sdev->id) &&
1840 (devip->lun == sdev->lun))
1843 if ((!devip->used) && (!open_devip))
1847 if (NULL == open_devip) { /* try and make a new one */
1848 open_devip = kzalloc(sizeof(*open_devip),GFP_KERNEL);
1849 if (NULL == open_devip) {
1850 printk(KERN_ERR "%s: out of memory at line %d\n",
1851 __FUNCTION__, __LINE__);
1854 open_devip->sdbg_host = sdbg_host;
1855 list_add_tail(&open_devip->dev_list,
1856 &sdbg_host->dev_info_list);
1859 open_devip->channel = sdev->channel;
1860 open_devip->target = sdev->id;
1861 open_devip->lun = sdev->lun;
1862 open_devip->sdbg_host = sdbg_host;
1863 open_devip->reset = 1;
1864 open_devip->used = 1;
1865 memset(open_devip->sense_buff, 0, SDEBUG_SENSE_LEN);
1866 if (scsi_debug_dsense)
1867 open_devip->sense_buff[0] = 0x72;
1869 open_devip->sense_buff[0] = 0x70;
1870 open_devip->sense_buff[7] = 0xa;
1872 if (sdev->lun == SAM2_WLUN_REPORT_LUNS)
1873 open_devip->wlun = SAM2_WLUN_REPORT_LUNS & 0xff;
1879 static void mk_sense_buffer(struct sdebug_dev_info * devip, int key,
1882 unsigned char * sbuff;
1884 sbuff = devip->sense_buff;
1885 memset(sbuff, 0, SDEBUG_SENSE_LEN);
1886 if (scsi_debug_dsense) {
1887 sbuff[0] = 0x72; /* descriptor, current */
1892 sbuff[0] = 0x70; /* fixed, current */
1894 sbuff[7] = 0xa; /* implies 18 byte sense buffer */
1898 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1899 printk(KERN_INFO "scsi_debug: [sense_key,asc,ascq]: "
1900 "[0x%x,0x%x,0x%x]\n", key, asc, asq);
1903 static int scsi_debug_abort(struct scsi_cmnd * SCpnt)
1905 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1906 printk(KERN_INFO "scsi_debug: abort\n");
1908 stop_queued_cmnd(SCpnt);
1912 static int scsi_debug_biosparam(struct scsi_device *sdev,
1913 struct block_device * bdev, sector_t capacity, int *info)
1918 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1919 printk(KERN_INFO "scsi_debug: biosparam\n");
1920 buf = scsi_bios_ptable(bdev);
1922 res = scsi_partsize(buf, capacity,
1923 &info[2], &info[0], &info[1]);
1928 info[0] = sdebug_heads;
1929 info[1] = sdebug_sectors_per;
1930 info[2] = sdebug_cylinders_per;
1934 static int scsi_debug_device_reset(struct scsi_cmnd * SCpnt)
1936 struct sdebug_dev_info * devip;
1938 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1939 printk(KERN_INFO "scsi_debug: device_reset\n");
1942 devip = devInfoReg(SCpnt->device);
1949 static int scsi_debug_bus_reset(struct scsi_cmnd * SCpnt)
1951 struct sdebug_host_info *sdbg_host;
1952 struct sdebug_dev_info * dev_info;
1953 struct scsi_device * sdp;
1954 struct Scsi_Host * hp;
1956 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1957 printk(KERN_INFO "scsi_debug: bus_reset\n");
1959 if (SCpnt && ((sdp = SCpnt->device)) && ((hp = sdp->host))) {
1960 sdbg_host = *(struct sdebug_host_info **) hp->hostdata;
1962 list_for_each_entry(dev_info,
1963 &sdbg_host->dev_info_list,
1965 dev_info->reset = 1;
1971 static int scsi_debug_host_reset(struct scsi_cmnd * SCpnt)
1973 struct sdebug_host_info * sdbg_host;
1974 struct sdebug_dev_info * dev_info;
1976 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
1977 printk(KERN_INFO "scsi_debug: host_reset\n");
1979 spin_lock(&sdebug_host_list_lock);
1980 list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
1981 list_for_each_entry(dev_info, &sdbg_host->dev_info_list,
1983 dev_info->reset = 1;
1985 spin_unlock(&sdebug_host_list_lock);
1990 /* Returns 1 if found 'cmnd' and deleted its timer. else returns 0 */
1991 static int stop_queued_cmnd(struct scsi_cmnd * cmnd)
1993 unsigned long iflags;
1995 struct sdebug_queued_cmd * sqcp;
1997 spin_lock_irqsave(&queued_arr_lock, iflags);
1998 for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
1999 sqcp = &queued_arr[k];
2000 if (sqcp->in_use && (cmnd == sqcp->a_cmnd)) {
2001 del_timer_sync(&sqcp->cmnd_timer);
2003 sqcp->a_cmnd = NULL;
2007 spin_unlock_irqrestore(&queued_arr_lock, iflags);
2008 return (k < SCSI_DEBUG_CANQUEUE) ? 1 : 0;
2011 /* Deletes (stops) timers of all queued commands */
2012 static void stop_all_queued(void)
2014 unsigned long iflags;
2016 struct sdebug_queued_cmd * sqcp;
2018 spin_lock_irqsave(&queued_arr_lock, iflags);
2019 for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
2020 sqcp = &queued_arr[k];
2021 if (sqcp->in_use && sqcp->a_cmnd) {
2022 del_timer_sync(&sqcp->cmnd_timer);
2024 sqcp->a_cmnd = NULL;
2027 spin_unlock_irqrestore(&queued_arr_lock, iflags);
2030 /* Initializes timers in queued array */
2031 static void __init init_all_queued(void)
2033 unsigned long iflags;
2035 struct sdebug_queued_cmd * sqcp;
2037 spin_lock_irqsave(&queued_arr_lock, iflags);
2038 for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
2039 sqcp = &queued_arr[k];
2040 init_timer(&sqcp->cmnd_timer);
2042 sqcp->a_cmnd = NULL;
2044 spin_unlock_irqrestore(&queued_arr_lock, iflags);
2047 static void __init sdebug_build_parts(unsigned char * ramp)
2049 struct partition * pp;
2050 int starts[SDEBUG_MAX_PARTS + 2];
2051 int sectors_per_part, num_sectors, k;
2052 int heads_by_sects, start_sec, end_sec;
2054 /* assume partition table already zeroed */
2055 if ((scsi_debug_num_parts < 1) || (sdebug_store_size < 1048576))
2057 if (scsi_debug_num_parts > SDEBUG_MAX_PARTS) {
2058 scsi_debug_num_parts = SDEBUG_MAX_PARTS;
2059 printk(KERN_WARNING "scsi_debug:build_parts: reducing "
2060 "partitions to %d\n", SDEBUG_MAX_PARTS);
2062 num_sectors = (int)sdebug_store_sectors;
2063 sectors_per_part = (num_sectors - sdebug_sectors_per)
2064 / scsi_debug_num_parts;
2065 heads_by_sects = sdebug_heads * sdebug_sectors_per;
2066 starts[0] = sdebug_sectors_per;
2067 for (k = 1; k < scsi_debug_num_parts; ++k)
2068 starts[k] = ((k * sectors_per_part) / heads_by_sects)
2070 starts[scsi_debug_num_parts] = num_sectors;
2071 starts[scsi_debug_num_parts + 1] = 0;
2073 ramp[510] = 0x55; /* magic partition markings */
2075 pp = (struct partition *)(ramp + 0x1be);
2076 for (k = 0; starts[k + 1]; ++k, ++pp) {
2077 start_sec = starts[k];
2078 end_sec = starts[k + 1] - 1;
2081 pp->cyl = start_sec / heads_by_sects;
2082 pp->head = (start_sec - (pp->cyl * heads_by_sects))
2083 / sdebug_sectors_per;
2084 pp->sector = (start_sec % sdebug_sectors_per) + 1;
2086 pp->end_cyl = end_sec / heads_by_sects;
2087 pp->end_head = (end_sec - (pp->end_cyl * heads_by_sects))
2088 / sdebug_sectors_per;
2089 pp->end_sector = (end_sec % sdebug_sectors_per) + 1;
2091 pp->start_sect = start_sec;
2092 pp->nr_sects = end_sec - start_sec + 1;
2093 pp->sys_ind = 0x83; /* plain Linux partition */
2097 static int schedule_resp(struct scsi_cmnd * cmnd,
2098 struct sdebug_dev_info * devip,
2099 done_funct_t done, int scsi_result, int delta_jiff)
2101 if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) && cmnd) {
2103 struct scsi_device * sdp = cmnd->device;
2105 printk(KERN_INFO "scsi_debug: <%u %u %u %u> "
2106 "non-zero result=0x%x\n", sdp->host->host_no,
2107 sdp->channel, sdp->id, sdp->lun, scsi_result);
2110 if (cmnd && devip) {
2111 /* simulate autosense by this driver */
2112 if (SAM_STAT_CHECK_CONDITION == (scsi_result & 0xff))
2113 memcpy(cmnd->sense_buffer, devip->sense_buff,
2114 (SCSI_SENSE_BUFFERSIZE > SDEBUG_SENSE_LEN) ?
2115 SDEBUG_SENSE_LEN : SCSI_SENSE_BUFFERSIZE);
2117 if (delta_jiff <= 0) {
2119 cmnd->result = scsi_result;
2124 unsigned long iflags;
2126 struct sdebug_queued_cmd * sqcp = NULL;
2128 spin_lock_irqsave(&queued_arr_lock, iflags);
2129 for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
2130 sqcp = &queued_arr[k];
2134 if (k >= SCSI_DEBUG_CANQUEUE) {
2135 spin_unlock_irqrestore(&queued_arr_lock, iflags);
2136 printk(KERN_WARNING "scsi_debug: can_queue exceeded\n");
2137 return 1; /* report busy to mid level */
2140 sqcp->a_cmnd = cmnd;
2141 sqcp->scsi_result = scsi_result;
2142 sqcp->done_funct = done;
2143 sqcp->cmnd_timer.function = timer_intr_handler;
2144 sqcp->cmnd_timer.data = k;
2145 sqcp->cmnd_timer.expires = jiffies + delta_jiff;
2146 add_timer(&sqcp->cmnd_timer);
2147 spin_unlock_irqrestore(&queued_arr_lock, iflags);
2154 module_param_named(add_host, scsi_debug_add_host, int, S_IRUGO | S_IWUSR);
2155 module_param_named(delay, scsi_debug_delay, int, S_IRUGO | S_IWUSR);
2156 module_param_named(dev_size_mb, scsi_debug_dev_size_mb, int, S_IRUGO);
2157 module_param_named(dsense, scsi_debug_dsense, int, S_IRUGO | S_IWUSR);
2158 module_param_named(every_nth, scsi_debug_every_nth, int, S_IRUGO | S_IWUSR);
2159 module_param_named(max_luns, scsi_debug_max_luns, int, S_IRUGO | S_IWUSR);
2160 module_param_named(no_lun_0, scsi_debug_no_lun_0, int, S_IRUGO | S_IWUSR);
2161 module_param_named(num_parts, scsi_debug_num_parts, int, S_IRUGO);
2162 module_param_named(num_tgts, scsi_debug_num_tgts, int, S_IRUGO | S_IWUSR);
2163 module_param_named(opts, scsi_debug_opts, int, S_IRUGO | S_IWUSR);
2164 module_param_named(ptype, scsi_debug_ptype, int, S_IRUGO | S_IWUSR);
2165 module_param_named(scsi_level, scsi_debug_scsi_level, int, S_IRUGO);
2166 module_param_named(virtual_gb, scsi_debug_virtual_gb, int, S_IRUGO | S_IWUSR);
2168 MODULE_AUTHOR("Eric Youngdale + Douglas Gilbert");
2169 MODULE_DESCRIPTION("SCSI debug adapter driver");
2170 MODULE_LICENSE("GPL");
2171 MODULE_VERSION(SCSI_DEBUG_VERSION);
2173 MODULE_PARM_DESC(add_host, "0..127 hosts allowed(def=1)");
2174 MODULE_PARM_DESC(delay, "# of jiffies to delay response(def=1)");
2175 MODULE_PARM_DESC(dev_size_mb, "size in MB of ram shared by devs(def=8)");
2176 MODULE_PARM_DESC(dsense, "use descriptor sense format(def=0 -> fixed)");
2177 MODULE_PARM_DESC(every_nth, "timeout every nth command(def=100)");
2178 MODULE_PARM_DESC(max_luns, "number of LUNs per target to simulate(def=1)");
2179 MODULE_PARM_DESC(no_lun_0, "no LU number 0 (def=0 -> have lun 0)");
2180 MODULE_PARM_DESC(num_parts, "number of partitions(def=0)");
2181 MODULE_PARM_DESC(num_tgts, "number of targets per host to simulate(def=1)");
2182 MODULE_PARM_DESC(opts, "1->noise, 2->medium_error, 4->... (def=0)");
2183 MODULE_PARM_DESC(ptype, "SCSI peripheral type(def=0[disk])");
2184 MODULE_PARM_DESC(scsi_level, "SCSI level to simulate(def=5[SPC-3])");
2185 MODULE_PARM_DESC(virtual_gb, "virtual gigabyte size (def=0 -> use dev_size_mb)");
2188 static char sdebug_info[256];
2190 static const char * scsi_debug_info(struct Scsi_Host * shp)
2192 sprintf(sdebug_info, "scsi_debug, version %s [%s], "
2193 "dev_size_mb=%d, opts=0x%x", SCSI_DEBUG_VERSION,
2194 scsi_debug_version_date, scsi_debug_dev_size_mb,
2199 /* scsi_debug_proc_info
2200 * Used if the driver currently has no own support for /proc/scsi
2202 static int scsi_debug_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset,
2203 int length, int inout)
2205 int len, pos, begin;
2208 orig_length = length;
2212 int minLen = length > 15 ? 15 : length;
2214 if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
2216 memcpy(arr, buffer, minLen);
2218 if (1 != sscanf(arr, "%d", &pos))
2220 scsi_debug_opts = pos;
2221 if (scsi_debug_every_nth != 0)
2222 scsi_debug_cmnd_count = 0;
2226 pos = len = sprintf(buffer, "scsi_debug adapter driver, version "
2228 "num_tgts=%d, shared (ram) size=%d MB, opts=0x%x, "
2229 "every_nth=%d(curr:%d)\n"
2230 "delay=%d, max_luns=%d, scsi_level=%d\n"
2231 "sector_size=%d bytes, cylinders=%d, heads=%d, sectors=%d\n"
2232 "number of aborts=%d, device_reset=%d, bus_resets=%d, "
2234 SCSI_DEBUG_VERSION, scsi_debug_version_date, scsi_debug_num_tgts,
2235 scsi_debug_dev_size_mb, scsi_debug_opts, scsi_debug_every_nth,
2236 scsi_debug_cmnd_count, scsi_debug_delay,
2237 scsi_debug_max_luns, scsi_debug_scsi_level,
2238 SECT_SIZE, sdebug_cylinders_per, sdebug_heads, sdebug_sectors_per,
2239 num_aborts, num_dev_resets, num_bus_resets, num_host_resets);
2244 *start = buffer + (offset - begin); /* Start of wanted data */
2245 len -= (offset - begin);
2251 static ssize_t sdebug_delay_show(struct device_driver * ddp, char * buf)
2253 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_delay);
2256 static ssize_t sdebug_delay_store(struct device_driver * ddp,
2257 const char * buf, size_t count)
2262 if (1 == sscanf(buf, "%10s", work)) {
2263 if ((1 == sscanf(work, "%d", &delay)) && (delay >= 0)) {
2264 scsi_debug_delay = delay;
2270 DRIVER_ATTR(delay, S_IRUGO | S_IWUSR, sdebug_delay_show,
2271 sdebug_delay_store);
2273 static ssize_t sdebug_opts_show(struct device_driver * ddp, char * buf)
2275 return scnprintf(buf, PAGE_SIZE, "0x%x\n", scsi_debug_opts);
2278 static ssize_t sdebug_opts_store(struct device_driver * ddp,
2279 const char * buf, size_t count)
2284 if (1 == sscanf(buf, "%10s", work)) {
2285 if (0 == strnicmp(work,"0x", 2)) {
2286 if (1 == sscanf(&work[2], "%x", &opts))
2289 if (1 == sscanf(work, "%d", &opts))
2295 scsi_debug_opts = opts;
2296 scsi_debug_cmnd_count = 0;
2299 DRIVER_ATTR(opts, S_IRUGO | S_IWUSR, sdebug_opts_show,
2302 static ssize_t sdebug_ptype_show(struct device_driver * ddp, char * buf)
2304 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_ptype);
2306 static ssize_t sdebug_ptype_store(struct device_driver * ddp,
2307 const char * buf, size_t count)
2311 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2312 scsi_debug_ptype = n;
2317 DRIVER_ATTR(ptype, S_IRUGO | S_IWUSR, sdebug_ptype_show, sdebug_ptype_store);
2319 static ssize_t sdebug_dsense_show(struct device_driver * ddp, char * buf)
2321 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dsense);
2323 static ssize_t sdebug_dsense_store(struct device_driver * ddp,
2324 const char * buf, size_t count)
2328 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2329 scsi_debug_dsense = n;
2334 DRIVER_ATTR(dsense, S_IRUGO | S_IWUSR, sdebug_dsense_show,
2335 sdebug_dsense_store);
2337 static ssize_t sdebug_no_lun_0_show(struct device_driver * ddp, char * buf)
2339 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_no_lun_0);
2341 static ssize_t sdebug_no_lun_0_store(struct device_driver * ddp,
2342 const char * buf, size_t count)
2346 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2347 scsi_debug_no_lun_0 = n;
2352 DRIVER_ATTR(no_lun_0, S_IRUGO | S_IWUSR, sdebug_no_lun_0_show,
2353 sdebug_no_lun_0_store);
2355 static ssize_t sdebug_num_tgts_show(struct device_driver * ddp, char * buf)
2357 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_num_tgts);
2359 static ssize_t sdebug_num_tgts_store(struct device_driver * ddp,
2360 const char * buf, size_t count)
2364 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2365 scsi_debug_num_tgts = n;
2366 sdebug_max_tgts_luns();
2371 DRIVER_ATTR(num_tgts, S_IRUGO | S_IWUSR, sdebug_num_tgts_show,
2372 sdebug_num_tgts_store);
2374 static ssize_t sdebug_dev_size_mb_show(struct device_driver * ddp, char * buf)
2376 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dev_size_mb);
2378 DRIVER_ATTR(dev_size_mb, S_IRUGO, sdebug_dev_size_mb_show, NULL);
2380 static ssize_t sdebug_num_parts_show(struct device_driver * ddp, char * buf)
2382 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_num_parts);
2384 DRIVER_ATTR(num_parts, S_IRUGO, sdebug_num_parts_show, NULL);
2386 static ssize_t sdebug_every_nth_show(struct device_driver * ddp, char * buf)
2388 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_every_nth);
2390 static ssize_t sdebug_every_nth_store(struct device_driver * ddp,
2391 const char * buf, size_t count)
2395 if ((count > 0) && (1 == sscanf(buf, "%d", &nth))) {
2396 scsi_debug_every_nth = nth;
2397 scsi_debug_cmnd_count = 0;
2402 DRIVER_ATTR(every_nth, S_IRUGO | S_IWUSR, sdebug_every_nth_show,
2403 sdebug_every_nth_store);
2405 static ssize_t sdebug_max_luns_show(struct device_driver * ddp, char * buf)
2407 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_max_luns);
2409 static ssize_t sdebug_max_luns_store(struct device_driver * ddp,
2410 const char * buf, size_t count)
2414 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2415 scsi_debug_max_luns = n;
2416 sdebug_max_tgts_luns();
2421 DRIVER_ATTR(max_luns, S_IRUGO | S_IWUSR, sdebug_max_luns_show,
2422 sdebug_max_luns_store);
2424 static ssize_t sdebug_scsi_level_show(struct device_driver * ddp, char * buf)
2426 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_scsi_level);
2428 DRIVER_ATTR(scsi_level, S_IRUGO, sdebug_scsi_level_show, NULL);
2430 static ssize_t sdebug_virtual_gb_show(struct device_driver * ddp, char * buf)
2432 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_virtual_gb);
2434 static ssize_t sdebug_virtual_gb_store(struct device_driver * ddp,
2435 const char * buf, size_t count)
2439 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2440 scsi_debug_virtual_gb = n;
2441 if (scsi_debug_virtual_gb > 0) {
2442 sdebug_capacity = 2048 * 1024;
2443 sdebug_capacity *= scsi_debug_virtual_gb;
2445 sdebug_capacity = sdebug_store_sectors;
2450 DRIVER_ATTR(virtual_gb, S_IRUGO | S_IWUSR, sdebug_virtual_gb_show,
2451 sdebug_virtual_gb_store);
2453 static ssize_t sdebug_add_host_show(struct device_driver * ddp, char * buf)
2455 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_add_host);
2458 static ssize_t sdebug_add_host_store(struct device_driver * ddp,
2459 const char * buf, size_t count)
2464 if (1 != sscanf(buf, "%10s", work))
2466 { /* temporary hack around sscanf() problem with -ve nums */
2471 if (1 != sscanf(work + neg, "%d", &delta_hosts))
2474 delta_hosts = -delta_hosts;
2476 if (delta_hosts > 0) {
2478 sdebug_add_adapter();
2479 } while (--delta_hosts);
2480 } else if (delta_hosts < 0) {
2482 sdebug_remove_adapter();
2483 } while (++delta_hosts);
2487 DRIVER_ATTR(add_host, S_IRUGO | S_IWUSR, sdebug_add_host_show,
2488 sdebug_add_host_store);
2490 static int do_create_driverfs_files(void)
2494 ret = driver_create_file(&sdebug_driverfs_driver, &driver_attr_add_host);
2495 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_delay);
2496 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dev_size_mb);
2497 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_dsense);
2498 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_every_nth);
2499 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_max_luns);
2500 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_num_tgts);
2501 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_num_parts);
2502 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_ptype);
2503 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_opts);
2504 ret |= driver_create_file(&sdebug_driverfs_driver, &driver_attr_scsi_level);
2508 static void do_remove_driverfs_files(void)
2510 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_scsi_level);
2511 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_opts);
2512 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_ptype);
2513 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_num_parts);
2514 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_num_tgts);
2515 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_max_luns);
2516 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_every_nth);
2517 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dsense);
2518 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dev_size_mb);
2519 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_delay);
2520 driver_remove_file(&sdebug_driverfs_driver, &driver_attr_add_host);
2523 static int __init scsi_debug_init(void)
2530 if (scsi_debug_dev_size_mb < 1)
2531 scsi_debug_dev_size_mb = 1; /* force minimum 1 MB ramdisk */
2532 sdebug_store_size = (unsigned int)scsi_debug_dev_size_mb * 1048576;
2533 sdebug_store_sectors = sdebug_store_size / SECT_SIZE;
2534 if (scsi_debug_virtual_gb > 0) {
2535 sdebug_capacity = 2048 * 1024;
2536 sdebug_capacity *= scsi_debug_virtual_gb;
2538 sdebug_capacity = sdebug_store_sectors;
2540 /* play around with geometry, don't waste too much on track 0 */
2542 sdebug_sectors_per = 32;
2543 if (scsi_debug_dev_size_mb >= 16)
2545 else if (scsi_debug_dev_size_mb >= 256)
2547 sdebug_cylinders_per = (unsigned long)sdebug_capacity /
2548 (sdebug_sectors_per * sdebug_heads);
2549 if (sdebug_cylinders_per >= 1024) {
2550 /* other LLDs do this; implies >= 1GB ram disk ... */
2552 sdebug_sectors_per = 63;
2553 sdebug_cylinders_per = (unsigned long)sdebug_capacity /
2554 (sdebug_sectors_per * sdebug_heads);
2557 sz = sdebug_store_size;
2558 fake_storep = vmalloc(sz);
2559 if (NULL == fake_storep) {
2560 printk(KERN_ERR "scsi_debug_init: out of memory, 1\n");
2563 memset(fake_storep, 0, sz);
2564 if (scsi_debug_num_parts > 0)
2565 sdebug_build_parts(fake_storep);
2567 ret = device_register(&pseudo_primary);
2569 printk(KERN_WARNING "scsi_debug: device_register error: %d\n",
2573 ret = bus_register(&pseudo_lld_bus);
2575 printk(KERN_WARNING "scsi_debug: bus_register error: %d\n",
2579 ret = driver_register(&sdebug_driverfs_driver);
2581 printk(KERN_WARNING "scsi_debug: driver_register error: %d\n",
2585 ret = do_create_driverfs_files();
2587 printk(KERN_WARNING "scsi_debug: driver_create_file error: %d\n",
2594 sdebug_driver_template.proc_name = (char *)sdebug_proc_name;
2596 host_to_add = scsi_debug_add_host;
2597 scsi_debug_add_host = 0;
2599 for (k = 0; k < host_to_add; k++) {
2600 if (sdebug_add_adapter()) {
2601 printk(KERN_ERR "scsi_debug_init: "
2602 "sdebug_add_adapter failed k=%d\n", k);
2607 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
2608 printk(KERN_INFO "scsi_debug_init: built %d host(s)\n",
2609 scsi_debug_add_host);
2614 do_remove_driverfs_files();
2615 driver_unregister(&sdebug_driverfs_driver);
2617 bus_unregister(&pseudo_lld_bus);
2619 device_unregister(&pseudo_primary);
2626 static void __exit scsi_debug_exit(void)
2628 int k = scsi_debug_add_host;
2632 sdebug_remove_adapter();
2633 do_remove_driverfs_files();
2634 driver_unregister(&sdebug_driverfs_driver);
2635 bus_unregister(&pseudo_lld_bus);
2636 device_unregister(&pseudo_primary);
2641 device_initcall(scsi_debug_init);
2642 module_exit(scsi_debug_exit);
2644 static void pseudo_0_release(struct device * dev)
2646 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2647 printk(KERN_INFO "scsi_debug: pseudo_0_release() called\n");
2650 static struct device pseudo_primary = {
2651 .bus_id = "pseudo_0",
2652 .release = pseudo_0_release,
2655 static int pseudo_lld_bus_match(struct device *dev,
2656 struct device_driver *dev_driver)
2661 static struct bus_type pseudo_lld_bus = {
2663 .match = pseudo_lld_bus_match,
2664 .probe = sdebug_driver_probe,
2665 .remove = sdebug_driver_remove,
2668 static void sdebug_release_adapter(struct device * dev)
2670 struct sdebug_host_info *sdbg_host;
2672 sdbg_host = to_sdebug_host(dev);
2676 static int sdebug_add_adapter(void)
2678 int k, devs_per_host;
2680 struct sdebug_host_info *sdbg_host;
2681 struct sdebug_dev_info *sdbg_devinfo;
2682 struct list_head *lh, *lh_sf;
2684 sdbg_host = kzalloc(sizeof(*sdbg_host),GFP_KERNEL);
2686 if (NULL == sdbg_host) {
2687 printk(KERN_ERR "%s: out of memory at line %d\n",
2688 __FUNCTION__, __LINE__);
2692 INIT_LIST_HEAD(&sdbg_host->dev_info_list);
2694 devs_per_host = scsi_debug_num_tgts * scsi_debug_max_luns;
2695 for (k = 0; k < devs_per_host; k++) {
2696 sdbg_devinfo = kzalloc(sizeof(*sdbg_devinfo),GFP_KERNEL);
2697 if (NULL == sdbg_devinfo) {
2698 printk(KERN_ERR "%s: out of memory at line %d\n",
2699 __FUNCTION__, __LINE__);
2703 sdbg_devinfo->sdbg_host = sdbg_host;
2704 list_add_tail(&sdbg_devinfo->dev_list,
2705 &sdbg_host->dev_info_list);
2708 spin_lock(&sdebug_host_list_lock);
2709 list_add_tail(&sdbg_host->host_list, &sdebug_host_list);
2710 spin_unlock(&sdebug_host_list_lock);
2712 sdbg_host->dev.bus = &pseudo_lld_bus;
2713 sdbg_host->dev.parent = &pseudo_primary;
2714 sdbg_host->dev.release = &sdebug_release_adapter;
2715 sprintf(sdbg_host->dev.bus_id, "adapter%d", scsi_debug_add_host);
2717 error = device_register(&sdbg_host->dev);
2722 ++scsi_debug_add_host;
2726 list_for_each_safe(lh, lh_sf, &sdbg_host->dev_info_list) {
2727 sdbg_devinfo = list_entry(lh, struct sdebug_dev_info,
2729 list_del(&sdbg_devinfo->dev_list);
2730 kfree(sdbg_devinfo);
2737 static void sdebug_remove_adapter(void)
2739 struct sdebug_host_info * sdbg_host = NULL;
2741 spin_lock(&sdebug_host_list_lock);
2742 if (!list_empty(&sdebug_host_list)) {
2743 sdbg_host = list_entry(sdebug_host_list.prev,
2744 struct sdebug_host_info, host_list);
2745 list_del(&sdbg_host->host_list);
2747 spin_unlock(&sdebug_host_list_lock);
2752 device_unregister(&sdbg_host->dev);
2753 --scsi_debug_add_host;
2756 static int sdebug_driver_probe(struct device * dev)
2759 struct sdebug_host_info *sdbg_host;
2760 struct Scsi_Host *hpnt;
2762 sdbg_host = to_sdebug_host(dev);
2764 hpnt = scsi_host_alloc(&sdebug_driver_template, sizeof(sdbg_host));
2766 printk(KERN_ERR "%s: scsi_register failed\n", __FUNCTION__);
2771 sdbg_host->shost = hpnt;
2772 *((struct sdebug_host_info **)hpnt->hostdata) = sdbg_host;
2773 if ((hpnt->this_id >= 0) && (scsi_debug_num_tgts > hpnt->this_id))
2774 hpnt->max_id = scsi_debug_num_tgts + 1;
2776 hpnt->max_id = scsi_debug_num_tgts;
2777 hpnt->max_lun = SAM2_WLUN_REPORT_LUNS; /* = scsi_debug_max_luns; */
2779 error = scsi_add_host(hpnt, &sdbg_host->dev);
2781 printk(KERN_ERR "%s: scsi_add_host failed\n", __FUNCTION__);
2783 scsi_host_put(hpnt);
2785 scsi_scan_host(hpnt);
2791 static int sdebug_driver_remove(struct device * dev)
2793 struct list_head *lh, *lh_sf;
2794 struct sdebug_host_info *sdbg_host;
2795 struct sdebug_dev_info *sdbg_devinfo;
2797 sdbg_host = to_sdebug_host(dev);
2800 printk(KERN_ERR "%s: Unable to locate host info\n",
2805 scsi_remove_host(sdbg_host->shost);
2807 list_for_each_safe(lh, lh_sf, &sdbg_host->dev_info_list) {
2808 sdbg_devinfo = list_entry(lh, struct sdebug_dev_info,
2810 list_del(&sdbg_devinfo->dev_list);
2811 kfree(sdbg_devinfo);
2814 scsi_host_put(sdbg_host->shost);
2818 static void sdebug_max_tgts_luns(void)
2820 struct sdebug_host_info * sdbg_host;
2821 struct Scsi_Host *hpnt;
2823 spin_lock(&sdebug_host_list_lock);
2824 list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
2825 hpnt = sdbg_host->shost;
2826 if ((hpnt->this_id >= 0) &&
2827 (scsi_debug_num_tgts > hpnt->this_id))
2828 hpnt->max_id = scsi_debug_num_tgts + 1;
2830 hpnt->max_id = scsi_debug_num_tgts;
2831 hpnt->max_lun = SAM2_WLUN_REPORT_LUNS; /* scsi_debug_max_luns; */
2833 spin_unlock(&sdebug_host_list_lock);