aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/libata-core.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/libata-core.c')
-rw-r--r--drivers/scsi/libata-core.c31
1 files changed, 15 insertions, 16 deletions
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c
index 771bc7d376bc..cc089f1fb114 100644
--- a/drivers/scsi/libata-core.c
+++ b/drivers/scsi/libata-core.c
@@ -2663,7 +2663,7 @@ static int ata_sg_setup(struct ata_queued_cmd *qc)
2663 * None. (grabs host lock) 2663 * None. (grabs host lock)
2664 */ 2664 */
2665 2665
2666void ata_poll_qc_complete(struct ata_queued_cmd *qc, u8 drv_stat) 2666void ata_poll_qc_complete(struct ata_queued_cmd *qc, unsigned int err_mask)
2667{ 2667{
2668 struct ata_port *ap = qc->ap; 2668 struct ata_port *ap = qc->ap;
2669 unsigned long flags; 2669 unsigned long flags;
@@ -2671,7 +2671,7 @@ void ata_poll_qc_complete(struct ata_queued_cmd *qc, u8 drv_stat)
2671 spin_lock_irqsave(&ap->host_set->lock, flags); 2671 spin_lock_irqsave(&ap->host_set->lock, flags);
2672 ap->flags &= ~ATA_FLAG_NOINTR; 2672 ap->flags &= ~ATA_FLAG_NOINTR;
2673 ata_irq_on(ap); 2673 ata_irq_on(ap);
2674 ata_qc_complete(qc, drv_stat); 2674 ata_qc_complete(qc, err_mask);
2675 spin_unlock_irqrestore(&ap->host_set->lock, flags); 2675 spin_unlock_irqrestore(&ap->host_set->lock, flags);
2676} 2676}
2677 2677
@@ -2768,7 +2768,7 @@ static int ata_pio_complete (struct ata_port *ap)
2768 2768
2769 ap->hsm_task_state = HSM_ST_IDLE; 2769 ap->hsm_task_state = HSM_ST_IDLE;
2770 2770
2771 ata_poll_qc_complete(qc, drv_stat); 2771 ata_poll_qc_complete(qc, 0);
2772 2772
2773 /* another command may start at this point */ 2773 /* another command may start at this point */
2774 2774
@@ -3136,18 +3136,15 @@ static void ata_pio_block(struct ata_port *ap)
3136static void ata_pio_error(struct ata_port *ap) 3136static void ata_pio_error(struct ata_port *ap)
3137{ 3137{
3138 struct ata_queued_cmd *qc; 3138 struct ata_queued_cmd *qc;
3139 u8 drv_stat; 3139
3140 printk(KERN_WARNING "ata%u: PIO error\n", ap->id);
3140 3141
3141 qc = ata_qc_from_tag(ap, ap->active_tag); 3142 qc = ata_qc_from_tag(ap, ap->active_tag);
3142 assert(qc != NULL); 3143 assert(qc != NULL);
3143 3144
3144 drv_stat = ata_chk_status(ap);
3145 printk(KERN_WARNING "ata%u: PIO error, drv_stat 0x%x\n",
3146 ap->id, drv_stat);
3147
3148 ap->hsm_task_state = HSM_ST_IDLE; 3145 ap->hsm_task_state = HSM_ST_IDLE;
3149 3146
3150 ata_poll_qc_complete(qc, drv_stat | ATA_ERR); 3147 ata_poll_qc_complete(qc, AC_ERR_ATA_BUS);
3151} 3148}
3152 3149
3153static void ata_pio_task(void *_data) 3150static void ata_pio_task(void *_data)
@@ -3270,7 +3267,7 @@ static void ata_qc_timeout(struct ata_queued_cmd *qc)
3270 ap->id, qc->tf.command, drv_stat, host_stat); 3267 ap->id, qc->tf.command, drv_stat, host_stat);
3271 3268
3272 /* complete taskfile transaction */ 3269 /* complete taskfile transaction */
3273 ata_qc_complete(qc, drv_stat); 3270 ata_qc_complete(qc, ac_err_mask(drv_stat));
3274 break; 3271 break;
3275 } 3272 }
3276 3273
@@ -3375,7 +3372,7 @@ struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap,
3375 return qc; 3372 return qc;
3376} 3373}
3377 3374
3378int ata_qc_complete_noop(struct ata_queued_cmd *qc, u8 drv_stat) 3375int ata_qc_complete_noop(struct ata_queued_cmd *qc, unsigned int err_mask)
3379{ 3376{
3380 return 0; 3377 return 0;
3381} 3378}
@@ -3434,7 +3431,7 @@ void ata_qc_free(struct ata_queued_cmd *qc)
3434 * spin_lock_irqsave(host_set lock) 3431 * spin_lock_irqsave(host_set lock)
3435 */ 3432 */
3436 3433
3437void ata_qc_complete(struct ata_queued_cmd *qc, u8 drv_stat) 3434void ata_qc_complete(struct ata_queued_cmd *qc, unsigned int err_mask)
3438{ 3435{
3439 int rc; 3436 int rc;
3440 3437
@@ -3451,7 +3448,7 @@ void ata_qc_complete(struct ata_queued_cmd *qc, u8 drv_stat)
3451 qc->flags &= ~ATA_QCFLAG_ACTIVE; 3448 qc->flags &= ~ATA_QCFLAG_ACTIVE;
3452 3449
3453 /* call completion callback */ 3450 /* call completion callback */
3454 rc = qc->complete_fn(qc, drv_stat); 3451 rc = qc->complete_fn(qc, err_mask);
3455 3452
3456 /* if callback indicates not to complete command (non-zero), 3453 /* if callback indicates not to complete command (non-zero),
3457 * return immediately 3454 * return immediately
@@ -3889,7 +3886,7 @@ inline unsigned int ata_host_intr (struct ata_port *ap,
3889 ap->ops->irq_clear(ap); 3886 ap->ops->irq_clear(ap);
3890 3887
3891 /* complete taskfile transaction */ 3888 /* complete taskfile transaction */
3892 ata_qc_complete(qc, status); 3889 ata_qc_complete(qc, ac_err_mask(status));
3893 break; 3890 break;
3894 3891
3895 default: 3892 default:
@@ -3984,7 +3981,7 @@ static void atapi_packet_task(void *_data)
3984 /* sleep-wait for BSY to clear */ 3981 /* sleep-wait for BSY to clear */
3985 DPRINTK("busy wait\n"); 3982 DPRINTK("busy wait\n");
3986 if (ata_busy_sleep(ap, ATA_TMOUT_CDB_QUICK, ATA_TMOUT_CDB)) 3983 if (ata_busy_sleep(ap, ATA_TMOUT_CDB_QUICK, ATA_TMOUT_CDB))
3987 goto err_out; 3984 goto err_out_status;
3988 3985
3989 /* make sure DRQ is set */ 3986 /* make sure DRQ is set */
3990 status = ata_chk_status(ap); 3987 status = ata_chk_status(ap);
@@ -4021,8 +4018,10 @@ static void atapi_packet_task(void *_data)
4021 4018
4022 return; 4019 return;
4023 4020
4021err_out_status:
4022 status = ata_chk_status(ap);
4024err_out: 4023err_out:
4025 ata_poll_qc_complete(qc, ATA_ERR); 4024 ata_poll_qc_complete(qc, __ac_err_mask(status));
4026} 4025}
4027 4026
4028 4027