File linux-2.6-sata-promise-pata-ports.patch of Package kernel
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;
};