[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