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 */
332 scsi_set_resid(SCpnt
, 0);
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 == scsi_bufflen(scp
))
608 if (NULL
== scsi_sglist(scp
))
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);
614 req_len
= act_len
= 0;
615 scsi_for_each_sg(scp
, sg
, scsi_sg_count(scp
), k
) {
617 kaddr
= (unsigned char *)
618 kmap_atomic(sg_page(sg
), KM_USER0
);
620 return (DID_ERROR
<< 16);
621 kaddr_off
= (unsigned char *)kaddr
+ sg
->offset
;
623 if ((req_len
+ len
) > arr_len
) {
625 len
= arr_len
- req_len
;
627 memcpy(kaddr_off
, arr
+ req_len
, len
);
628 kunmap_atomic(kaddr
, KM_USER0
);
631 req_len
+= sg
->length
;
633 if (scsi_get_resid(scp
))
634 scsi_set_resid(scp
, scsi_get_resid(scp
) - act_len
);
636 scsi_set_resid(scp
, req_len
- act_len
);
640 /* Returns number of bytes fetched into 'arr' or -1 if error. */
641 static int fetch_to_dev_buffer(struct scsi_cmnd
* scp
, unsigned char * arr
,
644 int k
, req_len
, len
, fin
;
647 struct scatterlist
* sg
;
649 if (0 == scsi_bufflen(scp
))
651 if (NULL
== scsi_sglist(scp
))
653 if (! ((scp
->sc_data_direction
== DMA_BIDIRECTIONAL
) ||
654 (scp
->sc_data_direction
== DMA_TO_DEVICE
)))
657 scsi_for_each_sg(scp
, sg
, scsi_sg_count(scp
), k
) {
658 kaddr
= (unsigned char *)kmap_atomic(sg_page(sg
), KM_USER0
);
661 kaddr_off
= (unsigned char *)kaddr
+ sg
->offset
;
663 if ((req_len
+ len
) > max_arr_len
) {
664 len
= max_arr_len
- req_len
;
667 memcpy(arr
+ req_len
, kaddr_off
, len
);
668 kunmap_atomic(kaddr
, KM_USER0
);
670 return req_len
+ len
;
671 req_len
+= sg
->length
;
677 static const char * inq_vendor_id
= "Linux ";
678 static const char * inq_product_id
= "scsi_debug ";
679 static const char * inq_product_rev
= "0004";
681 static int inquiry_evpd_83(unsigned char * arr
, int port_group_id
,
682 int target_dev_id
, int dev_id_num
,
683 const char * dev_id_str
,
689 port_a
= target_dev_id
+ 1;
690 /* T10 vendor identifier field format (faked) */
691 arr
[0] = 0x2; /* ASCII */
694 memcpy(&arr
[4], inq_vendor_id
, 8);
695 memcpy(&arr
[12], inq_product_id
, 16);
696 memcpy(&arr
[28], dev_id_str
, dev_id_str_len
);
697 num
= 8 + 16 + dev_id_str_len
;
700 if (dev_id_num
>= 0) {
701 /* NAA-5, Logical unit identifier (binary) */
702 arr
[num
++] = 0x1; /* binary (not necessarily sas) */
703 arr
[num
++] = 0x3; /* PIV=0, lu, naa */
706 arr
[num
++] = 0x53; /* naa-5 ieee company id=0x333333 (fake) */
710 arr
[num
++] = (dev_id_num
>> 24);
711 arr
[num
++] = (dev_id_num
>> 16) & 0xff;
712 arr
[num
++] = (dev_id_num
>> 8) & 0xff;
713 arr
[num
++] = dev_id_num
& 0xff;
714 /* Target relative port number */
715 arr
[num
++] = 0x61; /* proto=sas, binary */
716 arr
[num
++] = 0x94; /* PIV=1, target port, rel port */
717 arr
[num
++] = 0x0; /* reserved */
718 arr
[num
++] = 0x4; /* length */
719 arr
[num
++] = 0x0; /* reserved */
720 arr
[num
++] = 0x0; /* reserved */
722 arr
[num
++] = 0x1; /* relative port A */
724 /* NAA-5, Target port identifier */
725 arr
[num
++] = 0x61; /* proto=sas, binary */
726 arr
[num
++] = 0x93; /* piv=1, target port, naa */
729 arr
[num
++] = 0x52; /* naa-5, company id=0x222222 (fake) */
733 arr
[num
++] = (port_a
>> 24);
734 arr
[num
++] = (port_a
>> 16) & 0xff;
735 arr
[num
++] = (port_a
>> 8) & 0xff;
736 arr
[num
++] = port_a
& 0xff;
737 /* NAA-5, Target port group identifier */
738 arr
[num
++] = 0x61; /* proto=sas, binary */
739 arr
[num
++] = 0x95; /* piv=1, target port group id */
744 arr
[num
++] = (port_group_id
>> 8) & 0xff;
745 arr
[num
++] = port_group_id
& 0xff;
746 /* NAA-5, Target device identifier */
747 arr
[num
++] = 0x61; /* proto=sas, binary */
748 arr
[num
++] = 0xa3; /* piv=1, target device, naa */
751 arr
[num
++] = 0x52; /* naa-5, company id=0x222222 (fake) */
755 arr
[num
++] = (target_dev_id
>> 24);
756 arr
[num
++] = (target_dev_id
>> 16) & 0xff;
757 arr
[num
++] = (target_dev_id
>> 8) & 0xff;
758 arr
[num
++] = target_dev_id
& 0xff;
759 /* SCSI name string: Target device identifier */
760 arr
[num
++] = 0x63; /* proto=sas, UTF-8 */
761 arr
[num
++] = 0xa8; /* piv=1, target device, SCSI name string */
764 memcpy(arr
+ num
, "naa.52222220", 12);
766 snprintf(b
, sizeof(b
), "%08X", target_dev_id
);
767 memcpy(arr
+ num
, b
, 8);
769 memset(arr
+ num
, 0, 4);
775 static unsigned char vpd84_data
[] = {
776 /* from 4th byte */ 0x22,0x22,0x22,0x0,0xbb,0x0,
777 0x22,0x22,0x22,0x0,0xbb,0x1,
778 0x22,0x22,0x22,0x0,0xbb,0x2,
781 static int inquiry_evpd_84(unsigned char * arr
)
783 memcpy(arr
, vpd84_data
, sizeof(vpd84_data
));
784 return sizeof(vpd84_data
);
787 static int inquiry_evpd_85(unsigned char * arr
)
790 const char * na1
= "https://www.kernel.org/config";
791 const char * na2
= "http://www.kernel.org/log";
794 arr
[num
++] = 0x1; /* lu, storage config */
795 arr
[num
++] = 0x0; /* reserved */
800 plen
= ((plen
/ 4) + 1) * 4;
801 arr
[num
++] = plen
; /* length, null termianted, padded */
802 memcpy(arr
+ num
, na1
, olen
);
803 memset(arr
+ num
+ olen
, 0, plen
- olen
);
806 arr
[num
++] = 0x4; /* lu, logging */
807 arr
[num
++] = 0x0; /* reserved */
812 plen
= ((plen
/ 4) + 1) * 4;
813 arr
[num
++] = plen
; /* length, null terminated, padded */
814 memcpy(arr
+ num
, na2
, olen
);
815 memset(arr
+ num
+ olen
, 0, plen
- olen
);
821 /* SCSI ports VPD page */
822 static int inquiry_evpd_88(unsigned char * arr
, int target_dev_id
)
827 port_a
= target_dev_id
+ 1;
829 arr
[num
++] = 0x0; /* reserved */
830 arr
[num
++] = 0x0; /* reserved */
832 arr
[num
++] = 0x1; /* relative port 1 (primary) */
833 memset(arr
+ num
, 0, 6);
836 arr
[num
++] = 12; /* length tp descriptor */
837 /* naa-5 target port identifier (A) */
838 arr
[num
++] = 0x61; /* proto=sas, binary */
839 arr
[num
++] = 0x93; /* PIV=1, target port, NAA */
840 arr
[num
++] = 0x0; /* reserved */
841 arr
[num
++] = 0x8; /* length */
842 arr
[num
++] = 0x52; /* NAA-5, company_id=0x222222 (fake) */
846 arr
[num
++] = (port_a
>> 24);
847 arr
[num
++] = (port_a
>> 16) & 0xff;
848 arr
[num
++] = (port_a
>> 8) & 0xff;
849 arr
[num
++] = port_a
& 0xff;
851 arr
[num
++] = 0x0; /* reserved */
852 arr
[num
++] = 0x0; /* reserved */
854 arr
[num
++] = 0x2; /* relative port 2 (secondary) */
855 memset(arr
+ num
, 0, 6);
858 arr
[num
++] = 12; /* length tp descriptor */
859 /* naa-5 target port identifier (B) */
860 arr
[num
++] = 0x61; /* proto=sas, binary */
861 arr
[num
++] = 0x93; /* PIV=1, target port, NAA */
862 arr
[num
++] = 0x0; /* reserved */
863 arr
[num
++] = 0x8; /* length */
864 arr
[num
++] = 0x52; /* NAA-5, company_id=0x222222 (fake) */
868 arr
[num
++] = (port_b
>> 24);
869 arr
[num
++] = (port_b
>> 16) & 0xff;
870 arr
[num
++] = (port_b
>> 8) & 0xff;
871 arr
[num
++] = port_b
& 0xff;
877 static unsigned char vpd89_data
[] = {
878 /* from 4th byte */ 0,0,0,0,
879 'l','i','n','u','x',' ',' ',' ',
880 'S','A','T',' ','s','c','s','i','_','d','e','b','u','g',' ',' ',
882 0x34,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
884 0x5a,0xc,0xff,0x3f,0x37,0xc8,0x10,0,0,0,0,0,0x3f,0,0,0,
885 0,0,0,0,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x20,0x20,0x20,0x20,
886 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0,0,0,0x40,0x4,0,0x2e,0x33,
887 0x38,0x31,0x20,0x20,0x20,0x20,0x54,0x53,0x38,0x33,0x30,0x30,0x33,0x31,
889 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
891 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
893 0,0,0,0x2f,0,0,0,0x2,0,0x2,0x7,0,0xff,0xff,0x1,0,
894 0x3f,0,0xc1,0xff,0x3e,0,0x10,0x1,0xb0,0xf8,0x50,0x9,0,0,0x7,0,
895 0x3,0,0x78,0,0x78,0,0xf0,0,0x78,0,0,0,0,0,0,0,
896 0,0,0,0,0,0,0,0,0x2,0,0,0,0,0,0,0,
897 0x7e,0,0x1b,0,0x6b,0x34,0x1,0x7d,0x3,0x40,0x69,0x34,0x1,0x3c,0x3,0x40,
898 0x7f,0x40,0,0,0,0,0xfe,0xfe,0,0,0,0,0,0xfe,0,0,
899 0,0,0,0,0,0,0,0,0xb0,0xf8,0x50,0x9,0,0,0,0,
900 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
901 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
902 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
903 0x1,0,0xb0,0xf8,0x50,0x9,0xb0,0xf8,0x50,0x9,0x20,0x20,0x2,0,0xb6,0x42,
904 0,0x80,0x8a,0,0x6,0x3c,0xa,0x3c,0xff,0xff,0xc6,0x7,0,0x1,0,0x8,
905 0xf0,0xf,0,0x10,0x2,0,0x30,0,0,0,0,0,0,0,0x6,0xfe,
906 0,0,0x2,0,0x50,0,0x8a,0,0x4f,0x95,0,0,0x21,0,0xb,0,
907 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
908 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
909 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
910 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
911 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
912 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
913 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
914 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
915 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
916 0,0,0,0,0,0,0,0,0,0,0,0,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,0xa5,0x51,
921 static int inquiry_evpd_89(unsigned char * arr
)
923 memcpy(arr
, vpd89_data
, sizeof(vpd89_data
));
924 return sizeof(vpd89_data
);
928 static unsigned char vpdb0_data
[] = {
929 /* from 4th byte */ 0,0,0,4,
934 static int inquiry_evpd_b0(unsigned char * arr
)
936 memcpy(arr
, vpdb0_data
, sizeof(vpdb0_data
));
937 if (sdebug_store_sectors
> 0x400) {
938 arr
[4] = (sdebug_store_sectors
>> 24) & 0xff;
939 arr
[5] = (sdebug_store_sectors
>> 16) & 0xff;
940 arr
[6] = (sdebug_store_sectors
>> 8) & 0xff;
941 arr
[7] = sdebug_store_sectors
& 0xff;
943 return sizeof(vpdb0_data
);
947 #define SDEBUG_LONG_INQ_SZ 96
948 #define SDEBUG_MAX_INQ_ARR_SZ 584
950 static int resp_inquiry(struct scsi_cmnd
* scp
, int target
,
951 struct sdebug_dev_info
* devip
)
953 unsigned char pq_pdt
;
955 unsigned char *cmd
= (unsigned char *)scp
->cmnd
;
956 int alloc_len
, n
, ret
;
958 alloc_len
= (cmd
[3] << 8) + cmd
[4];
959 arr
= kzalloc(SDEBUG_MAX_INQ_ARR_SZ
, GFP_ATOMIC
);
961 return DID_REQUEUE
<< 16;
963 pq_pdt
= 0x1e; /* present, wlun */
964 else if (scsi_debug_no_lun_0
&& (0 == devip
->lun
))
965 pq_pdt
= 0x7f; /* not present, no device type */
967 pq_pdt
= (scsi_debug_ptype
& 0x1f);
969 if (0x2 & cmd
[1]) { /* CMDDT bit set */
970 mk_sense_buffer(devip
, ILLEGAL_REQUEST
, INVALID_FIELD_IN_CDB
,
973 return check_condition_result
;
974 } else if (0x1 & cmd
[1]) { /* EVPD bit set */
975 int lu_id_num
, port_group_id
, target_dev_id
, len
;
977 int host_no
= devip
->sdbg_host
->shost
->host_no
;
979 port_group_id
= (((host_no
+ 1) & 0x7f) << 8) +
980 (devip
->channel
& 0x7f);
981 if (0 == scsi_debug_vpd_use_hostno
)
983 lu_id_num
= devip
->wlun
? -1 : (((host_no
+ 1) * 2000) +
984 (devip
->target
* 1000) + devip
->lun
);
985 target_dev_id
= ((host_no
+ 1) * 2000) +
986 (devip
->target
* 1000) - 3;
987 len
= scnprintf(lu_id_str
, 6, "%d", lu_id_num
);
988 if (0 == cmd
[2]) { /* supported vital product data pages */
989 arr
[1] = cmd
[2]; /*sanity */
991 arr
[n
++] = 0x0; /* this page */
992 arr
[n
++] = 0x80; /* unit serial number */
993 arr
[n
++] = 0x83; /* device identification */
994 arr
[n
++] = 0x84; /* software interface ident. */
995 arr
[n
++] = 0x85; /* management network addresses */
996 arr
[n
++] = 0x86; /* extended inquiry */
997 arr
[n
++] = 0x87; /* mode page policy */
998 arr
[n
++] = 0x88; /* SCSI ports */
999 arr
[n
++] = 0x89; /* ATA information */
1000 arr
[n
++] = 0xb0; /* Block limits (SBC) */
1001 arr
[3] = n
- 4; /* number of supported VPD pages */
1002 } else if (0x80 == cmd
[2]) { /* unit serial number */
1003 arr
[1] = cmd
[2]; /*sanity */
1005 memcpy(&arr
[4], lu_id_str
, len
);
1006 } else if (0x83 == cmd
[2]) { /* device identification */
1007 arr
[1] = cmd
[2]; /*sanity */
1008 arr
[3] = inquiry_evpd_83(&arr
[4], port_group_id
,
1009 target_dev_id
, lu_id_num
,
1011 } else if (0x84 == cmd
[2]) { /* Software interface ident. */
1012 arr
[1] = cmd
[2]; /*sanity */
1013 arr
[3] = inquiry_evpd_84(&arr
[4]);
1014 } else if (0x85 == cmd
[2]) { /* Management network addresses */
1015 arr
[1] = cmd
[2]; /*sanity */
1016 arr
[3] = inquiry_evpd_85(&arr
[4]);
1017 } else if (0x86 == cmd
[2]) { /* extended inquiry */
1018 arr
[1] = cmd
[2]; /*sanity */
1019 arr
[3] = 0x3c; /* number of following entries */
1020 arr
[4] = 0x0; /* no protection stuff */
1021 arr
[5] = 0x7; /* head of q, ordered + simple q's */
1022 } else if (0x87 == cmd
[2]) { /* mode page policy */
1023 arr
[1] = cmd
[2]; /*sanity */
1024 arr
[3] = 0x8; /* number of following entries */
1025 arr
[4] = 0x2; /* disconnect-reconnect mp */
1026 arr
[6] = 0x80; /* mlus, shared */
1027 arr
[8] = 0x18; /* protocol specific lu */
1028 arr
[10] = 0x82; /* mlus, per initiator port */
1029 } else if (0x88 == cmd
[2]) { /* SCSI Ports */
1030 arr
[1] = cmd
[2]; /*sanity */
1031 arr
[3] = inquiry_evpd_88(&arr
[4], target_dev_id
);
1032 } else if (0x89 == cmd
[2]) { /* ATA information */
1033 arr
[1] = cmd
[2]; /*sanity */
1034 n
= inquiry_evpd_89(&arr
[4]);
1036 arr
[3] = (n
& 0xff);
1037 } else if (0xb0 == cmd
[2]) { /* Block limits (SBC) */
1038 arr
[1] = cmd
[2]; /*sanity */
1039 arr
[3] = inquiry_evpd_b0(&arr
[4]);
1041 /* Illegal request, invalid field in cdb */
1042 mk_sense_buffer(devip
, ILLEGAL_REQUEST
,
1043 INVALID_FIELD_IN_CDB
, 0);
1045 return check_condition_result
;
1047 len
= min(((arr
[2] << 8) + arr
[3]) + 4, alloc_len
);
1048 ret
= fill_from_dev_buffer(scp
, arr
,
1049 min(len
, SDEBUG_MAX_INQ_ARR_SZ
));
1053 /* drops through here for a standard inquiry */
1054 arr
[1] = DEV_REMOVEABLE(target
) ? 0x80 : 0; /* Removable disk */
1055 arr
[2] = scsi_debug_scsi_level
;
1056 arr
[3] = 2; /* response_data_format==2 */
1057 arr
[4] = SDEBUG_LONG_INQ_SZ
- 5;
1058 if (0 == scsi_debug_vpd_use_hostno
)
1059 arr
[5] = 0x10; /* claim: implicit TGPS */
1060 arr
[6] = 0x10; /* claim: MultiP */
1061 /* arr[6] |= 0x40; ... claim: EncServ (enclosure services) */
1062 arr
[7] = 0xa; /* claim: LINKED + CMDQUE */
1063 memcpy(&arr
[8], inq_vendor_id
, 8);
1064 memcpy(&arr
[16], inq_product_id
, 16);
1065 memcpy(&arr
[32], inq_product_rev
, 4);
1066 /* version descriptors (2 bytes each) follow */
1067 arr
[58] = 0x0; arr
[59] = 0x77; /* SAM-3 ANSI */
1068 arr
[60] = 0x3; arr
[61] = 0x14; /* SPC-3 ANSI */
1070 if (scsi_debug_ptype
== 0) {
1071 arr
[n
++] = 0x3; arr
[n
++] = 0x3d; /* SBC-2 ANSI */
1072 } else if (scsi_debug_ptype
== 1) {
1073 arr
[n
++] = 0x3; arr
[n
++] = 0x60; /* SSC-2 no version */
1075 arr
[n
++] = 0xc; arr
[n
++] = 0xf; /* SAS-1.1 rev 10 */
1076 ret
= fill_from_dev_buffer(scp
, arr
,
1077 min(alloc_len
, SDEBUG_LONG_INQ_SZ
));
1082 static int resp_requests(struct scsi_cmnd
* scp
,
1083 struct sdebug_dev_info
* devip
)
1085 unsigned char * sbuff
;
1086 unsigned char *cmd
= (unsigned char *)scp
->cmnd
;
1087 unsigned char arr
[SDEBUG_SENSE_LEN
];
1091 memset(arr
, 0, sizeof(arr
));
1092 if (devip
->reset
== 1)
1093 mk_sense_buffer(devip
, 0, NO_ADDITIONAL_SENSE
, 0);
1094 want_dsense
= !!(cmd
[1] & 1) || scsi_debug_dsense
;
1095 sbuff
= devip
->sense_buff
;
1096 if ((iec_m_pg
[2] & 0x4) && (6 == (iec_m_pg
[3] & 0xf))) {
1099 arr
[1] = 0x0; /* NO_SENSE in sense_key */
1100 arr
[2] = THRESHOLD_EXCEEDED
;
1101 arr
[3] = 0xff; /* TEST set and MRIE==6 */
1104 arr
[2] = 0x0; /* NO_SENSE in sense_key */
1105 arr
[7] = 0xa; /* 18 byte sense buffer */
1106 arr
[12] = THRESHOLD_EXCEEDED
;
1107 arr
[13] = 0xff; /* TEST set and MRIE==6 */
1110 memcpy(arr
, sbuff
, SDEBUG_SENSE_LEN
);
1111 if ((cmd
[1] & 1) && (! scsi_debug_dsense
)) {
1112 /* DESC bit set and sense_buff in fixed format */
1113 memset(arr
, 0, sizeof(arr
));
1115 arr
[1] = sbuff
[2]; /* sense key */
1116 arr
[2] = sbuff
[12]; /* asc */
1117 arr
[3] = sbuff
[13]; /* ascq */
1121 mk_sense_buffer(devip
, 0, NO_ADDITIONAL_SENSE
, 0);
1122 return fill_from_dev_buffer(scp
, arr
, len
);
1125 static int resp_start_stop(struct scsi_cmnd
* scp
,
1126 struct sdebug_dev_info
* devip
)
1128 unsigned char *cmd
= (unsigned char *)scp
->cmnd
;
1129 int power_cond
, errsts
, start
;
1131 if ((errsts
= check_readiness(scp
, 1, devip
)))
1133 power_cond
= (cmd
[4] & 0xf0) >> 4;
1135 mk_sense_buffer(devip
, ILLEGAL_REQUEST
, INVALID_FIELD_IN_CDB
,
1137 return check_condition_result
;
1140 if (start
== devip
->stopped
)
1141 devip
->stopped
= !start
;
1145 #define SDEBUG_READCAP_ARR_SZ 8
1146 static int resp_readcap(struct scsi_cmnd
* scp
,
1147 struct sdebug_dev_info
* devip
)
1149 unsigned char arr
[SDEBUG_READCAP_ARR_SZ
];
1153 if ((errsts
= check_readiness(scp
, 1, devip
)))
1155 /* following just in case virtual_gb changed */
1156 if (scsi_debug_virtual_gb
> 0) {
1157 sdebug_capacity
= 2048 * 1024;
1158 sdebug_capacity
*= scsi_debug_virtual_gb
;
1160 sdebug_capacity
= sdebug_store_sectors
;
1161 memset(arr
, 0, SDEBUG_READCAP_ARR_SZ
);
1162 if (sdebug_capacity
< 0xffffffff) {
1163 capac
= (unsigned int)sdebug_capacity
- 1;
1164 arr
[0] = (capac
>> 24);
1165 arr
[1] = (capac
>> 16) & 0xff;
1166 arr
[2] = (capac
>> 8) & 0xff;
1167 arr
[3] = capac
& 0xff;
1174 arr
[6] = (SECT_SIZE_PER(target
) >> 8) & 0xff;
1175 arr
[7] = SECT_SIZE_PER(target
) & 0xff;
1176 return fill_from_dev_buffer(scp
, arr
, SDEBUG_READCAP_ARR_SZ
);
1179 #define SDEBUG_READCAP16_ARR_SZ 32
1180 static int resp_readcap16(struct scsi_cmnd
* scp
,
1181 struct sdebug_dev_info
* devip
)
1183 unsigned char *cmd
= (unsigned char *)scp
->cmnd
;
1184 unsigned char arr
[SDEBUG_READCAP16_ARR_SZ
];
1185 unsigned long long capac
;
1186 int errsts
, k
, alloc_len
;
1188 if ((errsts
= check_readiness(scp
, 1, devip
)))
1190 alloc_len
= ((cmd
[10] << 24) + (cmd
[11] << 16) + (cmd
[12] << 8)
1192 /* following just in case virtual_gb changed */
1193 if (scsi_debug_virtual_gb
> 0) {
1194 sdebug_capacity
= 2048 * 1024;
1195 sdebug_capacity
*= scsi_debug_virtual_gb
;
1197 sdebug_capacity
= sdebug_store_sectors
;
1198 memset(arr
, 0, SDEBUG_READCAP16_ARR_SZ
);
1199 capac
= sdebug_capacity
- 1;
1200 for (k
= 0; k
< 8; ++k
, capac
>>= 8)
1201 arr
[7 - k
] = capac
& 0xff;
1202 arr
[8] = (SECT_SIZE_PER(target
) >> 24) & 0xff;
1203 arr
[9] = (SECT_SIZE_PER(target
) >> 16) & 0xff;
1204 arr
[10] = (SECT_SIZE_PER(target
) >> 8) & 0xff;
1205 arr
[11] = SECT_SIZE_PER(target
) & 0xff;
1206 return fill_from_dev_buffer(scp
, arr
,
1207 min(alloc_len
, SDEBUG_READCAP16_ARR_SZ
));
1210 #define SDEBUG_MAX_TGTPGS_ARR_SZ 1412
1212 static int resp_report_tgtpgs(struct scsi_cmnd
* scp
,
1213 struct sdebug_dev_info
* devip
)
1215 unsigned char *cmd
= (unsigned char *)scp
->cmnd
;
1216 unsigned char * arr
;
1217 int host_no
= devip
->sdbg_host
->shost
->host_no
;
1218 int n
, ret
, alen
, rlen
;
1219 int port_group_a
, port_group_b
, port_a
, port_b
;
1221 alen
= ((cmd
[6] << 24) + (cmd
[7] << 16) + (cmd
[8] << 8)
1224 arr
= kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ
, GFP_ATOMIC
);
1226 return DID_REQUEUE
<< 16;
1228 * EVPD page 0x88 states we have two ports, one
1229 * real and a fake port with no device connected.
1230 * So we create two port groups with one port each
1231 * and set the group with port B to unavailable.
1233 port_a
= 0x1; /* relative port A */
1234 port_b
= 0x2; /* relative port B */
1235 port_group_a
= (((host_no
+ 1) & 0x7f) << 8) +
1236 (devip
->channel
& 0x7f);
1237 port_group_b
= (((host_no
+ 1) & 0x7f) << 8) +
1238 (devip
->channel
& 0x7f) + 0x80;
1241 * The asymmetric access state is cycled according to the host_id.
1244 if (0 == scsi_debug_vpd_use_hostno
) {
1245 arr
[n
++] = host_no
% 3; /* Asymm access state */
1246 arr
[n
++] = 0x0F; /* claim: all states are supported */
1248 arr
[n
++] = 0x0; /* Active/Optimized path */
1249 arr
[n
++] = 0x01; /* claim: only support active/optimized paths */
1251 arr
[n
++] = (port_group_a
>> 8) & 0xff;
1252 arr
[n
++] = port_group_a
& 0xff;
1253 arr
[n
++] = 0; /* Reserved */
1254 arr
[n
++] = 0; /* Status code */
1255 arr
[n
++] = 0; /* Vendor unique */
1256 arr
[n
++] = 0x1; /* One port per group */
1257 arr
[n
++] = 0; /* Reserved */
1258 arr
[n
++] = 0; /* Reserved */
1259 arr
[n
++] = (port_a
>> 8) & 0xff;
1260 arr
[n
++] = port_a
& 0xff;
1261 arr
[n
++] = 3; /* Port unavailable */
1262 arr
[n
++] = 0x08; /* claim: only unavailalbe paths are supported */
1263 arr
[n
++] = (port_group_b
>> 8) & 0xff;
1264 arr
[n
++] = port_group_b
& 0xff;
1265 arr
[n
++] = 0; /* Reserved */
1266 arr
[n
++] = 0; /* Status code */
1267 arr
[n
++] = 0; /* Vendor unique */
1268 arr
[n
++] = 0x1; /* One port per group */
1269 arr
[n
++] = 0; /* Reserved */
1270 arr
[n
++] = 0; /* Reserved */
1271 arr
[n
++] = (port_b
>> 8) & 0xff;
1272 arr
[n
++] = port_b
& 0xff;
1275 arr
[0] = (rlen
>> 24) & 0xff;
1276 arr
[1] = (rlen
>> 16) & 0xff;
1277 arr
[2] = (rlen
>> 8) & 0xff;
1278 arr
[3] = rlen
& 0xff;
1281 * Return the smallest value of either
1282 * - The allocated length
1283 * - The constructed command length
1284 * - The maximum array size
1287 ret
= fill_from_dev_buffer(scp
, arr
,
1288 min(rlen
, SDEBUG_MAX_TGTPGS_ARR_SZ
));
1293 /* <<Following mode page info copied from ST318451LW>> */
1295 static int resp_err_recov_pg(unsigned char * p
, int pcontrol
, int target
)
1296 { /* Read-Write Error Recovery page for mode_sense */
1297 unsigned char err_recov_pg
[] = {0x1, 0xa, 0xc0, 11, 240, 0, 0, 0,
1300 memcpy(p
, err_recov_pg
, sizeof(err_recov_pg
));
1302 memset(p
+ 2, 0, sizeof(err_recov_pg
) - 2);
1303 return sizeof(err_recov_pg
);
1306 static int resp_disconnect_pg(unsigned char * p
, int pcontrol
, int target
)
1307 { /* Disconnect-Reconnect page for mode_sense */
1308 unsigned char disconnect_pg
[] = {0x2, 0xe, 128, 128, 0, 10, 0, 0,
1309 0, 0, 0, 0, 0, 0, 0, 0};
1311 memcpy(p
, disconnect_pg
, sizeof(disconnect_pg
));
1313 memset(p
+ 2, 0, sizeof(disconnect_pg
) - 2);
1314 return sizeof(disconnect_pg
);
1317 static int resp_format_pg(unsigned char * p
, int pcontrol
, int target
)
1318 { /* Format device page for mode_sense */
1319 unsigned char format_pg
[] = {0x3, 0x16, 0, 0, 0, 0, 0, 0,
1320 0, 0, 0, 0, 0, 0, 0, 0,
1321 0, 0, 0, 0, 0x40, 0, 0, 0};
1323 memcpy(p
, format_pg
, sizeof(format_pg
));
1324 p
[10] = (sdebug_sectors_per
>> 8) & 0xff;
1325 p
[11] = sdebug_sectors_per
& 0xff;
1326 p
[12] = (SECT_SIZE
>> 8) & 0xff;
1327 p
[13] = SECT_SIZE
& 0xff;
1328 if (DEV_REMOVEABLE(target
))
1329 p
[20] |= 0x20; /* should agree with INQUIRY */
1331 memset(p
+ 2, 0, sizeof(format_pg
) - 2);
1332 return sizeof(format_pg
);
1335 static int resp_caching_pg(unsigned char * p
, int pcontrol
, int target
)
1336 { /* Caching page for mode_sense */
1337 unsigned char caching_pg
[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0,
1338 0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0, 0, 0, 0, 0};
1340 memcpy(p
, caching_pg
, sizeof(caching_pg
));
1342 memset(p
+ 2, 0, sizeof(caching_pg
) - 2);
1343 return sizeof(caching_pg
);
1346 static int resp_ctrl_m_pg(unsigned char * p
, int pcontrol
, int target
)
1347 { /* Control mode page for mode_sense */
1348 unsigned char ch_ctrl_m_pg
[] = {/* 0xa, 10, */ 0x6, 0, 0, 0, 0, 0,
1350 unsigned char d_ctrl_m_pg
[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
1353 if (scsi_debug_dsense
)
1354 ctrl_m_pg
[2] |= 0x4;
1356 ctrl_m_pg
[2] &= ~0x4;
1357 memcpy(p
, ctrl_m_pg
, sizeof(ctrl_m_pg
));
1359 memcpy(p
+ 2, ch_ctrl_m_pg
, sizeof(ch_ctrl_m_pg
));
1360 else if (2 == pcontrol
)
1361 memcpy(p
, d_ctrl_m_pg
, sizeof(d_ctrl_m_pg
));
1362 return sizeof(ctrl_m_pg
);
1366 static int resp_iec_m_pg(unsigned char * p
, int pcontrol
, int target
)
1367 { /* Informational Exceptions control mode page for mode_sense */
1368 unsigned char ch_iec_m_pg
[] = {/* 0x1c, 0xa, */ 0x4, 0xf, 0, 0, 0, 0,
1370 unsigned char d_iec_m_pg
[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
1373 memcpy(p
, iec_m_pg
, sizeof(iec_m_pg
));
1375 memcpy(p
+ 2, ch_iec_m_pg
, sizeof(ch_iec_m_pg
));
1376 else if (2 == pcontrol
)
1377 memcpy(p
, d_iec_m_pg
, sizeof(d_iec_m_pg
));
1378 return sizeof(iec_m_pg
);
1381 static int resp_sas_sf_m_pg(unsigned char * p
, int pcontrol
, int target
)
1382 { /* SAS SSP mode page - short format for mode_sense */
1383 unsigned char sas_sf_m_pg
[] = {0x19, 0x6,
1384 0x6, 0x0, 0x7, 0xd0, 0x0, 0x0};
1386 memcpy(p
, sas_sf_m_pg
, sizeof(sas_sf_m_pg
));
1388 memset(p
+ 2, 0, sizeof(sas_sf_m_pg
) - 2);
1389 return sizeof(sas_sf_m_pg
);
1393 static int resp_sas_pcd_m_spg(unsigned char * p
, int pcontrol
, int target
,
1395 { /* SAS phy control and discover mode page for mode_sense */
1396 unsigned char sas_pcd_m_pg
[] = {0x59, 0x1, 0, 0x64, 0, 0x6, 0, 2,
1397 0, 0, 0, 0, 0x10, 0x9, 0x8, 0x0,
1398 0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0,
1399 0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1,
1400 0x2, 0, 0, 0, 0, 0, 0, 0,
1401 0x88, 0x99, 0, 0, 0, 0, 0, 0,
1402 0, 0, 0, 0, 0, 0, 0, 0,
1403 0, 1, 0, 0, 0x10, 0x9, 0x8, 0x0,
1404 0x52, 0x22, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0,
1405 0x51, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x1,
1406 0x3, 0, 0, 0, 0, 0, 0, 0,
1407 0x88, 0x99, 0, 0, 0, 0, 0, 0,
1408 0, 0, 0, 0, 0, 0, 0, 0,
1412 port_a
= target_dev_id
+ 1;
1413 port_b
= port_a
+ 1;
1414 memcpy(p
, sas_pcd_m_pg
, sizeof(sas_pcd_m_pg
));
1415 p
[20] = (port_a
>> 24);
1416 p
[21] = (port_a
>> 16) & 0xff;
1417 p
[22] = (port_a
>> 8) & 0xff;
1418 p
[23] = port_a
& 0xff;
1419 p
[48 + 20] = (port_b
>> 24);
1420 p
[48 + 21] = (port_b
>> 16) & 0xff;
1421 p
[48 + 22] = (port_b
>> 8) & 0xff;
1422 p
[48 + 23] = port_b
& 0xff;
1424 memset(p
+ 4, 0, sizeof(sas_pcd_m_pg
) - 4);
1425 return sizeof(sas_pcd_m_pg
);
1428 static int resp_sas_sha_m_spg(unsigned char * p
, int pcontrol
)
1429 { /* SAS SSP shared protocol specific port mode subpage */
1430 unsigned char sas_sha_m_pg
[] = {0x59, 0x2, 0, 0xc, 0, 0x6, 0x10, 0,
1431 0, 0, 0, 0, 0, 0, 0, 0,
1434 memcpy(p
, sas_sha_m_pg
, sizeof(sas_sha_m_pg
));
1436 memset(p
+ 4, 0, sizeof(sas_sha_m_pg
) - 4);
1437 return sizeof(sas_sha_m_pg
);
1440 #define SDEBUG_MAX_MSENSE_SZ 256
1442 static int resp_mode_sense(struct scsi_cmnd
* scp
, int target
,
1443 struct sdebug_dev_info
* devip
)
1445 unsigned char dbd
, llbaa
;
1446 int pcontrol
, pcode
, subpcode
, bd_len
;
1447 unsigned char dev_spec
;
1448 int k
, alloc_len
, msense_6
, offset
, len
, errsts
, target_dev_id
;
1450 unsigned char arr
[SDEBUG_MAX_MSENSE_SZ
];
1451 unsigned char *cmd
= (unsigned char *)scp
->cmnd
;
1453 if ((errsts
= check_readiness(scp
, 1, devip
)))
1455 dbd
= !!(cmd
[1] & 0x8);
1456 pcontrol
= (cmd
[2] & 0xc0) >> 6;
1457 pcode
= cmd
[2] & 0x3f;
1459 msense_6
= (MODE_SENSE
== cmd
[0]);
1460 llbaa
= msense_6
? 0 : !!(cmd
[1] & 0x10);
1461 if ((0 == scsi_debug_ptype
) && (0 == dbd
))
1462 bd_len
= llbaa
? 16 : 8;
1465 alloc_len
= msense_6
? cmd
[4] : ((cmd
[7] << 8) | cmd
[8]);
1466 memset(arr
, 0, SDEBUG_MAX_MSENSE_SZ
);
1467 if (0x3 == pcontrol
) { /* Saving values not supported */
1468 mk_sense_buffer(devip
, ILLEGAL_REQUEST
, SAVING_PARAMS_UNSUP
,
1470 return check_condition_result
;
1472 target_dev_id
= ((devip
->sdbg_host
->shost
->host_no
+ 1) * 2000) +
1473 (devip
->target
* 1000) - 3;
1474 /* set DPOFUA bit for disks */
1475 if (0 == scsi_debug_ptype
)
1476 dev_spec
= (DEV_READONLY(target
) ? 0x80 : 0x0) | 0x10;
1486 arr
[4] = 0x1; /* set LONGLBA bit */
1487 arr
[7] = bd_len
; /* assume 255 or less */
1491 if ((bd_len
> 0) && (0 == sdebug_capacity
)) {
1492 if (scsi_debug_virtual_gb
> 0) {
1493 sdebug_capacity
= 2048 * 1024;
1494 sdebug_capacity
*= scsi_debug_virtual_gb
;
1496 sdebug_capacity
= sdebug_store_sectors
;
1499 if (sdebug_capacity
> 0xfffffffe) {
1505 ap
[0] = (sdebug_capacity
>> 24) & 0xff;
1506 ap
[1] = (sdebug_capacity
>> 16) & 0xff;
1507 ap
[2] = (sdebug_capacity
>> 8) & 0xff;
1508 ap
[3] = sdebug_capacity
& 0xff;
1510 ap
[6] = (SECT_SIZE_PER(target
) >> 8) & 0xff;
1511 ap
[7] = SECT_SIZE_PER(target
) & 0xff;
1514 } else if (16 == bd_len
) {
1515 unsigned long long capac
= sdebug_capacity
;
1517 for (k
= 0; k
< 8; ++k
, capac
>>= 8)
1518 ap
[7 - k
] = capac
& 0xff;
1519 ap
[12] = (SECT_SIZE_PER(target
) >> 24) & 0xff;
1520 ap
[13] = (SECT_SIZE_PER(target
) >> 16) & 0xff;
1521 ap
[14] = (SECT_SIZE_PER(target
) >> 8) & 0xff;
1522 ap
[15] = SECT_SIZE_PER(target
) & 0xff;
1527 if ((subpcode
> 0x0) && (subpcode
< 0xff) && (0x19 != pcode
)) {
1528 /* TODO: Control Extension page */
1529 mk_sense_buffer(devip
, ILLEGAL_REQUEST
, INVALID_FIELD_IN_CDB
,
1531 return check_condition_result
;
1534 case 0x1: /* Read-Write error recovery page, direct access */
1535 len
= resp_err_recov_pg(ap
, pcontrol
, target
);
1538 case 0x2: /* Disconnect-Reconnect page, all devices */
1539 len
= resp_disconnect_pg(ap
, pcontrol
, target
);
1542 case 0x3: /* Format device page, direct access */
1543 len
= resp_format_pg(ap
, pcontrol
, target
);
1546 case 0x8: /* Caching page, direct access */
1547 len
= resp_caching_pg(ap
, pcontrol
, target
);
1550 case 0xa: /* Control Mode page, all devices */
1551 len
= resp_ctrl_m_pg(ap
, pcontrol
, target
);
1554 case 0x19: /* if spc==1 then sas phy, control+discover */
1555 if ((subpcode
> 0x2) && (subpcode
< 0xff)) {
1556 mk_sense_buffer(devip
, ILLEGAL_REQUEST
,
1557 INVALID_FIELD_IN_CDB
, 0);
1558 return check_condition_result
;
1561 if ((0x0 == subpcode
) || (0xff == subpcode
))
1562 len
+= resp_sas_sf_m_pg(ap
+ len
, pcontrol
, target
);
1563 if ((0x1 == subpcode
) || (0xff == subpcode
))
1564 len
+= resp_sas_pcd_m_spg(ap
+ len
, pcontrol
, target
,
1566 if ((0x2 == subpcode
) || (0xff == subpcode
))
1567 len
+= resp_sas_sha_m_spg(ap
+ len
, pcontrol
);
1570 case 0x1c: /* Informational Exceptions Mode page, all devices */
1571 len
= resp_iec_m_pg(ap
, pcontrol
, target
);
1574 case 0x3f: /* Read all Mode pages */
1575 if ((0 == subpcode
) || (0xff == subpcode
)) {
1576 len
= resp_err_recov_pg(ap
, pcontrol
, target
);
1577 len
+= resp_disconnect_pg(ap
+ len
, pcontrol
, target
);
1578 len
+= resp_format_pg(ap
+ len
, pcontrol
, target
);
1579 len
+= resp_caching_pg(ap
+ len
, pcontrol
, target
);
1580 len
+= resp_ctrl_m_pg(ap
+ len
, pcontrol
, target
);
1581 len
+= resp_sas_sf_m_pg(ap
+ len
, pcontrol
, target
);
1582 if (0xff == subpcode
) {
1583 len
+= resp_sas_pcd_m_spg(ap
+ len
, pcontrol
,
1584 target
, target_dev_id
);
1585 len
+= resp_sas_sha_m_spg(ap
+ len
, pcontrol
);
1587 len
+= resp_iec_m_pg(ap
+ len
, pcontrol
, target
);
1589 mk_sense_buffer(devip
, ILLEGAL_REQUEST
,
1590 INVALID_FIELD_IN_CDB
, 0);
1591 return check_condition_result
;
1596 mk_sense_buffer(devip
, ILLEGAL_REQUEST
, INVALID_FIELD_IN_CDB
,
1598 return check_condition_result
;
1601 arr
[0] = offset
- 1;
1603 arr
[0] = ((offset
- 2) >> 8) & 0xff;
1604 arr
[1] = (offset
- 2) & 0xff;
1606 return fill_from_dev_buffer(scp
, arr
, min(alloc_len
, offset
));
1609 #define SDEBUG_MAX_MSELECT_SZ 512
1611 static int resp_mode_select(struct scsi_cmnd
* scp
, int mselect6
,
1612 struct sdebug_dev_info
* devip
)
1614 int pf
, sp
, ps
, md_len
, bd_len
, off
, spf
, pg_len
;
1615 int param_len
, res
, errsts
, mpage
;
1616 unsigned char arr
[SDEBUG_MAX_MSELECT_SZ
];
1617 unsigned char *cmd
= (unsigned char *)scp
->cmnd
;
1619 if ((errsts
= check_readiness(scp
, 1, devip
)))
1621 memset(arr
, 0, sizeof(arr
));
1624 param_len
= mselect6
? cmd
[4] : ((cmd
[7] << 8) + cmd
[8]);
1625 if ((0 == pf
) || sp
|| (param_len
> SDEBUG_MAX_MSELECT_SZ
)) {
1626 mk_sense_buffer(devip
, ILLEGAL_REQUEST
,
1627 INVALID_FIELD_IN_CDB
, 0);
1628 return check_condition_result
;
1630 res
= fetch_to_dev_buffer(scp
, arr
, param_len
);
1632 return (DID_ERROR
<< 16);
1633 else if ((res
< param_len
) &&
1634 (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
))
1635 printk(KERN_INFO
"scsi_debug: mode_select: cdb indicated=%d, "
1636 " IO sent=%d bytes\n", param_len
, res
);
1637 md_len
= mselect6
? (arr
[0] + 1) : ((arr
[0] << 8) + arr
[1] + 2);
1638 bd_len
= mselect6
? arr
[3] : ((arr
[6] << 8) + arr
[7]);
1640 mk_sense_buffer(devip
, ILLEGAL_REQUEST
,
1641 INVALID_FIELD_IN_PARAM_LIST
, 0);
1642 return check_condition_result
;
1644 off
= bd_len
+ (mselect6
? 4 : 8);
1645 mpage
= arr
[off
] & 0x3f;
1646 ps
= !!(arr
[off
] & 0x80);
1648 mk_sense_buffer(devip
, ILLEGAL_REQUEST
,
1649 INVALID_FIELD_IN_PARAM_LIST
, 0);
1650 return check_condition_result
;
1652 spf
= !!(arr
[off
] & 0x40);
1653 pg_len
= spf
? ((arr
[off
+ 2] << 8) + arr
[off
+ 3] + 4) :
1655 if ((pg_len
+ off
) > param_len
) {
1656 mk_sense_buffer(devip
, ILLEGAL_REQUEST
,
1657 PARAMETER_LIST_LENGTH_ERR
, 0);
1658 return check_condition_result
;
1661 case 0xa: /* Control Mode page */
1662 if (ctrl_m_pg
[1] == arr
[off
+ 1]) {
1663 memcpy(ctrl_m_pg
+ 2, arr
+ off
+ 2,
1664 sizeof(ctrl_m_pg
) - 2);
1665 scsi_debug_dsense
= !!(ctrl_m_pg
[2] & 0x4);
1669 case 0x1c: /* Informational Exceptions Mode page */
1670 if (iec_m_pg
[1] == arr
[off
+ 1]) {
1671 memcpy(iec_m_pg
+ 2, arr
+ off
+ 2,
1672 sizeof(iec_m_pg
) - 2);
1679 mk_sense_buffer(devip
, ILLEGAL_REQUEST
,
1680 INVALID_FIELD_IN_PARAM_LIST
, 0);
1681 return check_condition_result
;
1684 static int resp_temp_l_pg(unsigned char * arr
)
1686 unsigned char temp_l_pg
[] = {0x0, 0x0, 0x3, 0x2, 0x0, 38,
1687 0x0, 0x1, 0x3, 0x2, 0x0, 65,
1690 memcpy(arr
, temp_l_pg
, sizeof(temp_l_pg
));
1691 return sizeof(temp_l_pg
);
1694 static int resp_ie_l_pg(unsigned char * arr
)
1696 unsigned char ie_l_pg
[] = {0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 38,
1699 memcpy(arr
, ie_l_pg
, sizeof(ie_l_pg
));
1700 if (iec_m_pg
[2] & 0x4) { /* TEST bit set */
1701 arr
[4] = THRESHOLD_EXCEEDED
;
1704 return sizeof(ie_l_pg
);
1707 #define SDEBUG_MAX_LSENSE_SZ 512
1709 static int resp_log_sense(struct scsi_cmnd
* scp
,
1710 struct sdebug_dev_info
* devip
)
1712 int ppc
, sp
, pcontrol
, pcode
, subpcode
, alloc_len
, errsts
, len
, n
;
1713 unsigned char arr
[SDEBUG_MAX_LSENSE_SZ
];
1714 unsigned char *cmd
= (unsigned char *)scp
->cmnd
;
1716 if ((errsts
= check_readiness(scp
, 1, devip
)))
1718 memset(arr
, 0, sizeof(arr
));
1722 mk_sense_buffer(devip
, ILLEGAL_REQUEST
,
1723 INVALID_FIELD_IN_CDB
, 0);
1724 return check_condition_result
;
1726 pcontrol
= (cmd
[2] & 0xc0) >> 6;
1727 pcode
= cmd
[2] & 0x3f;
1728 subpcode
= cmd
[3] & 0xff;
1729 alloc_len
= (cmd
[7] << 8) + cmd
[8];
1731 if (0 == subpcode
) {
1733 case 0x0: /* Supported log pages log page */
1735 arr
[n
++] = 0x0; /* this page */
1736 arr
[n
++] = 0xd; /* Temperature */
1737 arr
[n
++] = 0x2f; /* Informational exceptions */
1740 case 0xd: /* Temperature log page */
1741 arr
[3] = resp_temp_l_pg(arr
+ 4);
1743 case 0x2f: /* Informational exceptions log page */
1744 arr
[3] = resp_ie_l_pg(arr
+ 4);
1747 mk_sense_buffer(devip
, ILLEGAL_REQUEST
,
1748 INVALID_FIELD_IN_CDB
, 0);
1749 return check_condition_result
;
1751 } else if (0xff == subpcode
) {
1755 case 0x0: /* Supported log pages and subpages log page */
1758 arr
[n
++] = 0x0; /* 0,0 page */
1760 arr
[n
++] = 0xff; /* this page */
1762 arr
[n
++] = 0x0; /* Temperature */
1764 arr
[n
++] = 0x0; /* Informational exceptions */
1767 case 0xd: /* Temperature subpages */
1770 arr
[n
++] = 0x0; /* Temperature */
1773 case 0x2f: /* Informational exceptions subpages */
1776 arr
[n
++] = 0x0; /* Informational exceptions */
1780 mk_sense_buffer(devip
, ILLEGAL_REQUEST
,
1781 INVALID_FIELD_IN_CDB
, 0);
1782 return check_condition_result
;
1785 mk_sense_buffer(devip
, ILLEGAL_REQUEST
,
1786 INVALID_FIELD_IN_CDB
, 0);
1787 return check_condition_result
;
1789 len
= min(((arr
[2] << 8) + arr
[3]) + 4, alloc_len
);
1790 return fill_from_dev_buffer(scp
, arr
,
1791 min(len
, SDEBUG_MAX_INQ_ARR_SZ
));
1794 static int resp_read(struct scsi_cmnd
* SCpnt
, unsigned long long lba
,
1795 unsigned int num
, struct sdebug_dev_info
* devip
)
1797 unsigned long iflags
;
1798 unsigned int block
, from_bottom
;
1799 unsigned long long u
;
1802 if (lba
+ num
> sdebug_capacity
) {
1803 mk_sense_buffer(devip
, ILLEGAL_REQUEST
, ADDR_OUT_OF_RANGE
,
1805 return check_condition_result
;
1807 /* transfer length excessive (tie in to block limits VPD page) */
1808 if (num
> sdebug_store_sectors
) {
1809 mk_sense_buffer(devip
, ILLEGAL_REQUEST
, INVALID_FIELD_IN_CDB
,
1811 return check_condition_result
;
1813 if ((SCSI_DEBUG_OPT_MEDIUM_ERR
& scsi_debug_opts
) &&
1814 (lba
<= OPT_MEDIUM_ERR_ADDR
) &&
1815 ((lba
+ num
) > OPT_MEDIUM_ERR_ADDR
)) {
1816 /* claim unrecoverable read error */
1817 mk_sense_buffer(devip
, MEDIUM_ERROR
, UNRECOVERED_READ_ERR
,
1819 /* set info field and valid bit for fixed descriptor */
1820 if (0x70 == (devip
->sense_buff
[0] & 0x7f)) {
1821 devip
->sense_buff
[0] |= 0x80; /* Valid bit */
1822 ret
= OPT_MEDIUM_ERR_ADDR
;
1823 devip
->sense_buff
[3] = (ret
>> 24) & 0xff;
1824 devip
->sense_buff
[4] = (ret
>> 16) & 0xff;
1825 devip
->sense_buff
[5] = (ret
>> 8) & 0xff;
1826 devip
->sense_buff
[6] = ret
& 0xff;
1828 return check_condition_result
;
1830 read_lock_irqsave(&atomic_rw
, iflags
);
1831 if ((lba
+ num
) <= sdebug_store_sectors
)
1832 ret
= fill_from_dev_buffer(SCpnt
,
1833 fake_storep
+ (lba
* SECT_SIZE
),
1836 /* modulo when one arg is 64 bits needs do_div() */
1838 block
= do_div(u
, sdebug_store_sectors
);
1840 if ((block
+ num
) > sdebug_store_sectors
)
1841 from_bottom
= (block
+ num
) - sdebug_store_sectors
;
1842 ret
= fill_from_dev_buffer(SCpnt
,
1843 fake_storep
+ (block
* SECT_SIZE
),
1844 (num
- from_bottom
) * SECT_SIZE
);
1845 if ((0 == ret
) && (from_bottom
> 0))
1846 ret
= fill_from_dev_buffer(SCpnt
, fake_storep
,
1847 from_bottom
* SECT_SIZE
);
1849 read_unlock_irqrestore(&atomic_rw
, iflags
);
1853 static int resp_write(struct scsi_cmnd
* SCpnt
, unsigned long long lba
,
1854 unsigned int num
, struct sdebug_dev_info
* devip
)
1856 unsigned long iflags
;
1857 unsigned int block
, to_bottom
;
1858 unsigned long long u
;
1861 if (lba
+ num
> sdebug_capacity
) {
1862 mk_sense_buffer(devip
, ILLEGAL_REQUEST
, ADDR_OUT_OF_RANGE
,
1864 return check_condition_result
;
1866 /* transfer length excessive (tie in to block limits VPD page) */
1867 if (num
> sdebug_store_sectors
) {
1868 mk_sense_buffer(devip
, ILLEGAL_REQUEST
, INVALID_FIELD_IN_CDB
,
1870 return check_condition_result
;
1873 write_lock_irqsave(&atomic_rw
, iflags
);
1874 if ((lba
+ num
) <= sdebug_store_sectors
)
1875 res
= fetch_to_dev_buffer(SCpnt
,
1876 fake_storep
+ (lba
* SECT_SIZE
),
1879 /* modulo when one arg is 64 bits needs do_div() */
1881 block
= do_div(u
, sdebug_store_sectors
);
1883 if ((block
+ num
) > sdebug_store_sectors
)
1884 to_bottom
= (block
+ num
) - sdebug_store_sectors
;
1885 res
= fetch_to_dev_buffer(SCpnt
,
1886 fake_storep
+ (block
* SECT_SIZE
),
1887 (num
- to_bottom
) * SECT_SIZE
);
1888 if ((0 == res
) && (to_bottom
> 0))
1889 res
= fetch_to_dev_buffer(SCpnt
, fake_storep
,
1890 to_bottom
* SECT_SIZE
);
1892 write_unlock_irqrestore(&atomic_rw
, iflags
);
1894 return (DID_ERROR
<< 16);
1895 else if ((res
< (num
* SECT_SIZE
)) &&
1896 (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
))
1897 printk(KERN_INFO
"scsi_debug: write: cdb indicated=%u, "
1898 " IO sent=%d bytes\n", num
* SECT_SIZE
, res
);
1902 #define SDEBUG_RLUN_ARR_SZ 256
1904 static int resp_report_luns(struct scsi_cmnd
* scp
,
1905 struct sdebug_dev_info
* devip
)
1907 unsigned int alloc_len
;
1908 int lun_cnt
, i
, upper
, num
, n
, wlun
, lun
;
1909 unsigned char *cmd
= (unsigned char *)scp
->cmnd
;
1910 int select_report
= (int)cmd
[2];
1911 struct scsi_lun
*one_lun
;
1912 unsigned char arr
[SDEBUG_RLUN_ARR_SZ
];
1913 unsigned char * max_addr
;
1915 alloc_len
= cmd
[9] + (cmd
[8] << 8) + (cmd
[7] << 16) + (cmd
[6] << 24);
1916 if ((alloc_len
< 4) || (select_report
> 2)) {
1917 mk_sense_buffer(devip
, ILLEGAL_REQUEST
, INVALID_FIELD_IN_CDB
,
1919 return check_condition_result
;
1921 /* can produce response with up to 16k luns (lun 0 to lun 16383) */
1922 memset(arr
, 0, SDEBUG_RLUN_ARR_SZ
);
1923 lun_cnt
= scsi_debug_max_luns
;
1924 if (1 == select_report
)
1926 else if (scsi_debug_no_lun_0
&& (lun_cnt
> 0))
1928 wlun
= (select_report
> 0) ? 1 : 0;
1929 num
= lun_cnt
+ wlun
;
1930 arr
[2] = ((sizeof(struct scsi_lun
) * num
) >> 8) & 0xff;
1931 arr
[3] = (sizeof(struct scsi_lun
) * num
) & 0xff;
1932 n
= min((int)((SDEBUG_RLUN_ARR_SZ
- 8) /
1933 sizeof(struct scsi_lun
)), num
);
1938 one_lun
= (struct scsi_lun
*) &arr
[8];
1939 max_addr
= arr
+ SDEBUG_RLUN_ARR_SZ
;
1940 for (i
= 0, lun
= (scsi_debug_no_lun_0
? 1 : 0);
1941 ((i
< lun_cnt
) && ((unsigned char *)(one_lun
+ i
) < max_addr
));
1943 upper
= (lun
>> 8) & 0x3f;
1945 one_lun
[i
].scsi_lun
[0] =
1946 (upper
| (SAM2_LUN_ADDRESS_METHOD
<< 6));
1947 one_lun
[i
].scsi_lun
[1] = lun
& 0xff;
1950 one_lun
[i
].scsi_lun
[0] = (SAM2_WLUN_REPORT_LUNS
>> 8) & 0xff;
1951 one_lun
[i
].scsi_lun
[1] = SAM2_WLUN_REPORT_LUNS
& 0xff;
1954 alloc_len
= (unsigned char *)(one_lun
+ i
) - arr
;
1955 return fill_from_dev_buffer(scp
, arr
,
1956 min((int)alloc_len
, SDEBUG_RLUN_ARR_SZ
));
1959 /* When timer goes off this function is called. */
1960 static void timer_intr_handler(unsigned long indx
)
1962 struct sdebug_queued_cmd
* sqcp
;
1963 unsigned long iflags
;
1965 if (indx
>= SCSI_DEBUG_CANQUEUE
) {
1966 printk(KERN_ERR
"scsi_debug:timer_intr_handler: indx too "
1970 spin_lock_irqsave(&queued_arr_lock
, iflags
);
1971 sqcp
= &queued_arr
[(int)indx
];
1972 if (! sqcp
->in_use
) {
1973 printk(KERN_ERR
"scsi_debug:timer_intr_handler: Unexpected "
1975 spin_unlock_irqrestore(&queued_arr_lock
, iflags
);
1979 if (sqcp
->done_funct
) {
1980 sqcp
->a_cmnd
->result
= sqcp
->scsi_result
;
1981 sqcp
->done_funct(sqcp
->a_cmnd
); /* callback to mid level */
1983 sqcp
->done_funct
= NULL
;
1984 spin_unlock_irqrestore(&queued_arr_lock
, iflags
);
1987 static int scsi_debug_slave_alloc(struct scsi_device
* sdp
)
1989 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
)
1990 printk(KERN_INFO
"scsi_debug: slave_alloc <%u %u %u %u>\n",
1991 sdp
->host
->host_no
, sdp
->channel
, sdp
->id
, sdp
->lun
);
1995 static int scsi_debug_slave_configure(struct scsi_device
* sdp
)
1997 struct sdebug_dev_info
* devip
;
1999 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
)
2000 printk(KERN_INFO
"scsi_debug: slave_configure <%u %u %u %u>\n",
2001 sdp
->host
->host_no
, sdp
->channel
, sdp
->id
, sdp
->lun
);
2002 if (sdp
->host
->max_cmd_len
!= SCSI_DEBUG_MAX_CMD_LEN
)
2003 sdp
->host
->max_cmd_len
= SCSI_DEBUG_MAX_CMD_LEN
;
2004 devip
= devInfoReg(sdp
);
2006 return 1; /* no resources, will be marked offline */
2007 sdp
->hostdata
= devip
;
2008 if (sdp
->host
->cmd_per_lun
)
2009 scsi_adjust_queue_depth(sdp
, SDEBUG_TAGGED_QUEUING
,
2010 sdp
->host
->cmd_per_lun
);
2011 blk_queue_max_segment_size(sdp
->request_queue
, 256 * 1024);
2015 static void scsi_debug_slave_destroy(struct scsi_device
* sdp
)
2017 struct sdebug_dev_info
* devip
=
2018 (struct sdebug_dev_info
*)sdp
->hostdata
;
2020 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
)
2021 printk(KERN_INFO
"scsi_debug: slave_destroy <%u %u %u %u>\n",
2022 sdp
->host
->host_no
, sdp
->channel
, sdp
->id
, sdp
->lun
);
2024 /* make this slot avaliable for re-use */
2026 sdp
->hostdata
= NULL
;
2030 static struct sdebug_dev_info
* devInfoReg(struct scsi_device
* sdev
)
2032 struct sdebug_host_info
* sdbg_host
;
2033 struct sdebug_dev_info
* open_devip
= NULL
;
2034 struct sdebug_dev_info
* devip
=
2035 (struct sdebug_dev_info
*)sdev
->hostdata
;
2039 sdbg_host
= *(struct sdebug_host_info
**) sdev
->host
->hostdata
;
2041 printk(KERN_ERR
"Host info NULL\n");
2044 list_for_each_entry(devip
, &sdbg_host
->dev_info_list
, dev_list
) {
2045 if ((devip
->used
) && (devip
->channel
== sdev
->channel
) &&
2046 (devip
->target
== sdev
->id
) &&
2047 (devip
->lun
== sdev
->lun
))
2050 if ((!devip
->used
) && (!open_devip
))
2054 if (NULL
== open_devip
) { /* try and make a new one */
2055 open_devip
= kzalloc(sizeof(*open_devip
),GFP_ATOMIC
);
2056 if (NULL
== open_devip
) {
2057 printk(KERN_ERR
"%s: out of memory at line %d\n",
2058 __FUNCTION__
, __LINE__
);
2061 open_devip
->sdbg_host
= sdbg_host
;
2062 list_add_tail(&open_devip
->dev_list
,
2063 &sdbg_host
->dev_info_list
);
2066 open_devip
->channel
= sdev
->channel
;
2067 open_devip
->target
= sdev
->id
;
2068 open_devip
->lun
= sdev
->lun
;
2069 open_devip
->sdbg_host
= sdbg_host
;
2070 open_devip
->reset
= 1;
2071 open_devip
->used
= 1;
2072 memset(open_devip
->sense_buff
, 0, SDEBUG_SENSE_LEN
);
2073 if (scsi_debug_dsense
)
2074 open_devip
->sense_buff
[0] = 0x72;
2076 open_devip
->sense_buff
[0] = 0x70;
2077 open_devip
->sense_buff
[7] = 0xa;
2079 if (sdev
->lun
== SAM2_WLUN_REPORT_LUNS
)
2080 open_devip
->wlun
= SAM2_WLUN_REPORT_LUNS
& 0xff;
2086 static void mk_sense_buffer(struct sdebug_dev_info
* devip
, int key
,
2089 unsigned char * sbuff
;
2091 sbuff
= devip
->sense_buff
;
2092 memset(sbuff
, 0, SDEBUG_SENSE_LEN
);
2093 if (scsi_debug_dsense
) {
2094 sbuff
[0] = 0x72; /* descriptor, current */
2099 sbuff
[0] = 0x70; /* fixed, current */
2101 sbuff
[7] = 0xa; /* implies 18 byte sense buffer */
2105 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
)
2106 printk(KERN_INFO
"scsi_debug: [sense_key,asc,ascq]: "
2107 "[0x%x,0x%x,0x%x]\n", key
, asc
, asq
);
2110 static int scsi_debug_abort(struct scsi_cmnd
* SCpnt
)
2112 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
)
2113 printk(KERN_INFO
"scsi_debug: abort\n");
2115 stop_queued_cmnd(SCpnt
);
2119 static int scsi_debug_biosparam(struct scsi_device
*sdev
,
2120 struct block_device
* bdev
, sector_t capacity
, int *info
)
2125 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
)
2126 printk(KERN_INFO
"scsi_debug: biosparam\n");
2127 buf
= scsi_bios_ptable(bdev
);
2129 res
= scsi_partsize(buf
, capacity
,
2130 &info
[2], &info
[0], &info
[1]);
2135 info
[0] = sdebug_heads
;
2136 info
[1] = sdebug_sectors_per
;
2137 info
[2] = sdebug_cylinders_per
;
2141 static int scsi_debug_device_reset(struct scsi_cmnd
* SCpnt
)
2143 struct sdebug_dev_info
* devip
;
2145 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
)
2146 printk(KERN_INFO
"scsi_debug: device_reset\n");
2149 devip
= devInfoReg(SCpnt
->device
);
2156 static int scsi_debug_bus_reset(struct scsi_cmnd
* SCpnt
)
2158 struct sdebug_host_info
*sdbg_host
;
2159 struct sdebug_dev_info
* dev_info
;
2160 struct scsi_device
* sdp
;
2161 struct Scsi_Host
* hp
;
2163 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
)
2164 printk(KERN_INFO
"scsi_debug: bus_reset\n");
2166 if (SCpnt
&& ((sdp
= SCpnt
->device
)) && ((hp
= sdp
->host
))) {
2167 sdbg_host
= *(struct sdebug_host_info
**) hp
->hostdata
;
2169 list_for_each_entry(dev_info
,
2170 &sdbg_host
->dev_info_list
,
2172 dev_info
->reset
= 1;
2178 static int scsi_debug_host_reset(struct scsi_cmnd
* SCpnt
)
2180 struct sdebug_host_info
* sdbg_host
;
2181 struct sdebug_dev_info
* dev_info
;
2183 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
)
2184 printk(KERN_INFO
"scsi_debug: host_reset\n");
2186 spin_lock(&sdebug_host_list_lock
);
2187 list_for_each_entry(sdbg_host
, &sdebug_host_list
, host_list
) {
2188 list_for_each_entry(dev_info
, &sdbg_host
->dev_info_list
,
2190 dev_info
->reset
= 1;
2192 spin_unlock(&sdebug_host_list_lock
);
2197 /* Returns 1 if found 'cmnd' and deleted its timer. else returns 0 */
2198 static int stop_queued_cmnd(struct scsi_cmnd
* cmnd
)
2200 unsigned long iflags
;
2202 struct sdebug_queued_cmd
* sqcp
;
2204 spin_lock_irqsave(&queued_arr_lock
, iflags
);
2205 for (k
= 0; k
< SCSI_DEBUG_CANQUEUE
; ++k
) {
2206 sqcp
= &queued_arr
[k
];
2207 if (sqcp
->in_use
&& (cmnd
== sqcp
->a_cmnd
)) {
2208 del_timer_sync(&sqcp
->cmnd_timer
);
2210 sqcp
->a_cmnd
= NULL
;
2214 spin_unlock_irqrestore(&queued_arr_lock
, iflags
);
2215 return (k
< SCSI_DEBUG_CANQUEUE
) ? 1 : 0;
2218 /* Deletes (stops) timers of all queued commands */
2219 static void stop_all_queued(void)
2221 unsigned long iflags
;
2223 struct sdebug_queued_cmd
* sqcp
;
2225 spin_lock_irqsave(&queued_arr_lock
, iflags
);
2226 for (k
= 0; k
< SCSI_DEBUG_CANQUEUE
; ++k
) {
2227 sqcp
= &queued_arr
[k
];
2228 if (sqcp
->in_use
&& sqcp
->a_cmnd
) {
2229 del_timer_sync(&sqcp
->cmnd_timer
);
2231 sqcp
->a_cmnd
= NULL
;
2234 spin_unlock_irqrestore(&queued_arr_lock
, iflags
);
2237 /* Initializes timers in queued array */
2238 static void __init
init_all_queued(void)
2240 unsigned long iflags
;
2242 struct sdebug_queued_cmd
* sqcp
;
2244 spin_lock_irqsave(&queued_arr_lock
, iflags
);
2245 for (k
= 0; k
< SCSI_DEBUG_CANQUEUE
; ++k
) {
2246 sqcp
= &queued_arr
[k
];
2247 init_timer(&sqcp
->cmnd_timer
);
2249 sqcp
->a_cmnd
= NULL
;
2251 spin_unlock_irqrestore(&queued_arr_lock
, iflags
);
2254 static void __init
sdebug_build_parts(unsigned char * ramp
)
2256 struct partition
* pp
;
2257 int starts
[SDEBUG_MAX_PARTS
+ 2];
2258 int sectors_per_part
, num_sectors
, k
;
2259 int heads_by_sects
, start_sec
, end_sec
;
2261 /* assume partition table already zeroed */
2262 if ((scsi_debug_num_parts
< 1) || (sdebug_store_size
< 1048576))
2264 if (scsi_debug_num_parts
> SDEBUG_MAX_PARTS
) {
2265 scsi_debug_num_parts
= SDEBUG_MAX_PARTS
;
2266 printk(KERN_WARNING
"scsi_debug:build_parts: reducing "
2267 "partitions to %d\n", SDEBUG_MAX_PARTS
);
2269 num_sectors
= (int)sdebug_store_sectors
;
2270 sectors_per_part
= (num_sectors
- sdebug_sectors_per
)
2271 / scsi_debug_num_parts
;
2272 heads_by_sects
= sdebug_heads
* sdebug_sectors_per
;
2273 starts
[0] = sdebug_sectors_per
;
2274 for (k
= 1; k
< scsi_debug_num_parts
; ++k
)
2275 starts
[k
] = ((k
* sectors_per_part
) / heads_by_sects
)
2277 starts
[scsi_debug_num_parts
] = num_sectors
;
2278 starts
[scsi_debug_num_parts
+ 1] = 0;
2280 ramp
[510] = 0x55; /* magic partition markings */
2282 pp
= (struct partition
*)(ramp
+ 0x1be);
2283 for (k
= 0; starts
[k
+ 1]; ++k
, ++pp
) {
2284 start_sec
= starts
[k
];
2285 end_sec
= starts
[k
+ 1] - 1;
2288 pp
->cyl
= start_sec
/ heads_by_sects
;
2289 pp
->head
= (start_sec
- (pp
->cyl
* heads_by_sects
))
2290 / sdebug_sectors_per
;
2291 pp
->sector
= (start_sec
% sdebug_sectors_per
) + 1;
2293 pp
->end_cyl
= end_sec
/ heads_by_sects
;
2294 pp
->end_head
= (end_sec
- (pp
->end_cyl
* heads_by_sects
))
2295 / sdebug_sectors_per
;
2296 pp
->end_sector
= (end_sec
% sdebug_sectors_per
) + 1;
2298 pp
->start_sect
= start_sec
;
2299 pp
->nr_sects
= end_sec
- start_sec
+ 1;
2300 pp
->sys_ind
= 0x83; /* plain Linux partition */
2304 static int schedule_resp(struct scsi_cmnd
* cmnd
,
2305 struct sdebug_dev_info
* devip
,
2306 done_funct_t done
, int scsi_result
, int delta_jiff
)
2308 if ((SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
) && cmnd
) {
2310 struct scsi_device
* sdp
= cmnd
->device
;
2312 printk(KERN_INFO
"scsi_debug: <%u %u %u %u> "
2313 "non-zero result=0x%x\n", sdp
->host
->host_no
,
2314 sdp
->channel
, sdp
->id
, sdp
->lun
, scsi_result
);
2317 if (cmnd
&& devip
) {
2318 /* simulate autosense by this driver */
2319 if (SAM_STAT_CHECK_CONDITION
== (scsi_result
& 0xff))
2320 memcpy(cmnd
->sense_buffer
, devip
->sense_buff
,
2321 (SCSI_SENSE_BUFFERSIZE
> SDEBUG_SENSE_LEN
) ?
2322 SDEBUG_SENSE_LEN
: SCSI_SENSE_BUFFERSIZE
);
2324 if (delta_jiff
<= 0) {
2326 cmnd
->result
= scsi_result
;
2331 unsigned long iflags
;
2333 struct sdebug_queued_cmd
* sqcp
= NULL
;
2335 spin_lock_irqsave(&queued_arr_lock
, iflags
);
2336 for (k
= 0; k
< SCSI_DEBUG_CANQUEUE
; ++k
) {
2337 sqcp
= &queued_arr
[k
];
2341 if (k
>= SCSI_DEBUG_CANQUEUE
) {
2342 spin_unlock_irqrestore(&queued_arr_lock
, iflags
);
2343 printk(KERN_WARNING
"scsi_debug: can_queue exceeded\n");
2344 return 1; /* report busy to mid level */
2347 sqcp
->a_cmnd
= cmnd
;
2348 sqcp
->scsi_result
= scsi_result
;
2349 sqcp
->done_funct
= done
;
2350 sqcp
->cmnd_timer
.function
= timer_intr_handler
;
2351 sqcp
->cmnd_timer
.data
= k
;
2352 sqcp
->cmnd_timer
.expires
= jiffies
+ delta_jiff
;
2353 add_timer(&sqcp
->cmnd_timer
);
2354 spin_unlock_irqrestore(&queued_arr_lock
, iflags
);
2361 /* Note: The following macros create attribute files in the
2362 /sys/module/scsi_debug/parameters directory. Unfortunately this
2363 driver is unaware of a change and cannot trigger auxiliary actions
2364 as it can when the corresponding attribute in the
2365 /sys/bus/pseudo/drivers/scsi_debug directory is changed.
2367 module_param_named(add_host
, scsi_debug_add_host
, int, S_IRUGO
| S_IWUSR
);
2368 module_param_named(delay
, scsi_debug_delay
, int, S_IRUGO
| S_IWUSR
);
2369 module_param_named(dev_size_mb
, scsi_debug_dev_size_mb
, int, S_IRUGO
);
2370 module_param_named(dsense
, scsi_debug_dsense
, int, S_IRUGO
| S_IWUSR
);
2371 module_param_named(every_nth
, scsi_debug_every_nth
, int, S_IRUGO
| S_IWUSR
);
2372 module_param_named(fake_rw
, scsi_debug_fake_rw
, int, S_IRUGO
| S_IWUSR
);
2373 module_param_named(max_luns
, scsi_debug_max_luns
, int, S_IRUGO
| S_IWUSR
);
2374 module_param_named(no_lun_0
, scsi_debug_no_lun_0
, int, S_IRUGO
| S_IWUSR
);
2375 module_param_named(num_parts
, scsi_debug_num_parts
, int, S_IRUGO
);
2376 module_param_named(num_tgts
, scsi_debug_num_tgts
, int, S_IRUGO
| S_IWUSR
);
2377 module_param_named(opts
, scsi_debug_opts
, int, S_IRUGO
| S_IWUSR
);
2378 module_param_named(ptype
, scsi_debug_ptype
, int, S_IRUGO
| S_IWUSR
);
2379 module_param_named(scsi_level
, scsi_debug_scsi_level
, int, S_IRUGO
);
2380 module_param_named(virtual_gb
, scsi_debug_virtual_gb
, int, S_IRUGO
| S_IWUSR
);
2381 module_param_named(vpd_use_hostno
, scsi_debug_vpd_use_hostno
, int,
2384 MODULE_AUTHOR("Eric Youngdale + Douglas Gilbert");
2385 MODULE_DESCRIPTION("SCSI debug adapter driver");
2386 MODULE_LICENSE("GPL");
2387 MODULE_VERSION(SCSI_DEBUG_VERSION
);
2389 MODULE_PARM_DESC(add_host
, "0..127 hosts allowed(def=1)");
2390 MODULE_PARM_DESC(delay
, "# of jiffies to delay response(def=1)");
2391 MODULE_PARM_DESC(dev_size_mb
, "size in MB of ram shared by devs(def=8)");
2392 MODULE_PARM_DESC(dsense
, "use descriptor sense format(def=0 -> fixed)");
2393 MODULE_PARM_DESC(every_nth
, "timeout every nth command(def=0)");
2394 MODULE_PARM_DESC(fake_rw
, "fake reads/writes instead of copying (def=0)");
2395 MODULE_PARM_DESC(max_luns
, "number of LUNs per target to simulate(def=1)");
2396 MODULE_PARM_DESC(no_lun_0
, "no LU number 0 (def=0 -> have lun 0)");
2397 MODULE_PARM_DESC(num_parts
, "number of partitions(def=0)");
2398 MODULE_PARM_DESC(num_tgts
, "number of targets per host to simulate(def=1)");
2399 MODULE_PARM_DESC(opts
, "1->noise, 2->medium_err, 4->timeout, 8->recovered_err... (def=0)");
2400 MODULE_PARM_DESC(ptype
, "SCSI peripheral type(def=0[disk])");
2401 MODULE_PARM_DESC(scsi_level
, "SCSI level to simulate(def=5[SPC-3])");
2402 MODULE_PARM_DESC(virtual_gb
, "virtual gigabyte size (def=0 -> use dev_size_mb)");
2403 MODULE_PARM_DESC(vpd_use_hostno
, "0 -> dev ids ignore hostno (def=1 -> unique dev ids)");
2406 static char sdebug_info
[256];
2408 static const char * scsi_debug_info(struct Scsi_Host
* shp
)
2410 sprintf(sdebug_info
, "scsi_debug, version %s [%s], "
2411 "dev_size_mb=%d, opts=0x%x", SCSI_DEBUG_VERSION
,
2412 scsi_debug_version_date
, scsi_debug_dev_size_mb
,
2417 /* scsi_debug_proc_info
2418 * Used if the driver currently has no own support for /proc/scsi
2420 static int scsi_debug_proc_info(struct Scsi_Host
*host
, char *buffer
, char **start
, off_t offset
,
2421 int length
, int inout
)
2423 int len
, pos
, begin
;
2426 orig_length
= length
;
2430 int minLen
= length
> 15 ? 15 : length
;
2432 if (!capable(CAP_SYS_ADMIN
) || !capable(CAP_SYS_RAWIO
))
2434 memcpy(arr
, buffer
, minLen
);
2436 if (1 != sscanf(arr
, "%d", &pos
))
2438 scsi_debug_opts
= pos
;
2439 if (scsi_debug_every_nth
!= 0)
2440 scsi_debug_cmnd_count
= 0;
2444 pos
= len
= sprintf(buffer
, "scsi_debug adapter driver, version "
2446 "num_tgts=%d, shared (ram) size=%d MB, opts=0x%x, "
2447 "every_nth=%d(curr:%d)\n"
2448 "delay=%d, max_luns=%d, scsi_level=%d\n"
2449 "sector_size=%d bytes, cylinders=%d, heads=%d, sectors=%d\n"
2450 "number of aborts=%d, device_reset=%d, bus_resets=%d, "
2452 SCSI_DEBUG_VERSION
, scsi_debug_version_date
, scsi_debug_num_tgts
,
2453 scsi_debug_dev_size_mb
, scsi_debug_opts
, scsi_debug_every_nth
,
2454 scsi_debug_cmnd_count
, scsi_debug_delay
,
2455 scsi_debug_max_luns
, scsi_debug_scsi_level
,
2456 SECT_SIZE
, sdebug_cylinders_per
, sdebug_heads
, sdebug_sectors_per
,
2457 num_aborts
, num_dev_resets
, num_bus_resets
, num_host_resets
);
2462 *start
= buffer
+ (offset
- begin
); /* Start of wanted data */
2463 len
-= (offset
- begin
);
2469 static ssize_t
sdebug_delay_show(struct device_driver
* ddp
, char * buf
)
2471 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_delay
);
2474 static ssize_t
sdebug_delay_store(struct device_driver
* ddp
,
2475 const char * buf
, size_t count
)
2480 if (1 == sscanf(buf
, "%10s", work
)) {
2481 if ((1 == sscanf(work
, "%d", &delay
)) && (delay
>= 0)) {
2482 scsi_debug_delay
= delay
;
2488 DRIVER_ATTR(delay
, S_IRUGO
| S_IWUSR
, sdebug_delay_show
,
2489 sdebug_delay_store
);
2491 static ssize_t
sdebug_opts_show(struct device_driver
* ddp
, char * buf
)
2493 return scnprintf(buf
, PAGE_SIZE
, "0x%x\n", scsi_debug_opts
);
2496 static ssize_t
sdebug_opts_store(struct device_driver
* ddp
,
2497 const char * buf
, size_t count
)
2502 if (1 == sscanf(buf
, "%10s", work
)) {
2503 if (0 == strnicmp(work
,"0x", 2)) {
2504 if (1 == sscanf(&work
[2], "%x", &opts
))
2507 if (1 == sscanf(work
, "%d", &opts
))
2513 scsi_debug_opts
= opts
;
2514 scsi_debug_cmnd_count
= 0;
2517 DRIVER_ATTR(opts
, S_IRUGO
| S_IWUSR
, sdebug_opts_show
,
2520 static ssize_t
sdebug_ptype_show(struct device_driver
* ddp
, char * buf
)
2522 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_ptype
);
2524 static ssize_t
sdebug_ptype_store(struct device_driver
* ddp
,
2525 const char * buf
, size_t count
)
2529 if ((count
> 0) && (1 == sscanf(buf
, "%d", &n
)) && (n
>= 0)) {
2530 scsi_debug_ptype
= n
;
2535 DRIVER_ATTR(ptype
, S_IRUGO
| S_IWUSR
, sdebug_ptype_show
, sdebug_ptype_store
);
2537 static ssize_t
sdebug_dsense_show(struct device_driver
* ddp
, char * buf
)
2539 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_dsense
);
2541 static ssize_t
sdebug_dsense_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_dsense
= n
;
2552 DRIVER_ATTR(dsense
, S_IRUGO
| S_IWUSR
, sdebug_dsense_show
,
2553 sdebug_dsense_store
);
2555 static ssize_t
sdebug_fake_rw_show(struct device_driver
* ddp
, char * buf
)
2557 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_fake_rw
);
2559 static ssize_t
sdebug_fake_rw_store(struct device_driver
* ddp
,
2560 const char * buf
, size_t count
)
2564 if ((count
> 0) && (1 == sscanf(buf
, "%d", &n
)) && (n
>= 0)) {
2565 scsi_debug_fake_rw
= n
;
2570 DRIVER_ATTR(fake_rw
, S_IRUGO
| S_IWUSR
, sdebug_fake_rw_show
,
2571 sdebug_fake_rw_store
);
2573 static ssize_t
sdebug_no_lun_0_show(struct device_driver
* ddp
, char * buf
)
2575 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_no_lun_0
);
2577 static ssize_t
sdebug_no_lun_0_store(struct device_driver
* ddp
,
2578 const char * buf
, size_t count
)
2582 if ((count
> 0) && (1 == sscanf(buf
, "%d", &n
)) && (n
>= 0)) {
2583 scsi_debug_no_lun_0
= n
;
2588 DRIVER_ATTR(no_lun_0
, S_IRUGO
| S_IWUSR
, sdebug_no_lun_0_show
,
2589 sdebug_no_lun_0_store
);
2591 static ssize_t
sdebug_num_tgts_show(struct device_driver
* ddp
, char * buf
)
2593 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_num_tgts
);
2595 static ssize_t
sdebug_num_tgts_store(struct device_driver
* ddp
,
2596 const char * buf
, size_t count
)
2600 if ((count
> 0) && (1 == sscanf(buf
, "%d", &n
)) && (n
>= 0)) {
2601 scsi_debug_num_tgts
= n
;
2602 sdebug_max_tgts_luns();
2607 DRIVER_ATTR(num_tgts
, S_IRUGO
| S_IWUSR
, sdebug_num_tgts_show
,
2608 sdebug_num_tgts_store
);
2610 static ssize_t
sdebug_dev_size_mb_show(struct device_driver
* ddp
, char * buf
)
2612 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_dev_size_mb
);
2614 DRIVER_ATTR(dev_size_mb
, S_IRUGO
, sdebug_dev_size_mb_show
, NULL
);
2616 static ssize_t
sdebug_num_parts_show(struct device_driver
* ddp
, char * buf
)
2618 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_num_parts
);
2620 DRIVER_ATTR(num_parts
, S_IRUGO
, sdebug_num_parts_show
, NULL
);
2622 static ssize_t
sdebug_every_nth_show(struct device_driver
* ddp
, char * buf
)
2624 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_every_nth
);
2626 static ssize_t
sdebug_every_nth_store(struct device_driver
* ddp
,
2627 const char * buf
, size_t count
)
2631 if ((count
> 0) && (1 == sscanf(buf
, "%d", &nth
))) {
2632 scsi_debug_every_nth
= nth
;
2633 scsi_debug_cmnd_count
= 0;
2638 DRIVER_ATTR(every_nth
, S_IRUGO
| S_IWUSR
, sdebug_every_nth_show
,
2639 sdebug_every_nth_store
);
2641 static ssize_t
sdebug_max_luns_show(struct device_driver
* ddp
, char * buf
)
2643 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_max_luns
);
2645 static ssize_t
sdebug_max_luns_store(struct device_driver
* ddp
,
2646 const char * buf
, size_t count
)
2650 if ((count
> 0) && (1 == sscanf(buf
, "%d", &n
)) && (n
>= 0)) {
2651 scsi_debug_max_luns
= n
;
2652 sdebug_max_tgts_luns();
2657 DRIVER_ATTR(max_luns
, S_IRUGO
| S_IWUSR
, sdebug_max_luns_show
,
2658 sdebug_max_luns_store
);
2660 static ssize_t
sdebug_scsi_level_show(struct device_driver
* ddp
, char * buf
)
2662 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_scsi_level
);
2664 DRIVER_ATTR(scsi_level
, S_IRUGO
, sdebug_scsi_level_show
, NULL
);
2666 static ssize_t
sdebug_virtual_gb_show(struct device_driver
* ddp
, char * buf
)
2668 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_virtual_gb
);
2670 static ssize_t
sdebug_virtual_gb_store(struct device_driver
* ddp
,
2671 const char * buf
, size_t count
)
2675 if ((count
> 0) && (1 == sscanf(buf
, "%d", &n
)) && (n
>= 0)) {
2676 scsi_debug_virtual_gb
= n
;
2677 if (scsi_debug_virtual_gb
> 0) {
2678 sdebug_capacity
= 2048 * 1024;
2679 sdebug_capacity
*= scsi_debug_virtual_gb
;
2681 sdebug_capacity
= sdebug_store_sectors
;
2686 DRIVER_ATTR(virtual_gb
, S_IRUGO
| S_IWUSR
, sdebug_virtual_gb_show
,
2687 sdebug_virtual_gb_store
);
2689 static ssize_t
sdebug_add_host_show(struct device_driver
* ddp
, char * buf
)
2691 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_add_host
);
2694 static ssize_t
sdebug_add_host_store(struct device_driver
* ddp
,
2695 const char * buf
, size_t count
)
2700 if (1 != sscanf(buf
, "%10s", work
))
2702 { /* temporary hack around sscanf() problem with -ve nums */
2707 if (1 != sscanf(work
+ neg
, "%d", &delta_hosts
))
2710 delta_hosts
= -delta_hosts
;
2712 if (delta_hosts
> 0) {
2714 sdebug_add_adapter();
2715 } while (--delta_hosts
);
2716 } else if (delta_hosts
< 0) {
2718 sdebug_remove_adapter();
2719 } while (++delta_hosts
);
2723 DRIVER_ATTR(add_host
, S_IRUGO
| S_IWUSR
, sdebug_add_host_show
,
2724 sdebug_add_host_store
);
2726 static ssize_t
sdebug_vpd_use_hostno_show(struct device_driver
* ddp
,
2729 return scnprintf(buf
, PAGE_SIZE
, "%d\n", scsi_debug_vpd_use_hostno
);
2731 static ssize_t
sdebug_vpd_use_hostno_store(struct device_driver
* ddp
,
2732 const char * buf
, size_t count
)
2736 if ((count
> 0) && (1 == sscanf(buf
, "%d", &n
)) && (n
>= 0)) {
2737 scsi_debug_vpd_use_hostno
= n
;
2742 DRIVER_ATTR(vpd_use_hostno
, S_IRUGO
| S_IWUSR
, sdebug_vpd_use_hostno_show
,
2743 sdebug_vpd_use_hostno_store
);
2745 /* Note: The following function creates attribute files in the
2746 /sys/bus/pseudo/drivers/scsi_debug directory. The advantage of these
2747 files (over those found in the /sys/module/scsi_debug/parameters
2748 directory) is that auxiliary actions can be triggered when an attribute
2749 is changed. For example see: sdebug_add_host_store() above.
2751 static int do_create_driverfs_files(void)
2755 ret
= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_add_host
);
2756 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_delay
);
2757 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_dev_size_mb
);
2758 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_dsense
);
2759 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_every_nth
);
2760 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_fake_rw
);
2761 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_max_luns
);
2762 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_no_lun_0
);
2763 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_num_parts
);
2764 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_num_tgts
);
2765 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_ptype
);
2766 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_opts
);
2767 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_scsi_level
);
2768 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_virtual_gb
);
2769 ret
|= driver_create_file(&sdebug_driverfs_driver
, &driver_attr_vpd_use_hostno
);
2773 static void do_remove_driverfs_files(void)
2775 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_vpd_use_hostno
);
2776 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_virtual_gb
);
2777 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_scsi_level
);
2778 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_opts
);
2779 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_ptype
);
2780 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_num_tgts
);
2781 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_num_parts
);
2782 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_no_lun_0
);
2783 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_max_luns
);
2784 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_fake_rw
);
2785 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_every_nth
);
2786 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_dsense
);
2787 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_dev_size_mb
);
2788 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_delay
);
2789 driver_remove_file(&sdebug_driverfs_driver
, &driver_attr_add_host
);
2792 static int __init
scsi_debug_init(void)
2799 if (scsi_debug_dev_size_mb
< 1)
2800 scsi_debug_dev_size_mb
= 1; /* force minimum 1 MB ramdisk */
2801 sdebug_store_size
= (unsigned int)scsi_debug_dev_size_mb
* 1048576;
2802 sdebug_store_sectors
= sdebug_store_size
/ SECT_SIZE
;
2803 if (scsi_debug_virtual_gb
> 0) {
2804 sdebug_capacity
= 2048 * 1024;
2805 sdebug_capacity
*= scsi_debug_virtual_gb
;
2807 sdebug_capacity
= sdebug_store_sectors
;
2809 /* play around with geometry, don't waste too much on track 0 */
2811 sdebug_sectors_per
= 32;
2812 if (scsi_debug_dev_size_mb
>= 16)
2814 else if (scsi_debug_dev_size_mb
>= 256)
2816 sdebug_cylinders_per
= (unsigned long)sdebug_capacity
/
2817 (sdebug_sectors_per
* sdebug_heads
);
2818 if (sdebug_cylinders_per
>= 1024) {
2819 /* other LLDs do this; implies >= 1GB ram disk ... */
2821 sdebug_sectors_per
= 63;
2822 sdebug_cylinders_per
= (unsigned long)sdebug_capacity
/
2823 (sdebug_sectors_per
* sdebug_heads
);
2826 sz
= sdebug_store_size
;
2827 fake_storep
= vmalloc(sz
);
2828 if (NULL
== fake_storep
) {
2829 printk(KERN_ERR
"scsi_debug_init: out of memory, 1\n");
2832 memset(fake_storep
, 0, sz
);
2833 if (scsi_debug_num_parts
> 0)
2834 sdebug_build_parts(fake_storep
);
2836 ret
= device_register(&pseudo_primary
);
2838 printk(KERN_WARNING
"scsi_debug: device_register error: %d\n",
2842 ret
= bus_register(&pseudo_lld_bus
);
2844 printk(KERN_WARNING
"scsi_debug: bus_register error: %d\n",
2848 ret
= driver_register(&sdebug_driverfs_driver
);
2850 printk(KERN_WARNING
"scsi_debug: driver_register error: %d\n",
2854 ret
= do_create_driverfs_files();
2856 printk(KERN_WARNING
"scsi_debug: driver_create_file error: %d\n",
2863 sdebug_driver_template
.proc_name
= sdebug_proc_name
;
2865 host_to_add
= scsi_debug_add_host
;
2866 scsi_debug_add_host
= 0;
2868 for (k
= 0; k
< host_to_add
; k
++) {
2869 if (sdebug_add_adapter()) {
2870 printk(KERN_ERR
"scsi_debug_init: "
2871 "sdebug_add_adapter failed k=%d\n", k
);
2876 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
) {
2877 printk(KERN_INFO
"scsi_debug_init: built %d host(s)\n",
2878 scsi_debug_add_host
);
2883 do_remove_driverfs_files();
2884 driver_unregister(&sdebug_driverfs_driver
);
2886 bus_unregister(&pseudo_lld_bus
);
2888 device_unregister(&pseudo_primary
);
2895 static void __exit
scsi_debug_exit(void)
2897 int k
= scsi_debug_add_host
;
2901 sdebug_remove_adapter();
2902 do_remove_driverfs_files();
2903 driver_unregister(&sdebug_driverfs_driver
);
2904 bus_unregister(&pseudo_lld_bus
);
2905 device_unregister(&pseudo_primary
);
2910 device_initcall(scsi_debug_init
);
2911 module_exit(scsi_debug_exit
);
2913 static void pseudo_0_release(struct device
* dev
)
2915 if (SCSI_DEBUG_OPT_NOISE
& scsi_debug_opts
)
2916 printk(KERN_INFO
"scsi_debug: pseudo_0_release() called\n");
2919 static struct device pseudo_primary
= {
2920 .bus_id
= "pseudo_0",
2921 .release
= pseudo_0_release
,
2924 static int pseudo_lld_bus_match(struct device
*dev
,
2925 struct device_driver
*dev_driver
)
2930 static struct bus_type pseudo_lld_bus
= {
2932 .match
= pseudo_lld_bus_match
,
2933 .probe
= sdebug_driver_probe
,
2934 .remove
= sdebug_driver_remove
,
2937 static void sdebug_release_adapter(struct device
* dev
)
2939 struct sdebug_host_info
*sdbg_host
;
2941 sdbg_host
= to_sdebug_host(dev
);
2945 static int sdebug_add_adapter(void)
2947 int k
, devs_per_host
;
2949 struct sdebug_host_info
*sdbg_host
;
2950 struct sdebug_dev_info
*sdbg_devinfo
;
2951 struct list_head
*lh
, *lh_sf
;
2953 sdbg_host
= kzalloc(sizeof(*sdbg_host
),GFP_KERNEL
);
2954 if (NULL
== sdbg_host
) {
2955 printk(KERN_ERR
"%s: out of memory at line %d\n",
2956 __FUNCTION__
, __LINE__
);
2960 INIT_LIST_HEAD(&sdbg_host
->dev_info_list
);
2962 devs_per_host
= scsi_debug_num_tgts
* scsi_debug_max_luns
;
2963 for (k
= 0; k
< devs_per_host
; k
++) {
2964 sdbg_devinfo
= kzalloc(sizeof(*sdbg_devinfo
),GFP_KERNEL
);
2965 if (NULL
== sdbg_devinfo
) {
2966 printk(KERN_ERR
"%s: out of memory at line %d\n",
2967 __FUNCTION__
, __LINE__
);
2971 sdbg_devinfo
->sdbg_host
= sdbg_host
;
2972 list_add_tail(&sdbg_devinfo
->dev_list
,
2973 &sdbg_host
->dev_info_list
);
2976 spin_lock(&sdebug_host_list_lock
);
2977 list_add_tail(&sdbg_host
->host_list
, &sdebug_host_list
);
2978 spin_unlock(&sdebug_host_list_lock
);
2980 sdbg_host
->dev
.bus
= &pseudo_lld_bus
;
2981 sdbg_host
->dev
.parent
= &pseudo_primary
;
2982 sdbg_host
->dev
.release
= &sdebug_release_adapter
;
2983 sprintf(sdbg_host
->dev
.bus_id
, "adapter%d", scsi_debug_add_host
);
2985 error
= device_register(&sdbg_host
->dev
);
2990 ++scsi_debug_add_host
;
2994 list_for_each_safe(lh
, lh_sf
, &sdbg_host
->dev_info_list
) {
2995 sdbg_devinfo
= list_entry(lh
, struct sdebug_dev_info
,
2997 list_del(&sdbg_devinfo
->dev_list
);
2998 kfree(sdbg_devinfo
);
3005 static void sdebug_remove_adapter(void)
3007 struct sdebug_host_info
* sdbg_host
= NULL
;
3009 spin_lock(&sdebug_host_list_lock
);
3010 if (!list_empty(&sdebug_host_list
)) {
3011 sdbg_host
= list_entry(sdebug_host_list
.prev
,
3012 struct sdebug_host_info
, host_list
);
3013 list_del(&sdbg_host
->host_list
);
3015 spin_unlock(&sdebug_host_list_lock
);
3020 device_unregister(&sdbg_host
->dev
);
3021 --scsi_debug_add_host
;
3024 static int sdebug_driver_probe(struct device
* dev
)
3027 struct sdebug_host_info
*sdbg_host
;
3028 struct Scsi_Host
*hpnt
;
3030 sdbg_host
= to_sdebug_host(dev
);
3032 hpnt
= scsi_host_alloc(&sdebug_driver_template
, sizeof(sdbg_host
));
3034 printk(KERN_ERR
"%s: scsi_register failed\n", __FUNCTION__
);
3039 sdbg_host
->shost
= hpnt
;
3040 *((struct sdebug_host_info
**)hpnt
->hostdata
) = sdbg_host
;
3041 if ((hpnt
->this_id
>= 0) && (scsi_debug_num_tgts
> hpnt
->this_id
))
3042 hpnt
->max_id
= scsi_debug_num_tgts
+ 1;
3044 hpnt
->max_id
= scsi_debug_num_tgts
;
3045 hpnt
->max_lun
= SAM2_WLUN_REPORT_LUNS
; /* = scsi_debug_max_luns; */
3047 error
= scsi_add_host(hpnt
, &sdbg_host
->dev
);
3049 printk(KERN_ERR
"%s: scsi_add_host failed\n", __FUNCTION__
);
3051 scsi_host_put(hpnt
);
3053 scsi_scan_host(hpnt
);
3059 static int sdebug_driver_remove(struct device
* dev
)
3061 struct list_head
*lh
, *lh_sf
;
3062 struct sdebug_host_info
*sdbg_host
;
3063 struct sdebug_dev_info
*sdbg_devinfo
;
3065 sdbg_host
= to_sdebug_host(dev
);
3068 printk(KERN_ERR
"%s: Unable to locate host info\n",
3073 scsi_remove_host(sdbg_host
->shost
);
3075 list_for_each_safe(lh
, lh_sf
, &sdbg_host
->dev_info_list
) {
3076 sdbg_devinfo
= list_entry(lh
, struct sdebug_dev_info
,
3078 list_del(&sdbg_devinfo
->dev_list
);
3079 kfree(sdbg_devinfo
);
3082 scsi_host_put(sdbg_host
->shost
);
3086 static void sdebug_max_tgts_luns(void)
3088 struct sdebug_host_info
* sdbg_host
;
3089 struct Scsi_Host
*hpnt
;
3091 spin_lock(&sdebug_host_list_lock
);
3092 list_for_each_entry(sdbg_host
, &sdebug_host_list
, host_list
) {
3093 hpnt
= sdbg_host
->shost
;
3094 if ((hpnt
->this_id
>= 0) &&
3095 (scsi_debug_num_tgts
> hpnt
->this_id
))
3096 hpnt
->max_id
= scsi_debug_num_tgts
+ 1;
3098 hpnt
->max_id
= scsi_debug_num_tgts
;
3099 hpnt
->max_lun
= SAM2_WLUN_REPORT_LUNS
; /* scsi_debug_max_luns; */
3101 spin_unlock(&sdebug_host_list_lock
);