summaryrefslogtreecommitdiffstats
path: root/sys/dev/arcmsr/arcmsr.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/arcmsr/arcmsr.c')
-rw-r--r--sys/dev/arcmsr/arcmsr.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/sys/dev/arcmsr/arcmsr.c b/sys/dev/arcmsr/arcmsr.c
index 185e0da..5e2bb86 100644
--- a/sys/dev/arcmsr/arcmsr.c
+++ b/sys/dev/arcmsr/arcmsr.c
@@ -417,7 +417,12 @@ static void arcmsr_srb_complete(struct CommandControlBlock *srb, int stand_flag)
}
ARCMSR_LOCK_ACQUIRE(&acb->workingQ_done_lock);
if(stand_flag==1) {
- atomic_subtract_int(&acb->srboutstandingcount, 1);
+ atomic_subtract_int(&acb->srboutstandingcount, 1);
+ if((acb->acb_flags & ACB_F_CAM_DEV_QFRZN) && (
+ acb->srboutstandingcount < ARCMSR_RELEASE_SIMQ_LEVEL)) {
+ acb->acb_flags &= ~ACB_F_CAM_DEV_QFRZN;
+ pccb->ccb_h.status |= CAM_RELEASE_SIMQ;
+ }
}
srb->startdone=ARCMSR_SRB_DONE;
srb->srb_flags=0;
@@ -1303,7 +1308,8 @@ static void arcmsr_executesrb(void *arg, bus_dma_segment_t *dm_segs, int nseg, i
pccb->ccb_h.status |= CAM_SIM_QUEUED;
if(acb->srboutstandingcount >= ARCMSR_MAX_OUTSTANDING_CMD) {
pccb->ccb_h.status &= ~CAM_STATUS_MASK;
- pccb->ccb_h.status |= CAM_REQUEUE_REQ;
+ pccb->ccb_h.status |= (CAM_REQUEUE_REQ|CAM_DEV_QFRZN);
+ acb->acb_flags |= ACB_F_CAM_DEV_QFRZN;
arcmsr_srb_complete(srb, 0);
return;
}
OpenPOWER on IntegriCloud