ax88796: Add method to take MAC from platform data
authorDaniel Mack <daniel@caiaq.de>
Wed, 25 Mar 2009 06:32:03 +0000 (23:32 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 25 Mar 2009 06:32:03 +0000 (23:32 -0700)
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>
drivers/net/ax88796.c
include/net/ax88796.h

index e7c9748..62d9c9c 100644 (file)
@@ -733,12 +733,19 @@ static int ax_init_dev(struct net_device *dev, int first_init)
        /* load the mac-address from the device if this is the
         * first time we've initialised */
 
-       if (first_init && ax->plat->flags & AXFLG_MAC_FROMDEV) {
-               ei_outb(E8390_NODMA + E8390_PAGE1 + E8390_STOP,
-                       ei_local->mem + E8390_CMD); /* 0x61 */
+       if (first_init) {
+               if (ax->plat->flags & AXFLG_MAC_FROMDEV) {
+                       ei_outb(E8390_NODMA + E8390_PAGE1 + E8390_STOP,
+                               ei_local->mem + E8390_CMD); /* 0x61 */
+                       for (i = 0; i < ETHER_ADDR_LEN; i++)
+                               dev->dev_addr[i] =
+                                       ei_inb(ioaddr + EN1_PHYS_SHIFT(i));
+               }
 
-               for (i = 0 ; i < ETHER_ADDR_LEN ; i++)
-                       dev->dev_addr[i] = ei_inb(ioaddr + EN1_PHYS_SHIFT(i));
+               if ((ax->plat->flags & AXFLG_MAC_FROMPLATFORM) &&
+                    ax->plat->mac_addr)
+                       memcpy(dev->dev_addr, ax->plat->mac_addr,
+                               ETHER_ADDR_LEN);
        }
 
        ax_reset_8390(dev);
index 51329da..b9a3bec 100644 (file)
 #define AXFLG_HAS_EEPROM               (1<<0)
 #define AXFLG_MAC_FROMDEV              (1<<1)  /* device already has MAC */
 #define AXFLG_HAS_93CX6                        (1<<2)  /* use eeprom_93cx6 driver */
+#define AXFLG_MAC_FROMPLATFORM         (1<<3)  /* MAC given by platform data */
 
 struct ax_plat_data {
        unsigned int     flags;
-       unsigned char    wordlength;            /* 1 or 2 */
-       unsigned char    dcr_val;               /* default value for DCR */
-       unsigned char    rcr_val;               /* default value for RCR */
-       unsigned char    gpoc_val;              /* default value for GPOC */
-       u32             *reg_offsets;           /* register offsets */
+       unsigned char    wordlength;    /* 1 or 2 */
+       unsigned char    dcr_val;       /* default value for DCR */
+       unsigned char    rcr_val;       /* default value for RCR */
+       unsigned char    gpoc_val;      /* default value for GPOC */
+       u32             *reg_offsets;   /* register offsets */
+       u8              *mac_addr;      /* MAC addr (only used when
+                                          AXFLG_MAC_FROMPLATFORM is used */
 };
 
 #endif /* __NET_AX88796_PLAT_H */