lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Wed, 17 Feb 2010 13:13:16 +0000
From:	Alan Cox <alan@...ux.intel.com>
To:	jeff@...zik.org.com, linux-kernel@...r.kernel.org,
	linux-ide@...r.kernel.org
Subject: [RFC 3/4] libata: Remove excess command issue delays

We don't need to pause before a command issue for PIO (it's posted) or for
most MMIO devices (internally managed delay) so provide a routine for the
normal "sane" hardware

As a side effect it also means that those devices using PIO don't end up
generating ATA bus cycles in strange places which confuses some hardware.

Saves us about 1mS on a dumb controller, a fair bit less (uSecs on smarter
ones). ata_pause() is very very slow on controllers where it goes all the way

[For those counting thats another mS saved once we turn this stuff on]

Signed-off-by: Alan Cox <alan@...ux.intel.com>
---

 drivers/ata/ata_generic.c       |    7 +++---
 drivers/ata/ata_piix.c          |    1 +
 drivers/ata/libata-sff.c        |   25 ++++++++++++++++++++
 drivers/ata/pata_acpi.c         |    1 +
 drivers/ata/pata_ali.c          |   16 +++++++------
 drivers/ata/pata_amd.c          |   48 ++++++++++++++++++++-------------------
 drivers/ata/pata_artop.c        |    2 ++
 drivers/ata/pata_atiixp.c       |   15 +++++++-----
 drivers/ata/pata_atp867x.c      |    1 +
 drivers/ata/pata_cmd640.c       |   13 ++++++-----
 drivers/ata/pata_cmd64x.c       |   23 ++++++++++---------
 drivers/ata/pata_cs5520.c       |    1 +
 drivers/ata/pata_cs5530.c       |   13 ++++++-----
 drivers/ata/pata_cs5535.c       |    9 ++++---
 drivers/ata/pata_cs5536.c       |    1 +
 drivers/ata/pata_efar.c         |    1 +
 drivers/ata/pata_hpt366.c       |   11 +++++----
 drivers/ata/pata_hpt37x.c       |   36 +++++++++++++++--------------
 drivers/ata/pata_hpt3x2n.c      |   17 +++++++-------
 drivers/ata/pata_isapnp.c       |    5 ++--
 drivers/ata/pata_it8213.c       |    1 +
 drivers/ata/pata_it821x.c       |   42 ++++++++++++++++++----------------
 drivers/ata/pata_jmicron.c      |    1 +
 drivers/ata/pata_legacy.c       |    5 ++--
 drivers/ata/pata_marvell.c      |    1 +
 drivers/ata/pata_mpiix.c        |   13 ++++++-----
 drivers/ata/pata_netcell.c      |    7 +++---
 drivers/ata/pata_ns87410.c      |   11 +++++----
 drivers/ata/pata_ns87415.c      |    1 +
 drivers/ata/pata_oldpiix.c      |    1 +
 drivers/ata/pata_opti.c         |    9 ++++---
 drivers/ata/pata_optidma.c      |   19 ++++++++-------
 drivers/ata/pata_pcmcia.c       |   19 ++++++++-------
 drivers/ata/pata_pdc202xx_old.c |    1 +
 drivers/ata/pata_piccolo.c      |    9 ++++---
 drivers/ata/pata_qdi.c          |   15 +++++++-----
 drivers/ata/pata_radisys.c      |    1 +
 drivers/ata/pata_rdc.c          |    1 +
 drivers/ata/pata_rz1000.c       |    7 +++---
 drivers/ata/pata_sc1200.c       |   15 +++++++-----
 drivers/ata/pata_sch.c          |    1 +
 drivers/ata/pata_serverworks.c  |   11 +++++----
 drivers/ata/pata_sis.c          |    2 ++
 drivers/ata/pata_triflex.c      |   13 ++++++-----
 drivers/ata/pata_via.c          |   17 +++++++-------
 drivers/ata/pata_winbond.c      |    9 ++++---
 include/linux/libata.h          |    2 ++
 47 files changed, 278 insertions(+), 202 deletions(-)


diff --git a/drivers/ata/ata_generic.c b/drivers/ata/ata_generic.c
index 12e26c3..abae7d5 100644
--- a/drivers/ata/ata_generic.c
+++ b/drivers/ata/ata_generic.c
@@ -96,9 +96,10 @@ static struct scsi_host_template generic_sht = {
 };
 
 static struct ata_port_operations generic_port_ops = {
-	.inherits	= &ata_bmdma_port_ops,
-	.cable_detect	= ata_cable_unknown,
-	.set_mode	= generic_set_mode,
+	.inherits		= &ata_bmdma_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.cable_detect		= ata_cable_unknown,
+	.set_mode		= generic_set_mode,
 };
 
 static int all_generic_ide;		/* Set to claim all devices */
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c
index c338066..c5b1378 100644
--- a/drivers/ata/ata_piix.c
+++ b/drivers/ata/ata_piix.c
@@ -320,6 +320,7 @@ static struct scsi_host_template piix_sht = {
 
 static struct ata_port_operations piix_sata_ops = {
 	.inherits		= &ata_bmdma32_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
 	.sff_irq_check		= piix_irq_check,
 };
 
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
index 3558ca8..fa18482 100644
--- a/drivers/ata/libata-sff.c
+++ b/drivers/ata/libata-sff.c
@@ -674,11 +674,34 @@ void ata_sff_exec_command(struct ata_port *ap, const struct ata_taskfile *tf)
 	DPRINTK("ata%u: cmd 0x%X\n", ap->print_id, tf->command);
 
 	iowrite8(tf->command, ap->ioaddr.command_addr);
-	ata_sff_pause(ap);
+	/* Slow */
+        ata_sff_pause(ap);
 }
 EXPORT_SYMBOL_GPL(ata_sff_exec_command);
 
 /**
+ *	ata_sff_exec_command_nopost - issue ATA command to host controller
+ *	@ap: port to which command is being issued
+ *	@tf: ATA taskfile register set
+ *
+ *	Issues ATA command, with proper synchronization with interrupt
+ *	handler / other threads. This version of the helper does not protect
+ *	against any delayed writes done by the underlying fabric, it must
+ *	therefore not be used for MMIO devices unless the device handles
+ *	the 400nS command delay stall internally.
+ *
+ *	LOCKING:
+ *	spin_lock_irqsave(host lock)
+ */
+void ata_sff_exec_command_nopost(struct ata_port *ap,
+                                        const struct ata_taskfile *tf)
+{
+	DPRINTK("ata%u: cmd 0x%X\n", ap->print_id, tf->command);
+	iowrite8(tf->command, ap->ioaddr.command_addr);
+}
+EXPORT_SYMBOL_GPL(ata_sff_exec_command_nopost);
+
+/**
  *	ata_tf_to_host - issue ATA taskfile to host controller
  *	@ap: port to which command is being issued
  *	@tf: ATA taskfile register set
diff --git a/drivers/ata/pata_acpi.c b/drivers/ata/pata_acpi.c
index 9e33da9..6c5765b 100644
--- a/drivers/ata/pata_acpi.c
+++ b/drivers/ata/pata_acpi.c
@@ -217,6 +217,7 @@ static struct scsi_host_template pacpi_sht = {
 
 static struct ata_port_operations pacpi_ops = {
 	.inherits		= &ata_bmdma_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
 	.qc_issue		= pacpi_qc_issue,
 	.cable_detect		= pacpi_cable_detect,
 	.mode_filter		= pacpi_mode_filter,
diff --git a/drivers/ata/pata_ali.c b/drivers/ata/pata_ali.c
index 63ba48c..940bead 100644
--- a/drivers/ata/pata_ali.c
+++ b/drivers/ata/pata_ali.c
@@ -364,16 +364,18 @@ static struct scsi_host_template ali_sht = {
  */
 
 static struct ata_port_operations ali_early_port_ops = {
-	.inherits	= &ata_sff_port_ops,
-	.cable_detect	= ata_cable_40wire,
-	.set_piomode	= ali_set_piomode,
-	.sff_data_xfer  = ata_sff_data_xfer32,
+	.inherits		= &ata_sff_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.cable_detect		= ata_cable_40wire,
+	.set_piomode		= ali_set_piomode,
+	.sff_data_xfer  	= ata_sff_data_xfer32,
 };
 
 static const struct ata_port_operations ali_dma_base_ops = {
-	.inherits	= &ata_bmdma32_port_ops,
-	.set_piomode	= ali_set_piomode,
-	.set_dmamode	= ali_set_dmamode,
+	.inherits		= &ata_bmdma32_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.set_piomode		= ali_set_piomode,
+	.set_dmamode		= ali_set_dmamode,
 };
 
 /*
diff --git a/drivers/ata/pata_amd.c b/drivers/ata/pata_amd.c
index 567f3f7..15faa9b 100644
--- a/drivers/ata/pata_amd.c
+++ b/drivers/ata/pata_amd.c
@@ -393,44 +393,46 @@ static struct scsi_host_template amd_sht = {
 };
 
 static const struct ata_port_operations amd_base_port_ops = {
-	.inherits	= &ata_bmdma32_port_ops,
-	.prereset	= amd_pre_reset,
+	.inherits		= &ata_bmdma32_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.prereset		= amd_pre_reset,
 };
 
 static struct ata_port_operations amd33_port_ops = {
-	.inherits	= &amd_base_port_ops,
-	.cable_detect	= ata_cable_40wire,
-	.set_piomode	= amd33_set_piomode,
-	.set_dmamode	= amd33_set_dmamode,
+	.inherits		= &amd_base_port_ops,
+	.cable_detect		= ata_cable_40wire,
+	.set_piomode		= amd33_set_piomode,
+	.set_dmamode		= amd33_set_dmamode,
 };
 
 static struct ata_port_operations amd66_port_ops = {
-	.inherits	= &amd_base_port_ops,
-	.cable_detect	= ata_cable_unknown,
-	.set_piomode	= amd66_set_piomode,
-	.set_dmamode	= amd66_set_dmamode,
+	.inherits		= &amd_base_port_ops,
+	.cable_detect		= ata_cable_unknown,
+	.set_piomode		= amd66_set_piomode,
+	.set_dmamode		= amd66_set_dmamode,
 };
 
 static struct ata_port_operations amd100_port_ops = {
-	.inherits	= &amd_base_port_ops,
-	.cable_detect	= ata_cable_unknown,
-	.set_piomode	= amd100_set_piomode,
-	.set_dmamode	= amd100_set_dmamode,
+	.inherits		= &amd_base_port_ops,
+	.cable_detect		= ata_cable_unknown,
+	.set_piomode		= amd100_set_piomode,
+	.set_dmamode		= amd100_set_dmamode,
 };
 
 static struct ata_port_operations amd133_port_ops = {
-	.inherits	= &amd_base_port_ops,
-	.cable_detect	= amd_cable_detect,
-	.set_piomode	= amd133_set_piomode,
-	.set_dmamode	= amd133_set_dmamode,
+	.inherits		= &amd_base_port_ops,
+	.cable_detect		= amd_cable_detect,
+	.set_piomode		= amd133_set_piomode,
+	.set_dmamode		= amd133_set_dmamode,
 };
 
 static const struct ata_port_operations nv_base_port_ops = {
-	.inherits	= &ata_bmdma_port_ops,
-	.cable_detect	= ata_cable_ignore,
-	.mode_filter	= nv_mode_filter,
-	.prereset	= nv_pre_reset,
-	.host_stop	= nv_host_stop,
+	.inherits		= &ata_bmdma_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.cable_detect		= ata_cable_ignore,
+	.mode_filter		= nv_mode_filter,
+	.prereset		= nv_pre_reset,
+	.host_stop		= nv_host_stop,
 };
 
 static struct ata_port_operations nv100_port_ops = {
diff --git a/drivers/ata/pata_artop.c b/drivers/ata/pata_artop.c
index d332cfd..31a28f1 100644
--- a/drivers/ata/pata_artop.c
+++ b/drivers/ata/pata_artop.c
@@ -313,6 +313,7 @@ static struct scsi_host_template artop_sht = {
 
 static struct ata_port_operations artop6210_ops = {
 	.inherits		= &ata_bmdma_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
 	.cable_detect		= ata_cable_40wire,
 	.set_piomode		= artop6210_set_piomode,
 	.set_dmamode		= artop6210_set_dmamode,
@@ -322,6 +323,7 @@ static struct ata_port_operations artop6210_ops = {
 
 static struct ata_port_operations artop6260_ops = {
 	.inherits		= &ata_bmdma_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
 	.cable_detect		= artop6260_cable_detect,
 	.set_piomode		= artop6260_set_piomode,
 	.set_dmamode		= artop6260_set_dmamode,
diff --git a/drivers/ata/pata_atiixp.c b/drivers/ata/pata_atiixp.c
index ae4454d..3ded0e8 100644
--- a/drivers/ata/pata_atiixp.c
+++ b/drivers/ata/pata_atiixp.c
@@ -206,15 +206,16 @@ static struct scsi_host_template atiixp_sht = {
 };
 
 static struct ata_port_operations atiixp_port_ops = {
-	.inherits	= &ata_bmdma_port_ops,
+	.inherits		= &ata_bmdma_port_ops,
 
-	.qc_prep 	= ata_sff_dumb_qc_prep,
-	.bmdma_start 	= atiixp_bmdma_start,
-	.bmdma_stop	= atiixp_bmdma_stop,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.qc_prep 		= ata_sff_dumb_qc_prep,
+	.bmdma_start 		= atiixp_bmdma_start,
+	.bmdma_stop		= atiixp_bmdma_stop,
 
-	.cable_detect	= atiixp_cable_detect,
-	.set_piomode	= atiixp_set_piomode,
-	.set_dmamode	= atiixp_set_dmamode,
+	.cable_detect		= atiixp_cable_detect,
+	.set_piomode		= atiixp_set_piomode,
+	.set_dmamode		= atiixp_set_dmamode,
 };
 
 static int atiixp_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
diff --git a/drivers/ata/pata_atp867x.c b/drivers/ata/pata_atp867x.c
index 6fe7ded..4376581 100644
--- a/drivers/ata/pata_atp867x.c
+++ b/drivers/ata/pata_atp867x.c
@@ -276,6 +276,7 @@ static struct scsi_host_template atp867x_sht = {
 
 static struct ata_port_operations atp867x_ops = {
 	.inherits		= &ata_bmdma_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
 	.cable_detect		= atp867x_cable_detect,
 	.set_piomode		= atp867x_set_piomode,
 	.set_dmamode		= atp867x_set_dmamode,
diff --git a/drivers/ata/pata_cmd640.c b/drivers/ata/pata_cmd640.c
index 5acf9fa..8a4b990 100644
--- a/drivers/ata/pata_cmd640.c
+++ b/drivers/ata/pata_cmd640.c
@@ -169,13 +169,14 @@ static struct scsi_host_template cmd640_sht = {
 };
 
 static struct ata_port_operations cmd640_port_ops = {
-	.inherits	= &ata_bmdma_port_ops,
+	.inherits		= &ata_bmdma_port_ops,
 	/* In theory xfer_noirq is not needed once we kill the prefetcher */
-	.sff_data_xfer	= ata_sff_data_xfer_noirq,
-	.qc_issue	= cmd640_qc_issue,
-	.cable_detect	= ata_cable_40wire,
-	.set_piomode	= cmd640_set_piomode,
-	.port_start	= cmd640_port_start,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.sff_data_xfer		= ata_sff_data_xfer_noirq,
+	.qc_issue		= cmd640_qc_issue,
+	.cable_detect		= ata_cable_40wire,
+	.set_piomode		= cmd640_set_piomode,
+	.port_start		= cmd640_port_start,
 };
 
 static void cmd640_hardware_init(struct pci_dev *pdev)
diff --git a/drivers/ata/pata_cmd64x.c b/drivers/ata/pata_cmd64x.c
index b40bf0f..305a473 100644
--- a/drivers/ata/pata_cmd64x.c
+++ b/drivers/ata/pata_cmd64x.c
@@ -269,26 +269,27 @@ static struct scsi_host_template cmd64x_sht = {
 };
 
 static const struct ata_port_operations cmd64x_base_ops = {
-	.inherits	= &ata_bmdma_port_ops,
-	.set_piomode	= cmd64x_set_piomode,
-	.set_dmamode	= cmd64x_set_dmamode,
+	.inherits		= &ata_bmdma_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.set_piomode		= cmd64x_set_piomode,
+	.set_dmamode		= cmd64x_set_dmamode,
 };
 
 static struct ata_port_operations cmd64x_port_ops = {
-	.inherits	= &cmd64x_base_ops,
-	.cable_detect	= ata_cable_40wire,
+	.inherits		= &cmd64x_base_ops,
+	.cable_detect		= ata_cable_40wire,
 };
 
 static struct ata_port_operations cmd646r1_port_ops = {
-	.inherits	= &cmd64x_base_ops,
-	.bmdma_stop	= cmd646r1_bmdma_stop,
-	.cable_detect	= ata_cable_40wire,
+	.inherits		= &cmd64x_base_ops,
+	.bmdma_stop		= cmd646r1_bmdma_stop,
+	.cable_detect		= ata_cable_40wire,
 };
 
 static struct ata_port_operations cmd648_port_ops = {
-	.inherits	= &cmd64x_base_ops,
-	.bmdma_stop	= cmd648_bmdma_stop,
-	.cable_detect	= cmd648_cable_detect,
+	.inherits		= &cmd64x_base_ops,
+	.bmdma_stop		= cmd648_bmdma_stop,
+	.cable_detect		= cmd648_cable_detect,
 };
 
 static int cmd64x_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
diff --git a/drivers/ata/pata_cs5520.c b/drivers/ata/pata_cs5520.c
index 95ebdac..dab33ce 100644
--- a/drivers/ata/pata_cs5520.c
+++ b/drivers/ata/pata_cs5520.c
@@ -110,6 +110,7 @@ static struct scsi_host_template cs5520_sht = {
 
 static struct ata_port_operations cs5520_port_ops = {
 	.inherits		= &ata_bmdma_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
 	.qc_prep		= ata_sff_dumb_qc_prep,
 	.cable_detect		= ata_cable_40wire,
 	.set_piomode		= cs5520_set_piomode,
diff --git a/drivers/ata/pata_cs5530.c b/drivers/ata/pata_cs5530.c
index c974b05..a299607 100644
--- a/drivers/ata/pata_cs5530.c
+++ b/drivers/ata/pata_cs5530.c
@@ -165,14 +165,15 @@ static struct scsi_host_template cs5530_sht = {
 };
 
 static struct ata_port_operations cs5530_port_ops = {
-	.inherits	= &ata_bmdma_port_ops,
+	.inherits		= &ata_bmdma_port_ops,
 
-	.qc_prep 	= ata_sff_dumb_qc_prep,
-	.qc_issue	= cs5530_qc_issue,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.qc_prep 		= ata_sff_dumb_qc_prep,
+	.qc_issue		= cs5530_qc_issue,
 
-	.cable_detect	= ata_cable_40wire,
-	.set_piomode	= cs5530_set_piomode,
-	.set_dmamode	= cs5530_set_dmamode,
+	.cable_detect		= ata_cable_40wire,
+	.set_piomode		= cs5530_set_piomode,
+	.set_dmamode		= cs5530_set_dmamode,
 };
 
 static const struct dmi_system_id palmax_dmi_table[] = {
diff --git a/drivers/ata/pata_cs5535.c b/drivers/ata/pata_cs5535.c
index c50c3a4..fe10ffd 100644
--- a/drivers/ata/pata_cs5535.c
+++ b/drivers/ata/pata_cs5535.c
@@ -161,10 +161,11 @@ static struct scsi_host_template cs5535_sht = {
 };
 
 static struct ata_port_operations cs5535_port_ops = {
-	.inherits	= &ata_bmdma_port_ops,
-	.cable_detect	= cs5535_cable_detect,
-	.set_piomode	= cs5535_set_piomode,
-	.set_dmamode	= cs5535_set_dmamode,
+	.inherits		= &ata_bmdma_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.cable_detect		= cs5535_cable_detect,
+	.set_piomode		= cs5535_set_piomode,
+	.set_dmamode		= cs5535_set_dmamode,
 };
 
 /**
diff --git a/drivers/ata/pata_cs5536.c b/drivers/ata/pata_cs5536.c
index ffee397..c90a033 100644
--- a/drivers/ata/pata_cs5536.c
+++ b/drivers/ata/pata_cs5536.c
@@ -225,6 +225,7 @@ static struct scsi_host_template cs5536_sht = {
 
 static struct ata_port_operations cs5536_port_ops = {
 	.inherits		= &ata_bmdma32_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
 	.cable_detect		= cs5536_cable_detect,
 	.set_piomode		= cs5536_set_piomode,
 	.set_dmamode		= cs5536_set_dmamode,
diff --git a/drivers/ata/pata_efar.c b/drivers/ata/pata_efar.c
index 89076d5..fedc121 100644
--- a/drivers/ata/pata_efar.c
+++ b/drivers/ata/pata_efar.c
@@ -225,6 +225,7 @@ static struct scsi_host_template efar_sht = {
 
 static struct ata_port_operations efar_ops = {
 	.inherits		= &ata_bmdma_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
 	.cable_detect		= efar_cable_detect,
 	.set_piomode		= efar_set_piomode,
 	.set_dmamode		= efar_set_dmamode,
diff --git a/drivers/ata/pata_hpt366.c b/drivers/ata/pata_hpt366.c
index 3ec88f2..6bb4b52 100644
--- a/drivers/ata/pata_hpt366.c
+++ b/drivers/ata/pata_hpt366.c
@@ -270,11 +270,12 @@ static struct scsi_host_template hpt36x_sht = {
  */
 
 static struct ata_port_operations hpt366_port_ops = {
-	.inherits	= &ata_bmdma_port_ops,
-	.cable_detect	= hpt36x_cable_detect,
-	.mode_filter	= hpt366_filter,
-	.set_piomode	= hpt366_set_piomode,
-	.set_dmamode	= hpt366_set_dmamode,
+	.inherits		= &ata_bmdma_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.cable_detect		= hpt36x_cable_detect,
+	.mode_filter		= hpt366_filter,
+	.set_piomode		= hpt366_set_piomode,
+	.set_dmamode		= hpt366_set_dmamode,
 };
 
 /**
diff --git a/drivers/ata/pata_hpt37x.c b/drivers/ata/pata_hpt37x.c
index 228dc1a..ba398bd 100644
--- a/drivers/ata/pata_hpt37x.c
+++ b/drivers/ata/pata_hpt37x.c
@@ -565,15 +565,16 @@ static struct scsi_host_template hpt37x_sht = {
  */
 
 static struct ata_port_operations hpt370_port_ops = {
-	.inherits	= &ata_bmdma_port_ops,
+	.inherits		= &ata_bmdma_port_ops,
 
-	.bmdma_stop	= hpt370_bmdma_stop,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.bmdma_stop		= hpt370_bmdma_stop,
 
-	.mode_filter	= hpt370_filter,
-	.cable_detect	= hpt37x_cable_detect,
-	.set_piomode	= hpt370_set_piomode,
-	.set_dmamode	= hpt370_set_dmamode,
-	.prereset	= hpt37x_pre_reset,
+	.mode_filter		= hpt370_filter,
+	.cable_detect		= hpt37x_cable_detect,
+	.set_piomode		= hpt370_set_piomode,
+	.set_dmamode		= hpt370_set_dmamode,
+	.prereset		= hpt37x_pre_reset,
 };
 
 /*
@@ -581,8 +582,8 @@ static struct ata_port_operations hpt370_port_ops = {
  */
 
 static struct ata_port_operations hpt370a_port_ops = {
-	.inherits	= &hpt370_port_ops,
-	.mode_filter	= hpt370a_filter,
+	.inherits		= &hpt370_port_ops,
+	.mode_filter		= hpt370a_filter,
 };
 
 /*
@@ -593,12 +594,13 @@ static struct ata_port_operations hpt370a_port_ops = {
 static struct ata_port_operations hpt372_port_ops = {
 	.inherits	= &ata_bmdma_port_ops,
 
-	.bmdma_stop	= hpt37x_bmdma_stop,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.bmdma_stop		= hpt37x_bmdma_stop,
 
-	.cable_detect	= hpt37x_cable_detect,
-	.set_piomode	= hpt372_set_piomode,
-	.set_dmamode	= hpt372_set_dmamode,
-	.prereset	= hpt37x_pre_reset,
+	.cable_detect		= hpt37x_cable_detect,
+	.set_piomode		= hpt372_set_piomode,
+	.set_dmamode		= hpt372_set_dmamode,
+	.prereset		= hpt37x_pre_reset,
 };
 
 /*
@@ -607,9 +609,9 @@ static struct ata_port_operations hpt372_port_ops = {
  */
 
 static struct ata_port_operations hpt374_fn1_port_ops = {
-	.inherits	= &hpt372_port_ops,
-	.cable_detect	= hpt374_fn1_cable_detect,
-	.prereset	= hpt37x_pre_reset,
+	.inherits		= &hpt372_port_ops,
+	.cable_detect		= hpt374_fn1_cable_detect,
+	.prereset		= hpt37x_pre_reset,
 };
 
 /**
diff --git a/drivers/ata/pata_hpt3x2n.c b/drivers/ata/pata_hpt3x2n.c
index 4a29122..c396a94 100644
--- a/drivers/ata/pata_hpt3x2n.c
+++ b/drivers/ata/pata_hpt3x2n.c
@@ -332,17 +332,18 @@ static struct scsi_host_template hpt3x2n_sht = {
  */
 
 static struct ata_port_operations hpt3x2n_port_ops = {
-	.inherits	= &ata_bmdma_port_ops,
+	.inherits		= &ata_bmdma_port_ops,
 
-	.bmdma_stop	= hpt3x2n_bmdma_stop,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.bmdma_stop		= hpt3x2n_bmdma_stop,
 
-	.qc_defer	= hpt3x2n_qc_defer,
-	.qc_issue	= hpt3x2n_qc_issue,
+	.qc_defer		= hpt3x2n_qc_defer,
+	.qc_issue		= hpt3x2n_qc_issue,
 
-	.cable_detect	= hpt3x2n_cable_detect,
-	.set_piomode	= hpt3x2n_set_piomode,
-	.set_dmamode	= hpt3x2n_set_dmamode,
-	.prereset	= hpt3x2n_pre_reset,
+	.cable_detect		= hpt3x2n_cable_detect,
+	.set_piomode		= hpt3x2n_set_piomode,
+	.set_dmamode		= hpt3x2n_set_dmamode,
+	.prereset		= hpt3x2n_pre_reset,
 };
 
 /**
diff --git a/drivers/ata/pata_isapnp.c b/drivers/ata/pata_isapnp.c
index 4bceb88..35df122 100644
--- a/drivers/ata/pata_isapnp.c
+++ b/drivers/ata/pata_isapnp.c
@@ -24,8 +24,9 @@ static struct scsi_host_template isapnp_sht = {
 };
 
 static struct ata_port_operations isapnp_port_ops = {
-	.inherits	= &ata_sff_port_ops,
-	.cable_detect	= ata_cable_40wire,
+	.inherits		= &ata_sff_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.cable_detect		= ata_cable_40wire,
 };
 
 static struct ata_port_operations isapnp_noalt_port_ops = {
diff --git a/drivers/ata/pata_it8213.c b/drivers/ata/pata_it8213.c
index 8f3325a..378be4f 100644
--- a/drivers/ata/pata_it8213.c
+++ b/drivers/ata/pata_it8213.c
@@ -235,6 +235,7 @@ static struct scsi_host_template it8213_sht = {
 
 static struct ata_port_operations it8213_ops = {
 	.inherits		= &ata_bmdma_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
 	.cable_detect		= it8213_cable_detect,
 	.set_piomode		= it8213_set_piomode,
 	.set_dmamode		= it8213_set_dmamode,
diff --git a/drivers/ata/pata_it821x.c b/drivers/ata/pata_it821x.c
index edc5c1f..bc5801d 100644
--- a/drivers/ata/pata_it821x.c
+++ b/drivers/ata/pata_it821x.c
@@ -815,35 +815,37 @@ static struct ata_port_operations it821x_smart_port_ops = {
 };
 
 static struct ata_port_operations it821x_passthru_port_ops = {
-	.inherits	= &ata_bmdma_port_ops,
+	.inherits		= &ata_bmdma_port_ops,
 
-	.check_atapi_dma= it821x_check_atapi_dma,
-	.sff_dev_select	= it821x_passthru_dev_select,
-	.bmdma_start 	= it821x_passthru_bmdma_start,
-	.bmdma_stop	= it821x_passthru_bmdma_stop,
-	.qc_issue	= it821x_passthru_qc_issue,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.check_atapi_dma	= it821x_check_atapi_dma,
+	.sff_dev_select		= it821x_passthru_dev_select,
+	.bmdma_start 		= it821x_passthru_bmdma_start,
+	.bmdma_stop		= it821x_passthru_bmdma_stop,
+	.qc_issue		= it821x_passthru_qc_issue,
 
-	.cable_detect	= ata_cable_unknown,
-	.set_piomode	= it821x_passthru_set_piomode,
-	.set_dmamode	= it821x_passthru_set_dmamode,
+	.cable_detect		= ata_cable_unknown,
+	.set_piomode		= it821x_passthru_set_piomode,
+	.set_dmamode		= it821x_passthru_set_dmamode,
 
-	.port_start	= it821x_port_start,
+	.port_start		= it821x_port_start,
 };
 
 static struct ata_port_operations it821x_rdc_port_ops = {
-	.inherits	= &ata_bmdma_port_ops,
+	.inherits		= &ata_bmdma_port_ops,
 
-	.check_atapi_dma= it821x_check_atapi_dma,
-	.sff_dev_select	= it821x_passthru_dev_select,
-	.bmdma_start 	= it821x_passthru_bmdma_start,
-	.bmdma_stop	= it821x_passthru_bmdma_stop,
-	.qc_issue	= it821x_passthru_qc_issue,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.check_atapi_dma	= it821x_check_atapi_dma,
+	.sff_dev_select		= it821x_passthru_dev_select,
+	.bmdma_start 		= it821x_passthru_bmdma_start,
+	.bmdma_stop		= it821x_passthru_bmdma_stop,
+	.qc_issue		= it821x_passthru_qc_issue,
 
-	.cable_detect	= it821x_rdc_cable,
-	.set_piomode	= it821x_passthru_set_piomode,
-	.set_dmamode	= it821x_passthru_set_dmamode,
+	.cable_detect		= it821x_rdc_cable,
+	.set_piomode		= it821x_passthru_set_piomode,
+	.set_dmamode		= it821x_passthru_set_dmamode,
 
-	.port_start	= it821x_port_start,
+	.port_start		= it821x_port_start,
 };
 
 static void it821x_disable_raid(struct pci_dev *pdev)
diff --git a/drivers/ata/pata_jmicron.c b/drivers/ata/pata_jmicron.c
index 3a1474a..ba43bd3 100644
--- a/drivers/ata/pata_jmicron.c
+++ b/drivers/ata/pata_jmicron.c
@@ -113,6 +113,7 @@ static struct scsi_host_template jmicron_sht = {
 
 static struct ata_port_operations jmicron_ops = {
 	.inherits		= &ata_bmdma_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
 	.prereset		= jmicron_pre_reset,
 };
 
diff --git a/drivers/ata/pata_legacy.c b/drivers/ata/pata_legacy.c
index 9df1ff7..76b31c7 100644
--- a/drivers/ata/pata_legacy.c
+++ b/drivers/ata/pata_legacy.c
@@ -218,8 +218,9 @@ static struct scsi_host_template legacy_sht = {
 };
 
 static const struct ata_port_operations legacy_base_port_ops = {
-	.inherits	= &ata_sff_port_ops,
-	.cable_detect	= ata_cable_40wire,
+	.inherits		= &ata_sff_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.cable_detect		= ata_cable_40wire,
 };
 
 /*
diff --git a/drivers/ata/pata_marvell.c b/drivers/ata/pata_marvell.c
index b351d81..4031bfd 100644
--- a/drivers/ata/pata_marvell.c
+++ b/drivers/ata/pata_marvell.c
@@ -102,6 +102,7 @@ static struct scsi_host_template marvell_sht = {
 
 static struct ata_port_operations marvell_ops = {
 	.inherits		= &ata_bmdma_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
 	.cable_detect		= marvell_cable_detect,
 	.prereset		= marvell_pre_reset,
 };
diff --git a/drivers/ata/pata_mpiix.c b/drivers/ata/pata_mpiix.c
index b21f002..2be0ccd 100644
--- a/drivers/ata/pata_mpiix.c
+++ b/drivers/ata/pata_mpiix.c
@@ -141,12 +141,13 @@ static struct scsi_host_template mpiix_sht = {
 };
 
 static struct ata_port_operations mpiix_port_ops = {
-	.inherits	= &ata_sff_port_ops,
-	.qc_issue	= mpiix_qc_issue,
-	.cable_detect	= ata_cable_40wire,
-	.set_piomode	= mpiix_set_piomode,
-	.prereset	= mpiix_pre_reset,
-	.sff_data_xfer	= ata_sff_data_xfer32,
+	.inherits		= &ata_sff_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.qc_issue		= mpiix_qc_issue,
+	.cable_detect		= ata_cable_40wire,
+	.set_piomode		= mpiix_set_piomode,
+	.prereset		= mpiix_pre_reset,
+	.sff_data_xfer		= ata_sff_data_xfer32,
 };
 
 static int mpiix_init_one(struct pci_dev *dev, const struct pci_device_id *id)
diff --git a/drivers/ata/pata_netcell.c b/drivers/ata/pata_netcell.c
index f0d52f7..7472fad 100644
--- a/drivers/ata/pata_netcell.c
+++ b/drivers/ata/pata_netcell.c
@@ -35,9 +35,10 @@ static struct scsi_host_template netcell_sht = {
 };
 
 static struct ata_port_operations netcell_ops = {
-	.inherits	= &ata_bmdma_port_ops,
-	.cable_detect	= ata_cable_80wire,
-	.read_id	= netcell_read_id,
+	.inherits	= 	&ata_bmdma_port_ops,
+	.sff_exec_command = 	ata_sff_exec_command_nopost,
+	.cable_detect	= 	ata_cable_80wire,
+	.read_id	= 	netcell_read_id,
 };
 
 
diff --git a/drivers/ata/pata_ns87410.c b/drivers/ata/pata_ns87410.c
index ca53fac..7d2a866 100644
--- a/drivers/ata/pata_ns87410.c
+++ b/drivers/ata/pata_ns87410.c
@@ -133,11 +133,12 @@ static struct scsi_host_template ns87410_sht = {
 };
 
 static struct ata_port_operations ns87410_port_ops = {
-	.inherits	= &ata_sff_port_ops,
-	.qc_issue	= ns87410_qc_issue,
-	.cable_detect	= ata_cable_40wire,
-	.set_piomode	= ns87410_set_piomode,
-	.prereset	= ns87410_pre_reset,
+	.inherits		= &ata_sff_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.qc_issue		= ns87410_qc_issue,
+	.cable_detect		= ata_cable_40wire,
+	.set_piomode		= ns87410_set_piomode,
+	.prereset		= ns87410_pre_reset,
 };
 
 static int ns87410_init_one(struct pci_dev *dev, const struct pci_device_id *id)
diff --git a/drivers/ata/pata_ns87415.c b/drivers/ata/pata_ns87415.c
index 061aa1c..6f7c647 100644
--- a/drivers/ata/pata_ns87415.c
+++ b/drivers/ata/pata_ns87415.c
@@ -302,6 +302,7 @@ static u8 ns87560_bmdma_status(struct ata_port *ap)
 static struct ata_port_operations ns87415_pata_ops = {
 	.inherits		= &ata_bmdma_port_ops,
 
+	.sff_exec_command	= ata_sff_exec_command_nopost,
 	.check_atapi_dma	= ns87415_check_atapi_dma,
 	.bmdma_setup		= ns87415_bmdma_setup,
 	.bmdma_start		= ns87415_bmdma_start,
diff --git a/drivers/ata/pata_oldpiix.c b/drivers/ata/pata_oldpiix.c
index 9a8687d..f49c60f 100644
--- a/drivers/ata/pata_oldpiix.c
+++ b/drivers/ata/pata_oldpiix.c
@@ -210,6 +210,7 @@ static struct scsi_host_template oldpiix_sht = {
 
 static struct ata_port_operations oldpiix_pata_ops = {
 	.inherits		= &ata_bmdma_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
 	.qc_issue		= oldpiix_qc_issue,
 	.cable_detect		= ata_cable_40wire,
 	.set_piomode		= oldpiix_set_piomode,
diff --git a/drivers/ata/pata_opti.c b/drivers/ata/pata_opti.c
index 99eddda..c4f436a 100644
--- a/drivers/ata/pata_opti.c
+++ b/drivers/ata/pata_opti.c
@@ -153,10 +153,11 @@ static struct scsi_host_template opti_sht = {
 };
 
 static struct ata_port_operations opti_port_ops = {
-	.inherits	= &ata_sff_port_ops,
-	.cable_detect	= ata_cable_40wire,
-	.set_piomode	= opti_set_piomode,
-	.prereset	= opti_pre_reset,
+	.inherits		= &ata_sff_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.cable_detect		= ata_cable_40wire,
+	.set_piomode		= opti_set_piomode,
+	.prereset		= opti_pre_reset,
 };
 
 static int opti_init_one(struct pci_dev *dev, const struct pci_device_id *id)
diff --git a/drivers/ata/pata_optidma.c b/drivers/ata/pata_optidma.c
index 86885a4..ab36c1b 100644
--- a/drivers/ata/pata_optidma.c
+++ b/drivers/ata/pata_optidma.c
@@ -338,18 +338,19 @@ static struct scsi_host_template optidma_sht = {
 };
 
 static struct ata_port_operations optidma_port_ops = {
-	.inherits	= &ata_bmdma_port_ops,
-	.cable_detect	= ata_cable_40wire,
-	.set_piomode	= optidma_set_pio_mode,
-	.set_dmamode	= optidma_set_dma_mode,
-	.set_mode	= optidma_set_mode,
-	.prereset	= optidma_pre_reset,
+	.inherits		= &ata_bmdma_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.cable_detect		= ata_cable_40wire,
+	.set_piomode		= optidma_set_pio_mode,
+	.set_dmamode		= optidma_set_dma_mode,
+	.set_mode		= optidma_set_mode,
+	.prereset		= optidma_pre_reset,
 };
 
 static struct ata_port_operations optiplus_port_ops = {
-	.inherits	= &optidma_port_ops,
-	.set_piomode	= optiplus_set_pio_mode,
-	.set_dmamode	= optiplus_set_dma_mode,
+	.inherits		= &optidma_port_ops,
+	.set_piomode		= optiplus_set_pio_mode,
+	.set_dmamode		= optiplus_set_dma_mode,
 };
 
 /**
diff --git a/drivers/ata/pata_pcmcia.c b/drivers/ata/pata_pcmcia.c
index 147de2f..67a2964 100644
--- a/drivers/ata/pata_pcmcia.c
+++ b/drivers/ata/pata_pcmcia.c
@@ -163,18 +163,19 @@ static struct scsi_host_template pcmcia_sht = {
 };
 
 static struct ata_port_operations pcmcia_port_ops = {
-	.inherits	= &ata_sff_port_ops,
-	.sff_data_xfer	= ata_sff_data_xfer_noirq,
-	.cable_detect	= ata_cable_40wire,
-	.set_mode	= pcmcia_set_mode,
+	.inherits		= &ata_sff_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.sff_data_xfer		= ata_sff_data_xfer_noirq,
+	.cable_detect		= ata_cable_40wire,
+	.set_mode		= pcmcia_set_mode,
 };
 
 static struct ata_port_operations pcmcia_8bit_port_ops = {
-	.inherits	= &ata_sff_port_ops,
-	.sff_data_xfer	= ata_data_xfer_8bit,
-	.cable_detect	= ata_cable_40wire,
-	.set_mode	= pcmcia_set_mode_8bit,
-	.drain_fifo	= pcmcia_8bit_drain_fifo,
+	.inherits		= &ata_sff_port_ops,
+	.sff_data_xfer		= ata_data_xfer_8bit,
+	.cable_detect		= ata_cable_40wire,
+	.set_mode		= pcmcia_set_mode_8bit,
+	.drain_fifo		= pcmcia_8bit_drain_fifo,
 };
 
 
diff --git a/drivers/ata/pata_pdc202xx_old.c b/drivers/ata/pata_pdc202xx_old.c
index 2911120..28e42eb 100644
--- a/drivers/ata/pata_pdc202xx_old.c
+++ b/drivers/ata/pata_pdc202xx_old.c
@@ -277,6 +277,7 @@ static struct scsi_host_template pdc202xx_sht = {
 static struct ata_port_operations pdc2024x_port_ops = {
 	.inherits		= &ata_bmdma_port_ops,
 
+	.sff_exec_command	= ata_sff_exec_command_nopost,
 	.cable_detect		= ata_cable_40wire,
 	.set_piomode		= pdc202xx_set_piomode,
 	.set_dmamode		= pdc202xx_set_dmamode,
diff --git a/drivers/ata/pata_piccolo.c b/drivers/ata/pata_piccolo.c
index bfe0180..38bd4f1 100644
--- a/drivers/ata/pata_piccolo.c
+++ b/drivers/ata/pata_piccolo.c
@@ -68,10 +68,11 @@ static struct scsi_host_template tosh_sht = {
 };
 
 static struct ata_port_operations tosh_port_ops = {
-	.inherits	= &ata_bmdma_port_ops,
-	.cable_detect	= ata_cable_unknown,
-	.set_piomode	= tosh_set_piomode,
-	.set_dmamode	= tosh_set_dmamode
+	.inherits		= &ata_bmdma_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.cable_detect		= ata_cable_unknown,
+	.set_piomode		= tosh_set_piomode,
+	.set_dmamode		= tosh_set_dmamode
 };
 
 /**
diff --git a/drivers/ata/pata_qdi.c b/drivers/ata/pata_qdi.c
index 45879dc..c9a468c 100644
--- a/drivers/ata/pata_qdi.c
+++ b/drivers/ata/pata_qdi.c
@@ -158,16 +158,17 @@ static struct scsi_host_template qdi_sht = {
 };
 
 static struct ata_port_operations qdi6500_port_ops = {
-	.inherits	= &ata_sff_port_ops,
-	.qc_issue	= qdi_qc_issue,
-	.sff_data_xfer	= qdi_data_xfer,
-	.cable_detect	= ata_cable_40wire,
-	.set_piomode	= qdi6500_set_piomode,
+	.inherits	= 	&ata_sff_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.qc_issue	= 	qdi_qc_issue,
+	.sff_data_xfer	= 	qdi_data_xfer,
+	.cable_detect	= 	ata_cable_40wire,
+	.set_piomode	= 	qdi6500_set_piomode,
 };
 
 static struct ata_port_operations qdi6580_port_ops = {
-	.inherits	= &qdi6500_port_ops,
-	.set_piomode	= qdi6580_set_piomode,
+	.inherits	= 	&qdi6500_port_ops,
+	.set_piomode	= 	qdi6580_set_piomode,
 };
 
 /**
diff --git a/drivers/ata/pata_radisys.c b/drivers/ata/pata_radisys.c
index 4fd25e7..7390e2d 100644
--- a/drivers/ata/pata_radisys.c
+++ b/drivers/ata/pata_radisys.c
@@ -189,6 +189,7 @@ static struct scsi_host_template radisys_sht = {
 
 static struct ata_port_operations radisys_pata_ops = {
 	.inherits		= &ata_bmdma_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
 	.qc_issue		= radisys_qc_issue,
 	.cable_detect		= ata_cable_unknown,
 	.set_piomode		= radisys_set_piomode,
diff --git a/drivers/ata/pata_rdc.c b/drivers/ata/pata_rdc.c
index 237a24d..7a76bde 100644
--- a/drivers/ata/pata_rdc.c
+++ b/drivers/ata/pata_rdc.c
@@ -274,6 +274,7 @@ static void rdc_set_dmamode(struct ata_port *ap, struct ata_device *adev)
 
 static struct ata_port_operations rdc_pata_ops = {
 	.inherits		= &ata_bmdma32_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
 	.cable_detect		= rdc_pata_cable_detect,
 	.set_piomode		= rdc_set_piomode,
 	.set_dmamode		= rdc_set_dmamode,
diff --git a/drivers/ata/pata_rz1000.c b/drivers/ata/pata_rz1000.c
index 2932998..ab4e6cc 100644
--- a/drivers/ata/pata_rz1000.c
+++ b/drivers/ata/pata_rz1000.c
@@ -55,9 +55,10 @@ static struct scsi_host_template rz1000_sht = {
 };
 
 static struct ata_port_operations rz1000_port_ops = {
-	.inherits	= &ata_sff_port_ops,
-	.cable_detect	= ata_cable_40wire,
-	.set_mode	= rz1000_set_mode,
+	.inherits		= &ata_sff_port_ops,
+	.cable_detect		= ata_cable_40wire,
+	.set_mode		= rz1000_set_mode,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
 };
 
 static int rz1000_fifo_disable(struct pci_dev *pdev)
diff --git a/drivers/ata/pata_sc1200.c b/drivers/ata/pata_sc1200.c
index 3bbed83..8739ccc 100644
--- a/drivers/ata/pata_sc1200.c
+++ b/drivers/ata/pata_sc1200.c
@@ -208,13 +208,14 @@ static struct scsi_host_template sc1200_sht = {
 };
 
 static struct ata_port_operations sc1200_port_ops = {
-	.inherits	= &ata_bmdma_port_ops,
-	.qc_prep 	= ata_sff_dumb_qc_prep,
-	.qc_issue	= sc1200_qc_issue,
-	.qc_defer	= sc1200_qc_defer,
-	.cable_detect	= ata_cable_40wire,
-	.set_piomode	= sc1200_set_piomode,
-	.set_dmamode	= sc1200_set_dmamode,
+	.inherits		= &ata_bmdma_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.qc_prep 		= ata_sff_dumb_qc_prep,
+	.qc_issue		= sc1200_qc_issue,
+	.qc_defer		= sc1200_qc_defer,
+	.cable_detect		= ata_cable_40wire,
+	.set_piomode		= sc1200_set_piomode,
+	.set_dmamode		= sc1200_set_dmamode,
 };
 
 /**
diff --git a/drivers/ata/pata_sch.c b/drivers/ata/pata_sch.c
index 99cceb4..9a0c0e3 100644
--- a/drivers/ata/pata_sch.c
+++ b/drivers/ata/pata_sch.c
@@ -77,6 +77,7 @@ static struct scsi_host_template sch_sht = {
 
 static struct ata_port_operations sch_pata_ops = {
 	.inherits		= &ata_bmdma_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
 	.cable_detect		= ata_cable_unknown,
 	.set_piomode		= sch_set_piomode,
 	.set_dmamode		= sch_set_dmamode,
diff --git a/drivers/ata/pata_serverworks.c b/drivers/ata/pata_serverworks.c
index c859767..6714adf 100644
--- a/drivers/ata/pata_serverworks.c
+++ b/drivers/ata/pata_serverworks.c
@@ -301,11 +301,12 @@ static struct scsi_host_template serverworks_sht = {
 };
 
 static struct ata_port_operations serverworks_osb4_port_ops = {
-	.inherits	= &ata_bmdma_port_ops,
-	.cable_detect	= serverworks_cable_detect,
-	.mode_filter	= serverworks_osb4_filter,
-	.set_piomode	= serverworks_set_piomode,
-	.set_dmamode	= serverworks_set_dmamode,
+	.inherits		= &ata_bmdma_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.cable_detect		= serverworks_cable_detect,
+	.mode_filter		= serverworks_osb4_filter,
+	.set_piomode		= serverworks_set_piomode,
+	.set_dmamode		= serverworks_set_dmamode,
 };
 
 static struct ata_port_operations serverworks_csb_port_ops = {
diff --git a/drivers/ata/pata_sis.c b/drivers/ata/pata_sis.c
index 5c30d56..3d9a940 100644
--- a/drivers/ata/pata_sis.c
+++ b/drivers/ata/pata_sis.c
@@ -505,6 +505,7 @@ static struct scsi_host_template sis_sht = {
 
 static struct ata_port_operations sis_133_for_sata_ops = {
 	.inherits		= &ata_bmdma_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
 	.set_piomode		= sis_133_set_piomode,
 	.set_dmamode		= sis_133_set_dmamode,
 	.cable_detect		= sis_133_cable_detect,
@@ -512,6 +513,7 @@ static struct ata_port_operations sis_133_for_sata_ops = {
 
 static struct ata_port_operations sis_base_ops = {
 	.inherits		= &ata_bmdma_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
 	.prereset		= sis_pre_reset,
 };
 
diff --git a/drivers/ata/pata_triflex.c b/drivers/ata/pata_triflex.c
index f1f13ff..1a40ded 100644
--- a/drivers/ata/pata_triflex.c
+++ b/drivers/ata/pata_triflex.c
@@ -179,12 +179,13 @@ static struct scsi_host_template triflex_sht = {
 };
 
 static struct ata_port_operations triflex_port_ops = {
-	.inherits	= &ata_bmdma_port_ops,
-	.bmdma_start 	= triflex_bmdma_start,
-	.bmdma_stop	= triflex_bmdma_stop,
-	.cable_detect	= ata_cable_40wire,
-	.set_piomode	= triflex_set_piomode,
-	.prereset	= triflex_prereset,
+	.inherits		= &ata_bmdma_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.bmdma_start 		= triflex_bmdma_start,
+	.bmdma_stop		= triflex_bmdma_stop,
+	.cable_detect		= ata_cable_40wire,
+	.set_piomode		= triflex_set_piomode,
+	.prereset		= triflex_prereset,
 };
 
 static int triflex_init_one(struct pci_dev *dev, const struct pci_device_id *id)
diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c
index eccfed2..671e0cb 100644
--- a/drivers/ata/pata_via.c
+++ b/drivers/ata/pata_via.c
@@ -439,14 +439,15 @@ static struct scsi_host_template via_sht = {
 };
 
 static struct ata_port_operations via_port_ops = {
-	.inherits	= &ata_bmdma_port_ops,
-	.cable_detect	= via_cable_detect,
-	.set_piomode	= via_set_piomode,
-	.set_dmamode	= via_set_dmamode,
-	.prereset	= via_pre_reset,
-	.sff_tf_load	= via_tf_load,
-	.port_start	= via_port_start,
-	.mode_filter	= via_mode_filter,
+	.inherits		= &ata_bmdma_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.cable_detect		= via_cable_detect,
+	.set_piomode		= via_set_piomode,
+	.set_dmamode		= via_set_dmamode,
+	.prereset		= via_pre_reset,
+	.sff_tf_load		= via_tf_load,
+	.port_start		= via_port_start,
+	.mode_filter		= via_mode_filter,
 };
 
 static struct ata_port_operations via_port_ops_noirq = {
diff --git a/drivers/ata/pata_winbond.c b/drivers/ata/pata_winbond.c
index 6d8619b..066deea 100644
--- a/drivers/ata/pata_winbond.c
+++ b/drivers/ata/pata_winbond.c
@@ -126,10 +126,11 @@ static struct scsi_host_template winbond_sht = {
 };
 
 static struct ata_port_operations winbond_port_ops = {
-	.inherits	= &ata_sff_port_ops,
-	.sff_data_xfer	= winbond_data_xfer,
-	.cable_detect	= ata_cable_40wire,
-	.set_piomode	= winbond_set_piomode,
+	.inherits	= 	&ata_sff_port_ops,
+	.sff_exec_command	= ata_sff_exec_command_nopost,
+	.sff_data_xfer	= 	winbond_data_xfer,
+	.cable_detect	= 	ata_cable_40wire,
+	.set_piomode	= 	winbond_set_piomode,
 };
 
 /**
diff --git a/include/linux/libata.h b/include/linux/libata.h
index a85adc2..ac70e4d 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -1591,6 +1591,8 @@ extern void ata_sff_tf_load(struct ata_port *ap, const struct ata_taskfile *tf);
 extern void ata_sff_tf_read(struct ata_port *ap, struct ata_taskfile *tf);
 extern void ata_sff_exec_command(struct ata_port *ap,
 				 const struct ata_taskfile *tf);
+extern void ata_sff_exec_command_nopost(struct ata_port *ap,
+				 const struct ata_taskfile *tf);
 extern unsigned int ata_sff_data_xfer(struct ata_device *dev,
 			unsigned char *buf, unsigned int buflen, int rw);
 extern unsigned int ata_sff_data_xfer32(struct ata_device *dev,

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ