Module Name:    src
Committed By:   nisimura
Date:           Fri Mar 27 13:00:13 UTC 2020

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

Log Message:
extend mii_statchg() to use ether_mediachange(). care about hash filter 
selection.


To generate a diff of this commit:
cvs rdiff -u -r1.20 -r1.21 src/sys/arch/arm/sociox/if_scx.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_scx.c
diff -u src/sys/arch/arm/sociox/if_scx.c:1.20 src/sys/arch/arm/sociox/if_scx.c:1.21
--- src/sys/arch/arm/sociox/if_scx.c:1.20	Fri Mar 27 09:19:33 2020
+++ src/sys/arch/arm/sociox/if_scx.c	Fri Mar 27 13:00:13 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_scx.c,v 1.20 2020/03/27 09:19:33 nisimura Exp $	*/
+/*	$NetBSD: if_scx.c,v 1.21 2020/03/27 13:00:13 nisimura Exp $	*/
 
 /*-
  * Copyright (c) 2020 The NetBSD Foundation, Inc.
@@ -57,7 +57,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_scx.c,v 1.20 2020/03/27 09:19:33 nisimura Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_scx.c,v 1.21 2020/03/27 13:00:13 nisimura Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -224,8 +224,7 @@ __KERNEL_RCSID(0, "$NetBSD: if_scx.c,v 1
 #define GMACEVCTL	0x0100		/* event counter control */
 #define GMACEVCNT(i)	((i)*4+0x114)	/* event counter 0x114~284 */
 
-#define GMACMHT0	0x0500		/* 256bit multicast hash table 0 - 7 */
-#define GMACMHT(i)	((i)*4+0x500)
+#define GMACMHT(i)	((i)*4+0x500)	/* 256bit multicast hash table 0 - 7 */
 #define GMACVHT		0x0588		/* VLAN tag hash */
 
 /* 0x0700-0734 ??? */
@@ -452,7 +451,6 @@ static void scx_stop(struct ifnet *, int
 static void scx_watchdog(struct ifnet *);
 static int scx_ioctl(struct ifnet *, u_long, void *);
 static void scx_set_rcvfilt(struct scx_softc *);
-static int scx_ifmedia_upd(struct ifnet *);
 static void scx_ifmedia_sts(struct ifnet *, struct ifmediareq *);
 static void mii_statchg(struct ifnet *);
 static void phy_tick(void *);
@@ -709,7 +707,7 @@ sc->sc_mdclk <<= 2;
 	mii->mii_statchg = mii_statchg;
 
 	sc->sc_ethercom.ec_mii = mii;
-	ifmedia_init(ifm, 0, scx_ifmedia_upd, scx_ifmedia_sts);
+	ifmedia_init(ifm, 0, ether_mediachange, scx_ifmedia_sts);
 	mii_attach(sc->sc_dev, mii, 0xffffffff, sc->sc_phy_id,
 	    MII_OFFSET_ANY, MIIF_DOPAUSE);
 	if (LIST_FIRST(&mii->mii_phys) == NULL) {
@@ -881,7 +879,7 @@ scx_init(struct ifnet *ifp)
 	/* accept multicast frame or run promisc mode */
 	scx_set_rcvfilt(sc);
 
-	(void)scx_ifmedia_upd(ifp);
+	(void)ether_mediachange(ifp);
 
 	/* build sane Tx */
 	memset(sc->sc_txdescs, 0, sizeof(struct tdes) * MD_NTXDESC);
@@ -1077,16 +1075,16 @@ printf("[%d] %s\n", i, ether_sprintf(enm
 		i++;
 	}
 	ETHER_UNLOCK(ec);
-
 	if (crc)
-		csr |= AFR_MHTE | AFR_HPF; /* use hash+perfect */
+		csr |= AFR_MHTE;
+	csr |= AFR_HPF; /* use hash+perfect */
 	mac_write(sc, GMACMHTH, mchash[1]);
 	mac_write(sc, GMACMHTL, mchash[0]);
 	mac_write(sc, GMACAFR, csr);
 	return;
 
  update:
-	/* With PM or AM, MHTE/MHT0-7 are never consulted. really? */
+	/* With PR or PM, MHTE/MHTL/MHTH are never consulted. really? */
 	if (ifp->if_flags & IFF_PROMISC)
 		csr |= AFR_PR;	/* run promisc. mode */
 	else
@@ -1095,39 +1093,6 @@ printf("[%d] %s\n", i, ether_sprintf(enm
 	return;
 }
 
-static int
-scx_ifmedia_upd(struct ifnet *ifp)
-{
-	struct scx_softc *sc = ifp->if_softc;
-	struct ifmedia *ifm = &sc->sc_mii.mii_media;
-
-	if (IFM_SUBTYPE(ifm->ifm_cur->ifm_media) == IFM_AUTO) {
-		; /* restart AN */
-		; /* enable AN */
-		; /* advertise flow control pause */
-		; /* adv. 1000FDX,100FDX,100HDX,10FDX,10HDX */
-	} else {
-#if 1 /* XXX not sure to belong here XXX */
-		uint32_t mcr = mac_read(sc, GMACMCR);
-		if (IFM_SUBTYPE(ifm->ifm_cur->ifm_media) == IFM_1000_T)
-			mcr &= ~MCR_USEMII; /* RGMII+SPD1000 */
-		else {
-			if (IFM_SUBTYPE(ifm->ifm_cur->ifm_media) == IFM_100_TX
-			    && sc->sc_100mii)
-				mcr |= MCR_SPD100;
-			mcr |= MCR_USEMII;
-		}
-		if (ifm->ifm_cur->ifm_media & IFM_FDX)
-			mcr |= MCR_USEFDX;
-		mcr |= MCR_CST | MCR_JE;
-		if (sc->sc_100mii == 0)
-			mcr |= MCR_IBN;
-		mac_write(sc, GMACMCR, mcr);
-#endif
-	}
-	return 0;
-}
-
 static void
 scx_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
 {
@@ -1145,7 +1110,8 @@ mii_statchg(struct ifnet *ifp)
 {
 	struct scx_softc *sc = ifp->if_softc;
 	struct mii_data *mii = &sc->sc_mii;
-	uint32_t fcr;
+	struct ifmedia * ifm = &mii->mii_media;
+	uint32_t mcr, fcr;
 
 #if 1
 	/* decode MIISR register value */
@@ -1165,14 +1131,31 @@ mii_statchg(struct ifnet *ifp)
 	    (mii->mii_media_active & IFM_ETH_FMASK) != sc->sc_flowflags)
 		sc->sc_flowflags = mii->mii_media_active & IFM_ETH_FMASK;
 
-	/* Adjust PAUSE flow control. */
+	/* Adjust speed 1000/100/10. */
+	mcr = mac_read(sc, GMACMCR);
+	if (IFM_SUBTYPE(ifm->ifm_cur->ifm_media) == IFM_1000_T)
+		mcr &= ~MCR_USEMII; /* RGMII+SPD1000 */
+	else {
+		if (IFM_SUBTYPE(ifm->ifm_cur->ifm_media) == IFM_100_TX
+		    && sc->sc_100mii)
+			mcr |= MCR_SPD100;
+		mcr |= MCR_USEMII;
+	}
+	mcr |= MCR_CST | MCR_JE;
+	if (sc->sc_100mii == 0)
+		mcr |= MCR_IBN;
+
+	/* Adjust duplexity and PAUSE flow control. */
+	mcr &= ~MCR_USEFDX;
 	fcr = mac_read(sc, GMACFCR) & ~(FCR_TFE | FCR_RFE);
 	if (mii->mii_media_active & IFM_FDX) {
 		if (sc->sc_flowflags & IFM_ETH_TXPAUSE)
 			fcr |= FCR_TFE;
 		if (sc->sc_flowflags & IFM_ETH_RXPAUSE)
 			fcr |= FCR_RFE;
+		mcr |= MCR_USEFDX;	
 	}
+	mac_write(sc, GMACMCR, mcr);
 	mac_write(sc, GMACFCR, fcr);
 
 printf("%ctxfe, %crxfe\n",

Reply via email to