141480Smckusick /* 2*63151Sbostic * Copyright (c) 1982, 1990, 1993 3*63151Sbostic * The Regents of the University of California. All rights reserved. 441480Smckusick * 541480Smckusick * %sccs.include.redist.c% 641480Smckusick * 7*63151Sbostic * @(#)fhpib.c 8.1 (Berkeley) 06/10/93 841480Smckusick */ 941480Smckusick 1041480Smckusick /* 1141480Smckusick * 98625A/B HPIB driver 1241480Smckusick */ 1341480Smckusick #include "hpib.h" 1441480Smckusick #if NHPIB > 0 1541480Smckusick 1656507Sbostic #include <sys/param.h> 1756507Sbostic #include <sys/systm.h> 1856507Sbostic #include <sys/buf.h> 1941480Smckusick 2056507Sbostic #include <hp/dev/device.h> 2156507Sbostic 2256507Sbostic #include <hp300/dev/fhpibreg.h> 2356507Sbostic #include <hp300/dev/hpibvar.h> 2456507Sbostic #include <hp300/dev/dmavar.h> 2556507Sbostic 2641480Smckusick /* 2741480Smckusick * Inline version of fhpibwait to be used in places where 2841480Smckusick * we don't worry about getting hung. 2941480Smckusick */ 3045487Smckusick #define FHPIBWAIT(hd, m) while (((hd)->hpib_intr & (m)) == 0) DELAY(1) 3141480Smckusick 3241480Smckusick #ifdef DEBUG 3341480Smckusick int fhpibdebugunit = -1; 3441480Smckusick int fhpibdebug = 0; 3541480Smckusick #define FDB_FAIL 0x01 3641480Smckusick #define FDB_DMA 0x02 3741480Smckusick #define FDB_WAIT 0x04 3841480Smckusick #define FDB_PPOLL 0x08 3941480Smckusick 4041480Smckusick int dopriodma = 0; /* use high priority DMA */ 4141480Smckusick int doworddma = 1; /* non-zero if we should attempt word dma */ 4241480Smckusick int doppollint = 1; /* use ppoll interrupts instead of watchdog */ 4353929Shibler int fhpibppolldelay = 50; 4441480Smckusick 4541480Smckusick long fhpibbadint[2] = { 0 }; 4641480Smckusick long fhpibtransfer[NHPIB] = { 0 }; 4741480Smckusick long fhpibnondma[NHPIB] = { 0 }; 4841480Smckusick long fhpibworddma[NHPIB] = { 0 }; 4953929Shibler long fhpibppollfail[NHPIB] = { 0 }; 5041480Smckusick #endif 5141480Smckusick 5241480Smckusick int fhpibcmd[NHPIB]; 5341480Smckusick 5441480Smckusick fhpibtype(hc) 5541480Smckusick register struct hp_ctlr *hc; 5641480Smckusick { 5741480Smckusick register struct hpib_softc *hs = &hpib_softc[hc->hp_unit]; 5841480Smckusick register struct fhpibdevice *hd = (struct fhpibdevice *)hc->hp_addr; 5941480Smckusick 6041480Smckusick if (hd->hpib_cid != HPIBC) 6141480Smckusick return(0); 6241480Smckusick hs->sc_type = HPIBC; 6341480Smckusick hs->sc_ba = HPIBC_BA; 6441480Smckusick hc->hp_ipl = HPIB_IPL(hd->hpib_ids); 6541480Smckusick return(1); 6641480Smckusick } 6741480Smckusick 6841480Smckusick fhpibreset(unit) 6941480Smckusick { 7041480Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 7141480Smckusick register struct fhpibdevice *hd; 7241480Smckusick 7341480Smckusick hd = (struct fhpibdevice *)hs->sc_hc->hp_addr; 7441480Smckusick hd->hpib_cid = 0xFF; 7541480Smckusick DELAY(100); 7641480Smckusick hd->hpib_cmd = CT_8BIT; 7741480Smckusick hd->hpib_ar = AR_ARONC; 7841480Smckusick fhpibifc(hd); 7941480Smckusick hd->hpib_ie = IDS_IE; 8041480Smckusick hd->hpib_data = C_DCL; 8141480Smckusick DELAY(100000); 8241480Smckusick /* 8341480Smckusick * See if we can do word dma. 8441480Smckusick * If so, we should be able to write and read back the appropos bit. 8541480Smckusick */ 8641480Smckusick hd->hpib_ie |= IDS_WDMA; 8741480Smckusick if (hd->hpib_ie & IDS_WDMA) { 8841480Smckusick hd->hpib_ie &= ~IDS_WDMA; 8941480Smckusick hs->sc_flags |= HPIBF_DMA16; 9041480Smckusick #ifdef DEBUG 9141480Smckusick if (fhpibdebug & FDB_DMA) 9241480Smckusick printf("fhpibtype: unit %d has word dma\n", unit); 9341480Smckusick 9441480Smckusick #endif 9541480Smckusick } 9641480Smckusick } 9741480Smckusick 9841480Smckusick fhpibifc(hd) 9941480Smckusick register struct fhpibdevice *hd; 10041480Smckusick { 10141480Smckusick hd->hpib_cmd |= CT_IFC; 10241480Smckusick hd->hpib_cmd |= CT_INITFIFO; 10341480Smckusick DELAY(100); 10441480Smckusick hd->hpib_cmd &= ~CT_IFC; 10541480Smckusick hd->hpib_cmd |= CT_REN; 10641480Smckusick hd->hpib_stat = ST_ATN; 10741480Smckusick } 10841480Smckusick 10945487Smckusick fhpibsend(unit, slave, sec, addr, origcnt) 11041480Smckusick register char *addr; 11141480Smckusick { 11241480Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 11341480Smckusick register struct fhpibdevice *hd; 11445487Smckusick register int cnt = origcnt; 11541480Smckusick register int timo; 11641480Smckusick 11741480Smckusick hd = (struct fhpibdevice *)hs->sc_hc->hp_addr; 11841480Smckusick hd->hpib_stat = 0; 11941480Smckusick hd->hpib_imask = IM_IDLE | IM_ROOM; 12041480Smckusick if (fhpibwait(hd, IM_IDLE) < 0) 12145487Smckusick goto senderr; 12241480Smckusick hd->hpib_stat = ST_ATN; 12341480Smckusick hd->hpib_data = C_UNL; 12441480Smckusick hd->hpib_data = C_TAG + hs->sc_ba; 12541480Smckusick hd->hpib_data = C_LAG + slave; 12641480Smckusick if (sec != -1) 12741480Smckusick hd->hpib_data = C_SCG + sec; 12841480Smckusick if (fhpibwait(hd, IM_IDLE) < 0) 12945487Smckusick goto senderr; 13045487Smckusick if (cnt) { 13145487Smckusick hd->hpib_stat = ST_WRITE; 13241480Smckusick while (--cnt) { 13341480Smckusick hd->hpib_data = *addr++; 13441480Smckusick timo = hpibtimeout; 13545487Smckusick while ((hd->hpib_intr & IM_ROOM) == 0) { 13645487Smckusick if (--timo <= 0) 13745487Smckusick goto senderr; 13845487Smckusick DELAY(1); 13945487Smckusick } 14041480Smckusick } 14141480Smckusick hd->hpib_stat = ST_EOI; 14241480Smckusick hd->hpib_data = *addr; 14341480Smckusick FHPIBWAIT(hd, IM_ROOM); 14441480Smckusick hd->hpib_stat = ST_ATN; 14541480Smckusick /* XXX: HP-UX claims bug with CS80 transparent messages */ 14641480Smckusick if (sec == 0x12) 14741480Smckusick DELAY(150); 14841480Smckusick hd->hpib_data = C_UNL; 14945487Smckusick (void) fhpibwait(hd, IM_IDLE); 15041480Smckusick } 15145487Smckusick hd->hpib_imask = 0; 15245487Smckusick return (origcnt); 15345487Smckusick senderr: 15445487Smckusick hd->hpib_imask = 0; 15545487Smckusick fhpibifc(hd); 15641480Smckusick #ifdef DEBUG 15745487Smckusick if (fhpibdebug & FDB_FAIL) { 15845487Smckusick printf("hpib%d: fhpibsend failed: slave %d, sec %x, ", 15945487Smckusick unit, slave, sec); 16045487Smckusick printf("sent %d of %d bytes\n", origcnt-cnt-1, origcnt); 16145487Smckusick } 16241480Smckusick #endif 16345487Smckusick return(origcnt - cnt - 1); 16441480Smckusick } 16541480Smckusick 16645487Smckusick fhpibrecv(unit, slave, sec, addr, origcnt) 16741480Smckusick register char *addr; 16841480Smckusick { 16941480Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 17041480Smckusick register struct fhpibdevice *hd; 17145487Smckusick register int cnt = origcnt; 17241480Smckusick register int timo; 17341480Smckusick 17441480Smckusick hd = (struct fhpibdevice *)hs->sc_hc->hp_addr; 17541480Smckusick hd->hpib_stat = 0; 17641480Smckusick hd->hpib_imask = IM_IDLE | IM_ROOM | IM_BYTE; 17741480Smckusick if (fhpibwait(hd, IM_IDLE) < 0) 17845487Smckusick goto recverror; 17941480Smckusick hd->hpib_stat = ST_ATN; 18041480Smckusick hd->hpib_data = C_UNL; 18141480Smckusick hd->hpib_data = C_LAG + hs->sc_ba; 18241480Smckusick hd->hpib_data = C_TAG + slave; 18341480Smckusick if (sec != -1) 18441480Smckusick hd->hpib_data = C_SCG + sec; 18541480Smckusick if (fhpibwait(hd, IM_IDLE) < 0) 18645487Smckusick goto recverror; 18741480Smckusick hd->hpib_stat = ST_READ0; 18841480Smckusick hd->hpib_data = 0; 18945487Smckusick if (cnt) { 19045487Smckusick while (--cnt >= 0) { 19141480Smckusick timo = hpibtimeout; 19245487Smckusick while ((hd->hpib_intr & IM_BYTE) == 0) { 19345487Smckusick if (--timo == 0) 19445487Smckusick goto recvbyteserror; 19545487Smckusick DELAY(1); 19645487Smckusick } 19741480Smckusick *addr++ = hd->hpib_data; 19845487Smckusick } 19941480Smckusick FHPIBWAIT(hd, IM_ROOM); 20041480Smckusick hd->hpib_stat = ST_ATN; 20141480Smckusick hd->hpib_data = (slave == 31) ? C_UNA : C_UNT; 20245487Smckusick (void) fhpibwait(hd, IM_IDLE); 20341480Smckusick } 20445487Smckusick hd->hpib_imask = 0; 20545487Smckusick return (origcnt); 20645487Smckusick 20745487Smckusick recverror: 20845487Smckusick fhpibifc(hd); 20945487Smckusick recvbyteserror: 21045487Smckusick hd->hpib_imask = 0; 21141480Smckusick #ifdef DEBUG 21245487Smckusick if (fhpibdebug & FDB_FAIL) { 21345487Smckusick printf("hpib%d: fhpibrecv failed: slave %d, sec %x, ", 21445487Smckusick unit, slave, sec); 21545487Smckusick printf("got %d of %d bytes\n", origcnt-cnt-1, origcnt); 21645487Smckusick } 21741480Smckusick #endif 21845487Smckusick return(origcnt - cnt - 1); 21941480Smckusick } 22041480Smckusick 22141480Smckusick fhpibgo(unit, slave, sec, addr, count, rw) 22241480Smckusick register int unit; 22341480Smckusick char *addr; 22441480Smckusick { 22541480Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 22641480Smckusick register struct fhpibdevice *hd; 22741480Smckusick register int i; 22841480Smckusick int flags = 0; 22941480Smckusick 23041480Smckusick #ifdef lint 23141480Smckusick i = unit; if (i) return; 23241480Smckusick #endif 23341480Smckusick hd = (struct fhpibdevice *)hs->sc_hc->hp_addr; 23441480Smckusick hs->sc_flags |= HPIBF_IO; 23541480Smckusick if (rw == B_READ) 23641480Smckusick hs->sc_flags |= HPIBF_READ; 23741480Smckusick #ifdef DEBUG 23841480Smckusick else if (hs->sc_flags & HPIBF_READ) { 23941480Smckusick printf("fhpibgo: HPIBF_READ still set\n"); 24041480Smckusick hs->sc_flags &= ~HPIBF_READ; 24141480Smckusick } 24241480Smckusick #endif 24341480Smckusick hs->sc_count = count; 24441480Smckusick hs->sc_addr = addr; 24541480Smckusick #ifdef DEBUG 24641480Smckusick fhpibtransfer[unit]++; 24741480Smckusick #endif 24841480Smckusick if ((hs->sc_flags & HPIBF_DMA16) && 24941480Smckusick ((int)addr & 1) == 0 && count && (count & 1) == 0 25041480Smckusick #ifdef DEBUG 25141480Smckusick && doworddma 25241480Smckusick #endif 25341480Smckusick ) { 25441480Smckusick #ifdef DEBUG 25541480Smckusick fhpibworddma[unit]++; 25641480Smckusick #endif 25741480Smckusick flags |= DMAGO_WORD; 25841480Smckusick hd->hpib_latch = 0; 25941480Smckusick } 26041480Smckusick #ifdef DEBUG 26141480Smckusick if (dopriodma) 26241480Smckusick flags |= DMAGO_PRI; 26341480Smckusick #endif 26441480Smckusick if (hs->sc_flags & HPIBF_READ) { 26541480Smckusick fhpibcmd[unit] = CT_REN | CT_8BIT; 26641480Smckusick hs->sc_curcnt = count; 26741480Smckusick dmago(hs->sc_dq.dq_ctlr, addr, count, flags|DMAGO_READ); 26841480Smckusick if (fhpibrecv(unit, slave, sec, 0, 0) < 0) { 26941480Smckusick #ifdef DEBUG 27041480Smckusick printf("fhpibgo: recv failed, retrying...\n"); 27141480Smckusick #endif 27241480Smckusick (void) fhpibrecv(unit, slave, sec, 0, 0); 27341480Smckusick } 27441480Smckusick i = hd->hpib_cmd; 27541480Smckusick hd->hpib_cmd = fhpibcmd[unit]; 27641480Smckusick hd->hpib_ie = IDS_DMA(hs->sc_dq.dq_ctlr) | 27741480Smckusick ((flags & DMAGO_WORD) ? IDS_WDMA : 0); 27841480Smckusick return; 27941480Smckusick } 28041480Smckusick fhpibcmd[unit] = CT_REN | CT_8BIT | CT_FIFOSEL; 28145487Smckusick if (count < hpibdmathresh) { 28241480Smckusick #ifdef DEBUG 28341480Smckusick fhpibnondma[unit]++; 28445487Smckusick if (flags & DMAGO_WORD) 28545487Smckusick fhpibworddma[unit]--; 28641480Smckusick #endif 28741480Smckusick hs->sc_curcnt = count; 28841480Smckusick (void) fhpibsend(unit, slave, sec, addr, count); 28941480Smckusick fhpibdone(unit); 29041480Smckusick return; 29141480Smckusick } 29241480Smckusick count -= (flags & DMAGO_WORD) ? 2 : 1; 29341480Smckusick hs->sc_curcnt = count; 29441480Smckusick dmago(hs->sc_dq.dq_ctlr, addr, count, flags); 29541480Smckusick if (fhpibsend(unit, slave, sec, 0, 0) < 0) { 29641480Smckusick #ifdef DEBUG 29741480Smckusick printf("fhpibgo: send failed, retrying...\n"); 29841480Smckusick #endif 29941480Smckusick (void) fhpibsend(unit, slave, sec, 0, 0); 30041480Smckusick } 30141480Smckusick i = hd->hpib_cmd; 30241480Smckusick hd->hpib_cmd = fhpibcmd[unit]; 30341480Smckusick hd->hpib_ie = IDS_DMA(hs->sc_dq.dq_ctlr) | IDS_WRITE | 30441480Smckusick ((flags & DMAGO_WORD) ? IDS_WDMA : 0); 30541480Smckusick } 30641480Smckusick 30741480Smckusick fhpibdone(unit) 30841480Smckusick { 30941480Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 31041480Smckusick register struct fhpibdevice *hd; 31141480Smckusick register char *addr; 31241480Smckusick register int cnt; 31341480Smckusick 31441480Smckusick hd = (struct fhpibdevice *)hs->sc_hc->hp_addr; 31541480Smckusick cnt = hs->sc_curcnt; 31641480Smckusick hs->sc_addr += cnt; 31741480Smckusick hs->sc_count -= cnt; 31841480Smckusick #ifdef DEBUG 31941480Smckusick if ((fhpibdebug & FDB_DMA) && fhpibdebugunit == unit) 32041480Smckusick printf("fhpibdone: addr %x cnt %d\n", 32141480Smckusick hs->sc_addr, hs->sc_count); 32241480Smckusick #endif 32341480Smckusick if (hs->sc_flags & HPIBF_READ) 32441480Smckusick hd->hpib_imask = IM_IDLE | IM_BYTE; 32541480Smckusick else { 32641480Smckusick cnt = hs->sc_count; 32741480Smckusick if (cnt) { 32841480Smckusick addr = hs->sc_addr; 32941480Smckusick hd->hpib_imask = IM_IDLE | IM_ROOM; 33041480Smckusick FHPIBWAIT(hd, IM_IDLE); 33141480Smckusick hd->hpib_stat = ST_WRITE; 33241480Smckusick while (--cnt) { 33341480Smckusick hd->hpib_data = *addr++; 33441480Smckusick FHPIBWAIT(hd, IM_ROOM); 33541480Smckusick } 33641480Smckusick hd->hpib_stat = ST_EOI; 33741480Smckusick hd->hpib_data = *addr; 33841480Smckusick } 33941480Smckusick hd->hpib_imask = IM_IDLE; 34041480Smckusick } 34141480Smckusick hs->sc_flags |= HPIBF_DONE; 34241480Smckusick hd->hpib_stat = ST_IENAB; 34341480Smckusick hd->hpib_ie = IDS_IE; 34441480Smckusick } 34541480Smckusick 34641480Smckusick fhpibintr(unit) 34741480Smckusick register int unit; 34841480Smckusick { 34941480Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 35041480Smckusick register struct fhpibdevice *hd; 35141480Smckusick register struct devqueue *dq; 35241480Smckusick register int stat0; 35341480Smckusick 35441480Smckusick hd = (struct fhpibdevice *)hs->sc_hc->hp_addr; 35541480Smckusick stat0 = hd->hpib_ids; 35641480Smckusick if ((stat0 & (IDS_IE|IDS_IR)) != (IDS_IE|IDS_IR)) { 35741480Smckusick #ifdef DEBUG 35841480Smckusick if ((fhpibdebug & FDB_FAIL) && (stat0 & IDS_IR) && 35941480Smckusick (hs->sc_flags & (HPIBF_IO|HPIBF_DONE)) != HPIBF_IO) 36041480Smckusick printf("hpib%d: fhpibintr: bad status %x\n", 36141480Smckusick unit, stat0); 36241480Smckusick fhpibbadint[0]++; 36341480Smckusick #endif 36441480Smckusick return(0); 36541480Smckusick } 36641480Smckusick if ((hs->sc_flags & (HPIBF_IO|HPIBF_DONE)) == HPIBF_IO) { 36741480Smckusick #ifdef DEBUG 36841480Smckusick fhpibbadint[1]++; 36941480Smckusick #endif 37041480Smckusick return(0); 37141480Smckusick } 37241480Smckusick #ifdef DEBUG 37341480Smckusick if ((fhpibdebug & FDB_DMA) && fhpibdebugunit == unit) 37441480Smckusick printf("fhpibintr: flags %x\n", hs->sc_flags); 37541480Smckusick #endif 37641480Smckusick dq = hs->sc_sq.dq_forw; 37741480Smckusick if (hs->sc_flags & HPIBF_IO) { 37841480Smckusick stat0 = hd->hpib_cmd; 37941480Smckusick hd->hpib_cmd = fhpibcmd[unit] & ~CT_8BIT; 38041480Smckusick hd->hpib_stat = 0; 38141480Smckusick hd->hpib_cmd = CT_REN | CT_8BIT; 38241480Smckusick stat0 = hd->hpib_intr; 38341480Smckusick hd->hpib_imask = 0; 38441480Smckusick hs->sc_flags &= ~(HPIBF_DONE|HPIBF_IO|HPIBF_READ); 38541480Smckusick dmafree(&hs->sc_dq); 38641480Smckusick (dq->dq_driver->d_intr)(dq->dq_unit); 38741480Smckusick } else if (hs->sc_flags & HPIBF_PPOLL) { 38841480Smckusick stat0 = hd->hpib_intr; 38941480Smckusick #ifdef DEBUG 39041480Smckusick if ((fhpibdebug & FDB_FAIL) && 39141480Smckusick doppollint && (stat0 & IM_PPRESP) == 0) 39241480Smckusick printf("hpib%d: fhpibintr: bad intr reg %x\n", 39341480Smckusick unit, stat0); 39441480Smckusick #endif 39541480Smckusick hd->hpib_stat = 0; 39641480Smckusick hd->hpib_imask = 0; 39741480Smckusick #ifdef DEBUG 39841480Smckusick stat0 = fhpibppoll(unit); 39941480Smckusick if ((fhpibdebug & FDB_PPOLL) && unit == fhpibdebugunit) 40041480Smckusick printf("fhpibintr: got PPOLL status %x\n", stat0); 40141480Smckusick if ((stat0 & (0x80 >> dq->dq_slave)) == 0) { 40253929Shibler /* 40353929Shibler * XXX give it another shot (68040) 40453929Shibler */ 40553929Shibler fhpibppollfail[unit]++; 40653929Shibler DELAY(fhpibppolldelay); 40753929Shibler stat0 = fhpibppoll(unit); 40853929Shibler if ((stat0 & (0x80 >> dq->dq_slave)) == 0 && 40953929Shibler (fhpibdebug & FDB_PPOLL) && unit == fhpibdebugunit) 41053929Shibler printf("fhpibintr: PPOLL: unit %d slave %d stat %x\n", 41153929Shibler unit, dq->dq_slave, stat0); 41241480Smckusick } 41341480Smckusick #endif 41441480Smckusick hs->sc_flags &= ~HPIBF_PPOLL; 41541480Smckusick (dq->dq_driver->d_intr)(dq->dq_unit); 41641480Smckusick } 41741480Smckusick return(1); 41841480Smckusick } 41941480Smckusick 42041480Smckusick fhpibppoll(unit) 42141480Smckusick { 42241480Smckusick register struct fhpibdevice *hd; 42341480Smckusick register int ppoll; 42441480Smckusick 42541480Smckusick hd = (struct fhpibdevice *)hpib_softc[unit].sc_hc->hp_addr; 42641480Smckusick hd->hpib_stat = 0; 42741480Smckusick hd->hpib_psense = 0; 42841480Smckusick hd->hpib_pmask = 0xFF; 42941480Smckusick hd->hpib_imask = IM_PPRESP | IM_PABORT; 43041480Smckusick DELAY(25); 43141480Smckusick hd->hpib_intr = IM_PABORT; 43241480Smckusick ppoll = hd->hpib_data; 43341480Smckusick if (hd->hpib_intr & IM_PABORT) 43441480Smckusick ppoll = 0; 43541480Smckusick hd->hpib_imask = 0; 43641480Smckusick hd->hpib_pmask = 0; 43741480Smckusick hd->hpib_stat = ST_IENAB; 43841480Smckusick return(ppoll); 43941480Smckusick } 44041480Smckusick 44141480Smckusick fhpibwait(hd, x) 44241480Smckusick register struct fhpibdevice *hd; 44341480Smckusick { 44441480Smckusick register int timo = hpibtimeout; 44541480Smckusick 44641480Smckusick while ((hd->hpib_intr & x) == 0 && --timo) 44745487Smckusick DELAY(1); 44841480Smckusick if (timo == 0) { 44941480Smckusick #ifdef DEBUG 45041480Smckusick if (fhpibdebug & FDB_FAIL) 45141480Smckusick printf("fhpibwait(%x, %x) timeout\n", hd, x); 45241480Smckusick #endif 45341480Smckusick return(-1); 45441480Smckusick } 45541480Smckusick return(0); 45641480Smckusick } 45741480Smckusick 45841480Smckusick /* 45954770Storek * XXX: this will have to change if we ever allow more than one 46041480Smckusick * pending operation per HP-IB. 46141480Smckusick */ 46254770Storek void 46354770Storek fhpibppwatch(arg) 46454770Storek void *arg; 46541480Smckusick { 46654770Storek register int unit; 46754770Storek register struct hpib_softc *hs; 46841480Smckusick register struct fhpibdevice *hd; 46941480Smckusick register int slave; 47041480Smckusick 47154770Storek unit = (int)arg; 47254770Storek hs = &hpib_softc[unit]; 47341480Smckusick if ((hs->sc_flags & HPIBF_PPOLL) == 0) 47441480Smckusick return; 47541480Smckusick hd = (struct fhpibdevice *)hs->sc_hc->hp_addr; 47641480Smckusick slave = (0x80 >> hs->sc_sq.dq_forw->dq_slave); 47741480Smckusick #ifdef DEBUG 47841480Smckusick if (!doppollint) { 47941480Smckusick if (fhpibppoll(unit) & slave) { 48041480Smckusick hd->hpib_stat = ST_IENAB; 48141480Smckusick hd->hpib_imask = IM_IDLE | IM_ROOM; 48241480Smckusick } else 48354770Storek timeout(fhpibppwatch, (void *)unit, 1); 48441480Smckusick return; 48541480Smckusick } 48641480Smckusick if ((fhpibdebug & FDB_PPOLL) && unit == fhpibdebugunit) 48741480Smckusick printf("fhpibppwatch: sense request on %d\n", unit); 48841480Smckusick #endif 48941480Smckusick hd->hpib_psense = ~slave; 49041480Smckusick hd->hpib_pmask = slave; 49141480Smckusick hd->hpib_stat = ST_IENAB; 49241480Smckusick hd->hpib_imask = IM_PPRESP | IM_PABORT; 49341480Smckusick hd->hpib_ie = IDS_IE; 49441480Smckusick } 49541480Smckusick #endif 496