summaryrefslogtreecommitdiffstats
path: root/sys/dev/arcmsr
diff options
context:
space:
mode:
authorscottl <scottl@FreeBSD.org>2007-04-02 03:31:37 +0000
committerscottl <scottl@FreeBSD.org>2007-04-02 03:31:37 +0000
commit2dff498dfead3dca510644055c6e330ceb4b5410 (patch)
tree7b5e0a79cb21a6adc4bd173c8136755b4c5f3914 /sys/dev/arcmsr
parentc2a9cbeecd8c8f870113e80afc475a347da1d329 (diff)
downloadFreeBSD-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/arcmsr')
-rw-r--r--sys/dev/arcmsr/arcmsr.c9
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;
OpenPOWER on IntegriCloud