Re: sata_nv times out for BD-ROM iHOS104-08

From: Tejun Heo
Date: Wed Feb 17 2010 - 20:42:33 EST


On 02/18/2010 01:14 AM, Cengiz GÃnay wrote:
> 2010/2/1 Tejun Heo <tj@xxxxxxxxxx>:
>
>> Can you please attach full dmesg w/ the patch applied w/o any kernel
>> parameter? I'm curious where the hda warnings are coming from. Is
>> generic IDE driver loaded?
>
> The dmesg snippet I attached last time was w/o any kernel parameters.
> This time I'm attaching the full dmesg output. hda is my other DVD-RW
> drive, I'm not sure what the warnings mean. ide_core is loaded, but
> not the ide-generic or ide-pci-generic modules, although they are
> available. Would you like me to force them to load?

No, I was concerned because there were a few cases where two drivers
were attached to the same controller but I don't think that's possible
here.

Does the attached patch make any difference?

Thanks.

--
tejun
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
index 730ef3c..d189b48 100644
--- a/drivers/ata/libata-sff.c
+++ b/drivers/ata/libata-sff.c
@@ -1070,6 +1070,7 @@ static void atapi_pio_bytes(struct ata_queued_cmd *qc)
struct ata_eh_info *ehi = &dev->link->eh_info;
unsigned int ireason, bc_lo, bc_hi, bytes;
int i_write, do_write = (qc->tf.flags & ATA_TFLAG_WRITE) ? 1 : 0;
+ u8 stat;

/* Abuse qc->result_tf for temp storage of intermediate TF
* here to save some kernel stack usage.
@@ -1099,6 +1100,21 @@ static void atapi_pio_bytes(struct ata_queued_cmd *qc)

if (unlikely(__atapi_pio_bytes(qc, bytes)))
goto err_out;
+
+ /* this really should be done only after the final transfer is complete */
+ stat = ata_sff_altstatus(ap);
+ if (stat & ATA_DRQ) {
+ int count;
+
+ ata_port_printk(ap, KERN_INFO, "stat=%x after atapi_pio_bytes\n", stat);
+
+ for (count = 0; (ap->ops->sff_check_status(ap) & ATA_DRQ)
+ && count < 65536; count += 2)
+ ioread16(ap->ioaddr.data_addr);
+ if (count)
+ ata_port_printk(ap, KERN_DEBUG,
+ "drained %d bytes to clear DRQ.\n", count);
+ }
ata_sff_sync(ap); /* flush */

return;