Commit e9b51a19 authored by David S. Miller's avatar David S. Miller

Merge branch 'fixes-for-3.12' of git://gitorious.org/linux-can/linux-can

Marc Kleine-Budde says:

====================
I have two late fixes for the v3.12 release:

The first patch fixes a problem in the c_can's RX message handling, which can
lead to an endless interrupt loop under heavy load if messages are lost. The
second patch is by Olivier Sobrie and fixes the endpoint detection of the
kvaser_usb driver, which is needed for some devices.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 7926c1d5 896e23bd
...@@ -814,9 +814,6 @@ static int c_can_do_rx_poll(struct net_device *dev, int quota) ...@@ -814,9 +814,6 @@ static int c_can_do_rx_poll(struct net_device *dev, int quota)
msg_ctrl_save = priv->read_reg(priv, msg_ctrl_save = priv->read_reg(priv,
C_CAN_IFACE(MSGCTRL_REG, 0)); C_CAN_IFACE(MSGCTRL_REG, 0));
if (msg_ctrl_save & IF_MCONT_EOB)
return num_rx_pkts;
if (msg_ctrl_save & IF_MCONT_MSGLST) { if (msg_ctrl_save & IF_MCONT_MSGLST) {
c_can_handle_lost_msg_obj(dev, 0, msg_obj); c_can_handle_lost_msg_obj(dev, 0, msg_obj);
num_rx_pkts++; num_rx_pkts++;
...@@ -824,6 +821,9 @@ static int c_can_do_rx_poll(struct net_device *dev, int quota) ...@@ -824,6 +821,9 @@ static int c_can_do_rx_poll(struct net_device *dev, int quota)
continue; continue;
} }
if (msg_ctrl_save & IF_MCONT_EOB)
return num_rx_pkts;
if (!(msg_ctrl_save & IF_MCONT_NEWDAT)) if (!(msg_ctrl_save & IF_MCONT_NEWDAT))
continue; continue;
......
...@@ -1544,9 +1544,9 @@ static int kvaser_usb_init_one(struct usb_interface *intf, ...@@ -1544,9 +1544,9 @@ static int kvaser_usb_init_one(struct usb_interface *intf,
return 0; return 0;
} }
static void kvaser_usb_get_endpoints(const struct usb_interface *intf, static int kvaser_usb_get_endpoints(const struct usb_interface *intf,
struct usb_endpoint_descriptor **in, struct usb_endpoint_descriptor **in,
struct usb_endpoint_descriptor **out) struct usb_endpoint_descriptor **out)
{ {
const struct usb_host_interface *iface_desc; const struct usb_host_interface *iface_desc;
struct usb_endpoint_descriptor *endpoint; struct usb_endpoint_descriptor *endpoint;
...@@ -1557,12 +1557,18 @@ static void kvaser_usb_get_endpoints(const struct usb_interface *intf, ...@@ -1557,12 +1557,18 @@ static void kvaser_usb_get_endpoints(const struct usb_interface *intf,
for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
endpoint = &iface_desc->endpoint[i].desc; endpoint = &iface_desc->endpoint[i].desc;
if (usb_endpoint_is_bulk_in(endpoint)) if (!*in && usb_endpoint_is_bulk_in(endpoint))
*in = endpoint; *in = endpoint;
if (usb_endpoint_is_bulk_out(endpoint)) if (!*out && usb_endpoint_is_bulk_out(endpoint))
*out = endpoint; *out = endpoint;
/* use first bulk endpoint for in and out */
if (*in && *out)
return 0;
} }
return -ENODEV;
} }
static int kvaser_usb_probe(struct usb_interface *intf, static int kvaser_usb_probe(struct usb_interface *intf,
...@@ -1576,8 +1582,8 @@ static int kvaser_usb_probe(struct usb_interface *intf, ...@@ -1576,8 +1582,8 @@ static int kvaser_usb_probe(struct usb_interface *intf,
if (!dev) if (!dev)
return -ENOMEM; return -ENOMEM;
kvaser_usb_get_endpoints(intf, &dev->bulk_in, &dev->bulk_out); err = kvaser_usb_get_endpoints(intf, &dev->bulk_in, &dev->bulk_out);
if (!dev->bulk_in || !dev->bulk_out) { if (err) {
dev_err(&intf->dev, "Cannot get usb endpoint(s)"); dev_err(&intf->dev, "Cannot get usb endpoint(s)");
return err; return err;
} }
......
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