Revert part of old logic of assigning MAC addressess:

- Reserver respective number of addresses for managment port
- octm uses base address directly
- other drivers get MACs on "first come first served" basis

Reviewed by:	juli
This commit is contained in:
Oleksandr Tymoshenko 2012-02-29 05:48:29 +00:00
parent 9ed54e79b5
commit f3318c38dc
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=232289
3 changed files with 34 additions and 16 deletions

View File

@ -24,7 +24,6 @@ mips/cavium/cryptocteon/cryptocteon.c optional cryptocteon
mips/mips/octeon_cop2_swtch.S standard
mips/mips/octeon_cop2.c standard
# octm must be first, so management ports get the first MAC addresses
mips/cavium/if_octm.c optional octm
contrib/octeon-sdk/cvmx-mgmt-port.c optional octm

View File

@ -63,7 +63,6 @@
#include <contrib/octeon-sdk/cvmx.h>
#include <contrib/octeon-sdk/cvmx-interrupt.h>
#include <contrib/octeon-sdk/cvmx-mgmt-port.h>
#include "octe/ethernet-common.h"
struct octm_softc {
struct ifnet *sc_ifp;
@ -177,10 +176,10 @@ octm_attach(device_t dev)
/*
* Set MAC address for this management port.
*/
if (cvm_assign_mac_address(&mac, NULL) != 0) {
device_printf(dev, "unable to allocate MAC address.\n");
return (ENXIO);
}
mac = 0;
memcpy((u_int8_t *)&mac + 2, cvmx_sysinfo_get()->mac_addr_base, 6);
mac += sc->sc_port;
cvmx_mgmt_port_set_mac(sc->sc_port, mac);
/* No watermark for input ring. */

View File

@ -46,8 +46,8 @@ __FBSDID("$FreeBSD$");
extern int octeon_is_simulation(void);
static uint64_t mac_addr = 0;
static uint32_t mac_offset = 0;
static uint64_t cvm_oct_mac_addr = 0;
static uint32_t cvm_oct_mac_addr_offset = 0;
/**
* Set the multicast list. Currently unimplemented.
@ -102,22 +102,42 @@ void cvm_oct_common_set_multicast_list(struct ifnet *ifp)
int cvm_assign_mac_address(uint64_t *macp, uint8_t *octets)
{
/* Initialize from global MAC address base; fail if not set */
if (mac_addr == 0) {
memcpy((uint8_t *)&mac_addr + 2, cvmx_sysinfo_get()->mac_addr_base, 6);
if (mac_addr == 0)
if (cvm_oct_mac_addr == 0) {
memcpy((uint8_t *)&cvm_oct_mac_addr + 2,
cvmx_sysinfo_get()->mac_addr_base, 6);
if (cvm_oct_mac_addr == 0)
return ENXIO;
/*
* The offset from mac_addr_base that should be used for the next port
* that is configured. By convention, if any mgmt ports exist on the
* chip, they get the first mac addresses. The ports controlled by
* driver that use this function are numbered sequencially following
* any mgmt addresses that may exist.
*
* XXX Would be nice if __cvmx_mgmt_port_num_ports() were
* not static to cvmx-mgmt-port.c.
*/
if (OCTEON_IS_MODEL(OCTEON_CN56XX))
cvm_oct_mac_addr_offset = 1;
else if (OCTEON_IS_MODEL(OCTEON_CN52XX) || OCTEON_IS_MODEL(OCTEON_CN63XX))
cvm_oct_mac_addr_offset = 2;
else
cvm_oct_mac_addr_offset = 0;
cvm_oct_mac_addr += cvm_oct_mac_addr_offset;
}
if (mac_offset >= cvmx_sysinfo_get()->mac_addr_count)
if (cvm_oct_mac_addr_offset >= cvmx_sysinfo_get()->mac_addr_count)
return ENXIO; /* Out of addresses to assign */
if (macp)
*macp = mac_addr;
*macp = cvm_oct_mac_addr;
if (octets)
memcpy(octets, (u_int8_t *)&mac_addr + 2, 6);
memcpy(octets, (u_int8_t *)&cvm_oct_mac_addr + 2, 6);
mac_addr++;
mac_offset++;
cvm_oct_mac_addr++;
cvm_oct_mac_addr_offset++;
return 0;
}