Tejun Heo
e190222d04
libata: bump transfer chunk size if it's odd
...
None of the drives I have follows what the standard says about
transfer chunk size. Of the four SATA and six PATA ATAPI devices
tested, four ignore transfer chunk size completely and the ones which
honor it don't behave according to the spec when it's odd.
According to the spec, transfer chunk size can be odd if the amount of
data to transfer equals or is smaller than the chunk size and the
device can indicate the same odd number and transfer the whole thing
at one go with a pad byte appended. However, in reality, none of the
drives I have does that. They all indicate and transfer even number
of bytes one byte shorter than the chunk size first; then indicate and
transfer two bytes, which is clearly out of spec.
In addition to unnecessary second PIO data phase, this also creates a
weird problem when combined with SATA controllers which perform PIO
via DMA. Some of these controllers use actualy number of bytes
received to update DMA pointer so chunks which are sized 4n + 2 makes
DMA pointer off by two bytes. This causes data corruption and buffer
overruns.
This patch rounds nbytes up to the nearest even number such that ATAPI
devices don't split data transfer for the last odd byte. This
shouldn't confuse controllers which depend on transfer chunk size as
devices will report the rounded-up number, actually transfer that much
and padding buffer is there to receive them.
Signed-off-by: Tejun Heo <[email protected] >
Signed-off-by: Jeff Garzik <[email protected] >
2007-11-26 11:03:40 -05:00
..
ahci.c
[libata] AHCI: add hw link power management support
2007-10-29 11:00:35 -04:00
ata_generic.c
libata: Switch most of the remaining SFF drivers to ata_sff_port_start
2007-10-12 14:55:36 -04:00
ata_piix.c
ata_piix: Invalid use of writel/readl with iomap
2007-11-23 19:33:26 -05:00
Kconfig
Update libata driver for bf548 atapi controller against the 2.6.24 tree.
2007-10-17 20:49:02 -04:00
libata-acpi.c
libata: Don't fail device revalidation for bad _GTF methods
2007-11-10 00:31:27 -05:00
libata-core.c
libata-core: List more documentation sources for reference
2007-11-23 19:33:26 -05:00
libata-eh.c
libata: remove unused functions
2007-11-19 12:28:09 +09:00
libata-pmp.c
libata: use ata_exec_internal() for PMP register access
2007-10-12 14:55:47 -04:00
libata-scsi.c
libata: bump transfer chunk size if it's odd
2007-11-26 11:03:40 -05:00
libata-sff.c
[libata] checkpatch-inspired cleanups
2007-10-23 20:59:42 -04:00
libata.h
[libata] Link power management infrastructure
2007-10-29 11:00:35 -04:00
Makefile
drivers/ata: add support to Freescale 3.0Gbps SATA Controller
2007-10-17 20:49:02 -04:00
pata_acpi.c
[libata] fix 'if(' and similar areas that lack whitespace
2007-10-29 06:15:27 -04:00
pata_ali.c
pata_ali: trim trailing whitespace (fix checkpatch complaints)
2007-11-23 21:08:42 -05:00
pata_amd.c
libata: Switch most of the remaining SFF drivers to ata_sff_port_start
2007-10-12 14:55:36 -04: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
AVR32 PATA driver
2007-10-12 14:55:37 -04:00
pata_atiixp.c
pata_atiixp: Audit notes on locking
2007-10-12 14:55:42 -04:00
pata_bf54x.c
libata: Return proper ATA INT status in pata_bf54x driver
2007-11-26 11:03:40 -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] struct pci_dev related cleanups
2007-10-12 14:55:47 -04: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: Fix cable detect bug spotted by Sergei
2007-11-23 19:33:27 -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
Fix pata_icside build for recent libata API changes
2007-10-25 02:05:26 -04:00
pata_isapnp.c
pata_isapnp: Polled devices
2007-11-23 19:33:27 -05:00
pata_it821x.c
Fix misspellings of "system", "controller", "interrupt" and "necessary".
2007-10-19 23:10:43 +02: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: implement and use ata_port_desc() to report port configuration
2007-10-12 14:55:37 -04: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
libata: implement and use ata_port_desc() to report port configuration
2007-10-12 14:55:37 -04: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
mpc52xx-ata: fix compile warning (unused variable)
2007-10-14 08:57:30 -07: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_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_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
[libata] Address some checkpatch-spotted issues
2007-10-29 06:15:27 -04:00
pata_pdc202xx_old.c
[libata] fix 'if(' and similar areas that lack whitespace
2007-10-29 06:15:27 -04:00
pata_pdc2027x.c
[libata] fix 'if(' and similar areas that lack whitespace
2007-10-29 06:15:27 -04:00
pata_platform.c
libata: pata_platform: Support polling-mode configuration.
2007-11-08 13:08:41 -05:00
pata_qdi.c
libata: implement and use ata_port_desc() to report port configuration
2007-10-12 14:55:37 -04: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: implement ata_wait_after_reset()
2007-10-29 06:15:27 -04:00
pata_serverworks.c
pata_serverworks: Fix problem with some drive combinations
2007-11-05 18:08:46 -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] fix 'if(' and similar areas that lack whitespace
2007-10-29 06:15:27 -04:00
pata_winbond.c
[libata] fix 'if(' and similar areas that lack whitespace
2007-10-29 06:15:27 -04:00
pdc_adma.c
[libata] Address some checkpatch-spotted issues
2007-10-29 06:15:27 -04:00
sata_fsl.c
ata/sata_fsl: Remove ata_scsi_suspend/resume callbacks
2007-11-03 08:46:29 -04:00
sata_inic162x.c
[libata] Address some checkpatch-spotted issues
2007-10-29 06:15:27 -04:00
sata_mv.c
[libata] Address some checkpatch-spotted issues
2007-10-29 06:15:27 -04:00
sata_nv.c
nv_hardreset: update dangling reference to bugzilla entry
2007-11-08 13:08:40 -05:00
sata_promise.c
sata_promise: fix endianess bug in ASIC PRD bug workaround
2007-11-03 08:46:54 -04:00
sata_promise.h
sata_qstor.c
libata sata_qstor conversion to new error handling (EH).
2007-11-08 13:08:41 -05:00
sata_sil.c
[libata] Address some checkpatch-spotted issues
2007-10-29 06:15:27 -04:00
sata_sil24.c
sata_sil24: fix sg table sizing
2007-11-23 19:23:55 -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] Address some checkpatch-spotted issues
2007-10-29 06:15:27 -04: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