On Sat, Sep 14, 2013 at 08:34:42PM +1000, Jonathan Matthew 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?
Reads good to me, and given the fact it doesn't break the cam-0100; Ok with me.
 
> 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)

-- 
Cheers,
Jasper

"Stay Hungry. Stay Foolish"

Reply via email to