On Saturday 05 August 2006 10:06, Niki Denev wrote: > for(i=0; i < sizeof(config_table_t); i++) { > r = bus_space_read_1(sc->bar.tag, sc->bar.hdl, i); > *((u_int8_t *)&sc->cfg_table + i) = r; > }
Note that you can replace this with: bus_space_read_multi_1(sc->bar.tag, sc->bar.hdl, 0, (u_int8_t *)&sc->cfg_table, sizeof(config_table_t)); However, if you are really reading in a table with more than just chars, you might want to read the individual fields and byteswap them as needed (if you care about portability to a big-endian arch like sparc). That is, if your device stores the table as little-endian and you had: typedef struct _config_table { uint32_t signature; uint16_t version; uint8_t dummy; } config_table_t; You would do this instead: sc->cfg_table.signature = letoh32(bus_read_4(sc->bar.res, 0)); sc->cfg_table.version = letoh16(bus_read_2(sc->bar.res, 4)); sc->cfg_table.dummy = bus_read_1(sc->bar.res, 5); (Note this also uses the shorter bus_read functions which just take a struct resouce *.) I have no idea why the printf's make a difference, unless perhaps your card needs a bit of a delay after it is inserted before it's firmware is fully up and running. In that case you might want to insert a delay. Something like this: /* XXX: Doesn't it want to print rman_get_size() / 1024 instead? */ device_printf(dev, "card has %uKB memory\n", sc->card_type); count = 0; while (letoh32(bus_read_4(sc->bar.res, 0)) != CONFIG_MAGIC) { /* If it's not up after a half-second, give up. */ if (count > 50) { device_printf(dev, "ConfigTable Bad!\n"); return (ENXIO); } count++; /* Wait 10 ms. */ DELAY(10000); } -- John Baldwin _______________________________________________ freebsd-hackers@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "[EMAIL PROTECTED]"