svn commit: r280123 - head/sys/mips/atheros
Adrian Chadd
adrian at FreeBSD.org
Sun Mar 15 21:56:14 UTC 2015
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 at 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 at 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
More information about the svn-src-all
mailing list