diff options
Diffstat (limited to 'sys/dev/arcmsr/arcmsr.c')
-rw-r--r-- | sys/dev/arcmsr/arcmsr.c | 10 |
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; } |