All of lore.kernel.org
 help / color / mirror / Atom feed
* [SATA] libata-dev queue updated
@ 2005-06-04  6:08 Jeff Garzik
  2005-06-04 15:17 ` Greg Stark
  0 siblings, 1 reply; 57+ messages in thread
From: Jeff Garzik @ 2005-06-04  6:08 UTC (permalink / raw)
  To: linux-ide; +Cc: Linux Kernel, Andrew Morton, James Bottomley

[-- Attachment #1: Type: text/plain, Size: 808 bytes --]


Several updates to the libata-dev.git repository.  Some of the branches 
have been folded into a new upstream-2.6.13 branch, which holds several 
changes (see attached).  Other branches were updated to the most recent 
kernel, which contained doc updates that caused some minor merge conflicts.

I haven't yet updated 'passthru' and 'chs-support' branches to the 
latest kernel.

Git Repository URL:
rsync://rsync.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev.git

List of branches:
adma          chs-support  master    pdc2027x           sleeping-eh
adma-mwi      iomap        ncq       promise-sata-pata  upstream-2.6.13
atapi-enable  iomap-step1  passthru  sil24

The "sleeping-eh" branch will be going upstream via James B and the SCSI 
crew (sounds like a hiphop group, doesn't it?)

	Jeff




[-- Attachment #2: libata-2.6.13.patch --]
[-- Type: text/x-patch, Size: 12786 bytes --]


Brad Campbell <brad@wasp.net.au>:
  libata basic detection and errata for PATA->SATA bridges

Jeff Garzik <jgarzik@pobox.com>:
  [libata] ahci: finish ATAPI support (hopefully)
  [libata] ahci: minor PCI MSI cleanup
  [libata] ahci: Update for recent ->host_stop() API change
  [libata ahci] support PCI MSI interrupt vector

Narendra Sankar <nsankar@broadcom.com>:
  sata_svw: Add support for new device IDs

Tobias Lorenz <tobias.lorenz@gmx.net>:
  [libata sata_promise] pdc20619 (PATA) support



 drivers/scsi/ahci.c         |  100 +++++++++++++++++++++++++++++++++-----------
 drivers/scsi/libata-core.c  |   35 ++++++++++++++-
 drivers/scsi/sata_promise.c |   26 +++++++++++
 drivers/scsi/sata_svw.c     |   25 +++++++----
 include/linux/ata.h         |    1 
 include/linux/libata.h      |    1 
 6 files changed, 151 insertions(+), 37 deletions(-)



diff --git a/drivers/scsi/ahci.c b/drivers/scsi/ahci.c
--- a/drivers/scsi/ahci.c
+++ b/drivers/scsi/ahci.c
@@ -39,7 +39,7 @@
 #include <asm/io.h>
 
 #define DRV_NAME	"ahci"
-#define DRV_VERSION	"1.00"
+#define DRV_VERSION	"1.01"
 
 
 enum {
@@ -50,6 +50,7 @@ enum {
 	AHCI_CMD_SLOT_SZ	= 32 * 32,
 	AHCI_RX_FIS_SZ		= 256,
 	AHCI_CMD_TBL_HDR	= 0x80,
+	AHCI_CMD_TBL_CDB	= 0x40,
 	AHCI_CMD_TBL_SZ		= AHCI_CMD_TBL_HDR + (AHCI_MAX_SG * 16),
 	AHCI_PORT_PRIV_DMA_SZ	= AHCI_CMD_SLOT_SZ + AHCI_CMD_TBL_SZ +
 				  AHCI_RX_FIS_SZ,
@@ -134,6 +135,9 @@ enum {
 	PORT_CMD_ICC_ACTIVE	= (0x1 << 28), /* Put i/f in active state */
 	PORT_CMD_ICC_PARTIAL	= (0x2 << 28), /* Put i/f in partial state */
 	PORT_CMD_ICC_SLUMBER	= (0x6 << 28), /* Put i/f in slumber state */
+
+	/* hpriv->flags bits */
+	AHCI_FLAG_MSI		= (1 << 0),
 };
 
 struct ahci_cmd_hdr {
@@ -183,6 +187,7 @@ static void ahci_qc_prep(struct ata_queu
 static u8 ahci_check_status(struct ata_port *ap);
 static u8 ahci_check_err(struct ata_port *ap);
 static inline int ahci_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc);
+static void ahci_remove_one (struct pci_dev *pdev);
 
 static Scsi_Host_Template ahci_sht = {
 	.module			= THIS_MODULE,
@@ -272,7 +277,7 @@ static struct pci_driver ahci_pci_driver
 	.name			= DRV_NAME,
 	.id_table		= ahci_pci_tbl,
 	.probe			= ahci_init_one,
-	.remove			= ata_pci_remove_one,
+	.remove			= ahci_remove_one,
 };
 
 
@@ -506,7 +511,8 @@ static void ahci_fill_sg(struct ata_queu
 
 static void ahci_qc_prep(struct ata_queued_cmd *qc)
 {
-	struct ahci_port_priv *pp = qc->ap->private_data;
+	struct ata_port *ap = qc->ap;
+	struct ahci_port_priv *pp = ap->private_data;
 	u32 opts;
 	const u32 cmd_fis_len = 5; /* five dwords */
 
@@ -518,18 +524,8 @@ static void ahci_qc_prep(struct ata_queu
 	opts = (qc->n_elem << 16) | cmd_fis_len;
 	if (qc->tf.flags & ATA_TFLAG_WRITE)
 		opts |= AHCI_CMD_WRITE;
-
-	switch (qc->tf.protocol) {
-	case ATA_PROT_ATAPI:
-	case ATA_PROT_ATAPI_NODATA:
-	case ATA_PROT_ATAPI_DMA:
+	if (is_atapi_taskfile(&qc->tf))
 		opts |= AHCI_CMD_ATAPI;
-		break;
-
-	default:
-		/* do nothing */
-		break;
-	}
 
 	pp->cmd_slot[0].opts = cpu_to_le32(opts);
 	pp->cmd_slot[0].status = 0;
@@ -541,6 +537,10 @@ static void ahci_qc_prep(struct ata_queu
 	 * a SATA Register - Host to Device command FIS.
 	 */
 	ata_tf_to_fis(&qc->tf, pp->cmd_tbl, 0);
+	if (opts & AHCI_CMD_ATAPI) {
+		memset(pp->cmd_tbl + AHCI_CMD_TBL_CDB, 0, 32);
+		memcpy(pp->cmd_tbl + AHCI_CMD_TBL_CDB, qc->cdb, ap->cdb_len);
+	}
 
 	if (!(qc->flags & ATA_QCFLAG_DMAMAP))
 		return;
@@ -795,8 +795,6 @@ static int ahci_host_init(struct ata_pro
 				return rc;
 			}
 		}
-
-		hpriv->flags |= HOST_CAP_64;
 	} else {
 		rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
 		if (rc) {
@@ -879,15 +877,19 @@ static int ahci_host_init(struct ata_pro
 }
 
 /* move to PCI layer, integrate w/ MSI stuff */
-static void pci_enable_intx(struct pci_dev *pdev)
+static void pci_intx(struct pci_dev *pdev, int enable)
 {
-	u16 pci_command;
+	u16 pci_command, new;
 
 	pci_read_config_word(pdev, PCI_COMMAND, &pci_command);
-	if (pci_command & PCI_COMMAND_INTX_DISABLE) {
-		pci_command &= ~PCI_COMMAND_INTX_DISABLE;
+
+	if (enable)
+		new = pci_command & ~PCI_COMMAND_INTX_DISABLE;
+	else
+		new = pci_command | PCI_COMMAND_INTX_DISABLE;
+
+	if (new != pci_command)
 		pci_write_config_word(pdev, PCI_COMMAND, pci_command);
-	}
 }
 
 static void ahci_print_info(struct ata_probe_ent *probe_ent)
@@ -969,7 +971,7 @@ static int ahci_init_one (struct pci_dev
 	unsigned long base;
 	void *mmio_base;
 	unsigned int board_idx = (unsigned int) ent->driver_data;
-	int pci_dev_busy = 0;
+	int have_msi, pci_dev_busy = 0;
 	int rc;
 
 	VPRINTK("ENTER\n");
@@ -987,12 +989,17 @@ static int ahci_init_one (struct pci_dev
 		goto err_out;
 	}
 
-	pci_enable_intx(pdev);
+	if (pci_enable_msi(pdev) == 0)
+		have_msi = 1;
+	else {
+		pci_intx(pdev, 1);
+		have_msi = 0;
+	}
 
 	probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
 	if (probe_ent == NULL) {
 		rc = -ENOMEM;
-		goto err_out_regions;
+		goto err_out_msi;
 	}
 
 	memset(probe_ent, 0, sizeof(*probe_ent));
@@ -1025,6 +1032,9 @@ static int ahci_init_one (struct pci_dev
 	probe_ent->mmio_base = mmio_base;
 	probe_ent->private_data = hpriv;
 
+	if (have_msi)
+		hpriv->flags |= AHCI_FLAG_MSI;
+
 	/* initialize adapter */
 	rc = ahci_host_init(probe_ent);
 	if (rc)
@@ -1044,7 +1054,11 @@ err_out_iounmap:
 	iounmap(mmio_base);
 err_out_free_ent:
 	kfree(probe_ent);
-err_out_regions:
+err_out_msi:
+	if (have_msi)
+		pci_disable_msi(pdev);
+	else
+		pci_intx(pdev, 0);
 	pci_release_regions(pdev);
 err_out:
 	if (!pci_dev_busy)
@@ -1052,6 +1066,42 @@ err_out:
 	return rc;
 }
 
+static void ahci_remove_one (struct pci_dev *pdev)
+{
+	struct device *dev = pci_dev_to_dev(pdev);
+	struct ata_host_set *host_set = dev_get_drvdata(dev);
+	struct ahci_host_priv *hpriv = host_set->private_data;
+	struct ata_port *ap;
+	unsigned int i;
+	int have_msi;
+
+	for (i = 0; i < host_set->n_ports; i++) {
+		ap = host_set->ports[i];
+
+		scsi_remove_host(ap->host);
+	}
+
+	have_msi = hpriv->flags & AHCI_FLAG_MSI;
+	free_irq(host_set->irq, host_set);
+
+	for (i = 0; i < host_set->n_ports; i++) {
+		ap = host_set->ports[i];
+
+		ata_scsi_release(ap->host);
+		scsi_host_put(ap->host);
+	}
+
+	host_set->ops->host_stop(host_set);
+	kfree(host_set);
+
+	if (have_msi)
+		pci_disable_msi(pdev);
+	else
+		pci_intx(pdev, 0);
+	pci_release_regions(pdev);
+	pci_disable_device(pdev);
+	dev_set_drvdata(dev, NULL);
+}
 
 static int __init ahci_init(void)
 {
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c
--- a/drivers/scsi/libata-core.c
+++ b/drivers/scsi/libata-core.c
@@ -1295,6 +1295,37 @@ err_out:
 	DPRINTK("EXIT, err\n");
 }
 
+
+static inline u8 ata_dev_knobble(struct ata_port *ap)
+{
+	return ((ap->cbl == ATA_CBL_SATA) && (!ata_id_is_sata(ap->device->id)));
+}
+
+/**
+ * 	ata_dev_config - Run device specific handlers and check for
+ * 			 SATA->PATA bridges
+ * 	@ap: Bus 
+ * 	@i:  Device
+ *
+ * 	LOCKING:
+ */
+ 
+void ata_dev_config(struct ata_port *ap, unsigned int i)
+{
+	/* limit bridge transfers to udma5, 200 sectors */
+	if (ata_dev_knobble(ap)) {
+		printk(KERN_INFO "ata%u(%u): applying bridge limits\n",
+			ap->id, ap->device->devno);
+		ap->udma_mask &= ATA_UDMA5;
+		ap->host->max_sectors = ATA_MAX_SECTORS;
+		ap->host->hostt->max_sectors = ATA_MAX_SECTORS;
+		ap->device->flags |= ATA_DFLAG_LOCK_SECTORS;
+	}
+
+	if (ap->ops->dev_config)
+		ap->ops->dev_config(ap, &ap->device[i]);
+}
+
 /**
  *	ata_bus_probe - Reset and probe ATA bus
  *	@ap: Bus to probe
@@ -1322,8 +1353,7 @@ static int ata_bus_probe(struct ata_port
 		ata_dev_identify(ap, i);
 		if (ata_dev_present(&ap->device[i])) {
 			found = 1;
-			if (ap->ops->dev_config)
-				ap->ops->dev_config(ap, &ap->device[i]);
+			ata_dev_config(ap,i);
 		}
 	}
 
@@ -4408,6 +4438,7 @@ EXPORT_SYMBOL_GPL(ata_scsi_release);
 EXPORT_SYMBOL_GPL(ata_host_intr);
 EXPORT_SYMBOL_GPL(ata_dev_classify);
 EXPORT_SYMBOL_GPL(ata_dev_id_string);
+EXPORT_SYMBOL_GPL(ata_dev_config);
 EXPORT_SYMBOL_GPL(ata_scsi_simulate);
 
 #ifdef CONFIG_PCI
diff --git a/drivers/scsi/sata_promise.c b/drivers/scsi/sata_promise.c
--- a/drivers/scsi/sata_promise.c
+++ b/drivers/scsi/sata_promise.c
@@ -59,6 +59,7 @@ enum {
 
 	board_2037x		= 0,	/* FastTrak S150 TX2plus */
 	board_20319		= 1,	/* FastTrak S150 TX4 */
+	board_20619		= 2,	/* FastTrak TX4000 */
 
 	PDC_HAS_PATA		= (1 << 1), /* PDC20375 has PATA */
 
@@ -147,6 +148,17 @@ static struct ata_port_info pdc_port_inf
 		.udma_mask	= 0x7f, /* udma0-6 ; FIXME */
 		.port_ops	= &pdc_ata_ops,
 	},
+
+	/* board_20619 */
+	{
+		.sht		= &pdc_ata_sht,
+		.host_flags	= ATA_FLAG_NO_LEGACY | ATA_FLAG_SRST |
+				  ATA_FLAG_MMIO | ATA_FLAG_SLAVE_POSS,
+		.pio_mask	= 0x1f, /* pio0-4 */
+		.mwdma_mask	= 0x07, /* mwdma0-2 */
+		.udma_mask	= 0x7f, /* udma0-6 ; FIXME */
+		.port_ops	= &pdc_ata_ops,
+	},
 };
 
 static struct pci_device_id pdc_ata_pci_tbl[] = {
@@ -172,6 +184,9 @@ static struct pci_device_id pdc_ata_pci_
 	{ PCI_VENDOR_ID_PROMISE, 0x3d18, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
 	  board_20319 },
 
+	{ PCI_VENDOR_ID_PROMISE, 0x6629, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+	  board_20619 },
+
 	{ }	/* terminate list */
 };
 
@@ -636,6 +651,15 @@ static int pdc_ata_init_one (struct pci_
 	case board_2037x:
        		probe_ent->n_ports = 2;
 		break;
+	case board_20619:
+		probe_ent->n_ports = 4;
+
+		pdc_ata_setup_port(&probe_ent->port[2], base + 0x300);
+		pdc_ata_setup_port(&probe_ent->port[3], base + 0x380);
+
+		probe_ent->port[2].scr_addr = base + 0x600;
+		probe_ent->port[3].scr_addr = base + 0x700;
+                break;
 	default:
 		BUG();
 		break;
@@ -676,7 +700,7 @@ static void __exit pdc_ata_exit(void)
 
 
 MODULE_AUTHOR("Jeff Garzik");
-MODULE_DESCRIPTION("Promise SATA TX2/TX4 low-level driver");
+MODULE_DESCRIPTION("Promise ATA TX2/TX4/TX4000 low-level driver");
 MODULE_LICENSE("GPL");
 MODULE_DEVICE_TABLE(pci, pdc_ata_pci_tbl);
 MODULE_VERSION(DRV_VERSION);
diff --git a/drivers/scsi/sata_svw.c b/drivers/scsi/sata_svw.c
--- a/drivers/scsi/sata_svw.c
+++ b/drivers/scsi/sata_svw.c
@@ -344,6 +344,7 @@ static int k2_sata_init_one (struct pci_
 	void *mmio_base;
 	int pci_dev_busy = 0;
 	int rc;
+	int i;
 
 	if (!printed_version++)
 		printk(KERN_DEBUG DRV_NAME " version " DRV_VERSION "\n");
@@ -421,11 +422,11 @@ static int k2_sata_init_one (struct pci_
 	probe_ent->mwdma_mask = 0x7;
 	probe_ent->udma_mask = 0x7f;
 
-	/* We have 4 ports per PCI function */
-	k2_sata_setup_port(&probe_ent->port[0], base + 0 * K2_SATA_PORT_OFFSET);
-	k2_sata_setup_port(&probe_ent->port[1], base + 1 * K2_SATA_PORT_OFFSET);
-	k2_sata_setup_port(&probe_ent->port[2], base + 2 * K2_SATA_PORT_OFFSET);
-	k2_sata_setup_port(&probe_ent->port[3], base + 3 * K2_SATA_PORT_OFFSET);
+	/* different controllers have different number of ports - currently 4 or 8 */
+	/* All ports are on the same function. Multi-function device is no
+	 * longer available. This should not be seen in any system. */
+	for (i = 0; i < ent->driver_data; i++)
+		k2_sata_setup_port(&probe_ent->port[i], base + i * K2_SATA_PORT_OFFSET);
 
 	pci_set_master(pdev);
 
@@ -445,11 +446,17 @@ err_out:
 	return rc;
 }
 
-
+/* 0x240 is device ID for Apple K2 device
+ * 0x241 is device ID for Serverworks Frodo4
+ * 0x242 is device ID for Serverworks Frodo8
+ * 0x24a is device ID for BCM5785 (aka HT1000) HT southbridge integrated SATA
+ * controller
+ * */
 static struct pci_device_id k2_sata_pci_tbl[] = {
-	{ 0x1166, 0x0240, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
-	{ 0x1166, 0x0241, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
-	{ 0x1166, 0x0242, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
+	{ 0x1166, 0x0240, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4 },
+	{ 0x1166, 0x0241, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4 },
+	{ 0x1166, 0x0242, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 8 },
+	{ 0x1166, 0x024a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4 },
 	{ }
 };
 
diff --git a/include/linux/ata.h b/include/linux/ata.h
--- a/include/linux/ata.h
+++ b/include/linux/ata.h
@@ -224,6 +224,7 @@ struct ata_taskfile {
 };
 
 #define ata_id_is_ata(id)	(((id)[0] & (1 << 15)) == 0)
+#define ata_id_is_sata(id)	((id)[93] == 0)
 #define ata_id_rahead_enabled(id) ((id)[85] & (1 << 6))
 #define ata_id_wcache_enabled(id) ((id)[85] & (1 << 5))
 #define ata_id_has_flush(id) ((id)[83] & (1 << 12))
diff --git a/include/linux/libata.h b/include/linux/libata.h
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -421,6 +421,7 @@ extern void ata_sg_init(struct ata_queue
 extern unsigned int ata_dev_classify(struct ata_taskfile *tf);
 extern void ata_dev_id_string(u16 *id, unsigned char *s,
 			      unsigned int ofs, unsigned int len);
+extern void ata_dev_config(struct ata_port *ap, unsigned int i);
 extern void ata_bmdma_setup (struct ata_queued_cmd *qc);
 extern void ata_bmdma_start (struct ata_queued_cmd *qc);
 extern void ata_bmdma_stop(struct ata_port *ap);

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-06-04  6:08 [SATA] libata-dev queue updated Jeff Garzik
@ 2005-06-04 15:17 ` Greg Stark
  2005-06-04 17:48   ` Jeff Garzik
  2005-06-06 16:01   ` Mark Lord
  0 siblings, 2 replies; 57+ messages in thread
From: Greg Stark @ 2005-06-04 15:17 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: linux-ide, Linux Kernel, Andrew Morton, James Bottomley

Jeff Garzik <jgarzik@pobox.com> writes:

> Several updates to the libata-dev.git repository.  Some of the branches have
> been folded into a new upstream-2.6.13 branch, which holds several changes (see
> attached).  Other branches were updated to the most recent kernel, which
> contained doc updates that caused some minor merge conflicts.
> 
> I haven't yet updated 'passthru' and 'chs-support' branches to the latest
> kernel.
> 
> Git Repository URL:
> rsync://rsync.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev.git
> 
> List of branches:
> adma          chs-support  master    pdc2027x           sleeping-eh
> adma-mwi      iomap        ncq       promise-sata-pata  upstream-2.6.13
> atapi-enable  iomap-step1  passthru  sil24

Are there diffs downloadable for these? In particular I'm looking for
passthru. I'm imagining that with passthru SMART works?

-- 
greg


^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-06-04 15:17 ` Greg Stark
@ 2005-06-04 17:48   ` Jeff Garzik
  2005-06-04 18:50     ` Adrian Bunk
  2005-06-06 16:01   ` Mark Lord
  1 sibling, 1 reply; 57+ messages in thread
From: Jeff Garzik @ 2005-06-04 17:48 UTC (permalink / raw)
  To: Greg Stark; +Cc: linux-ide, Linux Kernel, Andrew Morton, James Bottomley

Greg Stark wrote:
> Jeff Garzik <jgarzik@pobox.com> writes:
> 
> 
>>Several updates to the libata-dev.git repository.  Some of the branches have
>>been folded into a new upstream-2.6.13 branch, which holds several changes (see
>>attached).  Other branches were updated to the most recent kernel, which
>>contained doc updates that caused some minor merge conflicts.
>>
>>I haven't yet updated 'passthru' and 'chs-support' branches to the latest
>>kernel.
>>
>>Git Repository URL:
>>rsync://rsync.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev.git
>>
>>List of branches:
>>adma          chs-support  master    pdc2027x           sleeping-eh
>>adma-mwi      iomap        ncq       promise-sata-pata  upstream-2.6.13
>>atapi-enable  iomap-step1  passthru  sil24
> 
> 
> Are there diffs downloadable for these? In particular I'm looking for
> passthru. I'm imagining that with passthru SMART works?

You'll need to generate the diffs yourself, I'm afraid.

	Jeff




^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-06-04 17:48   ` Jeff Garzik
@ 2005-06-04 18:50     ` Adrian Bunk
  2005-06-04 19:05       ` Jeff Garzik
  0 siblings, 1 reply; 57+ messages in thread
From: Adrian Bunk @ 2005-06-04 18:50 UTC (permalink / raw)
  To: Jeff Garzik
  Cc: Greg Stark, linux-ide, Linux Kernel, Andrew Morton, James Bottomley

On Sat, Jun 04, 2005 at 01:48:28PM -0400, Jeff Garzik wrote:
> Greg Stark wrote:
> >Jeff Garzik <jgarzik@pobox.com> writes:
> >
> >
> >>Several updates to the libata-dev.git repository.  Some of the branches 
> >>have
> >>been folded into a new upstream-2.6.13 branch, which holds several 
> >>changes (see
> >>attached).  Other branches were updated to the most recent kernel, which
> >>contained doc updates that caused some minor merge conflicts.
> >>
> >>I haven't yet updated 'passthru' and 'chs-support' branches to the latest
> >>kernel.
> >>
> >>Git Repository URL:
> >>rsync://rsync.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev.git
> >>
> >>List of branches:
> >>adma          chs-support  master    pdc2027x           sleeping-eh
> >>adma-mwi      iomap        ncq       promise-sata-pata  upstream-2.6.13
> >>atapi-enable  iomap-step1  passthru  sil24
> >
> >
> >Are there diffs downloadable for these? In particular I'm looking for
> >passthru. I'm imagining that with passthru SMART works?
> 
> You'll need to generate the diffs yourself, I'm afraid.

I haven't tried git, but is there really no way to tell git to do
"For every branch, generate a diff against Linus' tree" ?

This together with making them available at some URL would make life 
easier for some people.

> 	Jeff

cu
Adrian

-- 

       "Is there not promise of rain?" Ling Tan asked suddenly out
        of the darkness. There had been need of rain for many days.
       "Only a promise," Lao Er said.
                                       Pearl S. Buck - Dragon Seed


^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-06-04 18:50     ` Adrian Bunk
@ 2005-06-04 19:05       ` Jeff Garzik
  2005-06-04 19:15         ` Greg Stark
  0 siblings, 1 reply; 57+ messages in thread
From: Jeff Garzik @ 2005-06-04 19:05 UTC (permalink / raw)
  To: Adrian Bunk
  Cc: Greg Stark, linux-ide, Linux Kernel, Andrew Morton, James Bottomley

Adrian Bunk wrote:
> On Sat, Jun 04, 2005 at 01:48:28PM -0400, Jeff Garzik wrote:
> 
>>Greg Stark wrote:
>>
>>>Jeff Garzik <jgarzik@pobox.com> writes:
>>>
>>>
>>>
>>>>Several updates to the libata-dev.git repository.  Some of the branches 
>>>>have
>>>>been folded into a new upstream-2.6.13 branch, which holds several 
>>>>changes (see
>>>>attached).  Other branches were updated to the most recent kernel, which
>>>>contained doc updates that caused some minor merge conflicts.
>>>>
>>>>I haven't yet updated 'passthru' and 'chs-support' branches to the latest
>>>>kernel.
>>>>
>>>>Git Repository URL:
>>>>rsync://rsync.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev.git
>>>>
>>>>List of branches:
>>>>adma          chs-support  master    pdc2027x           sleeping-eh
>>>>adma-mwi      iomap        ncq       promise-sata-pata  upstream-2.6.13
>>>>atapi-enable  iomap-step1  passthru  sil24
>>>
>>>
>>>Are there diffs downloadable for these? In particular I'm looking for
>>>passthru. I'm imagining that with passthru SMART works?
>>
>>You'll need to generate the diffs yourself, I'm afraid.
> 
> 
> I haven't tried git, but is there really no way to tell git to do
> "For every branch, generate a diff against Linus' tree" ?

for branch in .git/refs/heads/*
do
	...
done


> This together with making them available at some URL would make life 
> easier for some people.

And you, or anyone else, is welcome to take on this past and create a 
website that auto-posts patches for trees.

All my development is in public; all the data is there for anyone who 
wishes to use it.

	Jeff



^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-06-04 19:05       ` Jeff Garzik
@ 2005-06-04 19:15         ` Greg Stark
  2005-06-04 19:19           ` Jeff Garzik
  0 siblings, 1 reply; 57+ messages in thread
From: Greg Stark @ 2005-06-04 19:15 UTC (permalink / raw)
  To: Jeff Garzik
  Cc: Adrian Bunk, Greg Stark, linux-ide, Linux Kernel, Andrew Morton,
	James Bottomley


Jeff Garzik <jgarzik@pobox.com> writes:

> All my development is in public; all the data is there for anyone who wishes to
> use it.

That is cool. And it's nice that there seems to have been an upsurge in the
quantity of communication from you and other libata developers on this list
too.

I expect if git catches on then it would be about as effective as most
projects which publish their CVS tree and expect people to be able to do
checkouts from there. Currently, though, approximately nobody has git tools or
any idea how to use it.


So my question is, if I did tackle this riddle trail and figured out how to
fetch the passthru branch against 2.6.12, what would it buy me? Would SMART
just start working? Or would it just confuse the SMART tools until they're
updated? Or would it just crash my machine?


-- 
greg


^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-06-04 19:15         ` Greg Stark
@ 2005-06-04 19:19           ` Jeff Garzik
  2005-06-05  2:25             ` Greg Stark
  0 siblings, 1 reply; 57+ messages in thread
From: Jeff Garzik @ 2005-06-04 19:19 UTC (permalink / raw)
  To: Greg Stark
  Cc: Adrian Bunk, linux-ide, Linux Kernel, Andrew Morton, James Bottomley

On Sat, Jun 04, 2005 at 03:15:24PM -0400, Greg Stark wrote:
> So my question is, if I did tackle this riddle trail and figured out how to
> fetch the passthru branch against 2.6.12, what would it buy me? Would SMART
> just start working? Or would it just confuse the SMART tools until they're
> updated? Or would it just crash my machine?

SMART should just start working.  It adds the ioctls that existing smartd
and hdparm already know about.

The two reasons why passthru is not upstream are:

* I need to make sure that it is 100% up-to-date for the latest ATA
passthru spec, which clarified some SCSI CDB and descriptor codes.

* There was at least one report of ATA passthru use causing a device
under load to start timing out, which could possibly indicate a driver
bug.  I need to do a serious analysis and final review of the patch, to
make sure that it is plugged into the ATA host state machine at the
correct places.

	Jeff






^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-06-04 19:19           ` Jeff Garzik
@ 2005-06-05  2:25             ` Greg Stark
  2005-06-05  2:30               ` Jeff Garzik
                                 ` (2 more replies)
  0 siblings, 3 replies; 57+ messages in thread
From: Greg Stark @ 2005-06-05  2:25 UTC (permalink / raw)
  To: Jeff Garzik
  Cc: Greg Stark, Adrian Bunk, linux-ide, Linux Kernel, Andrew Morton,
	James Bottomley


Jeff Garzik <jgarzik@pobox.com> writes:

> On Sat, Jun 04, 2005 at 03:15:24PM -0400, Greg Stark wrote:
> > So my question is, if I did tackle this riddle trail and figured out how to
> > fetch the passthru branch against 2.6.12, what would it buy me? Would SMART
> > just start working? Or would it just confuse the SMART tools until they're
> > updated? Or would it just crash my machine?
> 
> SMART should just start working.  It adds the ioctls that existing smartd
> and hdparm already know about.

So, uh, where do I get git? Where is your "git repository" and Linus' "git
repository" and how do I set that up?

Or, at least, where do I find all this info?


I take it it's not this:

Package: git
Priority: optional
Section: utils
Installed-Size: 919
Maintainer: Ian Beckwith <ianb@nessie.mcc.ac.uk>
Architecture: i386
Version: 4.3.20-7
Depends: libc6 (>= 2.3.2.ds1-4), libncurses5 (>= 5.4-1), libreadline4 (>= 4.3-1)
Filename: pool/main/g/git/git_4.3.20-7_i386.deb
Size: 261822
MD5sum: a708688e17259ed1e99d2828e1acb3f6
Description: GNU Interactive Tools, a file browser/viewer and process viewer/killer
 git (GNU Interactive Tools) is a set of interactive text-mode tools,
 closely integrated with the shell.  It contains an extensible file
 system browser, an ascii/hex file viewer, a process viewer/killer and
 some other related utilities and shell scripts.  It can be used to
 increase the speed and efficiency of most of the daily tasks such as
 copying and moving files and directories, invoking editors,
 compressing and uncompressing files, creating and expanding archives,
 compiling programs, sending mail, etc.  It looks nice, has colors (if
 the standard ANSI color sequences are supported) and is user-friendly.
 .
 One of the main advantages of Git is its flexibility.  It is not
 limited to a given set of commands.  The configuration file can be
 easily enhanced, allowing the user to add new commands or file
 operations, depending on its needs or preferences.


-- 
greg


^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-06-05  2:25             ` Greg Stark
@ 2005-06-05  2:30               ` Jeff Garzik
  2005-06-05  5:30                 ` Greg Stark
  2005-06-22 16:15                 ` Mark Lord
  2005-06-05  2:40               ` Drew Winstel
  2005-06-05  2:58               ` Jim Crilly
  2 siblings, 2 replies; 57+ messages in thread
From: Jeff Garzik @ 2005-06-05  2:30 UTC (permalink / raw)
  To: Greg Stark
  Cc: Adrian Bunk, linux-ide, Linux Kernel, Andrew Morton, James Bottomley

Greg Stark wrote:
> So, uh, where do I get git? Where is your "git repository" and Linus' "git
> repository" and how do I set that up?

http://lkml.org/lkml/2005/5/26/11

	Jeff



^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-06-05  2:25             ` Greg Stark
  2005-06-05  2:30               ` Jeff Garzik
@ 2005-06-05  2:40               ` Drew Winstel
  2005-06-05  2:58               ` Jim Crilly
  2 siblings, 0 replies; 57+ messages in thread
From: Drew Winstel @ 2005-06-05  2:40 UTC (permalink / raw)
  To: Greg Stark
  Cc: Jeff Garzik, Adrian Bunk, linux-ide, Linux Kernel, Andrew Morton,
	James Bottomley

On Sat, 2005-06-04 at 22:25 -0400, Greg Stark wrote:
> Jeff Garzik <jgarzik@pobox.com> writes:
> 
> > On Sat, Jun 04, 2005 at 03:15:24PM -0400, Greg Stark wrote:
> > > So my question is, if I did tackle this riddle trail and figured out how to
> > > fetch the passthru branch against 2.6.12, what would it buy me? Would SMART
> > > just start working? Or would it just confuse the SMART tools until they're
> > > updated? Or would it just crash my machine?
> > 
> > SMART should just start working.  It adds the ioctls that existing smartd
> > and hdparm already know about.
> 
> So, uh, where do I get git? Where is your "git repository" and Linus' "git
> repository" and how do I set that up?
> 
> Or, at least, where do I find all this info?
> 
> 
Your best bet is probably to read Jeff's short git how-to at
http://kerneltrap.org/node/5196 and just about every other LKML-oriented
site.  Hopefully that gives you a good start.

Drew


^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-06-05  2:25             ` Greg Stark
  2005-06-05  2:30               ` Jeff Garzik
  2005-06-05  2:40               ` Drew Winstel
@ 2005-06-05  2:58               ` Jim Crilly
  2 siblings, 0 replies; 57+ messages in thread
From: Jim Crilly @ 2005-06-05  2:58 UTC (permalink / raw)
  To: Greg Stark
  Cc: Jeff Garzik, Adrian Bunk, linux-ide, Linux Kernel, Andrew Morton,
	James Bottomley

On 06/04/05 10:25:17PM -0400, Greg Stark wrote:
> 
> So, uh, where do I get git? Where is your "git repository" and Linus' "git
> repository" and how do I set that up?
> 
> Or, at least, where do I find all this info?
> 
> 
> I take it it's not this:

No, but there is a cogito package in sid that includes the git tools.

> 
> Package: git
> Priority: optional
> Section: utils
> Installed-Size: 919
> Maintainer: Ian Beckwith <ianb@nessie.mcc.ac.uk>
> Architecture: i386
> Version: 4.3.20-7
> Depends: libc6 (>= 2.3.2.ds1-4), libncurses5 (>= 5.4-1), libreadline4 (>= 4.3-1)
> Filename: pool/main/g/git/git_4.3.20-7_i386.deb
> Size: 261822
> MD5sum: a708688e17259ed1e99d2828e1acb3f6
> Description: GNU Interactive Tools, a file browser/viewer and process viewer/killer
>  git (GNU Interactive Tools) is a set of interactive text-mode tools,
>  closely integrated with the shell.  It contains an extensible file
>  system browser, an ascii/hex file viewer, a process viewer/killer and
>  some other related utilities and shell scripts.  It can be used to
>  increase the speed and efficiency of most of the daily tasks such as
>  copying and moving files and directories, invoking editors,
>  compressing and uncompressing files, creating and expanding archives,
>  compiling programs, sending mail, etc.  It looks nice, has colors (if
>  the standard ANSI color sequences are supported) and is user-friendly.
>  .
>  One of the main advantages of Git is its flexibility.  It is not
>  limited to a given set of commands.  The configuration file can be
>  easily enhanced, allowing the user to add new commands or file
>  operations, depending on its needs or preferences.
> 
> 
> -- 
> greg

Jim.


^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-06-05  2:30               ` Jeff Garzik
@ 2005-06-05  5:30                 ` Greg Stark
  2005-06-22 16:15                 ` Mark Lord
  1 sibling, 0 replies; 57+ messages in thread
From: Greg Stark @ 2005-06-05  5:30 UTC (permalink / raw)
  To: Jeff Garzik
  Cc: Greg Stark, Adrian Bunk, linux-ide, Linux Kernel, Andrew Morton,
	James Bottomley

Jeff Garzik <jgarzik@pobox.com> writes:

> Greg Stark wrote:
> > So, uh, where do I get git? Where is your "git repository" and Linus' "git
> > repository" and how do I set that up?
> 
> http://lkml.org/lkml/2005/5/26/11

Ah, very nice. Thank you.

-- 
greg


^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-06-04 15:17 ` Greg Stark
  2005-06-04 17:48   ` Jeff Garzik
@ 2005-06-06 16:01   ` Mark Lord
  2005-06-07  1:57     ` Greg Stark
  1 sibling, 1 reply; 57+ messages in thread
From: Mark Lord @ 2005-06-06 16:01 UTC (permalink / raw)
  To: Greg Stark
  Cc: Jeff Garzik, linux-ide, Linux Kernel, Andrew Morton, James Bottomley

Greg Stark wrote:
>
> Are there diffs downloadable for these? In particular I'm looking for
> passthru. I'm imagining that with passthru SMART works?

SMART works already using the HDIO_* ioctls in libata-dev
(these may be built on top of the passthru stuff.. dunno).

Eg.  smartctl -data -a /dev/sda

Cheers

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-06-06 16:01   ` Mark Lord
@ 2005-06-07  1:57     ` Greg Stark
  2005-06-07 11:20       ` Brad Campbell
                         ` (2 more replies)
  0 siblings, 3 replies; 57+ messages in thread
From: Greg Stark @ 2005-06-07  1:57 UTC (permalink / raw)
  To: Mark Lord
  Cc: Greg Stark, Jeff Garzik, linux-ide, Linux Kernel, Andrew Morton,
	James Bottomley

Mark Lord <liml@rtr.ca> writes:

> Greg Stark wrote:
> >
> > Are there diffs downloadable for these? In particular I'm looking for
> > passthru. I'm imagining that with passthru SMART works?
> 
> SMART works already using the HDIO_* ioctls in libata-dev
> (these may be built on top of the passthru stuff.. dunno).
> 
> Eg.  smartctl -data -a /dev/sda

Uh, this is 2.6.12-rc4 with the latest libata-dev patch from Garzik's web
site:

 bash-3.00$ smartctl -data -a /dev/sda
 smartctl version 5.32 Copyright (C) 2002-4 Bruce Allen
 Home page is http://smartmontools.sourceforge.net/

 Smartctl: Device Read Identity Failed (not an ATA/ATAPI device)

 A mandatory SMART command failed: exiting. To continue, add one or more '-T permissive' options.


-- 
greg


^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-06-07  1:57     ` Greg Stark
@ 2005-06-07 11:20       ` Brad Campbell
  2005-06-08  8:33         ` Mark Lord
  2005-06-08  8:37       ` Mark Lord
  2005-06-08  8:51       ` Mark Lord
  2 siblings, 1 reply; 57+ messages in thread
From: Brad Campbell @ 2005-06-07 11:20 UTC (permalink / raw)
  To: Greg Stark
  Cc: Mark Lord, Jeff Garzik, linux-ide, Linux Kernel, Andrew Morton,
	James Bottomley

Greg Stark wrote:
> Mark Lord <liml@rtr.ca> writes:

>>Eg.  smartctl -data -a /dev/sda
> 
> 
> Uh, this is 2.6.12-rc4 with the latest libata-dev patch from Garzik's web
> site:
> 
>  bash-3.00$ smartctl -data -a /dev/sda

smartctl -d ata -a /dev/sda

Regards,
Brad
-- 
"Human beings, who are almost unique in having the ability
to learn from the experience of others, are also remarkable
for their apparent disinclination to do so." -- Douglas Adams

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-06-08  8:51       ` Mark Lord
@ 2005-06-07 13:09         ` Domenico Andreoli
  2005-06-07 17:53         ` Jeff Garzik
  1 sibling, 0 replies; 57+ messages in thread
From: Domenico Andreoli @ 2005-06-07 13:09 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: linux-kernel

On Wed, Jun 08, 2005 at 04:51:29AM -0400, Mark Lord wrote:
> 
> Sure, I (and everyone else on the planet) could do the 15-gadzillion steps
> to download and install the piecemeal git stuff, but that shouldn't be
> necessary for non-developers to do.
> 
> Is there a cumulative libata-dev patch for 2.6.12 available somewhere?

yes please, provide such patch. i'd like to try it but given the burden
of git i continue to postpone all the required work. BTW, is it in
2.6.12-rc6? will it be in 2.6.12? many thanks.

cheers
domenico

-----[ Domenico Andreoli, aka cavok
 --[ http://people.debian.org/~cavok/gpgkey.asc
   ---[ 3A0F 2F80 F79C 678A 8936  4FEE 0677 9033 A20E BC50

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-06-08  8:33         ` Mark Lord
@ 2005-06-07 13:15           ` Brad Campbell
  0 siblings, 0 replies; 57+ messages in thread
From: Brad Campbell @ 2005-06-07 13:15 UTC (permalink / raw)
  To: Mark Lord
  Cc: Greg Stark, Jeff Garzik, linux-ide, Linux Kernel, Andrew Morton,
	James Bottomley

Mark Lord wrote:
> Brad Campbell wrote:
> 
> 
> That's weird.  So, is your /dev/sda a (S)ATA drive?

Yep.. I have 28 Maxtor Maxline-II drives on Promise SATA150TX4's
They all show up under /dev/scsi/host??

> 
> Maybe there's something screwy with true SATA drives and libata (doubtful)?

Not that I know of.. it has been working great here for months now.. (bar the odd oops)

> I also have "smartctl -data" working with SATA drives through the
> qstor driver (the non-libata version) without any issues, so we know
> the drives themselves are happy with it.
> 
>> smartctl -d ata -a /dev/sda

> Same thing as "-data".  Either works.
> 

So it does..

I'm still using a 2.6.10-bk10 kernel here with the libata-dev patches and some minor md patches.. 
It's stable unless one of the drives throws an error, whereapon libata oops and stops talking to the 
other drives (and then it gets really messy).. Have not had time to reproduce/upgrade to see if it's 
fixed though.

Regards,
Brad
-- 
"Human beings, who are almost unique in having the ability
to learn from the experience of others, are also remarkable
for their apparent disinclination to do so." -- Douglas Adams

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-06-08  8:37       ` Mark Lord
@ 2005-06-07 13:51         ` Greg Stark
  2005-06-08 10:30           ` Mark Lord
  0 siblings, 1 reply; 57+ messages in thread
From: Greg Stark @ 2005-06-07 13:51 UTC (permalink / raw)
  To: Mark Lord
  Cc: Greg Stark, Jeff Garzik, linux-ide, Linux Kernel, Andrew Morton,
	James Bottomley


Mark Lord <liml@rtr.ca> writes:

> Greg Stark wrote:
> > Uh, this is 2.6.12-rc4 with the latest libata-dev patch from Garzik's web
> > site:
> >  bash-3.00$ smartctl -data -a /dev/sda
> >  smartctl version 5.32 Copyright (C) 2002-4 Bruce Allen
> >  Home page is http://smartmontools.sourceforge.net/
> >  Smartctl: Device Read Identity Failed (not an ATA/ATAPI device)
> 
> Oh, wait a sec -- Jeff just posted that he's nuked the "read identity" ioctl(),
> so I suppose that has now broken smartmontools compatibility.

I think this libata-dev patch was prior to that announcement.

It's 2.6.11-bk6-libata-dev1.patch which I appear to have downloaded May 15th.
(Sorry I guess "latest" wasn't very precise)

> So Linux either goes without S.M.A.R.T. for SATA (again),
> or Jeff puts it back, or smartmontools gets upgraded Real Soon Now.

:(

What I really want to get working is actually hddtemp which uses SMART just to
get the temperature:

bash-3.00$ hddtemp /dev/hda
/dev/hda: MAXTOR 6L080J4: 50 C
bash-3.00$ hddtemp /dev/sda
/dev/sda: Maxtor 7Y250M0  YAR5: drive is sleeping
bash-3.00$ hddtemp /dev/sdb
/dev/sdb: Maxtor 6Y120M0  YAR5: drive is sleeping

The two M0 drives are SATA drives and they certainly are not sleeping. Come to
think of it that's awfully hot for the PATA drive. I think I'll put it to
sleep for a while.


-- 
greg


^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-06-08  8:51       ` Mark Lord
  2005-06-07 13:09         ` Domenico Andreoli
@ 2005-06-07 17:53         ` Jeff Garzik
  1 sibling, 0 replies; 57+ messages in thread
From: Jeff Garzik @ 2005-06-07 17:53 UTC (permalink / raw)
  To: Mark Lord
  Cc: Greg Stark, linux-ide, Linux Kernel, Andrew Morton, James Bottomley

Mark Lord wrote:
> Is there a cumulative libata-dev patch for 2.6.12 available somewhere?

Nope; somebody needs to be script that...

	Jeff



^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-06-07 11:20       ` Brad Campbell
@ 2005-06-08  8:33         ` Mark Lord
  2005-06-07 13:15           ` Brad Campbell
  0 siblings, 1 reply; 57+ messages in thread
From: Mark Lord @ 2005-06-08  8:33 UTC (permalink / raw)
  To: Brad Campbell
  Cc: Greg Stark, Jeff Garzik, linux-ide, Linux Kernel, Andrew Morton,
	James Bottomley

Brad Campbell wrote:
> Greg Stark wrote:
>> Uh, this is 2.6.12-rc4 with the latest libata-dev patch from Garzik's web
>> site:
>>
>>  bash-3.00$ smartctl -data -a /dev/sda
>>  Smartctl: Device Read Identity Failed (not an ATA/ATAPI device)

That's weird.  So, is your /dev/sda a (S)ATA drive?
I haven't tried it on 2.6.12-rc*  (breaks VMware for me+ libata-dev),
but it does work fine for 2.6.11 + libata-dev on my PATA drive.

Maybe there's something screwy with true SATA drives and libata (doubtful)?

I also have "smartctl -data" working with SATA drives through the
qstor driver (the non-libata version) without any issues, so we know
the drives themselves are happy with it.

> smartctl -d ata -a /dev/sda

Same thing as "-data".  Either works.

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-06-07  1:57     ` Greg Stark
  2005-06-07 11:20       ` Brad Campbell
@ 2005-06-08  8:37       ` Mark Lord
  2005-06-07 13:51         ` Greg Stark
  2005-06-08  8:51       ` Mark Lord
  2 siblings, 1 reply; 57+ messages in thread
From: Mark Lord @ 2005-06-08  8:37 UTC (permalink / raw)
  To: Greg Stark
  Cc: Jeff Garzik, linux-ide, Linux Kernel, Andrew Morton, James Bottomley

Greg Stark wrote:
> Uh, this is 2.6.12-rc4 with the latest libata-dev patch from Garzik's web
> site:
> 
>  bash-3.00$ smartctl -data -a /dev/sda
>  smartctl version 5.32 Copyright (C) 2002-4 Bruce Allen
>  Home page is http://smartmontools.sourceforge.net/
> 
>  Smartctl: Device Read Identity Failed (not an ATA/ATAPI device)

Oh, wait a sec -- Jeff just posted that he's nuked the "read identity" ioctl(),
so I suppose that has now broken smartmontools compatibility.

So Linux either goes without S.M.A.R.T. for SATA (again),
or Jeff puts it back, or smartmontools gets upgraded Real Soon Now.

Cheers

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-06-07  1:57     ` Greg Stark
  2005-06-07 11:20       ` Brad Campbell
  2005-06-08  8:37       ` Mark Lord
@ 2005-06-08  8:51       ` Mark Lord
  2005-06-07 13:09         ` Domenico Andreoli
  2005-06-07 17:53         ` Jeff Garzik
  2 siblings, 2 replies; 57+ messages in thread
From: Mark Lord @ 2005-06-08  8:51 UTC (permalink / raw)
  To: Greg Stark
  Cc: Jeff Garzik, linux-ide, Linux Kernel, Andrew Morton, James Bottomley

Greg Stark wrote:
> Uh, this is 2.6.12-rc4 with the latest libata-dev patch from Garzik's web
> site:

Where did you get "the latest libata-dev patch" from?

I don't see anything for 2.6.12 on Jeff's web directory,
just a bunch of older 2.6.11 patches instead.

Sure, I (and everyone else on the planet) could do the 15-gadzillion steps
to download and install the piecemeal git stuff, but that shouldn't be
necessary for non-developers to do.

Is there a cumulative libata-dev patch for 2.6.12 available somewhere?

Cheers

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-06-07 13:51         ` Greg Stark
@ 2005-06-08 10:30           ` Mark Lord
  0 siblings, 0 replies; 57+ messages in thread
From: Mark Lord @ 2005-06-08 10:30 UTC (permalink / raw)
  To: Greg Stark
  Cc: Jeff Garzik, linux-ide, Linux Kernel, Andrew Morton, James Bottomley

Greg Stark wrote:
>
> It's 2.6.11-bk6-libata-dev1.patch which I appear to have downloaded May 15th.
> (Sorry I guess "latest" wasn't very precise)

Mmm.. the relevant ioctl's look identical to the 02-Mar-2005
libata-dev1.patch that I am using here, so if that is what you
really are using, then smartctl should be working.

???

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-06-05  2:30               ` Jeff Garzik
  2005-06-05  5:30                 ` Greg Stark
@ 2005-06-22 16:15                 ` Mark Lord
  2005-06-22 20:23                   ` Jeff Garzik
  1 sibling, 1 reply; 57+ messages in thread
From: Mark Lord @ 2005-06-22 16:15 UTC (permalink / raw)
  To: Jeff Garzik
  Cc: Greg Stark, linux-ide, Linux Kernel, Andrew Morton, James Bottomley

Jeff Garzik wrote:
> Greg Stark wrote:
> 
>> So, uh, where do I get git? Where is your "git repository" and Linus' 
>> "git repository" and how do I set that up?
> 
> http://lkml.org/lkml/2005/5/26/11
> 
>     Jeff

Okay, so now I have two separate git repositories,
one for Linus's tree (currently at 2.6.12), and another
that is Jeff's libata-dev bundle of goodies.

But I have no idea whatsoever what to do next.

What I *want*, is the patchset for "passthru",
so that I can apply those patches to 2.6.12 and
then test that kernel.

But it is nowhere even remotely close to possibly perhaps
someday eventually maybe suggestively obvious how to do that.

Anyone care to volunteer the info?  Jeff?

Thanks

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-06-22 16:15                 ` Mark Lord
@ 2005-06-22 20:23                   ` Jeff Garzik
  2005-06-23  3:39                     ` Mark Lord
  0 siblings, 1 reply; 57+ messages in thread
From: Jeff Garzik @ 2005-06-22 20:23 UTC (permalink / raw)
  To: Mark Lord
  Cc: Greg Stark, linux-ide, Linux Kernel, Andrew Morton, James Bottomley

Mark Lord wrote:
> Jeff Garzik wrote:
> 
>> Greg Stark wrote:
>>
>>> So, uh, where do I get git? Where is your "git repository" and Linus' 
>>> "git repository" and how do I set that up?
>>
>>
>> http://lkml.org/lkml/2005/5/26/11
>>
>>     Jeff
> 
> 
> Okay, so now I have two separate git repositories,
> one for Linus's tree (currently at 2.6.12), and another
> that is Jeff's libata-dev bundle of goodies.
> 
> But I have no idea whatsoever what to do next.
> 
> What I *want*, is the patchset for "passthru",
> so that I can apply those patches to 2.6.12 and
> then test that kernel.
> 
> But it is nowhere even remotely close to possibly perhaps
> someday eventually maybe suggestively obvious how to do that.

Boy that's an unparseable sentence, if I ever saw one :)

You can obtain a patch from the 'passthru' branch by doing

	git checkout -f passthru
	git-diff-tree -p master HEAD > /tmp/patch

or simply by downloading what I just uploaded a few minutes ago,

http://www.kernel.org/pub/linux/kernel/people/jgarzik/libata/2.6.12-git4-passthru1.patch.bz2


^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-06-22 20:23                   ` Jeff Garzik
@ 2005-06-23  3:39                     ` Mark Lord
  0 siblings, 0 replies; 57+ messages in thread
From: Mark Lord @ 2005-06-23  3:39 UTC (permalink / raw)
  To: Jeff Garzik
  Cc: Greg Stark, linux-ide, Linux Kernel, Andrew Morton, James Bottomley

Jeff Garzik wrote:
>
> You can obtain a patch from the 'passthru' branch by doing
> 
>     git checkout -f passthru
>     git-diff-tree -p master HEAD > /tmp/patch
> 
> or simply by downloading what I just uploaded a few minutes ago

Great, it works now!  I had actually stumbled across a similar recipe
on my own, but prior to your very recent update of libata-dev.git
it gave me a huge unruly diff that didn't look right.

Now, though, the recipe above gives me exactly the same patch
that you posted, thanks!

Now if only the same were possible for atapi-enable,
though I suspect that branch is simply a one-liner to libata.h.

Do you have the suspend/resume stuff (Jens A.) in a tree some place?

Thanks Jeff!

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
@ 2005-06-07  7:00 ` Bene Martin
  0 siblings, 0 replies; 57+ messages in thread
From: Bene Martin @ 2005-06-07  7:00 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: linux-ide, Linux Kernel

> The two reasons why passthru is not upstream are:
> 
> * I need to make sure that it is 100% up-to-date for the latest ATA
> passthru spec, which clarified some SCSI CDB and descriptor codes.
> 
> * There was at least one report of ATA passthru use causing a device
> under load to start timing out, which could possibly indicate a driver
> bug. I need to do a serious analysis and final review of the patch, to
> make sure that it is plugged into the ATA host state machine at the
> correct places.

Just as a data point:

I've had a couple of problems on a system using sata+passthrough patch; 
not latest code though. I am reading smart info at fairly high frequency

(smartd + a smartctl call for each device every 5 minutes to graph drive
temperatures).

Versions used: 2.6.11.7 + 2.6.11-bk6-libata-dev1.patch.bz2

I got several ata errors, mostly in high - throughput situations (rsync 
over local network or rebuilding raid5), example from the logs:

Jun  5 04:13:50 backup kernel: ata3: command 0x25 timeout, stat 0x50
host_stat 0x1
Jun  5 06:30:51 backup kernel: ata3: command 0x35 timeout, stat 0x50
host_stat 0x1
Jun  5 10:46:50 backup kernel: ata3: command 0x35 timeout, stat 0x50
host_stat 0x1
Jun  5 10:47:20 backup kernel: ata3: command 0x35 timeout, stat 0x50
host_stat 0x1
Jun  5 10:53:45 backup kernel: ATA: abnormal status 0xD0 on port
0xE0802287
Jun  5 10:53:45 backup last message repeated 2 times
Jun  5 10:54:15 backup kernel: ata3: command 0x35 timeout, stat 0x50
host_stat 0x1
Jun  5 11:43:11 backup kernel: ATA: abnormal status 0xD0 on port
0xE0802287
Jun  5 11:43:11 backup last message repeated 2 times
Jun  5 11:43:41 backup kernel: ata3: command 0x35 timeout, stat 0x50
host_stat 0x1
Jun  5 14:23:45 backup kernel: ata3: command 0x35 timeout, stat 0x51
host_stat 0x1
Jun  5 14:23:45 backup kernel: ata3: status=0x51 { DriveReady
SeekComplete Error }
Jun  5 14:23:45 backup kernel: ata3: error=0x04 { DriveStatusError }
Jun  5 14:23:45 backup kernel: SCSI error : <3 0 0 0> return code =
0x8000002
Jun  5 14:23:45 backup kernel: sdc: Current: sense key: Aborted Command
Jun  5 14:23:45 backup kernel:     Additional sense: No additional sense
information
Jun  5 14:23:45 backup kernel: end_request: I/O error, dev sdc, sector
135917718
Jun  5 14:23:45 backup kernel: raid5: Disk failure on sdc6, disabling
device. Operation continuing on 2 devices

What makes me doubt the theory that smart/passthrough might be to blame 
is that I've only seen these errors on one of the 3 disks (always 
sdc/ata3). On the other hand, smart info for the drive doesn't show any 
errors or suspicious readings.

Boot log for the sata devices:

May 18 08:51:53 backup kernel: libata version 1.10 loaded.
May 18 08:51:53 backup kernel: sata_sil version 0.8
May 18 08:51:53 backup kernel: ACPI: PCI interrupt 0000:02:00.0[A] ->
GSI 21 (level, low) -> IRQ 21
May 18 08:51:53 backup kernel: ata1: SATA max UDMA/100 cmd 0xE0802080
ctl 0xE080208A bmdma 0xE0802000 irq 21
May 18 08:51:53 backup kernel: ata2: SATA max UDMA/100 cmd 0xE08020C0
ctl 0xE08020CA bmdma 0xE0802008 irq 21
May 18 08:51:53 backup kernel: ata3: SATA max UDMA/100 cmd 0xE0802280
ctl 0xE080228A bmdma 0xE0802200 irq 21
May 18 08:51:53 backup kernel: ata4: SATA max UDMA/100 cmd 0xE08022C0
ctl 0xE08022CA bmdma 0xE0802208 irq 21
May 18 08:51:53 backup kernel: ata1: dev 0 cfg 49:2f00 82:346b 83:7d01
84:4023 85:3469 86:3c01 87:4023 88:407f
May 18 08:51:53 backup kernel: ata1: dev 0 ATA-7, max UDMA/133,
781422768 sectors: LBA48
May 18 08:51:53 backup kernel: ata1: dev 0 configured for UDMA/100
May 18 08:51:53 backup kernel: scsi1 : sata_sil
May 18 08:51:53 backup kernel: ata2: dev 0 cfg 49:2f00 82:346b 83:7d01
84:4023 85:3469 86:3c01 87:4023 88:407f
May 18 08:51:53 backup kernel: ata2: dev 0 ATA-7, max UDMA/133,
781422768 sectors: LBA48
May 18 08:51:53 backup kernel: ata2: dev 0 configured for UDMA/100
May 18 08:51:53 backup kernel: scsi2 : sata_sil
May 18 08:51:53 backup kernel: ata3: dev 0 cfg 49:2f00 82:346b 83:7d01
84:4023 85:3469 86:3c01 87:4023 88:407f
May 18 08:51:53 backup kernel: ata3: dev 0 ATA-7, max UDMA/133,
781422768 sectors: LBA48
May 18 08:51:53 backup kernel: ata3: dev 0 configured for UDMA/100
May 18 08:51:53 backup kernel: scsi3 : sata_sil
May 18 08:51:53 backup kernel: ata4: no device found (phy stat 00000000)
May 18 08:51:53 backup kernel: scsi4 : sata_sil
May 18 08:51:53 backup kernel:   Vendor: ATA       Model: ST3400832AS
Rev: 3.01
May 18 08:51:53 backup kernel:   Type:   Direct-Access
ANSI SCSI revision: 05
May 18 08:51:53 backup kernel:   Vendor: ATA       Model: ST3400832AS
Rev: 3.01
May 18 08:51:53 backup kernel:   Type:   Direct-Access
ANSI SCSI revision: 05
May 18 08:51:53 backup kernel:   Vendor: ATA       Model: ST3400832AS
Rev: 3.01
May 18 08:51:53 backup kernel:   Type:   Direct-Access
ANSI SCSI revision: 05

SATA controller used:

0000:02:00.0 RAID bus controller: Silicon Image, Inc. SiI 3114
[SATALink/SATARaid] Serial ATA Controller (rev 02)

Bye, Martin

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
@ 2005-06-07  7:00 ` Bene Martin
  0 siblings, 0 replies; 57+ messages in thread
From: Bene Martin @ 2005-06-07  7:00 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: linux-ide, Linux Kernel

> The two reasons why passthru is not upstream are:
> 
> * I need to make sure that it is 100% up-to-date for the latest ATA
> passthru spec, which clarified some SCSI CDB and descriptor codes.
> 
> * There was at least one report of ATA passthru use causing a device
> under load to start timing out, which could possibly indicate a driver
> bug. I need to do a serious analysis and final review of the patch, to
> make sure that it is plugged into the ATA host state machine at the
> correct places.

Just as a data point:

I've had a couple of problems on a system using sata+passthrough patch; 
not latest code though. I am reading smart info at fairly high frequency

(smartd + a smartctl call for each device every 5 minutes to graph drive
temperatures).

Versions used: 2.6.11.7 + 2.6.11-bk6-libata-dev1.patch.bz2

I got several ata errors, mostly in high - throughput situations (rsync 
over local network or rebuilding raid5), example from the logs:

Jun  5 04:13:50 backup kernel: ata3: command 0x25 timeout, stat 0x50
host_stat 0x1
Jun  5 06:30:51 backup kernel: ata3: command 0x35 timeout, stat 0x50
host_stat 0x1
Jun  5 10:46:50 backup kernel: ata3: command 0x35 timeout, stat 0x50
host_stat 0x1
Jun  5 10:47:20 backup kernel: ata3: command 0x35 timeout, stat 0x50
host_stat 0x1
Jun  5 10:53:45 backup kernel: ATA: abnormal status 0xD0 on port
0xE0802287
Jun  5 10:53:45 backup last message repeated 2 times
Jun  5 10:54:15 backup kernel: ata3: command 0x35 timeout, stat 0x50
host_stat 0x1
Jun  5 11:43:11 backup kernel: ATA: abnormal status 0xD0 on port
0xE0802287
Jun  5 11:43:11 backup last message repeated 2 times
Jun  5 11:43:41 backup kernel: ata3: command 0x35 timeout, stat 0x50
host_stat 0x1
Jun  5 14:23:45 backup kernel: ata3: command 0x35 timeout, stat 0x51
host_stat 0x1
Jun  5 14:23:45 backup kernel: ata3: status=0x51 { DriveReady
SeekComplete Error }
Jun  5 14:23:45 backup kernel: ata3: error=0x04 { DriveStatusError }
Jun  5 14:23:45 backup kernel: SCSI error : <3 0 0 0> return code =
0x8000002
Jun  5 14:23:45 backup kernel: sdc: Current: sense key: Aborted Command
Jun  5 14:23:45 backup kernel:     Additional sense: No additional sense
information
Jun  5 14:23:45 backup kernel: end_request: I/O error, dev sdc, sector
135917718
Jun  5 14:23:45 backup kernel: raid5: Disk failure on sdc6, disabling
device. Operation continuing on 2 devices

What makes me doubt the theory that smart/passthrough might be to blame 
is that I've only seen these errors on one of the 3 disks (always 
sdc/ata3). On the other hand, smart info for the drive doesn't show any 
errors or suspicious readings.

Boot log for the sata devices:

May 18 08:51:53 backup kernel: libata version 1.10 loaded.
May 18 08:51:53 backup kernel: sata_sil version 0.8
May 18 08:51:53 backup kernel: ACPI: PCI interrupt 0000:02:00.0[A] ->
GSI 21 (level, low) -> IRQ 21
May 18 08:51:53 backup kernel: ata1: SATA max UDMA/100 cmd 0xE0802080
ctl 0xE080208A bmdma 0xE0802000 irq 21
May 18 08:51:53 backup kernel: ata2: SATA max UDMA/100 cmd 0xE08020C0
ctl 0xE08020CA bmdma 0xE0802008 irq 21
May 18 08:51:53 backup kernel: ata3: SATA max UDMA/100 cmd 0xE0802280
ctl 0xE080228A bmdma 0xE0802200 irq 21
May 18 08:51:53 backup kernel: ata4: SATA max UDMA/100 cmd 0xE08022C0
ctl 0xE08022CA bmdma 0xE0802208 irq 21
May 18 08:51:53 backup kernel: ata1: dev 0 cfg 49:2f00 82:346b 83:7d01
84:4023 85:3469 86:3c01 87:4023 88:407f
May 18 08:51:53 backup kernel: ata1: dev 0 ATA-7, max UDMA/133,
781422768 sectors: LBA48
May 18 08:51:53 backup kernel: ata1: dev 0 configured for UDMA/100
May 18 08:51:53 backup kernel: scsi1 : sata_sil
May 18 08:51:53 backup kernel: ata2: dev 0 cfg 49:2f00 82:346b 83:7d01
84:4023 85:3469 86:3c01 87:4023 88:407f
May 18 08:51:53 backup kernel: ata2: dev 0 ATA-7, max UDMA/133,
781422768 sectors: LBA48
May 18 08:51:53 backup kernel: ata2: dev 0 configured for UDMA/100
May 18 08:51:53 backup kernel: scsi2 : sata_sil
May 18 08:51:53 backup kernel: ata3: dev 0 cfg 49:2f00 82:346b 83:7d01
84:4023 85:3469 86:3c01 87:4023 88:407f
May 18 08:51:53 backup kernel: ata3: dev 0 ATA-7, max UDMA/133,
781422768 sectors: LBA48
May 18 08:51:53 backup kernel: ata3: dev 0 configured for UDMA/100
May 18 08:51:53 backup kernel: scsi3 : sata_sil
May 18 08:51:53 backup kernel: ata4: no device found (phy stat 00000000)
May 18 08:51:53 backup kernel: scsi4 : sata_sil
May 18 08:51:53 backup kernel:   Vendor: ATA       Model: ST3400832AS
Rev: 3.01
May 18 08:51:53 backup kernel:   Type:   Direct-Access
ANSI SCSI revision: 05
May 18 08:51:53 backup kernel:   Vendor: ATA       Model: ST3400832AS
Rev: 3.01
May 18 08:51:53 backup kernel:   Type:   Direct-Access
ANSI SCSI revision: 05
May 18 08:51:53 backup kernel:   Vendor: ATA       Model: ST3400832AS
Rev: 3.01
May 18 08:51:53 backup kernel:   Type:   Direct-Access
ANSI SCSI revision: 05

SATA controller used:

0000:02:00.0 RAID bus controller: Silicon Image, Inc. SiI 3114
[SATALink/SATARaid] Serial ATA Controller (rev 02)

Bye, Martin

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-03-10  5:40 Jeff Garzik
@ 2005-03-29  9:12 ` kern.petr
  0 siblings, 0 replies; 57+ messages in thread
From: kern.petr @ 2005-03-29  9:12 UTC (permalink / raw)
  To: Jeff Garzik, linux-ide, linux-kernel

Jeff Garzik napsal(a):

> Merged recent upstream changes into libata-dev queue.  No new patches 
> have found their way into libata-dev since last email.
>
> BK URL, Patch URL, and changelog attached.
>
> Note that the patch is diff'd against 2.6.11-bk6, which won't exist 
> until four hours after this email is sent.
>
>     Jeff 

It is hard to add support for VIA VT6420 PATA channel (SATA works fine)? 
Does anybody working on it? I can help with beta testing this driver. 
(The way through via82cxxx.c don't working.)

Is it possible add to To-do list to sata_via.c or add this support to 
driver?

sata_via.c:
---cut here---
   To-do list:
   * VT6420 PATA support <= new line
   * VT6421 PATA support
 */
---cut here---

Petr Novák,
kern.petr@seznam.cz


^ permalink raw reply	[flat|nested] 57+ messages in thread

* [SATA] libata-dev queue updated
@ 2005-03-10  5:40 Jeff Garzik
  2005-03-29  9:12 ` kern.petr
  0 siblings, 1 reply; 57+ messages in thread
From: Jeff Garzik @ 2005-03-10  5:40 UTC (permalink / raw)
  To: linux-ide; +Cc: Linux Kernel

[-- Attachment #1: Type: text/plain, Size: 292 bytes --]

Merged recent upstream changes into libata-dev queue.  No new patches 
have found their way into libata-dev since last email.

BK URL, Patch URL, and changelog attached.

Note that the patch is diff'd against 2.6.11-bk6, which won't exist 
until four hours after this email is sent.

	Jeff



[-- Attachment #2: libata-dev-2.6.txt --]
[-- Type: text/plain, Size: 3222 bytes --]

BK users:

	bk pull bk://gkernel.bkbits.net/libata-dev-2.6

Patch:
http://www.kernel.org/pub/linux/kernel/people/jgarzik/libata/2.6.11-bk6-libata-dev1.patch.bz2

This will update the following files:

 drivers/scsi/Kconfig         |   18 
 drivers/scsi/Makefile        |    2 
 drivers/scsi/ahci.c          |   95 +++--
 drivers/scsi/ata_adma.c      |  778 +++++++++++++++++++++++++++++++++++++++++++
 drivers/scsi/libata-core.c   |  296 +++++++++-------
 drivers/scsi/libata-scsi.c   |  701 ++++++++++++++++++++++++++++++++------
 drivers/scsi/libata.h        |    6 
 drivers/scsi/pata_pdc2027x.c |  771 ++++++++++++++++++++++++++++++++++++++++++
 drivers/scsi/sata_promise.c  |   84 ++++
 include/linux/ata.h          |   15 
 include/linux/libata.h       |   10 
 include/scsi/scsi.h          |    3 
 12 files changed, 2507 insertions(+), 272 deletions(-)

through these ChangeSets:

<andyw:pobox.com>:
  o [libata scsi] support 12-byte passthru CDB
  o [libata scsi] passthru CDB check condition processing
  o T10/04-262 ATA pass thru - patch

<erikbenada:yahoo.ca>:
  o [libata sata_promise] support PATA ports on SATA controllers

Albert Lee:
  o [libata] use init-device-params ATA command where needed
  o [libata] ata_scsi_verify_xlat() fix
  o pdc2027x timing register fix for 100MHz
  o [libata] CHS support: add CHS support to ata_scsi_verify_xlat(), ata_scsi_rw_xlat() and ata_scsiop_read_cap().
  o [libata] CHS support: reorganize read/write translation in ata_scsi_rw_xlat()
  o [libata] CHS support: rename vars (s/sector/block/) in ata_scsi_verify_xlat()
  o [libata] CHS support: detect C/H/S at IDENTIFY DEVICE time
  o [libata] CHS support: add definitions to headers
  o pdc2027x timing register bug fix
  o [libata pdc2027x] fix incorrect pio and mwdma masks
  o [libata pdc2027x] remove quirks and ROM enable
  o [libata] add driver for Promise PATA 2027x

Brad Campbell:
  o libata basic detection and errata for PATA->SATA bridges

Jeff Garzik:
  o [libata ahci] support PCI MSI interrupt vector
  o [libata adma] Add init code, fix CPB submission code
  o [libata ahci] finish ATAPI support
  o [libata adma] trivial whitespace cleanup
  o [libata dma] fix DMA mode config; add some more initialization code
  o [libata adma] add support for configuring PIO/DMA modes
  o [libata] turn on ATAPI support
  o [libata sata_promise] merge Tobias Lorenz' pdc20619 patch, part 2
  o [libata] small cleanups
  o [libata] remove unused execute-device-diagnostic reset method
  o [libata] add new driver ata_adma
  o [libata pdc2027x] update for upstream struct device conversion
  o [libata sata_promise] fix merge bugs
  o [libata] fix build breakage
  o [libata] fix SATA->PATA bridge detect compile breakage
  o [libata] fix printk warning

John W. Linville:
  o libata: update ATA pass thru opcodes
  o libata: minor style changes in ata_scsi_pass_thru
  o libata: filter SET_FEATURES - XFER MODE from ATA pass thru
  o libata: sync SMART ioctls with ATA pass thru spec (T10/04-262r7)
  o libata: fix command queue leak when xlat_func fails
  o libata: SMART support via ATA pass-thru

Tobias Lorenz:
  o [libata sata_promise] pdc20619 (PATA) support
  o libata-scsi: get-identity ioctl support


^ permalink raw reply	[flat|nested] 57+ messages in thread

* [SATA] libata-dev queue updated
@ 2005-03-08 11:20 Jeff Garzik
  0 siblings, 0 replies; 57+ messages in thread
From: Jeff Garzik @ 2005-03-08 11:20 UTC (permalink / raw)
  To: linux-ide, Linux Kernel

[-- Attachment #1: Type: text/plain, Size: 48 bytes --]

Rediffing against latest kernel.  See attached.

[-- Attachment #2: libata-dev-2.6.txt --]
[-- Type: text/plain, Size: 3222 bytes --]

BK users:

	bk pull bk://gkernel.bkbits.net/libata-dev-2.6

Patch:
http://www.kernel.org/pub/linux/kernel/people/jgarzik/libata/2.6.11-bk4-libata-dev1.patch.bz2

This will update the following files:

 drivers/scsi/Kconfig         |   18 
 drivers/scsi/Makefile        |    2 
 drivers/scsi/ahci.c          |   95 +++--
 drivers/scsi/ata_adma.c      |  778 +++++++++++++++++++++++++++++++++++++++++++
 drivers/scsi/libata-core.c   |  296 +++++++++-------
 drivers/scsi/libata-scsi.c   |  701 ++++++++++++++++++++++++++++++++------
 drivers/scsi/libata.h        |    6 
 drivers/scsi/pata_pdc2027x.c |  771 ++++++++++++++++++++++++++++++++++++++++++
 drivers/scsi/sata_promise.c  |   84 ++++
 include/linux/ata.h          |   15 
 include/linux/libata.h       |   10 
 include/scsi/scsi.h          |    3 
 12 files changed, 2507 insertions(+), 272 deletions(-)

through these ChangeSets:

<andyw:pobox.com>:
  o [libata scsi] support 12-byte passthru CDB
  o [libata scsi] passthru CDB check condition processing
  o T10/04-262 ATA pass thru - patch

<erikbenada:yahoo.ca>:
  o [libata sata_promise] support PATA ports on SATA controllers

Albert Lee:
  o [libata] use init-device-params ATA command where needed
  o [libata] ata_scsi_verify_xlat() fix
  o pdc2027x timing register fix for 100MHz
  o [libata] CHS support: add CHS support to ata_scsi_verify_xlat(), ata_scsi_rw_xlat() and ata_scsiop_read_cap().
  o [libata] CHS support: reorganize read/write translation in ata_scsi_rw_xlat()
  o [libata] CHS support: rename vars (s/sector/block/) in ata_scsi_verify_xlat()
  o [libata] CHS support: detect C/H/S at IDENTIFY DEVICE time
  o [libata] CHS support: add definitions to headers
  o pdc2027x timing register bug fix
  o [libata pdc2027x] fix incorrect pio and mwdma masks
  o [libata pdc2027x] remove quirks and ROM enable
  o [libata] add driver for Promise PATA 2027x

Brad Campbell:
  o libata basic detection and errata for PATA->SATA bridges

Jeff Garzik:
  o [libata ahci] support PCI MSI interrupt vector
  o [libata adma] Add init code, fix CPB submission code
  o [libata ahci] finish ATAPI support
  o [libata adma] trivial whitespace cleanup
  o [libata dma] fix DMA mode config; add some more initialization code
  o [libata adma] add support for configuring PIO/DMA modes
  o [libata] turn on ATAPI support
  o [libata sata_promise] merge Tobias Lorenz' pdc20619 patch, part 2
  o [libata] small cleanups
  o [libata] remove unused execute-device-diagnostic reset method
  o [libata] add new driver ata_adma
  o [libata pdc2027x] update for upstream struct device conversion
  o [libata sata_promise] fix merge bugs
  o [libata] fix build breakage
  o [libata] fix SATA->PATA bridge detect compile breakage
  o [libata] fix printk warning

John W. Linville:
  o libata: update ATA pass thru opcodes
  o libata: minor style changes in ata_scsi_pass_thru
  o libata: filter SET_FEATURES - XFER MODE from ATA pass thru
  o libata: sync SMART ioctls with ATA pass thru spec (T10/04-262r7)
  o libata: fix command queue leak when xlat_func fails
  o libata: SMART support via ATA pass-thru

Tobias Lorenz:
  o [libata sata_promise] pdc20619 (PATA) support
  o libata-scsi: get-identity ioctl support


^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-03-04 22:06                     ` Joerg Sommrey
@ 2005-03-04 22:32                       ` Joerg Sommrey
  0 siblings, 0 replies; 57+ messages in thread
From: Joerg Sommrey @ 2005-03-04 22:32 UTC (permalink / raw)
  To: Jeff Garzik, Linux kernel mailing list

On Fri, Mar 04, 2005 at 11:06:23PM +0100, Joerg Sommrey wrote:
> On Fri, Mar 04, 2005 at 03:43:38PM -0500, Jeff Garzik wrote:
> > Joerg Sommrey wrote:
> > >On Fri, Mar 04, 2005 at 01:07:16PM -0500, Jeff Garzik wrote:
> > >
> > >>Joerg Sommrey wrote:
> > >>
> > >>>On Fri, Mar 04, 2005 at 02:10:14AM -0500, Jeff Garzik wrote:
> > >>>
> > >>>
> > >>>>Joerg Sommrey wrote:
> > >>>>
> > >>>>
> > >>>>>On Thu, Mar 03, 2005 at 11:09:26PM -0500, Jeff Garzik wrote:
> > >>>>>
> > >>>>>
> > >>>>>
> > >>>>>>Joerg Sommrey wrote:
> > >>>>>>
> > >>>>>>
> > >>>>>>
> > >>>>>>>On Wed, Mar 02, 2005 at 05:43:59PM -0500, Jeff Garzik wrote:
> > >>>>>>>
> > >>>>>>>
> > >>>>>>>
> > >>>>>>>
> > >>>>>>>>Joerg Sommrey wrote:
> > >>>>>>>>
> > >>>>>>>>
> > >>>>>>>>
> > >>>>>>>>
> > >>>>>>>>>Jeff Garzik wrote:
> > >>>>>>>>>
> > >>>>>>>>>
> > >>>>>>>>>
> > >>>>>>>>>
> > >>>>>>>>>>Patch:
> > >>>>>>>>>>http://www.kernel.org/pub/linux/kernel/people/jgarzik/libata/2.6.11-rc5-bk4-libata-dev1.patch.bz2
> > >>>>>>>>>
> > >>>>>>>>>
> > >>>>>>>>>Still not usable here.  The same errors as before when backing up:
> > >>>>>>>>
> > >>>>>>>>Please try 2.6.11 without any patches.
> > >>>>>>>
> > >>>>>>>Plain 2.6.11 doesn't work either.  All of 2.6.10-ac11, 2.6.11-rc5,
> > >>>>>>>2.6.11-rc5 + 2.6.11-rc5-bk4-libata-dev1.patch and 2.6.11 fail with 
> > >>>>>>>the
> > >>>>>>>same symptoms. 
> > >>>>>>>
> > >>>>>>>Reverting to stable 2.6.10-ac8 :-)
> > >>>>>>
> > >>>>>>Does reverting the attached patch in 2.6.11 (apply with patch -R) fix 
> > >>>>>>things?
> > >>>>>>
> > >>>>>
> > >>>>>
> > >>>>>Still the same with this patch reverted.
> > >>>>
> > >>>>Does reverting the attached patch in 2.6.11 fix things?  (apply with 
> > >>>>patch -R)
> > >>>>
> > >>>>This patch reverts the entire libata back to 2.6.10.
> > >>>>
> > >>>
> > >>>I'm confused.  Still the same with everything reverted.  What shall I do
> > >>>now?
> > >>
> > >>Well, first, thanks for your patience in narrowing this down.
> > >>
> > >>This means we have eliminated libata as a problem source, but we still 
> > >>have the rest of the kernel go to through :)
> > >>
> > >>Try disabling ACPI with 'acpi=off' or 'pci=biosirq' to see if that fixes 
> > >>things.
> > >>
> > >
> > >I tried both settings with plain 2.6.11. Almost the same results, in my
> > >impression apci=off causes the failure to appear even faster.
> > 
> > Just to make sure I have things right, please tell me if this is correct:
> > 
> > * 2.6.10 vanilla works
> > 
> > * 2.6.11 vanilla does not work
> > 
> > * 2.6.11 vanilla + 2.6.10 libata does not work
> >   [2.6.10 libata == reverting all libata changes]
> > 
> > Is that all correct?
> 
> Thanks for asking these precise questions.  After double-checking
> everything I found a typo in my configuration that changes things a bit.
> I repeated some tests and the correct answers are now:
> * 2.6.10 vanilla		works
> * 2.6.10-ac8			works
> * 2.6.10-ac11			does not work
> * 2.6.11 vanilla		does not work
> * 2.6.11 w/o promise.patch	does not work
> * 2.6.11 + 2.6.10 libata	works!
> 
> This looks much more consistent to me but brings the case back to
> libata.

After one more test using 2.6.11 + 2.6.10 libata I got some errors.
They are different, they end after some time and they don't lock the system:

Mar  4 23:15:00 bear kernel: ata1: status=0x51 { DriveReady SeekComplete Error }Mar  4 23:15:00 bear kernel: sdb: Current: sense key: Recovered Error
Mar  4 23:15:00 bear kernel:     ASC=0x26 <<vendor>> ASCQ=0xc0
Mar  4 23:15:00 bear kernel: FMK, ILI

Got 1900 of these in 90 seconds and silence afterwards.  Maybe that
helps. I'll keep this kernel running and watch it.

-jo

-- 
-rw-r--r--  1 jo users 63 2005-03-04 23:12 /home/jo/.signature

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-03-04 20:43                   ` Jeff Garzik
@ 2005-03-04 22:06                     ` Joerg Sommrey
  2005-03-04 22:32                       ` Joerg Sommrey
  0 siblings, 1 reply; 57+ messages in thread
From: Joerg Sommrey @ 2005-03-04 22:06 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: Linux kernel mailing list, Andrew Morton, Brown, Len

On Fri, Mar 04, 2005 at 03:43:38PM -0500, Jeff Garzik wrote:
> Joerg Sommrey wrote:
> >On Fri, Mar 04, 2005 at 01:07:16PM -0500, Jeff Garzik wrote:
> >
> >>Joerg Sommrey wrote:
> >>
> >>>On Fri, Mar 04, 2005 at 02:10:14AM -0500, Jeff Garzik wrote:
> >>>
> >>>
> >>>>Joerg Sommrey wrote:
> >>>>
> >>>>
> >>>>>On Thu, Mar 03, 2005 at 11:09:26PM -0500, Jeff Garzik wrote:
> >>>>>
> >>>>>
> >>>>>
> >>>>>>Joerg Sommrey wrote:
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>>On Wed, Mar 02, 2005 at 05:43:59PM -0500, Jeff Garzik wrote:
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>>Joerg Sommrey wrote:
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>>Jeff Garzik wrote:
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>>>Patch:
> >>>>>>>>>>http://www.kernel.org/pub/linux/kernel/people/jgarzik/libata/2.6.11-rc5-bk4-libata-dev1.patch.bz2
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>>Still not usable here.  The same errors as before when backing up:
> >>>>>>>>
> >>>>>>>>Please try 2.6.11 without any patches.
> >>>>>>>
> >>>>>>>Plain 2.6.11 doesn't work either.  All of 2.6.10-ac11, 2.6.11-rc5,
> >>>>>>>2.6.11-rc5 + 2.6.11-rc5-bk4-libata-dev1.patch and 2.6.11 fail with 
> >>>>>>>the
> >>>>>>>same symptoms. 
> >>>>>>>
> >>>>>>>Reverting to stable 2.6.10-ac8 :-)
> >>>>>>
> >>>>>>Does reverting the attached patch in 2.6.11 (apply with patch -R) fix 
> >>>>>>things?
> >>>>>>
> >>>>>
> >>>>>
> >>>>>Still the same with this patch reverted.
> >>>>
> >>>>Does reverting the attached patch in 2.6.11 fix things?  (apply with 
> >>>>patch -R)
> >>>>
> >>>>This patch reverts the entire libata back to 2.6.10.
> >>>>
> >>>
> >>>I'm confused.  Still the same with everything reverted.  What shall I do
> >>>now?
> >>
> >>Well, first, thanks for your patience in narrowing this down.
> >>
> >>This means we have eliminated libata as a problem source, but we still 
> >>have the rest of the kernel go to through :)
> >>
> >>Try disabling ACPI with 'acpi=off' or 'pci=biosirq' to see if that fixes 
> >>things.
> >>
> >
> >I tried both settings with plain 2.6.11. Almost the same results, in my
> >impression apci=off causes the failure to appear even faster.
> 
> Just to make sure I have things right, please tell me if this is correct:
> 
> * 2.6.10 vanilla works
> 
> * 2.6.11 vanilla does not work
> 
> * 2.6.11 vanilla + 2.6.10 libata does not work
>   [2.6.10 libata == reverting all libata changes]
> 
> Is that all correct?

Thanks for asking these precise questions.  After double-checking
everything I found a typo in my configuration that changes things a bit.
I repeated some tests and the correct answers are now:
* 2.6.10 vanilla		works
* 2.6.10-ac8			works
* 2.6.10-ac11			does not work
* 2.6.11 vanilla		does not work
* 2.6.11 w/o promise.patch	does not work
* 2.6.11 + 2.6.10 libata	works!

This looks much more consistent to me but brings the case back to
libata.

-jo

-- 
-rw-r--r--  1 jo users 63 2005-03-04 22:48 /home/jo/.signature

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-03-04 20:33                 ` Joerg Sommrey
@ 2005-03-04 20:43                   ` Jeff Garzik
  2005-03-04 22:06                     ` Joerg Sommrey
  0 siblings, 1 reply; 57+ messages in thread
From: Jeff Garzik @ 2005-03-04 20:43 UTC (permalink / raw)
  To: Joerg Sommrey; +Cc: Linux kernel mailing list, Andrew Morton, Brown, Len

Joerg Sommrey wrote:
> On Fri, Mar 04, 2005 at 01:07:16PM -0500, Jeff Garzik wrote:
> 
>>Joerg Sommrey wrote:
>>
>>>On Fri, Mar 04, 2005 at 02:10:14AM -0500, Jeff Garzik wrote:
>>>
>>>
>>>>Joerg Sommrey wrote:
>>>>
>>>>
>>>>>On Thu, Mar 03, 2005 at 11:09:26PM -0500, Jeff Garzik wrote:
>>>>>
>>>>>
>>>>>
>>>>>>Joerg Sommrey wrote:
>>>>>>
>>>>>>
>>>>>>
>>>>>>>On Wed, Mar 02, 2005 at 05:43:59PM -0500, Jeff Garzik wrote:
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>>Joerg Sommrey wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>>Jeff Garzik wrote:
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>>Patch:
>>>>>>>>>>http://www.kernel.org/pub/linux/kernel/people/jgarzik/libata/2.6.11-rc5-bk4-libata-dev1.patch.bz2
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>Still not usable here.  The same errors as before when backing up:
>>>>>>>>
>>>>>>>>Please try 2.6.11 without any patches.
>>>>>>>
>>>>>>>Plain 2.6.11 doesn't work either.  All of 2.6.10-ac11, 2.6.11-rc5,
>>>>>>>2.6.11-rc5 + 2.6.11-rc5-bk4-libata-dev1.patch and 2.6.11 fail with the
>>>>>>>same symptoms. 
>>>>>>>
>>>>>>>Reverting to stable 2.6.10-ac8 :-)
>>>>>>
>>>>>>Does reverting the attached patch in 2.6.11 (apply with patch -R) fix 
>>>>>>things?
>>>>>>
>>>>>
>>>>>
>>>>>Still the same with this patch reverted.
>>>>
>>>>Does reverting the attached patch in 2.6.11 fix things?  (apply with 
>>>>patch -R)
>>>>
>>>>This patch reverts the entire libata back to 2.6.10.
>>>>
>>>
>>>I'm confused.  Still the same with everything reverted.  What shall I do
>>>now?
>>
>>Well, first, thanks for your patience in narrowing this down.
>>
>>This means we have eliminated libata as a problem source, but we still 
>>have the rest of the kernel go to through :)
>>
>>Try disabling ACPI with 'acpi=off' or 'pci=biosirq' to see if that fixes 
>>things.
>>
> 
> I tried both settings with plain 2.6.11. Almost the same results, in my
> impression apci=off causes the failure to appear even faster.

Just to make sure I have things right, please tell me if this is correct:

* 2.6.10 vanilla works

* 2.6.11 vanilla does not work

* 2.6.11 vanilla + 2.6.10 libata does not work
   [2.6.10 libata == reverting all libata changes]

Is that all correct?

	Jeff





^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-03-04 18:07               ` Jeff Garzik
@ 2005-03-04 20:33                 ` Joerg Sommrey
  2005-03-04 20:43                   ` Jeff Garzik
  0 siblings, 1 reply; 57+ messages in thread
From: Joerg Sommrey @ 2005-03-04 20:33 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: Linux kernel mailing list, Andrew Morton, Brown, Len

On Fri, Mar 04, 2005 at 01:07:16PM -0500, Jeff Garzik wrote:
> Joerg Sommrey wrote:
> >On Fri, Mar 04, 2005 at 02:10:14AM -0500, Jeff Garzik wrote:
> >
> >>Joerg Sommrey wrote:
> >>
> >>>On Thu, Mar 03, 2005 at 11:09:26PM -0500, Jeff Garzik wrote:
> >>>
> >>>
> >>>>Joerg Sommrey wrote:
> >>>>
> >>>>
> >>>>>On Wed, Mar 02, 2005 at 05:43:59PM -0500, Jeff Garzik wrote:
> >>>>>
> >>>>>
> >>>>>
> >>>>>>Joerg Sommrey wrote:
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>>Jeff Garzik wrote:
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>>Patch:
> >>>>>>>>http://www.kernel.org/pub/linux/kernel/people/jgarzik/libata/2.6.11-rc5-bk4-libata-dev1.patch.bz2
> >>>>>>>
> >>>>>>>
> >>>>>>>Still not usable here.  The same errors as before when backing up:
> >>>>>>
> >>>>>>Please try 2.6.11 without any patches.
> >>>>>
> >>>>>Plain 2.6.11 doesn't work either.  All of 2.6.10-ac11, 2.6.11-rc5,
> >>>>>2.6.11-rc5 + 2.6.11-rc5-bk4-libata-dev1.patch and 2.6.11 fail with the
> >>>>>same symptoms. 
> >>>>>
> >>>>>Reverting to stable 2.6.10-ac8 :-)
> >>>>
> >>>>Does reverting the attached patch in 2.6.11 (apply with patch -R) fix 
> >>>>things?
> >>>>
> >>>
> >>>
> >>>Still the same with this patch reverted.
> >>
> >>Does reverting the attached patch in 2.6.11 fix things?  (apply with 
> >>patch -R)
> >>
> >>This patch reverts the entire libata back to 2.6.10.
> >>
> >
> >I'm confused.  Still the same with everything reverted.  What shall I do
> >now?
> 
> Well, first, thanks for your patience in narrowing this down.
> 
> This means we have eliminated libata as a problem source, but we still 
> have the rest of the kernel go to through :)
> 
> Try disabling ACPI with 'acpi=off' or 'pci=biosirq' to see if that fixes 
> things.
> 
I tried both settings with plain 2.6.11. Almost the same results, in my
impression apci=off causes the failure to appear even faster.

-jo

-- 
-rw-r--r--  1 jo users 63 2005-03-04 20:54 /home/jo/.signature

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-03-04 17:49             ` Joerg Sommrey
@ 2005-03-04 18:07               ` Jeff Garzik
  2005-03-04 20:33                 ` Joerg Sommrey
  0 siblings, 1 reply; 57+ messages in thread
From: Jeff Garzik @ 2005-03-04 18:07 UTC (permalink / raw)
  To: Joerg Sommrey; +Cc: Linux kernel mailing list, Andrew Morton, Brown, Len

Joerg Sommrey wrote:
> On Fri, Mar 04, 2005 at 02:10:14AM -0500, Jeff Garzik wrote:
> 
>>Joerg Sommrey wrote:
>>
>>>On Thu, Mar 03, 2005 at 11:09:26PM -0500, Jeff Garzik wrote:
>>>
>>>
>>>>Joerg Sommrey wrote:
>>>>
>>>>
>>>>>On Wed, Mar 02, 2005 at 05:43:59PM -0500, Jeff Garzik wrote:
>>>>>
>>>>>
>>>>>
>>>>>>Joerg Sommrey wrote:
>>>>>>
>>>>>>
>>>>>>
>>>>>>>Jeff Garzik wrote:
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>>Patch:
>>>>>>>>http://www.kernel.org/pub/linux/kernel/people/jgarzik/libata/2.6.11-rc5-bk4-libata-dev1.patch.bz2
>>>>>>>
>>>>>>>
>>>>>>>Still not usable here.  The same errors as before when backing up:
>>>>>>
>>>>>>Please try 2.6.11 without any patches.
>>>>>
>>>>>Plain 2.6.11 doesn't work either.  All of 2.6.10-ac11, 2.6.11-rc5,
>>>>>2.6.11-rc5 + 2.6.11-rc5-bk4-libata-dev1.patch and 2.6.11 fail with the
>>>>>same symptoms. 
>>>>>
>>>>>Reverting to stable 2.6.10-ac8 :-)
>>>>
>>>>Does reverting the attached patch in 2.6.11 (apply with patch -R) fix 
>>>>things?
>>>>
>>>
>>>
>>>Still the same with this patch reverted.
>>
>>Does reverting the attached patch in 2.6.11 fix things?  (apply with 
>>patch -R)
>>
>>This patch reverts the entire libata back to 2.6.10.
>>
> 
> I'm confused.  Still the same with everything reverted.  What shall I do
> now?

Well, first, thanks for your patience in narrowing this down.

This means we have eliminated libata as a problem source, but we still 
have the rest of the kernel go to through :)

Try disabling ACPI with 'acpi=off' or 'pci=biosirq' to see if that fixes 
things.

	Jeff




^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-03-04  7:10           ` Jeff Garzik
@ 2005-03-04 17:49             ` Joerg Sommrey
  2005-03-04 18:07               ` Jeff Garzik
  0 siblings, 1 reply; 57+ messages in thread
From: Joerg Sommrey @ 2005-03-04 17:49 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: Linux kernel mailing list

On Fri, Mar 04, 2005 at 02:10:14AM -0500, Jeff Garzik wrote:
> Joerg Sommrey wrote:
> >On Thu, Mar 03, 2005 at 11:09:26PM -0500, Jeff Garzik wrote:
> >
> >>Joerg Sommrey wrote:
> >>
> >>>On Wed, Mar 02, 2005 at 05:43:59PM -0500, Jeff Garzik wrote:
> >>>
> >>>
> >>>>Joerg Sommrey wrote:
> >>>>
> >>>>
> >>>>>Jeff Garzik wrote:
> >>>>>
> >>>>>
> >>>>>>Patch:
> >>>>>>http://www.kernel.org/pub/linux/kernel/people/jgarzik/libata/2.6.11-rc5-bk4-libata-dev1.patch.bz2
> >>>>>
> >>>>>
> >>>>>Still not usable here.  The same errors as before when backing up:
> >>>>
> >>>>Please try 2.6.11 without any patches.
> >>>
> >>>Plain 2.6.11 doesn't work either.  All of 2.6.10-ac11, 2.6.11-rc5,
> >>>2.6.11-rc5 + 2.6.11-rc5-bk4-libata-dev1.patch and 2.6.11 fail with the
> >>>same symptoms. 
> >>>
> >>>Reverting to stable 2.6.10-ac8 :-)
> >>
> >>Does reverting the attached patch in 2.6.11 (apply with patch -R) fix 
> >>things?
> >>
> >
> >
> >Still the same with this patch reverted.
> 
> Does reverting the attached patch in 2.6.11 fix things?  (apply with 
> patch -R)
> 
> This patch reverts the entire libata back to 2.6.10.
> 
I'm confused.  Still the same with everything reverted.  What shall I do
now?

-jo

-- 
-rw-r--r--  1 jo users 63 2005-03-04 18:44 /home/jo/.signature

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-03-04  6:37         ` Joerg Sommrey
@ 2005-03-04  7:10           ` Jeff Garzik
  2005-03-04 17:49             ` Joerg Sommrey
  0 siblings, 1 reply; 57+ messages in thread
From: Jeff Garzik @ 2005-03-04  7:10 UTC (permalink / raw)
  To: Joerg Sommrey; +Cc: Linux kernel mailing list

[-- Attachment #1: Type: text/plain, Size: 996 bytes --]

Joerg Sommrey wrote:
> On Thu, Mar 03, 2005 at 11:09:26PM -0500, Jeff Garzik wrote:
> 
>>Joerg Sommrey wrote:
>>
>>>On Wed, Mar 02, 2005 at 05:43:59PM -0500, Jeff Garzik wrote:
>>>
>>>
>>>>Joerg Sommrey wrote:
>>>>
>>>>
>>>>>Jeff Garzik wrote:
>>>>>
>>>>>
>>>>>>Patch:
>>>>>>http://www.kernel.org/pub/linux/kernel/people/jgarzik/libata/2.6.11-rc5-bk4-libata-dev1.patch.bz2
>>>>>
>>>>>
>>>>>Still not usable here.  The same errors as before when backing up:
>>>>
>>>>Please try 2.6.11 without any patches.
>>>
>>>Plain 2.6.11 doesn't work either.  All of 2.6.10-ac11, 2.6.11-rc5,
>>>2.6.11-rc5 + 2.6.11-rc5-bk4-libata-dev1.patch and 2.6.11 fail with the
>>>same symptoms. 
>>>
>>>Reverting to stable 2.6.10-ac8 :-)
>>
>>Does reverting the attached patch in 2.6.11 (apply with patch -R) fix 
>>things?
>>
> 
> 
> Still the same with this patch reverted.

Does reverting the attached patch in 2.6.11 fix things?  (apply with 
patch -R)

This patch reverts the entire libata back to 2.6.10.

	Jeff



[-- Attachment #2: patch-2.6.11-libata --]
[-- Type: text/plain, Size: 75820 bytes --]

diff -Nru a/drivers/scsi/ahci.c b/drivers/scsi/ahci.c
--- a/drivers/scsi/ahci.c	2005-03-01 23:38:53 -08:00
+++ b/drivers/scsi/ahci.c	2005-03-01 23:38:53 -08:00
@@ -179,6 +179,7 @@
 static void ahci_host_stop(struct ata_host_set *host_set);
 static void ahci_qc_prep(struct ata_queued_cmd *qc);
 static u8 ahci_check_status(struct ata_port *ap);
+static u8 ahci_check_err(struct ata_port *ap);
 static inline int ahci_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc);
 
 static Scsi_Host_Template ahci_sht = {
@@ -204,6 +205,8 @@
 	.port_disable		= ata_port_disable,
 
 	.check_status		= ahci_check_status,
+	.check_altstatus	= ahci_check_status,
+	.check_err		= ahci_check_err,
 	.dev_select		= ata_noop_dev_select,
 
 	.phy_reset		= ahci_phy_reset,
@@ -239,9 +242,19 @@
 
 static struct pci_device_id ahci_pci_tbl[] = {
 	{ PCI_VENDOR_ID_INTEL, 0x2652, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-	  board_ahci },
+	  board_ahci }, /* ICH6 */
 	{ PCI_VENDOR_ID_INTEL, 0x2653, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
-	  board_ahci },
+	  board_ahci }, /* ICH6M */
+	{ PCI_VENDOR_ID_INTEL, 0x27c1, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+	  board_ahci }, /* ICH7 */
+	{ PCI_VENDOR_ID_INTEL, 0x27c5, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+	  board_ahci }, /* ICH7M */
+	{ PCI_VENDOR_ID_INTEL, 0x27c2, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+	  board_ahci }, /* ICH7R */
+	{ PCI_VENDOR_ID_INTEL, 0x27c3, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+	  board_ahci }, /* ICH7R */
+	{ PCI_VENDOR_ID_AL, 0x5288, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+	  board_ahci }, /* ULi M5288 */
 	{ }	/* terminate list */
 };
 
@@ -442,6 +455,13 @@
 	return readl(mmio + PORT_TFDATA) & 0xFF;
 }
 
+static u8 ahci_check_err(struct ata_port *ap)
+{
+	void *mmio = (void *) ap->ioaddr.cmd_addr;
+
+	return (readl(mmio + PORT_TFDATA) >> 8) & 0xFF;
+}
+
 static void ahci_fill_sg(struct ata_queued_cmd *qc)
 {
 	struct ahci_port_priv *pp = qc->ap->private_data;
@@ -509,15 +529,6 @@
 	ahci_fill_sg(qc);
 }
 
-static inline void ahci_dma_complete (struct ata_port *ap,
-                                     struct ata_queued_cmd *qc,
-				     int have_err)
-{
-	/* get drive status; clear intr; complete txn */
-	ata_qc_complete(ata_qc_from_tag(ap, ap->active_tag),
-			have_err ? ATA_ERR : 0);
-}
-
 static void ahci_intr_error(struct ata_port *ap, u32 irq_stat)
 {
 	void *mmio = ap->host_set->mmio_base;
@@ -939,6 +950,7 @@
 	unsigned long base;
 	void *mmio_base;
 	unsigned int board_idx = (unsigned int) ent->driver_data;
+	int pci_dev_busy = 0;
 	int rc;
 
 	VPRINTK("ENTER\n");
@@ -951,8 +963,10 @@
 		return rc;
 
 	rc = pci_request_regions(pdev, DRV_NAME);
-	if (rc)
+	if (rc) {
+		pci_dev_busy = 1;
 		goto err_out;
+	}
 
 	pci_enable_intx(pdev);
 
@@ -1014,7 +1028,8 @@
 err_out_regions:
 	pci_release_regions(pdev);
 err_out:
-	pci_disable_device(pdev);
+	if (!pci_dev_busy)
+		pci_disable_device(pdev);
 	return rc;
 }
 
diff -Nru a/drivers/scsi/ata_piix.c b/drivers/scsi/ata_piix.c
--- a/drivers/scsi/ata_piix.c	2005-03-01 23:39:18 -08:00
+++ b/drivers/scsi/ata_piix.c	2005-03-01 23:39:18 -08:00
@@ -60,6 +60,7 @@
 	piix4_pata		= 2,
 	ich6_sata		= 3,
 	ich6_sata_rm		= 4,
+	ich7_sata		= 5,
 };
 
 static int piix_init_one (struct pci_dev *pdev,
@@ -90,6 +91,8 @@
 	{ 0x8086, 0x2651, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata },
 	{ 0x8086, 0x2652, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_rm },
 	{ 0x8086, 0x2653, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_rm },
+	{ 0x8086, 0x27c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich7_sata },
+	{ 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich7_sata },
 
 	{ }	/* terminate list */
 };
@@ -135,6 +138,8 @@
 
 	.bmdma_setup		= ata_bmdma_setup,
 	.bmdma_start		= ata_bmdma_start,
+	.bmdma_stop		= ata_bmdma_stop,
+	.bmdma_status		= ata_bmdma_status,
 	.qc_prep		= ata_qc_prep,
 	.qc_issue		= ata_qc_issue_prot,
 
@@ -160,6 +165,8 @@
 
 	.bmdma_setup		= ata_bmdma_setup,
 	.bmdma_start		= ata_bmdma_start,
+	.bmdma_stop		= ata_bmdma_stop,
+	.bmdma_status		= ata_bmdma_status,
 	.qc_prep		= ata_qc_prep,
 	.qc_issue		= ata_qc_issue_prot,
 
@@ -226,6 +233,18 @@
 	},
 
 	/* ich6_sata_rm */
+	{
+		.sht		= &piix_sht,
+		.host_flags	= ATA_FLAG_SATA | ATA_FLAG_SRST |
+				  PIIX_FLAG_COMBINED | PIIX_FLAG_CHECKINTR |
+				  ATA_FLAG_SLAVE_POSS | PIIX_FLAG_AHCI,
+		.pio_mask	= 0x1f,	/* pio0-4 */
+		.mwdma_mask	= 0x07, /* mwdma0-2 */
+		.udma_mask	= 0x7f,	/* udma0-6 */
+		.port_ops	= &piix_sata_ops,
+	},
+
+	/* ich7_sata */
 	{
 		.sht		= &piix_sht,
 		.host_flags	= ATA_FLAG_SATA | ATA_FLAG_SRST |
diff -Nru a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c
--- a/drivers/scsi/libata-core.c	2005-03-01 23:38:44 -08:00
+++ b/drivers/scsi/libata-core.c	2005-03-01 23:38:44 -08:00
@@ -28,6 +28,7 @@
 #include <linux/pci.h>
 #include <linux/init.h>
 #include <linux/list.h>
+#include <linux/mm.h>
 #include <linux/highmem.h>
 #include <linux/spinlock.h>
 #include <linux/blkdev.h>
@@ -376,7 +377,7 @@
 }
 
 /**
- *	ata_check_status - Read device status reg & clear interrupt
+ *	ata_check_status_pio - Read device status reg & clear interrupt
  *	@ap: port where the device is
  *
  *	Reads ATA taskfile status register for currently-selected device
@@ -414,6 +415,27 @@
 	return ata_check_status_pio(ap);
 }
 
+u8 ata_altstatus(struct ata_port *ap)
+{
+	if (ap->ops->check_altstatus)
+		return ap->ops->check_altstatus(ap);
+
+	if (ap->flags & ATA_FLAG_MMIO)
+		return readb((void __iomem *)ap->ioaddr.altstatus_addr);
+	return inb(ap->ioaddr.altstatus_addr);
+}
+
+u8 ata_chk_err(struct ata_port *ap)
+{
+	if (ap->ops->check_err)
+		return ap->ops->check_err(ap);
+
+	if (ap->flags & ATA_FLAG_MMIO) {
+		return readb((void __iomem *) ap->ioaddr.error_addr);
+	}
+	return inb(ap->ioaddr.error_addr);
+}
+
 /**
  *	ata_tf_to_fis - Convert ATA taskfile to SATA FIS structure
  *	@tf: Taskfile to convert
@@ -1160,7 +1182,6 @@
 	printk(KERN_WARNING "ata%u: dev %u not supported, ignoring\n",
 	       ap->id, device);
 err_out:
-	ata_irq_on(ap);	/* re-enable interrupts */
 	dev->class++;	/* converts ATA_DEV_xxx into ATA_DEV_xxx_UNSUP */
 	DPRINTK("EXIT, err\n");
 }
@@ -1668,7 +1689,8 @@
 		ata_dev_try_classify(ap, 1);
 
 	/* re-enable interrupts */
-	ata_irq_on(ap);
+	if (ap->ioaddr.ctl_addr)	/* FIXME: hack. create a hook instead */
+		ata_irq_on(ap);
 
 	/* is double-select really necessary? */
 	if (ap->device[1].class != ATA_DEV_NONE)
@@ -1699,6 +1721,69 @@
 	DPRINTK("EXIT\n");
 }
 
+static void ata_pr_blacklisted(struct ata_port *ap, struct ata_device *dev)
+{
+	printk(KERN_WARNING "ata%u: dev %u is on DMA blacklist, disabling DMA\n",
+		ap->id, dev->devno);
+}
+
+static const char * ata_dma_blacklist [] = {
+	"WDC AC11000H",
+	"WDC AC22100H",
+	"WDC AC32500H",
+	"WDC AC33100H",
+	"WDC AC31600H",
+	"WDC AC32100H",
+	"WDC AC23200L",
+	"Compaq CRD-8241B",
+	"CRD-8400B",
+	"CRD-8480B",
+	"CRD-8482B",
+ 	"CRD-84",
+	"SanDisk SDP3B",
+	"SanDisk SDP3B-64",
+	"SANYO CD-ROM CRD",
+	"HITACHI CDR-8",
+	"HITACHI CDR-8335",
+	"HITACHI CDR-8435",
+	"Toshiba CD-ROM XM-6202B",
+	"CD-532E-A",
+	"E-IDE CD-ROM CR-840",
+	"CD-ROM Drive/F5A",
+	"WPI CDD-820",
+	"SAMSUNG CD-ROM SC-148C",
+	"SAMSUNG CD-ROM SC",
+	"SanDisk SDP3B-64",
+	"SAMSUNG CD-ROM SN-124",
+	"ATAPI CD-ROM DRIVE 40X MAXIMUM",
+	"_NEC DV5800A",
+};
+
+static int ata_dma_blacklisted(struct ata_port *ap, struct ata_device *dev)
+{
+	unsigned char model_num[40];
+	char *s;
+	unsigned int len;
+	int i;
+
+	ata_dev_id_string(dev->id, model_num, ATA_ID_PROD_OFS,
+			  sizeof(model_num));
+	s = &model_num[0];
+	len = strnlen(s, sizeof(model_num));
+
+	/* ATAPI specifies that empty space is blank-filled; remove blanks */
+	while ((len > 0) && (s[len - 1] == ' ')) {
+		len--;
+		s[len] = 0;
+	}
+
+	for (i = 0; i < ARRAY_SIZE(ata_dma_blacklist); i++)
+		if (!strncmp(ata_dma_blacklist[i], s, len))
+			return 1;
+
+	return 0;
+}
+
 static unsigned int ata_get_mode_mask(struct ata_port *ap, int shift)
 {
 	struct ata_device *master, *slave;
@@ -1711,17 +1796,37 @@
 
 	if (shift == ATA_SHIFT_UDMA) {
 		mask = ap->udma_mask;
-		if (ata_dev_present(master))
+		if (ata_dev_present(master)) {
 			mask &= (master->id[ATA_ID_UDMA_MODES] & 0xff);
-		if (ata_dev_present(slave))
+			if (ata_dma_blacklisted(ap, master)) {
+				mask = 0;
+				ata_pr_blacklisted(ap, master);
+			}
+		}
+		if (ata_dev_present(slave)) {
 			mask &= (slave->id[ATA_ID_UDMA_MODES] & 0xff);
+			if (ata_dma_blacklisted(ap, slave)) {
+				mask = 0;
+				ata_pr_blacklisted(ap, slave);
+			}
+		}
 	}
 	else if (shift == ATA_SHIFT_MWDMA) {
 		mask = ap->mwdma_mask;
-		if (ata_dev_present(master))
+		if (ata_dev_present(master)) {
 			mask &= (master->id[ATA_ID_MWDMA_MODES] & 0x07);
-		if (ata_dev_present(slave))
+			if (ata_dma_blacklisted(ap, master)) {
+				mask = 0;
+				ata_pr_blacklisted(ap, master);
+			}
+		}
+		if (ata_dev_present(slave)) {
 			mask &= (slave->id[ATA_ID_MWDMA_MODES] & 0x07);
+			if (ata_dma_blacklisted(ap, slave)) {
+				mask = 0;
+				ata_pr_blacklisted(ap, slave);
+			}
+		}
 	}
 	else if (shift == ATA_SHIFT_PIO) {
 		mask = ap->pio_mask;
@@ -1919,7 +2024,24 @@
 	if (idx)
 		ap->prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT);
 }
+/**
+ *	ata_check_atapi_dma - Check whether ATAPI DMA can be supported
+ *	@qc: Metadata associated with taskfile to check
+ *
+ *	LOCKING:
+ *	RETURNS: 0 when ATAPI DMA can be used
+ *               nonzero otherwise
+ */
+int ata_check_atapi_dma(struct ata_queued_cmd *qc)
+{
+	struct ata_port *ap = qc->ap;
+	int rc = 0; /* Assume ATAPI DMA is OK by default */
+
+	if (ap->ops->check_atapi_dma)
+		rc = ap->ops->check_atapi_dma(qc);
 
+	return rc;
+}
 /**
  *	ata_qc_prep - Prepare taskfile for submission
  *	@qc: Metadata associated with taskfile to be prepared
@@ -2369,6 +2491,9 @@
 	unsigned long timeout = 0;
 
 	switch (ap->pio_task_state) {
+	case PIO_ST_IDLE:
+		return;
+
 	case PIO_ST:
 		ata_pio_block(ap);
 		break;
@@ -2385,18 +2510,14 @@
 	case PIO_ST_TMOUT:
 	case PIO_ST_ERR:
 		ata_pio_error(ap);
-		break;
+		return;
 	}
 
-	if ((ap->pio_task_state != PIO_ST_IDLE) &&
-	    (ap->pio_task_state != PIO_ST_TMOUT) &&
-	    (ap->pio_task_state != PIO_ST_ERR)) {
-		if (timeout)
-			queue_delayed_work(ata_wq, &ap->pio_task,
-					   timeout);
-		else
-			queue_work(ata_wq, &ap->pio_task);
-	}
+	if (timeout)
+		queue_delayed_work(ata_wq, &ap->pio_task,
+				   timeout);
+	else
+		queue_work(ata_wq, &ap->pio_task);
 }
 
 static void atapi_request_sense(struct ata_port *ap, struct ata_device *dev,
@@ -2405,7 +2526,6 @@
 	DECLARE_COMPLETION(wait);
 	struct ata_queued_cmd *qc;
 	unsigned long flags;
-	int using_pio = dev->flags & ATA_DFLAG_PIO;
 	int rc;
 
 	DPRINTK("ATAPI request sense\n");
@@ -2426,16 +2546,10 @@
 	qc->tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE;
 	qc->tf.command = ATA_CMD_PACKET;
 
-	if (using_pio) {
-		qc->tf.protocol = ATA_PROT_ATAPI;
-		qc->tf.lbam = (8 * 1024) & 0xff;
-		qc->tf.lbah = (8 * 1024) >> 8;
-
-		qc->nbytes = SCSI_SENSE_BUFFERSIZE;
-	} else {
-		qc->tf.protocol = ATA_PROT_ATAPI_DMA;
-		qc->tf.feature |= ATAPI_PKT_DMA;
-	}
+	qc->tf.protocol = ATA_PROT_ATAPI;
+	qc->tf.lbam = (8 * 1024) & 0xff;
+	qc->tf.lbah = (8 * 1024) >> 8;
+	qc->nbytes = SCSI_SENSE_BUFFERSIZE;
 
 	qc->waiting = &wait;
 	qc->complete_fn = ata_qc_complete_noop;
@@ -2508,10 +2622,10 @@
 
 	case ATA_PROT_DMA:
 	case ATA_PROT_ATAPI_DMA:
-		host_stat = ata_bmdma_status(ap);
+		host_stat = ap->ops->bmdma_status(ap);
 
 		/* before we do anything else, clear DMA-Start bit */
-		ata_bmdma_stop(ap);
+		ap->ops->bmdma_stop(ap);
 
 		/* fall through */
 
@@ -2520,7 +2634,7 @@
 		drv_stat = ata_chk_status(ap);
 
 		/* ack bmdma irq events */
-		ata_bmdma_ack_irq(ap);
+		ap->ops->irq_clear(ap);
 
 		printk(KERN_ERR "ata%u: command 0x%x timeout, stat 0x%x host_stat 0x%x\n",
 		       ap->id, qc->tf.command, drv_stat, host_stat);
@@ -2659,6 +2773,24 @@
 }
 
 /**
+ *	ata_qc_free - free unused ata_queued_cmd
+ *	@qc: Command to complete
+ *
+ *	Designed to free unused ata_queued_cmd object
+ *	in case something prevents using it.
+ *
+ *	LOCKING:
+ *
+ */
+void ata_qc_free(struct ata_queued_cmd *qc)
+{
+	assert(qc != NULL);	/* ata_qc_from_tag _might_ return NULL */
+	assert(qc->waiting == NULL);	/* nothing should be waiting */
+
+	__ata_qc_complete(qc);
+}
+
+/**
  *	ata_qc_complete - Complete an active ATA command
  *	@qc: Command to complete
  *	@drv_stat: ATA status register contents
@@ -2707,7 +2839,7 @@
 			return 1;
 
 		/* fall through */
-	
+
 	default:
 		return 0;
 	}
@@ -2949,7 +3081,43 @@
 
 void ata_bmdma_irq_clear(struct ata_port *ap)
 {
-	ata_bmdma_ack_irq(ap);
+    if (ap->flags & ATA_FLAG_MMIO) {
+        void __iomem *mmio = ((void __iomem *) ap->ioaddr.bmdma_addr) + ATA_DMA_STATUS;
+        writeb(readb(mmio), mmio);
+    } else {
+        unsigned long addr = ap->ioaddr.bmdma_addr + ATA_DMA_STATUS;
+        outb(inb(addr), addr);
+    }
+
+}
+
+u8 ata_bmdma_status(struct ata_port *ap)
+{
+	u8 host_stat;
+	if (ap->flags & ATA_FLAG_MMIO) {
+		void __iomem *mmio = (void __iomem *) ap->ioaddr.bmdma_addr;
+		host_stat = readb(mmio + ATA_DMA_STATUS);
+	} else
+	host_stat = inb(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
+	return host_stat;
+}
+
+void ata_bmdma_stop(struct ata_port *ap)
+{
+	if (ap->flags & ATA_FLAG_MMIO) {
+		void __iomem *mmio = (void __iomem *) ap->ioaddr.bmdma_addr;
+
+		/* clear start/stop bit */
+		writeb(readb(mmio + ATA_DMA_CMD) & ~ATA_DMA_START,
+			mmio + ATA_DMA_CMD);
+	} else {
+		/* clear start/stop bit */
+		outb(inb(ap->ioaddr.bmdma_addr + ATA_DMA_CMD) & ~ATA_DMA_START,
+			ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
+	}
+
+	/* one-PIO-cycle guaranteed wait, per spec, for HDMA1:0 transition */
+	ata_altstatus(ap);        /* dummy read */
 }
 
 /**
@@ -2979,7 +3147,7 @@
 	case ATA_PROT_ATAPI_DMA:
 	case ATA_PROT_ATAPI:
 		/* check status of DMA engine */
-		host_stat = ata_bmdma_status(ap);
+		host_stat = ap->ops->bmdma_status(ap);
 		VPRINTK("ata%u: host_stat 0x%X\n", ap->id, host_stat);
 
 		/* if it's not our irq... */
@@ -2987,7 +3155,7 @@
 			goto idle_irq;
 
 		/* before we do anything else, clear DMA-Start bit */
-		ata_bmdma_stop(ap);
+		ap->ops->bmdma_stop(ap);
 
 		/* fall through */
 
@@ -3006,7 +3174,7 @@
 			ap->id, qc->tf.protocol, status);
 
 		/* ack bmdma irq events */
-		ata_bmdma_ack_irq(ap);
+		ap->ops->irq_clear(ap);
 
 		/* complete taskfile transaction */
 		ata_qc_complete(qc, status);
@@ -3442,32 +3610,28 @@
 }
 
 static struct ata_probe_ent *
-ata_probe_ent_alloc(int n, struct device *dev, struct ata_port_info **port)
+ata_probe_ent_alloc(struct device *dev, struct ata_port_info *port)
 {
 	struct ata_probe_ent *probe_ent;
-	int i;
 
-	probe_ent = kmalloc(sizeof(*probe_ent) * n, GFP_KERNEL);
+	probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
 	if (!probe_ent) {
 		printk(KERN_ERR DRV_NAME "(%s): out of memory\n",
 		       kobject_name(&(dev->kobj)));
 		return NULL;
 	}
 
-	memset(probe_ent, 0, sizeof(*probe_ent) * n);
+	memset(probe_ent, 0, sizeof(*probe_ent));
 
-	for (i = 0; i < n; i++) {
-		INIT_LIST_HEAD(&probe_ent[i].node);
-		probe_ent[i].dev = dev;
-
-		probe_ent[i].sht = port[i]->sht;
-		probe_ent[i].host_flags = port[i]->host_flags;
-		probe_ent[i].pio_mask = port[i]->pio_mask;
-		probe_ent[i].mwdma_mask = port[i]->mwdma_mask;
-		probe_ent[i].udma_mask = port[i]->udma_mask;
-		probe_ent[i].port_ops = port[i]->port_ops;
+	INIT_LIST_HEAD(&probe_ent->node);
+	probe_ent->dev = dev;
 
-	}
+	probe_ent->sht = port->sht;
+	probe_ent->host_flags = port->host_flags;
+	probe_ent->pio_mask = port->pio_mask;
+	probe_ent->mwdma_mask = port->mwdma_mask;
+	probe_ent->udma_mask = port->udma_mask;
+	probe_ent->port_ops = port->port_ops;
 
 	return probe_ent;
 }
@@ -3477,7 +3641,7 @@
 ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port)
 {
 	struct ata_probe_ent *probe_ent =
-		ata_probe_ent_alloc(1, pci_dev_to_dev(pdev), port);
+		ata_probe_ent_alloc(pci_dev_to_dev(pdev), port[0]);
 	if (!probe_ent)
 		return NULL;
 
@@ -3503,39 +3667,47 @@
 	return probe_ent;
 }
 
-struct ata_probe_ent *
-ata_pci_init_legacy_mode(struct pci_dev *pdev, struct ata_port_info **port)
+static struct ata_probe_ent *
+ata_pci_init_legacy_mode(struct pci_dev *pdev, struct ata_port_info **port,
+    struct ata_probe_ent **ppe2)
 {
-	struct ata_probe_ent *probe_ent =
-		ata_probe_ent_alloc(2, pci_dev_to_dev(pdev), port);
+	struct ata_probe_ent *probe_ent, *probe_ent2;
+
+	probe_ent = ata_probe_ent_alloc(pci_dev_to_dev(pdev), port[0]);
 	if (!probe_ent)
 		return NULL;
+	probe_ent2 = ata_probe_ent_alloc(pci_dev_to_dev(pdev), port[1]);
+	if (!probe_ent2) {
+		kfree(probe_ent);
+		return NULL;
+	}
 
-	probe_ent[0].n_ports = 1;
-	probe_ent[0].irq = 14;
+	probe_ent->n_ports = 1;
+	probe_ent->irq = 14;
 
-	probe_ent[0].hard_port_no = 0;
-	probe_ent[0].legacy_mode = 1;
+	probe_ent->hard_port_no = 0;
+	probe_ent->legacy_mode = 1;
 
-	probe_ent[1].n_ports = 1;
-	probe_ent[1].irq = 15;
+	probe_ent2->n_ports = 1;
+	probe_ent2->irq = 15;
 
-	probe_ent[1].hard_port_no = 1;
-	probe_ent[1].legacy_mode = 1;
-
-	probe_ent[0].port[0].cmd_addr = 0x1f0;
-	probe_ent[0].port[0].altstatus_addr =
-	probe_ent[0].port[0].ctl_addr = 0x3f6;
-	probe_ent[0].port[0].bmdma_addr = pci_resource_start(pdev, 4);
-
-	probe_ent[1].port[0].cmd_addr = 0x170;
-	probe_ent[1].port[0].altstatus_addr =
-	probe_ent[1].port[0].ctl_addr = 0x376;
-	probe_ent[1].port[0].bmdma_addr = pci_resource_start(pdev, 4)+8;
+	probe_ent2->hard_port_no = 1;
+	probe_ent2->legacy_mode = 1;
 
-	ata_std_ports(&probe_ent[0].port[0]);
-	ata_std_ports(&probe_ent[1].port[0]);
+	probe_ent->port[0].cmd_addr = 0x1f0;
+	probe_ent->port[0].altstatus_addr =
+	probe_ent->port[0].ctl_addr = 0x3f6;
+	probe_ent->port[0].bmdma_addr = pci_resource_start(pdev, 4);
+
+	probe_ent2->port[0].cmd_addr = 0x170;
+	probe_ent2->port[0].altstatus_addr =
+	probe_ent2->port[0].ctl_addr = 0x376;
+	probe_ent2->port[0].bmdma_addr = pci_resource_start(pdev, 4)+8;
+
+	ata_std_ports(&probe_ent->port[0]);
+	ata_std_ports(&probe_ent2->port[0]);
 
+	*ppe2 = probe_ent2;
 	return probe_ent;
 }
 
@@ -3559,6 +3731,7 @@
 	struct ata_port_info *port[2];
 	u8 tmp8, mask;
 	unsigned int legacy_mode = 0;
+	int disable_dev_on_err = 1;
 	int rc;
 
 	DPRINTK("ENTER\n");
@@ -3569,7 +3742,8 @@
 	else
 		port[1] = port[0];
 
-	if ((port[0]->host_flags & ATA_FLAG_NO_LEGACY) == 0) {
+	if ((port[0]->host_flags & ATA_FLAG_NO_LEGACY) == 0
+	    && (pdev->class >> 8) == PCI_CLASS_STORAGE_IDE) {
 		/* TODO: support transitioning to native mode? */
 		pci_read_config_byte(pdev, PCI_CLASS_PROG, &tmp8);
 		mask = (1 << 2) | (1 << 0);
@@ -3588,8 +3762,10 @@
 		return rc;
 
 	rc = pci_request_regions(pdev, DRV_NAME);
-	if (rc)
+	if (rc) {
+		disable_dev_on_err = 0;
 		goto err_out;
+	}
 
 	if (legacy_mode) {
 		if (!request_region(0x1f0, 8, "libata")) {
@@ -3599,8 +3775,10 @@
 			conflict = ____request_resource(&ioport_resource, &res);
 			if (!strcmp(conflict->name, "libata"))
 				legacy_mode |= (1 << 0);
-			else
+			else {
+				disable_dev_on_err = 0;
 				printk(KERN_WARNING "ata: 0x1f0 IDE port busy\n");
+			}
 		} else
 			legacy_mode |= (1 << 0);
 
@@ -3611,8 +3789,10 @@
 			conflict = ____request_resource(&ioport_resource, &res);
 			if (!strcmp(conflict->name, "libata"))
 				legacy_mode |= (1 << 1);
-			else
+			else {
+				disable_dev_on_err = 0;
 				printk(KERN_WARNING "ata: 0x170 IDE port busy\n");
+			}
 		} else
 			legacy_mode |= (1 << 1);
 	}
@@ -3631,9 +3811,7 @@
 		goto err_out_regions;
 
 	if (legacy_mode) {
-		probe_ent = ata_pci_init_legacy_mode(pdev, port);
-		if (probe_ent)
-			probe_ent2 = &probe_ent[1];
+		probe_ent = ata_pci_init_legacy_mode(pdev, port, &probe_ent2);
 	} else
 		probe_ent = ata_pci_init_native_mode(pdev, port);
 	if (!probe_ent) {
@@ -3649,10 +3827,11 @@
 			ata_device_add(probe_ent);
 		if (legacy_mode & (1 << 1))
 			ata_device_add(probe_ent2);
-	} else {
+	} else
 		ata_device_add(probe_ent);
-	}
+
 	kfree(probe_ent);
+	kfree(probe_ent2);
 
 	return 0;
 
@@ -3663,7 +3842,8 @@
 		release_region(0x170, 8);
 	pci_release_regions(pdev);
 err_out:
-	pci_disable_device(pdev);
+	if (disable_dev_on_err)
+		pci_disable_device(pdev);
 	return rc;
 }
 
@@ -3813,6 +3993,8 @@
 EXPORT_SYMBOL_GPL(ata_tf_to_fis);
 EXPORT_SYMBOL_GPL(ata_tf_from_fis);
 EXPORT_SYMBOL_GPL(ata_check_status);
+EXPORT_SYMBOL_GPL(ata_altstatus);
+EXPORT_SYMBOL_GPL(ata_chk_err);
 EXPORT_SYMBOL_GPL(ata_exec_command);
 EXPORT_SYMBOL_GPL(ata_port_start);
 EXPORT_SYMBOL_GPL(ata_port_stop);
@@ -3821,6 +4003,8 @@
 EXPORT_SYMBOL_GPL(ata_bmdma_setup);
 EXPORT_SYMBOL_GPL(ata_bmdma_start);
 EXPORT_SYMBOL_GPL(ata_bmdma_irq_clear);
+EXPORT_SYMBOL_GPL(ata_bmdma_status);
+EXPORT_SYMBOL_GPL(ata_bmdma_stop);
 EXPORT_SYMBOL_GPL(ata_port_probe);
 EXPORT_SYMBOL_GPL(sata_phy_reset);
 EXPORT_SYMBOL_GPL(__sata_phy_reset);
@@ -3838,7 +4022,6 @@
 
 #ifdef CONFIG_PCI
 EXPORT_SYMBOL_GPL(pci_test_config_bits);
-EXPORT_SYMBOL_GPL(ata_pci_init_legacy_mode);
 EXPORT_SYMBOL_GPL(ata_pci_init_native_mode);
 EXPORT_SYMBOL_GPL(ata_pci_init_one);
 EXPORT_SYMBOL_GPL(ata_pci_remove_one);
diff -Nru a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c
--- a/drivers/scsi/libata-scsi.c	2005-03-01 23:38:56 -08:00
+++ b/drivers/scsi/libata-scsi.c	2005-03-01 23:38:56 -08:00
@@ -202,7 +202,7 @@
 		{0x40, 		MEDIUM_ERROR, 0x11, 0x04}, 	// Uncorrectable ECC error      Unrecovered read error
 		/* BBD - block marked bad */
 		{0x80, 		MEDIUM_ERROR, 0x11, 0x04}, 	// Block marked bad		  Medium error, unrecovered read error
-		{0xFF, 0xFF, 0xFF, 0xFF}, // END mark 
+		{0xFF, 0xFF, 0xFF, 0xFF}, // END mark
 	};
 	static unsigned char stat_table[][4] = {
 		/* Must be first because BUSY means no other bits valid */
@@ -210,22 +210,22 @@
 		{0x20, 		HARDWARE_ERROR,  0x00, 0x00}, 	// Device fault
 		{0x08, 		ABORTED_COMMAND, 0x47, 0x00},	// Timed out in xfer, fake parity for now
 		{0x04, 		RECOVERED_ERROR, 0x11, 0x00},	// Recovered ECC error	  Medium error, recovered
-		{0xFF, 0xFF, 0xFF, 0xFF}, // END mark 
+		{0xFF, 0xFF, 0xFF, 0xFF}, // END mark
 	};
 	int i = 0;
 
 	cmd->result = SAM_STAT_CHECK_CONDITION;
-	
+
 	/*
 	 *	Is this an error we can process/parse
 	 */
-	 
+
 	if(drv_stat & ATA_ERR)
 		/* Read the err bits */
 		err = ata_chk_err(qc->ap);
 
 	/* Display the ATA level error info */
-	
+
 	printk(KERN_WARNING "ata%u: status=0x%02x { ", qc->ap->id, drv_stat);
 	if(drv_stat & 0x80)
 	{
@@ -242,7 +242,7 @@
 		if(drv_stat & 0x01)	printk("Error ");
 	}
 	printk("}\n");
-	
+
 	if(err)
 	{
 		printk(KERN_WARNING "ata%u: error=0x%02x { ", qc->ap->id, err);
@@ -259,11 +259,11 @@
 		if(err & 0x02)		printk("TrackZeroNotFound ");
 		if(err & 0x01)		printk("AddrMarkNotFound ");
 		printk("}\n");
-		
+
 		/* Should we dump sector info here too ?? */
 	}
-		
-	
+
+
 	/* Look for err */
 	while(sense_table[i][0] != 0xFF)
 	{
@@ -282,7 +282,8 @@
 	/* No immediate match */
 	if(err)
 		printk(KERN_DEBUG "ata%u: no sense translation for 0x%02x\n", qc->ap->id, err);
-	
+
+	i = 0;
 	/* Fall back to interpreting status bits */
 	while(stat_table[i][0] != 0xFF)
 	{
@@ -300,7 +301,7 @@
 	/* No error ?? */
 	printk(KERN_ERR "ata%u: called with no error (%02X)!\n", qc->ap->id, drv_stat);
 	/* additional-sense-code[-qualifier] */
-	
+
 	sb[0] = 0x70;
 	sb[2] = MEDIUM_ERROR;
 	sb[7] = 0x0A;
@@ -487,19 +488,24 @@
 	}
 
 	if (lba48) {
+		tf->command = ATA_CMD_VERIFY_EXT;
+
 		tf->hob_nsect = (n_sect >> 8) & 0xff;
 
 		tf->hob_lbah = (sect >> 40) & 0xff;
 		tf->hob_lbam = (sect >> 32) & 0xff;
 		tf->hob_lbal = (sect >> 24) & 0xff;
-	} else
+	} else {
+		tf->command = ATA_CMD_VERIFY;
+
 		tf->device |= (sect >> 24) & 0xf;
+	}
 
 	tf->nsect = n_sect & 0xff;
 
-	tf->hob_lbah = (sect >> 16) & 0xff;
-	tf->hob_lbam = (sect >> 8) & 0xff;
-	tf->hob_lbal = sect & 0xff;
+	tf->lbah = (sect >> 16) & 0xff;
+	tf->lbam = (sect >> 8) & 0xff;
+	tf->lbal = sect & 0xff;
 
 	return 0;
 }
@@ -599,7 +605,7 @@
 				return 1;
 
 			/* stores LBA27:24 in lower 4 bits of device reg */
-			tf->device |= scsicmd[2];
+			tf->device |= scsicmd[6];
 
 			qc->nsect = scsicmd[13];
 		}
@@ -695,6 +701,7 @@
 	return;
 
 err_out:
+	ata_qc_free(qc);
 	ata_bad_cdb(cmd, done);
 	DPRINTK("EXIT - badcmd\n");
 }
@@ -1293,6 +1300,11 @@
 	struct ata_device *dev = qc->dev;
 	int using_pio = (dev->flags & ATA_DFLAG_PIO);
 	int nodata = (cmd->sc_data_direction == SCSI_DATA_NONE);
+
+	if (!using_pio)
+		/* Check whether ATAPI DMA is safe */
+		if (ata_check_atapi_dma(qc))
+			using_pio = 1;
 
 	memcpy(&qc->cdb, scsicmd, qc->ap->cdb_len);
 
diff -Nru a/drivers/scsi/libata.h b/drivers/scsi/libata.h
--- a/drivers/scsi/libata.h	2005-03-01 23:38:53 -08:00
+++ b/drivers/scsi/libata.h	2005-03-01 23:38:53 -08:00
@@ -37,7 +37,9 @@
 /* libata-core.c */
 extern struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap,
 				      struct ata_device *dev);
+extern void ata_qc_free(struct ata_queued_cmd *qc);
 extern int ata_qc_issue(struct ata_queued_cmd *qc);
+extern int ata_check_atapi_dma(struct ata_queued_cmd *qc);
 extern void ata_dev_select(struct ata_port *ap, unsigned int device,
                            unsigned int wait, unsigned int can_sleep);
 extern void ata_tf_to_host_nolock(struct ata_port *ap, struct ata_taskfile *tf);
diff -Nru a/drivers/scsi/sata_nv.c b/drivers/scsi/sata_nv.c
--- a/drivers/scsi/sata_nv.c	2005-03-01 23:38:53 -08:00
+++ b/drivers/scsi/sata_nv.c	2005-03-01 23:38:53 -08:00
@@ -20,6 +20,10 @@
  *  If you do not delete the provisions above, a recipient may use your
  *  version of this file under either the OSL or the GPL.
  *
+ *  0.06
+ *     - Added generic SATA support by using a pci_device_id that filters on
+ *       the IDE storage class code.
+ *
  *  0.03
  *     - Fixed a bug where the hotplug handlers for non-CK804/MCP04 were using
  *       mmio_base, which is only set for the CK804/MCP04 case.
@@ -44,7 +48,7 @@
 #include <linux/libata.h>
 
 #define DRV_NAME			"sata_nv"
-#define DRV_VERSION			"0.5"
+#define DRV_VERSION			"0.6"
 
 #define NV_PORTS			2
 #define NV_PIO_MASK			0x1f
@@ -108,6 +112,7 @@
 
 enum nv_host_type
 {
+	GENERIC,
 	NFORCE2,
 	NFORCE3,
 	CK804
@@ -128,6 +133,9 @@
 		PCI_ANY_ID, PCI_ANY_ID, 0, 0, CK804 },
 	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SATA2,
 		PCI_ANY_ID, PCI_ANY_ID, 0, 0, CK804 },
+	{ PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID,
+		PCI_ANY_ID, PCI_ANY_ID,
+		PCI_CLASS_STORAGE_IDE<<8, 0xffff00, GENERIC },
 	{ 0, } /* terminate list */
 };
 
@@ -136,7 +144,6 @@
 struct nv_host_desc
 {
 	enum nv_host_type	host_type;
-	unsigned long		host_flags;
 	void			(*enable_hotplug)(struct ata_probe_ent *probe_ent);
 	void			(*disable_hotplug)(struct ata_host_set *host_set);
 	void			(*check_hotplug)(struct ata_host_set *host_set);
@@ -144,21 +151,24 @@
 };
 static struct nv_host_desc nv_device_tbl[] = {
 	{
+		.host_type	= GENERIC,
+		.enable_hotplug	= NULL,
+		.disable_hotplug= NULL,
+		.check_hotplug	= NULL,
+	},
+	{
 		.host_type	= NFORCE2,
-		.host_flags	= 0x00000000,
 		.enable_hotplug	= nv_enable_hotplug,
 		.disable_hotplug= nv_disable_hotplug,
 		.check_hotplug	= nv_check_hotplug,
 	},
 	{
 		.host_type	= NFORCE3,
-		.host_flags	= 0x00000000,
 		.enable_hotplug	= nv_enable_hotplug,
 		.disable_hotplug= nv_disable_hotplug,
 		.check_hotplug	= nv_check_hotplug,
 	},
 	{	.host_type	= CK804,
-		.host_flags	= NV_HOST_FLAGS_SCR_MMIO,
 		.enable_hotplug	= nv_enable_hotplug_ck804,
 		.disable_hotplug= nv_disable_hotplug_ck804,
 		.check_hotplug	= nv_check_hotplug_ck804,
@@ -168,6 +178,7 @@
 struct nv_host
 {
 	struct nv_host_desc	*host_desc;
+	unsigned long		host_flags;
 };
 
 static struct pci_driver nv_pci_driver = {
@@ -206,6 +217,8 @@
 	.phy_reset		= sata_phy_reset,
 	.bmdma_setup		= ata_bmdma_setup,
 	.bmdma_start		= ata_bmdma_start,
+	.bmdma_stop		= ata_bmdma_stop,
+	.bmdma_status		= ata_bmdma_status,
 	.qc_prep		= ata_qc_prep,
 	.qc_issue		= ata_qc_issue_prot,
 	.eng_timeout		= ata_eng_timeout,
@@ -284,8 +297,8 @@
 	if (sc_reg > SCR_CONTROL)
 		return 0xffffffffU;
 
-	if (host->host_desc->host_flags & NV_HOST_FLAGS_SCR_MMIO)
-		return readl(ap->ioaddr.scr_addr + (sc_reg * 4));
+	if (host->host_flags & NV_HOST_FLAGS_SCR_MMIO)
+		return readl((void*)ap->ioaddr.scr_addr + (sc_reg * 4));
 	else
 		return inl(ap->ioaddr.scr_addr + (sc_reg * 4));
 }
@@ -298,8 +311,8 @@
 	if (sc_reg > SCR_CONTROL)
 		return;
 
-	if (host->host_desc->host_flags & NV_HOST_FLAGS_SCR_MMIO)
-		writel(val, ap->ioaddr.scr_addr + (sc_reg * 4));
+	if (host->host_flags & NV_HOST_FLAGS_SCR_MMIO)
+		writel(val, (void*)ap->ioaddr.scr_addr + (sc_reg * 4));
 	else
 		outl(val, ap->ioaddr.scr_addr + (sc_reg * 4));
 }
@@ -321,7 +334,16 @@
 	struct nv_host *host;
 	struct ata_port_info *ppi;
 	struct ata_probe_ent *probe_ent;
+	int pci_dev_busy = 0;
 	int rc;
+	u32 bar;
+
+        // Make sure this is a SATA controller by counting the number of bars
+        // (NVIDIA SATA controllers will always have six bars).  Otherwise,
+        // it's an IDE controller and we ignore it.
+	for (bar=0; bar<6; bar++)
+		if (pci_resource_start(pdev, bar) == 0)
+			return -ENODEV;
 
 	if (!printed_version++)
 		printk(KERN_DEBUG DRV_NAME " version " DRV_VERSION "\n");
@@ -331,8 +353,10 @@
 		goto err_out;
 
 	rc = pci_request_regions(pdev, DRV_NAME);
-	if (rc)
+	if (rc) {
+		pci_dev_busy = 1;
 		goto err_out_disable;
+	}
 
 	rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
 	if (rc)
@@ -352,11 +376,15 @@
 	if (!host)
 		goto err_out_free_ent;
 
+	memset(host, 0, sizeof(struct nv_host));
 	host->host_desc = &nv_device_tbl[ent->driver_data];
 
 	probe_ent->private_data = host;
 
-	if (host->host_desc->host_flags & NV_HOST_FLAGS_SCR_MMIO) {
+	if (pci_resource_flags(pdev, 5) & IORESOURCE_MEM)
+		host->host_flags |= NV_HOST_FLAGS_SCR_MMIO;
+
+	if (host->host_flags & NV_HOST_FLAGS_SCR_MMIO) {
 		unsigned long base;
 
 		probe_ent->mmio_base = ioremap(pci_resource_start(pdev, 5),
@@ -395,7 +423,7 @@
 	return 0;
 
 err_out_iounmap:
-	if (host->host_desc->host_flags & NV_HOST_FLAGS_SCR_MMIO)
+	if (host->host_flags & NV_HOST_FLAGS_SCR_MMIO)
 		iounmap(probe_ent->mmio_base);
 err_out_free_host:
 	kfree(host);
@@ -404,7 +432,8 @@
 err_out_regions:
 	pci_release_regions(pdev);
 err_out_disable:
-	pci_disable_device(pdev);
+	if (!pci_dev_busy)
+		pci_disable_device(pdev);
 err_out:
 	return rc;
 }
diff -Nru a/drivers/scsi/sata_promise.c b/drivers/scsi/sata_promise.c
--- a/drivers/scsi/sata_promise.c	2005-03-01 23:39:08 -08:00
+++ b/drivers/scsi/sata_promise.c	2005-03-01 23:39:08 -08:00
@@ -156,10 +156,18 @@
 	  board_2037x },
 	{ PCI_VENDOR_ID_PROMISE, 0x3376, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
 	  board_2037x },
+	{ PCI_VENDOR_ID_PROMISE, 0x3574, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+	  board_2037x },
+	{ PCI_VENDOR_ID_PROMISE, 0x3d75, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+	  board_2037x },
+
 	{ PCI_VENDOR_ID_PROMISE, 0x3318, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
 	  board_20319 },
 	{ PCI_VENDOR_ID_PROMISE, 0x3319, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
 	  board_20319 },
+	{ PCI_VENDOR_ID_PROMISE, 0x3d18, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+	  board_20319 },
+
 	{ }	/* terminate list */
 };
 
@@ -406,9 +414,11 @@
 		return IRQ_NONE;
 	}
 
-        spin_lock(&host_set->lock);
+	spin_lock(&host_set->lock);
 
-        for (i = 0; i < host_set->n_ports; i++) {
+	writel(mask, mmio_base + PDC_INT_SEQMASK);
+
+	for (i = 0; i < host_set->n_ports; i++) {
 		VPRINTK("port %u\n", i);
 		ap = host_set->ports[i];
 		tmp = mask & (1 << (i + 1));
@@ -546,6 +556,7 @@
 	unsigned long base;
 	void *mmio_base;
 	unsigned int board_idx = (unsigned int) ent->driver_data;
+	int pci_dev_busy = 0;
 	int rc;
 
 	if (!printed_version++)
@@ -560,8 +571,10 @@
 		return rc;
 
 	rc = pci_request_regions(pdev, DRV_NAME);
-	if (rc)
+	if (rc) {
+		pci_dev_busy = 1;
 		goto err_out;
+	}
 
 	rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
 	if (rc)
@@ -640,7 +653,8 @@
 err_out_regions:
 	pci_release_regions(pdev);
 err_out:
-	pci_disable_device(pdev);
+	if (!pci_dev_busy)
+		pci_disable_device(pdev);
 	return rc;
 }
 
diff -Nru a/drivers/scsi/sata_qstor.c b/drivers/scsi/sata_qstor.c
--- /dev/null	Wed Dec 31 16:00:00 196900
+++ b/drivers/scsi/sata_qstor.c	2005-03-01 23:39:27 -08:00
@@ -0,0 +1,700 @@
+/*
+ *  sata_qstor.c - Pacific Digital Corporation QStor SATA
+ *
+ *  Maintained by:  Mark Lord <mlord@pobox.com>
+ *
+ *  Copyright 2005 Pacific Digital Corporation.
+ *  (OSL/GPL code release authorized by Jalil Fadavi).
+ *
+ *  The contents of this file are subject to the Open
+ *  Software License version 1.1 that can be found at
+ *  http://www.opensource.org/licenses/osl-1.1.txt and is included herein
+ *  by reference.
+ *
+ *  Alternatively, the contents of this file may be used under the terms
+ *  of the GNU General Public License version 2 (the "GPL") as distributed
+ *  in the kernel source COPYING file, in which case the provisions of
+ *  the GPL are applicable instead of the above.  If you wish to allow
+ *  the use of your version of this file only under the terms of the
+ *  GPL and not to allow others to use your version of this file under
+ *  the OSL, indicate your decision by deleting the provisions above and
+ *  replace them with the notice and other provisions required by the GPL.
+ *  If you do not delete the provisions above, a recipient may use your
+ *  version of this file under either the OSL or the GPL.
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/pci.h>
+#include <linux/init.h>
+#include <linux/blkdev.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/sched.h>
+#include "scsi.h"
+#include <scsi/scsi_host.h>
+#include <asm/io.h>
+#include <linux/libata.h>
+
+#define DRV_NAME	"sata_qstor"
+#define DRV_VERSION	"0.03"
+
+enum {
+	QS_PORTS		= 4,
+	QS_MAX_PRD		= LIBATA_MAX_PRD,
+	QS_CPB_ORDER		= 6,
+	QS_CPB_BYTES		= (1 << QS_CPB_ORDER),
+	QS_PRD_BYTES		= QS_MAX_PRD * 16,
+	QS_PKT_BYTES		= QS_CPB_BYTES + QS_PRD_BYTES,
+
+	QS_DMA_BOUNDARY		= ~0UL,
+
+	/* global register offsets */
+	QS_HCF_CNFG3		= 0x0003, /* host configuration offset */
+	QS_HID_HPHY		= 0x0004, /* host physical interface info */
+	QS_HCT_CTRL		= 0x00e4, /* global interrupt mask offset */
+	QS_HST_SFF		= 0x0100, /* host status fifo offset */
+	QS_HVS_SERD3		= 0x0393, /* PHY enable offset */
+
+	/* global control bits */
+	QS_HPHY_64BIT		= (1 << 1), /* 64-bit bus detected */
+	QS_CNFG3_GSRST		= 0x01,     /* global chip reset */
+	QS_SERD3_PHY_ENA	= 0xf0,     /* PHY detection ENAble*/
+
+	/* per-channel register offsets */
+	QS_CCF_CPBA		= 0x0710, /* chan CPB base address */
+	QS_CCF_CSEP		= 0x0718, /* chan CPB separation factor */
+	QS_CFC_HUFT		= 0x0800, /* host upstream fifo threshold */
+	QS_CFC_HDFT		= 0x0804, /* host downstream fifo threshold */
+	QS_CFC_DUFT		= 0x0808, /* dev upstream fifo threshold */
+	QS_CFC_DDFT		= 0x080c, /* dev downstream fifo threshold */
+	QS_CCT_CTR0		= 0x0900, /* chan control-0 offset */
+	QS_CCT_CTR1		= 0x0901, /* chan control-1 offset */
+	QS_CCT_CFF		= 0x0a00, /* chan command fifo offset */
+
+	/* channel control bits */
+	QS_CTR0_REG		= (1 << 1),   /* register mode (vs. pkt mode) */
+	QS_CTR0_CLER		= (1 << 2),   /* clear channel errors */
+	QS_CTR1_RDEV		= (1 << 1),   /* sata phy/comms reset */
+	QS_CTR1_RCHN		= (1 << 4),   /* reset channel logic */
+	QS_CCF_RUN_PKT		= 0x107,      /* RUN a new dma PKT */
+
+	/* pkt sub-field headers */
+	QS_HCB_HDR		= 0x01,   /* Host Control Block header */
+	QS_DCB_HDR		= 0x02,   /* Device Control Block header */
+
+	/* pkt HCB flag bits */
+	QS_HF_DIRO		= (1 << 0),   /* data DIRection Out */
+	QS_HF_DAT		= (1 << 3),   /* DATa pkt */
+	QS_HF_IEN		= (1 << 4),   /* Interrupt ENable */
+	QS_HF_VLD		= (1 << 5),   /* VaLiD pkt */
+
+	/* pkt DCB flag bits */
+	QS_DF_PORD		= (1 << 2),   /* Pio OR Dma */
+	QS_DF_ELBA		= (1 << 3),   /* Extended LBA (lba48) */
+
+	/* PCI device IDs */
+	board_2068_idx		= 0,	/* QStor 4-port SATA/RAID */
+};
+
+typedef enum { qs_state_idle, qs_state_pkt, qs_state_mmio } qs_state_t;
+
+struct qs_port_priv {
+	u8			*pkt;
+	dma_addr_t		pkt_dma;
+	qs_state_t		state;
+};
+
+static u32 qs_scr_read (struct ata_port *ap, unsigned int sc_reg);
+static void qs_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
+static int qs_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
+static irqreturn_t qs_intr (int irq, void *dev_instance, struct pt_regs *regs);
+static int qs_port_start(struct ata_port *ap);
+static void qs_host_stop(struct ata_host_set *host_set);
+static void qs_port_stop(struct ata_port *ap);
+static void qs_phy_reset(struct ata_port *ap);
+static void qs_qc_prep(struct ata_queued_cmd *qc);
+static int qs_qc_issue(struct ata_queued_cmd *qc);
+static int qs_check_atapi_dma(struct ata_queued_cmd *qc);
+static void qs_bmdma_stop(struct ata_port *ap);
+static u8 qs_bmdma_status(struct ata_port *ap);
+static void qs_irq_clear(struct ata_port *ap);
+
+static Scsi_Host_Template qs_ata_sht = {
+	.module			= THIS_MODULE,
+	.name			= DRV_NAME,
+	.ioctl			= ata_scsi_ioctl,
+	.queuecommand		= ata_scsi_queuecmd,
+	.eh_strategy_handler	= ata_scsi_error,
+	.can_queue		= ATA_DEF_QUEUE,
+	.this_id		= ATA_SHT_THIS_ID,
+	.sg_tablesize		= QS_MAX_PRD,
+	.max_sectors		= ATA_MAX_SECTORS,
+	.cmd_per_lun		= ATA_SHT_CMD_PER_LUN,
+	.emulated		= ATA_SHT_EMULATED,
+	//FIXME .use_clustering		= ATA_SHT_USE_CLUSTERING,
+	.use_clustering		= ENABLE_CLUSTERING,
+	.proc_name		= DRV_NAME,
+	.dma_boundary		= QS_DMA_BOUNDARY,
+	.slave_configure	= ata_scsi_slave_config,
+	.bios_param		= ata_std_bios_param,
+};
+
+static struct ata_port_operations qs_ata_ops = {
+	.port_disable		= ata_port_disable,
+	.tf_load		= ata_tf_load,
+	.tf_read		= ata_tf_read,
+	.check_status		= ata_check_status,
+	.check_atapi_dma	= qs_check_atapi_dma,
+	.exec_command		= ata_exec_command,
+	.dev_select		= ata_std_dev_select,
+	.phy_reset		= qs_phy_reset,
+	.qc_prep		= qs_qc_prep,
+	.qc_issue		= qs_qc_issue,
+	.eng_timeout		= ata_eng_timeout,
+	.irq_handler		= qs_intr,
+	.irq_clear		= qs_irq_clear,
+	.scr_read		= qs_scr_read,
+	.scr_write		= qs_scr_write,
+	.port_start		= qs_port_start,
+	.port_stop		= qs_port_stop,
+	.host_stop		= qs_host_stop,
+	.bmdma_stop		= qs_bmdma_stop,
+	.bmdma_status		= qs_bmdma_status,
+};
+
+static struct ata_port_info qs_port_info[] = {
+	/* board_2068_idx */
+	{
+		.sht		= &qs_ata_sht,
+		.host_flags	= ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
+				  ATA_FLAG_SATA_RESET |
+				  //FIXME ATA_FLAG_SRST |
+				  ATA_FLAG_MMIO,
+		.pio_mask	= 0x10, /* pio4 */
+		.udma_mask	= 0x7f, /* udma0-6 */
+		.port_ops	= &qs_ata_ops,
+	},
+};
+
+static struct pci_device_id qs_ata_pci_tbl[] = {
+	{ PCI_VENDOR_ID_PDC, 0x2068, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+	  board_2068_idx },
+
+	{ }	/* terminate list */
+};
+
+static struct pci_driver qs_ata_pci_driver = {
+	.name			= DRV_NAME,
+	.id_table		= qs_ata_pci_tbl,
+	.probe			= qs_ata_init_one,
+	.remove			= ata_pci_remove_one,
+};
+
+static int qs_check_atapi_dma(struct ata_queued_cmd *qc)
+{
+	return 1;	/* ATAPI DMA not supported */
+}
+
+static void qs_bmdma_stop(struct ata_port *ap)
+{
+	/* nothing */
+}
+
+static u8 qs_bmdma_status(struct ata_port *ap)
+{
+	return 0;
+}
+
+static void qs_irq_clear(struct ata_port *ap)
+{
+	/* nothing */
+}
+
+static void qs_enter_reg_mode(struct ata_port *ap)
+{
+	u8 __iomem *chan = ap->host_set->mmio_base + (ap->port_no * 0x4000);
+
+	writeb(QS_CTR0_REG, chan + QS_CCT_CTR0);
+	readb(chan + QS_CCT_CTR0);        /* flush */
+}
+
+static void qs_phy_reset(struct ata_port *ap)
+{
+	u8 __iomem *chan = ap->host_set->mmio_base + (ap->port_no * 0x4000);
+	struct qs_port_priv *pp = ap->private_data;
+
+	pp->state = qs_state_idle;
+	writeb(QS_CTR1_RCHN, chan + QS_CCT_CTR1);
+	qs_enter_reg_mode(ap);
+	sata_phy_reset(ap);
+}
+
+static u32 qs_scr_read (struct ata_port *ap, unsigned int sc_reg)
+{
+	if (sc_reg > SCR_CONTROL)
+		return ~0U;
+	return readl((void __iomem *)(ap->ioaddr.scr_addr + (sc_reg * 8)));
+}
+
+static void qs_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
+{
+	if (sc_reg > SCR_CONTROL)
+		return;
+	writel(val, (void __iomem *)(ap->ioaddr.scr_addr + (sc_reg * 8)));
+}
+
+static void qs_fill_sg(struct ata_queued_cmd *qc)
+{
+	struct scatterlist *sg = qc->sg;
+	struct ata_port *ap = qc->ap;
+	struct qs_port_priv *pp = ap->private_data;
+	unsigned int nelem;
+	u8 *prd = pp->pkt + QS_CPB_BYTES;
+
+	assert(sg != NULL);
+	assert(qc->n_elem > 0);
+
+	for (nelem = 0; nelem < qc->n_elem; nelem++,sg++) {
+		u64 addr;
+		u32 len;
+
+		addr = sg_dma_address(sg);
+		*(u64 *)prd = cpu_to_le64(addr);
+		prd += sizeof(u64);
+
+		len = sg_dma_len(sg);
+		*(u32 *)prd = cpu_to_le32(len);
+		prd += sizeof(u64);
+
+		VPRINTK("PRD[%u] = (0x%llX, 0x%X)\n", nelem,
+					(unsigned long long)addr, len);
+	}
+}
+
+static void qs_qc_prep(struct ata_queued_cmd *qc)
+{
+	struct qs_port_priv *pp = qc->ap->private_data;
+	u8 dflags = QS_DF_PORD, *buf = pp->pkt;
+	u8 hflags = QS_HF_DAT | QS_HF_IEN | QS_HF_VLD;
+	u64 addr;
+
+	VPRINTK("ENTER\n");
+
+	qs_enter_reg_mode(qc->ap);
+	if (qc->tf.protocol != ATA_PROT_DMA) {
+		ata_qc_prep(qc);
+		return;
+	}
+
+	qs_fill_sg(qc);
+
+	if ((qc->tf.flags & ATA_TFLAG_WRITE))
+		hflags |= QS_HF_DIRO;
+	if ((qc->tf.flags & ATA_TFLAG_LBA48))
+		dflags |= QS_DF_ELBA;
+
+	/* host control block (HCB) */
+	buf[ 0] = QS_HCB_HDR;
+	buf[ 1] = hflags;
+	*(u32 *)(&buf[ 4]) = cpu_to_le32(qc->nsect * ATA_SECT_SIZE);
+	*(u32 *)(&buf[ 8]) = cpu_to_le32(qc->n_elem);
+	addr = ((u64)pp->pkt_dma) + QS_CPB_BYTES;
+	*(u64 *)(&buf[16]) = cpu_to_le64(addr);
+
+	/* device control block (DCB) */
+	buf[24] = QS_DCB_HDR;
+	buf[28] = dflags;
+
+	/* frame information structure (FIS) */
+	ata_tf_to_fis(&qc->tf, &buf[32], 0);
+}
+
+static inline void qs_packet_start(struct ata_queued_cmd *qc)
+{
+	struct ata_port *ap = qc->ap;
+	u8 __iomem *chan = ap->host_set->mmio_base + (ap->port_no * 0x4000);
+
+	VPRINTK("ENTER, ap %p\n", ap);
+
+	writeb(QS_CTR0_CLER, chan + QS_CCT_CTR0);
+	wmb();                             /* flush PRDs and pkt to memory */
+	writel(QS_CCF_RUN_PKT, chan + QS_CCT_CFF);
+	readl(chan + QS_CCT_CFF);          /* flush */
+}
+
+static int qs_qc_issue(struct ata_queued_cmd *qc)
+{
+	struct qs_port_priv *pp = qc->ap->private_data;
+
+	switch (qc->tf.protocol) {
+	case ATA_PROT_DMA:
+
+		pp->state = qs_state_pkt;
+		qs_packet_start(qc);
+		return 0;
+
+	case ATA_PROT_ATAPI_DMA:
+		BUG();
+		break;
+
+	default:
+		break;
+	}
+
+	pp->state = qs_state_mmio;
+	return ata_qc_issue_prot(qc);
+}
+
+static inline unsigned int qs_intr_pkt(struct ata_host_set *host_set)
+{
+	unsigned int handled = 0;
+	u8 sFFE;
+	u8 __iomem *mmio_base = host_set->mmio_base;
+
+	do {
+		u32 sff0 = readl(mmio_base + QS_HST_SFF);
+		u32 sff1 = readl(mmio_base + QS_HST_SFF + 4);
+		u8 sEVLD = (sff1 >> 30) & 0x01;	/* valid flag */
+		sFFE  = sff1 >> 31;		/* empty flag */
+
+		if (sEVLD) {
+			u8 sDST = sff0 >> 16;	/* dev status */
+			u8 sHST = sff1 & 0x3f;	/* host status */
+			unsigned int port_no = (sff1 >> 8) & 0x03;
+			struct ata_port *ap = host_set->ports[port_no];
+
+			DPRINTK("SFF=%08x%08x: sCHAN=%u sHST=%d sDST=%02x\n",
+					sff1, sff0, port_no, sHST, sDST);
+			handled = 1;
+			if (ap && (!(ap->flags & ATA_FLAG_PORT_DISABLED))) {
+				struct ata_queued_cmd *qc;
+				struct qs_port_priv *pp = ap->private_data;
+				if (!pp || pp->state != qs_state_pkt)
+					continue;
+				qc = ata_qc_from_tag(ap, ap->active_tag);
+				if (qc && (!(qc->tf.ctl & ATA_NIEN))) {
+					switch (sHST) {
+					case 0: /* sucessful CPB */
+					case 3: /* device error */
+						pp->state = qs_state_idle;
+						qs_enter_reg_mode(qc->ap);
+						ata_qc_complete(qc, sDST);
+						break;
+					default:
+						break;
+					}
+				}
+			}
+		}
+	} while (!sFFE);
+	return handled;
+}
+
+static inline unsigned int qs_intr_mmio(struct ata_host_set *host_set)
+{
+	unsigned int handled = 0, port_no;
+
+	for (port_no = 0; port_no < host_set->n_ports; ++port_no) {
+		struct ata_port *ap;
+		ap = host_set->ports[port_no];
+		if (ap && (!(ap->flags & ATA_FLAG_PORT_DISABLED))) {
+			struct ata_queued_cmd *qc;
+			struct qs_port_priv *pp = ap->private_data;
+			if (!pp || pp->state != qs_state_mmio)
+				continue;
+			qc = ata_qc_from_tag(ap, ap->active_tag);
+			if (qc && (!(qc->tf.ctl & ATA_NIEN))) {
+
+				/* check main status, clearing INTRQ */
+				u8 status = ata_chk_status(ap);
+				if ((status & ATA_BUSY))
+					continue;
+				DPRINTK("ata%u: protocol %d (dev_stat 0x%X)\n",
+					ap->id, qc->tf.protocol, status);
+		
+				/* complete taskfile transaction */
+				pp->state = qs_state_idle;
+				ata_qc_complete(qc, status);
+				handled = 1;
+			}
+		}
+	}
+	return handled;
+}
+
+static irqreturn_t qs_intr(int irq, void *dev_instance, struct pt_regs *regs)
+{
+	struct ata_host_set *host_set = dev_instance;
+	unsigned int handled = 0;
+
+	VPRINTK("ENTER\n");
+
+	spin_lock(&host_set->lock);
+	handled  = qs_intr_pkt(host_set) | qs_intr_mmio(host_set);
+	spin_unlock(&host_set->lock);
+
+	VPRINTK("EXIT\n");
+
+	return IRQ_RETVAL(handled);
+}
+
+static void qs_ata_setup_port(struct ata_ioports *port, unsigned long base)
+{
+	port->cmd_addr		=
+	port->data_addr		= base + 0x400;
+	port->error_addr	=
+	port->feature_addr	= base + 0x408; /* hob_feature = 0x409 */
+	port->nsect_addr	= base + 0x410; /* hob_nsect   = 0x411 */
+	port->lbal_addr		= base + 0x418; /* hob_lbal    = 0x419 */
+	port->lbam_addr		= base + 0x420; /* hob_lbam    = 0x421 */
+	port->lbah_addr		= base + 0x428; /* hob_lbah    = 0x429 */
+	port->device_addr	= base + 0x430;
+	port->status_addr	=
+	port->command_addr	= base + 0x438;
+	port->altstatus_addr	=
+	port->ctl_addr		= base + 0x440;
+	port->scr_addr		= base + 0xc00;
+}
+
+static int qs_port_start(struct ata_port *ap)
+{
+	struct device *dev = ap->host_set->dev;
+	struct qs_port_priv *pp;
+	void __iomem *mmio_base = ap->host_set->mmio_base;
+	void __iomem *chan = mmio_base + (ap->port_no * 0x4000);
+	u64 addr;
+	int rc;
+
+	rc = ata_port_start(ap);
+	if (rc)
+		return rc;
+	qs_enter_reg_mode(ap);
+	pp = kcalloc(1, sizeof(*pp), GFP_KERNEL);
+	if (!pp) {
+		rc = -ENOMEM;
+		goto err_out;
+	}
+	pp->pkt = dma_alloc_coherent(dev, QS_PKT_BYTES, &pp->pkt_dma,
+								GFP_KERNEL);
+	if (!pp->pkt) {
+		rc = -ENOMEM;
+		goto err_out_kfree;
+	}
+	memset(pp->pkt, 0, QS_PKT_BYTES);
+	ap->private_data = pp;
+
+	addr = (u64)pp->pkt_dma;
+	writel((u32) addr,        chan + QS_CCF_CPBA);
+	writel((u32)(addr >> 32), chan + QS_CCF_CPBA + 4);
+	return 0;
+
+err_out_kfree:
+	kfree(pp);
+err_out:
+	ata_port_stop(ap);
+	return rc;
+}
+
+static void qs_port_stop(struct ata_port *ap)
+{
+	struct device *dev = ap->host_set->dev;
+	struct qs_port_priv *pp = ap->private_data;
+
+	if (pp != NULL) {
+		ap->private_data = NULL;
+		if (pp->pkt != NULL)
+			dma_free_coherent(dev, QS_PKT_BYTES, pp->pkt,
+								pp->pkt_dma);
+		kfree(pp);
+	}
+	ata_port_stop(ap);
+}
+
+static void qs_host_stop(struct ata_host_set *host_set)
+{
+	void __iomem *mmio_base = host_set->mmio_base;
+
+	writeb(0, mmio_base + QS_HCT_CTRL); /* disable host interrupts */
+	writeb(QS_CNFG3_GSRST, mmio_base + QS_HCF_CNFG3); /* global reset */
+}
+
+static void qs_host_init(unsigned int chip_id, struct ata_probe_ent *pe)
+{
+	void __iomem *mmio_base = pe->mmio_base;
+	unsigned int port_no;
+
+	writeb(0, mmio_base + QS_HCT_CTRL); /* disable host interrupts */
+	writeb(QS_CNFG3_GSRST, mmio_base + QS_HCF_CNFG3); /* global reset */
+
+	/* reset each channel in turn */
+	for (port_no = 0; port_no < pe->n_ports; ++port_no) {
+		u8 __iomem *chan = mmio_base + (port_no * 0x4000);
+		writeb(QS_CTR1_RDEV|QS_CTR1_RCHN, chan + QS_CCT_CTR1);
+		writeb(QS_CTR0_REG, chan + QS_CCT_CTR0);
+		readb(chan + QS_CCT_CTR0);        /* flush */
+	}
+	writeb(QS_SERD3_PHY_ENA, mmio_base + QS_HVS_SERD3); /* enable phy */
+
+	for (port_no = 0; port_no < pe->n_ports; ++port_no) {
+		u8 __iomem *chan = mmio_base + (port_no * 0x4000);
+		/* set FIFO depths to same settings as Windows driver */
+		writew(32, chan + QS_CFC_HUFT);
+		writew(32, chan + QS_CFC_HDFT);
+		writew(10, chan + QS_CFC_DUFT);
+		writew( 8, chan + QS_CFC_DDFT);
+		/* set CPB size in bytes, as a power of two */
+		writeb(QS_CPB_ORDER,    chan + QS_CCF_CSEP);
+	}
+	writeb(1, mmio_base + QS_HCT_CTRL); /* enable host interrupts */
+}
+
+/*
+ * The QStor understands 64-bit buses, and uses 64-bit fields
+ * for DMA pointers regardless of bus width.  We just have to
+ * make sure our DMA masks are set appropriately for whatever
+ * bridge lies between us and the QStor, and then the DMA mapping
+ * code will ensure we only ever "see" appropriate buffer addresses.
+ * If we're 32-bit limited somewhere, then our 64-bit fields will
+ * just end up with zeros in the upper 32-bits, without any special
+ * logic required outside of this routine (below).
+ */
+static int qs_set_dma_masks(struct pci_dev *pdev, void __iomem *mmio_base)
+{
+	u32 bus_info = readl(mmio_base + QS_HID_HPHY);
+	int rc, have_64bit_bus = (bus_info & QS_HPHY_64BIT);
+
+	if (have_64bit_bus &&
+	    !pci_set_dma_mask(pdev, 0xffffffffffffffffULL)) {
+		rc = pci_set_consistent_dma_mask(pdev, 0xffffffffffffffffULL);
+		if (rc) {
+			rc = pci_set_consistent_dma_mask(pdev, 0xffffffffULL);
+			if (rc) {
+				printk(KERN_ERR DRV_NAME
+					"(%s): 64-bit DMA enable failed\n",
+					pci_name(pdev));
+				return rc;
+			}
+		}
+	} else {
+		rc = pci_set_dma_mask(pdev, 0xffffffffULL);
+		if (rc) {
+			printk(KERN_ERR DRV_NAME
+				"(%s): 32-bit DMA enable failed\n",
+				pci_name(pdev));
+			return rc;
+		}
+		rc = pci_set_consistent_dma_mask(pdev, 0xffffffffULL);
+		if (rc) {
+			printk(KERN_ERR DRV_NAME
+				"(%s): 32-bit consistent DMA enable failed\n",
+				pci_name(pdev));
+			return rc;
+		}
+	}
+	return 0;
+}
+
+static int qs_ata_init_one(struct pci_dev *pdev,
+				const struct pci_device_id *ent)
+{
+	static int printed_version;
+	struct ata_probe_ent *probe_ent = NULL;
+	void __iomem *mmio_base;
+	unsigned int board_idx = (unsigned int) ent->driver_data;
+	int rc, port_no;
+
+	if (!printed_version++)
+		printk(KERN_DEBUG DRV_NAME " version " DRV_VERSION "\n");
+
+	rc = pci_enable_device(pdev);
+	if (rc)
+		return rc;
+
+	rc = pci_request_regions(pdev, DRV_NAME);
+	if (rc)
+		goto err_out;
+
+	if ((pci_resource_flags(pdev, 4) & IORESOURCE_MEM) == 0) {
+		rc = -ENODEV;
+		goto err_out_regions;
+	}
+
+	mmio_base = ioremap(pci_resource_start(pdev, 4),
+		            pci_resource_len(pdev, 4));
+	if (mmio_base == NULL) {
+		rc = -ENOMEM;
+		goto err_out_regions;
+	}
+
+	rc = qs_set_dma_masks(pdev, mmio_base);
+	if (rc)
+		goto err_out_iounmap;
+
+	probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
+	if (probe_ent == NULL) {
+		rc = -ENOMEM;
+		goto err_out_iounmap;
+	}
+
+	memset(probe_ent, 0, sizeof(*probe_ent));
+	probe_ent->dev = pci_dev_to_dev(pdev);
+	INIT_LIST_HEAD(&probe_ent->node);
+
+	probe_ent->sht		= qs_port_info[board_idx].sht;
+	probe_ent->host_flags	= qs_port_info[board_idx].host_flags;
+	probe_ent->pio_mask	= qs_port_info[board_idx].pio_mask;
+	probe_ent->mwdma_mask	= qs_port_info[board_idx].mwdma_mask;
+	probe_ent->udma_mask	= qs_port_info[board_idx].udma_mask;
+	probe_ent->port_ops	= qs_port_info[board_idx].port_ops;
+
+	probe_ent->irq		= pdev->irq;
+	probe_ent->irq_flags	= SA_SHIRQ;
+	probe_ent->mmio_base	= mmio_base;
+	probe_ent->n_ports	= QS_PORTS;
+
+	for (port_no = 0; port_no < probe_ent->n_ports; ++port_no) {
+		unsigned long chan = (unsigned long)mmio_base +
+							(port_no * 0x4000);
+		qs_ata_setup_port(&probe_ent->port[port_no], chan);
+	}
+
+	pci_set_master(pdev);
+
+	/* initialize adapter */
+	qs_host_init(board_idx, probe_ent);
+
+	rc = ata_device_add(probe_ent);
+	kfree(probe_ent);
+	if (rc != QS_PORTS)
+		goto err_out_iounmap;
+	return 0;
+
+err_out_iounmap:
+	iounmap(mmio_base);
+err_out_regions:
+	pci_release_regions(pdev);
+err_out:
+	pci_disable_device(pdev);
+	return rc;
+}
+
+static int __init qs_ata_init(void)
+{
+	return pci_module_init(&qs_ata_pci_driver);
+}
+
+static void __exit qs_ata_exit(void)
+{
+	pci_unregister_driver(&qs_ata_pci_driver);
+}
+
+MODULE_AUTHOR("Mark Lord");
+MODULE_DESCRIPTION("Pacific Digital Corporation QStor SATA low-level driver");
+MODULE_LICENSE("GPL");
+MODULE_DEVICE_TABLE(pci, qs_ata_pci_tbl);
+MODULE_VERSION(DRV_VERSION);
+
+module_init(qs_ata_init);
+module_exit(qs_ata_exit);
diff -Nru a/drivers/scsi/sata_sil.c b/drivers/scsi/sata_sil.c
--- a/drivers/scsi/sata_sil.c	2005-03-01 23:38:44 -08:00
+++ b/drivers/scsi/sata_sil.c	2005-03-01 23:38:44 -08:00
@@ -71,6 +71,8 @@
 	{ 0x1095, 0x0240, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 },
 	{ 0x1095, 0x3512, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 },
 	{ 0x1095, 0x3114, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3114 },
+	{ 0x1002, 0x436e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 },
+	{ 0x1002, 0x4379, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 },
 	{ }	/* terminate list */
 };
 
@@ -84,10 +86,12 @@
 	{ "ST330013AS",		SIL_QUIRK_MOD15WRITE },
 	{ "ST340017AS",		SIL_QUIRK_MOD15WRITE },
 	{ "ST360015AS",		SIL_QUIRK_MOD15WRITE },
+	{ "ST380013AS",		SIL_QUIRK_MOD15WRITE },
 	{ "ST380023AS",		SIL_QUIRK_MOD15WRITE },
 	{ "ST3120023AS",	SIL_QUIRK_MOD15WRITE },
 	{ "ST3160023AS",	SIL_QUIRK_MOD15WRITE },
 	{ "ST3120026AS",	SIL_QUIRK_MOD15WRITE },
+	{ "ST3200822AS",	SIL_QUIRK_MOD15WRITE },
 	{ "ST340014ASL",	SIL_QUIRK_MOD15WRITE },
 	{ "ST360014ASL",	SIL_QUIRK_MOD15WRITE },
 	{ "ST380011ASL",	SIL_QUIRK_MOD15WRITE },
@@ -135,6 +139,8 @@
 	.post_set_mode		= sil_post_set_mode,
 	.bmdma_setup            = ata_bmdma_setup,
 	.bmdma_start            = ata_bmdma_start,
+	.bmdma_stop		= ata_bmdma_stop,
+	.bmdma_status		= ata_bmdma_status,
 	.qc_prep		= ata_qc_prep,
 	.qc_issue		= ata_qc_issue_prot,
 	.eng_timeout		= ata_eng_timeout,
@@ -332,6 +338,7 @@
 	void *mmio_base;
 	int rc;
 	unsigned int i;
+	int pci_dev_busy = 0;
 	u32 tmp, irq_mask;
 
 	if (!printed_version++)
@@ -346,8 +353,10 @@
 		return rc;
 
 	rc = pci_request_regions(pdev, DRV_NAME);
-	if (rc)
+	if (rc) {
+		pci_dev_busy = 1;
 		goto err_out;
+	}
 
 	rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
 	if (rc)
@@ -434,7 +443,8 @@
 err_out_regions:
 	pci_release_regions(pdev);
 err_out:
-	pci_disable_device(pdev);
+	if (!pci_dev_busy)
+		pci_disable_device(pdev);
 	return rc;
 }
 
diff -Nru a/drivers/scsi/sata_sis.c b/drivers/scsi/sata_sis.c
--- a/drivers/scsi/sata_sis.c	2005-03-01 23:38:57 -08:00
+++ b/drivers/scsi/sata_sis.c	2005-03-01 23:38:57 -08:00
@@ -102,6 +102,8 @@
 	.phy_reset		= sata_phy_reset,
 	.bmdma_setup            = ata_bmdma_setup,
 	.bmdma_start            = ata_bmdma_start,
+	.bmdma_stop		= ata_bmdma_stop,
+	.bmdma_status		= ata_bmdma_status,
 	.qc_prep		= ata_qc_prep,
 	.qc_issue		= ata_qc_issue_prot,
 	.eng_timeout		= ata_eng_timeout,
@@ -200,14 +202,17 @@
 	int rc;
 	u32 genctl;
 	struct ata_port_info *ppi;
+	int pci_dev_busy = 0;
 
 	rc = pci_enable_device(pdev);
 	if (rc)
 		return rc;
 
 	rc = pci_request_regions(pdev, DRV_NAME);
-	if (rc)
+	if (rc) {
+		pci_dev_busy = 1;
 		goto err_out;
+	}
 
 	rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
 	if (rc)
@@ -259,7 +264,8 @@
 	pci_release_regions(pdev);
 
 err_out:
-	pci_disable_device(pdev);
+	if (!pci_dev_busy)
+		pci_disable_device(pdev);
 	return rc;
 
 }
diff -Nru a/drivers/scsi/sata_svw.c b/drivers/scsi/sata_svw.c
--- a/drivers/scsi/sata_svw.c	2005-03-01 23:38:59 -08:00
+++ b/drivers/scsi/sata_svw.c	2005-03-01 23:38:59 -08:00
@@ -301,6 +301,8 @@
 	.phy_reset		= sata_phy_reset,
 	.bmdma_setup		= k2_bmdma_setup_mmio,
 	.bmdma_start		= k2_bmdma_start_mmio,
+	.bmdma_stop		= ata_bmdma_stop,
+	.bmdma_status		= ata_bmdma_status,
 	.qc_prep		= ata_qc_prep,
 	.qc_issue		= ata_qc_issue_prot,
 	.eng_timeout		= ata_eng_timeout,
@@ -338,6 +340,7 @@
 	struct ata_probe_ent *probe_ent = NULL;
 	unsigned long base;
 	void *mmio_base;
+	int pci_dev_busy = 0;
 	int rc;
 
 	if (!printed_version++)
@@ -359,8 +362,10 @@
 
 	/* Request PCI regions */
 	rc = pci_request_regions(pdev, DRV_NAME);
-	if (rc)
+	if (rc) {
+		pci_dev_busy = 1;
 		goto err_out;
+	}
 
 	rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
 	if (rc)
@@ -433,7 +438,8 @@
 err_out_regions:
 	pci_release_regions(pdev);
 err_out:
-	pci_disable_device(pdev);
+	if (!pci_dev_busy)
+		pci_disable_device(pdev);
 	return rc;
 }
 
diff -Nru a/drivers/scsi/sata_sx4.c b/drivers/scsi/sata_sx4.c
--- a/drivers/scsi/sata_sx4.c	2005-03-01 23:38:44 -08:00
+++ b/drivers/scsi/sata_sx4.c	2005-03-01 23:38:44 -08:00
@@ -1366,6 +1366,7 @@
 	void *mmio_base, *dimm_mmio = NULL;
 	struct pdc_host_priv *hpriv = NULL;
 	unsigned int board_idx = (unsigned int) ent->driver_data;
+	int pci_dev_busy = 0;
 	int rc;
 
 	if (!printed_version++)
@@ -1380,8 +1381,10 @@
 		return rc;
 
 	rc = pci_request_regions(pdev, DRV_NAME);
-	if (rc)
+	if (rc) {
+		pci_dev_busy = 1;
 		goto err_out;
+	}
 
 	rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
 	if (rc)
@@ -1471,7 +1474,8 @@
 err_out_regions:
 	pci_release_regions(pdev);
 err_out:
-	pci_disable_device(pdev);
+	if (!pci_dev_busy)
+		pci_disable_device(pdev);
 	return rc;
 }
 
diff -Nru a/drivers/scsi/sata_uli.c b/drivers/scsi/sata_uli.c
--- a/drivers/scsi/sata_uli.c	2005-03-01 23:39:09 -08:00
+++ b/drivers/scsi/sata_uli.c	2005-03-01 23:39:09 -08:00
@@ -32,16 +32,18 @@
 #include <linux/libata.h>
 
 #define DRV_NAME	"sata_uli"
-#define DRV_VERSION	"0.2"
+#define DRV_VERSION	"0.5"
 
 enum {
 	uli_5289		= 0,
 	uli_5287		= 1,
+	uli_5281		= 2,
 
 	/* PCI configuration registers */
-	ULI_SCR_BASE		= 0x90, /* sata0 phy SCR registers */
-	ULI_SATA1_OFS		= 0x10, /* offset from sata0->sata1 phy regs */
-
+	ULI5287_BASE		= 0x90, /* sata0 phy SCR registers */
+	ULI5287_OFFS		= 0x10, /* offset from sata0->sata1 phy regs */
+	ULI5281_BASE		= 0x60, /* sata0 phy SCR  registers */
+	ULI5281_OFFS		= 0x60, /* offset from sata0->sata1 phy regs */
 };
 
 static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
@@ -51,6 +53,7 @@
 static struct pci_device_id uli_pci_tbl[] = {
 	{ PCI_VENDOR_ID_AL, 0x5289, PCI_ANY_ID, PCI_ANY_ID, 0, 0, uli_5289 },
 	{ PCI_VENDOR_ID_AL, 0x5287, PCI_ANY_ID, PCI_ANY_ID, 0, 0, uli_5287 },
+	{ PCI_VENDOR_ID_AL, 0x5281, PCI_ANY_ID, PCI_ANY_ID, 0, 0, uli_5281 },
 	{ }	/* terminate list */
 };
 
@@ -94,6 +97,8 @@
 
 	.bmdma_setup            = ata_bmdma_setup,
 	.bmdma_start            = ata_bmdma_start,
+	.bmdma_stop		= ata_bmdma_stop,
+	.bmdma_status		= ata_bmdma_status,
 	.qc_prep		= ata_qc_prep,
 	.qc_issue		= ata_qc_issue_prot,
 
@@ -125,33 +130,15 @@
 MODULE_DEVICE_TABLE(pci, uli_pci_tbl);
 MODULE_VERSION(DRV_VERSION);
 
-static unsigned int get_scr_cfg_addr(unsigned int port_no, unsigned int sc_reg)
+static unsigned int get_scr_cfg_addr(struct ata_port *ap, unsigned int sc_reg)
 {
-	unsigned int addr = ULI_SCR_BASE + (4 * sc_reg);
-
-	switch (port_no) {
-	case 0:
-		break;
-	case 1:
-		addr += ULI_SATA1_OFS;
-		break;
-	case 2:
-		addr += ULI_SATA1_OFS*4;
-		break;
-	case 3:
-		addr += ULI_SATA1_OFS*5;
-		break;
-	default:
-		BUG();
-		break;
-	}
-	return addr;
+	return ap->ioaddr.scr_addr + (4 * sc_reg);
 }
 
 static u32 uli_scr_cfg_read (struct ata_port *ap, unsigned int sc_reg)
 {
 	struct pci_dev *pdev = to_pci_dev(ap->host_set->dev);
-	unsigned int cfg_addr = get_scr_cfg_addr(ap->port_no, sc_reg);
+	unsigned int cfg_addr = get_scr_cfg_addr(ap, sc_reg);
 	u32 val;
 
 	pci_read_config_dword(pdev, cfg_addr, &val);
@@ -161,7 +148,7 @@
 static void uli_scr_cfg_write (struct ata_port *ap, unsigned int scr, u32 val)
 {
 	struct pci_dev *pdev = to_pci_dev(ap->host_set->dev);
-	unsigned int cfg_addr = get_scr_cfg_addr(ap->port_no, scr);
+	unsigned int cfg_addr = get_scr_cfg_addr(ap, scr);
 
 	pci_write_config_dword(pdev, cfg_addr, val);
 }
@@ -200,14 +187,17 @@
 	struct ata_port_info *ppi;
 	int rc;
 	unsigned int board_idx = (unsigned int) ent->driver_data;
+	int pci_dev_busy = 0;
 
 	rc = pci_enable_device(pdev);
 	if (rc)
 		return rc;
 
 	rc = pci_request_regions(pdev, DRV_NAME);
-	if (rc)
+	if (rc) {
+		pci_dev_busy = 1;
 		goto err_out;
+	}
 
 	rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
 	if (rc)
@@ -222,9 +212,11 @@
 		rc = -ENOMEM;
 		goto err_out_regions;
 	}
-
+	
 	switch (board_idx) {
 	case uli_5287:
+		probe_ent->port[0].scr_addr = ULI5287_BASE;
+		probe_ent->port[1].scr_addr = ULI5287_BASE + ULI5287_OFFS;
        		probe_ent->n_ports = 4;
 
        		probe_ent->port[2].cmd_addr = pci_resource_start(pdev, 0) + 8;
@@ -232,19 +224,27 @@
 		probe_ent->port[2].ctl_addr =
 			(pci_resource_start(pdev, 1) | ATA_PCI_CTL_OFS) + 4;
 		probe_ent->port[2].bmdma_addr = pci_resource_start(pdev, 4) + 16;
+		probe_ent->port[2].scr_addr = ULI5287_BASE + ULI5287_OFFS*4;
 
 		probe_ent->port[3].cmd_addr = pci_resource_start(pdev, 2) + 8;
 		probe_ent->port[3].altstatus_addr =
 		probe_ent->port[3].ctl_addr =
 			(pci_resource_start(pdev, 3) | ATA_PCI_CTL_OFS) + 4;
 		probe_ent->port[3].bmdma_addr = pci_resource_start(pdev, 4) + 24;
+		probe_ent->port[3].scr_addr = ULI5287_BASE + ULI5287_OFFS*5;
 
 		ata_std_ports(&probe_ent->port[2]);
 		ata_std_ports(&probe_ent->port[3]);
 		break;
 
 	case uli_5289:
-		/* do nothing; ata_pci_init_native_mode did it all */
+		probe_ent->port[0].scr_addr = ULI5287_BASE;
+		probe_ent->port[1].scr_addr = ULI5287_BASE + ULI5287_OFFS;
+		break;
+
+	case uli_5281:
+		probe_ent->port[0].scr_addr = ULI5281_BASE;
+		probe_ent->port[1].scr_addr = ULI5281_BASE + ULI5281_OFFS;
 		break;
 
 	default:
@@ -265,7 +265,8 @@
 	pci_release_regions(pdev);
 
 err_out:
-	pci_disable_device(pdev);
+	if (!pci_dev_busy)
+		pci_disable_device(pdev);
 	return rc;
 
 }
diff -Nru a/drivers/scsi/sata_via.c b/drivers/scsi/sata_via.c
--- a/drivers/scsi/sata_via.c	2005-03-01 23:38:53 -08:00
+++ b/drivers/scsi/sata_via.c	2005-03-01 23:38:53 -08:00
@@ -24,6 +24,11 @@
    If you do not delete the provisions above, a recipient may use your
    version of this file under either the OSL or the GPL.
 
+   ----------------------------------------------------------------------
+
+   To-do list:
+   * VT6421 PATA support
+
  */
 
 #include <linux/kernel.h>
@@ -38,11 +43,14 @@
 #include <asm/io.h>
 
 #define DRV_NAME	"sata_via"
-#define DRV_VERSION	"1.0"
+#define DRV_VERSION	"1.1"
 
-enum {
-	via_sata		= 0,
+enum board_ids_enum {
+	vt6420,
+	vt6421,
+};
 
+enum {
 	SATA_CHAN_ENAB		= 0x40, /* SATA channel enable */
 	SATA_INT_GATE		= 0x41, /* SATA interrupt gating */
 	SATA_NATIVE_MODE	= 0x42, /* Native mode enable */
@@ -50,10 +58,8 @@
 
 	PORT0			= (1 << 1),
 	PORT1			= (1 << 0),
-
-	ENAB_ALL		= PORT0 | PORT1,
-
-	INT_GATE_ALL		= PORT0 | PORT1,
+	ALL_PORTS		= PORT0 | PORT1,
+	N_PORTS			= 2,
 
 	NATIVE_MODE_ALL		= (1 << 7) | (1 << 6) | (1 << 5) | (1 << 4),
 
@@ -66,7 +72,8 @@
 static void svia_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
 
 static struct pci_device_id svia_pci_tbl[] = {
-	{ 0x1106, 0x3149, PCI_ANY_ID, PCI_ANY_ID, 0, 0, via_sata },
+	{ 0x1106, 0x3149, PCI_ANY_ID, PCI_ANY_ID, 0, 0, vt6420 },
+	{ 0x1106, 0x3249, PCI_ANY_ID, PCI_ANY_ID, 0, 0, vt6421 },
 
 	{ }	/* terminate list */
 };
@@ -110,6 +117,9 @@
 
 	.bmdma_setup            = ata_bmdma_setup,
 	.bmdma_start            = ata_bmdma_start,
+	.bmdma_stop		= ata_bmdma_stop,
+	.bmdma_status		= ata_bmdma_status,
+
 	.qc_prep		= ata_qc_prep,
 	.qc_issue		= ata_qc_issue_prot,
 
@@ -158,18 +168,132 @@
 	8, 4, 8, 4, 16, 256
 };
 
+static const unsigned int vt6421_bar_sizes[] = {
+	16, 16, 16, 16, 32, 128
+};
+
 static unsigned long svia_scr_addr(unsigned long addr, unsigned int port)
 {
 	return addr + (port * 128);
 }
 
+static unsigned long vt6421_scr_addr(unsigned long addr, unsigned int port)
+{
+	return addr + (port * 64);
+}
+
+static void vt6421_init_addrs(struct ata_probe_ent *probe_ent,
+			      struct pci_dev *pdev,
+			      unsigned int port)
+{
+	unsigned long reg_addr = pci_resource_start(pdev, port);
+	unsigned long bmdma_addr = pci_resource_start(pdev, 4) + (port * 8);
+	unsigned long scr_addr;
+
+	probe_ent->port[port].cmd_addr = reg_addr;
+	probe_ent->port[port].altstatus_addr =
+	probe_ent->port[port].ctl_addr = (reg_addr + 8) | ATA_PCI_CTL_OFS;
+	probe_ent->port[port].bmdma_addr = bmdma_addr;
+
+	scr_addr = vt6421_scr_addr(pci_resource_start(pdev, 5), port);
+	probe_ent->port[port].scr_addr = scr_addr;
+
+	ata_std_ports(&probe_ent->port[port]);
+}
+
+static struct ata_probe_ent *vt6420_init_probe_ent(struct pci_dev *pdev)
+{
+	struct ata_probe_ent *probe_ent;
+	struct ata_port_info *ppi = &svia_port_info;
+
+	probe_ent = ata_pci_init_native_mode(pdev, &ppi);
+	if (!probe_ent)
+		return NULL;
+
+	probe_ent->port[0].scr_addr =
+		svia_scr_addr(pci_resource_start(pdev, 5), 0);
+	probe_ent->port[1].scr_addr =
+		svia_scr_addr(pci_resource_start(pdev, 5), 1);
+
+	return probe_ent;
+}
+
+static struct ata_probe_ent *vt6421_init_probe_ent(struct pci_dev *pdev)
+{
+	struct ata_probe_ent *probe_ent;
+	unsigned int i;
+
+	probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
+	if (!probe_ent)
+		return NULL;
+
+	memset(probe_ent, 0, sizeof(*probe_ent));
+	probe_ent->dev = pci_dev_to_dev(pdev);
+	INIT_LIST_HEAD(&probe_ent->node);
+
+	probe_ent->sht		= &svia_sht;
+	probe_ent->host_flags	= ATA_FLAG_SATA | ATA_FLAG_SATA_RESET |
+				  ATA_FLAG_NO_LEGACY;
+	probe_ent->port_ops	= &svia_sata_ops;
+	probe_ent->n_ports	= N_PORTS;
+	probe_ent->irq		= pdev->irq;
+	probe_ent->irq_flags	= SA_SHIRQ;
+	probe_ent->pio_mask	= 0x1f;
+	probe_ent->mwdma_mask	= 0x07;
+	probe_ent->udma_mask	= 0x7f;
+
+	for (i = 0; i < N_PORTS; i++)
+		vt6421_init_addrs(probe_ent, pdev, i);
+
+	return probe_ent;
+}
+
+static void svia_configure(struct pci_dev *pdev)
+{
+	u8 tmp8;
+
+	pci_read_config_byte(pdev, PCI_INTERRUPT_LINE, &tmp8);
+	printk(KERN_INFO DRV_NAME "(%s): routed to hard irq line %d\n",
+	       pci_name(pdev),
+	       (int) (tmp8 & 0xf0) == 0xf0 ? 0 : tmp8 & 0x0f);
+
+	/* make sure SATA channels are enabled */
+	pci_read_config_byte(pdev, SATA_CHAN_ENAB, &tmp8);
+	if ((tmp8 & ALL_PORTS) != ALL_PORTS) {
+		printk(KERN_DEBUG DRV_NAME "(%s): enabling SATA channels (0x%x)\n",
+		       pci_name(pdev), (int) tmp8);
+		tmp8 |= ALL_PORTS;
+		pci_write_config_byte(pdev, SATA_CHAN_ENAB, tmp8);
+	}
+
+	/* make sure interrupts for each channel sent to us */
+	pci_read_config_byte(pdev, SATA_INT_GATE, &tmp8);
+	if ((tmp8 & ALL_PORTS) != ALL_PORTS) {
+		printk(KERN_DEBUG DRV_NAME "(%s): enabling SATA channel interrupts (0x%x)\n",
+		       pci_name(pdev), (int) tmp8);
+		tmp8 |= ALL_PORTS;
+		pci_write_config_byte(pdev, SATA_INT_GATE, tmp8);
+	}
+
+	/* make sure native mode is enabled */
+	pci_read_config_byte(pdev, SATA_NATIVE_MODE, &tmp8);
+	if ((tmp8 & NATIVE_MODE_ALL) != NATIVE_MODE_ALL) {
+		printk(KERN_DEBUG DRV_NAME "(%s): enabling SATA channel native mode (0x%x)\n",
+		       pci_name(pdev), (int) tmp8);
+		tmp8 |= NATIVE_MODE_ALL;
+		pci_write_config_byte(pdev, SATA_NATIVE_MODE, tmp8);
+	}
+}
+
 static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 {
 	static int printed_version;
 	unsigned int i;
 	int rc;
-	struct ata_port_info *ppi;
 	struct ata_probe_ent *probe_ent;
+	int board_id = (int) ent->driver_data;
+	const int *bar_sizes;
+	int pci_dev_busy = 0;
 	u8 tmp8;
 
 	if (!printed_version++)
@@ -180,20 +304,28 @@
 		return rc;
 
 	rc = pci_request_regions(pdev, DRV_NAME);
-	if (rc)
+	if (rc) {
+		pci_dev_busy = 1;
 		goto err_out;
+	}
 
-	pci_read_config_byte(pdev, SATA_PATA_SHARING, &tmp8);
-	if (tmp8 & SATA_2DEV) {
-		printk(KERN_ERR DRV_NAME "(%s): SATA master/slave not supported (0x%x)\n",
-		       pci_name(pdev), (int) tmp8);
-		rc = -EIO;
-		goto err_out_regions;
+	if (board_id == vt6420) {
+		pci_read_config_byte(pdev, SATA_PATA_SHARING, &tmp8);
+		if (tmp8 & SATA_2DEV) {
+			printk(KERN_ERR DRV_NAME "(%s): SATA master/slave not supported (0x%x)\n",
+		       	pci_name(pdev), (int) tmp8);
+			rc = -EIO;
+			goto err_out_regions;
+		}
+
+		bar_sizes = &svia_bar_sizes[0];
+	} else {
+		bar_sizes = &vt6421_bar_sizes[0];
 	}
 
 	for (i = 0; i < ARRAY_SIZE(svia_bar_sizes); i++)
 		if ((pci_resource_start(pdev, i) == 0) ||
-		    (pci_resource_len(pdev, i) < svia_bar_sizes[i])) {
+		    (pci_resource_len(pdev, i) < bar_sizes[i])) {
 			printk(KERN_ERR DRV_NAME "(%s): invalid PCI BAR %u (sz 0x%lx, val 0x%lx)\n",
 			       pci_name(pdev), i,
 			       pci_resource_start(pdev, i),
@@ -209,8 +341,11 @@
 	if (rc)
 		goto err_out_regions;
 
-	ppi = &svia_port_info;
-	probe_ent = ata_pci_init_native_mode(pdev, &ppi);
+	if (board_id == vt6420)
+		probe_ent = vt6420_init_probe_ent(pdev);
+	else
+		probe_ent = vt6421_init_probe_ent(pdev);
+	
 	if (!probe_ent) {
 		printk(KERN_ERR DRV_NAME "(%s): out of memory\n",
 		       pci_name(pdev));
@@ -218,42 +353,7 @@
 		goto err_out_regions;
 	}
 
-	probe_ent->port[0].scr_addr =
-		svia_scr_addr(pci_resource_start(pdev, 5), 0);
-	probe_ent->port[1].scr_addr =
-		svia_scr_addr(pci_resource_start(pdev, 5), 1);
-
-	pci_read_config_byte(pdev, PCI_INTERRUPT_LINE, &tmp8);
-	printk(KERN_INFO DRV_NAME "(%s): routed to hard irq line %d\n",
-	       pci_name(pdev),
-	       (int) (tmp8 & 0xf0) == 0xf0 ? 0 : tmp8 & 0x0f);
-
-	/* make sure SATA channels are enabled */
-	pci_read_config_byte(pdev, SATA_CHAN_ENAB, &tmp8);
-	if ((tmp8 & ENAB_ALL) != ENAB_ALL) {
-		printk(KERN_DEBUG DRV_NAME "(%s): enabling SATA channels (0x%x)\n",
-		       pci_name(pdev), (int) tmp8);
-		tmp8 |= ENAB_ALL;
-		pci_write_config_byte(pdev, SATA_CHAN_ENAB, tmp8);
-	}
-
-	/* make sure interrupts for each channel sent to us */
-	pci_read_config_byte(pdev, SATA_INT_GATE, &tmp8);
-	if ((tmp8 & INT_GATE_ALL) != INT_GATE_ALL) {
-		printk(KERN_DEBUG DRV_NAME "(%s): enabling SATA channel interrupts (0x%x)\n",
-		       pci_name(pdev), (int) tmp8);
-		tmp8 |= INT_GATE_ALL;
-		pci_write_config_byte(pdev, SATA_INT_GATE, tmp8);
-	}
-
-	/* make sure native mode is enabled */
-	pci_read_config_byte(pdev, SATA_NATIVE_MODE, &tmp8);
-	if ((tmp8 & NATIVE_MODE_ALL) != NATIVE_MODE_ALL) {
-		printk(KERN_DEBUG DRV_NAME "(%s): enabling SATA channel native mode (0x%x)\n",
-		       pci_name(pdev), (int) tmp8);
-		tmp8 |= NATIVE_MODE_ALL;
-		pci_write_config_byte(pdev, SATA_NATIVE_MODE, tmp8);
-	}
+	svia_configure(pdev);
 
 	pci_set_master(pdev);
 
@@ -266,7 +366,8 @@
 err_out_regions:
 	pci_release_regions(pdev);
 err_out:
-	pci_disable_device(pdev);
+	if (!pci_dev_busy)
+		pci_disable_device(pdev);
 	return rc;
 }
 
diff -Nru a/drivers/scsi/sata_vsc.c b/drivers/scsi/sata_vsc.c
--- a/drivers/scsi/sata_vsc.c	2005-03-01 23:38:58 -08:00
+++ b/drivers/scsi/sata_vsc.c	2005-03-01 23:38:58 -08:00
@@ -217,6 +217,8 @@
 	.phy_reset		= sata_phy_reset,
 	.bmdma_setup            = ata_bmdma_setup,
 	.bmdma_start            = ata_bmdma_start,
+	.bmdma_stop		= ata_bmdma_stop,
+	.bmdma_status		= ata_bmdma_status,
 	.qc_prep		= ata_qc_prep,
 	.qc_issue		= ata_qc_issue_prot,
 	.eng_timeout		= ata_eng_timeout,
@@ -255,6 +257,7 @@
 	static int printed_version;
 	struct ata_probe_ent *probe_ent = NULL;
 	unsigned long base;
+	int pci_dev_busy = 0;
 	void *mmio_base;
 	int rc;
 
@@ -274,8 +277,10 @@
 	}
 
 	rc = pci_request_regions(pdev, DRV_NAME);
-	if (rc)
+	if (rc) {
+		pci_dev_busy = 1;
 		goto err_out;
+	}
 
 	/*
 	 * Use 32 bit DMA mask, because 64 bit address support is poor.
@@ -352,7 +357,8 @@
 err_out_regions:
 	pci_release_regions(pdev);
 err_out:
-	pci_disable_device(pdev);
+	if (!pci_dev_busy)
+		pci_disable_device(pdev);
 	return rc;
 }
 
diff -Nru a/include/linux/ata.h b/include/linux/ata.h
--- a/include/linux/ata.h	2005-03-01 23:38:59 -08:00
+++ b/include/linux/ata.h	2005-03-01 23:38:59 -08:00
@@ -123,6 +123,8 @@
 	ATA_CMD_PIO_WRITE_EXT	= 0x34,
 	ATA_CMD_SET_FEATURES	= 0xEF,
 	ATA_CMD_PACKET		= 0xA0,
+	ATA_CMD_VERIFY		= 0x40,
+	ATA_CMD_VERIFY_EXT	= 0x42,
 
 	/* SETFEATURES stuff */
 	SETFEATURES_XFER	= 0x03,
diff -Nru a/include/linux/libata.h b/include/linux/libata.h
--- a/include/linux/libata.h	2005-03-01 23:38:51 -08:00
+++ b/include/linux/libata.h	2005-03-01 23:38:51 -08:00
@@ -334,11 +334,15 @@
 
 	void (*exec_command)(struct ata_port *ap, struct ata_taskfile *tf);
 	u8   (*check_status)(struct ata_port *ap);
+	u8   (*check_altstatus)(struct ata_port *ap);
+	u8   (*check_err)(struct ata_port *ap);
 	void (*dev_select)(struct ata_port *ap, unsigned int device);
 
 	void (*phy_reset) (struct ata_port *ap);
 	void (*post_set_mode) (struct ata_port *ap);
 
+	int (*check_atapi_dma) (struct ata_queued_cmd *qc);
+
 	void (*bmdma_setup) (struct ata_queued_cmd *qc);
 	void (*bmdma_start) (struct ata_queued_cmd *qc);
 
@@ -358,6 +362,9 @@
 	void (*port_stop) (struct ata_port *ap);
 
 	void (*host_stop) (struct ata_host_set *host_set);
+
+	void (*bmdma_stop) (struct ata_port *ap);
+	u8   (*bmdma_status) (struct ata_port *ap);
 };
 
 struct ata_port_info {
@@ -398,6 +405,8 @@
 extern void ata_noop_dev_select (struct ata_port *ap, unsigned int device);
 extern void ata_std_dev_select (struct ata_port *ap, unsigned int device);
 extern u8 ata_check_status(struct ata_port *ap);
+extern u8 ata_altstatus(struct ata_port *ap);
+extern u8 ata_chk_err(struct ata_port *ap);
 extern void ata_exec_command(struct ata_port *ap, struct ata_taskfile *tf);
 extern int ata_port_start (struct ata_port *ap);
 extern void ata_port_stop (struct ata_port *ap);
@@ -413,6 +422,8 @@
 			      unsigned int ofs, unsigned int len);
 extern void ata_bmdma_setup (struct ata_queued_cmd *qc);
 extern void ata_bmdma_start (struct ata_queued_cmd *qc);
+extern void ata_bmdma_stop(struct ata_port *ap);
+extern u8   ata_bmdma_status(struct ata_port *ap);
 extern void ata_bmdma_irq_clear(struct ata_port *ap);
 extern void ata_qc_complete(struct ata_queued_cmd *qc, u8 drv_stat);
 extern void ata_eng_timeout(struct ata_port *ap);
@@ -434,8 +445,6 @@
 
 extern struct ata_probe_ent *
 ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port);
-extern struct ata_probe_ent *
-ata_pci_init_legacy_mode(struct pci_dev *pdev, struct ata_port_info **port);
 extern int pci_test_config_bits(struct pci_dev *pdev, struct pci_bits *bits);
 
 #endif /* CONFIG_PCI */
@@ -452,26 +461,11 @@
 		(dev->class == ATA_DEV_ATAPI));
 }
 
-static inline u8 ata_chk_err(struct ata_port *ap)
-{
-	if (ap->flags & ATA_FLAG_MMIO) {
-		return readb((void __iomem *) ap->ioaddr.error_addr);
-	}
-	return inb(ap->ioaddr.error_addr);
-}
-
 static inline u8 ata_chk_status(struct ata_port *ap)
 {
 	return ap->ops->check_status(ap);
 }
 
-static inline u8 ata_altstatus(struct ata_port *ap)
-{
-	if (ap->flags & ATA_FLAG_MMIO)
-		return readb((void __iomem *)ap->ioaddr.altstatus_addr);
-	return inb(ap->ioaddr.altstatus_addr);
-}
-
 static inline void ata_pause(struct ata_port *ap)
 {
 	ata_altstatus(ap);
@@ -593,46 +587,6 @@
 static inline unsigned int sata_dev_present(struct ata_port *ap)
 {
 	return ((scr_read(ap, SCR_STATUS) & 0xf) == 0x3) ? 1 : 0;
-}
-
-static inline void ata_bmdma_stop(struct ata_port *ap)
-{
-	if (ap->flags & ATA_FLAG_MMIO) {
-		void __iomem *mmio = (void __iomem *) ap->ioaddr.bmdma_addr;
-
-		/* clear start/stop bit */
-		writeb(readb(mmio + ATA_DMA_CMD) & ~ATA_DMA_START,
-		      mmio + ATA_DMA_CMD);
-	} else {
-		/* clear start/stop bit */
-		outb(inb(ap->ioaddr.bmdma_addr + ATA_DMA_CMD) & ~ATA_DMA_START,
-		    ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
-	}
-
-	/* one-PIO-cycle guaranteed wait, per spec, for HDMA1:0 transition */
-	ata_altstatus(ap);	      /* dummy read */
-}
-
-static inline void ata_bmdma_ack_irq(struct ata_port *ap)
-{
-	if (ap->flags & ATA_FLAG_MMIO) {
-		void __iomem *mmio = ((void __iomem *) ap->ioaddr.bmdma_addr) + ATA_DMA_STATUS;
-		writeb(readb(mmio), mmio);
-	} else {
-		unsigned long addr = ap->ioaddr.bmdma_addr + ATA_DMA_STATUS;
-		outb(inb(addr), addr);
-	}
-}
-
-static inline u8 ata_bmdma_status(struct ata_port *ap)
-{
-	u8 host_stat;
-	if (ap->flags & ATA_FLAG_MMIO) {
-		void __iomem *mmio = (void __iomem *) ap->ioaddr.bmdma_addr;
-		host_stat = readb(mmio + ATA_DMA_STATUS);
-	} else
-		host_stat = inb(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
-	return host_stat;
 }
 
 static inline int ata_try_flush_cache(struct ata_device *dev)

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-03-04  4:09       ` Jeff Garzik
@ 2005-03-04  6:37         ` Joerg Sommrey
  2005-03-04  7:10           ` Jeff Garzik
  0 siblings, 1 reply; 57+ messages in thread
From: Joerg Sommrey @ 2005-03-04  6:37 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: Linux kernel mailing list

On Thu, Mar 03, 2005 at 11:09:26PM -0500, Jeff Garzik wrote:
> Joerg Sommrey wrote:
> >On Wed, Mar 02, 2005 at 05:43:59PM -0500, Jeff Garzik wrote:
> >
> >>Joerg Sommrey wrote:
> >>
> >>>Jeff Garzik wrote:
> >>>
> >>>>Patch:
> >>>>http://www.kernel.org/pub/linux/kernel/people/jgarzik/libata/2.6.11-rc5-bk4-libata-dev1.patch.bz2
> >>>
> >>>
> >>>Still not usable here.  The same errors as before when backing up:
> >>
> >>Please try 2.6.11 without any patches.
> >
> >Plain 2.6.11 doesn't work either.  All of 2.6.10-ac11, 2.6.11-rc5,
> >2.6.11-rc5 + 2.6.11-rc5-bk4-libata-dev1.patch and 2.6.11 fail with the
> >same symptoms. 
> >
> >Reverting to stable 2.6.10-ac8 :-)
> 
> Does reverting the attached patch in 2.6.11 (apply with patch -R) fix 
> things?
> 

Still the same with this patch reverted.
-jo

-- 
-rw-r--r--  1 jo users 63 2005-03-04 07:32 /home/jo/.signature

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-03-03 19:32     ` Joerg Sommrey
@ 2005-03-04  4:09       ` Jeff Garzik
  2005-03-04  6:37         ` Joerg Sommrey
  0 siblings, 1 reply; 57+ messages in thread
From: Jeff Garzik @ 2005-03-04  4:09 UTC (permalink / raw)
  To: Joerg Sommrey; +Cc: Linux kernel mailing list

[-- Attachment #1: Type: text/plain, Size: 666 bytes --]

Joerg Sommrey wrote:
> On Wed, Mar 02, 2005 at 05:43:59PM -0500, Jeff Garzik wrote:
> 
>>Joerg Sommrey wrote:
>>
>>>Jeff Garzik wrote:
>>>
>>>>Patch:
>>>>http://www.kernel.org/pub/linux/kernel/people/jgarzik/libata/2.6.11-rc5-bk4-libata-dev1.patch.bz2
>>>
>>>
>>>Still not usable here.  The same errors as before when backing up:
>>
>>Please try 2.6.11 without any patches.
> 
> Plain 2.6.11 doesn't work either.  All of 2.6.10-ac11, 2.6.11-rc5,
> 2.6.11-rc5 + 2.6.11-rc5-bk4-libata-dev1.patch and 2.6.11 fail with the
> same symptoms. 
> 
> Reverting to stable 2.6.10-ac8 :-)

Does reverting the attached patch in 2.6.11 (apply with patch -R) fix 
things?

	Jeff



[-- Attachment #2: patch --]
[-- Type: text/plain, Size: 1678 bytes --]

diff -Nru a/drivers/scsi/sata_promise.c b/drivers/scsi/sata_promise.c
--- a/drivers/scsi/sata_promise.c	2005-03-01 23:39:08 -08:00
+++ b/drivers/scsi/sata_promise.c	2005-03-01 23:39:08 -08:00
@@ -156,10 +156,18 @@
 	  board_2037x },
 	{ PCI_VENDOR_ID_PROMISE, 0x3376, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
 	  board_2037x },
+	{ PCI_VENDOR_ID_PROMISE, 0x3574, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+	  board_2037x },
+	{ PCI_VENDOR_ID_PROMISE, 0x3d75, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+	  board_2037x },
+
 	{ PCI_VENDOR_ID_PROMISE, 0x3318, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
 	  board_20319 },
 	{ PCI_VENDOR_ID_PROMISE, 0x3319, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
 	  board_20319 },
+	{ PCI_VENDOR_ID_PROMISE, 0x3d18, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+	  board_20319 },
+
 	{ }	/* terminate list */
 };
 
@@ -406,9 +414,11 @@
 		return IRQ_NONE;
 	}
 
-        spin_lock(&host_set->lock);
+	spin_lock(&host_set->lock);
 
-        for (i = 0; i < host_set->n_ports; i++) {
+	writel(mask, mmio_base + PDC_INT_SEQMASK);
+
+	for (i = 0; i < host_set->n_ports; i++) {
 		VPRINTK("port %u\n", i);
 		ap = host_set->ports[i];
 		tmp = mask & (1 << (i + 1));
@@ -546,6 +556,7 @@
 	unsigned long base;
 	void *mmio_base;
 	unsigned int board_idx = (unsigned int) ent->driver_data;
+	int pci_dev_busy = 0;
 	int rc;
 
 	if (!printed_version++)
@@ -560,8 +571,10 @@
 		return rc;
 
 	rc = pci_request_regions(pdev, DRV_NAME);
-	if (rc)
+	if (rc) {
+		pci_dev_busy = 1;
 		goto err_out;
+	}
 
 	rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
 	if (rc)
@@ -640,7 +653,8 @@
 err_out_regions:
 	pci_release_regions(pdev);
 err_out:
-	pci_disable_device(pdev);
+	if (!pci_dev_busy)
+		pci_disable_device(pdev);
 	return rc;
 }
 

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-03-02 22:43   ` Jeff Garzik
@ 2005-03-03 19:32     ` Joerg Sommrey
  2005-03-04  4:09       ` Jeff Garzik
  0 siblings, 1 reply; 57+ messages in thread
From: Joerg Sommrey @ 2005-03-03 19:32 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: Linux kernel mailing list

On Wed, Mar 02, 2005 at 05:43:59PM -0500, Jeff Garzik wrote:
> Joerg Sommrey wrote:
> >Jeff Garzik wrote:
> >>Patch:
> >>http://www.kernel.org/pub/linux/kernel/people/jgarzik/libata/2.6.11-rc5-bk4-libata-dev1.patch.bz2
> >
> >
> >Still not usable here.  The same errors as before when backing up:
> 
> Please try 2.6.11 without any patches.
Plain 2.6.11 doesn't work either.  All of 2.6.10-ac11, 2.6.11-rc5,
2.6.11-rc5 + 2.6.11-rc5-bk4-libata-dev1.patch and 2.6.11 fail with the
same symptoms. 

Reverting to stable 2.6.10-ac8 :-)

-jo

-- 
-rw-r--r--  1 jo users 63 2005-03-03 20:23 /home/jo/.signature

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-03-02 20:34 ` Joerg Sommrey
@ 2005-03-02 22:43   ` Jeff Garzik
  2005-03-03 19:32     ` Joerg Sommrey
  0 siblings, 1 reply; 57+ messages in thread
From: Jeff Garzik @ 2005-03-02 22:43 UTC (permalink / raw)
  To: Joerg Sommrey; +Cc: Linux kernel mailing list

Joerg Sommrey wrote:
> Jeff Garzik wrote:
> 
> 
>>BK users:
> 
> 
>>	bk pull bk://gkernel.bkbits.net/libata-dev-2.6
> 
> 
>>Patch:
>>http://www.kernel.org/pub/linux/kernel/people/jgarzik/libata/2.6.11-rc5-bk4-libata-dev1.patch.bz2
> 
> 
> Still not usable here.  The same errors as before when backing up:

Please try 2.6.11 without any patches.

	Jeff




^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
       [not found] <3Ds62-5AS-3@gated-at.bofh.it>
@ 2005-03-02 20:34 ` Joerg Sommrey
  2005-03-02 22:43   ` Jeff Garzik
  0 siblings, 1 reply; 57+ messages in thread
From: Joerg Sommrey @ 2005-03-02 20:34 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: Linux kernel mailing list

Jeff Garzik wrote:

>BK users:

>	bk pull bk://gkernel.bkbits.net/libata-dev-2.6

>Patch:
>http://www.kernel.org/pub/linux/kernel/people/jgarzik/libata/2.6.11-rc5-bk4-libata-dev1.patch.bz2

Still not usable here.  The same errors as before when backing up:

Mar  2 21:09:50 bear kernel: ata1: status=0x51 { DriveReady SeekComplete Error }Mar  2 21:09:51 bear kernel: ata1: called with no error (51)!
Mar  2 21:09:51 bear kernel: ata1: status=0x51 { DriveReady SeekComplete Error }Mar  2 21:09:51 bear kernel: ata1: called with no error (51)!
Mar  2 21:09:51 bear kernel: ata1: status=0x51 { DriveReady SeekComplete Error }Mar  2 21:09:51 bear kernel: ata1: called with no error (51)!
Mar  2 21:09:51 bear kernel: ata1: status=0x51 { DriveReady SeekComplete Error }Mar  2 21:09:51 bear kernel: ata1: called with no error (51)!
Mar  2 21:09:51 bear kernel: ata1: status=0x51 { DriveReady SeekComplete Error }Mar  2 21:09:51 bear kernel: ata1: called with no error (51)!
Mar  2 21:09:51 bear kernel: SCSI error : <1 0 0 0> return code = 0x8000002
Mar  2 21:09:51 bear kernel: sdb: Current: sense key: Medium Error
Mar  2 21:09:51 bear kernel:     Additional sense: Unrecovered read error - auto reallocate failed
Mar  2 21:09:51 bear kernel: end_request: I/O error, dev sdb, sector 43099350
Mar  2 21:09:51 bear kernel: ata1: status=0x51 { DriveReady SeekComplete Error }Mar  2 21:09:51 bear kernel: ata1: called with no error (51)!
Mar  2 21:09:52 bear kernel: SCSI error : <1 0 0 0> return code = 0x8000002
Mar  2 21:09:52 bear kernel: sdb: Current: sense key: Medium Error
Mar  2 21:09:52 bear kernel:     Additional sense: Unrecovered read error - auto reallocate failed
Mar  2 21:09:52 bear kernel: end_request: I/O error, dev sdb, sector 43099358
Mar  2 21:09:52 bear kernel: raid1: Disk failure on sdb2, disabling device.
Mar  2 21:09:52 bear kernel: ^IOperation continuing on 1 devices
Mar  2 21:09:52 bear kernel: raid1: sdb2: rescheduling sector 2904720
Mar  2 21:09:52 bear kernel: ata1: status=0x51 { DriveReady SeekComplete Error }Mar  2 21:09:52 bear kernel: ata1: called with no error (51)!
Mar  2 21:09:52 bear kernel: SCSI error : <1 0 0 0> return code = 0x8000002
Mar  2 21:09:52 bear kernel: sdb: Current: sense key: Medium Error
Mar  2 21:09:52 bear kernel:     Additional sense: Unrecovered read error - auto reallocate failed

Using Promise SATA150 TX4 / md-raid1 / lvm / reiserfs

-jo
-- 
-rw-r--r--  1 jo users 63 2005-03-02 21:14 /home/jo/.signature

^ permalink raw reply	[flat|nested] 57+ messages in thread

* [SATA] libata-dev queue updated
@ 2005-03-02  2:40 Jeff Garzik
  0 siblings, 0 replies; 57+ messages in thread
From: Jeff Garzik @ 2005-03-02  2:40 UTC (permalink / raw)
  To: linux-ide; +Cc: Linux Kernel

[-- Attachment #1: Type: text/plain, Size: 55 bytes --]

A minor update, mostly to update to the latest kernel.

[-- Attachment #2: changelog.txt --]
[-- Type: text/plain, Size: 3630 bytes --]

BK users:

	bk pull bk://gkernel.bkbits.net/libata-dev-2.6

Patch:
http://www.kernel.org/pub/linux/kernel/people/jgarzik/libata/2.6.11-rc5-bk4-libata-dev1.patch.bz2

This will update the following files:

 drivers/scsi/Kconfig         |   18 
 drivers/scsi/Makefile        |    2 
 drivers/scsi/ahci.c          |  107 ++++-
 drivers/scsi/ata_adma.c      |  778 +++++++++++++++++++++++++++++++++++++++++++
 drivers/scsi/libata-core.c   |  312 +++++++++--------
 drivers/scsi/libata-scsi.c   |  701 ++++++++++++++++++++++++++++++++------
 drivers/scsi/libata.h        |    6 
 drivers/scsi/pata_pdc2027x.c |  771 ++++++++++++++++++++++++++++++++++++++++++
 drivers/scsi/sata_promise.c  |   84 ++++
 drivers/scsi/sata_qstor.c    |   20 -
 drivers/scsi/sata_vsc.c      |    4 
 include/linux/ata.h          |   15 
 include/linux/libata.h       |   10 
 include/scsi/scsi.h          |    3 
 14 files changed, 2531 insertions(+), 300 deletions(-)

through these ChangeSets:

<andyw:pobox.com>:
  o [libata scsi] support 12-byte passthru CDB
  o [libata scsi] passthru CDB check condition processing
  o T10/04-262 ATA pass thru - patch

<erikbenada:yahoo.ca>:
  o [libata sata_promise] support PATA ports on SATA controllers

<tklauser:nuerscht.ch>:
  o drivers/scsi/ahci: Use the DMA_{64,32}BIT_MASK constants
  o drivers/scsi/sata_vsc: Use the DMA_{64,32}BIT_MASK constants

Adam J. Richter:
  o ata_pci_remove_one used freed memory

Albert Lee:
  o [libata] use init-device-params ATA command where needed
  o [libata] ata_scsi_verify_xlat() fix
  o pdc2027x timing register fix for 100MHz
  o [libata] CHS support: add CHS support to ata_scsi_verify_xlat(), ata_scsi_rw_xlat() and ata_scsiop_read_cap().
  o [libata] CHS support: reorganize read/write translation in ata_scsi_rw_xlat()
  o [libata] CHS support: rename vars (s/sector/block/) in ata_scsi_verify_xlat()
  o [libata] CHS support: detect C/H/S at IDENTIFY DEVICE time
  o [libata] CHS support: add definitions to headers
  o pdc2027x timing register bug fix
  o [libata pdc2027x] fix incorrect pio and mwdma masks
  o [libata pdc2027x] remove quirks and ROM enable
  o [libata] add driver for Promise PATA 2027x

Brad Campbell:
  o libata basic detection and errata for PATA->SATA bridges

Jeff Garzik:
  o [libata ahci] Print out port id on error messages
  o [libata ahci] support PCI MSI interrupt vector
  o [libata adma] Add init code, fix CPB submission code
  o [libata ahci] finish ATAPI support
  o [libata adma] trivial whitespace cleanup
  o [libata dma] fix DMA mode config; add some more initialization code
  o [libata adma] add support for configuring PIO/DMA modes
  o [libata] turn on ATAPI support
  o [libata sata_promise] merge Tobias Lorenz' pdc20619 patch, part 2
  o [libata] small cleanups
  o [libata] remove unused execute-device-diagnostic reset method
  o [libata] add new driver ata_adma
  o [libata pdc2027x] update for upstream struct device conversion
  o [libata sata_promise] fix merge bugs
  o [libata] fix build breakage
  o [libata] fix SATA->PATA bridge detect compile breakage
  o [libata] fix printk warning

John W. Linville:
  o libata: update ATA pass thru opcodes
  o libata: minor style changes in ata_scsi_pass_thru
  o libata: filter SET_FEATURES - XFER MODE from ATA pass thru
  o libata: sync SMART ioctls with ATA pass thru spec (T10/04-262r7)
  o libata: fix command queue leak when xlat_func fails
  o libata: SMART support via ATA pass-thru

Mark Lord:
  o [libata qstor] minor update per LKML comments

Tobias Lorenz:
  o [libata sata_promise] pdc20619 (PATA) support
  o libata-scsi: get-identity ioctl support


^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-02-19 16:58 ` Andre Tomt
@ 2005-02-19 17:09   ` Jeff Garzik
  0 siblings, 0 replies; 57+ messages in thread
From: Jeff Garzik @ 2005-02-19 17:09 UTC (permalink / raw)
  To: Andre Tomt; +Cc: linux-ide, Linux Kernel

Andre Tomt wrote:
> Jeff Garzik wrote:
> 
>> Patch URL, BK URL, and changelog attached.
>>
>> Recent changes:
>> * New sata_qstor driver.
>>
>> * Turn on ATAPI by default.
>>
>> * Change a couple unconditional use-the-hardware function calls to be 
>> callbacks instead.  Should have been this way originally.
>>
>> * Most of C/H/S support.
>>
>> * Fix bugs in ADMA driver.
>>
>> * Support PCI MSI in AHCI driver.
>> * Support ATAPI in AHCI driver.
>>
>> * Improve ATA passthru (a.k.a. SMART) support
>>
> 
> How is the Marvell driver coming along? Did it stall? :-)

Yeah, it's stalled...

	Jeff




^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2005-02-19  8:40 Jeff Garzik
@ 2005-02-19 16:58 ` Andre Tomt
  2005-02-19 17:09   ` Jeff Garzik
  0 siblings, 1 reply; 57+ messages in thread
From: Andre Tomt @ 2005-02-19 16:58 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: linux-ide, Linux Kernel

Jeff Garzik wrote:
> Patch URL, BK URL, and changelog attached.
> 
> Recent changes:
> * New sata_qstor driver.
> 
> * Turn on ATAPI by default.
> 
> * Change a couple unconditional use-the-hardware function calls to be 
> callbacks instead.  Should have been this way originally.
> 
> * Most of C/H/S support.
> 
> * Fix bugs in ADMA driver.
> 
> * Support PCI MSI in AHCI driver.
> * Support ATAPI in AHCI driver.
> 
> * Improve ATA passthru (a.k.a. SMART) support
> 

How is the Marvell driver coming along? Did it stall? :-)

The propetiary source driver works, but its not like its universally 
available (I had to grab it from a different vendor..), "guaranteed" to 
work with future kernels, have a usable license, and so on.

^ permalink raw reply	[flat|nested] 57+ messages in thread

* [SATA] libata-dev queue updated
@ 2005-02-19  8:40 Jeff Garzik
  2005-02-19 16:58 ` Andre Tomt
  0 siblings, 1 reply; 57+ messages in thread
From: Jeff Garzik @ 2005-02-19  8:40 UTC (permalink / raw)
  To: linux-ide; +Cc: Linux Kernel

[-- Attachment #1: Type: text/plain, Size: 413 bytes --]

Patch URL, BK URL, and changelog attached.

Recent changes:
* New sata_qstor driver.

* Turn on ATAPI by default.

* Change a couple unconditional use-the-hardware function calls to be 
callbacks instead.  Should have been this way originally.

* Most of C/H/S support.

* Fix bugs in ADMA driver.

* Support PCI MSI in AHCI driver.
* Support ATAPI in AHCI driver.

* Improve ATA passthru (a.k.a. SMART) support


[-- Attachment #2: changelog.txt --]
[-- Type: text/plain, Size: 3924 bytes --]

BK users:

	bk pull bk://gkernel.bkbits.net/libata-dev-2.6

Patch:
http://www.kernel.org/pub/linux/kernel/people/jgarzik/libata/2.6.11-rc4-bk6-libata-dev1.patch.bz2

This will update the following files:

 drivers/scsi/Kconfig         |   26 +
 drivers/scsi/Makefile        |    3 
 drivers/scsi/ahci.c          |  101 ++++-
 drivers/scsi/ata_adma.c      |  778 +++++++++++++++++++++++++++++++++++++++++++
 drivers/scsi/ata_piix.c      |    4 
 drivers/scsi/libata-core.c   |  338 ++++++++++--------
 drivers/scsi/libata-scsi.c   |  701 ++++++++++++++++++++++++++++++++------
 drivers/scsi/libata.h        |    7 
 drivers/scsi/pata_pdc2027x.c |  742 +++++++++++++++++++++++++++++++++++++++++
 drivers/scsi/sata_nv.c       |   10 
 drivers/scsi/sata_promise.c  |   92 ++++-
 drivers/scsi/sata_qstor.c    |  700 ++++++++++++++++++++++++++++++++++++++
 drivers/scsi/sata_sil.c      |   10 
 drivers/scsi/sata_sis.c      |   10 
 drivers/scsi/sata_svw.c      |   10 
 drivers/scsi/sata_sx4.c      |    8 
 drivers/scsi/sata_uli.c      |   10 
 drivers/scsi/sata_via.c      |  213 ++++++++---
 drivers/scsi/sata_vsc.c      |   10 
 include/linux/ata.h          |   14 
 include/linux/libata.h       |   55 ---
 include/scsi/scsi.h          |    3 
 22 files changed, 3442 insertions(+), 403 deletions(-)

through these ChangeSets:

<andyw:pobox.com>:
  o [libata scsi] support 12-byte passthru CDB
  o [libata scsi] passthru CDB check condition processing
  o T10/04-262 ATA pass thru - patch

<erikbenada:yahoo.ca>:
  o [libata sata_promise] support PATA ports on SATA controllers

<mat.loikkanen:synopsys.com>:
  o [libata] add ->bmdma_{stop,status} hooks

Adam J. Richter:
  o ata_pci_remove_one used freed memory

Albert Lee:
  o [libata] CHS support: add CHS support to ata_scsi_verify_xlat(), ata_scsi_rw_xlat() and ata_scsiop_read_cap().
  o [libata] CHS support: reorganize read/write translation in ata_scsi_rw_xlat()
  o [libata] CHS support: rename vars (s/sector/block/) in ata_scsi_verify_xlat()
  o [libata] CHS support: detect C/H/S at IDENTIFY DEVICE time
  o [libata] CHS support: add definitions to headers
  o pdc2027x timing register bug fix
  o [libata pdc2027x] fix incorrect pio and mwdma masks
  o [libata pdc2027x] remove quirks and ROM enable
  o [libata] add driver for Promise PATA 2027x

Brad Campbell:
  o libata basic detection and errata for PATA->SATA bridges

Jeff Garzik:
  o [libata ahci] support PCI MSI interrupt vector
  o [libata adma] Add init code, fix CPB submission code
  o [libata ahci] finish ATAPI support
  o [libata adma] trivial whitespace cleanup
  o [libata dma] fix DMA mode config; add some more initialization code
  o [libata adma] add support for configuring PIO/DMA modes
  o [libata] do not call pci_disable_device() for certain errors
  o [libata] turn on ATAPI support
  o [libata sata_promise] merge Tobias Lorenz' pdc20619 patch, part 2
  o [libata] small cleanups
  o [libata] remove unused execute-device-diagnostic reset method
  o [libata] add new driver ata_adma
  o [libata sata_via] add support for VT6421 SATA
  o [libata sata_via] minor cleanups
  o [libata pdc2027x] update for upstream struct device conversion
  o [libata sata_promise] fix merge bugs
  o [libata] fix build breakage
  o [libata] fix SATA->PATA bridge detect compile breakage
  o [libata] fix printk warning

John W. Linville:
  o libata: fix command queue leak when xlat_func fails
  o libata: update ATA pass thru opcodes
  o libata: minor style changes in ata_scsi_pass_thru
  o libata: filter SET_FEATURES - XFER MODE from ATA pass thru
  o libata: sync SMART ioctls with ATA pass thru spec (T10/04-262r7)
  o libata: fix command queue leak when xlat_func fails
  o libata: SMART support via ATA pass-thru

Mark Lord:
  o sata_qstor: new basic driver for Pacific Digital

Tobias Lorenz:
  o [libata sata_promise] pdc20619 (PATA) support
  o libata-scsi: get-identity ioctl support


^ permalink raw reply	[flat|nested] 57+ messages in thread

* [SATA] libata-dev queue updated
@ 2005-02-13 20:33 Jeff Garzik
  0 siblings, 0 replies; 57+ messages in thread
From: Jeff Garzik @ 2005-02-13 20:33 UTC (permalink / raw)
  To: linux-ide; +Cc: Linux Kernel, Jens Axboe

[-- Attachment #1: Type: text/plain, Size: 366 bytes --]

A minor update since the last post.  Recent changes:

* updated to 2.6.11-rc4, posted patch (see attached).

* turned on ATAPI by default.  If you got an S/ATAPI DVD burner for 
Christmas, you'll like this.

WARNING DANGER WARNING:  Some drivers such as sata_promise and ahci have 
not yet been updated to support ATAPI.

More details on patch/BK/changes attached.


[-- Attachment #2: libata-dev.txt --]
[-- Type: text/plain, Size: 2201 bytes --]

BK users:

	bk pull bk://gkernel.bkbits.net/libata-dev-2.6

Patch:
http://www.kernel.org/pub/linux/kernel/people/jgarzik/libata/2.6.11-rc4-libata-dev1.patch.bz2

This will update the following files:

 drivers/scsi/Kconfig         |   18 -
 drivers/scsi/Makefile        |    2 
 drivers/scsi/ata_adma.c      |  636 ++++++++++++++++++++++++++++++++++++
 drivers/scsi/libata-core.c   |  174 +++-------
 drivers/scsi/libata-scsi.c   |  409 +++++++++++++++++++++++
 drivers/scsi/libata.h        |    6 
 drivers/scsi/pata_pdc2027x.c |  742 +++++++++++++++++++++++++++++++++++++++++++
 drivers/scsi/sata_promise.c  |   84 ++++
 drivers/scsi/sata_via.c      |  202 ++++++++---
 include/linux/ata.h          |    1 
 include/linux/libata.h       |    4 
 include/scsi/scsi.h          |    3 
 12 files changed, 2096 insertions(+), 185 deletions(-)

through these ChangeSets:

<andyw:pobox.com>:
  o [libata scsi] support 12-byte passthru CDB
  o [libata scsi] passthru CDB check condition processing
  o T10/04-262 ATA pass thru - patch

<erikbenada:yahoo.ca>:
  o [libata sata_promise] support PATA ports on SATA controllers

Adam J. Richter:
  o ata_pci_remove_one used freed memory

Albert Lee:
  o pdc2027x timing register bug fix
  o [libata pdc2027x] fix incorrect pio and mwdma masks
  o [libata pdc2027x] remove quirks and ROM enable
  o [libata] add driver for Promise PATA 2027x

Brad Campbell:
  o libata basic detection and errata for PATA->SATA bridges

Jeff Garzik:
  o [libata] turn on ATAPI support
  o [libata sata_promise] merge Tobias Lorenz' pdc20619 patch, part 2
  o [libata] small cleanups
  o [libata] remove unused execute-device-diagnostic reset method
  o [libata] add new driver ata_adma
  o [libata sata_via] add support for VT6421 SATA
  o [libata sata_via] minor cleanups
  o [libata pdc2027x] update for upstream struct device conversion
  o [libata sata_promise] fix merge bugs
  o [libata] fix build breakage
  o [libata] fix SATA->PATA bridge detect compile breakage
  o [libata] fix printk warning

John W. Linville:
  o libata: SMART support via ATA pass-thru

Tobias Lorenz:
  o [libata sata_promise] pdc20619 (PATA) support
  o libata-scsi: get-identity ioctl support


^ permalink raw reply	[flat|nested] 57+ messages in thread

* [SATA] libata-dev queue updated
@ 2004-10-30 16:15 Jeff Garzik
  0 siblings, 0 replies; 57+ messages in thread
From: Jeff Garzik @ 2004-10-30 16:15 UTC (permalink / raw)
  To: linux-ide


Still got a couple more patches in the inbox, not yet committed.

BK users:

	bk pull bk://gkernel.bkbits.net/libata-dev-2.6

Patch:

	Too slack to make one today.

This will update the following files:

 drivers/scsi/Kconfig         |    8 
 drivers/scsi/Makefile        |    1 
 drivers/scsi/ahci.c          |    9 
 drivers/scsi/libata-core.c   |   38 ++
 drivers/scsi/libata-scsi.c   |  409 +++++++++++++++++++++++++
 drivers/scsi/libata.h        |    2 
 drivers/scsi/pata_pdc2027x.c |  694 +++++++++++++++++++++++++++++++++++++++++++
 drivers/scsi/sata_promise.c  |  104 ++++--
 include/linux/ata.h          |    1 
 include/linux/libata.h       |    7 
 include/scsi/scsi.h          |    3 
 11 files changed, 1232 insertions(+), 44 deletions(-)

through these ChangeSets:

<albertcc:tw.ibm.com>:
  o [libata pdc2027x] fix incorrect pio and mwdma masks
  o [libata pdc2027x] remove quirks and ROM enable
  o [libata] add driver for Promise PATA 2027x

<andyw:pobox.com>:
  o [libata scsi] support 12-byte passthru CDB
  o [libata scsi] passthru CDB check condition processing
  o T10/04-262 ATA pass thru - patch

<erikbenada:yahoo.ca>:
  o [libata sata_promise] support PATA ports on SATA controllers

<tobias.lorenz:gmx.net>:
  o [libata sata_promise] s/sata/ata/
  o libata-scsi: get-identity ioctl support

Brad Campbell:
  o libata basic detection and errata for PATA->SATA bridges

Jeff Garzik:
  o [libata] fix build breakage
  o [libata] cosmetic libata.h changes to make merging with 2.4 easier
  o [libata] fix SATA->PATA bridge detect compile breakage
  o [libata] fix printk warning

John W. Linville:
  o libata: SMART support via ATA pass-thru

Nishanth Aravamudan:
  o scsi/ahci: replace schedule_timeout() with msleep()/ssleep()


^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2004-10-27 22:53 ` Rob van Nieuwkerk
@ 2004-10-27 23:03   ` Jeff Garzik
  0 siblings, 0 replies; 57+ messages in thread
From: Jeff Garzik @ 2004-10-27 23:03 UTC (permalink / raw)
  To: Rob van Nieuwkerk; +Cc: linux-ide, linux-kernel

Rob van Nieuwkerk wrote:
> On Wed, 27 Oct 2004 02:52:08 -0400
> Jeff Garzik <jgarzik@pobox.com> wrote:
> 
> Hi Jeff,
> 
> 
>>John W. Linville:
>>  o libata: SMART support via ATA pass-thru
> 
> 
> Does this mean that now we can use SMART on SATA disks ?
> Or only PATA disks ?

Both.

	Jeff

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2004-10-27  6:52 Jeff Garzik
  2004-10-27  6:53 ` Jeff Garzik
@ 2004-10-27 22:53 ` Rob van Nieuwkerk
  2004-10-27 23:03   ` Jeff Garzik
  1 sibling, 1 reply; 57+ messages in thread
From: Rob van Nieuwkerk @ 2004-10-27 22:53 UTC (permalink / raw)
  To: linux-ide; +Cc: jgarzik, linux-kernel

On Wed, 27 Oct 2004 02:52:08 -0400
Jeff Garzik <jgarzik@pobox.com> wrote:

Hi Jeff,

> John W. Linville:
>   o libata: SMART support via ATA pass-thru

Does this mean that now we can use SMART on SATA disks ?
Or only PATA disks ?

	greetings,
	Rob van Nieuwkerk

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2004-10-27  6:52 Jeff Garzik
@ 2004-10-27  6:53 ` Jeff Garzik
  2004-10-27 22:53 ` Rob van Nieuwkerk
  1 sibling, 0 replies; 57+ messages in thread
From: Jeff Garzik @ 2004-10-27  6:53 UTC (permalink / raw)
  To: linux-ide; +Cc: linux-kernel

Jeff Garzik wrote:
> Nothing new, just updating for recent kernels.
> 
> BK users:
> 
> 	bk pull bk://gkernel.bkbits.net/libata-dev-2.6


Oh yeah... for those with a local clone of libata-dev-2.6, please erase 
and re-clone.

	Jeff



^ permalink raw reply	[flat|nested] 57+ messages in thread

* [SATA] libata-dev queue updated
@ 2004-10-27  6:52 Jeff Garzik
  2004-10-27  6:53 ` Jeff Garzik
  2004-10-27 22:53 ` Rob van Nieuwkerk
  0 siblings, 2 replies; 57+ messages in thread
From: Jeff Garzik @ 2004-10-27  6:52 UTC (permalink / raw)
  To: linux-ide; +Cc: linux-kernel


Nothing new, just updating for recent kernels.

BK users:

	bk pull bk://gkernel.bkbits.net/libata-dev-2.6

Patch:
http://www.kernel.org/pub/linux/kernel/people/jgarzik/libata/2.6.10-rc1-bk5-libata1-dev1.patch.bz2

The libata-dev-2.6 patch requires the libata-2.6 patch, which is
available at:
http://www.kernel.org/pub/linux/kernel/people/jgarzik/libata/2.6.10-rc1-bk5-libata1.patch.bz2

This will update the following files:

 drivers/scsi/Kconfig         |    8 
 drivers/scsi/Makefile        |    1 
 drivers/scsi/libata-core.c   |   38 +-
 drivers/scsi/libata-scsi.c   |  395 +++++++++++++++++++++-
 drivers/scsi/libata.h        |    2 
 drivers/scsi/pata_pdc2027x.c |  758 +++++++++++++++++++++++++++++++++++++++++++
 drivers/scsi/sata_promise.c  |   56 +++
 include/linux/ata.h          |    1 
 include/linux/libata.h       |    2 
 include/scsi/scsi.h          |    3 
 10 files changed, 1249 insertions(+), 15 deletions(-)

through these ChangeSets:

<albertcc:tw.ibm.com>:
  o [libata] add driver for Promise PATA 2027x

<andyw:pobox.com>:
  o [libata scsi] support 12-byte passthru CDB
  o [libata scsi] passthru CDB check condition processing
  o T10/04-262 ATA pass thru - patch

<erikbenada:yahoo.ca>:
  o [libata sata_promise] support PATA ports on SATA controllers

Brad Campbell:
  o libata basic detection and errata for PATA->SATA bridges

Jeff Garzik:
  o [libata] fix SATA->PATA bridge detect compile breakage
  o [libata] use kunmap_atomic() correctly
  o [libata] fix printk warning

John W. Linville:
  o libata: SMART support via ATA pass-thru

^ permalink raw reply	[flat|nested] 57+ messages in thread

* [SATA] libata-dev queue updated
@ 2004-10-18 23:52 Jeff Garzik
  0 siblings, 0 replies; 57+ messages in thread
From: Jeff Garzik @ 2004-10-18 23:52 UTC (permalink / raw)
  To: linux-ide


Added Bart's ATAPI work and Albert's port of Promise PATA driver.

BK users:

	bk pull bk://gkernel.bkbits.net/libata-dev-2.6

Patch:
http://www.kernel.org/pub/linux/kernel/people/jgarzik/libata/2.6.9-libata1-dev1.patch.bz2

The libata-dev patch requires the libata-2.6 patch queue, which is
	bk://gkernel.bkbits.net/libata-2.6
		or
http://www.kernel.org/pub/linux/kernel/people/jgarzik/libata/2.6.9-libata1.patch.bz2

This will update the following files:

 drivers/pci/quirks.c         |    4 
 drivers/scsi/Kconfig         |   16 
 drivers/scsi/Makefile        |    2 
 drivers/scsi/ahci.c          | 1023 +++++++++++++++++++++++++++++++++++++++++++
 drivers/scsi/libata-core.c   |  273 +++++++++--
 drivers/scsi/libata-scsi.c   |  465 +++++++++++++++++--
 drivers/scsi/libata.h        |    7 
 drivers/scsi/pata_pdc2027x.c |  758 +++++++++++++++++++++++++++++++
 drivers/scsi/sata_promise.c  |   56 ++
 drivers/scsi/sata_sil.c      |    2 
 drivers/scsi/sata_vsc.c      |    8 
 include/linux/ata.h          |   37 -
 include/linux/libata.h       |   18 
 include/scsi/scsi.h          |    3 
 14 files changed, 2545 insertions(+), 127 deletions(-)

through these ChangeSets:

<albertcc:tw.ibm.com>:
  o [libata] add driver for Promise PATA 2027x

<andyw:pobox.com>:
  o [libata scsi] support 12-byte passthru CDB
  o [libata scsi] passthru CDB check condition processing
  o T10/04-262 ATA pass thru - patch

<erikbenada:yahoo.ca>:
  o [libata sata_promise] support PATA ports on SATA controllers

<lsml:rtr.ca>:
  o Export ata_scsi_simulate() for use by non-libata drivers

Bartlomiej Zolnierkiewicz:
  o make ATAPI PIO work
  o arbitrary size ATAPI PIO support bugfixes
  o [libata] arbitrary size ATAPI PIO support
  o REQUEST_SENSE support for ATAPI

Brad Campbell:
  o libata basic detection and errata for PATA->SATA bridges

Jeff Garzik:
  o Fix build breakage related to hand-merging Brad Campbell's and Mark Lord's changes.
  o [libata] fix printk warning
  o [ata piix] enable ICH5/6 combined mode quirk based on BLK_DEV_IDE_SATA
  o [libata ahci] more updates
  o [libata ahci] fix several bugs
  o [libata] add AHCI driver

Jeremy Higdon:
  o per-port LED control for sata_vsc

John W. Linville:
  o libata: SMART support via ATA pass-thru


^ permalink raw reply	[flat|nested] 57+ messages in thread

* [SATA] libata-dev queue updated
@ 2004-10-16  0:44 Jeff Garzik
  0 siblings, 0 replies; 57+ messages in thread
From: Jeff Garzik @ 2004-10-16  0:44 UTC (permalink / raw)
  To: linux-ide


Updates:  adds Bart's ATAPI work.

BK users:

	bk pull bk://gkernel.bkbits.net/libata-dev-2.6

Patch:
http://www.kernel.org/pub/linux/kernel/people/jgarzik/libata/2.6.9-rc4-libata2-dev2.patch.bz2

The patch depends on the changes currently in the libata-2.6 queue,
	bk pull bk://gkernel.bkbits.net/libata-2.6
		or
http://www.kernel.org/pub/linux/kernel/people/jgarzik/libata/2.6.9-rc4-libata2.patch.bz2

This will update the following files:

 drivers/pci/quirks.c        |    4 
 drivers/scsi/Kconfig        |    8 
 drivers/scsi/Makefile       |    1 
 drivers/scsi/ahci.c         | 1023 ++++++++++++++++++++++++++++++++++++++++++++
 drivers/scsi/libata-core.c  |  246 ++++++++--
 drivers/scsi/libata-scsi.c  |  465 ++++++++++++++++++--
 drivers/scsi/libata.h       |    7 
 drivers/scsi/sata_promise.c |   56 ++
 drivers/scsi/sata_sil.c     |    2 
 drivers/scsi/sata_vsc.c     |    8 
 include/linux/ata.h         |   37 -
 include/linux/libata.h      |   18 
 include/scsi/scsi.h         |    3 
 13 files changed, 1759 insertions(+), 119 deletions(-)

through these ChangeSets:

<andyw:pobox.com>:
  o [libata scsi] support 12-byte passthru CDB
  o [libata scsi] passthru CDB check condition processing
  o T10/04-262 ATA pass thru - patch

<erikbenada:yahoo.ca>:
  o [libata sata_promise] support PATA ports on SATA controllers

<lsml:rtr.ca>:
  o Export ata_scsi_simulate() for use by non-libata drivers

Bartlomiej Zolnierkiewicz:
  o [libata] arbitrary size ATAPI PIO support
  o REQUEST_SENSE support for ATAPI

Brad Campbell:
  o libata basic detection and errata for PATA->SATA bridges

Jeff Garzik:
  o Fix build breakage related to hand-merging Brad Campbell's and Mark Lord's changes.
  o [libata] fix printk warning
  o [ata piix] enable ICH5/6 combined mode quirk based on BLK_DEV_IDE_SATA
  o [libata ahci] more updates
  o [libata ahci] fix several bugs
  o [libata] add AHCI driver

Jeremy Higdon:
  o per-port LED control for sata_vsc

John W. Linville:
  o libata: SMART support via ATA pass-thru


^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [SATA] libata-dev queue updated
  2004-10-15  8:04 Jeff Garzik
@ 2004-10-15 17:15 ` Jeff Garzik
  0 siblings, 0 replies; 57+ messages in thread
From: Jeff Garzik @ 2004-10-15 17:15 UTC (permalink / raw)
  To: linux-ide; +Cc: linux-kernel

Jeff Garzik wrote:
> BK users:
> 
> 	bk pull bk://gkernel.bkbits.net/libata-dev-2.6


IMPORTANT NOTE:  You must re-clone this repository from scratch.  Please 
do not 'bk pull' this into an existing repository.

	Jeff



^ permalink raw reply	[flat|nested] 57+ messages in thread

* [SATA] libata-dev queue updated
@ 2004-10-15  8:04 Jeff Garzik
  2004-10-15 17:15 ` Jeff Garzik
  0 siblings, 1 reply; 57+ messages in thread
From: Jeff Garzik @ 2004-10-15  8:04 UTC (permalink / raw)
  To: linux-ide; +Cc: linux-kernel


BK users:

	bk pull bk://gkernel.bkbits.net/libata-dev-2.6

Patch should show up at
http://www.kernel.org/pub/linux/kernel/people/jgarzik/libata/
eventually.

This will update the following files:

 drivers/pci/quirks.c        |    4 
 drivers/scsi/Kconfig        |    8 
 drivers/scsi/Makefile       |    1 
 drivers/scsi/ahci.c         | 1023 ++++++++++++++++++++++++++++++++++++++++++++
 drivers/scsi/libata-core.c  |   69 ++
 drivers/scsi/libata-scsi.c  |  453 +++++++++++++++++--
 drivers/scsi/libata.h       |    7 
 drivers/scsi/sata_promise.c |   56 ++
 drivers/scsi/sata_sil.c     |    2 
 drivers/scsi/sata_vsc.c     |    8 
 include/linux/ata.h         |   37 -
 include/linux/libata.h      |   14 
 include/scsi/scsi.h         |    3 
 13 files changed, 1601 insertions(+), 84 deletions(-)

through these ChangeSets:

<andyw:pobox.com>:
  o [libata scsi] support 12-byte passthru CDB
  o [libata scsi] passthru CDB check condition processing
  o T10/04-262 ATA pass thru - patch

<erikbenada:yahoo.ca>:
  o [libata sata_promise] support PATA ports on SATA controllers

<lsml:rtr.ca>:
  o Export ata_scsi_simulate() for use by non-libata drivers

Brad Campbell:
  o libata basic detection and errata for PATA->SATA bridges

Jeff Garzik:
  o Fix build breakage related to hand-merging Brad Campbell's and Mark Lord's changes.
  o [libata] fix printk warning
  o [ata piix] enable ICH5/6 combined mode quirk based on BLK_DEV_IDE_SATA
  o [libata ahci] more updates
  o [libata ahci] fix several bugs
  o [libata] add AHCI driver

Jeremy Higdon:
  o per-port LED control for sata_vsc

John W. Linville:
  o libata: SMART support via ATA pass-thru

diff -Nru a/drivers/pci/quirks.c b/drivers/pci/quirks.c
--- a/drivers/pci/quirks.c	2004-10-15 03:08:20 -04:00
+++ b/drivers/pci/quirks.c	2004-10-15 03:08:20 -04:00
@@ -904,7 +904,7 @@
 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL,	PCI_DEVICE_ID_INTEL_EESSC,	quirk_alder_ioapic );
 #endif
 
-#ifdef CONFIG_SCSI_SATA
+#ifdef CONFIG_BLK_DEV_IDE_SATA
 static void __init quirk_intel_ide_combined(struct pci_dev *pdev)
 {
 	u8 prog, comb, tmp;
@@ -976,7 +976,7 @@
 		request_region(0x170, 8, "libata");	/* port 1 */
 }
 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,    PCI_ANY_ID,	  quirk_intel_ide_combined );
-#endif /* CONFIG_SCSI_SATA */
+#endif /* CONFIG_BLK_DEV_IDE_SATA */
 
 int pciehp_msi_quirk;
 
diff -Nru a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig
--- a/drivers/scsi/Kconfig	2004-10-15 03:08:20 -04:00
+++ b/drivers/scsi/Kconfig	2004-10-15 03:08:20 -04:00
@@ -406,6 +406,14 @@
 
 	  If unsure, say N.
 
+config SCSI_SATA_AHCI
+	tristate "AHCI SATA support"
+	depends on SCSI_SATA && PCI && EXPERIMENTAL
+	help
+	  This option enables support for AHCI Serial ATA.
+
+	  If unsure, say N.
+
 config SCSI_SATA_SVW
 	tristate "ServerWorks Frodo / Apple K2 SATA support (EXPERIMENTAL)"
 	depends on SCSI_SATA && PCI && EXPERIMENTAL
diff -Nru a/drivers/scsi/Makefile b/drivers/scsi/Makefile
--- a/drivers/scsi/Makefile	2004-10-15 03:08:20 -04:00
+++ b/drivers/scsi/Makefile	2004-10-15 03:08:20 -04:00
@@ -121,6 +121,7 @@
 obj-$(CONFIG_SCSI_NSP32)	+= nsp32.o
 obj-$(CONFIG_SCSI_IPR)		+= ipr.o
 obj-$(CONFIG_SCSI_IBMVSCSI)	+= ibmvscsi/
+obj-$(CONFIG_SCSI_SATA_AHCI)	+= libata.o ahci.o
 obj-$(CONFIG_SCSI_SATA_SVW)	+= libata.o sata_svw.o
 obj-$(CONFIG_SCSI_ATA_PIIX)	+= libata.o ata_piix.o
 obj-$(CONFIG_SCSI_SATA_PROMISE)	+= libata.o sata_promise.o
diff -Nru a/drivers/scsi/ahci.c b/drivers/scsi/ahci.c
--- /dev/null	Wed Dec 31 16:00:00 196900
+++ b/drivers/scsi/ahci.c	2004-10-15 03:08:20 -04:00
@@ -0,0 +1,1023 @@
+/*
+ *  ahci.c - AHCI SATA support
+ *
+ *  Copyright 2004 Red Hat, Inc.
+ *
+ *  The contents of this file are subject to the Open
+ *  Software License version 1.1 that can be found at
+ *  http://www.opensource.org/licenses/osl-1.1.txt and is included herein
+ *  by reference.
+ *
+ *  Alternatively, the contents of this file may be used under the terms
+ *  of the GNU General Public License version 2 (the "GPL") as distributed
+ *  in the kernel source COPYING file, in which case the provisions of
+ *  the GPL are applicable instead of the above.  If you wish to allow
+ *  the use of your version of this file only under the terms of the
+ *  GPL and not to allow others to use your version of this file under
+ *  the OSL, indicate your decision by deleting the provisions above and
+ *  replace them with the notice and other provisions required by the GPL.
+ *  If you do not delete the provisions above, a recipient may use your
+ *  version of this file under either the OSL or the GPL.
+ *
+ * Version 1.0 of the AHCI specification:
+ * http://www.intel.com/technology/serialata/pdf/rev1_0.pdf
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/pci.h>
+#include <linux/init.h>
+#include <linux/blkdev.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/sched.h>
+#include "scsi.h"
+#include <scsi/scsi_host.h>
+#include <linux/libata.h>
+#include <asm/io.h>
+
+#define DRV_NAME	"ahci"
+#define DRV_VERSION	"0.11"
+
+
+enum {
+	AHCI_PCI_BAR		= 5,
+	AHCI_MAX_SG		= 168, /* hardware max is 64K */
+	AHCI_DMA_BOUNDARY	= 0xffffffff,
+	AHCI_USE_CLUSTERING	= 0,
+	AHCI_CMD_SLOT_SZ	= 32 * 32,
+	AHCI_RX_FIS_SZ		= 256,
+	AHCI_CMD_TBL_HDR	= 0x80,
+	AHCI_CMD_TBL_SZ		= AHCI_CMD_TBL_HDR + (AHCI_MAX_SG * 16),
+	AHCI_PORT_PRIV_DMA_SZ	= AHCI_CMD_SLOT_SZ + AHCI_CMD_TBL_SZ +
+				  AHCI_RX_FIS_SZ,
+	AHCI_IRQ_ON_SG		= (1 << 31),
+	AHCI_CMD_ATAPI		= (1 << 5),
+	AHCI_CMD_WRITE		= (1 << 6),
+
+	RX_FIS_D2H_REG		= 0x40,	/* offset of D2H Register FIS data */
+
+	board_ahci		= 0,
+
+	/* global controller registers */
+	HOST_CAP		= 0x00, /* host capabilities */
+	HOST_CTL		= 0x04, /* global host control */
+	HOST_IRQ_STAT		= 0x08, /* interrupt status */
+	HOST_PORTS_IMPL		= 0x0c, /* bitmap of implemented ports */
+	HOST_VERSION		= 0x10, /* AHCI spec. version compliancy */
+
+	/* HOST_CTL bits */
+	HOST_RESET		= (1 << 0),  /* reset controller; self-clear */
+	HOST_IRQ_EN		= (1 << 1),  /* global IRQ enable */
+	HOST_AHCI_EN		= (1 << 31), /* AHCI enabled */
+
+	/* HOST_CAP bits */
+	HOST_CAP_64		= (1 << 31), /* PCI DAC (64-bit DMA) support */
+
+	/* registers for each SATA port */
+	PORT_LST_ADDR		= 0x00, /* command list DMA addr */
+	PORT_LST_ADDR_HI	= 0x04, /* command list DMA addr hi */
+	PORT_FIS_ADDR		= 0x08, /* FIS rx buf addr */
+	PORT_FIS_ADDR_HI	= 0x0c, /* FIS rx buf addr hi */
+	PORT_IRQ_STAT		= 0x10, /* interrupt status */
+	PORT_IRQ_MASK		= 0x14, /* interrupt enable/disable mask */
+	PORT_CMD		= 0x18, /* port command */
+	PORT_TFDATA		= 0x20,	/* taskfile data */
+	PORT_SIG		= 0x24,	/* device TF signature */
+	PORT_CMD_ISSUE		= 0x38, /* command issue */
+	PORT_SCR		= 0x28, /* SATA phy register block */
+	PORT_SCR_STAT		= 0x28, /* SATA phy register: SStatus */
+	PORT_SCR_CTL		= 0x2c, /* SATA phy register: SControl */
+	PORT_SCR_ERR		= 0x30, /* SATA phy register: SError */
+
+	/* PORT_IRQ_{STAT,MASK} bits */
+	PORT_IRQ_COLD_PRES	= (1 << 31), /* cold presence detect */
+	PORT_IRQ_TF_ERR		= (1 << 30), /* task file error */
+	PORT_IRQ_HBUS_ERR	= (1 << 29), /* host bus fatal error */
+	PORT_IRQ_HBUS_DATA_ERR	= (1 << 28), /* host bus data error */
+	PORT_IRQ_IF_ERR		= (1 << 27), /* interface fatal error */
+	PORT_IRQ_IF_NONFATAL	= (1 << 26), /* interface non-fatal error */
+	PORT_IRQ_OVERFLOW	= (1 << 24), /* xfer exhausted available S/G */
+	PORT_IRQ_BAD_PMP	= (1 << 23), /* incorrect port multiplier */
+
+	PORT_IRQ_PHYRDY		= (1 << 22), /* PhyRdy changed */
+	PORT_IRQ_DEV_ILCK	= (1 << 7), /* device interlock */
+	PORT_IRQ_CONNECT	= (1 << 6), /* port connect change status */
+	PORT_IRQ_SG_DONE	= (1 << 5), /* descriptor processed */
+	PORT_IRQ_UNK_FIS	= (1 << 4), /* unknown FIS rx'd */
+	PORT_IRQ_SDB_FIS	= (1 << 3), /* Set Device Bits FIS rx'd */
+	PORT_IRQ_DMAS_FIS	= (1 << 2), /* DMA Setup FIS rx'd */
+	PORT_IRQ_PIOS_FIS	= (1 << 1), /* PIO Setup FIS rx'd */
+	PORT_IRQ_D2H_REG_FIS	= (1 << 0), /* D2H Register FIS rx'd */
+
+	PORT_IRQ_FATAL		= PORT_IRQ_TF_ERR |
+				  PORT_IRQ_HBUS_ERR |
+				  PORT_IRQ_HBUS_DATA_ERR |
+				  PORT_IRQ_IF_ERR,
+	DEF_PORT_IRQ		= PORT_IRQ_FATAL | PORT_IRQ_PHYRDY |
+				  PORT_IRQ_D2H_REG_FIS,
+
+	/* PORT_CMD bits */
+	PORT_CMD_LIST_ON	= (1 << 15), /* cmd list DMA engine running */
+	PORT_CMD_FIS_ON		= (1 << 14), /* FIS DMA engine running */
+	PORT_CMD_FIS_RX		= (1 << 4), /* Enable FIS receive DMA engine */
+	PORT_CMD_POWER_ON	= (1 << 2), /* Power up device */
+	PORT_CMD_SPIN_UP	= (1 << 1), /* Spin up device */
+	PORT_CMD_START		= (1 << 0), /* Enable port DMA engine */
+
+	PORT_CMD_ICC_ACTIVE	= (0x1 << 28), /* Put i/f in active state */
+	PORT_CMD_ICC_PARTIAL	= (0x2 << 28), /* Put i/f in partial state */
+	PORT_CMD_ICC_SLUMBER	= (0x6 << 28), /* Put i/f in slumber state */
+};
+
+struct ahci_cmd_hdr {
+	u32			opts;
+	u32			status;
+	u32			tbl_addr;
+	u32			tbl_addr_hi;
+	u32			reserved[4];
+};
+
+struct ahci_sg {
+	u32			addr;
+	u32			addr_hi;
+	u32			reserved;
+	u32			flags_size;
+};
+
+struct ahci_host_priv {
+	unsigned long		flags;
+	u32			cap;	/* cache of HOST_CAP register */
+	u32			port_map; /* cache of HOST_PORTS_IMPL reg */
+};
+
+struct ahci_port_priv {
+	struct ahci_cmd_hdr	*cmd_slot;
+	dma_addr_t		cmd_slot_dma;
+	void			*cmd_tbl;
+	dma_addr_t		cmd_tbl_dma;
+	struct ahci_sg		*cmd_tbl_sg;
+	void			*rx_fis;
+	dma_addr_t		rx_fis_dma;
+};
+
+static u32 ahci_scr_read (struct ata_port *ap, unsigned int sc_reg);
+static void ahci_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
+static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
+static int ahci_qc_issue(struct ata_queued_cmd *qc);
+static irqreturn_t ahci_interrupt (int irq, void *dev_instance, struct pt_regs *regs);
+static void ahci_phy_reset(struct ata_port *ap);
+static void ahci_irq_clear(struct ata_port *ap);
+static void ahci_eng_timeout(struct ata_port *ap);
+static int ahci_port_start(struct ata_port *ap);
+static void ahci_port_stop(struct ata_port *ap);
+static void ahci_host_stop(struct ata_host_set *host_set);
+static void ahci_qc_prep(struct ata_queued_cmd *qc);
+static u8 ahci_check_status(struct ata_port *ap);
+static inline int ahci_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc);
+
+static Scsi_Host_Template ahci_sht = {
+	.module			= THIS_MODULE,
+	.name			= DRV_NAME,
+	.queuecommand		= ata_scsi_queuecmd,
+	.eh_strategy_handler	= ata_scsi_error,
+	.can_queue		= ATA_DEF_QUEUE,
+	.this_id		= ATA_SHT_THIS_ID,
+	.sg_tablesize		= AHCI_MAX_SG,
+	.max_sectors		= ATA_MAX_SECTORS,
+	.cmd_per_lun		= ATA_SHT_CMD_PER_LUN,
+	.emulated		= ATA_SHT_EMULATED,
+	.use_clustering		= AHCI_USE_CLUSTERING,
+	.proc_name		= DRV_NAME,
+	.dma_boundary		= AHCI_DMA_BOUNDARY,
+	.slave_configure	= ata_scsi_slave_config,
+	.bios_param		= ata_std_bios_param,
+};
+
+static struct ata_port_operations ahci_ops = {
+	.port_disable		= ata_port_disable,
+
+	.check_status		= ahci_check_status,
+	.dev_select		= ata_noop_dev_select,
+
+	.phy_reset		= ahci_phy_reset,
+
+	.qc_prep		= ahci_qc_prep,
+	.qc_issue		= ahci_qc_issue,
+
+	.eng_timeout		= ahci_eng_timeout,
+
+	.irq_handler		= ahci_interrupt,
+	.irq_clear		= ahci_irq_clear,
+
+	.scr_read		= ahci_scr_read,
+	.scr_write		= ahci_scr_write,
+
+	.port_start		= ahci_port_start,
+	.port_stop		= ahci_port_stop,
+	.host_stop		= ahci_host_stop,
+};
+
+static struct ata_port_info ahci_port_info[] = {
+	/* board_ahci */
+	{
+		.sht		= &ahci_sht,
+		.host_flags	= ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
+				  ATA_FLAG_SATA_RESET | ATA_FLAG_MMIO,
+		.pio_mask	= 0x03, /* pio3-4 */
+		.udma_mask	= 0x7f, /* udma0-6 ; FIXME */
+		.port_ops	= &ahci_ops,
+	},
+};
+
+static struct pci_device_id ahci_pci_tbl[] = {
+	{ PCI_VENDOR_ID_INTEL, 0x2652, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+	  board_ahci },
+	{ PCI_VENDOR_ID_INTEL, 0x2653, PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+	  board_ahci },
+	{ }	/* terminate list */
+};
+
+
+static struct pci_driver ahci_pci_driver = {
+	.name			= DRV_NAME,
+	.id_table		= ahci_pci_tbl,
+	.probe			= ahci_init_one,
+	.remove			= ata_pci_remove_one,
+};
+
+
+static inline unsigned long ahci_port_base_ul (unsigned long base, unsigned int port)
+{
+	return base + 0x100 + (port * 0x80);
+}
+
+static inline void *ahci_port_base (void *base, unsigned int port)
+{
+	return (void *) ahci_port_base_ul((unsigned long)base, port);
+}
+
+static void ahci_host_stop(struct ata_host_set *host_set)
+{
+	struct ahci_host_priv *hpriv = host_set->private_data;
+	kfree(hpriv);
+}
+
+static int ahci_port_start(struct ata_port *ap)
+{
+	struct pci_dev *pdev = ap->host_set->pdev;
+	struct ahci_host_priv *hpriv = ap->host_set->private_data;
+	struct ahci_port_priv *pp;
+	int rc;
+	void *mem, *mmio = ap->host_set->mmio_base;
+	void *port_mmio = ahci_port_base(mmio, ap->port_no);
+	dma_addr_t mem_dma;
+
+	rc = ata_port_start(ap);
+	if (rc)
+		return rc;
+
+	pp = kmalloc(sizeof(*pp), GFP_KERNEL);
+	if (!pp) {
+		rc = -ENOMEM;
+		goto err_out;
+	}
+	memset(pp, 0, sizeof(*pp));
+
+	mem = pci_alloc_consistent(pdev, AHCI_PORT_PRIV_DMA_SZ, &mem_dma);
+	if (!mem) {
+		rc = -ENOMEM;
+		goto err_out_kfree;
+	}
+	memset(mem, 0, AHCI_PORT_PRIV_DMA_SZ);
+
+	/*
+	 * First item in chunk of DMA memory: 32-slot command table,
+	 * 32 bytes each in size
+	 */
+	pp->cmd_slot = mem;
+	pp->cmd_slot_dma = mem_dma;
+
+	mem += AHCI_CMD_SLOT_SZ;
+	mem_dma += AHCI_CMD_SLOT_SZ;
+
+	/*
+	 * Second item: Received-FIS area
+	 */
+	pp->rx_fis = mem;
+	pp->rx_fis_dma = mem_dma;
+
+	mem += AHCI_RX_FIS_SZ;
+	mem_dma += AHCI_RX_FIS_SZ;
+
+	/*
+	 * Third item: data area for storing a single command
+	 * and its scatter-gather table
+	 */
+	pp->cmd_tbl = mem;
+	pp->cmd_tbl_dma = mem_dma;
+
+	pp->cmd_tbl_sg = mem + AHCI_CMD_TBL_HDR;
+
+	ap->private_data = pp;
+
+	if (hpriv->cap & HOST_CAP_64)
+		writel((pp->cmd_slot_dma >> 16) >> 16, port_mmio + PORT_LST_ADDR_HI);
+	writel(pp->cmd_slot_dma & 0xffffffff, port_mmio + PORT_LST_ADDR);
+	readl(port_mmio + PORT_LST_ADDR); /* flush */
+
+	if (hpriv->cap & HOST_CAP_64)
+		writel((pp->rx_fis_dma >> 16) >> 16, port_mmio + PORT_FIS_ADDR_HI);
+	writel(pp->rx_fis_dma & 0xffffffff, port_mmio + PORT_LST_ADDR);
+	readl(port_mmio + PORT_LST_ADDR); /* flush */
+
+	writel(PORT_CMD_ICC_ACTIVE | PORT_CMD_FIS_RX |
+	       PORT_CMD_POWER_ON | PORT_CMD_SPIN_UP |
+	       PORT_CMD_START, port_mmio + PORT_CMD);
+	readl(port_mmio + PORT_CMD); /* flush */
+
+	return 0;
+
+err_out_kfree:
+	kfree(pp);
+err_out:
+	ata_port_stop(ap);
+	return rc;
+}
+
+
+static void ahci_port_stop(struct ata_port *ap)
+{
+	struct pci_dev *pdev = ap->host_set->pdev;
+	struct ahci_port_priv *pp = ap->private_data;
+	void *mmio = ap->host_set->mmio_base;
+	void *port_mmio = ahci_port_base(mmio, ap->port_no);
+	u32 tmp;
+
+	tmp = readl(port_mmio + PORT_CMD);
+	tmp &= ~(PORT_CMD_START | PORT_CMD_FIS_RX);
+	writel(tmp, port_mmio + PORT_CMD);
+	readl(port_mmio + PORT_CMD); /* flush */
+
+	/* spec says 500 msecs for each PORT_CMD_{START,FIS_RX} bit, so
+	 * this is slightly incorrect.
+	 */
+	set_current_state(TASK_UNINTERRUPTIBLE);
+	schedule_timeout((HZ / 2) + 1);
+
+	ap->private_data = NULL;
+	pci_free_consistent(pdev, AHCI_PORT_PRIV_DMA_SZ,
+			    pp->cmd_slot, pp->cmd_slot_dma);
+	kfree(pp);
+	ata_port_stop(ap);
+}
+
+static u32 ahci_scr_read (struct ata_port *ap, unsigned int sc_reg_in)
+{
+	unsigned int sc_reg;
+
+	switch (sc_reg_in) {
+	case SCR_STATUS:	sc_reg = 0; break;
+	case SCR_CONTROL:	sc_reg = 1; break;
+	case SCR_ERROR:		sc_reg = 2; break;
+	case SCR_ACTIVE:	sc_reg = 3; break;
+	default:
+		return 0xffffffffU;
+	}
+
+	return readl((void *) ap->ioaddr.scr_addr + (sc_reg * 4));
+}
+
+
+static void ahci_scr_write (struct ata_port *ap, unsigned int sc_reg_in,
+			       u32 val)
+{
+	unsigned int sc_reg;
+
+	switch (sc_reg_in) {
+	case SCR_STATUS:	sc_reg = 0; break;
+	case SCR_CONTROL:	sc_reg = 1; break;
+	case SCR_ERROR:		sc_reg = 2; break;
+	case SCR_ACTIVE:	sc_reg = 3; break;
+	default:
+		return;
+	}
+
+	writel(val, (void *) ap->ioaddr.scr_addr + (sc_reg * 4));
+}
+
+static void ahci_phy_reset(struct ata_port *ap)
+{
+	void __iomem *port_mmio = (void __iomem *) ap->ioaddr.cmd_addr;
+	struct ata_taskfile tf;
+	struct ata_device *dev = &ap->device[0];
+	u32 tmp;
+
+	__sata_phy_reset(ap);
+
+	if (ap->flags & ATA_FLAG_PORT_DISABLED)
+		return;
+
+	tmp = readl(port_mmio + PORT_SIG);
+	tf.lbah		= (tmp >> 24)	& 0xff;
+	tf.lbam		= (tmp >> 16)	& 0xff;
+	tf.lbal		= (tmp >> 8)	& 0xff;
+	tf.nsect	= (tmp)		& 0xff;
+
+	dev->class = ata_dev_classify(&tf);
+	if (!ata_dev_present(dev))
+		ata_port_disable(ap);
+}
+
+static u8 ahci_check_status(struct ata_port *ap)
+{
+	void *mmio = (void *) ap->ioaddr.cmd_addr;
+
+	return readl(mmio + PORT_TFDATA) & 0xFF;
+}
+
+static void ahci_fill_sg(struct ata_queued_cmd *qc)
+{
+	struct ahci_port_priv *pp = qc->ap->private_data;
+	unsigned int i;
+
+	VPRINTK("ENTER\n");
+
+	/*
+	 * Next, the S/G list.
+	 */
+	for (i = 0; i < qc->n_elem; i++) {
+		u32 sg_len;
+		dma_addr_t addr;
+
+		addr = sg_dma_address(&qc->sg[i]);
+		sg_len = sg_dma_len(&qc->sg[i]);
+
+		pp->cmd_tbl_sg[i].addr = cpu_to_le32(addr & 0xffffffff);
+		pp->cmd_tbl_sg[i].addr_hi = cpu_to_le32((addr >> 16) >> 16);
+		pp->cmd_tbl_sg[i].flags_size = cpu_to_le32(sg_len - 1);
+	}
+}
+
+static void ahci_qc_prep(struct ata_queued_cmd *qc)
+{
+	struct ahci_port_priv *pp = qc->ap->private_data;
+	u32 opts;
+	const u32 cmd_fis_len = 5; /* five dwords */
+
+	/*
+	 * Fill in command slot information (currently only one slot,
+	 * slot 0, is currently since we don't do queueing)
+	 */
+
+	opts = (qc->n_elem << 16) | cmd_fis_len;
+	if (qc->tf.flags & ATA_TFLAG_WRITE)
+		opts |= AHCI_CMD_WRITE;
+
+	switch (qc->tf.protocol) {
+	case ATA_PROT_ATAPI:
+	case ATA_PROT_ATAPI_NODATA:
+	case ATA_PROT_ATAPI_DMA:
+		opts |= AHCI_CMD_ATAPI;
+		break;
+
+	default:
+		/* do nothing */
+		break;
+	}
+
+	pp->cmd_slot[0].opts = cpu_to_le32(opts);
+	pp->cmd_slot[0].status = 0;
+	pp->cmd_slot[0].tbl_addr = cpu_to_le32(pp->cmd_tbl_dma & 0xffffffff);
+	pp->cmd_slot[0].tbl_addr_hi = cpu_to_le32((pp->cmd_tbl_dma >> 16) >> 16);
+
+	/*
+	 * Fill in command table information.  First, the header,
+	 * a SATA Register - Host to Device command FIS.
+	 */
+	ata_tf_to_fis(&qc->tf, pp->cmd_tbl, 0);
+
+	if (!(qc->flags & ATA_QCFLAG_DMAMAP))
+		return;
+
+	ahci_fill_sg(qc);
+}
+
+static inline void ahci_dma_complete (struct ata_port *ap,
+                                     struct ata_queued_cmd *qc,
+				     int have_err)
+{
+	/* get drive status; clear intr; complete txn */
+	ata_qc_complete(ata_qc_from_tag(ap, ap->active_tag),
+			have_err ? ATA_ERR : 0);
+}
+
+static void ahci_intr_error(struct ata_port *ap, u32 irq_stat)
+{
+	void *mmio = ap->host_set->mmio_base;
+	void *port_mmio = ahci_port_base(mmio, ap->port_no);
+	u32 tmp;
+	int work;
+
+	/* stop DMA */
+	tmp = readl(port_mmio + PORT_CMD);
+	tmp &= PORT_CMD_START | PORT_CMD_FIS_RX;
+	writel(tmp, port_mmio + PORT_CMD);
+
+	/* wait for engine to stop.  TODO: this could be
+	 * as long as 500 msec
+	 */
+	work = 1000;
+	while (work-- > 0) {
+		tmp = readl(port_mmio + PORT_CMD);
+		if ((tmp & PORT_CMD_LIST_ON) == 0)
+			break;
+		udelay(10);
+	}
+
+	/* clear SATA phy error, if any */
+	tmp = readl(port_mmio + PORT_SCR_ERR);
+	writel(tmp, port_mmio + PORT_SCR_ERR);
+
+	/* if DRQ/BSY is set, device needs to be reset.
+	 * if so, issue COMRESET
+	 */
+	tmp = readl(port_mmio + PORT_TFDATA);
+	if (tmp & (ATA_BUSY | ATA_DRQ)) {
+		writel(0x301, port_mmio + PORT_SCR_CTL);
+		readl(port_mmio + PORT_SCR_CTL); /* flush */
+		udelay(10);
+		writel(0x300, port_mmio + PORT_SCR_CTL);
+		readl(port_mmio + PORT_SCR_CTL); /* flush */
+	}
+
+	/* re-start DMA */
+	tmp = readl(port_mmio + PORT_CMD);
+	tmp |= PORT_CMD_START | PORT_CMD_FIS_RX;
+	writel(tmp, port_mmio + PORT_CMD);
+	readl(port_mmio + PORT_CMD); /* flush */
+
+	printk(KERN_WARNING "ata%u: error occurred, port reset\n", ap->port_no);
+}
+
+static void ahci_eng_timeout(struct ata_port *ap)
+{
+	void *mmio = ap->host_set->mmio_base;
+	void *port_mmio = ahci_port_base(mmio, ap->port_no);
+	struct ata_queued_cmd *qc;
+
+	DPRINTK("ENTER\n");
+
+	ahci_intr_error(ap, readl(port_mmio + PORT_IRQ_STAT));
+
+	qc = ata_qc_from_tag(ap, ap->active_tag);
+	if (!qc) {
+		printk(KERN_ERR "ata%u: BUG: timeout without command\n",
+		       ap->id);
+	} else {
+		/* hack alert!  We cannot use the supplied completion
+	 	 * function from inside the ->eh_strategy_handler() thread.
+	 	 * libata is the only user of ->eh_strategy_handler() in
+	 	 * any kernel, so the default scsi_done() assumes it is
+	 	 * not being called from the SCSI EH.
+	 	 */
+		qc->scsidone = scsi_finish_command;
+		ata_qc_complete(qc, ATA_ERR);
+	}
+
+}
+
+static inline int ahci_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc)
+{
+	void *mmio = ap->host_set->mmio_base;
+	void *port_mmio = ahci_port_base(mmio, ap->port_no);
+	u32 status, serr, ci;
+
+	serr = readl(port_mmio + PORT_SCR_ERR);
+	writel(serr, port_mmio + PORT_SCR_ERR);
+
+	status = readl(port_mmio + PORT_IRQ_STAT);
+	writel(status, port_mmio + PORT_IRQ_STAT);
+
+	ci = readl(port_mmio + PORT_CMD_ISSUE);
+	if (likely((ci & 0x1) == 0)) {
+		if (qc) {
+			ata_qc_complete(qc, 0);
+			qc = NULL;
+		}
+	}
+
+	if (status & PORT_IRQ_FATAL) {
+		ahci_intr_error(ap, status);
+		if (qc)
+			ata_qc_complete(qc, ATA_ERR);
+	}
+
+	return 1;
+}
+
+static void ahci_irq_clear(struct ata_port *ap)
+{
+	/* TODO */
+}
+
+static irqreturn_t ahci_interrupt (int irq, void *dev_instance, struct pt_regs *regs)
+{
+	struct ata_host_set *host_set = dev_instance;
+	struct ahci_host_priv *hpriv;
+	unsigned int i, handled = 0;
+	void *mmio;
+	u32 irq_stat, irq_ack = 0;
+
+	VPRINTK("ENTER\n");
+
+	hpriv = host_set->private_data;
+	mmio = host_set->mmio_base;
+
+	/* sigh.  0xffffffff is a valid return from h/w */
+	irq_stat = readl(mmio + HOST_IRQ_STAT);
+	irq_stat &= hpriv->port_map;
+	if (!irq_stat)
+		return IRQ_NONE;
+
+        spin_lock(&host_set->lock);
+
+        for (i = 0; i < host_set->n_ports; i++) {
+		struct ata_port *ap;
+		u32 tmp;
+
+		VPRINTK("port %u\n", i);
+		ap = host_set->ports[i];
+		tmp = irq_stat & (1 << i);
+		if (tmp && ap) {
+			struct ata_queued_cmd *qc;
+			qc = ata_qc_from_tag(ap, ap->active_tag);
+			if (ahci_host_intr(ap, qc))
+				irq_ack |= (1 << i);
+		}
+	}
+
+	if (irq_ack) {
+		writel(irq_ack, mmio + HOST_IRQ_STAT);
+		handled = 1;
+	}
+
+        spin_unlock(&host_set->lock);
+
+	VPRINTK("EXIT\n");
+
+	return IRQ_RETVAL(handled);
+}
+
+static int ahci_qc_issue(struct ata_queued_cmd *qc)
+{
+	struct ata_port *ap = qc->ap;
+	void *mmio = (void *) ap->ioaddr.cmd_addr;
+
+	writel(1, mmio + PORT_CMD_ISSUE);
+	readl(mmio + PORT_CMD_ISSUE);	/* flush */
+
+	return 0;
+}
+
+static void ahci_setup_port(struct ata_ioports *port, unsigned long base,
+			    unsigned int port_idx)
+{
+	VPRINTK("ENTER, base==0x%lx, port_idx %u\n", base, port_idx);
+	base = ahci_port_base_ul(base, port_idx);
+	VPRINTK("base now==0x%lx\n", base);
+
+	port->cmd_addr		= base;
+	port->scr_addr		= base + PORT_SCR;
+
+	VPRINTK("EXIT\n");
+}
+
+static int ahci_host_init(struct ata_probe_ent *probe_ent)
+{
+	struct ahci_host_priv *hpriv = probe_ent->private_data;
+	struct pci_dev *pdev = probe_ent->pdev;
+	void __iomem *mmio = probe_ent->mmio_base;
+	u32 tmp, cap_save;
+	u16 tmp16;
+	unsigned int i, j, using_dac;
+	int rc;
+	void __iomem *port_mmio;
+
+	cap_save = readl(mmio + HOST_CAP);
+	cap_save &= ( (1<<28) | (1<<17) );
+	cap_save |= (1 << 27);
+
+	/* global controller reset */
+	tmp = readl(mmio + HOST_CTL);
+	if ((tmp & HOST_RESET) == 0) {
+		writel(tmp | HOST_RESET, mmio + HOST_CTL);
+		readl(mmio + HOST_CTL); /* flush */
+	}
+
+	/* reset must complete within 1 second, or
+	 * the hardware should be considered fried.
+	 */
+	set_current_state(TASK_UNINTERRUPTIBLE);
+	schedule_timeout(HZ + 1);
+
+	tmp = readl(mmio + HOST_CTL);
+	if (tmp & HOST_RESET) {
+		printk(KERN_ERR DRV_NAME "(%s): controller reset failed (0x%x)\n",
+			pci_name(pdev), tmp);
+		return -EIO;
+	}
+
+	writel(HOST_AHCI_EN, mmio + HOST_CTL);
+	(void) readl(mmio + HOST_CTL);	/* flush */
+	writel(cap_save, mmio + HOST_CAP);
+	writel(0xf, mmio + HOST_PORTS_IMPL);
+	(void) readl(mmio + HOST_PORTS_IMPL);	/* flush */
+
+	pci_read_config_word(pdev, 0x92, &tmp16);
+	tmp16 |= 0xf;
+	pci_write_config_word(pdev, 0x92, tmp16);
+
+	hpriv->cap = readl(mmio + HOST_CAP);
+	hpriv->port_map = readl(mmio + HOST_PORTS_IMPL);
+	probe_ent->n_ports = (hpriv->cap & 0x1f) + 1;
+
+	VPRINTK("cap 0x%x  port_map 0x%x  n_ports %d\n",
+		hpriv->cap, hpriv->port_map, probe_ent->n_ports);
+
+	using_dac = hpriv->cap & HOST_CAP_64;
+	if (using_dac &&
+	    !pci_set_dma_mask(pdev, 0xffffffffffffffffULL)) {
+		rc = pci_set_consistent_dma_mask(pdev, 0xffffffffffffffffULL);
+		if (rc) {
+			rc = pci_set_consistent_dma_mask(pdev, 0xffffffffULL);
+			if (rc) {
+				printk(KERN_ERR DRV_NAME "(%s): 64-bit DMA enable failed\n",
+					pci_name(pdev));
+				return rc;
+			}
+		}
+
+		hpriv->flags |= HOST_CAP_64;
+	} else {
+		rc = pci_set_dma_mask(pdev, 0xffffffffULL);
+		if (rc) {
+			printk(KERN_ERR DRV_NAME "(%s): 32-bit DMA enable failed\n",
+				pci_name(pdev));
+			return rc;
+		}
+		rc = pci_set_consistent_dma_mask(pdev, 0xffffffffULL);
+		if (rc) {
+			printk(KERN_ERR DRV_NAME "(%s): 32-bit consistent DMA enable failed\n",
+				pci_name(pdev));
+			return rc;
+		}
+	}
+
+	for (i = 0; i < probe_ent->n_ports; i++) {
+		if (!(hpriv->port_map & (1 << i)))
+			continue;
+
+		port_mmio = ahci_port_base(mmio, i);
+		VPRINTK("mmio %p  port_mmio %p\n", mmio, port_mmio);
+
+		ahci_setup_port(&probe_ent->port[i],
+				(unsigned long) mmio, i);
+
+		/* make sure port is not active */
+		tmp = readl(port_mmio + PORT_CMD);
+		VPRINTK("PORT_CMD 0x%x\n", tmp);
+		if (tmp & (PORT_CMD_LIST_ON | PORT_CMD_FIS_ON |
+			   PORT_CMD_FIS_RX | PORT_CMD_START)) {
+			tmp &= ~(PORT_CMD_LIST_ON | PORT_CMD_FIS_ON |
+				 PORT_CMD_FIS_RX | PORT_CMD_START);
+			writel(tmp, port_mmio + PORT_CMD);
+			readl(port_mmio + PORT_CMD); /* flush */
+
+			/* spec says 500 msecs for each bit, so
+			 * this is slightly incorrect.
+			 */
+			set_current_state(TASK_UNINTERRUPTIBLE);
+			schedule_timeout((HZ / 2) + 1);
+		}
+
+		writel(PORT_CMD_SPIN_UP, port_mmio + PORT_CMD);
+
+		j = 0;
+		while (j < 100) {
+			msleep(10);
+			tmp = readl(port_mmio + PORT_SCR_STAT);
+			if ((tmp & 0xf) == 0x3)
+				break;
+			j++;
+		}
+
+		tmp = readl(port_mmio + PORT_SCR_ERR);
+		VPRINTK("PORT_SCR_ERR 0x%x\n", tmp);
+		writel(tmp, port_mmio + PORT_SCR_ERR);
+
+		/* ack any pending irq events for this port */
+		tmp = readl(port_mmio + PORT_IRQ_STAT);
+		VPRINTK("PORT_IRQ_STAT 0x%x\n", tmp);
+		if (tmp)
+			writel(tmp, port_mmio + PORT_IRQ_STAT);
+
+		writel(1 << i, mmio + HOST_IRQ_STAT);
+
+		/* set irq mask (enables interrupts) */
+		writel(DEF_PORT_IRQ, port_mmio + PORT_IRQ_MASK);
+	}
+
+	tmp = readl(mmio + HOST_CTL);
+	VPRINTK("HOST_CTL 0x%x\n", tmp);
+	writel(tmp | HOST_IRQ_EN, mmio + HOST_CTL);
+	tmp = readl(mmio + HOST_CTL);
+	VPRINTK("HOST_CTL 0x%x\n", tmp);
+
+	pci_set_master(pdev);
+
+	return 0;
+}
+
+/* move to PCI layer, integrate w/ MSI stuff */
+static void pci_enable_intx(struct pci_dev *pdev)
+{
+	u16 pci_command;
+
+	pci_read_config_word(pdev, PCI_COMMAND, &pci_command);
+	if (pci_command & PCI_COMMAND_INTX_DISABLE) {
+		pci_command &= ~PCI_COMMAND_INTX_DISABLE;
+		pci_write_config_word(pdev, PCI_COMMAND, pci_command);
+	}
+}
+
+static void ahci_print_info(struct ata_probe_ent *probe_ent)
+{
+	struct ahci_host_priv *hpriv = probe_ent->private_data;
+	struct pci_dev *pdev = probe_ent->pdev;
+	void *mmio = probe_ent->mmio_base;
+	u32 vers, cap, impl, speed;
+	const char *speed_s;
+
+	vers = readl(mmio + HOST_VERSION);
+	cap = hpriv->cap;
+	impl = hpriv->port_map;
+
+	speed = (cap >> 20) & 0xf;
+	if (speed == 1)
+		speed_s = "1.5";
+	else if (speed == 2)
+		speed_s = "3";
+	else
+		speed_s = "?";
+
+	printk(KERN_INFO DRV_NAME "(%s) AHCI %02x%02x.%02x%02x "
+		"%u slots %u ports %s Gbps 0x%x impl\n"
+	       	,
+	       	pci_name(pdev),
+
+	       	(vers >> 24) & 0xff,
+	       	(vers >> 16) & 0xff,
+	       	(vers >> 8) & 0xff,
+	       	vers & 0xff,
+
+		((cap >> 8) & 0x1f) + 1,
+		(cap & 0x1f) + 1,
+		speed_s,
+		impl);
+
+	printk(KERN_INFO DRV_NAME "(%s) flags: "
+	       	"%s%s%s%s%s%s"
+	       	"%s%s%s%s%s%s%s\n"
+	       	,
+	       	pci_name(pdev),
+
+		cap & (1 << 31) ? "64bit " : "",
+		cap & (1 << 30) ? "ncq " : "",
+		cap & (1 << 28) ? "ilck " : "",
+		cap & (1 << 27) ? "stag " : "",
+		cap & (1 << 26) ? "pm " : "",
+		cap & (1 << 25) ? "led " : "",
+
+		cap & (1 << 24) ? "clo " : "",
+		cap & (1 << 19) ? "nz " : "",
+		cap & (1 << 18) ? "only " : "",
+		cap & (1 << 17) ? "pmp " : "",
+		cap & (1 << 15) ? "pio " : "",
+		cap & (1 << 14) ? "slum " : "",
+		cap & (1 << 13) ? "part " : ""
+		);
+}
+
+static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
+{
+	static int printed_version;
+	struct ata_probe_ent *probe_ent = NULL;
+	struct ahci_host_priv *hpriv;
+	unsigned long base;
+	void *mmio_base;
+	unsigned int board_idx = (unsigned int) ent->driver_data;
+	int rc;
+
+	VPRINTK("ENTER\n");
+
+	if (!printed_version++)
+		printk(KERN_DEBUG DRV_NAME " version " DRV_VERSION "\n");
+
+	/*
+	 * If this driver happens to only be useful on Apple's K2, then
+	 * we should check that here as it has a normal Serverworks ID
+	 */
+	rc = pci_enable_device(pdev);
+	if (rc)
+		return rc;
+
+	rc = pci_request_regions(pdev, DRV_NAME);
+	if (rc)
+		goto err_out;
+
+	pci_enable_intx(pdev);
+
+	probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
+	if (probe_ent == NULL) {
+		rc = -ENOMEM;
+		goto err_out_regions;
+	}
+
+	memset(probe_ent, 0, sizeof(*probe_ent));
+	probe_ent->pdev = pdev;
+	INIT_LIST_HEAD(&probe_ent->node);
+
+	mmio_base = ioremap(pci_resource_start(pdev, AHCI_PCI_BAR),
+		            pci_resource_len(pdev, AHCI_PCI_BAR));
+	if (mmio_base == NULL) {
+		rc = -ENOMEM;
+		goto err_out_free_ent;
+	}
+	base = (unsigned long) mmio_base;
+
+	hpriv = kmalloc(sizeof(*hpriv), GFP_KERNEL);
+	if (!hpriv) {
+		rc = -ENOMEM;
+		goto err_out_iounmap;
+	}
+	memset(hpriv, 0, sizeof(*hpriv));
+
+	probe_ent->sht		= ahci_port_info[board_idx].sht;
+	probe_ent->host_flags	= ahci_port_info[board_idx].host_flags;
+	probe_ent->pio_mask	= ahci_port_info[board_idx].pio_mask;
+	probe_ent->udma_mask	= ahci_port_info[board_idx].udma_mask;
+	probe_ent->port_ops	= ahci_port_info[board_idx].port_ops;
+
+       	probe_ent->irq = pdev->irq;
+       	probe_ent->irq_flags = SA_SHIRQ;
+	probe_ent->mmio_base = mmio_base;
+	probe_ent->private_data = hpriv;
+
+	/* initialize adapter */
+	rc = ahci_host_init(probe_ent);
+	if (rc)
+		goto err_out_hpriv;
+
+	ahci_print_info(probe_ent);
+
+	/* FIXME: check ata_device_add return value */
+	ata_device_add(probe_ent);
+	kfree(probe_ent);
+
+	return 0;
+
+err_out_hpriv:
+	kfree(hpriv);
+err_out_iounmap:
+	iounmap(mmio_base);
+err_out_free_ent:
+	kfree(probe_ent);
+err_out_regions:
+	pci_release_regions(pdev);
+err_out:
+	pci_disable_device(pdev);
+	return rc;
+}
+
+
+static int __init ahci_init(void)
+{
+	return pci_module_init(&ahci_pci_driver);
+}
+
+
+static void __exit ahci_exit(void)
+{
+	pci_unregister_driver(&ahci_pci_driver);
+}
+
+
+MODULE_AUTHOR("Jeff Garzik");
+MODULE_DESCRIPTION("AHCI SATA low-level driver");
+MODULE_LICENSE("GPL");
+MODULE_DEVICE_TABLE(pci, ahci_pci_tbl);
+
+module_init(ahci_init);
+module_exit(ahci_exit);
diff -Nru a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c
--- a/drivers/scsi/libata-core.c	2004-10-15 03:08:20 -04:00
+++ b/drivers/scsi/libata-core.c	2004-10-15 03:08:20 -04:00
@@ -829,17 +829,17 @@
  *	caller.
  */
 
-void ata_dev_id_string(struct ata_device *dev, unsigned char *s,
+void ata_dev_id_string(u16 *id, unsigned char *s,
 		       unsigned int ofs, unsigned int len)
 {
 	unsigned int c;
 
 	while (len > 0) {
-		c = dev->id[ofs] >> 8;
+		c = id[ofs] >> 8;
 		*s = c;
 		s++;
 
-		c = dev->id[ofs] & 0xff;
+		c = id[ofs] & 0xff;
 		*s = c;
 		s++;
 
@@ -1082,7 +1082,7 @@
 	 */
 
 	/* we require LBA and DMA support (bits 8 & 9 of word 49) */
-	if (!ata_id_has_dma(dev) || !ata_id_has_lba(dev)) {
+	if (!ata_id_has_dma(dev->id) || !ata_id_has_lba(dev->id)) {
 		printk(KERN_DEBUG "ata%u: no dma/lba\n", ap->id);
 		goto err_out_nosup;
 	}
@@ -1100,7 +1100,7 @@
 
 	/* ATA-specific feature tests */
 	if (dev->class == ATA_DEV_ATA) {
-		if (!ata_id_is_ata(dev))	/* sanity check */
+		if (!ata_id_is_ata(dev->id))	/* sanity check */
 			goto err_out_nosup;
 
 		tmp = dev->id[ATA_ID_MAJOR_VER];
@@ -1114,11 +1114,11 @@
 			goto err_out_nosup;
 		}
 
-		if (ata_id_has_lba48(dev)) {
+		if (ata_id_has_lba48(dev->id)) {
 			dev->flags |= ATA_DFLAG_LBA48;
-			dev->n_sectors = ata_id_u64(dev, 100);
+			dev->n_sectors = ata_id_u64(dev->id, 100);
 		} else {
-			dev->n_sectors = ata_id_u32(dev, 60);
+			dev->n_sectors = ata_id_u32(dev->id, 60);
 		}
 
 		ap->host->max_cmd_len = 16;
@@ -1133,7 +1133,7 @@
 
 	/* ATAPI-specific feature tests */
 	else {
-		if (ata_id_is_ata(dev))		/* sanity check */
+		if (ata_id_is_ata(dev->id))		/* sanity check */
 			goto err_out_nosup;
 
 		rc = atapi_cdb_len(dev->id);
@@ -1162,6 +1162,49 @@
 	DPRINTK("EXIT, err\n");
 }
 
+
+static inline u8 ata_dev_knobble(struct ata_port *ap)
+{
+	struct ata_device *dev;
+	int i;
+
+	if (ap->cbl != ATA_CBL_SATA)
+		return 0;
+	
+	for (i = 0; i < ATA_MAX_DEVICES; i++) {
+		dev = &ap->device[i];
+		if (ata_dev_present(dev) && (!ata_id_is_sata(dev->id)))
+			return 1;
+	}
+
+	return 0;
+}
+
+/**
+ * 	ata_dev_config - Run device specific handlers and check for
+ * 			 SATA->PATA bridges
+ * 	@ap: Bus 
+ * 	@i:  Device
+ *
+ * 	LOCKING:
+ */
+ 
+void ata_dev_config(struct ata_port *ap, unsigned int i)
+{
+	/* limit bridge transfers to udma5, 200 sectors */
+	if (ata_dev_knobble(ap)) {
+		printk(KERN_INFO "ata%u(%u): applying bridge limits\n",
+			ap->id, ap->device->devno);
+		ap->udma_mask &= ATA_UDMA5;
+		ap->host->max_sectors = ATA_MAX_SECTORS;
+		ap->host->hostt->max_sectors = ATA_MAX_SECTORS;
+		ap->device->flags |= ATA_DFLAG_LOCK_SECTORS;
+	}
+
+	if (ap->ops->dev_config)
+		ap->ops->dev_config(ap, &ap->device[i]);
+}
+
 /**
  *	ata_bus_probe - Reset and probe ATA bus
  *	@ap: Bus to probe
@@ -1184,8 +1227,7 @@
 		ata_dev_identify(ap, i);
 		if (ata_dev_present(&ap->device[i])) {
 			found = 1;
-			if (ap->ops->dev_config)
-				ap->ops->dev_config(ap, &ap->device[i]);
+			ata_dev_config(ap,i);
 		}
 	}
 
@@ -1946,7 +1988,7 @@
 	sg->offset = (unsigned long) buf & ~PAGE_MASK;
 	sg_dma_len(sg) = buflen;
 
-	WARN_ON(buflen > PAGE_SIZE);
+//    WARN_ON(buflen > PAGE_SIZE);
 }
 
 void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg,
@@ -3038,6 +3080,7 @@
 	ap->mwdma_mask = ent->mwdma_mask;
 	ap->udma_mask = ent->udma_mask;
 	ap->flags |= ent->host_flags;
+	ap->flags |= ent->port_flags[port_no];
 	ap->ops = ent->port_ops;
 	ap->cbl = ATA_CBL_NONE;
 	ap->active_tag = ATA_TAG_POISON;
@@ -3660,6 +3703,8 @@
 EXPORT_SYMBOL_GPL(ata_scsi_error);
 EXPORT_SYMBOL_GPL(ata_scsi_slave_config);
 EXPORT_SYMBOL_GPL(ata_scsi_release);
+EXPORT_SYMBOL_GPL(ata_scsi_simulate);
 EXPORT_SYMBOL_GPL(ata_host_intr);
 EXPORT_SYMBOL_GPL(ata_dev_classify);
 EXPORT_SYMBOL_GPL(ata_dev_id_string);
+EXPORT_SYMBOL_GPL(ata_dev_config);
diff -Nru a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c
--- a/drivers/scsi/libata-scsi.c	2004-10-15 03:08:20 -04:00
+++ b/drivers/scsi/libata-scsi.c	2004-10-15 03:08:20 -04:00
@@ -29,14 +29,14 @@
 #include "scsi.h"
 #include <scsi/scsi_host.h>
 #include <linux/libata.h>
+#include <linux/hdreg.h>
 #include <asm/uaccess.h>
 
 #include "libata.h"
 
+#define SECTOR_SIZE	512
+
 typedef unsigned int (*ata_xlat_func_t)(struct ata_queued_cmd *qc, u8 *scsicmd);
-static void ata_scsi_simulate(struct ata_port *ap, struct ata_device *dev,
-			      struct scsi_cmnd *cmd,
-			      void (*done)(struct scsi_cmnd *));
 static struct ata_device *
 ata_scsi_find_dev(struct ata_port *ap, struct scsi_device *scsidev);
 
@@ -70,6 +70,146 @@
 	return 0;
 }
 
+/**
+ *	ata_cmd_ioctl - Handler for HDIO_DRIVE_CMD ioctl
+ *	@dev: Device to whom we are issuing command
+ *	@arg: User provided data for issuing command
+ *
+ *	LOCKING:
+ *	Defined by the SCSI layer.  We don't really care.
+ *
+ *	RETURNS:
+ *	Zero on success, negative errno on error.
+ */
+
+int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg)
+{
+	int rc = 0;
+	u8 scsi_cmd[MAX_COMMAND_SIZE];
+	u8 args[4], *argbuf = NULL;
+	int argsize = 0;
+	struct scsi_request *sreq;
+
+	if (NULL == (void *)arg)
+		return -EINVAL;
+
+	if (copy_from_user(args, arg, sizeof(args)))
+		return -EFAULT;
+
+	sreq = scsi_allocate_request(scsidev, GFP_KERNEL);
+	if (!sreq)
+		return -EINTR;
+
+	memset(scsi_cmd, 0, sizeof(scsi_cmd));
+
+	if (args[3]) {
+		argsize = SECTOR_SIZE * args[3];
+		argbuf = kmalloc(argsize, GFP_KERNEL);
+		if (argbuf == NULL)
+			return -ENOMEM;
+
+		scsi_cmd[1]  = (4 << 1); /* PIO Data-in */
+		sreq->sr_data_direction = DMA_FROM_DEVICE;
+	} else {
+		scsi_cmd[1]  = (3 << 1); /* Non-data */
+		sreq->sr_data_direction = DMA_NONE;
+	}
+
+	scsi_cmd[0] = ATA_16;
+	scsi_cmd[2] = 0x1f;     /* no off.line or cc, yes all registers */
+
+	scsi_cmd[4] = args[2];
+	if (args[0] == WIN_SMART) { /* hack -- ide driver does this too... */
+		scsi_cmd[6]  = args[3];
+		scsi_cmd[8]  = args[1];
+		scsi_cmd[10] = 0x4f;
+		scsi_cmd[12] = 0xc2;
+	} else {
+		scsi_cmd[6]  = args[1];
+	}
+	scsi_cmd[14] = args[0];
+
+	/* Good values for timeout and retries?  Values below
+	   from scsi_ioctl_send_command() for default case... */
+	scsi_wait_req(sreq, scsi_cmd, argbuf, argsize, (10*HZ), 5);
+
+	if (sreq->sr_result) {
+		rc = -EIO;
+		goto error;
+	}
+
+	/* Need code to retrieve data from check condition? */
+
+	if ((argbuf)
+	 && copy_to_user((void *)(arg + sizeof(args)), argbuf, argsize))
+		rc = -EFAULT;
+error:
+	scsi_release_request(sreq);
+
+	if (argbuf)
+		kfree(argbuf);
+
+	return rc;
+}
+
+/**
+ *	ata_task_ioctl - Handler for HDIO_DRIVE_TASK ioctl
+ *	@dev: Device to whom we are issuing command
+ *	@arg: User provided data for issuing command
+ *
+ *	LOCKING:
+ *	Defined by the SCSI layer.  We don't really care.
+ *
+ *	RETURNS:
+ *	Zero on success, negative errno on error.
+ */
+int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg)
+{
+	int rc = 0;
+	u8 scsi_cmd[MAX_COMMAND_SIZE];
+	u8 args[7];
+	struct scsi_request *sreq;
+
+	if (NULL == (void *)arg)
+		return -EINVAL;
+
+	if (copy_from_user(args, arg, sizeof(args)))
+		return -EFAULT;
+
+	memset(scsi_cmd, 0, sizeof(scsi_cmd));
+	scsi_cmd[0]  = ATA_16;
+	scsi_cmd[1]  = (3 << 1); /* Non-data */
+	scsi_cmd[2]  = 0x1f;     /* no off.line or cc, yes all registers */
+	scsi_cmd[4]  = args[1];
+	scsi_cmd[6]  = args[2];
+	scsi_cmd[8]  = args[3];
+	scsi_cmd[10] = args[4];
+	scsi_cmd[12] = args[5];
+	scsi_cmd[14] = args[0];
+
+	sreq = scsi_allocate_request(scsidev, GFP_KERNEL);
+	if (!sreq) {
+		rc = -EINTR;
+		goto error;
+	}
+
+	sreq->sr_data_direction = DMA_NONE;
+	/* Good values for timeout and retries?  Values below
+	   from scsi_ioctl_send_command() for default case... */
+	scsi_wait_req(sreq, scsi_cmd, NULL, 0, (10*HZ), 5);
+
+	if (sreq->sr_result) {
+		rc = -EIO;
+		goto error;
+	}
+
+	/* Need code to retrieve data from check condition? */
+
+error:
+	scsi_release_request(sreq);
+	return rc;
+}
+
 int ata_scsi_ioctl(struct scsi_device *scsidev, int cmd, void __user *arg)
 {
 	struct ata_port *ap;
@@ -99,6 +239,16 @@
 			return -EINVAL;
 		return 0;
 
+	case HDIO_DRIVE_CMD:
+		if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
+			return -EACCES;
+		return ata_cmd_ioctl(scsidev, arg);
+
+	case HDIO_DRIVE_TASK:
+		if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
+			return -EACCES;
+		return ata_task_ioctl(scsidev, arg);
+
 	default:
 		rc = -EOPNOTSUPP;
 		break;
@@ -315,6 +465,85 @@
 	}
 }
 
+/*
+ *	ata_pass_thru_cc - Generate check condition sense block.
+ *	@qc: Command that completed.
+ *
+ *	Regardless of whether the command errored or not, return
+ *	a sense block. Copy all controller registers into
+ *	the sense block. Clear sense key, ASC & ASCQ if
+ *	there is no error.
+ *
+ *	LOCKING:
+ *	spin_lock_irqsave(host_set lock)
+ */
+void ata_pass_thru_cc(struct ata_queued_cmd *qc, u8 drv_stat)
+{
+	struct scsi_cmnd *cmd = qc->scsicmd;
+	struct ata_taskfile *tf = &qc->tf;
+	unsigned char *sb = cmd->sense_buffer;
+	unsigned char *desc = sb + 8 ;
+
+	cmd->result = SAM_STAT_CHECK_CONDITION;
+
+	/*
+	 * Use ata_to_sense_error() to map status register bits
+	 * onto sense key, asc & ascq. We will overwrite some
+	 * (many) of the fields later.
+	 *
+	 * TODO: reorganise better, by splitting ata_to_sense_error()
+	 */
+	if (unlikely(drv_stat & (ATA_BUSY | ATA_DF | ATA_ERR | ATA_DRQ))) {
+		ata_to_sense_error(qc, drv_stat) ;
+	} else {
+		sb[3] = sb[2] = sb[1] = 0x00 ;
+	}
+
+	/*
+	 * Sense data is current and format is
+	 * descriptor.
+	 */
+	sb[0] = 0x72 ;
+
+	desc[0] = 0x8e ;	/* TODO: replace with official value. */
+
+	/*
+	 * Set length of additional sense data.
+	 * Since we only populate descriptor 0, the total
+	 * length is the same (fixed) length as descriptor 0.
+	 */
+	desc[1] = sb[7] = 14 ;
+
+	/*
+	 * Read the controller registers.
+	 */
+	qc->ap->ops->tf_read(qc->ap, tf);
+
+	/*
+	 * Copy registers into sense buffer.
+	 */
+	desc[2] = 0x00 ;
+	desc[3] = tf->feature ;	/* Note: becomes error register when read. */
+	desc[5] = tf->nsect ;
+	desc[7] = tf->lbal ;
+	desc[9] = tf->lbam ;
+	desc[11] = tf->lbah ;
+	desc[12] = tf->device ;
+	desc[13] = drv_stat ;
+
+	/*
+	 * Fill in Extend bit, and the high order bytes
+	 * if applicable.
+	 */
+	if (tf->flags & ATA_TFLAG_LBA48) {
+		desc[2] |= 0x01 ;
+		desc[4] = tf->hob_nsect ;
+		desc[6] = tf->hob_lbal ;
+		desc[8] = tf->hob_lbam ;
+		desc[10] = tf->hob_lbah ;
+	}
+}
+
 /**
  *	ata_scsi_slave_config - Set SCSI device attributes
  *	@sdev: SCSI device to examine
@@ -411,7 +640,7 @@
 	tf->protocol = ATA_PROT_NODATA;
 
 	if ((tf->flags & ATA_TFLAG_LBA48) &&
-	    (ata_id_has_flush_ext(qc->dev)))
+	    (ata_id_has_flush_ext(qc->dev->id)))
 		tf->command = ATA_CMD_FLUSH_EXT;
 	else
 		tf->command = ATA_CMD_FLUSH;
@@ -623,10 +852,23 @@
 {
 	struct scsi_cmnd *cmd = qc->scsicmd;
 
-	if (unlikely(drv_stat & (ATA_ERR | ATA_BUSY | ATA_DRQ)))
-		ata_to_sense_error(qc, drv_stat);
-	else
-		cmd->result = SAM_STAT_GOOD;
+	/*
+	 * If this was a pass-thru command, and the user requested
+	 * a check condition return including register values.
+	 * Note that check condition is generated, and the ATA
+	 * register values are returned, whether the command completed
+	 * successfully or not. If there was no error, SK, ASC and
+	 * ASCQ will all be zero.
+	 */
+	if (((cmd->cmnd[0] == ATA_16) || (cmd->cmnd[0] == ATA_12)) &&
+						(cmd->cmnd[2] & 0x20)) {
+		ata_pass_thru_cc(qc, drv_stat) ;
+	} else {
+		if (unlikely(drv_stat & (ATA_ERR | ATA_BUSY | ATA_DRQ)))
+			ata_to_sense_error(qc, drv_stat);
+		else
+			cmd->result = SAM_STAT_GOOD;
+	}
 
 	qc->scsidone(cmd);
 
@@ -688,7 +930,6 @@
 
 	if (xlat_func(qc, scsicmd))
 		goto err_out;
-
 	/* select device, send command to hardware */
 	if (ata_qc_issue(qc))
 		goto err_out;
@@ -757,7 +998,7 @@
 
 /**
  *	ata_scsi_rbuf_fill - wrapper for SCSI command simulators
- *	@args: Port / device / SCSI command of interest.
+ *	@args: device IDENTIFY data / SCSI command of interest.
  *	@actor: Callback hook for desired SCSI command simulator
  *
  *	Takes care of the hard work of simulating a SCSI command...
@@ -793,7 +1034,7 @@
 
 /**
  *	ata_scsiop_inq_std - Simulate INQUIRY command
- *	@args: Port / device / SCSI command of interest.
+ *	@args: device IDENTIFY data / SCSI command of interest.
  *	@rbuf: Response buffer, to which simulated SCSI cmd output is sent.
  *	@buflen: Response buffer length.
  *
@@ -807,8 +1048,6 @@
 unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf,
 			       unsigned int buflen)
 {
-	struct ata_device *dev = args->dev;
-
 	u8 hdr[] = {
 		TYPE_DISK,
 		0,
@@ -818,7 +1057,7 @@
 	};
 
 	/* set scsi removeable (RMB) bit per ata bit */
-	if (ata_id_removeable(dev))
+	if (ata_id_removeable(args->id))
 		hdr[1] |= (1 << 7);
 
 	VPRINTK("ENTER\n");
@@ -827,8 +1066,8 @@
 
 	if (buflen > 35) {
 		memcpy(&rbuf[8], "ATA     ", 8);
-		ata_dev_id_string(dev, &rbuf[16], ATA_ID_PROD_OFS, 16);
-		ata_dev_id_string(dev, &rbuf[32], ATA_ID_FW_REV_OFS, 4);
+		ata_dev_id_string(args->id, &rbuf[16], ATA_ID_PROD_OFS, 16);
+		ata_dev_id_string(args->id, &rbuf[32], ATA_ID_FW_REV_OFS, 4);
 		if (rbuf[32] == 0 || rbuf[32] == ' ')
 			memcpy(&rbuf[32], "n/a ", 4);
 	}
@@ -852,7 +1091,7 @@
 
 /**
  *	ata_scsiop_inq_00 - Simulate INQUIRY EVPD page 0, list of pages
- *	@args: Port / device / SCSI command of interest.
+ *	@args: device IDENTIFY data / SCSI command of interest.
  *	@rbuf: Response buffer, to which simulated SCSI cmd output is sent.
  *	@buflen: Response buffer length.
  *
@@ -880,7 +1119,7 @@
 
 /**
  *	ata_scsiop_inq_80 - Simulate INQUIRY EVPD page 80, device serial number
- *	@args: Port / device / SCSI command of interest.
+ *	@args: device IDENTIFY data / SCSI command of interest.
  *	@rbuf: Response buffer, to which simulated SCSI cmd output is sent.
  *	@buflen: Response buffer length.
  *
@@ -902,7 +1141,7 @@
 	memcpy(rbuf, hdr, sizeof(hdr));
 
 	if (buflen > (ATA_SERNO_LEN + 4))
-		ata_dev_id_string(args->dev, (unsigned char *) &rbuf[4],
+		ata_dev_id_string(args->id, (unsigned char *) &rbuf[4],
 				  ATA_ID_SERNO_OFS, ATA_SERNO_LEN);
 
 	return 0;
@@ -912,7 +1151,7 @@
 
 /**
  *	ata_scsiop_inq_83 - Simulate INQUIRY EVPD page 83, device identity
- *	@args: Port / device / SCSI command of interest.
+ *	@args: device IDENTIFY data / SCSI command of interest.
  *	@rbuf: Response buffer, to which simulated SCSI cmd output is sent.
  *	@buflen: Response buffer length.
  *
@@ -941,7 +1180,7 @@
 
 /**
  *	ata_scsiop_noop -
- *	@args: Port / device / SCSI command of interest.
+ *	@args: device IDENTIFY data / SCSI command of interest.
  *	@rbuf: Response buffer, to which simulated SCSI cmd output is sent.
  *	@buflen: Response buffer length.
  *
@@ -989,7 +1228,7 @@
 
 /**
  *	ata_msense_caching - Simulate MODE SENSE caching info page
- *	@dev: Device associated with this MODE SENSE command
+ *	@id: device IDENTIFY data
  *	@ptr_io: (input/output) Location to store more output data
  *	@last: End of output data buffer
  *
@@ -1001,7 +1240,7 @@
  *	None.
  */
 
-static unsigned int ata_msense_caching(struct ata_device *dev, u8 **ptr_io,
+static unsigned int ata_msense_caching(u16 *id, u8 **ptr_io,
 				       const u8 *last)
 {
 	u8 page[] = {
@@ -1011,9 +1250,9 @@
 		0, 0, 0, 0, 0, 0, 0, 0		/* 8 zeroes */
 	};
 
-	if (ata_id_wcache_enabled(dev))
+	if (ata_id_wcache_enabled(id))
 		page[2] |= (1 << 2);	/* write cache enable */
-	if (!ata_id_rahead_enabled(dev))
+	if (!ata_id_rahead_enabled(id))
 		page[12] |= (1 << 5);	/* disable read ahead */
 
 	ata_msense_push(ptr_io, last, page, sizeof(page));
@@ -1067,7 +1306,7 @@
 
 /**
  *	ata_scsiop_mode_sense - Simulate MODE SENSE 6, 10 commands
- *	@args: Port / device / SCSI command of interest.
+ *	@args: device IDENTIFY data / SCSI command of interest.
  *	@rbuf: Response buffer, to which simulated SCSI cmd output is sent.
  *	@buflen: Response buffer length.
  *
@@ -1081,7 +1320,6 @@
 				  unsigned int buflen)
 {
 	u8 *scsicmd = args->cmd->cmnd, *p, *last;
-	struct ata_device *dev = args->dev;
 	unsigned int page_control, six_byte, output_len;
 
 	VPRINTK("ENTER\n");
@@ -1109,7 +1347,7 @@
 		break;
 
 	case 0x08:		/* caching */
-		output_len += ata_msense_caching(dev, &p, last);
+		output_len += ata_msense_caching(args->id, &p, last);
 		break;
 
 	case 0x0a: {		/* control mode */
@@ -1119,7 +1357,7 @@
 
 	case 0x3f:		/* all pages */
 		output_len += ata_msense_rw_recovery(&p, last);
-		output_len += ata_msense_caching(dev, &p, last);
+		output_len += ata_msense_caching(args->id, &p, last);
 		output_len += ata_msense_ctl_mode(&p, last);
 		break;
 
@@ -1141,7 +1379,7 @@
 
 /**
  *	ata_scsiop_read_cap - Simulate READ CAPACITY[ 16] commands
- *	@args: Port / device / SCSI command of interest.
+ *	@args: device IDENTIFY data / SCSI command of interest.
  *	@rbuf: Response buffer, to which simulated SCSI cmd output is sent.
  *	@buflen: Response buffer length.
  *
@@ -1154,11 +1392,15 @@
 unsigned int ata_scsiop_read_cap(struct ata_scsi_args *args, u8 *rbuf,
 			        unsigned int buflen)
 {
-	u64 n_sectors = args->dev->n_sectors;
+	u64 n_sectors;
 	u32 tmp;
 
 	VPRINTK("ENTER\n");
 
+	if (ata_id_has_lba48(args->id))
+		n_sectors = ata_id_u64(args->id, 100);
+	else
+		n_sectors = ata_id_u32(args->id, 60);
 	n_sectors--;		/* ATA TotalUserSectors - 1 */
 
 	tmp = n_sectors;	/* note: truncates, if lba48 */
@@ -1196,7 +1438,7 @@
 
 /**
  *	ata_scsiop_report_luns - Simulate REPORT LUNS command
- *	@args: Port / device / SCSI command of interest.
+ *	@args: device IDENTIFY data / SCSI command of interest.
  *	@rbuf: Response buffer, to which simulated SCSI cmd output is sent.
  *	@buflen: Response buffer length.
  *
@@ -1368,6 +1610,135 @@
 	return dev;
 }
 
+/*
+ *	ata_scsi_map_proto - Map pass-thru protocol value to taskfile value.
+ *	@byte1: Byte 1 from pass-thru CDB.
+ *
+ *	RETURNS:
+ *	ATA_PROT_UNKNOWN if mapping failed/unimplemented, protocol otherwise.
+ */
+static u8
+ata_scsi_map_proto(u8 byte1)
+{
+	switch((byte1 & 0x1e) >> 1) {
+		case 3:		/* Non-data */
+			return ATA_PROT_NODATA;
+
+		case 6:		/* DMA */
+			return ATA_PROT_DMA;
+
+		case 4:		/* PIO Data-in */
+		case 5:		/* PIO Data-out */
+			if (byte1 & 0xe0) {
+				return ATA_PROT_PIO_MULT;
+			}
+			return ATA_PROT_PIO;
+
+		case 10:	/* Device Reset */
+		case 0:		/* Hard Reset */
+		case 1:		/* SRST */
+		case 2:		/* Bus Idle */
+		case 7:		/* Packet */
+		case 8:		/* DMA Queued */
+		case 9:		/* Device Diagnostic */
+		case 11:	/* UDMA Data-in */
+		case 12:	/* UDMA Data-Out */
+		case 13:	/* FPDMA */
+		default:	/* Reserved */
+			break;
+	}
+
+	return ATA_PROT_UNKNOWN;
+}
+
+/**
+ *	ata_scsi_pass_thru - convert ATA pass-thru CDB to taskfile
+ *	@qc: command structure to be initialized
+ *	@cmd: SCSI command to convert
+ *
+ *	Handles either 12 or 16-byte versions of the CDB.
+ *
+ *	RETURNS:
+ *	Zero on success, non-zero on failure.
+ */
+static unsigned int
+ata_scsi_pass_thru(struct ata_queued_cmd *qc, u8 *scsicmd)
+{
+	struct ata_taskfile *tf = &(qc->tf);
+	struct scsi_cmnd *cmd = qc->scsicmd;
+
+	if ((tf->protocol = ata_scsi_map_proto(scsicmd[1])) == ATA_PROT_UNKNOWN) {
+		return 1;
+	}
+
+	/*
+	 * 12 and 16 byte CDBs use different offsets to
+	 * provide the various register values.
+	 */
+	if (scsicmd[0] == ATA_16) {
+		/*
+		 * 16-byte CDB - may contain extended commands.
+		 *
+		 * If that is the case, copy the upper byte register values.
+		 */
+		if (scsicmd[1] & 0x01) {
+			tf->hob_feature = scsicmd[3];
+			tf->hob_nsect = scsicmd[5];
+			tf->hob_lbal = scsicmd[7];
+			tf->hob_lbam = scsicmd[9];
+			tf->hob_lbah = scsicmd[11];
+			tf->flags |= ATA_TFLAG_LBA48 ;
+		} else {
+			tf->flags &= ~ATA_TFLAG_LBA48 ;
+		}
+
+		/*
+		 * Always copy low byte, device and command registers.
+		 */
+		tf->feature = scsicmd[4];
+		tf->nsect = scsicmd[6];
+		tf->lbal = scsicmd[8];
+		tf->lbam = scsicmd[10];
+		tf->lbah = scsicmd[12];
+		tf->device = scsicmd[13];
+		tf->command = scsicmd[14];
+	} else {
+		/*
+		 * 12-byte CDB - incapable of extended commands.
+		 */
+		tf->flags &= ~ATA_TFLAG_LBA48 ;
+
+		tf->feature = scsicmd[3];
+		tf->nsect = scsicmd[4];
+		tf->lbal = scsicmd[5];
+		tf->lbam = scsicmd[6];
+		tf->lbah = scsicmd[7];
+		tf->device = scsicmd[8];
+		tf->command = scsicmd[9];
+	}
+
+	/*
+	 * Set flags so that all registers will be written,
+	 * and pass on write indication (used for PIO/DMA
+	 * setup.)
+	 */
+	tf->flags |= (ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE) ;
+
+	if (cmd->sc_data_direction == SCSI_DATA_WRITE) {
+		tf->flags |= ATA_TFLAG_WRITE;
+	}
+
+	/*
+	 * Set transfer length.
+	 *
+	 * TODO: find out if we need to do more here to
+	 *       cover scatter/gather case.
+	 */
+	qc->nsect = cmd->bufflen / ATA_SECT_SIZE ;
+
+	return 0;
+}
+
 /**
  *	ata_get_xlat_func - check if SCSI to ATA translation is possible
  *	@dev: ATA device
@@ -1400,6 +1771,10 @@
 	case VERIFY:
 	case VERIFY_16:
 		return ata_scsi_verify_xlat;
+
+	case ATA_12:
+	case ATA_16:
+		return ata_scsi_pass_thru ;
 	}
 
 	return NULL;
@@ -1472,7 +1847,7 @@
 		if (xlat_func)
 			ata_scsi_translate(ap, dev, cmd, done, xlat_func);
 		else
-			ata_scsi_simulate(ap, dev, cmd, done);
+			ata_scsi_simulate(dev->id, cmd, done);
 	} else
 		ata_scsi_translate(ap, dev, cmd, done, atapi_xlat);
 
@@ -1482,8 +1857,7 @@
 
 /**
  *	ata_scsi_simulate - simulate SCSI command on ATA device
- *	@ap: Port to which ATA device is attached.
- *	@dev: Target device for CDB.
+ *	@id: current IDENTIFY data for target device.
  *	@cmd: SCSI command being sent to device.
  *	@done: SCSI command completion function.
  *
@@ -1494,15 +1868,14 @@
  *	spin_lock_irqsave(host_set lock)
  */
 
-static void ata_scsi_simulate(struct ata_port *ap, struct ata_device *dev,
-			      struct scsi_cmnd *cmd,
-			      void (*done)(struct scsi_cmnd *))
+void ata_scsi_simulate(u16 *id,
+		      struct scsi_cmnd *cmd,
+		      void (*done)(struct scsi_cmnd *))
 {
 	struct ata_scsi_args args;
 	u8 *scsicmd = cmd->cmnd;
 
-	args.ap = ap;
-	args.dev = dev;
+	args.id = id;
 	args.cmd = cmd;
 	args.done = done;
 
diff -Nru a/drivers/scsi/libata.h b/drivers/scsi/libata.h
--- a/drivers/scsi/libata.h	2004-10-15 03:08:20 -04:00
+++ b/drivers/scsi/libata.h	2004-10-15 03:08:20 -04:00
@@ -29,9 +29,8 @@
 #define DRV_VERSION	"1.02"	/* must be exactly four chars */
 
 struct ata_scsi_args {
-	struct ata_port		*ap;
-	struct ata_device	*dev;
-	struct scsi_cmnd		*cmd;
+	u16			*id;
+	struct scsi_cmnd	*cmd;
 	void			(*done)(struct scsi_cmnd *);
 };
 
@@ -43,6 +42,8 @@
                            unsigned int wait, unsigned int can_sleep);
 extern void ata_tf_to_host_nolock(struct ata_port *ap, struct ata_taskfile *tf);
 extern void swap_buf_le16(u16 *buf, unsigned int buf_words);
+extern int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg);
+extern int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg);
 
 
 /* libata-scsi.c */
diff -Nru a/drivers/scsi/sata_promise.c b/drivers/scsi/sata_promise.c
--- a/drivers/scsi/sata_promise.c	2004-10-15 03:08:20 -04:00
+++ b/drivers/scsi/sata_promise.c	2004-10-15 03:08:20 -04:00
@@ -79,6 +79,8 @@
 static int pdc_port_start(struct ata_port *ap);
 static void pdc_port_stop(struct ata_port *ap);
 static void pdc_phy_reset(struct ata_port *ap);
+static void pdc_pata_phy_reset(struct ata_port *ap);
+static void pdc_pata_cbl_detect(struct ata_port *ap);
 static void pdc_qc_prep(struct ata_queued_cmd *qc);
 static void pdc_tf_load_mmio(struct ata_port *ap, struct ata_taskfile *tf);
 static void pdc_exec_command_mmio(struct ata_port *ap, struct ata_taskfile *tf);
@@ -127,7 +129,7 @@
 	/* board_2037x */
 	{
 		.sht		= &pdc_sata_sht,
-		.host_flags	= ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
+		.host_flags	= /* ATA_FLAG_SATA | */ ATA_FLAG_NO_LEGACY |
 				  ATA_FLAG_SRST | ATA_FLAG_MMIO,
 		.pio_mask	= 0x1f, /* pio0-4 */
 		.mwdma_mask	= 0x07, /* mwdma0-2 */
@@ -244,7 +246,35 @@
 static void pdc_phy_reset(struct ata_port *ap)
 {
 	pdc_reset_port(ap);
-	sata_phy_reset(ap);
+	if (ap->flags & ATA_FLAG_SATA)
+		sata_phy_reset(ap);
+	else
+		pdc_pata_phy_reset(ap);
+}
+
+static void pdc_pata_cbl_detect(struct ata_port *ap)
+{
+	u8 tmp;
+	void *mmio = (void *) ap->ioaddr.cmd_addr + PDC_CTLSTAT + 0x03;
+
+	tmp = readb(mmio);
+	
+	if (tmp & 0x01)
+	{
+		ap->cbl = ATA_CBL_PATA40;
+		ap->udma_mask &= ATA_UDMA_MASK_40C;
+	}
+	else
+		ap->cbl = ATA_CBL_PATA80;
+}
+		
+static void pdc_pata_phy_reset(struct ata_port *ap)
+{
+	pdc_pata_cbl_detect(ap);
+
+	ata_port_probe(ap);
+	
+	ata_bus_reset(ap);
 }
 
 static u32 pdc_sata_scr_read (struct ata_port *ap, unsigned int sc_reg)
@@ -547,6 +577,7 @@
 	void *mmio_base;
 	unsigned int board_idx = (unsigned int) ent->driver_data;
 	int rc;
+	u8 tmp;
 
 	if (!printed_version++)
 		printk(KERN_DEBUG DRV_NAME " version " DRV_VERSION "\n");
@@ -605,6 +636,9 @@
 	probe_ent->port[0].scr_addr = base + 0x400;
 	probe_ent->port[1].scr_addr = base + 0x500;
 
+	probe_ent->port_flags[0] = ATA_FLAG_SATA;
+	probe_ent->port_flags[1] = ATA_FLAG_SATA;
+	
 	/* notice 4-port boards */
 	switch (board_idx) {
 	case board_20319:
@@ -615,9 +649,25 @@
 
 		probe_ent->port[2].scr_addr = base + 0x600;
 		probe_ent->port[3].scr_addr = base + 0x700;
+	
+		probe_ent->port_flags[2] = ATA_FLAG_SATA;
+		probe_ent->port_flags[3] = ATA_FLAG_SATA;
 		break;
 	case board_2037x:
-       		probe_ent->n_ports = 2;
+		/* Some boards have also PATA port */
+		tmp = readb(base + PDC_FLASH_CTL+1);
+		if (!(tmp & 0x80))
+		{
+			probe_ent->n_ports = 3;
+			
+			pdc_sata_setup_port(&probe_ent->port[2], base + 0x300);
+
+			probe_ent->port_flags[2] = ATA_FLAG_SLAVE_POSS;
+			
+			printk(KERN_INFO DRV_NAME " PATA port found\n");
+		}
+		else
+       			probe_ent->n_ports = 2;
 		break;
 	default:
 		BUG();
diff -Nru a/drivers/scsi/sata_sil.c b/drivers/scsi/sata_sil.c
--- a/drivers/scsi/sata_sil.c	2004-10-15 03:08:20 -04:00
+++ b/drivers/scsi/sata_sil.c	2004-10-15 03:08:20 -04:00
@@ -287,7 +287,7 @@
 	const char *s;
 	unsigned int len;
 
-	ata_dev_id_string(dev, model_num, ATA_ID_PROD_OFS,
+	ata_dev_id_string(dev->id, model_num, ATA_ID_PROD_OFS,
 			  sizeof(model_num));
 	s = &model_num[0];
 	len = strnlen(s, sizeof(model_num));
diff -Nru a/drivers/scsi/sata_vsc.c b/drivers/scsi/sata_vsc.c
--- a/drivers/scsi/sata_vsc.c	2004-10-15 03:08:20 -04:00
+++ b/drivers/scsi/sata_vsc.c	2004-10-15 03:08:20 -04:00
@@ -333,6 +333,14 @@
 
 	pci_set_master(pdev);
 
+	/* 
+	 * Config offset 0x98 is "Extended Control and Status Register 0"
+	 * Default value is (1 << 28).  All bits except bit 28 are reserved in
+	 * DPA mode.  If bit 28 is set, LED 0 reflects all ports' activity.
+	 * If bit 28 is clear, each port has its own LED.
+	 */
+	pci_write_config_dword(pdev, 0x98, 0);
+
 	/* FIXME: check ata_device_add return value */
 	ata_device_add(probe_ent);
 	kfree(probe_ent);
diff -Nru a/include/linux/ata.h b/include/linux/ata.h
--- a/include/linux/ata.h	2004-10-15 03:08:20 -04:00
+++ b/include/linux/ata.h	2004-10-15 03:08:20 -04:00
@@ -217,24 +217,25 @@
 	u8			command;	/* IO operation */
 };
 
-#define ata_id_is_ata(dev)	(((dev)->id[0] & (1 << 15)) == 0)
-#define ata_id_rahead_enabled(dev) ((dev)->id[85] & (1 << 6))
-#define ata_id_wcache_enabled(dev) ((dev)->id[85] & (1 << 5))
-#define ata_id_has_flush(dev) ((dev)->id[83] & (1 << 12))
-#define ata_id_has_flush_ext(dev) ((dev)->id[83] & (1 << 13))
-#define ata_id_has_lba48(dev)	((dev)->id[83] & (1 << 10))
-#define ata_id_has_wcache(dev)	((dev)->id[82] & (1 << 5))
-#define ata_id_has_pm(dev)	((dev)->id[82] & (1 << 3))
-#define ata_id_has_lba(dev)	((dev)->id[49] & (1 << 9))
-#define ata_id_has_dma(dev)	((dev)->id[49] & (1 << 8))
-#define ata_id_removeable(dev)	((dev)->id[0] & (1 << 7))
-#define ata_id_u32(dev,n)	\
-	(((u32) (dev)->id[(n) + 1] << 16) | ((u32) (dev)->id[(n)]))
-#define ata_id_u64(dev,n)	\
-	( ((u64) dev->id[(n) + 3] << 48) |	\
-	  ((u64) dev->id[(n) + 2] << 32) |	\
-	  ((u64) dev->id[(n) + 1] << 16) |	\
-	  ((u64) dev->id[(n) + 0]) )
+#define ata_id_is_ata(id)	(((id)[0] & (1 << 15)) == 0)
+#define ata_id_is_sata(id)	((id)[93] == 0)
+#define ata_id_rahead_enabled(id) ((id)[85] & (1 << 6))
+#define ata_id_wcache_enabled(id) ((id)[85] & (1 << 5))
+#define ata_id_has_flush(id) ((id)[83] & (1 << 12))
+#define ata_id_has_flush_ext(id) ((id)[83] & (1 << 13))
+#define ata_id_has_lba48(id)	((id)[83] & (1 << 10))
+#define ata_id_has_wcache(id)	((id)[82] & (1 << 5))
+#define ata_id_has_pm(id)	((id)[82] & (1 << 3))
+#define ata_id_has_lba(id)	((id)[49] & (1 << 9))
+#define ata_id_has_dma(id)	((id)[49] & (1 << 8))
+#define ata_id_removeable(id)	((id)[0] & (1 << 7))
+#define ata_id_u32(id,n)	\
+	(((u32) (id)[(n) + 1] << 16) | ((u32) (id)[(n)]))
+#define ata_id_u64(id,n)	\
+	( ((u64) (id)[(n) + 3] << 48) |	\
+	  ((u64) (id)[(n) + 2] << 32) |	\
+	  ((u64) (id)[(n) + 1] << 16) |	\
+	  ((u64) (id)[(n) + 0]) )
 
 static inline int atapi_cdb_len(u16 *dev_id)
 {
diff -Nru a/include/linux/libata.h b/include/linux/libata.h
--- a/include/linux/libata.h	2004-10-15 03:08:20 -04:00
+++ b/include/linux/libata.h	2004-10-15 03:08:20 -04:00
@@ -197,6 +197,7 @@
 	unsigned long		irq;
 	unsigned int		irq_flags;
 	unsigned long		host_flags;
+	unsigned long		port_flags[ATA_MAX_PORTS];
 	void __iomem		*mmio_base;
 	void			*private_data;
 };
@@ -405,8 +406,9 @@
 extern void ata_sg_init(struct ata_queued_cmd *qc, struct scatterlist *sg,
 		 unsigned int n_elem);
 extern unsigned int ata_dev_classify(struct ata_taskfile *tf);
-extern void ata_dev_id_string(struct ata_device *dev, unsigned char *s,
+extern void ata_dev_id_string(u16 *id, unsigned char *s,
 			      unsigned int ofs, unsigned int len);
+extern void ata_dev_config(struct ata_port *ap, unsigned int i);
 extern void ata_bmdma_setup (struct ata_queued_cmd *qc);
 extern void ata_bmdma_start (struct ata_queued_cmd *qc);
 extern void ata_bmdma_irq_clear(struct ata_port *ap);
@@ -417,7 +419,9 @@
 			      struct block_device *bdev,
 			      sector_t capacity, int geom[]);
 extern int ata_scsi_slave_config(struct scsi_device *sdev);
-
+extern void ata_scsi_simulate(u16 *id,
+			      struct scsi_cmnd *cmd,
+			      void (*done)(struct scsi_cmnd *));
 
 static inline unsigned int ata_tag_valid(unsigned int tag)
 {
@@ -615,9 +619,9 @@
 
 static inline int ata_try_flush_cache(struct ata_device *dev)
 {
-	return ata_id_wcache_enabled(dev) ||
-	       ata_id_has_flush(dev) ||
-	       ata_id_has_flush_ext(dev);
+	return ata_id_wcache_enabled(dev->id) ||
+	       ata_id_has_flush(dev->id) ||
+	       ata_id_has_flush_ext(dev->id);
 }
 
 #endif /* __LINUX_LIBATA_H__ */
diff -Nru a/include/scsi/scsi.h b/include/scsi/scsi.h
--- a/include/scsi/scsi.h	2004-10-15 03:08:20 -04:00
+++ b/include/scsi/scsi.h	2004-10-15 03:08:20 -04:00
@@ -113,6 +113,9 @@
 /* values for service action in */
 #define	SAI_READ_CAPACITY_16  0x10
 
+/* Temporary values for T10/04-262 until official values are allocated */
+#define	ATA_16		      0x85	/* 16-byte pass-thru [0x85 == unused]*/
+#define	ATA_12		      0xb3	/* 12-byte pass-thru [0xb3 == obsolete set limits command] */
 
 /*
  *  SCSI Architecture Model (SAM) Status codes. Taken from SAM-3 draft

^ permalink raw reply	[flat|nested] 57+ messages in thread

end of thread, other threads:[~2005-06-23  3:39 UTC | newest]

Thread overview: 57+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-06-04  6:08 [SATA] libata-dev queue updated Jeff Garzik
2005-06-04 15:17 ` Greg Stark
2005-06-04 17:48   ` Jeff Garzik
2005-06-04 18:50     ` Adrian Bunk
2005-06-04 19:05       ` Jeff Garzik
2005-06-04 19:15         ` Greg Stark
2005-06-04 19:19           ` Jeff Garzik
2005-06-05  2:25             ` Greg Stark
2005-06-05  2:30               ` Jeff Garzik
2005-06-05  5:30                 ` Greg Stark
2005-06-22 16:15                 ` Mark Lord
2005-06-22 20:23                   ` Jeff Garzik
2005-06-23  3:39                     ` Mark Lord
2005-06-05  2:40               ` Drew Winstel
2005-06-05  2:58               ` Jim Crilly
2005-06-06 16:01   ` Mark Lord
2005-06-07  1:57     ` Greg Stark
2005-06-07 11:20       ` Brad Campbell
2005-06-08  8:33         ` Mark Lord
2005-06-07 13:15           ` Brad Campbell
2005-06-08  8:37       ` Mark Lord
2005-06-07 13:51         ` Greg Stark
2005-06-08 10:30           ` Mark Lord
2005-06-08  8:51       ` Mark Lord
2005-06-07 13:09         ` Domenico Andreoli
2005-06-07 17:53         ` Jeff Garzik
  -- strict thread matches above, loose matches on Subject: below --
2005-06-07  7:00 Bene Martin
2005-06-07  7:00 ` Bene Martin
2005-03-10  5:40 Jeff Garzik
2005-03-29  9:12 ` kern.petr
2005-03-08 11:20 Jeff Garzik
     [not found] <3Ds62-5AS-3@gated-at.bofh.it>
2005-03-02 20:34 ` Joerg Sommrey
2005-03-02 22:43   ` Jeff Garzik
2005-03-03 19:32     ` Joerg Sommrey
2005-03-04  4:09       ` Jeff Garzik
2005-03-04  6:37         ` Joerg Sommrey
2005-03-04  7:10           ` Jeff Garzik
2005-03-04 17:49             ` Joerg Sommrey
2005-03-04 18:07               ` Jeff Garzik
2005-03-04 20:33                 ` Joerg Sommrey
2005-03-04 20:43                   ` Jeff Garzik
2005-03-04 22:06                     ` Joerg Sommrey
2005-03-04 22:32                       ` Joerg Sommrey
2005-03-02  2:40 Jeff Garzik
2005-02-19  8:40 Jeff Garzik
2005-02-19 16:58 ` Andre Tomt
2005-02-19 17:09   ` Jeff Garzik
2005-02-13 20:33 Jeff Garzik
2004-10-30 16:15 Jeff Garzik
2004-10-27  6:52 Jeff Garzik
2004-10-27  6:53 ` Jeff Garzik
2004-10-27 22:53 ` Rob van Nieuwkerk
2004-10-27 23:03   ` Jeff Garzik
2004-10-18 23:52 Jeff Garzik
2004-10-16  0:44 Jeff Garzik
2004-10-15  8:04 Jeff Garzik
2004-10-15 17:15 ` Jeff Garzik

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.