linux-can-fixes-for-4.0-20150309
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABCAAGBQJU/Wr5AAoJECte4hHFiupUFfMQAIBg9+GPuBfj60hj47FMrQ3B 93MoIMdYKhkF/cifsWb9xhdOQAMm6ET6DRoJHOxIgEW8twq6R6JFncrB42mA5b/P kyKVon31PNh2Rdsdn+NaFcuRQSa3Tj7LHeJ53IU82c7V7/WMu3vcBEs4afv7lg+l bH16iyDMfD3EmzKUl4ul2VqKGGdNISpx8T/y4Spml1ZUWhGAIXh6TSu+E9seZIrP 11fDysK7hRRliXEgzUWX/C6fsNzsWGN8oHFI0s1dIQ4rXPASOFcJpDtUM70+iBmF arEJXkYD/RrC+olWS8h71Zq4uVVMj6kbUI+w8T8UL9nHA6Rv50Dlq2ZqxsPYeRNB ZikaGpK2l9XgSxt9YaITMidUC6Q/C5TaALTun/oGZVpF6SY/8zZQKQHkbckFtbDH ZPD7BRuUFc75wdBV2Qib/nugz1Ado43acZG/Ge0YFYpCIy6d5vtOHCXW5YCafil9 VStmKBN1Vnxnq4HcSBuEsl0qi7rv2RpUF0hEOofzoj++iMFKumjDsXpHcc4U459B vnjb4LBqpw1ygpzEBBe8gkQa0zpb3vgNI84AKOfKy6FAZTQWXvCOT55oKys/os9G +KJdF+PjpBVCMvtdKrD8Q0P0zYKmz+Ij57tNOaT1MoqrmpYxcrv7iSYaLrRQp3pd z55cOGViLtHmB9lPVP5B =B2aY -----END PGP SIGNATURE----- Merge tag 'linux-can-fixes-for-4.0-20150309' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can Marc Kleine-Budde says: ==================== pull-request: can 2015-03-09 this is a pull request for net/master for the 4.0 release cycle, it consists of 6 patches: A patch by Oliver Hartkopp fixes a long outstanding bug in the infrastructure, which leads to skb_under_panics when CAN interfaces are used by AF_PACKET sockets e.g. by dhclient. Stephane Grosjean contributes a patch for the peak_usb driver which adds a missing initialization. Two patches by Ahmed S. Darwish fix problems in the kvaser_usb driver. Followed by two patches by myself, updating the MAINTAINERS file ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
d03725044a
5 changed files with 49 additions and 19 deletions
|
@ -2369,8 +2369,9 @@ F: arch/x86/include/asm/tce.h
|
|||
|
||||
CAN NETWORK LAYER
|
||||
M: Oliver Hartkopp <socketcan@hartkopp.net>
|
||||
M: Marc Kleine-Budde <mkl@pengutronix.de>
|
||||
L: linux-can@vger.kernel.org
|
||||
W: http://gitorious.org/linux-can
|
||||
W: https://github.com/linux-can
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next.git
|
||||
S: Maintained
|
||||
|
@ -2386,7 +2387,7 @@ CAN NETWORK DRIVERS
|
|||
M: Wolfgang Grandegger <wg@grandegger.com>
|
||||
M: Marc Kleine-Budde <mkl@pengutronix.de>
|
||||
L: linux-can@vger.kernel.org
|
||||
W: http://gitorious.org/linux-can
|
||||
W: https://github.com/linux-can
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next.git
|
||||
S: Maintained
|
||||
|
|
|
@ -579,6 +579,10 @@ struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf)
|
|||
skb->pkt_type = PACKET_BROADCAST;
|
||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
|
||||
skb_reset_mac_header(skb);
|
||||
skb_reset_network_header(skb);
|
||||
skb_reset_transport_header(skb);
|
||||
|
||||
can_skb_reserve(skb);
|
||||
can_skb_prv(skb)->ifindex = dev->ifindex;
|
||||
|
||||
|
@ -603,6 +607,10 @@ struct sk_buff *alloc_canfd_skb(struct net_device *dev,
|
|||
skb->pkt_type = PACKET_BROADCAST;
|
||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
|
||||
skb_reset_mac_header(skb);
|
||||
skb_reset_network_header(skb);
|
||||
skb_reset_transport_header(skb);
|
||||
|
||||
can_skb_reserve(skb);
|
||||
can_skb_prv(skb)->ifindex = dev->ifindex;
|
||||
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
* Copyright (C) 2015 Valeo S.A.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/netdevice.h>
|
||||
|
@ -584,8 +585,15 @@ static int kvaser_usb_wait_msg(const struct kvaser_usb *dev, u8 id,
|
|||
while (pos <= actual_len - MSG_HEADER_LEN) {
|
||||
tmp = buf + pos;
|
||||
|
||||
if (!tmp->len)
|
||||
break;
|
||||
/* Handle messages crossing the USB endpoint max packet
|
||||
* size boundary. Check kvaser_usb_read_bulk_callback()
|
||||
* for further details.
|
||||
*/
|
||||
if (tmp->len == 0) {
|
||||
pos = round_up(pos,
|
||||
dev->bulk_in->wMaxPacketSize);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (pos + tmp->len > actual_len) {
|
||||
dev_err(dev->udev->dev.parent,
|
||||
|
@ -787,7 +795,6 @@ static int kvaser_usb_simple_msg_async(struct kvaser_usb_net_priv *priv,
|
|||
netdev_err(netdev, "Error transmitting URB\n");
|
||||
usb_unanchor_urb(urb);
|
||||
usb_free_urb(urb);
|
||||
kfree(buf);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -1317,8 +1324,19 @@ static void kvaser_usb_read_bulk_callback(struct urb *urb)
|
|||
while (pos <= urb->actual_length - MSG_HEADER_LEN) {
|
||||
msg = urb->transfer_buffer + pos;
|
||||
|
||||
if (!msg->len)
|
||||
break;
|
||||
/* The Kvaser firmware can only read and write messages that
|
||||
* does not cross the USB's endpoint wMaxPacketSize boundary.
|
||||
* If a follow-up command crosses such boundary, firmware puts
|
||||
* a placeholder zero-length command in its place then aligns
|
||||
* the real command to the next max packet size.
|
||||
*
|
||||
* Handle such cases or we're going to miss a significant
|
||||
* number of events in case of a heavy rx load on the bus.
|
||||
*/
|
||||
if (msg->len == 0) {
|
||||
pos = round_up(pos, dev->bulk_in->wMaxPacketSize);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (pos + msg->len > urb->actual_length) {
|
||||
dev_err(dev->udev->dev.parent, "Format error\n");
|
||||
|
@ -1326,7 +1344,6 @@ static void kvaser_usb_read_bulk_callback(struct urb *urb)
|
|||
}
|
||||
|
||||
kvaser_usb_handle_message(dev, msg);
|
||||
|
||||
pos += msg->len;
|
||||
}
|
||||
|
||||
|
@ -1615,8 +1632,7 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb,
|
|||
struct urb *urb;
|
||||
void *buf;
|
||||
struct kvaser_msg *msg;
|
||||
int i, err;
|
||||
int ret = NETDEV_TX_OK;
|
||||
int i, err, ret = NETDEV_TX_OK;
|
||||
u8 *msg_tx_can_flags = NULL; /* GCC */
|
||||
|
||||
if (can_dropped_invalid_skb(netdev, skb))
|
||||
|
@ -1634,7 +1650,7 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb,
|
|||
if (!buf) {
|
||||
stats->tx_dropped++;
|
||||
dev_kfree_skb(skb);
|
||||
goto nobufmem;
|
||||
goto freeurb;
|
||||
}
|
||||
|
||||
msg = buf;
|
||||
|
@ -1681,8 +1697,10 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb,
|
|||
/* This should never happen; it implies a flow control bug */
|
||||
if (!context) {
|
||||
netdev_warn(netdev, "cannot find free context\n");
|
||||
|
||||
kfree(buf);
|
||||
ret = NETDEV_TX_BUSY;
|
||||
goto releasebuf;
|
||||
goto freeurb;
|
||||
}
|
||||
|
||||
context->priv = priv;
|
||||
|
@ -1719,16 +1737,12 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb,
|
|||
else
|
||||
netdev_warn(netdev, "Failed tx_urb %d\n", err);
|
||||
|
||||
goto releasebuf;
|
||||
goto freeurb;
|
||||
}
|
||||
|
||||
usb_free_urb(urb);
|
||||
ret = NETDEV_TX_OK;
|
||||
|
||||
return NETDEV_TX_OK;
|
||||
|
||||
releasebuf:
|
||||
kfree(buf);
|
||||
nobufmem:
|
||||
freeurb:
|
||||
usb_free_urb(urb);
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -879,6 +879,10 @@ static int pcan_usb_fd_init(struct peak_usb_device *dev)
|
|||
|
||||
pdev->usb_if = ppdev->usb_if;
|
||||
pdev->cmd_buffer_addr = ppdev->cmd_buffer_addr;
|
||||
|
||||
/* do a copy of the ctrlmode[_supported] too */
|
||||
dev->can.ctrlmode = ppdev->dev.can.ctrlmode;
|
||||
dev->can.ctrlmode_supported = ppdev->dev.can.ctrlmode_supported;
|
||||
}
|
||||
|
||||
pdev->usb_if->dev[dev->ctrl_idx] = dev;
|
||||
|
|
|
@ -259,6 +259,9 @@ int can_send(struct sk_buff *skb, int loop)
|
|||
goto inval_skb;
|
||||
}
|
||||
|
||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
|
||||
skb_reset_mac_header(skb);
|
||||
skb_reset_network_header(skb);
|
||||
skb_reset_transport_header(skb);
|
||||
|
||||
|
|
Loading…
Reference in a new issue