Re: 2.6.18 - AHCI detection pauses excessively

From: Tejun Heo
Date: Sun Nov 26 2006 - 22:36:22 EST


On Wed, Nov 15, 2006 at 11:22:23AM -0700, Berck E. Nash wrote:
> Tejun Heo wrote:
> >Hmmm.. Can you try with the attached patch applied? Also, please turn
> >on kernel config 'Kernel Hacking -> Show timing info on printks' and
> >report boot dmesg.
>
> Looks like you forgot to attach the patch, so I couldn't test it:)
> Here's the section with the annoying hang with timing info. I noticed
> that there are similar messages repeated later, but without as much
> hang, so I've attached the entire dmesg as well, in case it's of any help.

Yeah, I did and forgot about this thread too. Sorry. This is on the
top of my to-do list now. I'm attaching the patch. TIA.

--
tejun
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 3fd7c79..89aa449 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -2669,20 +2669,26 @@ int sata_phy_debounce(struct ata_port *a

/* DET stable? */
if (cur == last) {
+ printk("SATA PHY: stable DET=%x\n", cur);
if (cur == 1 && time_before(jiffies, timeout))
continue;
- if (time_after(jiffies, last_jiffies + duration))
+ if (time_after(jiffies, last_jiffies + duration)) {
+ printk("SATA PHY: debounced\n");
return 0;
+ }
continue;
}

+ printk("SATA PHY: unstable DET=%x->%x\n", last, cur);
/* unstable, start over */
last = cur;
last_jiffies = jiffies;

/* check timeout */
- if (time_after(jiffies, timeout))
+ if (time_after(jiffies, timeout)) {
+ printk("SATA PHY: failed to debounce\n");
return -EBUSY;
+ }
}
}

diff --git a/include/linux/libata.h b/include/linux/libata.h
index 9080789..8220ca3 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -689,10 +689,11 @@ extern const struct ata_port_operations
static inline const unsigned long *
sata_ehc_deb_timing(struct ata_eh_context *ehc)
{
- if (ehc->i.flags & ATA_EHI_HOTPLUGGED)
+/* if (ehc->i.flags & ATA_EHI_HOTPLUGGED)
return sata_deb_timing_hotplug;
else
- return sata_deb_timing_normal;
+ return sata_deb_timing_normal;*/
+ return sata_deb_timing_long;
}

static inline int ata_port_is_dummy(struct ata_port *ap)