aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/isp
diff options
context:
space:
mode:
authorMatt Jacob <mjacob@FreeBSD.org>2009-11-02 21:22:30 +0000
committerMatt Jacob <mjacob@FreeBSD.org>2009-11-02 21:22:30 +0000
commit0bd051b8696b2d7afb53437cb5934128294de862 (patch)
tree505afd16bba201b27924b9e4a5d20aa9892a4a0f /sys/dev/isp
parent5ef5fd6e5397eb7583f2b238bad50de0f97b8301 (diff)
downloadsrc-0bd051b8696b2d7afb53437cb5934128294de862.tar.gz
src-0bd051b8696b2d7afb53437cb5934128294de862.zip
Unbreak SBus cards which have been broken (apparently) for a while.
Most of the pieces came from Marius- correct settings for channels and resource management. The one piece missing was that you cannot for SBus cards replace 32 bit operations with A64 operations- not supported. Submitted by: marius MFC after: 3 days
Notes
Notes: svn path=/head/; revision=198822
Diffstat (limited to 'sys/dev/isp')
-rw-r--r--sys/dev/isp/isp_sbus.c26
1 files changed, 8 insertions, 18 deletions
diff --git a/sys/dev/isp/isp_sbus.c b/sys/dev/isp/isp_sbus.c
index af7cb88d602e..a50d0f20ed86 100644
--- a/sys/dev/isp/isp_sbus.c
+++ b/sys/dev/isp/isp_sbus.c
@@ -193,6 +193,8 @@ isp_sbus_attach(device_t dev)
isp->isp_param = &sbs->sbus_param;
isp->isp_osinfo.pc.ptr = &sbs->sbus_spi;
isp->isp_revision = 0; /* XXX */
+ isp->isp_dev = dev;
+ isp->isp_nchan = 1;
ISP_SET_PC(isp, 0, role, role);
/*
@@ -316,18 +318,16 @@ isp_sbus_attach(device_t dev)
goto bad;
}
isp_init(isp);
- if (role != ISP_ROLE_NONE && isp->isp_state != ISP_INITSTATE) {
- isp_uninit(isp);
- ISP_UNLOCK(isp);
- goto bad;
+ if (isp->isp_state == ISP_INITSTATE) {
+ isp->isp_state = ISP_RUNSTATE;
}
- isp_attach(isp);
- if (role != ISP_ROLE_NONE && isp->isp_state != ISP_RUNSTATE) {
+ ISP_UNLOCK(isp);
+ if (isp_attach(isp)) {
+ ISP_LOCK(isp);
isp_uninit(isp);
ISP_UNLOCK(isp);
goto bad;
}
- ISP_UNLOCK(isp);
return (0);
bad:
@@ -345,13 +345,10 @@ bad:
}
if (regs) {
- (void) bus_release_resource(dev, 0, 0, regs);
+ (void) bus_release_resource(dev, SYS_RES_MEMORY, 0, regs);
}
if (sbs) {
- if (sbs->sbus_isp.isp_param) {
- free(sbs->sbus_isp.isp_param, M_DEVBUF);
- }
free(sbs, M_DEVBUF);
}
return (ENXIO);
@@ -584,13 +581,6 @@ dma2(void *arg, bus_dma_segment_t *dm_segs, int nseg, int error)
isp = mp->isp;
rq = mp->rq;
if (nseg) {
- if (sizeof (bus_addr_t) > 4) {
- if (rq->req_header.rqs_entry_type == RQSTYPE_T2RQS) {
- rq->req_header.rqs_entry_type = RQSTYPE_T3RQS;
- } else if (rq->req_header.rqs_entry_type == RQSTYPE_REQUEST) {
- rq->req_header.rqs_entry_type = RQSTYPE_A64;
- }
- }
if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) {
bus_dmamap_sync(isp->isp_osinfo.dmat, PISP_PCMD(csio)->dmap, BUS_DMASYNC_PREREAD);
ddir = ISP_FROM_DEVICE;