|
33 | 33 | #define MCBA_USB_RX_BUFF_SIZE 64 |
34 | 34 | #define MCBA_USB_TX_BUFF_SIZE (sizeof(struct mcba_usb_msg)) |
35 | 35 |
|
36 | | -/* MCBA endpoint numbers */ |
37 | | -#define MCBA_USB_EP_IN 1 |
38 | | -#define MCBA_USB_EP_OUT 1 |
39 | | - |
40 | 36 | /* Microchip command id */ |
41 | 37 | #define MBCA_CMD_RECEIVE_MESSAGE 0xE3 |
42 | 38 | #define MBCA_CMD_I_AM_ALIVE_FROM_CAN 0xF5 |
@@ -83,6 +79,8 @@ struct mcba_priv { |
83 | 79 | atomic_t free_ctx_cnt; |
84 | 80 | void *rxbuf[MCBA_MAX_RX_URBS]; |
85 | 81 | dma_addr_t rxbuf_dma[MCBA_MAX_RX_URBS]; |
| 82 | + int rx_pipe; |
| 83 | + int tx_pipe; |
86 | 84 | }; |
87 | 85 |
|
88 | 86 | /* CAN frame */ |
@@ -268,10 +266,8 @@ static netdev_tx_t mcba_usb_xmit(struct mcba_priv *priv, |
268 | 266 |
|
269 | 267 | memcpy(buf, usb_msg, MCBA_USB_TX_BUFF_SIZE); |
270 | 268 |
|
271 | | - usb_fill_bulk_urb(urb, priv->udev, |
272 | | - usb_sndbulkpipe(priv->udev, MCBA_USB_EP_OUT), buf, |
273 | | - MCBA_USB_TX_BUFF_SIZE, mcba_usb_write_bulk_callback, |
274 | | - ctx); |
| 269 | + usb_fill_bulk_urb(urb, priv->udev, priv->tx_pipe, buf, MCBA_USB_TX_BUFF_SIZE, |
| 270 | + mcba_usb_write_bulk_callback, ctx); |
275 | 271 |
|
276 | 272 | urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; |
277 | 273 | usb_anchor_urb(urb, &priv->tx_submitted); |
@@ -364,7 +360,6 @@ static netdev_tx_t mcba_usb_start_xmit(struct sk_buff *skb, |
364 | 360 | xmit_failed: |
365 | 361 | can_free_echo_skb(priv->netdev, ctx->ndx, NULL); |
366 | 362 | mcba_usb_free_ctx(ctx); |
367 | | - dev_kfree_skb(skb); |
368 | 363 | stats->tx_dropped++; |
369 | 364 |
|
370 | 365 | return NETDEV_TX_OK; |
@@ -608,7 +603,7 @@ static void mcba_usb_read_bulk_callback(struct urb *urb) |
608 | 603 | resubmit_urb: |
609 | 604 |
|
610 | 605 | usb_fill_bulk_urb(urb, priv->udev, |
611 | | - usb_rcvbulkpipe(priv->udev, MCBA_USB_EP_OUT), |
| 606 | + priv->rx_pipe, |
612 | 607 | urb->transfer_buffer, MCBA_USB_RX_BUFF_SIZE, |
613 | 608 | mcba_usb_read_bulk_callback, priv); |
614 | 609 |
|
@@ -653,7 +648,7 @@ static int mcba_usb_start(struct mcba_priv *priv) |
653 | 648 | urb->transfer_dma = buf_dma; |
654 | 649 |
|
655 | 650 | usb_fill_bulk_urb(urb, priv->udev, |
656 | | - usb_rcvbulkpipe(priv->udev, MCBA_USB_EP_IN), |
| 651 | + priv->rx_pipe, |
657 | 652 | buf, MCBA_USB_RX_BUFF_SIZE, |
658 | 653 | mcba_usb_read_bulk_callback, priv); |
659 | 654 | urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; |
@@ -807,6 +802,13 @@ static int mcba_usb_probe(struct usb_interface *intf, |
807 | 802 | struct mcba_priv *priv; |
808 | 803 | int err; |
809 | 804 | struct usb_device *usbdev = interface_to_usbdev(intf); |
| 805 | + struct usb_endpoint_descriptor *in, *out; |
| 806 | + |
| 807 | + err = usb_find_common_endpoints(intf->cur_altsetting, &in, &out, NULL, NULL); |
| 808 | + if (err) { |
| 809 | + dev_err(&intf->dev, "Can't find endpoints\n"); |
| 810 | + return err; |
| 811 | + } |
810 | 812 |
|
811 | 813 | netdev = alloc_candev(sizeof(struct mcba_priv), MCBA_MAX_TX_URBS); |
812 | 814 | if (!netdev) { |
@@ -852,6 +854,9 @@ static int mcba_usb_probe(struct usb_interface *intf, |
852 | 854 | goto cleanup_free_candev; |
853 | 855 | } |
854 | 856 |
|
| 857 | + priv->rx_pipe = usb_rcvbulkpipe(priv->udev, in->bEndpointAddress); |
| 858 | + priv->tx_pipe = usb_sndbulkpipe(priv->udev, out->bEndpointAddress); |
| 859 | + |
855 | 860 | devm_can_led_init(netdev); |
856 | 861 |
|
857 | 862 | /* Start USB dev only if we have successfully registered CAN device */ |
|
0 commit comments