diff options
Diffstat (limited to 'drivers/scsi/sata_promise.c')
-rw-r--r-- | drivers/scsi/sata_promise.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/scsi/sata_promise.c b/drivers/scsi/sata_promise.c index 02089069b0f6..e2e146a14f97 100644 --- a/drivers/scsi/sata_promise.c +++ b/drivers/scsi/sata_promise.c | |||
@@ -401,7 +401,8 @@ static void pdc_eng_timeout(struct ata_port *ap) | |||
401 | case ATA_PROT_NODATA: | 401 | case ATA_PROT_NODATA: |
402 | printk(KERN_ERR "ata%u: command timeout\n", ap->id); | 402 | printk(KERN_ERR "ata%u: command timeout\n", ap->id); |
403 | drv_stat = ata_wait_idle(ap); | 403 | drv_stat = ata_wait_idle(ap); |
404 | ata_qc_complete(qc, __ac_err_mask(drv_stat)); | 404 | qc->err_mask |= __ac_err_mask(drv_stat); |
405 | ata_qc_complete(qc); | ||
405 | break; | 406 | break; |
406 | 407 | ||
407 | default: | 408 | default: |
@@ -410,7 +411,8 @@ static void pdc_eng_timeout(struct ata_port *ap) | |||
410 | printk(KERN_ERR "ata%u: unknown timeout, cmd 0x%x stat 0x%x\n", | 411 | printk(KERN_ERR "ata%u: unknown timeout, cmd 0x%x stat 0x%x\n", |
411 | ap->id, qc->tf.command, drv_stat); | 412 | ap->id, qc->tf.command, drv_stat); |
412 | 413 | ||
413 | ata_qc_complete(qc, ac_err_mask(drv_stat)); | 414 | qc->err_mask |= ac_err_mask(drv_stat); |
415 | ata_qc_complete(qc); | ||
414 | break; | 416 | break; |
415 | } | 417 | } |
416 | 418 | ||
@@ -422,21 +424,21 @@ out: | |||
422 | static inline unsigned int pdc_host_intr( struct ata_port *ap, | 424 | static inline unsigned int pdc_host_intr( struct ata_port *ap, |
423 | struct ata_queued_cmd *qc) | 425 | struct ata_queued_cmd *qc) |
424 | { | 426 | { |
425 | unsigned int handled = 0, err_mask = 0; | 427 | unsigned int handled = 0; |
426 | u32 tmp; | 428 | u32 tmp; |
427 | void __iomem *mmio = (void __iomem *) ap->ioaddr.cmd_addr + PDC_GLOBAL_CTL; | 429 | void __iomem *mmio = (void __iomem *) ap->ioaddr.cmd_addr + PDC_GLOBAL_CTL; |
428 | 430 | ||
429 | tmp = readl(mmio); | 431 | tmp = readl(mmio); |
430 | if (tmp & PDC_ERR_MASK) { | 432 | if (tmp & PDC_ERR_MASK) { |
431 | err_mask = AC_ERR_DEV; | 433 | qc->err_mask |= AC_ERR_DEV; |
432 | pdc_reset_port(ap); | 434 | pdc_reset_port(ap); |
433 | } | 435 | } |
434 | 436 | ||
435 | switch (qc->tf.protocol) { | 437 | switch (qc->tf.protocol) { |
436 | case ATA_PROT_DMA: | 438 | case ATA_PROT_DMA: |
437 | case ATA_PROT_NODATA: | 439 | case ATA_PROT_NODATA: |
438 | err_mask |= ac_err_mask(ata_wait_idle(ap)); | 440 | qc->err_mask |= ac_err_mask(ata_wait_idle(ap)); |
439 | ata_qc_complete(qc, err_mask); | 441 | ata_qc_complete(qc); |
440 | handled = 1; | 442 | handled = 1; |
441 | break; | 443 | break; |
442 | 444 | ||