2 * vvvvvvvvvvvvvvvvvvvvvvv Original vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
3 * Copyright (C) 1992 Eric Youngdale
4 * Simulate a host adapter with 2 disks attached. Do a lot of checking
5 * to make sure that we are not getting blocks mixed up, and PANIC if
6 * anything out of the ordinary is seen.
7 * ^^^^^^^^^^^^^^^^^^^^^^^ Original ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
9 * This version is more generic, simulating a variable number of disk
10 * (or disk like devices) sharing a common amount of RAM. To be more
11 * realistic, the simulated devices have the transport attributes of
15 * For documentation see http://www.torque.net/sg/sdebug26.html
17 * D. Gilbert (dpg) work for Magneto-Optical device test [20010421]
18 * dpg: work for devfs large number of disks [20010809]
19 * forked for lk 2.5 series [20011216, 20020101]
20 * use vmalloc() more inquiry+mode_sense [20020302]
21 * add timers for delayed responses [20020721]
22 * Patrick Mansfield <patmans@us.ibm.com> max_luns+scsi_level [20021031]
23 * Mike Anderson <andmike@us.ibm.com> sysfs work [20021118]
24 * dpg: change style of boot options to "scsi_debug.num_tgts=2" and
25 * module options to "modprobe scsi_debug num_tgts=2" [20021221]
28 #include <linux/module.h>
30 #include <linux/kernel.h>
31 #include <linux/errno.h>
32 #include <linux/timer.h>
33 #include <linux/types.h>
34 #include <linux/string.h>
35 #include <linux/genhd.h>
37 #include <linux/init.h>
38 #include <linux/proc_fs.h>
39 #include <linux/vmalloc.h>
40 #include <linux/moduleparam.h>
41 #include <linux/scatterlist.h>
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.81"
54 static const char * scsi_debug_version_date
= "20070104";
56 /* Additional Sense Code (ASC) */
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 TRANSPORT_PROBLEM 0x4b
68 #define THRESHOLD_EXCEEDED 0x5d
69 #define LOW_POWER_COND_ON 0x5e
71 /* Additional Sense Code Qualifier (ASCQ) */
72 #define ACK_NAK_TO 0x3
74 #define SDEBUG_TAGGED_QUEUING 0 /* 0 | MSG_SIMPLE_TAG | MSG_ORDERED_TAG */
76 /* Default values for driver parameters */
77 #define DEF_NUM_HOST 1
78 #define DEF_NUM_TGTS 1
79 #define DEF_MAX_LUNS 1
80 /* With these defaults, this driver will make 1 host with 1 target
81 * (id 0) containing 1 logical unit (lun 0). That is 1 device.
84 #define DEF_DEV_SIZE_MB 8
85 #define DEF_EVERY_NTH 0
86 #define DEF_NUM_PARTS 0
88 #define DEF_SCSI_LEVEL 5 /* INQUIRY, byte2 [5->SPC-3] */
91 #define DEF_NO_LUN_0 0
92 #define DEF_VIRTUAL_GB 0
94 #define DEF_VPD_USE_HOSTNO 1
96 /* bit mask values for scsi_debug_opts */
97 #define SCSI_DEBUG_OPT_NOISE 1
98 #define SCSI_DEBUG_OPT_MEDIUM_ERR 2
99 #define SCSI_DEBUG_OPT_TIMEOUT 4
100 #define SCSI_DEBUG_OPT_RECOVERED_ERR 8
101 #define SCSI_DEBUG_OPT_TRANSPORT_ERR 16
102 /* When "every_nth" > 0 then modulo "every_nth" commands:
103 * - a no response is simulated if SCSI_DEBUG_OPT_TIMEOUT is set
104 * - a RECOVERED_ERROR is simulated on successful read and write
105 * commands if SCSI_DEBUG_OPT_RECOVERED_ERR is set.
106 * - a TRANSPORT_ERROR is simulated on successful read and write
107 * commands if SCSI_DEBUG_OPT_TRANSPORT_ERR is set.
109 * When "every_nth" < 0 then after "- every_nth" commands:
110 * - a no response is simulated if SCSI_DEBUG_OPT_TIMEOUT is set
111 * - a RECOVERED_ERROR is simulated on successful read and write
112 * commands if SCSI_DEBUG_OPT_RECOVERED_ERR is set.
113 * - a TRANSPORT_ERROR is simulated on successful read and write
114 * commands if SCSI_DEBUG_OPT_TRANSPORT_ERR is set.
115 * This will continue until some other action occurs (e.g. the user
116 * writing a new value (other than -1 or 1) to every_nth via sysfs).
119 /* when 1==SCSI_DEBUG_OPT_MEDIUM_ERR, a medium error is simulated at this
120 * sector on read commands: */
121 #define OPT_MEDIUM_ERR_ADDR 0x1234 /* that's sector 4660 in decimal */
123 /* If REPORT LUNS has luns >= 256 it can choose "flat space" (value 1)
124 * or "peripheral device" addressing (value 0) */
125 #define SAM2_LUN_ADDRESS_METHOD 0
126 #define SAM2_WLUN_REPORT_LUNS 0xc101
128 static int scsi_debug_add_host
= DEF_NUM_HOST
;
129 static int scsi_debug_delay
= DEF_DELAY
;
130 static int scsi_debug_dev_size_mb
= DEF_DEV_SIZE_MB
;
131 static int scsi_debug_every_nth
= DEF_EVERY_NTH
;
132 static int scsi_debug_max_luns
= DEF_MAX_LUNS
;
133 static int scsi_debug_num_parts
= DEF_NUM_PARTS
;
134 static int scsi_debug_num_tgts
= DEF_NUM_TGTS
; /* targets per host */
135 static int scsi_debug_opts
= DEF_OPTS
;
136 static int scsi_debug_scsi_level
= DEF_SCSI_LEVEL
;
137 static int scsi_debug_ptype
= DEF_PTYPE
; /* SCSI peripheral type (0==disk) */
138 static int scsi_debug_dsense
= DEF_D_SENSE
;
139 static int scsi_debug_no_lun_0
= DEF_NO_LUN_0
;
140 static int scsi_debug_virtual_gb
= DEF_VIRTUAL_GB
;
141 static int scsi_debug_fake_rw
= DEF_FAKE_RW
;
142 static int scsi_debug_vpd_use_hostno
= DEF_VPD_USE_HOSTNO
;
144 static int scsi_debug_cmnd_count
= 0;
146 #define DEV_READONLY(TGT) (0)
147 #define DEV_REMOVEABLE(TGT) (0)
149 static unsigned int sdebug_store_size
; /* in bytes */
150 static unsigned int sdebug_store_sectors
;
151 static sector_t sdebug_capacity
; /* in sectors */
153 /* old BIOS stuff, kernel may get rid of them but some mode sense pages
154 may still need them */
155 static int sdebug_heads
; /* heads per disk */
156 static int sdebug_cylinders_per
; /* cylinders per surface */
157 static int sdebug_sectors_per
; /* sectors per cylinder */
159 /* default sector size is 512 bytes, 2**9 bytes */
160 #define POW2_SECT_SIZE 9
161 #define SECT_SIZE (1 << POW2_SECT_SIZE)
162 #define SECT_SIZE_PER(TGT) SECT_SIZE
164 #define SDEBUG_MAX_PARTS 4
166 #define SDEBUG_SENSE_LEN 32
168 struct sdebug_dev_info
{
169 struct list_head dev_list
;
170 unsigned char sense_buff
[SDEBUG_SENSE_LEN
]; /* weak nexus */
171 unsigned int channel
;
174 struct sdebug_host_info
*sdbg_host
;
181 struct sdebug_host_info
{
182 struct list_head host_list
;
183 struct Scsi_Host
*shost
;
185 struct list_head dev_info_list
;
188 #define to_sdebug_host(d) \
189 container_of(d, struct sdebug_host_info, dev)
191 static LIST_HEAD(sdebug_host_list
);
192 static DEFINE_SPINLOCK(sdebug_host_list_lock
);
194 typedef void (* done_funct_t
) (struct scsi_cmnd
*);
196 struct sdebug_queued_cmd
{
198 struct timer_list cmnd_timer
;
199 done_funct_t done_funct
;
200 struct scsi_cmnd
* a_cmnd
;
203 static struct sdebug_queued_cmd queued_arr
[SCSI_DEBUG_CANQUEUE
];
205 static struct scsi_host_template sdebug_driver_template
= {
206 .proc_info
= scsi_debug_proc_info
,
207 .name
= "SCSI DEBUG",
208 .info
= scsi_debug_info
,
209 .slave_alloc
= scsi_debug_slave_alloc
,
210 .slave_configure
= scsi_debug_slave_configure
,
211 .slave_destroy
= scsi_debug_slave_destroy
,
212 .ioctl
= scsi_debug_ioctl
,
213 .queuecommand
= scsi_debug_queuecommand
,
214 .eh_abort_handler
= scsi_debug_abort
,
215 .eh_bus_reset_handler
= scsi_debug_bus_reset
,
216 .eh_device_reset_handler
= scsi_debug_device_reset
,
217 .eh_host_reset_handler
= scsi_debug_host_reset
,
218 .bios_param
= scsi_debug_biosparam
,
219 .can_queue
= SCSI_DEBUG_CANQUEUE
,
223 .max_sectors
= 0xffff,
224 .unchecked_isa_dma
= 0,
225 .use_clustering
= ENABLE_CLUSTERING
,
226 .module
= THIS_MODULE
,
229 static unsigned char * fake_storep
; /* ramdisk storage */
231 static int num_aborts
= 0;
232 static int num_dev_resets
= 0;
233 static int num_bus_resets
= 0;
234 static int num_host_resets
= 0;
236 static DEFINE_SPINLOCK(queued_arr_lock
);
237 static DEFINE_RWLOCK(atomic_rw
);
239 static char sdebug_proc_name
[] = "scsi_debug";
241 static int sdebug_driver_probe(struct device
*);
242 static int sdebug_driver_remove(struct device
*);
243 static struct bus_type pseudo_lld_bus
;
245 static struct device_driver sdebug_driverfs_driver
= {
246 .name
= sdebug_proc_name
,
247 .bus
= &pseudo_lld_bus
,
250 static const int check_condition_result
=
251 (DRIVER_SENSE
<< 24) | SAM_STAT_CHECK_CONDITION
;
253 static unsigned char ctrl_m_pg
[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
255 static unsigned char iec_m_pg
[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
258 /* function declarations */
259 static int resp_inquiry(struct scsi_cmnd
* SCpnt
, int target
,
260 struct sdebug_dev_info
* devip
);
261 static int resp_requests(struct scsi_cmnd
* SCpnt
,
262 struct sdebug_dev_info
* devip
);
263 static int resp_start_stop(struct scsi_cmnd
* scp
,
264 struct sdebug_dev_info
* devip
);
265 static int resp_report_tgtpgs(struct scsi_cmnd
* scp
,
266 struct sdebug_dev_info
* devip
);
267 static int resp_readcap(struct scsi_cmnd
* SCpnt
,
268 struct sdebug_dev_info
* devip
);
269 static int resp_readcap16(struct scsi_cmnd
* SCpnt
,
270 struct sdebug_dev_info
* devip
);
271 static int resp_mode_sense(struct scsi_cmnd
* scp
, int target
,
272 struct sdebug_dev_info
* devip
);
273 static int resp_mode_select(struct scsi_cmnd
* scp
, int mselect6
,
274 struct sdebug_dev_info
* devip
);
275 static int resp_log_sense(struct scsi_cmnd
* scp
,
276 struct sdebug_dev_info
* devip
);
277 static int resp_read(struct scsi_cmnd
* SCpnt
, unsigned long long lba
,
278 unsigned int num
, struct sdebug_dev_info
* devip
);
279 static int resp_write(struct scsi_cmnd
* SCpnt
, unsigned long long lba
,
280 unsigned int num
, struct sdebug_dev_info
* devip
);
281 static int resp_report_luns(struct scsi_cmnd
* SCpnt
,
282 struct sdebug_dev_info
* devip
);
283 static int fill_from_dev_buffer(struct scsi_cmnd
* scp
, unsigned char * arr
,
285 static int fetch_to_dev_buffer(struct scsi_cmnd
* scp
, unsigned char * arr
,
287 static void timer_intr_handler(unsigned long);
288 static struct sdebug_dev_info
* devInfoReg(struct scsi_device
* sdev
);
289 static void mk_sense_buffer(struct sdebug_dev_info
* devip
, int key
,
291 static int check_readiness(struct scsi_cmnd
* SCpnt
, int reset_only
,
292 struct sdebug_dev_info
* devip
);
293 static int schedule_resp(struct scsi_cmnd
* cmnd
,
294 struct sdebug_dev_info
* devip
,
295 done_funct_t done
, int scsi_result
, int delta_jiff
);
296 static void __init
sdebug_build_parts(unsigned char * ramp
);
297 static void __init
init_all_queued(void);
298 static void stop_all_queued(void);
299 static int stop_queued_cmnd(struct scsi_cmnd
* cmnd
);
300 static int inquiry_evpd_83(unsigned char * arr
, int port_group_id
,
301 int target_dev_id
, int dev_id_num
,
302 const char * dev_id_str
, int dev_id_str_len
);
303 static int inquiry_evpd_88(unsigned char * arr
, int target_dev_id
);
304 static int do_create_driverfs_files(void);
305 static void do_remove_driverfs_files(void);
307 static int sdebug_add_adapter(void);
308 static void sdebug_remove_adapter(void);
309 static void sdebug_max_tgts_luns(void);
311 static struct device pseudo_primary
;
312 static struct bus_type pseudo_lld_bus
;
316 int scsi_debug_queuecommand(struct scsi_cmnd
* SCpnt
, done_funct_t done
)
318 unsigned char *cmd
= (unsigned char *) SCpnt
->cmnd
;
321 unsigned long long lba
;
323 int target
= SCpnt
->device
->id
;
324 struct sdebug_dev_info
* devip
= NULL
;
325 int inj_recovered
= 0;
326 int inj_transport
= 0;
327 int delay_override
= 0;
330 return 0; /* assume mid level reprocessing command */
333 if ((SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
) && cmd
) {
334 printk(KERN_INFO
"scsi_debug: cmd ");
335 for (k
= 0, len
= SCpnt
->cmd_len
; k
< len
; ++k
)
336 printk("%02x ", (int)cmd
[k
]);
339 if(target
== sdebug_driver_template
.this_id
) {
340 printk(KERN_INFO
"scsi_debug: initiator's id used as "
342 return schedule_resp(SCpnt
, NULL
, done
,
343 DID_NO_CONNECT
<< 16, 0);
346 if ((SCpnt
->device
->lun
>= scsi_debug_max_luns
) &&
347 (SCpnt
->device
->lun
!= SAM2_WLUN_REPORT_LUNS
))
348 return schedule_resp(SCpnt
, NULL
, done
,
349 DID_NO_CONNECT
<< 16, 0);
350 devip
= devInfoReg(SCpnt
->device
);
352 return schedule_resp(SCpnt
, NULL
, done
,
353 DID_NO_CONNECT
<< 16, 0);
355 if ((scsi_debug_every_nth
!= 0) &&
356 (++scsi_debug_cmnd_count
>= abs(scsi_debug_every_nth
))) {
357 scsi_debug_cmnd_count
= 0;
358 if (scsi_debug_every_nth
< -1)
359 scsi_debug_every_nth
= -1;
360 if (SCSI_DEBUG_OPT_TIMEOUT
& scsi_debug_opts
)
361 return 0; /* ignore command causing timeout */
362 else if (SCSI_DEBUG_OPT_RECOVERED_ERR
& scsi_debug_opts
)
363 inj_recovered
= 1; /* to reads and writes below */
364 else if (SCSI_DEBUG_OPT_TRANSPORT_ERR
& scsi_debug_opts
)
365 inj_transport
= 1; /* to reads and writes below */
372 case TEST_UNIT_READY
:
374 break; /* only allowable wlun commands */
376 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
)
377 printk(KERN_INFO
"scsi_debug: Opcode: 0x%x "
378 "not supported for wlun\n", *cmd
);
379 mk_sense_buffer(devip
, ILLEGAL_REQUEST
,
381 errsts
= check_condition_result
;
382 return schedule_resp(SCpnt
, devip
, done
, errsts
,
388 case INQUIRY
: /* mandatory, ignore unit attention */
390 errsts
= resp_inquiry(SCpnt
, target
, devip
);
392 case REQUEST_SENSE
: /* mandatory, ignore unit attention */
394 errsts
= resp_requests(SCpnt
, devip
);
396 case REZERO_UNIT
: /* actually this is REWIND for SSC */
398 errsts
= resp_start_stop(SCpnt
, devip
);
400 case ALLOW_MEDIUM_REMOVAL
:
401 if ((errsts
= check_readiness(SCpnt
, 1, devip
)))
403 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
)
404 printk(KERN_INFO
"scsi_debug: Medium removal %s\n",
405 cmd
[4] ? "inhibited" : "enabled");
407 case SEND_DIAGNOSTIC
: /* mandatory */
408 errsts
= check_readiness(SCpnt
, 1, devip
);
410 case TEST_UNIT_READY
: /* mandatory */
412 errsts
= check_readiness(SCpnt
, 0, devip
);
415 errsts
= check_readiness(SCpnt
, 1, devip
);
418 errsts
= check_readiness(SCpnt
, 1, devip
);
421 errsts
= check_readiness(SCpnt
, 1, devip
);
424 errsts
= check_readiness(SCpnt
, 1, devip
);
427 errsts
= resp_readcap(SCpnt
, devip
);
429 case SERVICE_ACTION_IN
:
430 if (SAI_READ_CAPACITY_16
!= cmd
[1]) {
431 mk_sense_buffer(devip
, ILLEGAL_REQUEST
,
433 errsts
= check_condition_result
;
436 errsts
= resp_readcap16(SCpnt
, devip
);
439 if (MI_REPORT_TARGET_PGS
!= cmd
[1]) {
440 mk_sense_buffer(devip
, ILLEGAL_REQUEST
,
442 errsts
= check_condition_result
;
445 errsts
= resp_report_tgtpgs(SCpnt
, devip
);
451 if ((errsts
= check_readiness(SCpnt
, 0, devip
)))
453 if (scsi_debug_fake_rw
)
455 if ((*cmd
) == READ_16
) {
456 for (lba
= 0, j
= 0; j
< 8; ++j
) {
461 num
= cmd
[13] + (cmd
[12] << 8) +
462 (cmd
[11] << 16) + (cmd
[10] << 24);
463 } else if ((*cmd
) == READ_12
) {
464 lba
= cmd
[5] + (cmd
[4] << 8) +
465 (cmd
[3] << 16) + (cmd
[2] << 24);
466 num
= cmd
[9] + (cmd
[8] << 8) +
467 (cmd
[7] << 16) + (cmd
[6] << 24);
468 } else if ((*cmd
) == READ_10
) {
469 lba
= cmd
[5] + (cmd
[4] << 8) +
470 (cmd
[3] << 16) + (cmd
[2] << 24);
471 num
= cmd
[8] + (cmd
[7] << 8);
472 } else { /* READ (6) */
473 lba
= cmd
[3] + (cmd
[2] << 8) +
474 ((cmd
[1] & 0x1f) << 16);
475 num
= (0 == cmd
[4]) ? 256 : cmd
[4];
477 errsts
= resp_read(SCpnt
, lba
, num
, devip
);
478 if (inj_recovered
&& (0 == errsts
)) {
479 mk_sense_buffer(devip
, RECOVERED_ERROR
,
480 THRESHOLD_EXCEEDED
, 0);
481 errsts
= check_condition_result
;
482 } else if (inj_transport
&& (0 == errsts
)) {
483 mk_sense_buffer(devip
, ABORTED_COMMAND
,
484 TRANSPORT_PROBLEM
, ACK_NAK_TO
);
485 errsts
= check_condition_result
;
488 case REPORT_LUNS
: /* mandatory, ignore unit attention */
490 errsts
= resp_report_luns(SCpnt
, devip
);
492 case VERIFY
: /* 10 byte SBC-2 command */
493 errsts
= check_readiness(SCpnt
, 0, devip
);
499 if ((errsts
= check_readiness(SCpnt
, 0, devip
)))
501 if (scsi_debug_fake_rw
)
503 if ((*cmd
) == WRITE_16
) {
504 for (lba
= 0, j
= 0; j
< 8; ++j
) {
509 num
= cmd
[13] + (cmd
[12] << 8) +
510 (cmd
[11] << 16) + (cmd
[10] << 24);
511 } else if ((*cmd
) == WRITE_12
) {
512 lba
= cmd
[5] + (cmd
[4] << 8) +
513 (cmd
[3] << 16) + (cmd
[2] << 24);
514 num
= cmd
[9] + (cmd
[8] << 8) +
515 (cmd
[7] << 16) + (cmd
[6] << 24);
516 } else if ((*cmd
) == WRITE_10
) {
517 lba
= cmd
[5] + (cmd
[4] << 8) +
518 (cmd
[3] << 16) + (cmd
[2] << 24);
519 num
= cmd
[8] + (cmd
[7] << 8);
520 } else { /* WRITE (6) */
521 lba
= cmd
[3] + (cmd
[2] << 8) +
522 ((cmd
[1] & 0x1f) << 16);
523 num
= (0 == cmd
[4]) ? 256 : cmd
[4];
525 errsts
= resp_write(SCpnt
, lba
, num
, devip
);
526 if (inj_recovered
&& (0 == errsts
)) {
527 mk_sense_buffer(devip
, RECOVERED_ERROR
,
528 THRESHOLD_EXCEEDED
, 0);
529 errsts
= check_condition_result
;
534 errsts
= resp_mode_sense(SCpnt
, target
, devip
);
537 errsts
= resp_mode_select(SCpnt
, 1, devip
);
540 errsts
= resp_mode_select(SCpnt
, 0, devip
);
543 errsts
= resp_log_sense(SCpnt
, devip
);
545 case SYNCHRONIZE_CACHE
:
547 errsts
= check_readiness(SCpnt
, 0, devip
);
550 errsts
= check_readiness(SCpnt
, 1, devip
);
553 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
)
554 printk(KERN_INFO
"scsi_debug: Opcode: 0x%x not "
555 "supported\n", *cmd
);
556 if ((errsts
= check_readiness(SCpnt
, 1, devip
)))
557 break; /* Unit attention takes precedence */
558 mk_sense_buffer(devip
, ILLEGAL_REQUEST
, INVALID_OPCODE
, 0);
559 errsts
= check_condition_result
;
562 return schedule_resp(SCpnt
, devip
, done
, errsts
,
563 (delay_override
? 0 : scsi_debug_delay
));
566 static int scsi_debug_ioctl(struct scsi_device
*dev
, int cmd
, void __user
*arg
)
568 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
) {
569 printk(KERN_INFO
"scsi_debug: ioctl: cmd=0x%x\n", cmd
);
572 /* return -ENOTTY; // correct return but upsets fdisk */
575 static int check_readiness(struct scsi_cmnd
* SCpnt
, int reset_only
,
576 struct sdebug_dev_info
* devip
)
579 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
)
580 printk(KERN_INFO
"scsi_debug: Reporting Unit "
581 "attention: power on reset\n");
583 mk_sense_buffer(devip
, UNIT_ATTENTION
, POWERON_RESET
, 0);
584 return check_condition_result
;
586 if ((0 == reset_only
) && devip
->stopped
) {
587 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
)
588 printk(KERN_INFO
"scsi_debug: Reporting Not "
589 "ready: initializing command required\n");
590 mk_sense_buffer(devip
, NOT_READY
, LOGICAL_UNIT_NOT_READY
,
592 return check_condition_result
;
597 /* Returns 0 if ok else (DID_ERROR << 16). Sets scp->resid . */
598 static int fill_from_dev_buffer(struct scsi_cmnd
* scp
, unsigned char * arr
,
601 int k
, req_len
, act_len
, len
, active
;
604 struct scatterlist
* sg
;
606 if (0 == scp
->request_bufflen
)
608 if (NULL
== scp
->request_buffer
)
609 return (DID_ERROR
<< 16);
610 if (! ((scp
->sc_data_direction
== DMA_BIDIRECTIONAL
) ||
611 (scp
->sc_data_direction
== DMA_FROM_DEVICE
)))
612 return (DID_ERROR
<< 16);
613 if (0 == scp
->use_sg
) {
614 req_len
= scp
->request_bufflen
;
615 act_len
= (req_len
< arr_len
) ? req_len
: arr_len
;
616 memcpy(scp
->request_buffer
, arr
, act_len
);
618 scp
->resid
-= act_len
;
620 scp
->resid
= req_len
- act_len
;
624 req_len
= act_len
= 0;
625 scsi_for_each_sg(scp
, sg
, scp
->use_sg
, k
) {
627 kaddr
= (unsigned char *)
628 kmap_atomic(sg_page(sg
), KM_USER0
);
630 return (DID_ERROR
<< 16);
631 kaddr_off
= (unsigned char *)kaddr
+ sg
->offset
;
633 if ((req_len
+ len
) > arr_len
) {
635 len
= arr_len
- req_len
;
637 memcpy(kaddr_off
, arr
+ req_len
, len
);
638 kunmap_atomic(kaddr
, KM_USER0
);
641 req_len
+= sg
->length
;
644 scp
->resid
-= act_len
;
646 scp
->resid
= req_len
- act_len
;
650 /* Returns number of bytes fetched into 'arr' or -1 if error. */
651 static int fetch_to_dev_buffer(struct scsi_cmnd
* scp
, unsigned char * arr
,
654 int k
, req_len
, len
, fin
;
657 struct scatterlist
* sg
;
659 if (0 == scp
->request_bufflen
)
661 if (NULL
== scp
->request_buffer
)
663 if (! ((scp
->sc_data_direction
== DMA_BIDIRECTIONAL
) ||
664 (scp
->sc_data_direction
== DMA_TO_DEVICE
)))
666 if (0 == scp
->use_sg
) {
667 req_len
= scp
->request_bufflen
;
668 len
= (req_len
< max_arr_len
) ? req_len
: max_arr_len
;
669 memcpy(arr
, scp
->request_buffer
, len
);
672 sg
= scsi_sglist(scp
);
674 for (k
= 0; k
< scp
->use_sg
; ++k
, sg
= sg_next(sg
)) {
675 kaddr
= (unsigned char *)kmap_atomic(sg_page(sg
), KM_USER0
);
678 kaddr_off
= (unsigned char *)kaddr
+ sg
->offset
;
680 if ((req_len
+ len
) > max_arr_len
) {
681 len
= max_arr_len
- req_len
;
684 memcpy(arr
+ req_len
, kaddr_off
, len
);
685 kunmap_atomic(kaddr
, KM_USER0
);
687 return req_len
+ len
;
688 req_len
+= sg
->length
;
694 static const char * inq_vendor_id
= "Linux ";
695 static const char * inq_product_id
= "scsi_debug ";
696 static const char * inq_product_rev
= "0004";
698 static int inquiry_evpd_83(unsigned char * arr
, int port_group_id
,
699 int target_dev_id
, int dev_id_num
,
700 const char * dev_id_str
,
706 port_a
= target_dev_id
+ 1;
707 /* T10 vendor identifier field format (faked) */
708 arr
[0] = 0x2; /* ASCII */
711 memcpy(&arr
[4], inq_vendor_id
, 8);
712 memcpy(&arr
[12], inq_product_id
, 16);
713 memcpy(&arr
[28], dev_id_str
, dev_id_str_len
);
714 num
= 8 + 16 + dev_id_str_len
;
717 if (dev_id_num
>= 0) {
718 /* NAA-5, Logical unit identifier (binary) */
719 arr
[num
++] = 0x1; /* binary (not necessarily sas) */
720 arr
[num
++] = 0x3; /* PIV=0, lu, naa */
723 arr
[num
++] = 0x53; /* naa-5 ieee company id=0x333333 (fake) */
727 arr
[num
++] = (dev_id_num
>> 24);
728 arr
[num
++] = (dev_id_num
>> 16) & 0xff;
729 arr
[num
++] = (dev_id_num
>> 8) & 0xff;
730 arr
[num
++] = dev_id_num
& 0xff;
731 /* Target relative port number */
732 arr
[num
++] = 0x61; /* proto=sas, binary */
733 arr
[num
++] = 0x94; /* PIV=1, target port, rel port */
734 arr
[num
++] = 0x0; /* reserved */
735 arr
[num
++] = 0x4; /* length */
736 arr
[num
++] = 0x0; /* reserved */
737 arr
[num
++] = 0x0; /* reserved */
739 arr
[num
++] = 0x1; /* relative port A */
741 /* NAA-5, Target port identifier */
742 arr
[num
++] = 0x61; /* proto=sas, binary */
743 arr
[num
++] = 0x93; /* piv=1, target port, naa */
746 arr
[num
++] = 0x52; /* naa-5, company id=0x222222 (fake) */
750 arr
[num
++] = (port_a
>> 24);
751 arr
[num
++] = (port_a
>> 16) & 0xff;
752 arr
[num
++] = (port_a
>> 8) & 0xff;
753 arr
[num
++] = port_a
& 0xff;
754 /* NAA-5, Target port group identifier */
755 arr
[num
++] = 0x61; /* proto=sas, binary */
756 arr
[num
++] = 0x95; /* piv=1, target port group id */
761 arr
[num
++] = (port_group_id
>> 8) & 0xff;
762 arr
[num
++] = port_group_id
& 0xff;
763 /* NAA-5, Target device identifier */
764 arr
[num
++] = 0x61; /* proto=sas, binary */
765 arr
[num
++] = 0xa3; /* piv=1, target device, naa */
768 arr
[num
++] = 0x52; /* naa-5, company id=0x222222 (fake) */
772 arr
[num
++] = (target_dev_id
>> 24);
773 arr
[num
++] = (target_dev_id
>> 16) & 0xff;
774 arr
[num
++] = (target_dev_id
>> 8) & 0xff;
775 arr
[num
++] = target_dev_id
& 0xff;
776 /* SCSI name string: Target device identifier */
777 arr
[num
++] = 0x63; /* proto=sas, UTF-8 */
778 arr
[num
++] = 0xa8; /* piv=1, target device, SCSI name string */
781 memcpy(arr
+ num
, "naa.52222220", 12);
783 snprintf(b
, sizeof(b
), "%08X", target_dev_id
);
784 memcpy(arr
+ num
, b
, 8);
786 memset(arr
+ num
, 0, 4);
792 static unsigned char vpd84_data
[] = {
793 /* from 4th byte */ 0x22,0x22,0x22,0x0,0xbb,0x0,
794 0x22,0x22,0x22,0x0,0xbb,0x1,
795 0x22,0x22,0x22,0x0,0xbb,0x2,
798 static int inquiry_evpd_84(unsigned char * arr
)
800 memcpy(arr
, vpd84_data
, sizeof(vpd84_data
));
801 return sizeof(vpd84_data
);
804 static int inquiry_evpd_85(unsigned char * arr
)
807 const char * na1
= "https://www.kernel.org/config";
808 const char * na2
= "http://www.kernel.org/log";
811 arr
[num
++] = 0x1; /* lu, storage config */
812 arr
[num
++] = 0x0; /* reserved */
817 plen
= ((plen
/ 4) + 1) * 4;
818 arr
[num
++] = plen
; /* length, null termianted, padded */
819 memcpy(arr
+ num
, na1
, olen
);
820 memset(arr
+ num
+ olen
, 0, plen
- olen
);
823 arr
[num
++] = 0x4; /* lu, logging */
824 arr
[num
++] = 0x0; /* reserved */
829 plen
= ((plen
/ 4) + 1) * 4;
830 arr
[num
++] = plen
; /* length, null terminated, padded */
831 memcpy(arr
+ num
, na2
, olen
);
832 memset(arr
+ num
+ olen
, 0, plen
- olen
);
838 /* SCSI ports VPD page */
839 static int inquiry_evpd_88(unsigned char * arr
, int target_dev_id
)
844 port_a
= target_dev_id
+ 1;
846 arr
[num
++] = 0x0; /* reserved */
847 arr
[num
++] = 0x0; /* reserved */
849 arr
[num
++] = 0x1; /* relative port 1 (primary) */
850 memset(arr
+ num
, 0, 6);
853 arr
[num
++] = 12; /* length tp descriptor */
854 /* naa-5 target port identifier (A) */
855 arr
[num
++] = 0x61; /* proto=sas, binary */
856 arr
[num
++] = 0x93; /* PIV=1, target port, NAA */
857 arr
[num
++] = 0x0; /* reserved */
858 arr
[num
++] = 0x8; /* length */
859 arr
[num
++] = 0x52; /* NAA-5, company_id=0x222222 (fake) */
863 arr
[num
++] = (port_a
>> 24);
864 arr
[num
++] = (port_a
>> 16) & 0xff;
865 arr
[num
++] = (port_a
>> 8) & 0xff;
866 arr
[num
++] = port_a
& 0xff;
868 arr
[num
++] = 0x0; /* reserved */
869 arr
[num
++] = 0x0; /* reserved */
871 arr
[num
++] = 0x2; /* relative port 2 (secondary) */
872 memset(arr
+ num
, 0, 6);
875 arr
[num
++] = 12; /* length tp descriptor */
876 /* naa-5 target port identifier (B) */
877 arr
[num
++] = 0x61; /* proto=sas, binary */
878 arr
[num
++] = 0x93; /* PIV=1, target port, NAA */
879 arr
[num
++] = 0x0; /* reserved */
880 arr
[num
++] = 0x8; /* length */
881 arr
[num
++] = 0x52; /* NAA-5, company_id=0x222222 (fake) */
885 arr
[num
++] = (port_b
>> 24);
886 arr
[num
++] = (port_b
>> 16) & 0xff;
887 arr
[num
++] = (port_b
>> 8) & 0xff;
888 arr
[num
++] = port_b
& 0xff;
894 static unsigned char vpd89_data
[] = {
895 /* from 4th byte */ 0,0,0,0,
896 'l','i','n','u','x',' ',' ',' ',
897 'S','A','T',' ','s','c','s','i','_','d','e','b','u','g',' ',' ',
899 0x34,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
901 0x5a,0xc,0xff,0x3f,0x37,0xc8,0x10,0,0,0,0,0,0x3f,0,0,0,
902 0,0,0,0,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x20,0x20,0x20,0x20,
903 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0,0,0,0x40,0x4,0,0x2e,0x33,
904 0x38,0x31,0x20,0x20,0x20,0x20,0x54,0x53,0x38,0x33,0x30,0x30,0x33,0x31,
906 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
908 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
910 0,0,0,0x2f,0,0,0,0x2,0,0x2,0x7,0,0xff,0xff,0x1,0,
911 0x3f,0,0xc1,0xff,0x3e,0,0x10,0x1,0xb0,0xf8,0x50,0x9,0,0,0x7,0,
912 0x3,0,0x78,0,0x78,0,0xf0,0,0x78,0,0,0,0,0,0,0,
913 0,0,0,0,0,0,0,0,0x2,0,0,0,0,0,0,0,
914 0x7e,0,0x1b,0,0x6b,0x34,0x1,0x7d,0x3,0x40,0x69,0x34,0x1,0x3c,0x3,0x40,
915 0x7f,0x40,0,0,0,0,0xfe,0xfe,0,0,0,0,0,0xfe,0,0,
916 0,0,0,0,0,0,0,0,0xb0,0xf8,0x50,0x9,0,0,0,0,
917 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
918 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
919 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
920 0x1,0,0xb0,0xf8,0x50,0x9,0xb0,0xf8,0x50,0x9,0x20,0x20,0x2,0,0xb6,0x42,
921 0,0x80,0x8a,0,0x6,0x3c,0xa,0x3c,0xff,0xff,0xc6,0x7,0,0x1,0,0x8,
922 0xf0,0xf,0,0x10,0x2,0,0x30,0,0,0,0,0,0,0,0x6,0xfe,
923 0,0,0x2,0,0x50,0,0x8a,0,0x4f,0x95,0,0,0x21,0,0xb,0,
924 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
925 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
926 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
927 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
928 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
929 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
930 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
931 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
932 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
933 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
934 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
935 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa5,0x51,
938 static int inquiry_evpd_89(unsigned char * arr
)
940 memcpy(arr
, vpd89_data
, sizeof(vpd89_data
));
941 return sizeof(vpd89_data
);
945 static unsigned char vpdb0_data
[] = {
946 /* from 4th byte */ 0,0,0,4,
951 static int inquiry_evpd_b0(unsigned char * arr
)
953 memcpy(arr
, vpdb0_data
, sizeof(vpdb0_data
));
954 if (sdebug_store_sectors
> 0x400) {
955 arr
[4] = (sdebug_store_sectors
>> 24) & 0xff;
956 arr
[5] = (sdebug_store_sectors
>> 16) & 0xff;
957 arr
[6] = (sdebug_store_sectors
>> 8) & 0xff;
958 arr
[7] = sdebug_store_sectors
& 0xff;
960 return sizeof(vpdb0_data
);
964 #define SDEBUG_LONG_INQ_SZ 96
965 #define SDEBUG_MAX_INQ_ARR_SZ 584
967 static int resp_inquiry(struct scsi_cmnd
* scp
, int target
,
968 struct sdebug_dev_info
* devip
)
970 unsigned char pq_pdt
;
972 unsigned char *cmd
= (unsigned char *)scp
->cmnd
;
973 int alloc_len
, n
, ret
;
975 alloc_len
= (cmd
[3] << 8) + cmd
[4];
976 arr
= kzalloc(SDEBUG_MAX_INQ_ARR_SZ
, GFP_ATOMIC
);
978 return DID_REQUEUE
<< 16;
980 pq_pdt
= 0x1e; /* present, wlun */
981 else if (scsi_debug_no_lun_0
&& (0 == devip
->lun
))
982 pq_pdt
= 0x7f; /* not present, no device type */
984 pq_pdt
= (scsi_debug_ptype
& 0x1f);
986 if (0x2 & cmd
[1]) { /* CMDDT bit set */
987 mk_sense_buffer(devip
, ILLEGAL_REQUEST
, INVALID_FIELD_IN_CDB
,
990 return check_condition_result
;
991 } else if (0x1 & cmd
[1]) { /* EVPD bit set */
992 int lu_id_num
, port_group_id
, target_dev_id
, len
;
994 int host_no
= devip
->sdbg_host
->shost
->host_no
;
996 port_group_id
= (((host_no
+ 1) & 0x7f) << 8) +
997 (devip
->channel
& 0x7f);
998 if (0 == scsi_debug_vpd_use_hostno
)
1000 lu_id_num
= devip
->wlun
? -1 : (((host_no
+ 1) * 2000) +
1001 (devip
->target
* 1000) + devip
->lun
);
1002 target_dev_id
= ((host_no
+ 1) * 2000) +
1003 (devip
->target
* 1000) - 3;
1004 len
= scnprintf(lu_id_str
, 6, "%d", lu_id_num
);
1005 if (0 == cmd
[2]) { /* supported vital product data pages */
1006 arr
[1] = cmd
[2]; /*sanity */
1008 arr
[n
++] = 0x0; /* this page */
1009 arr
[n
++] = 0x80; /* unit serial number */
1010 arr
[n
++] = 0x83; /* device identification */
1011 arr
[n
++] = 0x84; /* software interface ident. */
1012 arr
[n
++] = 0x85; /* management network addresses */
1013 arr
[n
++] = 0x86; /* extended inquiry */
1014 arr
[n
++] = 0x87; /* mode page policy */
1015 arr
[n
++] = 0x88; /* SCSI ports */
1016 arr
[n
++] = 0x89; /* ATA information */
1017 arr
[n
++] = 0xb0; /* Block limits (SBC) */
1018 arr
[3] = n
- 4; /* number of supported VPD pages */
1019 } else if (0x80 == cmd
[2]) { /* unit serial number */
1020 arr
[1] = cmd
[2]; /*sanity */
1022 memcpy(&arr
[4], lu_id_str
, len
);
1023 } else if (0x83 == cmd
[2]) { /* device identification */
1024 arr
[1] = cmd
[2]; /*sanity */
1025 arr
[3] = inquiry_evpd_83(&arr
[4], port_group_id
,
1026 target_dev_id
, lu_id_num
,
1028 } else if (0x84 == cmd
[2]) { /* Software interface ident. */
1029 arr
[1] = cmd
[2]; /*sanity */
1030 arr
[3] = inquiry_evpd_84(&arr
[4]);
1031 } else if (0x85 == cmd
[2]) { /* Management network addresses */
1032 arr
[1] = cmd
[2]; /*sanity */
1033 arr
[3] = inquiry_evpd_85(&arr
[4]);
1034 } else if (0x86 == cmd
[2]) { /* extended inquiry */
1035 arr
[1] = cmd
[2]; /*sanity */
1036 arr
[3] = 0x3c; /* number of following entries */
1037 arr
[4] = 0x0; /* no protection stuff */
1038 arr
[5] = 0x7; /* head of q, ordered + simple q's */
1039 } else if (0x87 == cmd
[2]) { /* mode page policy */
1040 arr
[1] = cmd
[2]; /*sanity */
1041 arr
[3] = 0x8; /* number of following entries */
1042 arr
[4] = 0x2; /* disconnect-reconnect mp */
1043 arr
[6] = 0x80; /* mlus, shared */
1044 arr
[8] = 0x18; /* protocol specific lu */
1045 arr
[10] = 0x82; /* mlus, per initiator port */
1046 } else if (0x88 == cmd
[2]) { /* SCSI Ports */
1047 arr
[1] = cmd
[2]; /*sanity */
1048 arr
[3] = inquiry_evpd_88(&arr
[4], target_dev_id
);
1049 } else if (0x89 == cmd
[2]) { /* ATA information */
1050 arr
[1] = cmd
[2]; /*sanity */
1051 n
= inquiry_evpd_89(&arr
[4]);
1053 arr
[3] = (n
& 0xff);
1054 } else if (0xb0 == cmd
[2]) { /* Block limits (SBC) */
1055 arr
[1] = cmd
[2]; /*sanity */
1056 arr
[3] = inquiry_evpd_b0(&arr
[4]);
1058 /* Illegal request, invalid field in cdb */
1059 mk_sense_buffer(devip
, ILLEGAL_REQUEST
,
1060 INVALID_FIELD_IN_CDB
, 0);
1062 return check_condition_result
;
1064 len
= min(((arr
[2] << 8) + arr
[3]) + 4, alloc_len
);
1065 ret
= fill_from_dev_buffer(scp
, arr
,
1066 min(len
, SDEBUG_MAX_INQ_ARR_SZ
));
1070 /* drops through here for a standard inquiry */
1071 arr
[1] = DEV_REMOVEABLE(target
) ? 0x80 : 0; /* Removable disk */
1072 arr
[2] = scsi_debug_scsi_level
;
1073 arr
[3] = 2; /* response_data_format==2 */
1074 arr
[4] = SDEBUG_LONG_INQ_SZ
- 5;
1075 if (0 == scsi_debug_vpd_use_hostno
)
1076 arr
[5] = 0x10; /* claim: implicit TGPS */
1077 arr
[6] = 0x10; /* claim: MultiP */
1078 /* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */
1079 arr
[7] = 0xa; /* claim: LINKED + CMDQUE */
1080 memcpy(&arr
[8], inq_vendor_id
, 8);
1081 memcpy(&arr
[16], inq_product_id
, 16);
1082 memcpy(&arr
[32], inq_product_rev
, 4);
1083 /* version descriptors (2 bytes each) follow */
1084 arr
[58] = 0x0; arr
[59] = 0x77; /* SAM-3 ANSI */
1085 arr
[60] = 0x3; arr
[61] = 0x14; /* SPC-3 ANSI */
1087 if (scsi_debug_ptype
== 0) {
1088 arr
[n
++] = 0x3; arr
[n
++] = 0x3d; /* SBC-2 ANSI */
1089 } else if (scsi_debug_ptype
== 1) {
1090 arr
[n
++] = 0x3; arr
[n
++] = 0x60; /* SSC-2 no version */
1092 arr
[n
++] = 0xc; arr
[n
++] = 0xf; /* SAS-1.1 rev 10 */
1093 ret
= fill_from_dev_buffer(scp
, arr
,
1094 min(alloc_len
, SDEBUG_LONG_INQ_SZ
));
1099 static int resp_requests(struct scsi_cmnd
* scp
,
1100 struct sdebug_dev_info
* devip
)
1102 unsigned char * sbuff
;
1103 unsigned char *cmd
= (unsigned char *)scp
->cmnd
;
1104 unsigned char arr
[SDEBUG_SENSE_LEN
];
1108 memset(arr
, 0, sizeof(arr
));
1109 if (devip
->reset
== 1)
1110 mk_sense_buffer(devip
, 0, NO_ADDITIONAL_SENSE
, 0);
1111 want_dsense
= !!(cmd
[1] & 1) || scsi_debug_dsense
;
1112 sbuff
= devip
->sense_buff
;
1113 if ((iec_m_pg
[2] & 0x4) && (6 == (iec_m_pg
[3] & 0xf))) {
1116 arr
[1] = 0x0; /* NO_SENSE in sense_key */
1117 arr
[2] = THRESHOLD_EXCEEDED
;
1118 arr
[3] = 0xff; /* TEST set and MRIE==6 */
1121 arr
[2] = 0x0; /* NO_SENSE in sense_key */
1122 arr
[7] = 0xa; /* 18 byte sense buffer */
1123 arr
[12] = THRESHOLD_EXCEEDED
;
1124 arr
[13] = 0xff; /* TEST set and MRIE==6 */
1127 memcpy(arr
, sbuff
, SDEBUG_SENSE_LEN
);
1128 if ((cmd
[1] & 1) && (! scsi_debug_dsense
)) {
1129 /* DESC bit set and sense_buff in fixed format */
1130 memset(arr
, 0, sizeof(arr
));
1132 arr
[1] = sbuff
[2]; /* sense key */
1133 arr
[2] = sbuff
[12]; /* asc */
1134 arr
[3] = sbuff
[13]; /* ascq */
1138 mk_sense_buffer(devip
, 0, NO_ADDITIONAL_SENSE
, 0);
1139 return fill_from_dev_buffer(scp
, arr
, len
);
1142 static int resp_start_stop(struct scsi_cmnd
* scp
,
1143 struct sdebug_dev_info
* devip
)
1145 unsigned char *cmd
= (unsigned char *)scp
->cmnd
;
1146 int power_cond
, errsts
, start
;
1148 if ((errsts
= check_readiness(scp
, 1, devip
)))
1150 power_cond
= (cmd
[4] & 0xf0) >> 4;
1152 mk_sense_buffer(devip
, ILLEGAL_REQUEST
, INVALID_FIELD_IN_CDB
,
1154 return check_condition_result
;
1157 if (start
== devip
->stopped
)
1158 devip
->stopped
= !start
;
1162 #define SDEBUG_READCAP_ARR_SZ 8
1163 static int resp_readcap(struct scsi_cmnd
* scp
,
1164 struct sdebug_dev_info
* devip
)
1166 unsigned char arr
[SDEBUG_READCAP_ARR_SZ
];
1170 if ((errsts
= check_readiness(scp
, 1, devip
)))
1172 /* following just in case virtual_gb changed */
1173 if (scsi_debug_virtual_gb
> 0) {
1174 sdebug_capacity
= 2048 * 1024;
1175 sdebug_capacity
*= scsi_debug_virtual_gb
;
1177 sdebug_capacity
= sdebug_store_sectors
;
1178 memset(arr
, 0, SDEBUG_READCAP_ARR_SZ
);
1179 if (sdebug_capacity
< 0xffffffff) {
1180 capac
= (unsigned int)sdebug_capacity
- 1;
1181 arr
[0] = (capac
>> 24);
1182 arr
[1] = (capac
>> 16) & 0xff;
1183 arr
[2] = (capac
>> 8) & 0xff;
1184 arr
[3] = capac
& 0xff;
1191 arr
[6] = (SECT_SIZE_PER(target
) >> 8) & 0xff;
1192 arr
[7] = SECT_SIZE_PER(target
) & 0xff;
1193 return fill_from_dev_buffer(scp
, arr
, SDEBUG_READCAP_ARR_SZ
);
1196 #define SDEBUG_READCAP16_ARR_SZ 32
1197 static int resp_readcap16(struct scsi_cmnd
* scp
,
1198 struct sdebug_dev_info
* devip
)
1200 unsigned char *cmd
= (unsigned char *)scp
->cmnd
;
1201 unsigned char arr
[SDEBUG_READCAP16_ARR_SZ
];
1202 unsigned long long capac
;
1203 int errsts
, k
, alloc_len
;
1205 if ((errsts
= check_readiness(scp
, 1, devip
)))
1207 alloc_len
= ((cmd
[10] << 24) + (cmd
[11] << 16) + (cmd
[12] << 8)
1209 /* following just in case virtual_gb changed */
1210 if (scsi_debug_virtual_gb
> 0) {
1211 sdebug_capacity
= 2048 * 1024;
1212 sdebug_capacity
*= scsi_debug_virtual_gb
;
1214 sdebug_capacity
= sdebug_store_sectors
;
1215 memset(arr
, 0, SDEBUG_READCAP16_ARR_SZ
);
1216 capac
= sdebug_capacity
- 1;
1217 for (k
= 0; k
< 8; ++k
, capac
>>= 8)
1218 arr
[7 - k
] = capac
& 0xff;
1219 arr
[8] = (SECT_SIZE_PER(target
) >> 24) & 0xff;
1220 arr
[9] = (SECT_SIZE_PER(target
) >> 16) & 0xff;
1221 arr
[10] = (SECT_SIZE_PER(target
) >> 8) & 0xff;
1222 arr
[11] = SECT_SIZE_PER(target
) & 0xff;
1223 return fill_from_dev_buffer(scp
, arr
,
1224 min(alloc_len
, SDEBUG_READCAP16_ARR_SZ
));
1227 #define SDEBUG_MAX_TGTPGS_ARR_SZ 1412
1229 static int resp_report_tgtpgs(struct scsi_cmnd
* scp
,
1230 struct sdebug_dev_info
* devip
)
1232 unsigned char *cmd
= (unsigned char *)scp
->cmnd
;
1233 unsigned char * arr
;
1234 int host_no
= devip
->sdbg_host
->shost
->host_no
;
1235 int n
, ret
, alen
, rlen
;
1236 int port_group_a
, port_group_b
, port_a
, port_b
;
1238 alen
= ((cmd
[6] << 24) + (cmd
[7] << 16) + (cmd
[8] << 8)
1241 arr
= kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ
, GFP_ATOMIC
);
1243 return DID_REQUEUE
<< 16;
1245 * EVPD page 0x88 states we have two ports, one
1246 * real and a fake port with no device connected.
1247 * So we create two port groups with one port each
1248 * and set the group with port B to unavailable.
1250 port_a
= 0x1; /* relative port A */
1251 port_b
= 0x2; /* relative port B */
1252 port_group_a
= (((host_no
+ 1) & 0x7f) << 8) +
1253 (devip
->channel
& 0x7f);
1254 port_group_b
= (((host_no
+ 1) & 0x7f) << 8) +
1255 (devip
->channel
& 0x7f) + 0x80;
1258 * The asymmetric access state is cycled according to the host_id.
1261 if (0 == scsi_debug_vpd_use_hostno
) {
1262 arr
[n
++] = host_no
% 3; /* Asymm access state */
1263 arr
[n
++] = 0x0F; /* claim: all states are supported */
1265 arr
[n
++] = 0x0; /* Active/Optimized path */
1266 arr
[n
++] = 0x01; /* claim: only support active/optimized paths */
1268 arr
[n
++] = (port_group_a
>> 8) & 0xff;
1269 arr
[n
++] = port_group_a
& 0xff;
1270 arr
[n
++] = 0; /* Reserved */
1271 arr
[n
++] = 0; /* Status code */
1272 arr
[n
++] = 0; /* Vendor unique */
1273 arr
[n
++] = 0x1; /* One port per group */
1274 arr
[n
++] = 0; /* Reserved */
1275 arr
[n
++] = 0; /* Reserved */
1276 arr
[n
++] = (port_a
>> 8) & 0xff;
1277 arr
[n
++] = port_a
& 0xff;
1278 arr
[n
++] = 3; /* Port unavailable */
1279 arr
[n
++] = 0x08; /* claim: only unavailalbe paths are supported */
1280 arr
[n
++] = (port_group_b
>> 8) & 0xff;
1281 arr
[n
++] = port_group_b
& 0xff;
1282 arr
[n
++] = 0; /* Reserved */
1283 arr
[n
++] = 0; /* Status code */
1284 arr
[n
++] = 0; /* Vendor unique */
1285 arr
[n
++] = 0x1; /* One port per group */
1286 arr
[n
++] = 0; /* Reserved */
1287 arr
[n
++] = 0; /* Reserved */
1288 arr
[n
++] = (port_b
>> 8) & 0xff;
1289 arr
[n
++] = port_b
& 0xff;
1292 arr
[0] = (rlen
>> 24) & 0xff;
1293 arr
[1] = (rlen
>> 16) & 0xff;
1294 arr
[2] = (rlen
>> 8) & 0xff;
1295 arr
[3] = rlen
& 0xff;
1298 * Return the smallest value of either
1299 * - The allocated length
1300 * - The constructed command length
1301 * - The maximum array size
1304 ret
= fill_from_dev_buffer(scp
, arr
,
1305 min(rlen
, SDEBUG_MAX_TGTPGS_ARR_SZ
));
1310 /* <<Following mode page info copied from ST318451LW>> */
1312 static int resp_err_recov_pg(unsigned char * p
, int pcontrol
, int target
)
1313 { /* Read-Write Error Recovery page for mode_sense */
1314 unsigned char err_recov_pg
[] = {0x1, 0xa, 0xc0, 11, 240, 0, 0, 0,
1317 memcpy(p
, err_recov_pg
, sizeof(err_recov_pg
));
1319 memset(p
+ 2, 0, sizeof(err_recov_pg
) - 2);
1320 return sizeof(err_recov_pg
);
1323 static int resp_disconnect_pg(unsigned char * p
, int pcontrol
, int target
)
1324 { /* Disconnect-Reconnect page for mode_sense */
1325 unsigned char disconnect_pg
[] = {0x2, 0xe, 128, 128, 0, 10, 0, 0,
1326 0, 0, 0, 0, 0, 0, 0, 0};
1328 memcpy(p
, disconnect_pg
, sizeof(disconnect_pg
));
1330 memset(p
+ 2, 0, sizeof(disconnect_pg
) - 2);
1331 return sizeof(disconnect_pg
);
1334 static int resp_format_pg(unsigned char * p
, int pcontrol
, int target
)
1335 { /* Format device page for mode_sense */
1336 unsigned char format_pg
[] = {0x3, 0x16, 0, 0, 0, 0, 0, 0,
1337 0, 0, 0, 0, 0, 0, 0, 0,
1338 0, 0, 0, 0, 0x40, 0, 0, 0};
1340 memcpy(p
, format_pg
, sizeof(format_pg
));
1341 p
[10] = (sdebug_sectors_per
>> 8) & 0xff;
1342 p
[11] = sdebug_sectors_per
& 0xff;
1343 p
[12] = (SECT_SIZE
>> 8) & 0xff;
1344 p
[13] = SECT_SIZE
& 0xff;
1345 if (DEV_REMOVEABLE(target
))
1346 p
[20] |= 0x20; /* should agree with INQUIRY */
1348 memset(p
+ 2, 0, sizeof(format_pg
) - 2);
1349 return sizeof(format_pg
);
1352 static int resp_caching_pg(unsigned char * p
, int pcontrol
, int target
)
1353 { /* Caching page for mode_sense */
1354 unsigned char caching_pg
[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
1355 0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0, 0, 0, 0, 0};
1357 memcpy(p
, caching_pg
, sizeof(caching_pg
));
1359 memset(p
+ 2, 0, sizeof(caching_pg
) - 2);
1360 return sizeof(caching_pg
);
1363 static int resp_ctrl_m_pg(unsigned char * p
, int pcontrol
, int target
)
1364 { /* Control mode page for mode_sense */
1365 unsigned char ch_ctrl_m_pg
[] = {/* 0xa, 10, */ 0x6, 0, 0, 0, 0, 0,
1367 unsigned char d_ctrl_m_pg
[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
1370 if (scsi_debug_dsense
)
1371 ctrl_m_pg
[2] |= 0x4;
1373 ctrl_m_pg
[2] &= ~0x4;
1374 memcpy(p
, ctrl_m_pg
, sizeof(ctrl_m_pg
));
1376 memcpy(p
+ 2, ch_ctrl_m_pg
, sizeof(ch_ctrl_m_pg
));
1377 else if (2 == pcontrol
)
1378 memcpy(p
, d_ctrl_m_pg
, sizeof(d_ctrl_m_pg
));
1379 return sizeof(ctrl_m_pg
);
1383 static int resp_iec_m_pg(unsigned char * p
, int pcontrol
, int target
)
1384 { /* Informational Exceptions control mode page for mode_sense */
1385 unsigned char ch_iec_m_pg
[] = {/* 0x1c, 0xa, */ 0x4, 0xf, 0, 0, 0, 0,
1387 unsigned char d_iec_m_pg
[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
1390 memcpy(p
, iec_m_pg
, sizeof(iec_m_pg
));
1392 memcpy(p
+ 2, ch_iec_m_pg
, sizeof(ch_iec_m_pg
));
1393 else if (2 == pcontrol
)
1394 memcpy(p
, d_iec_m_pg
, sizeof(d_iec_m_pg
));
1395 return sizeof(iec_m_pg
);
1398 static int resp_sas_sf_m_pg(unsigned char * p
, int pcontrol
, int target
)
1399 { /* SAS SSP mode page - short format for mode_sense */
1400 unsigned char sas_sf_m_pg
[] = {0x19, 0x6,
1401 0x6, 0x0, 0x7, 0xd0, 0x0, 0x0};
1403 memcpy(p
, sas_sf_m_pg
, sizeof(sas_sf_m_pg
));
1405 memset(p
+ 2, 0, sizeof(sas_sf_m_pg
) - 2);
1406 return sizeof(sas_sf_m_pg
);
1410 static int resp_sas_pcd_m_spg(unsigned char * p
, int pcontrol
, int target
,
1412 { /* SAS phy control and discover mode page for mode_sense */
1413 unsigned char sas_pcd_m_pg
[] = {0x59, 0x1, 0, 0x64, 0, 0x6, 0, 2,
1414 0, 0, 0, 0, 0x10, 0x9, 0x8, 0x0,
1415 0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0,
1416 0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1,
1417 0x2, 0, 0, 0, 0, 0, 0, 0,
1418 0x88, 0x99, 0, 0, 0, 0, 0, 0,
1419 0, 0, 0, 0, 0, 0, 0, 0,
1420 0, 1, 0, 0, 0x10, 0x9, 0x8, 0x0,
1421 0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0,
1422 0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1,
1423 0x3, 0, 0, 0, 0, 0, 0, 0,
1424 0x88, 0x99, 0, 0, 0, 0, 0, 0,
1425 0, 0, 0, 0, 0, 0, 0, 0,
1429 port_a
= target_dev_id
+ 1;
1430 port_b
= port_a
+ 1;
1431 memcpy(p
, sas_pcd_m_pg
, sizeof(sas_pcd_m_pg
));
1432 p
[20] = (port_a
>> 24);
1433 p
[21] = (port_a
>> 16) & 0xff;
1434 p
[22] = (port_a
>> 8) & 0xff;
1435 p
[23] = port_a
& 0xff;
1436 p
[48 + 20] = (port_b
>> 24);
1437 p
[48 + 21] = (port_b
>> 16) & 0xff;
1438 p
[48 + 22] = (port_b
>> 8) & 0xff;
1439 p
[48 + 23] = port_b
& 0xff;
1441 memset(p
+ 4, 0, sizeof(sas_pcd_m_pg
) - 4);
1442 return sizeof(sas_pcd_m_pg
);
1445 static int resp_sas_sha_m_spg(unsigned char * p
, int pcontrol
)
1446 { /* SAS SSP shared protocol specific port mode subpage */
1447 unsigned char sas_sha_m_pg
[] = {0x59, 0x2, 0, 0xc, 0, 0x6, 0x10, 0,
1448 0, 0, 0, 0, 0, 0, 0, 0,
1451 memcpy(p
, sas_sha_m_pg
, sizeof(sas_sha_m_pg
));
1453 memset(p
+ 4, 0, sizeof(sas_sha_m_pg
) - 4);
1454 return sizeof(sas_sha_m_pg
);
1457 #define SDEBUG_MAX_MSENSE_SZ 256
1459 static int resp_mode_sense(struct scsi_cmnd
* scp
, int target
,
1460 struct sdebug_dev_info
* devip
)
1462 unsigned char dbd
, llbaa
;
1463 int pcontrol
, pcode
, subpcode
, bd_len
;
1464 unsigned char dev_spec
;
1465 int k
, alloc_len
, msense_6
, offset
, len
, errsts
, target_dev_id
;
1467 unsigned char arr
[SDEBUG_MAX_MSENSE_SZ
];
1468 unsigned char *cmd
= (unsigned char *)scp
->cmnd
;
1470 if ((errsts
= check_readiness(scp
, 1, devip
)))
1472 dbd
= !!(cmd
[1] & 0x8);
1473 pcontrol
= (cmd
[2] & 0xc0) >> 6;
1474 pcode
= cmd
[2] & 0x3f;
1476 msense_6
= (MODE_SENSE
== cmd
[0]);
1477 llbaa
= msense_6
? 0 : !!(cmd
[1] & 0x10);
1478 if ((0 == scsi_debug_ptype
) && (0 == dbd
))
1479 bd_len
= llbaa
? 16 : 8;
1482 alloc_len
= msense_6
? cmd
[4] : ((cmd
[7] << 8) | cmd
[8]);
1483 memset(arr
, 0, SDEBUG_MAX_MSENSE_SZ
);
1484 if (0x3 == pcontrol
) { /* Saving values not supported */
1485 mk_sense_buffer(devip
, ILLEGAL_REQUEST
, SAVING_PARAMS_UNSUP
,
1487 return check_condition_result
;
1489 target_dev_id
= ((devip
->sdbg_host
->shost
->host_no
+ 1) * 2000) +
1490 (devip
->target
* 1000) - 3;
1491 /* set DPOFUA bit for disks */
1492 if (0 == scsi_debug_ptype
)
1493 dev_spec
= (DEV_READONLY(target
) ? 0x80 : 0x0) | 0x10;
1503 arr
[4] = 0x1; /* set LONGLBA bit */
1504 arr
[7] = bd_len
; /* assume 255 or less */
1508 if ((bd_len
> 0) && (0 == sdebug_capacity
)) {
1509 if (scsi_debug_virtual_gb
> 0) {
1510 sdebug_capacity
= 2048 * 1024;
1511 sdebug_capacity
*= scsi_debug_virtual_gb
;
1513 sdebug_capacity
= sdebug_store_sectors
;
1516 if (sdebug_capacity
> 0xfffffffe) {
1522 ap
[0] = (sdebug_capacity
>> 24) & 0xff;
1523 ap
[1] = (sdebug_capacity
>> 16) & 0xff;
1524 ap
[2] = (sdebug_capacity
>> 8) & 0xff;
1525 ap
[3] = sdebug_capacity
& 0xff;
1527 ap
[6] = (SECT_SIZE_PER(target
) >> 8) & 0xff;
1528 ap
[7] = SECT_SIZE_PER(target
) & 0xff;
1531 } else if (16 == bd_len
) {
1532 unsigned long long capac
= sdebug_capacity
;
1534 for (k
= 0; k
< 8; ++k
, capac
>>= 8)
1535 ap
[7 - k
] = capac
& 0xff;
1536 ap
[12] = (SECT_SIZE_PER(target
) >> 24) & 0xff;
1537 ap
[13] = (SECT_SIZE_PER(target
) >> 16) & 0xff;
1538 ap
[14] = (SECT_SIZE_PER(target
) >> 8) & 0xff;
1539 ap
[15] = SECT_SIZE_PER(target
) & 0xff;
1544 if ((subpcode
> 0x0) && (subpcode
< 0xff) && (0x19 != pcode
)) {
1545 /* TODO: Control Extension page */
1546 mk_sense_buffer(devip
, ILLEGAL_REQUEST
, INVALID_FIELD_IN_CDB
,
1548 return check_condition_result
;
1551 case 0x1: /* Read-Write error recovery page, direct access */
1552 len
= resp_err_recov_pg(ap
, pcontrol
, target
);
1555 case 0x2: /* Disconnect-Reconnect page, all devices */
1556 len
= resp_disconnect_pg(ap
, pcontrol
, target
);
1559 case 0x3: /* Format device page, direct access */
1560 len
= resp_format_pg(ap
, pcontrol
, target
);
1563 case 0x8: /* Caching page, direct access */
1564 len
= resp_caching_pg(ap
, pcontrol
, target
);
1567 case 0xa: /* Control Mode page, all devices */
1568 len
= resp_ctrl_m_pg(ap
, pcontrol
, target
);
1571 case 0x19: /* if spc==1 then sas phy, control+discover */
1572 if ((subpcode
> 0x2) && (subpcode
< 0xff)) {
1573 mk_sense_buffer(devip
, ILLEGAL_REQUEST
,
1574 INVALID_FIELD_IN_CDB
, 0);
1575 return check_condition_result
;
1578 if ((0x0 == subpcode
) || (0xff == subpcode
))
1579 len
+= resp_sas_sf_m_pg(ap
+ len
, pcontrol
, target
);
1580 if ((0x1 == subpcode
) || (0xff == subpcode
))
1581 len
+= resp_sas_pcd_m_spg(ap
+ len
, pcontrol
, target
,
1583 if ((0x2 == subpcode
) || (0xff == subpcode
))
1584 len
+= resp_sas_sha_m_spg(ap
+ len
, pcontrol
);
1587 case 0x1c: /* Informational Exceptions Mode page, all devices */
1588 len
= resp_iec_m_pg(ap
, pcontrol
, target
);
1591 case 0x3f: /* Read all Mode pages */
1592 if ((0 == subpcode
) || (0xff == subpcode
)) {
1593 len
= resp_err_recov_pg(ap
, pcontrol
, target
);
1594 len
+= resp_disconnect_pg(ap
+ len
, pcontrol
, target
);
1595 len
+= resp_format_pg(ap
+ len
, pcontrol
, target
);
1596 len
+= resp_caching_pg(ap
+ len
, pcontrol
, target
);
1597 len
+= resp_ctrl_m_pg(ap
+ len
, pcontrol
, target
);
1598 len
+= resp_sas_sf_m_pg(ap
+ len
, pcontrol
, target
);
1599 if (0xff == subpcode
) {
1600 len
+= resp_sas_pcd_m_spg(ap
+ len
, pcontrol
,
1601 target
, target_dev_id
);
1602 len
+= resp_sas_sha_m_spg(ap
+ len
, pcontrol
);
1604 len
+= resp_iec_m_pg(ap
+ len
, pcontrol
, target
);
1606 mk_sense_buffer(devip
, ILLEGAL_REQUEST
,
1607 INVALID_FIELD_IN_CDB
, 0);
1608 return check_condition_result
;
1613 mk_sense_buffer(devip
, ILLEGAL_REQUEST
, INVALID_FIELD_IN_CDB
,
1615 return check_condition_result
;
1618 arr
[0] = offset
- 1;
1620 arr
[0] = ((offset
- 2) >> 8) & 0xff;
1621 arr
[1] = (offset
- 2) & 0xff;
1623 return fill_from_dev_buffer(scp
, arr
, min(alloc_len
, offset
));
1626 #define SDEBUG_MAX_MSELECT_SZ 512
1628 static int resp_mode_select(struct scsi_cmnd
* scp
, int mselect6
,
1629 struct sdebug_dev_info
* devip
)
1631 int pf
, sp
, ps
, md_len
, bd_len
, off
, spf
, pg_len
;
1632 int param_len
, res
, errsts
, mpage
;
1633 unsigned char arr
[SDEBUG_MAX_MSELECT_SZ
];
1634 unsigned char *cmd
= (unsigned char *)scp
->cmnd
;
1636 if ((errsts
= check_readiness(scp
, 1, devip
)))
1638 memset(arr
, 0, sizeof(arr
));
1641 param_len
= mselect6
? cmd
[4] : ((cmd
[7] << 8) + cmd
[8]);
1642 if ((0 == pf
) || sp
|| (param_len
> SDEBUG_MAX_MSELECT_SZ
)) {
1643 mk_sense_buffer(devip
, ILLEGAL_REQUEST
,
1644 INVALID_FIELD_IN_CDB
, 0);
1645 return check_condition_result
;
1647 res
= fetch_to_dev_buffer(scp
, arr
, param_len
);
1649 return (DID_ERROR
<< 16);
1650 else if ((res
< param_len
) &&
1651 (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
))
1652 printk(KERN_INFO
"scsi_debug: mode_select: cdb indicated=%d, "
1653 " IO sent=%d bytes\n", param_len
, res
);
1654 md_len
= mselect6
? (arr
[0] + 1) : ((arr
[0] << 8) + arr
[1] + 2);
1655 bd_len
= mselect6
? arr
[3] : ((arr
[6] << 8) + arr
[7]);
1657 mk_sense_buffer(devip
, ILLEGAL_REQUEST
,
1658 INVALID_FIELD_IN_PARAM_LIST
, 0);
1659 return check_condition_result
;
1661 off
= bd_len
+ (mselect6
? 4 : 8);
1662 mpage
= arr
[off
] & 0x3f;
1663 ps
= !!(arr
[off
] & 0x80);
1665 mk_sense_buffer(devip
, ILLEGAL_REQUEST
,
1666 INVALID_FIELD_IN_PARAM_LIST
, 0);
1667 return check_condition_result
;
1669 spf
= !!(arr
[off
] & 0x40);
1670 pg_len
= spf
? ((arr
[off
+ 2] << 8) + arr
[off
+ 3] + 4) :
1672 if ((pg_len
+ off
) > param_len
) {
1673 mk_sense_buffer(devip
, ILLEGAL_REQUEST
,
1674 PARAMETER_LIST_LENGTH_ERR
, 0);
1675 return check_condition_result
;
1678 case 0xa: /* Control Mode page */
1679 if (ctrl_m_pg
[1] == arr
[off
+ 1]) {
1680 memcpy(ctrl_m_pg
+ 2, arr
+ off
+ 2,
1681 sizeof(ctrl_m_pg
) - 2);
1682 scsi_debug_dsense
= !!(ctrl_m_pg
[2] & 0x4);
1686 case 0x1c: /* Informational Exceptions Mode page */
1687 if (iec_m_pg
[1] == arr
[off
+ 1]) {
1688 memcpy(iec_m_pg
+ 2, arr
+ off
+ 2,
1689 sizeof(iec_m_pg
) - 2);
1696 mk_sense_buffer(devip
, ILLEGAL_REQUEST
,
1697 INVALID_FIELD_IN_PARAM_LIST
, 0);
1698 return check_condition_result
;
1701 static int resp_temp_l_pg(unsigned char * arr
)
1703 unsigned char temp_l_pg
[] = {0x0, 0x0, 0x3, 0x2, 0x0, 38,
1704 0x0, 0x1, 0x3, 0x2, 0x0, 65,
1707 memcpy(arr
, temp_l_pg
, sizeof(temp_l_pg
));
1708 return sizeof(temp_l_pg
);
1711 static int resp_ie_l_pg(unsigned char * arr
)
1713 unsigned char ie_l_pg
[] = {0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 38,
1716 memcpy(arr
, ie_l_pg
, sizeof(ie_l_pg
));
1717 if (iec_m_pg
[2] & 0x4) { /* TEST bit set */
1718 arr
[4] = THRESHOLD_EXCEEDED
;
1721 return sizeof(ie_l_pg
);
1724 #define SDEBUG_MAX_LSENSE_SZ 512
1726 static int resp_log_sense(struct scsi_cmnd
* scp
,
1727 struct sdebug_dev_info
* devip
)
1729 int ppc
, sp
, pcontrol
, pcode
, subpcode
, alloc_len
, errsts
, len
, n
;
1730 unsigned char arr
[SDEBUG_MAX_LSENSE_SZ
];
1731 unsigned char *cmd
= (unsigned char *)scp
->cmnd
;
1733 if ((errsts
= check_readiness(scp
, 1, devip
)))
1735 memset(arr
, 0, sizeof(arr
));
1739 mk_sense_buffer(devip
, ILLEGAL_REQUEST
,
1740 INVALID_FIELD_IN_CDB
, 0);
1741 return check_condition_result
;
1743 pcontrol
= (cmd
[2] & 0xc0) >> 6;
1744 pcode
= cmd
[2] & 0x3f;
1745 subpcode
= cmd
[3] & 0xff;
1746 alloc_len
= (cmd
[7] << 8) + cmd
[8];
1748 if (0 == subpcode
) {
1750 case 0x0: /* Supported log pages log page */
1752 arr
[n
++] = 0x0; /* this page */
1753 arr
[n
++] = 0xd; /* Temperature */
1754 arr
[n
++] = 0x2f; /* Informational exceptions */
1757 case 0xd: /* Temperature log page */
1758 arr
[3] = resp_temp_l_pg(arr
+ 4);
1760 case 0x2f: /* Informational exceptions log page */
1761 arr
[3] = resp_ie_l_pg(arr
+ 4);
1764 mk_sense_buffer(devip
, ILLEGAL_REQUEST
,
1765 INVALID_FIELD_IN_CDB
, 0);
1766 return check_condition_result
;
1768 } else if (0xff == subpcode
) {
1772 case 0x0: /* Supported log pages and subpages log page */
1775 arr
[n
++] = 0x0; /* 0,0 page */
1777 arr
[n
++] = 0xff; /* this page */
1779 arr
[n
++] = 0x0; /* Temperature */
1781 arr
[n
++] = 0x0; /* Informational exceptions */
1784 case 0xd: /* Temperature subpages */
1787 arr
[n
++] = 0x0; /* Temperature */
1790 case 0x2f: /* Informational exceptions subpages */
1793 arr
[n
++] = 0x0; /* Informational exceptions */
1797 mk_sense_buffer(devip
, ILLEGAL_REQUEST
,
1798 INVALID_FIELD_IN_CDB
, 0);
1799 return check_condition_result
;
1802 mk_sense_buffer(devip
, ILLEGAL_REQUEST
,
1803 INVALID_FIELD_IN_CDB
, 0);
1804 return check_condition_result
;
1806 len
= min(((arr
[2] << 8) + arr
[3]) + 4, alloc_len
);
1807 return fill_from_dev_buffer(scp
, arr
,
1808 min(len
, SDEBUG_MAX_INQ_ARR_SZ
));
1811 static int resp_read(struct scsi_cmnd
* SCpnt
, unsigned long long lba
,
1812 unsigned int num
, struct sdebug_dev_info
* devip
)
1814 unsigned long iflags
;
1815 unsigned int block
, from_bottom
;
1816 unsigned long long u
;
1819 if (lba
+ num
> sdebug_capacity
) {
1820 mk_sense_buffer(devip
, ILLEGAL_REQUEST
, ADDR_OUT_OF_RANGE
,
1822 return check_condition_result
;
1824 /* transfer length excessive (tie in to block limits VPD page) */
1825 if (num
> sdebug_store_sectors
) {
1826 mk_sense_buffer(devip
, ILLEGAL_REQUEST
, INVALID_FIELD_IN_CDB
,
1828 return check_condition_result
;
1830 if ((SCSI_DEBUG_OPT_MEDIUM_ERR
& scsi_debug_opts
) &&
1831 (lba
<= OPT_MEDIUM_ERR_ADDR
) &&
1832 ((lba
+ num
) > OPT_MEDIUM_ERR_ADDR
)) {
1833 /* claim unrecoverable read error */
1834 mk_sense_buffer(devip
, MEDIUM_ERROR
, UNRECOVERED_READ_ERR
,
1836 /* set info field and valid bit for fixed descriptor */
1837 if (0x70 == (devip
->sense_buff
[0] & 0x7f)) {
1838 devip
->sense_buff
[0] |= 0x80; /* Valid bit */
1839 ret
= OPT_MEDIUM_ERR_ADDR
;
1840 devip
->sense_buff
[3] = (ret
>> 24) & 0xff;
1841 devip
->sense_buff
[4] = (ret
>> 16) & 0xff;
1842 devip
->sense_buff
[5] = (ret
>> 8) & 0xff;
1843 devip
->sense_buff
[6] = ret
& 0xff;
1845 return check_condition_result
;
1847 read_lock_irqsave(&atomic_rw
, iflags
);
1848 if ((lba
+ num
) <= sdebug_store_sectors
)
1849 ret
= fill_from_dev_buffer(SCpnt
,
1850 fake_storep
+ (lba
* SECT_SIZE
),
1853 /* modulo when one arg is 64 bits needs do_div() */
1855 block
= do_div(u
, sdebug_store_sectors
);
1857 if ((block
+ num
) > sdebug_store_sectors
)
1858 from_bottom
= (block
+ num
) - sdebug_store_sectors
;
1859 ret
= fill_from_dev_buffer(SCpnt
,
1860 fake_storep
+ (block
* SECT_SIZE
),
1861 (num
- from_bottom
) * SECT_SIZE
);
1862 if ((0 == ret
) && (from_bottom
> 0))
1863 ret
= fill_from_dev_buffer(SCpnt
, fake_storep
,
1864 from_bottom
* SECT_SIZE
);
1866 read_unlock_irqrestore(&atomic_rw
, iflags
);
1870 static int resp_write(struct scsi_cmnd
* SCpnt
, unsigned long long lba
,
1871 unsigned int num
, struct sdebug_dev_info
* devip
)
1873 unsigned long iflags
;
1874 unsigned int block
, to_bottom
;
1875 unsigned long long u
;
1878 if (lba
+ num
> sdebug_capacity
) {
1879 mk_sense_buffer(devip
, ILLEGAL_REQUEST
, ADDR_OUT_OF_RANGE
,
1881 return check_condition_result
;
1883 /* transfer length excessive (tie in to block limits VPD page) */
1884 if (num
> sdebug_store_sectors
) {
1885 mk_sense_buffer(devip
, ILLEGAL_REQUEST
, INVALID_FIELD_IN_CDB
,
1887 return check_condition_result
;
1890 write_lock_irqsave(&atomic_rw
, iflags
);
1891 if ((lba
+ num
) <= sdebug_store_sectors
)
1892 res
= fetch_to_dev_buffer(SCpnt
,
1893 fake_storep
+ (lba
* SECT_SIZE
),
1896 /* modulo when one arg is 64 bits needs do_div() */
1898 block
= do_div(u
, sdebug_store_sectors
);
1900 if ((block
+ num
) > sdebug_store_sectors
)
1901 to_bottom
= (block
+ num
) - sdebug_store_sectors
;
1902 res
= fetch_to_dev_buffer(SCpnt
,
1903 fake_storep
+ (block
* SECT_SIZE
),
1904 (num
- to_bottom
) * SECT_SIZE
);
1905 if ((0 == res
) && (to_bottom
> 0))
1906 res
= fetch_to_dev_buffer(SCpnt
, fake_storep
,
1907 to_bottom
* SECT_SIZE
);
1909 write_unlock_irqrestore(&atomic_rw
, iflags
);
1911 return (DID_ERROR
<< 16);
1912 else if ((res
< (num
* SECT_SIZE
)) &&
1913 (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
))
1914 printk(KERN_INFO
"scsi_debug: write: cdb indicated=%u, "
1915 " IO sent=%d bytes\n", num
* SECT_SIZE
, res
);
1919 #define SDEBUG_RLUN_ARR_SZ 256
1921 static int resp_report_luns(struct scsi_cmnd
* scp
,
1922 struct sdebug_dev_info
* devip
)
1924 unsigned int alloc_len
;
1925 int lun_cnt
, i
, upper
, num
, n
, wlun
, lun
;
1926 unsigned char *cmd
= (unsigned char *)scp
->cmnd
;
1927 int select_report
= (int)cmd
[2];
1928 struct scsi_lun
*one_lun
;
1929 unsigned char arr
[SDEBUG_RLUN_ARR_SZ
];
1930 unsigned char * max_addr
;
1932 alloc_len
= cmd
[9] + (cmd
[8] << 8) + (cmd
[7] << 16) + (cmd
[6] << 24);
1933 if ((alloc_len
< 4) || (select_report
> 2)) {
1934 mk_sense_buffer(devip
, ILLEGAL_REQUEST
, INVALID_FIELD_IN_CDB
,
1936 return check_condition_result
;
1938 /* can produce response with up to 16k luns (lun 0 to lun 16383) */
1939 memset(arr
, 0, SDEBUG_RLUN_ARR_SZ
);
1940 lun_cnt
= scsi_debug_max_luns
;
1941 if (1 == select_report
)
1943 else if (scsi_debug_no_lun_0
&& (lun_cnt
> 0))
1945 wlun
= (select_report
> 0) ? 1 : 0;
1946 num
= lun_cnt
+ wlun
;
1947 arr
[2] = ((sizeof(struct scsi_lun
) * num
) >> 8) & 0xff;
1948 arr
[3] = (sizeof(struct scsi_lun
) * num
) & 0xff;
1949 n
= min((int)((SDEBUG_RLUN_ARR_SZ
- 8) /
1950 sizeof(struct scsi_lun
)), num
);
1955 one_lun
= (struct scsi_lun
*) &arr
[8];
1956 max_addr
= arr
+ SDEBUG_RLUN_ARR_SZ
;
1957 for (i
= 0, lun
= (scsi_debug_no_lun_0
? 1 : 0);
1958 ((i
< lun_cnt
) && ((unsigned char *)(one_lun
+ i
) < max_addr
));
1960 upper
= (lun
>> 8) & 0x3f;
1962 one_lun
[i
].scsi_lun
[0] =
1963 (upper
| (SAM2_LUN_ADDRESS_METHOD
<< 6));
1964 one_lun
[i
].scsi_lun
[1] = lun
& 0xff;
1967 one_lun
[i
].scsi_lun
[0] = (SAM2_WLUN_REPORT_LUNS
>> 8) & 0xff;
1968 one_lun
[i
].scsi_lun
[1] = SAM2_WLUN_REPORT_LUNS
& 0xff;
1971 alloc_len
= (unsigned char *)(one_lun
+ i
) - arr
;
1972 return fill_from_dev_buffer(scp
, arr
,
1973 min((int)alloc_len
, SDEBUG_RLUN_ARR_SZ
));
1976 /* When timer goes off this function is called. */
1977 static void timer_intr_handler(unsigned long indx
)
1979 struct sdebug_queued_cmd
* sqcp
;
1980 unsigned long iflags
;
1982 if (indx
>= SCSI_DEBUG_CANQUEUE
) {
1983 printk(KERN_ERR
"scsi_debug:timer_intr_handler: indx too "
1987 spin_lock_irqsave(&queued_arr_lock
, iflags
);
1988 sqcp
= &queued_arr
[(int)indx
];
1989 if (! sqcp
->in_use
) {
1990 printk(KERN_ERR
"scsi_debug:timer_intr_handler: Unexpected "
1992 spin_unlock_irqrestore(&queued_arr_lock
, iflags
);
1996 if (sqcp
->done_funct
) {
1997 sqcp
->a_cmnd
->result
= sqcp
->scsi_result
;
1998 sqcp
->done_funct(sqcp
->a_cmnd
); /* callback to mid level */
2000 sqcp
->done_funct
= NULL
;
2001 spin_unlock_irqrestore(&queued_arr_lock
, iflags
);
2004 static int scsi_debug_slave_alloc(struct scsi_device
* sdp
)
2006 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
)
2007 printk(KERN_INFO
"scsi_debug: slave_alloc <%u %u %u %u>\n",
2008 sdp
->host
->host_no
, sdp
->channel
, sdp
->id
, sdp
->lun
);
2012 static int scsi_debug_slave_configure(struct scsi_device
* sdp
)
2014 struct sdebug_dev_info
* devip
;
2016 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
)
2017 printk(KERN_INFO
"scsi_debug: slave_configure <%u %u %u %u>\n",
2018 sdp
->host
->host_no
, sdp
->channel
, sdp
->id
, sdp
->lun
);
2019 if (sdp
->host
->max_cmd_len
!= SCSI_DEBUG_MAX_CMD_LEN
)
2020 sdp
->host
->max_cmd_len
= SCSI_DEBUG_MAX_CMD_LEN
;
2021 devip
= devInfoReg(sdp
);
2023 return 1; /* no resources, will be marked offline */
2024 sdp
->hostdata
= devip
;
2025 if (sdp
->host
->cmd_per_lun
)
2026 scsi_adjust_queue_depth(sdp
, SDEBUG_TAGGED_QUEUING
,
2027 sdp
->host
->cmd_per_lun
);
2028 blk_queue_max_segment_size(sdp
->request_queue
, 256 * 1024);
2032 static void scsi_debug_slave_destroy(struct scsi_device
* sdp
)
2034 struct sdebug_dev_info
* devip
=
2035 (struct sdebug_dev_info
*)sdp
->hostdata
;
2037 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
)
2038 printk(KERN_INFO
"scsi_debug: slave_destroy <%u %u %u %u>\n",
2039 sdp
->host
->host_no
, sdp
->channel
, sdp
->id
, sdp
->lun
);
2041 /* make this slot avaliable for re-use */
2043 sdp
->hostdata
= NULL
;
2047 static struct sdebug_dev_info
* devInfoReg(struct scsi_device
* sdev
)
2049 struct sdebug_host_info
* sdbg_host
;
2050 struct sdebug_dev_info
* open_devip
= NULL
;
2051 struct sdebug_dev_info
* devip
=
2052 (struct sdebug_dev_info
*)sdev
->hostdata
;
2056 sdbg_host
= *(struct sdebug_host_info
**) sdev
->host
->hostdata
;
2058 printk(KERN_ERR
"Host info NULL\n");
2061 list_for_each_entry(devip
, &sdbg_host
->dev_info_list
, dev_list
) {
2062 if ((devip
->used
) && (devip
->channel
== sdev
->channel
) &&
2063 (devip
->target
== sdev
->id
) &&
2064 (devip
->lun
== sdev
->lun
))
2067 if ((!devip
->used
) && (!open_devip
))
2071 if (NULL
== open_devip
) { /* try and make a new one */
2072 open_devip
= kzalloc(sizeof(*open_devip
),GFP_ATOMIC
);
2073 if (NULL
== open_devip
) {
2074 printk(KERN_ERR
"%s: out of memory at line %d\n",
2075 __FUNCTION__
, __LINE__
);
2078 open_devip
->sdbg_host
= sdbg_host
;
2079 list_add_tail(&open_devip
->dev_list
,
2080 &sdbg_host
->dev_info_list
);
2083 open_devip
->channel
= sdev
->channel
;
2084 open_devip
->target
= sdev
->id
;
2085 open_devip
->lun
= sdev
->lun
;
2086 open_devip
->sdbg_host
= sdbg_host
;
2087 open_devip
->reset
= 1;
2088 open_devip
->used
= 1;
2089 memset(open_devip
->sense_buff
, 0, SDEBUG_SENSE_LEN
);
2090 if (scsi_debug_dsense
)
2091 open_devip
->sense_buff
[0] = 0x72;
2093 open_devip
->sense_buff
[0] = 0x70;
2094 open_devip
->sense_buff
[7] = 0xa;
2096 if (sdev
->lun
== SAM2_WLUN_REPORT_LUNS
)
2097 open_devip
->wlun
= SAM2_WLUN_REPORT_LUNS
& 0xff;
2103 static void mk_sense_buffer(struct sdebug_dev_info
* devip
, int key
,
2106 unsigned char * sbuff
;
2108 sbuff
= devip
->sense_buff
;
2109 memset(sbuff
, 0, SDEBUG_SENSE_LEN
);
2110 if (scsi_debug_dsense
) {
2111 sbuff
[0] = 0x72; /* descriptor, current */
2116 sbuff
[0] = 0x70; /* fixed, current */
2118 sbuff
[7] = 0xa; /* implies 18 byte sense buffer */
2122 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
)
2123 printk(KERN_INFO
"scsi_debug: [sense_key,asc,ascq]: "
2124 "[0x%x,0x%x,0x%x]\n", key
, asc
, asq
);
2127 static int scsi_debug_abort(struct scsi_cmnd
* SCpnt
)
2129 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
)
2130 printk(KERN_INFO
"scsi_debug: abort\n");
2132 stop_queued_cmnd(SCpnt
);
2136 static int scsi_debug_biosparam(struct scsi_device
*sdev
,
2137 struct block_device
* bdev
, sector_t capacity
, int *info
)
2142 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
)
2143 printk(KERN_INFO
"scsi_debug: biosparam\n");
2144 buf
= scsi_bios_ptable(bdev
);
2146 res
= scsi_partsize(buf
, capacity
,
2147 &info
[2], &info
[0], &info
[1]);
2152 info
[0] = sdebug_heads
;
2153 info
[1] = sdebug_sectors_per
;
2154 info
[2] = sdebug_cylinders_per
;
2158 static int scsi_debug_device_reset(struct scsi_cmnd
* SCpnt
)
2160 struct sdebug_dev_info
* devip
;
2162 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
)
2163 printk(KERN_INFO
"scsi_debug: device_reset\n");
2166 devip
= devInfoReg(SCpnt
->device
);
2173 static int scsi_debug_bus_reset(struct scsi_cmnd
* SCpnt
)
2175 struct sdebug_host_info
*sdbg_host
;
2176 struct sdebug_dev_info
* dev_info
;
2177 struct scsi_device
* sdp
;
2178 struct Scsi_Host
* hp
;
2180 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
)
2181 printk(KERN_INFO
"scsi_debug: bus_reset\n");
2183 if (SCpnt
&& ((sdp
= SCpnt
->device
)) && ((hp
= sdp
->host
))) {
2184 sdbg_host
= *(struct sdebug_host_info
**) hp
->hostdata
;
2186 list_for_each_entry(dev_info
,
2187 &sdbg_host
->dev_info_list
,
2189 dev_info
->reset
= 1;
2195 static int scsi_debug_host_reset(struct scsi_cmnd
* SCpnt
)
2197 struct sdebug_host_info
* sdbg_host
;
2198 struct sdebug_dev_info
* dev_info
;
2200 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
)
2201 printk(KERN_INFO
"scsi_debug: host_reset\n");
2203 spin_lock(&sdebug_host_list_lock
);
2204 list_for_each_entry(sdbg_host
, &sdebug_host_list
, host_list
) {
2205 list_for_each_entry(dev_info
, &sdbg_host
->dev_info_list
,
2207 dev_info
->reset
= 1;
2209 spin_unlock(&sdebug_host_list_lock
);
2214 /* Returns 1 if found 'cmnd' and deleted its timer. else returns 0 */
2215 static int stop_queued_cmnd(struct scsi_cmnd
* cmnd
)
2217 unsigned long iflags
;
2219 struct sdebug_queued_cmd
* sqcp
;
2221 spin_lock_irqsave(&queued_arr_lock
, iflags
);
2222 for (k
= 0; k
< SCSI_DEBUG_CANQUEUE
; ++k
) {
2223 sqcp
= &queued_arr
[k
];
2224 if (sqcp
->in_use
&& (cmnd
== sqcp
->a_cmnd
)) {
2225 del_timer_sync(&sqcp
->cmnd_timer
);
2227 sqcp
->a_cmnd
= NULL
;
2231 spin_unlock_irqrestore(&queued_arr_lock
, iflags
);
2232 return (k
< SCSI_DEBUG_CANQUEUE
) ? 1 : 0;
2235 /* Deletes (stops) timers of all queued commands */
2236 static void stop_all_queued(void)
2238 unsigned long iflags
;
2240 struct sdebug_queued_cmd
* sqcp
;
2242 spin_lock_irqsave(&queued_arr_lock
, iflags
);
2243 for (k
= 0; k
< SCSI_DEBUG_CANQUEUE
; ++k
) {
2244 sqcp
= &queued_arr
[k
];
2245 if (sqcp
->in_use
&& sqcp
->a_cmnd
) {
2246 del_timer_sync(&sqcp
->cmnd_timer
);
2248 sqcp
->a_cmnd
= NULL
;
2251 spin_unlock_irqrestore(&queued_arr_lock
, iflags
);
2254 /* Initializes timers in queued array */
2255 static void __init
init_all_queued(void)
2257 unsigned long iflags
;
2259 struct sdebug_queued_cmd
* sqcp
;
2261 spin_lock_irqsave(&queued_arr_lock
, iflags
);
2262 for (k
= 0; k
< SCSI_DEBUG_CANQUEUE
; ++k
) {
2263 sqcp
= &queued_arr
[k
];
2264 init_timer(&sqcp
->cmnd_timer
);
2266 sqcp
->a_cmnd
= NULL
;
2268 spin_unlock_irqrestore(&queued_arr_lock
, iflags
);
2271 static void __init
sdebug_build_parts(unsigned char * ramp
)
2273 struct partition
* pp
;
2274 int starts
[SDEBUG_MAX_PARTS
+ 2];
2275 int sectors_per_part
, num_sectors
, k
;
2276 int heads_by_sects
, start_sec
, end_sec
;
2278 /* assume partition table already zeroed */
2279 if ((scsi_debug_num_parts
< 1) || (sdebug_store_size
< 1048576))
2281 if (scsi_debug_num_parts
> SDEBUG_MAX_PARTS
) {
2282 scsi_debug_num_parts
= SDEBUG_MAX_PARTS
;
2283 printk(KERN_WARNING
"scsi_debug:build_parts: reducing "
2284 "partitions to %d\n", SDEBUG_MAX_PARTS
);
2286 num_sectors
= (int)sdebug_store_sectors
;
2287 sectors_per_part
= (num_sectors
- sdebug_sectors_per
)
2288 / scsi_debug_num_parts
;
2289 heads_by_sects
= sdebug_heads
* sdebug_sectors_per
;
2290 starts
[0] = sdebug_sectors_per
;
2291 for (k
= 1; k
< scsi_debug_num_parts
; ++k
)
2292 starts
[k
] = ((k
* sectors_per_part
) / heads_by_sects
)
2294 starts
[scsi_debug_num_parts
] = num_sectors
;
2295 starts
[scsi_debug_num_parts
+ 1] = 0;
2297 ramp
[510] = 0x55; /* magic partition markings */
2299 pp
= (struct partition
*)(ramp
+ 0x1be);
2300 for (k
= 0; starts
[k
+ 1]; ++k
, ++pp
) {
2301 start_sec
= starts
[k
];
2302 end_sec
= starts
[k
+ 1] - 1;
2305 pp
->cyl
= start_sec
/ heads_by_sects
;
2306 pp
->head
= (start_sec
- (pp
->cyl
* heads_by_sects
))
2307 / sdebug_sectors_per
;
2308 pp
->sector
= (start_sec
% sdebug_sectors_per
) + 1;
2310 pp
->end_cyl
= end_sec
/ heads_by_sects
;
2311 pp
->end_head
= (end_sec
- (pp
->end_cyl
* heads_by_sects
))
2312 / sdebug_sectors_per
;
2313 pp
->end_sector
= (end_sec
% sdebug_sectors_per
) + 1;
2315 pp
->start_sect
= start_sec
;
2316 pp
->nr_sects
= end_sec
- start_sec
+ 1;
2317 pp
->sys_ind
= 0x83; /* plain Linux partition */
2321 static int schedule_resp(struct scsi_cmnd
* cmnd
,
2322 struct sdebug_dev_info
* devip
,
2323 done_funct_t done
, int scsi_result
, int delta_jiff
)
2325 if ((SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
) && cmnd
) {
2327 struct scsi_device
* sdp
= cmnd
->device
;
2329 printk(KERN_INFO
"scsi_debug: <%u %u %u %u> "
2330 "non-zero result=0x%x\n", sdp
->host
->host_no
,
2331 sdp
->channel
, sdp
->id
, sdp
->lun
, scsi_result
);
2334 if (cmnd
&& devip
) {
2335 /* simulate autosense by this driver */
2336 if (SAM_STAT_CHECK_CONDITION
== (scsi_result
& 0xff))
2337 memcpy(cmnd
->sense_buffer
, devip
->sense_buff
,
2338 (SCSI_SENSE_BUFFERSIZE
> SDEBUG_SENSE_LEN
) ?
2339 SDEBUG_SENSE_LEN
: SCSI_SENSE_BUFFERSIZE
);
2341 if (delta_jiff
<= 0) {
2343 cmnd
->result
= scsi_result
;
2348 unsigned long iflags
;
2350 struct sdebug_queued_cmd
* sqcp
= NULL
;
2352 spin_lock_irqsave(&queued_arr_lock
, iflags
);
2353 for (k
= 0; k
< SCSI_DEBUG_CANQUEUE
; ++k
) {
2354 sqcp
= &queued_arr
[k
];
2358 if (k
>= SCSI_DEBUG_CANQUEUE
) {
2359 spin_unlock_irqrestore(&queued_arr_lock
, iflags
);
2360 printk(KERN_WARNING
"scsi_debug: can_queue exceeded\n");
2361 return 1; /* report busy to mid level */
2364 sqcp
->a_cmnd
= cmnd
;
2365 sqcp
->scsi_result
= scsi_result
;
2366 sqcp
->done_funct
= done
;
2367 sqcp
->cmnd_timer
.function
= timer_intr_handler
;
2368 sqcp
->cmnd_timer
.data
= k
;
2369 sqcp
->cmnd_timer
.expires
= jiffies
+ delta_jiff
;
2370 add_timer(&sqcp
->cmnd_timer
);
2371 spin_unlock_irqrestore(&queued_arr_lock
, iflags
);
2378 /* Note: The following macros create attribute files in the
2379 /sys/module/scsi_debug/parameters directory. Unfortunately this
2380 driver is unaware of a change and cannot trigger auxiliary actions
2381 as it can when the corresponding attribute in the
2382 /sys/bus/pseudo/drivers/scsi_debug directory is changed.
2384 module_param_named(add_host
, scsi_debug_add_host
, int, S_IRUGO
| S_IWUSR
);
2385 module_param_named(delay
, scsi_debug_delay
, int, S_IRUGO
| S_IWUSR
);
2386 module_param_named(dev_size_mb
, scsi_debug_dev_size_mb
, int, S_IRUGO
);
2387 module_param_named(dsense
, scsi_debug_dsense
, int, S_IRUGO
| S_IWUSR
);
2388 module_param_named(every_nth
, scsi_debug_every_nth
, int, S_IRUGO
| S_IWUSR
);
2389 module_param_named(fake_rw
, scsi_debug_fake_rw
, int, S_IRUGO
| S_IWUSR
);
2390 module_param_named(max_luns
, scsi_debug_max_luns
, int, S_IRUGO
| S_IWUSR
);
2391 module_param_named(no_lun_0
, scsi_debug_no_lun_0
, int, S_IRUGO
| S_IWUSR
);
2392 module_param_named(num_parts
, scsi_debug_num_parts
, int, S_IRUGO
);
2393 module_param_named(num_tgts
, scsi_debug_num_tgts
, int, S_IRUGO
| S_IWUSR
);
2394 module_param_named(opts
, scsi_debug_opts
, int, S_IRUGO
| S_IWUSR
);
2395 module_param_named(ptype
, scsi_debug_ptype
, int, S_IRUGO
| S_IWUSR
);
2396 module_param_named(scsi_level
, scsi_debug_scsi_level
, int, S_IRUGO
);
2397 module_param_named(virtual_gb
, scsi_debug_virtual_gb
, int, S_IRUGO
| S_IWUSR
);
2398 module_param_named(vpd_use_hostno
, scsi_debug_vpd_use_hostno
, int,
2401 MODULE_AUTHOR("Eric Youngdale + Douglas Gilbert");
2402 MODULE_DESCRIPTION("SCSI debug adapter driver");
2403 MODULE_LICENSE("GPL");
2404 MODULE_VERSION(SCSI_DEBUG_VERSION
);
2406 MODULE_PARM_DESC(add_host
, "0..127 hosts allowed(def=1)");
2407 MODULE_PARM_DESC(delay
, "# of jiffies to delay response(def=1)");
2408 MODULE_PARM_DESC(dev_size_mb
, "size in MB of ram shared by devs(def=8)");
2409 MODULE_PARM_DESC(dsense
, "use descriptor sense format(def=0 -> fixed)");
2410 MODULE_PARM_DESC(every_nth
, "timeout every nth command(def=0)");
2411 MODULE_PARM_DESC(fake_rw
, "fake reads/writes instead of copying (def=0)");
2412 MODULE_PARM_DESC(max_luns
, "number of LUNs per target to simulate(def=1)");
2413 MODULE_PARM_DESC(no_lun_0
, "no LU number 0 (def=0 -> have lun 0)");
2414 MODULE_PARM_DESC(num_parts
, "number of partitions(def=0)");
2415 MODULE_PARM_DESC(num_tgts
, "number of targets per host to simulate(def=1)");
2416 MODULE_PARM_DESC(opts
, "1->noise, 2->medium_err, 4->timeout, 8->recovered_err... (def=0)");
2417 MODULE_PARM_DESC(ptype
, "SCSI peripheral type(def=0[disk])");
2418 MODULE_PARM_DESC(scsi_level
, "SCSI level to simulate(def=5[SPC-3])");
2419 MODULE_PARM_DESC(virtual_gb
, "virtual gigabyte size (def=0 -> use dev_size_mb)");
2420 MODULE_PARM_DESC(vpd_use_hostno
, "0 -> dev ids ignore hostno (def=1 -> unique dev ids)");
2423 static char sdebug_info
[256];
2425 static const char * scsi_debug_info(struct Scsi_Host
* shp
)
2427 sprintf(sdebug_info
, "scsi_debug, version %s [%s], "
2428 "dev_size_mb=%d, opts=0x%x", SCSI_DEBUG_VERSION
,
2429 scsi_debug_version_date
, scsi_debug_dev_size_mb
,
2434 /* scsi_debug_proc_info
2435 * Used if the driver currently has no own support for /proc/scsi
2437 static int scsi_debug_proc_info(struct Scsi_Host
*host
, char *buffer
, char **start
, off_t offset
,
2438 int length
, int inout
)
2440 int len
, pos
, begin
;
2443 orig_length
= length
;
2447 int minLen
= length
> 15 ? 15 : length
;
2449 if (!capable(CAP_SYS_ADMIN
) || !capable(CAP_SYS_RAWIO
))
2451 memcpy(arr
, buffer
, minLen
);
2453 if (1 != sscanf(arr
, "%d", &pos
))
2455 scsi_debug_opts
= pos
;
2456 if (scsi_debug_every_nth
!= 0)
2457 scsi_debug_cmnd_count
= 0;
2461 pos
= len
= sprintf(buffer
, "scsi_debug adapter driver, version "
2463 "num_tgts=%d, shared (ram) size=%d MB, opts=0x%x, "
2464 "every_nth=%d(curr:%d)\n"
2465 "delay=%d, max_luns=%d, scsi_level=%d\n"
2466 "sector_size=%d bytes, cylinders=%d, heads=%d, sectors=%d\n"
2467 "number of aborts=%d, device_reset=%d, bus_resets=%d, "
2469 SCSI_DEBUG_VERSION
, scsi_debug_version_date
, scsi_debug_num_tgts
,
2470 scsi_debug_dev_size_mb
, scsi_debug_opts
, scsi_debug_every_nth
,
2471 scsi_debug_cmnd_count
, scsi_debug_delay
,
2472 scsi_debug_max_luns
, scsi_debug_scsi_level
,
2473 SECT_SIZE
, sdebug_cylinders_per
, sdebug_heads
, sdebug_sectors_per
,
2474 num_aborts
, num_dev_resets
, num_bus_resets
, num_host_resets
);
2479 *start
= buffer
+ (offset
- begin
); /* Start of wanted data */
2480 len
-= (offset
- begin
);
2486 static ssize_t
sdebug_delay_show(struct device_driver
* ddp
, char * buf
)
2488 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_delay
);
2491 static ssize_t
sdebug_delay_store(struct device_driver
* ddp
,
2492 const char * buf
, size_t count
)
2497 if (1 == sscanf(buf
, "%10s", work
)) {
2498 if ((1 == sscanf(work
, "%d", &delay
)) && (delay
>= 0)) {
2499 scsi_debug_delay
= delay
;
2505 DRIVER_ATTR(delay
, S_IRUGO
| S_IWUSR
, sdebug_delay_show
,
2506 sdebug_delay_store
);
2508 static ssize_t
sdebug_opts_show(struct device_driver
* ddp
, char * buf
)
2510 return scnprintf(buf
, PAGE_SIZE
, "0x%x\n", scsi_debug_opts
);
2513 static ssize_t
sdebug_opts_store(struct device_driver
* ddp
,
2514 const char * buf
, size_t count
)
2519 if (1 == sscanf(buf
, "%10s", work
)) {
2520 if (0 == strnicmp(work
,"0x", 2)) {
2521 if (1 == sscanf(&work
[2], "%x", &opts
))
2524 if (1 == sscanf(work
, "%d", &opts
))
2530 scsi_debug_opts
= opts
;
2531 scsi_debug_cmnd_count
= 0;
2534 DRIVER_ATTR(opts
, S_IRUGO
| S_IWUSR
, sdebug_opts_show
,
2537 static ssize_t
sdebug_ptype_show(struct device_driver
* ddp
, char * buf
)
2539 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_ptype
);
2541 static ssize_t
sdebug_ptype_store(struct device_driver
* ddp
,
2542 const char * buf
, size_t count
)
2546 if ((count
> 0) && (1 == sscanf(buf
, "%d", &n
)) && (n
>= 0)) {
2547 scsi_debug_ptype
= n
;
2552 DRIVER_ATTR(ptype
, S_IRUGO
| S_IWUSR
, sdebug_ptype_show
, sdebug_ptype_store
);
2554 static ssize_t
sdebug_dsense_show(struct device_driver
* ddp
, char * buf
)
2556 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_dsense
);
2558 static ssize_t
sdebug_dsense_store(struct device_driver
* ddp
,
2559 const char * buf
, size_t count
)
2563 if ((count
> 0) && (1 == sscanf(buf
, "%d", &n
)) && (n
>= 0)) {
2564 scsi_debug_dsense
= n
;
2569 DRIVER_ATTR(dsense
, S_IRUGO
| S_IWUSR
, sdebug_dsense_show
,
2570 sdebug_dsense_store
);
2572 static ssize_t
sdebug_fake_rw_show(struct device_driver
* ddp
, char * buf
)
2574 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_fake_rw
);
2576 static ssize_t
sdebug_fake_rw_store(struct device_driver
* ddp
,
2577 const char * buf
, size_t count
)
2581 if ((count
> 0) && (1 == sscanf(buf
, "%d", &n
)) && (n
>= 0)) {
2582 scsi_debug_fake_rw
= n
;
2587 DRIVER_ATTR(fake_rw
, S_IRUGO
| S_IWUSR
, sdebug_fake_rw_show
,
2588 sdebug_fake_rw_store
);
2590 static ssize_t
sdebug_no_lun_0_show(struct device_driver
* ddp
, char * buf
)
2592 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_no_lun_0
);
2594 static ssize_t
sdebug_no_lun_0_store(struct device_driver
* ddp
,
2595 const char * buf
, size_t count
)
2599 if ((count
> 0) && (1 == sscanf(buf
, "%d", &n
)) && (n
>= 0)) {
2600 scsi_debug_no_lun_0
= n
;
2605 DRIVER_ATTR(no_lun_0
, S_IRUGO
| S_IWUSR
, sdebug_no_lun_0_show
,
2606 sdebug_no_lun_0_store
);
2608 static ssize_t
sdebug_num_tgts_show(struct device_driver
* ddp
, char * buf
)
2610 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_num_tgts
);
2612 static ssize_t
sdebug_num_tgts_store(struct device_driver
* ddp
,
2613 const char * buf
, size_t count
)
2617 if ((count
> 0) && (1 == sscanf(buf
, "%d", &n
)) && (n
>= 0)) {
2618 scsi_debug_num_tgts
= n
;
2619 sdebug_max_tgts_luns();
2624 DRIVER_ATTR(num_tgts
, S_IRUGO
| S_IWUSR
, sdebug_num_tgts_show
,
2625 sdebug_num_tgts_store
);
2627 static ssize_t
sdebug_dev_size_mb_show(struct device_driver
* ddp
, char * buf
)
2629 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_dev_size_mb
);
2631 DRIVER_ATTR(dev_size_mb
, S_IRUGO
, sdebug_dev_size_mb_show
, NULL
);
2633 static ssize_t
sdebug_num_parts_show(struct device_driver
* ddp
, char * buf
)
2635 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_num_parts
);
2637 DRIVER_ATTR(num_parts
, S_IRUGO
, sdebug_num_parts_show
, NULL
);
2639 static ssize_t
sdebug_every_nth_show(struct device_driver
* ddp
, char * buf
)
2641 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_every_nth
);
2643 static ssize_t
sdebug_every_nth_store(struct device_driver
* ddp
,
2644 const char * buf
, size_t count
)
2648 if ((count
> 0) && (1 == sscanf(buf
, "%d", &nth
))) {
2649 scsi_debug_every_nth
= nth
;
2650 scsi_debug_cmnd_count
= 0;
2655 DRIVER_ATTR(every_nth
, S_IRUGO
| S_IWUSR
, sdebug_every_nth_show
,
2656 sdebug_every_nth_store
);
2658 static ssize_t
sdebug_max_luns_show(struct device_driver
* ddp
, char * buf
)
2660 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_max_luns
);
2662 static ssize_t
sdebug_max_luns_store(struct device_driver
* ddp
,
2663 const char * buf
, size_t count
)
2667 if ((count
> 0) && (1 == sscanf(buf
, "%d", &n
)) && (n
>= 0)) {
2668 scsi_debug_max_luns
= n
;
2669 sdebug_max_tgts_luns();
2674 DRIVER_ATTR(max_luns
, S_IRUGO
| S_IWUSR
, sdebug_max_luns_show
,
2675 sdebug_max_luns_store
);
2677 static ssize_t
sdebug_scsi_level_show(struct device_driver
* ddp
, char * buf
)
2679 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_scsi_level
);
2681 DRIVER_ATTR(scsi_level
, S_IRUGO
, sdebug_scsi_level_show
, NULL
);
2683 static ssize_t
sdebug_virtual_gb_show(struct device_driver
* ddp
, char * buf
)
2685 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_virtual_gb
);
2687 static ssize_t
sdebug_virtual_gb_store(struct device_driver
* ddp
,
2688 const char * buf
, size_t count
)
2692 if ((count
> 0) && (1 == sscanf(buf
, "%d", &n
)) && (n
>= 0)) {
2693 scsi_debug_virtual_gb
= n
;
2694 if (scsi_debug_virtual_gb
> 0) {
2695 sdebug_capacity
= 2048 * 1024;
2696 sdebug_capacity
*= scsi_debug_virtual_gb
;
2698 sdebug_capacity
= sdebug_store_sectors
;
2703 DRIVER_ATTR(virtual_gb
, S_IRUGO
| S_IWUSR
, sdebug_virtual_gb_show
,
2704 sdebug_virtual_gb_store
);
2706 static ssize_t
sdebug_add_host_show(struct device_driver
* ddp
, char * buf
)
2708 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_add_host
);
2711 static ssize_t
sdebug_add_host_store(struct device_driver
* ddp
,
2712 const char * buf
, size_t count
)
2717 if (1 != sscanf(buf
, "%10s", work
))
2719 { /* temporary hack around sscanf() problem with -ve nums */
2724 if (1 != sscanf(work
+ neg
, "%d", &delta_hosts
))
2727 delta_hosts
= -delta_hosts
;
2729 if (delta_hosts
> 0) {
2731 sdebug_add_adapter();
2732 } while (--delta_hosts
);
2733 } else if (delta_hosts
< 0) {
2735 sdebug_remove_adapter();
2736 } while (++delta_hosts
);
2740 DRIVER_ATTR(add_host
, S_IRUGO
| S_IWUSR
, sdebug_add_host_show
,
2741 sdebug_add_host_store
);
2743 static ssize_t
sdebug_vpd_use_hostno_show(struct device_driver
* ddp
,
2746 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_vpd_use_hostno
);
2748 static ssize_t
sdebug_vpd_use_hostno_store(struct device_driver
* ddp
,
2749 const char * buf
, size_t count
)
2753 if ((count
> 0) && (1 == sscanf(buf
, "%d", &n
)) && (n
>= 0)) {
2754 scsi_debug_vpd_use_hostno
= n
;
2759 DRIVER_ATTR(vpd_use_hostno
, S_IRUGO
| S_IWUSR
, sdebug_vpd_use_hostno_show
,
2760 sdebug_vpd_use_hostno_store
);
2762 /* Note: The following function creates attribute files in the
2763 /sys/bus/pseudo/drivers/scsi_debug directory. The advantage of these
2764 files (over those found in the /sys/module/scsi_debug/parameters
2765 directory) is that auxiliary actions can be triggered when an attribute
2766 is changed. For example see: sdebug_add_host_store() above.
2768 static int do_create_driverfs_files(void)
2772 ret
= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_add_host
);
2773 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_delay
);
2774 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_dev_size_mb
);
2775 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_dsense
);
2776 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_every_nth
);
2777 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_fake_rw
);
2778 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_max_luns
);
2779 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_no_lun_0
);
2780 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_num_parts
);
2781 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_num_tgts
);
2782 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_ptype
);
2783 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_opts
);
2784 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_scsi_level
);
2785 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_virtual_gb
);
2786 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_vpd_use_hostno
);
2790 static void do_remove_driverfs_files(void)
2792 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_vpd_use_hostno
);
2793 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_virtual_gb
);
2794 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_scsi_level
);
2795 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_opts
);
2796 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_ptype
);
2797 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_num_tgts
);
2798 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_num_parts
);
2799 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_no_lun_0
);
2800 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_max_luns
);
2801 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_fake_rw
);
2802 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_every_nth
);
2803 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_dsense
);
2804 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_dev_size_mb
);
2805 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_delay
);
2806 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_add_host
);
2809 static int __init
scsi_debug_init(void)
2816 if (scsi_debug_dev_size_mb
< 1)
2817 scsi_debug_dev_size_mb
= 1; /* force minimum 1 MB ramdisk */
2818 sdebug_store_size
= (unsigned int)scsi_debug_dev_size_mb
* 1048576;
2819 sdebug_store_sectors
= sdebug_store_size
/ SECT_SIZE
;
2820 if (scsi_debug_virtual_gb
> 0) {
2821 sdebug_capacity
= 2048 * 1024;
2822 sdebug_capacity
*= scsi_debug_virtual_gb
;
2824 sdebug_capacity
= sdebug_store_sectors
;
2826 /* play around with geometry, don't waste too much on track 0 */
2828 sdebug_sectors_per
= 32;
2829 if (scsi_debug_dev_size_mb
>= 16)
2831 else if (scsi_debug_dev_size_mb
>= 256)
2833 sdebug_cylinders_per
= (unsigned long)sdebug_capacity
/
2834 (sdebug_sectors_per
* sdebug_heads
);
2835 if (sdebug_cylinders_per
>= 1024) {
2836 /* other LLDs do this; implies >= 1GB ram disk ... */
2838 sdebug_sectors_per
= 63;
2839 sdebug_cylinders_per
= (unsigned long)sdebug_capacity
/
2840 (sdebug_sectors_per
* sdebug_heads
);
2843 sz
= sdebug_store_size
;
2844 fake_storep
= vmalloc(sz
);
2845 if (NULL
== fake_storep
) {
2846 printk(KERN_ERR
"scsi_debug_init: out of memory, 1\n");
2849 memset(fake_storep
, 0, sz
);
2850 if (scsi_debug_num_parts
> 0)
2851 sdebug_build_parts(fake_storep
);
2853 ret
= device_register(&pseudo_primary
);
2855 printk(KERN_WARNING
"scsi_debug: device_register error: %d\n",
2859 ret
= bus_register(&pseudo_lld_bus
);
2861 printk(KERN_WARNING
"scsi_debug: bus_register error: %d\n",
2865 ret
= driver_register(&sdebug_driverfs_driver
);
2867 printk(KERN_WARNING
"scsi_debug: driver_register error: %d\n",
2871 ret
= do_create_driverfs_files();
2873 printk(KERN_WARNING
"scsi_debug: driver_create_file error: %d\n",
2880 sdebug_driver_template
.proc_name
= sdebug_proc_name
;
2882 host_to_add
= scsi_debug_add_host
;
2883 scsi_debug_add_host
= 0;
2885 for (k
= 0; k
< host_to_add
; k
++) {
2886 if (sdebug_add_adapter()) {
2887 printk(KERN_ERR
"scsi_debug_init: "
2888 "sdebug_add_adapter failed k=%d\n", k
);
2893 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
) {
2894 printk(KERN_INFO
"scsi_debug_init: built %d host(s)\n",
2895 scsi_debug_add_host
);
2900 do_remove_driverfs_files();
2901 driver_unregister(&sdebug_driverfs_driver
);
2903 bus_unregister(&pseudo_lld_bus
);
2905 device_unregister(&pseudo_primary
);
2912 static void __exit
scsi_debug_exit(void)
2914 int k
= scsi_debug_add_host
;
2918 sdebug_remove_adapter();
2919 do_remove_driverfs_files();
2920 driver_unregister(&sdebug_driverfs_driver
);
2921 bus_unregister(&pseudo_lld_bus
);
2922 device_unregister(&pseudo_primary
);
2927 device_initcall(scsi_debug_init
);
2928 module_exit(scsi_debug_exit
);
2930 static void pseudo_0_release(struct device
* dev
)
2932 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
)
2933 printk(KERN_INFO
"scsi_debug: pseudo_0_release() called\n");
2936 static struct device pseudo_primary
= {
2937 .bus_id
= "pseudo_0",
2938 .release
= pseudo_0_release
,
2941 static int pseudo_lld_bus_match(struct device
*dev
,
2942 struct device_driver
*dev_driver
)
2947 static struct bus_type pseudo_lld_bus
= {
2949 .match
= pseudo_lld_bus_match
,
2950 .probe
= sdebug_driver_probe
,
2951 .remove
= sdebug_driver_remove
,
2954 static void sdebug_release_adapter(struct device
* dev
)
2956 struct sdebug_host_info
*sdbg_host
;
2958 sdbg_host
= to_sdebug_host(dev
);
2962 static int sdebug_add_adapter(void)
2964 int k
, devs_per_host
;
2966 struct sdebug_host_info
*sdbg_host
;
2967 struct sdebug_dev_info
*sdbg_devinfo
;
2968 struct list_head
*lh
, *lh_sf
;
2970 sdbg_host
= kzalloc(sizeof(*sdbg_host
),GFP_KERNEL
);
2971 if (NULL
== sdbg_host
) {
2972 printk(KERN_ERR
"%s: out of memory at line %d\n",
2973 __FUNCTION__
, __LINE__
);
2977 INIT_LIST_HEAD(&sdbg_host
->dev_info_list
);
2979 devs_per_host
= scsi_debug_num_tgts
* scsi_debug_max_luns
;
2980 for (k
= 0; k
< devs_per_host
; k
++) {
2981 sdbg_devinfo
= kzalloc(sizeof(*sdbg_devinfo
),GFP_KERNEL
);
2982 if (NULL
== sdbg_devinfo
) {
2983 printk(KERN_ERR
"%s: out of memory at line %d\n",
2984 __FUNCTION__
, __LINE__
);
2988 sdbg_devinfo
->sdbg_host
= sdbg_host
;
2989 list_add_tail(&sdbg_devinfo
->dev_list
,
2990 &sdbg_host
->dev_info_list
);
2993 spin_lock(&sdebug_host_list_lock
);
2994 list_add_tail(&sdbg_host
->host_list
, &sdebug_host_list
);
2995 spin_unlock(&sdebug_host_list_lock
);
2997 sdbg_host
->dev
.bus
= &pseudo_lld_bus
;
2998 sdbg_host
->dev
.parent
= &pseudo_primary
;
2999 sdbg_host
->dev
.release
= &sdebug_release_adapter
;
3000 sprintf(sdbg_host
->dev
.bus_id
, "adapter%d", scsi_debug_add_host
);
3002 error
= device_register(&sdbg_host
->dev
);
3007 ++scsi_debug_add_host
;
3011 list_for_each_safe(lh
, lh_sf
, &sdbg_host
->dev_info_list
) {
3012 sdbg_devinfo
= list_entry(lh
, struct sdebug_dev_info
,
3014 list_del(&sdbg_devinfo
->dev_list
);
3015 kfree(sdbg_devinfo
);
3022 static void sdebug_remove_adapter(void)
3024 struct sdebug_host_info
* sdbg_host
= NULL
;
3026 spin_lock(&sdebug_host_list_lock
);
3027 if (!list_empty(&sdebug_host_list
)) {
3028 sdbg_host
= list_entry(sdebug_host_list
.prev
,
3029 struct sdebug_host_info
, host_list
);
3030 list_del(&sdbg_host
->host_list
);
3032 spin_unlock(&sdebug_host_list_lock
);
3037 device_unregister(&sdbg_host
->dev
);
3038 --scsi_debug_add_host
;
3041 static int sdebug_driver_probe(struct device
* dev
)
3044 struct sdebug_host_info
*sdbg_host
;
3045 struct Scsi_Host
*hpnt
;
3047 sdbg_host
= to_sdebug_host(dev
);
3049 hpnt
= scsi_host_alloc(&sdebug_driver_template
, sizeof(sdbg_host
));
3051 printk(KERN_ERR
"%s: scsi_register failed\n", __FUNCTION__
);
3056 sdbg_host
->shost
= hpnt
;
3057 *((struct sdebug_host_info
**)hpnt
->hostdata
) = sdbg_host
;
3058 if ((hpnt
->this_id
>= 0) && (scsi_debug_num_tgts
> hpnt
->this_id
))
3059 hpnt
->max_id
= scsi_debug_num_tgts
+ 1;
3061 hpnt
->max_id
= scsi_debug_num_tgts
;
3062 hpnt
->max_lun
= SAM2_WLUN_REPORT_LUNS
; /* = scsi_debug_max_luns; */
3064 error
= scsi_add_host(hpnt
, &sdbg_host
->dev
);
3066 printk(KERN_ERR
"%s: scsi_add_host failed\n", __FUNCTION__
);
3068 scsi_host_put(hpnt
);
3070 scsi_scan_host(hpnt
);
3076 static int sdebug_driver_remove(struct device
* dev
)
3078 struct list_head
*lh
, *lh_sf
;
3079 struct sdebug_host_info
*sdbg_host
;
3080 struct sdebug_dev_info
*sdbg_devinfo
;
3082 sdbg_host
= to_sdebug_host(dev
);
3085 printk(KERN_ERR
"%s: Unable to locate host info\n",
3090 scsi_remove_host(sdbg_host
->shost
);
3092 list_for_each_safe(lh
, lh_sf
, &sdbg_host
->dev_info_list
) {
3093 sdbg_devinfo
= list_entry(lh
, struct sdebug_dev_info
,
3095 list_del(&sdbg_devinfo
->dev_list
);
3096 kfree(sdbg_devinfo
);
3099 scsi_host_put(sdbg_host
->shost
);
3103 static void sdebug_max_tgts_luns(void)
3105 struct sdebug_host_info
* sdbg_host
;
3106 struct Scsi_Host
*hpnt
;
3108 spin_lock(&sdebug_host_list_lock
);
3109 list_for_each_entry(sdbg_host
, &sdebug_host_list
, host_list
) {
3110 hpnt
= sdbg_host
->shost
;
3111 if ((hpnt
->this_id
>= 0) &&
3112 (scsi_debug_num_tgts
> hpnt
->this_id
))
3113 hpnt
->max_id
= scsi_debug_num_tgts
+ 1;
3115 hpnt
->max_id
= scsi_debug_num_tgts
;
3116 hpnt
->max_lun
= SAM2_WLUN_REPORT_LUNS
; /* scsi_debug_max_luns; */
3118 spin_unlock(&sdebug_host_list_lock
);