void	*dmabus_intr_establish __P(( bus_space_tag_t, int,			 int,			 int,			 int (*)(void *),	 void *));		  static	bus_space_tag_t dma_alloc_bustag(struct dma_softc *sc);  struct cfattach dma_sbus_ca = { sizeof(struct dma_softc), dmamatch_sbus, dmaattach_sbus };  struct cfattach ledma_ca = { sizeof(struct dma_softc), dmamatch_sbus, dmaattach_sbus };  struct cfdriver ledma_cd = { NULL, "ledma", DV_DULL };  struct cfdriver dma_cd = { NULL, "dma", DV_DULL };  int dmaprint_sbus(aux, busname) void *aux; const char *busname; { struct sbus_attach_args *sa = aux; bus_space_tag_t t = sa->sa_bustag; struct dma_softc *sc = t->cookie;  sa->sa_bustag = sc->sc_lsi64854.sc_bustag;	 sbus_print(aux, busname);	 sa->sa_bustag = t;		 return (UNCONF); }  int dmamatch_sbus(parent, vcf, aux) struct device *parent; void *vcf; void *aux; { struct cfdata *cf = vcf; struct sbus_attach_args *sa = aux;  return (strcmp(cf->cf_driver->cd_name, sa->sa_name) == 0 || strcmp("espdma", sa->sa_name) == 0); }  void dmaattach_sbus(parent, self, aux) struct device *parent, *self; void *aux; { struct sbus_attach_args *sa = aux; struct dma_softc *dsc = (void *)self; struct lsi64854_softc *sc = &dsc->sc_lsi64854; bus_space_handle_t bh; bus_space_tag_t sbt; int sbusburst, burst; int node;  node = sa->sa_node;  sc->sc_bustag = sa->sa_bustag; sc->sc_dmatag = sa->sa_dmatag;   if (sa->sa_npromvaddrs != 0) sc->sc_regs = (bus_space_handle_t)sa->sa_promvaddrs[0]; else { if (sbus_bus_map(sa->sa_bustag, sa->sa_slot, sa->sa_offset, sa->sa_size, 0, 0, &bh) != 0) { printf("%s: cannot map registers\n", self->dv_xname); return; } sc->sc_regs = bh; }   sbusburst = ((struct sbus_softc *)parent)->sc_burst; if (sbusburst == 0) sbusburst = SBUS_BURST_32 - 1;   burst = getpropint(node,"burst-sizes", -1); if (burst == -1)  burst = sbusburst;   burst &= sbusburst; sc->sc_burst = (burst & SBUS_BURST_32) ? 32 : (burst & SBUS_BURST_16) ? 16 : 0;  if (sc->sc_dev.dv_cfdata->cf_attach == &ledma_ca) { char *cabletype; u_int32_t csr;  cabletype = getpropstring(node, "cable-selection"); csr = L64854_GCSR(sc); if (strcmp(cabletype, "tpe") == 0) { csr |= E_TP_AUI; } else if (strcmp(cabletype, "aui") == 0) { csr &= ~E_TP_AUI; } else {  csr |= E_TP_AUI; } L64854_SCSR(sc, csr); delay(20000);	 sc->sc_channel = L64854_CHANNEL_ENET; } else { sc->sc_channel = L64854_CHANNEL_SCSI; }  sbus_establish(&dsc->sc_sd, &sc->sc_dev); sbt = dma_alloc_bustag(dsc); lsi64854_attach(sc);   for (node = firstchild(sa->sa_node); node; node = nextsibling(node)) { struct sbus_attach_args sa; sbus_setup_attach_args((struct sbus_softc *)parent, sbt, sc->sc_dmatag, node, &sa); (void) config_found(&sc->sc_dev, (void *)&sa, dmaprint_sbus); sbus_destroy_attach_args(&sa); } }  void *
void	*dmabus_intr_establish __P((		bus_space_tag_t,		int,			/*bus interrupt priority*/		int,			/*`device class' level*/		int,			/*flags*/		int (*)(void *),	/*handler*/		void *));		/*handler arg*/static	bus_space_tag_t dma_alloc_bustag(struct dma_softc *sc);struct cfattach dma_sbus_ca = {	sizeof(struct dma_softc), dmamatch_sbus, dmaattach_sbus};struct cfattach ledma_ca = {	sizeof(struct dma_softc), dmamatch_sbus, dmaattach_sbus};struct cfdriver ledma_cd = {	NULL, "ledma", DV_DULL};struct cfdriver dma_cd = {	NULL, "dma", DV_DULL};intdmaprint_sbus(aux, busname)	void *aux;	const char *busname;{	struct sbus_attach_args *sa = aux;	bus_space_tag_t t = sa->sa_bustag;	struct dma_softc *sc = t->cookie;	sa->sa_bustag = sc->sc_lsi64854.sc_bustag;	/* XXX */	sbus_print(aux, busname);	/* XXX */	sa->sa_bustag = t;		/* XXX */	return (UNCONF);}intdmamatch_sbus(parent, vcf, aux)	struct device *parent;	void *vcf;	void *aux;{	struct cfdata *cf = vcf;	struct sbus_attach_args *sa = aux;	return (strcmp(cf->cf_driver->cd_name, sa->sa_name) == 0 ||		strcmp("espdma", sa->sa_name) == 0);}voiddmaattach_sbus(parent, self, aux)	struct device *parent, *self;	void *aux;{	struct sbus_attach_args *sa = aux;	struct dma_softc *dsc = (void *)self;	struct lsi64854_softc *sc = &dsc->sc_lsi64854;	bus_space_handle_t bh;	bus_space_tag_t sbt;	int sbusburst, burst;	int node;	node = sa->sa_node;	sc->sc_bustag = sa->sa_bustag;	sc->sc_dmatag = sa->sa_dmatag;	/* Map registers */	if (sa->sa_npromvaddrs != 0)		sc->sc_regs = (bus_space_handle_t)sa->sa_promvaddrs[0];	else {		if (sbus_bus_map(sa->sa_bustag, sa->sa_slot,				 sa->sa_offset,				 sa->sa_size,				 0, 0, &bh) != 0) {			printf("%s: cannot map registers\n", self->dv_xname);			return;		}		sc->sc_regs = bh;	}	/*	 * Get transfer burst size from PROM and plug it into the	 * controller registers. This is needed on the Sun4m; do	 * others need it too?	 */	sbusburst = ((struct sbus_softc *)parent)->sc_burst;	if (sbusburst == 0)		sbusburst = SBUS_BURST_32 - 1; /* 1->16 */	burst = getpropint(node,"burst-sizes", -1);	if (burst == -1)		/* take SBus burst sizes */		burst = sbusburst;	/* Clamp at parent's burst sizes */	burst &= sbusburst;	sc->sc_burst = (burst & SBUS_BURST_32) ? 32 :		       (burst & SBUS_BURST_16) ? 16 : 0;	if (sc->sc_dev.dv_cfdata->cf_attach == &ledma_ca) {		char *cabletype;		u_int32_t csr;		/*		 * Check to see which cable type is currently active and		 * set the appropriate bit in the ledma csr so that it		 * gets used. If we didn't netboot, the PROM won't have		 * the "cable-selection" property; default to TP and then		 * the user can change it via a "media" option to ifconfig.		 */		cabletype = getpropstring(node, "cable-selection");		csr = L64854_GCSR(sc);		if (strcmp(cabletype, "tpe") == 0) {			csr |= E_TP_AUI;		} else if (strcmp(cabletype, "aui") == 0) {			csr &= ~E_TP_AUI;		} else {			/* assume TP if nothing there */			csr |= E_TP_AUI;		}		L64854_SCSR(sc, csr);		delay(20000);	/* manual says we need a 20ms delay */		sc->sc_channel = L64854_CHANNEL_ENET;	} else {		sc->sc_channel = L64854_CHANNEL_SCSI;	}	sbus_establish(&dsc->sc_sd, &sc->sc_dev);	sbt = dma_alloc_bustag(dsc);	lsi64854_attach(sc);	/* Attach children */	for (node = firstchild(sa->sa_node); node; node = nextsibling(node)) {		struct sbus_attach_args sa;		sbus_setup_attach_args((struct sbus_softc *)parent,				       sbt, sc->sc_dmatag, node, &sa);		(void) config_found(&sc->sc_dev, (void *)&sa, dmaprint_sbus);		sbus_destroy_attach_args(&sa);	}}void *dmabus_intr_establish(t, pri, level, flags, handler, arg)	bus_space_tag_t t;	int pri;	int level;	int flags;	int (*handler)(void *);	void *arg;{	struct lsi64854_softc *sc = t->cookie;	/* XXX - for now only le; do esp later */	if (sc->sc_channel == L64854_CHANNEL_ENET) {		sc->sc_intrchain = handler;		sc->sc_intrchainarg = arg;		handler = lsi64854_enet_intr;		arg = sc;	}	return (bus_intr_establish(sc->sc_bustag, pri, level, flags,				   handler, arg));}