aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/cassini.c
diff options
context:
space:
mode:
authorRichard Mortimer <richm@oldelvet.org.uk>2011-01-06 14:50:30 -0500
committerDavid S. Miller <davem@davemloft.net>2011-01-06 14:50:30 -0500
commit4e3dbdb1392a83bd21a6ff8f6bc785495058d37c (patch)
treefe455c384a1e470b49bf504bc15b9c44ae81504e /drivers/net/cassini.c
parent2ad0d9d413abc3380fc1d89a9da7f8db59d9746b (diff)
cassini: Use local-mac-address prom property for Cassini MAC address
Fallback on the local-mac-address prom property if the Cassini device does not have an address programmed in the VPD ROM. This uses the same technique as implemented by the sungem driver. The problem was reported by Frans van Berckel using Debian kernel 2.6.34-7 on Sun Fire V440. udev was assigning a new eth<n> device name on each reboot because the cassini driver was using a random MAC address. Fix tested on 2.6.34-7 and 2.6.37 Sun Fire V440. Compile tested against 2.6.36 davem/sparc-2.6.git Reported-by: Frans van Berckel <fberckel@xs4all.nl> Tested-by: Frans van Berckel <fberckel@xs4all.nl> Reviewed-by: Julian Calaby <julian.calaby@gmail.com> Reviewed-by: Sam Ravnborg <sam@ravnborg.org> Signed-off-by: Richard Mortimer <richm@oldelvet.org.uk> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/cassini.c')
-rw-r--r--drivers/net/cassini.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/net/cassini.c b/drivers/net/cassini.c
index 73502fef8769..7206ab2cbbf8 100644
--- a/drivers/net/cassini.c
+++ b/drivers/net/cassini.c
@@ -3203,6 +3203,10 @@ static int cas_get_vpd_info(struct cas *cp, unsigned char *dev_addr,
3203 int phy_type = CAS_PHY_MII_MDIO0; /* default phy type */ 3203 int phy_type = CAS_PHY_MII_MDIO0; /* default phy type */
3204 int mac_off = 0; 3204 int mac_off = 0;
3205 3205
3206#if defined(CONFIG_OF)
3207 const unsigned char *addr;
3208#endif
3209
3206 /* give us access to the PROM */ 3210 /* give us access to the PROM */
3207 writel(BIM_LOCAL_DEV_PROM | BIM_LOCAL_DEV_PAD, 3211 writel(BIM_LOCAL_DEV_PROM | BIM_LOCAL_DEV_PAD,
3208 cp->regs + REG_BIM_LOCAL_DEV_EN); 3212 cp->regs + REG_BIM_LOCAL_DEV_EN);
@@ -3350,6 +3354,14 @@ use_random_mac_addr:
3350 if (found & VPD_FOUND_MAC) 3354 if (found & VPD_FOUND_MAC)
3351 goto done; 3355 goto done;
3352 3356
3357#if defined(CONFIG_OF)
3358 addr = of_get_property(cp->of_node, "local-mac-address", NULL);
3359 if (addr != NULL) {
3360 memcpy(dev_addr, addr, 6);
3361 goto done;
3362 }
3363#endif
3364
3353 /* Sun MAC prefix then 3 random bytes. */ 3365 /* Sun MAC prefix then 3 random bytes. */
3354 pr_info("MAC address not found in ROM VPD\n"); 3366 pr_info("MAC address not found in ROM VPD\n");
3355 dev_addr[0] = 0x08; 3367 dev_addr[0] = 0x08;
@@ -5019,6 +5031,10 @@ static int __devinit cas_init_one(struct pci_dev *pdev,
5019 cp->msg_enable = (cassini_debug < 0) ? CAS_DEF_MSG_ENABLE : 5031 cp->msg_enable = (cassini_debug < 0) ? CAS_DEF_MSG_ENABLE :
5020 cassini_debug; 5032 cassini_debug;
5021 5033
5034#if defined(CONFIG_OF)
5035 cp->of_node = pci_device_to_OF_node(pdev);
5036#endif
5037
5022 cp->link_transition = LINK_TRANSITION_UNKNOWN; 5038 cp->link_transition = LINK_TRANSITION_UNKNOWN;
5023 cp->link_transition_jiffies_valid = 0; 5039 cp->link_transition_jiffies_valid = 0;
5024 5040