From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932096AbcFAVva (ORCPT ); Wed, 1 Jun 2016 17:51:30 -0400 Received: from ausxipps301.us.dell.com ([143.166.148.223]:31645 "EHLO ausxipps301.us.dell.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932089AbcFAVvC (ORCPT ); Wed, 1 Jun 2016 17:51:02 -0400 DomainKey-Signature: s=smtpout; d=dell.com; c=nofws; q=dns; h=X-LoopCount0:X-IronPort-AV:From:To:Cc:Subject:Date: Message-Id:X-Mailer; b=QPr6dUz7C0L6mqp24AqMgjiSTvZ0/FtQCsblLuHJJrBbqIkTMxYcmO8R dc9nwHSI4ynYpYmMZurMx2UZW67rqUYBVDugQ3f/m5pLilSeBjPW/2s6Y g8nUdyaIIZysiaG2HLrdtS+k7uIZEn1ei2BYw8JFE52jTcFMRz1S7gmQ0 M=; X-LoopCount0: from 10.209.151.17 X-IronPort-AV: E=Sophos;i="5.26,403,1459832400"; d="scan'208";a="801009245" From: Mario Limonciello To: hayeswang@realtek.com Cc: LKML , Netdev , Linux USB , pali.rohar@gmail.com, anthony.wong@canonical.com, Mario Limonciello Subject: [PATCH] r8152: Add support for setting MAC to system's Auxiliary MAC address Date: Wed, 1 Jun 2016 16:50:44 -0500 Message-Id: <1464817844-27206-1-git-send-email-mario_limonciello@dell.com> X-Mailer: git-send-email 2.7.4 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Dell systems with Type-C ports have support for a persistent system specific MAC address when used with Dell Type-C docks and dongles. This means a dock plugged into two different systems will show different (but persistent) MAC addresses. Dell Type-C docks and dongles use the r8152 driver. This information for the system's persistent MAC address is burned in when the HW is built and avilable under _SB\AMAC in the DSDT at runtime. More information about the technology is available here: http://www.dell.com/support/article/us/en/04/SLN301147 Signed-off-by: Mario Limonciello --- drivers/net/usb/Kconfig | 1 + drivers/net/usb/r8152.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig index cdde590..c320930 100644 --- a/drivers/net/usb/Kconfig +++ b/drivers/net/usb/Kconfig @@ -98,6 +98,7 @@ config USB_RTL8150 config USB_RTL8152 tristate "Realtek RTL8152/RTL8153 Based USB Ethernet Adapters" select MII + depends on ACPI help This option adds support for Realtek RTL8152 based USB 2.0 10/100 Ethernet adapters and RTL8153 based USB 3.0 10/100/1000 diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 3f9f6ed..62af3b4 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -26,6 +26,7 @@ #include #include #include +#include /* Information for net-next */ #define NETNEXT_VERSION "08" @@ -1030,6 +1031,39 @@ out1: return ret; } +static u8 amac_ascii_to_hex(int c) +{ + if (c <= 0x39) + return (u8)(c - 0x30); + else if (c <= 0x46) + return (u8)(c - 0x37); + return (u8)(c - 0x57); +} + +static void set_auxiliary_addr(struct sockaddr *sa) +{ + acpi_status status; + acpi_handle handle; + struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; + union acpi_object *obj; + int i; + char *ptr; + + acpi_get_handle(NULL, "\\_SB", &handle); + status = acpi_evaluate_object(handle, "AMAC", NULL, &buffer); + obj = (union acpi_object *)buffer.pointer; + if (ACPI_SUCCESS(status) && (obj->string.length == 0x17)) { + /* returns _AUXMAC_#AABBCCDDEEFF# + * this pulls out _AUXMAC# from start and # from end + */ + ptr = obj->string.pointer + 9; + pr_info("r8152: Using system auxiliary MAC address"); + for (i = 0; i < 6; i++, ptr += 2) + sa->sa_data[i] = amac_ascii_to_hex(*ptr) << 4 | + amac_ascii_to_hex(*(ptr + 1)); + } +} + static int set_ethernet_addr(struct r8152 *tp) { struct net_device *dev = tp->netdev; @@ -1041,6 +1075,9 @@ static int set_ethernet_addr(struct r8152 *tp) else ret = pla_ocp_read(tp, PLA_BACKUP, 8, sa.sa_data); + /* if system provides auxiliary MAC address */ + set_auxiliary_addr(&sa); + if (ret < 0) { netif_err(tp, probe, dev, "Get ether addr fail\n"); } else if (!is_valid_ether_addr(sa.sa_data)) { -- 2.7.4