Skip to content

Commit

Permalink
cassini: Use local-mac-address prom property for Cassini MAC address
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
oldelvet authored and davem330 committed Jan 6, 2011
1 parent 2ad0d9d commit 4e3dbdb
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 0 deletions.
16 changes: 16 additions & 0 deletions drivers/net/cassini.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 mac_off = 0;

#if defined(CONFIG_OF)
const unsigned char *addr;
#endif

/* give us access to the PROM */
writel(BIM_LOCAL_DEV_PROM | BIM_LOCAL_DEV_PAD,
cp->regs + REG_BIM_LOCAL_DEV_EN);
Expand Down Expand Up @@ -3350,6 +3354,14 @@ static int cas_get_vpd_info(struct cas *cp, unsigned char *dev_addr,
if (found & VPD_FOUND_MAC)
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. */
pr_info("MAC address not found in ROM VPD\n");
dev_addr[0] = 0x08;
Expand Down Expand Up @@ -5019,6 +5031,10 @@ static int __devinit cas_init_one(struct pci_dev *pdev,
cp->msg_enable = (cassini_debug < 0) ? CAS_DEF_MSG_ENABLE :
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_jiffies_valid = 0;

Expand Down
3 changes: 3 additions & 0 deletions drivers/net/cassini.h
Original file line number Diff line number Diff line change
Expand Up @@ -2868,6 +2868,9 @@ struct cas {
dma_addr_t block_dvma, tx_tiny_dvma[N_TX_RINGS];
struct pci_dev *pdev;
struct net_device *dev;
#if defined(CONFIG_OF)
struct device_node *of_node;
#endif

/* Firmware Info */
u16 fw_load_addr;
Expand Down

0 comments on commit 4e3dbdb

Please sign in to comment.