diff options
author | hayeswang <hayeswang@realtek.com> | 2016-06-15 22:55:18 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-06-16 02:39:18 -0400 |
commit | 93fe9b1838404fcc3bea320b704bfa461d8e57a6 (patch) | |
tree | 1adbe1993eb0cf3a770f4f3074a8d8bd162d30b1 /drivers/net/usb | |
parent | 4e384ac19b5be6ad084b215d298b82b3a91ad24b (diff) |
r8152: reset the bmu
Reset the BMU to clear the rx/tx fifo. This avoids that the unexpected
data remains in the hw.
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/usb')
-rw-r--r-- | drivers/net/usb/r8152.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 89dc752f92bd..f5bc351e09ef 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c | |||
@@ -116,6 +116,7 @@ | |||
116 | #define USB_TX_DMA 0xd434 | 116 | #define USB_TX_DMA 0xd434 |
117 | #define USB_TOLERANCE 0xd490 | 117 | #define USB_TOLERANCE 0xd490 |
118 | #define USB_LPM_CTRL 0xd41a | 118 | #define USB_LPM_CTRL 0xd41a |
119 | #define USB_BMU_RESET 0xd4b0 | ||
119 | #define USB_UPS_CTRL 0xd800 | 120 | #define USB_UPS_CTRL 0xd800 |
120 | #define USB_MISC_0 0xd81a | 121 | #define USB_MISC_0 0xd81a |
121 | #define USB_POWER_CUT 0xd80a | 122 | #define USB_POWER_CUT 0xd80a |
@@ -338,6 +339,10 @@ | |||
338 | #define TEST_MODE_DISABLE 0x00000001 | 339 | #define TEST_MODE_DISABLE 0x00000001 |
339 | #define TX_SIZE_ADJUST1 0x00000100 | 340 | #define TX_SIZE_ADJUST1 0x00000100 |
340 | 341 | ||
342 | /* USB_BMU_RESET */ | ||
343 | #define BMU_RESET_EP_IN 0x01 | ||
344 | #define BMU_RESET_EP_OUT 0x02 | ||
345 | |||
341 | /* USB_UPS_CTRL */ | 346 | /* USB_UPS_CTRL */ |
342 | #define POWER_CUT 0x0100 | 347 | #define POWER_CUT 0x0100 |
343 | 348 | ||
@@ -2456,6 +2461,17 @@ static void r8153_teredo_off(struct r8152 *tp) | |||
2456 | ocp_write_dword(tp, MCU_TYPE_PLA, PLA_TEREDO_TIMER, 0); | 2461 | ocp_write_dword(tp, MCU_TYPE_PLA, PLA_TEREDO_TIMER, 0); |
2457 | } | 2462 | } |
2458 | 2463 | ||
2464 | static void rtl_reset_bmu(struct r8152 *tp) | ||
2465 | { | ||
2466 | u32 ocp_data; | ||
2467 | |||
2468 | ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_BMU_RESET); | ||
2469 | ocp_data &= ~(BMU_RESET_EP_IN | BMU_RESET_EP_OUT); | ||
2470 | ocp_write_byte(tp, MCU_TYPE_USB, USB_BMU_RESET, ocp_data); | ||
2471 | ocp_data |= BMU_RESET_EP_IN | BMU_RESET_EP_OUT; | ||
2472 | ocp_write_byte(tp, MCU_TYPE_USB, USB_BMU_RESET, ocp_data); | ||
2473 | } | ||
2474 | |||
2459 | static void r8152_aldps_en(struct r8152 *tp, bool enable) | 2475 | static void r8152_aldps_en(struct r8152 *tp, bool enable) |
2460 | { | 2476 | { |
2461 | if (enable) { | 2477 | if (enable) { |
@@ -2681,6 +2697,7 @@ static void r8153_first_init(struct r8152 *tp) | |||
2681 | r8153_hw_phy_cfg(tp); | 2697 | r8153_hw_phy_cfg(tp); |
2682 | 2698 | ||
2683 | rtl8152_nic_reset(tp); | 2699 | rtl8152_nic_reset(tp); |
2700 | rtl_reset_bmu(tp); | ||
2684 | 2701 | ||
2685 | ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL); | 2702 | ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL); |
2686 | ocp_data &= ~NOW_IS_OOB; | 2703 | ocp_data &= ~NOW_IS_OOB; |
@@ -2742,6 +2759,7 @@ static void r8153_enter_oob(struct r8152 *tp) | |||
2742 | ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data); | 2759 | ocp_write_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL, ocp_data); |
2743 | 2760 | ||
2744 | rtl_disable(tp); | 2761 | rtl_disable(tp); |
2762 | rtl_reset_bmu(tp); | ||
2745 | 2763 | ||
2746 | for (i = 0; i < 1000; i++) { | 2764 | for (i = 0; i < 1000; i++) { |
2747 | ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL); | 2765 | ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_OOB_CTRL); |
@@ -2803,6 +2821,7 @@ static void rtl8153_disable(struct r8152 *tp) | |||
2803 | { | 2821 | { |
2804 | r8153_aldps_en(tp, false); | 2822 | r8153_aldps_en(tp, false); |
2805 | rtl_disable(tp); | 2823 | rtl_disable(tp); |
2824 | rtl_reset_bmu(tp); | ||
2806 | r8153_aldps_en(tp, true); | 2825 | r8153_aldps_en(tp, true); |
2807 | usb_enable_lpm(tp->udev); | 2826 | usb_enable_lpm(tp->udev); |
2808 | } | 2827 | } |