On 09/15/13 01:53, David Gwynne wrote:
makes a lot of sense to me, ok. you need oks from people other than me though.

dlg

I've been running this for the last 12 hours or so without problems on my CAM-0100, so ok for me.

~Brian

On 14/09/2013, at 8:34 PM, Jonathan Matthew <jmatt...@openbsd.org> wrote:

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)



Reply via email to