From 2c1579fa588b7bed49ace5a34ed0fb425528ab0c Mon Sep 17 00:00:00 2001 From: mjacob Date: Mon, 16 Aug 1999 19:52:29 +0000 Subject: Set some correct return values. Prefer I/O map all the time unless configured otherwise. --- sys/pci/isp_pci.c | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) (limited to 'sys/pci') diff --git a/sys/pci/isp_pci.c b/sys/pci/isp_pci.c index 34473da..e32a1cb 100644 --- a/sys/pci/isp_pci.c +++ b/sys/pci/isp_pci.c @@ -1,5 +1,4 @@ -/* $Id: isp_pci.c,v 1.28 1999/07/06 01:24:20 mjacob Exp $ */ -/* release_6_5_99 */ +/* $Id: isp_pci.c,v 1.29 1999/08/16 01:52:21 gibbs Exp $ */ /* * PCI specific probe and attach routines for Qlogic ISP SCSI adapters. * FreeBSD Version. @@ -143,11 +142,7 @@ static struct ispmdvec mdvec_2200 = { #endif #ifndef SCSI_ISP_PREFER_MEM_MAP -#ifdef __alpha__ #define SCSI_ISP_PREFER_MEM_MAP 0 -#else -#define SCSI_ISP_PREFER_MEM_MAP 1 -#endif #endif #ifndef PCIM_CMD_INVEN @@ -301,7 +296,6 @@ isp_pci_probe(pcici_t tag, pcidi_t type) return (x); } - static void isp_pci_attach(pcici_t cfid, int unit) { @@ -1017,7 +1011,7 @@ isp_pci_dmasetup(struct ispsoftc *isp, ISP_SCSI_XFER_T *ccb, ispreq_t *rq, struct isp_pcisoftc *pci = (struct isp_pcisoftc *)isp; struct ccb_hdr *ccb_h; struct ccb_scsiio *csio; - bus_dmamap_t *dp; + bus_dmamap_t *dp = NULL; mush_t mush, *mp; csio = (struct ccb_scsiio *) ccb; @@ -1027,7 +1021,6 @@ isp_pci_dmasetup(struct ispsoftc *isp, ISP_SCSI_XFER_T *ccb, ispreq_t *rq, rq->req_seg_count = 1; return (CMD_QUEUED); } - dp = &pci->dmaps[rq->req_handle - 1]; /* * Do a virtual grapevine step to collect info for @@ -1045,6 +1038,7 @@ isp_pci_dmasetup(struct ispsoftc *isp, ISP_SCSI_XFER_T *ccb, ispreq_t *rq, if ((ccb_h->flags & CAM_DATA_PHYS) == 0) { int error, s; + dp = &pci->dmaps[rq->req_handle - 1]; s = splsoftvm(); error = bus_dmamap_load(pci->parent_dmat, *dp, csio->data_ptr, csio->dxfer_len, dma2, mp, 0); @@ -1054,6 +1048,10 @@ isp_pci_dmasetup(struct ispsoftc *isp, ISP_SCSI_XFER_T *ccb, ispreq_t *rq, printf("%s: deferred dma allocation not " "supported\n", isp->isp_name); } else if (error && mp->error == 0) { +#ifdef DIAGNOSTIC + printf("%s: error %d in dma mapping code\n", + isp->isp_name, error); +#endif mp->error = error; } splx(s); @@ -1085,16 +1083,25 @@ isp_pci_dmasetup(struct ispsoftc *isp, ISP_SCSI_XFER_T *ccb, ispreq_t *rq, int retval = CMD_COMPLETE; if (mp->error == MUSHERR_NOQENTRIES) { retval = CMD_EAGAIN; - ccb_h->status = CAM_UNREC_HBA_ERROR; } else if (mp->error == EFBIG) { - ccb_h->status = CAM_REQ_TOO_BIG; + XS_SETERR(csio, CAM_REQ_TOO_BIG); } else if (mp->error == EINVAL) { - ccb_h->status = CAM_REQ_INVALID; + XS_SETERR(csio, CAM_REQ_INVALID); } else { - ccb_h->status = CAM_UNREC_HBA_ERROR; + XS_SETERR(csio, CAM_UNREC_HBA_ERROR); } return (retval); } else { + /* + * Check to see if we weren't cancelled while sleeping on + * getting DMA resources... + */ + if ((ccb_h->status & CAM_STATUS_MASK) != CAM_REQ_INPROG) { + if (dp) { + bus_dmamap_unload(pci->parent_dmat, *dp); + } + return (CMD_COMPLETE); + } return (CMD_QUEUED); } } -- cgit v1.1