pata_artop: Serializing support
authorAlan Cox <alan@redhat.com>
Tue, 24 Mar 2009 10:21:49 +0000 (10:21 +0000)
committerJeff Garzik <jgarzik@redhat.com>
Wed, 25 Mar 2009 02:45:05 +0000 (22:45 -0400)
Enable both ports on the 6210 and serialize them

Signed-off-by: Alan Cox <alan@redhat.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
drivers/ata/pata_artop.c

index 07c7fae6da1305fa903032cacf7fa089e129dac2..d332cfdb0f30848d5d6dc077779b09f95dc598bd 100644 (file)
@@ -12,7 +12,6 @@
  *             performance Alessandro Zummo <alessandro.zummo@towertech.it>
  *
  *     TODO
- *     850 serialization once the core supports it
  *     Investigate no_dsc on 850R
  *     Clock detect
  */
@@ -29,7 +28,7 @@
 #include <linux/ata.h>
 
 #define DRV_NAME       "pata_artop"
-#define DRV_VERSION    "0.4.4"
+#define DRV_VERSION    "0.4.5"
 
 /*
  *     The ARTOP has 33 Mhz and "over clocked" timing tables. Until we
@@ -283,6 +282,31 @@ static void artop6260_set_dmamode (struct ata_port *ap, struct ata_device *adev)
        pci_write_config_byte(pdev, 0x44 + ap->port_no, ultra);
 }
 
+/**
+ *     artop_6210_qc_defer     -       implement serialization
+ *     @qc: command
+ *
+ *     Issue commands per host on this chip.
+ */
+
+static int artop6210_qc_defer(struct ata_queued_cmd *qc)
+{
+       struct ata_host *host = qc->ap->host;
+       struct ata_port *alt = host->ports[1 ^ qc->ap->port_no];
+       int rc;
+
+       /* First apply the usual rules */
+       rc = ata_std_qc_defer(qc);
+       if (rc != 0)
+               return rc;
+
+       /* Now apply serialization rules. Only allow a command if the
+          other channel state machine is idle */
+       if (alt && alt->qc_active)
+               return  ATA_DEFER_PORT;
+       return 0;
+}
+
 static struct scsi_host_template artop_sht = {
        ATA_BMDMA_SHT(DRV_NAME),
 };
@@ -293,6 +317,7 @@ static struct ata_port_operations artop6210_ops = {
        .set_piomode            = artop6210_set_piomode,
        .set_dmamode            = artop6210_set_dmamode,
        .prereset               = artop6210_pre_reset,
+       .qc_defer               = artop6210_qc_defer,
 };
 
 static struct ata_port_operations artop6260_ops = {
@@ -362,12 +387,8 @@ static int artop_init_one (struct pci_dev *pdev, const struct pci_device_id *id)
 
        if (id->driver_data == 0) {     /* 6210 variant */
                ppi[0] = &info_6210;
-               ppi[1] = &ata_dummy_port_info;
                /* BIOS may have left us in UDMA, clear it before libata probe */
                pci_write_config_byte(pdev, 0x54, 0);
-               /* For the moment (also lacks dsc) */
-               printk(KERN_WARNING "ARTOP 6210 requires serialize functionality not yet supported by libata.\n");
-               printk(KERN_WARNING "Secondary ATA ports will not be activated.\n");
        }
        else if (id->driver_data == 1)  /* 6260 */
                ppi[0] = &info_626x;