Index: sys/dev/pcmcia/if_xivar.h *************** *** 25,31 **** #endif struct xi_softc { ! device_t sc_dev; /* Generic device info */ struct ethercom sc_ethercom; /* Ethernet common part */ struct mii_data sc_mii; /* MII media information */ --- 25,31 ---- #endif struct xi_softc { ! struct device sc_dev; /* Generic device info */ struct ethercom sc_ethercom; /* Ethernet common part */ struct mii_data sc_mii; /* MII media information */ Index: sys/dev/pcmcia/if_xi.c *************** *** 149,154 **** --- 149,155 ---- STATIC int xi_mdi_read(device_t, int, int); STATIC void xi_mdi_write(device_t, int, int, int); STATIC int xi_mediachange(struct ifnet *); + STATIC void xi_mediastatus(struct ifnet *, struct ifmediareq *); STATIC u_int16_t xi_get(struct xi_softc *); STATIC void xi_reset(struct xi_softc *); STATIC void xi_set_address(struct xi_softc *); *************** *** 208,218 **** /* Reset and initialize the card. */ xi_full_reset(sc); ! printf("%s: MAC address %s\n", device_xname(sc->sc_dev), ether_sprintf(myea)); ifp = &sc->sc_ethercom.ec_if; /* Initialize the ifnet structure. */ ! strlcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ); ifp->if_softc = sc; ifp->if_start = xi_start; ifp->if_ioctl = xi_ioctl; --- 209,219 ---- /* Reset and initialize the card. */ xi_full_reset(sc); ! printf("%s: MAC address %s\n", sc->sc_dev.dv_xname, ether_sprintf(myea)); ifp = &sc->sc_ethercom.ec_if; /* Initialize the ifnet structure. */ ! strcpy(ifp->if_xname, sc->sc_dev.dv_xname); ifp->if_softc = sc; ifp->if_start = xi_start; ifp->if_ioctl = xi_ioctl; *************** *** 237,247 **** sc->sc_mii.mii_statchg = xi_statchg; sc->sc_ethercom.ec_mii = &sc->sc_mii; ifmedia_init(&sc->sc_mii.mii_media, 0, xi_mediachange, ! ether_mediastatus); DPRINTF(XID_MII | XID_CONFIG, ! ("xi: bmsr %x\n", xi_mdi_read(sc->sc_dev, 0, 1))); ! mii_attach(sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY, MII_OFFSET_ANY, 0); if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER | IFM_AUTO, 0, --- 238,248 ---- sc->sc_mii.mii_statchg = xi_statchg; sc->sc_ethercom.ec_mii = &sc->sc_mii; ifmedia_init(&sc->sc_mii.mii_media, 0, xi_mediachange, ! xi_mediastatus); DPRINTF(XID_MII | XID_CONFIG, ! ("xi: bmsr %x\n", xi_mdi_read(&sc->sc_dev, 0, 1))); ! mii_attach(&sc->sc_dev, &sc->sc_mii, 0xffffffff, MII_PHY_ANY, MII_OFFSET_ANY, 0); if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) ifmedia_add(&sc->sc_mii.mii_media, IFM_ETHER | IFM_AUTO, 0, *************** *** 249,255 **** ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER | IFM_AUTO); #if NRND > 0 ! rnd_attach_source(&sc->sc_rnd_source, device_xname(sc->sc_dev), RND_TYPE_NET, 0); #endif } --- 250,256 ---- ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER | IFM_AUTO); #if NRND > 0 ! rnd_attach_source(&sc->sc_rnd_source, sc->sc_dev.dv_xname, RND_TYPE_NET, 0); #endif } *************** *** 285,291 **** DPRINTF(XID_CONFIG, ("xi_intr()\n")); ! if (sc->sc_enabled == 0 || !device_is_active(sc->sc_dev)) return (0); ifp->if_timer = 0; /* turn watchdog timer off */ --- 286,292 ---- DPRINTF(XID_CONFIG, ("xi_intr()\n")); ! if (sc->sc_enabled == 0 || !device_is_active(&sc->sc_dev)) return (0); ifp->if_timer = 0; /* turn watchdog timer off */ *************** *** 304,310 **** if (isr == 0xff) { #ifdef DIAGNOSTIC printf("%s: interrupt for dead card\n", ! device_xname(sc->sc_dev)); #endif goto end; } --- 305,311 ---- if (isr == 0xff) { #ifdef DIAGNOSTIC printf("%s: interrupt for dead card\n", ! sc->sc_dev.dv_xname); #endif goto end; } *************** *** 464,471 **** data = mtod(m, u_int8_t *); if (len > 1) { len &= ~1; ! bus_space_read_multi_2(sc->sc_bst, sc->sc_bsh, EDP, ! (u_int16_t *)data, len>>1); } else *data = bus_space_read_1(sc->sc_bst, sc->sc_bsh, EDP); m->m_len = len; --- 465,472 ---- data = mtod(m, u_int8_t *); if (len > 1) { len &= ~1; ! bus_space_read_multi_stream_2(sc->sc_bst, sc->sc_bsh, ! EDP, (u_int16_t *)data, len>>1); } else *data = bus_space_read_1(sc->sc_bst, sc->sc_bsh, EDP); m->m_len = len; *************** *** 642,647 **** --- 643,664 ---- } STATIC void + xi_mediastatus(ifp, ifmr) + struct ifnet *ifp; + struct ifmediareq *ifmr; + { + struct xi_softc *sc = ifp->if_softc; + + if (sc->sc_enabled == 0) { + ifmr->ifm_active = IFM_ETHER | IFM_NONE; + ifmr->ifm_status = 0; + return; + } + + ether_mediastatus(ifp, ifmr); + } + + STATIC void xi_reset(struct xi_softc *sc) { int s; *************** *** 659,665 **** { struct xi_softc *sc = ifp->if_softc; ! printf("%s: device timeout\n", device_xname(sc->sc_dev)); ++ifp->if_oerrors; xi_reset(sc); --- 676,682 ---- { struct xi_softc *sc = ifp->if_softc; ! printf("%s: device timeout\n", sc->sc_dev.dv_xname); ++ifp->if_oerrors; xi_reset(sc); *************** *** 818,824 **** bus_space_write_2(bst, bsh, EDP, (u_int16_t)len + pad); for (m = m0; m; ) { if (m->m_len > 1) ! bus_space_write_multi_2(bst, bsh, EDP, mtod(m, u_int16_t *), m->m_len>>1); if (m->m_len & 1) { DPRINTF(XID_CONFIG, ("xi: XXX odd!\n")); --- 835,841 ---- bus_space_write_2(bst, bsh, EDP, (u_int16_t)len + pad); for (m = m0; m; ) { if (m->m_len > 1) ! bus_space_write_multi_stream_2(bst, bsh, EDP, mtod(m, u_int16_t *), m->m_len>>1); if (m->m_len & 1) { DPRINTF(XID_CONFIG, ("xi: XXX odd!\n")); Index: sys/dev/pcmcia/xirc.c *************** *** 628,635 **** struct xirc_softc *msc = device_private(parent); u_int8_t myla[ETHER_ADDR_LEN]; - sc->sc_dev = self; - aprint_normal("\n"); sc->sc_bst = msc->sc_ethernet_pcioh.iot; --- 628,633 ---- *************** *** 653,659 **** int xi_xirc_enable(struct xi_softc *sc) { ! struct xirc_softc *msc = device_private(device_parent(sc->sc_dev)); return (xirc_enable(msc, XIRC_ETHERNET_ENABLED, XIMEDIA_ETHER)); } --- 651,657 ---- int xi_xirc_enable(struct xi_softc *sc) { ! struct xirc_softc *msc = device_private(sc->sc_dev.dv_parent); return (xirc_enable(msc, XIRC_ETHERNET_ENABLED, XIMEDIA_ETHER)); } *************** *** 661,667 **** void xi_xirc_disable(struct xi_softc *sc) { ! struct xirc_softc *msc = device_private(device_parent(sc->sc_dev)); xirc_disable(msc, XIRC_ETHERNET_ENABLED, XIMEDIA_ETHER); } --- 659,665 ---- void xi_xirc_disable(struct xi_softc *sc) { ! struct xirc_softc *msc = device_private(sc->sc_dev.dv_parent); xirc_disable(msc, XIRC_ETHERNET_ENABLED, XIMEDIA_ETHER); }