From nobody Mon Mar 16 10:39:45 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4fZBRq1b19z6VBPp for ; Mon, 16 Mar 2026 10:39:51 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R12" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4fZBRq13z6z4JNt for ; Mon, 16 Mar 2026 10:39:51 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1773657591; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=MvldroziWoQPPa9nvzQXos5LaGxxLORc2dMr30zDJqw=; b=htX4rL4/al0wuT+JoBpuFODS/3PGoJwEkQJops+VnmUnfyhYohiQU4HCi8ztT2FVkS6F9P 3CSm/bwfXo5W4EWmiXMQ2ECAQ0MF/9b4Qt+pIno9xHLMzEQli0OdyKCLjGCQvknTBf/APm ke0f+yo+b2msa54elQxgsXSGGClzJQaQoKB9yu+6lqK5ne2cdgE5954iOiXpUlDT9G+BLn y0rK32jSbaO2sk8HXvmAnb12gw6EVmTDs6Hq2uui9r4QxjUFrrIrJjtdMAnXmTIyf6n7fs S4KIZ/uBMw5ipfB11WkyjXLrGZkDE4FmDJyoQBsXcsazzaM+PiLIwOnSBXif/w== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1773657591; a=rsa-sha256; cv=none; b=jhBgrZVcUt2+BBBlVJ88oBa05Gm/XbC459s2phEuorcn0hli0oUErI0KSUTG0jaRBBuH5X Tcx0sEQbbsgKWPIL4bYWr6joyDG5hZQEL6Lo+ie9GaM6IY2ml4Z5/i+IqS2iY8Aaf4jSo1 pBRZmDhYrDTbyHvx/slnKA6+rurKZsPwbAZXeNWGwEEGlgCzilCHuonpxGbw8H0/vmvXzh WXVIAtBlhfl+yYLtbAldzw+LQ6e8Q4KKRXa6rEmY4oaSVqQVl/cEF3RjJCJ2pLR6nO47u2 1jlG6VL22x4gOUm3izwO1F/ZGyskK1ZLdsEn/fsaJhBkNFZUbM6zCts/oCI6JQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1773657591; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=MvldroziWoQPPa9nvzQXos5LaGxxLORc2dMr30zDJqw=; b=wTF4S39WiI36hB1KjgFFpuysxbuOihVgk/aovVfSQtoFLiH3TpUy6Q3qASNl9/XE2FBnDU jhKMJGyE92Ba+JfVvfCUD6OmD4k4evTRDNTZf/KQE5prHs4nSa4lox547XJQKMCyV+CXqu HRPhqCULpnJx6zceADQcgVkU1JJRerUSdCbc6FH8ji7JMBXMG29ynO9PCU+PFSt447PyfX H/p1tu9vYoachW0NijBgPHmSbRCH2mpoJGefrY4dEWKb+OTHvVNhSCRSDUNHwpEGnVOna8 Xk/1aAGCQA7lKRqEGzV3uUruD06vfiQc60PNSINcfMPVgD69inMOHHJAXAUAEQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4fZBRq00v0zX2M for ; Mon, 16 Mar 2026 10:39:51 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 1f3be by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Mon, 16 Mar 2026 10:39:45 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Cc: Rafael Kitover From: Pouria Mousavizadeh Tehrani Subject: git: 33e0568d30a6 - main - ure(4): Fix spurious link flaps from MII List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: pouria X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 33e0568d30a687b3bbd3f00fd9b323ff031e39a2 Auto-Submitted: auto-generated Date: Mon, 16 Mar 2026 10:39:45 +0000 Message-Id: <69b7ddf1.1f3be.24a64c38@gitrepo.freebsd.org> The branch main has been updated by pouria: URL: https://cgit.FreeBSD.org/src/commit/?id=33e0568d30a687b3bbd3f00fd9b323ff031e39a2 commit 33e0568d30a687b3bbd3f00fd9b323ff031e39a2 Author: Rafael Kitover AuthorDate: 2026-03-16 10:32:17 +0000 Commit: Pouria Mousavizadeh Tehrani CommitDate: 2026-03-16 10:37:37 +0000 ure(4): Fix spurious link flaps from MII A race condition in the MII layer causes spurious link down events. In `statchg`, on link down, check if the PHY reports the link as actually down using the BMSR register, if not, force the status of the link to back up and restart TX. Do the same in a MII `linkchg` handler. On actual link up, restart TX in case it went idle and down. PR: 252165 Signed-off-by: Rafael Kitover Reviewed by: pouria Differential Revision: https://reviews.freebsd.org/D55682 --- sys/dev/usb/net/if_ure.c | 69 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 66 insertions(+), 3 deletions(-) diff --git a/sys/dev/usb/net/if_ure.c b/sys/dev/usb/net/if_ure.c index 257051e6e379..aca510b3b863 100644 --- a/sys/dev/usb/net/if_ure.c +++ b/sys/dev/usb/net/if_ure.c @@ -128,6 +128,7 @@ static usb_callback_t ure_bulk_write_callback; static miibus_readreg_t ure_miibus_readreg; static miibus_writereg_t ure_miibus_writereg; static miibus_statchg_t ure_miibus_statchg; +static miibus_linkchg_t ure_miibus_linkchg; static uether_fn_t ure_attach_post; static uether_fn_t ure_init; @@ -184,6 +185,7 @@ static device_method_t ure_methods[] = { DEVMETHOD(miibus_readreg, ure_miibus_readreg), DEVMETHOD(miibus_writereg, ure_miibus_writereg), DEVMETHOD(miibus_statchg, ure_miibus_statchg), + DEVMETHOD(miibus_linkchg, ure_miibus_linkchg), DEVMETHOD_END }; @@ -443,6 +445,8 @@ ure_miibus_statchg(device_t dev) struct mii_data *mii; if_t ifp; int locked; + uint16_t bmsr; + bool new_link, old_link; sc = device_get_softc(dev); mii = GET_MII(sc); @@ -455,6 +459,7 @@ ure_miibus_statchg(device_t dev) (if_getdrvflags(ifp) & IFF_DRV_RUNNING) == 0) goto done; + old_link = (sc->sc_flags & URE_FLAG_LINK) ? true : false; sc->sc_flags &= ~URE_FLAG_LINK; if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) == (IFM_ACTIVE | IFM_AVALID)) { @@ -475,14 +480,72 @@ ure_miibus_statchg(device_t dev) } } - /* Lost link, do nothing. */ - if ((sc->sc_flags & URE_FLAG_LINK) == 0) - goto done; + new_link = (sc->sc_flags & URE_FLAG_LINK) ? true : false; + if (old_link && !new_link) { + /* + * MII layer reports link down. Verify by reading + * the PHY BMSR register directly. BMSR link status + * is latched-low, so read twice: first clears any + * stale latch, second gives current state. + */ + (void)ure_ocp_reg_read(sc, + URE_OCP_BASE_MII + MII_BMSR * 2); + bmsr = ure_ocp_reg_read(sc, + URE_OCP_BASE_MII + MII_BMSR * 2); + + if (bmsr & BMSR_LINK) { + /* + * PHY still has link. This is a spurious + * link-down from the MII polling race (see + * PR 252165). Restore IFM_ACTIVE so the + * subsequent MIIBUS_LINKCHG check in + * mii_phy_update sees no change. + */ + device_printf(dev, + "spurious link down (PHY link up), overriding\n"); + sc->sc_flags |= URE_FLAG_LINK; + mii->mii_media_status |= IFM_ACTIVE; + } + } done: if (!locked) URE_UNLOCK(sc); } +static void +ure_miibus_linkchg(device_t dev) +{ + struct ure_softc *sc; + struct mii_data *mii; + int locked; + uint16_t bmsr; + + sc = device_get_softc(dev); + mii = GET_MII(sc); + locked = mtx_owned(&sc->sc_mtx); + if (locked == 0) + URE_LOCK(sc); + + /* + * This is called by the default miibus linkchg handler + * before it calls if_link_state_change(). If the PHY + * still has link but the MII layer lost IFM_ACTIVE due + * to the polling race (see PR 252165), restore it so the + * notification goes out as LINK_STATE_UP rather than DOWN. + */ + if (mii != NULL && (mii->mii_media_status & IFM_ACTIVE) == 0) { + (void)ure_ocp_reg_read(sc, + URE_OCP_BASE_MII + MII_BMSR * 2); + bmsr = ure_ocp_reg_read(sc, + URE_OCP_BASE_MII + MII_BMSR * 2); + if (bmsr & BMSR_LINK) + mii->mii_media_status |= IFM_ACTIVE; + } + + if (locked == 0) + URE_UNLOCK(sc); +} + /* * Probe for a RTL8152/RTL8153/RTL8156 chip. */