diff options
Diffstat (limited to 'drivers/ata/libata-sff.c')
-rw-r--r-- | drivers/ata/libata-sff.c | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c index 7645f2b30ccf..10ee22ae5c15 100644 --- a/drivers/ata/libata-sff.c +++ b/drivers/ata/libata-sff.c | |||
@@ -39,6 +39,35 @@ | |||
39 | #include "libata.h" | 39 | #include "libata.h" |
40 | 40 | ||
41 | /** | 41 | /** |
42 | * ata_irq_on - Enable interrupts on a port. | ||
43 | * @ap: Port on which interrupts are enabled. | ||
44 | * | ||
45 | * Enable interrupts on a legacy IDE device using MMIO or PIO, | ||
46 | * wait for idle, clear any pending interrupts. | ||
47 | * | ||
48 | * LOCKING: | ||
49 | * Inherited from caller. | ||
50 | */ | ||
51 | u8 ata_irq_on(struct ata_port *ap) | ||
52 | { | ||
53 | struct ata_ioports *ioaddr = &ap->ioaddr; | ||
54 | u8 tmp; | ||
55 | |||
56 | ap->ctl &= ~ATA_NIEN; | ||
57 | ap->last_ctl = ap->ctl; | ||
58 | |||
59 | if (ap->flags & ATA_FLAG_MMIO) | ||
60 | writeb(ap->ctl, (void __iomem *) ioaddr->ctl_addr); | ||
61 | else | ||
62 | outb(ap->ctl, ioaddr->ctl_addr); | ||
63 | tmp = ata_wait_idle(ap); | ||
64 | |||
65 | ap->ops->irq_clear(ap); | ||
66 | |||
67 | return tmp; | ||
68 | } | ||
69 | |||
70 | /** | ||
42 | * ata_tf_load_pio - send taskfile registers to host controller | 71 | * ata_tf_load_pio - send taskfile registers to host controller |
43 | * @ap: Port to which output is sent | 72 | * @ap: Port to which output is sent |
44 | * @tf: ATA taskfile register set | 73 | * @tf: ATA taskfile register set |
@@ -671,6 +700,14 @@ void ata_bmdma_freeze(struct ata_port *ap) | |||
671 | writeb(ap->ctl, (void __iomem *)ioaddr->ctl_addr); | 700 | writeb(ap->ctl, (void __iomem *)ioaddr->ctl_addr); |
672 | else | 701 | else |
673 | outb(ap->ctl, ioaddr->ctl_addr); | 702 | outb(ap->ctl, ioaddr->ctl_addr); |
703 | |||
704 | /* Under certain circumstances, some controllers raise IRQ on | ||
705 | * ATA_NIEN manipulation. Also, many controllers fail to mask | ||
706 | * previously pending IRQ on ATA_NIEN assertion. Clear it. | ||
707 | */ | ||
708 | ata_chk_status(ap); | ||
709 | |||
710 | ap->ops->irq_clear(ap); | ||
674 | } | 711 | } |
675 | 712 | ||
676 | /** | 713 | /** |
@@ -714,7 +751,6 @@ void ata_bmdma_drive_eh(struct ata_port *ap, ata_prereset_fn_t prereset, | |||
714 | ata_reset_fn_t softreset, ata_reset_fn_t hardreset, | 751 | ata_reset_fn_t softreset, ata_reset_fn_t hardreset, |
715 | ata_postreset_fn_t postreset) | 752 | ata_postreset_fn_t postreset) |
716 | { | 753 | { |
717 | struct ata_eh_context *ehc = &ap->eh_context; | ||
718 | struct ata_queued_cmd *qc; | 754 | struct ata_queued_cmd *qc; |
719 | unsigned long flags; | 755 | unsigned long flags; |
720 | int thaw = 0; | 756 | int thaw = 0; |
@@ -732,9 +768,7 @@ void ata_bmdma_drive_eh(struct ata_port *ap, ata_prereset_fn_t prereset, | |||
732 | qc->tf.protocol == ATA_PROT_ATAPI_DMA)) { | 768 | qc->tf.protocol == ATA_PROT_ATAPI_DMA)) { |
733 | u8 host_stat; | 769 | u8 host_stat; |
734 | 770 | ||
735 | host_stat = ata_bmdma_status(ap); | 771 | host_stat = ap->ops->bmdma_status(ap); |
736 | |||
737 | ata_ehi_push_desc(&ehc->i, "BMDMA stat 0x%x", host_stat); | ||
738 | 772 | ||
739 | /* BMDMA controllers indicate host bus error by | 773 | /* BMDMA controllers indicate host bus error by |
740 | * setting DMA_ERR bit and timing out. As it wasn't | 774 | * setting DMA_ERR bit and timing out. As it wasn't |
@@ -877,6 +911,7 @@ static struct ata_probe_ent *ata_pci_init_legacy_port(struct pci_dev *pdev, | |||
877 | return NULL; | 911 | return NULL; |
878 | 912 | ||
879 | probe_ent->n_ports = 2; | 913 | probe_ent->n_ports = 2; |
914 | probe_ent->irq_flags = IRQF_SHARED; | ||
880 | 915 | ||
881 | if (port_mask & ATA_PORT_PRIMARY) { | 916 | if (port_mask & ATA_PORT_PRIMARY) { |
882 | probe_ent->irq = ATA_PRIMARY_IRQ; | 917 | probe_ent->irq = ATA_PRIMARY_IRQ; |