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 <[email protected]>
@@ -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");