summaryrefslogtreecommitdiffstats
path: root/drivers/net/usb/r8152_shield.c
diff options
context:
space:
mode:
authorhayeswang <hayeswang@realtek.com>2014-02-05 22:55:48 -0500
committerVladislav Zhurba <vzhurba@nvidia.com>2018-02-01 16:57:59 -0500
commit06f49a04d4124b972478203e35b2d4b813494f20 (patch)
tree19c9ec4c74db455ac76723dbab6307113d90f8df /drivers/net/usb/r8152_shield.c
parent7cb7f8bba74d266b921326515fe4751734fa4c99 (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.c17
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);