diff options
author | Tejun Heo <htejun@gmail.com> | 2007-09-23 00:14:12 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2007-10-12 14:55:41 -0400 |
commit | 31cc23b34913bc173680bdc87af79e551bf8cc0d (patch) | |
tree | ec64421ead9259174f0de8b22c36449ece6d69a4 /drivers/ata/ahci.c | |
parent | fb7fd61454c8681cd2621051a710b78a00369203 (diff) |
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>
Diffstat (limited to 'drivers/ata/ahci.c')
-rw-r--r-- | drivers/ata/ahci.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 0a6b694f0d3a..cf3404467ceb 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
@@ -268,6 +268,7 @@ static const struct ata_port_operations ahci_ops = { | |||
268 | 268 | ||
269 | .tf_read = ahci_tf_read, | 269 | .tf_read = ahci_tf_read, |
270 | 270 | ||
271 | .qc_defer = ata_std_qc_defer, | ||
271 | .qc_prep = ahci_qc_prep, | 272 | .qc_prep = ahci_qc_prep, |
272 | .qc_issue = ahci_qc_issue, | 273 | .qc_issue = ahci_qc_issue, |
273 | 274 | ||
@@ -298,6 +299,7 @@ static const struct ata_port_operations ahci_vt8251_ops = { | |||
298 | 299 | ||
299 | .tf_read = ahci_tf_read, | 300 | .tf_read = ahci_tf_read, |
300 | 301 | ||
302 | .qc_defer = ata_std_qc_defer, | ||
301 | .qc_prep = ahci_qc_prep, | 303 | .qc_prep = ahci_qc_prep, |
302 | .qc_issue = ahci_qc_issue, | 304 | .qc_issue = ahci_qc_issue, |
303 | 305 | ||