* [PATCH 0/4] Small set of further libata patches
@ 2008-10-17 18:08 Alan Cox
2008-10-17 18:08 ` [PATCH 1/4] pata_ninja32: suspend/resume support Alan Cox
` (3 more replies)
0 siblings, 4 replies; 19+ messages in thread
From: Alan Cox @ 2008-10-17 18:08 UTC (permalink / raw)
To: jeff, linux-ide
Sort out ninja32 suspend/resume
Do data draining to fix stuck DRQ errors
First cut at lost IRQ recovery
---
Alan Cox (4):
libata: clean up the SFF code for coding style
libata: Improve timeout handling
libata: Drain data on errors
pata_ninja32: suspend/resume support
drivers/ata/libata-eh.c | 19 +++-
drivers/ata/libata-sff.c | 222 +++++++++++++++++++++++++++++++-------------
drivers/ata/pata_isapnp.c | 12 ++
drivers/ata/pata_ninja32.c | 43 +++++++--
drivers/ata/pata_pcmcia.c | 34 +++++++
include/linux/libata.h | 5 +
6 files changed, 254 insertions(+), 81 deletions(-)
--
"I don't think we should kill you because you are right this time around."
- Cristian Gafton
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH 1/4] pata_ninja32: suspend/resume support
2008-10-17 18:08 [PATCH 0/4] Small set of further libata patches Alan Cox
@ 2008-10-17 18:08 ` Alan Cox
2008-10-28 4:42 ` Jeff Garzik
2008-10-17 18:08 ` [PATCH 2/4] libata: Drain data on errors Alan Cox
` (2 subsequent siblings)
3 siblings, 1 reply; 19+ messages in thread
From: Alan Cox @ 2008-10-17 18:08 UTC (permalink / raw)
To: jeff, linux-ide
From: Alan Cox <alan@redhat.com>
I had assumed that the standard recovery would be sufficient for this
hardware but it isn't. Fix up the other registers on resume as needed. See
bug #11735
Signed-off-by: Alan Cox <alan@redhat.com>
---
drivers/ata/pata_ninja32.c | 43 ++++++++++++++++++++++++++++++++++---------
1 files changed, 34 insertions(+), 9 deletions(-)
diff --git a/drivers/ata/pata_ninja32.c b/drivers/ata/pata_ninja32.c
index 565e67c..dd9bd55 100644
--- a/drivers/ata/pata_ninja32.c
+++ b/drivers/ata/pata_ninja32.c
@@ -45,7 +45,7 @@
#include <linux/libata.h>
#define DRV_NAME "pata_ninja32"
-#define DRV_VERSION "0.0.1"
+#define DRV_VERSION "0.1.1"
/**
@@ -89,6 +89,17 @@ static struct ata_port_operations ninja32_port_ops = {
.set_piomode = ninja32_set_piomode,
};
+static void ninja32_program(void __iomem *base)
+{
+ iowrite8(0x05, base + 0x01); /* Enable interrupt lines */
+ iowrite8(0xBE, base + 0x02); /* Burst, ?? setup */
+ iowrite8(0x01, base + 0x03); /* Unknown */
+ iowrite8(0x20, base + 0x04); /* WAIT0 */
+ iowrite8(0x8f, base + 0x05); /* Unknown */
+ iowrite8(0xa4, base + 0x1c); /* Unknown */
+ iowrite8(0x83, base + 0x1d); /* BMDMA control: WAIT0 */
+}
+
static int ninja32_init_one(struct pci_dev *dev, const struct pci_device_id *id)
{
struct ata_host *host;
@@ -134,18 +145,28 @@ static int ninja32_init_one(struct pci_dev *dev, const struct pci_device_id *id)
ap->ioaddr.bmdma_addr = base;
ata_sff_std_ports(&ap->ioaddr);
- iowrite8(0x05, base + 0x01); /* Enable interrupt lines */
- iowrite8(0xBE, base + 0x02); /* Burst, ?? setup */
- iowrite8(0x01, base + 0x03); /* Unknown */
- iowrite8(0x20, base + 0x04); /* WAIT0 */
- iowrite8(0x8f, base + 0x05); /* Unknown */
- iowrite8(0xa4, base + 0x1c); /* Unknown */
- iowrite8(0x83, base + 0x1d); /* BMDMA control: WAIT0 */
+ ninja32_program(base);
/* FIXME: Should we disable them at remove ? */
return ata_host_activate(host, dev->irq, ata_sff_interrupt,
IRQF_SHARED, &ninja32_sht);
}
+#ifdef CONFIG_PM
+
+static int ninja32_reinit_one(struct pci_dev *pdev)
+{
+ struct ata_host *host = dev_get_drvdata(&pdev->dev);
+ int rc;
+
+ rc = ata_pci_device_do_resume(pdev);
+ if (rc)
+ return rc;
+ ninja32_program(host->iomap[0]);
+ ata_host_resume(host);
+ return 0;
+}
+#endif
+
static const struct pci_device_id ninja32[] = {
{ 0x1145, 0xf021, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
{ 0x1145, 0xf024, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
@@ -156,7 +177,11 @@ static struct pci_driver ninja32_pci_driver = {
.name = DRV_NAME,
.id_table = ninja32,
.probe = ninja32_init_one,
- .remove = ata_pci_remove_one
+ .remove = ata_pci_remove_one,
+#ifdef CONFIG_PM
+ .suspend = ata_pci_device_suspend,
+ .resume = ninja32_reinit_one,
+#endif
};
static int __init ninja32_init(void)
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH 2/4] libata: Drain data on errors
2008-10-17 18:08 [PATCH 0/4] Small set of further libata patches Alan Cox
2008-10-17 18:08 ` [PATCH 1/4] pata_ninja32: suspend/resume support Alan Cox
@ 2008-10-17 18:08 ` Alan Cox
2008-10-22 15:46 ` Elias Oltmanns
2008-10-27 19:14 ` Mark Lord
2008-10-17 18:08 ` [PATCH 3/4] libata: Improve timeout handling Alan Cox
2008-10-17 18:09 ` [PATCH 4/4] libata: clean up the SFF code for coding style Alan Cox
3 siblings, 2 replies; 19+ messages in thread
From: Alan Cox @ 2008-10-17 18:08 UTC (permalink / raw)
To: jeff, linux-ide
From: Alan Cox <alan@redhat.com>
If the device is signalling that there is data to drain after an error we
should read the bytes out and throw them away. Without this some devices
and controllers get wedged and don't recover.
Based on earlier work by Mark Lord
Signed-off-by: Alan Cox <alan@redhat.com>
---
drivers/ata/libata-sff.c | 44 +++++++++++++++++++++++++++++++++++++++++++-
drivers/ata/pata_pcmcia.c | 34 +++++++++++++++++++++++++++++++++-
include/linux/libata.h | 3 +++
3 files changed, 79 insertions(+), 2 deletions(-)
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
index 2a4c516..3e25391 100644
--- a/drivers/ata/libata-sff.c
+++ b/drivers/ata/libata-sff.c
@@ -52,6 +52,7 @@ const struct ata_port_operations ata_sff_port_ops = {
.softreset = ata_sff_softreset,
.hardreset = sata_sff_hardreset,
.postreset = ata_sff_postreset,
+ .drain_fifo = ata_sff_drain_fifo,
.error_handler = ata_sff_error_handler,
.post_internal_cmd = ata_sff_post_internal_cmd,
@@ -2073,6 +2074,38 @@ void ata_sff_postreset(struct ata_link *link, unsigned int *classes)
}
/**
+ * ata_sff_drain_fifo - Stock FIFO drain logic for SFF controllers
+ * @qc: command
+ *
+ * Drain the FIFO and device of any stuck data following a command
+ * failing to complete. In some cases this is neccessary before a
+ * reset will recover the device.
+ *
+ */
+
+void ata_sff_drain_fifo(struct ata_queued_cmd *qc)
+{
+ int count;
+ struct ata_port *ap;
+
+ /* We only need to flush incoming data when a command was running */
+ if (qc == NULL || qc->dma_dir == DMA_TO_DEVICE)
+ return;
+
+ ap = qc->ap;
+ /* Drain up to 64K of data before we give up this recovery method */
+ for (count = 0; (ap->ops->sff_check_status(ap) & ATA_DRQ)
+ && count < 32768; count++)
+ ioread16(ap->ioaddr.data_addr);
+
+ /* Can become DEBUG later */
+ if (count)
+ ata_port_printk(ap, KERN_WARNING,
+ "drained %d bytes to clear DRQ.\n", count);
+
+}
+
+/**
* ata_sff_error_handler - Stock error handler for BMDMA controller
* @ap: port to handle error for
*
@@ -2113,7 +2146,8 @@ void ata_sff_error_handler(struct ata_port *ap)
* really a timeout event, adjust error mask and
* cancel frozen state.
*/
- if (qc->err_mask == AC_ERR_TIMEOUT && (host_stat & ATA_DMA_ERR)) {
+ if (qc->err_mask == AC_ERR_TIMEOUT
+ && (host_stat & ATA_DMA_ERR)) {
qc->err_mask = AC_ERR_HOST_BUS;
thaw = 1;
}
@@ -2124,6 +2158,13 @@ void ata_sff_error_handler(struct ata_port *ap)
ata_sff_sync(ap); /* FIXME: We don't need this */
ap->ops->sff_check_status(ap);
ap->ops->sff_irq_clear(ap);
+ /* We *MUST* do FIFO draining before we issue a reset as several
+ * devices helpfully clear their internal state and will lock solid
+ * if we touch the data port post reset. Pass qc in case anyone wants
+ * to do different PIO/DMA recovery or has per command fixups
+ */
+ if (ap->ops->drain_fifo)
+ ap->ops->drain_fifo(qc);
spin_unlock_irqrestore(ap->lock, flags);
@@ -2838,6 +2879,7 @@ EXPORT_SYMBOL_GPL(ata_sff_wait_after_reset);
EXPORT_SYMBOL_GPL(ata_sff_softreset);
EXPORT_SYMBOL_GPL(sata_sff_hardreset);
EXPORT_SYMBOL_GPL(ata_sff_postreset);
+EXPORT_SYMBOL_GPL(ata_sff_drain_fifo);
EXPORT_SYMBOL_GPL(ata_sff_error_handler);
EXPORT_SYMBOL_GPL(ata_sff_post_internal_cmd);
EXPORT_SYMBOL_GPL(ata_sff_port_start);
diff --git a/drivers/ata/pata_pcmcia.c b/drivers/ata/pata_pcmcia.c
index 02b596b..f08d34d 100644
--- a/drivers/ata/pata_pcmcia.c
+++ b/drivers/ata/pata_pcmcia.c
@@ -42,7 +42,7 @@
#define DRV_NAME "pata_pcmcia"
-#define DRV_VERSION "0.3.3"
+#define DRV_VERSION "0.3.5"
/*
* Private data structure to glue stuff together
@@ -126,6 +126,37 @@ static unsigned int ata_data_xfer_8bit(struct ata_device *dev,
return buflen;
}
+/**
+ * pcmcia_8bit_drain_fifo - Stock FIFO drain logic for SFF controllers
+ * @qc: command
+ *
+ * Drain the FIFO and device of any stuck data following a command
+ * failing to complete. In some cases this is neccessary before a
+ * reset will recover the device.
+ *
+ */
+
+void pcmcia_8bit_drain_fifo(struct ata_queued_cmd *qc)
+{
+ int count;
+ struct ata_port *ap;
+
+ /* We only need to flush incoming data when a command was running */
+ if (qc == NULL || qc->dma_dir == DMA_TO_DEVICE)
+ return;
+
+ ap = qc->ap;
+
+ /* Drain up to 64K of data before we give up this recovery method */
+ for (count = 0; (ap->ops->sff_check_status(ap) & ATA_DRQ)
+ && count < 65536;)
+ ioread8(ap->ioaddr.data_addr);
+
+ /* Can become DEBUG later */
+ ata_port_printk(ap, KERN_WARNING, "drained %d bytes to clear DRQ.\n",
+ count);
+
+}
static struct scsi_host_template pcmcia_sht = {
ATA_PIO_SHT(DRV_NAME),
@@ -143,6 +174,7 @@ static struct ata_port_operations pcmcia_8bit_port_ops = {
.sff_data_xfer = ata_data_xfer_8bit,
.cable_detect = ata_cable_40wire,
.set_mode = pcmcia_set_mode_8bit,
+ .drain_fifo = pcmcia_8bit_drain_fifo,
};
#define CS_CHECK(fn, ret) \
diff --git a/include/linux/libata.h b/include/linux/libata.h
index 947cf84..7bb1013 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -818,6 +818,8 @@ struct ata_port_operations {
void (*bmdma_start)(struct ata_queued_cmd *qc);
void (*bmdma_stop)(struct ata_queued_cmd *qc);
u8 (*bmdma_status)(struct ata_port *ap);
+
+ void (*drain_fifo)(struct ata_queued_cmd *qc);
#endif /* CONFIG_ATA_SFF */
ssize_t (*em_show)(struct ata_port *ap, char *buf);
@@ -1524,6 +1526,7 @@ extern int ata_sff_softreset(struct ata_link *link, unsigned int *classes,
extern int sata_sff_hardreset(struct ata_link *link, unsigned int *class,
unsigned long deadline);
extern void ata_sff_postreset(struct ata_link *link, unsigned int *classes);
+extern void ata_sff_drain_fifo(struct ata_queued_cmd *qc);
extern void ata_sff_error_handler(struct ata_port *ap);
extern void ata_sff_post_internal_cmd(struct ata_queued_cmd *qc);
extern int ata_sff_port_start(struct ata_port *ap);
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH 3/4] libata: Improve timeout handling
2008-10-17 18:08 [PATCH 0/4] Small set of further libata patches Alan Cox
2008-10-17 18:08 ` [PATCH 1/4] pata_ninja32: suspend/resume support Alan Cox
2008-10-17 18:08 ` [PATCH 2/4] libata: Drain data on errors Alan Cox
@ 2008-10-17 18:08 ` Alan Cox
2008-10-22 15:47 ` Elias Oltmanns
2008-10-17 18:09 ` [PATCH 4/4] libata: clean up the SFF code for coding style Alan Cox
3 siblings, 1 reply; 19+ messages in thread
From: Alan Cox @ 2008-10-17 18:08 UTC (permalink / raw)
To: jeff, linux-ide
From: Alan Cox <alan@redhat.com>
On a timeout call a device specific handler early in the recovery so that
we can complete and process successful commands which timed out due to IRQ
loss or the like rather more elegantly.
Signed-off-by: Alan Cox <alan@redhat.com>
---
drivers/ata/libata-eh.c | 19 +++++++++++++++++--
drivers/ata/libata-sff.c | 46 ++++++++++++++++++++++++++++++++++++++++++++-
drivers/ata/pata_isapnp.c | 12 ++++++++++--
include/linux/libata.h | 2 ++
4 files changed, 74 insertions(+), 5 deletions(-)
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
index a93247c..757b956 100644
--- a/drivers/ata/libata-eh.c
+++ b/drivers/ata/libata-eh.c
@@ -518,7 +518,7 @@ void ata_scsi_error(struct Scsi_Host *host)
/* For new EH, all qcs are finished in one of three ways -
* normal completion, error completion, and SCSI timeout.
- * Both cmpletions can race against SCSI timeout. When normal
+ * Both completions can race against SCSI timeout. When normal
* completion wins, the qc never reaches EH. When error
* completion wins, the qc has ATA_QCFLAG_FAILED set.
*
@@ -533,7 +533,19 @@ void ata_scsi_error(struct Scsi_Host *host)
int nr_timedout = 0;
spin_lock_irqsave(ap->lock, flags);
-
+
+ /* This must occur under the ap->lock as we don't want
+ a polled recovery to race the real interrupt handler
+
+ The lost_interrupt handler checks for any completed but
+ non-notified command and completes much like an IRQ handler.
+
+ We then fall into the error recovery code which will treat
+ this as if normal completion won the race */
+
+ if (ap->ops->lost_interrupt)
+ ap->ops->lost_interrupt(ap);
+
list_for_each_entry_safe(scmd, tmp, &host->eh_cmd_q, eh_entry) {
struct ata_queued_cmd *qc;
@@ -577,6 +589,9 @@ void ata_scsi_error(struct Scsi_Host *host)
ap->eh_tries = ATA_EH_MAX_TRIES;
} else
spin_unlock_wait(ap->lock);
+
+ /* If we timed raced normal completion and there is nothing to
+ recover nr_timedout == 0 why exactly are we doing error recovery ? */
repeat:
/* invoke error handler */
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
index 3e25391..1afaa96 100644
--- a/drivers/ata/libata-sff.c
+++ b/drivers/ata/libata-sff.c
@@ -65,6 +65,8 @@ const struct ata_port_operations ata_sff_port_ops = {
.sff_irq_on = ata_sff_irq_on,
.sff_irq_clear = ata_sff_irq_clear,
+ .lost_interrupt = ata_sff_lost_interrupt,
+
.port_start = ata_sff_port_start,
};
@@ -1534,7 +1536,7 @@ bool ata_sff_qc_fill_rtf(struct ata_queued_cmd *qc)
* RETURNS:
* One if interrupt was handled, zero if not (shared irq).
*/
-inline unsigned int ata_sff_host_intr(struct ata_port *ap,
+unsigned int ata_sff_host_intr(struct ata_port *ap,
struct ata_queued_cmd *qc)
{
struct ata_eh_info *ehi = &ap->link.eh_info;
@@ -1661,6 +1663,47 @@ irqreturn_t ata_sff_interrupt(int irq, void *dev_instance)
}
/**
+ * ata_sff_lost_interrupt - Check for an apparent lost interrupt
+ * @ap: port that appears to have timed out
+ *
+ * Called from the libata error handlers when the core code suspects
+ * an interrupt has been lost. If it has complete anything we can and
+ * then return. Interface must support altstatus for this faster
+ * recovery to occur.
+ *
+ * Locking:
+ * Caller holds host lock
+ */
+
+void ata_sff_lost_interrupt(struct ata_port *ap)
+{
+ u8 status;
+ struct ata_queued_cmd *qc;
+
+ /* Only one outstanding command per SFF channel */
+ qc = ata_qc_from_tag(ap, ap->link.active_tag);
+ /* Check we have a live one.. */
+ if (qc == NULL || !(qc->flags & ATA_QCFLAG_ACTIVE))
+ return;
+ /* We cannot lose an interrupt on a polled command */
+ if (qc->tf.flags & ATA_TFLAG_POLLING)
+ return;
+ /* See if the controller thinks it is still busy - if so the command
+ isn't a lost IRQ but is still in progress */
+ status = ata_sff_altstatus(ap);
+ if (status & ATA_BUSY)
+ return;
+
+ /* There was a command running, we are no longer busy and we have
+ no interrupt. */
+ ata_port_printk(ap, KERN_WARNING, "lost interrupt (Status 0x%x)\n",
+ status);
+ /* Run the host interrupt logic as if the interrupt had not been
+ lost */
+ ata_sff_host_intr(ap, qc);
+}
+
+/**
* ata_sff_freeze - Freeze SFF controller port
* @ap: port to freeze
*
@@ -2871,6 +2914,7 @@ EXPORT_SYMBOL_GPL(ata_sff_qc_issue);
EXPORT_SYMBOL_GPL(ata_sff_qc_fill_rtf);
EXPORT_SYMBOL_GPL(ata_sff_host_intr);
EXPORT_SYMBOL_GPL(ata_sff_interrupt);
+EXPORT_SYMBOL_GPL(ata_sff_lost_interrupt);
EXPORT_SYMBOL_GPL(ata_sff_freeze);
EXPORT_SYMBOL_GPL(ata_sff_thaw);
EXPORT_SYMBOL_GPL(ata_sff_prereset);
diff --git a/drivers/ata/pata_isapnp.c b/drivers/ata/pata_isapnp.c
index 6a111ba..d2fbc03 100644
--- a/drivers/ata/pata_isapnp.c
+++ b/drivers/ata/pata_isapnp.c
@@ -17,7 +17,7 @@
#include <linux/libata.h>
#define DRV_NAME "pata_isapnp"
-#define DRV_VERSION "0.2.2"
+#define DRV_VERSION "0.2.5"
static struct scsi_host_template isapnp_sht = {
ATA_PIO_SHT(DRV_NAME),
@@ -28,6 +28,13 @@ static struct ata_port_operations isapnp_port_ops = {
.cable_detect = ata_cable_40wire,
};
+static struct ata_port_operations isapnp_noalt_port_ops = {
+ .inherits = &ata_sff_port_ops,
+ .cable_detect = ata_cable_40wire,
+ /* No altstatus so we don't want to use the lost interrupt poll */
+ .lost_interrupt = ATA_OP_NULL,
+};
+
/**
* isapnp_init_one - attach an isapnp interface
* @idev: PnP device
@@ -65,7 +72,7 @@ static int isapnp_init_one(struct pnp_dev *idev, const struct pnp_device_id *dev
ap = host->ports[0];
- ap->ops = &isapnp_port_ops;
+ ap->ops = &isapnp_noalt_port_ops;
ap->pio_mask = 1;
ap->flags |= ATA_FLAG_SLAVE_POSS;
@@ -76,6 +83,7 @@ static int isapnp_init_one(struct pnp_dev *idev, const struct pnp_device_id *dev
pnp_port_start(idev, 1), 1);
ap->ioaddr.altstatus_addr = ctl_addr;
ap->ioaddr.ctl_addr = ctl_addr;
+ ap->ops = &isapnp_port_ops;
}
ata_sff_std_ports(&ap->ioaddr);
diff --git a/include/linux/libata.h b/include/linux/libata.h
index 7bb1013..75dbb35 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -777,6 +777,7 @@ struct ata_port_operations {
ata_reset_fn_t pmp_hardreset;
ata_postreset_fn_t pmp_postreset;
void (*error_handler)(struct ata_port *ap);
+ void (*lost_interrupt)(struct ata_port *ap);
void (*post_internal_cmd)(struct ata_queued_cmd *qc);
/*
@@ -1514,6 +1515,7 @@ extern bool ata_sff_qc_fill_rtf(struct ata_queued_cmd *qc);
extern unsigned int ata_sff_host_intr(struct ata_port *ap,
struct ata_queued_cmd *qc);
extern irqreturn_t ata_sff_interrupt(int irq, void *dev_instance);
+extern void ata_sff_lost_interrupt(struct ata_port *ap);
extern void ata_sff_freeze(struct ata_port *ap);
extern void ata_sff_thaw(struct ata_port *ap);
extern int ata_sff_prereset(struct ata_link *link, unsigned long deadline);
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH 4/4] libata: clean up the SFF code for coding style
2008-10-17 18:08 [PATCH 0/4] Small set of further libata patches Alan Cox
` (2 preceding siblings ...)
2008-10-17 18:08 ` [PATCH 3/4] libata: Improve timeout handling Alan Cox
@ 2008-10-17 18:09 ` Alan Cox
2008-10-22 15:48 ` Elias Oltmanns
3 siblings, 1 reply; 19+ messages in thread
From: Alan Cox @ 2008-10-17 18:09 UTC (permalink / raw)
To: jeff, linux-ide
From: Alan Cox <alan@redhat.com>
Signed-off-by: Alan Cox <alan@redhat.com>
---
drivers/ata/libata-sff.c | 136 +++++++++++++++++++++++-----------------------
1 files changed, 69 insertions(+), 67 deletions(-)
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
index 1afaa96..03c2d41 100644
--- a/drivers/ata/libata-sff.c
+++ b/drivers/ata/libata-sff.c
@@ -69,6 +69,7 @@ const struct ata_port_operations ata_sff_port_ops = {
.port_start = ata_sff_port_start,
};
+EXPORT_SYMBOL_GPL(ata_sff_port_ops);
const struct ata_port_operations ata_bmdma_port_ops = {
.inherits = &ata_sff_port_ops,
@@ -80,6 +81,7 @@ const struct ata_port_operations ata_bmdma_port_ops = {
.bmdma_stop = ata_bmdma_stop,
.bmdma_status = ata_bmdma_status,
};
+EXPORT_SYMBOL_GPL(ata_bmdma_port_ops);
/**
* ata_fill_sg - Fill PCI IDE PRD table
@@ -169,8 +171,9 @@ static void ata_fill_sg_dumb(struct ata_queued_cmd *qc)
blen = len & 0xffff;
ap->prd[pi].addr = cpu_to_le32(addr);
if (blen == 0) {
- /* Some PATA chipsets like the CS5530 can't
- cope with 0x0000 meaning 64K as the spec says */
+ /* Some PATA chipsets like the CS5530 can't
+ cope with 0x0000 meaning 64K as the spec
+ says */
ap->prd[pi].flags_len = cpu_to_le32(0x8000);
blen = 0x8000;
ap->prd[++pi].addr = cpu_to_le32(addr + 0x8000);
@@ -203,6 +206,7 @@ void ata_sff_qc_prep(struct ata_queued_cmd *qc)
ata_fill_sg(qc);
}
+EXPORT_SYMBOL_GPL(ata_sff_qc_prep);
/**
* ata_sff_dumb_qc_prep - Prepare taskfile for submission
@@ -220,6 +224,7 @@ void ata_sff_dumb_qc_prep(struct ata_queued_cmd *qc)
ata_fill_sg_dumb(qc);
}
+EXPORT_SYMBOL_GPL(ata_sff_dumb_qc_prep);
/**
* ata_sff_check_status - Read device status reg & clear interrupt
@@ -236,6 +241,7 @@ u8 ata_sff_check_status(struct ata_port *ap)
{
return ioread8(ap->ioaddr.status_addr);
}
+EXPORT_SYMBOL_GPL(ata_sff_check_status);
/**
* ata_sff_altstatus - Read device alternate status reg
@@ -278,7 +284,7 @@ static u8 ata_sff_irq_status(struct ata_port *ap)
status = ata_sff_altstatus(ap);
/* Not us: We are busy */
if (status & ATA_BUSY)
- return status;
+ return status;
}
/* Clear INTRQ latch */
status = ap->ops->sff_check_status(ap);
@@ -322,6 +328,7 @@ void ata_sff_pause(struct ata_port *ap)
ata_sff_sync(ap);
ndelay(400);
}
+EXPORT_SYMBOL_GPL(ata_sff_pause);
/**
* ata_sff_dma_pause - Pause before commencing DMA
@@ -330,7 +337,7 @@ void ata_sff_pause(struct ata_port *ap)
* Perform I/O fencing and ensure sufficient cycle delays occur
* for the HDMA1:0 transition
*/
-
+
void ata_sff_dma_pause(struct ata_port *ap)
{
if (ap->ops->sff_check_altstatus || ap->ioaddr.altstatus_addr) {
@@ -344,6 +351,7 @@ void ata_sff_dma_pause(struct ata_port *ap)
corruption. */
BUG();
}
+EXPORT_SYMBOL_GPL(ata_sff_dma_pause);
/**
* ata_sff_busy_sleep - sleep until BSY clears, or timeout
@@ -399,6 +407,7 @@ int ata_sff_busy_sleep(struct ata_port *ap,
return 0;
}
+EXPORT_SYMBOL_GPL(ata_sff_busy_sleep);
static int ata_sff_check_ready(struct ata_link *link)
{
@@ -425,6 +434,7 @@ int ata_sff_wait_ready(struct ata_link *link, unsigned long deadline)
{
return ata_wait_ready(link, deadline, ata_sff_check_ready);
}
+EXPORT_SYMBOL_GPL(ata_sff_wait_ready);
/**
* ata_sff_dev_select - Select device 0/1 on ATA bus
@@ -452,6 +462,7 @@ void ata_sff_dev_select(struct ata_port *ap, unsigned int device)
iowrite8(tmp, ap->ioaddr.device_addr);
ata_sff_pause(ap); /* needed; also flushes, for mmio */
}
+EXPORT_SYMBOL_GPL(ata_sff_dev_select);
/**
* ata_dev_select - Select device 0/1 on ATA bus
@@ -516,6 +527,7 @@ u8 ata_sff_irq_on(struct ata_port *ap)
return tmp;
}
+EXPORT_SYMBOL_GPL(ata_sff_irq_on);
/**
* ata_sff_irq_clear - Clear PCI IDE BMDMA interrupt.
@@ -537,6 +549,7 @@ void ata_sff_irq_clear(struct ata_port *ap)
iowrite8(ioread8(mmio + ATA_DMA_STATUS), mmio + ATA_DMA_STATUS);
}
+EXPORT_SYMBOL_GPL(ata_sff_irq_clear);
/**
* ata_sff_tf_load - send taskfile registers to host controller
@@ -596,6 +609,7 @@ void ata_sff_tf_load(struct ata_port *ap, const struct ata_taskfile *tf)
ata_wait_idle(ap);
}
+EXPORT_SYMBOL_GPL(ata_sff_tf_load);
/**
* ata_sff_tf_read - input device's ATA taskfile shadow registers
@@ -636,6 +650,7 @@ void ata_sff_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
WARN_ON(1);
}
}
+EXPORT_SYMBOL_GPL(ata_sff_tf_read);
/**
* ata_sff_exec_command - issue ATA command to host controller
@@ -655,6 +670,7 @@ void ata_sff_exec_command(struct ata_port *ap, const struct ata_taskfile *tf)
iowrite8(tf->command, ap->ioaddr.command_addr);
ata_sff_pause(ap);
}
+EXPORT_SYMBOL_GPL(ata_sff_exec_command);
/**
* ata_tf_to_host - issue ATA taskfile to host controller
@@ -720,6 +736,7 @@ unsigned int ata_sff_data_xfer(struct ata_device *dev, unsigned char *buf,
return words << 1;
}
+EXPORT_SYMBOL_GPL(ata_sff_data_xfer);
/**
* ata_sff_data_xfer_noirq - Transfer data by PIO
@@ -749,6 +766,7 @@ unsigned int ata_sff_data_xfer_noirq(struct ata_device *dev, unsigned char *buf,
return consumed;
}
+EXPORT_SYMBOL_GPL(ata_sff_data_xfer_noirq);
/**
* ata_pio_sector - Transfer a sector of data.
@@ -925,13 +943,15 @@ next_sg:
buf = kmap_atomic(page, KM_IRQ0);
/* do the actual data transfer */
- consumed = ap->ops->sff_data_xfer(dev, buf + offset, count, rw);
+ consumed = ap->ops->sff_data_xfer(dev, buf + offset,
+ count, rw);
kunmap_atomic(buf, KM_IRQ0);
local_irq_restore(flags);
} else {
buf = page_address(page);
- consumed = ap->ops->sff_data_xfer(dev, buf + offset, count, rw);
+ consumed = ap->ops->sff_data_xfer(dev, buf + offset,
+ count, rw);
}
bytes -= min(bytes, consumed);
@@ -1016,18 +1036,19 @@ static void atapi_pio_bytes(struct ata_queued_cmd *qc)
* RETURNS:
* 1 if ok in workqueue, 0 otherwise.
*/
-static inline int ata_hsm_ok_in_wq(struct ata_port *ap, struct ata_queued_cmd *qc)
+static inline int ata_hsm_ok_in_wq(struct ata_port *ap,
+ struct ata_queued_cmd *qc)
{
if (qc->tf.flags & ATA_TFLAG_POLLING)
return 1;
if (ap->hsm_task_state == HSM_ST_FIRST) {
if (qc->tf.protocol == ATA_PROT_PIO &&
- (qc->tf.flags & ATA_TFLAG_WRITE))
+ (qc->tf.flags & ATA_TFLAG_WRITE))
return 1;
if (ata_is_atapi(qc->tf.protocol) &&
- !(qc->dev->flags & ATA_DFLAG_CDB_INTR))
+ !(qc->dev->flags & ATA_DFLAG_CDB_INTR))
return 1;
}
@@ -1332,6 +1353,7 @@ fsm_start:
return poll_next;
}
+EXPORT_SYMBOL_GPL(ata_sff_hsm_move);
void ata_pio_task(struct work_struct *work)
{
@@ -1501,6 +1523,7 @@ unsigned int ata_sff_qc_issue(struct ata_queued_cmd *qc)
return 0;
}
+EXPORT_SYMBOL_GPL(ata_sff_qc_issue);
/**
* ata_sff_qc_fill_rtf - fill result TF using ->sff_tf_read
@@ -1520,6 +1543,7 @@ bool ata_sff_qc_fill_rtf(struct ata_queued_cmd *qc)
qc->ap->ops->sff_tf_read(qc->ap, &qc->result_tf);
return true;
}
+EXPORT_SYMBOL_GPL(ata_sff_qc_fill_rtf);
/**
* ata_sff_host_intr - Handle host interrupt for given (port, task)
@@ -1617,6 +1641,7 @@ idle_irq:
#endif
return 0; /* irq not handled */
}
+EXPORT_SYMBOL_GPL(ata_sff_host_intr);
/**
* ata_sff_interrupt - Default ATA host interrupt handler
@@ -1661,6 +1686,7 @@ irqreturn_t ata_sff_interrupt(int irq, void *dev_instance)
return IRQ_RETVAL(handled);
}
+EXPORT_SYMBOL_GPL(ata_sff_interrupt);
/**
* ata_sff_lost_interrupt - Check for an apparent lost interrupt
@@ -1702,6 +1728,7 @@ void ata_sff_lost_interrupt(struct ata_port *ap)
lost */
ata_sff_host_intr(ap, qc);
}
+EXPORT_SYMBOL_GPL(ata_sff_lost_interrupt);
/**
* ata_sff_freeze - Freeze SFF controller port
@@ -1730,6 +1757,7 @@ void ata_sff_freeze(struct ata_port *ap)
ap->ops->sff_irq_clear(ap);
}
+EXPORT_SYMBOL_GPL(ata_sff_freeze);
/**
* ata_sff_thaw - Thaw SFF controller port
@@ -1747,6 +1775,7 @@ void ata_sff_thaw(struct ata_port *ap)
ap->ops->sff_irq_clear(ap);
ap->ops->sff_irq_on(ap);
}
+EXPORT_SYMBOL_GPL(ata_sff_thaw);
/**
* ata_sff_prereset - prepare SFF link for reset
@@ -1788,6 +1817,7 @@ int ata_sff_prereset(struct ata_link *link, unsigned long deadline)
return 0;
}
+EXPORT_SYMBOL_GPL(ata_sff_prereset);
/**
* ata_devchk - PATA device presence detection
@@ -1900,6 +1930,7 @@ unsigned int ata_sff_dev_classify(struct ata_device *dev, int present,
return class;
}
+EXPORT_SYMBOL_GPL(ata_sff_dev_classify);
/**
* ata_sff_wait_after_reset - wait for devices to become ready after reset
@@ -1976,6 +2007,7 @@ int ata_sff_wait_after_reset(struct ata_link *link, unsigned int devmask,
return ret;
}
+EXPORT_SYMBOL_GPL(ata_sff_wait_after_reset);
static int ata_bus_softreset(struct ata_port *ap, unsigned int devmask,
unsigned long deadline)
@@ -2048,6 +2080,7 @@ int ata_sff_softreset(struct ata_link *link, unsigned int *classes,
DPRINTK("EXIT, classes[0]=%u [1]=%u\n", classes[0], classes[1]);
return 0;
}
+EXPORT_SYMBOL_GPL(ata_sff_softreset);
/**
* sata_sff_hardreset - reset host port via SATA phy reset
@@ -2080,6 +2113,7 @@ int sata_sff_hardreset(struct ata_link *link, unsigned int *class,
DPRINTK("EXIT, class=%u\n", *class);
return rc;
}
+EXPORT_SYMBOL_GPL(sata_sff_hardreset);
/**
* ata_sff_postreset - SFF postreset callback
@@ -2115,6 +2149,7 @@ void ata_sff_postreset(struct ata_link *link, unsigned int *classes)
if (ap->ioaddr.ctl_addr)
iowrite8(ap->ctl, ap->ioaddr.ctl_addr);
}
+EXPORT_SYMBOL_GPL(ata_sff_postreset);
/**
* ata_sff_drain_fifo - Stock FIFO drain logic for SFF controllers
@@ -2147,6 +2182,7 @@ void ata_sff_drain_fifo(struct ata_queued_cmd *qc)
"drained %d bytes to clear DRQ.\n", count);
}
+EXPORT_SYMBOL_GPL(ata_sff_drain_fifo);
/**
* ata_sff_error_handler - Stock error handler for BMDMA controller
@@ -2227,6 +2263,7 @@ void ata_sff_error_handler(struct ata_port *ap)
ata_do_eh(ap, ap->ops->prereset, softreset, hardreset,
ap->ops->postreset);
}
+EXPORT_SYMBOL_GPL(ata_sff_error_handler);
/**
* ata_sff_post_internal_cmd - Stock post_internal_cmd for SFF controller
@@ -2240,6 +2277,7 @@ void ata_sff_post_internal_cmd(struct ata_queued_cmd *qc)
if (qc->ap->ioaddr.bmdma_addr)
ata_bmdma_stop(qc);
}
+EXPORT_SYMBOL_GPL(ata_sff_post_internal_cmd);
/**
* ata_sff_port_start - Set port up for dma.
@@ -2260,6 +2298,7 @@ int ata_sff_port_start(struct ata_port *ap)
return ata_port_start(ap);
return 0;
}
+EXPORT_SYMBOL_GPL(ata_sff_port_start);
/**
* ata_sff_std_ports - initialize ioaddr with standard port offsets.
@@ -2285,6 +2324,7 @@ void ata_sff_std_ports(struct ata_ioports *ioaddr)
ioaddr->status_addr = ioaddr->cmd_addr + ATA_REG_STATUS;
ioaddr->command_addr = ioaddr->cmd_addr + ATA_REG_CMD;
}
+EXPORT_SYMBOL_GPL(ata_sff_std_ports);
unsigned long ata_bmdma_mode_filter(struct ata_device *adev,
unsigned long xfer_mask)
@@ -2296,6 +2336,7 @@ unsigned long ata_bmdma_mode_filter(struct ata_device *adev,
xfer_mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA);
return xfer_mask;
}
+EXPORT_SYMBOL_GPL(ata_bmdma_mode_filter);
/**
* ata_bmdma_setup - Set up PCI IDE BMDMA transaction
@@ -2324,6 +2365,7 @@ void ata_bmdma_setup(struct ata_queued_cmd *qc)
/* issue r/w command */
ap->ops->sff_exec_command(ap, &qc->tf);
}
+EXPORT_SYMBOL_GPL(ata_bmdma_setup);
/**
* ata_bmdma_start - Start a PCI IDE BMDMA transaction
@@ -2356,6 +2398,7 @@ void ata_bmdma_start(struct ata_queued_cmd *qc)
* unneccessarily delayed for MMIO
*/
}
+EXPORT_SYMBOL_GPL(ata_bmdma_start);
/**
* ata_bmdma_stop - Stop PCI IDE BMDMA transfer
@@ -2380,6 +2423,7 @@ void ata_bmdma_stop(struct ata_queued_cmd *qc)
/* one-PIO-cycle guaranteed wait, per spec, for HDMA1:0 transition */
ata_sff_dma_pause(ap);
}
+EXPORT_SYMBOL_GPL(ata_bmdma_stop);
/**
* ata_bmdma_status - Read PCI IDE BMDMA status
@@ -2396,6 +2440,7 @@ u8 ata_bmdma_status(struct ata_port *ap)
{
return ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
}
+EXPORT_SYMBOL_GPL(ata_bmdma_status);
/**
* ata_bus_reset - reset host port and associated ATA channel
@@ -2488,6 +2533,7 @@ err_out:
DPRINTK("EXIT\n");
}
+EXPORT_SYMBOL_GPL(ata_bus_reset);
#ifdef CONFIG_PCI
@@ -2515,6 +2561,7 @@ int ata_pci_bmdma_clear_simplex(struct pci_dev *pdev)
return -EOPNOTSUPP;
return 0;
}
+EXPORT_SYMBOL_GPL(ata_pci_bmdma_clear_simplex);
/**
* ata_pci_bmdma_init - acquire PCI BMDMA resources and init ATA host
@@ -2567,11 +2614,12 @@ int ata_pci_bmdma_init(struct ata_host *host)
host->flags |= ATA_HOST_SIMPLEX;
ata_port_desc(ap, "bmdma 0x%llx",
- (unsigned long long)pci_resource_start(pdev, 4) + 8 * i);
+ (unsigned long long)pci_resource_start(pdev, 4) + 8 * i);
}
return 0;
}
+EXPORT_SYMBOL_GPL(ata_pci_bmdma_init);
static int ata_resources_present(struct pci_dev *pdev, int port)
{
@@ -2579,7 +2627,7 @@ static int ata_resources_present(struct pci_dev *pdev, int port)
/* Check the PCI resources for this channel are enabled */
port = port * 2;
- for (i = 0; i < 2; i ++) {
+ for (i = 0; i < 2; i++) {
if (pci_resource_start(pdev, port + i) == 0 ||
pci_resource_len(pdev, port + i) == 0)
return 0;
@@ -2664,6 +2712,7 @@ int ata_pci_sff_init_host(struct ata_host *host)
return 0;
}
+EXPORT_SYMBOL_GPL(ata_pci_sff_init_host);
/**
* ata_pci_sff_prepare_host - helper to prepare native PCI ATA host
@@ -2681,7 +2730,7 @@ int ata_pci_sff_init_host(struct ata_host *host)
* 0 on success, -errno otherwise.
*/
int ata_pci_sff_prepare_host(struct pci_dev *pdev,
- const struct ata_port_info * const * ppi,
+ const struct ata_port_info * const *ppi,
struct ata_host **r_host)
{
struct ata_host *host;
@@ -2711,17 +2760,18 @@ int ata_pci_sff_prepare_host(struct pci_dev *pdev,
*r_host = host;
return 0;
- err_bmdma:
+err_bmdma:
/* This is necessary because PCI and iomap resources are
* merged and releasing the top group won't release the
* acquired resources if some of those have been acquired
* before entering this function.
*/
pcim_iounmap_regions(pdev, 0xf);
- err_out:
+err_out:
devres_release_group(&pdev->dev, NULL);
return rc;
}
+EXPORT_SYMBOL_GPL(ata_pci_sff_prepare_host);
/**
* ata_pci_sff_activate_host - start SFF host, request IRQ and register it
@@ -2807,7 +2857,7 @@ int ata_pci_sff_activate_host(struct ata_host *host,
}
rc = ata_host_register(host, sht);
- out:
+out:
if (rc == 0)
devres_remove_group(dev, NULL);
else
@@ -2815,6 +2865,7 @@ int ata_pci_sff_activate_host(struct ata_host *host,
return rc;
}
+EXPORT_SYMBOL_GPL(ata_pci_sff_activate_host);
/**
* ata_pci_sff_init_one - Initialize/register PCI IDE host controller
@@ -2842,7 +2893,7 @@ int ata_pci_sff_activate_host(struct ata_host *host,
* Zero on success, negative on errno-based value on error.
*/
int ata_pci_sff_init_one(struct pci_dev *pdev,
- const struct ata_port_info * const * ppi,
+ const struct ata_port_info * const *ppi,
struct scsi_host_template *sht, void *host_priv)
{
struct device *dev = &pdev->dev;
@@ -2881,7 +2932,7 @@ int ata_pci_sff_init_one(struct pci_dev *pdev,
pci_set_master(pdev);
rc = ata_pci_sff_activate_host(host, ata_sff_interrupt, sht);
- out:
+out:
if (rc == 0)
devres_remove_group(&pdev->dev, NULL);
else
@@ -2889,56 +2940,7 @@ int ata_pci_sff_init_one(struct pci_dev *pdev,
return rc;
}
+EXPORT_SYMBOL_GPL(ata_pci_sff_init_one);
#endif /* CONFIG_PCI */
-EXPORT_SYMBOL_GPL(ata_sff_port_ops);
-EXPORT_SYMBOL_GPL(ata_bmdma_port_ops);
-EXPORT_SYMBOL_GPL(ata_sff_qc_prep);
-EXPORT_SYMBOL_GPL(ata_sff_dumb_qc_prep);
-EXPORT_SYMBOL_GPL(ata_sff_dev_select);
-EXPORT_SYMBOL_GPL(ata_sff_check_status);
-EXPORT_SYMBOL_GPL(ata_sff_dma_pause);
-EXPORT_SYMBOL_GPL(ata_sff_pause);
-EXPORT_SYMBOL_GPL(ata_sff_busy_sleep);
-EXPORT_SYMBOL_GPL(ata_sff_wait_ready);
-EXPORT_SYMBOL_GPL(ata_sff_tf_load);
-EXPORT_SYMBOL_GPL(ata_sff_tf_read);
-EXPORT_SYMBOL_GPL(ata_sff_exec_command);
-EXPORT_SYMBOL_GPL(ata_sff_data_xfer);
-EXPORT_SYMBOL_GPL(ata_sff_data_xfer_noirq);
-EXPORT_SYMBOL_GPL(ata_sff_irq_on);
-EXPORT_SYMBOL_GPL(ata_sff_irq_clear);
-EXPORT_SYMBOL_GPL(ata_sff_hsm_move);
-EXPORT_SYMBOL_GPL(ata_sff_qc_issue);
-EXPORT_SYMBOL_GPL(ata_sff_qc_fill_rtf);
-EXPORT_SYMBOL_GPL(ata_sff_host_intr);
-EXPORT_SYMBOL_GPL(ata_sff_interrupt);
-EXPORT_SYMBOL_GPL(ata_sff_lost_interrupt);
-EXPORT_SYMBOL_GPL(ata_sff_freeze);
-EXPORT_SYMBOL_GPL(ata_sff_thaw);
-EXPORT_SYMBOL_GPL(ata_sff_prereset);
-EXPORT_SYMBOL_GPL(ata_sff_dev_classify);
-EXPORT_SYMBOL_GPL(ata_sff_wait_after_reset);
-EXPORT_SYMBOL_GPL(ata_sff_softreset);
-EXPORT_SYMBOL_GPL(sata_sff_hardreset);
-EXPORT_SYMBOL_GPL(ata_sff_postreset);
-EXPORT_SYMBOL_GPL(ata_sff_drain_fifo);
-EXPORT_SYMBOL_GPL(ata_sff_error_handler);
-EXPORT_SYMBOL_GPL(ata_sff_post_internal_cmd);
-EXPORT_SYMBOL_GPL(ata_sff_port_start);
-EXPORT_SYMBOL_GPL(ata_sff_std_ports);
-EXPORT_SYMBOL_GPL(ata_bmdma_mode_filter);
-EXPORT_SYMBOL_GPL(ata_bmdma_setup);
-EXPORT_SYMBOL_GPL(ata_bmdma_start);
-EXPORT_SYMBOL_GPL(ata_bmdma_stop);
-EXPORT_SYMBOL_GPL(ata_bmdma_status);
-EXPORT_SYMBOL_GPL(ata_bus_reset);
-#ifdef CONFIG_PCI
-EXPORT_SYMBOL_GPL(ata_pci_bmdma_clear_simplex);
-EXPORT_SYMBOL_GPL(ata_pci_bmdma_init);
-EXPORT_SYMBOL_GPL(ata_pci_sff_init_host);
-EXPORT_SYMBOL_GPL(ata_pci_sff_prepare_host);
-EXPORT_SYMBOL_GPL(ata_pci_sff_activate_host);
-EXPORT_SYMBOL_GPL(ata_pci_sff_init_one);
-#endif /* CONFIG_PCI */
^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [PATCH 2/4] libata: Drain data on errors
2008-10-17 18:08 ` [PATCH 2/4] libata: Drain data on errors Alan Cox
@ 2008-10-22 15:46 ` Elias Oltmanns
2008-10-22 16:44 ` Alan Cox
2008-10-27 19:14 ` Mark Lord
1 sibling, 1 reply; 19+ messages in thread
From: Elias Oltmanns @ 2008-10-22 15:46 UTC (permalink / raw)
To: Alan Cox; +Cc: jeff, linux-ide
Alan Cox <alan@lxorguk.ukuu.org.uk> wrote:
> From: Alan Cox <alan@redhat.com>
>
> If the device is signalling that there is data to drain after an error we
> should read the bytes out and throw them away. Without this some devices
> and controllers get wedged and don't recover.
>
> Based on earlier work by Mark Lord
>
> Signed-off-by: Alan Cox <alan@redhat.com>
> ---
> diff --git a/drivers/ata/pata_pcmcia.c b/drivers/ata/pata_pcmcia.c
> index 02b596b..f08d34d 100644
> --- a/drivers/ata/pata_pcmcia.c
> +++ b/drivers/ata/pata_pcmcia.c
[...]
> @@ -126,6 +126,37 @@ static unsigned int ata_data_xfer_8bit(struct ata_device *dev,
> return buflen;
> }
>
> +/**
> + * pcmcia_8bit_drain_fifo - Stock FIFO drain logic for SFF controllers
> + * @qc: command
> + *
> + * Drain the FIFO and device of any stuck data following a command
> + * failing to complete. In some cases this is neccessary before a
> + * reset will recover the device.
> + *
> + */
> +
> +void pcmcia_8bit_drain_fifo(struct ata_queued_cmd *qc)
> +{
> + int count;
> + struct ata_port *ap;
> +
> + /* We only need to flush incoming data when a command was running */
> + if (qc == NULL || qc->dma_dir == DMA_TO_DEVICE)
> + return;
> +
> + ap = qc->ap;
> +
> + /* Drain up to 64K of data before we give up this recovery method */
> + for (count = 0; (ap->ops->sff_check_status(ap) & ATA_DRQ)
> + && count < 65536;)
Missing count++. Sorry for not spotting that in the previous round.
Regards,
Elias
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH 3/4] libata: Improve timeout handling
2008-10-17 18:08 ` [PATCH 3/4] libata: Improve timeout handling Alan Cox
@ 2008-10-22 15:47 ` Elias Oltmanns
2008-10-22 16:04 ` Alan Cox
0 siblings, 1 reply; 19+ messages in thread
From: Elias Oltmanns @ 2008-10-22 15:47 UTC (permalink / raw)
To: Alan Cox; +Cc: jeff, linux-ide
Alan Cox <alan@lxorguk.ukuu.org.uk> wrote:
> From: Alan Cox <alan@redhat.com>
>
> On a timeout call a device specific handler early in the recovery so that
> we can complete and process successful commands which timed out due to IRQ
> loss or the like rather more elegantly.
>
> Signed-off-by: Alan Cox <alan@redhat.com>
> ---
[...]
> diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
> index a93247c..757b956 100644
> --- a/drivers/ata/libata-eh.c
> +++ b/drivers/ata/libata-eh.c
[...]
> @@ -2871,6 +2914,7 @@ EXPORT_SYMBOL_GPL(ata_sff_qc_issue);
> EXPORT_SYMBOL_GPL(ata_sff_qc_fill_rtf);
> EXPORT_SYMBOL_GPL(ata_sff_host_intr);
> EXPORT_SYMBOL_GPL(ata_sff_interrupt);
> +EXPORT_SYMBOL_GPL(ata_sff_lost_interrupt);
[...]
> diff --git a/include/linux/libata.h b/include/linux/libata.h
> index 7bb1013..75dbb35 100644
> --- a/include/linux/libata.h
> +++ b/include/linux/libata.h
[...]
> @@ -1514,6 +1515,7 @@ extern bool ata_sff_qc_fill_rtf(struct ata_queued_cmd *qc);
> extern unsigned int ata_sff_host_intr(struct ata_port *ap,
> struct ata_queued_cmd *qc);
> extern irqreturn_t ata_sff_interrupt(int irq, void *dev_instance);
> +extern void ata_sff_lost_interrupt(struct ata_port *ap);
Actually, this one isn't used anywhere outside libata-sff.c (yet?).
Also, perhaps we cannot agree on the style of multiple line comments,
but please check this patch for whitespace issues, there is even one
that can easily be spotted without running checkpatch.pl.
Regards,
Elias
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH 4/4] libata: clean up the SFF code for coding style
2008-10-17 18:09 ` [PATCH 4/4] libata: clean up the SFF code for coding style Alan Cox
@ 2008-10-22 15:48 ` Elias Oltmanns
2008-10-22 16:02 ` Alan Cox
0 siblings, 1 reply; 19+ messages in thread
From: Elias Oltmanns @ 2008-10-22 15:48 UTC (permalink / raw)
To: Alan Cox; +Cc: jeff, linux-ide
Alan Cox <alan@lxorguk.ukuu.org.uk> wrote:
> From: Alan Cox <alan@redhat.com>
>
> Signed-off-by: Alan Cox <alan@redhat.com>
> ---
>
> drivers/ata/libata-sff.c | 136 +++++++++++++++++++++++-----------------------
> 1 files changed, 69 insertions(+), 67 deletions(-)
>
>
> diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
> index 1afaa96..03c2d41 100644
> --- a/drivers/ata/libata-sff.c
> +++ b/drivers/ata/libata-sff.c
[...]
> @@ -1016,18 +1036,19 @@ static void atapi_pio_bytes(struct ata_queued_cmd *qc)
> * RETURNS:
> * 1 if ok in workqueue, 0 otherwise.
> */
> -static inline int ata_hsm_ok_in_wq(struct ata_port *ap, struct ata_queued_cmd *qc)
> +static inline int ata_hsm_ok_in_wq(struct ata_port *ap,
> + struct ata_queued_cmd *qc)
> {
> if (qc->tf.flags & ATA_TFLAG_POLLING)
> return 1;
>
> if (ap->hsm_task_state == HSM_ST_FIRST) {
> if (qc->tf.protocol == ATA_PROT_PIO &&
> - (qc->tf.flags & ATA_TFLAG_WRITE))
> + (qc->tf.flags & ATA_TFLAG_WRITE))
> return 1;
Sorry, I don't understand that at all. In my opinion, the nesting of
parentheses is more obvious and easier to understand without that
change. Moreover, the indentation of the return statement would have
needed fixing much more desperately ;-).
>
> if (ata_is_atapi(qc->tf.protocol) &&
> - !(qc->dev->flags & ATA_DFLAG_CDB_INTR))
> + !(qc->dev->flags & ATA_DFLAG_CDB_INTR))
Ditto.
[...]
> @@ -2711,17 +2760,18 @@ int ata_pci_sff_prepare_host(struct pci_dev *pdev,
> *r_host = host;
> return 0;
>
> - err_bmdma:
> +err_bmdma:
> /* This is necessary because PCI and iomap resources are
> * merged and releasing the top group won't release the
> * acquired resources if some of those have been acquired
> * before entering this function.
> */
> pcim_iounmap_regions(pdev, 0xf);
> - err_out:
> +err_out:
Yes, I've wondered about these myself occasionally. Personally, I don't
insert a blank before those labels either and would be in favour of such
a change. But do we actually have a convention regarding this matter?
Regards,
Elias
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH 4/4] libata: clean up the SFF code for coding style
2008-10-22 15:48 ` Elias Oltmanns
@ 2008-10-22 16:02 ` Alan Cox
2008-10-23 0:35 ` Jeff Garzik
0 siblings, 1 reply; 19+ messages in thread
From: Alan Cox @ 2008-10-22 16:02 UTC (permalink / raw)
To: Elias Oltmanns; +Cc: jeff, linux-ide
> > if (ata_is_atapi(qc->tf.protocol) &&
> > - !(qc->dev->flags & ATA_DFLAG_CDB_INTR))
> > + !(qc->dev->flags & ATA_DFLAG_CDB_INTR))
>
> Ditto.
Its lining up the bracketing but hey I'm not fussed, just twiddling where
checkpatch warned and the like.
> > - err_out:
> > +err_out:
>
> Yes, I've wondered about these myself occasionally. Personally, I don't
> insert a blank before those labels either and would be in favour of such
> a change. But do we actually have a convention regarding this matter?
CodingStyle chapter 7 which is of course overridable by Jeff ;)
Alan
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH 3/4] libata: Improve timeout handling
2008-10-22 15:47 ` Elias Oltmanns
@ 2008-10-22 16:04 ` Alan Cox
0 siblings, 0 replies; 19+ messages in thread
From: Alan Cox @ 2008-10-22 16:04 UTC (permalink / raw)
To: Elias Oltmanns; +Cc: jeff, linux-ide
> Also, perhaps we cannot agree on the style of multiple line comments,
> but please check this patch for whitespace issues, there is even one
> that can easily be spotted without running checkpatch.pl.
I did, and the follow up patch nicely cleaned up everything checkpatch
complained about for the whole file.
The approach of twiddling random slices of file into coding style buried
in other patches is IMHO just silly. Its as quick to do the lot, so I
did ;)
Alan
--
bork bork!
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH 2/4] libata: Drain data on errors
2008-10-22 15:46 ` Elias Oltmanns
@ 2008-10-22 16:44 ` Alan Cox
0 siblings, 0 replies; 19+ messages in thread
From: Alan Cox @ 2008-10-22 16:44 UTC (permalink / raw)
To: Elias Oltmanns; +Cc: jeff, linux-ide
> > + /* Drain up to 64K of data before we give up this recovery method */
> > + for (count = 0; (ap->ops->sff_check_status(ap) & ATA_DRQ)
> > + && count < 65536;)
>
> Missing count++. Sorry for not spotting that in the previous round.
Thanks - well spotted
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH 4/4] libata: clean up the SFF code for coding style
2008-10-22 16:02 ` Alan Cox
@ 2008-10-23 0:35 ` Jeff Garzik
2008-10-28 1:49 ` Tejun Heo
0 siblings, 1 reply; 19+ messages in thread
From: Jeff Garzik @ 2008-10-23 0:35 UTC (permalink / raw)
To: Alan Cox; +Cc: Elias Oltmanns, linux-ide
Alan Cox wrote:
>>> if (ata_is_atapi(qc->tf.protocol) &&
>>> - !(qc->dev->flags & ATA_DFLAG_CDB_INTR))
>>> + !(qc->dev->flags & ATA_DFLAG_CDB_INTR))
>> Ditto.
>
> Its lining up the bracketing but hey I'm not fussed, just twiddling where
> checkpatch warned and the like.
>
>>> - err_out:
>>> +err_out:
>> Yes, I've wondered about these myself occasionally. Personally, I don't
>> insert a blank before those labels either and would be in favour of such
>> a change. But do we actually have a convention regarding this matter?
>
> CodingStyle chapter 7 which is of course overridable by Jeff ;)
libata style has always matched that: labels go in column 1, without
any preceding whitespace.
Jeff
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH 2/4] libata: Drain data on errors
2008-10-17 18:08 ` [PATCH 2/4] libata: Drain data on errors Alan Cox
2008-10-22 15:46 ` Elias Oltmanns
@ 2008-10-27 19:14 ` Mark Lord
2008-10-27 21:54 ` Alan Cox
1 sibling, 1 reply; 19+ messages in thread
From: Mark Lord @ 2008-10-27 19:14 UTC (permalink / raw)
To: Alan Cox; +Cc: jeff, linux-ide
Alan Cox wrote:
> From: Alan Cox <alan@redhat.com>
>
> If the device is signalling that there is data to drain after an error we
> should read the bytes out and throw them away. Without this some devices
> and controllers get wedged and don't recover.
>
> Based on earlier work by Mark Lord
>
> Signed-off-by: Alan Cox <alan@redhat.com>
..
> + /* Drain up to 64K of data before we give up this recovery method */
> + for (count = 0; (ap->ops->sff_check_status(ap) & ATA_DRQ)
> + && count < 65536;)
> + ioread8(ap->ioaddr.data_addr);
..
I'm just catching up on a few things here now that holiday season is over.
In the above loop, I wonder if it might be better to only check status
every NN iterations, where NN > 1 (say, 16), to speed things up a fair amount (?).
Sure it's rare, but when it happens the entire system is probably stopped
waiting for us to recover, so speed might matter some.
Cheers
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH 2/4] libata: Drain data on errors
2008-10-27 19:14 ` Mark Lord
@ 2008-10-27 21:54 ` Alan Cox
0 siblings, 0 replies; 19+ messages in thread
From: Alan Cox @ 2008-10-27 21:54 UTC (permalink / raw)
To: Mark Lord; +Cc: jeff, linux-ide
O> I'm just catching up on a few things here now that holiday season is over.
> In the above loop, I wonder if it might be better to only check status
> every NN iterations, where NN > 1 (say, 16), to speed things up a fair amount (?).
And hang some controllers probably.
> Sure it's rare, but when it happens the entire system is probably stopped
> waiting for us to recover, so speed might matter some.
Correctness first. If we have to optimise this case we are (as you note)
doing something seriously wrong!
Alan
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH 4/4] libata: clean up the SFF code for coding style
2008-10-23 0:35 ` Jeff Garzik
@ 2008-10-28 1:49 ` Tejun Heo
2008-10-28 9:47 ` Elias Oltmanns
0 siblings, 1 reply; 19+ messages in thread
From: Tejun Heo @ 2008-10-28 1:49 UTC (permalink / raw)
To: Jeff Garzik; +Cc: Alan Cox, Elias Oltmanns, linux-ide
Jeff Garzik wrote:
> Alan Cox wrote:
>>>> if (ata_is_atapi(qc->tf.protocol) &&
>>>> - !(qc->dev->flags & ATA_DFLAG_CDB_INTR))
>>>> + !(qc->dev->flags & ATA_DFLAG_CDB_INTR))
>>> Ditto.
>>
>> Its lining up the bracketing but hey I'm not fussed, just twiddling where
>> checkpatch warned and the like.
>>
>>>> - err_out:
>>>> +err_out:
>>> Yes, I've wondered about these myself occasionally. Personally, I don't
>>> insert a blank before those labels either and would be in favour of such
>>> a change. But do we actually have a convention regarding this matter?
>>
>> CodingStyle chapter 7 which is of course overridable by Jeff ;)
>
> libata style has always matched that: labels go in column 1, without
> any preceding whitespace.
Heh... I am the one who is always putting in the extra space there,
mainly because emacs dictates how I format my code. :-) I'll try to turn
it off.
Thanks.
--
tejun
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH 1/4] pata_ninja32: suspend/resume support
2008-10-17 18:08 ` [PATCH 1/4] pata_ninja32: suspend/resume support Alan Cox
@ 2008-10-28 4:42 ` Jeff Garzik
2008-10-28 9:37 ` Alan Cox
0 siblings, 1 reply; 19+ messages in thread
From: Jeff Garzik @ 2008-10-28 4:42 UTC (permalink / raw)
To: Alan Cox; +Cc: linux-ide
Alan Cox wrote:
> From: Alan Cox <alan@redhat.com>
>
> I had assumed that the standard recovery would be sufficient for this
> hardware but it isn't. Fix up the other registers on resume as needed. See
> bug #11735
>
> Signed-off-by: Alan Cox <alan@redhat.com>
> ---
>
> drivers/ata/pata_ninja32.c | 43 ++++++++++++++++++++++++++++++++++---------
> 1 files changed, 34 insertions(+), 9 deletions(-)
applied
patches 2-4 look interesting, but I paused to wait for comments (if
any). They look like material for at least a little bit of a linux-next
time before going upstream, not really 2.6.28-rc1 [at the time] material
IMO...
Jeff
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH 1/4] pata_ninja32: suspend/resume support
2008-10-28 4:42 ` Jeff Garzik
@ 2008-10-28 9:37 ` Alan Cox
0 siblings, 0 replies; 19+ messages in thread
From: Alan Cox @ 2008-10-28 9:37 UTC (permalink / raw)
To: Jeff Garzik; +Cc: linux-ide
> patches 2-4 look interesting, but I paused to wait for comments (if
> any). They look like material for at least a little bit of a linux-next
> time before going upstream, not really 2.6.28-rc1 [at the time] material
> IMO...
Agreed except for the DF drain one - that is a bit of harder call. It
seems to be number 1 remaining common across PATA hardware. Can still go
back via -stable after some testing however.
Alan
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH 4/4] libata: clean up the SFF code for coding style
2008-10-28 1:49 ` Tejun Heo
@ 2008-10-28 9:47 ` Elias Oltmanns
2008-10-29 2:05 ` Tejun Heo
0 siblings, 1 reply; 19+ messages in thread
From: Elias Oltmanns @ 2008-10-28 9:47 UTC (permalink / raw)
To: Tejun Heo; +Cc: Jeff Garzik, Alan Cox, linux-ide
Tejun Heo <tj@kernel.org> wrote:
> Jeff Garzik wrote:
>> Alan Cox wrote:
>
>>>>> if (ata_is_atapi(qc->tf.protocol) &&
>>>>> - !(qc->dev->flags & ATA_DFLAG_CDB_INTR))
>>>>> + !(qc->dev->flags & ATA_DFLAG_CDB_INTR))
>>>> Ditto.
>>>
>>> Its lining up the bracketing but hey I'm not fussed, just twiddling where
>>> checkpatch warned and the like.
>>>
>>>>> - err_out:
>>>>> +err_out:
>>>> Yes, I've wondered about these myself occasionally. Personally, I don't
>>>> insert a blank before those labels either and would be in favour of such
>>>> a change. But do we actually have a convention regarding this matter?
>>>
>>> CodingStyle chapter 7 which is of course overridable by Jeff ;)
>>
>> libata style has always matched that: labels go in column 1, without
>> any preceding whitespace.
>
> Heh... I am the one who is always putting in the extra space there,
> mainly because emacs dictates how I format my code. :-) I'll try to turn
> it off.
(defun my-c-mode-hook ()
(if (and (buffer-file-name)
(string-match "/home/eo/source/kernel/" (buffer-file-name)))
(c-set-style "linux")))
(add-hook 'c-mode-hook 'my-c-mode-hook)
works very nicely for me and it doesn't insert the extra blank in front
of labels either except for the situation where the code following the
label is at indentation level > 1.
Regards,
Elias
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH 4/4] libata: clean up the SFF code for coding style
2008-10-28 9:47 ` Elias Oltmanns
@ 2008-10-29 2:05 ` Tejun Heo
0 siblings, 0 replies; 19+ messages in thread
From: Tejun Heo @ 2008-10-29 2:05 UTC (permalink / raw)
To: Elias Oltmanns; +Cc: Jeff Garzik, Alan Cox, linux-ide
Elias Oltmanns wrote:
> Tejun Heo <tj@kernel.org> wrote:
>> Jeff Garzik wrote:
>>> Alan Cox wrote:
>>>>>> if (ata_is_atapi(qc->tf.protocol) &&
>>>>>> - !(qc->dev->flags & ATA_DFLAG_CDB_INTR))
>>>>>> + !(qc->dev->flags & ATA_DFLAG_CDB_INTR))
>>>>> Ditto.
>>>> Its lining up the bracketing but hey I'm not fussed, just twiddling where
>>>> checkpatch warned and the like.
>>>>
>>>>>> - err_out:
>>>>>> +err_out:
>>>>> Yes, I've wondered about these myself occasionally. Personally, I don't
>>>>> insert a blank before those labels either and would be in favour of such
>>>>> a change. But do we actually have a convention regarding this matter?
>>>> CodingStyle chapter 7 which is of course overridable by Jeff ;)
>>> libata style has always matched that: labels go in column 1, without
>>> any preceding whitespace.
>> Heh... I am the one who is always putting in the extra space there,
>> mainly because emacs dictates how I format my code. :-) I'll try to turn
>> it off.
>
> (defun my-c-mode-hook ()
> (if (and (buffer-file-name)
> (string-match "/home/eo/source/kernel/" (buffer-file-name)))
> (c-set-style "linux")))
> (add-hook 'c-mode-hook 'my-c-mode-hook)
>
> works very nicely for me and it doesn't insert the extra blank in front
> of labels either except for the situation where the code following the
> label is at indentation level > 1.
Cool, thanks a lot. :-)
--
tejun
^ permalink raw reply [flat|nested] 19+ messages in thread
end of thread, other threads:[~2008-10-29 2:05 UTC | newest]
Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-10-17 18:08 [PATCH 0/4] Small set of further libata patches Alan Cox
2008-10-17 18:08 ` [PATCH 1/4] pata_ninja32: suspend/resume support Alan Cox
2008-10-28 4:42 ` Jeff Garzik
2008-10-28 9:37 ` Alan Cox
2008-10-17 18:08 ` [PATCH 2/4] libata: Drain data on errors Alan Cox
2008-10-22 15:46 ` Elias Oltmanns
2008-10-22 16:44 ` Alan Cox
2008-10-27 19:14 ` Mark Lord
2008-10-27 21:54 ` Alan Cox
2008-10-17 18:08 ` [PATCH 3/4] libata: Improve timeout handling Alan Cox
2008-10-22 15:47 ` Elias Oltmanns
2008-10-22 16:04 ` Alan Cox
2008-10-17 18:09 ` [PATCH 4/4] libata: clean up the SFF code for coding style Alan Cox
2008-10-22 15:48 ` Elias Oltmanns
2008-10-22 16:02 ` Alan Cox
2008-10-23 0:35 ` Jeff Garzik
2008-10-28 1:49 ` Tejun Heo
2008-10-28 9:47 ` Elias Oltmanns
2008-10-29 2:05 ` Tejun Heo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).