Module Name: src
Committed By: nisimura
Date: Fri Mar 27 13:00:22 UTC 2020
Modified Files:
src/sys/arch/arm/sociox: if_ave.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.15 -r1.16 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.15 src/sys/arch/arm/sociox/if_ave.c:1.16
--- src/sys/arch/arm/sociox/if_ave.c:1.15 Tue Mar 24 03:08:02 2020
+++ src/sys/arch/arm/sociox/if_ave.c Fri Mar 27 13:00:22 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: if_ave.c,v 1.15 2020/03/24 03:08:02 nisimura Exp $ */
+/* $NetBSD: if_ave.c,v 1.16 2020/03/27 13:00:22 nisimura Exp $ */
/*-
* Copyright (c) 2020 The NetBSD Foundation, Inc.
@@ -36,15 +36,16 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ave.c,v 1.15 2020/03/24 03:08:02 nisimura Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ave.c,v 1.16 2020/03/27 13:00:22 nisimura Exp $");
#include <sys/param.h>
#include <sys/bus.h>
#include <sys/intr.h>
#include <sys/device.h>
#include <sys/callout.h>
-#include <sys/mbuf.h>
+#include <sys/ioctl.h>
#include <sys/malloc.h>
+#include <sys/mbuf.h>
#include <sys/errno.h>
#include <sys/rndsource.h>
#include <sys/kernel.h>
@@ -249,7 +250,6 @@ static void ave_watchdog(struct ifnet *)
static int ave_ioctl(struct ifnet *, u_long, void *);
static void ave_set_rcvfilt(struct ave_softc *);
static void ave_write_filt(struct ave_softc *, int, const uint8_t *);
-static int ave_ifmedia_upd(struct ifnet *);
static void ave_ifmedia_sts(struct ifnet *, struct ifmediareq *);
static void mii_statchg(struct ifnet *);
static void lnkchg(struct ave_softc *);
@@ -384,19 +384,17 @@ ave_fdt_attach(device_t parent, device_t
sc->sc_model = of_search_compatible(phandle, compat_data)->data;
phy_mode = fdtbus_get_string(phandle, "phy-mode");
- if (phy_mode == NULL) {
+ if (phy_mode == NULL)
aprint_error(": missing 'phy-mode' property\n");
- phy_mode = "rgmii";
- }
aprint_naive("\n");
aprint_normal(": Gigabit Ethernet Controller\n");
- aprint_normal_dev(self, "UniPhier %c%c%c%c AVE%d GbE (%d.%d) %s\n",
+ aprint_normal_dev(self, "UniPhier %c%c%c%c AVE%d GbE (%d.%d)\n",
hwimp >> 24, hwimp >> 16, hwimp >> 8, hwimp,
- sc->sc_model, hwver >> 8, hwver & 0xff, phy_mode);
+ sc->sc_model, hwver >> 8, hwver & 0xff);
aprint_normal_dev(self, "interrupt on %s\n", intrstr);
- sc->sc_100mii = (strcmp(phy_mode, "rgmii") != 0);
+ sc->sc_100mii = (phy_mode && strcmp(phy_mode, "rgmii") != 0);
sc->sc_desops = (sc->sc_model == 64) ? &ave64ops : &ave32ops;
CSR_WRITE(sc, AVEGR, GR_GRST | GR_PHYRST);
@@ -429,7 +427,7 @@ ave_fdt_attach(device_t parent, device_t
sc->sc_phy_id = MII_PHY_ANY;
sc->sc_ethercom.ec_mii = mii;
- ifmedia_init(ifm, 0, ave_ifmedia_upd, ave_ifmedia_sts);
+ ifmedia_init(ifm, 0, ether_mediachange, ave_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) {
@@ -586,7 +584,7 @@ ave_init(struct ifnet *ifp)
/* accept multicast frame or run promisc mode */
ave_set_rcvfilt(sc);
- (void)ave_ifmedia_upd(ifp);
+ (void)ether_mediachange(ifp);
csr = CSR_READ(sc, AVECFG);
if (ifp->if_capenable & IFCAP_CSUM_IPv4_Tx) {
@@ -636,49 +634,6 @@ ave_stop(struct ifnet *ifp, int disable)
ifp->if_timer = 0;
}
-static int
-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, csr;
-
- txcr = CSR_READ(sc, AVETXC);
- rxcr = CSR_READ(sc, AVERXC);
- CSR_WRITE(sc, AVERXC, rxcr &~ RXC_EN); /* stop Rx first */
-
- 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 */
- txcr &= ~(TXC_SPD1000 | TXC_SPD100);
- rxcr &= ~RXC_USEFDX;
- if ((sc->sc_100mii == 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;
-
- /* adjust LINKSEL when RMII/MII too */
- if (sc->sc_100mii) {
- 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);
- CSR_WRITE(sc, AVERXC, rxcr | RXC_EN);
- return 0;
-}
-
static void
ave_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
{
@@ -696,7 +651,8 @@ mii_statchg(struct ifnet *ifp)
{
struct ave_softc *sc = ifp->if_softc;
struct mii_data *mii = &sc->sc_mii;
- uint32_t txcr, rxcr;
+ struct ifmedia *ifm = &mii->mii_media;
+ uint32_t txcr, rxcr, lsel;
/* Get flow control negotiation result. */
if (IFM_SUBTYPE(mii->mii_media.ifm_cur->ifm_media) == IFM_AUTO &&
@@ -707,14 +663,30 @@ 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. */
+ /* Adjust speed 1000/100/10. */
+ txcr &= ~(TXC_SPD1000 | TXC_SPD100);
+ if ((sc->sc_100mii == 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 RMII/MII too. */
+ if (sc->sc_100mii) {
+ lsel = CSR_READ(sc, AVELINKSEL) &~ LINKSEL_SPD100;
+ if (IFM_SUBTYPE(ifm->ifm_cur->ifm_media) == IFM_100_TX)
+ lsel |= LINKSEL_SPD100;
+ CSR_WRITE(sc, AVELINKSEL, lsel);
+ }
+
+ /* Adjust duplexity and 802.3x PAUSE flow control. */
txcr &= ~TXC_FCE;
- rxcr &= ~RXC_FCE;
+ rxcr &= ~(RXC_FCE & RXC_USEFDX);
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;
+ rxcr |= RXC_FCE | RXC_USEFDX;
}
sc->sc_rxc = rxcr;