On Fri, Jul 15, 2022 at 04:51:25PM +0200, Alexander Bluhm wrote:
> On Fri, Jul 15, 2022 at 02:05:40AM +0200, Alexander Bluhm wrote:
> > If anyone has some of these old network drivers, please test setting
> > media type with ifconfig.
> 
> Updated diff.  I have compile tested it on amd64, i386, octeon,
> macppc, sparc64.  Setting media for gem(4) and bge(4) works.

Also compiles and boots on powerpc64 and arm64.

How do we proceed here?  The diff touches 70 drivers, that cannot
be tested due to missing hardware.  But I need the MP safe interface
in ifmedia.  Should I commit the API and the few drivers for the
hardware I have?  And then slowly commit the remaining drivers.
Or put everything in and see what happens?

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     15 Jul 2022 08:13:09 -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 */
> @@ -1339,7 +1341,7 @@ be_mii_statchg(struct device *self)
>       bus_space_write_4(t, br, BE_BRI_TXCFG, v);
>  
>       /* Change to appropriate gate in transceiver PAL */
> -     be_pal_gate(sc, sc->sc_phys[instance]);
> +     be_pal_gate(sc, sc->sc_phys[IFM_INST(media)]);
>  }
>  
>  /*
> @@ -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