Module Name:    src
Committed By:   nisimura
Date:           Sun Mar 22 00:05:17 UTC 2020

Modified Files:
        src/sys/arch/arm/sociox: if_ave.c

Log Message:
- move sc_flowflags = 0 line at earlier place.
- handle a set of speed selection operations.


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/arm/sociox/if_ave.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/arch/arm/sociox/if_ave.c
diff -u src/sys/arch/arm/sociox/if_ave.c:1.8 src/sys/arch/arm/sociox/if_ave.c:1.9
--- src/sys/arch/arm/sociox/if_ave.c:1.8	Sat Mar 21 11:46:36 2020
+++ src/sys/arch/arm/sociox/if_ave.c	Sun Mar 22 00:05:17 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ave.c,v 1.8 2020/03/21 11:46:36 nisimura Exp $	*/
+/*	$NetBSD: if_ave.c,v 1.9 2020/03/22 00:05:17 nisimura Exp $	*/
 
 /*-
  * Copyright (c) 2020 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ave.c,v 1.8 2020/03/21 11:46:36 nisimura Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ave.c,v 1.9 2020/03/22 00:05:17 nisimura Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -387,6 +387,9 @@ ave_fdt_attach(device_t parent, device_t
 	aprint_normal_dev(self,
 	    "Ethernet address %s\n", ether_sprintf(enaddr));
 
+	sc->sc_flowflags = 0;
+	sc->sc_rxc = 0;
+
 	mii->mii_ifp = ifp;
 	mii->mii_readreg = mii_readreg;
 	mii->mii_writereg = mii_writereg;
@@ -414,9 +417,6 @@ ave_fdt_attach(device_t parent, device_t
 	ifp->if_stop = ave_stop;
 	IFQ_SET_READY(&ifp->if_snd);
 
-	sc->sc_flowflags = 0;
-	sc->sc_rxc = 0;
-
 	sc->sc_ethercom.ec_capabilities = ETHERCAP_VLAN_MTU;
 	ifp->if_capabilities = IFCAP_CSUM_IPv4_Tx | IFCAP_CSUM_IPv4_Rx;
 
@@ -531,8 +531,12 @@ ave_init(struct ifnet *ifp)
 	sc->sc_txd32 =   (void *)((uintptr_t)sc->sc_sh + AVE32TDB);
 	sc->sc_rxd32 =   (void *)((uintptr_t)sc->sc_sh + AVE32RDB);
 
-	/* build sane and loaded Tx/Rx descriptors */
-	memset(sc->sc_txdescs, 0, sizeof(struct tdes)*AVE_NTXDESC);
+	/* build sane Tx and loaded Rx descriptors */
+	for (i = 0; i < AVE_NTXDESC; i++) {
+		struct tdes *tdes = &sc->sc_txdescs[i];
+		tdes->t2 = tdes->t1 = 0;
+		tdes->t0 = T0_OWN;
+	}
 	for (i = 0; i < AVE_NRXDESC; i++)
 		(void)add_rxbuf(sc, i);
 
@@ -550,6 +554,8 @@ ave_init(struct ifnet *ifp)
 	/* accept multicast frame or run promisc mode */
 	ave_set_rcvfilt(sc);
 
+	(void)ave_ifmedia_upd(ifp);
+
 	csr = CSR_READ(sc, AVECFG);
 	if (ifp->if_capenable & IFCAP_CSUM_IPv4_Tx) {
 		sc->sc_t0csum = 0;
@@ -603,7 +609,7 @@ ave_ifmedia_upd(struct ifnet *ifp)
 {
 	struct ave_softc *sc = ifp->if_softc;
 	struct ifmedia *ifm = &sc->sc_mii.mii_media;
-	uint32_t txcr, rxcr;
+	uint32_t txcr, rxcr, csr;
 
 	txcr = CSR_READ(sc, AVETXC);
 	rxcr = CSR_READ(sc, AVERXC);
@@ -615,14 +621,25 @@ ave_ifmedia_upd(struct ifnet *ifp)
 		; /* advertise flow control pause */
 		; /* adv. 1000FDX,100FDX,100HDX,10FDX,10HDX */
 	} else {
+#if 1 /* XXX not sure to belong here XXX */
 		txcr &= ~(TXC_SPD1000 | TXC_SPD100);
 		rxcr &= ~RXC_USEFDX;
-		if (IFM_SUBTYPE(ifm->ifm_cur->ifm_media) == IFM_1000_T)
+		if ((sc->sc_phymode & CFG_MII) == 0 /* RGMII model */
+		     && IFM_SUBTYPE(ifm->ifm_cur->ifm_media) == IFM_1000_T)
 			txcr |= TXC_SPD1000;
 		else if (IFM_SUBTYPE(ifm->ifm_cur->ifm_media) == IFM_100_TX)
 			txcr |= TXC_SPD100;
 		if (ifm->ifm_media & IFM_FDX)
-			rxcr |= RXC_USEFDX;
+			rxcr |= RXC_USEFDX;	
+
+		/* adjust LINKSEL when MII/RMII too */
+		if (sc->sc_phymode & CFG_MII) {
+			csr = CSR_READ(sc, AVELINKSEL) &~ LINKSEL_SPD100;;
+			if (IFM_SUBTYPE(ifm->ifm_cur->ifm_media) == IFM_100_TX)
+				csr |= LINKSEL_SPD100;
+			CSR_WRITE(sc, AVELINKSEL, csr);
+		}
+#endif
 	}
 	sc->sc_rxc = rxcr;
 	CSR_WRITE(sc, AVETXC, txcr);
@@ -647,10 +664,9 @@ mii_statchg(struct ifnet *ifp)
 {
 	struct ave_softc *sc = ifp->if_softc;
 	struct mii_data *mii = &sc->sc_mii;
-	struct ifmedia * const ifm = &mii->mii_media;
-	uint32_t txcr, rxcr, csr;
+	uint32_t txcr, rxcr;
 
-	/* get flow control negotiation result */
+	/* Get flow control negotiation result. */
 	if (IFM_SUBTYPE(mii->mii_media.ifm_cur->ifm_media) == IFM_AUTO &&
 	    (mii->mii_media_active & IFM_ETH_FMASK) != sc->sc_flowflags)
 		sc->sc_flowflags = mii->mii_media_active & IFM_ETH_FMASK;
@@ -659,32 +675,14 @@ mii_statchg(struct ifnet *ifp)
 	rxcr = CSR_READ(sc, AVERXC);
 	CSR_WRITE(sc, AVERXC, rxcr &~ RXC_EN); /* stop Rx first */
 
-	/* adjust 802.3x PAUSE flow control */
-	if ((mii->mii_media_active & IFM_FDX)
-	    && (sc->sc_flowflags & IFM_ETH_TXPAUSE))
-		txcr |= TXC_FCE;
-	else
-		txcr &= ~TXC_FCE;
-	if ((mii->mii_media_active & IFM_FDX)
-	    && (sc->sc_flowflags & IFM_ETH_RXPAUSE))
-		rxcr |= RXC_FCE;
-	else
-		rxcr &= ~RXC_FCE;
-
-	/* HW does not handle automatic speed adjustment */
-	txcr &= ~(TXC_SPD1000 | TXC_SPD100);
-	if ((sc->sc_phymode & CFG_MII) == 0 /* RGMII model */
-	     && IFM_SUBTYPE(ifm->ifm_cur->ifm_media) == IFM_1000_T)
-		txcr |= TXC_SPD1000;
-	else if (IFM_SUBTYPE(ifm->ifm_cur->ifm_media) == IFM_100_TX)
-		txcr |= TXC_SPD100;
-
-	/* adjust LINKSEL when MII/RMII too */
-	if (sc->sc_phymode & CFG_MII) {
-		csr = CSR_READ(sc, AVELINKSEL) &~ LINKSEL_SPD100;;
-		if (IFM_SUBTYPE(ifm->ifm_cur->ifm_media) == IFM_100_TX)
-			csr |= LINKSEL_SPD100;
-		CSR_WRITE(sc, AVELINKSEL, csr);
+	/* Adjust 802.3x PAUSE flow control. */
+	txcr &= ~TXC_FCE;
+	rxcr &= ~RXC_FCE;
+	if (mii->mii_media_active & IFM_FDX) {
+		if (sc->sc_flowflags & IFM_ETH_TXPAUSE)
+			txcr |= TXC_FCE;
+		if (sc->sc_flowflags & IFM_ETH_RXPAUSE)
+			rxcr |= RXC_FCE;
 	}
 
 	sc->sc_rxc = rxcr;
@@ -811,7 +809,7 @@ ave_write_filt(struct ave_softc *sc, int
 
 	/* pick v4mcast or v6mcast length */
 	n = (en[0] == 0x01) ? 3 : (en[0] == 0x33) ? 2 : ETHER_ADDR_LEN;
-	/* entry 0 is reserved for promisc mode */
+	/* slot 0 is reserved for promisc mode */
 	mskbyte0 = (i > 0) ? genmask0(n) : MSKBYTE0;
 
 	/* set frame address first */

Reply via email to