]> git.itanic.dy.fi Git - linux-stable/blobdiff - drivers/net/can/usb/gs_usb.c
can: gs_usb: gs_can_open(): fix race dev->can.state condition
[linux-stable] / drivers / net / can / usb / gs_usb.c
index d3a658b444b5f645fb7a579190fe7379bae1279c..092cd51b3926e1ddf5478b0dc1fd2b18f55c0b4c 100644 (file)
@@ -824,6 +824,7 @@ static int gs_can_open(struct net_device *netdev)
                flags |= GS_CAN_MODE_TRIPLE_SAMPLE;
 
        /* finally start device */
+       dev->can.state = CAN_STATE_ERROR_ACTIVE;
        dm->mode = cpu_to_le32(GS_CAN_MODE_START);
        dm->flags = cpu_to_le32(flags);
        rc = usb_control_msg(interface_to_usbdev(dev->iface),
@@ -835,13 +836,12 @@ static int gs_can_open(struct net_device *netdev)
        if (rc < 0) {
                netdev_err(netdev, "Couldn't start device (err=%d)\n", rc);
                kfree(dm);
+               dev->can.state = CAN_STATE_STOPPED;
                return rc;
        }
 
        kfree(dm);
 
-       dev->can.state = CAN_STATE_ERROR_ACTIVE;
-
        parent->active_channels++;
        if (!(dev->can.ctrlmode & CAN_CTRLMODE_LISTENONLY))
                netif_start_queue(netdev);