Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 29 Feb 2012 05:48:30 +0000 (UTC)
From:      Oleksandr Tymoshenko <gonzo@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r232289 - in head/sys/mips/cavium: . octe
Message-ID:  <201202290548.q1T5mUfd011230@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: gonzo
Date: Wed Feb 29 05:48:29 2012
New Revision: 232289
URL: http://svn.freebsd.org/changeset/base/232289

Log:
  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

Modified:
  head/sys/mips/cavium/files.octeon1
  head/sys/mips/cavium/if_octm.c
  head/sys/mips/cavium/octe/ethernet-common.c

Modified: head/sys/mips/cavium/files.octeon1
==============================================================================
--- head/sys/mips/cavium/files.octeon1	Wed Feb 29 05:41:29 2012	(r232288)
+++ head/sys/mips/cavium/files.octeon1	Wed Feb 29 05:48:29 2012	(r232289)
@@ -24,7 +24,6 @@ mips/cavium/cryptocteon/cryptocteon.c		o
 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
 

Modified: head/sys/mips/cavium/if_octm.c
==============================================================================
--- head/sys/mips/cavium/if_octm.c	Wed Feb 29 05:41:29 2012	(r232288)
+++ head/sys/mips/cavium/if_octm.c	Wed Feb 29 05:48:29 2012	(r232289)
@@ -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.  */

Modified: head/sys/mips/cavium/octe/ethernet-common.c
==============================================================================
--- head/sys/mips/cavium/octe/ethernet-common.c	Wed Feb 29 05:41:29 2012	(r232288)
+++ head/sys/mips/cavium/octe/ethernet-common.c	Wed Feb 29 05:48:29 2012	(r232289)
@@ -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(s
 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;
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201202290548.q1T5mUfd011230>