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.
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);