diff options
| author | msaitoh <msaitoh@NetBSD.org> | 2019-11-20 08:50:59 +0000 |
|---|---|---|
| committer | msaitoh <msaitoh@NetBSD.org> | 2019-11-20 08:50:59 +0000 |
| commit | 231acd6bc724d9a07d7138f4e72e28b5a4447c39 (patch) | |
| tree | 51a4bfe37ae3b8251d5bc1fbe790dcbfd0e545a6 /sys/dev | |
| parent | c028a4b040ed139d3dfa8d0a6227f9b3dd4f919b (diff) | |
Fix a bug that atphy(4) can't negotiate correctly when the media setting is
neither auto nor 1000baseT. Use correct index for mii_media_table[].
History: mii_anar() is first added in OpenBSD and ported to NetBSD. On NetBSD,
only atphy(4) use this function. mii_physubr.c rev. 1.75 changed mii_anar()
for simplify. It changed the argument from the ifmedia word to ifm_data used
in our MII API, but the caller have not been changed. And then, PR kern/50206
was reported and the caller was modified by me to prevent panic but it was not
correct fix.
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/mii/atphy.c | 6 | ||||
| -rw-r--r-- | sys/dev/mii/mii_physubr.c | 15 | ||||
| -rw-r--r-- | sys/dev/mii/miivar.h | 4 |
3 files changed, 11 insertions, 14 deletions
diff --git a/sys/dev/mii/atphy.c b/sys/dev/mii/atphy.c index ab871cf59ac..7c5f43eaa28 100644 --- a/sys/dev/mii/atphy.c +++ b/sys/dev/mii/atphy.c @@ -1,4 +1,4 @@ -/* $NetBSD: atphy.c,v 1.24 2019/10/18 12:53:08 hkenken Exp $ */ +/* $NetBSD: atphy.c,v 1.25 2019/11/20 08:50:59 msaitoh Exp $ */ /* $OpenBSD: atphy.c,v 1.1 2008/09/25 20:47:16 brad Exp $ */ /*- @@ -33,7 +33,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: atphy.c,v 1.24 2019/10/18 12:53:08 hkenken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: atphy.c,v 1.25 2019/11/20 08:50:59 msaitoh Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -273,7 +273,7 @@ atphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd) return EINVAL; } - anar = mii_anar(IFM_SUBTYPE(ife->ifm_media)); + anar = mii_anar(ife); if ((ife->ifm_media & IFM_FDX) != 0) { bmcr |= BMCR_FDX; /* Enable pause. */ diff --git a/sys/dev/mii/mii_physubr.c b/sys/dev/mii/mii_physubr.c index a461dec0424..43dd650984f 100644 --- a/sys/dev/mii/mii_physubr.c +++ b/sys/dev/mii/mii_physubr.c @@ -1,4 +1,4 @@ -/* $NetBSD: mii_physubr.c,v 1.87 2019/04/09 11:28:45 msaitoh Exp $ */ +/* $NetBSD: mii_physubr.c,v 1.88 2019/11/20 08:50:59 msaitoh Exp $ */ /*- * Copyright (c) 1998, 1999, 2000, 2001 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mii_physubr.c,v 1.87 2019/04/09 11:28:45 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mii_physubr.c,v 1.88 2019/11/20 08:50:59 msaitoh Exp $"); #include <sys/param.h> #include <sys/device.h> @@ -697,19 +697,16 @@ mii_phy_resume(device_t dv, const pmf_qual_t *qual) /* - * Given an ifmedia word, return the corresponding ANAR value. + * Given an ifmedia_entry, return the corresponding ANAR value. */ uint16_t -mii_anar(int media) +mii_anar(struct ifmedia_entry *ife) { - int rv; #ifdef DIAGNOSTIC - if (/* media < 0 || */ media >= MII_NMEDIA) + if (ife->ifm_data >= MII_NMEDIA) panic("mii_anar"); #endif - rv = mii_media_table[media].mm_anar; - - return rv; + return mii_media_table[ife->ifm_data].mm_anar; } diff --git a/sys/dev/mii/miivar.h b/sys/dev/mii/miivar.h index 150b418c2fe..1f6325fbf22 100644 --- a/sys/dev/mii/miivar.h +++ b/sys/dev/mii/miivar.h @@ -1,4 +1,4 @@ -/* $NetBSD: miivar.h,v 1.68 2019/04/11 09:14:07 msaitoh Exp $ */ +/* $NetBSD: miivar.h,v 1.69 2019/11/20 08:50:59 msaitoh Exp $ */ /*- * Copyright (c) 1998, 1999, 2000, 2001 The NetBSD Foundation, Inc. @@ -287,7 +287,7 @@ int mii_mediachg(struct mii_data *); void mii_tick(struct mii_data *); void mii_pollstat(struct mii_data *); void mii_down(struct mii_data *); -uint16_t mii_anar(int); +uint16_t mii_anar(struct ifmedia_entry *); int mii_ifmedia_change(struct mii_data *); |
