Hello, again. On Wed, Jul 13, 2011 at 03:34:25PM +0200, tj@xxxxxxxxxx wrote: > I see. Yeah, it doesn't seem to be PHY flickering. It looks like > IDENTIFY is failing before disk finishes spinning up, which isn't the > correct behavior. SRST is supposed to wait for disk spin up > completion. I don't know why sil24 softreset is failing without > waiting for spinup. I'll see whether I can reproduce the problem > here. I played with it a bit but couldn't reproduce the problem; however, PMP EH does lack per-device retry back-off. On host ports, when reset/identification fails for whatever reason, retry is backed off such that even if controller/device interaction is faulty during spin up, EH always retries after sufficient time is given to the device. With PMP EH, this logic is missing partly because PMP EH sometimes already takes too long and partly because tracking the timestamps seemed a bit complex during the initial implementation. So, this definitely contributes to why PMP EH fails to work around the misinteraction between the drive and port and should probably be improved, but let's also find out why the controller isn't waiting for the drive after issuing IDENTIFY. Can you please apply the following patch, reproduce the problem and report the kernel log? Thank you. diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c index 06c564e..cbd3475 100644 --- a/drivers/ata/sata_sil24.c +++ b/drivers/ata/sata_sil24.c @@ -896,6 +896,9 @@ static unsigned int sil24_qc_issue(struct ata_queued_cmd *qc) dma_addr_t paddr; void __iomem *activate; + if (qc->tf.command == ATA_CMD_ID_ATA) + ata_dev_printk(qc->dev, KERN_INFO, "issuing IDENTIFY\n"); + paddr = pp->cmd_block_dma + tag * sizeof(*pp->cmd_block); activate = port + PORT_CMD_ACTIVATE + tag * 8; @@ -1081,9 +1084,12 @@ static void sil24_error_intr(struct ata_port *ap) } /* record error info */ - if (qc) + if (qc) { + if (qc->tf.command == ATA_CMD_ID_ATA) + ata_dev_printk(qc->dev, KERN_INFO, "IDENTIFY failed, irq_stat=%#0x cerr=%u\n", + irq_stat, cerr); qc->err_mask |= err_mask; - else + } else ehi->err_mask |= err_mask; ehi->action |= action; -- To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html