Skip to content

Commit

Permalink
Merge tag 'linux-can-fixes-for-4.0-20150309' of git://git.kernel.org/…
Browse files Browse the repository at this point in the history
…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 <[email protected]>
  • Loading branch information
davem330 committed Mar 9, 2015
2 parents c247f05 + f7214cf commit d037250
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 19 deletions.
5 changes: 3 additions & 2 deletions MAINTAINERS
Original file line number Diff line number Diff line change
Expand Up @@ -2369,8 +2369,9 @@ F: arch/x86/include/asm/tce.h

CAN NETWORK LAYER
M: Oliver Hartkopp <[email protected]>
M: Marc Kleine-Budde <[email protected]>
L: [email protected]
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
Expand All @@ -2386,7 +2387,7 @@ CAN NETWORK DRIVERS
M: Wolfgang Grandegger <[email protected]>
M: Marc Kleine-Budde <[email protected]>
L: [email protected]
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
Expand Down
8 changes: 8 additions & 0 deletions drivers/net/can/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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;

Expand Down
48 changes: 31 additions & 17 deletions drivers/net/can/usb/kvaser_usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -1317,16 +1324,26 @@ 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");
break;
}

kvaser_usb_handle_message(dev, msg);

pos += msg->len;
}

Expand Down Expand Up @@ -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))
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);

return NETDEV_TX_OK;
ret = NETDEV_TX_OK;

releasebuf:
kfree(buf);
nobufmem:
freeurb:
usb_free_urb(urb);
return ret;
}
Expand Down
4 changes: 4 additions & 0 deletions drivers/net/can/usb/peak_usb/pcan_usb_fd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions net/can/af_can.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down

0 comments on commit d037250

Please sign in to comment.