2020-10-29 12:35:57

by Hayes Wang

[permalink] [raw]
Subject: [PATCH] net/usb/r8153_ecm: support ECM mode for RTL8153

Support ECM mode based on cdc_ether with relative mii functions,
when CONFIG_USB_RTL8152 is not set, or the device is not supported
by r8152 driver.

Signed-off-by: Hayes Wang <[email protected]>
---
drivers/net/usb/Makefile | 2 +-
drivers/net/usb/r8152.c | 5 +-
drivers/net/usb/r8153_ecm.c | 174 ++++++++++++++++++++++++++++++++++++
3 files changed, 178 insertions(+), 3 deletions(-)
create mode 100644 drivers/net/usb/r8153_ecm.c

diff --git a/drivers/net/usb/Makefile b/drivers/net/usb/Makefile
index 99fd12be2111..99381e6bea78 100644
--- a/drivers/net/usb/Makefile
+++ b/drivers/net/usb/Makefile
@@ -13,7 +13,7 @@ obj-$(CONFIG_USB_LAN78XX) += lan78xx.o
obj-$(CONFIG_USB_NET_AX8817X) += asix.o
asix-y := asix_devices.o asix_common.o ax88172a.o
obj-$(CONFIG_USB_NET_AX88179_178A) += ax88179_178a.o
-obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o
+obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o r8153_ecm.o
obj-$(CONFIG_USB_NET_CDC_EEM) += cdc_eem.o
obj-$(CONFIG_USB_NET_DM9601) += dm9601.o
obj-$(CONFIG_USB_NET_SR9700) += sr9700.o
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
index b1770489aca5..1b5d10f1de5f 100644
--- a/drivers/net/usb/r8152.c
+++ b/drivers/net/usb/r8152.c
@@ -6615,7 +6615,7 @@ static int rtl_fw_init(struct r8152 *tp)
return 0;
}

-static u8 rtl_get_version(struct usb_interface *intf)
+u8 rtl8152_get_version(struct usb_interface *intf)
{
struct usb_device *udev = interface_to_usbdev(intf);
u32 ocp_data = 0;
@@ -6673,12 +6673,13 @@ static u8 rtl_get_version(struct usb_interface *intf)

return version;
}
+EXPORT_SYMBOL_GPL(rtl8152_get_version);

static int rtl8152_probe(struct usb_interface *intf,
const struct usb_device_id *id)
{
struct usb_device *udev = interface_to_usbdev(intf);
- u8 version = rtl_get_version(intf);
+ u8 version = rtl8152_get_version(intf);
struct r8152 *tp;
struct net_device *netdev;
int ret;
diff --git a/drivers/net/usb/r8153_ecm.c b/drivers/net/usb/r8153_ecm.c
new file mode 100644
index 000000000000..723841525a6a
--- /dev/null
+++ b/drivers/net/usb/r8153_ecm.c
@@ -0,0 +1,174 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include <linux/module.h>
+#include <linux/netdevice.h>
+#include <linux/mii.h>
+#include <linux/usb.h>
+#include <linux/usb/cdc.h>
+#include <linux/usb/usbnet.h>
+
+#define RTL8153_CMD 0X05
+#define RTL8153_REQT_READ 0xc0
+#define RTL8153_REQT_WRITE 0x40
+
+#define MCU_TYPE_PLA 0x0100
+#define OCP_BASE 0xe86c
+
+#define BYTE_EN_WORD 0x33
+
+#define REALTEK_VENDOR_ID 0x0bda
+
+#if IS_REACHABLE(CONFIG_USB_RTL8152)
+extern u8 rtl8152_get_version(struct usb_interface *intf);
+#endif
+
+static int pla_read_word(struct usbnet *dev, u16 index)
+{
+ u16 byen = BYTE_EN_WORD;
+ u8 shift = index & 2;
+ __le32 tmp;
+ int ret;
+
+ if (shift)
+ byen <<= shift;
+
+ index &= ~3;
+
+ ret = usbnet_read_cmd(dev, RTL8153_CMD, RTL8153_REQT_READ, index,
+ MCU_TYPE_PLA | byen, &tmp, sizeof(tmp));
+ if (ret < 0)
+ goto out;
+
+ ret = __le32_to_cpu(tmp);
+ ret >>= (shift * 8);
+ ret &= 0xffff;
+
+out:
+ return ret;
+}
+
+static int pla_write_word(struct usbnet *dev, u16 index, u32 data)
+{
+ u32 mask = 0xffff;
+ u16 byen = BYTE_EN_WORD;
+ u8 shift = index & 2;
+ __le32 tmp;
+ int ret;
+
+ data &= mask;
+
+ if (shift) {
+ byen <<= shift;
+ mask <<= (shift * 8);
+ data <<= (shift * 8);
+ }
+
+ index &= ~3;
+
+ ret = usbnet_read_cmd(dev, RTL8153_CMD, RTL8153_REQT_READ, index,
+ MCU_TYPE_PLA | byen, &tmp, sizeof(tmp));
+
+ if (ret < 0)
+ goto out;
+
+ data |= __le32_to_cpu(tmp) & ~mask;
+ tmp = __cpu_to_le32(data);
+
+ ret = usbnet_write_cmd(dev, RTL8153_CMD, RTL8153_REQT_WRITE, index,
+ MCU_TYPE_PLA | byen, &tmp, sizeof(tmp));
+
+out:
+ return ret;
+}
+
+static int r8153_ecm_mdio_read(struct net_device *netdev, int phy_id, int reg)
+{
+ struct usbnet *dev = netdev_priv(netdev);
+ int ret;
+
+ ret = pla_write_word(dev, OCP_BASE, 0xa000);
+ if (ret < 0)
+ goto out;
+
+ ret = pla_read_word(dev, 0xb400 + reg * 2);
+
+out:
+ return ret;
+}
+
+static void r8153_ecm_mdio_write(struct net_device *netdev, int phy_id, int reg, int val)
+{
+ struct usbnet *dev = netdev_priv(netdev);
+ int ret;
+
+ ret = pla_write_word(dev, OCP_BASE, 0xa000);
+ if (ret < 0)
+ return;
+
+ ret = pla_write_word(dev, 0xb400 + reg * 2, val);
+}
+
+static int r8153_bind(struct usbnet *dev, struct usb_interface *intf)
+{
+ int status;
+
+ status = usbnet_cdc_bind(dev, intf);
+ if (status < 0)
+ return status;
+
+ dev->mii.dev = dev->net;
+ dev->mii.mdio_read = r8153_ecm_mdio_read;
+ dev->mii.mdio_write = r8153_ecm_mdio_write;
+ dev->mii.reg_num_mask = 0x1f;
+ dev->mii.supports_gmii = 1;
+
+ return status;
+}
+
+static const struct driver_info r8153_info = {
+ .description = "RTL8153 ECM Device",
+ .flags = FLAG_ETHER,
+ .bind = r8153_bind,
+ .unbind = usbnet_cdc_unbind,
+ .status = usbnet_cdc_status,
+ .manage_power = usbnet_manage_power,
+};
+
+static const struct usb_device_id products[] = {
+{
+ USB_DEVICE_AND_INTERFACE_INFO(REALTEK_VENDOR_ID, 0x8153, USB_CLASS_COMM,
+ USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
+ .driver_info = (unsigned long)&r8153_info,
+},
+
+ { }, /* END */
+};
+MODULE_DEVICE_TABLE(usb, products);
+
+static int rtl8153_ecm_probe(struct usb_interface *intf,
+ const struct usb_device_id *id)
+{
+#if IS_REACHABLE(CONFIG_USB_RTL8152)
+ if (rtl8152_get_version(intf))
+ return -ENODEV;
+#endif
+
+ return usbnet_probe(intf, id);
+}
+
+static struct usb_driver r8153_ecm_driver = {
+ .name = "r8153_ecm",
+ .id_table = products,
+ .probe = rtl8153_ecm_probe,
+ .disconnect = usbnet_disconnect,
+ .suspend = usbnet_suspend,
+ .resume = usbnet_resume,
+ .reset_resume = usbnet_resume,
+ .supports_autosuspend = 1,
+ .disable_hub_initiated_lpm = 1,
+};
+
+module_usb_driver(r8153_ecm_driver);
+
+MODULE_AUTHOR("Hayes Wang");
+MODULE_DESCRIPTION("Realtek USB ECM device");
+MODULE_LICENSE("GPL");
--
2.26.2


2020-10-29 15:07:28

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH] net/usb/r8153_ecm: support ECM mode for RTL8153

Hi Hayes,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on net/master]
[also build test WARNING on net-next/master ipvs/master linus/master v5.10-rc1 next-20201029]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url: https://github.com/0day-ci/linux/commits/Hayes-Wang/net-usb-r8153_ecm-support-ECM-mode-for-RTL8153/20201029-203440
base: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git d6535dca28859d8d9ef80894eb287b2ac35a32e8
config: xtensa-allyesconfig (attached as .config)
compiler: xtensa-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/e34498795de95fbccb0f2feee72cd8df723f9fd3
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Hayes-Wang/net-usb-r8153_ecm-support-ECM-mode-for-RTL8153/20201029-203440
git checkout e34498795de95fbccb0f2feee72cd8df723f9fd3
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=xtensa

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>

All warnings (new ones prefixed by >>):

>> drivers/net/usb/r8152.c:6618:4: warning: no previous prototype for 'rtl8152_get_version' [-Wmissing-prototypes]
6618 | u8 rtl8152_get_version(struct usb_interface *intf)
| ^~~~~~~~~~~~~~~~~~~

vim +/rtl8152_get_version +6618 drivers/net/usb/r8152.c

6617
> 6618 u8 rtl8152_get_version(struct usb_interface *intf)
6619 {
6620 struct usb_device *udev = interface_to_usbdev(intf);
6621 u32 ocp_data = 0;
6622 __le32 *tmp;
6623 u8 version;
6624 int ret;
6625
6626 tmp = kmalloc(sizeof(*tmp), GFP_KERNEL);
6627 if (!tmp)
6628 return 0;
6629
6630 ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
6631 RTL8152_REQ_GET_REGS, RTL8152_REQT_READ,
6632 PLA_TCR0, MCU_TYPE_PLA, tmp, sizeof(*tmp), 500);
6633 if (ret > 0)
6634 ocp_data = (__le32_to_cpu(*tmp) >> 16) & VERSION_MASK;
6635
6636 kfree(tmp);
6637
6638 switch (ocp_data) {
6639 case 0x4c00:
6640 version = RTL_VER_01;
6641 break;
6642 case 0x4c10:
6643 version = RTL_VER_02;
6644 break;
6645 case 0x5c00:
6646 version = RTL_VER_03;
6647 break;
6648 case 0x5c10:
6649 version = RTL_VER_04;
6650 break;
6651 case 0x5c20:
6652 version = RTL_VER_05;
6653 break;
6654 case 0x5c30:
6655 version = RTL_VER_06;
6656 break;
6657 case 0x4800:
6658 version = RTL_VER_07;
6659 break;
6660 case 0x6000:
6661 version = RTL_VER_08;
6662 break;
6663 case 0x6010:
6664 version = RTL_VER_09;
6665 break;
6666 default:
6667 version = RTL_VER_UNKNOWN;
6668 dev_info(&intf->dev, "Unknown version 0x%04x\n", ocp_data);
6669 break;
6670 }
6671
6672 dev_dbg(&intf->dev, "Detected version 0x%04x\n", version);
6673
6674 return version;
6675 }
6676 EXPORT_SYMBOL_GPL(rtl8152_get_version);
6677

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]


Attachments:
(No filename) (3.50 kB)
.config.gz (64.52 kB)
Download all attachments

2020-10-30 03:27:26

by Hayes Wang

[permalink] [raw]
Subject: [PATCH net-next v2] net/usb/r8153_ecm: support ECM mode for RTL8153

Support ECM mode based on cdc_ether with relative mii functions,
when CONFIG_USB_RTL8152 is not set, or the device is not supported
by r8152 driver.

Signed-off-by: Hayes Wang <[email protected]>
---
v2:
Add include/linux/usb/r8152.h to avoid the warning about
no previous prototype for rtl8152_get_version.

drivers/net/usb/Makefile | 2 +-
drivers/net/usb/r8152.c | 30 +------
drivers/net/usb/r8153_ecm.c | 162 ++++++++++++++++++++++++++++++++++++
include/linux/usb/r8152.h | 37 ++++++++
4 files changed, 204 insertions(+), 27 deletions(-)
create mode 100644 drivers/net/usb/r8153_ecm.c
create mode 100644 include/linux/usb/r8152.h

diff --git a/drivers/net/usb/Makefile b/drivers/net/usb/Makefile
index 99fd12be2111..99381e6bea78 100644
--- a/drivers/net/usb/Makefile
+++ b/drivers/net/usb/Makefile
@@ -13,7 +13,7 @@ obj-$(CONFIG_USB_LAN78XX) += lan78xx.o
obj-$(CONFIG_USB_NET_AX8817X) += asix.o
asix-y := asix_devices.o asix_common.o ax88172a.o
obj-$(CONFIG_USB_NET_AX88179_178A) += ax88179_178a.o
-obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o
+obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o r8153_ecm.o
obj-$(CONFIG_USB_NET_CDC_EEM) += cdc_eem.o
obj-$(CONFIG_USB_NET_DM9601) += dm9601.o
obj-$(CONFIG_USB_NET_SR9700) += sr9700.o
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
index b1770489aca5..7d2523d96c51 100644
--- a/drivers/net/usb/r8152.c
+++ b/drivers/net/usb/r8152.c
@@ -26,6 +26,7 @@
#include <linux/acpi.h>
#include <linux/firmware.h>
#include <crypto/hash.h>
+#include <linux/usb/r8152.h>

/* Information for net-next */
#define NETNEXT_VERSION "11"
@@ -653,18 +654,6 @@ enum rtl_register_content {

#define INTR_LINK 0x0004

-#define RTL8152_REQT_READ 0xc0
-#define RTL8152_REQT_WRITE 0x40
-#define RTL8152_REQ_GET_REGS 0x05
-#define RTL8152_REQ_SET_REGS 0x05
-
-#define BYTE_EN_DWORD 0xff
-#define BYTE_EN_WORD 0x33
-#define BYTE_EN_BYTE 0x11
-#define BYTE_EN_SIX_BYTES 0x3f
-#define BYTE_EN_START_MASK 0x0f
-#define BYTE_EN_END_MASK 0xf0
-
#define RTL8153_MAX_PACKET 9216 /* 9K */
#define RTL8153_MAX_MTU (RTL8153_MAX_PACKET - VLAN_ETH_HLEN - \
ETH_FCS_LEN)
@@ -689,21 +678,9 @@ enum rtl8152_flags {
LENOVO_MACPASSTHRU,
};

-/* Define these values to match your device */
-#define VENDOR_ID_REALTEK 0x0bda
-#define VENDOR_ID_MICROSOFT 0x045e
-#define VENDOR_ID_SAMSUNG 0x04e8
-#define VENDOR_ID_LENOVO 0x17ef
-#define VENDOR_ID_LINKSYS 0x13b1
-#define VENDOR_ID_NVIDIA 0x0955
-#define VENDOR_ID_TPLINK 0x2357
-
#define DEVICE_ID_THINKPAD_THUNDERBOLT3_DOCK_GEN2 0x3082
#define DEVICE_ID_THINKPAD_USB_C_DOCK_GEN2 0xa387

-#define MCU_TYPE_PLA 0x0100
-#define MCU_TYPE_USB 0x0000
-
struct tally_counter {
__le64 tx_packets;
__le64 rx_packets;
@@ -6615,7 +6592,7 @@ static int rtl_fw_init(struct r8152 *tp)
return 0;
}

-static u8 rtl_get_version(struct usb_interface *intf)
+u8 rtl8152_get_version(struct usb_interface *intf)
{
struct usb_device *udev = interface_to_usbdev(intf);
u32 ocp_data = 0;
@@ -6673,12 +6650,13 @@ static u8 rtl_get_version(struct usb_interface *intf)

return version;
}
+EXPORT_SYMBOL_GPL(rtl8152_get_version);

static int rtl8152_probe(struct usb_interface *intf,
const struct usb_device_id *id)
{
struct usb_device *udev = interface_to_usbdev(intf);
- u8 version = rtl_get_version(intf);
+ u8 version = rtl8152_get_version(intf);
struct r8152 *tp;
struct net_device *netdev;
int ret;
diff --git a/drivers/net/usb/r8153_ecm.c b/drivers/net/usb/r8153_ecm.c
new file mode 100644
index 000000000000..2c3fabd38b16
--- /dev/null
+++ b/drivers/net/usb/r8153_ecm.c
@@ -0,0 +1,162 @@
+// SPDX-License-Identifier: GPL-2.0-only
+#include <linux/module.h>
+#include <linux/netdevice.h>
+#include <linux/mii.h>
+#include <linux/usb.h>
+#include <linux/usb/cdc.h>
+#include <linux/usb/usbnet.h>
+#include <linux/usb/r8152.h>
+
+#define OCP_BASE 0xe86c
+
+static int pla_read_word(struct usbnet *dev, u16 index)
+{
+ u16 byen = BYTE_EN_WORD;
+ u8 shift = index & 2;
+ __le32 tmp;
+ int ret;
+
+ if (shift)
+ byen <<= shift;
+
+ index &= ~3;
+
+ ret = usbnet_read_cmd(dev, RTL8152_REQ_GET_REGS, RTL8152_REQT_READ, index,
+ MCU_TYPE_PLA | byen, &tmp, sizeof(tmp));
+ if (ret < 0)
+ goto out;
+
+ ret = __le32_to_cpu(tmp);
+ ret >>= (shift * 8);
+ ret &= 0xffff;
+
+out:
+ return ret;
+}
+
+static int pla_write_word(struct usbnet *dev, u16 index, u32 data)
+{
+ u32 mask = 0xffff;
+ u16 byen = BYTE_EN_WORD;
+ u8 shift = index & 2;
+ __le32 tmp;
+ int ret;
+
+ data &= mask;
+
+ if (shift) {
+ byen <<= shift;
+ mask <<= (shift * 8);
+ data <<= (shift * 8);
+ }
+
+ index &= ~3;
+
+ ret = usbnet_read_cmd(dev, RTL8152_REQ_GET_REGS, RTL8152_REQT_READ, index,
+ MCU_TYPE_PLA | byen, &tmp, sizeof(tmp));
+
+ if (ret < 0)
+ goto out;
+
+ data |= __le32_to_cpu(tmp) & ~mask;
+ tmp = __cpu_to_le32(data);
+
+ ret = usbnet_write_cmd(dev, RTL8152_REQ_SET_REGS, RTL8152_REQT_WRITE, index,
+ MCU_TYPE_PLA | byen, &tmp, sizeof(tmp));
+
+out:
+ return ret;
+}
+
+static int r8153_ecm_mdio_read(struct net_device *netdev, int phy_id, int reg)
+{
+ struct usbnet *dev = netdev_priv(netdev);
+ int ret;
+
+ ret = pla_write_word(dev, OCP_BASE, 0xa000);
+ if (ret < 0)
+ goto out;
+
+ ret = pla_read_word(dev, 0xb400 + reg * 2);
+
+out:
+ return ret;
+}
+
+static void r8153_ecm_mdio_write(struct net_device *netdev, int phy_id, int reg, int val)
+{
+ struct usbnet *dev = netdev_priv(netdev);
+ int ret;
+
+ ret = pla_write_word(dev, OCP_BASE, 0xa000);
+ if (ret < 0)
+ return;
+
+ ret = pla_write_word(dev, 0xb400 + reg * 2, val);
+}
+
+static int r8153_bind(struct usbnet *dev, struct usb_interface *intf)
+{
+ int status;
+
+ status = usbnet_cdc_bind(dev, intf);
+ if (status < 0)
+ return status;
+
+ dev->mii.dev = dev->net;
+ dev->mii.mdio_read = r8153_ecm_mdio_read;
+ dev->mii.mdio_write = r8153_ecm_mdio_write;
+ dev->mii.reg_num_mask = 0x1f;
+ dev->mii.supports_gmii = 1;
+
+ return status;
+}
+
+static const struct driver_info r8153_info = {
+ .description = "RTL8153 ECM Device",
+ .flags = FLAG_ETHER,
+ .bind = r8153_bind,
+ .unbind = usbnet_cdc_unbind,
+ .status = usbnet_cdc_status,
+ .manage_power = usbnet_manage_power,
+};
+
+static const struct usb_device_id products[] = {
+{
+ USB_DEVICE_AND_INTERFACE_INFO(VENDOR_ID_REALTEK, 0x8153, USB_CLASS_COMM,
+ USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
+ .driver_info = (unsigned long)&r8153_info,
+},
+
+ { }, /* END */
+};
+MODULE_DEVICE_TABLE(usb, products);
+
+static int rtl8153_ecm_probe(struct usb_interface *intf,
+ const struct usb_device_id *id)
+{
+#if IS_REACHABLE(CONFIG_USB_RTL8152)
+ if (rtl8152_get_version(intf))
+ return -ENODEV;
+#endif
+
+ return usbnet_probe(intf, id);
+}
+
+static struct usb_driver r8153_ecm_driver = {
+ .name = "r8153_ecm",
+ .id_table = products,
+ .probe = rtl8153_ecm_probe,
+ .disconnect = usbnet_disconnect,
+ .suspend = usbnet_suspend,
+ .resume = usbnet_resume,
+ .reset_resume = usbnet_resume,
+ .supports_autosuspend = 1,
+ .disable_hub_initiated_lpm = 1,
+};
+
+module_usb_driver(r8153_ecm_driver);
+
+MODULE_AUTHOR("Hayes Wang");
+MODULE_DESCRIPTION("Realtek USB ECM device");
+MODULE_LICENSE("GPL");
diff --git a/include/linux/usb/r8152.h b/include/linux/usb/r8152.h
new file mode 100644
index 000000000000..20d88b1defc3
--- /dev/null
+++ b/include/linux/usb/r8152.h
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (c) 2020 Realtek Semiconductor Corp. All rights reserved.
+ */
+
+#ifndef __LINUX_R8152_H
+#define __LINUX_R8152_H
+
+#define RTL8152_REQT_READ 0xc0
+#define RTL8152_REQT_WRITE 0x40
+#define RTL8152_REQ_GET_REGS 0x05
+#define RTL8152_REQ_SET_REGS 0x05
+
+#define BYTE_EN_DWORD 0xff
+#define BYTE_EN_WORD 0x33
+#define BYTE_EN_BYTE 0x11
+#define BYTE_EN_SIX_BYTES 0x3f
+#define BYTE_EN_START_MASK 0x0f
+#define BYTE_EN_END_MASK 0xf0
+
+#define MCU_TYPE_PLA 0x0100
+#define MCU_TYPE_USB 0x0000
+
+/* Define these values to match your device */
+#define VENDOR_ID_REALTEK 0x0bda
+#define VENDOR_ID_MICROSOFT 0x045e
+#define VENDOR_ID_SAMSUNG 0x04e8
+#define VENDOR_ID_LENOVO 0x17ef
+#define VENDOR_ID_LINKSYS 0x13b1
+#define VENDOR_ID_NVIDIA 0x0955
+#define VENDOR_ID_TPLINK 0x2357
+
+#if IS_REACHABLE(CONFIG_USB_RTL8152)
+extern u8 rtl8152_get_version(struct usb_interface *intf);
+#endif
+
+#endif /* __LINUX_R8152_H */
--
2.26.2

2020-10-31 23:14:45

by Jakub Kicinski

[permalink] [raw]
Subject: Re: [PATCH net-next v2] net/usb/r8153_ecm: support ECM mode for RTL8153

On Fri, 30 Oct 2020 11:23:08 +0800 Hayes Wang wrote:
> Support ECM mode based on cdc_ether with relative mii functions,
> when CONFIG_USB_RTL8152 is not set, or the device is not supported
> by r8152 driver.
>
> Signed-off-by: Hayes Wang <[email protected]>

Can you describe the use case in more detail?

AFAICT r8152 defines a match for the exact same device.
Does it not mean that which driver is used will be somewhat random
if both are built?

> +/* Define these values to match your device */
> +#define VENDOR_ID_REALTEK 0x0bda
> +#define VENDOR_ID_MICROSOFT 0x045e
> +#define VENDOR_ID_SAMSUNG 0x04e8
> +#define VENDOR_ID_LENOVO 0x17ef
> +#define VENDOR_ID_LINKSYS 0x13b1
> +#define VENDOR_ID_NVIDIA 0x0955
> +#define VENDOR_ID_TPLINK 0x2357

$ git grep 0x2357 | grep -i tplink
drivers/net/usb/cdc_ether.c:#define TPLINK_VENDOR_ID 0x2357
drivers/net/usb/r8152.c:#define VENDOR_ID_TPLINK 0x2357
drivers/usb/serial/option.c:#define TPLINK_VENDOR_ID 0x2357

$ git grep 0x17ef | grep -i lenovo
drivers/hid/hid-ids.h:#define USB_VENDOR_ID_LENOVO 0x17ef
drivers/hid/wacom.h:#define USB_VENDOR_ID_LENOVO 0x17ef
drivers/net/usb/cdc_ether.c:#define LENOVO_VENDOR_ID 0x17ef
drivers/net/usb/r8152.c:#define VENDOR_ID_LENOVO 0x17ef

Time to consolidate those vendor id defines perhaps?

2020-11-02 07:23:56

by Hayes Wang

[permalink] [raw]
Subject: RE: [PATCH net-next v2] net/usb/r8153_ecm: support ECM mode for RTL8153

Jakub Kicinski <[email protected]>
[...]
> Can you describe the use case in more detail?
>
> AFAICT r8152 defines a match for the exact same device.
> Does it not mean that which driver is used will be somewhat random
> if both are built?

I export rtl_get_version() from r8152. It would return none zero
value if r8152 could support this device. Both r8152 and r8153_ecm
would check the return value of rtl_get_version() in porbe().
Therefore, if rtl_get_version() return none zero value, the r8152
is used for the device with vendor mode. Otherwise, the r8153_ecm
is used for the device with ECM mode.

> > +/* Define these values to match your device */
> > +#define VENDOR_ID_REALTEK 0x0bda
> > +#define VENDOR_ID_MICROSOFT 0x045e
> > +#define VENDOR_ID_SAMSUNG 0x04e8
> > +#define VENDOR_ID_LENOVO 0x17ef
> > +#define VENDOR_ID_LINKSYS 0x13b1
> > +#define VENDOR_ID_NVIDIA 0x0955
> > +#define VENDOR_ID_TPLINK 0x2357
>
> $ git grep 0x2357 | grep -i tplink
> drivers/net/usb/cdc_ether.c:#define TPLINK_VENDOR_ID 0x2357
> drivers/net/usb/r8152.c:#define VENDOR_ID_TPLINK 0x2357
> drivers/usb/serial/option.c:#define TPLINK_VENDOR_ID 0x2357
>
> $ git grep 0x17ef | grep -i lenovo
> drivers/hid/hid-ids.h:#define USB_VENDOR_ID_LENOVO 0x17ef
> drivers/hid/wacom.h:#define USB_VENDOR_ID_LENOVO 0x17ef
> drivers/net/usb/cdc_ether.c:#define LENOVO_VENDOR_ID 0x17ef
> drivers/net/usb/r8152.c:#define VENDOR_ID_LENOVO 0x17ef
>
> Time to consolidate those vendor id defines perhaps?

It seems that there is no such header file which I could include
or add the new vendor IDs.

Best Regards,
Hayes



2020-11-02 19:50:46

by Jakub Kicinski

[permalink] [raw]
Subject: Re: [PATCH net-next v2] net/usb/r8153_ecm: support ECM mode for RTL8153

On Mon, 2 Nov 2020 07:20:15 +0000 Hayes Wang wrote:
> Jakub Kicinski <[email protected]>
> > Can you describe the use case in more detail?
> >
> > AFAICT r8152 defines a match for the exact same device.
> > Does it not mean that which driver is used will be somewhat random
> > if both are built?
>
> I export rtl_get_version() from r8152. It would return none zero
> value if r8152 could support this device. Both r8152 and r8153_ecm
> would check the return value of rtl_get_version() in porbe().
> Therefore, if rtl_get_version() return none zero value, the r8152
> is used for the device with vendor mode. Otherwise, the r8153_ecm
> is used for the device with ECM mode.

Oh, I see, I missed that the rtl_get_version() checking is the inverse
of r8152.

> > > +/* Define these values to match your device */
> > > +#define VENDOR_ID_REALTEK 0x0bda
> > > +#define VENDOR_ID_MICROSOFT 0x045e
> > > +#define VENDOR_ID_SAMSUNG 0x04e8
> > > +#define VENDOR_ID_LENOVO 0x17ef
> > > +#define VENDOR_ID_LINKSYS 0x13b1
> > > +#define VENDOR_ID_NVIDIA 0x0955
> > > +#define VENDOR_ID_TPLINK 0x2357
> >
> > $ git grep 0x2357 | grep -i tplink
> > drivers/net/usb/cdc_ether.c:#define TPLINK_VENDOR_ID 0x2357
> > drivers/net/usb/r8152.c:#define VENDOR_ID_TPLINK 0x2357
> > drivers/usb/serial/option.c:#define TPLINK_VENDOR_ID 0x2357
> >
> > $ git grep 0x17ef | grep -i lenovo
> > drivers/hid/hid-ids.h:#define USB_VENDOR_ID_LENOVO 0x17ef
> > drivers/hid/wacom.h:#define USB_VENDOR_ID_LENOVO 0x17ef
> > drivers/net/usb/cdc_ether.c:#define LENOVO_VENDOR_ID 0x17ef
> > drivers/net/usb/r8152.c:#define VENDOR_ID_LENOVO 0x17ef
> >
> > Time to consolidate those vendor id defines perhaps?
>
> It seems that there is no such header file which I could include
> or add the new vendor IDs.

Please create one. (Adding Greg KH to the recipients, in case there is
a reason that USB subsystem doesn't have a common vendor id header.)

Also please make sure to add Oliver to the CC for v3, to make sure the
reuse of CDC_ETHER is okay.

2020-11-03 09:34:27

by Greg Kroah-Hartman

[permalink] [raw]
Subject: Re: [PATCH net-next v2] net/usb/r8153_ecm: support ECM mode for RTL8153

On Mon, Nov 02, 2020 at 11:47:18AM -0800, Jakub Kicinski wrote:
> On Mon, 2 Nov 2020 07:20:15 +0000 Hayes Wang wrote:
> > Jakub Kicinski <[email protected]>
> > > Can you describe the use case in more detail?
> > >
> > > AFAICT r8152 defines a match for the exact same device.
> > > Does it not mean that which driver is used will be somewhat random
> > > if both are built?
> >
> > I export rtl_get_version() from r8152. It would return none zero
> > value if r8152 could support this device. Both r8152 and r8153_ecm
> > would check the return value of rtl_get_version() in porbe().
> > Therefore, if rtl_get_version() return none zero value, the r8152
> > is used for the device with vendor mode. Otherwise, the r8153_ecm
> > is used for the device with ECM mode.
>
> Oh, I see, I missed that the rtl_get_version() checking is the inverse
> of r8152.
>
> > > > +/* Define these values to match your device */
> > > > +#define VENDOR_ID_REALTEK 0x0bda
> > > > +#define VENDOR_ID_MICROSOFT 0x045e
> > > > +#define VENDOR_ID_SAMSUNG 0x04e8
> > > > +#define VENDOR_ID_LENOVO 0x17ef
> > > > +#define VENDOR_ID_LINKSYS 0x13b1
> > > > +#define VENDOR_ID_NVIDIA 0x0955
> > > > +#define VENDOR_ID_TPLINK 0x2357
> > >
> > > $ git grep 0x2357 | grep -i tplink
> > > drivers/net/usb/cdc_ether.c:#define TPLINK_VENDOR_ID 0x2357
> > > drivers/net/usb/r8152.c:#define VENDOR_ID_TPLINK 0x2357
> > > drivers/usb/serial/option.c:#define TPLINK_VENDOR_ID 0x2357
> > >
> > > $ git grep 0x17ef | grep -i lenovo
> > > drivers/hid/hid-ids.h:#define USB_VENDOR_ID_LENOVO 0x17ef
> > > drivers/hid/wacom.h:#define USB_VENDOR_ID_LENOVO 0x17ef
> > > drivers/net/usb/cdc_ether.c:#define LENOVO_VENDOR_ID 0x17ef
> > > drivers/net/usb/r8152.c:#define VENDOR_ID_LENOVO 0x17ef
> > >
> > > Time to consolidate those vendor id defines perhaps?
> >
> > It seems that there is no such header file which I could include
> > or add the new vendor IDs.
>
> Please create one. (Adding Greg KH to the recipients, in case there is
> a reason that USB subsystem doesn't have a common vendor id header.)

There is a reason, it's a nightmare to maintain and handle merges for,
just don't do it.

Read the comments at the top of the pci_ids.h file if you are curious
why we don't even do this for PCI device ids anymore for the past 10+
years.

So no, please do not create such a common file, it is not needed or a
good idea.

thanks,

greg k-h

2020-11-03 09:49:14

by Hayes Wang

[permalink] [raw]
Subject: [PATCH net-next v3 0/2] drivers/net/usb: support ECM mode for RTL8153

v3:
Move original patch to #2. And add a new patch #1 to consolidate vendor ID
of USB devices.

v2:
Add include/linux/usb/r8152.h to avoid the warning about
no previous prototype for rtl8152_get_version.

Hayes Wang (2):
include/linux/usb: new header file for the vendor ID of USB devices
net/usb/r8153_ecm: support ECM mode for RTL8153

drivers/net/usb/Makefile | 2 +-
drivers/net/usb/cdc_ether.c | 93 +++++++----------
drivers/net/usb/r8152.c | 68 +++++--------
drivers/net/usb/r8153_ecm.c | 162 ++++++++++++++++++++++++++++++
include/linux/usb/r8152.h | 30 ++++++
include/linux/usb/usb_vendor_id.h | 51 ++++++++++
6 files changed, 306 insertions(+), 100 deletions(-)
create mode 100644 drivers/net/usb/r8153_ecm.c
create mode 100644 include/linux/usb/r8152.h
create mode 100644 include/linux/usb/usb_vendor_id.h

--
2.26.2

2020-11-03 09:49:29

by Hayes Wang

[permalink] [raw]
Subject: [PATCH net-next v3 2/2] net/usb/r8153_ecm: support ECM mode for RTL8153

Support ECM mode based on cdc_ether with relative mii
functions, when CONFIG_USB_RTL8152 is not set, or the
device is not supported by r8152 driver.

Both r8152 and r8153_ecm would check the return value of
rtl8152_get_version() in porbe(). If rtl8152_get_version()
return none zero value, the r8152 is used for the device
with vendor mode. Otherwise, the r8153_ecm is used for the
device with ECM mode.

Signed-off-by: Hayes Wang <[email protected]>
---
drivers/net/usb/Makefile | 2 +-
drivers/net/usb/r8152.c | 22 +----
drivers/net/usb/r8153_ecm.c | 162 ++++++++++++++++++++++++++++++++++++
include/linux/usb/r8152.h | 30 +++++++
4 files changed, 197 insertions(+), 19 deletions(-)
create mode 100644 drivers/net/usb/r8153_ecm.c
create mode 100644 include/linux/usb/r8152.h

diff --git a/drivers/net/usb/Makefile b/drivers/net/usb/Makefile
index 99fd12be2111..99381e6bea78 100644
--- a/drivers/net/usb/Makefile
+++ b/drivers/net/usb/Makefile
@@ -13,7 +13,7 @@ obj-$(CONFIG_USB_LAN78XX) += lan78xx.o
obj-$(CONFIG_USB_NET_AX8817X) += asix.o
asix-y := asix_devices.o asix_common.o ax88172a.o
obj-$(CONFIG_USB_NET_AX88179_178A) += ax88179_178a.o
-obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o
+obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o r8153_ecm.o
obj-$(CONFIG_USB_NET_CDC_EEM) += cdc_eem.o
obj-$(CONFIG_USB_NET_DM9601) += dm9601.o
obj-$(CONFIG_USB_NET_SR9700) += sr9700.o
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
index d8ae89aa470c..41b803729996 100644
--- a/drivers/net/usb/r8152.c
+++ b/drivers/net/usb/r8152.c
@@ -26,7 +26,7 @@
#include <linux/acpi.h>
#include <linux/firmware.h>
#include <crypto/hash.h>
-#include <linux/usb/usb_vendor_id.h>
+#include <linux/usb/r8152.h>

/* Information for net-next */
#define NETNEXT_VERSION "11"
@@ -654,18 +654,6 @@ enum rtl_register_content {

#define INTR_LINK 0x0004

-#define RTL8152_REQT_READ 0xc0
-#define RTL8152_REQT_WRITE 0x40
-#define RTL8152_REQ_GET_REGS 0x05
-#define RTL8152_REQ_SET_REGS 0x05
-
-#define BYTE_EN_DWORD 0xff
-#define BYTE_EN_WORD 0x33
-#define BYTE_EN_BYTE 0x11
-#define BYTE_EN_SIX_BYTES 0x3f
-#define BYTE_EN_START_MASK 0x0f
-#define BYTE_EN_END_MASK 0xf0
-
#define RTL8153_MAX_PACKET 9216 /* 9K */
#define RTL8153_MAX_MTU (RTL8153_MAX_PACKET - VLAN_ETH_HLEN - \
ETH_FCS_LEN)
@@ -693,9 +681,6 @@ enum rtl8152_flags {
#define DEVICE_ID_THINKPAD_THUNDERBOLT3_DOCK_GEN2 0x3082
#define DEVICE_ID_THINKPAD_USB_C_DOCK_GEN2 0xa387

-#define MCU_TYPE_PLA 0x0100
-#define MCU_TYPE_USB 0x0000
-
struct tally_counter {
__le64 tx_packets;
__le64 rx_packets;
@@ -6607,7 +6592,7 @@ static int rtl_fw_init(struct r8152 *tp)
return 0;
}

-static u8 rtl_get_version(struct usb_interface *intf)
+u8 rtl8152_get_version(struct usb_interface *intf)
{
struct usb_device *udev = interface_to_usbdev(intf);
u32 ocp_data = 0;
@@ -6665,12 +6650,13 @@ static u8 rtl_get_version(struct usb_interface *intf)

return version;
}
+EXPORT_SYMBOL_GPL(rtl8152_get_version);

static int rtl8152_probe(struct usb_interface *intf,
const struct usb_device_id *id)
{
struct usb_device *udev = interface_to_usbdev(intf);
- u8 version = rtl_get_version(intf);
+ u8 version = rtl8152_get_version(intf);
struct r8152 *tp;
struct net_device *netdev;
int ret;
diff --git a/drivers/net/usb/r8153_ecm.c b/drivers/net/usb/r8153_ecm.c
new file mode 100644
index 000000000000..13eba7a72633
--- /dev/null
+++ b/drivers/net/usb/r8153_ecm.c
@@ -0,0 +1,162 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include <linux/module.h>
+#include <linux/netdevice.h>
+#include <linux/mii.h>
+#include <linux/usb.h>
+#include <linux/usb/cdc.h>
+#include <linux/usb/usbnet.h>
+#include <linux/usb/r8152.h>
+
+#define OCP_BASE 0xe86c
+
+static int pla_read_word(struct usbnet *dev, u16 index)
+{
+ u16 byen = BYTE_EN_WORD;
+ u8 shift = index & 2;
+ __le32 tmp;
+ int ret;
+
+ if (shift)
+ byen <<= shift;
+
+ index &= ~3;
+
+ ret = usbnet_read_cmd(dev, RTL8152_REQ_GET_REGS, RTL8152_REQT_READ, index,
+ MCU_TYPE_PLA | byen, &tmp, sizeof(tmp));
+ if (ret < 0)
+ goto out;
+
+ ret = __le32_to_cpu(tmp);
+ ret >>= (shift * 8);
+ ret &= 0xffff;
+
+out:
+ return ret;
+}
+
+static int pla_write_word(struct usbnet *dev, u16 index, u32 data)
+{
+ u32 mask = 0xffff;
+ u16 byen = BYTE_EN_WORD;
+ u8 shift = index & 2;
+ __le32 tmp;
+ int ret;
+
+ data &= mask;
+
+ if (shift) {
+ byen <<= shift;
+ mask <<= (shift * 8);
+ data <<= (shift * 8);
+ }
+
+ index &= ~3;
+
+ ret = usbnet_read_cmd(dev, RTL8152_REQ_GET_REGS, RTL8152_REQT_READ, index,
+ MCU_TYPE_PLA | byen, &tmp, sizeof(tmp));
+
+ if (ret < 0)
+ goto out;
+
+ data |= __le32_to_cpu(tmp) & ~mask;
+ tmp = __cpu_to_le32(data);
+
+ ret = usbnet_write_cmd(dev, RTL8152_REQ_SET_REGS, RTL8152_REQT_WRITE, index,
+ MCU_TYPE_PLA | byen, &tmp, sizeof(tmp));
+
+out:
+ return ret;
+}
+
+static int r8153_ecm_mdio_read(struct net_device *netdev, int phy_id, int reg)
+{
+ struct usbnet *dev = netdev_priv(netdev);
+ int ret;
+
+ ret = pla_write_word(dev, OCP_BASE, 0xa000);
+ if (ret < 0)
+ goto out;
+
+ ret = pla_read_word(dev, 0xb400 + reg * 2);
+
+out:
+ return ret;
+}
+
+static void r8153_ecm_mdio_write(struct net_device *netdev, int phy_id, int reg, int val)
+{
+ struct usbnet *dev = netdev_priv(netdev);
+ int ret;
+
+ ret = pla_write_word(dev, OCP_BASE, 0xa000);
+ if (ret < 0)
+ return;
+
+ ret = pla_write_word(dev, 0xb400 + reg * 2, val);
+}
+
+static int r8153_bind(struct usbnet *dev, struct usb_interface *intf)
+{
+ int status;
+
+ status = usbnet_cdc_bind(dev, intf);
+ if (status < 0)
+ return status;
+
+ dev->mii.dev = dev->net;
+ dev->mii.mdio_read = r8153_ecm_mdio_read;
+ dev->mii.mdio_write = r8153_ecm_mdio_write;
+ dev->mii.reg_num_mask = 0x1f;
+ dev->mii.supports_gmii = 1;
+
+ return status;
+}
+
+static const struct driver_info r8153_info = {
+ .description = "RTL8153 ECM Device",
+ .flags = FLAG_ETHER,
+ .bind = r8153_bind,
+ .unbind = usbnet_cdc_unbind,
+ .status = usbnet_cdc_status,
+ .manage_power = usbnet_manage_power,
+};
+
+static const struct usb_device_id products[] = {
+{
+ USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x8153, USB_CLASS_COMM,
+ USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
+ .driver_info = (unsigned long)&r8153_info,
+},
+
+ { }, /* END */
+};
+MODULE_DEVICE_TABLE(usb, products);
+
+static int rtl8153_ecm_probe(struct usb_interface *intf,
+ const struct usb_device_id *id)
+{
+#if IS_REACHABLE(CONFIG_USB_RTL8152)
+ if (rtl8152_get_version(intf))
+ return -ENODEV;
+#endif
+
+ return usbnet_probe(intf, id);
+}
+
+static struct usb_driver r8153_ecm_driver = {
+ .name = "r8153_ecm",
+ .id_table = products,
+ .probe = rtl8153_ecm_probe,
+ .disconnect = usbnet_disconnect,
+ .suspend = usbnet_suspend,
+ .resume = usbnet_resume,
+ .reset_resume = usbnet_resume,
+ .supports_autosuspend = 1,
+ .disable_hub_initiated_lpm = 1,
+};
+
+module_usb_driver(r8153_ecm_driver);
+
+MODULE_AUTHOR("Hayes Wang");
+MODULE_DESCRIPTION("Realtek USB ECM device");
+MODULE_LICENSE("GPL");
diff --git a/include/linux/usb/r8152.h b/include/linux/usb/r8152.h
new file mode 100644
index 000000000000..663e694c9513
--- /dev/null
+++ b/include/linux/usb/r8152.h
@@ -0,0 +1,30 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (c) 2020 Realtek Semiconductor Corp. All rights reserved.
+ */
+
+#ifndef __LINUX_R8152_H
+#define __LINUX_R8152_H
+
+#include <linux/usb/usb_vendor_id.h>
+
+#define RTL8152_REQT_READ 0xc0
+#define RTL8152_REQT_WRITE 0x40
+#define RTL8152_REQ_GET_REGS 0x05
+#define RTL8152_REQ_SET_REGS 0x05
+
+#define BYTE_EN_DWORD 0xff
+#define BYTE_EN_WORD 0x33
+#define BYTE_EN_BYTE 0x11
+#define BYTE_EN_SIX_BYTES 0x3f
+#define BYTE_EN_START_MASK 0x0f
+#define BYTE_EN_END_MASK 0xf0
+
+#define MCU_TYPE_PLA 0x0100
+#define MCU_TYPE_USB 0x0000
+
+#if IS_REACHABLE(CONFIG_USB_RTL8152)
+extern u8 rtl8152_get_version(struct usb_interface *intf);
+#endif
+
+#endif /* __LINUX_R8152_H */
--
2.26.2

2020-11-03 09:55:33

by Hayes Wang

[permalink] [raw]
Subject: RE: [PATCH net-next v2] net/usb/r8153_ecm: support ECM mode for RTL8153

Greg Kroah-Hartman <[email protected]>
> Sent: Tuesday, November 3, 2020 5:33 PM
[...]
> There is a reason, it's a nightmare to maintain and handle merges for,
> just don't do it.
>
> Read the comments at the top of the pci_ids.h file if you are curious
> why we don't even do this for PCI device ids anymore for the past 10+
> years.
>
> So no, please do not create such a common file, it is not needed or a
> good idea.

Oops. I have sent it.

2020-11-03 16:19:58

by Jakub Kicinski

[permalink] [raw]
Subject: Re: [PATCH net-next v2] net/usb/r8153_ecm: support ECM mode for RTL8153

On Tue, 3 Nov 2020 10:32:41 +0100 Greg Kroah-Hartman wrote:
> On Mon, Nov 02, 2020 at 11:47:18AM -0800, Jakub Kicinski wrote:
> > On Mon, 2 Nov 2020 07:20:15 +0000 Hayes Wang wrote:
> > > Jakub Kicinski <[email protected]>
> > > > Can you describe the use case in more detail?
> > > >
> > > > AFAICT r8152 defines a match for the exact same device.
> > > > Does it not mean that which driver is used will be somewhat random
> > > > if both are built?
> > >
> > > I export rtl_get_version() from r8152. It would return none zero
> > > value if r8152 could support this device. Both r8152 and r8153_ecm
> > > would check the return value of rtl_get_version() in porbe().
> > > Therefore, if rtl_get_version() return none zero value, the r8152
> > > is used for the device with vendor mode. Otherwise, the r8153_ecm
> > > is used for the device with ECM mode.
> >
> > Oh, I see, I missed that the rtl_get_version() checking is the inverse
> > of r8152.
> >
> > > > > +/* Define these values to match your device */
> > > > > +#define VENDOR_ID_REALTEK 0x0bda
> > > > > +#define VENDOR_ID_MICROSOFT 0x045e
> > > > > +#define VENDOR_ID_SAMSUNG 0x04e8
> > > > > +#define VENDOR_ID_LENOVO 0x17ef
> > > > > +#define VENDOR_ID_LINKSYS 0x13b1
> > > > > +#define VENDOR_ID_NVIDIA 0x0955
> > > > > +#define VENDOR_ID_TPLINK 0x2357
> > > >
> > > > $ git grep 0x2357 | grep -i tplink
> > > > drivers/net/usb/cdc_ether.c:#define TPLINK_VENDOR_ID 0x2357
> > > > drivers/net/usb/r8152.c:#define VENDOR_ID_TPLINK 0x2357
> > > > drivers/usb/serial/option.c:#define TPLINK_VENDOR_ID 0x2357
> > > >
> > > > $ git grep 0x17ef | grep -i lenovo
> > > > drivers/hid/hid-ids.h:#define USB_VENDOR_ID_LENOVO 0x17ef
> > > > drivers/hid/wacom.h:#define USB_VENDOR_ID_LENOVO 0x17ef
> > > > drivers/net/usb/cdc_ether.c:#define LENOVO_VENDOR_ID 0x17ef
> > > > drivers/net/usb/r8152.c:#define VENDOR_ID_LENOVO 0x17ef
> > > >
> > > > Time to consolidate those vendor id defines perhaps?
> > >
> > > It seems that there is no such header file which I could include
> > > or add the new vendor IDs.
> >
> > Please create one. (Adding Greg KH to the recipients, in case there is
> > a reason that USB subsystem doesn't have a common vendor id header.)
>
> There is a reason, it's a nightmare to maintain and handle merges for,
> just don't do it.

Ah! Good that we asked :)

> Read the comments at the top of the pci_ids.h file if you are curious
> why we don't even do this for PCI device ids anymore for the past 10+
> years.
>
> So no, please do not create such a common file, it is not needed or a
> good idea.

I wouldn't go that far, PCI subsystem just doesn't want everyone to add
IDs to the shared file unless there is a reason.

* Do not add new entries to this file unless the definitions
* are shared between multiple drivers.

Which seems quite reasonable. But it is most certainly your call :)

2020-11-04 01:42:28

by Hayes Wang

[permalink] [raw]
Subject: RE: [PATCH net-next v2] net/usb/r8153_ecm: support ECM mode for RTL8153

Jakub Kicinski <[email protected]>
> Sent: Wednesday, November 4, 2020 12:16 AM
[...]
> > So no, please do not create such a common file, it is not needed or a
> > good idea.
>
> I wouldn't go that far, PCI subsystem just doesn't want everyone to add
> IDs to the shared file unless there is a reason.
>
> * Do not add new entries to this file unless the definitions
> * are shared between multiple drivers.
>
> Which seems quite reasonable. But it is most certainly your call :)

Do I have to resend this patch?

Best Regards,
Hayes


2020-11-04 01:45:50

by Jakub Kicinski

[permalink] [raw]
Subject: Re: [PATCH net-next v2] net/usb/r8153_ecm: support ECM mode for RTL8153

On Wed, 4 Nov 2020 01:39:52 +0000 Hayes Wang wrote:
> Jakub Kicinski <[email protected]>
> > Sent: Wednesday, November 4, 2020 12:16 AM
> [...]
> > > So no, please do not create such a common file, it is not needed or a
> > > good idea.
> >
> > I wouldn't go that far, PCI subsystem just doesn't want everyone to add
> > IDs to the shared file unless there is a reason.
> >
> > * Do not add new entries to this file unless the definitions
> > * are shared between multiple drivers.
> >
> > Which seems quite reasonable. But it is most certainly your call :)
>
> Do I have to resend this patch?

Yes please, that'd be easiest for me. Also Oliver wasn't CCed on this
posting.

2020-11-04 02:21:54

by Hayes Wang

[permalink] [raw]
Subject: [PATCH net-next v2 RESEND] net/usb/r8153_ecm: support ECM mode for RTL8153

Support ECM mode based on cdc_ether with relative mii functions,
when CONFIG_USB_RTL8152 is not set, or the device is not supported
by r8152 driver.

Both r8152 and r8153_ecm would check the return value of
rtl8152_get_version() in porbe(). If rtl8152_get_version()
return none zero value, the r8152 is used for the device
with vendor mode. Otherwise, the r8153_ecm is used for the
device with ECM mode.

Signed-off-by: Hayes Wang <[email protected]>
---
drivers/net/usb/Makefile | 2 +-
drivers/net/usb/r8152.c | 30 +------
drivers/net/usb/r8153_ecm.c | 162 ++++++++++++++++++++++++++++++++++++
include/linux/usb/r8152.h | 37 ++++++++
4 files changed, 204 insertions(+), 27 deletions(-)
create mode 100644 drivers/net/usb/r8153_ecm.c
create mode 100644 include/linux/usb/r8152.h

diff --git a/drivers/net/usb/Makefile b/drivers/net/usb/Makefile
index 99fd12be2111..99381e6bea78 100644
--- a/drivers/net/usb/Makefile
+++ b/drivers/net/usb/Makefile
@@ -13,7 +13,7 @@ obj-$(CONFIG_USB_LAN78XX) += lan78xx.o
obj-$(CONFIG_USB_NET_AX8817X) += asix.o
asix-y := asix_devices.o asix_common.o ax88172a.o
obj-$(CONFIG_USB_NET_AX88179_178A) += ax88179_178a.o
-obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o
+obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o r8153_ecm.o
obj-$(CONFIG_USB_NET_CDC_EEM) += cdc_eem.o
obj-$(CONFIG_USB_NET_DM9601) += dm9601.o
obj-$(CONFIG_USB_NET_SR9700) += sr9700.o
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
index b9b3d19a2e98..c448d6089821 100644
--- a/drivers/net/usb/r8152.c
+++ b/drivers/net/usb/r8152.c
@@ -26,6 +26,7 @@
#include <linux/acpi.h>
#include <linux/firmware.h>
#include <crypto/hash.h>
+#include <linux/usb/r8152.h>

/* Information for net-next */
#define NETNEXT_VERSION "11"
@@ -653,18 +654,6 @@ enum rtl_register_content {

#define INTR_LINK 0x0004

-#define RTL8152_REQT_READ 0xc0
-#define RTL8152_REQT_WRITE 0x40
-#define RTL8152_REQ_GET_REGS 0x05
-#define RTL8152_REQ_SET_REGS 0x05
-
-#define BYTE_EN_DWORD 0xff
-#define BYTE_EN_WORD 0x33
-#define BYTE_EN_BYTE 0x11
-#define BYTE_EN_SIX_BYTES 0x3f
-#define BYTE_EN_START_MASK 0x0f
-#define BYTE_EN_END_MASK 0xf0
-
#define RTL8153_MAX_PACKET 9216 /* 9K */
#define RTL8153_MAX_MTU (RTL8153_MAX_PACKET - VLAN_ETH_HLEN - \
ETH_FCS_LEN)
@@ -689,21 +678,9 @@ enum rtl8152_flags {
LENOVO_MACPASSTHRU,
};

-/* Define these values to match your device */
-#define VENDOR_ID_REALTEK 0x0bda
-#define VENDOR_ID_MICROSOFT 0x045e
-#define VENDOR_ID_SAMSUNG 0x04e8
-#define VENDOR_ID_LENOVO 0x17ef
-#define VENDOR_ID_LINKSYS 0x13b1
-#define VENDOR_ID_NVIDIA 0x0955
-#define VENDOR_ID_TPLINK 0x2357
-
#define DEVICE_ID_THINKPAD_THUNDERBOLT3_DOCK_GEN2 0x3082
#define DEVICE_ID_THINKPAD_USB_C_DOCK_GEN2 0xa387

-#define MCU_TYPE_PLA 0x0100
-#define MCU_TYPE_USB 0x0000
-
struct tally_counter {
__le64 tx_packets;
__le64 rx_packets;
@@ -6621,7 +6598,7 @@ static int rtl_fw_init(struct r8152 *tp)
return 0;
}

-static u8 rtl_get_version(struct usb_interface *intf)
+u8 rtl8152_get_version(struct usb_interface *intf)
{
struct usb_device *udev = interface_to_usbdev(intf);
u32 ocp_data = 0;
@@ -6679,12 +6656,13 @@ static u8 rtl_get_version(struct usb_interface *intf)

return version;
}
+EXPORT_SYMBOL_GPL(rtl8152_get_version);

static int rtl8152_probe(struct usb_interface *intf,
const struct usb_device_id *id)
{
struct usb_device *udev = interface_to_usbdev(intf);
- u8 version = rtl_get_version(intf);
+ u8 version = rtl8152_get_version(intf);
struct r8152 *tp;
struct net_device *netdev;
int ret;
diff --git a/drivers/net/usb/r8153_ecm.c b/drivers/net/usb/r8153_ecm.c
new file mode 100644
index 000000000000..2c3fabd38b16
--- /dev/null
+++ b/drivers/net/usb/r8153_ecm.c
@@ -0,0 +1,162 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include <linux/module.h>
+#include <linux/netdevice.h>
+#include <linux/mii.h>
+#include <linux/usb.h>
+#include <linux/usb/cdc.h>
+#include <linux/usb/usbnet.h>
+#include <linux/usb/r8152.h>
+
+#define OCP_BASE 0xe86c
+
+static int pla_read_word(struct usbnet *dev, u16 index)
+{
+ u16 byen = BYTE_EN_WORD;
+ u8 shift = index & 2;
+ __le32 tmp;
+ int ret;
+
+ if (shift)
+ byen <<= shift;
+
+ index &= ~3;
+
+ ret = usbnet_read_cmd(dev, RTL8152_REQ_GET_REGS, RTL8152_REQT_READ, index,
+ MCU_TYPE_PLA | byen, &tmp, sizeof(tmp));
+ if (ret < 0)
+ goto out;
+
+ ret = __le32_to_cpu(tmp);
+ ret >>= (shift * 8);
+ ret &= 0xffff;
+
+out:
+ return ret;
+}
+
+static int pla_write_word(struct usbnet *dev, u16 index, u32 data)
+{
+ u32 mask = 0xffff;
+ u16 byen = BYTE_EN_WORD;
+ u8 shift = index & 2;
+ __le32 tmp;
+ int ret;
+
+ data &= mask;
+
+ if (shift) {
+ byen <<= shift;
+ mask <<= (shift * 8);
+ data <<= (shift * 8);
+ }
+
+ index &= ~3;
+
+ ret = usbnet_read_cmd(dev, RTL8152_REQ_GET_REGS, RTL8152_REQT_READ, index,
+ MCU_TYPE_PLA | byen, &tmp, sizeof(tmp));
+
+ if (ret < 0)
+ goto out;
+
+ data |= __le32_to_cpu(tmp) & ~mask;
+ tmp = __cpu_to_le32(data);
+
+ ret = usbnet_write_cmd(dev, RTL8152_REQ_SET_REGS, RTL8152_REQT_WRITE, index,
+ MCU_TYPE_PLA | byen, &tmp, sizeof(tmp));
+
+out:
+ return ret;
+}
+
+static int r8153_ecm_mdio_read(struct net_device *netdev, int phy_id, int reg)
+{
+ struct usbnet *dev = netdev_priv(netdev);
+ int ret;
+
+ ret = pla_write_word(dev, OCP_BASE, 0xa000);
+ if (ret < 0)
+ goto out;
+
+ ret = pla_read_word(dev, 0xb400 + reg * 2);
+
+out:
+ return ret;
+}
+
+static void r8153_ecm_mdio_write(struct net_device *netdev, int phy_id, int reg, int val)
+{
+ struct usbnet *dev = netdev_priv(netdev);
+ int ret;
+
+ ret = pla_write_word(dev, OCP_BASE, 0xa000);
+ if (ret < 0)
+ return;
+
+ ret = pla_write_word(dev, 0xb400 + reg * 2, val);
+}
+
+static int r8153_bind(struct usbnet *dev, struct usb_interface *intf)
+{
+ int status;
+
+ status = usbnet_cdc_bind(dev, intf);
+ if (status < 0)
+ return status;
+
+ dev->mii.dev = dev->net;
+ dev->mii.mdio_read = r8153_ecm_mdio_read;
+ dev->mii.mdio_write = r8153_ecm_mdio_write;
+ dev->mii.reg_num_mask = 0x1f;
+ dev->mii.supports_gmii = 1;
+
+ return status;
+}
+
+static const struct driver_info r8153_info = {
+ .description = "RTL8153 ECM Device",
+ .flags = FLAG_ETHER,
+ .bind = r8153_bind,
+ .unbind = usbnet_cdc_unbind,
+ .status = usbnet_cdc_status,
+ .manage_power = usbnet_manage_power,
+};
+
+static const struct usb_device_id products[] = {
+{
+ USB_DEVICE_AND_INTERFACE_INFO(VENDOR_ID_REALTEK, 0x8153, USB_CLASS_COMM,
+ USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
+ .driver_info = (unsigned long)&r8153_info,
+},
+
+ { }, /* END */
+};
+MODULE_DEVICE_TABLE(usb, products);
+
+static int rtl8153_ecm_probe(struct usb_interface *intf,
+ const struct usb_device_id *id)
+{
+#if IS_REACHABLE(CONFIG_USB_RTL8152)
+ if (rtl8152_get_version(intf))
+ return -ENODEV;
+#endif
+
+ return usbnet_probe(intf, id);
+}
+
+static struct usb_driver r8153_ecm_driver = {
+ .name = "r8153_ecm",
+ .id_table = products,
+ .probe = rtl8153_ecm_probe,
+ .disconnect = usbnet_disconnect,
+ .suspend = usbnet_suspend,
+ .resume = usbnet_resume,
+ .reset_resume = usbnet_resume,
+ .supports_autosuspend = 1,
+ .disable_hub_initiated_lpm = 1,
+};
+
+module_usb_driver(r8153_ecm_driver);
+
+MODULE_AUTHOR("Hayes Wang");
+MODULE_DESCRIPTION("Realtek USB ECM device");
+MODULE_LICENSE("GPL");
diff --git a/include/linux/usb/r8152.h b/include/linux/usb/r8152.h
new file mode 100644
index 000000000000..20d88b1defc3
--- /dev/null
+++ b/include/linux/usb/r8152.h
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (c) 2020 Realtek Semiconductor Corp. All rights reserved.
+ */
+
+#ifndef __LINUX_R8152_H
+#define __LINUX_R8152_H
+
+#define RTL8152_REQT_READ 0xc0
+#define RTL8152_REQT_WRITE 0x40
+#define RTL8152_REQ_GET_REGS 0x05
+#define RTL8152_REQ_SET_REGS 0x05
+
+#define BYTE_EN_DWORD 0xff
+#define BYTE_EN_WORD 0x33
+#define BYTE_EN_BYTE 0x11
+#define BYTE_EN_SIX_BYTES 0x3f
+#define BYTE_EN_START_MASK 0x0f
+#define BYTE_EN_END_MASK 0xf0
+
+#define MCU_TYPE_PLA 0x0100
+#define MCU_TYPE_USB 0x0000
+
+/* Define these values to match your device */
+#define VENDOR_ID_REALTEK 0x0bda
+#define VENDOR_ID_MICROSOFT 0x045e
+#define VENDOR_ID_SAMSUNG 0x04e8
+#define VENDOR_ID_LENOVO 0x17ef
+#define VENDOR_ID_LINKSYS 0x13b1
+#define VENDOR_ID_NVIDIA 0x0955
+#define VENDOR_ID_TPLINK 0x2357
+
+#if IS_REACHABLE(CONFIG_USB_RTL8152)
+extern u8 rtl8152_get_version(struct usb_interface *intf);
+#endif
+
+#endif /* __LINUX_R8152_H */
--
2.26.2

2020-11-06 01:02:29

by Jakub Kicinski

[permalink] [raw]
Subject: Re: [PATCH net-next v2 RESEND] net/usb/r8153_ecm: support ECM mode for RTL8153

On Wed, 4 Nov 2020 10:19:22 +0800 Hayes Wang wrote:
> Support ECM mode based on cdc_ether with relative mii functions,
> when CONFIG_USB_RTL8152 is not set, or the device is not supported
> by r8152 driver.
>
> Both r8152 and r8153_ecm would check the return value of
> rtl8152_get_version() in porbe(). If rtl8152_get_version()
> return none zero value, the r8152 is used for the device
> with vendor mode. Otherwise, the r8153_ecm is used for the
> device with ECM mode.
>
> Signed-off-by: Hayes Wang <[email protected]>

Applied, thanks!

2020-11-13 15:32:46

by Marek Szyprowski

[permalink] [raw]
Subject: Re: [PATCH net-next v2 RESEND] net/usb/r8153_ecm: support ECM mode for RTL8153

Hi Hayes,

On 04.11.2020 03:19, Hayes Wang wrote:
> Support ECM mode based on cdc_ether with relative mii functions,
> when CONFIG_USB_RTL8152 is not set, or the device is not supported
> by r8152 driver.
>
> Both r8152 and r8153_ecm would check the return value of
> rtl8152_get_version() in porbe(). If rtl8152_get_version()
> return none zero value, the r8152 is used for the device
> with vendor mode. Otherwise, the r8153_ecm is used for the
> device with ECM mode.
>
> Signed-off-by: Hayes Wang <[email protected]>

This patch landed recently in linux-next and breaks ethernet operation
on Samsung Exynos5422 Odroid XU4/HC1 boards when kernel is compiled from
arm/configs/multi_v7_defconfig. The main problem is that the hardware is
bound to r8153_ecm driver, not to the r8152. Manually switching the
drivers by "echo 4-1:2.0 >/sys/bus/usb/drivers/r8153_ecm/unbind && echo
4-1:2.0 >/sys/bus/usb/drivers/r8152/bind" fixes ethernet operation.

This is because in multi_v7_defconfig r8153_ecm driver is built-in (as
it is tied to CONFIG_USB_NET_CDCETHER), while the r8152 driver is
compiled as module and loaded when r8153_ecm has already bound.

I think that r8153_ecm driver should have a separate Kconfig symbol,
which matches the r8152 driver (either both are built-in or both as
modules), otherwise those 2 drivers cannot properly detect their cases.

> ---
> drivers/net/usb/Makefile | 2 +-
> drivers/net/usb/r8152.c | 30 +------
> drivers/net/usb/r8153_ecm.c | 162 ++++++++++++++++++++++++++++++++++++
> include/linux/usb/r8152.h | 37 ++++++++
> 4 files changed, 204 insertions(+), 27 deletions(-)
> create mode 100644 drivers/net/usb/r8153_ecm.c
> create mode 100644 include/linux/usb/r8152.h
>
> > ...

Best regards
--
Marek Szyprowski, PhD
Samsung R&D Institute Poland

2020-11-16 06:55:46

by Hayes Wang

[permalink] [raw]
Subject: [PATCH net-next] r8153_ecm: avoid to be prior to r8152 driver

Avoid r8153_ecm is compiled as built-in, if r8152 driver is compiled
as modules. Otherwise, the r8153_ecm would be used, even though the
device is supported by r8152 driver.

Fixes: c1aedf015ebd ("net/usb/r8153_ecm: support ECM mode for RTL8153")
Reported-by: Marek Szyprowski <[email protected]>
Signed-off-by: Hayes Wang <[email protected]>
---
drivers/net/usb/Makefile | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/net/usb/Makefile b/drivers/net/usb/Makefile
index 99381e6bea78..98f4c100955e 100644
--- a/drivers/net/usb/Makefile
+++ b/drivers/net/usb/Makefile
@@ -13,7 +13,7 @@ obj-$(CONFIG_USB_LAN78XX) += lan78xx.o
obj-$(CONFIG_USB_NET_AX8817X) += asix.o
asix-y := asix_devices.o asix_common.o ax88172a.o
obj-$(CONFIG_USB_NET_AX88179_178A) += ax88179_178a.o
-obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o r8153_ecm.o
+obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o
obj-$(CONFIG_USB_NET_CDC_EEM) += cdc_eem.o
obj-$(CONFIG_USB_NET_DM9601) += dm9601.o
obj-$(CONFIG_USB_NET_SR9700) += sr9700.o
@@ -41,3 +41,11 @@ obj-$(CONFIG_USB_NET_QMI_WWAN) += qmi_wwan.o
obj-$(CONFIG_USB_NET_CDC_MBIM) += cdc_mbim.o
obj-$(CONFIG_USB_NET_CH9200) += ch9200.o
obj-$(CONFIG_USB_NET_AQC111) += aqc111.o
+
+ifdef CONFIG_USB_NET_CDCETHER
+ifeq ($(CONFIG_USB_RTL8152), m)
+obj-$(CONFIG_USB_RTL8152) += r8153_ecm.o
+else
+obj-$(CONFIG_USB_NET_CDCETHER) += r8153_ecm.o
+endif
+endif
--
2.26.2

2020-11-16 09:55:17

by Marek Szyprowski

[permalink] [raw]
Subject: Re: [PATCH net-next] r8153_ecm: avoid to be prior to r8152 driver

Hi

On 16.11.2020 07:52, Hayes Wang wrote:
> Avoid r8153_ecm is compiled as built-in, if r8152 driver is compiled
> as modules. Otherwise, the r8153_ecm would be used, even though the
> device is supported by r8152 driver.
>
> Fixes: c1aedf015ebd ("net/usb/r8153_ecm: support ECM mode for RTL8153")
> Reported-by: Marek Szyprowski <[email protected]>
> Signed-off-by: Hayes Wang <[email protected]>

Yes, this fixes this issue, although I would prefer a separate Kconfig
entry for r8153_ecm with proper dependencies instead of this ifdefs in
Makefile.

Tested-by: Marek Szyprowski <[email protected]>

> ---
> drivers/net/usb/Makefile | 10 +++++++++-
> 1 file changed, 9 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/usb/Makefile b/drivers/net/usb/Makefile
> index 99381e6bea78..98f4c100955e 100644
> --- a/drivers/net/usb/Makefile
> +++ b/drivers/net/usb/Makefile
> @@ -13,7 +13,7 @@ obj-$(CONFIG_USB_LAN78XX) += lan78xx.o
> obj-$(CONFIG_USB_NET_AX8817X) += asix.o
> asix-y := asix_devices.o asix_common.o ax88172a.o
> obj-$(CONFIG_USB_NET_AX88179_178A) += ax88179_178a.o
> -obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o r8153_ecm.o
> +obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o
> obj-$(CONFIG_USB_NET_CDC_EEM) += cdc_eem.o
> obj-$(CONFIG_USB_NET_DM9601) += dm9601.o
> obj-$(CONFIG_USB_NET_SR9700) += sr9700.o
> @@ -41,3 +41,11 @@ obj-$(CONFIG_USB_NET_QMI_WWAN) += qmi_wwan.o
> obj-$(CONFIG_USB_NET_CDC_MBIM) += cdc_mbim.o
> obj-$(CONFIG_USB_NET_CH9200) += ch9200.o
> obj-$(CONFIG_USB_NET_AQC111) += aqc111.o
> +
> +ifdef CONFIG_USB_NET_CDCETHER
> +ifeq ($(CONFIG_USB_RTL8152), m)
> +obj-$(CONFIG_USB_RTL8152) += r8153_ecm.o
> +else
> +obj-$(CONFIG_USB_NET_CDCETHER) += r8153_ecm.o
> +endif
> +endif

Best regards
--
Marek Szyprowski, PhD
Samsung R&D Institute Poland

2020-11-16 17:06:16

by Jakub Kicinski

[permalink] [raw]
Subject: Re: [PATCH net-next] r8153_ecm: avoid to be prior to r8152 driver

On Mon, 16 Nov 2020 10:18:13 +0100 Marek Szyprowski wrote:
> On 16.11.2020 07:52, Hayes Wang wrote:
> > Avoid r8153_ecm is compiled as built-in, if r8152 driver is compiled
> > as modules. Otherwise, the r8153_ecm would be used, even though the
> > device is supported by r8152 driver.
> >
> > Fixes: c1aedf015ebd ("net/usb/r8153_ecm: support ECM mode for RTL8153")
> > Reported-by: Marek Szyprowski <[email protected]>
> > Signed-off-by: Hayes Wang <[email protected]>
>
> Yes, this fixes this issue, although I would prefer a separate Kconfig
> entry for r8153_ecm with proper dependencies instead of this ifdefs in
> Makefile.

Agreed, this is what dependency resolution is for.

Let's just make this a separate Kconfig entry.

2020-11-17 02:41:57

by Hayes Wang

[permalink] [raw]
Subject: RE: [PATCH net-next] r8153_ecm: avoid to be prior to r8152 driver

Jakub Kicinski <[email protected]>
> Sent: Tuesday, November 17, 2020 1:03 AM
[...]
> > Yes, this fixes this issue, although I would prefer a separate Kconfig
> > entry for r8153_ecm with proper dependencies instead of this ifdefs in
> > Makefile.
>
> Agreed, this is what dependency resolution is for.
>
> Let's just make this a separate Kconfig entry.

Excuse me. I am not familiar with Kconfig.

I wish r8153_ecm could be used, even
CONFIG_USB_RTL8152 is not defined.

How should set it in Kconfig?

Best Regards,
Hayes

2020-11-17 16:15:55

by Jakub Kicinski

[permalink] [raw]
Subject: Re: [PATCH net-next] r8153_ecm: avoid to be prior to r8152 driver

On Tue, 17 Nov 2020 01:50:03 +0000 Hayes Wang wrote:
> Jakub Kicinski <[email protected]>
> > Sent: Tuesday, November 17, 2020 1:03 AM
> [...]
> > > Yes, this fixes this issue, although I would prefer a separate Kconfig
> > > entry for r8153_ecm with proper dependencies instead of this ifdefs in
> > > Makefile.
> >
> > Agreed, this is what dependency resolution is for.
> >
> > Let's just make this a separate Kconfig entry.
>
> Excuse me. I am not familiar with Kconfig.
>
> I wish r8153_ecm could be used, even
> CONFIG_USB_RTL8152 is not defined.
>
> How should set it in Kconfig?

Something like this?

config USB_RTL8153_ECM
tristate <headline text>
select MII
select USB_NET_CDCETHER
depends on USB_RTL8152 || USB_RTL8152=n
help
<you help text>


select clauses will pull in the dependencies you need, and the
dependency on RTL8152 will be satisfied either when RTL8152's code
is reachable (both are modules or RTL8152 is built in) or when RTL8152
is not built at all.

Does that help?

2020-11-18 01:24:44

by Hayes Wang

[permalink] [raw]
Subject: RE: [PATCH net-next] r8153_ecm: avoid to be prior to r8152 driver

Jakub Kicinski <[email protected]>
> Sent: Wednesday, November 18, 2020 12:12 AM
[...]
> Something like this?
>
> config USB_RTL8153_ECM
> tristate <headline text>
> select MII
> select USB_NET_CDCETHER
> depends on USB_RTL8152 || USB_RTL8152=n
> help
> <you help text>
>
>
> select clauses will pull in the dependencies you need, and the
> dependency on RTL8152 will be satisfied either when RTL8152's code
> is reachable (both are modules or RTL8152 is built in) or when RTL8152
> is not built at all.
>
> Does that help?

Thanks a lot.
I would test it.

Best Regards,
Hayes

2020-11-18 06:48:24

by Hayes Wang

[permalink] [raw]
Subject: [PATCH net-next v2] r8153_ecm: avoid to be prior to r8152 driver

Avoid r8153_ecm is compiled as built-in, if r8152 driver is compiled
as modules. Otherwise, the r8153_ecm would be used, even though the
device is supported by r8152 driver.

Fixes: c1aedf015ebd ("net/usb/r8153_ecm: support ECM mode for RTL8153")
Reported-by: Marek Szyprowski <[email protected]>
Signed-off-by: Hayes Wang <[email protected]>
---
v2:
Use a separate Kconfig entry for r8153_ecm with proper dependencies.

drivers/net/usb/Kconfig | 9 +++++++++
drivers/net/usb/Makefile | 3 ++-
2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig
index b46993d5f997..1e3719028780 100644
--- a/drivers/net/usb/Kconfig
+++ b/drivers/net/usb/Kconfig
@@ -628,4 +628,13 @@ config USB_NET_AQC111
This driver should work with at least the following devices:
* Aquantia AQtion USB to 5GbE

+config USB_RTL8153_ECM
+ tristate "RTL8153 ECM support"
+ depends on USB_NET_CDCETHER && (USB_RTL8152 || USB_RTL8152=n)
+ default y
+ help
+ This option supports ECM mode for RTL8153 ethernet adapter, when
+ CONFIG_USB_RTL8152 is not set, or the RTL8153 device is not
+ supported by r8152 driver.
+
endif # USB_NET_DRIVERS
diff --git a/drivers/net/usb/Makefile b/drivers/net/usb/Makefile
index 99381e6bea78..4964f7b326fb 100644
--- a/drivers/net/usb/Makefile
+++ b/drivers/net/usb/Makefile
@@ -13,7 +13,7 @@ obj-$(CONFIG_USB_LAN78XX) += lan78xx.o
obj-$(CONFIG_USB_NET_AX8817X) += asix.o
asix-y := asix_devices.o asix_common.o ax88172a.o
obj-$(CONFIG_USB_NET_AX88179_178A) += ax88179_178a.o
-obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o r8153_ecm.o
+obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o
obj-$(CONFIG_USB_NET_CDC_EEM) += cdc_eem.o
obj-$(CONFIG_USB_NET_DM9601) += dm9601.o
obj-$(CONFIG_USB_NET_SR9700) += sr9700.o
@@ -41,3 +41,4 @@ obj-$(CONFIG_USB_NET_QMI_WWAN) += qmi_wwan.o
obj-$(CONFIG_USB_NET_CDC_MBIM) += cdc_mbim.o
obj-$(CONFIG_USB_NET_CH9200) += ch9200.o
obj-$(CONFIG_USB_NET_AQC111) += aqc111.o
+obj-$(CONFIG_USB_RTL8153_ECM) += r8153_ecm.o
--
2.26.2

2020-11-18 08:21:40

by Marek Szyprowski

[permalink] [raw]
Subject: Re: [PATCH net-next v2] r8153_ecm: avoid to be prior to r8152 driver

Hi

On 18.11.2020 07:43, Hayes Wang wrote:
> Avoid r8153_ecm is compiled as built-in, if r8152 driver is compiled
> as modules. Otherwise, the r8153_ecm would be used, even though the
> device is supported by r8152 driver.
>
> Fixes: c1aedf015ebd ("net/usb/r8153_ecm: support ECM mode for RTL8153")
> Reported-by: Marek Szyprowski <[email protected]>
> Signed-off-by: Hayes Wang <[email protected]>

Yes, this looks like a proper fix.

Tested-by: Marek Szyprowski <[email protected]>

> ---
> v2:
> Use a separate Kconfig entry for r8153_ecm with proper dependencies.
>
> drivers/net/usb/Kconfig | 9 +++++++++
> drivers/net/usb/Makefile | 3 ++-
> 2 files changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig
> index b46993d5f997..1e3719028780 100644
> --- a/drivers/net/usb/Kconfig
> +++ b/drivers/net/usb/Kconfig
> @@ -628,4 +628,13 @@ config USB_NET_AQC111
> This driver should work with at least the following devices:
> * Aquantia AQtion USB to 5GbE
>
> +config USB_RTL8153_ECM
> + tristate "RTL8153 ECM support"
> + depends on USB_NET_CDCETHER && (USB_RTL8152 || USB_RTL8152=n)
> + default y
> + help
> + This option supports ECM mode for RTL8153 ethernet adapter, when
> + CONFIG_USB_RTL8152 is not set, or the RTL8153 device is not
> + supported by r8152 driver.
> +
> endif # USB_NET_DRIVERS
> diff --git a/drivers/net/usb/Makefile b/drivers/net/usb/Makefile
> index 99381e6bea78..4964f7b326fb 100644
> --- a/drivers/net/usb/Makefile
> +++ b/drivers/net/usb/Makefile
> @@ -13,7 +13,7 @@ obj-$(CONFIG_USB_LAN78XX) += lan78xx.o
> obj-$(CONFIG_USB_NET_AX8817X) += asix.o
> asix-y := asix_devices.o asix_common.o ax88172a.o
> obj-$(CONFIG_USB_NET_AX88179_178A) += ax88179_178a.o
> -obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o r8153_ecm.o
> +obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o
> obj-$(CONFIG_USB_NET_CDC_EEM) += cdc_eem.o
> obj-$(CONFIG_USB_NET_DM9601) += dm9601.o
> obj-$(CONFIG_USB_NET_SR9700) += sr9700.o
> @@ -41,3 +41,4 @@ obj-$(CONFIG_USB_NET_QMI_WWAN) += qmi_wwan.o
> obj-$(CONFIG_USB_NET_CDC_MBIM) += cdc_mbim.o
> obj-$(CONFIG_USB_NET_CH9200) += ch9200.o
> obj-$(CONFIG_USB_NET_AQC111) += aqc111.o
> +obj-$(CONFIG_USB_RTL8153_ECM) += r8153_ecm.o

Best regards
--
Marek Szyprowski, PhD
Samsung R&D Institute Poland

2020-11-19 16:51:42

by patchwork-bot+netdevbpf

[permalink] [raw]
Subject: Re: [PATCH net-next v2] r8153_ecm: avoid to be prior to r8152 driver

Hello:

This patch was applied to netdev/net-next.git (refs/heads/master):

On Wed, 18 Nov 2020 14:43:58 +0800 you wrote:
> Avoid r8153_ecm is compiled as built-in, if r8152 driver is compiled
> as modules. Otherwise, the r8153_ecm would be used, even though the
> device is supported by r8152 driver.
>
> Fixes: c1aedf015ebd ("net/usb/r8153_ecm: support ECM mode for RTL8153")
> Reported-by: Marek Szyprowski <[email protected]>
> Signed-off-by: Hayes Wang <[email protected]>
>
> [...]

Here is the summary with links:
- [net-next,v2] r8153_ecm: avoid to be prior to r8152 driver
https://git.kernel.org/netdev/net-next/c/657bc1d10bfc

You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html