[Xenial snapdragon][PATCH 1/1] UBUNTU: SAUCE: smsc75xx: read MAC address from file if it exists
Wen-chien Jesse Sung
jesse.sung at canonical.com
Thu Jun 28 09:01:02 UTC 2018
BugLink: https://launchpad.net/bugs/1779035
When trying to determine which MAC address to use, find if a valid one
is available in the file first.
Signed-off-by: Wen-chien Jesse Sung <jesse.sung at canonical.com>
---
drivers/net/usb/smsc75xx.c | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/drivers/net/usb/smsc75xx.c b/drivers/net/usb/smsc75xx.c
index 7337e6c0e126..b4352d4f58b1 100644
--- a/drivers/net/usb/smsc75xx.c
+++ b/drivers/net/usb/smsc75xx.c
@@ -29,6 +29,7 @@
#include <linux/crc32.h>
#include <linux/usb/usbnet.h>
#include <linux/slab.h>
+#include <linux/firmware.h>
#include "smsc75xx.h"
#define SMSC_CHIPNAME "smsc75xx"
@@ -759,8 +760,39 @@ static int smsc75xx_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd)
return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL);
}
+#define MAC_BASENAME "smsc75xx/ethmacaddr"
+
+static int smsc75xx_get_hw_mac(struct usbnet *dev)
+{
+ const struct firmware *fp = NULL;
+ int ret;
+ u8 tmp[32];
+
+ snprintf(tmp, sizeof(tmp), "%s-%s", MAC_BASENAME, dev->udev->devpath);
+ ret = request_firmware(&fp, tmp, &dev->udev->dev);
+ if (!ret) {
+ memset(tmp, 0, sizeof(tmp));
+ memcpy(tmp, fp->data, sizeof(tmp) - 1);
+ sscanf(tmp, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",
+ &dev->net->dev_addr[0],
+ &dev->net->dev_addr[1],
+ &dev->net->dev_addr[2],
+ &dev->net->dev_addr[3],
+ &dev->net->dev_addr[4],
+ &dev->net->dev_addr[5]);
+
+ release_firmware(fp);
+ }
+ return ret;
+}
+
static void smsc75xx_init_mac_address(struct usbnet *dev)
{
+ if (!smsc75xx_get_hw_mac(dev) && is_valid_ether_addr(dev->net->dev_addr)) {
+ netif_dbg(dev, ifup, dev->net, "MAC address read from file\n");
+ return;
+ }
+
/* try reading mac address from EEPROM */
if (smsc75xx_read_eeprom(dev, EEPROM_MAC_OFFSET, ETH_ALEN,
dev->net->dev_addr) == 0) {
--
2.17.1
More information about the kernel-team
mailing list