Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 30 Apr 2017 07:51:32 +0000 (UTC)
From:      Luiz Otavio O Souza <loos@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r317605 - head/sys/dev/etherswitch/e6000sw
Message-ID:  <201704300751.v3U7pWYg036469@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: loos
Date: Sun Apr 30 07:51:31 2017
New Revision: 317605
URL: https://svnweb.freebsd.org/changeset/base/317605

Log:
  When the switch is set to operate in the Multi Chip Addressing Mode we
  cannot access the GLOBAL2 register directly.
  
  Despite the comment in code (which was misleading), the indirect access is
  only used to read the switch CONFIG data from the scrap register and not
  for the GLOBAL2 access.
  
  Use the dsa data to define when the switch is in the Multi Chip Addressing
  Mode (a even address different than zero).
  
  While here fix a typo.
  
  Sponsored by:	Rubicon Communications, LLC (Netgate)

Modified:
  head/sys/dev/etherswitch/e6000sw/e6000sw.c

Modified: head/sys/dev/etherswitch/e6000sw/e6000sw.c
==============================================================================
--- head/sys/dev/etherswitch/e6000sw/e6000sw.c	Sun Apr 30 07:31:48 2017	(r317604)
+++ head/sys/dev/etherswitch/e6000sw/e6000sw.c	Sun Apr 30 07:51:31 2017	(r317605)
@@ -214,7 +214,6 @@ e6000sw_probe(device_t dev)
 	e6000sw_softc_t *sc;
 	const char *description;
 	unsigned int id;
-	uint16_t dev_addr;
 	phandle_t dsa_node, switch_node;
 
 	dsa_node = fdt_find_compatible(OF_finddevice("/"),
@@ -229,21 +228,11 @@ e6000sw_probe(device_t dev)
 	sc->dev = dev;
 	sc->node = switch_node;
 
-	/* Read ADDR[4:1]n using indirect access */
-	MDIO_WRITE(dev, REG_GLOBAL2, SCR_AND_MISC_REG,
-	    SCR_AND_MISC_PTR_CFG);
-	dev_addr = MDIO_READ(dev, REG_GLOBAL2, SCR_AND_MISC_REG) &
-	    SCR_AND_MISC_DATA_CFG_MASK;
-	if (dev_addr != 0) {
-		sc->multi_chip = true;
-		device_printf(dev, "multi-chip addresing mode\n");
-	} else {
-		device_printf(dev, "single-chip addressing mode\n");
-	}
-
 	if (OF_getencprop(sc->node, "reg", &sc->sw_addr,
 	    sizeof(sc->sw_addr)) < 0)
 		return (ENXIO);
+	if (sc->sw_addr != 0 && (sc->sw_addr % 2) == 0)
+		sc->multi_chip = true;
 
 	/* Lock is necessary due to assertions. */
 	sx_init(&sc->sx, "e6000sw");
@@ -368,6 +357,11 @@ e6000sw_attach(device_t dev)
 	err = 0;
 	sc = device_get_softc(dev);
 
+	if (sc->multi_chip)
+		device_printf(dev, "multi-chip addressing mode\n");
+	else
+		device_printf(dev, "single-chip addressing mode\n");
+
 	E6000SW_LOCK(sc);
 	e6000sw_setup(dev, sc);
 	bzero(member_ports, sizeof(member_ports));



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201704300751.v3U7pWYg036469>