12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- From 534a5d5cecfd7c3e6cb18cde2dc15f5e6f1e415f Mon Sep 17 00:00:00 2001
- From: popcornmix <popcornmix@gmail.com>
- Date: Tue, 26 Mar 2013 17:26:38 +0000
- Subject: [PATCH] Allow mac address to be set in smsc95xx
- Signed-off-by: popcornmix <popcornmix@gmail.com>
- ---
- drivers/net/usb/smsc95xx.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++
- 1 file changed, 56 insertions(+)
- --- a/drivers/net/usb/smsc95xx.c
- +++ b/drivers/net/usb/smsc95xx.c
- @@ -59,6 +59,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;
- @@ -74,6 +75,10 @@ static bool turbo_mode = false;
- 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)
- {
- @@ -766,8 +771,59 @@ static int smsc95xx_ioctl(struct net_dev
- return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL);
- }
-
- +/* 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;
- +
- /* try reading mac address from EEPROM */
- if (smsc95xx_read_eeprom(dev, EEPROM_MAC_OFFSET, ETH_ALEN,
- dev->net->dev_addr) == 0) {
|