Tejun Heo wrote: > Mark Paulus wrote: >> Yes, I am. It's a SD-ADSAIDE-S1, with a sil3611ct80 chip on board. >> >> My question would be, what makes the 2.6.22 kernel different enough >> than the 2.6.18 kernel that this setup is causing problems in .22. >> Is .18 masking the problems, or is .22 just looking at things with >> tighter tolerences, so it's more sensitive? > > That's to be investigated. There's another report of similar problem. > Can you please add yourself to the following bugzilla and add your log > there? > > http://bugzilla.kernel.org/show_bug.cgi?id=9505 In case you don't like bugzilla, I'm attaching proposed patch here too. Please test the attached patch and report whether it fixes the problem. Thanks. -- tejun
Index: work/drivers/ata/sata_sil.c =================================================================== --- work.orig/drivers/ata/sata_sil.c +++ work/drivers/ata/sata_sil.c @@ -390,23 +390,19 @@ static void sil_host_intr(struct ata_por sil_scr_read(ap, SCR_ERROR, &serror); sil_scr_write(ap, SCR_ERROR, serror); - /* Trigger hotplug and accumulate SError only if the - * port isn't already frozen. Otherwise, PHY events - * during hardreset makes controllers with broken SIEN - * repeat probing needlessly. + /* Sometimes spurious interrupts occur, double check + * it's PHYRDY CHG. */ - if (!(ap->pflags & ATA_PFLAG_FROZEN)) { - ata_ehi_hotplugged(&ap->link.eh_info); + if (serror & SERR_PHYRDY_CHG) { ap->link.eh_info.serror |= serror; + goto freeze; } - goto freeze; + if (!(bmdma2 & SIL_DMA_COMPLETE)) + return; } - if (unlikely(!qc)) - goto freeze; - - if (unlikely(qc->tf.flags & ATA_TFLAG_POLLING)) { + if (unlikely(!qc || (qc->tf.flags & ATA_TFLAG_POLLING))) { /* this sometimes happens, just clear IRQ */ ata_chk_status(ap); return; Index: work/drivers/ata/libata-core.c =================================================================== --- work.orig/drivers/ata/libata-core.c +++ work/drivers/ata/libata-core.c @@ -3923,6 +3923,7 @@ void ata_std_postreset(struct ata_link * /* clear SError */ if (sata_scr_read(link, SCR_ERROR, &serror) == 0) sata_scr_write(link, SCR_ERROR, serror); + link->eh_info.serror = 0; /* is double-select really necessary? */ if (classes[0] != ATA_DEV_NONE)