From 3bd3e39e1ad5af6539c61d3d2f0f66144c10fb46 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Sun, 15 Mar 2015 21:56:12 +0000 Subject: [PATCH] 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. --- sys/mips/atheros/ar71xx_macaddr.c | 107 ++++++++++++++++++++++++++++++ sys/mips/atheros/ar71xx_macaddr.h | 37 +++++++++++ sys/mips/atheros/files.ar71xx | 2 + 3 files changed, 146 insertions(+) create mode 100644 sys/mips/atheros/ar71xx_macaddr.c create mode 100644 sys/mips/atheros/ar71xx_macaddr.h diff --git a/sys/mips/atheros/ar71xx_macaddr.c b/sys/mips/atheros/ar71xx_macaddr.c new file mode 100644 index 000000000000..7a8b485acd74 --- /dev/null +++ b/sys/mips/atheros/ar71xx_macaddr.c @@ -0,0 +1,107 @@ +/*- + * Copyright (c) 2015, Adrian Chadd + * 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 +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include + +#include + +/* + * 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); +} diff --git a/sys/mips/atheros/ar71xx_macaddr.h b/sys/mips/atheros/ar71xx_macaddr.h new file mode 100644 index 000000000000..aab396fa36df --- /dev/null +++ b/sys/mips/atheros/ar71xx_macaddr.h @@ -0,0 +1,37 @@ +/*- + * Copyright (c) 2015, Adrian Chadd + * 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__ */ diff --git a/sys/mips/atheros/files.ar71xx b/sys/mips/atheros/files.ar71xx index 9aefcb473aa8..5356f043a7b2 100644 --- a/sys/mips/atheros/files.ar71xx +++ b/sys/mips/atheros/files.ar71xx @@ -9,6 +9,7 @@ mips/atheros/ar71xx_pci.c optional ar71xx_pci pci 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