if_ne_mb.c revision 1.2
11.2Stsutsui/* $NetBSD: if_ne_mb.c,v 1.2 2010/04/06 15:32:36 tsutsui Exp $ */ 21.1Stsutsui 31.1Stsutsui/* 41.1Stsutsui * Copyright (c) 2010 Izumi Tsutsui. All rights reserved. 51.1Stsutsui * 61.1Stsutsui * Redistribution and use in source and binary forms, with or without 71.1Stsutsui * modification, are permitted provided that the following conditions 81.1Stsutsui * are met: 91.1Stsutsui * 1. Redistributions of source code must retain the above copyright 101.1Stsutsui * notice, this list of conditions and the following disclaimer. 111.1Stsutsui * 2. Redistributions in binary form must reproduce the above copyright 121.1Stsutsui * notice, this list of conditions and the following disclaimer in the 131.1Stsutsui * documentation and/or other materials provided with the distribution. 141.1Stsutsui * 151.1Stsutsui * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 161.1Stsutsui * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 171.1Stsutsui * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 181.1Stsutsui * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 191.1Stsutsui * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 201.1Stsutsui * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 211.1Stsutsui * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 221.1Stsutsui * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 231.1Stsutsui * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 241.1Stsutsui * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 251.1Stsutsui */ 261.1Stsutsui 271.1Stsutsui/* 281.1Stsutsui * Device driver for the EtherNEC, 291.1Stsutsui * NE2000 in 8bit mode over Atari ROM cartridge slot. 301.1Stsutsui * http://hardware.atari.org/ether/ 311.1Stsutsui */ 321.1Stsutsui 331.1Stsutsui#include <sys/cdefs.h> 341.2Stsutsui__KERNEL_RCSID(0, "$NetBSD: if_ne_mb.c,v 1.2 2010/04/06 15:32:36 tsutsui Exp $"); 351.1Stsutsui 361.1Stsutsui#include <sys/param.h> 371.1Stsutsui#include <sys/systm.h> 381.1Stsutsui#include <sys/device.h> 391.1Stsutsui#include <sys/kernel.h> 401.1Stsutsui#include <sys/callout.h> 411.1Stsutsui 421.1Stsutsui#include <sys/bus.h> 431.1Stsutsui#include <sys/intr.h> 441.1Stsutsui 451.1Stsutsui#include <net/if.h> 461.1Stsutsui#include <net/if_dl.h> 471.1Stsutsui#include <net/if_ether.h> 481.1Stsutsui#include <net/if_media.h> 491.1Stsutsui 501.1Stsutsui#include <machine/cpu.h> 511.1Stsutsui#include <machine/iomap.h> 521.1Stsutsui 531.1Stsutsui#include <atari/atari/device.h> 541.1Stsutsui 551.1Stsutsui#include <dev/ic/dp8390reg.h> 561.1Stsutsui#include <dev/ic/dp8390var.h> 571.1Stsutsui#include <dev/ic/ne2000reg.h> 581.1Stsutsui#include <dev/ic/ne2000var.h> 591.1Stsutsui 601.1Stsutsui/* 611.1Stsutsui * EtherNEC specific address configuration 621.1Stsutsui */ 631.1Stsutsui 641.1Stsutsui/* I/O read ops are through /ROM4 area (0xFA0000) */ 651.1Stsutsui#define AD_CART_ROM4 (AD_CART + 0x00000) 661.1Stsutsui#define ETHERNEC_READ_PORT AD_CART_ROM4 671.1Stsutsui 681.1Stsutsui/* I/O write ops are through /ROM3 area (0xFB0000) */ 691.1Stsutsui#define AD_CART_ROM3 (AD_CART + 0x10000) 701.1Stsutsui#define ETHERNEC_WRITE_PORT AD_CART_ROM3 711.1Stsutsui 721.1Stsutsui/* CPU address lines A13-A9 are connected to ISA A4-A0 */ 731.1Stsutsui#define ETHERNEC_PORT_STRIDE 9 741.1Stsutsui 751.1Stsutsui/* Using A8-A1 lines to specify write data (no A0 but UDS/LDS on m68k) */ 761.1Stsutsui#define ETHERNEC_WR_ADDR_SHIFT 1 771.1Stsutsui 781.1Stsutsui/* interrupt polling per HZ */ 791.1Stsutsui#define ETHERNEC_TICK 1 801.1Stsutsui 811.1Stsutsuistatic int ne_mb_probe(device_t, cfdata_t, void *); 821.1Stsutsuistatic void ne_mb_attach(device_t, device_t, void *); 831.1Stsutsui 841.1Stsutsuistatic void ne_mb_poll(void *); 851.1Stsutsui 861.1Stsutsuistatic bus_space_tag_t ethernec_init_bus_space_tag(bus_space_tag_t); 871.1Stsutsuistatic void ethernec_bus_space_unimpl(void); 881.1Stsutsui 891.1Stsutsuistatic int ethernec_bus_space_peek_1(bus_space_tag_t, bus_space_handle_t, 901.1Stsutsui bus_size_t); 911.1Stsutsuistatic uint8_t ethernec_bus_space_read_1(bus_space_tag_t, bus_space_handle_t, 921.1Stsutsui bus_size_t); 931.1Stsutsuistatic void ethernec_bus_space_write_1(bus_space_tag_t, bus_space_handle_t, 941.1Stsutsui bus_size_t, uint8_t); 951.1Stsutsuistatic void ethernec_bus_space_read_multi_1(bus_space_tag_t, 961.1Stsutsui bus_space_handle_t, bus_size_t, uint8_t *, bus_size_t); 971.1Stsutsuistatic void ethernec_bus_space_read_multi_2(bus_space_tag_t, 981.1Stsutsui bus_space_handle_t, bus_size_t, uint16_t *, bus_size_t); 991.1Stsutsuistatic void ethernec_bus_space_write_multi_1(bus_space_tag_t, 1001.1Stsutsui bus_space_handle_t, bus_size_t, const uint8_t *, bus_size_t); 1011.1Stsutsuistatic void ethernec_bus_space_write_multi_2(bus_space_tag_t, 1021.1Stsutsui bus_space_handle_t, bus_size_t, const uint16_t *, bus_size_t); 1031.1Stsutsui 1041.1Stsutsuistruct ne_mb_softc { 1051.1Stsutsui struct ne2000_softc sc_ne2000; /* MI ne2000 softc */ 1061.1Stsutsui 1071.1Stsutsui struct atari_bus_space sc_bs; 1081.1Stsutsui struct callout sc_poll; 1091.1Stsutsui}; 1101.1Stsutsui 1111.1StsutsuiCFATTACH_DECL_NEW(ne_mb, sizeof(struct ne_mb_softc), 1121.1Stsutsui ne_mb_probe, ne_mb_attach, NULL, NULL); 1131.1Stsutsui 1141.1Stsutsuistatic int 1151.1Stsutsuine_mb_probe(device_t parent, cfdata_t cf, void *aux) 1161.1Stsutsui{ 1171.1Stsutsui static bool ne_matched = false; 1181.1Stsutsui struct atari_bus_space bs; 1191.1Stsutsui bus_space_tag_t iot, asict; 1201.1Stsutsui bus_space_handle_t ioh, iowh, asich; 1211.1Stsutsui int netype, rv; 1221.1Stsutsui 1231.1Stsutsui rv = 0; 1241.1Stsutsui 1251.1Stsutsui if (!atari_realconfig) 1261.1Stsutsui goto out; 1271.1Stsutsui if (strcmp("ne", aux) || ne_matched) 1281.1Stsutsui goto out; 1291.1Stsutsui 1301.1Stsutsui iot = ethernec_init_bus_space_tag(&bs); 1311.1Stsutsui 1321.1Stsutsui /* map I/O space for read ops */ 1331.1Stsutsui if (bus_space_map(iot, ETHERNEC_READ_PORT, 1341.1Stsutsui NE2000_NPORTS << ETHERNEC_PORT_STRIDE, 0, &ioh) != 0) 1351.1Stsutsui goto out; 1361.1Stsutsui 1371.1Stsutsui /* map I/O space for write ops */ 1381.1Stsutsui if (bus_space_map(iot, ETHERNEC_WRITE_PORT, 1391.1Stsutsui NE2000_NPORTS << ETHERNEC_PORT_STRIDE, 0, &iowh) != 0) 1401.1Stsutsui goto out1; 1411.1Stsutsui 1421.1Stsutsui /* XXX abuse stride for offset of write ports from read ones */ 1431.1Stsutsui iot->stride = 1441.1Stsutsui (vaddr_t)bus_space_vaddr(iot, iowh) - 1451.1Stsutsui (vaddr_t)bus_space_vaddr(iot, ioh); 1461.1Stsutsui 1471.1Stsutsui /* check if register regions are vaild */ 1481.1Stsutsui if (bus_space_peek_1(iot, ioh, 0) == 0) 1491.1Stsutsui goto out2; 1501.1Stsutsui 1511.1Stsutsui asict = iot; 1521.1Stsutsui if (bus_space_subregion(iot, ioh, 1531.1Stsutsui NE2000_ASIC_OFFSET << ETHERNEC_PORT_STRIDE, 1541.1Stsutsui NE2000_ASIC_NPORTS << ETHERNEC_PORT_STRIDE, &asich)) 1551.1Stsutsui goto out2; 1561.1Stsutsui 1571.1Stsutsui /* Look for an NE2000 compatible card */ 1581.1Stsutsui netype = ne2000_detect(iot, ioh, asict, asich); 1591.1Stsutsui switch (netype) { 1601.1Stsutsui /* XXX should we reject non RTL8019 variants? */ 1611.1Stsutsui case NE2000_TYPE_NE1000: 1621.1Stsutsui case NE2000_TYPE_NE2000: 1631.1Stsutsui case NE2000_TYPE_RTL8019: 1641.1Stsutsui ne_matched = true; 1651.1Stsutsui rv = 1; 1661.1Stsutsui break; 1671.1Stsutsui default: 1681.1Stsutsui break; 1691.1Stsutsui } 1701.1Stsutsui 1711.1Stsutsui out2: 1721.1Stsutsui bus_space_unmap(iot, iowh, NE2000_NPORTS << ETHERNEC_PORT_STRIDE); 1731.1Stsutsui out1: 1741.1Stsutsui bus_space_unmap(iot, ioh, NE2000_NPORTS << ETHERNEC_PORT_STRIDE); 1751.1Stsutsui out: 1761.1Stsutsui return rv; 1771.1Stsutsui} 1781.1Stsutsui 1791.1Stsutsuistatic void 1801.1Stsutsuine_mb_attach(device_t parent, device_t self, void *aux) 1811.1Stsutsui{ 1821.1Stsutsui struct ne_mb_softc *sc = device_private(self); 1831.1Stsutsui struct ne2000_softc *nsc = &sc->sc_ne2000; 1841.1Stsutsui struct dp8390_softc *dsc = &nsc->sc_dp8390; 1851.1Stsutsui bus_space_tag_t iot, asict; 1861.1Stsutsui bus_space_handle_t ioh, iowh, asich; 1871.1Stsutsui const char *typestr; 1881.1Stsutsui int netype; 1891.1Stsutsui 1901.1Stsutsui dsc->sc_dev = self; 1911.1Stsutsui aprint_normal(": EtherNEC on Atari ROM cartridge slot\n"); 1921.1Stsutsui 1931.1Stsutsui iot = ethernec_init_bus_space_tag(&sc->sc_bs); 1941.1Stsutsui 1951.1Stsutsui /* map I/O space for read ops */ 1961.1Stsutsui if (bus_space_map(iot, ETHERNEC_READ_PORT, 1971.1Stsutsui NE2000_NPORTS << ETHERNEC_PORT_STRIDE, 0, &ioh) != 0) 1981.1Stsutsui goto out; 1991.1Stsutsui 2001.1Stsutsui /* map I/O space for write ops */ 2011.1Stsutsui if (bus_space_map(iot, ETHERNEC_WRITE_PORT, 2021.1Stsutsui NE2000_NPORTS << ETHERNEC_PORT_STRIDE, 0, &iowh) != 0) 2031.1Stsutsui goto out1; 2041.1Stsutsui 2051.1Stsutsui /* XXX abuse stride */ 2061.1Stsutsui iot->stride = 2071.1Stsutsui (vaddr_t)bus_space_vaddr(iot, iowh) - 2081.1Stsutsui (vaddr_t)bus_space_vaddr(iot, ioh); 2091.1Stsutsui 2101.1Stsutsui asict = iot; 2111.1Stsutsui if (bus_space_subregion(iot, ioh, 2121.1Stsutsui NE2000_ASIC_OFFSET << ETHERNEC_PORT_STRIDE, 2131.1Stsutsui NE2000_ASIC_NPORTS << ETHERNEC_PORT_STRIDE, &asich)) 2141.1Stsutsui goto out2; 2151.1Stsutsui 2161.1Stsutsui dsc->sc_regt = iot; 2171.1Stsutsui dsc->sc_regh = ioh; 2181.1Stsutsui 2191.1Stsutsui nsc->sc_asict = asict; 2201.1Stsutsui nsc->sc_asich = asich; 2211.1Stsutsui 2221.1Stsutsui /* EtherNEC uses 8-bit data bus */ 2231.1Stsutsui nsc->sc_quirk = NE2000_QUIRK_8BIT; 2241.1Stsutsui 2251.1Stsutsui /* 2261.1Stsutsui * detect it again, so we can print some information about 2271.1Stsutsui * the interface. 2281.1Stsutsui * XXX: Should we accept only RTL8019? 2291.1Stsutsui */ 2301.1Stsutsui netype = ne2000_detect(iot, ioh, asict, asich); 2311.1Stsutsui switch (netype) { 2321.1Stsutsui case NE2000_TYPE_NE1000: 2331.1Stsutsui typestr = "NE1000"; 2341.1Stsutsui break; 2351.1Stsutsui 2361.1Stsutsui case NE2000_TYPE_NE2000: 2371.1Stsutsui typestr = "NE2000"; 2381.1Stsutsui break; 2391.1Stsutsui 2401.1Stsutsui case NE2000_TYPE_RTL8019: 2411.1Stsutsui typestr = "NE2000 (RTL8019)"; 2421.1Stsutsui break; 2431.1Stsutsui 2441.1Stsutsui default: 2451.1Stsutsui aprint_error_dev(self, "where did the card go?!\n"); 2461.1Stsutsui goto out2; 2471.1Stsutsui } 2481.1Stsutsui 2491.1Stsutsui aprint_normal_dev(self, "%s Ethernet (8-bit)\n", typestr); 2501.1Stsutsui 2511.1Stsutsui /* this interface is always enabled */ 2521.1Stsutsui dsc->sc_enabled = 1; 2531.1Stsutsui 2541.1Stsutsui /* call MI ne2000 attach function */ 2551.1Stsutsui ne2000_attach(nsc, NULL); 2561.1Stsutsui 2571.1Stsutsui /* emulate interrupts by callout(9) */ 2581.1Stsutsui aprint_normal_dev(self, "using %d Hz polling\n", hz / ETHERNEC_TICK); 2591.1Stsutsui callout_init(&sc->sc_poll, 0); 2601.1Stsutsui callout_reset(&sc->sc_poll, ETHERNEC_TICK, ne_mb_poll, sc); 2611.1Stsutsui 2621.1Stsutsui return; 2631.1Stsutsui 2641.1Stsutsui out2: 2651.1Stsutsui bus_space_unmap(iot, iowh, NE2000_NPORTS << ETHERNEC_PORT_STRIDE); 2661.1Stsutsui out1: 2671.1Stsutsui bus_space_unmap(iot, ioh, NE2000_NPORTS << ETHERNEC_PORT_STRIDE); 2681.1Stsutsui out: 2691.1Stsutsui return; 2701.1Stsutsui} 2711.1Stsutsui 2721.1Stsutsuistatic void 2731.1Stsutsuine_mb_poll(void *arg) 2741.1Stsutsui{ 2751.1Stsutsui struct ne_mb_softc *sc; 2761.1Stsutsui struct ne2000_softc *nsc; 2771.1Stsutsui struct dp8390_softc *dsc; 2781.1Stsutsui int s; 2791.1Stsutsui 2801.1Stsutsui sc = arg; 2811.1Stsutsui nsc = &sc->sc_ne2000; 2821.1Stsutsui dsc = &nsc->sc_dp8390; 2831.1Stsutsui 2841.1Stsutsui s = splnet(); 2851.1Stsutsui (void)dp8390_intr(dsc); 2861.1Stsutsui splx(s); 2871.1Stsutsui 2881.2Stsutsui callout_schedule(&sc->sc_poll, ETHERNEC_TICK); 2891.1Stsutsui} 2901.1Stsutsui 2911.1Stsutsui/* 2921.1Stsutsui * bus_space(9) functions for EtherNEC 2931.1Stsutsui * 2941.1Stsutsui * XXX: should these belong to an independent cartridge slot bus? 2951.1Stsutsui */ 2961.1Stsutsuistatic bus_space_tag_t 2971.1Stsutsuiethernec_init_bus_space_tag(bus_space_tag_t en_t) 2981.1Stsutsui{ 2991.1Stsutsui 3001.1Stsutsui if (en_t == NULL) 3011.1Stsutsui return NULL; 3021.1Stsutsui 3031.1Stsutsui memset(en_t, 0, sizeof(*en_t)); 3041.1Stsutsui 3051.1Stsutsui /* XXX: implement functions used by MI ne2000 and dp8390 only */ 3061.1Stsutsui en_t->abs_p_1 = ethernec_bus_space_peek_1; 3071.1Stsutsui en_t->abs_p_2 = (void *)ethernec_bus_space_unimpl; 3081.1Stsutsui en_t->abs_p_4 = (void *)ethernec_bus_space_unimpl; 3091.1Stsutsui en_t->abs_p_8 = (void *)ethernec_bus_space_unimpl; 3101.1Stsutsui en_t->abs_r_1 = ethernec_bus_space_read_1; 3111.1Stsutsui en_t->abs_r_2 = (void *)ethernec_bus_space_unimpl; 3121.1Stsutsui en_t->abs_r_4 = (void *)ethernec_bus_space_unimpl; 3131.1Stsutsui en_t->abs_r_8 = (void *)ethernec_bus_space_unimpl; 3141.1Stsutsui en_t->abs_rs_1 = ethernec_bus_space_read_1; 3151.1Stsutsui en_t->abs_rs_2 = (void *)ethernec_bus_space_unimpl; 3161.1Stsutsui en_t->abs_rs_4 = (void *)ethernec_bus_space_unimpl; 3171.1Stsutsui en_t->abs_rs_8 = (void *)ethernec_bus_space_unimpl; 3181.1Stsutsui en_t->abs_rm_1 = ethernec_bus_space_read_multi_1; 3191.1Stsutsui en_t->abs_rm_2 = (void *)ethernec_bus_space_unimpl; 3201.1Stsutsui en_t->abs_rm_4 = (void *)ethernec_bus_space_unimpl; 3211.1Stsutsui en_t->abs_rm_8 = (void *)ethernec_bus_space_unimpl; 3221.1Stsutsui en_t->abs_rms_1 = ethernec_bus_space_read_multi_1; 3231.1Stsutsui en_t->abs_rms_2 = ethernec_bus_space_read_multi_2; /* XXX dummy */ 3241.1Stsutsui en_t->abs_rms_4 = (void *)ethernec_bus_space_unimpl; 3251.1Stsutsui en_t->abs_rms_8 = (void *)ethernec_bus_space_unimpl; 3261.1Stsutsui en_t->abs_rr_1 = (void *)ethernec_bus_space_unimpl; 3271.1Stsutsui en_t->abs_rr_2 = (void *)ethernec_bus_space_unimpl; 3281.1Stsutsui en_t->abs_rr_4 = (void *)ethernec_bus_space_unimpl; 3291.1Stsutsui en_t->abs_rr_8 = (void *)ethernec_bus_space_unimpl; 3301.1Stsutsui en_t->abs_rrs_1 = (void *)ethernec_bus_space_unimpl; 3311.1Stsutsui en_t->abs_rrs_2 = (void *)ethernec_bus_space_unimpl; 3321.1Stsutsui en_t->abs_rrs_4 = (void *)ethernec_bus_space_unimpl; 3331.1Stsutsui en_t->abs_rrs_8 = (void *)ethernec_bus_space_unimpl; 3341.1Stsutsui en_t->abs_w_1 = ethernec_bus_space_write_1; 3351.1Stsutsui en_t->abs_w_2 = (void *)ethernec_bus_space_unimpl; 3361.1Stsutsui en_t->abs_w_4 = (void *)ethernec_bus_space_unimpl; 3371.1Stsutsui en_t->abs_w_8 = (void *)ethernec_bus_space_unimpl; 3381.1Stsutsui en_t->abs_ws_1 = ethernec_bus_space_write_1; 3391.1Stsutsui en_t->abs_ws_2 = (void *)ethernec_bus_space_unimpl; 3401.1Stsutsui en_t->abs_ws_4 = (void *)ethernec_bus_space_unimpl; 3411.1Stsutsui en_t->abs_ws_8 = (void *)ethernec_bus_space_unimpl; 3421.1Stsutsui en_t->abs_wm_1 = ethernec_bus_space_write_multi_1; 3431.1Stsutsui en_t->abs_wm_2 = (void *)ethernec_bus_space_unimpl; 3441.1Stsutsui en_t->abs_wm_4 = (void *)ethernec_bus_space_unimpl; 3451.1Stsutsui en_t->abs_wm_8 = (void *)ethernec_bus_space_unimpl; 3461.1Stsutsui en_t->abs_wms_1 = ethernec_bus_space_write_multi_1; 3471.1Stsutsui en_t->abs_wms_2 = ethernec_bus_space_write_multi_2; /* XXX dummy */ 3481.1Stsutsui en_t->abs_wms_4 = (void *)ethernec_bus_space_unimpl; 3491.1Stsutsui en_t->abs_wms_8 = (void *)ethernec_bus_space_unimpl; 3501.1Stsutsui en_t->abs_wr_1 = (void *)ethernec_bus_space_unimpl; 3511.1Stsutsui en_t->abs_wr_2 = (void *)ethernec_bus_space_unimpl; 3521.1Stsutsui en_t->abs_wr_4 = (void *)ethernec_bus_space_unimpl; 3531.1Stsutsui en_t->abs_wr_8 = (void *)ethernec_bus_space_unimpl; 3541.1Stsutsui en_t->abs_wrs_1 = (void *)ethernec_bus_space_unimpl; 3551.1Stsutsui en_t->abs_wrs_2 = (void *)ethernec_bus_space_unimpl; 3561.1Stsutsui en_t->abs_wrs_4 = (void *)ethernec_bus_space_unimpl; 3571.1Stsutsui en_t->abs_wrs_8 = (void *)ethernec_bus_space_unimpl; 3581.1Stsutsui en_t->abs_sm_1 = (void *)ethernec_bus_space_unimpl; 3591.1Stsutsui en_t->abs_sm_2 = (void *)ethernec_bus_space_unimpl; 3601.1Stsutsui en_t->abs_sm_4 = (void *)ethernec_bus_space_unimpl; 3611.1Stsutsui en_t->abs_sm_8 = (void *)ethernec_bus_space_unimpl; 3621.1Stsutsui en_t->abs_sr_1 = (void *)ethernec_bus_space_unimpl; 3631.1Stsutsui en_t->abs_sr_2 = (void *)ethernec_bus_space_unimpl; 3641.1Stsutsui en_t->abs_sr_4 = (void *)ethernec_bus_space_unimpl; 3651.1Stsutsui en_t->abs_sr_8 = (void *)ethernec_bus_space_unimpl; 3661.1Stsutsui 3671.1Stsutsui return en_t; 3681.1Stsutsui} 3691.1Stsutsui 3701.1Stsutsuistatic void 3711.1Stsutsuiethernec_bus_space_unimpl(void) 3721.1Stsutsui{ 3731.1Stsutsui 3741.1Stsutsui panic("%s: unimplemented EtherNEC bus_space(9) function called", 3751.1Stsutsui __func__); 3761.1Stsutsui} 3771.1Stsutsui 3781.1Stsutsuistatic int 3791.1Stsutsuiethernec_bus_space_peek_1(bus_space_tag_t bt, bus_space_handle_t bh, 3801.1Stsutsui bus_size_t reg) 3811.1Stsutsui{ 3821.1Stsutsui uint8_t *va; 3831.1Stsutsui 3841.1Stsutsui va = (uint8_t *)(bh + (reg << ETHERNEC_PORT_STRIDE)); 3851.1Stsutsui 3861.1Stsutsui return !badbaddr(va, sizeof(uint8_t)); 3871.1Stsutsui} 3881.1Stsutsui 3891.1Stsutsuistatic uint8_t 3901.1Stsutsuiethernec_bus_space_read_1(bus_space_tag_t bt, bus_space_handle_t bh, 3911.1Stsutsui bus_size_t reg) 3921.1Stsutsui{ 3931.1Stsutsui volatile uint8_t *ba; 3941.1Stsutsui 3951.1Stsutsui ba = (volatile uint8_t *)(bh + (reg << ETHERNEC_PORT_STRIDE)); 3961.1Stsutsui 3971.1Stsutsui return *ba; 3981.1Stsutsui} 3991.1Stsutsui 4001.1Stsutsuistatic void 4011.1Stsutsuiethernec_bus_space_write_1(bus_space_tag_t bt, bus_space_handle_t bh, 4021.1Stsutsui bus_size_t reg, uint8_t val) 4031.1Stsutsui{ 4041.1Stsutsui volatile uint8_t *wport; 4051.1Stsutsui 4061.1Stsutsui /* 4071.1Stsutsui * Write ops are done by read against write region (ROM3) address. 4081.1Stsutsui * 8-bit write data is specified via lower address bits. 4091.1Stsutsui */ 4101.1Stsutsui wport = (volatile uint8_t *)(bh + 4111.1Stsutsui bt->stride + (reg << ETHERNEC_PORT_STRIDE)); 4121.1Stsutsui wport += (u_int)val << ETHERNEC_WR_ADDR_SHIFT; 4131.1Stsutsui 4141.1Stsutsui (void)*wport; 4151.1Stsutsui} 4161.1Stsutsui 4171.1Stsutsuistatic void 4181.1Stsutsuiethernec_bus_space_read_multi_1(bus_space_tag_t bt, bus_space_handle_t bh, 4191.1Stsutsui bus_size_t reg, uint8_t *a, bus_size_t c) 4201.1Stsutsui{ 4211.1Stsutsui volatile uint8_t *ba; 4221.1Stsutsui 4231.1Stsutsui ba = (volatile uint8_t *)(bh + (reg << ETHERNEC_PORT_STRIDE)); 4241.1Stsutsui for (; c != 0; c--) 4251.1Stsutsui *a++ = *ba; 4261.1Stsutsui} 4271.1Stsutsui 4281.1Stsutsuistatic void 4291.1Stsutsuiethernec_bus_space_read_multi_2(bus_space_tag_t bt, bus_space_handle_t bh, 4301.1Stsutsui bus_size_t reg, uint16_t *a, bus_size_t c) 4311.1Stsutsui{ 4321.1Stsutsui 4331.1Stsutsui /* XXX: dummy function for probe ops in ne2000_detect() */ 4341.1Stsutsui} 4351.1Stsutsui 4361.1Stsutsuistatic void 4371.1Stsutsuiethernec_bus_space_write_multi_1(bus_space_tag_t bt, bus_space_handle_t bh, 4381.1Stsutsui bus_size_t reg, const uint8_t *a, bus_size_t c) 4391.1Stsutsui{ 4401.1Stsutsui volatile uint8_t *ba, *wport; 4411.1Stsutsui u_int val; 4421.1Stsutsui 4431.1Stsutsui ba = (volatile uint8_t *)(bh + 4441.1Stsutsui bt->stride + (reg << ETHERNEC_PORT_STRIDE)); 4451.1Stsutsui 4461.1Stsutsui for (; c != 0; c--) { 4471.1Stsutsui val = *a++; 4481.1Stsutsui wport = ba + (val << ETHERNEC_WR_ADDR_SHIFT); 4491.1Stsutsui (void)*wport; 4501.1Stsutsui } 4511.1Stsutsui} 4521.1Stsutsui 4531.1Stsutsuistatic void 4541.1Stsutsuiethernec_bus_space_write_multi_2(bus_space_tag_t bt, bus_space_handle_t bh, 4551.1Stsutsui bus_size_t reg, const uint16_t *a, bus_size_t c) 4561.1Stsutsui{ 4571.1Stsutsui 4581.1Stsutsui /* XXX: dummy function for probe ops in ne2000_detect() */ 4591.1Stsutsui} 460