arcmsr: bugfix of abort command return status
PATCH 5/16 arcmsr: bugfix of abort command return status
From: Ching<[email protected]>
Fix a bug of return status from calling arcmsr_polling_ccbdone. The original code may return a FAILED if abort command is SUCCESS.
Signed-off-by Ching<[email protected]>
---
drivers/scsi/arcmsr/arcmsr_hba.c +10 -4
@@ -2510,7 +2510,7 @@ static int arcmsr_polling_hba_ccbdone(st } arcmsr_cdb = (struct ARCMSR_CDB *)(acb->vir2phy_offset + (flag_ccb <<5 )); ccb = container_of(arcmsr_cdb, struct CommandControlBlock, arcmsr_cdb); - poll_ccb_done = (ccb == poll_ccb) ?1 :0 ; + poll_ccb_done |= (ccb == poll_ccb) ?1 :0 ;if ((ccb->acb != acb) || (ccb->startdone !=ARCMSR_CCB_START )) {if ((ccb->startdone ==ARCMSR_CCB_ABORTED ) || (ccb == poll_ccb)) { printk(KERN_NOTICE "arcmsr%d: scsi id = %d lun = %d ccb = '0x%p'"
@@ -2574,7 +2574,7 @@ static int arcmsr_polling_hbb_ccbdone(st/* check if command done with no error*/ arcmsr_cdb = (struct ARCMSR_CDB *)(acb->vir2phy_offset + (flag_ccb <<5 )); ccb = container_of(arcmsr_cdb, struct CommandControlBlock, arcmsr_cdb); - poll_ccb_done = (ccb == poll_ccb) ?1 :0 ; + poll_ccb_done |= (ccb == poll_ccb) ?1 :0 ;if ((ccb->acb != acb) || (ccb->startdone !=ARCMSR_CCB_START )) {if ((ccb->startdone ==ARCMSR_CCB_ABORTED ) || (ccb == poll_ccb)) { printk(KERN_NOTICE "arcmsr%d: scsi id = %d lun = %d ccb = '0x%p'"
@@ -2630,7 +2630,7 @@ polling_hbc_ccb_retry: ccb_cdb_phy = (flag_ccb &0xFFFFFFF0 ); arcmsr_cdb = (struct ARCMSR_CDB *)(acb->vir2phy_offset + ccb_cdb_phy);/*frame must be 32 bytes aligned*/ pCCB = container_of(arcmsr_cdb, struct CommandControlBlock, arcmsr_cdb); - poll_ccb_done = (pCCB == poll_ccb) ?1 :0 ; + poll_ccb_done |= (pCCB == poll_ccb) ?1 :0 ;/* check ifcommand done with no error*/ if ((pCCB->acb != acb) || (pCCB->startdone !=ARCMSR_CCB_START )) {if (pCCB->startdone ==ARCMSR_CCB_ABORTED ) {
@@ -3232,6 +3232,8 @@ static int arcmsr_abort(struct scsi_cmnd (struct AdapterControlBlock *)cmd->device->host->hostdata;int i =0 ;int rtn =FAILED ; +uint32_t intmask_org; +printk (KERN_NOTICE "arcmsr%d: abort device command of scsi id = %d lun = %d \n" , acb->host->host_no, cmd->device->id, cmd->device->lun);
@@ -3243,9 +3245,12 @@ static int arcmsr_abort(struct scsi_cmnd** we need to handle it as soon as possible and exit ************************************************ */ -if (!atomic_read (&acb->ccboutstandingcount)) +if (!atomic_read (&acb->ccboutstandingcount)) { + acb->acb_flags &= ~ACB_F_ABORT ;return rtn; + } + intmask_org =arcmsr_disable_outbound_ints (acb);for (i =0 ; i <ARCMSR_MAX_FREECCB_NUM ; i++) {struct CommandControlBlock *ccb = acb->pccb_pool[i];if (ccb->startdone ==ARCMSR_CCB_START && ccb->pcmd == cmd) {
@@ -3255,6 +3260,7 @@ static int arcmsr_abort(struct scsi_cmnd } } acb->acb_flags &= ~ACB_F_ABORT ; +arcmsr_enable_outbound_ints (acb, intmask_org);return rtn; }