forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Hayes Wang says: ==================== r8152: fix bugs Patch #1 fix the issue of force speed mode for RTL8156. Patch #2 fix the issue of unexpected ocp_base. ==================== Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
- Loading branch information
Showing
1 changed file
with
39 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -32,7 +32,7 @@ | |
#define NETNEXT_VERSION "12" | ||
|
||
/* Information for net */ | ||
#define NET_VERSION "11" | ||
#define NET_VERSION "12" | ||
|
||
#define DRIVER_VERSION "v1." NETNEXT_VERSION "." NET_VERSION | ||
#define DRIVER_AUTHOR "Realtek linux nic maintainers <[email protected]>" | ||
|
@@ -4016,6 +4016,11 @@ static void rtl_clear_bp(struct r8152 *tp, u16 type) | |
ocp_write_word(tp, type, PLA_BP_BA, 0); | ||
} | ||
|
||
static inline void rtl_reset_ocp_base(struct r8152 *tp) | ||
{ | ||
tp->ocp_base = -1; | ||
} | ||
|
||
static int rtl_phy_patch_request(struct r8152 *tp, bool request, bool wait) | ||
{ | ||
u16 data, check; | ||
|
@@ -4087,8 +4092,6 @@ static int rtl_post_ram_code(struct r8152 *tp, u16 key_addr, bool wait) | |
|
||
rtl_phy_patch_request(tp, false, wait); | ||
|
||
ocp_write_word(tp, MCU_TYPE_PLA, PLA_OCP_GPHY_BASE, tp->ocp_base); | ||
|
||
return 0; | ||
} | ||
|
||
|
@@ -4800,6 +4803,8 @@ static void rtl_ram_code_speed_up(struct r8152 *tp, struct fw_phy_speed_up *phy, | |
u32 len; | ||
u8 *data; | ||
|
||
rtl_reset_ocp_base(tp); | ||
|
||
if (sram_read(tp, SRAM_GPHY_FW_VER) >= __le16_to_cpu(phy->version)) { | ||
dev_dbg(&tp->intf->dev, "PHY firmware has been the newest\n"); | ||
return; | ||
|
@@ -4845,7 +4850,8 @@ static void rtl_ram_code_speed_up(struct r8152 *tp, struct fw_phy_speed_up *phy, | |
} | ||
} | ||
|
||
ocp_write_word(tp, MCU_TYPE_PLA, PLA_OCP_GPHY_BASE, tp->ocp_base); | ||
rtl_reset_ocp_base(tp); | ||
|
||
rtl_phy_patch_request(tp, false, wait); | ||
|
||
if (sram_read(tp, SRAM_GPHY_FW_VER) == __le16_to_cpu(phy->version)) | ||
|
@@ -4861,6 +4867,8 @@ static int rtl8152_fw_phy_ver(struct r8152 *tp, struct fw_phy_ver *phy_ver) | |
ver_addr = __le16_to_cpu(phy_ver->ver.addr); | ||
ver = __le16_to_cpu(phy_ver->ver.data); | ||
|
||
rtl_reset_ocp_base(tp); | ||
|
||
if (sram_read(tp, ver_addr) >= ver) { | ||
dev_dbg(&tp->intf->dev, "PHY firmware has been the newest\n"); | ||
return 0; | ||
|
@@ -4877,6 +4885,8 @@ static void rtl8152_fw_phy_fixup(struct r8152 *tp, struct fw_phy_fixup *fix) | |
{ | ||
u16 addr, data; | ||
|
||
rtl_reset_ocp_base(tp); | ||
|
||
addr = __le16_to_cpu(fix->setting.addr); | ||
data = ocp_reg_read(tp, addr); | ||
|
||
|
@@ -4908,6 +4918,8 @@ static void rtl8152_fw_phy_union_apply(struct r8152 *tp, struct fw_phy_union *ph | |
u32 length; | ||
int i, num; | ||
|
||
rtl_reset_ocp_base(tp); | ||
|
||
num = phy->pre_num; | ||
for (i = 0; i < num; i++) | ||
sram_write(tp, __le16_to_cpu(phy->pre_set[i].addr), | ||
|
@@ -4938,6 +4950,8 @@ static void rtl8152_fw_phy_nc_apply(struct r8152 *tp, struct fw_phy_nc *phy) | |
u32 length, i, num; | ||
__le16 *data; | ||
|
||
rtl_reset_ocp_base(tp); | ||
|
||
mode_reg = __le16_to_cpu(phy->mode_reg); | ||
sram_write(tp, mode_reg, __le16_to_cpu(phy->mode_pre)); | ||
sram_write(tp, __le16_to_cpu(phy->ba_reg), | ||
|
@@ -5107,6 +5121,7 @@ static void rtl8152_apply_firmware(struct r8152 *tp, bool power_cut) | |
if (rtl_fw->post_fw) | ||
rtl_fw->post_fw(tp); | ||
|
||
rtl_reset_ocp_base(tp); | ||
strscpy(rtl_fw->version, fw_hdr->version, RTL_VER_SIZE); | ||
dev_info(&tp->intf->dev, "load %s successfully\n", rtl_fw->version); | ||
} | ||
|
@@ -6584,6 +6599,21 @@ static bool rtl8153_in_nway(struct r8152 *tp) | |
return true; | ||
} | ||
|
||
static void r8156_mdio_force_mode(struct r8152 *tp) | ||
{ | ||
u16 data; | ||
|
||
/* Select force mode through 0xa5b4 bit 15 | ||
* 0: MDIO force mode | ||
* 1: MMD force mode | ||
*/ | ||
data = ocp_reg_read(tp, 0xa5b4); | ||
if (data & BIT(15)) { | ||
data &= ~BIT(15); | ||
ocp_reg_write(tp, 0xa5b4, data); | ||
} | ||
} | ||
|
||
static void set_carrier(struct r8152 *tp) | ||
{ | ||
struct net_device *netdev = tp->netdev; | ||
|
@@ -8016,6 +8046,7 @@ static void r8156_init(struct r8152 *tp) | |
ocp_data |= ACT_ODMA; | ||
ocp_write_byte(tp, MCU_TYPE_USB, USB_BMU_CONFIG, ocp_data); | ||
|
||
r8156_mdio_force_mode(tp); | ||
rtl_tally_reset(tp); | ||
|
||
tp->coalesce = 15000; /* 15 us */ | ||
|
@@ -8145,6 +8176,7 @@ static void r8156b_init(struct r8152 *tp) | |
ocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN); | ||
ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data); | ||
|
||
r8156_mdio_force_mode(tp); | ||
rtl_tally_reset(tp); | ||
|
||
tp->coalesce = 15000; /* 15 us */ | ||
|
@@ -8467,6 +8499,8 @@ static int rtl8152_resume(struct usb_interface *intf) | |
|
||
mutex_lock(&tp->control); | ||
|
||
rtl_reset_ocp_base(tp); | ||
|
||
if (test_bit(SELECTIVE_SUSPEND, &tp->flags)) | ||
ret = rtl8152_runtime_resume(tp); | ||
else | ||
|
@@ -8482,6 +8516,7 @@ static int rtl8152_reset_resume(struct usb_interface *intf) | |
struct r8152 *tp = usb_get_intfdata(intf); | ||
|
||
clear_bit(SELECTIVE_SUSPEND, &tp->flags); | ||
rtl_reset_ocp_base(tp); | ||
tp->rtl_ops.init(tp); | ||
queue_delayed_work(system_long_wq, &tp->hw_phy_work, 0); | ||
set_ethernet_addr(tp, true); | ||
|