diff options
author | hayeswang <hayeswang@realtek.com> | 2014-02-05 22:55:48 -0500 |
---|---|---|
committer | Vladislav Zhurba <vzhurba@nvidia.com> | 2018-02-01 16:57:59 -0500 |
commit | 06f49a04d4124b972478203e35b2d4b813494f20 (patch) | |
tree | 19c9ec4c74db455ac76723dbab6307113d90f8df /drivers/net/usb/r8152_shield.c | |
parent | 7cb7f8bba74d266b921326515fe4751734fa4c99 (diff) |
r8152: fix the submission of the interrupt transfer
The submission of the interrupt transfer should be done after setting
the bit of WORK_ENABLE, otherwise the callback function would have
the opportunity to be returned directly.
Clear the bit of WORK_ENABLE before killing the interrupt transfer.
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Preetham Chandru R <pchandru@nvidia.com>
(cherry picked from commit 3d55f44f563de2ab83209e8ead48d922b0d56a65)
Change-Id: Ida14be15f0dd14fe76e2895d6d6b39aa0283c126
Reviewed-on: http://git-master/r/370013
Tested-by: Aly Hirani <ahirani@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: Venkat Moganty <vmoganty@nvidia.com>
Diffstat (limited to 'drivers/net/usb/r8152_shield.c')
-rw-r--r-- | drivers/net/usb/r8152_shield.c | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/drivers/net/usb/r8152_shield.c b/drivers/net/usb/r8152_shield.c index eab078b6e..a28120031 100644 --- a/drivers/net/usb/r8152_shield.c +++ b/drivers/net/usb/r8152_shield.c | |||
@@ -2271,22 +2271,21 @@ static int rtl8152_open(struct net_device *netdev) | |||
2271 | struct r8152 *tp = netdev_priv(netdev); | 2271 | struct r8152 *tp = netdev_priv(netdev); |
2272 | int res = 0; | 2272 | int res = 0; |
2273 | 2273 | ||
2274 | rtl8152_set_speed(tp, AUTONEG_ENABLE, | ||
2275 | tp->mii.supports_gmii ? SPEED_1000 : SPEED_100, | ||
2276 | DUPLEX_FULL); | ||
2277 | tp->speed = 0; | ||
2278 | netif_carrier_off(netdev); | ||
2279 | netif_start_queue(netdev); | ||
2280 | set_bit(WORK_ENABLE, &tp->flags); | ||
2274 | res = usb_submit_urb(tp->intr_urb, GFP_KERNEL); | 2281 | res = usb_submit_urb(tp->intr_urb, GFP_KERNEL); |
2275 | if (res) { | 2282 | if (res) { |
2276 | if (res == -ENODEV) | 2283 | if (res == -ENODEV) |
2277 | netif_device_detach(tp->netdev); | 2284 | netif_device_detach(tp->netdev); |
2278 | netif_warn(tp, ifup, netdev, "intr_urb submit failed: %d\n", | 2285 | netif_warn(tp, ifup, netdev, "intr_urb submit failed: %d\n", |
2279 | res); | 2286 | res); |
2280 | return res; | ||
2281 | } | 2287 | } |
2282 | 2288 | ||
2283 | rtl8152_set_speed(tp, AUTONEG_ENABLE, | ||
2284 | tp->mii.supports_gmii ? SPEED_1000 : SPEED_100, | ||
2285 | DUPLEX_FULL); | ||
2286 | tp->speed = 0; | ||
2287 | netif_carrier_off(netdev); | ||
2288 | netif_start_queue(netdev); | ||
2289 | set_bit(WORK_ENABLE, &tp->flags); | ||
2290 | 2289 | ||
2291 | return res; | 2290 | return res; |
2292 | } | 2291 | } |
@@ -2296,8 +2295,8 @@ static int rtl8152_close(struct net_device *netdev) | |||
2296 | struct r8152 *tp = netdev_priv(netdev); | 2295 | struct r8152 *tp = netdev_priv(netdev); |
2297 | int res = 0; | 2296 | int res = 0; |
2298 | 2297 | ||
2299 | usb_kill_urb(tp->intr_urb); | ||
2300 | clear_bit(WORK_ENABLE, &tp->flags); | 2298 | clear_bit(WORK_ENABLE, &tp->flags); |
2299 | usb_kill_urb(tp->intr_urb); | ||
2301 | cancel_delayed_work_sync(&tp->schedule); | 2300 | cancel_delayed_work_sync(&tp->schedule); |
2302 | netif_stop_queue(netdev); | 2301 | netif_stop_queue(netdev); |
2303 | tasklet_disable(&tp->tl); | 2302 | tasklet_disable(&tp->tl); |