From owner-freebsd-current Thu Mar 15 17:31:46 2001 Delivered-To: freebsd-current@freebsd.org Received: from panzer.kdm.org (panzer.kdm.org [216.160.178.169]) by hub.freebsd.org (Postfix) with ESMTP id A3EDF37B719; Thu, 15 Mar 2001 17:31:24 -0800 (PST) (envelope-from ken@panzer.kdm.org) Received: (from ken@localhost) by panzer.kdm.org (8.9.3/8.9.1) id SAA09431; Thu, 15 Mar 2001 18:31:18 -0700 (MST) (envelope-from ken) Date: Thu, 15 Mar 2001 18:31:18 -0700 From: "Kenneth D. Merry" To: scsi@FreeBSD.org Cc: current@FreeBSD.org Subject: aic(4) driver patch Message-ID: <20010315183118.A9399@panzer.kdm.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="XsQoSWH+UP9D9v3l" Content-Disposition: inline User-Agent: Mutt/1.2i Sender: owner-freebsd-current@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG --XsQoSWH+UP9D9v3l Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Attached is a patch for the aic(4) driver to do the following: - enable 10MHz (fast SCSI) operation on boards that support it. (only aic6360 boards with fast SCSI enabled can do it) - bounds check sync periods and offsets passed in from the transport layer - tell the user which resource allocation failed (for the ISA probe) if we weren't able to allocate an IRQ, DRQ or I/O port. Anyway, this patch should apply and run on both -stable and -current. It works for me, but I'd appreciate feedback. Ken -- Kenneth Merry ken@kdm.org --XsQoSWH+UP9D9v3l Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="aic.sync_diffs.20010315" ==== //depot/FreeBSD-adaptec/src/sys/dev/aic/aic.c#2 - /a/ken/perforce/FreeBSD-adaptec/src/sys/dev/aic/aic.c ==== *** /tmp/tmp.77783.0 Thu Mar 15 18:25:00 2001 --- /a/ken/perforce/FreeBSD-adaptec/src/sys/dev/aic/aic.c Thu Mar 15 18:03:03 2001 *************** *** 196,211 **** if ((cts->valid & CCB_TRANS_SYNC_RATE_VALID) != 0) { ti->goal.period = cts->sync_period; ! if (ti->goal.period != ti->current.period) ! ti->flags |= TINFO_SDTR_NEGO; } if ((cts->valid & CCB_TRANS_SYNC_OFFSET_VALID) != 0) { ti->goal.offset = cts->sync_offset; ! if (ti->goal.offset != ti->current.offset) ! ti->flags |= TINFO_SDTR_NEGO; } splx(s); ccb->ccb_h.status = CAM_REQ_CMP; xpt_done(ccb); --- 196,221 ---- if ((cts->valid & CCB_TRANS_SYNC_RATE_VALID) != 0) { ti->goal.period = cts->sync_period; ! ! if (ti->goal.period > aic->min_period) { ! ti->goal.period = 0; ! ti->goal.offset = 0; ! } else if (ti->goal.period < aic->max_period) ! ti->goal.period = aic->max_period; } if ((cts->valid & CCB_TRANS_SYNC_OFFSET_VALID) != 0) { ti->goal.offset = cts->sync_offset; ! if (ti->goal.offset == 0) ! ti->goal.period = 0; ! else if (ti->goal.offset > AIC_SYNC_OFFSET) ! ti->goal.offset = AIC_SYNC_OFFSET; } + if ((ti->goal.period != ti->current.period) + || (ti->goal.offset != ti->current.offset)) + ti->flags |= TINFO_SDTR_NEGO; + splx(s); ccb->ccb_h.status = CAM_REQ_CMP; xpt_done(ccb); *************** *** 1427,1435 **** aic->flags |= AIC_DISC_ENABLE; if (PORTB_DMA(portb)) aic->flags |= AIC_DMA_ENABLE; ! if (aic_inb(aic, REV)) aic->flags |= AIC_DWIO_ENABLE; free_scbs = NULL; for (i = 255; i >= 0; i--) { scb = &aic->scbs[i]; --- 1437,1461 ---- aic->flags |= AIC_DISC_ENABLE; if (PORTB_DMA(portb)) aic->flags |= AIC_DMA_ENABLE; ! ! /* ! * We can do fast SCSI (10MHz clock rate) if bit 4 of portb ! * is set and we've got a 6360. The 6260 can only do standard ! * 5MHz SCSI. ! */ ! if (aic_inb(aic, REV)) { ! if (PORTB_FSYNC(portb)) { ! aic->max_period = AIC_FAST_SYNC_PERIOD; ! aic->flags |= AIC_FAST_ENABLE; ! } else ! aic->max_period = AIC_SYNC_PERIOD; ! aic->flags |= AIC_DWIO_ENABLE; + } else + aic->max_period = AIC_SYNC_PERIOD; + aic->min_period = AIC_MIN_SYNC_PERIOD; + free_scbs = NULL; for (i = 255; i >= 0; i--) { scb = &aic->scbs[i]; *************** *** 1445,1451 **** ti->flags = TINFO_TAG_ENB; if (aic->flags & AIC_DISC_ENABLE) ti->flags |= TINFO_DISC_ENB; ! ti->user.period = AIC_SYNC_PERIOD; ti->user.offset = AIC_SYNC_OFFSET; ti->scsirate = 0; } --- 1471,1477 ---- ti->flags = TINFO_TAG_ENB; if (aic->flags & AIC_DISC_ENABLE) ti->flags |= TINFO_DISC_ENB; ! ti->user.period = aic->max_period; ti->user.offset = AIC_SYNC_OFFSET; ti->scsirate = 0; } *************** *** 1513,1518 **** --- 1539,1546 ---- printf(", disconnection"); if (aic->flags & AIC_PARITY_ENABLE) printf(", parity check"); + if (aic->flags & AIC_FAST_ENABLE) + printf(", fast SCSI"); printf("\n"); aic_cam_rescan(aic); /* have CAM rescan the bus */ ==== //depot/FreeBSD-adaptec/src/sys/dev/aic/aic6360reg.h#1 - /a/ken/perforce/FreeBSD-adaptec/src/sys/dev/aic/aic6360reg.h ==== *** /tmp/tmp.77783.1 Thu Mar 15 18:25:00 2001 --- /a/ken/perforce/FreeBSD-adaptec/src/sys/dev/aic/aic6360reg.h Mon Mar 12 18:31:29 2001 *************** *** 320,327 **** --- 320,329 ---- #define PORTA_PARITY(a) ((a) & 0x80) /* PORTB */ + #define PORTB_EXTTRAN(b)((b) & 1) #define PORTB_DISC(b) ((b) & 4) #define PORTB_SYNC(b) ((b) & 8) + #define PORTB_FSYNC(b) ((b) & 0x10) #define PORTB_BOOT(b) ((b) & 0x40) #define PORTB_DMA(b) ((b) & 0x80) ==== //depot/FreeBSD-adaptec/src/sys/dev/aic/aic_isa.c#2 - /a/ken/perforce/FreeBSD-adaptec/src/sys/dev/aic/aic_isa.c ==== *** /tmp/tmp.77783.2 Thu Mar 15 18:25:00 2001 --- /a/ken/perforce/FreeBSD-adaptec/src/sys/dev/aic/aic_isa.c Thu Mar 15 18:20:27 2001 *************** *** 68,81 **** rid = 0; sc->sc_port = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, 0ul, ~0ul, AIC_ISA_PORTSIZE, RF_ACTIVE); ! if (!sc->sc_port) return (ENOMEM); if (isa_get_irq(dev) != -1) { rid = 0; sc->sc_irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0ul, ~0ul, 1, RF_ACTIVE); if (!sc->sc_irq) { aic_isa_release_resources(dev); return (ENOMEM); } --- 68,84 ---- rid = 0; sc->sc_port = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, 0ul, ~0ul, AIC_ISA_PORTSIZE, RF_ACTIVE); ! if (!sc->sc_port) { ! device_printf(dev, "I/O port allocation failed\n"); return (ENOMEM); + } if (isa_get_irq(dev) != -1) { rid = 0; sc->sc_irq = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0ul, ~0ul, 1, RF_ACTIVE); if (!sc->sc_irq) { + device_printf(dev, "IRQ allocation failed\n"); aic_isa_release_resources(dev); return (ENOMEM); } *************** *** 86,91 **** --- 89,95 ---- sc->sc_drq = bus_alloc_resource(dev, SYS_RES_DRQ, &rid, 0ul, ~0ul, 1, RF_ACTIVE); if (!sc->sc_drq) { + device_printf(dev, "DRQ allocation failed\n"); aic_isa_release_resources(dev); return (ENOMEM); } ==== //depot/FreeBSD-adaptec/src/sys/dev/aic/aicvar.h#1 - /a/ken/perforce/FreeBSD-adaptec/src/sys/dev/aic/aicvar.h ==== *** /tmp/tmp.77783.3 Thu Mar 15 18:25:00 2001 --- /a/ken/perforce/FreeBSD-adaptec/src/sys/dev/aic/aicvar.h Thu Mar 15 17:52:12 2001 *************** *** 91,96 **** --- 91,99 ---- struct aic_tinfo tinfo[8]; struct aic_scb scbs[256]; + + int min_period; + int max_period; }; #define AIC_DISC_ENABLE 0x01 *************** *** 100,105 **** --- 103,109 ---- #define AIC_RESOURCE_SHORTAGE 0x10 #define AIC_DROP_MSGIN 0x20 #define AIC_BUSFREE_OK 0x40 + #define AIC_FAST_ENABLE 0x80 #define AIC_IDLE 0x00 #define AIC_SELECTING 0x01 *************** *** 114,119 **** --- 118,125 ---- #define AIC_MSG_MSGBUF 0x80 #define AIC_SYNC_PERIOD (200 / 4) + #define AIC_FAST_SYNC_PERIOD (100 / 4) + #define AIC_MIN_SYNC_PERIOD 112 #define AIC_SYNC_OFFSET 8 #define aic_inb(aic, port) \ --XsQoSWH+UP9D9v3l-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message