smsc95xx: Add module params to read MAC address
Manoj Chourasia [Sun, 12 Feb 2012 14:18:06 +0000 (19:18 +0530)]
This patch adds support for mac_addr module param

mac_addr : MAC address which will be assigned to the
above device. example
mac_addr=0x0,0x2,0x2,0x3,0x3,0x4

If EEPROM read fails for MAC address for a smsc
interface and if the mac_addr module param is set
then driver will set that device MAC address provided
in mac_addr. This can be set for only one device

bug 719410, bug 921146

Change-Id: I6eb0363951d91fad857b76af8a4a097cd0fb7623
Signed-off-by: Manoj Chourasia <mchourasia@nvidia.com>
Reviewed-on: http://git-master/r/108237
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Varun Wadekar <vwadekar@nvidia.com>

drivers/net/usb/smsc95xx.c

index 7b46879..3708469 100644 (file)
@@ -1,7 +1,7 @@
  /***************************************************************************
  *
  * Copyright (C) 2007-2008 SMSC
- *
+ * Copyright (C) 2012 NVIDIA Corporation.
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
  * as published by the Free Software Foundation; either version 2
@@ -63,6 +63,11 @@ static int turbo_mode = true;
 module_param(turbo_mode, bool, 0644);
 MODULE_PARM_DESC(turbo_mode, "Enable multiple frames per Rx transaction");
 
+static u8 mac_addr[6] = {0};
+static bool smsc_mac_addr_set;
+module_param_array_named(mac_addr, mac_addr, byte, NULL, 0);
+MODULE_PARM_DESC(mac_addr, "SMSC command line MAC address");
+
 static int smsc95xx_read_reg(struct usbnet *dev, u32 index, u32 *data)
 {
        u32 *buf = kmalloc(4, GFP_KERNEL);
@@ -612,6 +617,15 @@ static void smsc95xx_init_mac_address(struct usbnet *dev)
                }
        }
 
+       /* try reading mac address from command line */
+       if (is_valid_ether_addr(mac_addr) && !smsc_mac_addr_set) {
+               memcpy(dev->net->dev_addr, mac_addr, sizeof(mac_addr));
+               smsc_mac_addr_set = true;
+               netif_dbg(dev, ifup, dev->net,
+                               "MAC address read from command line");
+               return;
+       }
+
        /* no eeprom, or eeprom values are invalid. generate random MAC */
        random_ether_addr(dev->net->dev_addr);
        netif_dbg(dev, ifup, dev->net, "MAC address set to random_ether_addr\n");