Message ID | 19273.998.753256.526176@pilspetsen.it.uu.se |
---|---|
State | Not Applicable |
Delegated to: | David Miller |
Headers | show |
On 01/09/2010 05:32 PM, Mikael Pettersson wrote: > When sata_promise encounters an overrun or underrun error it > translates that to a libata AC_ERR_HSM, causing a hard reset. > Since over/under-runs were thought to be rare and transient, > this action seemed reasonable. > > Unfortunately it turns out that the controller throws overrun > errors when e.g. hal polls a CD or DVD writer containing blank > media, causing long sequences of hard resets and retries before > EH finally gives up. > > This patch updates sata_promise to classify over/under-runs as > AC_ERR_OTHER instead. This allows libata EH and upper layers to > retry or fail the operation as they see fit without the disruption > caused by repeated hard resets. > > This fixes a problem using a DVD-RAM drive with sata_promise, > reported by Thomas Schorpp. I also tested it on a DVD-RW drive. > > Signed-off-by: Mikael Pettersson<mikpe@it.uu.se> > Tested-by: thomas schorpp<thomas.schorpp@googlemail.com> > --- > drivers/ata/sata_promise.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) applied -- To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff -rupN linux-2.6.33-rc3/drivers/ata/sata_promise.c linux-2.6.33-rc3.sata_promise-overrun-not-hsm/drivers/ata/sata_promise.c --- linux-2.6.33-rc3/drivers/ata/sata_promise.c 2009-12-03 12:38:32.000000000 +0100 +++ linux-2.6.33-rc3.sata_promise-overrun-not-hsm/drivers/ata/sata_promise.c 2010-01-09 16:19:29.000000000 +0100 @@ -862,7 +862,7 @@ static void pdc_error_intr(struct ata_po if (port_status & PDC_DRIVE_ERR) ac_err_mask |= AC_ERR_DEV; if (port_status & (PDC_OVERRUN_ERR | PDC_UNDERRUN_ERR)) - ac_err_mask |= AC_ERR_HSM; + ac_err_mask |= AC_ERR_OTHER; if (port_status & (PDC2_ATA_HBA_ERR | PDC2_ATA_DMA_CNT_ERR)) ac_err_mask |= AC_ERR_ATA_BUS; if (port_status & (PDC_PH_ERR | PDC_SH_ERR | PDC_DH_ERR | PDC2_HTO_ERR