 27c9d80f51
			
		
	
	27c9d80f51
	
	
		
			
	
		
	
	
		
			Some checks failed
		
		
	
	Build Kernel / Build all affected Kernels (push) Has been cancelled
				
			Build all core packages / Build all core packages for selected target (push) Has been cancelled
				
			Build and Push prebuilt tools container / Build and Push all prebuilt containers (push) Has been cancelled
				
			Build Toolchains / Build Toolchains for each target (push) Has been cancelled
				
			Build host tools / Build host tools for linux and macos based systems (push) Has been cancelled
				
			Coverity scan build / Coverity x86/64 build (push) Has been cancelled
				
			
		
			
				
	
	
		
			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
 | |
| @@ -1313,16 +1313,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) {
 | |
| @@ -1349,10 +1357,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:
 |