linux/drivers/ata
Robert Hancock a1fe782414 sata_nv: fix for completion handling
This patch is based on an original patch from Kuan Luo of NVIDIA,
posted under subject "fixed a bug of adma in rhel4u5 with HDS7250SASUN500G".
His description follows. I've reworked it a bit to avoid some unnecessary
repeated checks but it should be functionally identical.

"The patch is to solve the error message "ata1: CPB flags CMD err,
flags=0x11" when testing HDS7250SASUN500G in rhel4u5.
I tested this hd in 2.6.24-rc7 which needed to remove the mask in
blacklist to run the ncq and the same error also showed up.

I traced the  bug and found that the interrupt finished a command (for
example, tag=0) when the driver got that adma status is
NV_ADMA_STAT_DONE  and  cpb->resp_flags is NV_CPB_RESP_DONE.
However, For this hd, the drive maybe didn't clear bit 0 at this moment.
It meaned the hardware  had not completely finished the command.
If at the same time  the driver freed the command(tag 0) and sended
another command (tag 0), the error happened.

The notifier register is 32-bit register containing notifier value.
Value is bit vector containing one bit per tag number (0-31) in
corresponding bit positions (bit 0 is for tag 0, etc). When bit is set
then ADMA indicates that command with corresponding tag number completed
execution.

So i added the check notifier code. Sometimes i saw that the notifier
reg set some bits  , but the adma status set NV_ADMA_STAT_CMD_COMPLETE
,not NV_ADMA_STAT_DONE. So i added the NV_ADMA_STAT_CMD_COMPLETE check
code."

Signed-off-by: Robert Hancock <hancockr@shaw.ca>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
2008-02-01 12:26:38 -05:00
..
ahci.c ahci: RAID mode SATA patch for Intel ICH10 DeviceID's 2008-02-01 11:29:48 -05:00
ata_generic.c ata_generic: Cenatek support 2008-01-23 05:24:17 -05:00
ata_piix.c ata_piix: IDE mode SATA patch for Intel ICH10 DeviceID's 2008-02-01 11:29:49 -05:00
Kconfig sata_mv: Remove PCI dependency 2008-02-01 12:26:37 -05:00
libata-acpi.c libata: reimplement ata_acpi_cbl_80wire() using ata_acpi_gtm_xfermask() 2008-01-23 05:24:12 -05:00
libata-core.c libata: Change "write_data" to "rw" for some function documentations 2008-01-29 08:48:17 +11:00
libata-eh.c libata: fix off-by-one in error categorization 2008-01-23 05:24:17 -05:00
libata-pmp.c libata-pmp: 4726 hates SRST 2008-01-10 16:53:12 -05:00
libata-scsi.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6 2008-01-25 17:19:08 -08:00
libata-sff.c libata: factor out ata_pci_activate_sff_host() from ata_pci_one() 2008-01-23 05:24:16 -05:00
libata.h libata: move ata_set_mode() to libata-eh.c 2008-01-23 05:24:10 -05:00
Makefile Merge branch 'linux-2.6' 2008-01-31 11:25:51 +11:00
pata_acpi.c libata: implement ata_timing_cycle2mode() and use it in libata-acpi and pata_acpi 2008-01-23 05:24:12 -05:00
pata_ali.c libata: checkpatch fixes 2008-01-23 05:24:10 -05:00
pata_amd.c pata_amd: update mode selection for NV PATAs 2008-01-23 05:24:12 -05:00
pata_artop.c libata: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04:00
pata_at32.c Several fixes for the AVR32 PATA driver 2007-12-01 17:35:58 -05:00
pata_atiixp.c pata_atiixp: Audit notes on locking 2007-10-12 14:55:42 -04:00
pata_bf54x.c libata: convert to chained sg 2008-01-23 05:24:14 -05:00
pata_cmd64x.c pata_cmd64x.c typo fix 2007-10-20 01:02:48 +02:00
pata_cmd640.c libata: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04:00
pata_cs5520.c libata annotations and fixes 2008-01-23 05:24:15 -05:00
pata_cs5530.c Fix misspellings of "system", "controller", "interrupt" and "necessary". 2007-10-19 23:10:43 +02:00
pata_cs5535.c Fix misspellings of "system", "controller", "interrupt" and "necessary". 2007-10-19 23:10:43 +02:00
pata_cs5536.c pata_cs5536: MWDMA fix 2007-10-19 22:55:03 -04:00
pata_cypress.c libata: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04:00
pata_efar.c libata: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04:00
pata_hpt3x2n.c libata: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04:00
pata_hpt3x3.c libata: implement and use ata_port_desc() to report port configuration 2007-10-12 14:55:37 -04:00
pata_hpt37x.c pata_hpt37x: checkpatch fixes 2008-01-23 05:24:13 -05:00
pata_hpt366.c libata: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04:00
pata_icside.c libata: convert to chained sg 2008-01-23 05:24:14 -05:00
pata_isapnp.c pata_isapnp: Polled devices 2007-11-23 19:33:27 -05:00
pata_it821x.c libata/pata_it821x: Improve handling of poorly compatible emulations 2008-01-23 05:24:15 -05:00
pata_it8213.c libata: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04:00
pata_ixp4xx_cf.c libata: update ->data_xfer hook for ATAPI 2008-01-23 05:24:14 -05:00
pata_jmicron.c pata_jmicron: fix disabled port handling in jmicron_pre_reset() 2007-11-23 19:23:55 -05:00
pata_legacy.c pata_legacy: Merge winbond support 2008-01-23 05:24:17 -05:00
pata_marvell.c libata: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04:00
pata_mpc52xx.c Merge branch 'linux-2.6' 2008-01-31 11:25:51 +11:00
pata_mpiix.c Fix misspellings of "system", "controller", "interrupt" and "necessary". 2007-10-19 23:10:43 +02:00
pata_netcell.c libata: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04:00
pata_ninja32.c libata: checkpatch fixes 2008-01-23 05:24:10 -05:00
pata_ns87410.c Fix misspellings of "system", "controller", "interrupt" and "necessary". 2007-10-19 23:10:43 +02:00
pata_ns87415.c pata_ns87415: define SUPERIO_IDE_MAX_RETRIES 2007-10-29 06:21:33 -04:00
pata_of_platform.c [POWERPC] pasemi: Move electra-ide to pata_of_platform 2008-01-15 10:26:45 -06:00
pata_oldpiix.c Fix misspellings of "system", "controller", "interrupt" and "necessary". 2007-10-19 23:10:43 +02:00
pata_opti.c libata: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04:00
pata_optidma.c [libata] fix 'if(' and similar areas that lack whitespace 2007-10-29 06:15:27 -04:00
pata_pcmcia.c pata_pcmcia: convert to new data_xfer prototype 2008-01-23 05:24:15 -05:00
pata_pdc202xx_old.c libata: rename ATA_PROT_ATAPI_* to ATAPI_PROT_* 2008-01-23 05:24:14 -05:00
pata_pdc2027x.c libata annotations and fixes 2008-01-23 05:24:15 -05:00
pata_platform.c libata: pata_platform: make probe and remove functions device type neutral 2008-01-15 10:23:41 -06:00
pata_qdi.c libata: update ->data_xfer hook for ATAPI 2008-01-23 05:24:14 -05:00
pata_radisys.c Fix misspellings of "system", "controller", "interrupt" and "necessary". 2007-10-19 23:10:43 +02:00
pata_rz1000.c libata: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04:00
pata_sc1200.c Fix misspellings of "system", "controller", "interrupt" and "necessary". 2007-10-19 23:10:43 +02:00
pata_scc.c libata: update ->data_xfer hook for ATAPI 2008-01-23 05:24:14 -05:00
pata_serverworks.c pata_serverworks: Fix cable types and cosmetics 2008-01-23 05:24:17 -05:00
pata_sil680.c pata_sil680: kill bogus reset code (take 2) 2007-11-23 19:23:55 -05:00
pata_sis.c pata_sis.c: Add Packard Bell EasyNote K5305 to laptops 2007-11-19 12:28:11 +09:00
pata_sl82c105.c libata: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04:00
pata_triflex.c libata: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04:00
pata_via.c libata: reimplement ata_acpi_cbl_80wire() using ata_acpi_gtm_xfermask() 2008-01-23 05:24:12 -05:00
pata_winbond.c pata_winbond: error return 2008-01-23 05:24:17 -05:00
pdc_adma.c libata: convert to chained sg 2008-01-23 05:24:14 -05:00
sata_fsl.c fix drivers/ata/sata_fsl.c double-decl 2008-01-23 05:24:17 -05:00
sata_inic162x.c libata: rename ATA_PROT_ATAPI_* to ATAPI_PROT_* 2008-01-23 05:24:14 -05:00
sata_mv.c sata_mv: Remove PCI dependency 2008-02-01 12:26:37 -05:00
sata_nv.c sata_nv: fix for completion handling 2008-02-01 12:26:38 -05:00
sata_promise.c libata: convert to chained sg 2008-01-23 05:24:14 -05:00
sata_promise.h libata annotations and fixes 2008-01-23 05:24:15 -05:00
sata_qstor.c libata: convert to chained sg 2008-01-23 05:24:14 -05:00
sata_sil24.c libata: convert to chained sg 2008-01-23 05:24:14 -05:00
sata_sil.c libata: implement protocol tests 2008-01-23 05:24:10 -05:00
sata_sis.c [libata] Address some checkpatch-spotted issues 2007-10-29 06:15:27 -04:00
sata_svw.c [libata] Address some checkpatch-spotted issues 2007-10-29 06:15:27 -04:00
sata_sx4.c libata annotations and fixes 2008-01-23 05:24:15 -05:00
sata_uli.c [libata] Address some checkpatch-spotted issues 2007-10-29 06:15:27 -04:00
sata_via.c [libata] Address some checkpatch-spotted issues 2007-10-29 06:15:27 -04:00
sata_vsc.c [libata] Address some checkpatch-spotted issues 2007-10-29 06:15:27 -04:00
sis.h libata: PATA-mode fixes for sis_sata 2007-07-02 10:17:42 -04:00