scsi_debug.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:35k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* 
  2.  *  linux/kernel/scsi_debug.c
  3.  *
  4.  *  Copyright (C) 1992  Eric Youngdale
  5.  *  Simulate a host adapter with 2 disks attached.  Do a lot of checking
  6.  *  to make sure that we are not getting blocks mixed up, and PANIC if
  7.  *  anything out of the ordinary is seen.
  8.  *
  9.  *  This version is more generic, simulating a variable number of disk 
  10.  *  (or disk like devices) sharing a common amount of RAM (default 8 MB
  11.  *  but can be set at driver/module load time).
  12.  *
  13.  *  For documentation see http://www.torque.net/sg/sdebug.html
  14.  *
  15.  *   D. Gilbert (dpg) work for Magneto-Optical device test [20010421]
  16.  *   dpg: work for devfs large number of disks [20010809]
  17.  *        use vmalloc() more inquiry+mode_sense [20020302]
  18.  *        add timers for delayed responses [20020721]
  19.  */
  20. #include <linux/config.h>
  21. #include <linux/module.h>
  22. #include <linux/kernel.h>
  23. #include <linux/sched.h>
  24. #include <linux/errno.h>
  25. #include <linux/timer.h>
  26. #include <linux/types.h>
  27. #include <linux/string.h>
  28. #include <linux/genhd.h>
  29. #include <linux/fs.h>
  30. #include <linux/init.h>
  31. #include <linux/proc_fs.h>
  32. #include <linux/smp_lock.h>
  33. #include <linux/vmalloc.h>
  34. #include <asm/io.h>
  35. #include <linux/blk.h>
  36. #include "scsi.h"
  37. #include "hosts.h"
  38. #include <linux/stat.h>
  39. #ifndef LINUX_VERSION_CODE
  40. #include <linux/version.h>
  41. #endif
  42. #include "scsi_debug.h"
  43. static const char * scsi_debug_version_str = "Version: 0.61 (20020815)";
  44. #ifndef SCSI_CMD_READ_16
  45. #define SCSI_CMD_READ_16 0x88
  46. #endif
  47. #ifndef SCSI_CMD_WRITE_16
  48. #define SCSI_CMD_WRITE_16 0x8a
  49. #endif
  50. #ifndef REPORT_LUNS
  51. #define REPORT_LUNS 0xa0
  52. #endif
  53. /* A few options that we want selected */
  54. #define DEF_NR_FAKE_DEVS   1
  55. #define DEF_DEV_SIZE_MB   8
  56. #define DEF_FAKE_BLK0   0
  57. #define DEF_EVERY_NTH   100
  58. #define DEF_DELAY   1
  59. #define DEF_OPTS   0
  60. #define SCSI_DEBUG_OPT_NOISE   1
  61. #define SCSI_DEBUG_OPT_MEDIUM_ERR   2
  62. #define SCSI_DEBUG_OPT_EVERY_NTH   4
  63. #define OPT_MEDIUM_ERR_ADDR   0x1234
  64. static int scsi_debug_num_devs = DEF_NR_FAKE_DEVS;
  65. static int scsi_debug_opts = DEF_OPTS;
  66. static int scsi_debug_every_nth = DEF_EVERY_NTH;
  67. static int scsi_debug_cmnd_count = 0;
  68. static int scsi_debug_delay = DEF_DELAY;
  69. #define NR_HOSTS_PRESENT (((scsi_debug_num_devs - 1) / 7) + 1)
  70. #define N_HEAD          8
  71. #define N_SECTOR        32
  72. #define DEV_READONLY(TGT)      (0)
  73. #define DEV_REMOVEABLE(TGT)    (0)
  74. #define PERIPH_DEVICE_TYPE(TGT) (TYPE_DISK);
  75. static int scsi_debug_dev_size_mb = DEF_DEV_SIZE_MB;
  76. #define STORE_SIZE (scsi_debug_dev_size_mb * 1024 * 1024)
  77. /* default sector size is 512 bytes, 2**9 bytes */
  78. #define POW2_SECT_SIZE 9
  79. #define SECT_SIZE (1 << POW2_SECT_SIZE)
  80. #define N_CYLINDER (STORE_SIZE / (SECT_SIZE * N_SECTOR * N_HEAD))
  81. /* Time to wait before completing a command */
  82. #define CAPACITY (N_HEAD * N_SECTOR * N_CYLINDER)
  83. #define SECT_SIZE_PER(TGT) SECT_SIZE
  84. #define SDEBUG_SENSE_LEN 32
  85. struct sdebug_dev_info {
  86. Scsi_Device * sdp;
  87. unsigned char sense_buff[SDEBUG_SENSE_LEN]; /* weak nexus */
  88. char reset;
  89. };
  90. static struct sdebug_dev_info * devInfop;
  91. typedef void (* done_funct_t) (Scsi_Cmnd *);
  92. struct sdebug_queued_cmd {
  93. int in_use;
  94. struct timer_list cmnd_timer;
  95. done_funct_t done_funct;
  96. struct scsi_cmnd * a_cmnd;
  97. int scsi_result;
  98. };
  99. static struct sdebug_queued_cmd queued_arr[SCSI_DEBUG_CANQUEUE];
  100. static unsigned char * fake_storep; /* ramdisk storage */
  101. static unsigned char broken_buff[SDEBUG_SENSE_LEN];
  102. static int num_aborts = 0;
  103. static int num_dev_resets = 0;
  104. static int num_bus_resets = 0;
  105. static int num_host_resets = 0;
  106. static spinlock_t queued_arr_lock = SPIN_LOCK_UNLOCKED;
  107. static rwlock_t atomic_rw = RW_LOCK_UNLOCKED;
  108. /* function declarations */
  109. static int resp_inquiry(unsigned char * cmd, int target, unsigned char * buff,
  110. int bufflen, struct sdebug_dev_info * devip);
  111. static int resp_mode_sense(unsigned char * cmd, int target,
  112.    unsigned char * buff, int bufflen,
  113.    struct sdebug_dev_info * devip);
  114. static int resp_read(Scsi_Cmnd * SCpnt, int upper_blk, int block, 
  115.      int num, struct sdebug_dev_info * devip);
  116. static int resp_write(Scsi_Cmnd * SCpnt, int upper_blk, int block, int num,
  117.       struct sdebug_dev_info * devip);
  118. static int resp_report_luns(unsigned char * cmd, unsigned char * buff,
  119.     int bufflen, struct sdebug_dev_info * devip);
  120. static void timer_intr_handler(unsigned long);
  121. static struct sdebug_dev_info * devInfoReg(Scsi_Device * sdp);
  122. static void mk_sense_buffer(struct sdebug_dev_info * devip, int key, 
  123.     int asc, int asq, int inbandLen);
  124. static int check_reset(Scsi_Cmnd * SCpnt, struct sdebug_dev_info * devip);
  125. static int schedule_resp(struct scsi_cmnd * cmnd, 
  126.  struct sdebug_dev_info * devip, 
  127.  done_funct_t done, int scsi_result, int delta_jiff);
  128. static void init_all_queued(void);
  129. static void stop_all_queued(void);
  130. static int stop_queued_cmnd(struct scsi_cmnd * cmnd);
  131. static int inquiry_evpd_83(unsigned char * arr, int dev_id_num,
  132.                            const char * dev_id_str, int dev_id_str_len);
  133. static Scsi_Host_Template driver_template = SCSI_DEBUG_TEMPLATE;
  134. static
  135. int scsi_debug_queuecommand(Scsi_Cmnd * SCpnt, done_funct_t done)
  136. {
  137. unsigned char *cmd = (unsigned char *) SCpnt->cmnd;
  138. int block;
  139. int upper_blk;
  140. unsigned char *buff;
  141. int errsts = 0;
  142. int target = SCpnt->target;
  143. int bufflen = SCpnt->request_bufflen;
  144. int num, capac;
  145. struct sdebug_dev_info * devip = NULL;
  146. unsigned char * sbuff;
  147. if (done == NULL)
  148. return 0; /* assume mid level reprocessing command */
  149. if (SCpnt->use_sg) { /* just use first element */
  150. struct scatterlist *sgpnt = (struct scatterlist *)
  151. SCpnt->request_buffer;
  152. buff = sgpnt[0].address;
  153. bufflen = sgpnt[0].length;
  154. /* READ and WRITE process scatterlist themselves */
  155. }
  156. else 
  157. buff = (unsigned char *) SCpnt->request_buffer;
  158. if (NULL == buff) {
  159. printk(KERN_WARNING "scsi_debug:qc: buff was NULL??n");
  160. buff = broken_buff; /* just point at dummy */
  161. bufflen = SDEBUG_SENSE_LEN;
  162. }
  163.         if(target == driver_template.this_id) {
  164.                 printk(KERN_WARNING 
  165.        "scsi_debug: initiator's id used as target!n");
  166. return schedule_resp(SCpnt, NULL, done, 0, 0);
  167.         }
  168. if ((target > driver_template.this_id) || (SCpnt->lun != 0))
  169. return schedule_resp(SCpnt, NULL, done, 
  170.      DID_NO_CONNECT << 16, 0);
  171. #if 0
  172. printk(KERN_INFO "sdebug:qc: host_no=%d, id=%d, sdp=%p, cmd=0x%xn",
  173.        (int)SCpnt->device->host->host_no, (int)SCpnt->device->id,
  174.        SCpnt->device, (int)*cmd);
  175. #endif
  176. if (NULL == SCpnt->device->hostdata) {
  177. devip = devInfoReg(SCpnt->device);
  178. if (NULL == devip)
  179. return schedule_resp(SCpnt, NULL, done, 
  180.      DID_NO_CONNECT << 16, 0);
  181. SCpnt->device->hostdata = devip;
  182. }
  183. devip = SCpnt->device->hostdata;
  184.         if ((SCSI_DEBUG_OPT_EVERY_NTH & scsi_debug_opts) &&
  185.             (scsi_debug_every_nth > 0) &&
  186.             (++scsi_debug_cmnd_count >= scsi_debug_every_nth)) {
  187.                 scsi_debug_cmnd_count =0;
  188.                 return 0; /* ignore command causing timeout */
  189.         }
  190. switch (*cmd) {
  191. case INQUIRY:     /* mandatory */
  192. /* assume INQUIRY called first so setup max_cmd_len */
  193. if (SCpnt->host->max_cmd_len != SCSI_DEBUG_MAX_CMD_LEN)
  194. SCpnt->host->max_cmd_len = SCSI_DEBUG_MAX_CMD_LEN;
  195. errsts = resp_inquiry(cmd, target, buff, bufflen, devip);
  196. break;
  197. case REQUEST_SENSE: /* mandatory */
  198. /* Since this driver indicates autosense by placing the
  199.  * sense buffer in the scsi_cmnd structure in the response
  200.  * (when CHECK_CONDITION is set), the mid level shouldn't
  201.  * need to call REQUEST_SENSE */
  202. if (devip) {
  203. sbuff = devip->sense_buff;
  204. memcpy(buff, sbuff, (bufflen < SDEBUG_SENSE_LEN) ? 
  205.      bufflen : SDEBUG_SENSE_LEN);
  206. mk_sense_buffer(devip, 0, 0x0, 0, 7);
  207. } else {
  208. memset(buff, 0, bufflen);
  209. buff[0] = 0x70;
  210. }
  211. break;
  212. case START_STOP:
  213. errsts = check_reset(SCpnt, devip);
  214. break;
  215. case ALLOW_MEDIUM_REMOVAL:
  216. if ((errsts = check_reset(SCpnt, devip)))
  217. break;
  218. if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
  219. printk("tMedium removal %sn",
  220.        cmd[4] ? "inhibited" : "enabled");
  221. break;
  222. case SEND_DIAGNOSTIC:     /* mandatory */
  223. memset(buff, 0, bufflen);
  224. break;
  225. case TEST_UNIT_READY:     /* mandatory */
  226. memset(buff, 0, bufflen);
  227. break;
  228.         case RESERVE:
  229. errsts = check_reset(SCpnt, devip);
  230. memset(buff, 0, bufflen);
  231.                 break;
  232.         case RESERVE_10:
  233. errsts = check_reset(SCpnt, devip);
  234. memset(buff, 0, bufflen);
  235.                 break;
  236.         case RELEASE:
  237. errsts = check_reset(SCpnt, devip);
  238. memset(buff, 0, bufflen);
  239.                 break;
  240.         case RELEASE_10:
  241. errsts = check_reset(SCpnt, devip);
  242. memset(buff, 0, bufflen);
  243.                 break;
  244. case READ_CAPACITY:
  245. errsts = check_reset(SCpnt, devip);
  246. memset(buff, 0, bufflen);
  247. if (bufflen > 7) {
  248. capac = CAPACITY - 1;
  249. buff[0] = (capac >> 24);
  250. buff[1] = (capac >> 16) & 0xff;
  251. buff[2] = (capac >> 8) & 0xff;
  252. buff[3] = capac & 0xff;
  253. buff[6] = (SECT_SIZE_PER(target) >> 8) & 0xff;
  254. buff[7] = SECT_SIZE_PER(target) & 0xff;
  255. }
  256. break;
  257. case SCSI_CMD_READ_16: /* SBC-2 */
  258. case READ_12:
  259. case READ_10:
  260. case READ_6:
  261. if ((errsts = check_reset(SCpnt, devip)))
  262. break;
  263. upper_blk = 0;
  264. if ((*cmd) == SCSI_CMD_READ_16) {
  265. upper_blk = cmd[5] + (cmd[4] << 8) + 
  266.     (cmd[3] << 16) + (cmd[2] << 24);
  267. block = cmd[9] + (cmd[8] << 8) + 
  268. (cmd[7] << 16) + (cmd[6] << 24);
  269. num = cmd[13] + (cmd[12] << 8) + 
  270. (cmd[11] << 16) + (cmd[10] << 24);
  271. } else if ((*cmd) == READ_12) {
  272. block = cmd[5] + (cmd[4] << 8) + 
  273. (cmd[3] << 16) + (cmd[2] << 24);
  274. num = cmd[9] + (cmd[8] << 8) + 
  275. (cmd[7] << 16) + (cmd[6] << 24);
  276. } else if ((*cmd) == READ_10) {
  277. block = cmd[5] + (cmd[4] << 8) + 
  278. (cmd[3] << 16) + (cmd[2] << 24);
  279. num = cmd[8] + (cmd[7] << 8);
  280. } else {
  281. block = cmd[3] + (cmd[2] << 8) + 
  282. ((cmd[1] & 0x1f) << 16);
  283. num = cmd[4];
  284. }
  285. errsts = resp_read(SCpnt, upper_blk, block, num, devip);
  286. break;
  287. case REPORT_LUNS:
  288. errsts = resp_report_luns(cmd, buff, bufflen, devip);
  289. break;
  290. case SCSI_CMD_WRITE_16: /* SBC-2 */
  291. case WRITE_12:
  292. case WRITE_10:
  293. case WRITE_6:
  294. if ((errsts = check_reset(SCpnt, devip)))
  295. break;
  296. upper_blk = 0;
  297. if ((*cmd) == SCSI_CMD_WRITE_16) {
  298. upper_blk = cmd[5] + (cmd[4] << 8) + 
  299.     (cmd[3] << 16) + (cmd[2] << 24);
  300. block = cmd[9] + (cmd[8] << 8) + 
  301. (cmd[7] << 16) + (cmd[6] << 24);
  302. num = cmd[13] + (cmd[12] << 8) + 
  303. (cmd[11] << 16) + (cmd[10] << 24);
  304. } else if ((*cmd) == WRITE_12) {
  305. block = cmd[5] + (cmd[4] << 8) + 
  306. (cmd[3] << 16) + (cmd[2] << 24);
  307. num = cmd[9] + (cmd[8] << 8) + 
  308. (cmd[7] << 16) + (cmd[6] << 24);
  309. } else if ((*cmd) == WRITE_10) {
  310. block = cmd[5] + (cmd[4] << 8) + 
  311. (cmd[3] << 16) + (cmd[2] << 24);
  312. num = cmd[8] + (cmd[7] << 8);
  313. } else {
  314. block = cmd[3] + (cmd[2] << 8) + 
  315. ((cmd[1] & 0x1f) << 16);
  316. num = cmd[4];
  317. }
  318. errsts = resp_write(SCpnt, upper_blk, block, num, devip);
  319. break;
  320. case MODE_SENSE:
  321. case MODE_SENSE_10:
  322. errsts = resp_mode_sense(cmd, target, buff, bufflen, devip);
  323. break;
  324. default:
  325. #if 0
  326. printk(KERN_INFO "scsi_debug: Unsupported command, "
  327.        "opcode=0x%xn", (int)cmd[0]);
  328. #endif
  329. if ((errsts = check_reset(SCpnt, devip)))
  330. break;
  331. mk_sense_buffer(devip, ILLEGAL_REQUEST, 0x20, 0, 14);
  332. errsts = (COMMAND_COMPLETE << 8) | (CHECK_CONDITION << 1);
  333. break;
  334. }
  335. return schedule_resp(SCpnt, devip, done, errsts, scsi_debug_delay);
  336. }
  337. static int scsi_debug_ioctl(Scsi_Device *dev, int cmd, void *arg)
  338. {
  339. if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
  340. printk(KERN_INFO "scsi_debug: ioctl: cmd=0x%xn", cmd);
  341. }
  342. /* return -ENOTTY; // Unix mandates this but apps get upset */
  343. return -EINVAL;
  344. }
  345. static int check_reset(Scsi_Cmnd * SCpnt, struct sdebug_dev_info * devip)
  346. {
  347. if (devip->reset) {
  348. devip->reset = 0;
  349. mk_sense_buffer(devip, UNIT_ATTENTION, 0x29, 0, 14);
  350. return (COMMAND_COMPLETE << 8) | (CHECK_CONDITION << 1);
  351. }
  352. return 0;
  353. }
  354. #define SDEBUG_LONG_INQ_SZ 58
  355. #define SDEBUG_MAX_INQ_ARR_SZ 128
  356. static const char * vendor_id = "Linux   ";
  357. static const char * product_id = "scsi_debug      ";
  358. static const char * product_rev = "0004";
  359. static int inquiry_evpd_83(unsigned char * arr, int dev_id_num, 
  360.    const char * dev_id_str, int dev_id_str_len)
  361. {
  362. int num;
  363. /* Two identification descriptors: */
  364. /* T10 vendor identifier field format (faked) */
  365. arr[0] = 0x2; /* ASCII */
  366. arr[1] = 0x1;
  367. arr[2] = 0x0;
  368. memcpy(&arr[4], vendor_id, 8);
  369. memcpy(&arr[12], product_id, 16);
  370. memcpy(&arr[28], dev_id_str, dev_id_str_len);
  371. num = 8 + 16 + dev_id_str_len;
  372. arr[3] = num;
  373. num += 4;
  374. /* NAA IEEE registered identifier (faked) */
  375. arr[num] = 0x1; /* binary */
  376. arr[num + 1] = 0x3;
  377. arr[num + 2] = 0x0;
  378. arr[num + 3] = 0x8;
  379. arr[num + 4] = 0x51; /* ieee company id=0x123456 (faked) */
  380. arr[num + 5] = 0x23;
  381. arr[num + 6] = 0x45;
  382. arr[num + 7] = 0x60;
  383. arr[num + 8] = (dev_id_num >> 24);
  384. arr[num + 9] = (dev_id_num >> 16) & 0xff;
  385. arr[num + 10] = (dev_id_num >> 8) & 0xff;
  386. arr[num + 11] = dev_id_num & 0xff;
  387. return num + 12;
  388. }
  389. static int resp_inquiry(unsigned char * cmd, int target, unsigned char * buff,
  390. int bufflen, struct sdebug_dev_info * devip)
  391. {
  392. unsigned char pq_pdt;
  393. unsigned char arr[SDEBUG_MAX_INQ_ARR_SZ];
  394. int min_len = bufflen > SDEBUG_MAX_INQ_ARR_SZ ? 
  395. SDEBUG_MAX_INQ_ARR_SZ : bufflen;
  396. if (bufflen < cmd[4])
  397. printk(KERN_INFO "scsi_debug: inquiry: bufflen=%d "
  398.        "< alloc_length=%dn", bufflen, (int)cmd[4]);
  399. memset(buff, 0, bufflen);
  400. memset(arr, 0, SDEBUG_MAX_INQ_ARR_SZ);
  401. pq_pdt = PERIPH_DEVICE_TYPE(target);
  402. arr[0] = pq_pdt;
  403. if (0x2 & cmd[1]) {  /* CMDDT bit set */
  404. mk_sense_buffer(devip, ILLEGAL_REQUEST, 0x24, 0, 14);
  405. return (COMMAND_COMPLETE << 8) | (CHECK_CONDITION << 1);
  406. } else if (0x1 & cmd[1]) {  /* EVPD bit set */
  407. int dev_id_num, len;
  408. char dev_id_str[6];
  409. dev_id_num = ((devip->sdp->host->host_no + 1) * 1000) + 
  410.       devip->sdp->id;
  411. len = snprintf(dev_id_str, 6, "%d", dev_id_num);
  412. len = (len > 6) ? 6 : len;
  413. if (0 == cmd[2]) { /* supported vital product data pages */
  414. arr[3] = 3;
  415. arr[4] = 0x0; /* this page */
  416. arr[5] = 0x80; /* unit serial number */
  417. arr[6] = 0x83; /* device identification */
  418. } else if (0x80 == cmd[2]) { /* unit serial number */
  419. arr[1] = 0x80;
  420. arr[3] = len;
  421. memcpy(&arr[4], dev_id_str, len);
  422. } else if (0x83 == cmd[2]) { /* device identification */
  423. arr[1] = 0x83;
  424. arr[3] = inquiry_evpd_83(&arr[4], dev_id_num,
  425.  dev_id_str, len);
  426. } else {
  427. /* Illegal request, invalid field in cdb */
  428. mk_sense_buffer(devip, ILLEGAL_REQUEST, 0x24, 0, 14);
  429. return (COMMAND_COMPLETE << 8) | (CHECK_CONDITION << 1);
  430. }
  431. memcpy(buff, arr, min_len); 
  432. return 0;
  433. }
  434. /* drops through here for a standard inquiry */
  435. arr[1] = DEV_REMOVEABLE(target) ? 0x80 : 0; /* Removable disk */
  436. arr[2] = 3; /* claim SCSI 3 */
  437. arr[4] = SDEBUG_LONG_INQ_SZ - 5;
  438. arr[7] = 0x3a; /* claim: WBUS16, SYNC, LINKED + CMDQUE */
  439. memcpy(&arr[8], vendor_id, 8);
  440. memcpy(&arr[16], product_id, 16);
  441. memcpy(&arr[32], product_rev, 4);
  442. memcpy(buff, arr, min_len);
  443. return 0;
  444. }
  445. /* <<Following mode page info copied from ST318451LW>> */ 
  446. static int resp_err_recov_pg(unsigned char * p, int pcontrol, int target)
  447. { /* Read-Write Error Recovery page for mode_sense */
  448. unsigned char err_recov_pg[] = {0x1, 0xa, 0xc0, 11, 240, 0, 0, 0, 
  449. 5, 0, 0xff, 0xff};
  450. memcpy(p, err_recov_pg, sizeof(err_recov_pg));
  451. if (1 == pcontrol)
  452. memset(p + 2, 0, sizeof(err_recov_pg) - 2);
  453. return sizeof(err_recov_pg);
  454. }
  455. static int resp_disconnect_pg(unsigned char * p, int pcontrol, int target)
  456. {  /* Disconnect-Reconnect page for mode_sense */
  457. unsigned char disconnect_pg[] = {0x2, 0xe, 128, 128, 0, 10, 0, 0, 
  458.  0, 0, 0, 0, 0, 0, 0, 0};
  459. memcpy(p, disconnect_pg, sizeof(disconnect_pg));
  460. if (1 == pcontrol)
  461. memset(p + 2, 0, sizeof(disconnect_pg) - 2);
  462. return sizeof(disconnect_pg);
  463. }
  464. static int resp_format_pg(unsigned char * p, int pcontrol, int target)
  465. {       /* Format device page for mode_sense */
  466.         unsigned char format_pg[] = {0x3, 0x16, 0, 0, 0, 0, 0, 0,
  467.                                      0, 0, 0, 0, 0, 0, 0, 0,
  468.                                      0, 0, 0, 0, 0x40, 0, 0, 0};
  469.         memcpy(p, format_pg, sizeof(format_pg));
  470.         p[10] = (N_SECTOR >> 8) & 0xff;
  471.         p[11] = N_SECTOR & 0xff;
  472.         p[12] = (SECT_SIZE >> 8) & 0xff;
  473.         p[13] = SECT_SIZE & 0xff;
  474.         if (DEV_REMOVEABLE(target))
  475.                 p[20] |= 0x20; /* should agree with INQUIRY */
  476.         if (1 == pcontrol)
  477.                 memset(p + 2, 0, sizeof(format_pg) - 2);
  478.         return sizeof(format_pg);
  479. }
  480. static int resp_caching_pg(unsigned char * p, int pcontrol, int target)
  481. {  /* Caching page for mode_sense */
  482. unsigned char caching_pg[] = {0x8, 18, 0x14, 0, 0xff, 0xff, 0, 0, 
  483. 0xff, 0xff, 0xff, 0xff, 0x80, 0x14, 0, 0,     0, 0, 0, 0};
  484. memcpy(p, caching_pg, sizeof(caching_pg));
  485. if (1 == pcontrol)
  486. memset(p + 2, 0, sizeof(caching_pg) - 2);
  487. return sizeof(caching_pg);
  488. }
  489. static int resp_ctrl_m_pg(unsigned char * p, int pcontrol, int target)
  490. {  /* Control mode page for mode_sense */
  491. unsigned char ctrl_m_pg[] = {0xa, 10, 2, 0, 0, 0, 0, 0,
  492.      0, 0, 0x2, 0x4b};
  493. memcpy(p, ctrl_m_pg, sizeof(ctrl_m_pg));
  494. if (1 == pcontrol)
  495. memset(p + 2, 0, sizeof(ctrl_m_pg) - 2);
  496. return sizeof(ctrl_m_pg);
  497. }
  498. #define SDEBUG_MAX_MSENSE_SZ 256
  499. static int resp_mode_sense(unsigned char * cmd, int target,
  500.    unsigned char * buff, int bufflen,
  501.    struct sdebug_dev_info * devip)
  502. {
  503. unsigned char dbd;
  504. int pcontrol, pcode;
  505. unsigned char dev_spec;
  506. int alloc_len, msense_6, offset, len;
  507. unsigned char * ap;
  508. unsigned char arr[SDEBUG_MAX_MSENSE_SZ];
  509. int min_len = bufflen > SDEBUG_MAX_MSENSE_SZ ? 
  510. SDEBUG_MAX_MSENSE_SZ : bufflen;
  511. SCSI_LOG_LLQUEUE(3, printk("Mode sense ...(%p %d)n", buff, bufflen));
  512. dbd = cmd[1] & 0x8;
  513. pcontrol = (cmd[2] & 0xc0) >> 6;
  514. pcode = cmd[2] & 0x3f;
  515. msense_6 = (MODE_SENSE == cmd[0]);
  516. alloc_len = msense_6 ? cmd[4] : ((cmd[7] << 8) | cmd[6]);
  517. /* printk(KERN_INFO "msense: dbd=%d pcontrol=%d pcode=%d "
  518. "msense_6=%d alloc_len=%dn", dbd, pcontrol, pcode, "
  519. "msense_6, alloc_len); */
  520. if (bufflen < alloc_len)
  521. printk(KERN_INFO "scsi_debug: mode_sense: bufflen=%d "
  522.        "< alloc_length=%dn", bufflen, alloc_len);
  523. memset(buff, 0, bufflen);
  524. memset(arr, 0, SDEBUG_MAX_MSENSE_SZ);
  525. if (0x3 == pcontrol) {  /* Saving values not supported */
  526. mk_sense_buffer(devip, ILLEGAL_REQUEST, 0x39, 0, 14);
  527. return (COMMAND_COMPLETE << 8) | (CHECK_CONDITION << 1);
  528. }
  529. dev_spec = DEV_READONLY(target) ? 0x80 : 0x0;
  530. if (msense_6) {
  531. arr[2] = dev_spec;
  532. offset = 4;
  533. } else {
  534. arr[3] = dev_spec;
  535. offset = 8;
  536. }
  537. ap = arr + offset;
  538. switch (pcode) {
  539. case 0x1: /* Read-Write error recovery page, direct access */
  540. len = resp_err_recov_pg(ap, pcontrol, target);
  541. offset += len;
  542. break;
  543. case 0x2: /* Disconnect-Reconnect page, all devices */
  544. len = resp_disconnect_pg(ap, pcontrol, target);
  545. offset += len;
  546. break;
  547.         case 0x3:       /* Format device page, direct access */
  548.                 len = resp_format_pg(ap, pcontrol, target);
  549.                 offset += len;
  550.                 break;
  551. case 0x8: /* Caching page, direct access */
  552. len = resp_caching_pg(ap, pcontrol, target);
  553. offset += len;
  554. break;
  555. case 0xa: /* Control Mode page, all devices */
  556. len = resp_ctrl_m_pg(ap, pcontrol, target);
  557. offset += len;
  558. break;
  559. case 0x3f: /* Read all Mode pages */
  560. len = resp_err_recov_pg(ap, pcontrol, target);
  561. len += resp_disconnect_pg(ap + len, pcontrol, target);
  562. len += resp_caching_pg(ap + len, pcontrol, target);
  563. len += resp_ctrl_m_pg(ap + len, pcontrol, target);
  564. offset += len;
  565. break;
  566. default:
  567. mk_sense_buffer(devip, ILLEGAL_REQUEST, 0x24, 0, 14);
  568. return (COMMAND_COMPLETE << 8) | (CHECK_CONDITION << 1);
  569. }
  570. if (msense_6)
  571. arr[0] = offset - 1;
  572. else {
  573. offset -= 2;
  574. arr[0] = (offset >> 8) & 0xff; 
  575. arr[1] = offset & 0xff; 
  576. }
  577. memcpy(buff, arr, min_len);
  578. return 0;
  579. }
  580. static int resp_read(Scsi_Cmnd * SCpnt, int upper_blk, int block, int num, 
  581.      struct sdebug_dev_info * devip)
  582. {
  583.         unsigned char *buff = (unsigned char *) SCpnt->request_buffer;
  584.         int nbytes, sgcount;
  585.         struct scatterlist *sgpnt = NULL;
  586.         int bufflen = SCpnt->request_bufflen;
  587. unsigned long iflags;
  588. if (upper_blk || (block + num > CAPACITY)) {
  589. mk_sense_buffer(devip, ILLEGAL_REQUEST, 0x21, 0, 14);
  590. return (COMMAND_COMPLETE << 8) | (CHECK_CONDITION << 1);
  591. }
  592. if ((SCSI_DEBUG_OPT_MEDIUM_ERR & scsi_debug_opts) &&
  593.     (block >= OPT_MEDIUM_ERR_ADDR) && 
  594.     (block < (OPT_MEDIUM_ERR_ADDR + num))) {
  595. mk_sense_buffer(devip, MEDIUM_ERROR, 0x11, 0, 14);
  596. /* claim unrecoverable read error */
  597. return (COMMAND_COMPLETE << 8) | (CHECK_CONDITION << 1);
  598. }
  599. read_lock_irqsave(&atomic_rw, iflags);
  600.         sgcount = 0;
  601. nbytes = bufflen;
  602. /* printk(KERN_INFO "scsi_debug_read: block=%d, tot_bufflen=%dn", 
  603.        block, bufflen); */
  604. if (SCpnt->use_sg) {
  605. sgcount = 0;
  606. sgpnt = (struct scatterlist *) buff;
  607. buff = sgpnt[sgcount].address;
  608. bufflen = sgpnt[sgcount].length;
  609. }
  610. do {
  611. memcpy(buff, fake_storep + (block * SECT_SIZE), bufflen);
  612. nbytes -= bufflen;
  613. if (SCpnt->use_sg) {
  614. block += bufflen >> POW2_SECT_SIZE;
  615. sgcount++;
  616. if (nbytes) {
  617. buff = sgpnt[sgcount].address;
  618. bufflen = sgpnt[sgcount].length;
  619. }
  620. } else if (nbytes > 0)
  621. printk(KERN_WARNING "scsi_debug:resp_read: unexpected "
  622.        "nbytes=%dn", nbytes);
  623. } while (nbytes);
  624. read_unlock_irqrestore(&atomic_rw, iflags);
  625. return 0;
  626. }
  627. static int resp_write(Scsi_Cmnd * SCpnt, int upper_blk, int block, int num, 
  628.       struct sdebug_dev_info * devip)
  629. {
  630.         unsigned char *buff = (unsigned char *) SCpnt->request_buffer;
  631.         int nbytes, sgcount;
  632.         struct scatterlist *sgpnt = NULL;
  633.         int bufflen = SCpnt->request_bufflen;
  634. unsigned long iflags;
  635. if (upper_blk || (block + num > CAPACITY)) {
  636. mk_sense_buffer(devip, ILLEGAL_REQUEST, 0x21, 0, 14);
  637. return (COMMAND_COMPLETE << 8) | (CHECK_CONDITION << 1);
  638. }
  639. write_lock_irqsave(&atomic_rw, iflags);
  640.         sgcount = 0;
  641. nbytes = bufflen;
  642. if (SCpnt->use_sg) {
  643. sgcount = 0;
  644. sgpnt = (struct scatterlist *) buff;
  645. buff = sgpnt[sgcount].address;
  646. bufflen = sgpnt[sgcount].length;
  647. }
  648. do {
  649. memcpy(fake_storep + (block * SECT_SIZE), buff, bufflen);
  650. nbytes -= bufflen;
  651. if (SCpnt->use_sg) {
  652. block += bufflen >> POW2_SECT_SIZE;
  653. sgcount++;
  654. if (nbytes) {
  655. buff = sgpnt[sgcount].address;
  656. bufflen = sgpnt[sgcount].length;
  657. }
  658. } else if (nbytes > 0)
  659. printk(KERN_WARNING "scsi_debug:resp_write: "
  660.        "unexpected nbytes=%dn", nbytes);
  661. } while (nbytes);
  662. write_unlock_irqrestore(&atomic_rw, iflags);
  663. return 0;
  664. }
  665. static int resp_report_luns(unsigned char * cmd, unsigned char * buff,
  666.     int bufflen, struct sdebug_dev_info * devip)
  667. {
  668. unsigned int alloc_len;
  669. int select_report = (int)cmd[2];
  670. alloc_len = cmd[9] + (cmd[8] << 8) + (cmd[7] << 16) + (cmd[6] << 24);
  671. if ((alloc_len < 16) || (select_report > 2)) {
  672. mk_sense_buffer(devip, ILLEGAL_REQUEST, 0x24, 0, 14);
  673. return (COMMAND_COMPLETE << 8) | (CHECK_CONDITION << 1);
  674. }
  675. if (bufflen > 3) {
  676. memset(buff, 0, bufflen);
  677. buff[3] = 8;
  678. }
  679. return 0;
  680. }
  681. /* When timer goes off this function is called. */
  682. static void timer_intr_handler(unsigned long indx)
  683. {
  684. struct sdebug_queued_cmd * sqcp;
  685. unsigned int iflags;
  686. if (indx >= SCSI_DEBUG_CANQUEUE) {
  687. printk(KERN_ERR "scsi_debug:timer_intr_handler: indx too "
  688.        "largen");
  689. return;
  690. }
  691. spin_lock_irqsave(&queued_arr_lock, iflags);
  692. sqcp = &queued_arr[(int)indx];
  693. if (! sqcp->in_use) {
  694. printk(KERN_ERR "scsi_debug:timer_intr_handler: Unexpected "
  695.        "interruptn");
  696. spin_unlock_irqrestore(&queued_arr_lock, iflags);
  697. return;
  698. }
  699. sqcp->in_use = 0;
  700. if (sqcp->done_funct)
  701. sqcp->done_funct(sqcp->a_cmnd); /* callback to mid level */
  702. sqcp->done_funct = NULL;
  703. spin_unlock_irqrestore(&queued_arr_lock, iflags);
  704. }
  705. static int initialized = 0;
  706. static int num_present = 0;
  707. static const char * sdebug_proc_name = "scsi_debug";
  708. static int scsi_debug_detect(Scsi_Host_Template * tpnt)
  709. {
  710. int k, sz;
  711. if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
  712. printk(KERN_INFO "scsi_debug: detectn");
  713. if (0 == initialized) {
  714. ++initialized;
  715. sz = sizeof(struct sdebug_dev_info) * scsi_debug_num_devs;
  716. devInfop = vmalloc(sz);
  717. if (NULL == devInfop) {
  718. printk(KERN_ERR "scsi_debug_detect: out of "
  719.        "memory, 0.5n");
  720. return 0;
  721. }
  722. memset(devInfop, 0, sz);
  723. sz = STORE_SIZE;
  724. fake_storep = vmalloc(sz);
  725. if (NULL == fake_storep) {
  726. printk(KERN_ERR "scsi_debug_detect: out of memory"
  727.        ", 0n");
  728. return 0;
  729. }
  730. memset(fake_storep, 0, sz);
  731. init_all_queued();
  732. tpnt->proc_name = (char *)sdebug_proc_name;
  733. for (num_present = 0, k = 0; k < NR_HOSTS_PRESENT; k++) {
  734. if (NULL == scsi_register(tpnt, 0))
  735. printk(KERN_ERR "scsi_debug_detect: "
  736. "scsi_register failed k=%dn", k);
  737. else
  738. ++num_present;
  739. }
  740. return num_present;
  741. } else {
  742. printk(KERN_WARNING "scsi_debug_detect: called againn");
  743. return 0;
  744. }
  745. }
  746. static int num_releases = 0;
  747. static int scsi_debug_release(struct Scsi_Host * hpnt)
  748. {
  749. if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
  750. printk(KERN_INFO "scsi_debug: releasen");
  751. stop_all_queued();
  752. scsi_unregister(hpnt);
  753. if (++num_releases == num_present) {
  754. vfree(fake_storep);
  755. vfree(devInfop);
  756. }
  757. return 0;
  758. }
  759. static struct sdebug_dev_info * devInfoReg(Scsi_Device * sdp)
  760. {
  761. int k;
  762. struct sdebug_dev_info * devip;
  763. for (k = 0; k < scsi_debug_num_devs; ++k) {
  764. devip = &devInfop[k];
  765. if (devip->sdp == sdp)
  766. return devip;
  767. }
  768. for (k = 0; k < scsi_debug_num_devs; ++k) {
  769. devip = &devInfop[k];
  770. if (NULL == devip->sdp) {
  771. devip->sdp = sdp;
  772. devip->reset = 1;
  773. memset(devip->sense_buff, 0, SDEBUG_SENSE_LEN);
  774. devip->sense_buff[0] = 0x70;
  775. return devip;
  776. }
  777. }
  778. return NULL;
  779. }
  780. static void mk_sense_buffer(struct sdebug_dev_info * devip, int key, 
  781.     int asc, int asq, int inbandLen)
  782. {
  783. unsigned char * sbuff;
  784. sbuff = devip->sense_buff;
  785. memset(sbuff, 0, SDEBUG_SENSE_LEN);
  786. if (inbandLen > SDEBUG_SENSE_LEN)
  787. inbandLen = SDEBUG_SENSE_LEN;
  788. sbuff[0] = 0x70;
  789. sbuff[2] = key;
  790. sbuff[7] = (inbandLen > 7) ? (inbandLen - 8) : 0;
  791. sbuff[12] = asc;
  792. sbuff[13] = asq;
  793. }
  794. static int scsi_debug_abort(Scsi_Cmnd * SCpnt)
  795. {
  796. if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
  797. printk(KERN_INFO "scsi_debug: abortn");
  798. ++num_aborts;
  799. stop_queued_cmnd(SCpnt);
  800. return SUCCESS;
  801. }
  802. static int scsi_debug_biosparam(Disk * disk, kdev_t dev, int *info)
  803. {
  804. if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
  805. printk(KERN_INFO "scsi_debug: biosparamn");
  806. /* int size = disk->capacity; */
  807. info[0] = N_HEAD;
  808. info[1] = N_SECTOR;
  809. info[2] = N_CYLINDER;
  810. if (info[2] >= 1024)
  811. info[2] = 1024;
  812. return 0;
  813. }
  814. static int scsi_debug_device_reset(Scsi_Cmnd * SCpnt)
  815. {
  816. Scsi_Device * sdp;
  817. int k;
  818. if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
  819. printk(KERN_INFO "scsi_debug: device_resetn");
  820. ++num_dev_resets;
  821. if (SCpnt && ((sdp = SCpnt->device))) {
  822. for (k = 0; k < scsi_debug_num_devs; ++k) {
  823. if (sdp->hostdata == (devInfop + k))
  824. break;
  825. }
  826. if (k < scsi_debug_num_devs)
  827. devInfop[k].reset = 1;
  828. }
  829. return SUCCESS;
  830. }
  831. static int scsi_debug_bus_reset(Scsi_Cmnd * SCpnt)
  832. {
  833. Scsi_Device * sdp;
  834. struct Scsi_Host * hp;
  835. int k;
  836. if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
  837. printk(KERN_INFO "scsi_debug: bus_resetn");
  838. ++num_bus_resets;
  839. if (SCpnt && ((sdp = SCpnt->device)) && ((hp = sdp->host))) {
  840. for (k = 0; k < scsi_debug_num_devs; ++k) {
  841. if (hp == devInfop[k].sdp->host)
  842. devInfop[k].reset = 1;
  843. }
  844. }
  845. return SUCCESS;
  846. }
  847. static int scsi_debug_host_reset(Scsi_Cmnd * SCpnt)
  848. {
  849. int k;
  850. if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
  851. printk(KERN_INFO "scsi_debug: host_resetn");
  852. ++num_host_resets;
  853. for (k = 0; k < scsi_debug_num_devs; ++k)
  854. devInfop[k].reset = 1;
  855. stop_all_queued();
  856. return SUCCESS;
  857. }
  858. /* Returns 1 if found 'cmnd' and deleted its timer. else returns 0 */
  859. static int stop_queued_cmnd(struct scsi_cmnd * cmnd)
  860. {
  861. unsigned long iflags;
  862. int k;
  863. struct sdebug_queued_cmd * sqcp;
  864. spin_lock_irqsave(&queued_arr_lock, iflags);
  865. for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
  866. sqcp = &queued_arr[k];
  867. if (sqcp->in_use && (cmnd == sqcp->a_cmnd)) {
  868. del_timer_sync(&sqcp->cmnd_timer);
  869. sqcp->in_use = 0;
  870. sqcp->a_cmnd = NULL;
  871. break;
  872. }
  873. }
  874. spin_unlock_irqrestore(&queued_arr_lock, iflags);
  875. return (k < SCSI_DEBUG_CANQUEUE) ? 1 : 0;
  876. }
  877. /* Deletes (stops) timers of all queued commands */
  878. static void stop_all_queued(void)
  879. {
  880. unsigned long iflags;
  881. int k;
  882. struct sdebug_queued_cmd * sqcp;
  883. spin_lock_irqsave(&queued_arr_lock, iflags);
  884. for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
  885. sqcp = &queued_arr[k];
  886. if (sqcp->in_use && sqcp->a_cmnd) {
  887. del_timer_sync(&sqcp->cmnd_timer);
  888. sqcp->in_use = 0;
  889. sqcp->a_cmnd = NULL;
  890. }
  891. }
  892. spin_unlock_irqrestore(&queued_arr_lock, iflags);
  893. }
  894. /* Initializes timers in queued array */
  895. static void init_all_queued(void)
  896. {
  897. unsigned long iflags;
  898. int k;
  899. struct sdebug_queued_cmd * sqcp;
  900. spin_lock_irqsave(&queued_arr_lock, iflags);
  901. for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
  902. sqcp = &queued_arr[k];
  903. init_timer(&sqcp->cmnd_timer);
  904. sqcp->in_use = 0;
  905. sqcp->a_cmnd = NULL;
  906. }
  907. spin_unlock_irqrestore(&queued_arr_lock, iflags);
  908. }
  909. static int schedule_resp(struct scsi_cmnd * cmnd, 
  910.  struct sdebug_dev_info * devip,
  911.  done_funct_t done, int scsi_result, int delta_jiff)
  912. {
  913. int k, num; 
  914. if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts) {
  915. printk(KERN_INFO "scsi_debug: cmd ");
  916. for (k = 0, num = cmnd->cmd_len; k < num; ++k)
  917.             printk("%02x ", (int)cmnd->cmnd[k]);
  918. printk("result=0x%xn", scsi_result);
  919. }
  920. if (cmnd && devip) {
  921. /* simulate autosense by this driver */
  922. if (CHECK_CONDITION == status_byte(scsi_result))
  923. memcpy(cmnd->sense_buffer, devip->sense_buff, 
  924.        (SCSI_SENSE_BUFFERSIZE > SDEBUG_SENSE_LEN) ?
  925.        SDEBUG_SENSE_LEN : SCSI_SENSE_BUFFERSIZE);
  926. }
  927. if (delta_jiff <= 0) {
  928. if (cmnd)
  929. cmnd->result = scsi_result;
  930. if (done)
  931. done(cmnd);
  932. return 0;
  933. } else {
  934. unsigned long iflags;
  935. int k;
  936. struct sdebug_queued_cmd * sqcp = NULL;
  937. spin_lock_irqsave(&queued_arr_lock, iflags);
  938. for (k = 0; k < SCSI_DEBUG_CANQUEUE; ++k) {
  939. sqcp = &queued_arr[k];
  940. if (! sqcp->in_use)
  941. break;
  942. }
  943. if (k >= SCSI_DEBUG_CANQUEUE) {
  944. spin_unlock_irqrestore(&queued_arr_lock, iflags);
  945. printk(KERN_WARNING "scsi_debug: can_queue exceededn");
  946. return 1; /* report busy to mid level */
  947. }
  948. sqcp->in_use = 1;
  949. sqcp->a_cmnd = cmnd;
  950. sqcp->scsi_result = scsi_result;
  951. sqcp->done_funct = done;
  952. sqcp->cmnd_timer.function = timer_intr_handler;
  953. sqcp->cmnd_timer.data = k;
  954. sqcp->cmnd_timer.expires = jiffies + delta_jiff;
  955. add_timer(&sqcp->cmnd_timer);
  956. spin_unlock_irqrestore(&queued_arr_lock, iflags);
  957. return 0;
  958. }
  959. }
  960. #ifndef MODULE
  961. static int __init num_devs_setup(char *str)
  962. {   
  963.     int tmp; 
  964.     
  965.     if (get_option(&str, &tmp) == 1) {
  966.         if (tmp > 0)
  967.             scsi_debug_num_devs = tmp;
  968.         return 1;
  969.     } else {
  970.         printk(KERN_INFO "scsi_debug_num_devs: usage scsi_debug_num_devs=<n> "
  971.                "(<n> can be from 1 to around 2000)n");
  972.         return 0;
  973.     }
  974. }
  975. __setup("scsi_debug_num_devs=", num_devs_setup);
  976. static int __init dev_size_mb_setup(char *str)
  977. {   
  978.     int tmp; 
  979.     
  980.     if (get_option(&str, &tmp) == 1) {
  981.         if (tmp > 0)
  982.             scsi_debug_dev_size_mb = tmp;
  983.         return 1;
  984.     } else {
  985.         printk(KERN_INFO "scsi_debug_dev_size_mb: usage "
  986.        "scsi_debug_dev_size_mb=<n>n"
  987.                "    (<n> is number of MB ram shared by all devsn");
  988.         return 0;
  989.     }
  990. }
  991. __setup("scsi_debug_dev_size_mb=", dev_size_mb_setup);
  992. static int __init opts_setup(char *str)
  993. {   
  994.     int tmp; 
  995.     
  996.     if (get_option(&str, &tmp) == 1) {
  997.         if (tmp > 0)
  998.             scsi_debug_opts = tmp;
  999.         return 1;
  1000.     } else {
  1001.         printk(KERN_INFO "scsi_debug_opts: usage "
  1002.        "scsi_debug_opts=<n>n"
  1003.                "    (1->noise, 2->medium_error, 4->... (can be or-ed)n");
  1004.         return 0;
  1005.     }
  1006. }
  1007. __setup("scsi_debug_opts=", opts_setup);
  1008. static int __init every_nth_setup(char *str)
  1009. {
  1010.     int tmp;
  1011.     if (get_option(&str, &tmp) == 1) {
  1012.         if (tmp > 0)
  1013.             scsi_debug_every_nth = tmp;
  1014.         return 1;
  1015.     } else {
  1016.         printk(KERN_INFO "scsi_debug_every_nth: usage "
  1017.                "scsi_debug_every_nth=<n>n"
  1018.                "    timeout every nth command (when ...)n");
  1019.         return 0;
  1020.     }
  1021. }
  1022. __setup("scsi_debug_every_nth=", every_nth_setup);
  1023. static int __init delay_setup(char *str)
  1024. {
  1025.     int tmp;
  1026.     if (get_option(&str, &tmp) == 1) {
  1027. scsi_debug_delay = tmp;
  1028.         return 1;
  1029.     } else {
  1030.         printk(KERN_INFO "scsi_debug_delay: usage "
  1031.                "scsi_debug_delay=<n>n"
  1032.                "    delay response <n> jiffiesn");
  1033.         return 0;
  1034.     }
  1035. }
  1036. __setup("scsi_debug_delay=", delay_setup);
  1037. #endif
  1038. MODULE_AUTHOR("Eric Youngdale + Douglas Gilbert");
  1039. MODULE_DESCRIPTION("SCSI debug adapter driver");
  1040. MODULE_PARM(scsi_debug_num_devs, "i");
  1041. MODULE_PARM_DESC(scsi_debug_num_devs, "number of SCSI devices to simulate");
  1042. MODULE_PARM(scsi_debug_dev_size_mb, "i");
  1043. MODULE_PARM_DESC(scsi_debug_dev_size_mb, "size in MB of ram shared by devs");
  1044. MODULE_PARM(scsi_debug_opts, "i");
  1045. MODULE_PARM_DESC(scsi_debug_opts, "1->noise, 2->medium_error, 4->...");
  1046. MODULE_PARM(scsi_debug_every_nth, "i");
  1047. MODULE_PARM_DESC(scsi_debug_every_nth, "timeout every nth command(def=100)");
  1048. MODULE_PARM(scsi_debug_delay, "i");
  1049. MODULE_PARM_DESC(scsi_debug_delay, "# of jiffies to delay response(def=1)");
  1050. #ifdef MODULE_LICENSE
  1051. MODULE_LICENSE("GPL");
  1052. #endif
  1053. static char sdebug_info[256];
  1054. static const char * scsi_debug_info(struct Scsi_Host * shp)
  1055. {
  1056. sprintf(sdebug_info, "scsi_debug, %s, num_devs=%d, "
  1057. "dev_size_mb=%d, opts=0x%x", scsi_debug_version_str,
  1058. scsi_debug_num_devs, scsi_debug_dev_size_mb,
  1059. scsi_debug_opts);
  1060. return sdebug_info;
  1061. }
  1062. /* scsi_debug_proc_info
  1063.  * Used if the driver currently has no own support for /proc/scsi
  1064.  */
  1065. static int scsi_debug_proc_info(char *buffer, char **start, off_t offset,
  1066. int length, int inode, int inout)
  1067. {
  1068. int len, pos, begin;
  1069. int orig_length;
  1070. orig_length = length;
  1071. if (inout == 1) {
  1072. char arr[16];
  1073. int minLen = length > 15 ? 15 : length;
  1074. if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
  1075. return -EACCES;
  1076. memcpy(arr, buffer, minLen);
  1077. arr[minLen] = '';
  1078. if (1 != sscanf(arr, "%d", &pos))
  1079. return -EINVAL;
  1080. scsi_debug_opts = pos;
  1081. if (SCSI_DEBUG_OPT_EVERY_NTH & scsi_debug_opts)
  1082.                         scsi_debug_cmnd_count = 0;
  1083. return length;
  1084. }
  1085. begin = 0;
  1086. pos = len = sprintf(buffer, "scsi_debug adapter driver, %sn"
  1087.     "num_devs=%d, shared (ram) size=%d MB, opts=0x%x, "
  1088.     "every_nth=%d(curr:%d)n"
  1089.     "sector_size=%d bytes, cylinders=%d, heads=%d, sectors=%d, "
  1090.     "delay=%dnnumber of aborts=%d, device_reset=%d, bus_resets=%d, " 
  1091.     "host_resets=%dn",
  1092.     scsi_debug_version_str, scsi_debug_num_devs, 
  1093.     scsi_debug_dev_size_mb, scsi_debug_opts, scsi_debug_every_nth,
  1094.     scsi_debug_cmnd_count,
  1095.     SECT_SIZE, N_CYLINDER, N_HEAD, N_SECTOR, scsi_debug_delay,
  1096.     num_aborts, num_dev_resets, num_bus_resets, num_host_resets);
  1097. if (pos < offset) {
  1098. len = 0;
  1099. begin = pos;
  1100. }
  1101. *start = buffer + (offset - begin); /* Start of wanted data */
  1102. len -= (offset - begin);
  1103. if (len > length)
  1104. len = length;
  1105. return (len);
  1106. }
  1107. #include "scsi_module.c"