141480Smckusick /* 241480Smckusick * Copyright (c) 1982, 1990 The Regents of the University of California. 341480Smckusick * All rights reserved. 441480Smckusick * 541480Smckusick * %sccs.include.redist.c% 641480Smckusick * 7*53929Shibler * @(#)fhpib.c 7.4 (Berkeley) 06/05/92 841480Smckusick */ 941480Smckusick 1041480Smckusick /* 1141480Smckusick * 98625A/B HPIB driver 1241480Smckusick */ 1341480Smckusick #include "hpib.h" 1441480Smckusick #if NHPIB > 0 1541480Smckusick 1645788Sbostic #include "sys/param.h" 1745788Sbostic #include "sys/systm.h" 1845788Sbostic #include "sys/buf.h" 19*53929Shibler #include "hp/dev/device.h" 2041480Smckusick #include "fhpibreg.h" 2141480Smckusick #include "hpibvar.h" 2241480Smckusick #include "dmavar.h" 2341480Smckusick 2441480Smckusick /* 2541480Smckusick * Inline version of fhpibwait to be used in places where 2641480Smckusick * we don't worry about getting hung. 2741480Smckusick */ 2845487Smckusick #define FHPIBWAIT(hd, m) while (((hd)->hpib_intr & (m)) == 0) DELAY(1) 2941480Smckusick 3041480Smckusick #ifdef DEBUG 3141480Smckusick int fhpibdebugunit = -1; 3241480Smckusick int fhpibdebug = 0; 3341480Smckusick #define FDB_FAIL 0x01 3441480Smckusick #define FDB_DMA 0x02 3541480Smckusick #define FDB_WAIT 0x04 3641480Smckusick #define FDB_PPOLL 0x08 3741480Smckusick 3841480Smckusick int dopriodma = 0; /* use high priority DMA */ 3941480Smckusick int doworddma = 1; /* non-zero if we should attempt word dma */ 4041480Smckusick int doppollint = 1; /* use ppoll interrupts instead of watchdog */ 41*53929Shibler int fhpibppolldelay = 50; 4241480Smckusick 4341480Smckusick long fhpibbadint[2] = { 0 }; 4441480Smckusick long fhpibtransfer[NHPIB] = { 0 }; 4541480Smckusick long fhpibnondma[NHPIB] = { 0 }; 4641480Smckusick long fhpibworddma[NHPIB] = { 0 }; 47*53929Shibler long fhpibppollfail[NHPIB] = { 0 }; 4841480Smckusick #endif 4941480Smckusick 5041480Smckusick int fhpibcmd[NHPIB]; 5141480Smckusick 5241480Smckusick fhpibtype(hc) 5341480Smckusick register struct hp_ctlr *hc; 5441480Smckusick { 5541480Smckusick register struct hpib_softc *hs = &hpib_softc[hc->hp_unit]; 5641480Smckusick register struct fhpibdevice *hd = (struct fhpibdevice *)hc->hp_addr; 5741480Smckusick 5841480Smckusick if (hd->hpib_cid != HPIBC) 5941480Smckusick return(0); 6041480Smckusick hs->sc_type = HPIBC; 6141480Smckusick hs->sc_ba = HPIBC_BA; 6241480Smckusick hc->hp_ipl = HPIB_IPL(hd->hpib_ids); 6341480Smckusick return(1); 6441480Smckusick } 6541480Smckusick 6641480Smckusick fhpibreset(unit) 6741480Smckusick { 6841480Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 6941480Smckusick register struct fhpibdevice *hd; 7041480Smckusick 7141480Smckusick hd = (struct fhpibdevice *)hs->sc_hc->hp_addr; 7241480Smckusick hd->hpib_cid = 0xFF; 7341480Smckusick DELAY(100); 7441480Smckusick hd->hpib_cmd = CT_8BIT; 7541480Smckusick hd->hpib_ar = AR_ARONC; 7641480Smckusick fhpibifc(hd); 7741480Smckusick hd->hpib_ie = IDS_IE; 7841480Smckusick hd->hpib_data = C_DCL; 7941480Smckusick DELAY(100000); 8041480Smckusick /* 8141480Smckusick * See if we can do word dma. 8241480Smckusick * If so, we should be able to write and read back the appropos bit. 8341480Smckusick */ 8441480Smckusick hd->hpib_ie |= IDS_WDMA; 8541480Smckusick if (hd->hpib_ie & IDS_WDMA) { 8641480Smckusick hd->hpib_ie &= ~IDS_WDMA; 8741480Smckusick hs->sc_flags |= HPIBF_DMA16; 8841480Smckusick #ifdef DEBUG 8941480Smckusick if (fhpibdebug & FDB_DMA) 9041480Smckusick printf("fhpibtype: unit %d has word dma\n", unit); 9141480Smckusick 9241480Smckusick #endif 9341480Smckusick } 9441480Smckusick } 9541480Smckusick 9641480Smckusick fhpibifc(hd) 9741480Smckusick register struct fhpibdevice *hd; 9841480Smckusick { 9941480Smckusick hd->hpib_cmd |= CT_IFC; 10041480Smckusick hd->hpib_cmd |= CT_INITFIFO; 10141480Smckusick DELAY(100); 10241480Smckusick hd->hpib_cmd &= ~CT_IFC; 10341480Smckusick hd->hpib_cmd |= CT_REN; 10441480Smckusick hd->hpib_stat = ST_ATN; 10541480Smckusick } 10641480Smckusick 10745487Smckusick fhpibsend(unit, slave, sec, addr, origcnt) 10841480Smckusick register char *addr; 10941480Smckusick { 11041480Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 11141480Smckusick register struct fhpibdevice *hd; 11245487Smckusick register int cnt = origcnt; 11341480Smckusick register int timo; 11441480Smckusick 11541480Smckusick hd = (struct fhpibdevice *)hs->sc_hc->hp_addr; 11641480Smckusick hd->hpib_stat = 0; 11741480Smckusick hd->hpib_imask = IM_IDLE | IM_ROOM; 11841480Smckusick if (fhpibwait(hd, IM_IDLE) < 0) 11945487Smckusick goto senderr; 12041480Smckusick hd->hpib_stat = ST_ATN; 12141480Smckusick hd->hpib_data = C_UNL; 12241480Smckusick hd->hpib_data = C_TAG + hs->sc_ba; 12341480Smckusick hd->hpib_data = C_LAG + slave; 12441480Smckusick if (sec != -1) 12541480Smckusick hd->hpib_data = C_SCG + sec; 12641480Smckusick if (fhpibwait(hd, IM_IDLE) < 0) 12745487Smckusick goto senderr; 12845487Smckusick if (cnt) { 12945487Smckusick hd->hpib_stat = ST_WRITE; 13041480Smckusick while (--cnt) { 13141480Smckusick hd->hpib_data = *addr++; 13241480Smckusick timo = hpibtimeout; 13345487Smckusick while ((hd->hpib_intr & IM_ROOM) == 0) { 13445487Smckusick if (--timo <= 0) 13545487Smckusick goto senderr; 13645487Smckusick DELAY(1); 13745487Smckusick } 13841480Smckusick } 13941480Smckusick hd->hpib_stat = ST_EOI; 14041480Smckusick hd->hpib_data = *addr; 14141480Smckusick FHPIBWAIT(hd, IM_ROOM); 14241480Smckusick hd->hpib_stat = ST_ATN; 14341480Smckusick /* XXX: HP-UX claims bug with CS80 transparent messages */ 14441480Smckusick if (sec == 0x12) 14541480Smckusick DELAY(150); 14641480Smckusick hd->hpib_data = C_UNL; 14745487Smckusick (void) fhpibwait(hd, IM_IDLE); 14841480Smckusick } 14945487Smckusick hd->hpib_imask = 0; 15045487Smckusick return (origcnt); 15145487Smckusick senderr: 15245487Smckusick hd->hpib_imask = 0; 15345487Smckusick fhpibifc(hd); 15441480Smckusick #ifdef DEBUG 15545487Smckusick if (fhpibdebug & FDB_FAIL) { 15645487Smckusick printf("hpib%d: fhpibsend failed: slave %d, sec %x, ", 15745487Smckusick unit, slave, sec); 15845487Smckusick printf("sent %d of %d bytes\n", origcnt-cnt-1, origcnt); 15945487Smckusick } 16041480Smckusick #endif 16145487Smckusick return(origcnt - cnt - 1); 16241480Smckusick } 16341480Smckusick 16445487Smckusick fhpibrecv(unit, slave, sec, addr, origcnt) 16541480Smckusick register char *addr; 16641480Smckusick { 16741480Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 16841480Smckusick register struct fhpibdevice *hd; 16945487Smckusick register int cnt = origcnt; 17041480Smckusick register int timo; 17141480Smckusick 17241480Smckusick hd = (struct fhpibdevice *)hs->sc_hc->hp_addr; 17341480Smckusick hd->hpib_stat = 0; 17441480Smckusick hd->hpib_imask = IM_IDLE | IM_ROOM | IM_BYTE; 17541480Smckusick if (fhpibwait(hd, IM_IDLE) < 0) 17645487Smckusick goto recverror; 17741480Smckusick hd->hpib_stat = ST_ATN; 17841480Smckusick hd->hpib_data = C_UNL; 17941480Smckusick hd->hpib_data = C_LAG + hs->sc_ba; 18041480Smckusick hd->hpib_data = C_TAG + slave; 18141480Smckusick if (sec != -1) 18241480Smckusick hd->hpib_data = C_SCG + sec; 18341480Smckusick if (fhpibwait(hd, IM_IDLE) < 0) 18445487Smckusick goto recverror; 18541480Smckusick hd->hpib_stat = ST_READ0; 18641480Smckusick hd->hpib_data = 0; 18745487Smckusick if (cnt) { 18845487Smckusick while (--cnt >= 0) { 18941480Smckusick timo = hpibtimeout; 19045487Smckusick while ((hd->hpib_intr & IM_BYTE) == 0) { 19145487Smckusick if (--timo == 0) 19245487Smckusick goto recvbyteserror; 19345487Smckusick DELAY(1); 19445487Smckusick } 19541480Smckusick *addr++ = hd->hpib_data; 19645487Smckusick } 19741480Smckusick FHPIBWAIT(hd, IM_ROOM); 19841480Smckusick hd->hpib_stat = ST_ATN; 19941480Smckusick hd->hpib_data = (slave == 31) ? C_UNA : C_UNT; 20045487Smckusick (void) fhpibwait(hd, IM_IDLE); 20141480Smckusick } 20245487Smckusick hd->hpib_imask = 0; 20345487Smckusick return (origcnt); 20445487Smckusick 20545487Smckusick recverror: 20645487Smckusick fhpibifc(hd); 20745487Smckusick recvbyteserror: 20845487Smckusick hd->hpib_imask = 0; 20941480Smckusick #ifdef DEBUG 21045487Smckusick if (fhpibdebug & FDB_FAIL) { 21145487Smckusick printf("hpib%d: fhpibrecv failed: slave %d, sec %x, ", 21245487Smckusick unit, slave, sec); 21345487Smckusick printf("got %d of %d bytes\n", origcnt-cnt-1, origcnt); 21445487Smckusick } 21541480Smckusick #endif 21645487Smckusick return(origcnt - cnt - 1); 21741480Smckusick } 21841480Smckusick 21941480Smckusick fhpibgo(unit, slave, sec, addr, count, rw) 22041480Smckusick register int unit; 22141480Smckusick char *addr; 22241480Smckusick { 22341480Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 22441480Smckusick register struct fhpibdevice *hd; 22541480Smckusick register int i; 22641480Smckusick int flags = 0; 22741480Smckusick 22841480Smckusick #ifdef lint 22941480Smckusick i = unit; if (i) return; 23041480Smckusick #endif 23141480Smckusick hd = (struct fhpibdevice *)hs->sc_hc->hp_addr; 23241480Smckusick hs->sc_flags |= HPIBF_IO; 23341480Smckusick if (rw == B_READ) 23441480Smckusick hs->sc_flags |= HPIBF_READ; 23541480Smckusick #ifdef DEBUG 23641480Smckusick else if (hs->sc_flags & HPIBF_READ) { 23741480Smckusick printf("fhpibgo: HPIBF_READ still set\n"); 23841480Smckusick hs->sc_flags &= ~HPIBF_READ; 23941480Smckusick } 24041480Smckusick #endif 24141480Smckusick hs->sc_count = count; 24241480Smckusick hs->sc_addr = addr; 24341480Smckusick #ifdef DEBUG 24441480Smckusick fhpibtransfer[unit]++; 24541480Smckusick #endif 24641480Smckusick if ((hs->sc_flags & HPIBF_DMA16) && 24741480Smckusick ((int)addr & 1) == 0 && count && (count & 1) == 0 24841480Smckusick #ifdef DEBUG 24941480Smckusick && doworddma 25041480Smckusick #endif 25141480Smckusick ) { 25241480Smckusick #ifdef DEBUG 25341480Smckusick fhpibworddma[unit]++; 25441480Smckusick #endif 25541480Smckusick flags |= DMAGO_WORD; 25641480Smckusick hd->hpib_latch = 0; 25741480Smckusick } 25841480Smckusick #ifdef DEBUG 25941480Smckusick if (dopriodma) 26041480Smckusick flags |= DMAGO_PRI; 26141480Smckusick #endif 26241480Smckusick if (hs->sc_flags & HPIBF_READ) { 26341480Smckusick fhpibcmd[unit] = CT_REN | CT_8BIT; 26441480Smckusick hs->sc_curcnt = count; 26541480Smckusick dmago(hs->sc_dq.dq_ctlr, addr, count, flags|DMAGO_READ); 26641480Smckusick if (fhpibrecv(unit, slave, sec, 0, 0) < 0) { 26741480Smckusick #ifdef DEBUG 26841480Smckusick printf("fhpibgo: recv failed, retrying...\n"); 26941480Smckusick #endif 27041480Smckusick (void) fhpibrecv(unit, slave, sec, 0, 0); 27141480Smckusick } 27241480Smckusick i = hd->hpib_cmd; 27341480Smckusick hd->hpib_cmd = fhpibcmd[unit]; 27441480Smckusick hd->hpib_ie = IDS_DMA(hs->sc_dq.dq_ctlr) | 27541480Smckusick ((flags & DMAGO_WORD) ? IDS_WDMA : 0); 27641480Smckusick return; 27741480Smckusick } 27841480Smckusick fhpibcmd[unit] = CT_REN | CT_8BIT | CT_FIFOSEL; 27945487Smckusick if (count < hpibdmathresh) { 28041480Smckusick #ifdef DEBUG 28141480Smckusick fhpibnondma[unit]++; 28245487Smckusick if (flags & DMAGO_WORD) 28345487Smckusick fhpibworddma[unit]--; 28441480Smckusick #endif 28541480Smckusick hs->sc_curcnt = count; 28641480Smckusick (void) fhpibsend(unit, slave, sec, addr, count); 28741480Smckusick fhpibdone(unit); 28841480Smckusick return; 28941480Smckusick } 29041480Smckusick count -= (flags & DMAGO_WORD) ? 2 : 1; 29141480Smckusick hs->sc_curcnt = count; 29241480Smckusick dmago(hs->sc_dq.dq_ctlr, addr, count, flags); 29341480Smckusick if (fhpibsend(unit, slave, sec, 0, 0) < 0) { 29441480Smckusick #ifdef DEBUG 29541480Smckusick printf("fhpibgo: send failed, retrying...\n"); 29641480Smckusick #endif 29741480Smckusick (void) fhpibsend(unit, slave, sec, 0, 0); 29841480Smckusick } 29941480Smckusick i = hd->hpib_cmd; 30041480Smckusick hd->hpib_cmd = fhpibcmd[unit]; 30141480Smckusick hd->hpib_ie = IDS_DMA(hs->sc_dq.dq_ctlr) | IDS_WRITE | 30241480Smckusick ((flags & DMAGO_WORD) ? IDS_WDMA : 0); 30341480Smckusick } 30441480Smckusick 30541480Smckusick fhpibdone(unit) 30641480Smckusick { 30741480Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 30841480Smckusick register struct fhpibdevice *hd; 30941480Smckusick register char *addr; 31041480Smckusick register int cnt; 31141480Smckusick 31241480Smckusick hd = (struct fhpibdevice *)hs->sc_hc->hp_addr; 31341480Smckusick cnt = hs->sc_curcnt; 31441480Smckusick hs->sc_addr += cnt; 31541480Smckusick hs->sc_count -= cnt; 31641480Smckusick #ifdef DEBUG 31741480Smckusick if ((fhpibdebug & FDB_DMA) && fhpibdebugunit == unit) 31841480Smckusick printf("fhpibdone: addr %x cnt %d\n", 31941480Smckusick hs->sc_addr, hs->sc_count); 32041480Smckusick #endif 32141480Smckusick if (hs->sc_flags & HPIBF_READ) 32241480Smckusick hd->hpib_imask = IM_IDLE | IM_BYTE; 32341480Smckusick else { 32441480Smckusick cnt = hs->sc_count; 32541480Smckusick if (cnt) { 32641480Smckusick addr = hs->sc_addr; 32741480Smckusick hd->hpib_imask = IM_IDLE | IM_ROOM; 32841480Smckusick FHPIBWAIT(hd, IM_IDLE); 32941480Smckusick hd->hpib_stat = ST_WRITE; 33041480Smckusick while (--cnt) { 33141480Smckusick hd->hpib_data = *addr++; 33241480Smckusick FHPIBWAIT(hd, IM_ROOM); 33341480Smckusick } 33441480Smckusick hd->hpib_stat = ST_EOI; 33541480Smckusick hd->hpib_data = *addr; 33641480Smckusick } 33741480Smckusick hd->hpib_imask = IM_IDLE; 33841480Smckusick } 33941480Smckusick hs->sc_flags |= HPIBF_DONE; 34041480Smckusick hd->hpib_stat = ST_IENAB; 34141480Smckusick hd->hpib_ie = IDS_IE; 34241480Smckusick } 34341480Smckusick 34441480Smckusick fhpibintr(unit) 34541480Smckusick register int unit; 34641480Smckusick { 34741480Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 34841480Smckusick register struct fhpibdevice *hd; 34941480Smckusick register struct devqueue *dq; 35041480Smckusick register int stat0; 35141480Smckusick 35241480Smckusick hd = (struct fhpibdevice *)hs->sc_hc->hp_addr; 35341480Smckusick stat0 = hd->hpib_ids; 35441480Smckusick if ((stat0 & (IDS_IE|IDS_IR)) != (IDS_IE|IDS_IR)) { 35541480Smckusick #ifdef DEBUG 35641480Smckusick if ((fhpibdebug & FDB_FAIL) && (stat0 & IDS_IR) && 35741480Smckusick (hs->sc_flags & (HPIBF_IO|HPIBF_DONE)) != HPIBF_IO) 35841480Smckusick printf("hpib%d: fhpibintr: bad status %x\n", 35941480Smckusick unit, stat0); 36041480Smckusick fhpibbadint[0]++; 36141480Smckusick #endif 36241480Smckusick return(0); 36341480Smckusick } 36441480Smckusick if ((hs->sc_flags & (HPIBF_IO|HPIBF_DONE)) == HPIBF_IO) { 36541480Smckusick #ifdef DEBUG 36641480Smckusick fhpibbadint[1]++; 36741480Smckusick #endif 36841480Smckusick return(0); 36941480Smckusick } 37041480Smckusick #ifdef DEBUG 37141480Smckusick if ((fhpibdebug & FDB_DMA) && fhpibdebugunit == unit) 37241480Smckusick printf("fhpibintr: flags %x\n", hs->sc_flags); 37341480Smckusick #endif 37441480Smckusick dq = hs->sc_sq.dq_forw; 37541480Smckusick if (hs->sc_flags & HPIBF_IO) { 37641480Smckusick stat0 = hd->hpib_cmd; 37741480Smckusick hd->hpib_cmd = fhpibcmd[unit] & ~CT_8BIT; 37841480Smckusick hd->hpib_stat = 0; 37941480Smckusick hd->hpib_cmd = CT_REN | CT_8BIT; 38041480Smckusick stat0 = hd->hpib_intr; 38141480Smckusick hd->hpib_imask = 0; 38241480Smckusick hs->sc_flags &= ~(HPIBF_DONE|HPIBF_IO|HPIBF_READ); 38341480Smckusick dmafree(&hs->sc_dq); 38441480Smckusick (dq->dq_driver->d_intr)(dq->dq_unit); 38541480Smckusick } else if (hs->sc_flags & HPIBF_PPOLL) { 38641480Smckusick stat0 = hd->hpib_intr; 38741480Smckusick #ifdef DEBUG 38841480Smckusick if ((fhpibdebug & FDB_FAIL) && 38941480Smckusick doppollint && (stat0 & IM_PPRESP) == 0) 39041480Smckusick printf("hpib%d: fhpibintr: bad intr reg %x\n", 39141480Smckusick unit, stat0); 39241480Smckusick #endif 39341480Smckusick hd->hpib_stat = 0; 39441480Smckusick hd->hpib_imask = 0; 39541480Smckusick #ifdef DEBUG 39641480Smckusick stat0 = fhpibppoll(unit); 39741480Smckusick if ((fhpibdebug & FDB_PPOLL) && unit == fhpibdebugunit) 39841480Smckusick printf("fhpibintr: got PPOLL status %x\n", stat0); 39941480Smckusick if ((stat0 & (0x80 >> dq->dq_slave)) == 0) { 400*53929Shibler /* 401*53929Shibler * XXX give it another shot (68040) 402*53929Shibler */ 403*53929Shibler fhpibppollfail[unit]++; 404*53929Shibler DELAY(fhpibppolldelay); 405*53929Shibler stat0 = fhpibppoll(unit); 406*53929Shibler if ((stat0 & (0x80 >> dq->dq_slave)) == 0 && 407*53929Shibler (fhpibdebug & FDB_PPOLL) && unit == fhpibdebugunit) 408*53929Shibler printf("fhpibintr: PPOLL: unit %d slave %d stat %x\n", 409*53929Shibler unit, dq->dq_slave, stat0); 41041480Smckusick } 41141480Smckusick #endif 41241480Smckusick hs->sc_flags &= ~HPIBF_PPOLL; 41341480Smckusick (dq->dq_driver->d_intr)(dq->dq_unit); 41441480Smckusick } 41541480Smckusick return(1); 41641480Smckusick } 41741480Smckusick 41841480Smckusick fhpibppoll(unit) 41941480Smckusick { 42041480Smckusick register struct fhpibdevice *hd; 42141480Smckusick register int ppoll; 42241480Smckusick 42341480Smckusick hd = (struct fhpibdevice *)hpib_softc[unit].sc_hc->hp_addr; 42441480Smckusick hd->hpib_stat = 0; 42541480Smckusick hd->hpib_psense = 0; 42641480Smckusick hd->hpib_pmask = 0xFF; 42741480Smckusick hd->hpib_imask = IM_PPRESP | IM_PABORT; 42841480Smckusick DELAY(25); 42941480Smckusick hd->hpib_intr = IM_PABORT; 43041480Smckusick ppoll = hd->hpib_data; 43141480Smckusick if (hd->hpib_intr & IM_PABORT) 43241480Smckusick ppoll = 0; 43341480Smckusick hd->hpib_imask = 0; 43441480Smckusick hd->hpib_pmask = 0; 43541480Smckusick hd->hpib_stat = ST_IENAB; 43641480Smckusick return(ppoll); 43741480Smckusick } 43841480Smckusick 43941480Smckusick fhpibwait(hd, x) 44041480Smckusick register struct fhpibdevice *hd; 44141480Smckusick { 44241480Smckusick register int timo = hpibtimeout; 44341480Smckusick 44441480Smckusick while ((hd->hpib_intr & x) == 0 && --timo) 44545487Smckusick DELAY(1); 44641480Smckusick if (timo == 0) { 44741480Smckusick #ifdef DEBUG 44841480Smckusick if (fhpibdebug & FDB_FAIL) 44941480Smckusick printf("fhpibwait(%x, %x) timeout\n", hd, x); 45041480Smckusick #endif 45141480Smckusick return(-1); 45241480Smckusick } 45341480Smckusick return(0); 45441480Smckusick } 45541480Smckusick 45641480Smckusick /* 45741480Smckusick * XXX: this will have to change if we every allow more than one 45841480Smckusick * pending operation per HP-IB. 45941480Smckusick */ 46041480Smckusick fhpibppwatch(unit) 46141480Smckusick { 46241480Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 46341480Smckusick register struct fhpibdevice *hd; 46441480Smckusick register int slave; 46541480Smckusick 46641480Smckusick if ((hs->sc_flags & HPIBF_PPOLL) == 0) 46741480Smckusick return; 46841480Smckusick hd = (struct fhpibdevice *)hs->sc_hc->hp_addr; 46941480Smckusick slave = (0x80 >> hs->sc_sq.dq_forw->dq_slave); 47041480Smckusick #ifdef DEBUG 47141480Smckusick if (!doppollint) { 47241480Smckusick if (fhpibppoll(unit) & slave) { 47341480Smckusick hd->hpib_stat = ST_IENAB; 47441480Smckusick hd->hpib_imask = IM_IDLE | IM_ROOM; 47541480Smckusick } else 47641480Smckusick timeout(fhpibppwatch, unit, 1); 47741480Smckusick return; 47841480Smckusick } 47941480Smckusick if ((fhpibdebug & FDB_PPOLL) && unit == fhpibdebugunit) 48041480Smckusick printf("fhpibppwatch: sense request on %d\n", unit); 48141480Smckusick #endif 48241480Smckusick hd->hpib_psense = ~slave; 48341480Smckusick hd->hpib_pmask = slave; 48441480Smckusick hd->hpib_stat = ST_IENAB; 48541480Smckusick hd->hpib_imask = IM_PPRESP | IM_PABORT; 48641480Smckusick hd->hpib_ie = IDS_IE; 48741480Smckusick } 48841480Smckusick #endif 489