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: David S. Miller <davem@davemloft.net>
This commit is contained in:
David S. Miller 2013-11-04 00:48:00 -05:00
commit e9b51a198c
2 changed files with 16 additions and 10 deletions

View File

@ -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)
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;

View File

@ -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,
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,
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;
} }