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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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;

[Index of Archives]     [Linux Filesystems]     [Linux SCSI]     [Linux RAID]     [Git]     [Kernel Newbies]     [Linux Newbie]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Samba]     [Device Mapper]

  Powered by Linux