Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/arm/sociox - handle register adjustment when link s...
details: https://anonhg.NetBSD.org/src/rev/9d81b0b4736f
branches: trunk
changeset: 746060:9d81b0b4736f
user: nisimura <nisimura%NetBSD.org@localhost>
date: Sat Mar 21 11:46:36 2020 +0000
description:
- handle register adjustment when link speed change.
- make some more care on reset operation.
diffstat:
sys/arch/arm/sociox/if_ave.c | 45 ++++++++++++++++++++++++-------------------
1 files changed, 25 insertions(+), 20 deletions(-)
diffs (129 lines):
diff -r 8352bce2bb0e -r 9d81b0b4736f sys/arch/arm/sociox/if_ave.c
--- a/sys/arch/arm/sociox/if_ave.c Sat Mar 21 08:16:19 2020 +0000
+++ b/sys/arch/arm/sociox/if_ave.c Sat Mar 21 11:46:36 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: if_ave.c,v 1.7 2020/03/21 08:16:19 nisimura Exp $ */
+/* $NetBSD: if_ave.c,v 1.8 2020/03/21 11:46:36 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.7 2020/03/21 08:16:19 nisimura Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ave.c,v 1.8 2020/03/21 11:46:36 nisimura Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -77,9 +77,9 @@
#define AVEGISR 0x104 /* global interrupt status */
#define GISR_PHY (1U<<24) /* PHY status change detected */
#define GISR_TXCI (1U<<16) /* transmission completed */
-#define GISR_RXERR (1U<<8) /* Rx frame error detected */
-#define GISR_RXOVF (1U<<7) /* Rx oveflow detected */
-#define GISR_RXDROP (1U<<6) /* Rx has been dropped */
+#define GISR_RXF2L (1U<<8) /* Rx frame length beyond limit */
+#define GISR_RXOVF (1U<<7) /* RxFIFO oveflow detected */
+#define GISR_RXDROP (1U<<6) /* PAUSE frame has been dropped */
#define GISR_RXIT (1U<<5) /* receive itimer notify */
#define AVETXC 0x200 /* transmit control */
#define TXC_FCE (1U<<18) /* enable Tx flow control */
@@ -133,9 +133,9 @@
#define AVE32RDB 0x1800 /* 32bit Rx store base, upto 2048 */
#define AVERMIIC 0x8028 /* RMII control */
-#define RMIIC_RST (1U<<16) /* reset */
-#define AVELINKSEL 0x8034 /* link speed selection */
-#define LINKSEL_SPD100 (1U<<0) /* RMII speed 100Mbps */
+#define RMIIC_RST (1U<<16) /* reset operation */
+#define AVELINKSEL 0x8034 /* RMII speed selection */
+#define LINKSEL_SPD100 (1U<<0) /* use 100Mbps */
/*
* descriptor size is 12 bytes when 64bit paddr design, 8 bytes otherwise.
@@ -486,12 +486,19 @@
static void
ave_reset(struct ave_softc *sc)
{
+ uint32_t csr;
CSR_WRITE(sc, AVERXC, 0); /* stop Rx first */
CSR_WRITE(sc, AVEDESCC, 0); /* stop Tx/Rx descriptor engine */
+ if (sc->sc_phymode & CFG_MII) {
+ csr = CSR_READ(sc, AVERMIIC);
+ CSR_WRITE(sc, AVERMIIC, csr &~ RMIIC_RST);
+ DELAY(10);
+ CSR_WRITE(sc , AVERMIIC, csr);
+ }
CSR_WRITE(sc, AVEGR, GR_RXRST); /* assert RxFIFO reset operation */
DELAY(50);
- CSR_WRITE(sc, AVEGR, 0); /* negate reset */
+ CSR_WRITE(sc, AVEGR, 0);
CSR_WRITE(sc, AVEGISR, GISR_RXOVF); /* clear OVF condition */
}
@@ -564,7 +571,7 @@
CSR_WRITE(sc, AVEITIRQC, csr | ITIRQC_R0E | INTMVAL);
CSR_WRITE(sc, AVEGIMR, /* PHY interrupt is not maskable */
- GISR_TXCI | GISR_RXIT | GISR_RXDROP | GISR_RXOVF | GISR_RXERR);
+ GISR_TXCI | GISR_RXIT | GISR_RXDROP | GISR_RXOVF | GISR_RXF2L);
ifp->if_flags |= IFF_RUNNING;
ifp->if_flags &= ~IFF_OACTIVE;
@@ -664,21 +671,19 @@
else
rxcr &= ~RXC_FCE;
- /* HW does not handle auto speed adjustment */
+ /* 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_100_TX)
+ && 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);
+ csr = CSR_READ(sc, AVELINKSEL) &~ LINKSEL_SPD100;;
if (IFM_SUBTYPE(ifm->ifm_cur->ifm_media) == IFM_100_TX)
csr |= LINKSEL_SPD100;
- else
- csr &= ~LINKSEL_SPD100;
CSR_WRITE(sc, AVELINKSEL, csr);
}
@@ -804,15 +809,15 @@
{
uint32_t macl, mach, n, mskbyte0;
- macl = mach = 0;
- macl |= (en[3]<<24) | (en[2]<<16)| (en[1]<<8) | en[0];
- mach |= (en[5]<<8) | en[4];
/* pick v4mcast or v6mcast length */
n = (en[0] == 0x01) ? 3 : (en[0] == 0x33) ? 2 : ETHER_ADDR_LEN;
/* entry 0 is reserved for promisc mode */
mskbyte0 = (i > 0) ? genmask0(n) : MSKBYTE0;
/* set frame address first */
+ macl = mach = 0;
+ macl |= (en[3]<<24) | (en[2]<<16)| (en[1]<<8) | en[0];
+ mach |= (en[5]<<8) | en[4];
CSR_WRITE(sc, AVEAFB + (i * 0x40) + 0, macl);
CSR_WRITE(sc, AVEAFB + (i * 0x40) + 4, mach);
/* set byte mask according to mask length, any of 6, 3, or 2 */
@@ -1080,8 +1085,8 @@
CSR_WRITE(sc, AVEGISR, GISR_RXDROP);
if (stat & GISR_RXOVF)
CSR_WRITE(sc, AVEGISR, GISR_RXOVF);
- if (stat & GISR_RXERR)
- CSR_WRITE(sc, AVEGISR, GISR_RXERR);
+ if (stat & GISR_RXF2L)
+ CSR_WRITE(sc, AVEGISR, GISR_RXF2L);
if (stat & GISR_RXIT) {
rxintr(sc);
CSR_WRITE(sc, AVEGISR, GISR_RXIT);
Home |
Main Index |
Thread Index |
Old Index