Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > fc11cd6e1c513a17304da94a5390f3cd > files > 3261

kernel-2.6.18-194.11.1.el5.src.rpm

This will update the following files:

 drivers/scsi/libata-core.c
 include/linux/libata.h
 drivers/scsi/sata_promise.c

through these ChangeSets:

  o [libata sata_promise] support PATA ports on SATA controllers

diff -Nru a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c
--- a/drivers/scsi/libata-core.c	2006-02-08 11:34:51.000000000 -0700
+++ b/drivers/scsi/libata-core.c	2006-02-08 11:37:11.000000000 -0700
@@ -4423,6 +4423,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];	/* pata fix */
 	ap->ops = ent->port_ops;
 	ap->cbl = ATA_CBL_NONE;
 	ap->active_tag = ATA_TAG_POISON;
diff -Nru a/drivers/scsi/sata_promise.c b/drivers/scsi/sata_promise.c
--- a/drivers/scsi/sata_promise.c	2006-02-08 10:08:08.000000000 -0700
+++ b/drivers/scsi/sata_promise.c	2006-02-08 11:26:47.000000000 -0700
@@ -172,7 +172,7 @@
 	/* board_2037x */
 	{
 		.sht		= &pdc_ata_sht,
-		.host_flags	= PDC_COMMON_FLAGS | ATA_FLAG_SATA,
+		.host_flags	= PDC_COMMON_FLAGS /* | ATA_FLAG_SATA */,	/* pata fix */
 		.pio_mask	= 0x1f, /* pio0-4 */
 		.mwdma_mask	= 0x07, /* mwdma0-2 */
 		.udma_mask	= 0x7f, /* udma0-6 ; FIXME */
@@ -363,8 +363,16 @@ static void pdc_reset_port(struct ata_po
 
 static void pdc_sata_phy_reset(struct ata_port *ap)
 {
-	pdc_reset_port(ap);
-	sata_phy_reset(ap);
+	/*    pdc_reset_port(ap); */  /* pata fix */
+	/*    sata_phy_reset(ap); */  /* pata fix */
+	/* if no sata flag, test for pata drive */      /* pata fix */
+	if (ap->flags & ATA_FLAG_SATA)  /* pata fix */
+	{                               /* pata fix */
+		pdc_reset_port(ap);     /* pata fix */
+		sata_phy_reset(ap);     /* pata fix */
+	}                               /* pata fix */
+	else                            /* pata fix */
+		pdc_pata_phy_reset(ap); /* pata fix */
 }
 
 static void pdc_pata_cbl_detect(struct ata_port *ap)
@@ -383,6 +391,12 @@ static void pdc_pata_cbl_detect(struct a
 
 static void pdc_pata_phy_reset(struct ata_port *ap)
 {
+	u8 tmp;                                         /* pata fix */
+	void *mmio = (void *) ap->ioaddr.cmd_addr + PDC_CTLSTAT + 0x03; /* pata fix */
+	tmp = readb(mmio);                              /* pata fix */
+	if (tmp & 0x01)                                 /* pata fix */
+		ap->udma_mask &= ATA_UDMA_MASK_40C;     /* pata fix */
+
 	pdc_pata_cbl_detect(ap);
 	pdc_reset_port(ap);
 	ata_port_probe(ap);
@@ -673,6 +692,7 @@
 	unsigned int board_idx = (unsigned int) ent->driver_data;
 	int pci_dev_busy = 0;
 	int rc;
+	u8 tmp;		/* pata fix */
 
 	if (!printed_version++)
 		dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
@@ -741,6 +761,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;	/* pata fix */
+	probe_ent->port_flags[1] = ATA_FLAG_SATA;	/* pata fix */
+	
 	/* notice 4-port boards */
 	switch (board_idx) {
 	case board_20319:
@@ -755,13 +778,27 @@
 
 		probe_ent->port[2].scr_addr = base + 0x600;
 		probe_ent->port[3].scr_addr = base + 0x700;
+
+		probe_ent->port_flags[2] = ATA_FLAG_SATA;	/* pata fix */
+		probe_ent->port_flags[3] = ATA_FLAG_SATA;	/* pata fix */
 		break;
	case board_2057x:
		/* Override hotplug offset for SATAII150 */
		hp->hotplug_offset = PDC2_SATA_PLUG_CSR;
		/* Fall through */
 	case board_2037x:
-		probe_ent->n_ports = 2;
+/*		probe_ent->n_ports = 2; */			/* pata fix */
+		/* Some boards have also PATA port */		/* pata fix */
+		tmp = readb(mmio_base + PDC_FLASH_CTL+1);	/* pata fix */
+		if (!(tmp & 0x80))				/* pata fix */
+		{						/* pata fix */
+			probe_ent->n_ports = 3;			/* pata fix */
+			pdc_ata_setup_port(&probe_ent->port[2], base + 0x300);	/* pata fix */
+			probe_ent->port_flags[2] = ATA_FLAG_SLAVE_POSS;		/* pata fix */
+			printk(KERN_INFO DRV_NAME " PATA port found\n");	/* pata fix */
+		}						/* pata fix */
+		else						/* pata fix */
+       			probe_ent->n_ports = 2;			/* pata fix */
 		break;
 	case board_20771:
 		probe_ent->n_ports = 2;
@@ -774,6 +811,9 @@
 
 		probe_ent->port[2].scr_addr = base + 0x600;
 		probe_ent->port[3].scr_addr = base + 0x700;
+
+		probe_ent->port_flags[2] = ATA_FLAG_SATA;	/* pata fix */
+		probe_ent->port_flags[3] = ATA_FLAG_SATA;	/* pata fix */
 		break;
 	default:
 		BUG();
diff -Nru a/include/linux/libata.h b/include/linux/libata.h
--- a/include/linux/libata.h	2006-02-08 11:40:54.000000000 -0700
+++ b/include/linux/libata.h	2006-02-08 11:45:02.000000000 -0700
@@ -281,6 +281,7 @@
 	unsigned long		irq;
 	unsigned int		irq_flags;
 	unsigned long		host_flags;
+	unsigned long		port_flags[ATA_MAX_PORTS];	/* pata fix */
	unsigned long		host_set_flags;
 	void __iomem		*mmio_base;
 	void			*private_data;
 };