arcmsr: return status of abort command
authorChing Huang <ching2048@areca.com.tw>
Tue, 19 Aug 2014 06:47:16 +0000 (14:47 +0800)
committerChristoph Hellwig <hch@lst.de>
Tue, 16 Sep 2014 16:39:37 +0000 (09:39 -0700)
This patch fixes the wrong return status of abort command.

Signed-off-by: Ching Huang <ching2048@areca.com.tw>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/scsi/arcmsr/arcmsr_hba.c

index ed61ee2..87f3882 100644 (file)
@@ -2477,7 +2477,7 @@ static int arcmsr_polling_hba_ccbdone(struct AdapterControlBlock *acb,
                }
                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'"
@@ -2541,7 +2541,7 @@ static int arcmsr_polling_hbb_ccbdone(struct AdapterControlBlock *acb,
                /* 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'"
@@ -2597,7 +2597,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) {
@@ -3199,8 +3199,10 @@ static int arcmsr_abort(struct scsi_cmnd *cmd)
                (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",
+               "arcmsr%d: abort device command of scsi id = %d lun = %d\n",
                acb->host->host_no, cmd->device->id, (u32)cmd->device->lun);
        acb->acb_flags |= ACB_F_ABORT;
        acb->num_aborts++;
@@ -3210,9 +3212,12 @@ static int arcmsr_abort(struct scsi_cmnd *cmd)
        ** 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) {
@@ -3222,6 +3227,7 @@ static int arcmsr_abort(struct scsi_cmnd *cmd)
                }
        }
        acb->acb_flags &= ~ACB_F_ABORT;
+       arcmsr_enable_outbound_ints(acb, intmask_org);
        return rtn;
 }