Module Name:    src
Committed By:   msaitoh
Date:           Sun Oct 29 14:55:16 UTC 2023

Modified Files:
        src/sys/dev/ic: dwc_eqos.c

Log Message:
eqos(4): Set flow control correctly.


To generate a diff of this commit:
cvs rdiff -u -r1.27 -r1.28 src/sys/dev/ic/dwc_eqos.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/ic/dwc_eqos.c
diff -u src/sys/dev/ic/dwc_eqos.c:1.27 src/sys/dev/ic/dwc_eqos.c:1.28
--- src/sys/dev/ic/dwc_eqos.c:1.27	Thu Oct 26 18:02:50 2023
+++ src/sys/dev/ic/dwc_eqos.c	Sun Oct 29 14:55:16 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: dwc_eqos.c,v 1.27 2023/10/26 18:02:50 msaitoh Exp $ */
+/* $NetBSD: dwc_eqos.c,v 1.28 2023/10/29 14:55:16 msaitoh Exp $ */
 
 /*-
  * Copyright (c) 2022 Jared McNeill <jmcne...@invisible.ca>
@@ -38,7 +38,7 @@
 #include "opt_net_mpsafe.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dwc_eqos.c,v 1.27 2023/10/26 18:02:50 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dwc_eqos.c,v 1.28 2023/10/29 14:55:16 msaitoh Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -203,7 +203,7 @@ eqos_update_link(struct eqos_softc *sc)
 {
 	struct mii_data * const mii = &sc->sc_mii;
 	uint64_t baudrate;
-	uint32_t conf;
+	uint32_t conf, flow;
 
 	baudrate = ifmedia_baudrate(mii->mii_media_active);
 
@@ -227,13 +227,28 @@ eqos_update_link(struct eqos_softc *sc)
 		break;
 	}
 
+	/* Set duplex. */
 	if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FDX) != 0) {
 		conf |= GMAC_MAC_CONFIGURATION_DM;
 	} else {
 		conf &= ~GMAC_MAC_CONFIGURATION_DM;
 	}
-
 	WR4(sc, GMAC_MAC_CONFIGURATION, conf);
+
+	/* Set TX flow control. */
+	if (mii->mii_media_active & IFM_ETH_TXPAUSE) {
+		flow = GMAC_MAC_Q0_TX_FLOW_CTRL_TFE;
+		flow |= 0xFFFFU << GMAC_MAC_Q0_TX_FLOW_CTRL_PT_SHIFT;
+	} else
+		flow = 0;
+	WR4(sc, GMAC_MAC_Q0_TX_FLOW_CTRL, flow);
+
+	/* Set RX flow control. */
+	if (mii->mii_media_active & IFM_ETH_RXPAUSE)
+		flow = GMAC_MAC_RX_FLOW_CTRL_RFE;
+	else
+		flow = 0;
+	WR4(sc, GMAC_MAC_RX_FLOW_CTRL, flow);
 }
 
 static void
@@ -658,14 +673,12 @@ eqos_init_locked(struct eqos_softc *sc)
 	val |= __SHIFTIN(rqs, GMAC_MTL_RXQ0_OPERATION_MODE_RQS);
 	WR4(sc, GMAC_MTL_RXQ0_OPERATION_MODE, val);
 
-	/* Enable flow control */
-	val = RD4(sc, GMAC_MAC_Q0_TX_FLOW_CTRL);
-	val |= 0xFFFFU << GMAC_MAC_Q0_TX_FLOW_CTRL_PT_SHIFT;
-	val |= GMAC_MAC_Q0_TX_FLOW_CTRL_TFE;
-	WR4(sc, GMAC_MAC_Q0_TX_FLOW_CTRL, val);
-	val = RD4(sc, GMAC_MAC_RX_FLOW_CTRL);
-	val |= GMAC_MAC_RX_FLOW_CTRL_RFE;
-	WR4(sc, GMAC_MAC_RX_FLOW_CTRL, val);
+	/*
+	 * Disable flow control.
+	 * It'll be configured later from the negotiated result.
+	 */
+	WR4(sc, GMAC_MAC_Q0_TX_FLOW_CTRL, 0);
+	WR4(sc, GMAC_MAC_RX_FLOW_CTRL, 0);
 
 	/* set RX queue mode. must be in DCB mode. */
 	val = __SHIFTIN(GMAC_RXQ_CTRL0_EN_DCB, GMAC_RXQ_CTRL0_EN_MASK);
@@ -1431,7 +1444,6 @@ eqos_attach(struct eqos_softc *sc)
 	struct ifnet * const ifp = &sc->sc_ec.ec_if;
 	uint8_t eaddr[ETHER_ADDR_LEN];
 	u_int userver, snpsver;
-	int mii_flags = 0;
 	int error;
 	int n;
 
@@ -1556,7 +1568,7 @@ eqos_attach(struct eqos_softc *sc)
 	mii->mii_writereg = eqos_mii_writereg;
 	mii->mii_statchg = eqos_mii_statchg;
 	mii_attach(sc->sc_dev, mii, 0xffffffff, sc->sc_phy_id, MII_OFFSET_ANY,
-	    mii_flags);
+	    MIIF_DOPAUSE);
 
 	if (LIST_EMPTY(&mii->mii_phys)) {
 		aprint_error_dev(sc->sc_dev, "no PHY found!\n");

Reply via email to