aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/usb
diff options
context:
space:
mode:
authorhayeswang <hayeswang@realtek.com>2016-06-15 22:55:18 -0400
committerDavid S. Miller <davem@davemloft.net>2016-06-16 02:39:18 -0400
commit93fe9b1838404fcc3bea320b704bfa461d8e57a6 (patch)
tree1adbe1993eb0cf3a770f4f3074a8d8bd162d30b1 /drivers/net/usb
parent4e384ac19b5be6ad084b215d298b82b3a91ad24b (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.c19
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
2464static 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
2459static void r8152_aldps_en(struct r8152 *tp, bool enable) 2475static 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}