linux/drivers/ata
Tejun Heo 31cc23b349 libata-pmp-prep: implement ops->qc_defer()
Controllers which support PMP have various restrictions on which
combinations of commands are allowed to what number of devices
concurrently.  This patch implements ops->qc_defer() which determines
whether a qc can be issued at the moment or should be deferred.

If the function returns ATA_DEFER_LINK, the qc will be deferred until
a qc completes on the link.  If ATA_DEFER_PORT, until a qc completes
on any link.  The defer conditions are advisory and in general
ATA_DEFER_LINK can be considered as lower priority deferring than
ATA_DEFER_PORT.

ops->qc_defer() replaces fixed ata_scmd_need_defer().  For standard
NCQ/non-NCQ exclusion, ata_std_qc_defer() is implemented.  ahci and
sata_sil24 are converted to use ata_std_qc_defer().

ops->qc_defer() is heavier than the original mechanism because full qc
is prepped before determining to defer it, but various information is
needed to determine defer conditinos and fully translating a qc is the
only way to supply such information in generic manner.

IMHO, this shouldn't cause any noticeable performance issues as

* for most cases deferring occurs rarely (except for NCQ-aware
  cmd-switching PMP)
* translation itself isn't that expensive
* once deferred the command won't be repeated until another command
  completes which usually is a very long time cpu-wise.

Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
2007-10-12 14:55:41 -04:00
..
Kconfig libata: Update experimental tags to reflect reality better 2007-10-12 14:55:38 -04:00
Makefile AVR32 PATA driver 2007-10-12 14:55:37 -04:00
ahci.c libata-pmp-prep: implement ops->qc_defer() 2007-10-12 14:55:41 -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: replace spaces with tabs 2007-10-12 14:55:39 -04:00
libata-acpi.c [libata] add ACPI cable detect API 2007-10-12 14:55:34 -04:00
libata-core.c libata-pmp-prep: implement ops->qc_defer() 2007-10-12 14:55:41 -04:00
libata-eh.c libata-pmp-prep: make a number of functions global to libata 2007-10-12 14:55:41 -04:00
libata-scsi.c libata-pmp-prep: implement ops->qc_defer() 2007-10-12 14:55:41 -04:00
libata-sff.c libata: implement and use ata_port_desc() to report port configuration 2007-10-12 14:55:37 -04:00
libata.h libata-pmp-prep: make a number of functions global to libata 2007-10-12 14:55:41 -04:00
pata_ali.c libata: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04: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 libata: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04:00
pata_bf54x.c libata driver for bf548 on chip ATAPI controller. 2007-10-12 14:55:37 -04:00
pata_cmd64x.c [libata] Remove ->port_disable() hook 2007-10-12 14:55:35 -04: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: implement and use ata_port_desc() to report port configuration 2007-10-12 14:55:37 -04:00
pata_cs5530.c libata: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04:00
pata_cs5535.c libata: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -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 libata: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04: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: implement and use ata_port_desc() to report port configuration 2007-10-12 14:55:37 -04:00
pata_isapnp.c libata: implement and use ata_port_desc() to report port configuration 2007-10-12 14:55:37 -04:00
pata_it821x.c libata: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04: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 [libata] Remove ->port_disable() hook 2007-10-12 14:55:35 -04: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 libata: implement and use ata_port_desc() to report port configuration 2007-10-12 14:55:37 -04:00
pata_mpiix.c libata: implement and use ata_port_desc() to report port configuration 2007-10-12 14:55:37 -04: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 libata: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04:00
pata_oldpiix.c libata: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04: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: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04:00
pata_pcmcia.c libata: implement and use ata_port_desc() to report port configuration 2007-10-12 14:55:37 -04:00
pata_pdc202xx_old.c libata: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04:00
pata_pdc2027x.c pdc2027x: Switch properly to ioread/iowrite 2007-10-12 14:55:38 -04:00
pata_platform.c libata: implement and use ata_port_desc() to report port configuration 2007-10-12 14:55:37 -04: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 libata: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04: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 libata: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04:00
pata_scc.c libata: update ata_dev_try_classify() arguments 2007-10-12 14:55:39 -04:00
pata_serverworks.c libata: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04:00
pata_sil680.c libata: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04:00
pata_sis.c libata: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04: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: Switch most of the remaining SFF drivers to ata_sff_port_start 2007-10-12 14:55:36 -04:00
pata_winbond.c libata: implement and use ata_port_desc() to report port configuration 2007-10-12 14:55:37 -04:00
pdc_adma.c libata: implement and use ata_port_desc() to report port configuration 2007-10-12 14:55:37 -04:00
sata_inic162x.c libata: implement and use ata_port_desc() to report port configuration 2007-10-12 14:55:37 -04:00
sata_mv.c libata: update ata_dev_try_classify() arguments 2007-10-12 14:55:39 -04:00
sata_nv.c libata-pmp-prep: implement ops->qc_defer() 2007-10-12 14:55:41 -04:00
sata_promise.c libata: implement and use ata_port_desc() to report port configuration 2007-10-12 14:55:37 -04:00
sata_promise.h Move libata to drivers/ata. 2006-08-10 07:31:37 -04:00
sata_qstor.c libata: implement and use ata_port_desc() to report port configuration 2007-10-12 14:55:37 -04:00
sata_sil.c libata: implement and use ata_port_desc() to report port configuration 2007-10-12 14:55:37 -04:00
sata_sil24.c libata-pmp-prep: implement ops->qc_defer() 2007-10-12 14:55:41 -04:00
sata_sis.c [libata] Remove ->port_disable() hook 2007-10-12 14:55:35 -04:00
sata_svw.c libata: implement and use ata_port_desc() to report port configuration 2007-10-12 14:55:37 -04:00
sata_sx4.c libata: implement and use ata_port_desc() to report port configuration 2007-10-12 14:55:37 -04:00
sata_uli.c libata: implement and use ata_port_desc() to report port configuration 2007-10-12 14:55:37 -04:00
sata_via.c libata: implement and use ata_port_desc() to report port configuration 2007-10-12 14:55:37 -04:00
sata_vsc.c libata: implement and use ata_port_desc() to report port configuration 2007-10-12 14:55:37 -04:00
sis.h libata: PATA-mode fixes for sis_sata 2007-07-02 10:17:42 -04:00