mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 23:42:43 +00:00
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:
|