 aa2fa2eb76
			
		
	
	aa2fa2eb76
	
	
	
		
			
			Manually rebased: bcm53xx/patches-5.10/180-usb-xhci-add-support-for-performing-fake-doorbell.patch All patches automatically rebased. Signed-off-by: John Audia <therealgraysky@proton.me> [Move gro_skip in 680-NET-skip-GRO-for-foreign-MAC-addresses.patch to old position] Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
		
			
				
	
	
		
			199 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			199 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 86b98abf4f8c691c260c5113d6a2d32f5377caca Mon Sep 17 00:00:00 2001
 | |
| From: Hayes Wang <hayeswang@realtek.com>
 | |
| Date: Wed, 3 Feb 2021 17:14:28 +0800
 | |
| Subject: [PATCH] r8152: replace several functions about phy patch
 | |
|  request
 | |
| 
 | |
| commit a08c0d309d8c078d22717d815cf9853f6f2c07bd upstream.
 | |
| 
 | |
| Replace r8153_patch_request() with rtl_phy_patch_request().
 | |
| Replace r8153_pre_ram_code() with rtl_pre_ram_code().
 | |
| Replace r8153_post_ram_code() with rtl_post_ram_code().
 | |
| Add rtl_patch_key_set().
 | |
| 
 | |
| The new functions have an additional parameter. It is used to wait
 | |
| the patch request command finished. When the PHY is resumed from
 | |
| the state of power cut, the PHY is at a safe mode and the
 | |
| OCP_PHY_PATCH_STAT wouldn't be updated. For this situation, it is
 | |
| safe to set patch request command without waiting OCP_PHY_PATCH_STAT.
 | |
| 
 | |
| Signed-off-by: Hayes Wang <hayeswang@realtek.com>
 | |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org>
 | |
| ---
 | |
|  drivers/net/usb/r8152.c | 84 ++++++++++++++++++++++++-----------------
 | |
|  1 file changed, 50 insertions(+), 34 deletions(-)
 | |
| 
 | |
| --- a/drivers/net/usb/r8152.c
 | |
| +++ b/drivers/net/usb/r8152.c
 | |
| @@ -3445,59 +3445,76 @@ static void rtl_clear_bp(struct r8152 *t
 | |
|  	ocp_write_word(tp, type, PLA_BP_BA, 0);
 | |
|  }
 | |
|  
 | |
| -static int r8153_patch_request(struct r8152 *tp, bool request)
 | |
| +static int rtl_phy_patch_request(struct r8152 *tp, bool request, bool wait)
 | |
|  {
 | |
| -	u16 data;
 | |
| +	u16 data, check;
 | |
|  	int i;
 | |
|  
 | |
|  	data = ocp_reg_read(tp, OCP_PHY_PATCH_CMD);
 | |
| -	if (request)
 | |
| +	if (request) {
 | |
|  		data |= PATCH_REQUEST;
 | |
| -	else
 | |
| +		check = 0;
 | |
| +	} else {
 | |
|  		data &= ~PATCH_REQUEST;
 | |
| +		check = PATCH_READY;
 | |
| +	}
 | |
|  	ocp_reg_write(tp, OCP_PHY_PATCH_CMD, data);
 | |
|  
 | |
| -	for (i = 0; request && i < 5000; i++) {
 | |
| +	for (i = 0; wait && i < 5000; i++) {
 | |
| +		u32 ocp_data;
 | |
| +
 | |
|  		usleep_range(1000, 2000);
 | |
| -		if (ocp_reg_read(tp, OCP_PHY_PATCH_STAT) & PATCH_READY)
 | |
| +		ocp_data = ocp_reg_read(tp, OCP_PHY_PATCH_STAT);
 | |
| +		if ((ocp_data & PATCH_READY) ^ check)
 | |
|  			break;
 | |
|  	}
 | |
|  
 | |
| -	if (request && !(ocp_reg_read(tp, OCP_PHY_PATCH_STAT) & PATCH_READY)) {
 | |
| -		netif_err(tp, drv, tp->netdev, "patch request fail\n");
 | |
| -		r8153_patch_request(tp, false);
 | |
| +	if (request && wait &&
 | |
| +	    !(ocp_reg_read(tp, OCP_PHY_PATCH_STAT) & PATCH_READY)) {
 | |
| +		dev_err(&tp->intf->dev, "PHY patch request fail\n");
 | |
| +		rtl_phy_patch_request(tp, false, false);
 | |
|  		return -ETIME;
 | |
|  	} else {
 | |
|  		return 0;
 | |
|  	}
 | |
|  }
 | |
|  
 | |
| -static int r8153_pre_ram_code(struct r8152 *tp, u16 key_addr, u16 patch_key)
 | |
| +static void rtl_patch_key_set(struct r8152 *tp, u16 key_addr, u16 patch_key)
 | |
|  {
 | |
| -	if (r8153_patch_request(tp, true)) {
 | |
| -		dev_err(&tp->intf->dev, "patch request fail\n");
 | |
| -		return -ETIME;
 | |
| -	}
 | |
| +	if (patch_key && key_addr) {
 | |
| +		sram_write(tp, key_addr, patch_key);
 | |
| +		sram_write(tp, SRAM_PHY_LOCK, PHY_PATCH_LOCK);
 | |
| +	} else if (key_addr) {
 | |
| +		u16 data;
 | |
|  
 | |
| -	sram_write(tp, key_addr, patch_key);
 | |
| -	sram_write(tp, SRAM_PHY_LOCK, PHY_PATCH_LOCK);
 | |
| +		sram_write(tp, 0x0000, 0x0000);
 | |
|  
 | |
| -	return 0;
 | |
| +		data = ocp_reg_read(tp, OCP_PHY_LOCK);
 | |
| +		data &= ~PATCH_LOCK;
 | |
| +		ocp_reg_write(tp, OCP_PHY_LOCK, data);
 | |
| +
 | |
| +		sram_write(tp, key_addr, 0x0000);
 | |
| +	} else {
 | |
| +		WARN_ON_ONCE(1);
 | |
| +	}
 | |
|  }
 | |
|  
 | |
| -static int r8153_post_ram_code(struct r8152 *tp, u16 key_addr)
 | |
| +static int
 | |
| +rtl_pre_ram_code(struct r8152 *tp, u16 key_addr, u16 patch_key, bool wait)
 | |
|  {
 | |
| -	u16 data;
 | |
| +	if (rtl_phy_patch_request(tp, true, wait))
 | |
| +		return -ETIME;
 | |
|  
 | |
| -	sram_write(tp, 0x0000, 0x0000);
 | |
| +	rtl_patch_key_set(tp, key_addr, patch_key);
 | |
|  
 | |
| -	data = ocp_reg_read(tp, OCP_PHY_LOCK);
 | |
| -	data &= ~PATCH_LOCK;
 | |
| -	ocp_reg_write(tp, OCP_PHY_LOCK, data);
 | |
| +	return 0;
 | |
| +}
 | |
|  
 | |
| -	sram_write(tp, key_addr, 0x0000);
 | |
| +static int rtl_post_ram_code(struct r8152 *tp, u16 key_addr, bool wait)
 | |
| +{
 | |
| +	rtl_patch_key_set(tp, key_addr, 0);
 | |
|  
 | |
| -	r8153_patch_request(tp, false);
 | |
| +	rtl_phy_patch_request(tp, false, wait);
 | |
|  
 | |
|  	ocp_write_word(tp, MCU_TYPE_PLA, PLA_OCP_GPHY_BASE, tp->ocp_base);
 | |
|  
 | |
| @@ -3982,7 +3999,7 @@ static void rtl8152_fw_mac_apply(struct
 | |
|  	dev_dbg(&tp->intf->dev, "successfully applied %s\n", mac->info);
 | |
|  }
 | |
|  
 | |
| -static void rtl8152_apply_firmware(struct r8152 *tp)
 | |
| +static void rtl8152_apply_firmware(struct r8152 *tp, bool power_cut)
 | |
|  {
 | |
|  	struct rtl_fw *rtl_fw = &tp->rtl_fw;
 | |
|  	const struct firmware *fw;
 | |
| @@ -4013,12 +4030,11 @@ static void rtl8152_apply_firmware(struc
 | |
|  		case RTL_FW_PHY_START:
 | |
|  			key = (struct fw_phy_patch_key *)block;
 | |
|  			key_addr = __le16_to_cpu(key->key_reg);
 | |
| -			r8153_pre_ram_code(tp, key_addr,
 | |
| -					   __le16_to_cpu(key->key_data));
 | |
| +			rtl_pre_ram_code(tp, key_addr, __le16_to_cpu(key->key_data), !power_cut);
 | |
|  			break;
 | |
|  		case RTL_FW_PHY_STOP:
 | |
|  			WARN_ON(!key_addr);
 | |
| -			r8153_post_ram_code(tp, key_addr);
 | |
| +			rtl_post_ram_code(tp, key_addr, !power_cut);
 | |
|  			break;
 | |
|  		case RTL_FW_PHY_NC:
 | |
|  			rtl8152_fw_phy_nc_apply(tp, (struct fw_phy_nc *)block);
 | |
| @@ -4223,7 +4239,7 @@ static void rtl8152_disable(struct r8152
 | |
|  
 | |
|  static void r8152b_hw_phy_cfg(struct r8152 *tp)
 | |
|  {
 | |
| -	rtl8152_apply_firmware(tp);
 | |
| +	rtl8152_apply_firmware(tp, false);
 | |
|  	rtl_eee_enable(tp, tp->eee_en);
 | |
|  	r8152_aldps_en(tp, true);
 | |
|  	r8152b_enable_fc(tp);
 | |
| @@ -4505,7 +4521,7 @@ static void r8153_hw_phy_cfg(struct r815
 | |
|  	/* disable EEE before updating the PHY parameters */
 | |
|  	rtl_eee_enable(tp, false);
 | |
|  
 | |
| -	rtl8152_apply_firmware(tp);
 | |
| +	rtl8152_apply_firmware(tp, false);
 | |
|  
 | |
|  	if (tp->version == RTL_VER_03) {
 | |
|  		data = ocp_reg_read(tp, OCP_EEE_CFG);
 | |
| @@ -4579,7 +4595,7 @@ static void r8153b_hw_phy_cfg(struct r81
 | |
|  	/* disable EEE before updating the PHY parameters */
 | |
|  	rtl_eee_enable(tp, false);
 | |
|  
 | |
| -	rtl8152_apply_firmware(tp);
 | |
| +	rtl8152_apply_firmware(tp, false);
 | |
|  
 | |
|  	r8153b_green_en(tp, test_bit(GREEN_ETHERNET, &tp->flags));
 | |
|  
 | |
| @@ -4620,7 +4636,7 @@ static void r8153b_hw_phy_cfg(struct r81
 | |
|  	ocp_write_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR, ocp_data);
 | |
|  
 | |
|  	/* Advnace EEE */
 | |
| -	if (!r8153_patch_request(tp, true)) {
 | |
| +	if (!rtl_phy_patch_request(tp, true, true)) {
 | |
|  		data = ocp_reg_read(tp, OCP_POWER_CFG);
 | |
|  		data |= EEE_CLKDIV_EN;
 | |
|  		ocp_reg_write(tp, OCP_POWER_CFG, data);
 | |
| @@ -4637,7 +4653,7 @@ static void r8153b_hw_phy_cfg(struct r81
 | |
|  		ocp_reg_write(tp, OCP_SYSCLK_CFG, clk_div_expo(5));
 | |
|  		tp->ups_info._250m_ckdiv = true;
 | |
|  
 | |
| -		r8153_patch_request(tp, false);
 | |
| +		rtl_phy_patch_request(tp, false, true);
 | |
|  	}
 | |
|  
 | |
|  	if (tp->eee_en)
 |