diff options
author | mjacob <mjacob@FreeBSD.org> | 2001-09-04 21:45:57 +0000 |
---|---|---|
committer | mjacob <mjacob@FreeBSD.org> | 2001-09-04 21:45:57 +0000 |
commit | 1cce2583345950af628e8e9962125831d4205576 (patch) | |
tree | 728f9231390e13561fb1d395588a64c42105adf3 /sys/dev/isp/isp_pci.c | |
parent | b3abf4db3b10a00e457a2daa4efed67a6d201dde (diff) | |
download | FreeBSD-src-1cce2583345950af628e8e9962125831d4205576.zip FreeBSD-src-1cce2583345950af628e8e9962125831d4205576.tar.gz |
If we're on an interrupt stack, mark things so that we don't try
and cv_wait for mailbox commands to complete if we start them from
here.
Fix residuals for target mode such that we only check the residual and
set it in the CTIO if this is the last CTIO (when we're sending status).
MFC after: 4 weeks
Diffstat (limited to 'sys/dev/isp/isp_pci.c')
-rw-r--r-- | sys/dev/isp/isp_pci.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/sys/dev/isp/isp_pci.c b/sys/dev/isp/isp_pci.c index 0341b10..2914504 100644 --- a/sys/dev/isp/isp_pci.c +++ b/sys/dev/isp/isp_pci.c @@ -754,7 +754,10 @@ isp_pci_intr(void *arg) if (ISP_READ_ISR(isp, &isr, &sema, &mbox) == 0) { isp->isp_intbogus++; } else { + int iok = isp->isp_osinfo.intsok; + isp->isp_osinfo.intsok = 0; isp_intr(isp, isr, sema, mbox); + isp->isp_osinfo.intsok = iok; } ISP_UNLOCK(isp); } @@ -1171,7 +1174,7 @@ tdma_mk(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error) u_int8_t scsi_status; ct_entry_t *cto; u_int16_t handle; - u_int32_t totxfr, sflags; + u_int32_t sflags; int nctios, send_status; int32_t resid; int i, j; @@ -1253,7 +1256,7 @@ tdma_mk(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error) sflags = scsi_status = resid = 0; } - totxfr = cto->ct_resid = 0; + cto->ct_resid = 0; cto->ct_scsi_status = 0; pci = (struct isp_pcisoftc *)mp->isp; @@ -1283,7 +1286,6 @@ tdma_mk(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error) cto->ct_dataseg[seg].ds_count = dm_segs->ds_len; cto->ct_dataseg[seg].ds_base = dm_segs->ds_addr; cto->ct_xfrlen += dm_segs->ds_len; - totxfr += dm_segs->ds_len; dm_segs++; } cto->ct_seg_count = seg; @@ -1413,7 +1415,7 @@ tdma_mkfc(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error) bus_dmamap_t *dp; ct2_entry_t *cto; u_int16_t scsi_status, send_status, send_sense, handle; - u_int32_t totxfr, datalen; + int32_t resid; u_int8_t sense[QLTM_SENSELEN]; int nctios, j; @@ -1492,9 +1494,9 @@ tdma_mkfc(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error) cto->ct_flags &= ~(CT2_SENDSTATUS|CT2_CCINCR); /* - * Preserve residual, which is actually the total count. + * Preserve residual. */ - datalen = cto->ct_resid; + resid = cto->ct_resid; /* * Save actual SCSI status. We'll reinsert the @@ -1516,10 +1518,10 @@ tdma_mkfc(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error) nctios++; } } else { - scsi_status = send_sense = datalen = 0; + scsi_status = send_sense = resid = 0; } - totxfr = cto->ct_resid = 0; + cto->ct_resid = 0; cto->rsp.m0.ct_scsi_status = 0; MEMZERO(&cto->rsp, sizeof (cto->rsp)); @@ -1545,7 +1547,6 @@ tdma_mkfc(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error) cto->rsp.m0.ct_dataseg[seg].ds_count = dm_segs->ds_len; cto->rsp.m0.ct_xfrlen += dm_segs->ds_len; - totxfr += dm_segs->ds_len; dm_segs++; } cto->ct_seg_count = seg; @@ -1596,7 +1597,7 @@ tdma_mkfc(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error) * Get 'real' residual and set flags based * on it. */ - cto->ct_resid = datalen - totxfr; + cto->ct_resid = resid; if (send_sense) { MEMCPY(cto->rsp.m1.ct_resp, sense, QLTM_SENSELEN); |