Hi,

Instead of reading the unprotected pointer ifm_cur, drivers use API
to access current media and data.  New function ifmedia_current()
provides read access with mutex locking.

If anyone has some of these old network drivers, please test setting
media type with ifconfig.

ok?

bluhm

Index: arch/octeon/dev/cn30xxgmx.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/arch/octeon/dev/cn30xxgmx.c,v
retrieving revision 1.52
diff -u -p -r1.52 cn30xxgmx.c
--- arch/octeon/dev/cn30xxgmx.c 6 Apr 2022 18:59:26 -0000       1.52
+++ arch/octeon/dev/cn30xxgmx.c 14 Jul 2022 22:46:20 -0000
@@ -725,19 +725,21 @@ cn30xxgmx_reset_timing(struct cn30xxgmx_
 int
 cn30xxgmx_reset_flowctl(struct cn30xxgmx_port_softc *sc)
 {
-       struct ifmedia_entry *ife = sc->sc_port_mii->mii_media.ifm_cur;
+       uint64_t media;
+
+       ifmedia_current(&sc->sc_port_mii->mii_media, &media, NULL);
 
        /*
         * Get flow control negotiation result.
         */
 #ifdef GMX_802_3X_DISABLE_AUTONEG
        /* Tentative support for SEIL-compat.. */
-       if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) {
+       if (IFM_SUBTYPE(media) == IFM_AUTO) {
                sc->sc_port_flowflags &= ~IFM_ETH_FMASK;
        }
 #else
        /* Default configuration of NetBSD */
-       if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO &&
+       if (IFM_SUBTYPE(media) == IFM_AUTO &&
            (sc->sc_port_mii->mii_media_active & IFM_ETH_FMASK) !=
                        sc->sc_port_flowflags) {
                sc->sc_port_flowflags =
Index: dev/ic/an.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/ic/an.c,v
retrieving revision 1.79
diff -u -p -r1.79 an.c
--- dev/ic/an.c 21 Apr 2022 21:03:02 -0000      1.79
+++ dev/ic/an.c 14 Jul 2022 22:30:51 -0000
@@ -1277,17 +1277,18 @@ an_media_change(struct ifnet *ifp)
 {
        struct an_softc *sc = ifp->if_softc;
        struct ieee80211com *ic = &sc->sc_ic;
-       struct ifmedia_entry *ime;
+       uint64_t media;
        enum ieee80211_opmode newmode;
        int i, rate, error = 0;
 
-       ime = ic->ic_media.ifm_cur;
-       if (IFM_SUBTYPE(ime->ifm_media) == IFM_AUTO) {
+       ifmedia_current(&ic->ic_media, &media, NULL);
+
+       if (IFM_SUBTYPE(media) == IFM_AUTO) {
                i = -1;
        } else {
                struct ieee80211_rateset *rs =
                    &ic->ic_sup_rates[IEEE80211_MODE_11B];
-               rate = ieee80211_media2rate(ime->ifm_media);
+               rate = ieee80211_media2rate(media);
                if (rate == 0)
                        return EINVAL;
                for (i = 0; i < rs->rs_nrates; i++) {
@@ -1303,13 +1304,13 @@ an_media_change(struct ifnet *ifp)
        }
 
 #ifndef IEEE80211_STA_ONLY
-       if (ime->ifm_media & IFM_IEEE80211_ADHOC)
+       if (media & IFM_IEEE80211_ADHOC)
                newmode = IEEE80211_M_IBSS;
-       else if (ime->ifm_media & IFM_IEEE80211_HOSTAP)
+       else if (media & IFM_IEEE80211_HOSTAP)
                newmode = IEEE80211_M_HOSTAP;
        else
 #endif
-       if (ime->ifm_media & IFM_IEEE80211_MONITOR)
+       if (media & IFM_IEEE80211_MONITOR)
                newmode = IEEE80211_M_MONITOR;
        else
                newmode = IEEE80211_M_STA;
@@ -1323,7 +1324,8 @@ an_media_change(struct ifnet *ifp)
                else
                        error = 0;
        }
-       ifp->if_baudrate = ifmedia_baudrate(ic->ic_media.ifm_cur->ifm_media);
+       ifmedia_current(&ic->ic_media, &media, NULL);
+       ifp->if_baudrate = ifmedia_baudrate(media);
 
        return error;
 }
Index: dev/ic/elink3.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/ic/elink3.c,v
retrieving revision 1.98
diff -u -p -r1.98 elink3.c
--- dev/ic/elink3.c     12 Dec 2020 11:48:52 -0000      1.98
+++ dev/ic/elink3.c     14 Jul 2022 22:30:51 -0000
@@ -571,6 +571,7 @@ epinit(struct ep_softc *sc)
        register struct ifnet *ifp = &sc->sc_arpcom.ac_if;
        bus_space_tag_t iot = sc->sc_iot;
        bus_space_handle_t ioh = sc->sc_ioh;
+       u_int data;
        int i;
 
        /* make sure any pending reset has completed before touching board */
@@ -650,7 +651,8 @@ epinit(struct ep_softc *sc)
        bus_space_write_2(iot, ioh, EP_COMMAND, ACK_INTR | 0xff);
 
        epsetfilter(sc);
-       epsetmedia(sc, sc->sc_mii.mii_media.ifm_cur->ifm_data);
+       ifmedia_current(&sc->sc_mii.mii_media, NULL, &data);
+       epsetmedia(sc, data);
 
        bus_space_write_2(iot, ioh, EP_COMMAND, RX_ENABLE);
        bus_space_write_2(iot, ioh, EP_COMMAND, TX_ENABLE);
@@ -687,8 +689,10 @@ int
 ep_media_change(struct ifnet *ifp)
 {
        register struct ep_softc *sc = ifp->if_softc;
+       u_int data;
 
-       return  epsetmedia(sc, sc->sc_mii.mii_media.ifm_cur->ifm_data);
+       ifmedia_current(&sc->sc_mii.mii_media, NULL, &data);
+       return  epsetmedia(sc, data);
 }
 
 /*
@@ -887,8 +891,8 @@ ep_media_status(struct ifnet *ifp, struc
        }
 
        /* XXX read from softc when we start autosensing media */
-       req->ifm_active = sc->sc_mii.mii_media.ifm_cur->ifm_media;
-       
+       ifmedia_current(&sc->sc_mii.mii_media, &req->ifm_active, NULL);
+
        switch (sc->ep_chipset) {
        case EP_CHIPSET_VORTEX:
        case EP_CHIPSET_BOOMERANG:
Index: dev/ic/gem.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/ic/gem.c,v
retrieving revision 1.127
diff -u -p -r1.127 gem.c
--- dev/ic/gem.c        12 Jul 2022 22:08:17 -0000      1.127
+++ dev/ic/gem.c        14 Jul 2022 22:30:51 -0000
@@ -1348,16 +1348,18 @@ void
 gem_mii_statchg(struct device *dev)
 {
        struct gem_softc *sc = (void *)dev;
-#ifdef GEM_DEBUG
-       uint64_t instance = IFM_INST(sc->sc_mii.mii_media.ifm_cur->ifm_media);
-#endif
        bus_space_tag_t t = sc->sc_bustag;
        bus_space_handle_t mac = sc->sc_h1;
        u_int32_t v;
 
 #ifdef GEM_DEBUG
-       if (sc->sc_debug)
-               printf("gem_mii_statchg: status change: phy = %lld\n", 
instance);
+       if (sc->sc_debug) {
+               uint64_t media;
+
+               ifmedia_current(&sc->sc_mii.mii_media, &media, NULL);
+               printf("%s: status change: phy = %lld\n",
+                   __func__, IFM_INST(media));
+       }
 #endif
 
        /* Set tx full duplex options */
Index: dev/ic/hme.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/ic/hme.c,v
retrieving revision 1.83
diff -u -p -r1.83 hme.c
--- dev/ic/hme.c        12 Dec 2020 11:48:52 -0000      1.83
+++ dev/ic/hme.c        14 Jul 2022 22:30:51 -0000
@@ -1103,9 +1103,12 @@ hme_mediachange(struct ifnet *ifp)
        bus_space_tag_t t = sc->sc_bustag;
        bus_space_handle_t mif = sc->sc_mif;
        bus_space_handle_t mac = sc->sc_mac;
-       uint64_t instance = IFM_INST(sc->sc_mii.mii_media.ifm_cur->ifm_media);
-       int phy = sc->sc_phys[instance];
+       uint64_t media;
+       int phy;
        u_int32_t v;
+
+       ifmedia_current(&sc->sc_mii.mii_media, &media, NULL);
+       phy = sc->sc_phys[IFM_INST(media)];
 
 #ifdef HMEDEBUG
        if (sc->sc_debug)
Index: dev/ic/if_wi.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/ic/if_wi.c,v
retrieving revision 1.177
diff -u -p -r1.177 if_wi.c
--- dev/ic/if_wi.c      14 Jul 2022 13:46:24 -0000      1.177
+++ dev/ic/if_wi.c      14 Jul 2022 22:30:51 -0000
@@ -2659,9 +2659,10 @@ wi_get_id(struct wi_softc *sc)
 STATIC int
 wi_sync_media(struct wi_softc *sc, int ptype, int txrate)
 {
-       uint64_t media = sc->sc_media.ifm_cur->ifm_media;
-       uint64_t options = IFM_OPTIONS(media);
-       uint64_t subtype;
+       uint64_t media, options, subtype;
+
+       ifmedia_current(&sc->sc_media, &media, NULL);
+       options = IFM_OPTIONS(media);
 
        switch (txrate) {
        case 1:
@@ -2719,17 +2720,20 @@ STATIC int
 wi_media_change(struct ifnet *ifp)
 {
        struct wi_softc *sc = ifp->if_softc;
+       uint64_t media;
        int otype = sc->wi_ptype;
        int orate = sc->wi_tx_rate;
        int ocreate_ibss = sc->wi_create_ibss;
 
-       if ((sc->sc_media.ifm_cur->ifm_media & IFM_IEEE80211_HOSTAP) &&
+       ifmedia_current(&sc->sc_media, &media, NULL);
+
+       if ((media & IFM_IEEE80211_HOSTAP) &&
            sc->sc_firmware_type != WI_INTERSIL)
                return (EINVAL);
 
        sc->wi_create_ibss = 0;
 
-       switch (sc->sc_media.ifm_cur->ifm_media & IFM_OMASK) {
+       switch (media & IFM_OMASK) {
        case 0:
                sc->wi_ptype = WI_PORTTYPE_BSS;
                break;
@@ -2753,7 +2757,7 @@ wi_media_change(struct ifnet *ifp)
                return (EINVAL);
        }
 
-       switch (IFM_SUBTYPE(sc->sc_media.ifm_cur->ifm_media)) {
+       switch (IFM_SUBTYPE(media)) {
        case IFM_IEEE80211_DS1:
                sc->wi_tx_rate = 1;
                break;
@@ -2777,7 +2781,8 @@ wi_media_change(struct ifnet *ifp)
                        wi_init(sc);
        }
 
-       ifp->if_baudrate = ifmedia_baudrate(sc->sc_media.ifm_cur->ifm_media);
+       ifmedia_current(&sc->sc_media, &media, NULL);
+       ifp->if_baudrate = ifmedia_baudrate(media);
 
        return (0);
 }
@@ -2816,7 +2821,7 @@ wi_media_status(struct ifnet *ifp, struc
                        }
                }
        } else {
-               imr->ifm_active = sc->sc_media.ifm_cur->ifm_media;
+               ifmedia_current(&sc->sc_media, &imr->ifm_active, NULL);
        }
 
        imr->ifm_status = IFM_AVALID;
Index: dev/ic/rtl80x9.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/ic/rtl80x9.c,v
retrieving revision 1.12
diff -u -p -r1.12 rtl80x9.c
--- dev/ic/rtl80x9.c    7 Mar 2021 06:21:38 -0000       1.12
+++ dev/ic/rtl80x9.c    14 Jul 2022 17:59:35 -0000
@@ -101,12 +101,14 @@ rtl80x9_mediastatus(struct dp8390_softc 
 void
 rtl80x9_init_card(struct dp8390_softc *sc)
 {
-       struct ifmedia *ifm = &sc->sc_media;
        struct ifnet *ifp = &sc->sc_arpcom.ac_if;
+       uint64_t media;
        u_int8_t cr_proto = sc->cr_proto |
            ((ifp->if_flags & IFF_RUNNING) ? ED_CR_STA : ED_CR_STP);
        u_int8_t reg;
 
+       ifmedia_current(&sc->sc_media, &media, NULL);
+
        /* Set NIC to page 3 registers. */
        NIC_PUT(sc->sc_regt, sc->sc_regh, ED_P0_CR, cr_proto | ED_CR_PAGE_3);
 
@@ -117,7 +119,7 @@ rtl80x9_init_card(struct dp8390_softc *s
        /* First, set basic media type. */
        reg = NIC_GET(sc->sc_regt, sc->sc_regh, NERTL_RTL3_CONFIG2);
        reg &= ~(RTL3_CONFIG2_PL1|RTL3_CONFIG2_PL0);
-       switch (IFM_SUBTYPE(ifm->ifm_cur->ifm_media)) {
+       switch (IFM_SUBTYPE(media)) {
        case IFM_AUTO:
                /* Nothing to do; both bits clear == auto-detect. */
                break;
@@ -138,7 +140,7 @@ rtl80x9_init_card(struct dp8390_softc *s
 
        /* Now, set duplex mode. */
        reg = NIC_GET(sc->sc_regt, sc->sc_regh, NERTL_RTL3_CONFIG3);
-       if (ifm->ifm_cur->ifm_media & IFM_FDX)
+       if (media & IFM_FDX)
                reg |= RTL3_CONFIG3_FUDUP;
        else
                reg &= ~RTL3_CONFIG3_FUDUP;
Index: dev/ic/smc83c170.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/ic/smc83c170.c,v
retrieving revision 1.30
diff -u -p -r1.30 smc83c170.c
--- dev/ic/smc83c170.c  9 Jan 2022 05:42:42 -0000       1.30
+++ dev/ic/smc83c170.c  14 Jul 2022 22:30:51 -0000
@@ -1404,14 +1404,15 @@ epic_mediachange(struct ifnet *ifp)
 {
        struct epic_softc *sc = ifp->if_softc;
        struct mii_data *mii = &sc->sc_mii;
-       struct ifmedia *ifm = &mii->mii_media;
-       uint64_t media = ifm->ifm_cur->ifm_media;
+       uint64_t media;
        u_int32_t miicfg;
        struct mii_softc *miisc;
        int cfg;
 
        if (!(ifp->if_flags & IFF_UP))
                return (0);
+
+       ifmedia_current(&mii->mii_media, &media, NULL);
 
        if (IFM_INST(media) != sc->sc_serinst) {
                /* If we're not selecting serial interface, select MII mode */
Index: dev/ic/smc91cxx.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/ic/smc91cxx.c,v
retrieving revision 1.51
diff -u -p -r1.51 smc91cxx.c
--- dev/ic/smc91cxx.c   9 Jan 2022 05:42:42 -0000       1.51
+++ dev/ic/smc91cxx.c   14 Jul 2022 22:30:51 -0000
@@ -394,6 +394,7 @@ smc91cxx_init(struct smc91cxx_softc *sc)
        struct ifnet *ifp = &sc->sc_arpcom.ac_if;
        bus_space_tag_t bst = sc->sc_bst;
        bus_space_handle_t bsh = sc->sc_bsh;
+       uint64_t media;
        u_int16_t tmp;
        int s, i;
 
@@ -444,7 +445,8 @@ smc91cxx_init(struct smc91cxx_softc *sc)
        /*
         * Set current media.
         */
-       smc91cxx_set_media(sc, sc->sc_mii.mii_media.ifm_cur->ifm_media);
+       ifmedia_current(&sc->sc_mii.mii_media, &media, NULL);
+       smc91cxx_set_media(sc, media);
 
        /*
         * Set the receive filter.  We want receive enable and auto
Index: dev/ic/ti.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/ic/ti.c,v
retrieving revision 1.29
diff -u -p -r1.29 ti.c
--- dev/ic/ti.c 9 Jan 2022 05:42:42 -0000       1.29
+++ dev/ic/ti.c 14 Jul 2022 22:30:51 -0000
@@ -2085,7 +2085,7 @@ ti_init2(struct ti_softc *sc)
         */
        ifm = &sc->ifmedia;
        tmp = ifm->ifm_media;
-       ifm->ifm_media = ifm->ifm_cur->ifm_media;
+       ifmedia_current(ifm, &ifm->ifm_media, NULL);
        ti_ifmedia_upd(ifp);
        ifm->ifm_media = tmp;
 }
Index: dev/isa/if_ec.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/isa/if_ec.c,v
retrieving revision 1.19
diff -u -p -r1.19 if_ec.c
--- dev/isa/if_ec.c     6 Apr 2022 18:59:28 -0000       1.19
+++ dev/isa/if_ec.c     14 Jul 2022 22:30:51 -0000
@@ -719,21 +719,20 @@ ec_mediachange(struct dp8390_softc *sc)
 void
 ec_mediastatus(struct dp8390_softc *sc, struct ifmediareq *ifmr)
 {
-       struct ifmedia *ifm = &sc->sc_media;
-
        /*
         * The currently selected media is always the active media.
         */
-       ifmr->ifm_active = ifm->ifm_cur->ifm_media;
+       ifmedia_current(&sc->sc_media, &ifmr->ifm_active, NULL);
 }
 
 void
 ec_init_card(struct dp8390_softc *sc)
 {
        struct ec_softc *esc = (struct ec_softc *)sc;
-       struct ifmedia *ifm = &sc->sc_media;
+       uint64_t media;
 
-       (void) ec_set_media(esc, ifm->ifm_cur->ifm_media);
+       ifmedia_current(&sc->sc_media, &media, NULL);
+       (void) ec_set_media(esc, media);
 }
 
 int
Index: dev/isa/if_ex.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/isa/if_ex.c,v
retrieving revision 1.48
diff -u -p -r1.48 if_ex.c
--- dev/isa/if_ex.c     6 Apr 2022 18:59:28 -0000       1.48
+++ dev/isa/if_ex.c     14 Jul 2022 23:03:34 -0000
@@ -241,7 +241,6 @@ ex_attach(struct device *parent, struct 
        struct ex_softc *sc = (void *)self;
        struct isa_attach_args *ia = aux;
        struct ifnet *ifp = &sc->arpcom.ac_if;
-       struct ifmedia *ifm;
        int temp;
 
        DODEBUG(Start_End, printf("ex_attach: start\n"););
@@ -266,9 +265,7 @@ ex_attach(struct device *parent, struct 
        ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_AUTO, 0, NULL);
        ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_NONE, 0, NULL);
        ifmedia_set(&sc->ifmedia, ex_get_media(sc));
-
-       ifm = &sc->ifmedia;
-       ifm->ifm_media = ifm->ifm_cur->ifm_media;
+       ifmedia_current(&sc->ifmedia, &sc->ifmedia.ifm_media, NULL);
        ex_ifmedia_upd(ifp);
 
        if_attach(ifp);
Index: dev/isa/if_we.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/isa/if_we.c,v
retrieving revision 1.28
diff -u -p -r1.28 if_we.c
--- dev/isa/if_we.c     6 Apr 2022 18:59:28 -0000       1.28
+++ dev/isa/if_we.c     14 Jul 2022 22:30:51 -0000
@@ -789,12 +789,10 @@ we_mediachange(struct dp8390_softc *sc)
 void
 we_mediastatus(struct dp8390_softc *sc, struct ifmediareq *ifmr)
 {
-       struct ifmedia *ifm = &sc->sc_media;
-
        /*
         * The currently selected media is always the active media.
         */
-       ifmr->ifm_active = ifm->ifm_cur->ifm_media;
+       ifmedia_current(&sc->sc_media, &ifmr->ifm_active, NULL);
 }
 
 const char *
Index: dev/mii/acphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/acphy.c,v
retrieving revision 1.10
diff -u -p -r1.10 acphy.c
--- dev/mii/acphy.c     6 Apr 2022 18:59:29 -0000       1.10
+++ dev/mii/acphy.c     14 Jul 2022 18:29:37 -0000
@@ -140,15 +140,17 @@ acphyattach(struct device *parent, struc
 int
 acphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int reg;
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -157,7 +159,7 @@ acphy_service(struct mii_softc *sc, stru
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
+               if (IFM_INST(media) != sc->mii_inst) {
                        reg = PHY_READ(sc, MII_BMCR);
                        PHY_WRITE(sc, MII_BMCR, reg | BMCR_ISO);
                        return (0);
@@ -176,7 +178,7 @@ acphy_service(struct mii_softc *sc, stru
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                if (mii_phy_tick(sc) == EJUSTRETURN)
@@ -200,7 +202,6 @@ void
 acphy_status(struct mii_softc *sc)
 {
        struct mii_data *mii = sc->mii_pdata;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
        int bmsr, bmcr, dr;
 
        mii->mii_media_status = IFM_AVALID;
@@ -243,5 +244,5 @@ acphy_status(struct mii_softc *sc)
                else
                        mii->mii_media_active |= IFM_HDX;
        } else
-               mii->mii_media_active = ife->ifm_media;
+               ifmedia_current(&mii->mii_media, &mii->mii_media_active, NULL);
 }
Index: dev/mii/amphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/amphy.c,v
retrieving revision 1.22
diff -u -p -r1.22 amphy.c
--- dev/mii/amphy.c     6 Apr 2022 18:59:29 -0000       1.22
+++ dev/mii/amphy.c     14 Jul 2022 18:31:37 -0000
@@ -130,15 +130,17 @@ amphyattach(struct device *parent, struc
 int
 amphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int reg;
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -147,7 +149,7 @@ amphy_service(struct mii_softc *sc, stru
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
+               if (IFM_INST(media) != sc->mii_inst) {
                        reg = PHY_READ(sc, MII_BMCR);
                        PHY_WRITE(sc, MII_BMCR, reg | BMCR_ISO);
                        return (0);
@@ -166,7 +168,7 @@ amphy_service(struct mii_softc *sc, stru
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                if (mii_phy_tick(sc) == EJUSTRETURN)
@@ -189,7 +191,6 @@ void
 amphy_status(struct mii_softc *sc)
 {
        struct mii_data *mii = sc->mii_pdata;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
        int bmsr, bmcr, par, anlpar;
 
        mii->mii_media_status = IFM_AVALID;
@@ -252,5 +253,5 @@ amphy_status(struct mii_softc *sc)
                else if (par & DSCSR_10HDX)
                        mii->mii_media_active |= IFM_10_T|IFM_HDX;
        } else
-               mii->mii_media_active = ife->ifm_media;
+               ifmedia_current(&mii->mii_media, &mii->mii_media_active, NULL);
 }
Index: dev/mii/atphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/atphy.c,v
retrieving revision 1.13
diff -u -p -r1.13 atphy.c
--- dev/mii/atphy.c     6 Apr 2022 18:59:29 -0000       1.13
+++ dev/mii/atphy.c     14 Jul 2022 18:34:43 -0000
@@ -146,15 +146,17 @@ atphy_attach(struct device *parent, stru
 int
 atphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        uint16_t anar, bmcr, bmsr;
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -163,7 +165,7 @@ atphy_service(struct mii_softc *sc, stru
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
+               if (IFM_INST(media) != sc->mii_inst) {
                        bmcr = PHY_READ(sc, MII_BMCR);
                        PHY_WRITE(sc, MII_BMCR, bmcr | BMCR_ISO);
                        return (0);
@@ -176,7 +178,7 @@ atphy_service(struct mii_softc *sc, stru
                        break;
 
                bmcr = 0;
-               switch (IFM_SUBTYPE(ife->ifm_media)) {
+               switch (IFM_SUBTYPE(media)) {
                case IFM_AUTO:
                case IFM_1000_T:
                        atphy_mii_phy_auto(sc);
@@ -203,8 +205,8 @@ atphy_service(struct mii_softc *sc, stru
                        return (EINVAL);
                }
 
-               anar = mii_anar(ife->ifm_media);
-               if (((ife->ifm_media & IFM_GMASK) & IFM_FDX) != 0) {
+               anar = mii_anar(media);
+               if (((media & IFM_GMASK) & IFM_FDX) != 0) {
                        bmcr |= BMCR_FDX;
                        /* Enable pause. */
                        if (sc->mii_flags & MIIF_DOPAUSE)
@@ -228,7 +230,7 @@ done:
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                /*
@@ -240,7 +242,7 @@ done:
                /*
                 * Only used for autonegotiation.
                 */
-               if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO) {
+               if (IFM_SUBTYPE(media) != IFM_AUTO) {
                        sc->mii_ticks = 0;
                        break;
                }
Index: dev/mii/bmtphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/bmtphy.c,v
retrieving revision 1.21
diff -u -p -r1.21 bmtphy.c
--- dev/mii/bmtphy.c    6 Apr 2022 18:59:29 -0000       1.21
+++ dev/mii/bmtphy.c    14 Jul 2022 18:39:06 -0000
@@ -134,18 +134,20 @@ bmtphyattach(struct device *parent, stru
 int
 bmtphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int reg;
 
        if ((sc->mii_dev.dv_flags & DVF_ACTIVE) == 0)
                return (ENXIO);
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -154,7 +156,7 @@ bmtphy_service(struct mii_softc *sc, str
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
+               if (IFM_INST(media) != sc->mii_inst) {
                        reg = PHY_READ(sc, MII_BMCR);
                        PHY_WRITE(sc, MII_BMCR, reg | BMCR_ISO);
                        return (0);
@@ -173,7 +175,7 @@ bmtphy_service(struct mii_softc *sc, str
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                if (mii_phy_tick(sc) == EJUSTRETURN)
@@ -197,7 +199,6 @@ void
 bmtphy_status(struct mii_softc *sc)
 {
        struct mii_data *mii = sc->mii_pdata;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
        int bmsr, bmcr, aux_csr;
 
        mii->mii_media_status = IFM_AVALID;
@@ -239,7 +240,7 @@ bmtphy_status(struct mii_softc *sc)
                else
                        mii->mii_media_active |= IFM_HDX;
        } else
-               mii->mii_media_active = ife->ifm_media;
+               ifmedia_current(&mii->mii_media, &mii->mii_media_active, NULL);
 }
 
 void
Index: dev/mii/brgphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/brgphy.c,v
retrieving revision 1.108
diff -u -p -r1.108 brgphy.c
--- dev/mii/brgphy.c    6 Apr 2022 18:59:29 -0000       1.108
+++ dev/mii/brgphy.c    14 Jul 2022 18:49:20 -0000
@@ -307,18 +307,20 @@ brgphy_attach(struct device *parent, str
 int
 brgphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int reg, speed = 0, gig;
 
        if ((sc->mii_dev.dv_flags & DVF_ACTIVE) == 0)
                return (ENXIO);
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -327,7 +329,7 @@ brgphy_service(struct mii_softc *sc, str
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
+               if (IFM_INST(media) != sc->mii_inst) {
                        reg = PHY_READ(sc, MII_BMCR);
                        PHY_WRITE(sc, MII_BMCR, reg | BMCR_ISO);
                        return (0);
@@ -341,7 +343,7 @@ brgphy_service(struct mii_softc *sc, str
 
                PHY_RESET(sc); /* XXX hardware bug work-around */
 
-               switch (IFM_SUBTYPE(ife->ifm_media)) {
+               switch (IFM_SUBTYPE(media)) {
                case IFM_AUTO:
                        (void) brgphy_mii_phy_auto(sc);
                        break;
@@ -358,7 +360,7 @@ brgphy_service(struct mii_softc *sc, str
                        speed = BMCR_S10;
 setit:
                        brgphy_loop(sc);
-                       if ((ife->ifm_media & IFM_GMASK) == IFM_FDX) {
+                       if ((media & IFM_GMASK) == IFM_FDX) {
                                speed |= BMCR_FDX;
                                gig = GTCR_ADV_1000TFDX;
                        } else {
@@ -369,9 +371,9 @@ setit:
                        PHY_WRITE(sc, MII_ANAR, ANAR_CSMA);
                        PHY_WRITE(sc, MII_BMCR, speed);
 
-                       if ((IFM_SUBTYPE(ife->ifm_media) != IFM_1000_T) &&
-                           (IFM_SUBTYPE(ife->ifm_media) != IFM_1000_SX) &&
-                           (IFM_SUBTYPE(ife->ifm_media) != IFM_2500_SX))
+                       if ((IFM_SUBTYPE(media) != IFM_1000_T) &&
+                           (IFM_SUBTYPE(media) != IFM_1000_SX) &&
+                           (IFM_SUBTYPE(media) != IFM_2500_SX))
                                break;
 
                        PHY_WRITE(sc, MII_100T2CR, gig);
@@ -395,7 +397,7 @@ setit:
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                /*
@@ -407,7 +409,7 @@ setit:
                /*
                 * Only used for autonegotiation.
                 */
-               if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO)
+               if (IFM_SUBTYPE(media) != IFM_AUTO)
                        break;
 
                /*
@@ -474,7 +476,6 @@ void
 brgphy_copper_status(struct mii_softc *sc)
 {
        struct mii_data *mii = sc->mii_pdata;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
        int bmcr, bmsr;
 
        mii->mii_media_status = IFM_AVALID;
@@ -542,14 +543,13 @@ brgphy_copper_status(struct mii_softc *s
                                mii->mii_media_active |= IFM_ETH_MASTER;
                }
        } else
-               mii->mii_media_active = ife->ifm_media;
+               ifmedia_current(&mii->mii_media, &mii->mii_media_active, NULL);
 }
 
 void
 brgphy_fiber_status(struct mii_softc *sc)
 {
        struct mii_data *mii = sc->mii_pdata;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
        int bmcr, bmsr;
 
        mii->mii_media_status = IFM_AVALID;
@@ -584,14 +584,13 @@ brgphy_fiber_status(struct mii_softc *sc
                if (mii->mii_media_active & IFM_FDX)
                        mii->mii_media_active |= mii_phy_flowstatus(sc);
        } else
-               mii->mii_media_active = ife->ifm_media;
+               ifmedia_current(&mii->mii_media, &mii->mii_media_active, NULL);
 }
 
 void
 brgphy_5708s_status(struct mii_softc *sc)
 {
        struct mii_data *mii = sc->mii_pdata;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
        int bmcr, bmsr;
 
        mii->mii_media_status = IFM_AVALID;
@@ -646,14 +645,13 @@ brgphy_5708s_status(struct mii_softc *sc
                                mii->mii_media_active |= IFM_FLOW | 
IFM_ETH_RXPAUSE;
                }
        } else
-               mii->mii_media_active = ife->ifm_media;
+               ifmedia_current(&mii->mii_media, &mii->mii_media_active, NULL);
 }
 
 void
 brgphy_5709s_status(struct mii_softc *sc)
 {
        struct mii_data *mii = sc->mii_pdata;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
        int bmcr, bmsr;
 
        mii->mii_media_status = IFM_AVALID;
@@ -707,7 +705,7 @@ brgphy_5709s_status(struct mii_softc *sc
                if (mii->mii_media_active & IFM_FDX)
                        mii->mii_media_active |= mii_phy_flowstatus(sc);
        } else
-               mii->mii_media_active = ife->ifm_media;
+               ifmedia_current(&mii->mii_media, &mii->mii_media_active, NULL);
 }
 
 int
Index: dev/mii/brswphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/brswphy.c,v
retrieving revision 1.4
diff -u -p -r1.4 brswphy.c
--- dev/mii/brswphy.c   6 Apr 2022 18:59:29 -0000       1.4
+++ dev/mii/brswphy.c   14 Jul 2022 19:22:34 -0000
@@ -231,18 +231,20 @@ brswphyattach(struct device *parent, str
 int
 brswphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int reg;
 
        if ((sc->mii_dev.dv_flags & DVF_ACTIVE) == 0)
                return (ENXIO);
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -251,7 +253,7 @@ brswphy_service(struct mii_softc *sc, st
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
+               if (IFM_INST(media) != sc->mii_inst) {
                        reg = PHY_READ(sc, MII_BMCR);
                        PHY_WRITE(sc, MII_BMCR, reg | BMCR_ISO);
                        return (0);
@@ -270,7 +272,7 @@ brswphy_service(struct mii_softc *sc, st
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                if (mii_phy_tick(sc) == EJUSTRETURN)
Index: dev/mii/ciphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/ciphy.c,v
retrieving revision 1.28
diff -u -p -r1.28 ciphy.c
--- dev/mii/ciphy.c     6 Apr 2022 18:59:29 -0000       1.28
+++ dev/mii/ciphy.c     14 Jul 2022 18:53:21 -0000
@@ -140,15 +140,17 @@ ciphyattach(struct device *parent, struc
 int
 ciphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int reg, speed, gig;
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -157,7 +159,7 @@ ciphy_service(struct mii_softc *sc, stru
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
+               if (IFM_INST(media) != sc->mii_inst) {
                        reg = PHY_READ(sc, MII_BMCR);
                        PHY_WRITE(sc, MII_BMCR, reg | BMCR_ISO);
                        return (0);
@@ -171,7 +173,7 @@ ciphy_service(struct mii_softc *sc, stru
 
                ciphy_fixup(sc);        /* XXX hardware bug work-around */
 
-               switch (IFM_SUBTYPE(ife->ifm_media)) {
+               switch (IFM_SUBTYPE(media)) {
                case IFM_AUTO:
                        if (mii_phy_auto(sc, 0) == EJUSTRETURN)
                                return (0);
@@ -185,7 +187,7 @@ ciphy_service(struct mii_softc *sc, stru
                case IFM_10_T:
                        speed = BMCR_S10;
 setit:
-                       if ((ife->ifm_media & IFM_GMASK) == IFM_FDX) {
+                       if ((media & IFM_GMASK) == IFM_FDX) {
                                speed |= BMCR_FDX;
                                gig = GTCR_ADV_1000TFDX;
                        } else {
@@ -196,7 +198,7 @@ setit:
                        PHY_WRITE(sc, MII_BMCR, speed);
                        PHY_WRITE(sc, MII_ANAR, ANAR_CSMA);
 
-                       if (IFM_SUBTYPE(ife->ifm_media) != IFM_1000_T) 
+                       if (IFM_SUBTYPE(media) != IFM_1000_T) 
                                break;
 
                        PHY_WRITE(sc, MII_100T2CR, gig);
@@ -219,7 +221,7 @@ setit:
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                if (mii_phy_tick(sc) == EJUSTRETURN)
Index: dev/mii/dcphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/dcphy.c,v
retrieving revision 1.26
diff -u -p -r1.26 dcphy.c
--- dev/mii/dcphy.c     6 Apr 2022 18:59:29 -0000       1.26
+++ dev/mii/dcphy.c     14 Jul 2022 18:54:48 -0000
@@ -174,7 +174,7 @@ int
 dcphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
        struct dc_softc *dc_sc;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int reg;
        u_int32_t mode;
 
@@ -183,12 +183,14 @@ dcphy_service(struct mii_softc *sc, stru
 
        dc_sc = mii->mii_ifp->if_softc;
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -197,7 +199,7 @@ dcphy_service(struct mii_softc *sc, stru
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                /*
@@ -212,7 +214,7 @@ dcphy_service(struct mii_softc *sc, stru
                mode &= ~(DC_NETCFG_FULLDUPLEX|DC_NETCFG_PORTSEL|
                    DC_NETCFG_PCS|DC_NETCFG_SCRAMBLER|DC_NETCFG_SPEEDSEL);
 
-               switch (IFM_SUBTYPE(ife->ifm_media)) {
+               switch (IFM_SUBTYPE(media)) {
                case IFM_AUTO:
                        /*PHY_RESET(sc);*/
                        sc->mii_flags &= ~MIIF_DOINGAUTO;
@@ -223,7 +225,7 @@ dcphy_service(struct mii_softc *sc, stru
                        DC_CLRBIT(dc_sc, DC_10BTCTRL, DC_TCTL_AUTONEGENBL);
                        mode |= DC_NETCFG_PORTSEL|DC_NETCFG_PCS|
                            DC_NETCFG_SCRAMBLER;
-                       if ((ife->ifm_media & IFM_GMASK) == IFM_FDX)
+                       if ((media & IFM_GMASK) == IFM_FDX)
                                mode |= DC_NETCFG_FULLDUPLEX;
                        else
                                mode &= ~DC_NETCFG_FULLDUPLEX;
@@ -232,7 +234,7 @@ dcphy_service(struct mii_softc *sc, stru
                case IFM_10_T:
                        DC_CLRBIT(dc_sc, DC_SIARESET, DC_SIA_RESET);
                        DC_CLRBIT(dc_sc, DC_10BTCTRL, 0xFFFF);
-                       if ((ife->ifm_media & IFM_GMASK) == IFM_FDX)
+                       if ((media & IFM_GMASK) == IFM_FDX)
                                DC_SETBIT(dc_sc, DC_10BTCTRL, 0x7F3D);
                        else
                                DC_SETBIT(dc_sc, DC_10BTCTRL, 0x7F3F);
@@ -240,7 +242,7 @@ dcphy_service(struct mii_softc *sc, stru
                        DC_CLRBIT(dc_sc, DC_10BTCTRL, DC_TCTL_AUTONEGENBL);
                        mode &= ~DC_NETCFG_PORTSEL;
                        mode |= DC_NETCFG_SPEEDSEL;
-                       if ((ife->ifm_media & IFM_GMASK) == IFM_FDX)
+                       if ((media & IFM_GMASK) == IFM_FDX)
                                mode |= DC_NETCFG_FULLDUPLEX;
                        else
                                mode &= ~DC_NETCFG_FULLDUPLEX;
@@ -255,7 +257,7 @@ dcphy_service(struct mii_softc *sc, stru
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                /*
@@ -267,7 +269,7 @@ dcphy_service(struct mii_softc *sc, stru
                /*
                 * Only used for autonegotiation.
                 */
-               if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO)
+               if (IFM_SUBTYPE(media) != IFM_AUTO)
                        break;
 
                reg = CSR_READ_4(dc_sc, DC_10BTSTAT);
Index: dev/mii/eephy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/eephy.c,v
retrieving revision 1.60
diff -u -p -r1.60 eephy.c
--- dev/mii/eephy.c     6 Apr 2022 18:59:29 -0000       1.60
+++ dev/mii/eephy.c     14 Jul 2022 18:55:57 -0000
@@ -301,18 +301,20 @@ eephy_reset(struct mii_softc *sc)
 int
 eephy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int bmcr;
 
        if ((sc->mii_dev.dv_flags & DVF_ACTIVE) == 0)
                return (ENXIO);
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -321,7 +323,7 @@ eephy_service(struct mii_softc *sc, stru
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
+               if (IFM_INST(media) != sc->mii_inst) {
                        bmcr = PHY_READ(sc, E1000_CR);
                        PHY_WRITE(sc, E1000_CR, bmcr | E1000_CR_ISOLATE);
                        return (0);
@@ -339,7 +341,7 @@ eephy_service(struct mii_softc *sc, stru
                 * If autonegotiation is not enabled, we need a
                 * software reset for the settings to take effect.
                 */
-               if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO) {
+               if (IFM_SUBTYPE(media) != IFM_AUTO) {
                        bmcr = PHY_READ(sc, E1000_CR);
                        PHY_WRITE(sc, E1000_CR, bmcr | E1000_CR_RESET);
                }
@@ -349,7 +351,7 @@ eephy_service(struct mii_softc *sc, stru
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                if (mii_phy_tick(sc) == EJUSTRETURN)
Index: dev/mii/etphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/etphy.c,v
retrieving revision 1.8
diff -u -p -r1.8 etphy.c
--- dev/mii/etphy.c     6 Apr 2022 18:59:29 -0000       1.8
+++ dev/mii/etphy.c     14 Jul 2022 19:00:51 -0000
@@ -183,15 +183,17 @@ etphy_attach(struct device *parent, stru
 int
 etphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int bmcr;
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return 0;
                break;
 
@@ -200,7 +202,7 @@ etphy_service(struct mii_softc *sc, stru
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
+               if (IFM_INST(media) != sc->mii_inst) {
                        bmcr = PHY_READ(sc, MII_BMCR);
                        PHY_WRITE(sc, MII_BMCR, bmcr | BMCR_ISO);
                        return 0;
@@ -212,7 +214,7 @@ etphy_service(struct mii_softc *sc, stru
                if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
                        break;
 
-               if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO) {
+               if (IFM_SUBTYPE(media) != IFM_AUTO) {
                        bmcr = PHY_READ(sc, MII_BMCR) & ~BMCR_AUTOEN;
                        PHY_WRITE(sc, MII_BMCR, bmcr);
                        PHY_WRITE(sc, MII_BMCR, bmcr | BMCR_PDOWN);
@@ -220,11 +222,11 @@ etphy_service(struct mii_softc *sc, stru
 
                mii_phy_setmedia(sc);
 
-               if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO) {
+               if (IFM_SUBTYPE(media) != IFM_AUTO) {
                        bmcr = PHY_READ(sc, MII_BMCR) & ~BMCR_PDOWN;
                        PHY_WRITE(sc, MII_BMCR, bmcr);
 
-                       if (IFM_SUBTYPE(ife->ifm_media) == IFM_1000_T) {
+                       if (IFM_SUBTYPE(media) == IFM_1000_T) {
                                PHY_WRITE(sc, MII_BMCR,
                                          bmcr | BMCR_AUTOEN | BMCR_STARTNEG);
                        }
@@ -235,7 +237,7 @@ etphy_service(struct mii_softc *sc, stru
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return 0;
 
                if (mii_phy_tick(sc) == EJUSTRETURN)
Index: dev/mii/exphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/exphy.c,v
retrieving revision 1.24
diff -u -p -r1.24 exphy.c
--- dev/mii/exphy.c     6 Apr 2022 18:59:29 -0000       1.24
+++ dev/mii/exphy.c     14 Jul 2022 19:01:17 -0000
@@ -148,15 +148,17 @@ exphyattach(struct device *parent, struc
 int
 exphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
 
        if ((sc->mii_dev.dv_flags & DVF_ACTIVE) == 0)
                return (ENXIO);
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        /*
         * We can't isolate the 3Com PHY, so it has to be the only one!
         */
-       if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+       if (IFM_INST(media) != sc->mii_inst)
                panic("exphy_service: can't isolate 3Com PHY");
 
        switch (cmd) {
Index: dev/mii/gentbi.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/gentbi.c,v
retrieving revision 1.12
diff -u -p -r1.12 gentbi.c
--- dev/mii/gentbi.c    6 Apr 2022 18:59:29 -0000       1.12
+++ dev/mii/gentbi.c    14 Jul 2022 19:03:39 -0000
@@ -164,15 +164,17 @@ gentbiattach(struct device *parent, stru
 int
 gentbi_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int reg;
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -181,7 +183,7 @@ gentbi_service(struct mii_softc *sc, str
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
+               if (IFM_INST(media) != sc->mii_inst) {
                        reg = PHY_READ(sc, MII_BMCR);
                        PHY_WRITE(sc, MII_BMCR, reg | BMCR_ISO);
                        return (0);
@@ -200,7 +202,7 @@ gentbi_service(struct mii_softc *sc, str
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                if (mii_phy_tick(sc) == EJUSTRETURN)
@@ -224,7 +226,6 @@ void
 gentbi_status(struct mii_softc *sc)
 {
        struct mii_data *mii = sc->mii_pdata;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
        int bmsr, bmcr, anlpar;
 
        mii->mii_media_status = IFM_AVALID;
@@ -268,5 +269,5 @@ gentbi_status(struct mii_softc *sc)
                        mii->mii_media_active |=
                            mii_phy_flowstatus(sc) | IFM_FDX;
        } else
-               mii->mii_media_active = ife->ifm_media;
+               ifmedia_current(&mii->mii_media, &mii->mii_media_active, NULL);
 }
Index: dev/mii/icsphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/icsphy.c,v
retrieving revision 1.25
diff -u -p -r1.25 icsphy.c
--- dev/mii/icsphy.c    6 Apr 2022 18:59:29 -0000       1.25
+++ dev/mii/icsphy.c    14 Jul 2022 19:04:47 -0000
@@ -147,18 +147,20 @@ icsphyattach(struct device *parent, stru
 int
 icsphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int reg;
 
        if ((sc->mii_dev.dv_flags & DVF_ACTIVE) == 0)
                return (ENXIO);
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -167,7 +169,7 @@ icsphy_service(struct mii_softc *sc, str
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
+               if (IFM_INST(media) != sc->mii_inst) {
                        reg = PHY_READ(sc, MII_BMCR);
                        PHY_WRITE(sc, MII_BMCR, reg | BMCR_ISO);
                        return (0);
@@ -186,7 +188,7 @@ icsphy_service(struct mii_softc *sc, str
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                if (mii_phy_tick(sc) == EJUSTRETURN)
@@ -210,7 +212,6 @@ void
 icsphy_status(struct mii_softc *sc)
 {
        struct mii_data *mii = sc->mii_pdata;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
        int bmcr, qpr;
 
        mii->mii_media_status = IFM_AVALID;
@@ -254,7 +255,7 @@ icsphy_status(struct mii_softc *sc)
                else
                        mii->mii_media_active |= IFM_HDX;
        } else
-               mii->mii_media_active = ife->ifm_media;
+               ifmedia_current(&mii->mii_media, &mii->mii_media_active, NULL);
 }
 
 void
Index: dev/mii/inphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/inphy.c,v
retrieving revision 1.23
diff -u -p -r1.23 inphy.c
--- dev/mii/inphy.c     6 Apr 2022 18:59:29 -0000       1.23
+++ dev/mii/inphy.c     14 Jul 2022 19:05:45 -0000
@@ -147,18 +147,20 @@ inphyattach(struct device *parent, struc
 int
 inphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int reg;
 
        if ((sc->mii_dev.dv_flags & DVF_ACTIVE) == 0)
                return (ENXIO);
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -167,7 +169,7 @@ inphy_service(struct mii_softc *sc, stru
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
+               if (IFM_INST(media) != sc->mii_inst) {
                        reg = PHY_READ(sc, MII_BMCR);
                        PHY_WRITE(sc, MII_BMCR, reg | BMCR_ISO);
                        return (0);
@@ -186,7 +188,7 @@ inphy_service(struct mii_softc *sc, stru
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                if (mii_phy_tick(sc) == EJUSTRETURN)
@@ -210,7 +212,6 @@ void
 inphy_status(struct mii_softc *sc)
 {
        struct mii_data *mii = sc->mii_pdata;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
        int bmsr, bmcr, scr;
 
        mii->mii_media_status = IFM_AVALID;
@@ -251,5 +252,5 @@ inphy_status(struct mii_softc *sc)
                else
                        mii->mii_media_active |= IFM_HDX;
        } else
-               mii->mii_media_active = ife->ifm_media;
+               ifmedia_current(&mii->mii_media, &mii->mii_media_active, NULL);
 }
Index: dev/mii/iophy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/iophy.c,v
retrieving revision 1.22
diff -u -p -r1.22 iophy.c
--- dev/mii/iophy.c     6 Apr 2022 18:59:29 -0000       1.22
+++ dev/mii/iophy.c     14 Jul 2022 19:06:27 -0000
@@ -142,18 +142,20 @@ iophyattach(struct device *parent, struc
 int
 iophy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int reg;
 
        if ((sc->mii_dev.dv_flags & DVF_ACTIVE) == 0)
                return (ENXIO);
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -162,7 +164,7 @@ iophy_service(struct mii_softc *sc, stru
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
+               if (IFM_INST(media) != sc->mii_inst) {
                        reg = PHY_READ(sc, MII_BMCR);
                        PHY_WRITE(sc, MII_BMCR, reg | BMCR_ISO);
                        return (0);
@@ -181,7 +183,7 @@ iophy_service(struct mii_softc *sc, stru
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                if (mii_phy_tick(sc) == EJUSTRETURN)
@@ -205,7 +207,6 @@ void
 iophy_status(struct mii_softc *sc)
 {
        struct mii_data *mii = sc->mii_pdata;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
        int bmsr, bmcr, ext0;
 
        mii->mii_media_status = IFM_AVALID;
@@ -248,5 +249,5 @@ iophy_status(struct mii_softc *sc)
                else
                        mii->mii_media_active |= IFM_HDX;
        } else
-               mii->mii_media_active = ife->ifm_media;
+               ifmedia_current(&mii->mii_media, &mii->mii_media_active, NULL);
 }
Index: dev/mii/ipgphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/ipgphy.c,v
retrieving revision 1.20
diff -u -p -r1.20 ipgphy.c
--- dev/mii/ipgphy.c    6 Apr 2022 18:59:29 -0000       1.20
+++ dev/mii/ipgphy.c    14 Jul 2022 19:07:55 -0000
@@ -130,15 +130,17 @@ ipgphy_attach(struct device *parent, str
 int
 ipgphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        uint32_t gig, reg, speed;
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -147,7 +149,7 @@ ipgphy_service(struct mii_softc *sc, str
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
+               if (IFM_INST(media) != sc->mii_inst) {
                        reg = PHY_READ(sc, MII_BMCR);
                        PHY_WRITE(sc, MII_BMCR, reg | BMCR_ISO);
                        return (0);
@@ -161,7 +163,7 @@ ipgphy_service(struct mii_softc *sc, str
 
                PHY_RESET(sc);
 
-               switch (IFM_SUBTYPE(ife->ifm_media)) {
+               switch (IFM_SUBTYPE(media)) {
                case IFM_AUTO:
                        (void)ipgphy_mii_phy_auto(sc);
                        goto done;
@@ -187,7 +189,7 @@ ipgphy_service(struct mii_softc *sc, str
                        return (EINVAL);
                }
 
-               if (((ife->ifm_media & IFM_GMASK) & IFM_FDX) != 0) {
+               if (((media & IFM_GMASK) & IFM_FDX) != 0) {
                        speed |= BMCR_FDX;
                        gig = GTCR_ADV_1000TFDX;
                } else
@@ -196,7 +198,7 @@ ipgphy_service(struct mii_softc *sc, str
                PHY_WRITE(sc, MII_100T2CR, 0);
                PHY_WRITE(sc, MII_BMCR, speed);
 
-               if (IFM_SUBTYPE(ife->ifm_media) != IFM_1000_T)
+               if (IFM_SUBTYPE(media) != IFM_1000_T)
                        break;
 
                PHY_WRITE(sc, MII_100T2CR, gig);
@@ -214,7 +216,7 @@ done:
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                /*
@@ -226,7 +228,7 @@ done:
                /*
                 * Only used for autonegotiation.
                 */
-               if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO) {
+               if (IFM_SUBTYPE(media) != IFM_AUTO) {
                        sc->mii_ticks = 0;
                        break;
                }
@@ -267,7 +269,6 @@ void
 ipgphy_status(struct mii_softc *sc)
 {
        struct mii_data *mii = sc->mii_pdata;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
        uint32_t bmsr, bmcr, stat;
 
        mii->mii_media_status = IFM_AVALID;
@@ -343,7 +344,7 @@ ipgphy_status(struct mii_softc *sc)
                                mii->mii_media_active |= IFM_ETH_MASTER;
                }
        } else
-               mii->mii_media_active = ife->ifm_media;
+               ifmedia_current(&mii->mii_media, &mii->mii_media_active, NULL);
 }
 
 int
Index: dev/mii/jmphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/jmphy.c,v
retrieving revision 1.7
diff -u -p -r1.7 jmphy.c
--- dev/mii/jmphy.c     6 Apr 2022 18:59:29 -0000       1.7
+++ dev/mii/jmphy.c     14 Jul 2022 19:10:34 -0000
@@ -52,8 +52,8 @@ void  jmphy_status(struct mii_softc *);
 int    jmphy_match(struct device *, void *, void *);
 void   jmphy_attach(struct device *, struct device *, void *);
 void   jmphy_reset(struct mii_softc *);
-uint16_t       jmphy_anar(struct ifmedia_entry *);
-int    jmphy_auto(struct mii_softc *, struct ifmedia_entry *);
+uint16_t       jmphy_anar(uint64_t);
+int    jmphy_auto(struct mii_softc *, uint64_t);
 
 const struct mii_phy_funcs jmphy_funcs = {
        jmphy_service, jmphy_status, jmphy_reset,
@@ -124,15 +124,17 @@ jmphy_attach(struct device *parent, stru
 int
 jmphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        uint16_t bmcr;
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -141,7 +143,7 @@ jmphy_service(struct mii_softc *sc, stru
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
+               if (IFM_INST(media) != sc->mii_inst) {
                        bmcr = PHY_READ(sc, MII_BMCR);
                        PHY_WRITE(sc, MII_BMCR, bmcr | BMCR_ISO);
                        return (0);
@@ -153,7 +155,7 @@ jmphy_service(struct mii_softc *sc, stru
                if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
                        break;
 
-               if (jmphy_auto(sc, ife) != EJUSTRETURN)
+               if (jmphy_auto(sc, media) != EJUSTRETURN)
                        return (EINVAL);
                break;
 
@@ -161,7 +163,7 @@ jmphy_service(struct mii_softc *sc, stru
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                /*
@@ -173,7 +175,7 @@ jmphy_service(struct mii_softc *sc, stru
                /*
                 * Only used for autonegotiation.
                 */
-               if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO)
+               if (IFM_SUBTYPE(media) != IFM_AUTO)
                        break;
 
                /* Check for link. */
@@ -189,7 +191,7 @@ jmphy_service(struct mii_softc *sc, stru
                        return (0);
 
                sc->mii_ticks = 0;
-               jmphy_auto(sc, ife);
+               jmphy_auto(sc, media);
                break;
        }
 
@@ -282,12 +284,12 @@ jmphy_reset(struct mii_softc *sc)
 }
 
 uint16_t
-jmphy_anar(struct ifmedia_entry *ife)
+jmphy_anar(uint64_t media)
 {
        uint16_t anar;
 
        anar = 0;
-       switch (IFM_SUBTYPE(ife->ifm_media)) {
+       switch (IFM_SUBTYPE(media)) {
        case IFM_AUTO:
                anar |= ANAR_TX_FD | ANAR_TX | ANAR_10_FD | ANAR_10;
                break;
@@ -307,13 +309,13 @@ jmphy_anar(struct ifmedia_entry *ife)
 }
 
 int
-jmphy_auto(struct mii_softc *sc, struct ifmedia_entry *ife)
+jmphy_auto(struct mii_softc *sc, uint64_t media)
 {
        uint16_t anar, bmcr, gig;
 
        gig = 0;
        bmcr = PHY_READ(sc, MII_BMCR);
-       switch (IFM_SUBTYPE(ife->ifm_media)) {
+       switch (IFM_SUBTYPE(media)) {
        case IFM_AUTO:
                gig |= GTCR_ADV_1000TFDX | GTCR_ADV_1000THDX;
                break;
@@ -330,10 +332,10 @@ jmphy_auto(struct mii_softc *sc, struct 
                return (EINVAL);
        }
 
-       if ((ife->ifm_media & IFM_LOOP) != 0)
+       if ((media & IFM_LOOP) != 0)
                bmcr |= BMCR_LOOP;
 
-       anar = jmphy_anar(ife);
+       anar = jmphy_anar(media);
        if (sc->mii_flags & MIIF_DOPAUSE)
                anar |= ANAR_PAUSE_TOWARDS;
 
Index: dev/mii/luphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/luphy.c,v
retrieving revision 1.7
diff -u -p -r1.7 luphy.c
--- dev/mii/luphy.c     6 Apr 2022 18:59:29 -0000       1.7
+++ dev/mii/luphy.c     14 Jul 2022 19:11:08 -0000
@@ -120,14 +120,16 @@ luphyattach(struct device *parent, struc
 int
 luphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
+
+       ifmedia_current(&mii->mii_media, &media, NULL);
 
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -137,7 +139,7 @@ luphy_service(struct mii_softc *sc, stru
                 * just return. Isolating unused PHYs from the bus
                 * causes at least the MII bus of the HME to wedge.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                /*
@@ -153,7 +155,7 @@ luphy_service(struct mii_softc *sc, stru
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                if (mii_phy_tick(sc) == EJUSTRETURN)
Index: dev/mii/lxtphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/lxtphy.c,v
retrieving revision 1.23
diff -u -p -r1.23 lxtphy.c
--- dev/mii/lxtphy.c    6 Apr 2022 18:59:29 -0000       1.23
+++ dev/mii/lxtphy.c    14 Jul 2022 19:14:03 -0000
@@ -156,18 +156,20 @@ lxtphyattach(struct device *parent, stru
 int
 lxtphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int reg;
 
        if ((sc->mii_dev.dv_flags & DVF_ACTIVE) == 0)
                return (ENXIO);
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -176,7 +178,7 @@ lxtphy_service(struct mii_softc *sc, str
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
+               if (IFM_INST(media) != sc->mii_inst) {
                        reg = PHY_READ(sc, MII_BMCR);
                        PHY_WRITE(sc, MII_BMCR, reg | BMCR_ISO);
                        return (0);
@@ -195,7 +197,7 @@ lxtphy_service(struct mii_softc *sc, str
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                if (mii_phy_tick(sc) == EJUSTRETURN)
@@ -219,7 +221,6 @@ void
 lxtphy_status(struct mii_softc *sc)
 {
        struct mii_data *mii = sc->mii_pdata;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
        int bmcr, bmsr, csr;
 
        mii->mii_media_status = IFM_AVALID;
@@ -261,7 +262,7 @@ lxtphy_status(struct mii_softc *sc)
                else
                        mii->mii_media_active |= IFM_HDX;
        } else
-               mii->mii_media_active = ife->ifm_media;
+               ifmedia_current(&mii->mii_media, &mii->mii_media_active, NULL);
 }
 
 void
Index: dev/mii/mii_physubr.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/mii_physubr.c,v
retrieving revision 1.46
diff -u -p -r1.46 mii_physubr.c
--- dev/mii/mii_physubr.c       15 Jan 2020 00:14:47 -0000      1.46
+++ dev/mii/mii_physubr.c       14 Jul 2022 19:16:10 -0000
@@ -80,10 +80,13 @@ void
 mii_phy_setmedia(struct mii_softc *sc)
 {
        struct mii_data *mii = sc->mii_pdata;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
+       u_int data;
        int bmcr, anar, gtcr;
 
-       if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) {
+       ifmedia_current(&mii->mii_media, &media, &data);
+
+       if (IFM_SUBTYPE(media) == IFM_AUTO) {
                if ((PHY_READ(sc, MII_BMCR) & BMCR_AUTOEN) == 0 ||
                    (sc->mii_flags & MIIF_FORCEANEG))
                        (void) mii_phy_auto(sc, 1);
@@ -94,16 +97,16 @@ mii_phy_setmedia(struct mii_softc *sc)
         * Table index is stored in the media entry.
         */
 #ifdef DIAGNOSTIC
-       if (ife->ifm_data >= MII_NMEDIA)
+       if (data >= MII_NMEDIA)
                panic("mii_phy_setmedia");
 #endif
 
-       anar = mii_media_table[ife->ifm_data].mm_anar;
-       bmcr = mii_media_table[ife->ifm_data].mm_bmcr;
-       gtcr = mii_media_table[ife->ifm_data].mm_gtcr;
+       anar = mii_media_table[data].mm_anar;
+       bmcr = mii_media_table[data].mm_bmcr;
+       gtcr = mii_media_table[data].mm_gtcr;
 
        if (mii->mii_media.ifm_media & IFM_ETH_MASTER) {
-               switch (IFM_SUBTYPE(ife->ifm_media)) {
+               switch (IFM_SUBTYPE(media)) {
                case IFM_1000_T:
                        gtcr |= GTCR_MAN_MS|GTCR_ADV_MS;
                        break;
@@ -113,7 +116,7 @@ mii_phy_setmedia(struct mii_softc *sc)
                }
        }
 
-       if (ife->ifm_media & IFM_LOOP)
+       if (media & IFM_LOOP)
                bmcr |= BMCR_LOOP;
 
        PHY_WRITE(sc, MII_ANAR, anar);
@@ -231,20 +234,22 @@ int
 mii_phy_tick(struct mii_softc *sc)
 {
        struct mii_data *mii = sc->mii_pdata;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int reg;
 
        /* Just bail now if the interface is down. */
        if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
                return (EJUSTRETURN);
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        /*
         * If we're not doing autonegotiation, we don't need to do
         * any extra work here.  However, we need to check the link
         * status so we can generate an announcement if the status
         * changes.
         */
-       if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO)
+       if (IFM_SUBTYPE(media) != IFM_AUTO)
                return (0);
 
        /* Read the status register twice; BMSR_LINK is latch-low. */
Index: dev/mii/mlphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/mlphy.c,v
retrieving revision 1.6
diff -u -p -r1.6 mlphy.c
--- dev/mii/mlphy.c     6 Apr 2022 18:59:29 -0000       1.6
+++ dev/mii/mlphy.c     14 Jul 2022 19:21:04 -0000
@@ -200,9 +200,10 @@ mlphy_attach(struct device *parent, stru
 int
 mlphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
        struct mii_softc *other = NULL;
        struct mlphy_softc *msc = (struct mlphy_softc *)sc;
+       uint64_t media;
+       u_int data;
        int other_inst, reg;
 
        LIST_FOREACH(other, &mii->mii_phys, mii_list)
@@ -212,12 +213,14 @@ mlphy_service(struct mii_softc *sc, stru
        if ((sc->mii_dev.dv_flags & DVF_ACTIVE) == 0)
                return (ENXIO);
 
+       ifmedia_current(&mii->mii_media, &media, &data);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -228,7 +231,7 @@ mlphy_service(struct mii_softc *sc, stru
                if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
                        break;
 
-               switch (IFM_SUBTYPE(ife->ifm_media)) {
+               switch (IFM_SUBTYPE(media)) {
                case IFM_AUTO:
                        msc->ml_state = ML_STATE_AUTO_SELF;         
                        if (other != NULL) {
@@ -249,7 +252,7 @@ mlphy_service(struct mii_softc *sc, stru
                         */
                        if (other != NULL) {
                                mii_phy_reset(other);
-                               PHY_WRITE(other, MII_BMCR, ife->ifm_data);
+                               PHY_WRITE(other, MII_BMCR, data);
                        }
                        mii_phy_setmedia(sc);
                        msc->ml_state = 0;
@@ -282,7 +285,7 @@ mlphy_service(struct mii_softc *sc, stru
                /*
                 * Only used for autonegotiation.
                 */
-               if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO)
+               if (IFM_SUBTYPE(media) != IFM_AUTO)
                        break;
                /*
                 * Check to see if we have link.  If we do, we don't
@@ -336,7 +339,7 @@ mlphy_service(struct mii_softc *sc, stru
        if (msc->ml_state == ML_STATE_AUTO_OTHER && other != NULL) {
                other_inst = other->mii_inst;
                other->mii_inst = sc->mii_inst;
-               if (IFM_INST(ife->ifm_media) == other->mii_inst)
+               if (IFM_INST(media) == other->mii_inst)
                        (void) PHY_SERVICE(other, mii, MII_POLLSTAT);
                other->mii_inst = other_inst;
                sc->mii_media_active = other->mii_media_active;
Index: dev/mii/mtdphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/mtdphy.c,v
retrieving revision 1.16
diff -u -p -r1.16 mtdphy.c
--- dev/mii/mtdphy.c    6 Apr 2022 18:59:29 -0000       1.16
+++ dev/mii/mtdphy.c    14 Jul 2022 19:21:48 -0000
@@ -109,18 +109,20 @@ mtdphyattach(struct device *parent, stru
 int
 mtdphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int reg;
 
        if ((sc->mii_dev.dv_flags & DVF_ACTIVE) == 0)
                return (ENXIO);
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -128,7 +130,7 @@ mtdphy_service(struct mii_softc *sc, str
                /*
                 * If the interface is not up, don't do anything.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
+               if (IFM_INST(media) != sc->mii_inst) {
                        reg = PHY_READ(sc, MII_BMCR);
                        PHY_WRITE(sc, MII_BMCR, reg | BMCR_ISO);
                        return (0);
@@ -144,7 +146,7 @@ mtdphy_service(struct mii_softc *sc, str
                /*
                 *If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                if (mii_phy_tick(sc) == EJUSTRETURN)
Index: dev/mii/nsgphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/nsgphy.c,v
retrieving revision 1.26
diff -u -p -r1.26 nsgphy.c
--- dev/mii/nsgphy.c    6 Apr 2022 18:59:29 -0000       1.26
+++ dev/mii/nsgphy.c    14 Jul 2022 19:23:21 -0000
@@ -153,18 +153,20 @@ nsgphyattach(struct device *parent, stru
 int
 nsgphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int reg;
 
        if ((sc->mii_dev.dv_flags & DVF_ACTIVE) == 0)
                return (ENXIO);
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -173,7 +175,7 @@ nsgphy_service(struct mii_softc *sc, str
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
+               if (IFM_INST(media) != sc->mii_inst) {
                        reg = PHY_READ(sc, MII_BMCR);
                        PHY_WRITE(sc, MII_BMCR, reg | BMCR_ISO);
                        return (0);
@@ -192,7 +194,7 @@ nsgphy_service(struct mii_softc *sc, str
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                if (mii_phy_tick(sc) == EJUSTRETURN)
@@ -215,7 +217,6 @@ void
 nsgphy_status(struct mii_softc *sc)
 {
        struct mii_data *mii = sc->mii_pdata;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
        int bmsr, bmcr, physup, gtsr;
 
        mii->mii_media_status = IFM_AVALID;
@@ -272,5 +273,5 @@ nsgphy_status(struct mii_softc *sc)
                else
                        mii->mii_media_active |= IFM_HDX;
        } else
-               mii->mii_media_active = ife->ifm_media;
+               ifmedia_current(&mii->mii_media, &mii->mii_media_active, NULL);
 }
Index: dev/mii/nsphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/nsphy.c,v
retrieving revision 1.29
diff -u -p -r1.29 nsphy.c
--- dev/mii/nsphy.c     6 Apr 2022 18:59:29 -0000       1.29
+++ dev/mii/nsphy.c     14 Jul 2022 19:23:47 -0000
@@ -143,18 +143,20 @@ nsphyattach(struct device *parent, struc
 int
 nsphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int reg;
 
        if ((sc->mii_dev.dv_flags & DVF_ACTIVE) == 0)
                return (ENXIO);
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -163,7 +165,7 @@ nsphy_service(struct mii_softc *sc, stru
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
+               if (IFM_INST(media) != sc->mii_inst) {
                        reg = PHY_READ(sc, MII_BMCR);
                        PHY_WRITE(sc, MII_BMCR, reg | BMCR_ISO);
                        return (0);
@@ -212,7 +214,7 @@ nsphy_service(struct mii_softc *sc, stru
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                if (mii_phy_tick(sc) == EJUSTRETURN)
@@ -236,7 +238,6 @@ void
 nsphy_status(struct mii_softc *sc)
 {
        struct mii_data *mii = sc->mii_pdata;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
        int bmsr, bmcr, par, anlpar;
 
        mii->mii_media_status = IFM_AVALID;
@@ -303,7 +304,7 @@ nsphy_status(struct mii_softc *sc)
                        mii->mii_media_active |= IFM_100_TX;
                mii->mii_media_active |= IFM_HDX;
        } else
-               mii->mii_media_active = ife->ifm_media;
+               ifmedia_current(&mii->mii_media, &mii->mii_media_active, NULL);
 }
 
 void
Index: dev/mii/nsphyter.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/nsphyter.c,v
retrieving revision 1.20
diff -u -p -r1.20 nsphyter.c
--- dev/mii/nsphyter.c  6 Apr 2022 18:59:29 -0000       1.20
+++ dev/mii/nsphyter.c  14 Jul 2022 19:24:16 -0000
@@ -146,18 +146,20 @@ nsphyterattach(struct device *parent, st
 int
 nsphyter_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int reg;
 
        if ((sc->mii_dev.dv_flags & DVF_ACTIVE) == 0)
                return (ENXIO);
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -166,7 +168,7 @@ nsphyter_service(struct mii_softc *sc, s
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
+               if (IFM_INST(media) != sc->mii_inst) {
                        reg = PHY_READ(sc, MII_BMCR);
                        PHY_WRITE(sc, MII_BMCR, reg | BMCR_ISO);
                        return (0);
@@ -185,7 +187,7 @@ nsphyter_service(struct mii_softc *sc, s
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                if (mii_phy_tick(sc) == EJUSTRETURN)
@@ -209,7 +211,6 @@ void
 nsphyter_status(struct mii_softc *sc)
 {
        struct mii_data *mii = sc->mii_pdata;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
        int bmsr, bmcr, physts;
 
        mii->mii_media_status = IFM_AVALID;
@@ -252,5 +253,5 @@ nsphyter_status(struct mii_softc *sc)
                else
                        mii->mii_media_active |= IFM_HDX;
        } else
-               mii->mii_media_active = ife->ifm_media;
+               ifmedia_current(&mii->mii_media, &mii->mii_media_active, NULL);
 }
Index: dev/mii/qsphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/qsphy.c,v
retrieving revision 1.22
diff -u -p -r1.22 qsphy.c
--- dev/mii/qsphy.c     6 Apr 2022 18:59:29 -0000       1.22
+++ dev/mii/qsphy.c     14 Jul 2022 19:24:54 -0000
@@ -141,18 +141,20 @@ qsphyattach(struct device *parent, struc
 int
 qsphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int reg;
 
        if ((sc->mii_dev.dv_flags & DVF_ACTIVE) == 0)
                return (ENXIO);
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -161,7 +163,7 @@ qsphy_service(struct mii_softc *sc, stru
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
+               if (IFM_INST(media) != sc->mii_inst) {
                        reg = PHY_READ(sc, MII_BMCR);
                        PHY_WRITE(sc, MII_BMCR, reg | BMCR_ISO);
                        return (0);
@@ -180,7 +182,7 @@ qsphy_service(struct mii_softc *sc, stru
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                if (mii_phy_tick(sc) == EJUSTRETURN)
@@ -204,7 +206,6 @@ void
 qsphy_status(struct mii_softc *sc)
 {
        struct mii_data *mii = sc->mii_pdata;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
        int bmsr, bmcr, pctl;
 
        mii->mii_media_status = IFM_AVALID;
@@ -255,7 +256,7 @@ qsphy_status(struct mii_softc *sc)
                        break;
                }
        } else
-               mii->mii_media_active = ife->ifm_media;
+               ifmedia_current(&mii->mii_media, &mii->mii_media_active, NULL);
 }
 
 void
Index: dev/mii/rdcphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/rdcphy.c,v
retrieving revision 1.5
diff -u -p -r1.5 rdcphy.c
--- dev/mii/rdcphy.c    19 Apr 2022 03:26:33 -0000      1.5
+++ dev/mii/rdcphy.c    14 Jul 2022 19:26:04 -0000
@@ -161,18 +161,20 @@ int
 rdcphy_service(struct mii_softc *self, struct mii_data *mii, int cmd)
 {
        struct rdcphy_softc *sc = (struct rdcphy_softc *)self;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int reg;
 
        if ((sc->sc_mii.mii_dev.dv_flags & DVF_ACTIVE) == 0)
                return (ENXIO);
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->sc_mii.mii_inst)
+               if (IFM_INST(media) != sc->sc_mii.mii_inst)
                        return (0);
                break;
 
@@ -181,7 +183,7 @@ rdcphy_service(struct mii_softc *self, s
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->sc_mii.mii_inst) {
+               if (IFM_INST(media) != sc->sc_mii.mii_inst) {
                        reg = PHY_READ(&sc->sc_mii, MII_BMCR);
                        PHY_WRITE(&sc->sc_mii, MII_BMCR, reg | BMCR_ISO);
                        return (0);
@@ -194,7 +196,7 @@ rdcphy_service(struct mii_softc *self, s
                        break;
 
                mii_phy_setmedia(&sc->sc_mii);
-               switch (IFM_SUBTYPE(ife->ifm_media)) {
+               switch (IFM_SUBTYPE(media)) {
                case IFM_100_TX:
                case IFM_10_T:
                        /*
@@ -223,13 +225,13 @@ rdcphy_service(struct mii_softc *self, s
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->sc_mii.mii_inst)
+               if (IFM_INST(media) != sc->sc_mii.mii_inst)
                        return (0);
 
                if (mii_phy_tick(&sc->sc_mii) == EJUSTRETURN)
                        return (0);
 
-               if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO) {
+               if (IFM_SUBTYPE(media) != IFM_AUTO) {
                        /*
                         * It seems the PHY hardware does not correctly
                         * report link status changes when manual link
@@ -262,10 +264,7 @@ void
 rdcphy_status(struct mii_softc *sc)
 {
        struct mii_data *mii = sc->mii_pdata;
-       struct ifmedia_entry *ife;
        int bmsr, bmcr, physts;
-
-       ife = mii->mii_media.ifm_cur;
 
        mii->mii_media_status = IFM_AVALID;
        mii->mii_media_active = IFM_ETHER;
Index: dev/mii/rgephy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/rgephy.c,v
retrieving revision 1.41
diff -u -p -r1.41 rgephy.c
--- dev/mii/rgephy.c    6 Apr 2022 18:59:29 -0000       1.41
+++ dev/mii/rgephy.c    14 Jul 2022 19:27:01 -0000
@@ -141,18 +141,20 @@ rgephyattach(struct device *parent, stru
 int
 rgephy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int anar, reg, speed, gig = 0;
        char *devname;
 
        devname = sc->mii_dev.dv_parent->dv_cfdata->cf_driver->cd_name;
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -161,7 +163,7 @@ rgephy_service(struct mii_softc *sc, str
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
+               if (IFM_INST(media) != sc->mii_inst) {
                        reg = PHY_READ(sc, MII_BMCR);
                        PHY_WRITE(sc, MII_BMCR, reg | BMCR_ISO);
                        return (0);
@@ -178,7 +180,7 @@ rgephy_service(struct mii_softc *sc, str
                anar = PHY_READ(sc, MII_ANAR);
                anar &= ~(ANAR_TX_FD | ANAR_TX | ANAR_10_FD | ANAR_10);
 
-               switch (IFM_SUBTYPE(ife->ifm_media)) {
+               switch (IFM_SUBTYPE(media)) {
                case IFM_AUTO:
                        (void) rgephy_mii_phy_auto(sc);
                        break;
@@ -194,19 +196,19 @@ rgephy_service(struct mii_softc *sc, str
                        anar |= ANAR_10_FD | ANAR_10;
 setit:
                        rgephy_loop(sc);
-                       if ((ife->ifm_media & IFM_GMASK) == IFM_FDX) {
+                       if ((media & IFM_GMASK) == IFM_FDX) {
                                speed |= BMCR_FDX;
-                               if (IFM_SUBTYPE(ife->ifm_media) == IFM_1000_T)
+                               if (IFM_SUBTYPE(media) == IFM_1000_T)
                                        gig = GTCR_ADV_1000TFDX;
                                anar &= ~(ANAR_TX | ANAR_10);
                        } else {
-                               if (IFM_SUBTYPE(ife->ifm_media) == IFM_1000_T)
+                               if (IFM_SUBTYPE(media) == IFM_1000_T)
                                        gig = GTCR_ADV_1000THDX;
                                anar &=
                                    ~(ANAR_TX_FD | ANAR_10_FD);
                        }
 
-                       if (IFM_SUBTYPE(ife->ifm_media) == IFM_1000_T &&
+                       if (IFM_SUBTYPE(media) == IFM_1000_T &&
                            mii->mii_media.ifm_media & IFM_ETH_MASTER)
                                gig |= GTCR_MAN_MS|GTCR_ADV_MS;
 
@@ -229,7 +231,7 @@ setit:
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                /*
@@ -241,7 +243,7 @@ setit:
                /*
                 * Only used for autonegotiation.
                 */
-               if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO)
+               if (IFM_SUBTYPE(media) != IFM_AUTO)
                        break;
 
                /*
Index: dev/mii/rlphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/rlphy.c,v
retrieving revision 1.34
diff -u -p -r1.34 rlphy.c
--- dev/mii/rlphy.c     6 Apr 2022 18:59:29 -0000       1.34
+++ dev/mii/rlphy.c     14 Jul 2022 19:28:23 -0000
@@ -142,15 +142,18 @@ rlphyattach(struct device *parent, struc
 int
 rlphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
+       u_int data;
 
        if ((sc->mii_dev.dv_flags & DVF_ACTIVE) == 0)
                return (ENXIO);
 
+       ifmedia_current(&mii->mii_media, &media, &data);
+
        /*
         * Can't isolate the RTL8139 phy, so it has to be the only one.
         */
-       if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+       if (IFM_INST(media) != sc->mii_inst)
                panic("rlphy_service: attempt to isolate phy");
 
        switch (cmd) {
@@ -164,7 +167,7 @@ rlphy_service(struct mii_softc *sc, stru
                if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
                        break;
 
-               switch (IFM_SUBTYPE(ife->ifm_media)) {
+               switch (IFM_SUBTYPE(media)) {
                case IFM_AUTO:
                        /*
                         * If we're already in auto mode, just return.
@@ -183,8 +186,8 @@ rlphy_service(struct mii_softc *sc, stru
                         * BMCR data is stored in the ifmedia entry.
                         */
                        PHY_WRITE(sc, MII_ANAR,
-                           mii_anar(ife->ifm_media));
-                       PHY_WRITE(sc, MII_BMCR, ife->ifm_data);
+                           mii_anar(media));
+                       PHY_WRITE(sc, MII_BMCR, data);
                }
                break;
 
@@ -218,7 +221,6 @@ void
 rlphy_status(struct mii_softc *sc)
 {
        struct mii_data *mii = sc->mii_pdata;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
        int bmsr, bmcr, anlpar;
        char *devname;
 
@@ -311,5 +313,5 @@ rlphy_status(struct mii_softc *sc)
                }
                mii->mii_media_active |= IFM_HDX;
        } else
-               mii->mii_media_active = ife->ifm_media;
+               ifmedia_current(&mii->mii_media, &mii->mii_media_active, NULL);
 }
Index: dev/mii/sqphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/sqphy.c,v
retrieving revision 1.22
diff -u -p -r1.22 sqphy.c
--- dev/mii/sqphy.c     6 Apr 2022 18:59:29 -0000       1.22
+++ dev/mii/sqphy.c     14 Jul 2022 19:28:51 -0000
@@ -144,18 +144,20 @@ sqphyattach(struct device *parent, struc
 int
 sqphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int reg;
 
        if ((sc->mii_dev.dv_flags & DVF_ACTIVE) == 0)
                return (ENXIO);
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -164,7 +166,7 @@ sqphy_service(struct mii_softc *sc, stru
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
+               if (IFM_INST(media) != sc->mii_inst) {
                        reg = PHY_READ(sc, MII_BMCR);
                        PHY_WRITE(sc, MII_BMCR, reg | BMCR_ISO);
                        return (0);
@@ -183,7 +185,7 @@ sqphy_service(struct mii_softc *sc, stru
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                if (mii_phy_tick(sc) == EJUSTRETURN)
@@ -207,7 +209,6 @@ void
 sqphy_status(struct mii_softc *sc)
 {
        struct mii_data *mii = sc->mii_pdata;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
        int bmsr, bmcr, status;
 
        mii->mii_media_status = IFM_AVALID;
@@ -250,5 +251,5 @@ sqphy_status(struct mii_softc *sc)
                else
                        mii->mii_media_active |= IFM_HDX;
        } else
-               mii->mii_media_active = ife->ifm_media;
+               ifmedia_current(&mii->mii_media, &mii->mii_media_active, NULL);
 }
Index: dev/mii/tlphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/tlphy.c,v
retrieving revision 1.22
diff -u -p -r1.22 tlphy.c
--- dev/mii/tlphy.c     6 Apr 2022 18:59:29 -0000       1.22
+++ dev/mii/tlphy.c     14 Jul 2022 19:42:22 -0000
@@ -180,7 +180,7 @@ int
 tlphy_service(struct mii_softc *self, struct mii_data *mii, int cmd)
 {
        struct tlphy_softc *sc = (struct tlphy_softc *)self;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int reg;
 
        if ((sc->sc_mii.mii_dev.dv_flags & DVF_ACTIVE) == 0)
@@ -189,12 +189,14 @@ tlphy_service(struct mii_softc *self, st
        if ((sc->sc_mii.mii_flags & MIIF_DOINGAUTO) == 0 && sc->sc_need_acomp)
                tlphy_acomp(sc);
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->sc_mii.mii_inst)
+               if (IFM_INST(media) != sc->sc_mii.mii_inst)
                        return (0);
                break;
 
@@ -203,7 +205,7 @@ tlphy_service(struct mii_softc *self, st
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->sc_mii.mii_inst) {
+               if (IFM_INST(media) != sc->sc_mii.mii_inst) {
                        reg = PHY_READ(&sc->sc_mii, MII_BMCR);
                        PHY_WRITE(&sc->sc_mii, MII_BMCR, reg | BMCR_ISO);
                        return (0);
@@ -215,7 +217,7 @@ tlphy_service(struct mii_softc *self, st
                if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
                        break;
 
-               switch (IFM_SUBTYPE(ife->ifm_media)) {
+               switch (IFM_SUBTYPE(media)) {
                case IFM_AUTO:
                        /*
                         * The ThunderLAN PHY doesn't self-configure after
@@ -245,7 +247,7 @@ tlphy_service(struct mii_softc *self, st
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->sc_mii.mii_inst)
+               if (IFM_INST(media) != sc->sc_mii.mii_inst)
                        return (0);
 
                if (mii_phy_tick(&sc->sc_mii) == EJUSTRETURN)
@@ -285,7 +287,7 @@ tlphy_status(struct mii_softc *physc)
        tlctrl = PHY_READ(&sc->sc_mii, MII_TLPHY_CTRL);
        if (tlctrl & CTRL_AUISEL) {
                mii->mii_media_status = 0;
-               mii->mii_media_active = mii->mii_media.ifm_cur->ifm_media;
+               ifmedia_current(&mii->mii_media, &mii->mii_media_active, NULL);
                return;
        }
 
Index: dev/mii/tqphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/tqphy.c,v
retrieving revision 1.19
diff -u -p -r1.19 tqphy.c
--- dev/mii/tqphy.c     6 Apr 2022 18:59:29 -0000       1.19
+++ dev/mii/tqphy.c     14 Jul 2022 19:31:43 -0000
@@ -144,18 +144,20 @@ tqphyattach(struct device *parent, struc
 int
 tqphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int reg;
 
        if ((sc->mii_dev.dv_flags & DVF_ACTIVE) == 0)
                return (ENXIO);
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -164,7 +166,7 @@ tqphy_service(struct mii_softc *sc, stru
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
+               if (IFM_INST(media) != sc->mii_inst) {
                        reg = PHY_READ(sc, MII_BMCR);
                        PHY_WRITE(sc, MII_BMCR, reg | BMCR_ISO);
                        return (0);
@@ -183,7 +185,7 @@ tqphy_service(struct mii_softc *sc, stru
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                if (mii_phy_tick(sc) == EJUSTRETURN)
@@ -207,7 +209,6 @@ void
 tqphy_status(struct mii_softc *sc)
 {
        struct mii_data *mii = sc->mii_pdata;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
        int bmsr, bmcr, diag;
 
        mii->mii_media_status = IFM_AVALID;
@@ -245,5 +246,5 @@ tqphy_status(struct mii_softc *sc)
                else
                        mii->mii_media_active |= IFM_HDX;
        } else
-               mii->mii_media_active = ife->ifm_media;
+               ifmedia_current(&mii->mii_media, &mii->mii_media_active, NULL);
 }
Index: dev/mii/txphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/txphy.c,v
retrieving revision 1.12
diff -u -p -r1.12 txphy.c
--- dev/mii/txphy.c     6 Apr 2022 18:59:29 -0000       1.12
+++ dev/mii/txphy.c     14 Jul 2022 19:32:33 -0000
@@ -108,15 +108,17 @@ txphyattach(struct device *parent, struc
 int
 txphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
 
        if ((sc->mii_dev.dv_flags & DVF_ACTIVE) == 0)
                return (ENXIO);
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        /*
         * Can't isolate the RTL8139 phy, so it has to be the only one.
         */
-       if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+       if (IFM_INST(media) != sc->mii_inst)
                panic("txphy_service: attempt to isolate phy");
 
        switch (cmd) {
Index: dev/mii/ukphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/ukphy.c,v
retrieving revision 1.25
diff -u -p -r1.25 ukphy.c
--- dev/mii/ukphy.c     6 Apr 2022 18:59:29 -0000       1.25
+++ dev/mii/ukphy.c     14 Jul 2022 19:32:59 -0000
@@ -140,18 +140,20 @@ ukphyattach(struct device *parent, struc
 int
 ukphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int reg;
 
        if ((sc->mii_dev.dv_flags & DVF_ACTIVE) == 0)
                return (ENXIO);
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -160,7 +162,7 @@ ukphy_service(struct mii_softc *sc, stru
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
+               if (IFM_INST(media) != sc->mii_inst) {
                        reg = PHY_READ(sc, MII_BMCR);
                        PHY_WRITE(sc, MII_BMCR, reg | BMCR_ISO);
                        return (0);
@@ -179,7 +181,7 @@ ukphy_service(struct mii_softc *sc, stru
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                if (mii_phy_tick(sc) == EJUSTRETURN)
Index: dev/mii/ukphy_subr.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/ukphy_subr.c,v
retrieving revision 1.10
diff -u -p -r1.10 ukphy_subr.c
--- dev/mii/ukphy_subr.c        24 Oct 2008 16:50:01 -0000      1.10
+++ dev/mii/ukphy_subr.c        14 Jul 2022 19:33:54 -0000
@@ -55,7 +55,6 @@ void
 ukphy_status(struct mii_softc *phy)
 {
        struct mii_data *mii = phy->mii_pdata;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
        int bmsr, bmcr, anlpar, gtcr, gtsr;
 
        mii->mii_media_status = IFM_AVALID;
@@ -121,5 +120,5 @@ ukphy_status(struct mii_softc *phy)
                    (gtsr & GTSR_MS_RES))
                        mii->mii_media_active |= IFM_ETH_MASTER;
        } else
-               mii->mii_media_active = ife->ifm_media;
+               ifmedia_current(&mii->mii_media, &mii->mii_media_active, NULL);
 }
Index: dev/mii/urlphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/urlphy.c,v
retrieving revision 1.18
diff -u -p -r1.18 urlphy.c
--- dev/mii/urlphy.c    6 Apr 2022 18:59:29 -0000       1.18
+++ dev/mii/urlphy.c    14 Jul 2022 19:33:32 -0000
@@ -132,7 +132,7 @@ urlphy_attach(struct device *parent, str
 int
 urlphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int reg;
 
        DPRINTF(("%s: %s: enter\n", sc->mii_dev.dv_xname, __func__));
@@ -140,12 +140,14 @@ urlphy_service(struct mii_softc *sc, str
        if ((sc->mii_dev.dv_flags & DVF_ACTIVE) == 0)
                return (ENXIO);
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -153,7 +155,7 @@ urlphy_service(struct mii_softc *sc, str
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                /* If the interface is not up, don't do anything. */
@@ -167,7 +169,7 @@ urlphy_service(struct mii_softc *sc, str
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                /* Just bail now if the interface is down. */
@@ -180,7 +182,7 @@ urlphy_service(struct mii_softc *sc, str
                 * status so we can generate an announcement if the status
                 * changes.
                 */
-               if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO)
+               if (IFM_SUBTYPE(media) != IFM_AUTO)
                        return (0);
 
                /* Read the status register twice; MSR_LINK is latch-low. */
@@ -222,7 +224,6 @@ void
 urlphy_status(struct mii_softc *sc)
 {
        struct mii_data *mii = sc->mii_pdata;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
        int msr, bmsr, bmcr;
 
        DPRINTF(("%s: %s: enter\n", sc->mii_dev.dv_xname, __func__));
@@ -260,5 +261,5 @@ urlphy_status(struct mii_softc *sc)
                else
                        mii->mii_media_active |= IFM_HDX;
        } else
-               mii->mii_media_active = ife->ifm_media;
+               ifmedia_current(&mii->mii_media, &mii->mii_media_active, NULL);
 }
Index: dev/mii/xmphy.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/mii/xmphy.c,v
retrieving revision 1.24
diff -u -p -r1.24 xmphy.c
--- dev/mii/xmphy.c     6 Apr 2022 18:59:29 -0000       1.24
+++ dev/mii/xmphy.c     14 Jul 2022 19:34:56 -0000
@@ -135,18 +135,20 @@ xmphy_attach(struct device *parent, stru
 int
 xmphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int reg;
 
        if ((sc->mii_dev.dv_flags & DVF_ACTIVE) == 0)
                return (ENXIO);
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
                break;
 
@@ -155,7 +157,7 @@ xmphy_service(struct mii_softc *sc, stru
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
+               if (IFM_INST(media) != sc->mii_inst) {
                        reg = PHY_READ(sc, MII_BMCR);
                        PHY_WRITE(sc, MII_BMCR, reg | BMCR_ISO);
                        return (0);
@@ -167,13 +169,13 @@ xmphy_service(struct mii_softc *sc, stru
                if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
                        break;
 
-               switch (IFM_SUBTYPE(ife->ifm_media)) {
+               switch (IFM_SUBTYPE(media)) {
                case IFM_AUTO:
                        (void) xmphy_mii_phy_auto(sc);
                        break;
                case IFM_1000_SX:
                        PHY_RESET(sc);
-                       if ((ife->ifm_media & IFM_GMASK) == IFM_FDX) {
+                       if ((media & IFM_GMASK) == IFM_FDX) {
                                PHY_WRITE(sc, MII_ANAR, ANAR_10_FD);
                                PHY_WRITE(sc, MII_BMCR, BMCR_FDX);
                        } else {
@@ -190,7 +192,7 @@ xmphy_service(struct mii_softc *sc, stru
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+               if (IFM_INST(media) != sc->mii_inst)
                        return (0);
 
                /*
@@ -202,7 +204,7 @@ xmphy_service(struct mii_softc *sc, stru
                /*
                 * Only used for autonegotiation.
                 */
-               if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO)
+               if (IFM_SUBTYPE(media) != IFM_AUTO)
                        break;
 
                 /*
Index: dev/pci/if_bge.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/pci/if_bge.c,v
retrieving revision 1.398
diff -u -p -r1.398 if_bge.c
--- dev/pci/if_bge.c    11 Mar 2022 18:00:45 -0000      1.398
+++ dev/pci/if_bge.c    14 Jul 2022 22:30:51 -0000
@@ -1054,12 +1054,15 @@ bge_miibus_statchg(struct device *dev)
 {
        struct bge_softc *sc = (struct bge_softc *)dev;
        struct mii_data *mii = &sc->bge_mii;
+       uint64_t media;
        u_int32_t mac_mode, rx_mode, tx_mode;
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        /*
         * Get flow control negotiation result.
         */
-       if (IFM_SUBTYPE(mii->mii_media.ifm_cur->ifm_media) == IFM_AUTO &&
+       if (IFM_SUBTYPE(media) == IFM_AUTO &&
            (mii->mii_media_active & IFM_ETH_FMASK) != sc->bge_flowflags)
                sc->bge_flowflags = mii->mii_media_active & IFM_ETH_FMASK;
 
@@ -3095,7 +3098,8 @@ bge_attach(struct device *parent, struct
                            0, NULL);
                ifmedia_add(&sc->bge_ifmedia, IFM_ETHER|IFM_AUTO, 0, NULL);
                ifmedia_set(&sc->bge_ifmedia, IFM_ETHER|IFM_AUTO);
-               sc->bge_ifmedia.ifm_media = sc->bge_ifmedia.ifm_cur->ifm_media;
+               ifmedia_current(&sc->bge_ifmedia, &sc->bge_ifmedia.ifm_media,
+                   NULL);
        } else {
                int mii_flags;
 
Index: dev/pci/if_bnx.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/pci/if_bnx.c,v
retrieving revision 1.132
diff -u -p -r1.132 if_bnx.c
--- dev/pci/if_bnx.c    11 Mar 2022 18:00:45 -0000      1.132
+++ dev/pci/if_bnx.c    14 Jul 2022 22:30:51 -0000
@@ -1240,6 +1240,7 @@ bnx_miibus_statchg(struct device *dev)
 {
        struct bnx_softc        *sc = (struct bnx_softc *)dev;
        struct mii_data         *mii = &sc->bnx_mii;
+       uint64_t                media;
        u_int32_t               rx_mode = sc->rx_mode;
        int                     val;
 
@@ -1248,10 +1249,12 @@ bnx_miibus_statchg(struct device *dev)
                BNX_EMAC_MODE_MAC_LOOP | BNX_EMAC_MODE_FORCE_LINK | 
                BNX_EMAC_MODE_25G);
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        /*
         * Get flow control negotiation result.
         */
-       if (IFM_SUBTYPE(mii->mii_media.ifm_cur->ifm_media) == IFM_AUTO &&
+       if (IFM_SUBTYPE(media) == IFM_AUTO &&
            (mii->mii_media_active & IFM_ETH_FMASK) != sc->bnx_flowflags) {
                sc->bnx_flowflags = mii->mii_media_active & IFM_ETH_FMASK;
                mii->mii_media_active &= ~IFM_ETH_FMASK;
Index: dev/pci/if_cas.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/pci/if_cas.c,v
retrieving revision 1.54
diff -u -p -r1.54 if_cas.c
--- dev/pci/if_cas.c    11 Mar 2022 18:00:45 -0000      1.54
+++ dev/pci/if_cas.c    14 Jul 2022 22:30:51 -0000
@@ -1496,17 +1496,18 @@ void
 cas_mii_statchg(struct device *dev)
 {
        struct cas_softc *sc = (void *)dev;
-#ifdef CAS_DEBUG
-       uint64_t instance = IFM_INST(sc->sc_mii.mii_media.ifm_cur->ifm_media);
-#endif
        bus_space_tag_t t = sc->sc_memt;
        bus_space_handle_t mac = sc->sc_memh;
        u_int32_t v;
 
 #ifdef CAS_DEBUG
-       if (sc->sc_debug)
-               printf("cas_mii_statchg: status change: phy = %d\n",
-                   sc->sc_phys[instance]);
+       if (sc->sc_debug) {
+               uint64_t media;
+
+               ifmedia_current(&sc->sc_mii.mii_media, &media, NULL);
+               printf("%s: status change: phy = %d\n",
+                   __func__, sc->sc_phys[IFM_INST(media)]);
+       }
 #endif
 
        /* Set tx full duplex options */
Index: dev/pci/if_iwm.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/pci/if_iwm.c,v
retrieving revision 1.403
diff -u -p -r1.403 if_iwm.c
--- dev/pci/if_iwm.c    11 Jul 2022 11:28:37 -0000      1.403
+++ dev/pci/if_iwm.c    14 Jul 2022 22:30:51 -0000
@@ -8493,6 +8493,7 @@ iwm_scan(struct iwm_softc *sc)
 {
        struct ieee80211com *ic = &sc->sc_ic;
        struct ifnet *ifp = IC2IFP(ic);
+       uint64_t media;
        int err;
 
        if (sc->sc_flags & IWM_FLAG_BGSCAN) {
@@ -8513,11 +8514,13 @@ iwm_scan(struct iwm_softc *sc)
                return err;
        }
 
+       ifmedia_current(&ic->ic_media, &media, NULL);
+
        /*
         * The current mode might have been fixed during association.
         * Ensure all channels get scanned.
         */
-       if (IFM_MODE(ic->ic_media.ifm_cur->ifm_media) == IFM_AUTO)
+       if (IFM_MODE(media) == IFM_AUTO)
                ieee80211_setmode(ic, IEEE80211_MODE_AUTO);
 
        sc->sc_flags |= IWM_FLAG_SCANNING;
Index: dev/pci/if_iwn.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/pci/if_iwn.c,v
retrieving revision 1.260
diff -u -p -r1.260 if_iwn.c
--- dev/pci/if_iwn.c    19 Jun 2022 18:27:06 -0000      1.260
+++ dev/pci/if_iwn.c    14 Jul 2022 22:30:51 -0000
@@ -5355,11 +5355,14 @@ iwn_scan(struct iwn_softc *sc, uint16_t 
 
        error = iwn_cmd(sc, IWN_CMD_SCAN, buf, buflen, 1);
        if (error == 0) {
+               uint64_t media;
+
                /*
                 * The current mode might have been fixed during association.
                 * Ensure all channels get scanned.
                 */
-               if (IFM_MODE(ic->ic_media.ifm_cur->ifm_media) == IFM_AUTO)
+               ifmedia_current(&ic->ic_media, &media, NULL);
+               if (IFM_MODE(media) == IFM_AUTO)
                        ieee80211_setmode(ic, IEEE80211_MODE_AUTO);
 
                sc->sc_flags |= IWN_FLAG_SCANNING;
Index: dev/pci/if_iwx.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/pci/if_iwx.c,v
retrieving revision 1.149
diff -u -p -r1.149 if_iwx.c
--- dev/pci/if_iwx.c    14 May 2022 05:42:39 -0000      1.149
+++ dev/pci/if_iwx.c    14 Jul 2022 22:30:51 -0000
@@ -7322,6 +7322,7 @@ iwx_scan(struct iwx_softc *sc)
 {
        struct ieee80211com *ic = &sc->sc_ic;
        struct ifnet *ifp = IC2IFP(ic);
+       uint64_t media;
        int err;
 
        if (sc->sc_flags & IWX_FLAG_BGSCAN) {
@@ -7339,11 +7340,13 @@ iwx_scan(struct iwx_softc *sc)
                return err;
        }
 
+       ifmedia_current(&ic->ic_media, &media, NULL);
+
        /*
         * The current mode might have been fixed during association.
         * Ensure all channels get scanned.
         */
-       if (IFM_MODE(ic->ic_media.ifm_cur->ifm_media) == IFM_AUTO)
+       if (IFM_MODE(media) == IFM_AUTO)
                ieee80211_setmode(ic, IEEE80211_MODE_AUTO);
 
        sc->sc_flags |= IWX_FLAG_SCANNING;
Index: dev/pci/if_msk.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/pci/if_msk.c,v
retrieving revision 1.142
diff -u -p -r1.142 if_msk.c
--- dev/pci/if_msk.c    11 Mar 2022 18:00:46 -0000      1.142
+++ dev/pci/if_msk.c    14 Jul 2022 22:30:51 -0000
@@ -442,13 +442,15 @@ msk_miibus_statchg(struct device *dev)
 {
        struct sk_if_softc *sc_if = (struct sk_if_softc *)dev;
        struct mii_data *mii = &sc_if->sk_mii;
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int gpcr;
 
        gpcr = SK_YU_READ_2(sc_if, YUKON_GPCR);
        gpcr &= (YU_GPCR_TXEN | YU_GPCR_RXEN);
 
-       if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO ||
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
+       if (IFM_SUBTYPE(media) != IFM_AUTO ||
            sc_if->sk_softc->sk_type == SK_YUKON_FE_P) {
                /* Set speed. */
                gpcr |= YU_GPCR_SPEED_DIS;
Index: dev/pci/if_nge.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/pci/if_nge.c,v
retrieving revision 1.96
diff -u -p -r1.96 if_nge.c
--- dev/pci/if_nge.c    11 Mar 2022 18:00:48 -0000      1.96
+++ dev/pci/if_nge.c    14 Jul 2022 22:30:51 -0000
@@ -1179,8 +1179,11 @@ nge_tick(void *xsc)
        }
 
        if (sc->nge_tbi) {
-               if (IFM_SUBTYPE(sc->nge_ifmedia.ifm_cur->ifm_media)
-                   == IFM_AUTO) {
+               uint64_t media;
+
+               ifmedia_current(&sc->nge_ifmedia, &media, NULL);
+
+               if (IFM_SUBTYPE(media) == IFM_AUTO) {
                        u_int32_t bmsr, anlpar, txcfg, rxcfg;
 
                        bmsr = CSR_READ_4(sc, NGE_TBI_BMSR);
@@ -1558,7 +1561,7 @@ nge_init(void *xsc)
 
        /* Set full/half duplex mode. */
        if (sc->nge_tbi)
-               media = sc->nge_ifmedia.ifm_cur->ifm_media;
+               ifmedia_current(&sc->nge_ifmedia, &media, NULL);
        else
                media = mii->mii_media_active;
 
@@ -1670,13 +1673,15 @@ int
 nge_ifmedia_tbi_upd(struct ifnet *ifp)
 {
        struct nge_softc        *sc = ifp->if_softc;
+       uint64_t media;
 
        DPRINTFN(2, ("%s: nge_ifmedia_tbi_upd\n", sc->sc_dv.dv_xname));
 
        sc->nge_link = 0;
 
-       if (IFM_SUBTYPE(sc->nge_ifmedia.ifm_cur->ifm_media) 
-           == IFM_AUTO) {
+       ifmedia_current(&sc->nge_ifmedia, &media, NULL);
+
+       if (IFM_SUBTYPE(media) == IFM_AUTO) {
                u_int32_t anar, bmcr;
                anar = CSR_READ_4(sc, NGE_TBI_ANAR);
                anar |= (NGE_TBIANAR_HDX | NGE_TBIANAR_FDX);
@@ -1693,8 +1698,7 @@ nge_ifmedia_tbi_upd(struct ifnet *ifp)
                txcfg = CSR_READ_4(sc, NGE_TX_CFG);
                rxcfg = CSR_READ_4(sc, NGE_RX_CFG);
 
-               if ((sc->nge_ifmedia.ifm_cur->ifm_media & IFM_GMASK)
-                   == IFM_FDX) {
+               if ((media & IFM_GMASK) == IFM_FDX) {
                        txcfg |= NGE_TXCFG_IGN_HBEAT|NGE_TXCFG_IGN_CARR;
                        rxcfg |= NGE_RXCFG_RX_FDX;
                } else {
@@ -1719,11 +1723,14 @@ void
 nge_ifmedia_tbi_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
 {
        struct nge_softc        *sc = ifp->if_softc;
+       uint64_t                media;
        u_int32_t               bmcr;
 
        bmcr = CSR_READ_4(sc, NGE_TBI_BMCR);
        
-       if (IFM_SUBTYPE(sc->nge_ifmedia.ifm_cur->ifm_media) == IFM_AUTO) {
+       ifmedia_current(&sc->nge_ifmedia, &media, NULL);
+
+       if (IFM_SUBTYPE(media) == IFM_AUTO) {
                u_int32_t bmsr = CSR_READ_4(sc, NGE_TBI_BMSR);
                DPRINTFN(2, ("%s: nge_ifmedia_tbi_sts bmsr=%#x, bmcr=%#x\n",
                             sc->sc_dv.dv_xname, bmsr, bmcr));
@@ -1744,7 +1751,7 @@ nge_ifmedia_tbi_sts(struct ifnet *ifp, s
        if (bmcr & NGE_TBIBMCR_LOOPBACK)
                ifmr->ifm_active |= IFM_LOOP;
        
-       if (IFM_SUBTYPE(sc->nge_ifmedia.ifm_cur->ifm_media) == IFM_AUTO) {
+       if (IFM_SUBTYPE(media) == IFM_AUTO) {
                u_int32_t anlpar = CSR_READ_4(sc, NGE_TBI_ANLPAR);
                DPRINTFN(2, ("%s: nge_ifmedia_tbi_sts anlpar=%#x\n",
                             sc->sc_dv.dv_xname, anlpar));
@@ -1757,7 +1764,7 @@ nge_ifmedia_tbi_sts(struct ifnet *ifp, s
                } else
                        ifmr->ifm_active |= IFM_FDX;
                
-       } else if ((sc->nge_ifmedia.ifm_cur->ifm_media & IFM_GMASK) == IFM_FDX)
+       } else if ((media & IFM_GMASK) == IFM_FDX)
                ifmr->ifm_active |= IFM_FDX;
        else
                ifmr->ifm_active |= IFM_HDX;
Index: dev/pci/if_pcn.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/pci/if_pcn.c,v
retrieving revision 1.48
diff -u -p -r1.48 if_pcn.c
--- dev/pci/if_pcn.c    10 Jul 2022 21:13:41 -0000      1.48
+++ dev/pci/if_pcn.c    14 Jul 2022 22:30:51 -0000
@@ -1861,8 +1861,12 @@ int
 pcn_79c970_mediachange(struct ifnet *ifp)
 {
        struct pcn_softc *sc = ifp->if_softc;
+       uint64_t media;
+       u_int data;
        uint32_t reg;
 
+       ifmedia_current(&sc->sc_mii.mii_media, &media, &data);
+
        if (IFM_SUBTYPE(sc->sc_mii.mii_media.ifm_media) == IFM_AUTO) {
                /*
                 * CSR15:PORTSEL doesn't matter.  Just set BCR2:ASEL.
@@ -1880,7 +1884,7 @@ pcn_79c970_mediachange(struct ifnet *ifp
 
                reg = pcn_csr_read(sc, LE_CSR15);
                reg = (reg & ~LE_C15_PORTSEL(PORTSEL_MASK)) |
-                   LE_C15_PORTSEL(sc->sc_mii.mii_media.ifm_cur->ifm_data);
+                   LE_C15_PORTSEL(data);
                pcn_csr_write(sc, LE_CSR15, reg);
        }
 
Index: dev/pci/if_rge.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/pci/if_rge.c,v
retrieving revision 1.19
diff -u -p -r1.19 if_rge.c
--- dev/pci/if_rge.c    21 Apr 2022 05:08:39 -0000      1.19
+++ dev/pci/if_rge.c    14 Jul 2022 22:30:51 -0000
@@ -303,7 +303,7 @@ rge_attach(struct device *parent, struct
        rge_add_media_types(sc);
        ifmedia_add(&sc->sc_media, IFM_ETHER | IFM_AUTO, 0, NULL);
        ifmedia_set(&sc->sc_media, IFM_ETHER | IFM_AUTO);
-       sc->sc_media.ifm_media = sc->sc_media.ifm_cur->ifm_media;
+       ifmedia_current(&sc->sc_media, &sc->sc_media.ifm_media, NULL);
 
        if_attach(ifp);
        ether_ifattach(ifp);
Index: dev/pci/if_tl.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/pci/if_tl.c,v
retrieving revision 1.76
diff -u -p -r1.76 if_tl.c
--- dev/pci/if_tl.c     11 Mar 2022 18:00:50 -0000      1.76
+++ dev/pci/if_tl.c     14 Jul 2022 22:41:35 -0000
@@ -1988,7 +1988,6 @@ tl_attach(struct device *parent, struct 
        mii_attach(self, &sc->sc_mii, 0xffffffff, MII_PHY_ANY, MII_OFFSET_ANY,
            0);
        if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) {
-               struct ifmedia *ifm;
                sc->tl_bitrate = 1;
                ifmedia_init(&sc->ifmedia, 0, tl_ifmedia_upd, tl_ifmedia_sts);
                ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_10_T, 0, NULL);
@@ -1998,8 +1997,7 @@ tl_attach(struct device *parent, struct 
                ifmedia_set(&sc->ifmedia, IFM_ETHER|IFM_10_T);
                /* Reset again, this time setting bitrate mode. */
                tl_softreset(sc, 1);
-               ifm = &sc->ifmedia;
-               ifm->ifm_media = ifm->ifm_cur->ifm_media;
+               ifmedia_current(&sc->ifmedia, &sc->ifmedia.ifm_media, NULL);
                tl_ifmedia_upd(ifp);
        } else
                ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO);
Index: dev/pci/if_txp.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/pci/if_txp.c,v
retrieving revision 1.129
diff -u -p -r1.129 if_txp.c
--- dev/pci/if_txp.c    11 Mar 2022 18:00:50 -0000      1.129
+++ dev/pci/if_txp.c    14 Jul 2022 22:30:51 -0000
@@ -1661,7 +1661,6 @@ void
 txp_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
 {
        struct txp_softc *sc = ifp->if_softc;
-       struct ifmedia *ifm = &sc->sc_ifmedia;
        u_int16_t bmsr, bmcr, anar, anlpar;
 
        ifmr->ifm_status = IFM_AVALID;
@@ -1718,7 +1717,8 @@ txp_ifmedia_sts(struct ifnet *ifp, struc
                else
                        ifmr->ifm_active |= IFM_NONE;
        } else
-               ifmr->ifm_active = ifm->ifm_cur->ifm_media;
+               ifmedia_current(&sc->sc_ifmedia, &ifmr->ifm_active, NULL);
+
        return;
 
 bail:
Index: dev/pci/if_vge.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/pci/if_vge.c,v
retrieving revision 1.76
diff -u -p -r1.76 if_vge.c
--- dev/pci/if_vge.c    11 Mar 2022 18:00:50 -0000      1.76
+++ dev/pci/if_vge.c    14 Jul 2022 22:30:51 -0000
@@ -1674,11 +1674,10 @@ void
 vge_miibus_statchg(struct device *dev)
 {
        struct vge_softc        *sc = (struct vge_softc *)dev;
-       struct mii_data         *mii;
-       struct ifmedia_entry    *ife;
+       struct mii_data         *mii = &sc->sc_mii;
+       uint64_t media;
 
-       mii = &sc->sc_mii;
-       ife = mii->mii_media.ifm_cur;
+       ifmedia_current(&mii->mii_media, &media, NULL);
 
        /*
         * If the user manually selects a media mode, we need to turn
@@ -1691,7 +1690,7 @@ vge_miibus_statchg(struct device *dev)
         * the FDX bit cleared.
         */
 
-       switch (IFM_SUBTYPE(ife->ifm_media)) {
+       switch (IFM_SUBTYPE(media)) {
        case IFM_AUTO:
                CSR_CLRBIT_1(sc, VGE_DIAGCTL, VGE_DIAGCTL_MACFORCE);
                CSR_CLRBIT_1(sc, VGE_DIAGCTL, VGE_DIAGCTL_FDXFORCE);
@@ -1703,7 +1702,7 @@ vge_miibus_statchg(struct device *dev)
        case IFM_100_TX:
        case IFM_10_T:
                CSR_SETBIT_1(sc, VGE_DIAGCTL, VGE_DIAGCTL_MACFORCE);
-               if ((ife->ifm_media & IFM_GMASK) == IFM_FDX) {
+               if ((media & IFM_GMASK) == IFM_FDX) {
                        CSR_SETBIT_1(sc, VGE_DIAGCTL, VGE_DIAGCTL_FDXFORCE);
                } else {
                        CSR_CLRBIT_1(sc, VGE_DIAGCTL, VGE_DIAGCTL_FDXFORCE);
@@ -1711,7 +1710,7 @@ vge_miibus_statchg(struct device *dev)
                break;
        default:
                printf("%s: unknown media type: %llx\n",
-                   sc->vge_dev.dv_xname, IFM_SUBTYPE(ife->ifm_media));
+                   sc->vge_dev.dv_xname, IFM_SUBTYPE(media));
                break;
        }
 
Index: dev/sbus/be.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/sbus/be.c,v
retrieving revision 1.44
diff -u -p -r1.44 be.c
--- dev/sbus/be.c       13 Mar 2022 13:34:54 -0000      1.44
+++ dev/sbus/be.c       14 Jul 2022 22:30:51 -0000
@@ -1321,13 +1321,15 @@ be_mii_statchg(struct device *self)
        struct be_softc *sc = (struct be_softc *)self;
        bus_space_tag_t t = sc->sc_bustag;
        bus_space_handle_t br = sc->sc_br;
-       u_int64_t instance;
+       u_int64_t media;
        u_int32_t v;
 
-       instance = IFM_INST(sc->sc_mii.mii_media.ifm_cur->ifm_media);
+       ifmedia_current(&sc->sc_mii.mii_media, &media, NULL);
 #ifdef DIAGNOSTIC
-       if (instance > 1)
-               panic("be_mii_statchg: instance %lld out of range", instance);
+       if (IFM_INST(media) > 1) {
+               panic("%s: instance %lld out of range",
+                   __func__, IFM_INST(media));
+       }
 #endif
 
        /* Update duplex mode in TX configuration */
@@ -1379,16 +1381,18 @@ be_ifmedia_upd(struct ifnet *ifp)
 int
 be_intphy_service(struct be_softc *sc, struct mii_data *mii, int cmd)
 {
-       struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+       uint64_t media;
        int bmcr, bmsr;
        int error;
 
+       ifmedia_current(&mii->mii_media, &media, NULL);
+
        switch (cmd) {
        case MII_POLLSTAT:
                /*
                 * If we're not polling our PHY instance, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->sc_mii_inst)
+               if (IFM_INST(media) != sc->sc_mii_inst)
                        return (0);
 
                break;
@@ -1399,7 +1403,7 @@ be_intphy_service(struct be_softc *sc, s
                 * If the media indicates a different PHY instance,
                 * isolate ourselves.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->sc_mii_inst) {
+               if (IFM_INST(media) != sc->sc_mii_inst) {
                        bmcr = be_mii_readreg((void *)sc,
                            BE_PHY_INTERNAL, MII_BMCR);
                        be_mii_writereg((void *)sc,
@@ -1418,11 +1422,11 @@ be_intphy_service(struct be_softc *sc, s
                /*
                 * Select the new mode and take out of isolation
                 */
-               if (IFM_SUBTYPE(ife->ifm_media) == IFM_100_TX)
+               if (IFM_SUBTYPE(media) == IFM_100_TX)
                        bmcr |= BMCR_S100;
-               else if (IFM_SUBTYPE(ife->ifm_media) == IFM_10_T)
+               else if (IFM_SUBTYPE(media) == IFM_10_T)
                        bmcr &= ~BMCR_S100;
-               else if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) {
+               else if (IFM_SUBTYPE(media) == IFM_AUTO) {
                        if ((sc->sc_mii_flags & MIIF_HAVELINK) != 0) {
                                bmcr &= ~BMCR_S100;
                                bmcr |= sc->sc_intphy_curspeed;
@@ -1433,7 +1437,7 @@ be_intphy_service(struct be_softc *sc, s
                        }
                }
 
-               if ((IFM_OPTIONS(ife->ifm_media) & IFM_FDX) != 0)
+               if ((IFM_OPTIONS(media) & IFM_FDX) != 0)
                        bmcr |= BMCR_FDX;
                else
                        bmcr &= ~BMCR_FDX;
@@ -1445,11 +1449,11 @@ be_intphy_service(struct be_softc *sc, s
                /*
                 * If we're not currently selected, just return.
                 */
-               if (IFM_INST(ife->ifm_media) != sc->sc_mii_inst)
+               if (IFM_INST(media) != sc->sc_mii_inst)
                        return (0);
 
                /* Only used for automatic media selection */
-               if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO)
+               if (IFM_SUBTYPE(media) != IFM_AUTO)
                        return (0);
 
                /* Is the interface even up? */
Index: dev/sbus/if_le_ledma.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/sbus/if_le_ledma.c,v
retrieving revision 1.20
diff -u -p -r1.20 if_le_ledma.c
--- dev/sbus/if_le_ledma.c      13 Mar 2022 13:34:54 -0000      1.20
+++ dev/sbus/if_le_ledma.c      14 Jul 2022 20:24:23 -0000
@@ -249,12 +249,15 @@ le_ledma_hwreset(struct lance_softc *sc)
 void
 le_ledma_hwinit(struct lance_softc *sc)
 {
+       uint64_t media;
+
+       ifmedia_current(&sc->sc_ifmedia, &media, NULL);
 
        /*
         * Make sure we're using the currently-enabled media type.
         * XXX Actually, this is probably unnecessary, now.
         */
-       switch (IFM_SUBTYPE(sc->sc_ifmedia.ifm_cur->ifm_media)) {
+       switch (IFM_SUBTYPE(media)) {
        case IFM_10_T:
                le_ledma_setutp(sc);
                break;
Index: dev/usb/if_uaq.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/usb/if_uaq.c,v
retrieving revision 1.4
diff -u -p -r1.4 if_uaq.c
--- dev/usb/if_uaq.c    26 Jun 2022 15:25:03 -0000      1.4
+++ dev/usb/if_uaq.c    14 Jul 2022 20:25:12 -0000
@@ -513,7 +513,7 @@ uaq_attach(struct device *parent, struct
        uaq_add_media_types(sc);
        ifmedia_add(&sc->sc_ifmedia, IFM_ETHER | IFM_AUTO, 0, NULL);
        ifmedia_set(&sc->sc_ifmedia, IFM_ETHER | IFM_AUTO);
-       sc->sc_ifmedia.ifm_media = sc->sc_ifmedia.ifm_cur->ifm_media;
+       ifmedia_current(&sc->sc_ifmedia, &sc->sc_ifmedia.ifm_media, NULL);
 
        if_attach(ifp);
        ether_ifattach(ifp);
Index: dev/usb/if_ure.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/dev/usb/if_ure.c,v
retrieving revision 1.30
diff -u -p -r1.30 if_ure.c
--- dev/usb/if_ure.c    2 Apr 2022 15:35:06 -0000       1.30
+++ dev/usb/if_ure.c    14 Jul 2022 20:25:52 -0000
@@ -1855,7 +1855,8 @@ ure_attach(struct device *parent, struct
                ure_add_media_types(sc);
                ifmedia_add(&sc->ure_ifmedia, IFM_ETHER | IFM_AUTO, 0, NULL);
                ifmedia_set(&sc->ure_ifmedia, IFM_ETHER | IFM_AUTO);
-               sc->ure_ifmedia.ifm_media = sc->ure_ifmedia.ifm_cur->ifm_media;
+               ifmedia_current(&sc->ure_ifmedia, &sc->ure_ifmedia.ifm_media,
+                   NULL);
        } else {
                rw_init(&sc->ure_mii_lock, "uremii");
 
Index: net/if_media.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/net/if_media.c,v
retrieving revision 1.36
diff -u -p -r1.36 if_media.c
--- net/if_media.c      14 Jul 2022 13:46:25 -0000      1.36
+++ net/if_media.c      14 Jul 2022 22:30:51 -0000
@@ -430,6 +430,21 @@ ifmedia_get(struct ifmedia *ifm, uint64_
        return (match);
 }
 
+void
+ifmedia_current(struct ifmedia *ifm, uint64_t *media, u_int *data)
+{
+       struct ifmedia_entry *ife;
+
+       mtx_enter(&ifmedia_mtx);
+       ife = ifm->ifm_cur;
+       KASSERT(ife != NULL);
+       if (media != NULL)
+               *media = ife->ifm_media;
+       if (data != NULL)
+               *data = ife->ifm_data;
+       mtx_leave(&ifmedia_mtx);
+}
+
 /*
  * Delete all media for a given instance.
  */
Index: net/if_media.h
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/net/if_media.h,v
retrieving revision 1.45
diff -u -p -r1.45 if_media.h
--- net/if_media.h      14 Jul 2022 13:46:25 -0000      1.45
+++ net/if_media.h      14 Jul 2022 22:30:51 -0000
@@ -131,6 +131,9 @@ int ifmedia_ioctl(struct ifnet *, struct
 /* Locate a media entry */
 int    ifmedia_match(struct ifmedia *, uint64_t, uint64_t);
 
+/* Get current media and data */
+void   ifmedia_current(struct ifmedia *, uint64_t *, u_int *);
+
 /* Delete all media for a given media instance */
 void   ifmedia_delete_instance(struct ifmedia *, uint64_t);
 
Index: net80211/ieee80211.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/net80211/ieee80211.c,v
retrieving revision 1.88
diff -u -p -r1.88 ieee80211.c
--- net80211/ieee80211.c        19 Mar 2022 10:25:09 -0000      1.88
+++ net80211/ieee80211.c        14 Jul 2022 22:38:22 -0000
@@ -508,16 +508,17 @@ int
 ieee80211_media_change(struct ifnet *ifp)
 {
        struct ieee80211com *ic = (void *)ifp;
-       struct ifmedia_entry *ime;
        enum ieee80211_opmode newopmode;
        enum ieee80211_phymode newphymode;
+       uint64_t media;
        int i, j, newrate, error = 0;
 
-       ime = ic->ic_media.ifm_cur;
+       ifmedia_current(&ic->ic_media, &media, NULL);
+
        /*
         * First, identify the phy mode.
         */
-       switch (IFM_MODE(ime->ifm_media)) {
+       switch (IFM_MODE(media)) {
        case IFM_IEEE80211_11A:
                newphymode = IEEE80211_MODE_11A;
                break;
@@ -550,32 +551,32 @@ ieee80211_media_change(struct ifnet *ifp
         * Next, the fixed/variable rate.
         */
        i = -1;
-       if (IFM_SUBTYPE(ime->ifm_media) >= IFM_IEEE80211_VHT_MCS0 &&
-           IFM_SUBTYPE(ime->ifm_media) <= IFM_IEEE80211_VHT_MCS9) {
+       if (IFM_SUBTYPE(media) >= IFM_IEEE80211_VHT_MCS0 &&
+           IFM_SUBTYPE(media) <= IFM_IEEE80211_VHT_MCS9) {
                if ((ic->ic_modecaps & (1 << IEEE80211_MODE_11AC)) == 0)
                        return EINVAL;
                if (newphymode != IEEE80211_MODE_AUTO &&
                    newphymode != IEEE80211_MODE_11AC)
                        return EINVAL;
-               i = ieee80211_media2mcs(ime->ifm_media);
+               i = ieee80211_media2mcs(media);
                /* TODO: Obtain VHT MCS information from VHT CAP IE. */
                if (i == -1 /* || !vht_mcs_supported */)
                        return EINVAL;
-       } else if (IFM_SUBTYPE(ime->ifm_media) >= IFM_IEEE80211_HT_MCS0 &&
-           IFM_SUBTYPE(ime->ifm_media) <= IFM_IEEE80211_HT_MCS76) {
+       } else if (IFM_SUBTYPE(media) >= IFM_IEEE80211_HT_MCS0 &&
+           IFM_SUBTYPE(media) <= IFM_IEEE80211_HT_MCS76) {
                if ((ic->ic_modecaps & (1 << IEEE80211_MODE_11N)) == 0)
                        return EINVAL;
                if (newphymode != IEEE80211_MODE_AUTO &&
                    newphymode != IEEE80211_MODE_11N)
                        return EINVAL;
-               i = ieee80211_media2mcs(ime->ifm_media);
+               i = ieee80211_media2mcs(media);
                if (i == -1 || isclr(ic->ic_sup_mcs, i))
                        return EINVAL;
-       } else if (IFM_SUBTYPE(ime->ifm_media) != IFM_AUTO) {
+       } else if (IFM_SUBTYPE(media) != IFM_AUTO) {
                /*
                 * Convert media subtype to rate.
                 */
-               newrate = ieee80211_media2rate(ime->ifm_media);
+               newrate = ieee80211_media2rate(media);
                if (newrate == 0)
                        return EINVAL;
                /*
@@ -608,15 +609,15 @@ ieee80211_media_change(struct ifnet *ifp
         * Deduce new operating mode but don't install it just yet.
         */
 #ifndef IEEE80211_STA_ONLY
-       if (ime->ifm_media & IFM_IEEE80211_ADHOC)
+       if (media & IFM_IEEE80211_ADHOC)
                newopmode = IEEE80211_M_AHDEMO;
-       else if (ime->ifm_media & IFM_IEEE80211_HOSTAP)
+       else if (media & IFM_IEEE80211_HOSTAP)
                newopmode = IEEE80211_M_HOSTAP;
-       else if (ime->ifm_media & IFM_IEEE80211_IBSS)
+       else if (media & IFM_IEEE80211_IBSS)
                newopmode = IEEE80211_M_IBSS;
        else
 #endif
-       if (ime->ifm_media & IFM_IEEE80211_MONITOR)
+       if (media & IFM_IEEE80211_MONITOR)
                newopmode = IEEE80211_M_MONITOR;
        else
                newopmode = IEEE80211_M_STA;
@@ -712,7 +713,7 @@ ieee80211_media_change(struct ifnet *ifp
        }
 #ifdef notdef
        if (error == 0)
-               ifp->if_baudrate = ifmedia_baudrate(ime->ifm_media);
+               ifp->if_baudrate = ifmedia_baudrate(media);
 #endif
        return error;
 }
@@ -1119,13 +1120,16 @@ enum ieee80211_phymode
 ieee80211_next_mode(struct ifnet *ifp)
 {
        struct ieee80211com *ic = (void *)ifp;
+       uint64_t media;
        uint16_t mode;
 
+       ifmedia_current(&ic->ic_media, &media, NULL);
+
        /*
         * Indicate a wrap-around if we're running in a fixed, user-specified
         * phy mode.
         */
-       if (IFM_MODE(ic->ic_media.ifm_cur->ifm_media) != IFM_AUTO)
+       if (IFM_MODE(media) != IFM_AUTO)
                return (IEEE80211_MODE_AUTO);
 
        /*
Index: net80211/ieee80211_node.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/net80211/ieee80211_node.c,v
retrieving revision 1.195
diff -u -p -r1.195 ieee80211_node.c
--- net80211/ieee80211_node.c   20 Mar 2022 07:50:32 -0000      1.195
+++ net80211/ieee80211_node.c   14 Jul 2022 22:39:11 -0000
@@ -836,6 +836,7 @@ void
 ieee80211_begin_scan(struct ifnet *ifp)
 {
        struct ieee80211com *ic = (void *)ifp;
+       uint64_t media;
 
        /*
         * In all but hostap mode scanning starts off in
@@ -863,11 +864,13 @@ ieee80211_begin_scan(struct ifnet *ifp)
                ieee80211_iterate_nodes(ic, ieee80211_node_raise_inact, NULL);
        }
 
+       ifmedia_current(&ic->ic_media, &media, NULL);
+
        /*
         * Reset the current mode. Setting the current mode will also
         * reset scan state.
         */
-       if (IFM_MODE(ic->ic_media.ifm_cur->ifm_media) == IFM_AUTO)
+       if (IFM_MODE(media) == IFM_AUTO)
                ic->ic_curmode = IEEE80211_MODE_AUTO;
        ieee80211_setmode(ic, ic->ic_curmode);
 

Reply via email to