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:
parent
9ed54e79b5
commit
f3318c38dc
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=232289
@ -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
|
||||
|
||||
|
@ -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. */
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user