int ubasearch(device_t parent, cfdata_t cf, const int *ldesc, void *aux) { struct uba_softc *sc = device_private(parent); struct uba_attach_args ua; int i, csr, vec, br; csr = cf->cf_loc[UBACF_CSR]; if (sc->uh_used[ubdevreg(csr)]) return 0; /* something are already at this address */ ua.ua_ioh = ubdevreg(csr) + sc->uh_ioh; ua.ua_iot = sc->uh_iot; ua.ua_dmat = sc->uh_dmat; if (badaddr((void *)ua.ua_ioh, 2) || (sc->uh_errchk ? (*sc->uh_errchk)(sc):0)) goto forgetit; scb_vecref(0, 0); /* Clear vector ref */ i = config_match(parent, cf, &ua); if (sc->uh_errchk) if ((*sc->uh_errchk)(sc)) goto forgetit; if (i == 0) goto forgetit; i = scb_vecref(&vec, &br); if (i == 0) goto fail; if (vec == 0) goto fail; ua.ua_br = br; ua.ua_cvec = vec; ua.ua_iaddr = csr; ua.ua_evcnt = NULL; sc->uh_used[ubdevreg(csr)] = 1; config_attach(parent, cf, &ua, ubaprint); return 0; fail: printf("%s%d at %s csr %o %s\n", cf->cf_name, cf->cf_unit, device_xname(parent), csr, (i ? "zero vector" : "didn't interrupt")); forgetit: return 0; }
int ubasearch(struct device *parent, struct cfdata *cf, void *aux) { struct uba_softc *sc = (struct uba_softc *)parent; struct uba_attach_args ua; int i, vec, br; ua.ua_ioh = ubdevreg(cf->cf_loc[0]) + sc->uh_ioh; ua.ua_iot = sc->uh_iot; ua.ua_dmat = sc->uh_dmat; if (badaddr((caddr_t)ua.ua_ioh, 2) || (sc->uh_errchk ? (*sc->uh_errchk)(sc):0)) goto forgetit; scb_vecref(0, 0); /* Clear vector ref */ i = (*cf->cf_attach->ca_match) (parent, cf, &ua); if (sc->uh_errchk) if ((*sc->uh_errchk)(sc)) goto forgetit; if (i == 0) goto forgetit; i = scb_vecref(&vec, &br); if (i == 0) goto fail; if (vec == 0) goto fail; ua.ua_br = br; ua.ua_cvec = vec; ua.ua_iaddr = cf->cf_loc[0]; config_attach(parent, cf, &ua, ubaprint); return 0; fail: printf("%s%d at %s csr %lo %s\n", cf->cf_driver->cd_name, cf->cf_unit, parent->dv_xname, cf->cf_loc[0], (i ? "zero vector" : "didn't interrupt")); forgetit: return 0; }