aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhayeswang <hayeswang@realtek.com>2014-09-23 04:31:47 -0400
committerDavid S. Miller <davem@davemloft.net>2014-09-26 16:13:17 -0400
commit445f7f4d62628cb2971db884084d162ecb622ec7 (patch)
treee32d834fc77c2018056b0910816cc7ce0b9ee868
parent9026968abe7ad102f4ac5c6d96d733643f75399c (diff)
r8152: fix the carrier off when autoresuming
netif_carrier_off would be called when autoresuming, even though the cable is plugged. This causes some applications do relative actions when detecting the carrier off. Keep the status of the carrier, and let it be modified when the linking change occurs. Signed-off-by: Hayes Wang <hayeswang@realtek.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/usb/r8152.c52
1 files changed, 35 insertions, 17 deletions
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
index 74760e8143e3..e0394427e372 100644
--- a/drivers/net/usb/r8152.c
+++ b/drivers/net/usb/r8152.c
@@ -1949,10 +1949,34 @@ static void rxdy_gated_en(struct r8152 *tp, bool enable)
1949 ocp_write_word(tp, MCU_TYPE_PLA, PLA_MISC_1, ocp_data); 1949 ocp_write_word(tp, MCU_TYPE_PLA, PLA_MISC_1, ocp_data);
1950} 1950}
1951 1951
1952static int rtl_start_rx(struct r8152 *tp)
1953{
1954 int i, ret = 0;
1955
1956 INIT_LIST_HEAD(&tp->rx_done);
1957 for (i = 0; i < RTL8152_MAX_RX; i++) {
1958 INIT_LIST_HEAD(&tp->rx_info[i].list);
1959 ret = r8152_submit_rx(tp, &tp->rx_info[i], GFP_KERNEL);
1960 if (ret)
1961 break;
1962 }
1963
1964 return ret;
1965}
1966
1967static int rtl_stop_rx(struct r8152 *tp)
1968{
1969 int i;
1970
1971 for (i = 0; i < RTL8152_MAX_RX; i++)
1972 usb_kill_urb(tp->rx_info[i].urb);
1973
1974 return 0;
1975}
1976
1952static int rtl_enable(struct r8152 *tp) 1977static int rtl_enable(struct r8152 *tp)
1953{ 1978{
1954 u32 ocp_data; 1979 u32 ocp_data;
1955 int i, ret;
1956 1980
1957 r8152b_reset_packet_filter(tp); 1981 r8152b_reset_packet_filter(tp);
1958 1982
@@ -1962,14 +1986,7 @@ static int rtl_enable(struct r8152 *tp)
1962 1986
1963 rxdy_gated_en(tp, false); 1987 rxdy_gated_en(tp, false);
1964 1988
1965 INIT_LIST_HEAD(&tp->rx_done); 1989 return rtl_start_rx(tp);
1966 ret = 0;
1967 for (i = 0; i < RTL8152_MAX_RX; i++) {
1968 INIT_LIST_HEAD(&tp->rx_info[i].list);
1969 ret |= r8152_submit_rx(tp, &tp->rx_info[i], GFP_KERNEL);
1970 }
1971
1972 return ret;
1973} 1990}
1974 1991
1975static int rtl8152_enable(struct r8152 *tp) 1992static int rtl8152_enable(struct r8152 *tp)
@@ -2053,8 +2070,7 @@ static void rtl_disable(struct r8152 *tp)
2053 mdelay(1); 2070 mdelay(1);
2054 } 2071 }
2055 2072
2056 for (i = 0; i < RTL8152_MAX_RX; i++) 2073 rtl_stop_rx(tp);
2057 usb_kill_urb(tp->rx_info[i].urb);
2058 2074
2059 rtl8152_nic_reset(tp); 2075 rtl8152_nic_reset(tp);
2060} 2076}
@@ -3083,13 +3099,14 @@ static int rtl8152_suspend(struct usb_interface *intf, pm_message_t message)
3083 clear_bit(WORK_ENABLE, &tp->flags); 3099 clear_bit(WORK_ENABLE, &tp->flags);
3084 usb_kill_urb(tp->intr_urb); 3100 usb_kill_urb(tp->intr_urb);
3085 cancel_delayed_work_sync(&tp->schedule); 3101 cancel_delayed_work_sync(&tp->schedule);
3102 tasklet_disable(&tp->tl);
3086 if (test_bit(SELECTIVE_SUSPEND, &tp->flags)) { 3103 if (test_bit(SELECTIVE_SUSPEND, &tp->flags)) {
3104 rtl_stop_rx(tp);
3087 rtl_runtime_suspend_enable(tp, true); 3105 rtl_runtime_suspend_enable(tp, true);
3088 } else { 3106 } else {
3089 tasklet_disable(&tp->tl);
3090 tp->rtl_ops.down(tp); 3107 tp->rtl_ops.down(tp);
3091 tasklet_enable(&tp->tl);
3092 } 3108 }
3109 tasklet_enable(&tp->tl);
3093 } 3110 }
3094 3111
3095 return 0; 3112 return 0;
@@ -3108,17 +3125,18 @@ static int rtl8152_resume(struct usb_interface *intf)
3108 if (test_bit(SELECTIVE_SUSPEND, &tp->flags)) { 3125 if (test_bit(SELECTIVE_SUSPEND, &tp->flags)) {
3109 rtl_runtime_suspend_enable(tp, false); 3126 rtl_runtime_suspend_enable(tp, false);
3110 clear_bit(SELECTIVE_SUSPEND, &tp->flags); 3127 clear_bit(SELECTIVE_SUSPEND, &tp->flags);
3128 set_bit(WORK_ENABLE, &tp->flags);
3111 if (tp->speed & LINK_STATUS) 3129 if (tp->speed & LINK_STATUS)
3112 tp->rtl_ops.disable(tp); 3130 rtl_start_rx(tp);
3113 } else { 3131 } else {
3114 tp->rtl_ops.up(tp); 3132 tp->rtl_ops.up(tp);
3115 rtl8152_set_speed(tp, AUTONEG_ENABLE, 3133 rtl8152_set_speed(tp, AUTONEG_ENABLE,
3116 tp->mii.supports_gmii ? SPEED_1000 : SPEED_100, 3134 tp->mii.supports_gmii ? SPEED_1000 : SPEED_100,
3117 DUPLEX_FULL); 3135 DUPLEX_FULL);
3136 tp->speed = 0;
3137 netif_carrier_off(tp->netdev);
3138 set_bit(WORK_ENABLE, &tp->flags);
3118 } 3139 }
3119 tp->speed = 0;
3120 netif_carrier_off(tp->netdev);
3121 set_bit(WORK_ENABLE, &tp->flags);
3122 usb_submit_urb(tp->intr_urb, GFP_KERNEL); 3140 usb_submit_urb(tp->intr_urb, GFP_KERNEL);
3123 } 3141 }
3124 3142