Merge branch 'tmp'

This commit is contained in:
Jeff Garzik 2006-01-27 02:36:14 -05:00
commit 7dfb869c8e
6 changed files with 30 additions and 25 deletions

View File

@ -680,7 +680,7 @@ static void ahci_eng_timeout(struct ata_port *ap)
* not being called from the SCSI EH. * not being called from the SCSI EH.
*/ */
qc->scsidone = scsi_finish_command; qc->scsidone = scsi_finish_command;
qc->err_mask |= AC_ERR_OTHER; qc->err_mask |= AC_ERR_TIMEOUT;
ata_qc_complete(qc); ata_qc_complete(qc);
} }
@ -721,7 +721,7 @@ static inline int ahci_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc)
ahci_restart_port(ap, status); ahci_restart_port(ap, status);
if (qc) { if (qc) {
qc->err_mask |= AC_ERR_OTHER; qc->err_mask |= err_mask;
ata_qc_complete(qc); ata_qc_complete(qc);
} }
} }

View File

@ -1126,8 +1126,10 @@ ata_exec_internal(struct ata_port *ap, struct ata_device *dev,
qc->private_data = &wait; qc->private_data = &wait;
qc->complete_fn = ata_qc_complete_internal; qc->complete_fn = ata_qc_complete_internal;
if (ata_qc_issue(qc)) if (ata_qc_issue(qc)) {
goto issue_fail; qc->err_mask = AC_ERR_OTHER;
ata_qc_complete(qc);
}
spin_unlock_irqrestore(&ap->host_set->lock, flags); spin_unlock_irqrestore(&ap->host_set->lock, flags);
@ -1141,7 +1143,7 @@ ata_exec_internal(struct ata_port *ap, struct ata_device *dev,
* spurious interrupt. We can live with that. * spurious interrupt. We can live with that.
*/ */
if (qc->flags & ATA_QCFLAG_ACTIVE) { if (qc->flags & ATA_QCFLAG_ACTIVE) {
qc->err_mask = AC_ERR_OTHER; qc->err_mask = AC_ERR_TIMEOUT;
ata_qc_complete(qc); ata_qc_complete(qc);
printk(KERN_WARNING "ata%u: qc timeout (cmd 0x%x)\n", printk(KERN_WARNING "ata%u: qc timeout (cmd 0x%x)\n",
ap->id, command); ap->id, command);
@ -1156,11 +1158,6 @@ ata_exec_internal(struct ata_port *ap, struct ata_device *dev,
ata_qc_free(qc); ata_qc_free(qc);
return err_mask; return err_mask;
issue_fail:
ata_qc_free(qc);
spin_unlock_irqrestore(&ap->host_set->lock, flags);
return AC_ERR_OTHER;
} }
/** /**
@ -2929,7 +2926,7 @@ static unsigned long ata_pio_poll(struct ata_port *ap)
status = ata_chk_status(ap); status = ata_chk_status(ap);
if (status & ATA_BUSY) { if (status & ATA_BUSY) {
if (time_after(jiffies, ap->pio_task_timeout)) { if (time_after(jiffies, ap->pio_task_timeout)) {
qc->err_mask |= AC_ERR_ATA_BUS; qc->err_mask |= AC_ERR_TIMEOUT;
ap->hsm_task_state = HSM_ST_TMOUT; ap->hsm_task_state = HSM_ST_TMOUT;
return 0; return 0;
} }
@ -3474,7 +3471,7 @@ static void atapi_pio_bytes(struct ata_queued_cmd *qc)
err_out: err_out:
printk(KERN_INFO "ata%u: dev %u: ATAPI check failed\n", printk(KERN_INFO "ata%u: dev %u: ATAPI check failed\n",
ap->id, dev->devno); ap->id, dev->devno);
qc->err_mask |= AC_ERR_ATA_BUS; qc->err_mask |= AC_ERR_HSM;
ap->hsm_task_state = HSM_ST_ERR; ap->hsm_task_state = HSM_ST_ERR;
} }
@ -3532,7 +3529,7 @@ static void ata_pio_block(struct ata_port *ap)
} else { } else {
/* handle BSY=0, DRQ=0 as error */ /* handle BSY=0, DRQ=0 as error */
if ((status & ATA_DRQ) == 0) { if ((status & ATA_DRQ) == 0) {
qc->err_mask |= AC_ERR_ATA_BUS; qc->err_mask |= AC_ERR_HSM;
ap->hsm_task_state = HSM_ST_ERR; ap->hsm_task_state = HSM_ST_ERR;
return; return;
} }
@ -3873,10 +3870,10 @@ int ata_qc_issue(struct ata_queued_cmd *qc)
if (ata_should_dma_map(qc)) { if (ata_should_dma_map(qc)) {
if (qc->flags & ATA_QCFLAG_SG) { if (qc->flags & ATA_QCFLAG_SG) {
if (ata_sg_setup(qc)) if (ata_sg_setup(qc))
goto err_out; goto sg_err;
} else if (qc->flags & ATA_QCFLAG_SINGLE) { } else if (qc->flags & ATA_QCFLAG_SINGLE) {
if (ata_sg_setup_one(qc)) if (ata_sg_setup_one(qc))
goto err_out; goto sg_err;
} }
} else { } else {
qc->flags &= ~ATA_QCFLAG_DMAMAP; qc->flags &= ~ATA_QCFLAG_DMAMAP;
@ -3889,7 +3886,8 @@ int ata_qc_issue(struct ata_queued_cmd *qc)
return ap->ops->qc_issue(qc); return ap->ops->qc_issue(qc);
err_out: sg_err:
qc->flags &= ~ATA_QCFLAG_DMAMAP;
return -1; return -1;
} }

View File

@ -1322,8 +1322,10 @@ static void ata_scsi_translate(struct ata_port *ap, struct ata_device *dev,
goto early_finish; goto early_finish;
/* select device, send command to hardware */ /* select device, send command to hardware */
if (ata_qc_issue(qc)) if (ata_qc_issue(qc)) {
goto err_did; qc->err_mask |= AC_ERR_OTHER;
ata_qc_complete(qc);
}
VPRINTK("EXIT\n"); VPRINTK("EXIT\n");
return; return;

View File

@ -1865,7 +1865,7 @@ static void mv_eng_timeout(struct ata_port *ap)
*/ */
spin_lock_irqsave(&ap->host_set->lock, flags); spin_lock_irqsave(&ap->host_set->lock, flags);
qc->scsidone = scsi_finish_command; qc->scsidone = scsi_finish_command;
qc->err_mask |= AC_ERR_OTHER; qc->err_mask |= AC_ERR_TIMEOUT;
ata_qc_complete(qc); ata_qc_complete(qc);
spin_unlock_irqrestore(&ap->host_set->lock, flags); spin_unlock_irqrestore(&ap->host_set->lock, flags);
} }

View File

@ -653,7 +653,7 @@ static void sil24_eng_timeout(struct ata_port *ap)
*/ */
printk(KERN_ERR "ata%u: command timeout\n", ap->id); printk(KERN_ERR "ata%u: command timeout\n", ap->id);
qc->scsidone = scsi_finish_command; qc->scsidone = scsi_finish_command;
qc->err_mask |= AC_ERR_OTHER; qc->err_mask |= AC_ERR_TIMEOUT;
ata_qc_complete(qc); ata_qc_complete(qc);
sil24_reset_controller(ap); sil24_reset_controller(ap);

View File

@ -227,10 +227,15 @@ enum hsm_task_states {
}; };
enum ata_completion_errors { enum ata_completion_errors {
AC_ERR_OTHER = (1 << 0), AC_ERR_DEV = (1 << 0), /* device reported error */
AC_ERR_DEV = (1 << 1), AC_ERR_HSM = (1 << 1), /* host state machine violation */
AC_ERR_ATA_BUS = (1 << 2), AC_ERR_TIMEOUT = (1 << 2), /* timeout */
AC_ERR_HOST_BUS = (1 << 3), AC_ERR_MEDIA = (1 << 3), /* media error */
AC_ERR_ATA_BUS = (1 << 4), /* ATA bus error */
AC_ERR_HOST_BUS = (1 << 5), /* host bus error */
AC_ERR_SYSTEM = (1 << 6), /* system error */
AC_ERR_INVALID = (1 << 7), /* invalid argument */
AC_ERR_OTHER = (1 << 8), /* unknown */
}; };
/* forward declarations */ /* forward declarations */
@ -836,7 +841,7 @@ static inline int ata_try_flush_cache(const struct ata_device *dev)
static inline unsigned int ac_err_mask(u8 status) static inline unsigned int ac_err_mask(u8 status)
{ {
if (status & ATA_BUSY) if (status & ATA_BUSY)
return AC_ERR_ATA_BUS; return AC_ERR_HSM;
if (status & (ATA_ERR | ATA_DF)) if (status & (ATA_ERR | ATA_DF))
return AC_ERR_DEV; return AC_ERR_DEV;
return 0; return 0;