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>