diff options
author | Daniel Mack <daniel@caiaq.de> | 2009-03-25 02:32:03 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-03-25 02:32:03 -0400 |
commit | 67fca028f1535e510689d2e444b0289e264e05c1 (patch) | |
tree | 8df26ed8bc025eb32e16b97adf9242e1c2b76cdb | |
parent | 47cb035560a41bd1bd3db506eeab93088815203e (diff) |
ax88796: Add method to take MAC from platform data
Implement a way to provide the MAC address for ax88796 devices from
their platform data. Boards might decide to set the address
programmatically, taken from boot tags or other sources.
Signed-off-by: Daniel Mack <daniel@caiaq.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ax88796.c | 17 | ||||
-rw-r--r-- | include/net/ax88796.h | 13 |
2 files changed, 20 insertions, 10 deletions
diff --git a/drivers/net/ax88796.c b/drivers/net/ax88796.c index e7c9748437d4..62d9c9cc5671 100644 --- a/drivers/net/ax88796.c +++ b/drivers/net/ax88796.c | |||
@@ -733,12 +733,19 @@ static int ax_init_dev(struct net_device *dev, int first_init) | |||
733 | /* load the mac-address from the device if this is the | 733 | /* load the mac-address from the device if this is the |
734 | * first time we've initialised */ | 734 | * first time we've initialised */ |
735 | 735 | ||
736 | if (first_init && ax->plat->flags & AXFLG_MAC_FROMDEV) { | 736 | if (first_init) { |
737 | ei_outb(E8390_NODMA + E8390_PAGE1 + E8390_STOP, | 737 | if (ax->plat->flags & AXFLG_MAC_FROMDEV) { |
738 | ei_local->mem + E8390_CMD); /* 0x61 */ | 738 | ei_outb(E8390_NODMA + E8390_PAGE1 + E8390_STOP, |
739 | ei_local->mem + E8390_CMD); /* 0x61 */ | ||
740 | for (i = 0; i < ETHER_ADDR_LEN; i++) | ||
741 | dev->dev_addr[i] = | ||
742 | ei_inb(ioaddr + EN1_PHYS_SHIFT(i)); | ||
743 | } | ||
739 | 744 | ||
740 | for (i = 0 ; i < ETHER_ADDR_LEN ; i++) | 745 | if ((ax->plat->flags & AXFLG_MAC_FROMPLATFORM) && |
741 | dev->dev_addr[i] = ei_inb(ioaddr + EN1_PHYS_SHIFT(i)); | 746 | ax->plat->mac_addr) |
747 | memcpy(dev->dev_addr, ax->plat->mac_addr, | ||
748 | ETHER_ADDR_LEN); | ||
742 | } | 749 | } |
743 | 750 | ||
744 | ax_reset_8390(dev); | 751 | ax_reset_8390(dev); |
diff --git a/include/net/ax88796.h b/include/net/ax88796.h index 51329dae44e6..b9a3beca0ce4 100644 --- a/include/net/ax88796.h +++ b/include/net/ax88796.h | |||
@@ -15,14 +15,17 @@ | |||
15 | #define AXFLG_HAS_EEPROM (1<<0) | 15 | #define AXFLG_HAS_EEPROM (1<<0) |
16 | #define AXFLG_MAC_FROMDEV (1<<1) /* device already has MAC */ | 16 | #define AXFLG_MAC_FROMDEV (1<<1) /* device already has MAC */ |
17 | #define AXFLG_HAS_93CX6 (1<<2) /* use eeprom_93cx6 driver */ | 17 | #define AXFLG_HAS_93CX6 (1<<2) /* use eeprom_93cx6 driver */ |
18 | #define AXFLG_MAC_FROMPLATFORM (1<<3) /* MAC given by platform data */ | ||
18 | 19 | ||
19 | struct ax_plat_data { | 20 | struct ax_plat_data { |
20 | unsigned int flags; | 21 | unsigned int flags; |
21 | unsigned char wordlength; /* 1 or 2 */ | 22 | unsigned char wordlength; /* 1 or 2 */ |
22 | unsigned char dcr_val; /* default value for DCR */ | 23 | unsigned char dcr_val; /* default value for DCR */ |
23 | unsigned char rcr_val; /* default value for RCR */ | 24 | unsigned char rcr_val; /* default value for RCR */ |
24 | unsigned char gpoc_val; /* default value for GPOC */ | 25 | unsigned char gpoc_val; /* default value for GPOC */ |
25 | u32 *reg_offsets; /* register offsets */ | 26 | u32 *reg_offsets; /* register offsets */ |
27 | u8 *mac_addr; /* MAC addr (only used when | ||
28 | AXFLG_MAC_FROMPLATFORM is used */ | ||
26 | }; | 29 | }; |
27 | 30 | ||
28 | #endif /* __NET_AX88796_PLAT_H */ | 31 | #endif /* __NET_AX88796_PLAT_H */ |