示例#1
0
int
mainbus_map(bus_addr_t addr, bus_size_t size, int flags,
            bus_space_handle_t *ret)
{
    if (ISIIOPA(addr)) {
        *ret = (bus_space_handle_t)IIOV(addr);
        return (0);
    } else
        return (ENOMEM);
}
void
le_attach(device_t parent, device_t self, void *aux)
{
	struct le_softc *lesc = device_private(self);
	struct lance_softc *sc = &lesc->sc_am7990.lsc;
	struct hb_attach_args *ha = aux;
	const uint8_t *p;

	sc->sc_dev = self;
	lesc->sc_r1 = (void *)(ha->ha_address);

	if (ISIIOPA(ha->ha_address)) {
		sc->sc_mem = (u_char *)(lance_mem_phys);
		p = idrom_addr + 0x10;
	} else {
		sc->sc_mem = lesc->sc_r1 - 0x10000;
		p = (const uint8_t *)(lesc->sc_r1 + 0x8010);
	}

	sc->sc_memsize = 0x4000;	/* 16K */
	sc->sc_addr = lance_mem_phys & 0x00ffffff;
	sc->sc_conf3 = LE_C3_BSWP|LE_C3_BCON;

	sc->sc_enaddr[0] = (*p++ << 4);
	sc->sc_enaddr[0] |= *p++ & 0x0f;
	sc->sc_enaddr[1] = (*p++ << 4);
	sc->sc_enaddr[1] |= *p++ & 0x0f;
	sc->sc_enaddr[2] = (*p++ << 4);
	sc->sc_enaddr[2] |= *p++ & 0x0f;
	sc->sc_enaddr[3] = (*p++ << 4);
	sc->sc_enaddr[3] |= *p++ & 0x0f;
	sc->sc_enaddr[4] = (*p++ << 4);
	sc->sc_enaddr[4] |= *p++ & 0x0f;
	sc->sc_enaddr[5] = (*p++ << 4);
	sc->sc_enaddr[5] |= *p++ & 0x0f;

	sc->sc_copytodesc = lance_copytobuf_contig;
	sc->sc_copyfromdesc = lance_copyfrombuf_contig;
	sc->sc_copytobuf = lance_copytobuf_contig;
	sc->sc_copyfrombuf = lance_copyfrombuf_contig;
	sc->sc_zerobuf = lance_zerobuf_contig;

	sc->sc_rdcsr = lerdcsr;
	sc->sc_wrcsr = lewrcsr;
	sc->sc_hwinit = NULL;

	am7990_config(&lesc->sc_am7990);
}