forked from Openwrt/openwrt
34d2964554
Fixes issues with RTL8156 2.5G USB adapters - # ethtool eth1 Settings for eth1: Supported ports: [ ] Supported link modes: Not reported Supported pause frame use: No Supports auto-negotiation: No Supported FEC modes: Not reported Advertised link modes: Not reported Advertised pause frame use: No Advertised auto-negotiation: No Advertised FEC modes: Not reported Speed: 2500Mb/s Duplex: Half Port: Twisted Pair PHYAD: 0 Transceiver: internal Auto-negotiation: off MDI-X: Unknown Current message level: 0x00000007 (7) drv probe link Link detected: yes - # - r8152: break the loop when the budget is exhausted - r8152: Block future register access if register access fails - r8152: Rename RTL8152_UNPLUG to RTL8152_INACCESSIBLE - r8152: add vendor/device ID pair for D-Link DUB-E250 - r8152: try to use a normal budget - r8152: set bp in bulk - r8152: adjust generic_ocp_write function - r8152: fix the autosuspend doesn't work - r8152: Add __GFP_NOWARN to big allocations - r8152: reduce the control transfer of rtl8152_get_version() - r8152: remove rtl_vendor_mode function - r8152: avoid to change cfg for all devices - r8152: add USB device driver for config selection - r8152: use napi_gro_frags - cdc_ether: no need to blacklist any r8152 devices - cdc_ether: add u-blox 0x1313 composition Build system: x86_64 Build-tested: bcm2711, rockchip, x86/64 Run-tested: bcm2711/RPi4B, rockchip/nanopi r2s, x86/64 Signed-off-by: Marty Jones <mj8263788@gmail.com>
71 lines
2.0 KiB
Diff
71 lines
2.0 KiB
Diff
From 57df0fb9d511f91202114813e90128d65c0589f0 Mon Sep 17 00:00:00 2001
|
|
From: Hayes Wang <hayeswang@realtek.com>
|
|
Date: Wed, 26 Jul 2023 11:08:07 +0800
|
|
Subject: [PATCH] r8152: adjust generic_ocp_write function
|
|
|
|
Reduce the control transfer if all bytes of first or the last DWORD are
|
|
written.
|
|
|
|
The original method is to split the control transfer into three parts
|
|
(the first DWORD, middle continuous data, and the last DWORD). However,
|
|
they could be combined if whole bytes of the first DWORD or last DWORD
|
|
are written. That is, the first DWORD or the last DWORD could be combined
|
|
with the middle continuous data, if the byte_en is 0xff.
|
|
|
|
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
|
|
Link: https://lore.kernel.org/r/20230726030808.9093-418-nic_swsd@realtek.com
|
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|
---
|
|
drivers/net/usb/r8152.c | 29 ++++++++++++++++++-----------
|
|
1 file changed, 18 insertions(+), 11 deletions(-)
|
|
|
|
--- a/drivers/net/usb/r8152.c
|
|
+++ b/drivers/net/usb/r8152.c
|
|
@@ -1310,16 +1310,24 @@ static int generic_ocp_write(struct r815
|
|
byteen_end = byteen & BYTE_EN_END_MASK;
|
|
|
|
byen = byteen_start | (byteen_start << 4);
|
|
- ret = set_registers(tp, index, type | byen, 4, data);
|
|
- if (ret < 0)
|
|
- goto error1;
|
|
-
|
|
- index += 4;
|
|
- data += 4;
|
|
- size -= 4;
|
|
|
|
- if (size) {
|
|
+ /* Split the first DWORD if the byte_en is not 0xff */
|
|
+ if (byen != BYTE_EN_DWORD) {
|
|
+ ret = set_registers(tp, index, type | byen, 4, data);
|
|
+ if (ret < 0)
|
|
+ goto error1;
|
|
+
|
|
+ index += 4;
|
|
+ data += 4;
|
|
size -= 4;
|
|
+ }
|
|
+
|
|
+ if (size) {
|
|
+ byen = byteen_end | (byteen_end >> 4);
|
|
+
|
|
+ /* Split the last DWORD if the byte_en is not 0xff */
|
|
+ if (byen != BYTE_EN_DWORD)
|
|
+ size -= 4;
|
|
|
|
while (size) {
|
|
if (size > limit) {
|
|
@@ -1346,10 +1354,9 @@ static int generic_ocp_write(struct r815
|
|
}
|
|
}
|
|
|
|
- byen = byteen_end | (byteen_end >> 4);
|
|
- ret = set_registers(tp, index, type | byen, 4, data);
|
|
- if (ret < 0)
|
|
- goto error1;
|
|
+ /* Set the last DWORD */
|
|
+ if (byen != BYTE_EN_DWORD)
|
|
+ ret = set_registers(tp, index, type | byen, 4, data);
|
|
}
|
|
|
|
error1:
|