Commit 4e3dbdb1 authored by Richard Mortimer's avatar Richard Mortimer Committed by David S. Miller

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: default avatarFrans van Berckel <fberckel@xs4all.nl>
Tested-by: default avatarFrans van Berckel <fberckel@xs4all.nl>
Reviewed-by: default avatarJulian Calaby <julian.calaby@gmail.com>
Reviewed-by: default avatarSam Ravnborg <sam@ravnborg.org>
Signed-off-by: default avatarRichard Mortimer <richm@oldelvet.org.uk>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 2ad0d9d4
...@@ -3203,6 +3203,10 @@ static int cas_get_vpd_info(struct cas *cp, unsigned char *dev_addr, ...@@ -3203,6 +3203,10 @@ static int cas_get_vpd_info(struct cas *cp, unsigned char *dev_addr,
int phy_type = CAS_PHY_MII_MDIO0; /* default phy type */ int phy_type = CAS_PHY_MII_MDIO0; /* default phy type */
int mac_off = 0; int mac_off = 0;
#if defined(CONFIG_OF)
const unsigned char *addr;
#endif
/* give us access to the PROM */ /* give us access to the PROM */
writel(BIM_LOCAL_DEV_PROM | BIM_LOCAL_DEV_PAD, writel(BIM_LOCAL_DEV_PROM | BIM_LOCAL_DEV_PAD,
cp->regs + REG_BIM_LOCAL_DEV_EN); cp->regs + REG_BIM_LOCAL_DEV_EN);
...@@ -3350,6 +3354,14 @@ static int cas_get_vpd_info(struct cas *cp, unsigned char *dev_addr, ...@@ -3350,6 +3354,14 @@ static int cas_get_vpd_info(struct cas *cp, unsigned char *dev_addr,
if (found & VPD_FOUND_MAC) if (found & VPD_FOUND_MAC)
goto done; goto done;
#if defined(CONFIG_OF)
addr = of_get_property(cp->of_node, "local-mac-address", NULL);
if (addr != NULL) {
memcpy(dev_addr, addr, 6);
goto done;
}
#endif
/* Sun MAC prefix then 3 random bytes. */ /* Sun MAC prefix then 3 random bytes. */
pr_info("MAC address not found in ROM VPD\n"); pr_info("MAC address not found in ROM VPD\n");
dev_addr[0] = 0x08; dev_addr[0] = 0x08;
...@@ -5019,6 +5031,10 @@ static int __devinit cas_init_one(struct pci_dev *pdev, ...@@ -5019,6 +5031,10 @@ static int __devinit cas_init_one(struct pci_dev *pdev,
cp->msg_enable = (cassini_debug < 0) ? CAS_DEF_MSG_ENABLE : cp->msg_enable = (cassini_debug < 0) ? CAS_DEF_MSG_ENABLE :
cassini_debug; cassini_debug;
#if defined(CONFIG_OF)
cp->of_node = pci_device_to_OF_node(pdev);
#endif
cp->link_transition = LINK_TRANSITION_UNKNOWN; cp->link_transition = LINK_TRANSITION_UNKNOWN;
cp->link_transition_jiffies_valid = 0; cp->link_transition_jiffies_valid = 0;
......
...@@ -2868,6 +2868,9 @@ struct cas { ...@@ -2868,6 +2868,9 @@ struct cas {
dma_addr_t block_dvma, tx_tiny_dvma[N_TX_RINGS]; dma_addr_t block_dvma, tx_tiny_dvma[N_TX_RINGS];
struct pci_dev *pdev; struct pci_dev *pdev;
struct net_device *dev; struct net_device *dev;
#if defined(CONFIG_OF)
struct device_node *of_node;
#endif
/* Firmware Info */ /* Firmware Info */
u16 fw_load_addr; u16 fw_load_addr;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment