diff options
Diffstat (limited to 'drivers/ata/pata_pcmcia.c')
-rw-r--r-- | drivers/ata/pata_pcmcia.c | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/drivers/ata/pata_pcmcia.c b/drivers/ata/pata_pcmcia.c index 64b2e2281ee7..f4d009ed50ac 100644 --- a/drivers/ata/pata_pcmcia.c +++ b/drivers/ata/pata_pcmcia.c | |||
@@ -42,7 +42,7 @@ | |||
42 | 42 | ||
43 | 43 | ||
44 | #define DRV_NAME "pata_pcmcia" | 44 | #define DRV_NAME "pata_pcmcia" |
45 | #define DRV_VERSION "0.3.3" | 45 | #define DRV_VERSION "0.3.5" |
46 | 46 | ||
47 | /* | 47 | /* |
48 | * Private data structure to glue stuff together | 48 | * Private data structure to glue stuff together |
@@ -126,6 +126,37 @@ static unsigned int ata_data_xfer_8bit(struct ata_device *dev, | |||
126 | return buflen; | 126 | return buflen; |
127 | } | 127 | } |
128 | 128 | ||
129 | /** | ||
130 | * pcmcia_8bit_drain_fifo - Stock FIFO drain logic for SFF controllers | ||
131 | * @qc: command | ||
132 | * | ||
133 | * Drain the FIFO and device of any stuck data following a command | ||
134 | * failing to complete. In some cases this is neccessary before a | ||
135 | * reset will recover the device. | ||
136 | * | ||
137 | */ | ||
138 | |||
139 | void pcmcia_8bit_drain_fifo(struct ata_queued_cmd *qc) | ||
140 | { | ||
141 | int count; | ||
142 | struct ata_port *ap; | ||
143 | |||
144 | /* We only need to flush incoming data when a command was running */ | ||
145 | if (qc == NULL || qc->dma_dir == DMA_TO_DEVICE) | ||
146 | return; | ||
147 | |||
148 | ap = qc->ap; | ||
149 | |||
150 | /* Drain up to 64K of data before we give up this recovery method */ | ||
151 | for (count = 0; (ap->ops->sff_check_status(ap) & ATA_DRQ) | ||
152 | && count++ < 65536;) | ||
153 | ioread8(ap->ioaddr.data_addr); | ||
154 | |||
155 | if (count) | ||
156 | ata_port_printk(ap, KERN_WARNING, "drained %d bytes to clear DRQ.\n", | ||
157 | count); | ||
158 | |||
159 | } | ||
129 | 160 | ||
130 | static struct scsi_host_template pcmcia_sht = { | 161 | static struct scsi_host_template pcmcia_sht = { |
131 | ATA_PIO_SHT(DRV_NAME), | 162 | ATA_PIO_SHT(DRV_NAME), |
@@ -143,6 +174,7 @@ static struct ata_port_operations pcmcia_8bit_port_ops = { | |||
143 | .sff_data_xfer = ata_data_xfer_8bit, | 174 | .sff_data_xfer = ata_data_xfer_8bit, |
144 | .cable_detect = ata_cable_40wire, | 175 | .cable_detect = ata_cable_40wire, |
145 | .set_mode = pcmcia_set_mode_8bit, | 176 | .set_mode = pcmcia_set_mode_8bit, |
177 | .drain_fifo = pcmcia_8bit_drain_fifo, | ||
146 | }; | 178 | }; |
147 | 179 | ||
148 | #define CS_CHECK(fn, ret) \ | 180 | #define CS_CHECK(fn, ret) \ |
@@ -299,7 +331,7 @@ static int pcmcia_init_one(struct pcmcia_device *pdev) | |||
299 | ap = host->ports[p]; | 331 | ap = host->ports[p]; |
300 | 332 | ||
301 | ap->ops = ops; | 333 | ap->ops = ops; |
302 | ap->pio_mask = 1; /* ISA so PIO 0 cycles */ | 334 | ap->pio_mask = ATA_PIO0; /* ISA so PIO 0 cycles */ |
303 | ap->flags |= ATA_FLAG_SLAVE_POSS; | 335 | ap->flags |= ATA_FLAG_SLAVE_POSS; |
304 | ap->ioaddr.cmd_addr = io_addr + 0x10 * p; | 336 | ap->ioaddr.cmd_addr = io_addr + 0x10 * p; |
305 | ap->ioaddr.altstatus_addr = ctl_addr + 0x10 * p; | 337 | ap->ioaddr.altstatus_addr = ctl_addr + 0x10 * p; |