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>

+16 -10
+3 -3
drivers/net/can/c_can/c_can.c
··· 814 814 msg_ctrl_save = priv->read_reg(priv, 815 815 C_CAN_IFACE(MSGCTRL_REG, 0)); 816 816 817 - if (msg_ctrl_save & IF_MCONT_EOB) 818 - return num_rx_pkts; 819 - 820 817 if (msg_ctrl_save & IF_MCONT_MSGLST) { 821 818 c_can_handle_lost_msg_obj(dev, 0, msg_obj); 822 819 num_rx_pkts++; 823 820 quota--; 824 821 continue; 825 822 } 823 + 824 + if (msg_ctrl_save & IF_MCONT_EOB) 825 + return num_rx_pkts; 826 826 827 827 if (!(msg_ctrl_save & IF_MCONT_NEWDAT)) 828 828 continue;
+13 -7
drivers/net/can/usb/kvaser_usb.c
··· 1544 1544 return 0; 1545 1545 } 1546 1546 1547 - static void kvaser_usb_get_endpoints(const struct usb_interface *intf, 1548 - struct usb_endpoint_descriptor **in, 1549 - struct usb_endpoint_descriptor **out) 1547 + static int kvaser_usb_get_endpoints(const struct usb_interface *intf, 1548 + struct usb_endpoint_descriptor **in, 1549 + struct usb_endpoint_descriptor **out) 1550 1550 { 1551 1551 const struct usb_host_interface *iface_desc; 1552 1552 struct usb_endpoint_descriptor *endpoint; ··· 1557 1557 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { 1558 1558 endpoint = &iface_desc->endpoint[i].desc; 1559 1559 1560 - if (usb_endpoint_is_bulk_in(endpoint)) 1560 + if (!*in && usb_endpoint_is_bulk_in(endpoint)) 1561 1561 *in = endpoint; 1562 1562 1563 - if (usb_endpoint_is_bulk_out(endpoint)) 1563 + if (!*out && usb_endpoint_is_bulk_out(endpoint)) 1564 1564 *out = endpoint; 1565 + 1566 + /* use first bulk endpoint for in and out */ 1567 + if (*in && *out) 1568 + return 0; 1565 1569 } 1570 + 1571 + return -ENODEV; 1566 1572 } 1567 1573 1568 1574 static int kvaser_usb_probe(struct usb_interface *intf, ··· 1582 1576 if (!dev) 1583 1577 return -ENOMEM; 1584 1578 1585 - kvaser_usb_get_endpoints(intf, &dev->bulk_in, &dev->bulk_out); 1586 - if (!dev->bulk_in || !dev->bulk_out) { 1579 + err = kvaser_usb_get_endpoints(intf, &dev->bulk_in, &dev->bulk_out); 1580 + if (err) { 1587 1581 dev_err(&intf->dev, "Cannot get usb endpoint(s)"); 1588 1582 return err; 1589 1583 }