[U-Boot] [PATCH 2/4] net: tweak eth_device layout to simplify enetaddr use
Mike Frysinger
vapier at gentoo.org
Fri Nov 11 01:11:05 CET 2011
The current eth_device leaves a 2 byte hole after "enetaddr" and before
"iobase". Since the enetaddr member has to be 6 bytes, we might as well
fill that 2 byte hole with something useful.
Further, most device drivers want to load enetaddr from memory into the
hardware as 1 32bit value and 1 16bit value.
So re-arrange the structure slightly, and add an anonymous union to make
eth_device even better:
- expand the name field to fill the 2 byte hole
- make sure enetaddr is aligned, and provides 32bit/16bit members
Now device driver code can simply use "dev->enetaddr32" and
"dev->enetaddr16[2]" to access the values without having to manually
shift the bytes out of dev->enetaddr.
Signed-off-by: Mike Frysinger <vapier at gentoo.org>
---
include/net.h | 13 +++++++++++--
1 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/include/net.h b/include/net.h
index b4acd8f..e8c12d9 100644
--- a/include/net.h
+++ b/include/net.h
@@ -73,8 +73,17 @@ enum eth_state_t {
};
struct eth_device {
- char name[16];
- unsigned char enetaddr[6];
+ /* Keep enetaddr at start so it is guaranteed aligned */
+ union {
+ u32 enetaddr32;
+ u16 enetaddr16[3];
+ unsigned char enetaddr[6];
+ };
+ /*
+ * Note: name size is picked to fill the holes in memory after
+ * enetaddr, and to match up to alignment for following "int".
+ */
+ char name[18];
int iobase;
int state;
--
1.7.6.1
More information about the U-Boot
mailing list