Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys Define and implement a locking protocol for the ifmedia ...
details: https://anonhg.NetBSD.org/src/rev/104d203cd257
branches: trunk
changeset: 745905:104d203cd257
user: thorpej <thorpej%NetBSD.org@localhost>
date: Sun Mar 15 23:04:50 2020 +0000
description:
Define and implement a locking protocol for the ifmedia / mii layers:
- MP-safe drivers provide a mutex to ifmedia that is used to serialize
access to media-related structures / hardware regsiters. Converted
drivers use the new ifmedia_init_with_lock() function for this. The
new name is provided to ease the transition.
- Un-converted drivers continue to call ifmedia_init(), which will supply
a compatibility lock to be used instead. Several media-related entry
points must be aware of this compatibility lock, and are able to acquire
it recursively a limited number of times, if needed. This is a SPIN
mutex with priority IPL_NET.
- This same lock is used to serialize access to PHY registers and other
MII-related data structures.
The PHY drivers are modified to acquire and release the lock, as needed,
and assert the lock is held as a diagnostic aid.
The "usbnet" framework has had an overhaul of its internal locking
protocols to fit in with the media / mii changes, and the drivers adapted.
USB wifi drivers have been changed to provide their own adaptive mutex
to the ifmedia later via a new ieee80211_media_init_with_lock() function.
This is required because the USB drivers need an adaptive mutex.
Besised "usbnet", a few other drivers are converted: vmx, wm, ixgbe / ixv.
mcx also now calls ifmedia_init_with_lock() because it needs to also use
an adaptive mutex. The mcx driver still needs to be fully converted to
NET_MPSAFE.
diffstat:
sys/arch/arm/amlogic/gxlphy.c | 12 +-
sys/arch/x86/pci/if_vmx.c | 14 +-
sys/dev/mii/acphy.c | 16 +-
sys/dev/mii/amhphy.c | 12 +-
sys/dev/mii/atphy.c | 16 +-
sys/dev/mii/bmtphy.c | 14 +-
sys/dev/mii/brgphy.c | 36 ++++-
sys/dev/mii/ciphy.c | 14 +-
sys/dev/mii/dmphy.c | 12 +-
sys/dev/mii/etphy.c | 14 +-
sys/dev/mii/exphy.c | 12 +-
sys/dev/mii/gentbi.c | 22 ++-
sys/dev/mii/glxtphy.c | 12 +-
sys/dev/mii/gphyter.c | 16 +-
sys/dev/mii/icsphy.c | 14 +-
sys/dev/mii/igphy.c | 14 +-
sys/dev/mii/ihphy.c | 16 +-
sys/dev/mii/ikphy.c | 14 +-
sys/dev/mii/inphy.c | 12 +-
sys/dev/mii/iophy.c | 12 +-
sys/dev/mii/ipgphy.c | 16 +-
sys/dev/mii/jmphy.c | 14 +-
sys/dev/mii/lxtphy.c | 16 +-
sys/dev/mii/makphy.c | 13 +-
sys/dev/mii/micphy.c | 17 ++-
sys/dev/mii/mii.c | 131 ++++++++++++++++-
sys/dev/mii/mii_ethersubr.c | 10 +-
sys/dev/mii/mii_physubr.c | 88 +++++++++--
sys/dev/mii/miivar.h | 93 ++++++++----
sys/dev/mii/mvphy.c | 14 +-
sys/dev/mii/nsphy.c | 14 +-
sys/dev/mii/nsphyter.c | 14 +-
sys/dev/mii/pnaphy.c | 12 +-
sys/dev/mii/qsphy.c | 14 +-
sys/dev/mii/rdcphy.c | 12 +-
sys/dev/mii/rgephy.c | 35 +++-
sys/dev/mii/rlphy.c | 14 +-
sys/dev/mii/smscphy.c | 8 +
sys/dev/mii/sqphy.c | 14 +-
sys/dev/mii/tlphy.c | 13 +-
sys/dev/mii/tqphy.c | 12 +-
sys/dev/mii/ukphy.c | 10 +-
sys/dev/mii/ukphy_subr.c | 6 +-
sys/dev/pci/if_mcx.c | 20 +-
sys/dev/pci/if_wm.c | 82 ++++++----
sys/dev/pci/ixgbe/ixgbe.c | 14 +-
sys/dev/pci/ixgbe/ixv.c | 10 +-
sys/dev/usb/if_atu.c | 9 +-
sys/dev/usb/if_atureg.h | 4 +-
sys/dev/usb/if_aue.c | 116 ++++++---------
sys/dev/usb/if_axe.c | 115 +++++++--------
sys/dev/usb/if_axen.c | 130 ++++++++----------
sys/dev/usb/if_cdce.c | 31 ++--
sys/dev/usb/if_cue.c | 64 +++++---
sys/dev/usb/if_kue.c | 50 +++---
sys/dev/usb/if_mos.c | 87 +++++------
sys/dev/usb/if_mue.c | 98 ++++++------
sys/dev/usb/if_otus.c | 10 +-
sys/dev/usb/if_otusvar.h | 3 +-
sys/dev/usb/if_rum.c | 10 +-
sys/dev/usb/if_rumvar.h | 4 +-
sys/dev/usb/if_run.c | 10 +-
sys/dev/usb/if_runvar.h | 4 +-
sys/dev/usb/if_smsc.c | 125 +++++++----------
sys/dev/usb/if_udav.c | 119 +++++++--------
sys/dev/usb/if_upgt.c | 10 +-
sys/dev/usb/if_upgtvar.h | 4 +-
sys/dev/usb/if_upl.c | 37 ++--
sys/dev/usb/if_ural.c | 10 +-
sys/dev/usb/if_uralvar.h | 4 +-
sys/dev/usb/if_ure.c | 94 ++++++------
sys/dev/usb/if_url.c | 109 ++++++--------
sys/dev/usb/if_urndis.c | 48 +++---
sys/dev/usb/if_urtw.c | 10 +-
sys/dev/usb/if_urtwn.c | 10 +-
sys/dev/usb/if_urtwnvar.h | 3 +-
sys/dev/usb/if_urtwreg.h | 2 +
sys/dev/usb/if_zyd.c | 10 +-
sys/dev/usb/if_zydreg.h | 4 +-
sys/dev/usb/usbnet.c | 210 +++++++++++++---------------
sys/dev/usb/usbnet.h | 71 +++++----
sys/net/if_media.c | 288 +++++++++++++++++++++++++++++++--------
sys/net/if_media.h | 87 ++++++++++--
sys/net80211/ieee80211.c | 20 ++-
sys/net80211/ieee80211_netbsd.h | 7 +-
sys/net80211/ieee80211_var.h | 4 +-
86 files changed, 1914 insertions(+), 1137 deletions(-)
diffs (truncated from 8717 to 300 lines):
diff -r 1d33714793cf -r 104d203cd257 sys/arch/arm/amlogic/gxlphy.c
--- a/sys/arch/arm/amlogic/gxlphy.c Sun Mar 15 22:44:32 2020 +0000
+++ b/sys/arch/arm/amlogic/gxlphy.c Sun Mar 15 23:04:50 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: gxlphy.c,v 1.2 2019/11/27 10:19:21 msaitoh Exp $ */
+/* $NetBSD: gxlphy.c,v 1.3 2020/03/15 23:04:50 thorpej Exp $ */
/*
* Copyright (c) 2019 Jared McNeill <jmcneill%invisible.ca@localhost>
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gxlphy.c,v 1.2 2019/11/27 10:19:21 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gxlphy.c,v 1.3 2020/03/15 23:04:50 thorpej Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -169,6 +169,8 @@
sc->mii_pdata = mii;
sc->mii_flags = ma->mii_flags;
+ mii_lock(mii);
+
PHY_RESET(sc);
gxl_writereg(sc, BANK_BIST, BIST_PLL_CTRL, 0x5);
@@ -180,6 +182,8 @@
if (sc->mii_capabilities & BMSR_EXTSTAT)
PHY_READ(sc, MII_EXTSR, &sc->mii_extcapabilities);
+ mii_unlock(mii);
+
mii_phy_add_media(sc);
}
@@ -189,6 +193,8 @@
struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
uint16_t reg;
+ KASSERT(mii_locked(mii));
+
switch (cmd) {
case MII_POLLSTAT:
/* If we're not polling our PHY instance, just return. */
@@ -241,6 +247,8 @@
{
uint16_t bmcr, bmsr, wol, lpa, aner;
+ KASSERT(mii_locked(sc->mii_pdata));
+
PHY_READ(sc, MII_BMCR, &bmcr);
if ((bmcr & BMCR_AUTOEN) == 0)
goto done;
diff -r 1d33714793cf -r 104d203cd257 sys/arch/x86/pci/if_vmx.c
--- a/sys/arch/x86/pci/if_vmx.c Sun Mar 15 22:44:32 2020 +0000
+++ b/sys/arch/x86/pci/if_vmx.c Sun Mar 15 23:04:50 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: if_vmx.c,v 1.57 2020/02/02 05:27:21 thorpej Exp $ */
+/* $NetBSD: if_vmx.c,v 1.58 2020/03/15 23:04:50 thorpej Exp $ */
/* $OpenBSD: if_vmx.c,v 1.16 2014/01/22 06:04:17 brad Exp $ */
/*
@@ -19,7 +19,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_vmx.c,v 1.57 2020/02/02 05:27:21 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_vmx.c,v 1.58 2020/03/15 23:04:50 thorpej Exp $");
#include <sys/param.h>
#include <sys/cpu.h>
@@ -1857,8 +1857,8 @@
/* Initialize ifmedia structures. */
sc->vmx_ethercom.ec_ifmedia = &sc->vmx_media;
- ifmedia_init(&sc->vmx_media, IFM_IMASK, vmxnet3_media_change,
- vmxnet3_media_status);
+ ifmedia_init_with_lock(&sc->vmx_media, IFM_IMASK, vmxnet3_media_change,
+ vmxnet3_media_status, sc->vmx_mtx);
ifmedia_add(&sc->vmx_media, IFM_ETHER | IFM_AUTO, 0, NULL);
ifmedia_add(&sc->vmx_media, IFM_ETHER | IFM_10G_T | IFM_FDX, 0, NULL);
ifmedia_add(&sc->vmx_media, IFM_ETHER | IFM_10G_T, 0, NULL);
@@ -3511,17 +3511,13 @@
ifmr->ifm_status = IFM_AVALID;
ifmr->ifm_active = IFM_ETHER;
- VMXNET3_CORE_LOCK(sc);
- if (ifp->if_link_state != LINK_STATE_UP) {
- VMXNET3_CORE_UNLOCK(sc);
+ if (ifp->if_link_state != LINK_STATE_UP)
return;
- }
ifmr->ifm_status |= IFM_ACTIVE;
if (ifp->if_baudrate >= IF_Gbps(10ULL))
ifmr->ifm_active |= IFM_10G_T;
- VMXNET3_CORE_UNLOCK(sc);
}
static int
diff -r 1d33714793cf -r 104d203cd257 sys/dev/mii/acphy.c
--- a/sys/dev/mii/acphy.c Sun Mar 15 22:44:32 2020 +0000
+++ b/sys/dev/mii/acphy.c Sun Mar 15 23:04:50 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: acphy.c,v 1.29 2019/11/27 10:19:20 msaitoh Exp $ */
+/* $NetBSD: acphy.c,v 1.30 2020/03/15 23:04:50 thorpej Exp $ */
/*
* Copyright 2001 Wasabi Systems, Inc.
@@ -40,7 +40,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acphy.c,v 1.29 2019/11/27 10:19:20 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acphy.c,v 1.30 2020/03/15 23:04:50 thorpej Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -111,17 +111,23 @@
sc->mii_pdata = mii;
sc->mii_flags = ma->mii_flags;
+ mii_lock(mii);
+
PHY_RESET(sc);
/* XXX Check MCR_FX_SEL to set MIIF_HAVE_FIBER? */
PHY_READ(sc, MII_BMSR, &sc->mii_capabilities);
sc->mii_capabilities &= ma->mii_capmask;
- aprint_normal_dev(sc->mii_dev, "");
+
+ mii_unlock(mii);
#define ADD(m, c) ifmedia_add(&mii->mii_media, (m), (c), NULL)
if (sc->mii_flags & MIIF_HAVEFIBER) {
+ aprint_normal_dev(sc->mii_dev, "");
+ mii_lock(mii);
sc->mii_anegticks = MII_ANEGTICKS;
+ mii_unlock(mii);
ADD(IFM_MAKEWORD(IFM_ETHER, IFM_100_FX, 0, sc->mii_inst),
MII_MEDIA_100_TX);
aprint_normal("100baseFX, ");
@@ -140,6 +146,8 @@
struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
uint16_t reg;
+ KASSERT(mii_locked(mii));
+
switch (cmd) {
case MII_POLLSTAT:
/* If we're not polling our PHY instance, just return. */
@@ -194,6 +202,8 @@
struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
uint16_t bmsr, bmcr, dr;
+ KASSERT(mii_locked(mii));
+
mii->mii_media_status = IFM_AVALID;
mii->mii_media_active = IFM_ETHER;
diff -r 1d33714793cf -r 104d203cd257 sys/dev/mii/amhphy.c
--- a/sys/dev/mii/amhphy.c Sun Mar 15 22:44:32 2020 +0000
+++ b/sys/dev/mii/amhphy.c Sun Mar 15 23:04:50 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: amhphy.c,v 1.25 2019/11/27 10:19:20 msaitoh Exp $ */
+/* $NetBSD: amhphy.c,v 1.26 2020/03/15 23:04:50 thorpej Exp $ */
/*
* Copyright 2001 Wasabi Systems, Inc.
@@ -40,7 +40,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: amhphy.c,v 1.25 2019/11/27 10:19:20 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: amhphy.c,v 1.26 2020/03/15 23:04:50 thorpej Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -106,11 +106,15 @@
sc->mii_pdata = mii;
sc->mii_flags = ma->mii_flags;
+ mii_lock(mii);
+
PHY_RESET(sc);
PHY_READ(sc, MII_BMSR, &sc->mii_capabilities);
sc->mii_capabilities &= ma->mii_capmask;
+ mii_unlock(mii);
+
mii_phy_add_media(sc);
}
@@ -120,6 +124,8 @@
struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
uint16_t reg;
+ KASSERT(mii_locked(mii));
+
switch (cmd) {
case MII_POLLSTAT:
/* If we're not polling our PHY instance, just return. */
@@ -174,6 +180,8 @@
struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
uint16_t bmsr, bmcr, ssr;
+ KASSERT(mii_locked(mii));
+
mii->mii_media_status = IFM_AVALID;
mii->mii_media_active = IFM_ETHER;
diff -r 1d33714793cf -r 104d203cd257 sys/dev/mii/atphy.c
--- a/sys/dev/mii/atphy.c Sun Mar 15 22:44:32 2020 +0000
+++ b/sys/dev/mii/atphy.c Sun Mar 15 23:04:50 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: atphy.c,v 1.29 2020/03/13 18:57:49 msaitoh Exp $ */
+/* $NetBSD: atphy.c,v 1.30 2020/03/15 23:04:50 thorpej 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.29 2020/03/13 18:57:49 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: atphy.c,v 1.30 2020/03/15 23:04:50 thorpej Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -200,6 +200,8 @@
if (asc->mii_clk_25m != 0)
atphy_clk_25m(asc);
+ mii_lock(mii);
+
PHY_RESET(sc);
PHY_READ(sc, MII_BMSR, &bmsr);
@@ -208,6 +210,8 @@
if (atphy_is_gige(mpd) && (sc->mii_capabilities & BMSR_EXTSTAT))
PHY_READ(sc, MII_EXTSR, &sc->mii_extcapabilities);
+ mii_unlock(mii);
+
mii_phy_add_media(sc);
}
@@ -217,6 +221,8 @@
struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
uint16_t anar, bmcr, bmsr;
+ KASSERT(mii_locked(mii));
+
switch (cmd) {
case MII_POLLSTAT:
/* If we're not polling our PHY instance, just return. */
@@ -338,6 +344,8 @@
struct mii_data *mii = sc->mii_pdata;
uint16_t bmsr, bmcr, gsr, ssr;
+ KASSERT(mii_locked(mii));
+
mii->mii_media_status = IFM_AVALID;
mii->mii_media_active = IFM_ETHER;
@@ -404,6 +412,8 @@
uint16_t reg;
int i;
+ KASSERT(mii_locked(sc->mii_pdata));
+
/*
* Take PHY out of power down mode.
*
@@ -468,6 +478,8 @@
{
uint16_t anar;
+ KASSERT(mii_locked(sc->mii_pdata));
+
sc->mii_ticks = 0;
anar = BMSR_MEDIA_TO_ANAR(sc->mii_capabilities) | ANAR_CSMA;
if (sc->mii_flags & MIIF_DOPAUSE)
diff -r 1d33714793cf -r 104d203cd257 sys/dev/mii/bmtphy.c
--- a/sys/dev/mii/bmtphy.c Sun Mar 15 22:44:32 2020 +0000
+++ b/sys/dev/mii/bmtphy.c Sun Mar 15 23:04:50 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: bmtphy.c,v 1.36 2019/11/27 10:19:20 msaitoh Exp $ */
+/* $NetBSD: bmtphy.c,v 1.37 2020/03/15 23:04:50 thorpej Exp $ */
/*-
* Copyright (c) 1998, 1999, 2000, 2001 The NetBSD Foundation, Inc.
@@ -61,7 +61,7 @@
*/
#include <sys/cdefs.h>
Home |
Main Index |
Thread Index |
Old Index