SOURCES: kernel-ahci_pata_marvell.patch - upstream fix.

pluto pluto at pld-linux.org
Mon Sep 8 22:00:06 CEST 2008


Author: pluto                        Date: Mon Sep  8 20:00:06 2008 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- upstream fix.

---- Files affected:
SOURCES:
   kernel-ahci_pata_marvell.patch (1.1 -> 1.2) 

---- Diffs:

================================================================
Index: SOURCES/kernel-ahci_pata_marvell.patch
diff -u SOURCES/kernel-ahci_pata_marvell.patch:1.1 SOURCES/kernel-ahci_pata_marvell.patch:1.2
--- SOURCES/kernel-ahci_pata_marvell.patch:1.1	Thu Sep  4 19:07:41 2008
+++ SOURCES/kernel-ahci_pata_marvell.patch	Mon Sep  8 22:00:00 2008
@@ -1,16 +1,195 @@
-patch based on Alan Cox suggestion. full thread available at:
-http://www.spinics.net/lists/linux-ide/msg25854.html
+commit 5b66c829bf5c65663b2f68ee6b42f6e834cd39cd
+Author: Alan Cox <alan at lxorguk.ukuu.org.uk>
+Date:   Wed Sep 3 14:48:34 2008 +0100
 
---- linux-2.6.25/drivers/ata/ahci.c.orig	2008-09-04 13:30:27.000000000 +0200
-+++ linux-2.6.25/drivers/ata/ahci.c	2008-09-04 18:51:14.000000000 +0200
-@@ -590,10 +590,6 @@
- 	{ PCI_VDEVICE(SI, 0x1185), board_ahci }, /* SiS 966 */
- 	{ PCI_VDEVICE(SI, 0x0186), board_ahci }, /* SiS 968 */
- 
--	/* Marvell */
--	{ PCI_VDEVICE(MARVELL, 0x6145), board_ahci_mv },	/* 6145 */
--	{ PCI_VDEVICE(MARVELL, 0x6121), board_ahci_mv },	/* 6121 */
--
- 	/* Generic, PCI class code for AHCI */
- 	{ PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
- 	  PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci },
+    ahci, pata_marvell: play nicely together
+    
+    I've been chasing Jeff about this for months.  Jeff added the Marvell
+    device identifiers to the ahci driver without making the AHCI driver
+    handle the PATA port. This means a lot of users can't use current
+    kernels and in most distro cases can't even install.
+    
+    This has been going on since March 2008 for the 6121 Marvell, and late 2007
+    for the 6145!!!
+    
+    This was all pointed out at the time and repeatedly ignored. Bugs assigned
+    to Jeff about this are ignored also.
+    
+    To quote Jeff in email
+    
+    > "Just switch the order of 'ahci' and 'pata_marvell' in
+    > /etc/modprobe.conf, then use Fedora's tools regenerate the initrd.
+    
+    > See?  It's not rocket science, and the current configuration can be
+    > easily made to work for Fedora users."
+    
+    (Which isn't trivial, isn't end user, shouldn't be needed, and as it usually
+    breaks at install time is in fact impossible)
+    
+    To quote Jeff in August 2007
+    
+    > "   mv-ahci-pata
+    > Marvell 6121/6141 PATA support.  Needs fixing in the 'PATA controller
+    > command' area before it is usable, and can go upstream."
+    
+    Only he add the ids anyway later and caused regressions, adding a further
+    id in March causing more regresions.
+    
+    The actual fix for the moment is very simple. If the user has included
+    the pata_marvell driver let it drive the ports. If they've only selected
+    for SATA support give them the AHCI driver which will run the port a fraction
+    faster. Allow the user to control this decision via ahci.marvell_enable as
+    a module parameter so that distributions can ship 'it works' defaults and
+    smarter users (or config tools) can then flip it over it desired.
+    
+    Signed-off-by: Alan Cox <alan at redhat.com>
+    Signed-off-by: Jeff Garzik <jgarzik at redhat.com>
+
+diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig
+index ae84949..11c8c19 100644
+--- a/drivers/ata/Kconfig
++++ b/drivers/ata/Kconfig
+@@ -448,8 +448,10 @@ config PATA_MARVELL
+ 	tristate "Marvell PATA support via legacy mode"
+ 	depends on PCI
+ 	help
+-	  This option enables limited support for the Marvell 88SE6145 ATA
+-	  controller.
++	  This option enables limited support for the Marvell 88SE61xx ATA
++	  controllers. If you wish to use only the SATA ports then select
++	  the AHCI driver alone. If you wish to the use the PATA port or
++	  both SATA and PATA include this driver.
+ 
+ 	  If unsure, say N.
+ 
+diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
+index c729e69..bce26ee 100644
+--- a/drivers/ata/ahci.c
++++ b/drivers/ata/ahci.c
+@@ -610,6 +610,15 @@ module_param(ahci_em_messages, int, 0444);
+ MODULE_PARM_DESC(ahci_em_messages,
+ 	"Set AHCI Enclosure Management Message type (0 = disabled, 1 = LED");
+ 
++#if defined(CONFIG_PATA_MARVELL) || defined(CONFIG_PATA_MARVELL_MODULE)
++static int marvell_enable;
++#else
++static int marvell_enable = 1;
++#endif
++module_param(marvell_enable, int, 0644);
++MODULE_PARM_DESC(marvell_enable, "Marvell SATA via AHCI (1 = enabled)");
++
++
+ static inline int ahci_nr_ports(u32 cap)
+ {
+ 	return (cap & 0x1f) + 1;
+@@ -732,6 +741,8 @@ static void ahci_save_initial_config(struct pci_dev *pdev,
+ 			   "MV_AHCI HACK: port_map %x -> %x\n",
+ 			   port_map,
+ 			   port_map & mv);
++		dev_printk(KERN_ERR, &pdev->dev,
++			  "Disabling your PATA port. Use the boot option 'ahci.marvell_enable=0' to avoid this.\n");
+ 
+ 		port_map &= mv;
+ 	}
+@@ -2533,6 +2544,12 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+ 	if (!printed_version++)
+ 		dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
+ 
++	/* The AHCI driver can only drive the SATA ports, the PATA driver
++	   can drive them all so if both drivers are selected make sure
++	   AHCI stays out of the way */
++	if (pdev->vendor == PCI_VENDOR_ID_MARVELL && !marvell_enable)
++		return -ENODEV;
++
+ 	/* acquire resources */
+ 	rc = pcim_enable_device(pdev);
+ 	if (rc)
+diff --git a/drivers/ata/pata_marvell.c b/drivers/ata/pata_marvell.c
+index 24a011b..0d87eec 100644
+--- a/drivers/ata/pata_marvell.c
++++ b/drivers/ata/pata_marvell.c
+@@ -20,29 +20,30 @@
+ #include <linux/ata.h>
+ 
+ #define DRV_NAME	"pata_marvell"
+-#define DRV_VERSION	"0.1.4"
++#define DRV_VERSION	"0.1.6"
+ 
+ /**
+- *	marvell_pre_reset	-	check for 40/80 pin
+- *	@link: link
+- *	@deadline: deadline jiffies for the operation
++ *	marvell_pata_active	-	check if PATA is active
++ *	@pdev: PCI device
+  *
+- *	Perform the PATA port setup we need.
++ *	Returns 1 if the PATA port may be active. We know how to check this
++ *	for the 6145 but not the other devices
+  */
+ 
+-static int marvell_pre_reset(struct ata_link *link, unsigned long deadline)
++static int marvell_pata_active(struct pci_dev *pdev)
+ {
+-	struct ata_port *ap = link->ap;
+-	struct pci_dev *pdev = to_pci_dev(ap->host->dev);
++	int i;
+ 	u32 devices;
+ 	void __iomem *barp;
+-	int i;
+ 
+-	/* Check if our port is enabled */
++	/* We don't yet know how to do this for other devices */
++	if (pdev->device != 0x6145)
++		return 1;	
+ 
+ 	barp = pci_iomap(pdev, 5, 0x10);
+ 	if (barp == NULL)
+ 		return -ENOMEM;
++
+ 	printk("BAR5:");
+ 	for(i = 0; i <= 0x0F; i++)
+ 		printk("%02X:%02X ", i, ioread8(barp + i));
+@@ -51,9 +52,27 @@ static int marvell_pre_reset(struct ata_link *link, unsigned long deadline)
+ 	devices = ioread32(barp + 0x0C);
+ 	pci_iounmap(pdev, barp);
+ 
+-	if ((pdev->device == 0x6145) && (ap->port_no == 0) &&
+-	    (!(devices & 0x10)))	/* PATA enable ? */
+-		return -ENOENT;
++	if (devices & 0x10)
++		return 1;
++	return 0;
++}
++
++/**
++ *	marvell_pre_reset	-	check for 40/80 pin
++ *	@link: link
++ *	@deadline: deadline jiffies for the operation
++ *
++ *	Perform the PATA port setup we need.
++ */
++
++static int marvell_pre_reset(struct ata_link *link, unsigned long deadline)
++{
++	struct ata_port *ap = link->ap;
++	struct pci_dev *pdev = to_pci_dev(ap->host->dev);
++
++	if (pdev->device == 0x6145 && ap->port_no == 0 &&
++		!marvell_pata_active(pdev))	/* PATA enable ? */
++			return -ENOENT;
+ 
+ 	return ata_sff_prereset(link, deadline);
+ }
+@@ -128,6 +147,12 @@ static int marvell_init_one (struct pci_dev *pdev, const struct pci_device_id *i
+ 	if (pdev->device == 0x6101)
+ 		ppi[1] = &ata_dummy_port_info;
+ 
++#if defined(CONFIG_AHCI) || defined(CONFIG_AHCI_MODULE)
++	if (!marvell_pata_active(pdev)) {
++		printk(KERN_INFO DRV_NAME ": PATA port not active, deferring to AHCI driver.\n");
++		return -ENODEV;
++	}
++#endif
+ 	return ata_pci_sff_init_one(pdev, ppi, &marvell_sht, NULL);
+ }
+ 
================================================================

---- CVS-web:
    http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/SOURCES/kernel-ahci_pata_marvell.patch?r1=1.1&r2=1.2&f=u



More information about the pld-cvs-commit mailing list