svn commit: r279791 - head/sys/mips/atheros

Adrian Chadd adrian at FreeBSD.org
Sun Mar 8 22:03:55 UTC 2015


Author: adrian
Date: Sun Mar  8 22:03:54 2015
New Revision: 279791
URL: https://svnweb.freebsd.org/changeset/base/279791

Log:
  Modify the if_arge code to use a /fixed/ media mode when it's configured.
  
  Otherwise, the initial media speed would change if a PHY is hooked up,
  sending PHY speed notifications.  For the AP135 at least, the RGMII
  PHY has a static speed/duplex configured and if the PHY plumbing
  attaches the PHY to the if_arge interface, the first link speed change
  from 1000/full will set the MAC to something that isn't useful.
  
  This shouldn't affect any other platforms - everything I looked at is
  using hard-coded speed/duplex as static, as they're facing a switch
  with no PHY attached.

Modified:
  head/sys/mips/atheros/if_arge.c

Modified: head/sys/mips/atheros/if_arge.c
==============================================================================
--- head/sys/mips/atheros/if_arge.c	Sun Mar  8 21:59:03 2015	(r279790)
+++ head/sys/mips/atheros/if_arge.c	Sun Mar  8 22:03:54 2015	(r279791)
@@ -304,6 +304,8 @@ arge_reset_mac(struct arge_softc *sc)
 	uint32_t reg;
 	uint32_t reset_reg;
 
+	ARGEDEBUG(sc, ARGE_DBG_RESET, "%s called\n", __func__);
+
 	/* Step 1. Soft-reset MAC */
 	ARGE_SET_BITS(sc, AR71XX_MAC_CFG1, MAC_CFG1_SOFT_RESET);
 	DELAY(20);
@@ -649,8 +651,7 @@ arge_attach(device_t dev)
 	}
 
 	/*
-	 *  Get default media & duplex mode, by default its Base100T
-	 *  and full duplex
+	 * Get default/hard-coded media & duplex mode.
 	 */
 	if (resource_int_value(device_get_name(dev), device_get_unit(dev),
 	    "media", &hint) != 0)
@@ -658,8 +659,12 @@ arge_attach(device_t dev)
 
 	if (hint == 1000)
 		sc->arge_media_type = IFM_1000_T;
-	else
+	else if (hint == 100)
 		sc->arge_media_type = IFM_100_TX;
+	else if (hint == 10)
+		sc->arge_media_type = IFM_10_T;
+	else
+		sc->arge_media_type = 0;
 
 	if (resource_int_value(device_get_name(dev), device_get_unit(dev),
 	    "fduplex", &hint) != 0)
@@ -847,9 +852,10 @@ arge_attach(device_t dev)
 			}
 		}
 	}
+
 	if (sc->arge_miibus == NULL) {
 		/* no PHY, so use hard-coded values */
-		ifmedia_init(&sc->arge_ifmedia, 0, 
+		ifmedia_init(&sc->arge_ifmedia, 0,
 		    arge_multiphy_mediachange,
 		    arge_multiphy_mediastatus);
 		ifmedia_add(&sc->arge_ifmedia,
@@ -1071,6 +1077,25 @@ arge_update_link_locked(struct arge_soft
 		return;
 	}
 
+	/*
+	 * If we have a static media type configured, then
+	 * use that.  Some PHY configurations (eg QCA955x -> AR8327)
+	 * use a static speed/duplex between the SoC and switch,
+	 * even though the front-facing PHY speed changes.
+	 */
+	if (sc->arge_media_type != 0) {
+		ARGEDEBUG(sc, ARGE_DBG_MII, "%s: fixed; media=%d, duplex=%d\n",
+		    __func__,
+		    sc->arge_media_type,
+		    sc->arge_duplex_mode);
+		if (mii->mii_media_status & IFM_ACTIVE) {
+			sc->arge_link_status = 1;
+		} else {
+			sc->arge_link_status = 0;
+		}
+		arge_set_pll(sc, sc->arge_media_type, sc->arge_duplex_mode);
+	}
+
 	if (mii->mii_media_status & IFM_ACTIVE) {
 
 		media = IFM_SUBTYPE(mii->mii_media_active);
@@ -1095,6 +1120,12 @@ arge_set_pll(struct arge_softc *sc, int 
 	uint32_t		fifo_tx, pll;
 	int if_speed;
 
+	/*
+	 * XXX Verify - is this valid for all chips?
+	 * QCA955x (and likely some of the earlier chips!) define
+	 * this as nibble mode and byte mode, and those have to do
+	 * with the interface type (MII/SMII versus GMII/RGMII.)
+	 */
 	ARGEDEBUG(sc, ARGE_DBG_PLL, "set_pll(%04x, %s)\n", media,
 	    duplex == IFM_FDX ? "full" : "half");
 	cfg = ARGE_READ(sc, AR71XX_MAC_CFG2);
@@ -1199,6 +1230,9 @@ arge_set_pll(struct arge_softc *sc, int 
 static void
 arge_reset_dma(struct arge_softc *sc)
 {
+
+	ARGEDEBUG(sc, ARGE_DBG_RESET, "%s: called\n", __func__);
+
 	ARGE_WRITE(sc, AR71XX_DMA_RX_CONTROL, 0);
 	ARGE_WRITE(sc, AR71XX_DMA_TX_CONTROL, 0);
 
@@ -1230,8 +1264,6 @@ arge_reset_dma(struct arge_softc *sc)
 	arge_flush_ddr(sc);
 }
 
-
-
 static void
 arge_init(void *xsc)
 {


More information about the svn-src-head mailing list