ide-scsi.c 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078
  1. /*
  2. * linux/drivers/scsi/ide-scsi.c Version 0.9 Jul 4, 1999
  3. *
  4. * Copyright (C) 1996 - 1999 Gadi Oxman <gadio@netvision.net.il>
  5. */
  6. /*
  7. * Emulation of a SCSI host adapter for IDE ATAPI devices.
  8. *
  9. * With this driver, one can use the Linux SCSI drivers instead of the
  10. * native IDE ATAPI drivers.
  11. *
  12. * Ver 0.1 Dec 3 96 Initial version.
  13. * Ver 0.2 Jan 26 97 Fixed bug in cleanup_module() and added emulation
  14. * of MODE_SENSE_6/MODE_SELECT_6 for cdroms. Thanks
  15. * to Janos Farkas for pointing this out.
  16. * Avoid using bitfields in structures for m68k.
  17. * Added Scatter/Gather and DMA support.
  18. * Ver 0.4 Dec 7 97 Add support for ATAPI PD/CD drives.
  19. * Use variable timeout for each command.
  20. * Ver 0.5 Jan 2 98 Fix previous PD/CD support.
  21. * Allow disabling of SCSI-6 to SCSI-10 transformation.
  22. * Ver 0.6 Jan 27 98 Allow disabling of SCSI command translation layer
  23. * for access through /dev/sg.
  24. * Fix MODE_SENSE_6/MODE_SELECT_6/INQUIRY translation.
  25. * Ver 0.7 Dec 04 98 Ignore commands where lun != 0 to avoid multiple
  26. * detection of devices with CONFIG_SCSI_MULTI_LUN
  27. * Ver 0.8 Feb 05 99 Optical media need translation too. Reverse 0.7.
  28. * Ver 0.9 Jul 04 99 Fix a bug in SG_SET_TRANSFORM.
  29. * Ver 0.91 Jun 10 02 Fix "off by one" error in transforms
  30. * Ver 0.92 Dec 31 02 Implement new SCSI mid level API
  31. */
  32. #define IDESCSI_VERSION "0.92"
  33. #include <linux/module.h>
  34. #include <linux/types.h>
  35. #include <linux/string.h>
  36. #include <linux/kernel.h>
  37. #include <linux/mm.h>
  38. #include <linux/ioport.h>
  39. #include <linux/blkdev.h>
  40. #include <linux/errno.h>
  41. #include <linux/hdreg.h>
  42. #include <linux/slab.h>
  43. #include <linux/ide.h>
  44. #include <linux/scatterlist.h>
  45. #include <linux/delay.h>
  46. #include <linux/mutex.h>
  47. #include <linux/bitops.h>
  48. #include <asm/io.h>
  49. #include <asm/uaccess.h>
  50. #include <scsi/scsi.h>
  51. #include <scsi/scsi_cmnd.h>
  52. #include <scsi/scsi_device.h>
  53. #include <scsi/scsi_host.h>
  54. #include <scsi/scsi_tcq.h>
  55. #include <scsi/sg.h>
  56. #define IDESCSI_DEBUG_LOG 0
  57. typedef struct idescsi_pc_s {
  58. u8 c[12]; /* Actual packet bytes */
  59. int request_transfer; /* Bytes to transfer */
  60. int actually_transferred; /* Bytes actually transferred */
  61. int buffer_size; /* Size of our data buffer */
  62. struct request *rq; /* The corresponding request */
  63. u8 *buffer; /* Data buffer */
  64. u8 *current_position; /* Pointer into the above buffer */
  65. struct scatterlist *sg; /* Scatter gather table */
  66. unsigned int sg_cnt; /* Number of entries in sg */
  67. int b_count; /* Bytes transferred from current entry */
  68. struct scsi_cmnd *scsi_cmd; /* SCSI command */
  69. void (*done)(struct scsi_cmnd *); /* Scsi completion routine */
  70. unsigned long flags; /* Status/Action flags */
  71. unsigned long timeout; /* Command timeout */
  72. } idescsi_pc_t;
  73. /*
  74. * Packet command status bits.
  75. */
  76. #define PC_DMA_IN_PROGRESS 0 /* 1 while DMA in progress */
  77. #define PC_WRITING 1 /* Data direction */
  78. #define PC_TIMEDOUT 3 /* command timed out */
  79. #define PC_DMA_OK 4 /* Use DMA */
  80. /*
  81. * SCSI command transformation layer
  82. */
  83. #define IDESCSI_SG_TRANSFORM 1 /* /dev/sg transformation */
  84. /*
  85. * Log flags
  86. */
  87. #define IDESCSI_LOG_CMD 0 /* Log SCSI commands */
  88. typedef struct ide_scsi_obj {
  89. ide_drive_t *drive;
  90. ide_driver_t *driver;
  91. struct gendisk *disk;
  92. struct Scsi_Host *host;
  93. idescsi_pc_t *pc; /* Current packet command */
  94. unsigned long flags; /* Status/Action flags */
  95. unsigned long transform; /* SCSI cmd translation layer */
  96. unsigned long log; /* log flags */
  97. } idescsi_scsi_t;
  98. static DEFINE_MUTEX(idescsi_ref_mutex);
  99. static int idescsi_nocd; /* Set by module param to skip cd */
  100. #define ide_scsi_g(disk) \
  101. container_of((disk)->private_data, struct ide_scsi_obj, driver)
  102. static struct ide_scsi_obj *ide_scsi_get(struct gendisk *disk)
  103. {
  104. struct ide_scsi_obj *scsi = NULL;
  105. mutex_lock(&idescsi_ref_mutex);
  106. scsi = ide_scsi_g(disk);
  107. if (scsi)
  108. scsi_host_get(scsi->host);
  109. mutex_unlock(&idescsi_ref_mutex);
  110. return scsi;
  111. }
  112. static void ide_scsi_put(struct ide_scsi_obj *scsi)
  113. {
  114. mutex_lock(&idescsi_ref_mutex);
  115. scsi_host_put(scsi->host);
  116. mutex_unlock(&idescsi_ref_mutex);
  117. }
  118. static inline idescsi_scsi_t *scsihost_to_idescsi(struct Scsi_Host *host)
  119. {
  120. return (idescsi_scsi_t*) (&host[1]);
  121. }
  122. static inline idescsi_scsi_t *drive_to_idescsi(ide_drive_t *ide_drive)
  123. {
  124. return scsihost_to_idescsi(ide_drive->driver_data);
  125. }
  126. /*
  127. * Per ATAPI device status bits.
  128. */
  129. #define IDESCSI_DRQ_INTERRUPT 0 /* DRQ interrupt device */
  130. /*
  131. * ide-scsi requests.
  132. */
  133. #define IDESCSI_PC_RQ 90
  134. static void idescsi_discard_data (ide_drive_t *drive, unsigned int bcount)
  135. {
  136. while (bcount--)
  137. (void) HWIF(drive)->INB(IDE_DATA_REG);
  138. }
  139. static void idescsi_output_zeros (ide_drive_t *drive, unsigned int bcount)
  140. {
  141. while (bcount--)
  142. HWIF(drive)->OUTB(0, IDE_DATA_REG);
  143. }
  144. /*
  145. * PIO data transfer routines using the scatter gather table.
  146. */
  147. static void idescsi_input_buffers (ide_drive_t *drive, idescsi_pc_t *pc, unsigned int bcount)
  148. {
  149. int count;
  150. char *buf;
  151. while (bcount) {
  152. count = min(pc->sg->length - pc->b_count, bcount);
  153. if (PageHighMem(sg_page(pc->sg))) {
  154. unsigned long flags;
  155. local_irq_save(flags);
  156. buf = kmap_atomic(sg_page(pc->sg), KM_IRQ0) +
  157. pc->sg->offset;
  158. drive->hwif->atapi_input_bytes(drive,
  159. buf + pc->b_count, count);
  160. kunmap_atomic(buf - pc->sg->offset, KM_IRQ0);
  161. local_irq_restore(flags);
  162. } else {
  163. buf = sg_virt(pc->sg);
  164. drive->hwif->atapi_input_bytes(drive,
  165. buf + pc->b_count, count);
  166. }
  167. bcount -= count; pc->b_count += count;
  168. if (pc->b_count == pc->sg->length) {
  169. if (!--pc->sg_cnt)
  170. break;
  171. pc->sg = sg_next(pc->sg);
  172. pc->b_count = 0;
  173. }
  174. }
  175. if (bcount) {
  176. printk (KERN_ERR "ide-scsi: scatter gather table too small, discarding data\n");
  177. idescsi_discard_data (drive, bcount);
  178. }
  179. }
  180. static void idescsi_output_buffers (ide_drive_t *drive, idescsi_pc_t *pc, unsigned int bcount)
  181. {
  182. int count;
  183. char *buf;
  184. while (bcount) {
  185. count = min(pc->sg->length - pc->b_count, bcount);
  186. if (PageHighMem(sg_page(pc->sg))) {
  187. unsigned long flags;
  188. local_irq_save(flags);
  189. buf = kmap_atomic(sg_page(pc->sg), KM_IRQ0) +
  190. pc->sg->offset;
  191. drive->hwif->atapi_output_bytes(drive,
  192. buf + pc->b_count, count);
  193. kunmap_atomic(buf - pc->sg->offset, KM_IRQ0);
  194. local_irq_restore(flags);
  195. } else {
  196. buf = sg_virt(pc->sg);
  197. drive->hwif->atapi_output_bytes(drive,
  198. buf + pc->b_count, count);
  199. }
  200. bcount -= count; pc->b_count += count;
  201. if (pc->b_count == pc->sg->length) {
  202. if (!--pc->sg_cnt)
  203. break;
  204. pc->sg = sg_next(pc->sg);
  205. pc->b_count = 0;
  206. }
  207. }
  208. if (bcount) {
  209. printk (KERN_ERR "ide-scsi: scatter gather table too small, padding with zeros\n");
  210. idescsi_output_zeros (drive, bcount);
  211. }
  212. }
  213. static int idescsi_check_condition(ide_drive_t *drive, struct request *failed_command)
  214. {
  215. idescsi_scsi_t *scsi = drive_to_idescsi(drive);
  216. idescsi_pc_t *pc;
  217. struct request *rq;
  218. u8 *buf;
  219. /* stuff a sense request in front of our current request */
  220. pc = kzalloc(sizeof(idescsi_pc_t), GFP_ATOMIC);
  221. rq = kmalloc(sizeof(struct request), GFP_ATOMIC);
  222. buf = kzalloc(SCSI_SENSE_BUFFERSIZE, GFP_ATOMIC);
  223. if (!pc || !rq || !buf) {
  224. kfree(buf);
  225. kfree(rq);
  226. kfree(pc);
  227. return -ENOMEM;
  228. }
  229. ide_init_drive_cmd(rq);
  230. rq->special = (char *) pc;
  231. pc->rq = rq;
  232. pc->buffer = buf;
  233. pc->c[0] = REQUEST_SENSE;
  234. pc->c[4] = pc->request_transfer = pc->buffer_size = SCSI_SENSE_BUFFERSIZE;
  235. rq->cmd_type = REQ_TYPE_SENSE;
  236. pc->timeout = jiffies + WAIT_READY;
  237. /* NOTE! Save the failed packet command in "rq->buffer" */
  238. rq->buffer = (void *) failed_command->special;
  239. pc->scsi_cmd = ((idescsi_pc_t *) failed_command->special)->scsi_cmd;
  240. if (test_bit(IDESCSI_LOG_CMD, &scsi->log)) {
  241. printk ("ide-scsi: %s: queue cmd = ", drive->name);
  242. print_hex_dump(KERN_CONT, "", DUMP_PREFIX_NONE, 16, 1, pc->c,
  243. 6, 0);
  244. }
  245. rq->rq_disk = scsi->disk;
  246. return ide_do_drive_cmd(drive, rq, ide_preempt);
  247. }
  248. static int idescsi_end_request(ide_drive_t *, int, int);
  249. static ide_startstop_t
  250. idescsi_atapi_error(ide_drive_t *drive, struct request *rq, u8 stat, u8 err)
  251. {
  252. if (HWIF(drive)->INB(IDE_STATUS_REG) & (BUSY_STAT|DRQ_STAT))
  253. /* force an abort */
  254. HWIF(drive)->OUTB(WIN_IDLEIMMEDIATE,IDE_COMMAND_REG);
  255. rq->errors++;
  256. idescsi_end_request(drive, 0, 0);
  257. return ide_stopped;
  258. }
  259. static ide_startstop_t
  260. idescsi_atapi_abort(ide_drive_t *drive, struct request *rq)
  261. {
  262. #if IDESCSI_DEBUG_LOG
  263. printk(KERN_WARNING "idescsi_atapi_abort called for %lu\n",
  264. ((idescsi_pc_t *) rq->special)->scsi_cmd->serial_number);
  265. #endif
  266. rq->errors |= ERROR_MAX;
  267. idescsi_end_request(drive, 0, 0);
  268. return ide_stopped;
  269. }
  270. static int idescsi_end_request (ide_drive_t *drive, int uptodate, int nrsecs)
  271. {
  272. idescsi_scsi_t *scsi = drive_to_idescsi(drive);
  273. struct request *rq = HWGROUP(drive)->rq;
  274. idescsi_pc_t *pc = (idescsi_pc_t *) rq->special;
  275. int log = test_bit(IDESCSI_LOG_CMD, &scsi->log);
  276. struct Scsi_Host *host;
  277. int errors = rq->errors;
  278. unsigned long flags;
  279. if (!blk_special_request(rq) && !blk_sense_request(rq)) {
  280. ide_end_request(drive, uptodate, nrsecs);
  281. return 0;
  282. }
  283. ide_end_drive_cmd (drive, 0, 0);
  284. if (blk_sense_request(rq)) {
  285. idescsi_pc_t *opc = (idescsi_pc_t *) rq->buffer;
  286. if (log) {
  287. printk ("ide-scsi: %s: wrap up check %lu, rst = ", drive->name, opc->scsi_cmd->serial_number);
  288. print_hex_dump(KERN_CONT, "", DUMP_PREFIX_NONE, 16, 1,
  289. pc->buffer, 16, 0);
  290. }
  291. memcpy((void *) opc->scsi_cmd->sense_buffer, pc->buffer, SCSI_SENSE_BUFFERSIZE);
  292. kfree(pc->buffer);
  293. kfree(pc);
  294. kfree(rq);
  295. pc = opc;
  296. rq = pc->rq;
  297. pc->scsi_cmd->result = (CHECK_CONDITION << 1) |
  298. ((test_bit(PC_TIMEDOUT, &pc->flags)?DID_TIME_OUT:DID_OK) << 16);
  299. } else if (test_bit(PC_TIMEDOUT, &pc->flags)) {
  300. if (log)
  301. printk (KERN_WARNING "ide-scsi: %s: timed out for %lu\n",
  302. drive->name, pc->scsi_cmd->serial_number);
  303. pc->scsi_cmd->result = DID_TIME_OUT << 16;
  304. } else if (errors >= ERROR_MAX) {
  305. pc->scsi_cmd->result = DID_ERROR << 16;
  306. if (log)
  307. printk ("ide-scsi: %s: I/O error for %lu\n", drive->name, pc->scsi_cmd->serial_number);
  308. } else if (errors) {
  309. if (log)
  310. printk ("ide-scsi: %s: check condition for %lu\n", drive->name, pc->scsi_cmd->serial_number);
  311. if (!idescsi_check_condition(drive, rq))
  312. /* we started a request sense, so we'll be back, exit for now */
  313. return 0;
  314. pc->scsi_cmd->result = (CHECK_CONDITION << 1) | (DID_OK << 16);
  315. } else {
  316. pc->scsi_cmd->result = DID_OK << 16;
  317. }
  318. host = pc->scsi_cmd->device->host;
  319. spin_lock_irqsave(host->host_lock, flags);
  320. pc->done(pc->scsi_cmd);
  321. spin_unlock_irqrestore(host->host_lock, flags);
  322. kfree(pc);
  323. kfree(rq);
  324. scsi->pc = NULL;
  325. return 0;
  326. }
  327. static inline unsigned long get_timeout(idescsi_pc_t *pc)
  328. {
  329. return max_t(unsigned long, WAIT_CMD, pc->timeout - jiffies);
  330. }
  331. static int idescsi_expiry(ide_drive_t *drive)
  332. {
  333. idescsi_scsi_t *scsi = drive_to_idescsi(drive);
  334. idescsi_pc_t *pc = scsi->pc;
  335. #if IDESCSI_DEBUG_LOG
  336. printk(KERN_WARNING "idescsi_expiry called for %lu at %lu\n", pc->scsi_cmd->serial_number, jiffies);
  337. #endif
  338. set_bit(PC_TIMEDOUT, &pc->flags);
  339. return 0; /* we do not want the ide subsystem to retry */
  340. }
  341. /*
  342. * Our interrupt handler.
  343. */
  344. static ide_startstop_t idescsi_pc_intr (ide_drive_t *drive)
  345. {
  346. idescsi_scsi_t *scsi = drive_to_idescsi(drive);
  347. idescsi_pc_t *pc=scsi->pc;
  348. struct request *rq = pc->rq;
  349. atapi_bcount_t bcount;
  350. atapi_status_t status;
  351. atapi_ireason_t ireason;
  352. atapi_feature_t feature;
  353. unsigned int temp;
  354. #if IDESCSI_DEBUG_LOG
  355. printk (KERN_INFO "ide-scsi: Reached idescsi_pc_intr interrupt handler\n");
  356. #endif /* IDESCSI_DEBUG_LOG */
  357. if (test_bit(PC_TIMEDOUT, &pc->flags)){
  358. #if IDESCSI_DEBUG_LOG
  359. printk(KERN_WARNING "idescsi_pc_intr: got timed out packet %lu at %lu\n",
  360. pc->scsi_cmd->serial_number, jiffies);
  361. #endif
  362. /* end this request now - scsi should retry it*/
  363. idescsi_end_request (drive, 1, 0);
  364. return ide_stopped;
  365. }
  366. if (test_and_clear_bit (PC_DMA_IN_PROGRESS, &pc->flags)) {
  367. #if IDESCSI_DEBUG_LOG
  368. printk ("ide-scsi: %s: DMA complete\n", drive->name);
  369. #endif /* IDESCSI_DEBUG_LOG */
  370. pc->actually_transferred=pc->request_transfer;
  371. (void) HWIF(drive)->ide_dma_end(drive);
  372. }
  373. feature.all = 0;
  374. /* Clear the interrupt */
  375. status.all = HWIF(drive)->INB(IDE_STATUS_REG);
  376. if (!status.b.drq) {
  377. /* No more interrupts */
  378. if (test_bit(IDESCSI_LOG_CMD, &scsi->log))
  379. printk (KERN_INFO "Packet command completed, %d bytes transferred\n", pc->actually_transferred);
  380. local_irq_enable_in_hardirq();
  381. if (status.b.check)
  382. rq->errors++;
  383. idescsi_end_request (drive, 1, 0);
  384. return ide_stopped;
  385. }
  386. bcount.b.low = HWIF(drive)->INB(IDE_BCOUNTL_REG);
  387. bcount.b.high = HWIF(drive)->INB(IDE_BCOUNTH_REG);
  388. ireason.all = HWIF(drive)->INB(IDE_IREASON_REG);
  389. if (ireason.b.cod) {
  390. printk(KERN_ERR "ide-scsi: CoD != 0 in idescsi_pc_intr\n");
  391. return ide_do_reset (drive);
  392. }
  393. if (ireason.b.io) {
  394. temp = pc->actually_transferred + bcount.all;
  395. if (temp > pc->request_transfer) {
  396. if (temp > pc->buffer_size) {
  397. printk(KERN_ERR "ide-scsi: The scsi wants to "
  398. "send us more data than expected "
  399. "- discarding data\n");
  400. temp = pc->buffer_size - pc->actually_transferred;
  401. if (temp) {
  402. clear_bit(PC_WRITING, &pc->flags);
  403. if (pc->sg)
  404. idescsi_input_buffers(drive, pc, temp);
  405. else
  406. drive->hwif->atapi_input_bytes(drive, pc->current_position, temp);
  407. printk(KERN_ERR "ide-scsi: transferred %d of %d bytes\n", temp, bcount.all);
  408. }
  409. pc->actually_transferred += temp;
  410. pc->current_position += temp;
  411. idescsi_discard_data(drive, bcount.all - temp);
  412. ide_set_handler(drive, &idescsi_pc_intr, get_timeout(pc), idescsi_expiry);
  413. return ide_started;
  414. }
  415. #if IDESCSI_DEBUG_LOG
  416. printk (KERN_NOTICE "ide-scsi: The scsi wants to send us more data than expected - allowing transfer\n");
  417. #endif /* IDESCSI_DEBUG_LOG */
  418. }
  419. }
  420. if (ireason.b.io) {
  421. clear_bit(PC_WRITING, &pc->flags);
  422. if (pc->sg)
  423. idescsi_input_buffers(drive, pc, bcount.all);
  424. else
  425. HWIF(drive)->atapi_input_bytes(drive, pc->current_position, bcount.all);
  426. } else {
  427. set_bit(PC_WRITING, &pc->flags);
  428. if (pc->sg)
  429. idescsi_output_buffers (drive, pc, bcount.all);
  430. else
  431. HWIF(drive)->atapi_output_bytes(drive, pc->current_position, bcount.all);
  432. }
  433. /* Update the current position */
  434. pc->actually_transferred += bcount.all;
  435. pc->current_position += bcount.all;
  436. /* And set the interrupt handler again */
  437. ide_set_handler(drive, &idescsi_pc_intr, get_timeout(pc), idescsi_expiry);
  438. return ide_started;
  439. }
  440. static ide_startstop_t idescsi_transfer_pc(ide_drive_t *drive)
  441. {
  442. ide_hwif_t *hwif = drive->hwif;
  443. idescsi_scsi_t *scsi = drive_to_idescsi(drive);
  444. idescsi_pc_t *pc = scsi->pc;
  445. atapi_ireason_t ireason;
  446. ide_startstop_t startstop;
  447. if (ide_wait_stat(&startstop,drive,DRQ_STAT,BUSY_STAT,WAIT_READY)) {
  448. printk(KERN_ERR "ide-scsi: Strange, packet command "
  449. "initiated yet DRQ isn't asserted\n");
  450. return startstop;
  451. }
  452. ireason.all = HWIF(drive)->INB(IDE_IREASON_REG);
  453. if (!ireason.b.cod || ireason.b.io) {
  454. printk(KERN_ERR "ide-scsi: (IO,CoD) != (0,1) while "
  455. "issuing a packet command\n");
  456. return ide_do_reset (drive);
  457. }
  458. BUG_ON(HWGROUP(drive)->handler != NULL);
  459. /* Set the interrupt routine */
  460. ide_set_handler(drive, &idescsi_pc_intr, get_timeout(pc), idescsi_expiry);
  461. /* Send the actual packet */
  462. drive->hwif->atapi_output_bytes(drive, scsi->pc->c, 12);
  463. if (test_bit (PC_DMA_OK, &pc->flags)) {
  464. set_bit (PC_DMA_IN_PROGRESS, &pc->flags);
  465. hwif->dma_start(drive);
  466. }
  467. return ide_started;
  468. }
  469. static inline int idescsi_set_direction(idescsi_pc_t *pc)
  470. {
  471. switch (pc->c[0]) {
  472. case READ_6: case READ_10: case READ_12:
  473. clear_bit(PC_WRITING, &pc->flags);
  474. return 0;
  475. case WRITE_6: case WRITE_10: case WRITE_12:
  476. set_bit(PC_WRITING, &pc->flags);
  477. return 0;
  478. default:
  479. return 1;
  480. }
  481. }
  482. static int idescsi_map_sg(ide_drive_t *drive, idescsi_pc_t *pc)
  483. {
  484. ide_hwif_t *hwif = drive->hwif;
  485. struct scatterlist *sg, *scsi_sg;
  486. int segments;
  487. if (!pc->request_transfer || pc->request_transfer % 1024)
  488. return 1;
  489. if (idescsi_set_direction(pc))
  490. return 1;
  491. sg = hwif->sg_table;
  492. scsi_sg = scsi_sglist(pc->scsi_cmd);
  493. segments = scsi_sg_count(pc->scsi_cmd);
  494. if (segments > hwif->sg_max_nents)
  495. return 1;
  496. hwif->sg_nents = segments;
  497. memcpy(sg, scsi_sg, sizeof(*sg) * segments);
  498. return 0;
  499. }
  500. /*
  501. * Issue a packet command
  502. */
  503. static ide_startstop_t idescsi_issue_pc (ide_drive_t *drive, idescsi_pc_t *pc)
  504. {
  505. idescsi_scsi_t *scsi = drive_to_idescsi(drive);
  506. ide_hwif_t *hwif = drive->hwif;
  507. atapi_feature_t feature;
  508. atapi_bcount_t bcount;
  509. scsi->pc=pc; /* Set the current packet command */
  510. pc->actually_transferred=0; /* We haven't transferred any data yet */
  511. pc->current_position=pc->buffer;
  512. bcount.all = min(pc->request_transfer, 63 * 1024); /* Request to transfer the entire buffer at once */
  513. feature.all = 0;
  514. if (drive->using_dma && !idescsi_map_sg(drive, pc)) {
  515. hwif->sg_mapped = 1;
  516. feature.b.dma = !hwif->dma_setup(drive);
  517. hwif->sg_mapped = 0;
  518. }
  519. SELECT_DRIVE(drive);
  520. if (IDE_CONTROL_REG)
  521. HWIF(drive)->OUTB(drive->ctl, IDE_CONTROL_REG);
  522. HWIF(drive)->OUTB(feature.all, IDE_FEATURE_REG);
  523. HWIF(drive)->OUTB(bcount.b.high, IDE_BCOUNTH_REG);
  524. HWIF(drive)->OUTB(bcount.b.low, IDE_BCOUNTL_REG);
  525. if (feature.b.dma)
  526. set_bit(PC_DMA_OK, &pc->flags);
  527. if (test_bit(IDESCSI_DRQ_INTERRUPT, &scsi->flags)) {
  528. BUG_ON(HWGROUP(drive)->handler != NULL);
  529. ide_set_handler(drive, &idescsi_transfer_pc,
  530. get_timeout(pc), idescsi_expiry);
  531. /* Issue the packet command */
  532. HWIF(drive)->OUTB(WIN_PACKETCMD, IDE_COMMAND_REG);
  533. return ide_started;
  534. } else {
  535. /* Issue the packet command */
  536. HWIF(drive)->OUTB(WIN_PACKETCMD, IDE_COMMAND_REG);
  537. return idescsi_transfer_pc(drive);
  538. }
  539. }
  540. /*
  541. * idescsi_do_request is our request handling function.
  542. */
  543. static ide_startstop_t idescsi_do_request (ide_drive_t *drive, struct request *rq, sector_t block)
  544. {
  545. #if IDESCSI_DEBUG_LOG
  546. printk (KERN_INFO "dev: %s, cmd: %x, errors: %d\n", rq->rq_disk->disk_name,rq->cmd[0],rq->errors);
  547. printk (KERN_INFO "sector: %ld, nr_sectors: %ld, current_nr_sectors: %d\n",rq->sector,rq->nr_sectors,rq->current_nr_sectors);
  548. #endif /* IDESCSI_DEBUG_LOG */
  549. if (blk_sense_request(rq) || blk_special_request(rq)) {
  550. return idescsi_issue_pc (drive, (idescsi_pc_t *) rq->special);
  551. }
  552. blk_dump_rq_flags(rq, "ide-scsi: unsup command");
  553. idescsi_end_request (drive, 0, 0);
  554. return ide_stopped;
  555. }
  556. #ifdef CONFIG_IDE_PROC_FS
  557. static void idescsi_add_settings(ide_drive_t *drive)
  558. {
  559. idescsi_scsi_t *scsi = drive_to_idescsi(drive);
  560. /*
  561. * drive setting name read/write data type min max mul_factor div_factor data pointer set function
  562. */
  563. ide_add_setting(drive, "bios_cyl", SETTING_RW, TYPE_INT, 0, 1023, 1, 1, &drive->bios_cyl, NULL);
  564. ide_add_setting(drive, "bios_head", SETTING_RW, TYPE_BYTE, 0, 255, 1, 1, &drive->bios_head, NULL);
  565. ide_add_setting(drive, "bios_sect", SETTING_RW, TYPE_BYTE, 0, 63, 1, 1, &drive->bios_sect, NULL);
  566. ide_add_setting(drive, "transform", SETTING_RW, TYPE_INT, 0, 3, 1, 1, &scsi->transform, NULL);
  567. ide_add_setting(drive, "log", SETTING_RW, TYPE_INT, 0, 1, 1, 1, &scsi->log, NULL);
  568. }
  569. #else
  570. static inline void idescsi_add_settings(ide_drive_t *drive) { ; }
  571. #endif
  572. /*
  573. * Driver initialization.
  574. */
  575. static void idescsi_setup (ide_drive_t *drive, idescsi_scsi_t *scsi)
  576. {
  577. if (drive->id && (drive->id->config & 0x0060) == 0x20)
  578. set_bit (IDESCSI_DRQ_INTERRUPT, &scsi->flags);
  579. clear_bit(IDESCSI_SG_TRANSFORM, &scsi->transform);
  580. #if IDESCSI_DEBUG_LOG
  581. set_bit(IDESCSI_LOG_CMD, &scsi->log);
  582. #endif /* IDESCSI_DEBUG_LOG */
  583. idescsi_add_settings(drive);
  584. }
  585. static void ide_scsi_remove(ide_drive_t *drive)
  586. {
  587. struct Scsi_Host *scsihost = drive->driver_data;
  588. struct ide_scsi_obj *scsi = scsihost_to_idescsi(scsihost);
  589. struct gendisk *g = scsi->disk;
  590. scsi_remove_host(scsihost);
  591. ide_proc_unregister_driver(drive, scsi->driver);
  592. ide_unregister_region(g);
  593. drive->driver_data = NULL;
  594. g->private_data = NULL;
  595. put_disk(g);
  596. ide_scsi_put(scsi);
  597. }
  598. static int ide_scsi_probe(ide_drive_t *);
  599. #ifdef CONFIG_IDE_PROC_FS
  600. static ide_proc_entry_t idescsi_proc[] = {
  601. { "capacity", S_IFREG|S_IRUGO, proc_ide_read_capacity, NULL },
  602. { NULL, 0, NULL, NULL }
  603. };
  604. #endif
  605. static ide_driver_t idescsi_driver = {
  606. .gen_driver = {
  607. .owner = THIS_MODULE,
  608. .name = "ide-scsi",
  609. .bus = &ide_bus_type,
  610. },
  611. .probe = ide_scsi_probe,
  612. .remove = ide_scsi_remove,
  613. .version = IDESCSI_VERSION,
  614. .media = ide_scsi,
  615. .supports_dsc_overlap = 0,
  616. .do_request = idescsi_do_request,
  617. .end_request = idescsi_end_request,
  618. .error = idescsi_atapi_error,
  619. .abort = idescsi_atapi_abort,
  620. #ifdef CONFIG_IDE_PROC_FS
  621. .proc = idescsi_proc,
  622. #endif
  623. };
  624. static int idescsi_ide_open(struct inode *inode, struct file *filp)
  625. {
  626. struct gendisk *disk = inode->i_bdev->bd_disk;
  627. struct ide_scsi_obj *scsi;
  628. if (!(scsi = ide_scsi_get(disk)))
  629. return -ENXIO;
  630. return 0;
  631. }
  632. static int idescsi_ide_release(struct inode *inode, struct file *filp)
  633. {
  634. struct gendisk *disk = inode->i_bdev->bd_disk;
  635. struct ide_scsi_obj *scsi = ide_scsi_g(disk);
  636. ide_scsi_put(scsi);
  637. return 0;
  638. }
  639. static int idescsi_ide_ioctl(struct inode *inode, struct file *file,
  640. unsigned int cmd, unsigned long arg)
  641. {
  642. struct block_device *bdev = inode->i_bdev;
  643. struct ide_scsi_obj *scsi = ide_scsi_g(bdev->bd_disk);
  644. return generic_ide_ioctl(scsi->drive, file, bdev, cmd, arg);
  645. }
  646. static struct block_device_operations idescsi_ops = {
  647. .owner = THIS_MODULE,
  648. .open = idescsi_ide_open,
  649. .release = idescsi_ide_release,
  650. .ioctl = idescsi_ide_ioctl,
  651. };
  652. static int idescsi_slave_configure(struct scsi_device * sdp)
  653. {
  654. /* Configure detected device */
  655. sdp->use_10_for_rw = 1;
  656. sdp->use_10_for_ms = 1;
  657. scsi_adjust_queue_depth(sdp, MSG_SIMPLE_TAG, sdp->host->cmd_per_lun);
  658. return 0;
  659. }
  660. static const char *idescsi_info (struct Scsi_Host *host)
  661. {
  662. return "SCSI host adapter emulation for IDE ATAPI devices";
  663. }
  664. static int idescsi_ioctl (struct scsi_device *dev, int cmd, void __user *arg)
  665. {
  666. idescsi_scsi_t *scsi = scsihost_to_idescsi(dev->host);
  667. if (cmd == SG_SET_TRANSFORM) {
  668. if (arg)
  669. set_bit(IDESCSI_SG_TRANSFORM, &scsi->transform);
  670. else
  671. clear_bit(IDESCSI_SG_TRANSFORM, &scsi->transform);
  672. return 0;
  673. } else if (cmd == SG_GET_TRANSFORM)
  674. return put_user(test_bit(IDESCSI_SG_TRANSFORM, &scsi->transform), (int __user *) arg);
  675. return -EINVAL;
  676. }
  677. static int idescsi_queue (struct scsi_cmnd *cmd,
  678. void (*done)(struct scsi_cmnd *))
  679. {
  680. struct Scsi_Host *host = cmd->device->host;
  681. idescsi_scsi_t *scsi = scsihost_to_idescsi(host);
  682. ide_drive_t *drive = scsi->drive;
  683. struct request *rq = NULL;
  684. idescsi_pc_t *pc = NULL;
  685. if (!drive) {
  686. scmd_printk (KERN_ERR, cmd, "drive not present\n");
  687. goto abort;
  688. }
  689. scsi = drive_to_idescsi(drive);
  690. pc = kmalloc (sizeof (idescsi_pc_t), GFP_ATOMIC);
  691. rq = kmalloc (sizeof (struct request), GFP_ATOMIC);
  692. if (rq == NULL || pc == NULL) {
  693. printk (KERN_ERR "ide-scsi: %s: out of memory\n", drive->name);
  694. goto abort;
  695. }
  696. memset (pc->c, 0, 12);
  697. pc->flags = 0;
  698. pc->rq = rq;
  699. memcpy (pc->c, cmd->cmnd, cmd->cmd_len);
  700. pc->buffer = NULL;
  701. pc->sg = scsi_sglist(cmd);
  702. pc->sg_cnt = scsi_sg_count(cmd);
  703. pc->b_count = 0;
  704. pc->request_transfer = pc->buffer_size = scsi_bufflen(cmd);
  705. pc->scsi_cmd = cmd;
  706. pc->done = done;
  707. pc->timeout = jiffies + cmd->timeout_per_command;
  708. if (test_bit(IDESCSI_LOG_CMD, &scsi->log)) {
  709. printk ("ide-scsi: %s: que %lu, cmd = ", drive->name, cmd->serial_number);
  710. print_hex_dump(KERN_CONT, "", DUMP_PREFIX_NONE, 16, 1,
  711. cmd->cmnd, cmd->cmd_len, 0);
  712. if (memcmp(pc->c, cmd->cmnd, cmd->cmd_len)) {
  713. printk ("ide-scsi: %s: que %lu, tsl = ", drive->name, cmd->serial_number);
  714. print_hex_dump(KERN_CONT, "", DUMP_PREFIX_NONE, 16, 1,
  715. pc->c, 12, 0);
  716. }
  717. }
  718. ide_init_drive_cmd (rq);
  719. rq->special = (char *) pc;
  720. rq->cmd_type = REQ_TYPE_SPECIAL;
  721. spin_unlock_irq(host->host_lock);
  722. rq->rq_disk = scsi->disk;
  723. (void) ide_do_drive_cmd (drive, rq, ide_end);
  724. spin_lock_irq(host->host_lock);
  725. return 0;
  726. abort:
  727. kfree (pc);
  728. kfree (rq);
  729. cmd->result = DID_ERROR << 16;
  730. done(cmd);
  731. return 0;
  732. }
  733. static int idescsi_eh_abort (struct scsi_cmnd *cmd)
  734. {
  735. idescsi_scsi_t *scsi = scsihost_to_idescsi(cmd->device->host);
  736. ide_drive_t *drive = scsi->drive;
  737. int busy;
  738. int ret = FAILED;
  739. /* In idescsi_eh_abort we try to gently pry our command from the ide subsystem */
  740. if (test_bit(IDESCSI_LOG_CMD, &scsi->log))
  741. printk (KERN_WARNING "ide-scsi: abort called for %lu\n", cmd->serial_number);
  742. if (!drive) {
  743. printk (KERN_WARNING "ide-scsi: Drive not set in idescsi_eh_abort\n");
  744. WARN_ON(1);
  745. goto no_drive;
  746. }
  747. /* First give it some more time, how much is "right" is hard to say :-( */
  748. busy = ide_wait_not_busy(HWIF(drive), 100); /* FIXME - uses mdelay which causes latency? */
  749. if (test_bit(IDESCSI_LOG_CMD, &scsi->log))
  750. printk (KERN_WARNING "ide-scsi: drive did%s become ready\n", busy?" not":"");
  751. spin_lock_irq(&ide_lock);
  752. /* If there is no pc running we're done (our interrupt took care of it) */
  753. if (!scsi->pc) {
  754. ret = SUCCESS;
  755. goto ide_unlock;
  756. }
  757. /* It's somewhere in flight. Does ide subsystem agree? */
  758. if (scsi->pc->scsi_cmd->serial_number == cmd->serial_number && !busy &&
  759. elv_queue_empty(drive->queue) && HWGROUP(drive)->rq != scsi->pc->rq) {
  760. /*
  761. * FIXME - not sure this condition can ever occur
  762. */
  763. printk (KERN_ERR "ide-scsi: cmd aborted!\n");
  764. if (blk_sense_request(scsi->pc->rq))
  765. kfree(scsi->pc->buffer);
  766. kfree(scsi->pc->rq);
  767. kfree(scsi->pc);
  768. scsi->pc = NULL;
  769. ret = SUCCESS;
  770. }
  771. ide_unlock:
  772. spin_unlock_irq(&ide_lock);
  773. no_drive:
  774. if (test_bit(IDESCSI_LOG_CMD, &scsi->log))
  775. printk (KERN_WARNING "ide-scsi: abort returns %s\n", ret == SUCCESS?"success":"failed");
  776. return ret;
  777. }
  778. static int idescsi_eh_reset (struct scsi_cmnd *cmd)
  779. {
  780. struct request *req;
  781. idescsi_scsi_t *scsi = scsihost_to_idescsi(cmd->device->host);
  782. ide_drive_t *drive = scsi->drive;
  783. int ready = 0;
  784. int ret = SUCCESS;
  785. /* In idescsi_eh_reset we forcefully remove the command from the ide subsystem and reset the device. */
  786. if (test_bit(IDESCSI_LOG_CMD, &scsi->log))
  787. printk (KERN_WARNING "ide-scsi: reset called for %lu\n", cmd->serial_number);
  788. if (!drive) {
  789. printk (KERN_WARNING "ide-scsi: Drive not set in idescsi_eh_reset\n");
  790. WARN_ON(1);
  791. return FAILED;
  792. }
  793. spin_lock_irq(cmd->device->host->host_lock);
  794. spin_lock(&ide_lock);
  795. if (!scsi->pc || (req = scsi->pc->rq) != HWGROUP(drive)->rq || !HWGROUP(drive)->handler) {
  796. printk (KERN_WARNING "ide-scsi: No active request in idescsi_eh_reset\n");
  797. spin_unlock(&ide_lock);
  798. spin_unlock_irq(cmd->device->host->host_lock);
  799. return FAILED;
  800. }
  801. /* kill current request */
  802. blkdev_dequeue_request(req);
  803. end_that_request_last(req, 0);
  804. if (blk_sense_request(req))
  805. kfree(scsi->pc->buffer);
  806. kfree(scsi->pc);
  807. scsi->pc = NULL;
  808. kfree(req);
  809. /* now nuke the drive queue */
  810. while ((req = elv_next_request(drive->queue))) {
  811. blkdev_dequeue_request(req);
  812. end_that_request_last(req, 0);
  813. }
  814. HWGROUP(drive)->rq = NULL;
  815. HWGROUP(drive)->handler = NULL;
  816. HWGROUP(drive)->busy = 1; /* will set this to zero when ide reset finished */
  817. spin_unlock(&ide_lock);
  818. ide_do_reset(drive);
  819. /* ide_do_reset starts a polling handler which restarts itself every 50ms until the reset finishes */
  820. do {
  821. spin_unlock_irq(cmd->device->host->host_lock);
  822. msleep(50);
  823. spin_lock_irq(cmd->device->host->host_lock);
  824. } while ( HWGROUP(drive)->handler );
  825. ready = drive_is_ready(drive);
  826. HWGROUP(drive)->busy--;
  827. if (!ready) {
  828. printk (KERN_ERR "ide-scsi: reset failed!\n");
  829. ret = FAILED;
  830. }
  831. spin_unlock_irq(cmd->device->host->host_lock);
  832. return ret;
  833. }
  834. static int idescsi_bios(struct scsi_device *sdev, struct block_device *bdev,
  835. sector_t capacity, int *parm)
  836. {
  837. idescsi_scsi_t *idescsi = scsihost_to_idescsi(sdev->host);
  838. ide_drive_t *drive = idescsi->drive;
  839. if (drive->bios_cyl && drive->bios_head && drive->bios_sect) {
  840. parm[0] = drive->bios_head;
  841. parm[1] = drive->bios_sect;
  842. parm[2] = drive->bios_cyl;
  843. }
  844. return 0;
  845. }
  846. static struct scsi_host_template idescsi_template = {
  847. .module = THIS_MODULE,
  848. .name = "idescsi",
  849. .info = idescsi_info,
  850. .slave_configure = idescsi_slave_configure,
  851. .ioctl = idescsi_ioctl,
  852. .queuecommand = idescsi_queue,
  853. .eh_abort_handler = idescsi_eh_abort,
  854. .eh_host_reset_handler = idescsi_eh_reset,
  855. .bios_param = idescsi_bios,
  856. .can_queue = 40,
  857. .this_id = -1,
  858. .sg_tablesize = 256,
  859. .cmd_per_lun = 5,
  860. .max_sectors = 128,
  861. .use_clustering = DISABLE_CLUSTERING,
  862. .emulated = 1,
  863. .proc_name = "ide-scsi",
  864. };
  865. static int ide_scsi_probe(ide_drive_t *drive)
  866. {
  867. idescsi_scsi_t *idescsi;
  868. struct Scsi_Host *host;
  869. struct gendisk *g;
  870. static int warned;
  871. int err = -ENOMEM;
  872. if (!warned && drive->media == ide_cdrom) {
  873. printk(KERN_WARNING "ide-scsi is deprecated for cd burning! Use ide-cd and give dev=/dev/hdX as device\n");
  874. warned = 1;
  875. }
  876. if (idescsi_nocd && drive->media == ide_cdrom)
  877. return -ENODEV;
  878. if (!strstr("ide-scsi", drive->driver_req) ||
  879. !drive->present ||
  880. drive->media == ide_disk ||
  881. !(host = scsi_host_alloc(&idescsi_template,sizeof(idescsi_scsi_t))))
  882. return -ENODEV;
  883. g = alloc_disk(1 << PARTN_BITS);
  884. if (!g)
  885. goto out_host_put;
  886. ide_init_disk(g, drive);
  887. host->max_id = 1;
  888. #if IDESCSI_DEBUG_LOG
  889. if (drive->id->last_lun)
  890. printk(KERN_NOTICE "%s: id->last_lun=%u\n", drive->name, drive->id->last_lun);
  891. #endif
  892. if ((drive->id->last_lun & 0x7) != 7)
  893. host->max_lun = (drive->id->last_lun & 0x7) + 1;
  894. else
  895. host->max_lun = 1;
  896. drive->driver_data = host;
  897. idescsi = scsihost_to_idescsi(host);
  898. idescsi->drive = drive;
  899. idescsi->driver = &idescsi_driver;
  900. idescsi->host = host;
  901. idescsi->disk = g;
  902. g->private_data = &idescsi->driver;
  903. ide_proc_register_driver(drive, &idescsi_driver);
  904. err = 0;
  905. idescsi_setup(drive, idescsi);
  906. g->fops = &idescsi_ops;
  907. ide_register_region(g);
  908. err = scsi_add_host(host, &drive->gendev);
  909. if (!err) {
  910. scsi_scan_host(host);
  911. return 0;
  912. }
  913. /* fall through on error */
  914. ide_unregister_region(g);
  915. ide_proc_unregister_driver(drive, &idescsi_driver);
  916. put_disk(g);
  917. out_host_put:
  918. scsi_host_put(host);
  919. return err;
  920. }
  921. static int __init init_idescsi_module(void)
  922. {
  923. return driver_register(&idescsi_driver.gen_driver);
  924. }
  925. static void __exit exit_idescsi_module(void)
  926. {
  927. driver_unregister(&idescsi_driver.gen_driver);
  928. }
  929. module_param(idescsi_nocd, int, 0600);
  930. MODULE_PARM_DESC(idescsi_nocd, "Disable handling of CD-ROMs so they may be driven by ide-cd");
  931. module_init(init_idescsi_module);
  932. module_exit(exit_idescsi_module);
  933. MODULE_LICENSE("GPL");