summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoe Perches <joe@perches.com>2011-04-16 16:15:26 +0200
committerDavid S. Miller <davem@davemloft.net>2011-04-18 02:56:37 +0200
commit482e3febc2e7df78411005dcdd7621c16b98b088 (patch)
tree93ba6fae8768ddfb20a05f17414f609a6c4dcc29
parentvia_rhine: Use netdev_<level> and pr_<level> (diff)
downloadlinux-482e3febc2e7df78411005dcdd7621c16b98b088.tar.xz
linux-482e3febc2e7df78411005dcdd7621c16b98b088.zip
via-rhine: Assign random MAC address if necessary
Roger Luethi has had several reports of Rhine NICs providing an invalid MAC address. If so, assign a random MAC address so the hardware can still be used. Tested as a standalone interface, as carrier for ppp, and as a bonding slave. Original-patch-by: Alexandru Gagniuc <mr.nuke.me@gmail.com> Signed-off-by: Joe Perches <joe@perches.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/via-rhine.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/net/via-rhine.c b/drivers/net/via-rhine.c
index 40f394ce113b..7f23ab913fd9 100644
--- a/drivers/net/via-rhine.c
+++ b/drivers/net/via-rhine.c
@@ -838,13 +838,15 @@ static int __devinit rhine_init_one(struct pci_dev *pdev,
for (i = 0; i < 6; i++)
dev->dev_addr[i] = ioread8(ioaddr + StationAddr + i);
- memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
- if (!is_valid_ether_addr(dev->perm_addr)) {
- rc = -EIO;
- dev_err(&pdev->dev, "Invalid MAC address\n");
- goto err_out_unmap;
+ if (!is_valid_ether_addr(dev->dev_addr)) {
+ /* Report it and use a random ethernet address instead */
+ netdev_err(dev, "Invalid MAC address: %pM\n", dev->dev_addr);
+ random_ether_addr(dev->dev_addr);
+ netdev_info(dev, "Using random MAC address: %pM\n",
+ dev->dev_addr);
}
+ memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
/* For Rhine-I/II, phy_id is loaded from EEPROM */
if (!phy_id)