aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/can
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2016-03-08 12:34:12 -0500
committerDavid S. Miller <davem@davemloft.net>2016-03-08 12:34:12 -0500
commit810813c47a564416f6306ae214e2661366c987a7 (patch)
treef0d1f856d4b0024324f642fe519963248828b83f /drivers/net/can
parentd66ab51442211158b677c2f12310c314d9587f74 (diff)
parente2857b8f11a289ed2b61d18d0665e05c1053c446 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Several cases of overlapping changes, as well as one instance (vxlan) of a bug fix in 'net' overlapping with code movement in 'net-next'. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/can')
-rw-r--r--drivers/net/can/spi/mcp251x.c2
-rw-r--r--drivers/net/can/usb/gs_usb.c24
2 files changed, 12 insertions, 14 deletions
diff --git a/drivers/net/can/spi/mcp251x.c b/drivers/net/can/spi/mcp251x.c
index 575790e8a75a..74a7dfecee27 100644
--- a/drivers/net/can/spi/mcp251x.c
+++ b/drivers/net/can/spi/mcp251x.c
@@ -843,7 +843,7 @@ static irqreturn_t mcp251x_can_ist(int irq, void *dev_id)
843 if (clear_intf) 843 if (clear_intf)
844 mcp251x_write_bits(spi, CANINTF, clear_intf, 0x00); 844 mcp251x_write_bits(spi, CANINTF, clear_intf, 0x00);
845 845
846 if (eflag) 846 if (eflag & (EFLG_RX0OVR | EFLG_RX1OVR))
847 mcp251x_write_bits(spi, EFLG, eflag, 0x00); 847 mcp251x_write_bits(spi, EFLG, eflag, 0x00);
848 848
849 /* Update can state */ 849 /* Update can state */
diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c
index 5eee62badf45..cbc99d5649af 100644
--- a/drivers/net/can/usb/gs_usb.c
+++ b/drivers/net/can/usb/gs_usb.c
@@ -826,9 +826,8 @@ static struct gs_can *gs_make_candev(unsigned int channel, struct usb_interface
826static void gs_destroy_candev(struct gs_can *dev) 826static void gs_destroy_candev(struct gs_can *dev)
827{ 827{
828 unregister_candev(dev->netdev); 828 unregister_candev(dev->netdev);
829 free_candev(dev->netdev);
830 usb_kill_anchored_urbs(&dev->tx_submitted); 829 usb_kill_anchored_urbs(&dev->tx_submitted);
831 kfree(dev); 830 free_candev(dev->netdev);
832} 831}
833 832
834static int gs_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) 833static int gs_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
@@ -913,12 +912,15 @@ static int gs_usb_probe(struct usb_interface *intf, const struct usb_device_id *
913 for (i = 0; i < icount; i++) { 912 for (i = 0; i < icount; i++) {
914 dev->canch[i] = gs_make_candev(i, intf); 913 dev->canch[i] = gs_make_candev(i, intf);
915 if (IS_ERR_OR_NULL(dev->canch[i])) { 914 if (IS_ERR_OR_NULL(dev->canch[i])) {
915 /* save error code to return later */
916 rc = PTR_ERR(dev->canch[i]);
917
916 /* on failure destroy previously created candevs */ 918 /* on failure destroy previously created candevs */
917 icount = i; 919 icount = i;
918 for (i = 0; i < icount; i++) { 920 for (i = 0; i < icount; i++)
919 gs_destroy_candev(dev->canch[i]); 921 gs_destroy_candev(dev->canch[i]);
920 dev->canch[i] = NULL; 922
921 } 923 usb_kill_anchored_urbs(&dev->rx_submitted);
922 kfree(dev); 924 kfree(dev);
923 return rc; 925 return rc;
924 } 926 }
@@ -939,16 +941,12 @@ static void gs_usb_disconnect(struct usb_interface *intf)
939 return; 941 return;
940 } 942 }
941 943
942 for (i = 0; i < GS_MAX_INTF; i++) { 944 for (i = 0; i < GS_MAX_INTF; i++)
943 struct gs_can *can = dev->canch[i]; 945 if (dev->canch[i])
944 946 gs_destroy_candev(dev->canch[i]);
945 if (!can)
946 continue;
947
948 gs_destroy_candev(can);
949 }
950 947
951 usb_kill_anchored_urbs(&dev->rx_submitted); 948 usb_kill_anchored_urbs(&dev->rx_submitted);
949 kfree(dev);
952} 950}
953 951
954static const struct usb_device_id gs_usb_table[] = { 952static const struct usb_device_id gs_usb_table[] = {