* libata vs ATAPI
@ 2004-10-12 20:21 Bartlomiej Zolnierkiewicz
2004-10-12 20:50 ` Jeff Garzik
0 siblings, 1 reply; 16+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2004-10-12 20:21 UTC (permalink / raw)
To: Jeff Garzik, Linux IDE
Hi Jeff,
Is libata currently supposed to work with ATAPI
(I know about lack of REQUEST_SENSE support)?
With ATA_ENABLE_ATAPI defined INQUIRY seems to succeed for my
TOSHIBA ODD-DVD SD-R6372 but empty info is printed by SCSI layer.
Then REPORT_LUNS errors out (dev_stat = 0x51)...
I've noticed that DMA is used by default for all packet commands
which doesn't seem to be wise thing to do so I disabled it.
Unfortunately it doesn't help because atapi_pio_sector() assumes
transfer length to be % SECTOR_SIZE and transfer length for INQUIRY
is mere 36 bytes so this fails.
This comment in atapi_pio_sector():
/* make sure byte count is multiple of sector size; not
* required by standard (warning! warning!), but IDE driver
* does this to simplify things a bit. We are lazy, and
* follow suit.
*/
if (bytes & (ATA_SECT_SIZE - 1))
goto err_out;
looks very suspicious because ide-cd and ide-scsi seem
to be doing this but only for READ/WRITE commands.
Also ATAPI-SCSI emulation is still missing in libata-scsi.c.
I'm sure you know more about what needs to be done.
Could you make some nice, detailed TODO? :-)
Thanks,
Bartlomiej
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: libata vs ATAPI
2004-10-12 20:21 libata vs ATAPI Bartlomiej Zolnierkiewicz
@ 2004-10-12 20:50 ` Jeff Garzik
2004-10-12 21:17 ` Bartlomiej Zolnierkiewicz
0 siblings, 1 reply; 16+ messages in thread
From: Jeff Garzik @ 2004-10-12 20:50 UTC (permalink / raw)
To: Bartlomiej Zolnierkiewicz; +Cc: Linux IDE
Bartlomiej Zolnierkiewicz wrote:
> Hi Jeff,
>
> Is libata currently supposed to work with ATAPI
> (I know about lack of REQUEST_SENSE support)?
>
> With ATA_ENABLE_ATAPI defined INQUIRY seems to succeed for my
> TOSHIBA ODD-DVD SD-R6372 but empty info is printed by SCSI layer.
I get this too
> Then REPORT_LUNS errors out (dev_stat = 0x51)...
This doesn't surprise me, I bet that many ATAPI devices might not like
REPORT LUNS
> I've noticed that DMA is used by default for all packet commands
> which doesn't seem to be wise thing to do so I disabled it.
DMA is _never_ used for packet commands, only for packet data.
libata enables DMA at the maximum level supported by both the device and
host controller. I definitely want to do this by default.
> Unfortunately it doesn't help because atapi_pio_sector() assumes
> transfer length to be % SECTOR_SIZE and transfer length for INQUIRY
> is mere 36 bytes so this fails.
Yes, you are welcome to fix this assumption. :)
> Also ATAPI-SCSI emulation is still missing in libata-scsi.c.
I wish to minimize the emulation. That means no read/write emulation,
just modify INQUIRY to report MMC, and do auto-sense (as it is presented
to the SCSI layer).
> I'm sure you know more about what needs to be done.
> Could you make some nice, detailed TODO? :-)
Pat LaVarre had IOmega ATAPI devices working, once he hand-hacked
REQUEST SENSE. As for to-do list, I think this email covers it. Here's
a summary...
* possibly avoid REPORT LUNS for ATAPI devices
* when check condition occurs, automatically request sense inside
driver, and put that data into the sense buffer
* make INQUIRY report SCSI version MMC-3 (or later...)
* support strange sector sizes
Jeff
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: libata vs ATAPI
2004-10-12 20:50 ` Jeff Garzik
@ 2004-10-12 21:17 ` Bartlomiej Zolnierkiewicz
2004-10-12 21:22 ` Jeff Garzik
` (2 more replies)
0 siblings, 3 replies; 16+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2004-10-12 21:17 UTC (permalink / raw)
To: Jeff Garzik; +Cc: Linux IDE, Jens Axboe
On Tue, 12 Oct 2004 16:50:20 -0400, Jeff Garzik <jgarzik@pobox.com> wrote:
> Bartlomiej Zolnierkiewicz wrote:
> > Hi Jeff,
> >
> > Is libata currently supposed to work with ATAPI
> > (I know about lack of REQUEST_SENSE support)?
> >
> > With ATA_ENABLE_ATAPI defined INQUIRY seems to succeed for my
> > TOSHIBA ODD-DVD SD-R6372 but empty info is printed by SCSI layer.
>
> I get this too
OTOH ide-scsi gets correct INQUIRY output
> > Then REPORT_LUNS errors out (dev_stat = 0x51)...
>
> This doesn't surprise me, I bet that many ATAPI devices might not like
> REPORT LUNS
Yes, it is not defined in original ATAPI spec.
> > I've noticed that DMA is used by default for all packet commands
> > which doesn't seem to be wise thing to do so I disabled it.
>
> DMA is _never_ used for packet commands, only for packet data.
Yep, I know.
> libata enables DMA at the maximum level supported by both the device and
> host controller. I definitely want to do this by default.
Me too but I suppose that there are many devices which don't like it
(otherwise restrictions in ide-cd and ide-scsi make no sense).
Jens?
> > Unfortunately it doesn't help because atapi_pio_sector() assumes
> > transfer length to be % SECTOR_SIZE and transfer length for INQUIRY
> > is mere 36 bytes so this fails.
>
> Yes, you are welcome to fix this assumption. :)
Another bug in this area: bcount is set to 64 * 1024 (0xFFFF) but
ATA/ATAPI spec defines max bcount as 0xFFFE and there must
be some reason why ide-scsi limits it to 63 * 1024 and ide-cd to
32 * 1024.
> > Also ATAPI-SCSI emulation is still missing in libata-scsi.c.
>
> I wish to minimize the emulation. That means no read/write emulation,
> just modify INQUIRY to report MMC, and do auto-sense (as it is presented
> to the SCSI layer).
>
>
> > I'm sure you know more about what needs to be done.
> > Could you make some nice, detailed TODO? :-)
>
> Pat LaVarre had IOmega ATAPI devices working, once he hand-hacked
> REQUEST SENSE. As for to-do list, I think this email covers it. Here's
> a summary...
>
> * possibly avoid REPORT LUNS for ATAPI devices
> * when check condition occurs, automatically request sense inside
> driver, and put that data into the sense buffer
> * make INQUIRY report SCSI version MMC-3 (or later...)
> * support strange sector sizes
>
> Jeff
>
Thanks,
Bartlomiej
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: libata vs ATAPI
2004-10-12 21:17 ` Bartlomiej Zolnierkiewicz
@ 2004-10-12 21:22 ` Jeff Garzik
2004-10-12 21:36 ` Bartlomiej Zolnierkiewicz
2004-10-12 21:30 ` Jeff Garzik
2004-10-14 7:13 ` Jens Axboe
2 siblings, 1 reply; 16+ messages in thread
From: Jeff Garzik @ 2004-10-12 21:22 UTC (permalink / raw)
To: Bartlomiej Zolnierkiewicz; +Cc: Linux IDE, Jens Axboe
On Tue, Oct 12, 2004 at 11:17:38PM +0200, Bartlomiej Zolnierkiewicz wrote:
> On Tue, 12 Oct 2004 16:50:20 -0400, Jeff Garzik <jgarzik@pobox.com> wrote:
> > Bartlomiej Zolnierkiewicz wrote:
> > > Hi Jeff,
> > >
> > > Is libata currently supposed to work with ATAPI
> > > (I know about lack of REQUEST_SENSE support)?
> > >
> > > With ATA_ENABLE_ATAPI defined INQUIRY seems to succeed for my
> > > TOSHIBA ODD-DVD SD-R6372 but empty info is printed by SCSI layer.
> >
> > I get this too
>
> OTOH ide-scsi gets correct INQUIRY output
I spoke incorrect, I meant to say the exact opposite...!
I get correct INQUIRY output.
> > libata enables DMA at the maximum level supported by both the device and
> > host controller. I definitely want to do this by default.
>
> Me too but I suppose that there are many devices which don't like it
> (otherwise restrictions in ide-cd and ide-scsi make no sense).
>
> Jens?
The IDE layer currently figures that all my test CD-ROMs support DMA, so
I would like libata to do that too ;-)
> > > Unfortunately it doesn't help because atapi_pio_sector() assumes
> > > transfer length to be % SECTOR_SIZE and transfer length for INQUIRY
> > > is mere 36 bytes so this fails.
> >
> > Yes, you are welcome to fix this assumption. :)
>
> Another bug in this area: bcount is set to 64 * 1024 (0xFFFF) but
> ATA/ATAPI spec defines max bcount as 0xFFFE and there must
> be some reason why ide-scsi limits it to 63 * 1024 and ide-cd to
> 32 * 1024.
bcount should be set to 8K (one SATA FIS) for PIO,
and 0xFFFF for DMA. It's not used for DMA.
Where is this code in libata?
Jeff
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: libata vs ATAPI
2004-10-12 21:17 ` Bartlomiej Zolnierkiewicz
2004-10-12 21:22 ` Jeff Garzik
@ 2004-10-12 21:30 ` Jeff Garzik
2004-10-12 21:39 ` Bartlomiej Zolnierkiewicz
2004-10-14 7:13 ` Jens Axboe
2 siblings, 1 reply; 16+ messages in thread
From: Jeff Garzik @ 2004-10-12 21:30 UTC (permalink / raw)
To: Bartlomiej Zolnierkiewicz; +Cc: Linux IDE, Jens Axboe
Another for the todo list:
ATAPI PIO data xfer should _read_ bcount, to determine how many bytes to
read. I forget if I do this, but I don't think so...
Jeff
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: libata vs ATAPI
2004-10-12 21:22 ` Jeff Garzik
@ 2004-10-12 21:36 ` Bartlomiej Zolnierkiewicz
2004-10-12 21:45 ` Jeff Garzik
0 siblings, 1 reply; 16+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2004-10-12 21:36 UTC (permalink / raw)
To: Jeff Garzik; +Cc: Linux IDE, Jens Axboe
On Tue, 12 Oct 2004 17:22:25 -0400, Jeff Garzik <jgarzik@pobox.com> wrote:
> On Tue, Oct 12, 2004 at 11:17:38PM +0200, Bartlomiej Zolnierkiewicz wrote:
> > On Tue, 12 Oct 2004 16:50:20 -0400, Jeff Garzik <jgarzik@pobox.com> wrote:
> > > Bartlomiej Zolnierkiewicz wrote:
> > > > Hi Jeff,
> > > >
> > > > Is libata currently supposed to work with ATAPI
> > > > (I know about lack of REQUEST_SENSE support)?
> > > >
> > > > With ATA_ENABLE_ATAPI defined INQUIRY seems to succeed for my
> > > > TOSHIBA ODD-DVD SD-R6372 but empty info is printed by SCSI layer.
> > >
> > > I get this too
> >
> > OTOH ide-scsi gets correct INQUIRY output
>
> I spoke incorrect, I meant to say the exact opposite...!
>
> I get correct INQUIRY output.
damn ;-)
> > > libata enables DMA at the maximum level supported by both the device and
> > > host controller. I definitely want to do this by default.
> >
> > Me too but I suppose that there are many devices which don't like it
> > (otherwise restrictions in ide-cd and ide-scsi make no sense).
> >
> > Jens?
>
> The IDE layer currently figures that all my test CD-ROMs support DMA, so
> I would like libata to do that too ;-)
INQUIRY is done in PIO in ide-scsi and it works for this device
> > > > Unfortunately it doesn't help because atapi_pio_sector() assumes
> > > > transfer length to be % SECTOR_SIZE and transfer length for INQUIRY
> > > > is mere 36 bytes so this fails.
> > >
> > > Yes, you are welcome to fix this assumption. :)
> >
> > Another bug in this area: bcount is set to 64 * 1024 (0xFFFF) but
> > ATA/ATAPI spec defines max bcount as 0xFFFE and there must
> > be some reason why ide-scsi limits it to 63 * 1024 and ide-cd to
> > 32 * 1024.
>
> bcount should be set to 8K (one SATA FIS) for PIO,
> and 0xFFFF for DMA. It's not used for DMA.
According to ATA/ATAPI-5 spec bcount is ignored for
non-PIO transfers.
It sets bcount also for no-data which seems wrong.
> Where is this code in libata?
atapi_xlat() in libata-scsi.c
Bartlomiej
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: libata vs ATAPI
2004-10-12 21:30 ` Jeff Garzik
@ 2004-10-12 21:39 ` Bartlomiej Zolnierkiewicz
2004-10-12 21:46 ` Jeff Garzik
0 siblings, 1 reply; 16+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2004-10-12 21:39 UTC (permalink / raw)
To: Jeff Garzik; +Cc: Linux IDE, Jens Axboe
On Tue, 12 Oct 2004 17:30:06 -0400, Jeff Garzik <jgarzik@pobox.com> wrote:
> Another for the todo list:
>
> ATAPI PIO data xfer should _read_ bcount, to determine how many bytes to
> read. I forget if I do this, but I don't think so...
atapi_pio_sector() does it...
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: libata vs ATAPI
2004-10-12 21:36 ` Bartlomiej Zolnierkiewicz
@ 2004-10-12 21:45 ` Jeff Garzik
2004-10-12 23:03 ` Bartlomiej Zolnierkiewicz
2004-10-15 13:13 ` Jens Axboe
0 siblings, 2 replies; 16+ messages in thread
From: Jeff Garzik @ 2004-10-12 21:45 UTC (permalink / raw)
To: Bartlomiej Zolnierkiewicz; +Cc: Linux IDE, Jens Axboe
Bartlomiej Zolnierkiewicz wrote:
> INQUIRY is done in PIO in ide-scsi and it works for this device
I wouldn't mind doing non-read/write commands with PIO. As long as the
"fast path" commands are done via DMA...
>>>>>Unfortunately it doesn't help because atapi_pio_sector() assumes
>>>>>transfer length to be % SECTOR_SIZE and transfer length for INQUIRY
>>>>>is mere 36 bytes so this fails.
>>>>
>>>>Yes, you are welcome to fix this assumption. :)
>>>
>>>Another bug in this area: bcount is set to 64 * 1024 (0xFFFF) but
>>>ATA/ATAPI spec defines max bcount as 0xFFFE and there must
>>>be some reason why ide-scsi limits it to 63 * 1024 and ide-cd to
>>>32 * 1024.
>>
>>bcount should be set to 8K (one SATA FIS) for PIO,
>>and 0xFFFF for DMA. It's not used for DMA.
>
>
> According to ATA/ATAPI-5 spec bcount is ignored for
> non-PIO transfers.
Right. In practice for some host controllers it should be set to
0xffff. It looks like I should change atapi_xlat() to do that.
> It sets bcount also for no-data which seems wrong.
well some "non-data" commands could still return sense, so I preferred
to err on the side of caution.
>>Where is this code in libata?
>
> atapi_xlat() in libata-scsi.c
I do not see code in atapi_xlat() that sets bcount to 0xffff?
Jeff
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: libata vs ATAPI
2004-10-12 21:39 ` Bartlomiej Zolnierkiewicz
@ 2004-10-12 21:46 ` Jeff Garzik
0 siblings, 0 replies; 16+ messages in thread
From: Jeff Garzik @ 2004-10-12 21:46 UTC (permalink / raw)
To: Bartlomiej Zolnierkiewicz; +Cc: Linux IDE, Jens Axboe
Bartlomiej Zolnierkiewicz wrote:
> On Tue, 12 Oct 2004 17:30:06 -0400, Jeff Garzik <jgarzik@pobox.com> wrote:
>
>>Another for the todo list:
>>
>>ATAPI PIO data xfer should _read_ bcount, to determine how many bytes to
>>read. I forget if I do this, but I don't think so...
>
>
> atapi_pio_sector() does it...
Ah yes. Well, don't add that to the todo list then :)
Jeff
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: libata vs ATAPI
2004-10-12 21:45 ` Jeff Garzik
@ 2004-10-12 23:03 ` Bartlomiej Zolnierkiewicz
2004-10-15 13:13 ` Jens Axboe
1 sibling, 0 replies; 16+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2004-10-12 23:03 UTC (permalink / raw)
To: Jeff Garzik; +Cc: Linux IDE, Jens Axboe
On Tue, 12 Oct 2004 17:45:55 -0400, Jeff Garzik <jgarzik@pobox.com> wrote:
> Bartlomiej Zolnierkiewicz wrote:
> > INQUIRY is done in PIO in ide-scsi and it works for this device
>
> I wouldn't mind doing non-read/write commands with PIO. As long as the
> "fast path" commands are done via DMA...
Exactly my POV.
> >>>>>Unfortunately it doesn't help because atapi_pio_sector() assumes
> >>>>>transfer length to be % SECTOR_SIZE and transfer length for INQUIRY
> >>>>>is mere 36 bytes so this fails.
> >>>>
> >>>>Yes, you are welcome to fix this assumption. :)
> >>>
> >>>Another bug in this area: bcount is set to 64 * 1024 (0xFFFF) but
> >>>ATA/ATAPI spec defines max bcount as 0xFFFE and there must
> >>>be some reason why ide-scsi limits it to 63 * 1024 and ide-cd to
> >>>32 * 1024.
> >>
> >>bcount should be set to 8K (one SATA FIS) for PIO,
> >>and 0xFFFF for DMA. It's not used for DMA.
> >
> >
> > According to ATA/ATAPI-5 spec bcount is ignored for
> > non-PIO transfers.
>
> Right. In practice for some host controllers it should be set to
> 0xffff. It looks like I should change atapi_xlat() to do that.
>
>
> > It sets bcount also for no-data which seems wrong.
>
> well some "non-data" commands could still return sense, so I preferred
> to err on the side of caution.
>
>
> >>Where is this code in libata?
> >
> > atapi_xlat() in libata-scsi.c
>
> I do not see code in atapi_xlat() that sets bcount to 0xffff?
My mistake, it is setting bcount to 8K (SATA FIS). Sorry for noise.
> Jeff
>
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: libata vs ATAPI
2004-10-12 21:17 ` Bartlomiej Zolnierkiewicz
2004-10-12 21:22 ` Jeff Garzik
2004-10-12 21:30 ` Jeff Garzik
@ 2004-10-14 7:13 ` Jens Axboe
2004-10-14 19:19 ` Bartlomiej Zolnierkiewicz
2 siblings, 1 reply; 16+ messages in thread
From: Jens Axboe @ 2004-10-14 7:13 UTC (permalink / raw)
To: Bartlomiej Zolnierkiewicz; +Cc: Jeff Garzik, Linux IDE
On Tue, Oct 12 2004, Bartlomiej Zolnierkiewicz wrote:
> > libata enables DMA at the maximum level supported by both the device and
> > host controller. I definitely want to do this by default.
>
> Me too but I suppose that there are many devices which don't like it
> (otherwise restrictions in ide-cd and ide-scsi make no sense).
>
> Jens?
There's no precedens for doing > 128KiB on ATAPI in Linux. Recently Pat
at Iomega tested 512/1024KiB requests and it worked fine. So if the
device works, we should be golden...
--
Jens Axboe
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: libata vs ATAPI
2004-10-14 7:13 ` Jens Axboe
@ 2004-10-14 19:19 ` Bartlomiej Zolnierkiewicz
2004-10-14 21:15 ` Bartlomiej Zolnierkiewicz
0 siblings, 1 reply; 16+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2004-10-14 19:19 UTC (permalink / raw)
To: Jens Axboe; +Cc: Jeff Garzik, Linux IDE
On Thu, 14 Oct 2004 09:13:13 +0200, Jens Axboe <axboe@suse.de> wrote:
> On Tue, Oct 12 2004, Bartlomiej Zolnierkiewicz wrote:
> > > libata enables DMA at the maximum level supported by both the device and
> > > host controller. I definitely want to do this by default.
> >
> > Me too but I suppose that there are many devices which don't like it
> > (otherwise restrictions in ide-cd and ide-scsi make no sense).
> >
> > Jens?
>
> There's no precedens for doing > 128KiB on ATAPI in Linux. Recently Pat
> at Iomega tested 512/1024KiB requests and it worked fine. So if the
> device works, we should be golden...
Cool...
Jeff, I added arbitrary size ATAPI PIO support and it didn't help :(
(still empty info from SCSI layer)
Patch below:
diff -Nru a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c
--- a/drivers/scsi/libata-core.c 2004-10-14 21:18:29 +02:00
+++ b/drivers/scsi/libata-core.c 2004-10-14 21:18:29 +02:00
@@ -2223,11 +2223,48 @@
kunmap(page);
}
-static void atapi_pio_sector(struct ata_queued_cmd *qc)
+static void __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes)
+{
+ int do_write = (qc->tf.flags & ATA_TFLAG_WRITE);
+ struct scatterlist *sg = qc->sg;
+ struct ata_port *ap = qc->ap;
+ struct page *page;
+ unsigned char *buf;
+ unsigned int count;
+
+ if (qc->curbytes == qc->nbytes - bytes)
+ ap->pio_task_state = PIO_ST_LAST;
+
+next_sg:
+ sg = &sg[qc->cursg];
+ count = min(sg_dma_len(sg) - qc->cursg_ofs, bytes);
+ buf = kmap(sg->page) + sg->offset + qc->cursg_ofs;
+
+ bytes -= count;
+ qc->curbytes += count;
+ qc->cursg_ofs += count;
+
+ if (qc->cursg_ofs == sg_dma_len(sg)) {
+ qc->cursg++;
+ qc->cursg_ofs = 0;
+ }
+
+ DPRINTK("data %s\n", qc->tf.flags & ATA_TFLAG_WRITE ? "write" : "read");
+
+ /* do the actual data transfer */
+ ata_data_xfer(ap, buf, count, do_write);
+
+ kunmap(page);
+
+ if (bytes)
+ goto next_sg;
+}
+
+static void atapi_pio_bytes(struct ata_queued_cmd *qc)
{
struct ata_port *ap = qc->ap;
struct ata_device *dev = qc->dev;
- unsigned int i, ireason, bc_lo, bc_hi, bytes;
+ unsigned int ireason, bc_lo, bc_hi, bytes;
int i_write, do_write = (qc->tf.flags & ATA_TFLAG_WRITE) ? 1 : 0;
ap->ops->tf_read(ap, &qc->tf);
@@ -2245,16 +2282,7 @@
if (do_write != i_write)
goto err_out;
- /* make sure byte count is multiple of sector size; not
- * required by standard (warning! warning!), but IDE driver
- * does this to simplify things a bit. We are lazy, and
- * follow suit.
- */
- if (bytes & (ATA_SECT_SIZE - 1))
- goto err_out;
-
- for (i = 0; i < (bytes >> 9); i++)
- ata_pio_sector(qc);
+ __atapi_pio_bytes(qc, bytes);
return;
@@ -2305,7 +2333,7 @@
assert(qc != NULL);
if (is_atapi_taskfile(&qc->tf))
- atapi_pio_sector(qc);
+ atapi_pio_bytes(qc);
else
ata_pio_sector(qc);
}
@@ -2512,6 +2540,7 @@
qc->dev = dev;
qc->cursect = qc->cursg = qc->cursg_ofs = 0;
qc->nsect = 0;
+ qc->nbytes = qc->nbytes = 0;
ata_tf_init(ap, &qc->tf, dev->devno);
diff -Nru a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c
--- a/drivers/scsi/libata-scsi.c 2004-10-14 21:18:29 +02:00
+++ b/drivers/scsi/libata-scsi.c 2004-10-14 21:18:29 +02:00
@@ -1464,6 +1464,9 @@
qc->tf.command = ATA_CMD_PACKET;
+ if (scsicmd[0] == INQUIRY)
+ using_pio = 1;
+
/* no data, or PIO data xfer */
if (using_pio || nodata) {
if (nodata)
@@ -1485,6 +1488,8 @@
qc->tf.feature |= ATAPI_DMADIR;
#endif
}
+
+ qc->nbytes = cmd->bufflen;
return 0;
}
diff -Nru a/include/linux/libata.h b/include/linux/libata.h
--- a/include/linux/libata.h 2004-10-14 21:18:29 +02:00
+++ b/include/linux/libata.h 2004-10-14 21:18:29 +02:00
@@ -231,6 +231,10 @@
unsigned int nsect;
unsigned int cursect;
+
+ unsigned int nbytes;
+ unsigned int curbytes;
+
unsigned int cursg;
unsigned int cursg_ofs;
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: libata vs ATAPI
2004-10-14 19:19 ` Bartlomiej Zolnierkiewicz
@ 2004-10-14 21:15 ` Bartlomiej Zolnierkiewicz
2004-10-15 5:00 ` Jeff Garzik
0 siblings, 1 reply; 16+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2004-10-14 21:15 UTC (permalink / raw)
To: Jens Axboe; +Cc: Jeff Garzik, Linux IDE
On Thu, 14 Oct 2004 21:19:25 +0200, Bartlomiej Zolnierkiewicz
<bzolnier@gmail.com> wrote:
>
>
> On Thu, 14 Oct 2004 09:13:13 +0200, Jens Axboe <axboe@suse.de> wrote:
> > On Tue, Oct 12 2004, Bartlomiej Zolnierkiewicz wrote:
> > > > libata enables DMA at the maximum level supported by both the device and
> > > > host controller. I definitely want to do this by default.
> > >
> > > Me too but I suppose that there are many devices which don't like it
> > > (otherwise restrictions in ide-cd and ide-scsi make no sense).
> > >
> > > Jens?
> >
> > There's no precedens for doing > 128KiB on ATAPI in Linux. Recently Pat
> > at Iomega tested 512/1024KiB requests and it worked fine. So if the
> > device works, we should be golden...
>
> Cool...
>
> Jeff, I added arbitrary size ATAPI PIO support and it didn't help :(
> (still empty info from SCSI layer)
>
> Patch below:
It has a small bug...
> diff -Nru a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c
> --- a/drivers/scsi/libata-core.c 2004-10-14 21:18:29 +02:00
> +++ b/drivers/scsi/libata-core.c 2004-10-14 21:18:29 +02:00
> @@ -2223,11 +2223,48 @@
> kunmap(page);
> }
>
> -static void atapi_pio_sector(struct ata_queued_cmd *qc)
> +static void __atapi_pio_bytes(struct ata_queued_cmd *qc, unsigned int bytes)
> +{
> + int do_write = (qc->tf.flags & ATA_TFLAG_WRITE);
> + struct scatterlist *sg = qc->sg;
> + struct ata_port *ap = qc->ap;
> + struct page *page;
> + unsigned char *buf;
> + unsigned int count;
> +
> + if (qc->curbytes == qc->nbytes - bytes)
> + ap->pio_task_state = PIO_ST_LAST;
> +
> +next_sg:
> + sg = &sg[qc->cursg];
> + count = min(sg_dma_len(sg) - qc->cursg_ofs, bytes);
page = sg->page;
should be here
I also found the real bug (feature?): ata_scsi_rbuf_get() clears
INQUIRY buffer for ATAPI when called from atapi_qc_complete().
With the patch below INQUIRY w/ DMA works just fine for me
("Vendor" and "Model" are correctly reported).
Now time for REPORT_LUNS...
[libata] fix INQUIRY command handling for ATAPI
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
diff -Nru a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c
--- a/drivers/scsi/libata-scsi.c 2004-10-14 23:04:45 +02:00
+++ b/drivers/scsi/libata-scsi.c 2004-10-14 23:04:45 +02:00
@@ -895,7 +895,6 @@
buflen = cmd->request_bufflen;
}
- memset(buf, 0, buflen);
*buf_out = buf;
return buflen;
}
@@ -944,6 +943,7 @@
struct scsi_cmnd *cmd = args->cmd;
buflen = ata_scsi_rbuf_get(cmd, &rbuf);
+ memset(rbuf, 0, buflen);
rc = actor(args, rbuf, buflen);
ata_scsi_rbuf_put(cmd);
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: libata vs ATAPI
2004-10-14 21:15 ` Bartlomiej Zolnierkiewicz
@ 2004-10-15 5:00 ` Jeff Garzik
0 siblings, 0 replies; 16+ messages in thread
From: Jeff Garzik @ 2004-10-15 5:00 UTC (permalink / raw)
To: Bartlomiej Zolnierkiewicz; +Cc: Jens Axboe, Linux IDE
Bartlomiej Zolnierkiewicz wrote:
> [libata] fix INQUIRY command handling for ATAPI
>
> Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
applied to libata-dev-2.6.
> page = sg->page;
>
> should be here
>
> I also found the real bug (feature?): ata_scsi_rbuf_get() clears
> INQUIRY buffer for ATAPI when called from atapi_qc_complete().
>
> With the patch below INQUIRY w/ DMA works just fine for me
> ("Vendor" and "Model" are correctly reported).
Can you please resend your first patch,
1) assuming that this "fix INQUIRY command handling" patch is applied
2) removing the following piece of code:
+ if (scsicmd[0] == INQUIRY)
+ using_pio = 1;
Thanks,
Jeff
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: libata vs ATAPI
2004-10-12 21:45 ` Jeff Garzik
2004-10-12 23:03 ` Bartlomiej Zolnierkiewicz
@ 2004-10-15 13:13 ` Jens Axboe
2004-10-15 17:17 ` Jeff Garzik
1 sibling, 1 reply; 16+ messages in thread
From: Jens Axboe @ 2004-10-15 13:13 UTC (permalink / raw)
To: Jeff Garzik; +Cc: Bartlomiej Zolnierkiewicz, Linux IDE
On Tue, Oct 12 2004, Jeff Garzik wrote:
> Bartlomiej Zolnierkiewicz wrote:
> >INQUIRY is done in PIO in ide-scsi and it works for this device
>
> I wouldn't mind doing non-read/write commands with PIO. As long as the
> "fast path" commands are done via DMA...
If by non-read/write you mean non-READ_X/WRITE_X, then I disagree very
much. You just made cd ripping unbearable. SG_IO will use dma on ide-cd
whenever possible right now.
--
Jens Axboe
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: libata vs ATAPI
2004-10-15 13:13 ` Jens Axboe
@ 2004-10-15 17:17 ` Jeff Garzik
0 siblings, 0 replies; 16+ messages in thread
From: Jeff Garzik @ 2004-10-15 17:17 UTC (permalink / raw)
To: Jens Axboe; +Cc: Bartlomiej Zolnierkiewicz, Linux IDE
Jens Axboe wrote:
> On Tue, Oct 12 2004, Jeff Garzik wrote:
>
>>Bartlomiej Zolnierkiewicz wrote:
>>
>>>INQUIRY is done in PIO in ide-scsi and it works for this device
>>
>>I wouldn't mind doing non-read/write commands with PIO. As long as the
>>"fast path" commands are done via DMA...
>
>
> If by non-read/write you mean non-READ_X/WRITE_X, then I disagree very
> much. You just made cd ripping unbearable. SG_IO will use dma on ide-cd
> whenever possible right now.
Bart fixed that, awaiting patch resend...
Jeff
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2004-10-15 17:17 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-10-12 20:21 libata vs ATAPI Bartlomiej Zolnierkiewicz
2004-10-12 20:50 ` Jeff Garzik
2004-10-12 21:17 ` Bartlomiej Zolnierkiewicz
2004-10-12 21:22 ` Jeff Garzik
2004-10-12 21:36 ` Bartlomiej Zolnierkiewicz
2004-10-12 21:45 ` Jeff Garzik
2004-10-12 23:03 ` Bartlomiej Zolnierkiewicz
2004-10-15 13:13 ` Jens Axboe
2004-10-15 17:17 ` Jeff Garzik
2004-10-12 21:30 ` Jeff Garzik
2004-10-12 21:39 ` Bartlomiej Zolnierkiewicz
2004-10-12 21:46 ` Jeff Garzik
2004-10-14 7:13 ` Jens Axboe
2004-10-14 19:19 ` Bartlomiej Zolnierkiewicz
2004-10-14 21:15 ` Bartlomiej Zolnierkiewicz
2004-10-15 5:00 ` Jeff Garzik
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).