ca->ca_ra.ra_intr[0].int_pri, &xyc->sc_ih);
ca->ca_ra.ra_intr[0].int_pri, &xyc->sc_ih, IPL_BIO);
xycattach(parent, self, aux)	struct device *parent, *self;	void   *aux;{	struct xyc_softc *xyc = (void *) self;	struct confargs *ca = aux;	struct xyc_attach_args xa;	int     lcv, err, pri, res, pbsz;	void	*tmp, *tmp2;	void	*dtmp, *dtmp2;	u_long	ultmp;	/* get addressing and intr level stuff from autoconfig and load it	 * into our xyc_softc. */	ca->ca_ra.ra_vaddr = mapiodev(ca->ca_ra.ra_reg, 0, sizeof(struct xyc));	xyc->xyc = (struct xyc *) ca->ca_ra.ra_vaddr;	pri = ca->ca_ra.ra_intr[0].int_pri;	xyc->ipl = pil_to_vme[pri];	xyc->vector = ca->ca_ra.ra_intr[0].int_vec;	printf(" pri %d", pri);	xyc->no_ols = 0; /* XXX should be from config */	for (lcv = 0; lcv < XYC_MAXDEV; lcv++)		xyc->sc_drives[lcv] = (struct xy_softc *) 0;	/*	 * allocate and zero buffers	 * check boundaries of the KVA's ... all IOPBs must reside in 	 * the same 64K region.	 */	pbsz = XYC_MAXIOPB * sizeof(struct xy_iopb);	dtmp = dtmp2 = (struct xy_iopb *)dvma_malloc(pbsz, &tmp, M_NOWAIT);	tmp2 = tmp;	ultmp = (u_long) dtmp;	if ((ultmp & 0xffff0000) != ((ultmp + pbsz) & 0xffff0000)) {		dtmp = (struct xy_iopb *)		    dvma_malloc(pbsz, &tmp, M_NOWAIT); /* retry! */		dvma_free(dtmp2, pbsz, &tmp2);		ultmp = (u_long) dtmp;		if ((ultmp & 0xffff0000) != ((ultmp + pbsz) & 0xffff0000)) {			printf("%s: can't alloc IOPB mem in 64K\n",				xyc->sc_dev.dv_xname);			return;		}	}	bzero(tmp, pbsz);	xyc->iopbase = tmp;	xyc->iopbase = dtmp; /* XXX TMP HACK */	xyc->dvmaiopb = (struct xy_iopb *) ((u_long)dtmp - DVMA_BASE);	xyc->reqs = (struct xy_iorq *)	    malloc(XYC_MAXIOPB * sizeof(struct xy_iorq), M_DEVBUF, M_NOWAIT);	if (xyc->reqs == NULL)		panic("xyc malloc");	bzero(xyc->reqs, XYC_MAXIOPB * sizeof(struct xy_iorq));	/*	 * init iorq to iopb pointers, and non-zero fields in the	 * iopb which never change.	 */	for (lcv = 0; lcv < XYC_MAXIOPB; lcv++) {		xyc->xy_chain[lcv] = NULL;		xyc->reqs[lcv].iopb = &xyc->iopbase[lcv];		xyc->iopbase[lcv].asr = 1;	/* always the same */		xyc->iopbase[lcv].eef = 1;	/* always the same */		xyc->iopbase[lcv].ecm = XY_ECM;	/* always the same */		xyc->iopbase[lcv].aud = 1;	/* always the same */		xyc->iopbase[lcv].relo = 1;	/* always the same */		xyc->iopbase[lcv].thro = XY_THRO;/* always the same */	}	xyc->ciorq = &xyc->reqs[XYC_CTLIOPB];    /* short hand name */	xyc->ciopb = &xyc->iopbase[XYC_CTLIOPB]; /* short hand name */	xyc->xy_hand = 0;	/* read controller parameters and insure we have a 450/451 */	err = xyc_cmd(xyc, XYCMD_ST, 0, 0, 0, 0, 0, XY_SUB_POLL);	res = xyc->ciopb->ctyp;	XYC_DONE(xyc, err);	if (res != XYCT_450) {		if (err)			printf(": %s: ", xyc_e2str(err));		printf(": doesn't identify as a 450/451\n");		return;	}	printf(": Xylogics 450/451");	if (xyc->no_ols)		printf(" [OLS disabled]"); /* 450 doesn't overlap seek right */	printf("\n");	if (err) {		printf("%s: error: %s\n", xyc->sc_dev.dv_xname,				xyc_e2str(err));		return;	}	if ((xyc->xyc->xyc_csr & XYC_ADRM) == 0) {		printf("%s: 24 bit addressing turned off\n",			xyc->sc_dev.dv_xname);		printf("please set hardware jumpers JM1-JM2=in, JM3-JM4=out\n");		printf("to enable 24 bit mode and this driver\n");		return;	}	/* link in interrupt with higher level software */	xyc->sc_ih.ih_fun = xycintr;	xyc->sc_ih.ih_arg = xyc;	vmeintr_establish(ca->ca_ra.ra_intr[0].int_vec,			  ca->ca_ra.ra_intr[0].int_pri, &xyc->sc_ih);	evcnt_attach(&xyc->sc_dev, "intr", &xyc->sc_intrcnt);	/* now we must look for disks using autoconfig */	xa.dvmabuf = (char *)dvma_malloc(XYFM_BPS, &xa.buf, M_NOWAIT);	xa.fullmode = XY_SUB_POLL;	xa.booting = 1;	if (ca->ca_ra.ra_bp && ca->ca_ra.ra_bp->val[0] == -1 &&	    ca->ca_ra.ra_bp->val[1] == xyc->sc_dev.dv_unit) {		bootpath_store(1, ca->ca_ra.ra_bp + 1); /* advance bootpath */	}	for (xa.driveno = 0; xa.driveno < XYC_MAXDEV; xa.driveno++)		(void) config_found(self, (void *) &xa, NULL);	dvma_free(xa.dvmabuf, XYFM_BPS, &xa.buf);	bootpath_store(1, NULL);	/* start the watchdog clock */	timeout_set(&xyc->xyc_tick_tmo, xyc_tick, xyc);	timeout_add(&xyc->xyc_tick_tmo, XYC_TICKCNT);}