Patchwork HSM violations from ATA PACKET cmd ABRT errors in initial comms with LG GH22 SATA DVDRW

login
register
mail settings
Submitter Mikael Pettersson
Date Jan. 3, 2010, 9:36 p.m.
Message ID <19265.3552.13209.914969@pilspetsen.it.uu.se>
Download mbox | patch
Permalink /patch/42039/
State Not Applicable
Delegated to: David Miller
Headers show

Comments

Mikael Pettersson - Jan. 3, 2010, 9:36 p.m.
Mikael Pettersson writes:
 > Robert Hancock writes:
 >  > On 12/27/2009 02:37 PM, thomas schorpp wrote:
 >  > > LG GH22NS40 NL01 (possibly Renesas chipset)
 >  > > VIA8237 SATA (produces basically same errors), Promise SATA II 150 20579
 >  > > HBAs.
 >  > >
 >  > > Linux 2.6.32.2
 >  > > hal polling
 >  > > devkit polling
 >  > > wodim
 >  > > growisofs
 >  > >
 >  > > port_status 0x20280000 (Data Transfer Overrun Error & Target Device Fault)?
 >  > >
 >  > > Looks like a hardware combination incompatibility.
 >  > > Most applicable ATA_HORKAGES in sourcecode already tried.
 >  > >
 >  > > Not found the sense code yet since FEATURE specific according to
 >  > > T13/1410D revision 3b.
 >  > >
 >  > > Comments?
 >  > >
 >  > > y
 >  > > tom
 >  > >
 >  > > dmesg |grep -A 10 ata
 >  > >
 >  > > sata_promise 0000:00:0d.0: PCI INT A -> GSI 17 (level, low) -> IRQ 17
 >  > > scsi5 : sata_promise
 >  > > scsi6 : sata_promise
 >  > > scsi7 : sata_promise
 >  > > ata6: SATA max UDMA/133 mmio m4096@0xfbefe000 ata 0xfbefe200 irq 17
 >  > > ata7: SATA max UDMA/133 mmio m4096@0xfbefe000 ata 0xfbefe280 irq 17
 >  > > ata8: PATA max UDMA/133 mmio m4096@0xfbefe000 ata 0xfbefe300 irq 17
 >  > > ata6: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
 >  > > ata6.00: ATAPI: HL-DT-ST DVDRAM GH22NS40, NL01, max UDMA/100
 >  > > ata6.00: configured for UDMA/100
 >  > > scsi 5:0:0:0: CD-ROM HL-DT-ST DVDRAM GH22NS40 NL01 PQ: 0 ANSI: 5
 >  > > sr0: scsi3-mmc drive: 125x/125x writer dvd-ram cd/rw xa/form2 cdda tray
 >  > > sr 5:0:0:0: Attached scsi CD-ROM sr0
 >  > > sr 5:0:0:0: Attached scsi generic sg2 type 5
 >  > > ata7: SATA link down (SStatus 0 SControl 300)
 >  > > ata6.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6
 >  > > ata6.00: port_status 0x20280000
 >  > > sr 5:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 40 00
 >  > > ata6.00: cmd a0/01:00:00:00:fc/00:00:00:00:00/a0 tag 0 dma 131072 in
 >  > > res 51/54:03:00:00:fc/00:00:00:00:00/e0 Emask 0x2 (HSM violation)
 >  > > ata6.00: status: { DRDY ERR }
 >  > > ata6: hard resetting link
 >  > > ata6: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
 >  > > ata6.00: configured for UDMA/100
 >  > > ata6: EH complete
 >  > > ...
 >  > > <period, ~10 times in series>
 >  > > ...
 >  > > ata6.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6
 >  > > ata6.00: port_status 0x20280000
 >  > > sr 5:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 02 00
 >  > > ata6.00: cmd a0/01:00:00:00:10/00:00:00:00:00/a0 tag 0 dma 4096 in
 >  > > res 51/54:03:00:00:10/00:00:00:00:00/e0 Emask 0x2 (HSM violation)
 >  > > ata6.00: status: { DRDY ERR }
 >  > > ata6: hard resetting link
 >  > > ata6: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
 >  > > ata6.00: configured for UDMA/100
 >  > > ata6: EH complete
 >  > > ata6.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6
 >  > > ata6.00: port_status 0x20280000
 >  > > sr 5:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 02 00
 >  > > ata6.00: cmd a0/01:00:00:00:10/00:00:00:00:00/a0 tag 0 dma 4096 in
 >  > > res 51/54:03:00:00:10/00:00:00:00:00/e0 Emask 0x2 (HSM violation)
 >  > > ata6.00: status: { DRDY ERR }
 >  > > ata6: hard resetting link
 >  > > ata6: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
 >  > > ata6.00: configured for UDMA/100
 >  > > ata6: EH complete
 >  > > ata6.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6
 >  > > ata6.00: port_status 0x20280000
 >  > > sr 5:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 02 00
 >  > > ata6.00: cmd a0/01:00:00:00:10/00:00:00:00:00/a0 tag 0 dma 4096 in
 >  > > res 51/54:03:00:00:10/00:00:00:00:00/e0 Emask 0x2 (HSM violation)
 >  > > ata6.00: status: { DRDY ERR }
 >  > > ata6: hard resetting link
 >  > > ata6: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
 >  > > ata6.00: configured for UDMA/100
 >  > > sr 5:0:0:0: [sr0] Result: hostbyte=0x00 driverbyte=0x08
 >  > > sr 5:0:0:0: [sr0] Sense Key : 0x5 [current] Info fld=0x0
 >  > > sr 5:0:0:0: [sr0] ASC=0x21 ASCQ=0x0
 >  > > sr 5:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 02 00
 >  > 
 >  > Well, it's a READ command, and the response is "LOGICAL BLOCK ADDRESS 
 >  > OUT OF RANGE". Seems reasonable if it's a blank disc in the drive (is it?)
 >  > 
 >  > According to the code comments in sata_promise, "overrun error" means 
 >  > the S/G byte count was larger than the drive requires. Which I suppose 
 >  > would happen here, because the drive didn't actually transfer any data. 
 >  > sata_promise raises an HSM error on that though which triggers resets 
 >  > and such. Seems like an overreaction, for ATAPI commands anyway, as that 
 >  > can happen normally. CCing Mikael.
 > 
 > Thanks for the report. I'll try to come up with a patch to reduce
 > the severity of overruns to something less than HSM.

I've looked at the available AC_ERR_ values and how they're treated by
libata-eh, and to avoid resets but allow for retries it seems that one
should use AC_ERR_OTHER, or possibly AC_ERR_DEV, or possibly no AC_ERR_
at all (i.e., zero). So please first try the patch below. If it doesn't
eliminate the reset loop, change the AC_ERR_OTHER to AC_ERR_DEV and try
again. And if that one still causes reset loops, try a plain 0.

/Mikael

--
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
thomas schorpp - Jan. 4, 2010, 2 a.m.
Mikael Pettersson wrote:
> Mikael Pettersson writes:
>  > Robert Hancock writes:
>  >  > On 12/27/2009 02:37 PM, thomas schorpp wrote:
>  >  > > LG GH22NS40 NL01 (possibly Renesas chipset)
>  >  > > VIA8237 SATA (produces basically same errors), Promise SATA II 150 20579
>  >  > > HBAs.
>  >  > >
>  >  > > Linux 2.6.32.2
>  >  > > hal polling
>  >  > > devkit polling
>  >  > > wodim
>  >  > > growisofs
>  >  > >
>  >  > > port_status 0x20280000 (Data Transfer Overrun Error & Target Device Fault)?
>  >  > >
>  >  > > Looks like a hardware combination incompatibility.
>  >  > > Most applicable ATA_HORKAGES in sourcecode already tried.
>  >  > >
>  >  > > Not found the sense code yet since FEATURE specific according to
>  >  > > T13/1410D revision 3b.
>  >  > >
>  >  > > Comments?
>  >  > >
>  >  > > y
>  >  > > tom
>  >  > >
>  >  > > dmesg |grep -A 10 ata
>  >  > >
>  >  > > sata_promise 0000:00:0d.0: PCI INT A -> GSI 17 (level, low) -> IRQ 17
>  >  > > scsi5 : sata_promise
>  >  > > scsi6 : sata_promise
>  >  > > scsi7 : sata_promise
>  >  > > ata6: SATA max UDMA/133 mmio m4096@0xfbefe000 ata 0xfbefe200 irq 17
>  >  > > ata7: SATA max UDMA/133 mmio m4096@0xfbefe000 ata 0xfbefe280 irq 17
>  >  > > ata8: PATA max UDMA/133 mmio m4096@0xfbefe000 ata 0xfbefe300 irq 17
>  >  > > ata6: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
>  >  > > ata6.00: ATAPI: HL-DT-ST DVDRAM GH22NS40, NL01, max UDMA/100
>  >  > > ata6.00: configured for UDMA/100
>  >  > > scsi 5:0:0:0: CD-ROM HL-DT-ST DVDRAM GH22NS40 NL01 PQ: 0 ANSI: 5
>  >  > > sr0: scsi3-mmc drive: 125x/125x writer dvd-ram cd/rw xa/form2 cdda tray
>  >  > > sr 5:0:0:0: Attached scsi CD-ROM sr0
>  >  > > sr 5:0:0:0: Attached scsi generic sg2 type 5
>  >  > > ata7: SATA link down (SStatus 0 SControl 300)
>  >  > > ata6.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6
>  >  > > ata6.00: port_status 0x20280000
>  >  > > sr 5:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 40 00
>  >  > > ata6.00: cmd a0/01:00:00:00:fc/00:00:00:00:00/a0 tag 0 dma 131072 in
>  >  > > res 51/54:03:00:00:fc/00:00:00:00:00/e0 Emask 0x2 (HSM violation)
>  >  > > ata6.00: status: { DRDY ERR }
>  >  > > ata6: hard resetting link
>  >  > > ata6: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
>  >  > > ata6.00: configured for UDMA/100
>  >  > > ata6: EH complete
>  >  > > ...
>  >  > > <period, ~10 times in series>
>  >  > > ...
>  >  > > ata6.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6
>  >  > > ata6.00: port_status 0x20280000
>  >  > > sr 5:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 02 00
>  >  > > ata6.00: cmd a0/01:00:00:00:10/00:00:00:00:00/a0 tag 0 dma 4096 in
>  >  > > res 51/54:03:00:00:10/00:00:00:00:00/e0 Emask 0x2 (HSM violation)
>  >  > > ata6.00: status: { DRDY ERR }
>  >  > > ata6: hard resetting link
>  >  > > ata6: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
>  >  > > ata6.00: configured for UDMA/100
>  >  > > ata6: EH complete
>  >  > > ata6.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6
>  >  > > ata6.00: port_status 0x20280000
>  >  > > sr 5:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 02 00
>  >  > > ata6.00: cmd a0/01:00:00:00:10/00:00:00:00:00/a0 tag 0 dma 4096 in
>  >  > > res 51/54:03:00:00:10/00:00:00:00:00/e0 Emask 0x2 (HSM violation)
>  >  > > ata6.00: status: { DRDY ERR }
>  >  > > ata6: hard resetting link
>  >  > > ata6: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
>  >  > > ata6.00: configured for UDMA/100
>  >  > > ata6: EH complete
>  >  > > ata6.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6
>  >  > > ata6.00: port_status 0x20280000
>  >  > > sr 5:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 02 00
>  >  > > ata6.00: cmd a0/01:00:00:00:10/00:00:00:00:00/a0 tag 0 dma 4096 in
>  >  > > res 51/54:03:00:00:10/00:00:00:00:00/e0 Emask 0x2 (HSM violation)
>  >  > > ata6.00: status: { DRDY ERR }
>  >  > > ata6: hard resetting link
>  >  > > ata6: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
>  >  > > ata6.00: configured for UDMA/100
>  >  > > sr 5:0:0:0: [sr0] Result: hostbyte=0x00 driverbyte=0x08
>  >  > > sr 5:0:0:0: [sr0] Sense Key : 0x5 [current] Info fld=0x0
>  >  > > sr 5:0:0:0: [sr0] ASC=0x21 ASCQ=0x0
>  >  > > sr 5:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 02 00
>  >  > 
>  >  > Well, it's a READ command, and the response is "LOGICAL BLOCK ADDRESS 
>  >  > OUT OF RANGE". Seems reasonable if it's a blank disc in the drive (is it?)
>  >  > 
>  >  > According to the code comments in sata_promise, "overrun error" means 
>  >  > the S/G byte count was larger than the drive requires. Which I suppose 
>  >  > would happen here, because the drive didn't actually transfer any data. 
>  >  > sata_promise raises an HSM error on that though which triggers resets 
>  >  > and such. Seems like an overreaction, for ATAPI commands anyway, as that 
>  >  > can happen normally. CCing Mikael.
>  > 
>  > Thanks for the report. I'll try to come up with a patch to reduce
>  > the severity of overruns to something less than HSM.
> 
> I've looked at the available AC_ERR_ values and how they're treated by
> libata-eh, and to avoid resets but allow for retries it seems that one
> should use AC_ERR_OTHER, or possibly AC_ERR_DEV, or possibly no AC_ERR_
> at all (i.e., zero). So please first try the patch below. If it doesn't
> eliminate the reset loop, change the AC_ERR_OTHER to AC_ERR_DEV and try
> again. And if that one still causes reset loops, try a plain 0.
> 
> /Mikael
> 
> --- linux-2.6.32/drivers/ata/sata_promise.c.~1~	2009-12-03 12:38:32.000000000 +0100
> +++ linux-2.6.32/drivers/ata/sata_promise.c	2010-01-03 22:08:08.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; /* or AC_ERR_DEV, or zero */
>  	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
> 

FIXED with AC_ERR_OTHER.
TESTED Drive reads and writes media fine.

Many Thanks :-)

y
tom
--
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
Mikael Pettersson - Jan. 4, 2010, 9:22 a.m.
thomas schorpp writes:
 > Mikael Pettersson wrote:
 > > Mikael Pettersson writes:
 > >  > Robert Hancock writes:
 > >  >  > On 12/27/2009 02:37 PM, thomas schorpp wrote:
 > >  >  > > LG GH22NS40 NL01 (possibly Renesas chipset)
 > >  >  > > VIA8237 SATA (produces basically same errors), Promise SATA II 150 20579
 > >  >  > > HBAs.
 > >  >  > >
 > >  >  > > Linux 2.6.32.2
 > >  >  > > hal polling
 > >  >  > > devkit polling
 > >  >  > > wodim
 > >  >  > > growisofs
 > >  >  > >
 > >  >  > > port_status 0x20280000 (Data Transfer Overrun Error & Target Device Fault)?
 > >  >  > >
 > >  >  > > Looks like a hardware combination incompatibility.
 > >  >  > > Most applicable ATA_HORKAGES in sourcecode already tried.
 > >  >  > >
 > >  >  > > Not found the sense code yet since FEATURE specific according to
 > >  >  > > T13/1410D revision 3b.
 > >  >  > >
 > >  >  > > Comments?
 > >  >  > >
 > >  >  > > y
 > >  >  > > tom
 > >  >  > >
 > >  >  > > dmesg |grep -A 10 ata
 > >  >  > >
 > >  >  > > sata_promise 0000:00:0d.0: PCI INT A -> GSI 17 (level, low) -> IRQ 17
 > >  >  > > scsi5 : sata_promise
 > >  >  > > scsi6 : sata_promise
 > >  >  > > scsi7 : sata_promise
 > >  >  > > ata6: SATA max UDMA/133 mmio m4096@0xfbefe000 ata 0xfbefe200 irq 17
 > >  >  > > ata7: SATA max UDMA/133 mmio m4096@0xfbefe000 ata 0xfbefe280 irq 17
 > >  >  > > ata8: PATA max UDMA/133 mmio m4096@0xfbefe000 ata 0xfbefe300 irq 17
 > >  >  > > ata6: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
 > >  >  > > ata6.00: ATAPI: HL-DT-ST DVDRAM GH22NS40, NL01, max UDMA/100
 > >  >  > > ata6.00: configured for UDMA/100
 > >  >  > > scsi 5:0:0:0: CD-ROM HL-DT-ST DVDRAM GH22NS40 NL01 PQ: 0 ANSI: 5
 > >  >  > > sr0: scsi3-mmc drive: 125x/125x writer dvd-ram cd/rw xa/form2 cdda tray
 > >  >  > > sr 5:0:0:0: Attached scsi CD-ROM sr0
 > >  >  > > sr 5:0:0:0: Attached scsi generic sg2 type 5
 > >  >  > > ata7: SATA link down (SStatus 0 SControl 300)
 > >  >  > > ata6.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6
 > >  >  > > ata6.00: port_status 0x20280000
 > >  >  > > sr 5:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 40 00
 > >  >  > > ata6.00: cmd a0/01:00:00:00:fc/00:00:00:00:00/a0 tag 0 dma 131072 in
 > >  >  > > res 51/54:03:00:00:fc/00:00:00:00:00/e0 Emask 0x2 (HSM violation)
 > >  >  > > ata6.00: status: { DRDY ERR }
 > >  >  > > ata6: hard resetting link
 > >  >  > > ata6: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
 > >  >  > > ata6.00: configured for UDMA/100
 > >  >  > > ata6: EH complete
 > >  >  > > ...
 > >  >  > > <period, ~10 times in series>
 > >  >  > > ...
 > >  >  > > ata6.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6
 > >  >  > > ata6.00: port_status 0x20280000
 > >  >  > > sr 5:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 02 00
 > >  >  > > ata6.00: cmd a0/01:00:00:00:10/00:00:00:00:00/a0 tag 0 dma 4096 in
 > >  >  > > res 51/54:03:00:00:10/00:00:00:00:00/e0 Emask 0x2 (HSM violation)
 > >  >  > > ata6.00: status: { DRDY ERR }
 > >  >  > > ata6: hard resetting link
 > >  >  > > ata6: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
 > >  >  > > ata6.00: configured for UDMA/100
 > >  >  > > ata6: EH complete
 > >  >  > > ata6.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6
 > >  >  > > ata6.00: port_status 0x20280000
 > >  >  > > sr 5:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 02 00
 > >  >  > > ata6.00: cmd a0/01:00:00:00:10/00:00:00:00:00/a0 tag 0 dma 4096 in
 > >  >  > > res 51/54:03:00:00:10/00:00:00:00:00/e0 Emask 0x2 (HSM violation)
 > >  >  > > ata6.00: status: { DRDY ERR }
 > >  >  > > ata6: hard resetting link
 > >  >  > > ata6: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
 > >  >  > > ata6.00: configured for UDMA/100
 > >  >  > > ata6: EH complete
 > >  >  > > ata6.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6
 > >  >  > > ata6.00: port_status 0x20280000
 > >  >  > > sr 5:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 02 00
 > >  >  > > ata6.00: cmd a0/01:00:00:00:10/00:00:00:00:00/a0 tag 0 dma 4096 in
 > >  >  > > res 51/54:03:00:00:10/00:00:00:00:00/e0 Emask 0x2 (HSM violation)
 > >  >  > > ata6.00: status: { DRDY ERR }
 > >  >  > > ata6: hard resetting link
 > >  >  > > ata6: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
 > >  >  > > ata6.00: configured for UDMA/100
 > >  >  > > sr 5:0:0:0: [sr0] Result: hostbyte=0x00 driverbyte=0x08
 > >  >  > > sr 5:0:0:0: [sr0] Sense Key : 0x5 [current] Info fld=0x0
 > >  >  > > sr 5:0:0:0: [sr0] ASC=0x21 ASCQ=0x0
 > >  >  > > sr 5:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 02 00
 > >  >  > 
 > >  >  > Well, it's a READ command, and the response is "LOGICAL BLOCK ADDRESS 
 > >  >  > OUT OF RANGE". Seems reasonable if it's a blank disc in the drive (is it?)
 > >  >  > 
 > >  >  > According to the code comments in sata_promise, "overrun error" means 
 > >  >  > the S/G byte count was larger than the drive requires. Which I suppose 
 > >  >  > would happen here, because the drive didn't actually transfer any data. 
 > >  >  > sata_promise raises an HSM error on that though which triggers resets 
 > >  >  > and such. Seems like an overreaction, for ATAPI commands anyway, as that 
 > >  >  > can happen normally. CCing Mikael.
 > >  > 
 > >  > Thanks for the report. I'll try to come up with a patch to reduce
 > >  > the severity of overruns to something less than HSM.
 > > 
 > > I've looked at the available AC_ERR_ values and how they're treated by
 > > libata-eh, and to avoid resets but allow for retries it seems that one
 > > should use AC_ERR_OTHER, or possibly AC_ERR_DEV, or possibly no AC_ERR_
 > > at all (i.e., zero). So please first try the patch below. If it doesn't
 > > eliminate the reset loop, change the AC_ERR_OTHER to AC_ERR_DEV and try
 > > again. And if that one still causes reset loops, try a plain 0.
 > > 
 > > /Mikael
 > > 
 > > --- linux-2.6.32/drivers/ata/sata_promise.c.~1~	2009-12-03 12:38:32.000000000 +0100
 > > +++ linux-2.6.32/drivers/ata/sata_promise.c	2010-01-03 22:08:08.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; /* or AC_ERR_DEV, or zero */
 > >  	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
 > > 
 > 
 > FIXED with AC_ERR_OTHER.
 > TESTED Drive reads and writes media fine.
 > 
 > Many Thanks :-)

Great. Can you show me the kernel messages from the patched driver,
including driver initialization, device enumeration, and your accesses
to the ATAPI device? I want to make sure everything looks ok before
pushing this upstream.

/Mikael
--
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
thomas schorpp - Jan. 4, 2010, 9:06 p.m.
Mikael Pettersson wrote:
> thomas schorpp writes:
>  > Mikael Pettersson wrote:
>  > > Mikael Pettersson writes:
>  > >  > Robert Hancock writes:
>  > >  >  > On 12/27/2009 02:37 PM, thomas schorpp wrote:
>  > >  >  > > LG GH22NS40 NL01 (possibly Renesas chipset)
>  > >  >  > > VIA8237 SATA (produces basically same errors), Promise SATA II 150 20579
>  > >  >  > > HBAs.
>  > >  >  > >
>  > >  >  > > Linux 2.6.32.2
>  > >  >  > > hal polling
>  > >  >  > > devkit polling
>  > >  >  > > wodim
>  > >  >  > > growisofs
>  > >  >  > >
>  > >  >  > > port_status 0x20280000 (Data Transfer Overrun Error & Target Device Fault)?
>  > >  >  > >
>  > >  >  > > Looks like a hardware combination incompatibility.
>  > >  >  > > Most applicable ATA_HORKAGES in sourcecode already tried.
>  > >  >  > >
>  > >  >  > > Not found the sense code yet since FEATURE specific according to
>  > >  >  > > T13/1410D revision 3b.
>  > >  >  > >
>  > >  >  > > Comments?
>  > >  >  > >
>  > >  >  > > y
>  > >  >  > > tom
>  > >  >  > >
>  > >  >  > > dmesg |grep -A 10 ata
>  > >  >  > >
>  > >  >  > > sata_promise 0000:00:0d.0: PCI INT A -> GSI 17 (level, low) -> IRQ 17
>  > >  >  > > scsi5 : sata_promise
>  > >  >  > > scsi6 : sata_promise
>  > >  >  > > scsi7 : sata_promise
>  > >  >  > > ata6: SATA max UDMA/133 mmio m4096@0xfbefe000 ata 0xfbefe200 irq 17
>  > >  >  > > ata7: SATA max UDMA/133 mmio m4096@0xfbefe000 ata 0xfbefe280 irq 17
>  > >  >  > > ata8: PATA max UDMA/133 mmio m4096@0xfbefe000 ata 0xfbefe300 irq 17
>  > >  >  > > ata6: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
>  > >  >  > > ata6.00: ATAPI: HL-DT-ST DVDRAM GH22NS40, NL01, max UDMA/100
>  > >  >  > > ata6.00: configured for UDMA/100
>  > >  >  > > scsi 5:0:0:0: CD-ROM HL-DT-ST DVDRAM GH22NS40 NL01 PQ: 0 ANSI: 5
>  > >  >  > > sr0: scsi3-mmc drive: 125x/125x writer dvd-ram cd/rw xa/form2 cdda tray
>  > >  >  > > sr 5:0:0:0: Attached scsi CD-ROM sr0
>  > >  >  > > sr 5:0:0:0: Attached scsi generic sg2 type 5
>  > >  >  > > ata7: SATA link down (SStatus 0 SControl 300)
>  > >  >  > > ata6.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6
>  > >  >  > > ata6.00: port_status 0x20280000
>  > >  >  > > sr 5:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 40 00
>  > >  >  > > ata6.00: cmd a0/01:00:00:00:fc/00:00:00:00:00/a0 tag 0 dma 131072 in
>  > >  >  > > res 51/54:03:00:00:fc/00:00:00:00:00/e0 Emask 0x2 (HSM violation)
>  > >  >  > > ata6.00: status: { DRDY ERR }
>  > >  >  > > ata6: hard resetting link
>  > >  >  > > ata6: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
>  > >  >  > > ata6.00: configured for UDMA/100
>  > >  >  > > ata6: EH complete
>  > >  >  > > ...
>  > >  >  > > <period, ~10 times in series>
>  > >  >  > > ...
>  > >  >  > > ata6.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6
>  > >  >  > > ata6.00: port_status 0x20280000
>  > >  >  > > sr 5:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 02 00
>  > >  >  > > ata6.00: cmd a0/01:00:00:00:10/00:00:00:00:00/a0 tag 0 dma 4096 in
>  > >  >  > > res 51/54:03:00:00:10/00:00:00:00:00/e0 Emask 0x2 (HSM violation)
>  > >  >  > > ata6.00: status: { DRDY ERR }
>  > >  >  > > ata6: hard resetting link
>  > >  >  > > ata6: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
>  > >  >  > > ata6.00: configured for UDMA/100
>  > >  >  > > ata6: EH complete
>  > >  >  > > ata6.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6
>  > >  >  > > ata6.00: port_status 0x20280000
>  > >  >  > > sr 5:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 02 00
>  > >  >  > > ata6.00: cmd a0/01:00:00:00:10/00:00:00:00:00/a0 tag 0 dma 4096 in
>  > >  >  > > res 51/54:03:00:00:10/00:00:00:00:00/e0 Emask 0x2 (HSM violation)
>  > >  >  > > ata6.00: status: { DRDY ERR }
>  > >  >  > > ata6: hard resetting link
>  > >  >  > > ata6: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
>  > >  >  > > ata6.00: configured for UDMA/100
>  > >  >  > > ata6: EH complete
>  > >  >  > > ata6.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6
>  > >  >  > > ata6.00: port_status 0x20280000
>  > >  >  > > sr 5:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 02 00
>  > >  >  > > ata6.00: cmd a0/01:00:00:00:10/00:00:00:00:00/a0 tag 0 dma 4096 in
>  > >  >  > > res 51/54:03:00:00:10/00:00:00:00:00/e0 Emask 0x2 (HSM violation)
>  > >  >  > > ata6.00: status: { DRDY ERR }
>  > >  >  > > ata6: hard resetting link
>  > >  >  > > ata6: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
>  > >  >  > > ata6.00: configured for UDMA/100
>  > >  >  > > sr 5:0:0:0: [sr0] Result: hostbyte=0x00 driverbyte=0x08
>  > >  >  > > sr 5:0:0:0: [sr0] Sense Key : 0x5 [current] Info fld=0x0
>  > >  >  > > sr 5:0:0:0: [sr0] ASC=0x21 ASCQ=0x0
>  > >  >  > > sr 5:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 02 00
>  > >  >  > 
>  > >  >  > Well, it's a READ command, and the response is "LOGICAL BLOCK ADDRESS 
>  > >  >  > OUT OF RANGE". Seems reasonable if it's a blank disc in the drive (is it?)
>  > >  >  > 
>  > >  >  > According to the code comments in sata_promise, "overrun error" means 
>  > >  >  > the S/G byte count was larger than the drive requires. Which I suppose 
>  > >  >  > would happen here, because the drive didn't actually transfer any data. 
>  > >  >  > sata_promise raises an HSM error on that though which triggers resets 
>  > >  >  > and such. Seems like an overreaction, for ATAPI commands anyway, as that 
>  > >  >  > can happen normally. CCing Mikael.
>  > >  > 
>  > >  > Thanks for the report. I'll try to come up with a patch to reduce
>  > >  > the severity of overruns to something less than HSM.
>  > > 
>  > > I've looked at the available AC_ERR_ values and how they're treated by
>  > > libata-eh, and to avoid resets but allow for retries it seems that one
>  > > should use AC_ERR_OTHER, or possibly AC_ERR_DEV, or possibly no AC_ERR_
>  > > at all (i.e., zero). So please first try the patch below. If it doesn't
>  > > eliminate the reset loop, change the AC_ERR_OTHER to AC_ERR_DEV and try
>  > > again. And if that one still causes reset loops, try a plain 0.
>  > > 
>  > > /Mikael
>  > > 
>  > > --- linux-2.6.32/drivers/ata/sata_promise.c.~1~	2009-12-03 12:38:32.000000000 +0100
>  > > +++ linux-2.6.32/drivers/ata/sata_promise.c	2010-01-03 22:08:08.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; /* or AC_ERR_DEV, or zero */
>  > >  	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
>  > > 
>  > 
>  > FIXED with AC_ERR_OTHER.
>  > TESTED Drive reads and writes media fine.
>  > 
>  > Many Thanks :-)
> 
> Great. Can you show me the kernel messages from the patched driver,
> including driver initialization, device enumeration, and your accesses
> to the ATAPI device? I want to make sure everything looks ok before
> pushing this upstream.

sata_promise 0000:00:0d.0: version 2.12
sata_promise 0000:00:0d.0: PCI INT A -> GSI 17 (level, low) -> IRQ 17
scsi2 : sata_promise
scsi3 : sata_promise
scsi4 : sata_promise
ata3: SATA max UDMA/133 mmio m4096@0xfbefe000 ata 0xfbefe200 irq 17
ata4: SATA max UDMA/133 mmio m4096@0xfbefe000 ata 0xfbefe280 irq 17
ata5: PATA max UDMA/133 mmio m4096@0xfbefe000 ata 0xfbefe300 irq 17

ata3: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
ata3.00: ATAPI: HL-DT-ST DVDRAM GH22NS40, NL01, max UDMA/100
ata3.00: configured for UDMA/100
scsi 2:0:0:0: CD-ROM            HL-DT-ST DVDRAM GH22NS40  NL01 PQ: 0 ANSI: 5
sr0: scsi3-mmc drive: 125x/125x writer dvd-ram cd/rw xa/form2 cdda tray
sr 2:0:0:0: Attached scsi CD-ROM sr0
sr 2:0:0:0: Attached scsi generic sg2 type 5
--
ata4: SATA link down (SStatus 0 SControl 300)

hal+devkit polling on raw dvd+r media:

sr 2:0:0:0: Attached scsi CD-ROM sr0
sr 2:0:0:0: [sr0] Result: hostbyte=0x00 driverbyte=0x08
sr 2:0:0:0: [sr0] Sense Key : 0x5 [current] 
sr 2:0:0:0: [sr0] ASC=0x21 ASCQ=0x0
sr 2:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 40 00
end_request: I/O error, dev sr0, sector 0
Buffer I/O error on device sr0, logical block 0
Buffer I/O error on device sr0, logical block 1
Buffer I/O error on device sr0, logical block 2
Buffer I/O error on device sr0, logical block 3
Buffer I/O error on device sr0, logical block 4
Buffer I/O error on device sr0, logical block 5
Buffer I/O error on device sr0, logical block 6
Buffer I/O error on device sr0, logical block 7
Buffer I/O error on device sr0, logical block 8
Buffer I/O error on device sr0, logical block 9
sr 2:0:0:0: [sr0] Result: hostbyte=0x00 driverbyte=0x08
sr 2:0:0:0: [sr0] Sense Key : 0x5 [current] 
sr 2:0:0:0: [sr0] ASC=0x21 ASCQ=0x0
sr 2:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 02 00
end_request: I/O error, dev sr0, sector 0
sr 2:0:0:0: [sr0] Result: hostbyte=0x00 driverbyte=0x08
sr 2:0:0:0: [sr0] Sense Key : 0x5 [current] 
sr 2:0:0:0: [sr0] ASC=0x21 ASCQ=0x0
sr 2:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 08 00
end_request: I/O error, dev sr0, sector 0
sr 2:0:0:0: [sr0] Result: hostbyte=0x00 driverbyte=0x08
sr 2:0:0:0: [sr0] Sense Key : 0x5 [current] 
sr 2:0:0:0: [sr0] ASC=0x21 ASCQ=0x0
sr 2:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 02 00
end_request: I/O error, dev sr0, sector 0
sr 2:0:0:0: [sr0] Result: hostbyte=0x00 driverbyte=0x08
sr 2:0:0:0: [sr0] Sense Key : 0x5 [current] 
sr 2:0:0:0: [sr0] ASC=0x21 ASCQ=0x0
sr 2:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 02 00
end_request: I/O error, dev sr0, sector 0
sr 2:0:0:0: [sr0] Result: hostbyte=0x00 driverbyte=0x08
sr 2:0:0:0: [sr0] Sense Key : 0x5 [current] 
sr 2:0:0:0: [sr0] ASC=0x21 ASCQ=0x0
sr 2:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 40 00
end_request: I/O error, dev sr0, sector 0
sr 2:0:0:0: [sr0] Result: hostbyte=0x00 driverbyte=0x08
sr 2:0:0:0: [sr0] Sense Key : 0x5 [current] 
sr 2:0:0:0: [sr0] ASC=0x21 ASCQ=0x0
sr 2:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 02 00
end_request: I/O error, dev sr0, sector 0
sr 2:0:0:0: [sr0] Result: hostbyte=0x00 driverbyte=0x08
sr 2:0:0:0: [sr0] Sense Key : 0x5 [current] 
sr 2:0:0:0: [sr0] ASC=0x21 ASCQ=0x0
sr 2:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 08 00
end_request: I/O error, dev sr0, sector 0
sr 2:0:0:0: [sr0] Result: hostbyte=0x00 driverbyte=0x08
sr 2:0:0:0: [sr0] Sense Key : 0x5 [current] 
sr 2:0:0:0: [sr0] ASC=0x21 ASCQ=0x0
sr 2:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 02 00
end_request: I/O error, dev sr0, sector 0
sr 2:0:0:0: [sr0] Result: hostbyte=0x00 driverbyte=0x08
sr 2:0:0:0: [sr0] Sense Key : 0x5 [current] 
sr 2:0:0:0: [sr0] ASC=0x21 ASCQ=0x0
sr 2:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 02 00
end_request: I/O error, dev sr0, sector 0
sr 2:0:0:0: [sr0] Result: hostbyte=0x00 driverbyte=0x08
sr 2:0:0:0: [sr0] Sense Key : 0x5 [current] 
sr 2:0:0:0: [sr0] ASC=0x21 ASCQ=0x0
sr 2:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 40 00
end_request: I/O error, dev sr0, sector 0
Buffer I/O error on device sr0, logical block 0
Buffer I/O error on device sr0, logical block 1
Buffer I/O error on device sr0, logical block 2
Buffer I/O error on device sr0, logical block 3
Buffer I/O error on device sr0, logical block 4
Buffer I/O error on device sr0, logical block 5
Buffer I/O error on device sr0, logical block 6
Buffer I/O error on device sr0, logical block 7
Buffer I/O error on device sr0, logical block 8
Buffer I/O error on device sr0, logical block 9
sr 2:0:0:0: [sr0] Result: hostbyte=0x00 driverbyte=0x08
sr 2:0:0:0: [sr0] Sense Key : 0x5 [current] 
sr 2:0:0:0: [sr0] ASC=0x21 ASCQ=0x0
sr 2:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 02 00
end_request: I/O error, dev sr0, sector 0
sr 2:0:0:0: [sr0] Result: hostbyte=0x00 driverbyte=0x08
sr 2:0:0:0: [sr0] Sense Key : 0x5 [current] 
sr 2:0:0:0: [sr0] ASC=0x21 ASCQ=0x0
sr 2:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 02 00
end_request: I/O error, dev sr0, sector 0
sr 2:0:0:0: [sr0] Result: hostbyte=0x00 driverbyte=0x08
sr 2:0:0:0: [sr0] Sense Key : 0x5 [current] 
sr 2:0:0:0: [sr0] ASC=0x21 ASCQ=0x0
sr 2:0:0:0: [sr0] CDB: cdb[0]=0x28: 28 00 00 00 00 00 00 00 02 00
end_request: I/O error, dev sr0, sector 0

No messages for R/W of data media.

y
tom
--
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
Tejun Heo - Jan. 20, 2010, 3 a.m.
Hello, Mikael.

On 01/04/2010 06:36 AM, Mikael Pettersson wrote:
> I've looked at the available AC_ERR_ values and how they're treated by
> libata-eh, and to avoid resets but allow for retries it seems that one
> should use AC_ERR_OTHER, or possibly AC_ERR_DEV, or possibly no AC_ERR_
> at all (i.e., zero). So please first try the patch below. If it doesn't
> eliminate the reset loop, change the AC_ERR_OTHER to AC_ERR_DEV and try
> again. And if that one still causes reset loops, try a plain 0.
> 
> /Mikael
> 
> --- linux-2.6.32/drivers/ata/sata_promise.c.~1~	2009-12-03 12:38:32.000000000 +0100
> +++ linux-2.6.32/drivers/ata/sata_promise.c	2010-01-03 22:08:08.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; /* or AC_ERR_DEV, or zero */

I think AC_ERR_OTHER can still be too much.  AC_ERR_* bits should only
be set when the command failed for that reason.  Here, underrun is
expected, so not really an error condition.  But, for example, under
or overrun for an ATA R/W command should trigger HSM failure.  I think
the above error detection logic needs to be improved a bit.

Thanks.
thomas schorpp - Jan. 20, 2010, 7:57 a.m.
Tejun Heo wrote:
> Hello, Mikael.
> 
> On 01/04/2010 06:36 AM, Mikael Pettersson wrote:
>> I've looked at the available AC_ERR_ values and how they're treated by
>> libata-eh, and to avoid resets but allow for retries it seems that one
>> should use AC_ERR_OTHER, or possibly AC_ERR_DEV, or possibly no AC_ERR_
>> at all (i.e., zero). So please first try the patch below. If it doesn't
>> eliminate the reset loop, change the AC_ERR_OTHER to AC_ERR_DEV and try
>> again. And if that one still causes reset loops, try a plain 0.
>>
>> /Mikael
>>
>> --- linux-2.6.32/drivers/ata/sata_promise.c.~1~	2009-12-03 12:38:32.000000000 +0100
>> +++ linux-2.6.32/drivers/ata/sata_promise.c	2010-01-03 22:08:08.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; /* or AC_ERR_DEV, or zero */
> 
> I think AC_ERR_OTHER can still be too much.  AC_ERR_* bits should only
> be set when the command failed for that reason.  Here, underrun is

Overruns from my port status log, not underruns?
port_status 0x20280000, 0x2020, (Data Transfer Overrun Error & Target Device Fault)? 

> expected, so not really an error condition.  But, for example, under
> or overrun for an ATA R/W command should trigger HSM failure.  I think
> the above error detection logic needs to be improved a bit.

Well I generally don't feel comfortable with any unknown state output EHs, too, 
but if ata spec conformant, we're fine, aren't we?

y
tom
--
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
Tejun Heo - Jan. 20, 2010, 8:51 a.m.
Hello,

On 01/20/2010 04:57 PM, thomas schorpp wrote:
>> I think AC_ERR_OTHER can still be too much.  AC_ERR_* bits should only
>> be set when the command failed for that reason.  Here, underrun is
> 
> Overruns from my port status log, not underruns?
> port_status 0x20280000, 0x2020, (Data Transfer Overrun Error & Target
> Device Fault)?

Well, it depends on which way you look from.  It's data underrun from
the device and overrun from the sglist.  Apparently sata_promise likes
to see it from the sglist.  :-)

>> expected, so not really an error condition.  But, for example, under
>> or overrun for an ATA R/W command should trigger HSM failure.  I think
>> the above error detection logic needs to be improved a bit.
> 
> Well I generally don't feel comfortable with any unknown state output
> EHs, too, but if ata spec conformant, we're fine, aren't we?

Yeap, I was just saying that the condition here wasn't really an error
condition and as such shouldn't set AC_ERR_* bit.

Thanks.

Patch

--- linux-2.6.32/drivers/ata/sata_promise.c.~1~	2009-12-03 12:38:32.000000000 +0100
+++ linux-2.6.32/drivers/ata/sata_promise.c	2010-01-03 22:08:08.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; /* or AC_ERR_DEV, or zero */
 	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