Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 2 Mar 2022 10:33:31 -0500
From:      "J.R. Oldroyd" <fbsd@opal.com>
To:        freebsd-net@freebsd.org
Subject:   em(4) does not autonegotiate when fixed media is set
Message-ID:  <20220302103331.3a50e443@opal.com>

next in thread | raw e-mail | index | archive | help
--MP_/6/of77.TTJmjfeiMb6d=FZ6
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

An em(4) interface configured with fixed media/mediatype settings, as in:
	ifconfig em0 media 100baseTX mediatype full-duplex
does not respond to autonegotiation from the switch it is connected to.
(Actually, it does for 1000base but not for 100base or 10base.)  As a
result, the switch may end up with mis-matched configuration.

Attached patch enables autonegotiation even when media settings are set
to fixed 100base or 10base.

I am not sure if there should also be:
	hw->phy.autoneg_wait_to_complete = FALSE;
for these 100base and 10base cases to handle the situation where the other
end isn't going to autonegotiate either.

	-jr
 

--MP_/6/of77.TTJmjfeiMb6d=FZ6
Content-Type: text/x-patch
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=if_em.c.diff

diff --git a/sys/dev/e1000/if_em.c b/sys/dev/e1000/if_em.c
index b71e64b214c..ae0815e2b65 100644
--- a/sys/dev/e1000/if_em.c
+++ b/sys/dev/e1000/if_em.c
@@ -1610,20 +1610,26 @@ em_if_media_change(if_ctx_t ctx)
 		adapter->hw.phy.autoneg_advertised = ADVERTISE_1000_FULL;
 		break;
 	case IFM_100_TX:
-		adapter->hw.mac.autoneg = FALSE;
-		adapter->hw.phy.autoneg_advertised = 0;
-		if ((ifm->ifm_media & IFM_GMASK) == IFM_FDX)
+		adapter->hw.mac.autoneg = DO_AUTO_NEG;
+		if ((ifm->ifm_media & IFM_GMASK) == IFM_FDX) {
+			adapter->hw.phy.autoneg_advertised = ADVERTISE_100_FULL;
 			adapter->hw.mac.forced_speed_duplex = ADVERTISE_100_FULL;
-		else
+		}
+		else {
+			adapter->hw.phy.autoneg_advertised = ADVERTISE_100_HALF;
 			adapter->hw.mac.forced_speed_duplex = ADVERTISE_100_HALF;
+		}
 		break;
 	case IFM_10_T:
-		adapter->hw.mac.autoneg = FALSE;
-		adapter->hw.phy.autoneg_advertised = 0;
-		if ((ifm->ifm_media & IFM_GMASK) == IFM_FDX)
+		adapter->hw.mac.autoneg = DO_AUTO_NEG;
+		if ((ifm->ifm_media & IFM_GMASK) == IFM_FDX) {
+			adapter->hw.phy.autoneg_advertised = ADVERTISE_10_FULL;
 			adapter->hw.mac.forced_speed_duplex = ADVERTISE_10_FULL;
-		else
+		}
+		else {
+			adapter->hw.phy.autoneg_advertised = ADVERTISE_10_HALF;
 			adapter->hw.mac.forced_speed_duplex = ADVERTISE_10_HALF;
+		}
 		break;
 	default:
 		device_printf(adapter->dev, "Unsupported media type\n");

--MP_/6/of77.TTJmjfeiMb6d=FZ6--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20220302103331.3a50e443>