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