octeon cnmac phy addresses

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

octeon cnmac phy addresses

Jonathan Matthew-5
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 | Threaded
Open this post in threaded view
|

Re: octeon cnmac phy addresses

David Gwynne-5
makes a lot of sense to me, ok. you need oks from people other than me though.

dlg

On 14/09/2013, at 8:34 PM, Jonathan Matthew <[hidden email]> 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 | Threaded
Open this post in threaded view
|

Re: octeon cnmac phy addresses

Brian Callahan-3

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 <[hidden email]> 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 | Threaded
Open this post in threaded view
|

Re: octeon cnmac phy addresses

Jasper Lievisse Adriaanse-2
In reply to this post by Jonathan Matthew-5
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"