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