[Zrouter-src-freebsd] ZRouter.org: push to FreeBSD HEAD tree

zrouter-src-freebsd at zrouter.org zrouter-src-freebsd at zrouter.org
Tue Apr 24 17:03:17 UTC 2012


details:   http://zrouter.org/hg/FreeBSD/head//rev/a5790657ba6f
changeset: 469:a5790657ba6f
user:      Aleksandr Rybalko <ray at ddteam.net>
date:      Tue Apr 24 20:03:54 2012 +0300
description:
* cleanup
* change switch mii attachment, now it does not introduce himself as PHY, so
floatphy now is single instance

diffstat:

 head/sys/dev/switch/ar8x16_switch.c  |    9 +-
 head/sys/dev/switch/bcm5325_switch.c |    1 -
 head/sys/dev/switch/floatphy.c       |  102 ++++++++++++++++++----
 head/sys/dev/switch/switch.c         |   25 +++-
 head/sys/dev/switch/switch_mii.c     |  153 +----------------------------------
 head/sys/dev/switch/switchvar.h      |    2 +-
 6 files changed, 108 insertions(+), 184 deletions(-)

diffs (526 lines):

diff -r 867178d7643a -r a5790657ba6f head/sys/dev/switch/ar8x16_switch.c
--- a/head/sys/dev/switch/ar8x16_switch.c	Mon Apr 23 12:20:39 2012 +0300
+++ b/head/sys/dev/switch/ar8x16_switch.c	Tue Apr 24 20:03:54 2012 +0300
@@ -97,7 +97,7 @@
 	WRITE4(sc, AR8X16_REG_MDIO_CTRL,
 	    AR8X16_MDIO_CTRL_BUSY |
 	    AR8X16_MDIO_CTRL_MASTER_EN |
-	    AR8X16_MDIO_CTRL_CMD_READ |
+	    AR8X16_MDIO_CTRL_CMD_WRITE |
 	    (phy << AR8X16_MDIO_CTRL_PHY_ADDR_SHIFT) |
 	    (reg << AR8X16_MDIO_CTRL_REG_ADDR_SHIFT) |
 	    (value & AR8X16_MDIO_CTRL_DATA_MASK));
@@ -148,6 +148,7 @@
 {
 	struct ar8x16_switch_softc *sc;
 	uint32_t old = 0xffff;
+	int error = 0;
 
 	sc = device_get_softc(dev);
 	if (reg & SWITCH_REG_TYPE_RAW) {
@@ -156,15 +157,17 @@
 	} else if (reg & SWITCH_REG_TYPE_PHY) {
 		old = miibus_readreg(dev, ((reg >> 8) & 0xff),
 		    (reg & 0xff));
-		*value = miibus_writereg(dev, ((reg >> 8) & 0xff),
+		error = miibus_writereg(dev, ((reg >> 8) & 0xff),
 		    (reg & 0xff), *value);
+		if (error)
+			device_printf(dev, "ERROR: writing reg=%08x\n", reg);
 	} else {
 		old = MII_SW_READ4(sc, reg);
 		MII_SW_WRITE4(sc, reg, *value);
 	}
 
 	*value = old;
-	return (0);
+	return (error);
 }
 
 static int
diff -r 867178d7643a -r a5790657ba6f head/sys/dev/switch/bcm5325_switch.c
--- a/head/sys/dev/switch/bcm5325_switch.c	Mon Apr 23 12:20:39 2012 +0300
+++ b/head/sys/dev/switch/bcm5325_switch.c	Tue Apr 24 20:03:54 2012 +0300
@@ -873,7 +873,6 @@
 	error = 0;
 	switch (subsys & SWITCH_RESETSUB_MASK) {
 	case SWITCH_RESETSUB_SWITCH:
-//		error = WRITE(sc, SWITCH_RESET, 0x90);
 		/* XXX: Hope it will reset any switch */
 		error = WRITE(sc, SWITCH_RESET, 0xffff);
 		if (error)
diff -r 867178d7643a -r a5790657ba6f head/sys/dev/switch/floatphy.c
--- a/head/sys/dev/switch/floatphy.c	Mon Apr 23 12:20:39 2012 +0300
+++ b/head/sys/dev/switch/floatphy.c	Tue Apr 24 20:03:54 2012 +0300
@@ -107,7 +107,8 @@
 
 #define	FLOATPHY_DEBUG_PHYREG	0x00000001
 #define	FLOATPHY_DEBUG_LINK	0x00000002
-#define	FLOATPHY_DEBUG_SPEED	0x00000002
+#define	FLOATPHY_DEBUG_SPEED	0x00000004
+#define	FLOATPHY_DEBUG_CALLS	0x00000100
 
 #define	FLOATPHY_FLAGS_LINK_TYPE_MASK		0x00000003
 #define		FLOATPHY_FLAGS_LINK_TYPE_ANY	0x00000000
@@ -124,7 +125,7 @@
 	tree = device_get_sysctl_tree(sc->dev);
 	SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
 	    "debug", CTLFLAG_RW, &sc->debug, 0,
-	    "enable watchdog debugging");
+	    "enable floatphy debugging");
 }
 
 static int
@@ -139,13 +140,16 @@
 {
 	struct floatphy_softc *sc;
 	struct mii_softc *miisc;
+	struct mii_data		*miidata;
 	const char *devname;
 	int devunit;
 
 	sc = device_get_softc(dev);
 	sc->dev = dev;
-	miisc = (struct mii_softc *)sc;
-	mii_phy_dev_attach(dev, 0, &floatphy_funcs, 0);
+	miisc = &sc->miisc;
+	miidata = device_get_softc(device_get_parent(dev));
+	mii_phy_dev_attach(dev, MIIF_NOISOLATE | MIIF_NOMANPAUSE,
+	    &floatphy_funcs, 0);
 
 	/*
 	 * hint.floatphy.0.master="ar8x16_switch0"
@@ -170,10 +174,54 @@
 	resource_int_value(devname, devunit, "flags", &sc->flags);
 	resource_int_value(devname, devunit, "speed", &sc->speed);
 
-	miisc->mii_capabilities = BMSR_10THDX | BMSR_10TFDX | BMSR_100TXHDX |
-	    BMSR_100TXFDX | BMSR_EXTCAP | BMSR_ANEG;
-	miisc->mii_extcapabilities = EXTSR_1000TFDX | EXTSR_1000THDX |
-	    EXTSR_1000XFDX | EXTSR_1000XHDX;
+	ifmedia_add(&miidata->mii_media,
+	    IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, 0, miisc->mii_inst),
+	    MII_MEDIA_100_TX, NULL);
+	ifmedia_add(&miidata->mii_media,
+	    IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, 0, miisc->mii_inst),
+	    MII_MEDIA_100_TX_FDX, NULL);
+	ifmedia_add(&miidata->mii_media,
+	    IFM_MAKEWORD(IFM_ETHER, IFM_1000_T, 0, miisc->mii_inst),
+	    MII_MEDIA_1000_T, NULL);
+	ifmedia_add(&miidata->mii_media,
+	    IFM_MAKEWORD(IFM_ETHER, IFM_1000_T, 0, miisc->mii_inst),
+	    MII_MEDIA_1000_T_FDX, NULL);
+	ifmedia_add(&miidata->mii_media,
+	    IFM_MAKEWORD(IFM_ETHER, IFM_1000_SX, 0, miisc->mii_inst),
+	    MII_MEDIA_1000_X, NULL);
+	ifmedia_add(&miidata->mii_media,
+	    IFM_MAKEWORD(IFM_ETHER, IFM_1000_SX, 0, miisc->mii_inst),
+	    MII_MEDIA_1000_X_FDX, NULL);
+
+	if (sc->flags & FLOATPHY_FLAGS_LOCK_SPEED) {
+		switch (sc->speed) {
+		case 10:
+			miisc->mii_capabilities = BMSR_10THDX | BMSR_10TFDX |
+			    BMSR_ANEG;
+			miisc->mii_extcapabilities = 0;
+			break;
+		case 100:
+			miisc->mii_capabilities = BMSR_100TXHDX |
+			    BMSR_100TXFDX | BMSR_ANEG;
+			miisc->mii_extcapabilities = 0;
+			break;
+		case 1000:
+			miisc->mii_capabilities = BMSR_EXTCAP | BMSR_ANEG;
+			miisc->mii_extcapabilities = EXTSR_1000TFDX |
+			    EXTSR_1000THDX | EXTSR_1000XFDX | EXTSR_1000XHDX;
+			break;
+		default: /* 100 */
+			miisc->mii_capabilities = BMSR_100TXHDX |
+			    BMSR_100TXFDX | BMSR_EXTCAP | BMSR_ANEG;
+			miisc->mii_extcapabilities = 0;
+			break;
+		}
+	} else {
+		miisc->mii_capabilities = BMSR_10THDX | BMSR_10TFDX |
+		    BMSR_100TXHDX | BMSR_100TXFDX | BMSR_EXTCAP | BMSR_ANEG;
+		miisc->mii_extcapabilities = EXTSR_1000TFDX | EXTSR_1000THDX |
+		    EXTSR_1000XFDX | EXTSR_1000XHDX;
+	}
 
 	floatphy_sysctl(sc);
 
@@ -190,6 +238,9 @@
 {
 	device_t switchdev;
 
+	if (sc->debug & FLOATPHY_DEBUG_CALLS)
+		device_printf(sc->dev, "DEBUG: %s(sc=%p)\n", __func__, sc);
+
 	if (sc->master)
 		return (0);
 
@@ -214,6 +265,8 @@
 	int error, p;
 
 	/* TODO: Check if we lost master */
+	if (sc->debug & FLOATPHY_DEBUG_CALLS)
+		device_printf(sc->dev, "DEBUG: %s(sc=%p)\n", __func__, sc);
 
 	out = 0;
 	/* If no master, always return linked */
@@ -255,6 +308,9 @@
 			if (error) {
 				return (-1);
 			}
+			if (sc->debug & FLOATPHY_DEBUG_PHYREG)
+				device_printf(sc->dev,
+				    "DEBUG: PHY(%d) BMCR=%04x\n", p, control);
 
 			switch (control & (BMCR_S100 | BMCR_S1000)) {
 			case 0:
@@ -334,8 +390,20 @@
 	ife = mii->mii_media.ifm_cur;
 	sc = (struct floatphy_softc *)miisc;
 
+	if (sc->debug & FLOATPHY_DEBUG_CALLS)
+		device_printf(sc->dev, "DEBUG: %s(sc=%p)\n", __func__, sc);
+
 	switch (cmd) {
 	case MII_POLLSTAT:
+		link = floatphy_query_link(sc);
+		if (link == -1) {
+			/* Error detected, no update */
+			return (0);
+		}
+		media = floatphy_speed_to_media(sc->speed, IFM_FDX);
+		mii->mii_media_status = IFM_AVALID |
+		    (link == 1) ? IFM_ACTIVE : 0;
+		mii->mii_media_active = IFM_ETHER | media;
 		break;
 	case MII_MEDIACHG:
 		link = floatphy_query_link(sc);
@@ -348,21 +416,17 @@
 		media = floatphy_speed_to_media(sc->speed, IFM_FDX);
 
 		switch (IFM_SUBTYPE(ife->ifm_media)) {
-		case IFM_AUTO:
-			mii->mii_media_status = IFM_AVALID | link;
-			mii->mii_media_active = IFM_ETHER | media;
-			break;
 		case IFM_NONE:
 			mii->mii_media_status = IFM_AVALID;
 			mii->mii_media_active = IFM_ETHER | media;
 			break;
+		case IFM_AUTO:
 		default:
 			mii->mii_media_status = IFM_AVALID | link;
 			mii->mii_media_active = IFM_ETHER | media;
 			break;
 		}
 		break;
-
 	case MII_TICK:
 		if (mii_phy_tick(miisc) == EJUSTRETURN)
 			return (0);
@@ -389,6 +453,10 @@
 	sc = (struct floatphy_softc *)miisc;
 	mii = miisc->mii_pdata;
 	ife = mii->mii_media.ifm_cur;
+
+	if (sc->debug & FLOATPHY_DEBUG_CALLS)
+		device_printf(sc->dev, "DEBUG: %s(sc=%p)\n", __func__, sc);
+
 	link = floatphy_query_link(sc);
 	if (link == -1) {
 		/* Error detected, no update */
@@ -398,11 +466,5 @@
 	media = floatphy_speed_to_media(sc->speed, IFM_FDX);
 
 	mii->mii_media_status = IFM_AVALID | link;
-
-	if (sc->flags & FLOATPHY_FLAGS_LOCK_SPEED) {
-		mii->mii_media_active = ife->ifm_media;
-	} else {
-		mii->mii_media_active = IFM_ETHER | media;
-
-	}
+	mii->mii_media_active = IFM_ETHER | media;
 }
diff -r 867178d7643a -r a5790657ba6f head/sys/dev/switch/switch.c
--- a/head/sys/dev/switch/switch.c	Mon Apr 23 12:20:39 2012 +0300
+++ b/head/sys/dev/switch/switch.c	Tue Apr 24 20:03:54 2012 +0300
@@ -34,6 +34,7 @@
 #include <sys/conf.h>
 #include <sys/ioccom.h>
 #include <sys/bus.h>
+#include <sys/kernel.h>
 #include <sys/malloc.h>
 #include <sys/rman.h>
 #include <sys/systm.h>
@@ -536,6 +537,7 @@
 #endif
 }
 #endif /* CREATE_CHILD_MDIO_BUS */
+static void switch_tick(void *arg);
 
 int
 switch_init(struct switch_softc *sc)
@@ -608,9 +610,23 @@
 	}
 #endif
 
+	callout_init(&sc->tick_callout, 1);
+	callout_reset(&sc->tick_callout, hz, switch_tick, sc);
+
 	return (0);
 }
 
+static void
+switch_tick(void *arg)
+{
+	struct switch_softc *sc;
+
+	sc = arg;
+
+	SWITCH_TICK(sc->child);
+	callout_reset(&sc->tick_callout, hz, switch_tick, sc);
+}
+
 int
 switch_deinit(struct switch_softc *sc)
 {
@@ -619,14 +635,7 @@
 	if (sc->sc_cdev != NULL)
 		destroy_dev(sc->sc_cdev);
 
-	return (0);
-}
-
-int
-switch_tick(struct switch_softc *sc)
-{
-
-	SWITCH_TICK(sc->child);
+	callout_drain(&sc->tick_callout);
 
 	return (0);
 }
diff -r 867178d7643a -r a5790657ba6f head/sys/dev/switch/switch_mii.c
--- a/head/sys/dev/switch/switch_mii.c	Mon Apr 23 12:20:39 2012 +0300
+++ b/head/sys/dev/switch/switch_mii.c	Tue Apr 24 20:03:54 2012 +0300
@@ -36,15 +36,8 @@
 
 /* Required for struct switch_softc */
 #include <machine/bus.h>
-
-#include <net/if.h>
-#include <net/if_media.h>
-
-/* MII interface */
-#include <dev/mii/mii.h>
-#include <dev/mii/miivar.h>
+/* MIIBUS_READREG/MIIBUS_WRITEREG macro */
 #include "miibus_if.h"
-#include "miidevs.h"
 
 /* Switch interface */
 #include <dev/switch/switchvar.h>
@@ -56,8 +49,6 @@
 static int 	switch_mii_attach(device_t);
 static uint32_t	switch_mii_read4(device_t, uint32_t);
 static void	switch_mii_write4(device_t, uint32_t, uint32_t);
-static int	switch_mii_service(struct mii_softc *, struct mii_data *, int);
-static void	switch_mii_status(struct mii_softc *);
 
 static device_method_t switch_mii_methods[] = {
 	/* device interface */
@@ -88,12 +79,6 @@
 DRIVER_MODULE(switch, miibus, switch_mii_driver, switch_mii_devclass, 0, 0);
 DRIVER_MODULE(switch, mii, switch_mii_driver, switch_mii_devclass, 0, 0);
 
-static const struct mii_phy_funcs switch_mii_funcs = {
-	switch_mii_service,
-	switch_mii_status,
-	mii_phy_reset
-};
-
 static int
 switch_mii_probe(device_t dev)
 {
@@ -104,54 +89,12 @@
 static int
 switch_mii_attach(device_t dev)
 {
-	struct mii_softc	*sc;
 	struct switch_softc	*ssc;
-	struct mii_attach_args	*ma;
-	struct mii_data		*mii;
-	int phymask, err;
+	int err;
 
-	phymask = 1; /* 1 is PHY0, PHY0 is me */
 	ssc = device_get_softc(dev);
 	ssc->sc_dev = dev;
 	ssc->sc_miidev = device_get_parent(dev);
-	mii = device_get_softc(ssc->sc_miidev);
-	sc = &ssc->sc_mii;
-
-	ifmedia_add(&mii->mii_media,
-	    IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, 0, sc->mii_inst),
-	    MII_MEDIA_100_TX, NULL);
-	ifmedia_add(&mii->mii_media,
-	    IFM_MAKEWORD(IFM_ETHER, IFM_100_TX, 0, sc->mii_inst),
-	    MII_MEDIA_100_TX_FDX, NULL);
-	ifmedia_add(&mii->mii_media,
-	    IFM_MAKEWORD(IFM_ETHER, IFM_1000_T, 0, sc->mii_inst),
-	    MII_MEDIA_1000_T, NULL);
-	ifmedia_add(&mii->mii_media,
-	    IFM_MAKEWORD(IFM_ETHER, IFM_1000_T, 0, sc->mii_inst),
-	    MII_MEDIA_1000_T_FDX, NULL);
-	ifmedia_add(&mii->mii_media,
-	    IFM_MAKEWORD(IFM_ETHER, IFM_1000_SX, 0, sc->mii_inst),
-	    MII_MEDIA_1000_X, NULL);
-	ifmedia_add(&mii->mii_media,
-	    IFM_MAKEWORD(IFM_ETHER, IFM_1000_SX, 0, sc->mii_inst),
-	    MII_MEDIA_1000_X_FDX, NULL);
-
-	mii_phy_dev_attach(dev, MIIF_NOISOLATE | MIIF_NOMANPAUSE,
-	    &switch_mii_funcs, 0);
-
-	ma = device_get_ivars(dev);
-
-	/* XXX: better to ask attached switch driver about supported media */
-	sc->mii_capabilities = BMSR_ANEG | BMSR_100TXFDX | BMSR_100TXHDX;
-	sc->mii_capabilities |= BMSR_EXTCAP;
-	sc->mii_extcapabilities = EXTSR_1000TFDX | EXTSR_1000THDX |
-	    EXTSR_1000XFDX | EXTSR_1000XHDX;
-
-	device_printf(dev, " ");
-	mii_phy_add_media(sc);
-	printf("\n");
-
-	ssc->sc_dev = dev;
 	/* Satisfy all MDIO attached switch drivers */
 	ssc->phys = 0xffffffff;
 
@@ -160,101 +103,9 @@
 	if (err)
 		return (err);
 
-	MIIBUS_MEDIAINIT(ssc->sc_miidev);
-
 	return (bus_generic_attach(dev));
 }
 
-static int
-switch_mii_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
-{
-	struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
-	struct switch_softc *ssc = (struct switch_softc *)sc;
-
-	switch (cmd) {
-	case MII_POLLSTAT:
-		break;
-
-	case MII_MEDIACHG:
-		/*
-		 * If the interface is not up, don't do anything.
-		 */
-		if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
-			break;
-
-		/* Accept assigned media types */
-		/* Should check if attached switch support it */
-		switch (IFM_SUBTYPE(ife->ifm_media)) {
-		case IFM_AUTO:
-			mii->mii_media_status = IFM_AVALID | IFM_ACTIVE;
-			if ((sc->mii_capabilities & BMSR_EXTCAP) &&
-			    (sc->mii_extcapabilities & EXTSR_1000TFDX))
-				mii->mii_media_active = IFM_ETHER |
-				    IFM_1000_T | IFM_FDX;
-			else
-				mii->mii_media_active = IFM_ETHER |
-				    IFM_100_TX | IFM_FDX;
-			break;
-		case IFM_1000_T:
-			mii->mii_media_status = IFM_AVALID | IFM_ACTIVE;
-			mii->mii_media_active = IFM_ETHER | IFM_1000_T |
-			    (ife->ifm_media & IFM_FDX)?IFM_FDX:IFM_HDX;
-			break;
-		case IFM_100_TX:
-			mii->mii_media_status = IFM_AVALID | IFM_ACTIVE;
-			mii->mii_media_active = IFM_ETHER | IFM_100_TX |
-			    (ife->ifm_media & IFM_FDX)?IFM_FDX:IFM_HDX;
-			break;
-		case IFM_10_T:
-			mii->mii_media_status = IFM_AVALID | IFM_ACTIVE;
-			mii->mii_media_active = IFM_ETHER | IFM_10_T |
-			    (ife->ifm_media & IFM_FDX)?IFM_FDX:IFM_HDX;
-			break;
-		case IFM_NONE:
-			/* XXX */
-			mii->mii_media_status = IFM_AVALID;
-			mii->mii_media_active = IFM_ETHER | IFM_1000_T |
-			    IFM_FDX;
-			break;
-		default:
-			return (EINVAL);
-		}
-		break;
-		mii_phy_setmedia(sc);
-
-	case MII_TICK:
-		/* Call switch to do periodic work */
-		switch_tick(ssc);
-		break;
-	}
-
-	/* Update the media status. */
-	PHY_STATUS(sc);
-
-	/* Callback if something changed. */
-	mii_phy_update(sc, cmd);
-	return (0);
-}
-
-static void
-switch_mii_status(struct mii_softc *sc)
-{
-	struct mii_data *mii = sc->mii_pdata;
-
-	/* if not up, set to default */
-	if ((mii->mii_media_status & (IFM_AVALID | IFM_ACTIVE)) !=
-	    (IFM_AVALID | IFM_ACTIVE)) {
-		mii->mii_media_status = IFM_AVALID | IFM_ACTIVE;
-		/* If we support 1000base */
-		if (sc->mii_extcapabilities &
-		    (EXTSR_1000TFDX|EXTSR_1000THDX))
-			mii->mii_media_active = IFM_ETHER|IFM_1000_T|IFM_FDX;
-		else
-			mii->mii_media_active = IFM_ETHER|IFM_100_TX|IFM_FDX;
-	}
-
-}
-
 static uint32_t
 switch_mii_read4(device_t dev, uint32_t r)
 {
diff -r 867178d7643a -r a5790657ba6f head/sys/dev/switch/switchvar.h
--- a/head/sys/dev/switch/switchvar.h	Mon Apr 23 12:20:39 2012 +0300
+++ b/head/sys/dev/switch/switchvar.h	Tue Apr 24 20:03:54 2012 +0300
@@ -81,6 +81,7 @@
 	struct cdev		*sc_cdev;
 	device_t		child_miibus;
 	struct ifnet		*ifp;
+	struct callout		tick_callout;
 
 	int			enable;
 	struct switch_capability *caps;
@@ -89,7 +90,6 @@
 
 int switch_init(struct switch_softc *sc);
 int switch_deinit(struct switch_softc *sc);
-int switch_tick(struct switch_softc *sc);
 int switchpub_get_reg(device_t dev, uint32_t reg, uint32_t *value);
 int switchpub_set_reg(device_t dev, uint32_t reg, uint32_t *value);
 


More information about the Zrouter-src-freebsd mailing list