linux-ide.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 2.6.7] new NVIDIA libata SATA driver
@ 2004-06-17  0:17 Andrew Chew
  2004-06-17  1:12 ` Bartlomiej Zolnierkiewicz
  0 siblings, 1 reply; 10+ messages in thread
From: Andrew Chew @ 2004-06-17  0:17 UTC (permalink / raw)
  To: jgarzik; +Cc: linux-kernel, linux-ide

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

This patch adds the file linux-2.6.7/drivers/scsi/sata_nv.c, updates
linux-2.6.7/drivers/scsi/Makefile and linux-2.6.7/drivers/scsi/Kconfig
to include the new driver, and removes
PCI_DEVICE_ID_NVIDIA_NFORCE2S_SATA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA,
and PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA2 device IDs from the
linux-2.6.7/drivers/ide/pci/amd74xx.c driver (these IDs will now be in
the sata_nv.c driver).

This patch is to be applied to the linux-2.6.7 kernel.

Attaching patch file, as the patch is kind of large.

[-- Attachment #2: linux-2.6.7-sata.diff --]
[-- Type: application/octet-stream, Size: 15836 bytes --]

diff -Nru linux-2.6.7/drivers/ide/pci/amd74xx.c linux/drivers/ide/pci/amd74xx.c
--- linux-2.6.7/drivers/ide/pci/amd74xx.c	2004-06-15 22:20:26.000000000 -0700
+++ linux/drivers/ide/pci/amd74xx.c	2004-06-16 11:06:28.000000000 -0700
@@ -65,11 +65,8 @@
 	{ PCI_DEVICE_ID_NVIDIA_NFORCE_IDE,	0x50, AMD_UDMA_100 },
 	{ PCI_DEVICE_ID_NVIDIA_NFORCE2_IDE,	0x50, AMD_UDMA_133 },
 	{ PCI_DEVICE_ID_NVIDIA_NFORCE2S_IDE,	0x50, AMD_UDMA_133 },
-	{ PCI_DEVICE_ID_NVIDIA_NFORCE2S_SATA,	0x50, AMD_UDMA_133 },
 	{ PCI_DEVICE_ID_NVIDIA_NFORCE3_IDE,	0x50, AMD_UDMA_133 },
 	{ PCI_DEVICE_ID_NVIDIA_NFORCE3S_IDE,	0x50, AMD_UDMA_133 },
-	{ PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA,	0x50, AMD_UDMA_133 },
-	{ PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA2,	0x50, AMD_UDMA_133 },
 	{ PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_IDE,	0x50, AMD_UDMA_133 },
 	{ PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_SATA,	0x50, AMD_UDMA_133 },
 	{ PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_SATA2,	0x50, AMD_UDMA_133 },
@@ -481,17 +478,14 @@
 	/*  5 */ DECLARE_NV_DEV("NFORCE"),
 	/*  6 */ DECLARE_NV_DEV("NFORCE2"),
 	/*  7 */ DECLARE_NV_DEV("NFORCE2-U400R"),
-	/*  8 */ DECLARE_NV_DEV("NFORCE2-U400R-SATA"),
-	/*  9 */ DECLARE_NV_DEV("NFORCE3-150"),
-	/* 10 */ DECLARE_NV_DEV("NFORCE3-250"),
-	/* 11 */ DECLARE_NV_DEV("NFORCE3-250-SATA"),
-	/* 12 */ DECLARE_NV_DEV("NFORCE3-250-SATA2"),
-	/* 13 */ DECLARE_NV_DEV("NFORCE-CK804"),
-	/* 14 */ DECLARE_NV_DEV("NFORCE-CK804-SATA"),
-	/* 15 */ DECLARE_NV_DEV("NFORCE-CK804-SATA2"),
-	/* 16 */ DECLARE_NV_DEV("NFORCE-MCP04"),
-	/* 17 */ DECLARE_NV_DEV("NFORCE-MCP04-SATA"),
-	/* 18 */ DECLARE_NV_DEV("NFORCE-MCP04-SATA2")
+	/*  8 */ DECLARE_NV_DEV("NFORCE3-150"),
+	/*  9 */ DECLARE_NV_DEV("NFORCE3-250"),
+	/* 10 */ DECLARE_NV_DEV("NFORCE-CK804"),
+	/* 11 */ DECLARE_NV_DEV("NFORCE-CK804-SATA"),
+	/* 12 */ DECLARE_NV_DEV("NFORCE-CK804-SATA2"),
+	/* 13 */ DECLARE_NV_DEV("NFORCE-MCP04"),
+	/* 14 */ DECLARE_NV_DEV("NFORCE-MCP04-SATA"),
+	/* 15 */ DECLARE_NV_DEV("NFORCE-MCP04-SATA2")
 };
 
 static int __devinit amd74xx_probe(struct pci_dev *dev, const struct pci_device_id *id)
@@ -512,17 +506,14 @@
 	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_IDE,	PCI_ANY_ID, PCI_ANY_ID, 0, 0,  5 },
 	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2_IDE,	PCI_ANY_ID, PCI_ANY_ID, 0, 0,  6 },
 	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2S_IDE,	PCI_ANY_ID, PCI_ANY_ID, 0, 0,  7 },
-	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2S_SATA,	PCI_ANY_ID, PCI_ANY_ID, 0, 0,  8 },
-	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3_IDE,	PCI_ANY_ID, PCI_ANY_ID, 0, 0,  9 },
-	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_IDE,	PCI_ANY_ID, PCI_ANY_ID, 0, 0, 10 },
-	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA,	PCI_ANY_ID, PCI_ANY_ID, 0, 0, 11 },
-	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA2,	PCI_ANY_ID, PCI_ANY_ID, 0, 0, 12 },
-	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_IDE,	PCI_ANY_ID, PCI_ANY_ID, 0, 0, 13 },
-	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_SATA,	PCI_ANY_ID, PCI_ANY_ID, 0, 0, 14 },
-	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_SATA2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 15 },
-	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE,	PCI_ANY_ID, PCI_ANY_ID, 0, 0, 16 },
-	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SATA,	PCI_ANY_ID, PCI_ANY_ID, 0, 0, 17 },
-	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SATA2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 18 },
+	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3_IDE,	PCI_ANY_ID, PCI_ANY_ID, 0, 0,  8 },
+	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_IDE,	PCI_ANY_ID, PCI_ANY_ID, 0, 0,  9 },
+	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_IDE,	PCI_ANY_ID, PCI_ANY_ID, 0, 0, 10 },
+	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_SATA,	PCI_ANY_ID, PCI_ANY_ID, 0, 0, 11 },
+	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_SATA2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 12 },
+	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE,	PCI_ANY_ID, PCI_ANY_ID, 0, 0, 13 },
+	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SATA,	PCI_ANY_ID, PCI_ANY_ID, 0, 0, 14 },
+	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SATA2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 15 },
 	{ 0, },
 };
 MODULE_DEVICE_TABLE(pci, amd74xx_pci_tbl);
diff -Nru linux-2.6.7/drivers/scsi/Kconfig linux/drivers/scsi/Kconfig
--- linux-2.6.7/drivers/scsi/Kconfig	2004-06-15 22:20:03.000000000 -0700
+++ linux/drivers/scsi/Kconfig	2004-06-16 11:03:21.000000000 -0700
@@ -470,6 +470,14 @@
 
 	  If unsure, say N.
 
+config SCSI_SATA_NV
+	tristate "NVIDIA SATA support"
+	depends on SCSI_SATA && PCI && EXPERIMENTAL
+	help
+	  This option enables support for NVIDIA Serial ATA.
+
+	  If unsure, say N.
+
 config SCSI_BUSLOGIC
 	tristate "BusLogic SCSI support"
 	depends on (PCI || ISA || MCA) && SCSI
diff -Nru linux-2.6.7/drivers/scsi/Makefile linux/drivers/scsi/Makefile
--- linux-2.6.7/drivers/scsi/Makefile	2004-06-15 22:19:52.000000000 -0700
+++ linux/drivers/scsi/Makefile	2004-06-16 11:02:22.000000000 -0700
@@ -127,6 +127,7 @@
 obj-$(CONFIG_SCSI_SATA_VITESSE)	+= libata.o sata_vsc.o
 obj-$(CONFIG_SCSI_SATA_SIS)	+= libata.o sata_sis.o
 obj-$(CONFIG_SCSI_SATA_SX4)	+= libata.o sata_sx4.o
+obj-$(CONFIG_SCSI_SATA_NV)	+= libata.o sata_nv.o
 
 obj-$(CONFIG_ARM)		+= arm/
 
diff -Nru linux-2.6.7/drivers/scsi/sata_nv.c linux/drivers/scsi/sata_nv.c
--- linux-2.6.7/drivers/scsi/sata_nv.c	1969-12-31 16:00:00.000000000 -0800
+++ linux/drivers/scsi/sata_nv.c	2004-06-16 15:00:48.000000000 -0700
@@ -0,0 +1,345 @@
+/*
+ *  sata_nv.c - NVIDIA nForce SATA
+ *
+ *  Copyright 2004 NVIDIA Corp.  All rights reserved.
+ *  Copyright 2004 Andrew Chew
+ *
+ *  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/config.h>
+#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 "scsi.h"
+#include "hosts.h"
+#include <linux/libata.h>
+
+#define DRV_NAME			"sata_nv"
+#define DRV_VERSION			"0.01"
+
+#define NV_PORTS			2
+#define NV_PIO_MASK			0x1f
+#define NV_UDMA_MASK			0x7f
+#define NV_PORT0_BMDMA_REG_OFFSET	0x00
+#define NV_PORT1_BMDMA_REG_OFFSET	0x08
+#define NV_PORT0_SCR_REG_OFFSET		0x00
+#define NV_PORT1_SCR_REG_OFFSET		0x40
+
+#define NV_INT_STATUS			0x10
+#define NV_INT_STATUS_PDEV_INT		0x01
+#define NV_INT_STATUS_PDEV_PM		0x02
+#define NV_INT_STATUS_PDEV_ADDED	0x04
+#define NV_INT_STATUS_PDEV_REMOVED	0x08
+#define NV_INT_STATUS_SDEV_INT		0x10
+#define NV_INT_STATUS_SDEV_PM		0x20
+#define NV_INT_STATUS_SDEV_ADDED	0x40
+#define NV_INT_STATUS_SDEV_REMOVED	0x80
+#define NV_INT_STATUS_PDEV_HOTPLUG	(NV_INT_STATUS_PDEV_ADDED | \
+					NV_INT_STATUS_PDEV_REMOVED)
+#define NV_INT_STATUS_SDEV_HOTPLUG	(NV_INT_STATUS_SDEV_ADDED | \
+					NV_INT_STATUS_SDEV_REMOVED)
+#define NV_INT_STATUS_HOTPLUG		(NV_INT_STATUS_PDEV_HOTPLUG | \
+					NV_INT_STATUS_SDEV_HOTPLUG)
+
+#define NV_INT_ENABLE			0x11
+#define NV_INT_ENABLE_PDEV_MASK		0x01
+#define NV_INT_ENABLE_PDEV_PM		0x02
+#define NV_INT_ENABLE_PDEV_ADDED	0x04
+#define NV_INT_ENABLE_PDEV_REMOVED	0x08
+#define NV_INT_ENABLE_SDEV_MASK		0x10
+#define NV_INT_ENABLE_SDEV_PM		0x20
+#define NV_INT_ENABLE_SDEV_ADDED	0x40
+#define NV_INT_ENABLE_SDEV_REMOVED	0x80
+#define NV_INT_ENABLE_PDEV_HOTPLUG	(NV_INT_ENABLE_PDEV_ADDED | \
+					NV_INT_ENABLE_PDEV_REMOVED)
+#define NV_INT_ENABLE_SDEV_HOTPLUG	(NV_INT_ENABLE_SDEV_ADDED | \
+					NV_INT_ENABLE_SDEV_REMOVED)
+#define NV_INT_ENABLE_HOTPLUG		(NV_INT_ENABLE_PDEV_HOTPLUG | \
+					NV_INT_ENABLE_SDEV_HOTPLUG)
+
+#define NV_INT_CONFIG			0x12
+#define NV_INT_CONFIG_METHD		0x01 // 0 = INT, 1 = SMI
+
+static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent);
+irqreturn_t nv_interrupt (int irq, void *dev_instance, struct pt_regs *regs);
+static u32 nv_scr_read (struct ata_port *ap, unsigned int sc_reg);
+static void nv_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val);
+static void nv_host_stop (struct ata_host_set *host_set);
+
+static struct pci_device_id nv_pci_tbl[] = {
+	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2S_SATA,
+		PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
+	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA,
+		PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1 },
+	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA2,
+		PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2 },
+	{ 0, } /* terminate list */
+};
+
+static struct pci_driver nv_pci_driver = {
+	.name			= DRV_NAME,
+	.id_table		= nv_pci_tbl,
+	.probe			= nv_init_one,
+	.remove			= ata_pci_remove_one,
+};
+
+static Scsi_Host_Template nv_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		= ATA_MAX_PRD,
+	.max_sectors		= ATA_MAX_SECTORS,
+	.cmd_per_lun		= ATA_SHT_CMD_PER_LUN,
+	.emulated		= ATA_SHT_EMULATED,
+	.use_clustering		= ATA_SHT_USE_CLUSTERING,
+	.proc_name		= DRV_NAME,
+	.dma_boundary		= ATA_DMA_BOUNDARY,
+	.slave_configure	= ata_scsi_slave_config,
+	.bios_param		= ata_std_bios_param,
+};
+
+static struct ata_port_operations nv_ops = {
+	.port_disable		= ata_port_disable,
+	.tf_load		= ata_tf_load_pio,
+	.tf_read		= ata_tf_read_pio,
+	.exec_command		= ata_exec_command_pio,
+	.check_status		= ata_check_status_pio,
+	.phy_reset		= sata_phy_reset,
+	.bmdma_setup		= ata_bmdma_setup_pio,
+	.bmdma_start		= ata_bmdma_start_pio,
+	.fill_sg		= ata_fill_sg,
+	.eng_timeout		= ata_eng_timeout,
+	.irq_handler		= nv_interrupt,
+	.scr_read		= nv_scr_read,
+	.scr_write		= nv_scr_write,
+	.port_start		= ata_port_start,
+	.port_stop		= ata_port_stop,
+	.host_stop		= nv_host_stop,
+};
+
+MODULE_AUTHOR("NVIDIA");
+MODULE_DESCRIPTION("low-level driver for NVIDIA nForce SATA controller");
+MODULE_LICENSE("GPL");
+MODULE_DEVICE_TABLE(pci, nv_pci_tbl);
+
+irqreturn_t nv_interrupt (int irq, void *dev_instance, struct pt_regs *regs)
+{
+	struct ata_host_set *host_set = dev_instance;
+	unsigned int i;
+	unsigned int handled = 0;
+	unsigned long flags;
+	u8 intr_status;
+	u8 intr_enable;
+
+	spin_lock_irqsave(&host_set->lock, flags);
+
+	for (i = 0; i < host_set->n_ports; i++) {
+		struct ata_port *ap;
+
+		ap = host_set->ports[i];
+		if (ap && (!(ap->flags & ATA_FLAG_PORT_DISABLED))) {
+			struct ata_queued_cmd *qc;
+
+			qc = ata_qc_from_tag(ap, ap->active_tag);
+			if (qc && (!(qc->tf.ctl & ATA_NIEN)))
+				handled += ata_host_intr(ap, qc);
+		}
+
+		intr_status = inb(ap->ioaddr.scr_addr + NV_INT_STATUS);
+		intr_enable = inb(ap->ioaddr.scr_addr + NV_INT_ENABLE);
+
+		// Clear interrupt status.
+		outb(0xff, ap->ioaddr.scr_addr + NV_INT_STATUS);
+
+		if (intr_status & NV_INT_STATUS_HOTPLUG) {
+			if (intr_status & NV_INT_STATUS_PDEV_ADDED) {
+				printk(KERN_WARNING "ata%u: "
+					"Primary device added\n", ap->id);
+			}
+
+			if (intr_status & NV_INT_STATUS_PDEV_REMOVED) {
+				printk(KERN_WARNING "ata%u: "
+					"Primary device removed\n", ap->id);
+			}
+
+			if (intr_status & NV_INT_STATUS_SDEV_ADDED) {
+				printk(KERN_WARNING "ata%u: "
+					"Secondary device added\n", ap->id);
+			}
+
+			if (intr_status & NV_INT_STATUS_SDEV_REMOVED) {
+				printk(KERN_WARNING "ata%u: "
+					"Secondary device removed\n", ap->id);
+			}
+		}
+	}
+
+	spin_unlock_irqrestore(&host_set->lock, flags);
+
+	return IRQ_RETVAL(handled);
+}
+
+static u32 nv_scr_read (struct ata_port *ap, unsigned int sc_reg)
+{
+	if (sc_reg > SCR_CONTROL)
+		return 0xffffffffU;
+
+	return inl(ap->ioaddr.scr_addr + (sc_reg * 4));
+}
+
+static void nv_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
+{
+	if (sc_reg > SCR_CONTROL)
+		return;
+
+	outl(val, ap->ioaddr.scr_addr + (sc_reg * 4));
+}
+
+static void nv_host_stop (struct ata_host_set *host_set)
+{
+	int i;
+
+	for (i=0; i<host_set->n_ports; i++) {
+		u8 intr_mask;
+
+		// Disable hotplug event interrupts.
+		intr_mask = inb(host_set->ports[i]->ioaddr.scr_addr +
+				NV_INT_ENABLE);
+		intr_mask &= ~(NV_INT_ENABLE_HOTPLUG);
+		outb(intr_mask, host_set->ports[i]->ioaddr.scr_addr +
+				NV_INT_ENABLE);
+	}
+}
+
+static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
+{
+	static int printed_version = 0;
+	struct ata_probe_ent *probe_ent = NULL;
+	int i;
+	int rc;
+
+	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;
+
+	rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
+	if (rc)
+		goto err_out_regions;
+	rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
+	if (rc)
+		goto err_out_regions;
+
+	probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
+	if (!probe_ent) {
+		rc = -ENOMEM;
+		goto err_out_regions;
+	}
+
+	memset(probe_ent, 0, sizeof(*probe_ent));
+	INIT_LIST_HEAD(&probe_ent->node);
+
+	probe_ent->pdev = pdev;
+	probe_ent->sht = &nv_sht;
+	probe_ent->host_flags = ATA_FLAG_SATA |
+				ATA_FLAG_SATA_RESET |
+				ATA_FLAG_SRST |
+				ATA_FLAG_NO_LEGACY;
+	probe_ent->port_ops = &nv_ops;
+	probe_ent->n_ports = NV_PORTS;
+	probe_ent->irq = pdev->irq;
+	probe_ent->irq_flags = SA_SHIRQ;
+	probe_ent->pio_mask = NV_PIO_MASK;
+	probe_ent->udma_mask = NV_UDMA_MASK;
+
+	probe_ent->port[0].cmd_addr = pci_resource_start(pdev, 0);
+	ata_std_ports(&probe_ent->port[0]);
+	probe_ent->port[0].altstatus_addr =
+	probe_ent->port[0].ctl_addr =
+		pci_resource_start(pdev, 1) | ATA_PCI_CTL_OFS;
+	probe_ent->port[0].bmdma_addr =
+		pci_resource_start(pdev, 4) | NV_PORT0_BMDMA_REG_OFFSET;
+	probe_ent->port[0].scr_addr =
+		pci_resource_start(pdev, 5) | NV_PORT0_SCR_REG_OFFSET;
+
+	probe_ent->port[1].cmd_addr = pci_resource_start(pdev, 2);
+	ata_std_ports(&probe_ent->port[1]);
+	probe_ent->port[1].altstatus_addr =
+	probe_ent->port[1].ctl_addr =
+		pci_resource_start(pdev, 3) | ATA_PCI_CTL_OFS;
+	probe_ent->port[1].bmdma_addr =
+		pci_resource_start(pdev, 4) | NV_PORT1_BMDMA_REG_OFFSET;
+	probe_ent->port[1].scr_addr =
+		pci_resource_start(pdev, 5) | NV_PORT1_SCR_REG_OFFSET;
+
+	pci_set_master(pdev);
+
+	rc = ata_device_add(probe_ent);
+	if (rc != NV_PORTS)
+		goto err_out_regions;
+
+	// Enable hotplug event interrupts.
+	for (i=0; i<probe_ent->n_ports; i++) {
+		u8 intr_mask;
+
+		outb(NV_INT_STATUS_HOTPLUG, probe_ent->port[i].scr_addr +
+						NV_INT_STATUS);
+
+		intr_mask = inb(probe_ent->port[i].scr_addr + NV_INT_ENABLE);
+		intr_mask |= NV_INT_ENABLE_HOTPLUG;
+		outb(intr_mask, probe_ent->port[i].scr_addr + NV_INT_ENABLE);
+	}
+
+	kfree(probe_ent);
+
+	return 0;
+
+err_out_regions:
+	pci_release_regions(pdev);
+
+err_out:
+	pci_disable_device(pdev);
+	return rc;
+}
+
+static int __init nv_init(void)
+{
+	return pci_module_init(&nv_pci_driver);
+}
+
+static void __exit nv_exit(void)
+{
+	pci_unregister_driver(&nv_pci_driver);
+}
+
+module_init(nv_init);
+module_exit(nv_exit);

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

* Re: [PATCH 2.6.7] new NVIDIA libata SATA driver
  2004-06-17  0:17 Andrew Chew
@ 2004-06-17  1:12 ` Bartlomiej Zolnierkiewicz
  2004-06-17  1:20   ` Jeff Garzik
  0 siblings, 1 reply; 10+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2004-06-17  1:12 UTC (permalink / raw)
  To: Andrew Chew, jgarzik; +Cc: linux-kernel, linux-ide


Hi,

Is there any reason why this driver doesn't support
CK804-SATA[2] and  MCP04-SATA[2]?

Removing IDs from amd74xx.c is a bad idea,
it breaks boot on systems already using these IDs.

Cheers.

On Thursday 17 of June 2004 02:17, Andrew Chew wrote:
> This patch adds the file linux-2.6.7/drivers/scsi/sata_nv.c, updates
> linux-2.6.7/drivers/scsi/Makefile and linux-2.6.7/drivers/scsi/Kconfig
> to include the new driver, and removes
> PCI_DEVICE_ID_NVIDIA_NFORCE2S_SATA, PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA,
> and PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA2 device IDs from the
> linux-2.6.7/drivers/ide/pci/amd74xx.c driver (these IDs will now be in
> the sata_nv.c driver).
>
> This patch is to be applied to the linux-2.6.7 kernel.
>
> Attaching patch file, as the patch is kind of large.


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

* RE: [PATCH 2.6.7] new NVIDIA libata SATA driver
@ 2004-06-17  1:19 Andrew Chew
  2004-06-17  1:22 ` Jeff Garzik
  0 siblings, 1 reply; 10+ messages in thread
From: Andrew Chew @ 2004-06-17  1:19 UTC (permalink / raw)
  To: Bartlomiej Zolnierkiewicz, jgarzik; +Cc: linux-kernel, linux-ide

> From: Bartlomiej Zolnierkiewicz 

> Is there any reason why this driver doesn't support 
> CK804-SATA[2] and  MCP04-SATA[2]?

These will be supported by this driver eventually.  We probably can
change it now, but silicon isn't available for these yet so I wasn't
able to test the driver.

> Removing IDs from amd74xx.c is a bad idea,
> it breaks boot on systems already using these IDs.

I assume these systems will be able to boot using the libata subsystem.
Is that a bad assumption?

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

* Re: [PATCH 2.6.7] new NVIDIA libata SATA driver
  2004-06-17  1:12 ` Bartlomiej Zolnierkiewicz
@ 2004-06-17  1:20   ` Jeff Garzik
  2004-06-17  2:49     ` Markus Kossmann
  0 siblings, 1 reply; 10+ messages in thread
From: Jeff Garzik @ 2004-06-17  1:20 UTC (permalink / raw)
  To: Bartlomiej Zolnierkiewicz; +Cc: Andrew Chew, linux-kernel, linux-ide

On Thu, Jun 17, 2004 at 03:12:42AM +0200, Bartlomiej Zolnierkiewicz wrote:
> Removing IDs from amd74xx.c is a bad idea,
> it breaks boot on systems already using these IDs.

(FWIW for Andrew)

I'm going to apply Andrew's patch, but without the PCI id removals.

Then, I'll apply a patch that adds Kconfig questions

	Include hardware that conflicts with libata SATA driver?
	(in drivers/ide)
and
	Include hardware that conflicts with IDE driver?
	(in libata, drivers/scsi)

and apply the associated ifdefs to the low-level drivers.

This is necessary to both enable conflict prevention, and also make sure
we don't break existing setups in the move to libata for SATA stuff.

	Jeff




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

* Re: [PATCH 2.6.7] new NVIDIA libata SATA driver
  2004-06-17  1:19 Andrew Chew
@ 2004-06-17  1:22 ` Jeff Garzik
  0 siblings, 0 replies; 10+ messages in thread
From: Jeff Garzik @ 2004-06-17  1:22 UTC (permalink / raw)
  To: Andrew Chew; +Cc: Bartlomiej Zolnierkiewicz, linux-kernel, linux-ide

On Wed, Jun 16, 2004 at 06:19:34PM -0700, Andrew Chew wrote:
> > From: Bartlomiej Zolnierkiewicz 
> 
> > Is there any reason why this driver doesn't support 
> > CK804-SATA[2] and  MCP04-SATA[2]?
> 
> These will be supported by this driver eventually.  We probably can
> change it now, but silicon isn't available for these yet so I wasn't
> able to test the driver.

If silicon isn't available yet, let's just remove those PCI IDs.  That
way we can ensure that these are libata only, without two drivers
sharing the same PCI ids.


> > Removing IDs from amd74xx.c is a bad idea,
> > it breaks boot on systems already using these IDs.
> 
> I assume these systems will be able to boot using the libata subsystem.
> Is that a bad assumption?

They can, but consider a system that uses 2.6.7 (IDE driver) then boots
into 2.6.8 (libata driver):  the drives move from /dev/hdX to /dev/sdX.
That breaks stuff not using LABEL= in bootloader config and fstab.

	Jeff




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

* RE: [PATCH 2.6.7] new NVIDIA libata SATA driver
@ 2004-06-17  1:28 Andrew Chew
  0 siblings, 0 replies; 10+ messages in thread
From: Andrew Chew @ 2004-06-17  1:28 UTC (permalink / raw)
  To: Jeff Garzik, Bartlomiej Zolnierkiewicz; +Cc: linux-kernel, linux-ide

> On Thu, Jun 17, 2004 at 03:12:42AM +0200, Bartlomiej 
> Zolnierkiewicz wrote:
> > Removing IDs from amd74xx.c is a bad idea,
> > it breaks boot on systems already using these IDs.

> From: Jeff Garzik [mailto:jgarzik@pobox.com]
> (FWIW for Andrew)
> 
> I'm going to apply Andrew's patch, but without the PCI id removals.
> 
> Then, I'll apply a patch that adds Kconfig questions
> 
> 	Include hardware that conflicts with libata SATA driver?
> 	(in drivers/ide)
> and
> 	Include hardware that conflicts with IDE driver?
> 	(in libata, drivers/scsi)
> 
> and apply the associated ifdefs to the low-level drivers.
> 
> This is necessary to both enable conflict prevention, and 
> also make sure we don't break existing setups in the move to 
> libata for SATA stuff.

So the amd74xx driver won't be able to coexist with the sata_nv driver?
If the sata_nv driver is used (and amd74xx is not), then there won't be
a driver controlling the NVIDIA IDE controllers.

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

* RE: [PATCH 2.6.7] new NVIDIA libata SATA driver
@ 2004-06-17  1:35 Andrew Chew
  2004-06-17  1:47 ` Jeff Garzik
  0 siblings, 1 reply; 10+ messages in thread
From: Andrew Chew @ 2004-06-17  1:35 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: Bartlomiej Zolnierkiewicz, linux-kernel, linux-ide

> From: Jeff Garzik [mailto:jgarzik@pobox.com] 

> If silicon isn't available yet, let's just remove those PCI 
> IDs.  That way we can ensure that these are libata only, 
> without two drivers sharing the same PCI ids.

If that's the case, I'd rather the CK804 and MCP04 SATA device IDs be
added to sata_nv, since we want distributions to support these SATA
controllers when silicon does become available.

> > > Removing IDs from amd74xx.c is a bad idea,
> > > it breaks boot on systems already using these IDs.
> > 
> > I assume these systems will be able to boot using the libata 
> > subsystem. Is that a bad assumption?
> 
> They can, but consider a system that uses 2.6.7 (IDE driver) 
> then boots into 2.6.8 (libata driver):  the drives move from 
> /dev/hdX to /dev/sdX. That breaks stuff not using LABEL= in 
> bootloader config and fstab.

That's true.  I kinda chalk this up as an inevitable kernel upgrade
issue (they'll be getting support for NVIDIA SATA under libata with
eventual device hotplug support, at the cost of some system
reconfiguration).  Is there a good solution?

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

* Re: [PATCH 2.6.7] new NVIDIA libata SATA driver
  2004-06-17  1:35 [PATCH 2.6.7] new NVIDIA libata SATA driver Andrew Chew
@ 2004-06-17  1:47 ` Jeff Garzik
  0 siblings, 0 replies; 10+ messages in thread
From: Jeff Garzik @ 2004-06-17  1:47 UTC (permalink / raw)
  To: Andrew Chew; +Cc: Bartlomiej Zolnierkiewicz, linux-kernel, linux-ide

Andrew Chew wrote:
>>From: Jeff Garzik [mailto:jgarzik@pobox.com] 
> 
> 
>>If silicon isn't available yet, let's just remove those PCI 
>>IDs.  That way we can ensure that these are libata only, 
>>without two drivers sharing the same PCI ids.
> 
> 
> If that's the case, I'd rather the CK804 and MCP04 SATA device IDs be
> added to sata_nv, since we want distributions to support these SATA
> controllers when silicon does become available.

OK


>>>>Removing IDs from amd74xx.c is a bad idea,
>>>>it breaks boot on systems already using these IDs.
>>>
>>>I assume these systems will be able to boot using the libata 
>>>subsystem. Is that a bad assumption?
>>
>>They can, but consider a system that uses 2.6.7 (IDE driver) 
>>then boots into 2.6.8 (libata driver):  the drives move from 
>>/dev/hdX to /dev/sdX. That breaks stuff not using LABEL= in 
>>bootloader config and fstab.
> 
> 
> That's true.  I kinda chalk this up as an inevitable kernel upgrade
> issue (they'll be getting support for NVIDIA SATA under libata with
> eventual device hotplug support, at the cost of some system
> reconfiguration).  Is there a good solution?

None really, other than trying to make sure we only add new SATA 
hardware support under libata.

Most users with Red Hat or SuSE or whatever don't know enough other than 
"I booted the new Fedora 2.6.x kernel, and it panic'd when it tried to 
mount root filesystem"

Your patch represented the _ideal_, but unfortunately once added to the 
IDE driver, those PCI ids should not be removed in the middle of a 
stable kernel series.  If both drivers were /dev/sdX, or /dev/hdX, 
moving the PCI ids to another driver wouldn't be as big of a deal.


Overall... no worries.  I have to deal with this issue for a couple 
other chipsets, so I'll handle them all at the same time.

	Jeff


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

* Re: [PATCH 2.6.7] new NVIDIA libata SATA driver
  2004-06-17  1:20   ` Jeff Garzik
@ 2004-06-17  2:49     ` Markus Kossmann
  2004-06-17  3:13       ` Jeff Garzik
  0 siblings, 1 reply; 10+ messages in thread
From: Markus Kossmann @ 2004-06-17  2:49 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: linux-kernel, linux-ide

Am Donnerstag, 17. Juni 2004 03:20 schrieben Sie:
[...]
> Then, I'll apply a patch that adds Kconfig questions
>
> 	Include hardware that conflicts with libata SATA driver?
> 	(in drivers/ide)
> and
> 	Include hardware that conflicts with IDE driver?
> 	(in libata, drivers/scsi)
>
> and apply the associated ifdefs to the low-level drivers.
>
This patch will address the conflict between sata_sil and siimage, too ? 

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

* Re: [PATCH 2.6.7] new NVIDIA libata SATA driver
  2004-06-17  2:49     ` Markus Kossmann
@ 2004-06-17  3:13       ` Jeff Garzik
  0 siblings, 0 replies; 10+ messages in thread
From: Jeff Garzik @ 2004-06-17  3:13 UTC (permalink / raw)
  To: Markus Kossmann; +Cc: linux-kernel, linux-ide

Markus Kossmann wrote:
> Am Donnerstag, 17. Juni 2004 03:20 schrieben Sie:
> [...]
> 
>>Then, I'll apply a patch that adds Kconfig questions
>>
>>	Include hardware that conflicts with libata SATA driver?
>>	(in drivers/ide)
>>and
>>	Include hardware that conflicts with IDE driver?
>>	(in libata, drivers/scsi)
>>
>>and apply the associated ifdefs to the low-level drivers.
>>
> 
> This patch will address the conflict between sata_sil and siimage, too ? 

Yep.

	Jeff




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

end of thread, other threads:[~2004-06-17  3:14 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-06-17  1:35 [PATCH 2.6.7] new NVIDIA libata SATA driver Andrew Chew
2004-06-17  1:47 ` Jeff Garzik
  -- strict thread matches above, loose matches on Subject: below --
2004-06-17  1:28 Andrew Chew
2004-06-17  1:19 Andrew Chew
2004-06-17  1:22 ` Jeff Garzik
2004-06-17  0:17 Andrew Chew
2004-06-17  1:12 ` Bartlomiej Zolnierkiewicz
2004-06-17  1:20   ` Jeff Garzik
2004-06-17  2:49     ` Markus Kossmann
2004-06-17  3:13       ` Jeff Garzik

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).