1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28#include <linux/module.h>
29
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>
36#include <linux/fs.h>
37#include <linux/init.h>
38#include <linux/proc_fs.h>
39#include <linux/vmalloc.h>
40#include <linux/moduleparam.h>
41#include <linux/scatterlist.h>
42
43#include <linux/blkdev.h>
44#include "scsi.h"
45#include <scsi/scsi_host.h>
46#include <scsi/scsicam.h>
47
48#include <linux/stat.h>
49
50#include "scsi_logging.h"
51#include "scsi_debug.h"
52
53#define SCSI_DEBUG_VERSION "1.81"
54static const char * scsi_debug_version_date = "20070104";
55
56
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
70
71
72#define ACK_NAK_TO 0x3
73
74#define SDEBUG_TAGGED_QUEUING 0
75
76
77#define DEF_NUM_HOST 1
78#define DEF_NUM_TGTS 1
79#define DEF_MAX_LUNS 1
80
81
82
83#define DEF_DELAY 1
84#define DEF_DEV_SIZE_MB 8
85#define DEF_EVERY_NTH 0
86#define DEF_NUM_PARTS 0
87#define DEF_OPTS 0
88#define DEF_SCSI_LEVEL 5
89#define DEF_PTYPE 0
90#define DEF_D_SENSE 0
91#define DEF_NO_LUN_0 0
92#define DEF_VIRTUAL_GB 0
93#define DEF_FAKE_RW 0
94#define DEF_VPD_USE_HOSTNO 1
95
96
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121#define OPT_MEDIUM_ERR_ADDR 0x1234
122
123
124
125#define SAM2_LUN_ADDRESS_METHOD 0
126#define SAM2_WLUN_REPORT_LUNS 0xc101
127
128static int scsi_debug_add_host = DEF_NUM_HOST;
129static int scsi_debug_delay = DEF_DELAY;
130static int scsi_debug_dev_size_mb = DEF_DEV_SIZE_MB;
131static int scsi_debug_every_nth = DEF_EVERY_NTH;
132static int scsi_debug_max_luns = DEF_MAX_LUNS;
133static int scsi_debug_num_parts = DEF_NUM_PARTS;
134static int scsi_debug_num_tgts = DEF_NUM_TGTS;
135static int scsi_debug_opts = DEF_OPTS;
136static int scsi_debug_scsi_level = DEF_SCSI_LEVEL;
137static int scsi_debug_ptype = DEF_PTYPE;
138static int scsi_debug_dsense = DEF_D_SENSE;
139static int scsi_debug_no_lun_0 = DEF_NO_LUN_0;
140static int scsi_debug_virtual_gb = DEF_VIRTUAL_GB;
141static int scsi_debug_fake_rw = DEF_FAKE_RW;
142static int scsi_debug_vpd_use_hostno = DEF_VPD_USE_HOSTNO;
143
144static int scsi_debug_cmnd_count = 0;
145
146#define DEV_READONLY(TGT) (0)
147#define DEV_REMOVEABLE(TGT) (0)
148
149static unsigned int sdebug_store_size;
150static unsigned int sdebug_store_sectors;
151static sector_t sdebug_capacity;
152
153
154
155static int sdebug_heads;
156static int sdebug_cylinders_per;
157static int sdebug_sectors_per;
158
159
160#define POW2_SECT_SIZE 9
161#define SECT_SIZE (1 << POW2_SECT_SIZE)
162#define SECT_SIZE_PER(TGT) SECT_SIZE
163
164#define SDEBUG_MAX_PARTS 4
165
166#define SDEBUG_SENSE_LEN 32
167
168struct sdebug_dev_info {
169 struct list_head dev_list;
170 unsigned char sense_buff[SDEBUG_SENSE_LEN];
171 unsigned int channel;
172 unsigned int target;
173 unsigned int lun;
174 struct sdebug_host_info *sdbg_host;
175 unsigned int wlun;
176 char reset;
177 char stopped;
178 char used;
179};
180
181struct sdebug_host_info {
182 struct list_head host_list;
183 struct Scsi_Host *shost;
184 struct device dev;
185 struct list_head dev_info_list;
186};
187
188#define to_sdebug_host(d) \
189 container_of(d, struct sdebug_host_info, dev)
190
191static LIST_HEAD(sdebug_host_list);
192static DEFINE_SPINLOCK(sdebug_host_list_lock);
193
194typedef void (* done_funct_t) (struct scsi_cmnd *);
195
196struct sdebug_queued_cmd {
197 int in_use;
198 struct timer_list cmnd_timer;
199 done_funct_t done_funct;
200 struct scsi_cmnd * a_cmnd;
201 int scsi_result;
202};
203static struct sdebug_queued_cmd queued_arr[SCSI_DEBUG_CANQUEUE];
204
205static 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,
220 .this_id = 7,
221 .sg_tablesize = 256,
222 .cmd_per_lun = 16,
223 .max_sectors = 0xffff,
224 .unchecked_isa_dma = 0,
225 .use_clustering = ENABLE_CLUSTERING,
226 .module = THIS_MODULE,
227};
228
229static unsigned char * fake_storep;
230
231static int num_aborts = 0;
232static int num_dev_resets = 0;
233static int num_bus_resets = 0;
234static int num_host_resets = 0;
235
236static DEFINE_SPINLOCK(queued_arr_lock);
237static DEFINE_RWLOCK(atomic_rw);
238
239static char sdebug_proc_name[] = "scsi_debug";
240
241static int sdebug_driver_probe(struct device *);
242static int sdebug_driver_remove(struct device *);
243static struct bus_type pseudo_lld_bus;
244
245static struct device_driver sdebug_driverfs_driver = {
246 .name = sdebug_proc_name,
247 .bus = &pseudo_lld_bus,
248};
249
250static const int check_condition_result =
251 (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
252
253static unsigned char ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
254 0, 0, 0x2, 0x4b};
255static unsigned char iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
256 0, 0, 0x0, 0x0};
257
258
259static int resp_inquiry(struct scsi_cmnd * SCpnt, int target,
260 struct sdebug_dev_info * devip);
261static int resp_requests(struct scsi_cmnd * SCpnt,
262 struct sdebug_dev_info * devip);
263static int resp_start_stop(struct scsi_cmnd * scp,
264 struct sdebug_dev_info * devip);
265static int resp_report_tgtpgs(struct scsi_cmnd * scp,
266 struct sdebug_dev_info * devip);
267static int resp_readcap(struct scsi_cmnd * SCpnt,
268 struct sdebug_dev_info * devip);
269static int resp_readcap16(struct scsi_cmnd * SCpnt,
270 struct sdebug_dev_info * devip);
271static int resp_mode_sense(struct scsi_cmnd * scp, int target,
272 struct sdebug_dev_info * devip);
273static int resp_mode_select(struct scsi_cmnd * scp, int mselect6,
274 struct sdebug_dev_info * devip);
275static int resp_log_sense(struct scsi_cmnd * scp,
276 struct sdebug_dev_info * devip);
277static int resp_read(struct scsi_cmnd * SCpnt, unsigned long long lba,
278 unsigned int num, struct sdebug_dev_info * devip);
279static int resp_write(struct scsi_cmnd * SCpnt, unsigned long long lba,
280 unsigned int num, struct sdebug_dev_info * devip);
281static int resp_report_luns(struct scsi_cmnd * SCpnt,
282 struct sdebug_dev_info * devip);
283static int fill_from_dev_buffer(struct scsi_cmnd * scp, unsigned char * arr,
284 int arr_len);
285static int fetch_to_dev_buffer(struct scsi_cmnd * scp, unsigned char * arr,
286 int max_arr_len);
287static void timer_intr_handler(unsigned long);
288static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev);
289static void mk_sense_buffer(struct sdebug_dev_info * devip, int key,
290 int asc, int asq);
291static int check_readiness(struct scsi_cmnd * SCpnt, int reset_only,
292 struct sdebug_dev_info * devip);
293static int schedule_resp(struct scsi_cmnd * cmnd,
294 struct sdebug_dev_info * devip,
295 done_funct_t done, int scsi_result, int delta_jiff);
296static void __init sdebug_build_parts(unsigned char * ramp);
297static void __init init_all_queued(void);
298static void stop_all_queued(void);
299static int stop_queued_cmnd(struct scsi_cmnd * cmnd);
300static 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);
303static int inquiry_evpd_88(unsigned char * arr, int target_dev_id);
304static int do_create_driverfs_files(void);
305static void do_remove_driverfs_files(void);
306
307static int sdebug_add_adapter(void);
308static void sdebug_remove_adapter(void);
309static void sdebug_max_tgts_luns(void);
310
311static struct device pseudo_primary;
312static struct bus_type pseudo_lld_bus;
313
314
315static
316int scsi_debug_queuecommand(struct scsi_cmnd * SCpnt, done_funct_t done)
317{
318 unsigned char *cmd = (unsigned char *) SCpnt->cmnd;
319 int len, k, j;
320 unsigned int num;
321 unsigned long long lba;
322 int errsts = 0;
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;
328
329 if (done == NULL)
330 return 0;
331
332 SCpnt->resid = 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]);
337 printk("\n");
338 }
339 if(target == sdebug_driver_template.this_id) {
340 printk(KERN_INFO "scsi_debug: initiator's id used as "
341 "target!\n");
342 return schedule_resp(SCpnt, NULL, done,
343 DID_NO_CONNECT << 16, 0);
344 }
345
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);
351 if (NULL == devip)
352 return schedule_resp(SCpnt, NULL, done,
353 DID_NO_CONNECT << 16, 0);
354
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;
362 else if (SCSI_DEBUG_OPT_RECOVERED_ERR & scsi_debug_opts)
363 inj_recovered = 1;
364 else if (SCSI_DEBUG_OPT_TRANSPORT_ERR & scsi_debug_opts)
365 inj_transport = 1;
366 }
367
368 if (devip->wlun) {
369 switch (*cmd) {
370 case INQUIRY:
371 case REQUEST_SENSE:
372 case TEST_UNIT_READY:
373 case REPORT_LUNS:
374 break;
375 default:
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,
380 INVALID_OPCODE, 0);
381 errsts = check_condition_result;
382 return schedule_resp(SCpnt, devip, done, errsts,
383 0);
384 }
385 }
386
387 switch (*cmd) {
388 case INQUIRY:
389 delay_override = 1;
390 errsts = resp_inquiry(SCpnt, target, devip);
391 break;
392 case REQUEST_SENSE:
393 delay_override = 1;
394 errsts = resp_requests(SCpnt, devip);
395 break;
396 case REZERO_UNIT:
397 case START_STOP:
398 errsts = resp_start_stop(SCpnt, devip);
399 break;
400 case ALLOW_MEDIUM_REMOVAL:
401 if ((errsts = check_readiness(SCpnt, 1, devip)))
402 break;
403 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
404 printk(KERN_INFO "scsi_debug: Medium removal %s\n",
405 cmd[4] ? "inhibited" : "enabled");
406 break;
407 case SEND_DIAGNOSTIC:
408 errsts = check_readiness(SCpnt, 1, devip);
409 break;
410 case TEST_UNIT_READY:
411 delay_override = 1;
412 errsts = check_readiness(SCpnt, 0, devip);
413 break;
414 case RESERVE:
415 errsts = check_readiness(SCpnt, 1, devip);
416 break;
417 case RESERVE_10:
418 errsts = check_readiness(SCpnt, 1, devip);
419 break;
420 case RELEASE:
421 errsts = check_readiness(SCpnt, 1, devip);
422 break;
423 case RELEASE_10:
424 errsts = check_readiness(SCpnt, 1, devip);
425 break;
426 case READ_CAPACITY:
427 errsts = resp_readcap(SCpnt, devip);
428 break;
429 case SERVICE_ACTION_IN:
430 if (SAI_READ_CAPACITY_16 != cmd[1]) {
431 mk_sense_buffer(devip, ILLEGAL_REQUEST,
432 INVALID_OPCODE, 0);
433 errsts = check_condition_result;
434 break;
435 }
436 errsts = resp_readcap16(SCpnt, devip);
437 break;
438 case MAINTENANCE_IN:
439 if (MI_REPORT_TARGET_PGS != cmd[1]) {
440 mk_sense_buffer(devip, ILLEGAL_REQUEST,
441 INVALID_OPCODE, 0);
442 errsts = check_condition_result;
443 break;
444 }
445 errsts = resp_report_tgtpgs(SCpnt, devip);
446 break;
447 case READ_16:
448 case READ_12:
449 case READ_10:
450 case READ_6:
451 if ((errsts = check_readiness(SCpnt, 0, devip)))
452 break;
453 if (scsi_debug_fake_rw)
454 break;
455 if ((*cmd) == READ_16) {
456 for (lba = 0, j = 0; j < 8; ++j) {
457 if (j > 0)
458 lba <<= 8;
459 lba += cmd[2 + j];
460 }
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 {
473 lba = cmd[3] + (cmd[2] << 8) +
474 ((cmd[1] & 0x1f) << 16);
475 num = (0 == cmd[4]) ? 256 : cmd[4];
476 }
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;
486 }
487 break;
488 case REPORT_LUNS:
489 delay_override = 1;
490 errsts = resp_report_luns(SCpnt, devip);
491 break;
492 case VERIFY:
493 errsts = check_readiness(SCpnt, 0, devip);
494 break;
495 case WRITE_16:
496 case WRITE_12:
497 case WRITE_10:
498 case WRITE_6:
499 if ((errsts = check_readiness(SCpnt, 0, devip)))
500 break;
501 if (scsi_debug_fake_rw)
502 break;
503 if ((*cmd) == WRITE_16) {
504 for (lba = 0, j = 0; j < 8; ++j) {
505 if (j > 0)
506 lba <<= 8;
507 lba += cmd[2 + j];
508 }
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 {
521 lba = cmd[3] + (cmd[2] << 8) +
522 ((cmd[1] & 0x1f) << 16);
523 num = (0 == cmd[4]) ? 256 : cmd[4];
524 }
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;
530 }
531 break;
532 case MODE_SENSE:
533 case MODE_SENSE_10:
534 errsts = resp_mode_sense(SCpnt, target, devip);
535 break;
536 case MODE_SELECT:
537 errsts = resp_mode_select(SCpnt, 1, devip);
538 break;
539 case MODE_SELECT_10:
540 errsts = resp_mode_select(SCpnt, 0, devip);
541 break;
542 case LOG_SENSE:
543 errsts = resp_log_sense(SCpnt, devip);
544 break;
545 case SYNCHRONIZE_CACHE:
546 delay_override = 1;
547 errsts = check_readiness(SCpnt, 0, devip);
548 break;
549 case WRITE_BUFFER:
550 errsts = check_readiness(SCpnt, 1, devip);
551 break;
552 default:
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;
558 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_OPCODE, 0);
559 errsts = check_condition_result;
560 break;
561 }
562 return schedule_resp(SCpnt, devip, done, errsts,
563 (delay_override ? 0 : scsi_debug_delay));
564}
565
566static int scsi_debug_ioctl(struct scsi_device *dev, int cmd, void __user *arg)
567{
568 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
569 printk(KERN_INFO "scsi_debug: ioctl: cmd=0x%x\n", cmd);
570 }
571 return -EINVAL;
572
573}
574
575static int check_readiness(struct scsi_cmnd * SCpnt, int reset_only,
576 struct sdebug_dev_info * devip)
577{
578 if (devip->reset) {
579 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
580 printk(KERN_INFO "scsi_debug: Reporting Unit "
581 "attention: power on reset\n");
582 devip->reset = 0;
583 mk_sense_buffer(devip, UNIT_ATTENTION, POWERON_RESET, 0);
584 return check_condition_result;
585 }
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,
591 0x2);
592 return check_condition_result;
593 }
594 return 0;
595}
596
597
598static int fill_from_dev_buffer(struct scsi_cmnd * scp, unsigned char * arr,
599 int arr_len)
600{
601 int k, req_len, act_len, len, active;
602 void * kaddr;
603 void * kaddr_off;
604 struct scatterlist * sg;
605
606 if (0 == scp->request_bufflen)
607 return 0;
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);
617 if (scp->resid)
618 scp->resid -= act_len;
619 else
620 scp->resid = req_len - act_len;
621 return 0;
622 }
623 active = 1;
624 req_len = act_len = 0;
625 scsi_for_each_sg(scp, sg, scp->use_sg, k) {
626 if (active) {
627 kaddr = (unsigned char *)
628 kmap_atomic(sg_page(sg), KM_USER0);
629 if (NULL == kaddr)
630 return (DID_ERROR << 16);
631 kaddr_off = (unsigned char *)kaddr + sg->offset;
632 len = sg->length;
633 if ((req_len + len) > arr_len) {
634 active = 0;
635 len = arr_len - req_len;
636 }
637 memcpy(kaddr_off, arr + req_len, len);
638 kunmap_atomic(kaddr, KM_USER0);
639 act_len += len;
640 }
641 req_len += sg->length;
642 }
643 if (scp->resid)
644 scp->resid -= act_len;
645 else
646 scp->resid = req_len - act_len;
647 return 0;
648}
649
650
651static int fetch_to_dev_buffer(struct scsi_cmnd * scp, unsigned char * arr,
652 int max_arr_len)
653{
654 int k, req_len, len, fin;
655 void * kaddr;
656 void * kaddr_off;
657 struct scatterlist * sg;
658
659 if (0 == scp->request_bufflen)
660 return 0;
661 if (NULL == scp->request_buffer)
662 return -1;
663 if (! ((scp->sc_data_direction == DMA_BIDIRECTIONAL) ||
664 (scp->sc_data_direction == DMA_TO_DEVICE)))
665 return -1;
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);
670 return len;
671 }
672 sg = scsi_sglist(scp);
673 req_len = fin = 0;
674 for (k = 0; k < scp->use_sg; ++k, sg = sg_next(sg)) {
675 kaddr = (unsigned char *)kmap_atomic(sg_page(sg), KM_USER0);
676 if (NULL == kaddr)
677 return -1;
678 kaddr_off = (unsigned char *)kaddr + sg->offset;
679 len = sg->length;
680 if ((req_len + len) > max_arr_len) {
681 len = max_arr_len - req_len;
682 fin = 1;
683 }
684 memcpy(arr + req_len, kaddr_off, len);
685 kunmap_atomic(kaddr, KM_USER0);
686 if (fin)
687 return req_len + len;
688 req_len += sg->length;
689 }
690 return req_len;
691}
692
693
694static const char * inq_vendor_id = "Linux ";
695static const char * inq_product_id = "scsi_debug ";
696static const char * inq_product_rev = "0004";
697
698static 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,
701 int dev_id_str_len)
702{
703 int num, port_a;
704 char b[32];
705
706 port_a = target_dev_id + 1;
707
708 arr[0] = 0x2;
709 arr[1] = 0x1;
710 arr[2] = 0x0;
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;
715 arr[3] = num;
716 num += 4;
717 if (dev_id_num >= 0) {
718
719 arr[num++] = 0x1;
720 arr[num++] = 0x3;
721 arr[num++] = 0x0;
722 arr[num++] = 0x8;
723 arr[num++] = 0x53;
724 arr[num++] = 0x33;
725 arr[num++] = 0x33;
726 arr[num++] = 0x30;
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
732 arr[num++] = 0x61;
733 arr[num++] = 0x94;
734 arr[num++] = 0x0;
735 arr[num++] = 0x4;
736 arr[num++] = 0x0;
737 arr[num++] = 0x0;
738 arr[num++] = 0x0;
739 arr[num++] = 0x1;
740 }
741
742 arr[num++] = 0x61;
743 arr[num++] = 0x93;
744 arr[num++] = 0x0;
745 arr[num++] = 0x8;
746 arr[num++] = 0x52;
747 arr[num++] = 0x22;
748 arr[num++] = 0x22;
749 arr[num++] = 0x20;
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
755 arr[num++] = 0x61;
756 arr[num++] = 0x95;
757 arr[num++] = 0x0;
758 arr[num++] = 0x4;
759 arr[num++] = 0;
760 arr[num++] = 0;
761 arr[num++] = (port_group_id >> 8) & 0xff;
762 arr[num++] = port_group_id & 0xff;
763
764 arr[num++] = 0x61;
765 arr[num++] = 0xa3;
766 arr[num++] = 0x0;
767 arr[num++] = 0x8;
768 arr[num++] = 0x52;
769 arr[num++] = 0x22;
770 arr[num++] = 0x22;
771 arr[num++] = 0x20;
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
777 arr[num++] = 0x63;
778 arr[num++] = 0xa8;
779 arr[num++] = 0x0;
780 arr[num++] = 24;
781 memcpy(arr + num, "naa.52222220", 12);
782 num += 12;
783 snprintf(b, sizeof(b), "%08X", target_dev_id);
784 memcpy(arr + num, b, 8);
785 num += 8;
786 memset(arr + num, 0, 4);
787 num += 4;
788 return num;
789}
790
791
792static unsigned char vpd84_data[] = {
793 0x22,0x22,0x22,0x0,0xbb,0x0,
794 0x22,0x22,0x22,0x0,0xbb,0x1,
795 0x22,0x22,0x22,0x0,0xbb,0x2,
796};
797
798static int inquiry_evpd_84(unsigned char * arr)
799{
800 memcpy(arr, vpd84_data, sizeof(vpd84_data));
801 return sizeof(vpd84_data);
802}
803
804static int inquiry_evpd_85(unsigned char * arr)
805{
806 int num = 0;
807 const char * na1 = "https://www.kernel.org/config";
808 const char * na2 = "http://www.kernel.org/log";
809 int plen, olen;
810
811 arr[num++] = 0x1;
812 arr[num++] = 0x0;
813 arr[num++] = 0x0;
814 olen = strlen(na1);
815 plen = olen + 1;
816 if (plen % 4)
817 plen = ((plen / 4) + 1) * 4;
818 arr[num++] = plen;
819 memcpy(arr + num, na1, olen);
820 memset(arr + num + olen, 0, plen - olen);
821 num += plen;
822
823 arr[num++] = 0x4;
824 arr[num++] = 0x0;
825 arr[num++] = 0x0;
826 olen = strlen(na2);
827 plen = olen + 1;
828 if (plen % 4)
829 plen = ((plen / 4) + 1) * 4;
830 arr[num++] = plen;
831 memcpy(arr + num, na2, olen);
832 memset(arr + num + olen, 0, plen - olen);
833 num += plen;
834
835 return num;
836}
837
838
839static int inquiry_evpd_88(unsigned char * arr, int target_dev_id)
840{
841 int num = 0;
842 int port_a, port_b;
843
844 port_a = target_dev_id + 1;
845 port_b = port_a + 1;
846 arr[num++] = 0x0;
847 arr[num++] = 0x0;
848 arr[num++] = 0x0;
849 arr[num++] = 0x1;
850 memset(arr + num, 0, 6);
851 num += 6;
852 arr[num++] = 0x0;
853 arr[num++] = 12;
854
855 arr[num++] = 0x61;
856 arr[num++] = 0x93;
857 arr[num++] = 0x0;
858 arr[num++] = 0x8;
859 arr[num++] = 0x52;
860 arr[num++] = 0x22;
861 arr[num++] = 0x22;
862 arr[num++] = 0x20;
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;
867
868 arr[num++] = 0x0;
869 arr[num++] = 0x0;
870 arr[num++] = 0x0;
871 arr[num++] = 0x2;
872 memset(arr + num, 0, 6);
873 num += 6;
874 arr[num++] = 0x0;
875 arr[num++] = 12;
876
877 arr[num++] = 0x61;
878 arr[num++] = 0x93;
879 arr[num++] = 0x0;
880 arr[num++] = 0x8;
881 arr[num++] = 0x52;
882 arr[num++] = 0x22;
883 arr[num++] = 0x22;
884 arr[num++] = 0x20;
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;
889
890 return num;
891}
892
893
894static unsigned char vpd89_data[] = {
895 0,0,0,0,
896'l','i','n','u','x',' ',' ',' ',
897'S','A','T',' ','s','c','s','i','_','d','e','b','u','g',' ',' ',
898'1','2','3','4',
8990x34,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
9000xec,0,0,0,
9010x5a,0xc,0xff,0x3f,0x37,0xc8,0x10,0,0,0,0,0,0x3f,0,0,0,
9020,0,0,0,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x58,0x20,0x20,0x20,0x20,
9030x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0,0,0,0x40,0x4,0,0x2e,0x33,
9040x38,0x31,0x20,0x20,0x20,0x20,0x54,0x53,0x38,0x33,0x30,0x30,0x33,0x31,
9050x53,0x41,
9060x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
9070x20,0x20,
9080x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
9090x10,0x80,
9100,0,0,0x2f,0,0,0,0x2,0,0x2,0x7,0,0xff,0xff,0x1,0,
9110x3f,0,0xc1,0xff,0x3e,0,0x10,0x1,0xb0,0xf8,0x50,0x9,0,0,0x7,0,
9120x3,0,0x78,0,0x78,0,0xf0,0,0x78,0,0,0,0,0,0,0,
9130,0,0,0,0,0,0,0,0x2,0,0,0,0,0,0,0,
9140x7e,0,0x1b,0,0x6b,0x34,0x1,0x7d,0x3,0x40,0x69,0x34,0x1,0x3c,0x3,0x40,
9150x7f,0x40,0,0,0,0,0xfe,0xfe,0,0,0,0,0,0xfe,0,0,
9160,0,0,0,0,0,0,0,0xb0,0xf8,0x50,0x9,0,0,0,0,
9170,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
9180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
9190,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
9200x1,0,0xb0,0xf8,0x50,0x9,0xb0,0xf8,0x50,0x9,0x20,0x20,0x2,0,0xb6,0x42,
9210,0x80,0x8a,0,0x6,0x3c,0xa,0x3c,0xff,0xff,0xc6,0x7,0,0x1,0,0x8,
9220xf0,0xf,0,0x10,0x2,0,0x30,0,0,0,0,0,0,0,0x6,0xfe,
9230,0,0x2,0,0x50,0,0x8a,0,0x4f,0x95,0,0,0x21,0,0xb,0,
9240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
9250,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
9260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
9270,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
9280,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
9290,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
9300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
9310,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
9320,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
9330,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
9340,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
9350,0,0,0,0,0,0,0,0,0,0,0,0,0,0xa5,0x51,
936};
937
938static int inquiry_evpd_89(unsigned char * arr)
939{
940 memcpy(arr, vpd89_data, sizeof(vpd89_data));
941 return sizeof(vpd89_data);
942}
943
944
945static unsigned char vpdb0_data[] = {
946 0,0,0,4,
947 0,0,0x4,0,
948 0,0,0,64,
949};
950
951static int inquiry_evpd_b0(unsigned char * arr)
952{
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;
959 }
960 return sizeof(vpdb0_data);
961}
962
963
964#define SDEBUG_LONG_INQ_SZ 96
965#define SDEBUG_MAX_INQ_ARR_SZ 584
966
967static int resp_inquiry(struct scsi_cmnd * scp, int target,
968 struct sdebug_dev_info * devip)
969{
970 unsigned char pq_pdt;
971 unsigned char * arr;
972 unsigned char *cmd = (unsigned char *)scp->cmnd;
973 int alloc_len, n, ret;
974
975 alloc_len = (cmd[3] << 8) + cmd[4];
976 arr = kzalloc(SDEBUG_MAX_INQ_ARR_SZ, GFP_ATOMIC);
977 if (! arr)
978 return DID_REQUEUE << 16;
979 if (devip->wlun)
980 pq_pdt = 0x1e;
981 else if (scsi_debug_no_lun_0 && (0 == devip->lun))
982 pq_pdt = 0x7f;
983 else
984 pq_pdt = (scsi_debug_ptype & 0x1f);
985 arr[0] = pq_pdt;
986 if (0x2 & cmd[1]) {
987 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
988 0);
989 kfree(arr);
990 return check_condition_result;
991 } else if (0x1 & cmd[1]) {
992 int lu_id_num, port_group_id, target_dev_id, len;
993 char lu_id_str[6];
994 int host_no = devip->sdbg_host->shost->host_no;
995
996 port_group_id = (((host_no + 1) & 0x7f) << 8) +
997 (devip->channel & 0x7f);
998 if (0 == scsi_debug_vpd_use_hostno)
999 host_no = 0;
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]) {
1006 arr[1] = cmd[2];
1007 n = 4;
1008 arr[n++] = 0x0;
1009 arr[n++] = 0x80;
1010 arr[n++] = 0x83;
1011 arr[n++] = 0x84;
1012 arr[n++] = 0x85;
1013 arr[n++] = 0x86;
1014 arr[n++] = 0x87;
1015 arr[n++] = 0x88;
1016 arr[n++] = 0x89;
1017 arr[n++] = 0xb0;
1018 arr[3] = n - 4;
1019 } else if (0x80 == cmd[2]) {
1020 arr[1] = cmd[2];
1021 arr[3] = len;
1022 memcpy(&arr[4], lu_id_str, len);
1023 } else if (0x83 == cmd[2]) {
1024 arr[1] = cmd[2];
1025 arr[3] = inquiry_evpd_83(&arr[4], port_group_id,
1026 target_dev_id, lu_id_num,
1027 lu_id_str, len);
1028 } else if (0x84 == cmd[2]) {
1029 arr[1] = cmd[2];
1030 arr[3] = inquiry_evpd_84(&arr[4]);
1031 } else if (0x85 == cmd[2]) {
1032 arr[1] = cmd[2];
1033 arr[3] = inquiry_evpd_85(&arr[4]);
1034 } else if (0x86 == cmd[2]) {
1035 arr[1] = cmd[2];
1036 arr[3] = 0x3c;
1037 arr[4] = 0x0;
1038 arr[5] = 0x7;
1039 } else if (0x87 == cmd[2]) {
1040 arr[1] = cmd[2];
1041 arr[3] = 0x8;
1042 arr[4] = 0x2;
1043 arr[6] = 0x80;
1044 arr[8] = 0x18;
1045 arr[10] = 0x82;
1046 } else if (0x88 == cmd[2]) {
1047 arr[1] = cmd[2];
1048 arr[3] = inquiry_evpd_88(&arr[4], target_dev_id);
1049 } else if (0x89 == cmd[2]) {
1050 arr[1] = cmd[2];
1051 n = inquiry_evpd_89(&arr[4]);
1052 arr[2] = (n >> 8);
1053 arr[3] = (n & 0xff);
1054 } else if (0xb0 == cmd[2]) {
1055 arr[1] = cmd[2];
1056 arr[3] = inquiry_evpd_b0(&arr[4]);
1057 } else {
1058
1059 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1060 INVALID_FIELD_IN_CDB, 0);
1061 kfree(arr);
1062 return check_condition_result;
1063 }
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));
1067 kfree(arr);
1068 return ret;
1069 }
1070
1071 arr[1] = DEV_REMOVEABLE(target) ? 0x80 : 0;
1072 arr[2] = scsi_debug_scsi_level;
1073 arr[3] = 2;
1074 arr[4] = SDEBUG_LONG_INQ_SZ - 5;
1075 if (0 == scsi_debug_vpd_use_hostno)
1076 arr[5] = 0x10;
1077 arr[6] = 0x10;
1078
1079 arr[7] = 0xa;
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
1084 arr[58] = 0x0; arr[59] = 0x77;
1085 arr[60] = 0x3; arr[61] = 0x14;
1086 n = 62;
1087 if (scsi_debug_ptype == 0) {
1088 arr[n++] = 0x3; arr[n++] = 0x3d;
1089 } else if (scsi_debug_ptype == 1) {
1090 arr[n++] = 0x3; arr[n++] = 0x60;
1091 }
1092 arr[n++] = 0xc; arr[n++] = 0xf;
1093 ret = fill_from_dev_buffer(scp, arr,
1094 min(alloc_len, SDEBUG_LONG_INQ_SZ));
1095 kfree(arr);
1096 return ret;
1097}
1098
1099static int resp_requests(struct scsi_cmnd * scp,
1100 struct sdebug_dev_info * devip)
1101{
1102 unsigned char * sbuff;
1103 unsigned char *cmd = (unsigned char *)scp->cmnd;
1104 unsigned char arr[SDEBUG_SENSE_LEN];
1105 int want_dsense;
1106 int len = 18;
1107
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))) {
1114 if (want_dsense) {
1115 arr[0] = 0x72;
1116 arr[1] = 0x0;
1117 arr[2] = THRESHOLD_EXCEEDED;
1118 arr[3] = 0xff;
1119 } else {
1120 arr[0] = 0x70;
1121 arr[2] = 0x0;
1122 arr[7] = 0xa;
1123 arr[12] = THRESHOLD_EXCEEDED;
1124 arr[13] = 0xff;
1125 }
1126 } else {
1127 memcpy(arr, sbuff, SDEBUG_SENSE_LEN);
1128 if ((cmd[1] & 1) && (! scsi_debug_dsense)) {
1129
1130 memset(arr, 0, sizeof(arr));
1131 arr[0] = 0x72;
1132 arr[1] = sbuff[2];
1133 arr[2] = sbuff[12];
1134 arr[3] = sbuff[13];
1135 len = 8;
1136 }
1137 }
1138 mk_sense_buffer(devip, 0, NO_ADDITIONAL_SENSE, 0);
1139 return fill_from_dev_buffer(scp, arr, len);
1140}
1141
1142static int resp_start_stop(struct scsi_cmnd * scp,
1143 struct sdebug_dev_info * devip)
1144{
1145 unsigned char *cmd = (unsigned char *)scp->cmnd;
1146 int power_cond, errsts, start;
1147
1148 if ((errsts = check_readiness(scp, 1, devip)))
1149 return errsts;
1150 power_cond = (cmd[4] & 0xf0) >> 4;
1151 if (power_cond) {
1152 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1153 0);
1154 return check_condition_result;
1155 }
1156 start = cmd[4] & 1;
1157 if (start == devip->stopped)
1158 devip->stopped = !start;
1159 return 0;
1160}
1161
1162#define SDEBUG_READCAP_ARR_SZ 8
1163static int resp_readcap(struct scsi_cmnd * scp,
1164 struct sdebug_dev_info * devip)
1165{
1166 unsigned char arr[SDEBUG_READCAP_ARR_SZ];
1167 unsigned int capac;
1168 int errsts;
1169
1170 if ((errsts = check_readiness(scp, 1, devip)))
1171 return errsts;
1172
1173 if (scsi_debug_virtual_gb > 0) {
1174 sdebug_capacity = 2048 * 1024;
1175 sdebug_capacity *= scsi_debug_virtual_gb;
1176 } else
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;
1185 } else {
1186 arr[0] = 0xff;
1187 arr[1] = 0xff;
1188 arr[2] = 0xff;
1189 arr[3] = 0xff;
1190 }
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);
1194}
1195
1196#define SDEBUG_READCAP16_ARR_SZ 32
1197static int resp_readcap16(struct scsi_cmnd * scp,
1198 struct sdebug_dev_info * devip)
1199{
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;
1204
1205 if ((errsts = check_readiness(scp, 1, devip)))
1206 return errsts;
1207 alloc_len = ((cmd[10] << 24) + (cmd[11] << 16) + (cmd[12] << 8)
1208 + cmd[13]);
1209
1210 if (scsi_debug_virtual_gb > 0) {
1211 sdebug_capacity = 2048 * 1024;
1212 sdebug_capacity *= scsi_debug_virtual_gb;
1213 } else
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));
1225}
1226
1227#define SDEBUG_MAX_TGTPGS_ARR_SZ 1412
1228
1229static int resp_report_tgtpgs(struct scsi_cmnd * scp,
1230 struct sdebug_dev_info * devip)
1231{
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;
1237
1238 alen = ((cmd[6] << 24) + (cmd[7] << 16) + (cmd[8] << 8)
1239 + cmd[9]);
1240
1241 arr = kzalloc(SDEBUG_MAX_TGTPGS_ARR_SZ, GFP_ATOMIC);
1242 if (! arr)
1243 return DID_REQUEUE << 16;
1244
1245
1246
1247
1248
1249
1250 port_a = 0x1;
1251 port_b = 0x2;
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;
1256
1257
1258
1259
1260 n = 4;
1261 if (0 == scsi_debug_vpd_use_hostno) {
1262 arr[n++] = host_no % 3;
1263 arr[n++] = 0x0F;
1264 } else {
1265 arr[n++] = 0x0;
1266 arr[n++] = 0x01;
1267 }
1268 arr[n++] = (port_group_a >> 8) & 0xff;
1269 arr[n++] = port_group_a & 0xff;
1270 arr[n++] = 0;
1271 arr[n++] = 0;
1272 arr[n++] = 0;
1273 arr[n++] = 0x1;
1274 arr[n++] = 0;
1275 arr[n++] = 0;
1276 arr[n++] = (port_a >> 8) & 0xff;
1277 arr[n++] = port_a & 0xff;
1278 arr[n++] = 3;
1279 arr[n++] = 0x08;
1280 arr[n++] = (port_group_b >> 8) & 0xff;
1281 arr[n++] = port_group_b & 0xff;
1282 arr[n++] = 0;
1283 arr[n++] = 0;
1284 arr[n++] = 0;
1285 arr[n++] = 0x1;
1286 arr[n++] = 0;
1287 arr[n++] = 0;
1288 arr[n++] = (port_b >> 8) & 0xff;
1289 arr[n++] = port_b & 0xff;
1290
1291 rlen = n - 4;
1292 arr[0] = (rlen >> 24) & 0xff;
1293 arr[1] = (rlen >> 16) & 0xff;
1294 arr[2] = (rlen >> 8) & 0xff;
1295 arr[3] = rlen & 0xff;
1296
1297
1298
1299
1300
1301
1302
1303 rlen = min(alen,n);
1304 ret = fill_from_dev_buffer(scp, arr,
1305 min(rlen, SDEBUG_MAX_TGTPGS_ARR_SZ));
1306 kfree(arr);
1307 return ret;
1308}
1309
1310
1311
1312static int resp_err_recov_pg(unsigned char * p, int pcontrol, int target)
1313{
1314 unsigned char err_recov_pg[] = {0x1, 0xa, 0xc0, 11, 240, 0, 0, 0,
1315 5, 0, 0xff, 0xff};
1316
1317 memcpy(p, err_recov_pg, sizeof(err_recov_pg));
1318 if (1 == pcontrol)
1319 memset(p + 2, 0, sizeof(err_recov_pg) - 2);
1320 return sizeof(err_recov_pg);
1321}
1322
1323static int resp_disconnect_pg(unsigned char * p, int pcontrol, int target)
1324{
1325 unsigned char disconnect_pg[] = {0x2, 0xe, 128, 128, 0, 10, 0, 0,
1326 0, 0, 0, 0, 0, 0, 0, 0};
1327
1328 memcpy(p, disconnect_pg, sizeof(disconnect_pg));
1329 if (1 == pcontrol)
1330 memset(p + 2, 0, sizeof(disconnect_pg) - 2);
1331 return sizeof(disconnect_pg);
1332}
1333
1334static int resp_format_pg(unsigned char * p, int pcontrol, int target)
1335{
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};
1339
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;
1347 if (1 == pcontrol)
1348 memset(p + 2, 0, sizeof(format_pg) - 2);
1349 return sizeof(format_pg);
1350}
1351
1352static int resp_caching_pg(unsigned char * p, int pcontrol, int target)
1353{
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};
1356
1357 memcpy(p, caching_pg, sizeof(caching_pg));
1358 if (1 == pcontrol)
1359 memset(p + 2, 0, sizeof(caching_pg) - 2);
1360 return sizeof(caching_pg);
1361}
1362
1363static int resp_ctrl_m_pg(unsigned char * p, int pcontrol, int target)
1364{
1365 unsigned char ch_ctrl_m_pg[] = { 0x6, 0, 0, 0, 0, 0,
1366 0, 0, 0, 0};
1367 unsigned char d_ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
1368 0, 0, 0x2, 0x4b};
1369
1370 if (scsi_debug_dsense)
1371 ctrl_m_pg[2] |= 0x4;
1372 else
1373 ctrl_m_pg[2] &= ~0x4;
1374 memcpy(p, ctrl_m_pg, sizeof(ctrl_m_pg));
1375 if (1 == pcontrol)
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);
1380}
1381
1382
1383static int resp_iec_m_pg(unsigned char * p, int pcontrol, int target)
1384{
1385 unsigned char ch_iec_m_pg[] = { 0x4, 0xf, 0, 0, 0, 0,
1386 0, 0, 0x0, 0x0};
1387 unsigned char d_iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
1388 0, 0, 0x0, 0x0};
1389
1390 memcpy(p, iec_m_pg, sizeof(iec_m_pg));
1391 if (1 == pcontrol)
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);
1396}
1397
1398static int resp_sas_sf_m_pg(unsigned char * p, int pcontrol, int target)
1399{
1400 unsigned char sas_sf_m_pg[] = {0x19, 0x6,
1401 0x6, 0x0, 0x7, 0xd0, 0x0, 0x0};
1402
1403 memcpy(p, sas_sf_m_pg, sizeof(sas_sf_m_pg));
1404 if (1 == pcontrol)
1405 memset(p + 2, 0, sizeof(sas_sf_m_pg) - 2);
1406 return sizeof(sas_sf_m_pg);
1407}
1408
1409
1410static int resp_sas_pcd_m_spg(unsigned char * p, int pcontrol, int target,
1411 int target_dev_id)
1412{
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,
1426 };
1427 int port_a, port_b;
1428
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;
1440 if (1 == pcontrol)
1441 memset(p + 4, 0, sizeof(sas_pcd_m_pg) - 4);
1442 return sizeof(sas_pcd_m_pg);
1443}
1444
1445static int resp_sas_sha_m_spg(unsigned char * p, int pcontrol)
1446{
1447 unsigned char sas_sha_m_pg[] = {0x59, 0x2, 0, 0xc, 0, 0x6, 0x10, 0,
1448 0, 0, 0, 0, 0, 0, 0, 0,
1449 };
1450
1451 memcpy(p, sas_sha_m_pg, sizeof(sas_sha_m_pg));
1452 if (1 == pcontrol)
1453 memset(p + 4, 0, sizeof(sas_sha_m_pg) - 4);
1454 return sizeof(sas_sha_m_pg);
1455}
1456
1457#define SDEBUG_MAX_MSENSE_SZ 256
1458
1459static int resp_mode_sense(struct scsi_cmnd * scp, int target,
1460 struct sdebug_dev_info * devip)
1461{
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;
1466 unsigned char * ap;
1467 unsigned char arr[SDEBUG_MAX_MSENSE_SZ];
1468 unsigned char *cmd = (unsigned char *)scp->cmnd;
1469
1470 if ((errsts = check_readiness(scp, 1, devip)))
1471 return errsts;
1472 dbd = !!(cmd[1] & 0x8);
1473 pcontrol = (cmd[2] & 0xc0) >> 6;
1474 pcode = cmd[2] & 0x3f;
1475 subpcode = cmd[3];
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;
1480 else
1481 bd_len = 0;
1482 alloc_len = msense_6 ? cmd[4] : ((cmd[7] << 8) | cmd[8]);
1483 memset(arr, 0, SDEBUG_MAX_MSENSE_SZ);
1484 if (0x3 == pcontrol) {
1485 mk_sense_buffer(devip, ILLEGAL_REQUEST, SAVING_PARAMS_UNSUP,
1486 0);
1487 return check_condition_result;
1488 }
1489 target_dev_id = ((devip->sdbg_host->shost->host_no + 1) * 2000) +
1490 (devip->target * 1000) - 3;
1491
1492 if (0 == scsi_debug_ptype)
1493 dev_spec = (DEV_READONLY(target) ? 0x80 : 0x0) | 0x10;
1494 else
1495 dev_spec = 0x0;
1496 if (msense_6) {
1497 arr[2] = dev_spec;
1498 arr[3] = bd_len;
1499 offset = 4;
1500 } else {
1501 arr[3] = dev_spec;
1502 if (16 == bd_len)
1503 arr[4] = 0x1;
1504 arr[7] = bd_len;
1505 offset = 8;
1506 }
1507 ap = arr + offset;
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;
1512 } else
1513 sdebug_capacity = sdebug_store_sectors;
1514 }
1515 if (8 == bd_len) {
1516 if (sdebug_capacity > 0xfffffffe) {
1517 ap[0] = 0xff;
1518 ap[1] = 0xff;
1519 ap[2] = 0xff;
1520 ap[3] = 0xff;
1521 } else {
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;
1526 }
1527 ap[6] = (SECT_SIZE_PER(target) >> 8) & 0xff;
1528 ap[7] = SECT_SIZE_PER(target) & 0xff;
1529 offset += bd_len;
1530 ap = arr + offset;
1531 } else if (16 == bd_len) {
1532 unsigned long long capac = sdebug_capacity;
1533
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;
1540 offset += bd_len;
1541 ap = arr + offset;
1542 }
1543
1544 if ((subpcode > 0x0) && (subpcode < 0xff) && (0x19 != pcode)) {
1545
1546 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1547 0);
1548 return check_condition_result;
1549 }
1550 switch (pcode) {
1551 case 0x1:
1552 len = resp_err_recov_pg(ap, pcontrol, target);
1553 offset += len;
1554 break;
1555 case 0x2:
1556 len = resp_disconnect_pg(ap, pcontrol, target);
1557 offset += len;
1558 break;
1559 case 0x3:
1560 len = resp_format_pg(ap, pcontrol, target);
1561 offset += len;
1562 break;
1563 case 0x8:
1564 len = resp_caching_pg(ap, pcontrol, target);
1565 offset += len;
1566 break;
1567 case 0xa:
1568 len = resp_ctrl_m_pg(ap, pcontrol, target);
1569 offset += len;
1570 break;
1571 case 0x19:
1572 if ((subpcode > 0x2) && (subpcode < 0xff)) {
1573 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1574 INVALID_FIELD_IN_CDB, 0);
1575 return check_condition_result;
1576 }
1577 len = 0;
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,
1582 target_dev_id);
1583 if ((0x2 == subpcode) || (0xff == subpcode))
1584 len += resp_sas_sha_m_spg(ap + len, pcontrol);
1585 offset += len;
1586 break;
1587 case 0x1c:
1588 len = resp_iec_m_pg(ap, pcontrol, target);
1589 offset += len;
1590 break;
1591 case 0x3f:
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);
1603 }
1604 len += resp_iec_m_pg(ap + len, pcontrol, target);
1605 } else {
1606 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1607 INVALID_FIELD_IN_CDB, 0);
1608 return check_condition_result;
1609 }
1610 offset += len;
1611 break;
1612 default:
1613 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1614 0);
1615 return check_condition_result;
1616 }
1617 if (msense_6)
1618 arr[0] = offset - 1;
1619 else {
1620 arr[0] = ((offset - 2) >> 8) & 0xff;
1621 arr[1] = (offset - 2) & 0xff;
1622 }
1623 return fill_from_dev_buffer(scp, arr, min(alloc_len, offset));
1624}
1625
1626#define SDEBUG_MAX_MSELECT_SZ 512
1627
1628static int resp_mode_select(struct scsi_cmnd * scp, int mselect6,
1629 struct sdebug_dev_info * devip)
1630{
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;
1635
1636 if ((errsts = check_readiness(scp, 1, devip)))
1637 return errsts;
1638 memset(arr, 0, sizeof(arr));
1639 pf = cmd[1] & 0x10;
1640 sp = cmd[1] & 0x1;
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;
1646 }
1647 res = fetch_to_dev_buffer(scp, arr, param_len);
1648 if (-1 == res)
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]);
1656 if (md_len > 2) {
1657 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1658 INVALID_FIELD_IN_PARAM_LIST, 0);
1659 return check_condition_result;
1660 }
1661 off = bd_len + (mselect6 ? 4 : 8);
1662 mpage = arr[off] & 0x3f;
1663 ps = !!(arr[off] & 0x80);
1664 if (ps) {
1665 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1666 INVALID_FIELD_IN_PARAM_LIST, 0);
1667 return check_condition_result;
1668 }
1669 spf = !!(arr[off] & 0x40);
1670 pg_len = spf ? ((arr[off + 2] << 8) + arr[off + 3] + 4) :
1671 (arr[off + 1] + 2);
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;
1676 }
1677 switch (mpage) {
1678 case 0xa:
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);
1683 return 0;
1684 }
1685 break;
1686 case 0x1c:
1687 if (iec_m_pg[1] == arr[off + 1]) {
1688 memcpy(iec_m_pg + 2, arr + off + 2,
1689 sizeof(iec_m_pg) - 2);
1690 return 0;
1691 }
1692 break;
1693 default:
1694 break;
1695 }
1696 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1697 INVALID_FIELD_IN_PARAM_LIST, 0);
1698 return check_condition_result;
1699}
1700
1701static int resp_temp_l_pg(unsigned char * arr)
1702{
1703 unsigned char temp_l_pg[] = {0x0, 0x0, 0x3, 0x2, 0x0, 38,
1704 0x0, 0x1, 0x3, 0x2, 0x0, 65,
1705 };
1706
1707 memcpy(arr, temp_l_pg, sizeof(temp_l_pg));
1708 return sizeof(temp_l_pg);
1709}
1710
1711static int resp_ie_l_pg(unsigned char * arr)
1712{
1713 unsigned char ie_l_pg[] = {0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 38,
1714 };
1715
1716 memcpy(arr, ie_l_pg, sizeof(ie_l_pg));
1717 if (iec_m_pg[2] & 0x4) {
1718 arr[4] = THRESHOLD_EXCEEDED;
1719 arr[5] = 0xff;
1720 }
1721 return sizeof(ie_l_pg);
1722}
1723
1724#define SDEBUG_MAX_LSENSE_SZ 512
1725
1726static int resp_log_sense(struct scsi_cmnd * scp,
1727 struct sdebug_dev_info * devip)
1728{
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;
1732
1733 if ((errsts = check_readiness(scp, 1, devip)))
1734 return errsts;
1735 memset(arr, 0, sizeof(arr));
1736 ppc = cmd[1] & 0x2;
1737 sp = cmd[1] & 0x1;
1738 if (ppc || sp) {
1739 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1740 INVALID_FIELD_IN_CDB, 0);
1741 return check_condition_result;
1742 }
1743 pcontrol = (cmd[2] & 0xc0) >> 6;
1744 pcode = cmd[2] & 0x3f;
1745 subpcode = cmd[3] & 0xff;
1746 alloc_len = (cmd[7] << 8) + cmd[8];
1747 arr[0] = pcode;
1748 if (0 == subpcode) {
1749 switch (pcode) {
1750 case 0x0:
1751 n = 4;
1752 arr[n++] = 0x0;
1753 arr[n++] = 0xd;
1754 arr[n++] = 0x2f;
1755 arr[3] = n - 4;
1756 break;
1757 case 0xd:
1758 arr[3] = resp_temp_l_pg(arr + 4);
1759 break;
1760 case 0x2f:
1761 arr[3] = resp_ie_l_pg(arr + 4);
1762 break;
1763 default:
1764 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1765 INVALID_FIELD_IN_CDB, 0);
1766 return check_condition_result;
1767 }
1768 } else if (0xff == subpcode) {
1769 arr[0] |= 0x40;
1770 arr[1] = subpcode;
1771 switch (pcode) {
1772 case 0x0:
1773 n = 4;
1774 arr[n++] = 0x0;
1775 arr[n++] = 0x0;
1776 arr[n++] = 0x0;
1777 arr[n++] = 0xff;
1778 arr[n++] = 0xd;
1779 arr[n++] = 0x0;
1780 arr[n++] = 0x2f;
1781 arr[n++] = 0x0;
1782 arr[3] = n - 4;
1783 break;
1784 case 0xd:
1785 n = 4;
1786 arr[n++] = 0xd;
1787 arr[n++] = 0x0;
1788 arr[3] = n - 4;
1789 break;
1790 case 0x2f:
1791 n = 4;
1792 arr[n++] = 0x2f;
1793 arr[n++] = 0x0;
1794 arr[3] = n - 4;
1795 break;
1796 default:
1797 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1798 INVALID_FIELD_IN_CDB, 0);
1799 return check_condition_result;
1800 }
1801 } else {
1802 mk_sense_buffer(devip, ILLEGAL_REQUEST,
1803 INVALID_FIELD_IN_CDB, 0);
1804 return check_condition_result;
1805 }
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));
1809}
1810
1811static int resp_read(struct scsi_cmnd * SCpnt, unsigned long long lba,
1812 unsigned int num, struct sdebug_dev_info * devip)
1813{
1814 unsigned long iflags;
1815 unsigned int block, from_bottom;
1816 unsigned long long u;
1817 int ret;
1818
1819 if (lba + num > sdebug_capacity) {
1820 mk_sense_buffer(devip, ILLEGAL_REQUEST, ADDR_OUT_OF_RANGE,
1821 0);
1822 return check_condition_result;
1823 }
1824
1825 if (num > sdebug_store_sectors) {
1826 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1827 0);
1828 return check_condition_result;
1829 }
1830 if ((SCSI_DEBUG_OPT_MEDIUM_ERR & scsi_debug_opts) &&
1831 (lba <= OPT_MEDIUM_ERR_ADDR) &&
1832 ((lba + num) > OPT_MEDIUM_ERR_ADDR)) {
1833
1834 mk_sense_buffer(devip, MEDIUM_ERROR, UNRECOVERED_READ_ERR,
1835 0);
1836
1837 if (0x70 == (devip->sense_buff[0] & 0x7f)) {
1838 devip->sense_buff[0] |= 0x80;
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;
1844 }
1845 return check_condition_result;
1846 }
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),
1851 num * SECT_SIZE);
1852 else {
1853
1854 u = lba;
1855 block = do_div(u, sdebug_store_sectors);
1856 from_bottom = 0;
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);
1865 }
1866 read_unlock_irqrestore(&atomic_rw, iflags);
1867 return ret;
1868}
1869
1870static int resp_write(struct scsi_cmnd * SCpnt, unsigned long long lba,
1871 unsigned int num, struct sdebug_dev_info * devip)
1872{
1873 unsigned long iflags;
1874 unsigned int block, to_bottom;
1875 unsigned long long u;
1876 int res;
1877
1878 if (lba + num > sdebug_capacity) {
1879 mk_sense_buffer(devip, ILLEGAL_REQUEST, ADDR_OUT_OF_RANGE,
1880 0);
1881 return check_condition_result;
1882 }
1883
1884 if (num > sdebug_store_sectors) {
1885 mk_sense_buffer(devip, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB,
1886 0);
1887 return check_condition_result;
1888 }
1889
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),
1894 num * SECT_SIZE);
1895 else {
1896
1897 u = lba;
1898 block = do_div(u, sdebug_store_sectors);
1899 to_bottom = 0;
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);
1908 }
1909 write_unlock_irqrestore(&atomic_rw, iflags);
1910 if (-1 == res)
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);
1916 return 0;
1917}
1918
1919#define SDEBUG_RLUN_ARR_SZ 256
1920
1921static int resp_report_luns(struct scsi_cmnd * scp,
1922 struct sdebug_dev_info * devip)
1923{
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;
1931
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,
1935 0);
1936 return check_condition_result;
1937 }
1938
1939 memset(arr, 0, SDEBUG_RLUN_ARR_SZ);
1940 lun_cnt = scsi_debug_max_luns;
1941 if (1 == select_report)
1942 lun_cnt = 0;
1943 else if (scsi_debug_no_lun_0 && (lun_cnt > 0))
1944 --lun_cnt;
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);
1951 if (n < num) {
1952 wlun = 0;
1953 lun_cnt = n;
1954 }
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));
1959 i++, lun++) {
1960 upper = (lun >> 8) & 0x3f;
1961 if (upper)
1962 one_lun[i].scsi_lun[0] =
1963 (upper | (SAM2_LUN_ADDRESS_METHOD << 6));
1964 one_lun[i].scsi_lun[1] = lun & 0xff;
1965 }
1966 if (wlun) {
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;
1969 i++;
1970 }
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));
1974}
1975
1976
1977static void timer_intr_handler(unsigned long indx)
1978{
1979 struct sdebug_queued_cmd * sqcp;
1980 unsigned long iflags;
1981
1982 if (indx >= SCSI_DEBUG_CANQUEUE) {
1983 printk(KERN_ERR "scsi_debug:timer_intr_handler: indx too "
1984 "large\n");
1985 return;
1986 }
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 "
1991 "interrupt\n");
1992 spin_unlock_irqrestore(&queued_arr_lock, iflags);
1993 return;
1994 }
1995 sqcp->in_use = 0;
1996 if (sqcp->done_funct) {
1997 sqcp->a_cmnd->result = sqcp->scsi_result;
1998 sqcp->done_funct(sqcp->a_cmnd);
1999 }
2000 sqcp->done_funct = NULL;
2001 spin_unlock_irqrestore(&queued_arr_lock, iflags);
2002}
2003
2004static int scsi_debug_slave_alloc(struct scsi_device * sdp)
2005{
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);
2009 return 0;
2010}
2011
2012static int scsi_debug_slave_configure(struct scsi_device * sdp)
2013{
2014 struct sdebug_dev_info * devip;
2015
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);
2022 if (NULL == devip)
2023 return 1;
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);
2029 return 0;
2030}
2031
2032static void scsi_debug_slave_destroy(struct scsi_device * sdp)
2033{
2034 struct sdebug_dev_info * devip =
2035 (struct sdebug_dev_info *)sdp->hostdata;
2036
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);
2040 if (devip) {
2041
2042 devip->used = 0;
2043 sdp->hostdata = NULL;
2044 }
2045}
2046
2047static struct sdebug_dev_info * devInfoReg(struct scsi_device * sdev)
2048{
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;
2053
2054 if (devip)
2055 return devip;
2056 sdbg_host = *(struct sdebug_host_info **) sdev->host->hostdata;
2057 if(! sdbg_host) {
2058 printk(KERN_ERR "Host info NULL\n");
2059 return NULL;
2060 }
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))
2065 return devip;
2066 else {
2067 if ((!devip->used) && (!open_devip))
2068 open_devip = devip;
2069 }
2070 }
2071 if (NULL == open_devip) {
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__);
2076 return NULL;
2077 }
2078 open_devip->sdbg_host = sdbg_host;
2079 list_add_tail(&open_devip->dev_list,
2080 &sdbg_host->dev_info_list);
2081 }
2082 if (open_devip) {
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;
2092 else {
2093 open_devip->sense_buff[0] = 0x70;
2094 open_devip->sense_buff[7] = 0xa;
2095 }
2096 if (sdev->lun == SAM2_WLUN_REPORT_LUNS)
2097 open_devip->wlun = SAM2_WLUN_REPORT_LUNS & 0xff;
2098 return open_devip;
2099 }
2100 return NULL;
2101}
2102
2103static void mk_sense_buffer(struct sdebug_dev_info * devip, int key,
2104 int asc, int asq)
2105{
2106 unsigned char * sbuff;
2107
2108 sbuff = devip->sense_buff;
2109 memset(sbuff, 0, SDEBUG_SENSE_LEN);
2110 if (scsi_debug_dsense) {
2111 sbuff[0] = 0x72;
2112 sbuff[1] = key;
2113 sbuff[2] = asc;
2114 sbuff[3] = asq;
2115 } else {
2116 sbuff[0] = 0x70;
2117 sbuff[2] = key;
2118 sbuff[7] = 0xa;
2119 sbuff[12] = asc;
2120 sbuff[13] = asq;
2121 }
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);
2125}
2126
2127static int scsi_debug_abort(struct scsi_cmnd * SCpnt)
2128{
2129 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2130 printk(KERN_INFO "scsi_debug: abort\n");
2131 ++num_aborts;
2132 stop_queued_cmnd(SCpnt);
2133 return SUCCESS;
2134}
2135
2136static int scsi_debug_biosparam(struct scsi_device *sdev,
2137 struct block_device * bdev, sector_t capacity, int *info)
2138{
2139 int res;
2140 unsigned char *buf;
2141
2142 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2143 printk(KERN_INFO "scsi_debug: biosparam\n");
2144 buf = scsi_bios_ptable(bdev);
2145 if (buf) {
2146 res = scsi_partsize(buf, capacity,
2147 &info[2], &info[0], &info[1]);
2148 kfree(buf);
2149 if (! res)
2150 return res;
2151 }
2152 info[0] = sdebug_heads;
2153 info[1] = sdebug_sectors_per;
2154 info[2] = sdebug_cylinders_per;
2155 return 0;
2156}
2157
2158static int scsi_debug_device_reset(struct scsi_cmnd * SCpnt)
2159{
2160 struct sdebug_dev_info * devip;
2161
2162 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2163 printk(KERN_INFO "scsi_debug: device_reset\n");
2164 ++num_dev_resets;
2165 if (SCpnt) {
2166 devip = devInfoReg(SCpnt->device);
2167 if (devip)
2168 devip->reset = 1;
2169 }
2170 return SUCCESS;
2171}
2172
2173static int scsi_debug_bus_reset(struct scsi_cmnd * SCpnt)
2174{
2175 struct sdebug_host_info *sdbg_host;
2176 struct sdebug_dev_info * dev_info;
2177 struct scsi_device * sdp;
2178 struct Scsi_Host * hp;
2179
2180 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2181 printk(KERN_INFO "scsi_debug: bus_reset\n");
2182 ++num_bus_resets;
2183 if (SCpnt && ((sdp = SCpnt->device)) && ((hp = sdp->host))) {
2184 sdbg_host = *(struct sdebug_host_info **) hp->hostdata;
2185 if (sdbg_host) {
2186 list_for_each_entry(dev_info,
2187 &sdbg_host->dev_info_list,
2188 dev_list)
2189 dev_info->reset = 1;
2190 }
2191 }
2192 return SUCCESS;
2193}
2194
2195static int scsi_debug_host_reset(struct scsi_cmnd * SCpnt)
2196{
2197 struct sdebug_host_info * sdbg_host;
2198 struct sdebug_dev_info * dev_info;
2199
2200 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2201 printk(KERN_INFO "scsi_debug: host_reset\n");
2202 ++num_host_resets;
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,
2206 dev_list)
2207 dev_info->reset = 1;
2208 }
2209 spin_unlock(&sdebug_host_list_lock);
2210 stop_all_queued();
2211 return SUCCESS;
2212}
2213
2214
2215static int stop_queued_cmnd(struct scsi_cmnd * cmnd)
2216{
2217 unsigned long iflags;
2218 int k;
2219 struct sdebug_queued_cmd * sqcp;
2220
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);
2226 sqcp->in_use = 0;
2227 sqcp->a_cmnd = NULL;
2228 break;
2229 }
2230 }
2231 spin_unlock_irqrestore(&queued_arr_lock, iflags);
2232 return (k < SCSI_DEBUG_CANQUEUE) ? 1 : 0;
2233}
2234
2235
2236static void stop_all_queued(void)
2237{
2238 unsigned long iflags;
2239 int k;
2240 struct sdebug_queued_cmd * sqcp;
2241
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);
2247 sqcp->in_use = 0;
2248 sqcp->a_cmnd = NULL;
2249 }
2250 }
2251 spin_unlock_irqrestore(&queued_arr_lock, iflags);
2252}
2253
2254
2255static void __init init_all_queued(void)
2256{
2257 unsigned long iflags;
2258 int k;
2259 struct sdebug_queued_cmd * sqcp;
2260
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);
2265 sqcp->in_use = 0;
2266 sqcp->a_cmnd = NULL;
2267 }
2268 spin_unlock_irqrestore(&queued_arr_lock, iflags);
2269}
2270
2271static void __init sdebug_build_parts(unsigned char * ramp)
2272{
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;
2277
2278
2279 if ((scsi_debug_num_parts < 1) || (sdebug_store_size < 1048576))
2280 return;
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);
2285 }
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)
2293 * heads_by_sects;
2294 starts[scsi_debug_num_parts] = num_sectors;
2295 starts[scsi_debug_num_parts + 1] = 0;
2296
2297 ramp[510] = 0x55;
2298 ramp[511] = 0xAA;
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;
2303 pp->boot_ind = 0;
2304
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;
2309
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;
2314
2315 pp->start_sect = start_sec;
2316 pp->nr_sects = end_sec - start_sec + 1;
2317 pp->sys_ind = 0x83;
2318 }
2319}
2320
2321static int schedule_resp(struct scsi_cmnd * cmnd,
2322 struct sdebug_dev_info * devip,
2323 done_funct_t done, int scsi_result, int delta_jiff)
2324{
2325 if ((SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) && cmnd) {
2326 if (scsi_result) {
2327 struct scsi_device * sdp = cmnd->device;
2328
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);
2332 }
2333 }
2334 if (cmnd && devip) {
2335
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);
2340 }
2341 if (delta_jiff <= 0) {
2342 if (cmnd)
2343 cmnd->result = scsi_result;
2344 if (done)
2345 done(cmnd);
2346 return 0;
2347 } else {
2348 unsigned long iflags;
2349 int k;
2350 struct sdebug_queued_cmd * sqcp = NULL;
2351
2352 spin_lock_irqsave(&queued_arr_lock, iflags);
2353 for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
2354 sqcp = &queued_arr[k];
2355 if (! sqcp->in_use)
2356 break;
2357 }
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;
2362 }
2363 sqcp->in_use = 1;
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);
2372 if (cmnd)
2373 cmnd->result = 0;
2374 return 0;
2375 }
2376}
2377
2378
2379
2380
2381
2382
2383
2384module_param_named(add_host, scsi_debug_add_host, int, S_IRUGO | S_IWUSR);
2385module_param_named(delay, scsi_debug_delay, int, S_IRUGO | S_IWUSR);
2386module_param_named(dev_size_mb, scsi_debug_dev_size_mb, int, S_IRUGO);
2387module_param_named(dsense, scsi_debug_dsense, int, S_IRUGO | S_IWUSR);
2388module_param_named(every_nth, scsi_debug_every_nth, int, S_IRUGO | S_IWUSR);
2389module_param_named(fake_rw, scsi_debug_fake_rw, int, S_IRUGO | S_IWUSR);
2390module_param_named(max_luns, scsi_debug_max_luns, int, S_IRUGO | S_IWUSR);
2391module_param_named(no_lun_0, scsi_debug_no_lun_0, int, S_IRUGO | S_IWUSR);
2392module_param_named(num_parts, scsi_debug_num_parts, int, S_IRUGO);
2393module_param_named(num_tgts, scsi_debug_num_tgts, int, S_IRUGO | S_IWUSR);
2394module_param_named(opts, scsi_debug_opts, int, S_IRUGO | S_IWUSR);
2395module_param_named(ptype, scsi_debug_ptype, int, S_IRUGO | S_IWUSR);
2396module_param_named(scsi_level, scsi_debug_scsi_level, int, S_IRUGO);
2397module_param_named(virtual_gb, scsi_debug_virtual_gb, int, S_IRUGO | S_IWUSR);
2398module_param_named(vpd_use_hostno, scsi_debug_vpd_use_hostno, int,
2399 S_IRUGO | S_IWUSR);
2400
2401MODULE_AUTHOR("Eric Youngdale + Douglas Gilbert");
2402MODULE_DESCRIPTION("SCSI debug adapter driver");
2403MODULE_LICENSE("GPL");
2404MODULE_VERSION(SCSI_DEBUG_VERSION);
2405
2406MODULE_PARM_DESC(add_host, "0..127 hosts allowed(def=1)");
2407MODULE_PARM_DESC(delay, "# of jiffies to delay response(def=1)");
2408MODULE_PARM_DESC(dev_size_mb, "size in MB of ram shared by devs(def=8)");
2409MODULE_PARM_DESC(dsense, "use descriptor sense format(def=0 -> fixed)");
2410MODULE_PARM_DESC(every_nth, "timeout every nth command(def=0)");
2411MODULE_PARM_DESC(fake_rw, "fake reads/writes instead of copying (def=0)");
2412MODULE_PARM_DESC(max_luns, "number of LUNs per target to simulate(def=1)");
2413MODULE_PARM_DESC(no_lun_0, "no LU number 0 (def=0 -> have lun 0)");
2414MODULE_PARM_DESC(num_parts, "number of partitions(def=0)");
2415MODULE_PARM_DESC(num_tgts, "number of targets per host to simulate(def=1)");
2416MODULE_PARM_DESC(opts, "1->noise, 2->medium_err, 4->timeout, 8->recovered_err... (def=0)");
2417MODULE_PARM_DESC(ptype, "SCSI peripheral type(def=0[disk])");
2418MODULE_PARM_DESC(scsi_level, "SCSI level to simulate(def=5[SPC-3])");
2419MODULE_PARM_DESC(virtual_gb, "virtual gigabyte size (def=0 -> use dev_size_mb)");
2420MODULE_PARM_DESC(vpd_use_hostno, "0 -> dev ids ignore hostno (def=1 -> unique dev ids)");
2421
2422
2423static char sdebug_info[256];
2424
2425static const char * scsi_debug_info(struct Scsi_Host * shp)
2426{
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,
2430 scsi_debug_opts);
2431 return sdebug_info;
2432}
2433
2434
2435
2436
2437static int scsi_debug_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset,
2438 int length, int inout)
2439{
2440 int len, pos, begin;
2441 int orig_length;
2442
2443 orig_length = length;
2444
2445 if (inout == 1) {
2446 char arr[16];
2447 int minLen = length > 15 ? 15 : length;
2448
2449 if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
2450 return -EACCES;
2451 memcpy(arr, buffer, minLen);
2452 arr[minLen] = '\0';
2453 if (1 != sscanf(arr, "%d", &pos))
2454 return -EINVAL;
2455 scsi_debug_opts = pos;
2456 if (scsi_debug_every_nth != 0)
2457 scsi_debug_cmnd_count = 0;
2458 return length;
2459 }
2460 begin = 0;
2461 pos = len = sprintf(buffer, "scsi_debug adapter driver, version "
2462 "%s [%s]\n"
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, "
2468 "host_resets=%d\n",
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);
2475 if (pos < offset) {
2476 len = 0;
2477 begin = pos;
2478 }
2479 *start = buffer + (offset - begin);
2480 len -= (offset - begin);
2481 if (len > length)
2482 len = length;
2483 return len;
2484}
2485
2486static ssize_t sdebug_delay_show(struct device_driver * ddp, char * buf)
2487{
2488 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_delay);
2489}
2490
2491static ssize_t sdebug_delay_store(struct device_driver * ddp,
2492 const char * buf, size_t count)
2493{
2494 int delay;
2495 char work[20];
2496
2497 if (1 == sscanf(buf, "%10s", work)) {
2498 if ((1 == sscanf(work, "%d", &delay)) && (delay >= 0)) {
2499 scsi_debug_delay = delay;
2500 return count;
2501 }
2502 }
2503 return -EINVAL;
2504}
2505DRIVER_ATTR(delay, S_IRUGO | S_IWUSR, sdebug_delay_show,
2506 sdebug_delay_store);
2507
2508static ssize_t sdebug_opts_show(struct device_driver * ddp, char * buf)
2509{
2510 return scnprintf(buf, PAGE_SIZE, "0x%x\n", scsi_debug_opts);
2511}
2512
2513static ssize_t sdebug_opts_store(struct device_driver * ddp,
2514 const char * buf, size_t count)
2515{
2516 int opts;
2517 char work[20];
2518
2519 if (1 == sscanf(buf, "%10s", work)) {
2520 if (0 == strnicmp(work,"0x", 2)) {
2521 if (1 == sscanf(&work[2], "%x", &opts))
2522 goto opts_done;
2523 } else {
2524 if (1 == sscanf(work, "%d", &opts))
2525 goto opts_done;
2526 }
2527 }
2528 return -EINVAL;
2529opts_done:
2530 scsi_debug_opts = opts;
2531 scsi_debug_cmnd_count = 0;
2532 return count;
2533}
2534DRIVER_ATTR(opts, S_IRUGO | S_IWUSR, sdebug_opts_show,
2535 sdebug_opts_store);
2536
2537static ssize_t sdebug_ptype_show(struct device_driver * ddp, char * buf)
2538{
2539 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_ptype);
2540}
2541static ssize_t sdebug_ptype_store(struct device_driver * ddp,
2542 const char * buf, size_t count)
2543{
2544 int n;
2545
2546 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2547 scsi_debug_ptype = n;
2548 return count;
2549 }
2550 return -EINVAL;
2551}
2552DRIVER_ATTR(ptype, S_IRUGO | S_IWUSR, sdebug_ptype_show, sdebug_ptype_store);
2553
2554static ssize_t sdebug_dsense_show(struct device_driver * ddp, char * buf)
2555{
2556 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dsense);
2557}
2558static ssize_t sdebug_dsense_store(struct device_driver * ddp,
2559 const char * buf, size_t count)
2560{
2561 int n;
2562
2563 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2564 scsi_debug_dsense = n;
2565 return count;
2566 }
2567 return -EINVAL;
2568}
2569DRIVER_ATTR(dsense, S_IRUGO | S_IWUSR, sdebug_dsense_show,
2570 sdebug_dsense_store);
2571
2572static ssize_t sdebug_fake_rw_show(struct device_driver * ddp, char * buf)
2573{
2574 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_fake_rw);
2575}
2576static ssize_t sdebug_fake_rw_store(struct device_driver * ddp,
2577 const char * buf, size_t count)
2578{
2579 int n;
2580
2581 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2582 scsi_debug_fake_rw = n;
2583 return count;
2584 }
2585 return -EINVAL;
2586}
2587DRIVER_ATTR(fake_rw, S_IRUGO | S_IWUSR, sdebug_fake_rw_show,
2588 sdebug_fake_rw_store);
2589
2590static ssize_t sdebug_no_lun_0_show(struct device_driver * ddp, char * buf)
2591{
2592 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_no_lun_0);
2593}
2594static ssize_t sdebug_no_lun_0_store(struct device_driver * ddp,
2595 const char * buf, size_t count)
2596{
2597 int n;
2598
2599 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2600 scsi_debug_no_lun_0 = n;
2601 return count;
2602 }
2603 return -EINVAL;
2604}
2605DRIVER_ATTR(no_lun_0, S_IRUGO | S_IWUSR, sdebug_no_lun_0_show,
2606 sdebug_no_lun_0_store);
2607
2608static ssize_t sdebug_num_tgts_show(struct device_driver * ddp, char * buf)
2609{
2610 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_num_tgts);
2611}
2612static ssize_t sdebug_num_tgts_store(struct device_driver * ddp,
2613 const char * buf, size_t count)
2614{
2615 int n;
2616
2617 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2618 scsi_debug_num_tgts = n;
2619 sdebug_max_tgts_luns();
2620 return count;
2621 }
2622 return -EINVAL;
2623}
2624DRIVER_ATTR(num_tgts, S_IRUGO | S_IWUSR, sdebug_num_tgts_show,
2625 sdebug_num_tgts_store);
2626
2627static ssize_t sdebug_dev_size_mb_show(struct device_driver * ddp, char * buf)
2628{
2629 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_dev_size_mb);
2630}
2631DRIVER_ATTR(dev_size_mb, S_IRUGO, sdebug_dev_size_mb_show, NULL);
2632
2633static ssize_t sdebug_num_parts_show(struct device_driver * ddp, char * buf)
2634{
2635 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_num_parts);
2636}
2637DRIVER_ATTR(num_parts, S_IRUGO, sdebug_num_parts_show, NULL);
2638
2639static ssize_t sdebug_every_nth_show(struct device_driver * ddp, char * buf)
2640{
2641 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_every_nth);
2642}
2643static ssize_t sdebug_every_nth_store(struct device_driver * ddp,
2644 const char * buf, size_t count)
2645{
2646 int nth;
2647
2648 if ((count > 0) && (1 == sscanf(buf, "%d", &nth))) {
2649 scsi_debug_every_nth = nth;
2650 scsi_debug_cmnd_count = 0;
2651 return count;
2652 }
2653 return -EINVAL;
2654}
2655DRIVER_ATTR(every_nth, S_IRUGO | S_IWUSR, sdebug_every_nth_show,
2656 sdebug_every_nth_store);
2657
2658static ssize_t sdebug_max_luns_show(struct device_driver * ddp, char * buf)
2659{
2660 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_max_luns);
2661}
2662static ssize_t sdebug_max_luns_store(struct device_driver * ddp,
2663 const char * buf, size_t count)
2664{
2665 int n;
2666
2667 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2668 scsi_debug_max_luns = n;
2669 sdebug_max_tgts_luns();
2670 return count;
2671 }
2672 return -EINVAL;
2673}
2674DRIVER_ATTR(max_luns, S_IRUGO | S_IWUSR, sdebug_max_luns_show,
2675 sdebug_max_luns_store);
2676
2677static ssize_t sdebug_scsi_level_show(struct device_driver * ddp, char * buf)
2678{
2679 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_scsi_level);
2680}
2681DRIVER_ATTR(scsi_level, S_IRUGO, sdebug_scsi_level_show, NULL);
2682
2683static ssize_t sdebug_virtual_gb_show(struct device_driver * ddp, char * buf)
2684{
2685 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_virtual_gb);
2686}
2687static ssize_t sdebug_virtual_gb_store(struct device_driver * ddp,
2688 const char * buf, size_t count)
2689{
2690 int n;
2691
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;
2697 } else
2698 sdebug_capacity = sdebug_store_sectors;
2699 return count;
2700 }
2701 return -EINVAL;
2702}
2703DRIVER_ATTR(virtual_gb, S_IRUGO | S_IWUSR, sdebug_virtual_gb_show,
2704 sdebug_virtual_gb_store);
2705
2706static ssize_t sdebug_add_host_show(struct device_driver * ddp, char * buf)
2707{
2708 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_add_host);
2709}
2710
2711static ssize_t sdebug_add_host_store(struct device_driver * ddp,
2712 const char * buf, size_t count)
2713{
2714 int delta_hosts;
2715 char work[20];
2716
2717 if (1 != sscanf(buf, "%10s", work))
2718 return -EINVAL;
2719 {
2720 int neg = 0;
2721
2722 if ('-' == *work)
2723 neg = 1;
2724 if (1 != sscanf(work + neg, "%d", &delta_hosts))
2725 return -EINVAL;
2726 if (neg)
2727 delta_hosts = -delta_hosts;
2728 }
2729 if (delta_hosts > 0) {
2730 do {
2731 sdebug_add_adapter();
2732 } while (--delta_hosts);
2733 } else if (delta_hosts < 0) {
2734 do {
2735 sdebug_remove_adapter();
2736 } while (++delta_hosts);
2737 }
2738 return count;
2739}
2740DRIVER_ATTR(add_host, S_IRUGO | S_IWUSR, sdebug_add_host_show,
2741 sdebug_add_host_store);
2742
2743static ssize_t sdebug_vpd_use_hostno_show(struct device_driver * ddp,
2744 char * buf)
2745{
2746 return scnprintf(buf, PAGE_SIZE, "%d\n", scsi_debug_vpd_use_hostno);
2747}
2748static ssize_t sdebug_vpd_use_hostno_store(struct device_driver * ddp,
2749 const char * buf, size_t count)
2750{
2751 int n;
2752
2753 if ((count > 0) && (1 == sscanf(buf, "%d", &n)) && (n >= 0)) {
2754 scsi_debug_vpd_use_hostno = n;
2755 return count;
2756 }
2757 return -EINVAL;
2758}
2759DRIVER_ATTR(vpd_use_hostno, S_IRUGO | S_IWUSR, sdebug_vpd_use_hostno_show,
2760 sdebug_vpd_use_hostno_store);
2761
2762
2763
2764
2765
2766
2767
2768static int do_create_driverfs_files(void)
2769{
2770 int ret;
2771
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);
2787 return ret;
2788}
2789
2790static void do_remove_driverfs_files(void)
2791{
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);
2807}
2808
2809static int __init scsi_debug_init(void)
2810{
2811 unsigned int sz;
2812 int host_to_add;
2813 int k;
2814 int ret;
2815
2816 if (scsi_debug_dev_size_mb < 1)
2817 scsi_debug_dev_size_mb = 1;
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;
2823 } else
2824 sdebug_capacity = sdebug_store_sectors;
2825
2826
2827 sdebug_heads = 8;
2828 sdebug_sectors_per = 32;
2829 if (scsi_debug_dev_size_mb >= 16)
2830 sdebug_heads = 32;
2831 else if (scsi_debug_dev_size_mb >= 256)
2832 sdebug_heads = 64;
2833 sdebug_cylinders_per = (unsigned long)sdebug_capacity /
2834 (sdebug_sectors_per * sdebug_heads);
2835 if (sdebug_cylinders_per >= 1024) {
2836
2837 sdebug_heads = 255;
2838 sdebug_sectors_per = 63;
2839 sdebug_cylinders_per = (unsigned long)sdebug_capacity /
2840 (sdebug_sectors_per * sdebug_heads);
2841 }
2842
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");
2847 return -ENOMEM;
2848 }
2849 memset(fake_storep, 0, sz);
2850 if (scsi_debug_num_parts > 0)
2851 sdebug_build_parts(fake_storep);
2852
2853 ret = device_register(&pseudo_primary);
2854 if (ret < 0) {
2855 printk(KERN_WARNING "scsi_debug: device_register error: %d\n",
2856 ret);
2857 goto free_vm;
2858 }
2859 ret = bus_register(&pseudo_lld_bus);
2860 if (ret < 0) {
2861 printk(KERN_WARNING "scsi_debug: bus_register error: %d\n",
2862 ret);
2863 goto dev_unreg;
2864 }
2865 ret = driver_register(&sdebug_driverfs_driver);
2866 if (ret < 0) {
2867 printk(KERN_WARNING "scsi_debug: driver_register error: %d\n",
2868 ret);
2869 goto bus_unreg;
2870 }
2871 ret = do_create_driverfs_files();
2872 if (ret < 0) {
2873 printk(KERN_WARNING "scsi_debug: driver_create_file error: %d\n",
2874 ret);
2875 goto del_files;
2876 }
2877
2878 init_all_queued();
2879
2880 sdebug_driver_template.proc_name = sdebug_proc_name;
2881
2882 host_to_add = scsi_debug_add_host;
2883 scsi_debug_add_host = 0;
2884
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);
2889 break;
2890 }
2891 }
2892
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);
2896 }
2897 return 0;
2898
2899del_files:
2900 do_remove_driverfs_files();
2901 driver_unregister(&sdebug_driverfs_driver);
2902bus_unreg:
2903 bus_unregister(&pseudo_lld_bus);
2904dev_unreg:
2905 device_unregister(&pseudo_primary);
2906free_vm:
2907 vfree(fake_storep);
2908
2909 return ret;
2910}
2911
2912static void __exit scsi_debug_exit(void)
2913{
2914 int k = scsi_debug_add_host;
2915
2916 stop_all_queued();
2917 for (; k; k--)
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);
2923
2924 vfree(fake_storep);
2925}
2926
2927device_initcall(scsi_debug_init);
2928module_exit(scsi_debug_exit);
2929
2930static void pseudo_0_release(struct device * dev)
2931{
2932 if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
2933 printk(KERN_INFO "scsi_debug: pseudo_0_release() called\n");
2934}
2935
2936static struct device pseudo_primary = {
2937 .bus_id = "pseudo_0",
2938 .release = pseudo_0_release,
2939};
2940
2941static int pseudo_lld_bus_match(struct device *dev,
2942 struct device_driver *dev_driver)
2943{
2944 return 1;
2945}
2946
2947static struct bus_type pseudo_lld_bus = {
2948 .name = "pseudo",
2949 .match = pseudo_lld_bus_match,
2950 .probe = sdebug_driver_probe,
2951 .remove = sdebug_driver_remove,
2952};
2953
2954static void sdebug_release_adapter(struct device * dev)
2955{
2956 struct sdebug_host_info *sdbg_host;
2957
2958 sdbg_host = to_sdebug_host(dev);
2959 kfree(sdbg_host);
2960}
2961
2962static int sdebug_add_adapter(void)
2963{
2964 int k, devs_per_host;
2965 int error = 0;
2966 struct sdebug_host_info *sdbg_host;
2967 struct sdebug_dev_info *sdbg_devinfo;
2968 struct list_head *lh, *lh_sf;
2969
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__);
2974 return -ENOMEM;
2975 }
2976
2977 INIT_LIST_HEAD(&sdbg_host->dev_info_list);
2978
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__);
2985 error = -ENOMEM;
2986 goto clean;
2987 }
2988 sdbg_devinfo->sdbg_host = sdbg_host;
2989 list_add_tail(&sdbg_devinfo->dev_list,
2990 &sdbg_host->dev_info_list);
2991 }
2992
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);
2996
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);
3001
3002 error = device_register(&sdbg_host->dev);
3003
3004 if (error)
3005 goto clean;
3006
3007 ++scsi_debug_add_host;
3008 return error;
3009
3010clean:
3011 list_for_each_safe(lh, lh_sf, &sdbg_host->dev_info_list) {
3012 sdbg_devinfo = list_entry(lh, struct sdebug_dev_info,
3013 dev_list);
3014 list_del(&sdbg_devinfo->dev_list);
3015 kfree(sdbg_devinfo);
3016 }
3017
3018 kfree(sdbg_host);
3019 return error;
3020}
3021
3022static void sdebug_remove_adapter(void)
3023{
3024 struct sdebug_host_info * sdbg_host = NULL;
3025
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);
3031 }
3032 spin_unlock(&sdebug_host_list_lock);
3033
3034 if (!sdbg_host)
3035 return;
3036
3037 device_unregister(&sdbg_host->dev);
3038 --scsi_debug_add_host;
3039}
3040
3041static int sdebug_driver_probe(struct device * dev)
3042{
3043 int error = 0;
3044 struct sdebug_host_info *sdbg_host;
3045 struct Scsi_Host *hpnt;
3046
3047 sdbg_host = to_sdebug_host(dev);
3048
3049 hpnt = scsi_host_alloc(&sdebug_driver_template, sizeof(sdbg_host));
3050 if (NULL == hpnt) {
3051 printk(KERN_ERR "%s: scsi_register failed\n", __FUNCTION__);
3052 error = -ENODEV;
3053 return error;
3054 }
3055
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;
3060 else
3061 hpnt->max_id = scsi_debug_num_tgts;
3062 hpnt->max_lun = SAM2_WLUN_REPORT_LUNS;
3063
3064 error = scsi_add_host(hpnt, &sdbg_host->dev);
3065 if (error) {
3066 printk(KERN_ERR "%s: scsi_add_host failed\n", __FUNCTION__);
3067 error = -ENODEV;
3068 scsi_host_put(hpnt);
3069 } else
3070 scsi_scan_host(hpnt);
3071
3072
3073 return error;
3074}
3075
3076static int sdebug_driver_remove(struct device * dev)
3077{
3078 struct list_head *lh, *lh_sf;
3079 struct sdebug_host_info *sdbg_host;
3080 struct sdebug_dev_info *sdbg_devinfo;
3081
3082 sdbg_host = to_sdebug_host(dev);
3083
3084 if (!sdbg_host) {
3085 printk(KERN_ERR "%s: Unable to locate host info\n",
3086 __FUNCTION__);
3087 return -ENODEV;
3088 }
3089
3090 scsi_remove_host(sdbg_host->shost);
3091
3092 list_for_each_safe(lh, lh_sf, &sdbg_host->dev_info_list) {
3093 sdbg_devinfo = list_entry(lh, struct sdebug_dev_info,
3094 dev_list);
3095 list_del(&sdbg_devinfo->dev_list);
3096 kfree(sdbg_devinfo);
3097 }
3098
3099 scsi_host_put(sdbg_host->shost);
3100 return 0;
3101}
3102
3103static void sdebug_max_tgts_luns(void)
3104{
3105 struct sdebug_host_info * sdbg_host;
3106 struct Scsi_Host *hpnt;
3107
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;
3114 else
3115 hpnt->max_id = scsi_debug_num_tgts;
3116 hpnt->max_lun = SAM2_WLUN_REPORT_LUNS;
3117 }
3118 spin_unlock(&sdebug_host_list_lock);
3119}
3120