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*45788Sbostic * @(#)fhpib.c 7.3 (Berkeley) 12/16/90 841480Smckusick */ 941480Smckusick 1041480Smckusick /* 1141480Smckusick * 98625A/B HPIB driver 1241480Smckusick */ 1341480Smckusick #include "hpib.h" 1441480Smckusick #if NHPIB > 0 1541480Smckusick 16*45788Sbostic #include "sys/param.h" 17*45788Sbostic #include "sys/systm.h" 18*45788Sbostic #include "sys/buf.h" 1941480Smckusick #include "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 */ 4141480Smckusick 4241480Smckusick long fhpibbadint[2] = { 0 }; 4341480Smckusick long fhpibtransfer[NHPIB] = { 0 }; 4441480Smckusick long fhpibnondma[NHPIB] = { 0 }; 4541480Smckusick long fhpibworddma[NHPIB] = { 0 }; 4641480Smckusick #endif 4741480Smckusick 4841480Smckusick int fhpibcmd[NHPIB]; 4941480Smckusick 5041480Smckusick fhpibtype(hc) 5141480Smckusick register struct hp_ctlr *hc; 5241480Smckusick { 5341480Smckusick register struct hpib_softc *hs = &hpib_softc[hc->hp_unit]; 5441480Smckusick register struct fhpibdevice *hd = (struct fhpibdevice *)hc->hp_addr; 5541480Smckusick 5641480Smckusick if (hd->hpib_cid != HPIBC) 5741480Smckusick return(0); 5841480Smckusick hs->sc_type = HPIBC; 5941480Smckusick hs->sc_ba = HPIBC_BA; 6041480Smckusick hc->hp_ipl = HPIB_IPL(hd->hpib_ids); 6141480Smckusick return(1); 6241480Smckusick } 6341480Smckusick 6441480Smckusick fhpibreset(unit) 6541480Smckusick { 6641480Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 6741480Smckusick register struct fhpibdevice *hd; 6841480Smckusick 6941480Smckusick hd = (struct fhpibdevice *)hs->sc_hc->hp_addr; 7041480Smckusick hd->hpib_cid = 0xFF; 7141480Smckusick DELAY(100); 7241480Smckusick hd->hpib_cmd = CT_8BIT; 7341480Smckusick hd->hpib_ar = AR_ARONC; 7441480Smckusick fhpibifc(hd); 7541480Smckusick hd->hpib_ie = IDS_IE; 7641480Smckusick hd->hpib_data = C_DCL; 7741480Smckusick DELAY(100000); 7841480Smckusick /* 7941480Smckusick * See if we can do word dma. 8041480Smckusick * If so, we should be able to write and read back the appropos bit. 8141480Smckusick */ 8241480Smckusick hd->hpib_ie |= IDS_WDMA; 8341480Smckusick if (hd->hpib_ie & IDS_WDMA) { 8441480Smckusick hd->hpib_ie &= ~IDS_WDMA; 8541480Smckusick hs->sc_flags |= HPIBF_DMA16; 8641480Smckusick #ifdef DEBUG 8741480Smckusick if (fhpibdebug & FDB_DMA) 8841480Smckusick printf("fhpibtype: unit %d has word dma\n", unit); 8941480Smckusick 9041480Smckusick #endif 9141480Smckusick } 9241480Smckusick } 9341480Smckusick 9441480Smckusick fhpibifc(hd) 9541480Smckusick register struct fhpibdevice *hd; 9641480Smckusick { 9741480Smckusick hd->hpib_cmd |= CT_IFC; 9841480Smckusick hd->hpib_cmd |= CT_INITFIFO; 9941480Smckusick DELAY(100); 10041480Smckusick hd->hpib_cmd &= ~CT_IFC; 10141480Smckusick hd->hpib_cmd |= CT_REN; 10241480Smckusick hd->hpib_stat = ST_ATN; 10341480Smckusick } 10441480Smckusick 10545487Smckusick fhpibsend(unit, slave, sec, addr, origcnt) 10641480Smckusick register char *addr; 10741480Smckusick { 10841480Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 10941480Smckusick register struct fhpibdevice *hd; 11045487Smckusick register int cnt = origcnt; 11141480Smckusick register int timo; 11241480Smckusick 11341480Smckusick hd = (struct fhpibdevice *)hs->sc_hc->hp_addr; 11441480Smckusick hd->hpib_stat = 0; 11541480Smckusick hd->hpib_imask = IM_IDLE | IM_ROOM; 11641480Smckusick if (fhpibwait(hd, IM_IDLE) < 0) 11745487Smckusick goto senderr; 11841480Smckusick hd->hpib_stat = ST_ATN; 11941480Smckusick hd->hpib_data = C_UNL; 12041480Smckusick hd->hpib_data = C_TAG + hs->sc_ba; 12141480Smckusick hd->hpib_data = C_LAG + slave; 12241480Smckusick if (sec != -1) 12341480Smckusick hd->hpib_data = C_SCG + sec; 12441480Smckusick if (fhpibwait(hd, IM_IDLE) < 0) 12545487Smckusick goto senderr; 12645487Smckusick if (cnt) { 12745487Smckusick hd->hpib_stat = ST_WRITE; 12841480Smckusick while (--cnt) { 12941480Smckusick hd->hpib_data = *addr++; 13041480Smckusick timo = hpibtimeout; 13145487Smckusick while ((hd->hpib_intr & IM_ROOM) == 0) { 13245487Smckusick if (--timo <= 0) 13345487Smckusick goto senderr; 13445487Smckusick DELAY(1); 13545487Smckusick } 13641480Smckusick } 13741480Smckusick hd->hpib_stat = ST_EOI; 13841480Smckusick hd->hpib_data = *addr; 13941480Smckusick FHPIBWAIT(hd, IM_ROOM); 14041480Smckusick hd->hpib_stat = ST_ATN; 14141480Smckusick /* XXX: HP-UX claims bug with CS80 transparent messages */ 14241480Smckusick if (sec == 0x12) 14341480Smckusick DELAY(150); 14441480Smckusick hd->hpib_data = C_UNL; 14545487Smckusick (void) fhpibwait(hd, IM_IDLE); 14641480Smckusick } 14745487Smckusick hd->hpib_imask = 0; 14845487Smckusick return (origcnt); 14945487Smckusick senderr: 15045487Smckusick hd->hpib_imask = 0; 15145487Smckusick fhpibifc(hd); 15241480Smckusick #ifdef DEBUG 15345487Smckusick if (fhpibdebug & FDB_FAIL) { 15445487Smckusick printf("hpib%d: fhpibsend failed: slave %d, sec %x, ", 15545487Smckusick unit, slave, sec); 15645487Smckusick printf("sent %d of %d bytes\n", origcnt-cnt-1, origcnt); 15745487Smckusick } 15841480Smckusick #endif 15945487Smckusick return(origcnt - cnt - 1); 16041480Smckusick } 16141480Smckusick 16245487Smckusick fhpibrecv(unit, slave, sec, addr, origcnt) 16341480Smckusick register char *addr; 16441480Smckusick { 16541480Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 16641480Smckusick register struct fhpibdevice *hd; 16745487Smckusick register int cnt = origcnt; 16841480Smckusick register int timo; 16941480Smckusick 17041480Smckusick hd = (struct fhpibdevice *)hs->sc_hc->hp_addr; 17141480Smckusick hd->hpib_stat = 0; 17241480Smckusick hd->hpib_imask = IM_IDLE | IM_ROOM | IM_BYTE; 17341480Smckusick if (fhpibwait(hd, IM_IDLE) < 0) 17445487Smckusick goto recverror; 17541480Smckusick hd->hpib_stat = ST_ATN; 17641480Smckusick hd->hpib_data = C_UNL; 17741480Smckusick hd->hpib_data = C_LAG + hs->sc_ba; 17841480Smckusick hd->hpib_data = C_TAG + slave; 17941480Smckusick if (sec != -1) 18041480Smckusick hd->hpib_data = C_SCG + sec; 18141480Smckusick if (fhpibwait(hd, IM_IDLE) < 0) 18245487Smckusick goto recverror; 18341480Smckusick hd->hpib_stat = ST_READ0; 18441480Smckusick hd->hpib_data = 0; 18545487Smckusick if (cnt) { 18645487Smckusick while (--cnt >= 0) { 18741480Smckusick timo = hpibtimeout; 18845487Smckusick while ((hd->hpib_intr & IM_BYTE) == 0) { 18945487Smckusick if (--timo == 0) 19045487Smckusick goto recvbyteserror; 19145487Smckusick DELAY(1); 19245487Smckusick } 19341480Smckusick *addr++ = hd->hpib_data; 19445487Smckusick } 19541480Smckusick FHPIBWAIT(hd, IM_ROOM); 19641480Smckusick hd->hpib_stat = ST_ATN; 19741480Smckusick hd->hpib_data = (slave == 31) ? C_UNA : C_UNT; 19845487Smckusick (void) fhpibwait(hd, IM_IDLE); 19941480Smckusick } 20045487Smckusick hd->hpib_imask = 0; 20145487Smckusick return (origcnt); 20245487Smckusick 20345487Smckusick recverror: 20445487Smckusick fhpibifc(hd); 20545487Smckusick recvbyteserror: 20645487Smckusick hd->hpib_imask = 0; 20741480Smckusick #ifdef DEBUG 20845487Smckusick if (fhpibdebug & FDB_FAIL) { 20945487Smckusick printf("hpib%d: fhpibrecv failed: slave %d, sec %x, ", 21045487Smckusick unit, slave, sec); 21145487Smckusick printf("got %d of %d bytes\n", origcnt-cnt-1, origcnt); 21245487Smckusick } 21341480Smckusick #endif 21445487Smckusick return(origcnt - cnt - 1); 21541480Smckusick } 21641480Smckusick 21741480Smckusick fhpibgo(unit, slave, sec, addr, count, rw) 21841480Smckusick register int unit; 21941480Smckusick char *addr; 22041480Smckusick { 22141480Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 22241480Smckusick register struct fhpibdevice *hd; 22341480Smckusick register int i; 22441480Smckusick int flags = 0; 22541480Smckusick 22641480Smckusick #ifdef lint 22741480Smckusick i = unit; if (i) return; 22841480Smckusick #endif 22941480Smckusick hd = (struct fhpibdevice *)hs->sc_hc->hp_addr; 23041480Smckusick hs->sc_flags |= HPIBF_IO; 23141480Smckusick if (rw == B_READ) 23241480Smckusick hs->sc_flags |= HPIBF_READ; 23341480Smckusick #ifdef DEBUG 23441480Smckusick else if (hs->sc_flags & HPIBF_READ) { 23541480Smckusick printf("fhpibgo: HPIBF_READ still set\n"); 23641480Smckusick hs->sc_flags &= ~HPIBF_READ; 23741480Smckusick } 23841480Smckusick #endif 23941480Smckusick hs->sc_count = count; 24041480Smckusick hs->sc_addr = addr; 24141480Smckusick #ifdef DEBUG 24241480Smckusick fhpibtransfer[unit]++; 24341480Smckusick #endif 24441480Smckusick if ((hs->sc_flags & HPIBF_DMA16) && 24541480Smckusick ((int)addr & 1) == 0 && count && (count & 1) == 0 24641480Smckusick #ifdef DEBUG 24741480Smckusick && doworddma 24841480Smckusick #endif 24941480Smckusick ) { 25041480Smckusick #ifdef DEBUG 25141480Smckusick fhpibworddma[unit]++; 25241480Smckusick #endif 25341480Smckusick flags |= DMAGO_WORD; 25441480Smckusick hd->hpib_latch = 0; 25541480Smckusick } 25641480Smckusick #ifdef DEBUG 25741480Smckusick if (dopriodma) 25841480Smckusick flags |= DMAGO_PRI; 25941480Smckusick #endif 26041480Smckusick if (hs->sc_flags & HPIBF_READ) { 26141480Smckusick fhpibcmd[unit] = CT_REN | CT_8BIT; 26241480Smckusick hs->sc_curcnt = count; 26341480Smckusick dmago(hs->sc_dq.dq_ctlr, addr, count, flags|DMAGO_READ); 26441480Smckusick if (fhpibrecv(unit, slave, sec, 0, 0) < 0) { 26541480Smckusick #ifdef DEBUG 26641480Smckusick printf("fhpibgo: recv failed, retrying...\n"); 26741480Smckusick #endif 26841480Smckusick (void) fhpibrecv(unit, slave, sec, 0, 0); 26941480Smckusick } 27041480Smckusick i = hd->hpib_cmd; 27141480Smckusick hd->hpib_cmd = fhpibcmd[unit]; 27241480Smckusick hd->hpib_ie = IDS_DMA(hs->sc_dq.dq_ctlr) | 27341480Smckusick ((flags & DMAGO_WORD) ? IDS_WDMA : 0); 27441480Smckusick return; 27541480Smckusick } 27641480Smckusick fhpibcmd[unit] = CT_REN | CT_8BIT | CT_FIFOSEL; 27745487Smckusick if (count < hpibdmathresh) { 27841480Smckusick #ifdef DEBUG 27941480Smckusick fhpibnondma[unit]++; 28045487Smckusick if (flags & DMAGO_WORD) 28145487Smckusick fhpibworddma[unit]--; 28241480Smckusick #endif 28341480Smckusick hs->sc_curcnt = count; 28441480Smckusick (void) fhpibsend(unit, slave, sec, addr, count); 28541480Smckusick fhpibdone(unit); 28641480Smckusick return; 28741480Smckusick } 28841480Smckusick count -= (flags & DMAGO_WORD) ? 2 : 1; 28941480Smckusick hs->sc_curcnt = count; 29041480Smckusick dmago(hs->sc_dq.dq_ctlr, addr, count, flags); 29141480Smckusick if (fhpibsend(unit, slave, sec, 0, 0) < 0) { 29241480Smckusick #ifdef DEBUG 29341480Smckusick printf("fhpibgo: send failed, retrying...\n"); 29441480Smckusick #endif 29541480Smckusick (void) fhpibsend(unit, slave, sec, 0, 0); 29641480Smckusick } 29741480Smckusick i = hd->hpib_cmd; 29841480Smckusick hd->hpib_cmd = fhpibcmd[unit]; 29941480Smckusick hd->hpib_ie = IDS_DMA(hs->sc_dq.dq_ctlr) | IDS_WRITE | 30041480Smckusick ((flags & DMAGO_WORD) ? IDS_WDMA : 0); 30141480Smckusick } 30241480Smckusick 30341480Smckusick fhpibdone(unit) 30441480Smckusick { 30541480Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 30641480Smckusick register struct fhpibdevice *hd; 30741480Smckusick register char *addr; 30841480Smckusick register int cnt; 30941480Smckusick 31041480Smckusick hd = (struct fhpibdevice *)hs->sc_hc->hp_addr; 31141480Smckusick cnt = hs->sc_curcnt; 31241480Smckusick hs->sc_addr += cnt; 31341480Smckusick hs->sc_count -= cnt; 31441480Smckusick #ifdef DEBUG 31541480Smckusick if ((fhpibdebug & FDB_DMA) && fhpibdebugunit == unit) 31641480Smckusick printf("fhpibdone: addr %x cnt %d\n", 31741480Smckusick hs->sc_addr, hs->sc_count); 31841480Smckusick #endif 31941480Smckusick if (hs->sc_flags & HPIBF_READ) 32041480Smckusick hd->hpib_imask = IM_IDLE | IM_BYTE; 32141480Smckusick else { 32241480Smckusick cnt = hs->sc_count; 32341480Smckusick if (cnt) { 32441480Smckusick addr = hs->sc_addr; 32541480Smckusick hd->hpib_imask = IM_IDLE | IM_ROOM; 32641480Smckusick FHPIBWAIT(hd, IM_IDLE); 32741480Smckusick hd->hpib_stat = ST_WRITE; 32841480Smckusick while (--cnt) { 32941480Smckusick hd->hpib_data = *addr++; 33041480Smckusick FHPIBWAIT(hd, IM_ROOM); 33141480Smckusick } 33241480Smckusick hd->hpib_stat = ST_EOI; 33341480Smckusick hd->hpib_data = *addr; 33441480Smckusick } 33541480Smckusick hd->hpib_imask = IM_IDLE; 33641480Smckusick } 33741480Smckusick hs->sc_flags |= HPIBF_DONE; 33841480Smckusick hd->hpib_stat = ST_IENAB; 33941480Smckusick hd->hpib_ie = IDS_IE; 34041480Smckusick } 34141480Smckusick 34241480Smckusick fhpibintr(unit) 34341480Smckusick register int unit; 34441480Smckusick { 34541480Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 34641480Smckusick register struct fhpibdevice *hd; 34741480Smckusick register struct devqueue *dq; 34841480Smckusick register int stat0; 34941480Smckusick 35041480Smckusick hd = (struct fhpibdevice *)hs->sc_hc->hp_addr; 35141480Smckusick stat0 = hd->hpib_ids; 35241480Smckusick if ((stat0 & (IDS_IE|IDS_IR)) != (IDS_IE|IDS_IR)) { 35341480Smckusick #ifdef DEBUG 35441480Smckusick if ((fhpibdebug & FDB_FAIL) && (stat0 & IDS_IR) && 35541480Smckusick (hs->sc_flags & (HPIBF_IO|HPIBF_DONE)) != HPIBF_IO) 35641480Smckusick printf("hpib%d: fhpibintr: bad status %x\n", 35741480Smckusick unit, stat0); 35841480Smckusick fhpibbadint[0]++; 35941480Smckusick #endif 36041480Smckusick return(0); 36141480Smckusick } 36241480Smckusick if ((hs->sc_flags & (HPIBF_IO|HPIBF_DONE)) == HPIBF_IO) { 36341480Smckusick #ifdef DEBUG 36441480Smckusick fhpibbadint[1]++; 36541480Smckusick #endif 36641480Smckusick return(0); 36741480Smckusick } 36841480Smckusick #ifdef DEBUG 36941480Smckusick if ((fhpibdebug & FDB_DMA) && fhpibdebugunit == unit) 37041480Smckusick printf("fhpibintr: flags %x\n", hs->sc_flags); 37141480Smckusick #endif 37241480Smckusick dq = hs->sc_sq.dq_forw; 37341480Smckusick if (hs->sc_flags & HPIBF_IO) { 37441480Smckusick stat0 = hd->hpib_cmd; 37541480Smckusick hd->hpib_cmd = fhpibcmd[unit] & ~CT_8BIT; 37641480Smckusick hd->hpib_stat = 0; 37741480Smckusick hd->hpib_cmd = CT_REN | CT_8BIT; 37841480Smckusick stat0 = hd->hpib_intr; 37941480Smckusick hd->hpib_imask = 0; 38041480Smckusick hs->sc_flags &= ~(HPIBF_DONE|HPIBF_IO|HPIBF_READ); 38141480Smckusick dmafree(&hs->sc_dq); 38241480Smckusick (dq->dq_driver->d_intr)(dq->dq_unit); 38341480Smckusick } else if (hs->sc_flags & HPIBF_PPOLL) { 38441480Smckusick stat0 = hd->hpib_intr; 38541480Smckusick #ifdef DEBUG 38641480Smckusick if ((fhpibdebug & FDB_FAIL) && 38741480Smckusick doppollint && (stat0 & IM_PPRESP) == 0) 38841480Smckusick printf("hpib%d: fhpibintr: bad intr reg %x\n", 38941480Smckusick unit, stat0); 39041480Smckusick #endif 39141480Smckusick hd->hpib_stat = 0; 39241480Smckusick hd->hpib_imask = 0; 39341480Smckusick #ifdef DEBUG 39441480Smckusick stat0 = fhpibppoll(unit); 39541480Smckusick if ((fhpibdebug & FDB_PPOLL) && unit == fhpibdebugunit) 39641480Smckusick printf("fhpibintr: got PPOLL status %x\n", stat0); 39741480Smckusick if ((stat0 & (0x80 >> dq->dq_slave)) == 0) { 39841480Smckusick printf("fhpibintr: PPOLL: unit %d slave %d stat %x\n", 39941480Smckusick unit, dq->dq_slave, stat0); 40041480Smckusick return(1); 40141480Smckusick } 40241480Smckusick #endif 40341480Smckusick hs->sc_flags &= ~HPIBF_PPOLL; 40441480Smckusick (dq->dq_driver->d_intr)(dq->dq_unit); 40541480Smckusick } 40641480Smckusick return(1); 40741480Smckusick } 40841480Smckusick 40941480Smckusick fhpibppoll(unit) 41041480Smckusick { 41141480Smckusick register struct fhpibdevice *hd; 41241480Smckusick register int ppoll; 41341480Smckusick 41441480Smckusick hd = (struct fhpibdevice *)hpib_softc[unit].sc_hc->hp_addr; 41541480Smckusick hd->hpib_stat = 0; 41641480Smckusick hd->hpib_psense = 0; 41741480Smckusick hd->hpib_pmask = 0xFF; 41841480Smckusick hd->hpib_imask = IM_PPRESP | IM_PABORT; 41941480Smckusick DELAY(25); 42041480Smckusick hd->hpib_intr = IM_PABORT; 42141480Smckusick ppoll = hd->hpib_data; 42241480Smckusick if (hd->hpib_intr & IM_PABORT) 42341480Smckusick ppoll = 0; 42441480Smckusick hd->hpib_imask = 0; 42541480Smckusick hd->hpib_pmask = 0; 42641480Smckusick hd->hpib_stat = ST_IENAB; 42741480Smckusick return(ppoll); 42841480Smckusick } 42941480Smckusick 43041480Smckusick fhpibwait(hd, x) 43141480Smckusick register struct fhpibdevice *hd; 43241480Smckusick { 43341480Smckusick register int timo = hpibtimeout; 43441480Smckusick 43541480Smckusick while ((hd->hpib_intr & x) == 0 && --timo) 43645487Smckusick DELAY(1); 43741480Smckusick if (timo == 0) { 43841480Smckusick #ifdef DEBUG 43941480Smckusick if (fhpibdebug & FDB_FAIL) 44041480Smckusick printf("fhpibwait(%x, %x) timeout\n", hd, x); 44141480Smckusick #endif 44241480Smckusick return(-1); 44341480Smckusick } 44441480Smckusick return(0); 44541480Smckusick } 44641480Smckusick 44741480Smckusick /* 44841480Smckusick * XXX: this will have to change if we every allow more than one 44941480Smckusick * pending operation per HP-IB. 45041480Smckusick */ 45141480Smckusick fhpibppwatch(unit) 45241480Smckusick { 45341480Smckusick register struct hpib_softc *hs = &hpib_softc[unit]; 45441480Smckusick register struct fhpibdevice *hd; 45541480Smckusick register int slave; 45641480Smckusick 45741480Smckusick if ((hs->sc_flags & HPIBF_PPOLL) == 0) 45841480Smckusick return; 45941480Smckusick hd = (struct fhpibdevice *)hs->sc_hc->hp_addr; 46041480Smckusick slave = (0x80 >> hs->sc_sq.dq_forw->dq_slave); 46141480Smckusick #ifdef DEBUG 46241480Smckusick if (!doppollint) { 46341480Smckusick if (fhpibppoll(unit) & slave) { 46441480Smckusick hd->hpib_stat = ST_IENAB; 46541480Smckusick hd->hpib_imask = IM_IDLE | IM_ROOM; 46641480Smckusick } else 46741480Smckusick timeout(fhpibppwatch, unit, 1); 46841480Smckusick return; 46941480Smckusick } 47041480Smckusick if ((fhpibdebug & FDB_PPOLL) && unit == fhpibdebugunit) 47141480Smckusick printf("fhpibppwatch: sense request on %d\n", unit); 47241480Smckusick #endif 47341480Smckusick hd->hpib_psense = ~slave; 47441480Smckusick hd->hpib_pmask = slave; 47541480Smckusick hd->hpib_stat = ST_IENAB; 47641480Smckusick hd->hpib_imask = IM_PPRESP | IM_PABORT; 47741480Smckusick hd->hpib_ie = IDS_IE; 47841480Smckusick } 47941480Smckusick #endif 480