diff options
Diffstat (limited to 'drivers/net/can/usb/ems_usb.c')
-rw-r--r-- | drivers/net/can/usb/ems_usb.c | 48 |
1 files changed, 18 insertions, 30 deletions
diff --git a/drivers/net/can/usb/ems_usb.c b/drivers/net/can/usb/ems_usb.c index abdbd9c2b788..d800b598ae3d 100644 --- a/drivers/net/can/usb/ems_usb.c +++ b/drivers/net/can/usb/ems_usb.c | |||
@@ -232,7 +232,7 @@ MODULE_DEVICE_TABLE(usb, ems_usb_table); | |||
232 | #define INTR_IN_BUFFER_SIZE 4 | 232 | #define INTR_IN_BUFFER_SIZE 4 |
233 | 233 | ||
234 | #define MAX_RX_URBS 10 | 234 | #define MAX_RX_URBS 10 |
235 | #define MAX_TX_URBS CAN_ECHO_SKB_MAX | 235 | #define MAX_TX_URBS 10 |
236 | 236 | ||
237 | struct ems_usb; | 237 | struct ems_usb; |
238 | 238 | ||
@@ -311,23 +311,19 @@ static void ems_usb_rx_can_msg(struct ems_usb *dev, struct ems_cpc_msg *msg) | |||
311 | int i; | 311 | int i; |
312 | struct net_device_stats *stats = &dev->netdev->stats; | 312 | struct net_device_stats *stats = &dev->netdev->stats; |
313 | 313 | ||
314 | skb = netdev_alloc_skb(dev->netdev, sizeof(struct can_frame)); | 314 | skb = alloc_can_skb(dev->netdev, &cf); |
315 | if (skb == NULL) | 315 | if (skb == NULL) |
316 | return; | 316 | return; |
317 | 317 | ||
318 | skb->protocol = htons(ETH_P_CAN); | ||
319 | |||
320 | cf = (struct can_frame *)skb_put(skb, sizeof(struct can_frame)); | ||
321 | |||
322 | cf->can_id = le32_to_cpu(msg->msg.can_msg.id); | 318 | cf->can_id = le32_to_cpu(msg->msg.can_msg.id); |
323 | cf->can_dlc = min_t(u8, msg->msg.can_msg.length, 8); | 319 | cf->can_dlc = get_can_dlc(msg->msg.can_msg.length & 0xF); |
324 | 320 | ||
325 | if (msg->type == CPC_MSG_TYPE_EXT_CAN_FRAME | 321 | if (msg->type == CPC_MSG_TYPE_EXT_CAN_FRAME || |
326 | || msg->type == CPC_MSG_TYPE_EXT_RTR_FRAME) | 322 | msg->type == CPC_MSG_TYPE_EXT_RTR_FRAME) |
327 | cf->can_id |= CAN_EFF_FLAG; | 323 | cf->can_id |= CAN_EFF_FLAG; |
328 | 324 | ||
329 | if (msg->type == CPC_MSG_TYPE_RTR_FRAME | 325 | if (msg->type == CPC_MSG_TYPE_RTR_FRAME || |
330 | || msg->type == CPC_MSG_TYPE_EXT_RTR_FRAME) { | 326 | msg->type == CPC_MSG_TYPE_EXT_RTR_FRAME) { |
331 | cf->can_id |= CAN_RTR_FLAG; | 327 | cf->can_id |= CAN_RTR_FLAG; |
332 | } else { | 328 | } else { |
333 | for (i = 0; i < cf->can_dlc; i++) | 329 | for (i = 0; i < cf->can_dlc; i++) |
@@ -346,18 +342,10 @@ static void ems_usb_rx_err(struct ems_usb *dev, struct ems_cpc_msg *msg) | |||
346 | struct sk_buff *skb; | 342 | struct sk_buff *skb; |
347 | struct net_device_stats *stats = &dev->netdev->stats; | 343 | struct net_device_stats *stats = &dev->netdev->stats; |
348 | 344 | ||
349 | skb = netdev_alloc_skb(dev->netdev, sizeof(struct can_frame)); | 345 | skb = alloc_can_err_skb(dev->netdev, &cf); |
350 | if (skb == NULL) | 346 | if (skb == NULL) |
351 | return; | 347 | return; |
352 | 348 | ||
353 | skb->protocol = htons(ETH_P_CAN); | ||
354 | |||
355 | cf = (struct can_frame *)skb_put(skb, sizeof(struct can_frame)); | ||
356 | memset(cf, 0, sizeof(struct can_frame)); | ||
357 | |||
358 | cf->can_id = CAN_ERR_FLAG; | ||
359 | cf->can_dlc = CAN_ERR_DLC; | ||
360 | |||
361 | if (msg->type == CPC_MSG_TYPE_CAN_STATE) { | 349 | if (msg->type == CPC_MSG_TYPE_CAN_STATE) { |
362 | u8 state = msg->msg.can_state; | 350 | u8 state = msg->msg.can_state; |
363 | 351 | ||
@@ -779,6 +767,9 @@ static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *ne | |||
779 | size_t size = CPC_HEADER_SIZE + CPC_MSG_HEADER_LEN | 767 | size_t size = CPC_HEADER_SIZE + CPC_MSG_HEADER_LEN |
780 | + sizeof(struct cpc_can_msg); | 768 | + sizeof(struct cpc_can_msg); |
781 | 769 | ||
770 | if (can_dropped_invalid_skb(netdev, skb)) | ||
771 | return NETDEV_TX_OK; | ||
772 | |||
782 | /* create a URB, and a buffer for it, and copy the data to the URB */ | 773 | /* create a URB, and a buffer for it, and copy the data to the URB */ |
783 | urb = usb_alloc_urb(0, GFP_ATOMIC); | 774 | urb = usb_alloc_urb(0, GFP_ATOMIC); |
784 | if (!urb) { | 775 | if (!urb) { |
@@ -885,9 +876,7 @@ static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *ne | |||
885 | return NETDEV_TX_OK; | 876 | return NETDEV_TX_OK; |
886 | 877 | ||
887 | nomem: | 878 | nomem: |
888 | if (skb) | 879 | dev_kfree_skb(skb); |
889 | dev_kfree_skb(skb); | ||
890 | |||
891 | stats->tx_dropped++; | 880 | stats->tx_dropped++; |
892 | 881 | ||
893 | return NETDEV_TX_OK; | 882 | return NETDEV_TX_OK; |
@@ -1015,9 +1004,9 @@ static int ems_usb_probe(struct usb_interface *intf, | |||
1015 | struct ems_usb *dev; | 1004 | struct ems_usb *dev; |
1016 | int i, err = -ENOMEM; | 1005 | int i, err = -ENOMEM; |
1017 | 1006 | ||
1018 | netdev = alloc_candev(sizeof(struct ems_usb)); | 1007 | netdev = alloc_candev(sizeof(struct ems_usb), MAX_TX_URBS); |
1019 | if (!netdev) { | 1008 | if (!netdev) { |
1020 | dev_err(netdev->dev.parent, "Couldn't alloc candev\n"); | 1009 | dev_err(&intf->dev, "ems_usb: Couldn't alloc candev\n"); |
1021 | return -ENOMEM; | 1010 | return -ENOMEM; |
1022 | } | 1011 | } |
1023 | 1012 | ||
@@ -1031,8 +1020,7 @@ static int ems_usb_probe(struct usb_interface *intf, | |||
1031 | dev->can.bittiming_const = &ems_usb_bittiming_const; | 1020 | dev->can.bittiming_const = &ems_usb_bittiming_const; |
1032 | dev->can.do_set_bittiming = ems_usb_set_bittiming; | 1021 | dev->can.do_set_bittiming = ems_usb_set_bittiming; |
1033 | dev->can.do_set_mode = ems_usb_set_mode; | 1022 | dev->can.do_set_mode = ems_usb_set_mode; |
1034 | 1023 | dev->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES; | |
1035 | netdev->flags |= IFF_ECHO; /* we support local echo */ | ||
1036 | 1024 | ||
1037 | netdev->netdev_ops = &ems_usb_netdev_ops; | 1025 | netdev->netdev_ops = &ems_usb_netdev_ops; |
1038 | 1026 | ||
@@ -1048,20 +1036,20 @@ static int ems_usb_probe(struct usb_interface *intf, | |||
1048 | 1036 | ||
1049 | dev->intr_urb = usb_alloc_urb(0, GFP_KERNEL); | 1037 | dev->intr_urb = usb_alloc_urb(0, GFP_KERNEL); |
1050 | if (!dev->intr_urb) { | 1038 | if (!dev->intr_urb) { |
1051 | dev_err(netdev->dev.parent, "Couldn't alloc intr URB\n"); | 1039 | dev_err(&intf->dev, "Couldn't alloc intr URB\n"); |
1052 | goto cleanup_candev; | 1040 | goto cleanup_candev; |
1053 | } | 1041 | } |
1054 | 1042 | ||
1055 | dev->intr_in_buffer = kzalloc(INTR_IN_BUFFER_SIZE, GFP_KERNEL); | 1043 | dev->intr_in_buffer = kzalloc(INTR_IN_BUFFER_SIZE, GFP_KERNEL); |
1056 | if (!dev->intr_in_buffer) { | 1044 | if (!dev->intr_in_buffer) { |
1057 | dev_err(netdev->dev.parent, "Couldn't alloc Intr buffer\n"); | 1045 | dev_err(&intf->dev, "Couldn't alloc Intr buffer\n"); |
1058 | goto cleanup_intr_urb; | 1046 | goto cleanup_intr_urb; |
1059 | } | 1047 | } |
1060 | 1048 | ||
1061 | dev->tx_msg_buffer = kzalloc(CPC_HEADER_SIZE + | 1049 | dev->tx_msg_buffer = kzalloc(CPC_HEADER_SIZE + |
1062 | sizeof(struct ems_cpc_msg), GFP_KERNEL); | 1050 | sizeof(struct ems_cpc_msg), GFP_KERNEL); |
1063 | if (!dev->tx_msg_buffer) { | 1051 | if (!dev->tx_msg_buffer) { |
1064 | dev_err(netdev->dev.parent, "Couldn't alloc Tx buffer\n"); | 1052 | dev_err(&intf->dev, "Couldn't alloc Tx buffer\n"); |
1065 | goto cleanup_intr_in_buffer; | 1053 | goto cleanup_intr_in_buffer; |
1066 | } | 1054 | } |
1067 | 1055 | ||