diff options
author | scottl <scottl@FreeBSD.org> | 2007-04-02 03:31:37 +0000 |
---|---|---|
committer | scottl <scottl@FreeBSD.org> | 2007-04-02 03:31:37 +0000 |
commit | 2dff498dfead3dca510644055c6e330ceb4b5410 (patch) | |
tree | 7b5e0a79cb21a6adc4bd173c8136755b4c5f3914 /sys/dev | |
parent | c2a9cbeecd8c8f870113e80afc475a347da1d329 (diff) | |
download | FreeBSD-src-2dff498dfead3dca510644055c6e330ceb4b5410.zip FreeBSD-src-2dff498dfead3dca510644055c6e330ceb4b5410.tar.gz |
Freeze the simq, not the devq, if we run out of command slots. This fixes
the last round of reported instability in the rev 13/14 driver.
Approved by: Erich Chen
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/arcmsr/arcmsr.c | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/sys/dev/arcmsr/arcmsr.c b/sys/dev/arcmsr/arcmsr.c index 5bbded1..e6441b2 100644 --- a/sys/dev/arcmsr/arcmsr.c +++ b/sys/dev/arcmsr/arcmsr.c @@ -1270,8 +1270,7 @@ static void arcmsr_executesrb(void *arg, bus_dma_segment_t *dm_segs, int nseg, i , acb->pci_unit, error); } if((pccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_INPROG) { - xpt_freeze_devq(pccb->ccb_h.path, /*count*/1); - pccb->ccb_h.status |= (CAM_REQ_TOO_BIG|CAM_DEV_QFRZN); + pccb->ccb_h.status |= CAM_REQ_TOO_BIG; } arcmsr_srb_complete(srb, 0); return; @@ -1307,14 +1306,14 @@ static void arcmsr_executesrb(void *arg, bus_dma_segment_t *dm_segs, int nseg, i arcmsr_srb_complete(srb, 0); return; } - 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|CAM_DEV_QFRZN); + xpt_freeze_simq(acb->psim, 1); + pccb->ccb_h.status = CAM_REQUEUE_REQ; acb->acb_flags |= ACB_F_CAM_DEV_QFRZN; arcmsr_srb_complete(srb, 0); return; } + pccb->ccb_h.status |= CAM_SIM_QUEUED; arcmsr_build_srb(srb, dm_segs, nseg); arcmsr_post_srb(acb, srb); return; |