mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-21 14:37:57 +00:00
210c534ce2
This commit moves the patches for the r8152.c driver to the generic directory. Previously they were only available on the bcm27xx target. With these patches the Realtek RTL8153C, RTL8153D, RTL8156A and RTL8156B chips are supported on all targets by the kmod-usb-net-rtl8152 module. The RTL8156A and RTL8156B are the 2.5Gb/s Ethernet adapters. The patches have been tested on TP-Link UE300 (RTL8153A) and UNITEK 1313B (RTL8156B). Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl>
80 lines
2.2 KiB
Diff
80 lines
2.2 KiB
Diff
From 579f58dd2819910354753bc5489fc1588fe9cfe2 Mon Sep 17 00:00:00 2001
|
|
From: Hayes Wang <hayeswang@realtek.com>
|
|
Date: Fri, 16 Apr 2021 16:04:37 +0800
|
|
Subject: [PATCH] r8152: search the configuration of vendor mode
|
|
|
|
commit c2198943e33b100ed21dfb636c8fa6baef841e9d upstream.
|
|
|
|
The vendor mode is not always at config #1, so it is necessary to
|
|
set the correct configuration number.
|
|
|
|
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
---
|
|
drivers/net/usb/r8152.c | 39 +++++++++++++++++++++++++++++++++++----
|
|
1 file changed, 35 insertions(+), 4 deletions(-)
|
|
|
|
--- a/drivers/net/usb/r8152.c
|
|
+++ b/drivers/net/usb/r8152.c
|
|
@@ -30,7 +30,7 @@
|
|
#include <linux/usb/r8152.h>
|
|
|
|
/* Information for net-next */
|
|
-#define NETNEXT_VERSION "11"
|
|
+#define NETNEXT_VERSION "12"
|
|
|
|
/* Information for net */
|
|
#define NET_VERSION "11"
|
|
@@ -8131,6 +8131,39 @@ static void r8156b_init(struct r8152 *tp
|
|
tp->coalesce = 15000; /* 15 us */
|
|
}
|
|
|
|
+static bool rtl_vendor_mode(struct usb_interface *intf)
|
|
+{
|
|
+ struct usb_host_interface *alt = intf->cur_altsetting;
|
|
+ struct usb_device *udev;
|
|
+ struct usb_host_config *c;
|
|
+ int i, num_configs;
|
|
+
|
|
+ if (alt->desc.bInterfaceClass == USB_CLASS_VENDOR_SPEC)
|
|
+ return true;
|
|
+
|
|
+ /* The vendor mode is not always config #1, so to find it out. */
|
|
+ udev = interface_to_usbdev(intf);
|
|
+ c = udev->config;
|
|
+ num_configs = udev->descriptor.bNumConfigurations;
|
|
+ for (i = 0; i < num_configs; (i++, c++)) {
|
|
+ struct usb_interface_descriptor *desc = NULL;
|
|
+
|
|
+ if (c->desc.bNumInterfaces > 0)
|
|
+ desc = &c->intf_cache[0]->altsetting->desc;
|
|
+ else
|
|
+ continue;
|
|
+
|
|
+ if (desc->bInterfaceClass == USB_CLASS_VENDOR_SPEC) {
|
|
+ usb_driver_set_configuration(udev, c->desc.bConfigurationValue);
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ WARN_ON_ONCE(i == num_configs);
|
|
+
|
|
+ return false;
|
|
+}
|
|
+
|
|
static int rtl8152_pre_reset(struct usb_interface *intf)
|
|
{
|
|
struct r8152 *tp = usb_get_intfdata(intf);
|
|
@@ -9369,10 +9402,8 @@ static int rtl8152_probe(struct usb_inte
|
|
if (version == RTL_VER_UNKNOWN)
|
|
return -ENODEV;
|
|
|
|
- if (udev->actconfig->desc.bConfigurationValue != 1) {
|
|
- usb_driver_set_configuration(udev, 1);
|
|
+ if (!rtl_vendor_mode(intf))
|
|
return -ENODEV;
|
|
- }
|
|
|
|
if (intf->cur_altsetting->desc.bNumEndpoints < 3)
|
|
return -ENODEV;
|