> Ah, there are only two ports in use. I guess one of them is the
> management port and the other is connected to the built-in switch.
> Maybe the attach routine should just skip ports that lack a PHY mapping,
> for now.
This is better: no panic!
--------------------------------------------------------------------------------
cn30xxgmx0 at iobus0 base 0x1180008000000
port are disable
cn30xxgmx1 at iobus0 base 0x1180010000000
cnmac0 at cn30xxgmx1: SGMII, address 00:90:0b:31:d8:5f
cnmac1 at cn30xxgmx1: SGMII, address 00:90:0b:31:d8:60
uar: ns16550a, 64 byte fifo
com0: console
com1 at uartbus0 base 0x1180000000c00 irq 35: ns16550a, 64 byte fifo
octrtc0 at mainbus0: DS1337
--------------------------------------------------------------------------------
Can we also fix the grammar of the "port are disable" message?
Thank you!
> Index: arch/octeon/dev/cn30xxgmx.c
> ===================================================================
> RCS file: src/sys/arch/octeon/dev/cn30xxgmx.c,v
> retrieving revision 1.26
> diff -u -p -r1.26 cn30xxgmx.c
> --- arch/octeon/dev/cn30xxgmx.c 4 Aug 2016 13:10:31 -0000 1.26
> +++ arch/octeon/dev/cn30xxgmx.c 21 Oct 2016 11:45:01 -0000
> @@ -33,6 +33,8 @@
> #include <sys/malloc.h>
> #include <sys/syslog.h>
>
> +#include <dev/ofw/openfirm.h>
> +
> #include <machine/bus.h>
> #include <machine/octeon_model.h>
> #include <machine/octeonvar.h>
> @@ -181,6 +183,22 @@ cn30xxgmx_port_phy_addr(int port)
> /* portwell cam-0100 */
> 0x02, 0x03, 0x22
> };
> + char name[64];
> + int phynode = 0;
> + int portnode = -1;
> + uint32_t phy = 0;
> +
> + snprintf(name, sizeof(name),
> + "/soc/pip@11800a0000000/interface@%x/ethernet@%x",
> + port / 16, port % 16);
> + portnode = OF_finddevice(name);
> + if (portnode != -1) {
> + phy = OF_getpropint(portnode, "phy-handle", 0);
> + if (phy != 0)
> + phynode = OF_getnodebyphandle(phy);
> + if (phynode != 0)
> + return OF_getpropint(phynode, "reg", 0);
> + }
>
> switch (octeon_boot_info->board_type) {
> case BOARD_TYPE_UBIQUITI_E100: /* port 0: 7, port 1: 6 */
> @@ -196,10 +214,14 @@ cn30xxgmx_port_phy_addr(int port)
> return port - 16; /* GMX1: eth[0-3] */
> return -1;
>
> - default:
> + case BOARD_TYPE_CN3010_EVB_HS5:
> + /* CAM-0100 */
> if (port >= nitems(octeon_eth_phy_table))
> return -1;
> return octeon_eth_phy_table[port];
> +
> + default:
> + return -1;
> }
> }
>
> @@ -209,8 +231,9 @@ cn30xxgmx_attach(struct device *parent,
> struct cn30xxgmx_softc *sc = (void *)self;
> struct iobus_attach_args *aa = aux;
> struct cn30xxgmx_attach_args gmx_aa;
> - int status;
> int i;
> + int phy_addr;
> + int status;
> struct cn30xxgmx_port_softc *port_sc;
>
> printf("\n");
> @@ -229,6 +252,11 @@ cn30xxgmx_attach(struct device *parent,
> M_DEVBUF, M_NOWAIT | M_ZERO);
>
> for (i = 0; i < sc->sc_nports; i++) {
> + phy_addr = cn30xxgmx_port_phy_addr(
> + GMX_PORT_NUM(sc->sc_unitno, i));
> + if (phy_addr == -1)
> + continue;
> +
> port_sc = &sc->sc_ports[i];
> port_sc->sc_port_gmx = sc;
> port_sc->sc_port_no = GMX_PORT_NUM(sc->sc_unitno, i);
> @@ -271,11 +299,7 @@ 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(
> - port_sc->sc_port_no);
> - if (gmx_aa.ga_phy_addr == -1)
> - panic(": don't know phy address for port %d",
> - port_sc->sc_port_no);
> + gmx_aa.ga_phy_addr = phy_addr;
>
> config_found_sm(self, &gmx_aa,
> cn30xxgmx_print, cn30xxgmx_submatch);
> Index: arch/octeon/include/octeonvar.h
> ===================================================================
> RCS file: src/sys/arch/octeon/include/octeonvar.h,v
> retrieving revision 1.31
> diff -u -p -r1.31 octeonvar.h
> --- arch/octeon/include/octeonvar.h 16 Jul 2016 10:19:55 -0000 1.31
> +++ arch/octeon/include/octeonvar.h 21 Oct 2016 11:45:01 -0000
> @@ -178,6 +178,7 @@ struct octeon_fau_map {
> * NB: BOARD_TYPE_UBIQUITI_E100 is also used by other vendors, but we don't
> run
> * on those boards yet.
> */
> +#define BOARD_TYPE_CN3010_EVB_HS5 11
> #define BOARD_TYPE_UBIQUITI_E100 20002
> #define BOARD_TYPE_UBIQUITI_E200 20003
> #define BOARD_TYPE_DSR_500 20015