svn commit: r262517 - head/sys/dev/etherswitch/arswitch

Adrian Chadd adrian at FreeBSD.org
Wed Feb 26 01:46:42 UTC 2014


Author: adrian
Date: Wed Feb 26 01:46:42 2014
New Revision: 262517
URL: http://svnweb.freebsd.org/changeset/base/262517

Log:
  Add in the SGMII configuration code.  The DB120 doesn't use it, so I
  have no way to evaluate it.
  
  Obtained from:	OpenWRT

Modified:
  head/sys/dev/etherswitch/arswitch/arswitch_8327.c

Modified: head/sys/dev/etherswitch/arswitch/arswitch_8327.c
==============================================================================
--- head/sys/dev/etherswitch/arswitch/arswitch_8327.c	Wed Feb 26 01:36:02 2014	(r262516)
+++ head/sys/dev/etherswitch/arswitch/arswitch_8327.c	Wed Feb 26 01:46:42 2014	(r262517)
@@ -407,6 +407,34 @@ ar8327_fetch_pdata_pad(struct arswitch_s
 }
 
 /*
+ * Fetch the SGMII configuration block from the boot hints.
+ */
+static int
+ar8327_fetch_pdata_sgmii(struct arswitch_softc *sc,
+    struct ar8327_sgmii_cfg *scfg)
+{
+	int val;
+
+	/* sgmii_ctrl */
+	val = 0;
+	if (resource_int_value(device_get_name(sc->sc_dev),
+	    device_get_unit(sc->sc_dev),
+	    "sgmii.ctrl", &val) != 0)
+		return (0);
+	scfg->sgmii_ctrl = val;
+
+	/* serdes_aen */
+	val = 0;
+	if (resource_int_value(device_get_name(sc->sc_dev),
+	    device_get_unit(sc->sc_dev),
+	    "sgmii.serdes_aen", &val) != 0)
+		return (0);
+	scfg->serdes_aen = val;
+
+	return (1);
+}
+
+/*
  * Initialise the ar8327 specific hardware features from
  * the hints provided in the boot environment.
  */
@@ -415,7 +443,8 @@ ar8327_init_pdata(struct arswitch_softc 
 {
 	struct ar8327_pad_cfg pc;
 	struct ar8327_port_cfg port_cfg;
-	uint32_t t;
+	struct ar8327_sgmii_cfg scfg;
+	uint32_t t, new_pos, pos;
 
 	/* Port 0 */
 	bzero(&port_cfg, sizeof(port_cfg));
@@ -454,9 +483,33 @@ ar8327_init_pdata(struct arswitch_softc 
 		t = ar8327_get_pad_cfg(&pc);
 	arswitch_writereg(sc->sc_dev, AR8327_REG_PAD6_MODE, t);
 
+	pos = arswitch_readreg(sc->sc_dev, AR8327_REG_POWER_ON_STRIP);
+	new_pos = pos;
+
 	/* XXX LED config */
 
-	/* XXX SGMII config */
+	/* SGMII config */
+	bzero(&scfg, sizeof(scfg));
+	if (ar8327_fetch_pdata_sgmii(sc, &scfg)) {
+		t = scfg.sgmii_ctrl;
+		if (sc->chip_rev == 1)
+			t |= AR8327_SGMII_CTRL_EN_PLL |
+			    AR8327_SGMII_CTRL_EN_RX |
+			    AR8327_SGMII_CTRL_EN_TX;
+		else
+			t &= ~(AR8327_SGMII_CTRL_EN_PLL |
+			    AR8327_SGMII_CTRL_EN_RX |
+			    AR8327_SGMII_CTRL_EN_TX);
+
+		arswitch_writereg(sc->sc_dev, AR8327_REG_SGMII_CTRL, t);
+
+		if (scfg.serdes_aen)
+			new_pos &= ~AR8327_POWER_ON_STRIP_SERDES_AEN;
+		else
+			new_pos |= AR8327_POWER_ON_STRIP_SERDES_AEN;
+	}
+
+	arswitch_writereg(sc->sc_dev, AR8327_REG_POWER_ON_STRIP, new_pos);
 
 	return (0);
 }


More information about the svn-src-head mailing list