This change adds support to cdc_ncm for ACPI MAC address pass through
functionality that also exists in the Realtek r8152 driver.  This is in
support of Dell's Universal Dock D6000, to give it the same feature
capability as is currently available in Windows and advertized on Dell's
product web site.

Signed-off-by: Charles Hyde <charles.h...@dellteam.com>
Cc: Mario Limonciello <mario.limoncie...@dell.com>
Cc: Oliver Neukum <oli...@neukum.org>
Cc: linux-usb@vger.kernel.org
---
 drivers/net/usb/cdc_ncm.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c
index f77c8672f972..1f046acca6fc 100644
--- a/drivers/net/usb/cdc_ncm.c
+++ b/drivers/net/usb/cdc_ncm.c
@@ -52,6 +52,7 @@
 #include <linux/usb/usbnet.h>
 #include <linux/usb/cdc.h>
 #include <linux/usb/cdc_ncm.h>
+#include <acpi/acpi_mac_passthru.h>
 
 #if IS_ENABLED(CONFIG_USB_NET_CDC_MBIM)
 static bool prefer_mbim = true;
@@ -930,11 +931,18 @@ int cdc_ncm_bind_common(struct usbnet *dev, struct 
usb_interface *intf, u8 data_
        usb_set_intfdata(ctx->control, dev);
 
        if (ctx->ether_desc) {
+               struct sockaddr sa;
+
                temp = usbnet_get_ethernet_addr(dev, 
ctx->ether_desc->iMACAddress);
                if (temp) {
                        dev_dbg(&intf->dev, "failed to get mac address\n");
                        goto error2;
                }
+               if (get_acpi_mac_passthru(&intf->dev, &sa) == 0) {
+                       memcpy(dev->net->dev_addr, sa.sa_data, ETH_ALEN);
+                       if (usbnet_set_ethernet_addr(dev) < 0)
+                               usbnet_get_ethernet_addr(dev, 
ctx->ether_desc->iMACAddress);
+               }
                dev_info(&intf->dev, "MAC-Address: %pM\n", dev->net->dev_addr);
        }
 
-- 
2.20.1

Reply via email to