[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#600305: forcing dma mode



On Sun, Oct 17, 2010 at 01:03:04AM +0000, Debian Bug Tracking System wrote:
> Processing commands for control@bugs.debian.org:
> 
> > # Automatically generated email from bts, devscripts version 2.10.35lenny7
> > tags 600305 + pending
> Bug #600305 [linux-image-2.6.32-5-amd64] linux-image-2.6.32-5-amd64: MacBookPro 7, 1 mcp89 sata link reset fails, no disks detected during install process
> Added tag(s) pending.
> >
> End of message, stopping processing here.
> 
> Please contact me if you need assistance.

Ben,
  Should we include these as well to force on DMA mode?

-- 
dann frazier

[Backported to Debian's 2.6.32 by dann frazier <dannf@debian.org>]

commit 1529c69adce1e95f7ae72f0441590c226bbac7fc
Author: Tejun Heo <tj@kernel.org>
Date:   Tue Jun 22 12:27:26 2010 +0200

    ata_generic: implement ATA_GEN_* flags and force enable DMA on MBP 7,1
    
    IDE mode of MCP89 on MBP 7,1 doesn't set DMA enable bits in the BMDMA
    status register.  Make the following changes to work around the problem.
    
    * Instead of using hard coded 1 in id->driver_data as class code
      match, use ATA_GEN_CLASS_MATCH and carry the matched id in
      host->private_data.
    
    * Instead of matching PCI_VENDOR_ID_CENATEK, use ATA_GEN_FORCE_DMA
      flag in id instead.
    
    * Add ATA_GEN_FORCE_DMA to the id entry of MBP 7,1.
    
    Signed-off-by: Tejun Heo <tj@kernel.org>
    Cc: Peer Chen <pchen@nvidia.com>
    Cc: stable@kernel.org
    Reported-by: Anders Ã?sthus <grapz666@gmail.com>
    Reported-by: Andreas Graf <andreas_graf@csgraf.de>
    Reported-by: Benoit Gschwind <gschwind@gnu-log.net>
    Reported-by: Damien Cassou <damien.cassou@gmail.com>
    Reported-by: tixetsal@juno.com
    Signed-off-by: Jeff Garzik <jgarzik@redhat.com>

diff -urpN a/drivers/ata/ata_generic.c b/drivers/ata/ata_generic.c
--- a/drivers/ata/ata_generic.c	2010-10-18 17:18:22.160591155 -0600
+++ b/drivers/ata/ata_generic.c	2010-10-18 17:28:35.700130856 -0600
@@ -32,6 +32,11 @@
  *	A generic parallel ATA driver using libata
  */
 
+enum {
+	ATA_GEN_CLASS_MATCH		= (1 << 0),
+	ATA_GEN_FORCE_DMA		= (1 << 1),
+};
+
 /**
  *	generic_set_mode	-	mode setting
  *	@link: link to set up
@@ -46,13 +51,17 @@
 static int generic_set_mode(struct ata_link *link, struct ata_device **unused)
 {
 	struct ata_port *ap = link->ap;
+	const struct pci_device_id *id = ap->host->private_data;
 	int dma_enabled = 0;
 	struct ata_device *dev;
 	struct pci_dev *pdev = to_pci_dev(ap->host->dev);
 
-	/* Bits 5 and 6 indicate if DMA is active on master/slave */
-	if (ap->ioaddr.bmdma_addr)
+	if (id->driver_data & ATA_GEN_FORCE_DMA) {
+		dma_enabled = 0xff;
+	} else if (ap->ioaddr.bmdma_addr) {
+		/* Bits 5 and 6 indicate if DMA is active on master/slave */
 		dma_enabled = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
+	}
 
 	if (pdev->vendor == PCI_VENDOR_ID_CENATEK)
 		dma_enabled = 0xFF;
@@ -126,7 +135,7 @@ static int ata_generic_init_one(struct p
 	const struct ata_port_info *ppi[] = { &info, NULL };
 
 	/* Don't use the generic entry unless instructed to do so */
-	if (id->driver_data == 1 && all_generic_ide == 0)
+	if ((id->driver_data & ATA_GEN_CLASS_MATCH) && all_generic_ide == 0)
 		return -ENODEV;
 
 	/* Devices that need care */
@@ -155,7 +164,7 @@ static int ata_generic_init_one(struct p
 			return rc;
 		pcim_pin_device(dev);
 	}
-	return ata_pci_sff_init_one(dev, ppi, &generic_sht, NULL);
+	return ata_pci_sff_init_one(dev, ppi, &generic_sht, (void *)id);
 }
 
 static struct pci_device_id ata_generic[] = {
@@ -167,18 +176,21 @@ static struct pci_device_id ata_generic[
 	{ PCI_DEVICE(PCI_VENDOR_ID_HINT,   PCI_DEVICE_ID_HINT_VXPROII_IDE), },
 	{ PCI_DEVICE(PCI_VENDOR_ID_VIA,    PCI_DEVICE_ID_VIA_82C561), },
 	{ PCI_DEVICE(PCI_VENDOR_ID_OPTI,   PCI_DEVICE_ID_OPTI_82C558), },
-	{ PCI_DEVICE(PCI_VENDOR_ID_CENATEK,PCI_DEVICE_ID_CENATEK_IDE), },
+	{ PCI_DEVICE(PCI_VENDOR_ID_CENATEK,PCI_DEVICE_ID_CENATEK_IDE),
+	  .driver_data = ATA_GEN_FORCE_DMA },
 	/*
 	 * For some reason, MCP89 on MacBook 7,1 doesn't work with
 	 * ahci, use ata_generic instead.
 	 */
 	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP89_SATA,
-	  PCI_VENDOR_ID_APPLE, 0xcb89, },
+	  PCI_VENDOR_ID_APPLE, 0xcb89,
+	  .driver_data = ATA_GEN_FORCE_DMA },
 	{ PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO), },
 	{ PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_1), },
 	{ PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_2),  },
 	/* Must come last. If you add entries adjust this table appropriately */
-	{ PCI_ANY_ID,		PCI_ANY_ID,			   PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL, 1},
+	{ PCI_DEVICE_CLASS(PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL),
+	  .driver_data = ATA_GEN_CLASS_MATCH },
 	{ 0, },
 };
 
commit 728e0eaf99631d197e5158e21b4a8c4335a39231
Author: Tejun Heo <tj@kernel.org>
Date:   Fri Jul 2 14:41:24 2010 +0200

    ata_generic: drop hard coded DMA force logic for CENATEK
    
    Commit 1529c69adc (ata_generic: implement ATA_GEN_* flags and force
    enable DMA on MBP 7,1) implemented ATA_GEN_FORCE_DMA for forcing DMA
    mode and applied it to CENATEK but forgot to remove the original hard
    coded logic.  This is removal of redundant logic and doesn't affect
    correctness.
    
    Signed-off-by: Tejun Heo <tj@kernel.org>
    Reported-by: Andy Whitcroft <apw@canonical.com>
    Signed-off-by: Jeff Garzik <jgarzik@redhat.com>

diff --git a/drivers/ata/ata_generic.c b/drivers/ata/ata_generic.c
index 7107a69..cc5f772 100644
--- a/drivers/ata/ata_generic.c
+++ b/drivers/ata/ata_generic.c
@@ -54,7 +54,6 @@ static int generic_set_mode(struct ata_link *link, struct ata_device **unused)
 	const struct pci_device_id *id = ap->host->private_data;
 	int dma_enabled = 0;
 	struct ata_device *dev;
-	struct pci_dev *pdev = to_pci_dev(ap->host->dev);
 
 	if (id->driver_data & ATA_GEN_FORCE_DMA) {
 		dma_enabled = 0xff;
@@ -63,9 +62,6 @@ static int generic_set_mode(struct ata_link *link, struct ata_device **unused)
 		dma_enabled = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
 	}
 
-	if (pdev->vendor == PCI_VENDOR_ID_CENATEK)
-		dma_enabled = 0xFF;
-
 	ata_for_each_dev(dev, link, ENABLED) {
 		/* We don't really care */
 		dev->pio_mode = XFER_PIO_0;

Reply to: