Module Name:    src
Committed By:   nisimura
Date:           Mon Mar 23 05:27:42 UTC 2020

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

Log Message:
try to catch RMII/MII phy condition. fix divisor cal. nuke &= 03 error


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 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.3 src/sys/arch/arm/sociox/if_scx.c:1.4
--- src/sys/arch/arm/sociox/if_scx.c:1.3	Mon Mar 23 04:34:16 2020
+++ src/sys/arch/arm/sociox/if_scx.c	Mon Mar 23 05:27:41 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_scx.c,v 1.3 2020/03/23 04:34:16 nisimura Exp $	*/
+/*	$NetBSD: if_scx.c,v 1.4 2020/03/23 05:27:41 nisimura Exp $	*/
 
 /*-
  * Copyright (c) 2020 The NetBSD Foundation, Inc.
@@ -50,7 +50,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_scx.c,v 1.3 2020/03/23 04:34:16 nisimura Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_scx.c,v 1.4 2020/03/23 05:27:41 nisimura Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -188,17 +188,6 @@ __KERNEL_RCSID(0, "$NetBSD: if_scx.c,v 1
 #define  OMR_TXE	(1U<<13)	/* start Tx DMA engine, 0 to stop */
 #define  OMR_RXE	(1U<<1)		/* start Rx DMA engine, 0 to stop */
 
-const struct {
-	uint16_t freq, bit; /* GAR 5:2 MDIO frequency selection */
-} garclk[] = {
-	{ 35,	2 },	/* 25-35 MHz */
-	{ 60,	3 },	/* 35-60 MHz */
-	{ 100,	0 },	/* 60-100 MHz */
-	{ 150,	1 },	/* 100-150 MHz */
-	{ 250,	4 },	/* 150-250 MHz */
-	{ 300,	5 },	/* 250-300 MHz */
-	{ 0 },
-};
 static int get_garclk(uint32_t);
 
 /* descriptor format definition */
@@ -306,6 +295,7 @@ struct scx_softc {
 	uint32_t sc_gar;		/* GAR 5:2 clock selection */
 	uint32_t sc_t0coso;		/* T0_CSUM | T0_SGOL to run */
 	int sc_ucodeloaded;		/* ucode for H2M/M2H/PKT */
+	int sc_100mii;			/* 1<<15 RMII/MII, 0 for RGMII */
 	int sc_phandle;			/* fdt phandle */
 
 	bus_dmamap_t sc_cddmamap;	/* control data DMA map */
@@ -423,6 +413,7 @@ scx_fdt_attach(device_t parent, device_t
 	bus_addr_t addr[2];
 	bus_size_t size[2];
 	char intrstr[128];
+	const char *phy_mode;
 
 	if (fdtbus_get_reg(phandle, 0, addr+0, size+0) != 0
 	    || bus_space_map(faa->faa_bst, addr[0], size[0], 0, &bsh) != 0) {
@@ -445,6 +436,12 @@ scx_fdt_attach(device_t parent, device_t
 		goto fail;
 	}
 
+	phy_mode = fdtbus_get_string(phandle, "phy-mode");
+	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, "interrupt on %s\n", intrstr);
@@ -457,6 +454,7 @@ scx_fdt_attach(device_t parent, device_t
 	sc->sc_eesz = size[1];
 	sc->sc_dmat = faa->faa_dmat;
 	sc->sc_phandle = phandle;
+	sc->sc_100mii = (strcmp(phy_mode, "rgmii") != 0) ? MCR_USEMII : 0;
 
 	scx_attach_i(sc);
 	return;
@@ -1392,13 +1390,27 @@ mac_write(struct scx_softc *sc, int reg,
 static int
 get_garclk(uint32_t freq)
 {
+
+	const struct {
+		uint16_t freq, bit; /* GAR 5:2 MDIO frequency selection */
+	} garclk[] = {
+		{ 35,	2 },	/* 25-35 MHz */
+		{ 60,	3 },	/* 35-60 MHz */
+		{ 100,	0 },	/* 60-100 MHz */
+		{ 150,	1 },	/* 100-150 MHz */
+		{ 250,	4 },	/* 150-250 MHz */
+		{ 300,	5 },	/* 250-300 MHz */
+	};
 	int i;
 
-	for (i = 0; garclk[i].freq != 0; i++) {
+	/* convert MDIO clk to a divisor value */
+	if (freq < garclk[0].freq)
+		return garclk[0].bit;
+	for (i = 1; i < __arraycount(garclk); i++) {
 		if (freq < garclk[i].freq)
-			return garclk[i].bit;
+			return garclk[i-1].bit;
 	}
-	return garclk[i - 1].bit;
+	return garclk[__arraycount(garclk) - 1].bit;
 }
 
 static void
@@ -1441,7 +1453,6 @@ injectucode(struct scx_softc *sc, int po
 	uint32_t ucode;
 	int i;
 
-	port &= 03;
 	if (!bus_space_map(sc->sc_st, addr, size, 0, &bsh) != 0) {
 		aprint_error_dev(sc->sc_dev,
 		    "eeprom map failure for ucode port 0x%x\n", port);

Reply via email to