The network interfaces on the ubiquiti edgerouter lite don't work yet.
Here's the first step towards fixing that:
Mapping port numbers to phy addresses in the mii read/write functions
hides the phy addresses unnecessarily. Instead, we should figure out
the phy address when setting up the port and pass it to mii_attach.
I don't have an octeon system that works with the existing code, so all
I can say is this doesn't make any difference on the edgerouter lite.
It uses different phy addresses, which I'll add a mapping for later.
ok?
Index: arch/octeon/dev/cn30xxgmx.c
===================================================================
RCS file: /cvs/src/sys/arch/octeon/dev/cn30xxgmx.c,v
retrieving revision 1.5
diff -u -p -r1.5 cn30xxgmx.c
--- arch/octeon/dev/cn30xxgmx.c 5 Dec 2012 23:20:14 -0000 1.5
+++ arch/octeon/dev/cn30xxgmx.c 14 Sep 2013 09:35:40 -0000
@@ -146,6 +146,11 @@ struct cn30xxgmx_port_ops *cn30xxgmx_por
[GMX_SPI42_PORT] = &cn30xxgmx_port_ops_spi42
};
+/* this apparently works for the portwell cam-0100 */
+int octeon_eth_phy_table[] = {
+ 0x02, 0x03, 0x22
+};
+
#ifdef OCTEON_ETH_DEBUG
static void *cn30xxgmx_intr_drop_ih;
struct evcnt cn30xxgmx_intr_drop_evcnt =
@@ -178,6 +183,14 @@ cn30xxgmx_match(struct device *parent, v
return 1;
}
+static int
+cn30xxgmx_port_phy_addr(int port)
+{
+ if (port >= nitems(octeon_eth_phy_table))
+ return -1;
+ return octeon_eth_phy_table[port];
+}
+
static void
cn30xxgmx_attach(struct device *parent, struct device *self, void *aux)
{
@@ -223,6 +236,9 @@ cn30xxgmx_attach(struct device *parent,
gmx_aa.ga_port_type = sc->sc_port_types[i];
gmx_aa.ga_gmx = sc;
gmx_aa.ga_gmx_port = port_sc;
+ gmx_aa.ga_phy_addr = cn30xxgmx_port_phy_addr(i);
+ if (gmx_aa.ga_phy_addr == -1)
+ panic(": don't know phy address for port %d", i);
config_found_sm(self, &gmx_aa,
cn30xxgmx_print, cn30xxgmx_submatch);
Index: arch/octeon/dev/cn30xxgmxvar.h
===================================================================
RCS file: /cvs/src/sys/arch/octeon/dev/cn30xxgmxvar.h,v
retrieving revision 1.1
diff -u -p -r1.1 cn30xxgmxvar.h
--- arch/octeon/dev/cn30xxgmxvar.h 16 Jun 2011 11:22:30 -0000 1.1
+++ arch/octeon/dev/cn30xxgmxvar.h 14 Sep 2013 09:35:40 -0000
@@ -136,6 +136,7 @@ struct cn30xxgmx_attach_args {
const char *ga_name;
int ga_portno;
int ga_port_type;
+ int ga_phy_addr;
struct cn30xxgmx_softc *ga_gmx;
struct cn30xxgmx_port_softc
Index: arch/octeon/dev/if_cnmac.c
===================================================================
RCS file: /cvs/src/sys/arch/octeon/dev/if_cnmac.c,v
retrieving revision 1.11
diff -u -p -r1.11 if_cnmac.c
--- arch/octeon/dev/if_cnmac.c 17 Aug 2013 10:00:09 -0000 1.11
+++ arch/octeon/dev/if_cnmac.c 14 Sep 2013 09:35:40 -0000
@@ -259,15 +259,6 @@ static const struct octeon_evcnt_entry o
};
#endif
-/* XXX board-specific */
-static const int octeon_eth_phy_table[] = {
-#if defined __seil5__
- 0x04, 0x01, 0x02
-#else
- 0x02, 0x03, 0x22
-#endif
-};
-
/* ---- buffer management */
static const struct octeon_eth_pool_param {
@@ -338,6 +329,7 @@ octeon_eth_attach(struct device *parent,
sc->sc_port_type = ga->ga_port_type;
sc->sc_gmx = ga->ga_gmx;
sc->sc_gmx_port = ga->ga_gmx_port;
+ sc->sc_phy_addr = ga->ga_phy_addr;
sc->sc_init_flag = 0;
@@ -549,30 +541,14 @@ static int
octeon_eth_mii_readreg(struct device *self, int phy_no, int reg)
{
struct octeon_eth_softc *sc = (struct octeon_eth_softc *)self;
- int phy_addr = octeon_eth_phy_table[phy_no];
-
- if (sc->sc_port >= (int)nitems(octeon_eth_phy_table) ||
- phy_no != sc->sc_port) {
- log(LOG_ERR,
- "mii read address mismatch, phy number %d.\n", phy_no);
- return -1;
- }
- return cn30xxsmi_read(sc->sc_smi, phy_addr, reg);
+ return cn30xxsmi_read(sc->sc_smi, phy_no, reg);
}
static void
octeon_eth_mii_writereg(struct device *self, int phy_no, int reg, int value)
{
struct octeon_eth_softc *sc = (struct octeon_eth_softc *)self;
- int phy_addr = octeon_eth_phy_table[phy_no];
-
- if (sc->sc_port >= (int)nitems(octeon_eth_phy_table) ||
- phy_no != sc->sc_port) {
- log(LOG_ERR,
- "mii write address mismatch, phy number %d.\n", phy_no);
- return;
- }
- cn30xxsmi_write(sc->sc_smi, phy_addr, reg, value);
+ cn30xxsmi_write(sc->sc_smi, phy_no, reg, value);
}
static void
@@ -606,7 +582,7 @@ octeon_eth_mediainit(struct octeon_eth_s
octeon_eth_mediastatus);
mii_attach(&sc->sc_dev, &sc->sc_mii,
- 0xffffffff, sc->sc_port, MII_OFFSET_ANY, MIIF_DOPAUSE);
+ 0xffffffff, sc->sc_phy_addr, MII_OFFSET_ANY, MIIF_DOPAUSE);
/* XXX */
if (LIST_FIRST(&sc->sc_mii.mii_phys) != NULL) {
Index: arch/octeon/dev/if_cnmacvar.h
===================================================================
RCS file: /cvs/src/sys/arch/octeon/dev/if_cnmacvar.h,v
retrieving revision 1.2
diff -u -p -r1.2 if_cnmacvar.h
--- arch/octeon/dev/if_cnmacvar.h 17 Jun 2011 03:36:25 -0000 1.2
+++ arch/octeon/dev/if_cnmacvar.h 14 Sep 2013 09:35:40 -0000
@@ -90,6 +90,7 @@ struct octeon_eth_softc {
uint32_t sc_port;
uint32_t sc_port_type;
uint32_t sc_init_flag;
+ int sc_phy_addr;
/*
* Redirection - received (input) packets are redirected (directly sent)