libata-dev: determine err_mask when error is found
PATCH 1/2 libata-dev: determine err_mask when error is found
Jeff,
Patch 1/2: Minor fix to determine err_mask directly when an error is found.
Changes:
- Determine err_mask directly when an error is found.
- Remove "qc->err_mask |= __ac_err_mask(status);" in ata_host_intr()
Patch against the libata-dev irq-pio branch
(3d0a59c02303df01848537b3bf938dc11e9a0ded).
For your review, thanks.
Albert
Signed-off-by Albert Lee <[email protected]>
============
drivers/scsi/libata-core.c +19 -2
@@ -3209,6 +3209,7 @@ static int ata_pio_first_block(struct at/* sleep-wait for BSY to clear */ DPRINTK ("busy wait\n" );if (ata_busy_sleep (ap,ATA_TMOUT_DATAOUT_QUICK ,ATA_TMOUT_DATAOUT )) { + qc->err_mask |=AC_ERR_ATA_BUS ; ap->hsm_task_state =HSM_ST_TMOUT ; goto err_out; }
@@ -3217,6 +3218,7 @@ static int ata_pio_first_block(struct at status =ata_chk_status (ap);if ((status & (ATA_BUSY |ATA_DRQ )) !=ATA_DRQ ) {/* device status error */ + qc->err_mask |=AC_ERR_ATA_BUS ; ap->hsm_task_state =HSM_ST_ERR ; goto err_out; }
@@ -4232,6 +4234,12 @@ inline unsigned int ata_host_intr (struc/* before we do anything else, clear DMA-Start bit */ ap->ops->bmdma_stop (qc); + +if (unlikely (host_stat &ATA_DMA_ERR )) { +/* error when transfering data to/from memory */ + qc->err_mask |=AC_ERR_HOST_BUS ; + ap->hsm_task_state =HSM_ST_ERR ; + } }break ;case HSM_ST :
@@ -4257,8 +4265,10 @@ inline unsigned int ata_host_intr (struc ap->ops->irq_clear (ap);/* check error */ -if (unlikely ((status &ATA_ERR ) || (host_stat &ATA_DMA_ERR ))) +if (unlikely (status & (ATA_ERR |ATA_DF ))) { + qc->err_mask |=AC_ERR_DEV ; ap->hsm_task_state =HSM_ST_ERR ; + } fsm_start:switch (ap->hsm_task_state) {
@@ -4270,6 +4280,7 @@ fsm_start:/* check device status */ if (unlikely ((status & (ATA_BUSY |ATA_DRQ )) !=ATA_DRQ )) {/* Wrong status. Let EH handle this */ + qc->err_mask |=AC_ERR_ATA_BUS ; ap->hsm_task_state =HSM_ST_ERR ; goto fsm_start; }
@@ -4298,6 +4309,7 @@ fsm_start:/* ATA PIO protocol */ if (unlikely ((status &ATA_DRQ ) ==0 )) {/* handle BSY=0, DRQ=0 as error */ + qc->err_mask |=AC_ERR_ATA_BUS ; ap->hsm_task_state =HSM_ST_ERR ; goto fsm_start; }
@@ -4319,6 +4331,7 @@ fsm_start:case HSM_ST_LAST :if (unlikely (status &ATA_DRQ )) {/* handle DRQ=1 as error */ + qc->err_mask |=AC_ERR_ATA_BUS ; ap->hsm_task_state =HSM_ST_ERR ; goto fsm_start; }
@@ -4338,8 +4351,12 @@ fsm_start:printk (KERN_ERR "ata%u: command error, drv_stat 0x%x host_stat 0x%x\n" , ap->id, status, host_stat); +/* make sure qc->err_mask is available to +* know what's wrong and recover +*/ +assert (qc->err_mask); + ap->hsm_task_state =HSM_ST_IDLE ; - qc->err_mask |=__ac_err_mask (status);ata_qc_complete (qc);break ;default :
Quoted 9 lines · Albert Lee
Jeff,
Patch 1/2: Minor fix to determine
err_maskdirectly when an error is found.Changes:
- Determineerr_maskdirectly when an error is found.
- Remove "qc->err_mask|=__ac_err_mask(status);" inata_host_intr()Patch against the libata-dev irq-pio branch (
3d0a59c02303df01848537b3bf938dc11e9a0ded).
applied 1-2 to irq-pio branch