123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- From 5387243844440a0d05f4b75216588a68526aa4c9 Mon Sep 17 00:00:00 2001
- From: popcornmix <popcornmix@gmail.com>
- Date: Tue, 18 Feb 2014 01:43:50 -0300
- Subject: [PATCH 5/9] net/smsc95xx: Allow mac address to be set as a parameter
- ---
- drivers/net/usb/smsc95xx.c | 56 ++++++++++++++++++++++++++++++++++++++
- 1 file changed, 56 insertions(+)
- diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c
- index ea0d5f04dc3a..88ebceb84193 100644
- --- a/drivers/net/usb/smsc95xx.c
- +++ b/drivers/net/usb/smsc95xx.c
- @@ -50,6 +50,7 @@
- #define SUSPEND_SUSPEND3 (0x08)
- #define SUSPEND_ALLMODES (SUSPEND_SUSPEND0 | SUSPEND_SUSPEND1 | \
- SUSPEND_SUSPEND2 | SUSPEND_SUSPEND3)
- +#define MAC_ADDR_LEN (6)
-
- struct smsc95xx_priv {
- u32 mac_cr;
- @@ -67,6 +68,10 @@ static bool turbo_mode = true;
- module_param(turbo_mode, bool, 0644);
- MODULE_PARM_DESC(turbo_mode, "Enable multiple frames per Rx transaction");
-
- +static char *macaddr = ":";
- +module_param(macaddr, charp, 0);
- +MODULE_PARM_DESC(macaddr, "MAC address");
- +
- static int __must_check __smsc95xx_read_reg(struct usbnet *dev, u32 index,
- u32 *data, int in_pm)
- {
- @@ -753,8 +758,59 @@ static int smsc95xx_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd)
- return phy_mii_ioctl(netdev->phydev, rq, cmd);
- }
-
- +/* Check the macaddr module parameter for a MAC address */
- +static int smsc95xx_is_macaddr_param(struct usbnet *dev, u8 *dev_mac)
- +{
- + int i, j, got_num, num;
- + u8 mtbl[MAC_ADDR_LEN];
- +
- + if (macaddr[0] == ':')
- + return 0;
- +
- + i = 0;
- + j = 0;
- + num = 0;
- + got_num = 0;
- + while (j < MAC_ADDR_LEN) {
- + if (macaddr[i] && macaddr[i] != ':') {
- + got_num++;
- + if ('0' <= macaddr[i] && macaddr[i] <= '9')
- + num = num * 16 + macaddr[i] - '0';
- + else if ('A' <= macaddr[i] && macaddr[i] <= 'F')
- + num = num * 16 + 10 + macaddr[i] - 'A';
- + else if ('a' <= macaddr[i] && macaddr[i] <= 'f')
- + num = num * 16 + 10 + macaddr[i] - 'a';
- + else
- + break;
- + i++;
- + } else if (got_num == 2) {
- + mtbl[j++] = (u8) num;
- + num = 0;
- + got_num = 0;
- + i++;
- + } else {
- + break;
- + }
- + }
- +
- + if (j == MAC_ADDR_LEN) {
- + netif_dbg(dev, ifup, dev->net, "Overriding MAC address with: "
- + "%02x:%02x:%02x:%02x:%02x:%02x\n", mtbl[0], mtbl[1], mtbl[2],
- + mtbl[3], mtbl[4], mtbl[5]);
- + for (i = 0; i < MAC_ADDR_LEN; i++)
- + dev_mac[i] = mtbl[i];
- + return 1;
- + } else {
- + return 0;
- + }
- +}
- +
- static void smsc95xx_init_mac_address(struct usbnet *dev)
- {
- + /* Check module parameters */
- + if (smsc95xx_is_macaddr_param(dev, dev->net->dev_addr))
- + return;
- +
- /* maybe the boot loader passed the MAC address in devicetree */
- if (!eth_platform_get_mac_address(&dev->udev->dev,
- dev->net->dev_addr)) {
- --
- 2.30.0
|