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; };