From patchwork Fri Oct 25 10:59:18 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kai-Heng Feng X-Patchwork-Id: 11212041 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 09ED3139A for ; Fri, 25 Oct 2019 11:18:16 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id E53DC21E6F for ; Fri, 25 Oct 2019 11:18:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2439450AbfJYLSL (ORCPT ); Fri, 25 Oct 2019 07:18:11 -0400 Received: from youngberry.canonical.com ([91.189.89.112]:42533 "EHLO youngberry.canonical.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2439235AbfJYLSL (ORCPT ); Fri, 25 Oct 2019 07:18:11 -0400 Received: from 61-220-137-37.hinet-ip.hinet.net ([61.220.137.37] helo=localhost) by youngberry.canonical.com with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1iNxJV-0002cs-0I; Fri, 25 Oct 2019 10:59:25 +0000 From: Kai-Heng Feng To: davem@davemloft.net, oliver@neukum.org Cc: hayeswang@realtek.com, linux-usb@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Kai-Heng Feng Subject: [PATCH 1/2] r8152: Pass driver_info to REALTEK_USB_DEVICE() macro Date: Fri, 25 Oct 2019 18:59:18 +0800 Message-Id: <20191025105919.689-1-kai.heng.feng@canonical.com> X-Mailer: git-send-email 2.17.1 Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org REALTEK_USB_DEVICE() in current form doesn't take driver_info as its parameter. However, driver_info can be useful to add device specific information so let's adjust REALTEK_USB_DEVICE() macro to be able to do that. It'll be used by later patch. Signed-off-by: Kai-Heng Feng --- drivers/net/usb/r8152.c | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index d3c30ccc8577..1a987d4e45ab 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -6725,12 +6725,13 @@ static void rtl8152_disconnect(struct usb_interface *intf) } } -#define REALTEK_USB_DEVICE(vend, prod) \ +#define REALTEK_USB_DEVICE(vend, prod, info) \ .match_flags = USB_DEVICE_ID_MATCH_DEVICE | \ USB_DEVICE_ID_MATCH_INT_CLASS, \ .idVendor = (vend), \ .idProduct = (prod), \ - .bInterfaceClass = USB_CLASS_VENDOR_SPEC \ + .bInterfaceClass = USB_CLASS_VENDOR_SPEC, \ + .driver_info = (info) \ }, \ { \ .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | \ @@ -6739,25 +6740,26 @@ static void rtl8152_disconnect(struct usb_interface *intf) .idProduct = (prod), \ .bInterfaceClass = USB_CLASS_COMM, \ .bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET, \ - .bInterfaceProtocol = USB_CDC_PROTO_NONE + .bInterfaceProtocol = USB_CDC_PROTO_NONE, \ + .driver_info = (info) \ /* table of devices that work with this driver */ static const struct usb_device_id rtl8152_table[] = { - {REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8050)}, - {REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8152)}, - {REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8153)}, - {REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07ab)}, - {REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07c6)}, - {REALTEK_USB_DEVICE(VENDOR_ID_SAMSUNG, 0xa101)}, - {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x304f)}, - {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3062)}, - {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3069)}, - {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x7205)}, - {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x720c)}, - {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x7214)}, - {REALTEK_USB_DEVICE(VENDOR_ID_LINKSYS, 0x0041)}, - {REALTEK_USB_DEVICE(VENDOR_ID_NVIDIA, 0x09ff)}, - {REALTEK_USB_DEVICE(VENDOR_ID_TPLINK, 0x0601)}, + {REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8050, 0)}, + {REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8152, 0)}, + {REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8153, 0)}, + {REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07ab, 0)}, + {REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07c6, 0)}, + {REALTEK_USB_DEVICE(VENDOR_ID_SAMSUNG, 0xa101, 0)}, + {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x304f, 0)}, + {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3062, 0)}, + {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3069, 0)}, + {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x7205, 0)}, + {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x720c, 0)}, + {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x7214, 0)}, + {REALTEK_USB_DEVICE(VENDOR_ID_LINKSYS, 0x0041, 0)}, + {REALTEK_USB_DEVICE(VENDOR_ID_NVIDIA, 0x09ff, 0)}, + {REALTEK_USB_DEVICE(VENDOR_ID_TPLINK, 0x0601, 0)}, {} }; From patchwork Fri Oct 25 10:59:19 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kai-Heng Feng X-Patchwork-Id: 11212043 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E1789139A for ; Fri, 25 Oct 2019 11:18:18 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id BF8A42070B for ; Fri, 25 Oct 2019 11:18:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2439070AbfJYLSK (ORCPT ); Fri, 25 Oct 2019 07:18:10 -0400 Received: from youngberry.canonical.com ([91.189.89.112]:42533 "EHLO youngberry.canonical.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726564AbfJYLSJ (ORCPT ); Fri, 25 Oct 2019 07:18:09 -0400 Received: from 61-220-137-37.hinet-ip.hinet.net ([61.220.137.37] helo=localhost) by youngberry.canonical.com with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1iNxJY-0002cx-TZ; Fri, 25 Oct 2019 10:59:29 +0000 From: Kai-Heng Feng To: davem@davemloft.net, oliver@neukum.org Cc: hayeswang@realtek.com, linux-usb@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Kai-Heng Feng Subject: [PATCH 2/2] r8152: Add macpassthru support for ThinkPad Thunderbolt 3 Dock Gen 2 Date: Fri, 25 Oct 2019 18:59:19 +0800 Message-Id: <20191025105919.689-2-kai.heng.feng@canonical.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191025105919.689-1-kai.heng.feng@canonical.com> References: <20191025105919.689-1-kai.heng.feng@canonical.com> Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org ThinkPad Thunderbolt 3 Dock Gen 2 is another docking station that uses RTL8153 based USB ethernet. The device supports macpassthru, but it failed to pass the test of -AD, -BND and -BD. Simply bypass these tests since the device supports this feature just fine. Also the ACPI objects have some differences between Dell's and Lenovo's, so make those ACPI infos no longer hardcoded. BugLink: https://bugs.launchpad.net/bugs/1827961 Signed-off-by: Kai-Heng Feng --- drivers/net/usb/cdc_ether.c | 7 ++++ drivers/net/usb/r8152.c | 65 ++++++++++++++++++++++++++----------- 2 files changed, 53 insertions(+), 19 deletions(-) diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index 32f53de5b1fe..92751f6e792d 100644 --- a/drivers/net/usb/cdc_ether.c +++ b/drivers/net/usb/cdc_ether.c @@ -766,6 +766,13 @@ static const struct usb_device_id products[] = { .driver_info = 0, }, +/* ThinkPad Thunderbolt 3 Dock Gen 2 (based on Realtek RTL8153) */ +{ + USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x3082, USB_CLASS_COMM, + USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), + .driver_info = 0, +}, + /* Lenovo Thinkpad USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */ { USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x7205, USB_CLASS_COMM, diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 1a987d4e45ab..65bdb745860c 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -658,6 +658,8 @@ enum rtl_register_content { #define RTL8152_NAPI_WEIGHT 64 #define rx_reserved_size(x) ((x) + VLAN_ETH_HLEN + ETH_FCS_LEN + \ sizeof(struct rx_desc) + RX_ALIGN) +/* Device quirks */ +#define R8152_QUIRK_LENOVO_MACPASSTHRU BIT(1) /* rtl8152 flags */ enum rtl8152_flags { @@ -670,6 +672,7 @@ enum rtl8152_flags { SCHEDULE_TASKLET, GREEN_ETHERNET, DELL_TB_RX_AGG_BUG, + LENOVO_MACPASSTHRU, }; /* Define these values to match your device */ @@ -1408,38 +1411,57 @@ static int vendor_mac_passthru_addr_read(struct r8152 *tp, struct sockaddr *sa) int ret = -EINVAL; u32 ocp_data; unsigned char buf[6]; - - /* test for -AD variant of RTL8153 */ - ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_MISC_0); - if ((ocp_data & AD_MASK) == 0x1000) { - /* test for MAC address pass-through bit */ - ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, EFUSE); - if ((ocp_data & PASS_THRU_MASK) != 1) { - netif_dbg(tp, probe, tp->netdev, - "No efuse for RTL8153-AD MAC pass through\n"); - return -ENODEV; - } + bool bypass_test; + char *mac_obj_name; + acpi_object_type mac_obj_type; + int mac_strlen; + + if (test_bit(LENOVO_MACPASSTHRU, &tp->flags)) { + bypass_test = true; + mac_obj_name = "\\MACA"; + mac_obj_type = ACPI_TYPE_STRING; + mac_strlen = 0x16; } else { - /* test for RTL8153-BND and RTL8153-BD */ - ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_MISC_1); - if ((ocp_data & BND_MASK) == 0 && (ocp_data & BD_MASK) == 0) { - netif_dbg(tp, probe, tp->netdev, - "Invalid variant for MAC pass through\n"); - return -ENODEV; + bypass_test = false; + mac_obj_name = "\\_SB.AMAC"; + mac_obj_type = ACPI_TYPE_BUFFER; + mac_strlen = 0x17; + } + + if (!bypass_test) { + /* test for -AD variant of RTL8153 */ + ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_MISC_0); + if ((ocp_data & AD_MASK) == 0x1000) { + /* test for MAC address pass-through bit */ + ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, EFUSE); + if ((ocp_data & PASS_THRU_MASK) != 1) { + netif_dbg(tp, probe, tp->netdev, + "No efuse for RTL8153-AD MAC pass through\n"); + return -ENODEV; + } + } else { + /* test for RTL8153-BND and RTL8153-BD */ + ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_MISC_1); + if ((ocp_data & BND_MASK) == 0 && (ocp_data & BD_MASK) == 0) { + netif_dbg(tp, probe, tp->netdev, + "Invalid variant for MAC pass through\n"); + return -ENODEV; + } } } /* returns _AUXMAC_#AABBCCDDEEFF# */ - status = acpi_evaluate_object(NULL, "\\_SB.AMAC", NULL, &buffer); + status = acpi_evaluate_object(NULL, mac_obj_name, NULL, &buffer); obj = (union acpi_object *)buffer.pointer; if (!ACPI_SUCCESS(status)) return -ENODEV; - if (obj->type != ACPI_TYPE_BUFFER || obj->string.length != 0x17) { + if (obj->type != mac_obj_type || obj->string.length != mac_strlen) { netif_warn(tp, probe, tp->netdev, "Invalid buffer for pass-thru MAC addr: (%d, %d)\n", obj->type, obj->string.length); goto amacout; } + if (strncmp(obj->string.pointer, "_AUXMAC_#", 9) != 0 || strncmp(obj->string.pointer + 0x15, "#", 1) != 0) { netif_warn(tp, probe, tp->netdev, @@ -6626,6 +6648,9 @@ static int rtl8152_probe(struct usb_interface *intf, netdev->hw_features &= ~NETIF_F_RXCSUM; } + if (id->driver_info & R8152_QUIRK_LENOVO_MACPASSTHRU) + set_bit(LENOVO_MACPASSTHRU, &tp->flags); + if (le16_to_cpu(udev->descriptor.bcdDevice) == 0x3011 && udev->serial && (!strcmp(udev->serial, "000001000000") || !strcmp(udev->serial, "000002000000"))) { @@ -6754,6 +6779,8 @@ static const struct usb_device_id rtl8152_table[] = { {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x304f, 0)}, {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3062, 0)}, {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3069, 0)}, + {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3082, + R8152_QUIRK_LENOVO_MACPASSTHRU)}, {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x7205, 0)}, {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x720c, 0)}, {REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x7214, 0)},