|
@@ -79,8 +79,6 @@ enum board_ids {
|
|
|
};
|
|
|
|
|
|
static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
|
|
|
-static int ahci_sb600_softreset(struct ata_link *link, unsigned int *class,
|
|
|
- unsigned long deadline);
|
|
|
static int ahci_vt8251_hardreset(struct ata_link *link, unsigned int *class,
|
|
|
unsigned long deadline);
|
|
|
static int ahci_p5wdh_hardreset(struct ata_link *link, unsigned int *class,
|
|
@@ -104,12 +102,6 @@ static struct ata_port_operations ahci_p5wdh_ops = {
|
|
|
.hardreset = ahci_p5wdh_hardreset,
|
|
|
};
|
|
|
|
|
|
-static struct ata_port_operations ahci_sb600_ops = {
|
|
|
- .inherits = &ahci_ops,
|
|
|
- .softreset = ahci_sb600_softreset,
|
|
|
- .pmp_softreset = ahci_sb600_softreset,
|
|
|
-};
|
|
|
-
|
|
|
#define AHCI_HFLAGS(flags) .private_data = (void *)(flags)
|
|
|
|
|
|
static const struct ata_port_info ahci_port_info[] = {
|
|
@@ -188,7 +180,7 @@ static const struct ata_port_info ahci_port_info[] = {
|
|
|
.flags = AHCI_FLAG_COMMON,
|
|
|
.pio_mask = ATA_PIO4,
|
|
|
.udma_mask = ATA_UDMA6,
|
|
|
- .port_ops = &ahci_sb600_ops,
|
|
|
+ .port_ops = &ahci_pmp_retry_srst_ops,
|
|
|
},
|
|
|
[board_ahci_sb700] = /* for SB700 and SB800 */
|
|
|
{
|
|
@@ -196,7 +188,7 @@ static const struct ata_port_info ahci_port_info[] = {
|
|
|
.flags = AHCI_FLAG_COMMON,
|
|
|
.pio_mask = ATA_PIO4,
|
|
|
.udma_mask = ATA_UDMA6,
|
|
|
- .port_ops = &ahci_sb600_ops,
|
|
|
+ .port_ops = &ahci_pmp_retry_srst_ops,
|
|
|
},
|
|
|
[board_ahci_vt8251] =
|
|
|
{
|
|
@@ -502,54 +494,6 @@ static void ahci_pci_init_controller(struct ata_host *host)
|
|
|
ahci_init_controller(host);
|
|
|
}
|
|
|
|
|
|
-static int ahci_sb600_check_ready(struct ata_link *link)
|
|
|
-{
|
|
|
- void __iomem *port_mmio = ahci_port_base(link->ap);
|
|
|
- u8 status = readl(port_mmio + PORT_TFDATA) & 0xFF;
|
|
|
- u32 irq_status = readl(port_mmio + PORT_IRQ_STAT);
|
|
|
-
|
|
|
- /*
|
|
|
- * There is no need to check TFDATA if BAD PMP is found due to HW bug,
|
|
|
- * which can save timeout delay.
|
|
|
- */
|
|
|
- if (irq_status & PORT_IRQ_BAD_PMP)
|
|
|
- return -EIO;
|
|
|
-
|
|
|
- return ata_check_ready(status);
|
|
|
-}
|
|
|
-
|
|
|
-static int ahci_sb600_softreset(struct ata_link *link, unsigned int *class,
|
|
|
- unsigned long deadline)
|
|
|
-{
|
|
|
- struct ata_port *ap = link->ap;
|
|
|
- void __iomem *port_mmio = ahci_port_base(ap);
|
|
|
- int pmp = sata_srst_pmp(link);
|
|
|
- int rc;
|
|
|
- u32 irq_sts;
|
|
|
-
|
|
|
- DPRINTK("ENTER\n");
|
|
|
-
|
|
|
- rc = ahci_do_softreset(link, class, pmp, deadline,
|
|
|
- ahci_sb600_check_ready);
|
|
|
-
|
|
|
- /*
|
|
|
- * Soft reset fails on some ATI chips with IPMS set when PMP
|
|
|
- * is enabled but SATA HDD/ODD is connected to SATA port,
|
|
|
- * do soft reset again to port 0.
|
|
|
- */
|
|
|
- if (rc == -EIO) {
|
|
|
- irq_sts = readl(port_mmio + PORT_IRQ_STAT);
|
|
|
- if (irq_sts & PORT_IRQ_BAD_PMP) {
|
|
|
- ata_link_warn(link,
|
|
|
- "applying SB600 PMP SRST workaround and retrying\n");
|
|
|
- rc = ahci_do_softreset(link, class, 0, deadline,
|
|
|
- ahci_check_ready);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return rc;
|
|
|
-}
|
|
|
-
|
|
|
static int ahci_vt8251_hardreset(struct ata_link *link, unsigned int *class,
|
|
|
unsigned long deadline)
|
|
|
{
|