aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2008-03-25 08:34:39 -0400
committerJeff Garzik <jgarzik@redhat.com>2008-04-17 15:44:20 -0400
commited82f96425e744dffe62115e46f08eb785c0b2f3 (patch)
treea4c61c016c6bd340d941ad141c14a8f7d837ab7f
parentd8b81b8008a0f131e01bb6eb5c681c900c327e2b (diff)
libata/pdc_adma: make SFF EH handle non-bmdma SFF drivers and standardize pdc_adma ops
pdc_adma has interface similar to SFF but has its own DMA interface. It currently implements noop bmdma ops to avoid crashing ata_bmdma_error_handler() which BTW actually is EH for SFF drivers. This patch makes ata_bmdma_error_handler() dereference bmdma ops iff bmdma_addr is initialized as done in ata_bmdma_post_internal_cmd. This change allows pdc_adma to standardize ops and use SFF error_handler and post_internal_cmd. Signed-off-by: Tejun Heo <htejun@gmail.com> Cc: Mark Lord <liml@rtr.ca> Signed-off-by: Jeff Garzik <jeff@garzik.org>
-rw-r--r--drivers/ata/libata-sff.c3
-rw-r--r--drivers/ata/pdc_adma.c16
2 files changed, 4 insertions, 15 deletions
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
index c601dcef2925..5208ca21f634 100644
--- a/drivers/ata/libata-sff.c
+++ b/drivers/ata/libata-sff.c
@@ -2014,7 +2014,8 @@ void ata_bmdma_error_handler(struct ata_port *ap)
2014 2014
2015 ap->hsm_task_state = HSM_ST_IDLE; 2015 ap->hsm_task_state = HSM_ST_IDLE;
2016 2016
2017 if (qc && (qc->tf.protocol == ATA_PROT_DMA || 2017 if (ap->ioaddr.bmdma_addr &&
2018 qc && (qc->tf.protocol == ATA_PROT_DMA ||
2018 qc->tf.protocol == ATAPI_PROT_DMA)) { 2019 qc->tf.protocol == ATAPI_PROT_DMA)) {
2019 u8 host_stat; 2020 u8 host_stat;
2020 2021
diff --git a/drivers/ata/pdc_adma.c b/drivers/ata/pdc_adma.c
index 5ed065d0ab4c..577a0e556f7a 100644
--- a/drivers/ata/pdc_adma.c
+++ b/drivers/ata/pdc_adma.c
@@ -136,8 +136,6 @@ static void adma_port_stop(struct ata_port *ap);
136static void adma_qc_prep(struct ata_queued_cmd *qc); 136static void adma_qc_prep(struct ata_queued_cmd *qc);
137static unsigned int adma_qc_issue(struct ata_queued_cmd *qc); 137static unsigned int adma_qc_issue(struct ata_queued_cmd *qc);
138static int adma_check_atapi_dma(struct ata_queued_cmd *qc); 138static int adma_check_atapi_dma(struct ata_queued_cmd *qc);
139static void adma_bmdma_stop(struct ata_queued_cmd *qc);
140static u8 adma_bmdma_status(struct ata_port *ap);
141static void adma_freeze(struct ata_port *ap); 139static void adma_freeze(struct ata_port *ap);
142static void adma_thaw(struct ata_port *ap); 140static void adma_thaw(struct ata_port *ap);
143static int adma_prereset(struct ata_link *link, unsigned long deadline); 141static int adma_prereset(struct ata_link *link, unsigned long deadline);
@@ -158,8 +156,6 @@ static struct ata_port_operations adma_ata_ops = {
158 .exec_command = ata_exec_command, 156 .exec_command = ata_exec_command,
159 .data_xfer = ata_data_xfer, 157 .data_xfer = ata_data_xfer,
160 .check_atapi_dma = adma_check_atapi_dma, 158 .check_atapi_dma = adma_check_atapi_dma,
161 .bmdma_stop = adma_bmdma_stop,
162 .bmdma_status = adma_bmdma_status,
163 .qc_prep = adma_qc_prep, 159 .qc_prep = adma_qc_prep,
164 .qc_issue = adma_qc_issue, 160 .qc_issue = adma_qc_issue,
165 .irq_on = ata_irq_on, 161 .irq_on = ata_irq_on,
@@ -168,6 +164,8 @@ static struct ata_port_operations adma_ata_ops = {
168 .thaw = adma_thaw, 164 .thaw = adma_thaw,
169 .prereset = adma_prereset, 165 .prereset = adma_prereset,
170 .softreset = ata_std_softreset, 166 .softreset = ata_std_softreset,
167 .error_handler = ata_bmdma_error_handler,
168 .post_internal_cmd = ata_bmdma_post_internal_cmd,
171 169
172 .port_start = adma_port_start, 170 .port_start = adma_port_start,
173 .port_stop = adma_port_stop, 171 .port_stop = adma_port_stop,
@@ -204,16 +202,6 @@ static int adma_check_atapi_dma(struct ata_queued_cmd *qc)
204 return 1; /* ATAPI DMA not yet supported */ 202 return 1; /* ATAPI DMA not yet supported */
205} 203}
206 204
207static void adma_bmdma_stop(struct ata_queued_cmd *qc)
208{
209 /* nothing */
210}
211
212static u8 adma_bmdma_status(struct ata_port *ap)
213{
214 return 0;
215}
216
217static void adma_reset_engine(struct ata_port *ap) 205static void adma_reset_engine(struct ata_port *ap)
218{ 206{
219 void __iomem *chan = ADMA_PORT_REGS(ap); 207 void __iomem *chan = ADMA_PORT_REGS(ap);