Commit 48051c37 authored by David S. Miller's avatar David S. Miller

Merge tag 'linux-can-fixes-for-4.11-20170303' of...

Merge tag 'linux-can-fixes-for-4.11-20170303' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can

Marc Kleine-Budde says:

====================
pull-request: can 2017-03-03

this is a pull request for the upcoming v4.11 release.

There are two patches by Ethan Zonca for the gs_usb driver, the first one fixes
the memory used for USB transfers, the second one the coding style.

The last two patches are by me, one fixing a memory leak in the usb_8dev driver
the other a typo in the flexcan driver.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents a8d63a53 66ddb821
...@@ -196,7 +196,7 @@ ...@@ -196,7 +196,7 @@
#define FLEXCAN_QUIRK_BROKEN_ERR_STATE BIT(1) /* [TR]WRN_INT not connected */ #define FLEXCAN_QUIRK_BROKEN_ERR_STATE BIT(1) /* [TR]WRN_INT not connected */
#define FLEXCAN_QUIRK_DISABLE_RXFG BIT(2) /* Disable RX FIFO Global mask */ #define FLEXCAN_QUIRK_DISABLE_RXFG BIT(2) /* Disable RX FIFO Global mask */
#define FLEXCAN_QUIRK_ENABLE_EACEN_RRS BIT(3) /* Enable EACEN and RRS bit in ctrl2 */ #define FLEXCAN_QUIRK_ENABLE_EACEN_RRS BIT(3) /* Enable EACEN and RRS bit in ctrl2 */
#define FLEXCAN_QUIRK_DISABLE_MECR BIT(4) /* Disble Memory error detection */ #define FLEXCAN_QUIRK_DISABLE_MECR BIT(4) /* Disable Memory error detection */
#define FLEXCAN_QUIRK_USE_OFF_TIMESTAMP BIT(5) /* Use timestamp based offloading */ #define FLEXCAN_QUIRK_USE_OFF_TIMESTAMP BIT(5) /* Use timestamp based offloading */
/* Structure of the message buffer */ /* Structure of the message buffer */
......
...@@ -258,7 +258,7 @@ static int gs_cmd_reset(struct gs_usb *gsusb, struct gs_can *gsdev) ...@@ -258,7 +258,7 @@ static int gs_cmd_reset(struct gs_usb *gsusb, struct gs_can *gsdev)
rc = usb_control_msg(interface_to_usbdev(intf), rc = usb_control_msg(interface_to_usbdev(intf),
usb_sndctrlpipe(interface_to_usbdev(intf), 0), usb_sndctrlpipe(interface_to_usbdev(intf), 0),
GS_USB_BREQ_MODE, GS_USB_BREQ_MODE,
USB_DIR_OUT|USB_TYPE_VENDOR|USB_RECIP_INTERFACE, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
gsdev->channel, gsdev->channel,
0, 0,
dm, dm,
...@@ -432,7 +432,7 @@ static int gs_usb_set_bittiming(struct net_device *netdev) ...@@ -432,7 +432,7 @@ static int gs_usb_set_bittiming(struct net_device *netdev)
rc = usb_control_msg(interface_to_usbdev(intf), rc = usb_control_msg(interface_to_usbdev(intf),
usb_sndctrlpipe(interface_to_usbdev(intf), 0), usb_sndctrlpipe(interface_to_usbdev(intf), 0),
GS_USB_BREQ_BITTIMING, GS_USB_BREQ_BITTIMING,
USB_DIR_OUT|USB_TYPE_VENDOR|USB_RECIP_INTERFACE, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
dev->channel, dev->channel,
0, 0,
dbt, dbt,
...@@ -546,7 +546,6 @@ static netdev_tx_t gs_can_start_xmit(struct sk_buff *skb, ...@@ -546,7 +546,6 @@ static netdev_tx_t gs_can_start_xmit(struct sk_buff *skb,
hf, hf,
urb->transfer_dma); urb->transfer_dma);
if (rc == -ENODEV) { if (rc == -ENODEV) {
netif_device_detach(netdev); netif_device_detach(netdev);
} else { } else {
...@@ -804,7 +803,7 @@ static struct gs_can *gs_make_candev(unsigned int channel, ...@@ -804,7 +803,7 @@ static struct gs_can *gs_make_candev(unsigned int channel,
rc = usb_control_msg(interface_to_usbdev(intf), rc = usb_control_msg(interface_to_usbdev(intf),
usb_rcvctrlpipe(interface_to_usbdev(intf), 0), usb_rcvctrlpipe(interface_to_usbdev(intf), 0),
GS_USB_BREQ_BT_CONST, GS_USB_BREQ_BT_CONST,
USB_DIR_IN|USB_TYPE_VENDOR|USB_RECIP_INTERFACE, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
channel, channel,
0, 0,
bt_const, bt_const,
...@@ -908,57 +907,72 @@ static int gs_usb_probe(struct usb_interface *intf, ...@@ -908,57 +907,72 @@ static int gs_usb_probe(struct usb_interface *intf,
struct gs_usb *dev; struct gs_usb *dev;
int rc = -ENOMEM; int rc = -ENOMEM;
unsigned int icount, i; unsigned int icount, i;
struct gs_host_config hconf = { struct gs_host_config *hconf;
.byte_order = 0x0000beef, struct gs_device_config *dconf;
};
struct gs_device_config dconf; hconf = kmalloc(sizeof(*hconf), GFP_KERNEL);
if (!hconf)
return -ENOMEM;
hconf->byte_order = 0x0000beef;
/* send host config */ /* send host config */
rc = usb_control_msg(interface_to_usbdev(intf), rc = usb_control_msg(interface_to_usbdev(intf),
usb_sndctrlpipe(interface_to_usbdev(intf), 0), usb_sndctrlpipe(interface_to_usbdev(intf), 0),
GS_USB_BREQ_HOST_FORMAT, GS_USB_BREQ_HOST_FORMAT,
USB_DIR_OUT|USB_TYPE_VENDOR|USB_RECIP_INTERFACE, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
1, 1,
intf->altsetting[0].desc.bInterfaceNumber, intf->altsetting[0].desc.bInterfaceNumber,
&hconf, hconf,
sizeof(hconf), sizeof(*hconf),
1000); 1000);
kfree(hconf);
if (rc < 0) { if (rc < 0) {
dev_err(&intf->dev, "Couldn't send data format (err=%d)\n", dev_err(&intf->dev, "Couldn't send data format (err=%d)\n",
rc); rc);
return rc; return rc;
} }
dconf = kmalloc(sizeof(*dconf), GFP_KERNEL);
if (!dconf)
return -ENOMEM;
/* read device config */ /* read device config */
rc = usb_control_msg(interface_to_usbdev(intf), rc = usb_control_msg(interface_to_usbdev(intf),
usb_rcvctrlpipe(interface_to_usbdev(intf), 0), usb_rcvctrlpipe(interface_to_usbdev(intf), 0),
GS_USB_BREQ_DEVICE_CONFIG, GS_USB_BREQ_DEVICE_CONFIG,
USB_DIR_IN|USB_TYPE_VENDOR|USB_RECIP_INTERFACE, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
1, 1,
intf->altsetting[0].desc.bInterfaceNumber, intf->altsetting[0].desc.bInterfaceNumber,
&dconf, dconf,
sizeof(dconf), sizeof(*dconf),
1000); 1000);
if (rc < 0) { if (rc < 0) {
dev_err(&intf->dev, "Couldn't get device config: (err=%d)\n", dev_err(&intf->dev, "Couldn't get device config: (err=%d)\n",
rc); rc);
kfree(dconf);
return rc; return rc;
} }
icount = dconf.icount + 1; icount = dconf->icount + 1;
dev_info(&intf->dev, "Configuring for %d interfaces\n", icount); dev_info(&intf->dev, "Configuring for %d interfaces\n", icount);
if (icount > GS_MAX_INTF) { if (icount > GS_MAX_INTF) {
dev_err(&intf->dev, dev_err(&intf->dev,
"Driver cannot handle more that %d CAN interfaces\n", "Driver cannot handle more that %d CAN interfaces\n",
GS_MAX_INTF); GS_MAX_INTF);
kfree(dconf);
return -EINVAL; return -EINVAL;
} }
dev = kzalloc(sizeof(*dev), GFP_KERNEL); dev = kzalloc(sizeof(*dev), GFP_KERNEL);
if (!dev) if (!dev) {
kfree(dconf);
return -ENOMEM; return -ENOMEM;
}
init_usb_anchor(&dev->rx_submitted); init_usb_anchor(&dev->rx_submitted);
atomic_set(&dev->active_channels, 0); atomic_set(&dev->active_channels, 0);
...@@ -967,7 +981,7 @@ static int gs_usb_probe(struct usb_interface *intf, ...@@ -967,7 +981,7 @@ static int gs_usb_probe(struct usb_interface *intf,
dev->udev = interface_to_usbdev(intf); dev->udev = interface_to_usbdev(intf);
for (i = 0; i < icount; i++) { for (i = 0; i < icount; i++) {
dev->canch[i] = gs_make_candev(i, intf, &dconf); dev->canch[i] = gs_make_candev(i, intf, dconf);
if (IS_ERR_OR_NULL(dev->canch[i])) { if (IS_ERR_OR_NULL(dev->canch[i])) {
/* save error code to return later */ /* save error code to return later */
rc = PTR_ERR(dev->canch[i]); rc = PTR_ERR(dev->canch[i]);
...@@ -978,12 +992,15 @@ static int gs_usb_probe(struct usb_interface *intf, ...@@ -978,12 +992,15 @@ static int gs_usb_probe(struct usb_interface *intf,
gs_destroy_candev(dev->canch[i]); gs_destroy_candev(dev->canch[i]);
usb_kill_anchored_urbs(&dev->rx_submitted); usb_kill_anchored_urbs(&dev->rx_submitted);
kfree(dconf);
kfree(dev); kfree(dev);
return rc; return rc;
} }
dev->canch[i]->parent = dev; dev->canch[i]->parent = dev;
} }
kfree(dconf);
return 0; return 0;
} }
......
...@@ -951,8 +951,8 @@ static int usb_8dev_probe(struct usb_interface *intf, ...@@ -951,8 +951,8 @@ static int usb_8dev_probe(struct usb_interface *intf,
for (i = 0; i < MAX_TX_URBS; i++) for (i = 0; i < MAX_TX_URBS; i++)
priv->tx_contexts[i].echo_index = MAX_TX_URBS; priv->tx_contexts[i].echo_index = MAX_TX_URBS;
priv->cmd_msg_buffer = kzalloc(sizeof(struct usb_8dev_cmd_msg), priv->cmd_msg_buffer = devm_kzalloc(&intf->dev, sizeof(struct usb_8dev_cmd_msg),
GFP_KERNEL); GFP_KERNEL);
if (!priv->cmd_msg_buffer) if (!priv->cmd_msg_buffer)
goto cleanup_candev; goto cleanup_candev;
...@@ -966,7 +966,7 @@ static int usb_8dev_probe(struct usb_interface *intf, ...@@ -966,7 +966,7 @@ static int usb_8dev_probe(struct usb_interface *intf,
if (err) { if (err) {
netdev_err(netdev, netdev_err(netdev,
"couldn't register CAN device: %d\n", err); "couldn't register CAN device: %d\n", err);
goto cleanup_cmd_msg_buffer; goto cleanup_candev;
} }
err = usb_8dev_cmd_version(priv, &version); err = usb_8dev_cmd_version(priv, &version);
...@@ -987,9 +987,6 @@ static int usb_8dev_probe(struct usb_interface *intf, ...@@ -987,9 +987,6 @@ static int usb_8dev_probe(struct usb_interface *intf,
cleanup_unregister_candev: cleanup_unregister_candev:
unregister_netdev(priv->netdev); unregister_netdev(priv->netdev);
cleanup_cmd_msg_buffer:
kfree(priv->cmd_msg_buffer);
cleanup_candev: cleanup_candev:
free_candev(netdev); free_candev(netdev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment