Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 15 Mar 2015 21:56:13 +0000 (UTC)
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r280123 - head/sys/mips/atheros
Message-ID:  <201503152156.t2FLuDUw005870@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: adrian
Date: Sun Mar 15 21:56:12 2015
New Revision: 280123
URL: https://svnweb.freebsd.org/changeset/base/280123

Log:
  Start fleshing out some MAC address helper functions.
  
  A lot of these embedded boards don't have a unique MAC address per
  device stored somewhere unique - sometimes they'll have one MAC
  for both arge NICs; someties they'll have one MAC for both arge NICs
  /and/ the ath NICs.  In these instances, we need to derive device
  specific MAC addresses from the base MAC address.
  
  These functions will be used by some follow-up code that'll slot
  into if_arge and if_ath.

Added:
  head/sys/mips/atheros/ar71xx_macaddr.c   (contents, props changed)
  head/sys/mips/atheros/ar71xx_macaddr.h   (contents, props changed)
Modified:
  head/sys/mips/atheros/files.ar71xx

Added: head/sys/mips/atheros/ar71xx_macaddr.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/mips/atheros/ar71xx_macaddr.c	Sun Mar 15 21:56:12 2015	(r280123)
@@ -0,0 +1,107 @@
+/*-
+ * Copyright (c) 2015, Adrian Chadd <adrian@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/types.h>
+#include <sys/libkern.h>
+
+#include <mips/atheros/ar71xx_macaddr.h>
+
+/*
+ * Some boards don't have a separate MAC address for each individual
+ * device on-board, but instead need to derive them from a single MAC
+ * address stored somewhere.
+ */
+
+/*
+ * Initialise a MAC address 'dst' from a MAC address 'src'.
+ *
+ * 'offset' is added to the low three bytes to allow for sequential
+ * MAC addresses to be derived from a single one.
+ *
+ * 'is_local' is whether this 'dst' should be made a local MAC address.
+ *
+ * Returns 0 if it was successfully initialised, -1 on error.
+ */
+int
+ar71xx_mac_addr_init(unsigned char *dst, const unsigned char *src,
+    int offset, int is_local)
+{
+	int t;
+
+	if (dst == NULL || src == NULL)
+		return (-1);
+
+	/* XXX TODO: validate 'src' is a valid MAC address */
+
+	t = (((uint32_t) src[3]) << 16)
+	    + (((uint32_t) src[4]) << 8)
+	    + ((uint32_t) src[5]);
+
+	/* Note: this is handles both positive and negative offsets */
+	t += offset;
+
+	dst[0] = src[0];
+	dst[1] = src[1];
+	dst[2] = src[2];
+	dst[3] = (t >> 16) & 0xff;
+	dst[4] = (t >> 8) & 0xff;
+	dst[5] = t & 0xff;
+
+	if (is_local)
+		dst[0] |= 0x02;
+
+	/* Everything's okay */
+	return (0);
+}
+
+/*
+ * Initialise a random MAC address for use by if_arge.c and whatever
+ * else requires it.
+ *
+ * Returns 0 on success, -1 on error.
+ */
+int
+ar71xx_mac_addr_random_init(unsigned char *dst)
+{
+	uint32_t rnd;
+
+	rnd = arc4random();
+
+	dst[0] = 'b';
+	dst[1] = 's';
+	dst[2] = 'd';
+	dst[3] = (rnd >> 24) & 0xff;
+	dst[4] = (rnd >> 16) & 0xff;
+	dst[5] = (rnd >> 8) & 0xff;
+
+	return (0);
+}

Added: head/sys/mips/atheros/ar71xx_macaddr.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/mips/atheros/ar71xx_macaddr.h	Sun Mar 15 21:56:12 2015	(r280123)
@@ -0,0 +1,37 @@
+/*-
+ * Copyright (c) 2015, Adrian Chadd <adrian@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef	__ATHEROS_AR71XX_MACADDR_H__
+#define	__ATHEROS_AR71XX_MACADDR_H__
+
+extern	int ar71xx_mac_addr_init(unsigned char *dst, const unsigned char *src,
+	    int offset, int is_local);
+extern	int ar71xx_mac_addr_random_init(unsigned char *dst);
+
+#endif /* __ATHEROS_AR71XX_MACADDR_H__ */

Modified: head/sys/mips/atheros/files.ar71xx
==============================================================================
--- head/sys/mips/atheros/files.ar71xx	Sun Mar 15 21:50:58 2015	(r280122)
+++ head/sys/mips/atheros/files.ar71xx	Sun Mar 15 21:56:12 2015	(r280123)
@@ -9,6 +9,7 @@ mips/atheros/ar71xx_pci.c	optional ar71x
 mips/atheros/ar724x_pci.c	optional ar724x_pci pci
 mips/atheros/ar71xx_pci_bus_space.c	optional pci
 mips/atheros/ar71xx_spi.c	optional ar71xx_spi
+mips/atheros/ar71xx_macaddr.c	standard
 mips/atheros/pcf2123_rtc.c	optional pcf2123_rtc ar71xx_spi
 mips/atheros/ar71xx_wdog.c	optional ar71xx_wdog
 mips/atheros/if_arge.c		optional arge
@@ -28,5 +29,6 @@ mips/atheros/ar933x_chip.c	standard
 mips/atheros/ar934x_chip.c	standard
 mips/atheros/qca955x_chip.c	standard
 mips/atheros/ar71xx_fixup.c	optional ar71xx_ath_eeprom
+mips/atheros/qca955x_apb.c	optional qca955x_apb
 
 dev/hwpmc/hwpmc_mips24k.c	optional hwpmc_mips24k



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