cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

mcba_usb.c (21086B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/* SocketCAN driver for Microchip CAN BUS Analyzer Tool
      3 *
      4 * Copyright (C) 2017 Mobica Limited
      5 *
      6 * This driver is inspired by the 4.6.2 version of net/can/usb/usb_8dev.c
      7 */
      8
      9#include <asm/unaligned.h>
     10#include <linux/can.h>
     11#include <linux/can/dev.h>
     12#include <linux/can/error.h>
     13#include <linux/module.h>
     14#include <linux/netdevice.h>
     15#include <linux/signal.h>
     16#include <linux/slab.h>
     17#include <linux/usb.h>
     18
     19/* vendor and product id */
     20#define MCBA_MODULE_NAME "mcba_usb"
     21#define MCBA_VENDOR_ID 0x04d8
     22#define MCBA_PRODUCT_ID 0x0a30
     23
     24/* driver constants */
     25#define MCBA_MAX_RX_URBS 20
     26#define MCBA_MAX_TX_URBS 20
     27#define MCBA_CTX_FREE MCBA_MAX_TX_URBS
     28
     29/* RX buffer must be bigger than msg size since at the
     30 * beginning USB messages are stacked.
     31 */
     32#define MCBA_USB_RX_BUFF_SIZE 64
     33#define MCBA_USB_TX_BUFF_SIZE (sizeof(struct mcba_usb_msg))
     34
     35/* Microchip command id */
     36#define MBCA_CMD_RECEIVE_MESSAGE 0xE3
     37#define MBCA_CMD_I_AM_ALIVE_FROM_CAN 0xF5
     38#define MBCA_CMD_I_AM_ALIVE_FROM_USB 0xF7
     39#define MBCA_CMD_CHANGE_BIT_RATE 0xA1
     40#define MBCA_CMD_TRANSMIT_MESSAGE_EV 0xA3
     41#define MBCA_CMD_SETUP_TERMINATION_RESISTANCE 0xA8
     42#define MBCA_CMD_READ_FW_VERSION 0xA9
     43#define MBCA_CMD_NOTHING_TO_SEND 0xFF
     44#define MBCA_CMD_TRANSMIT_MESSAGE_RSP 0xE2
     45
     46#define MCBA_VER_REQ_USB 1
     47#define MCBA_VER_REQ_CAN 2
     48
     49#define MCBA_SIDL_EXID_MASK 0x8
     50#define MCBA_DLC_MASK 0xf
     51#define MCBA_DLC_RTR_MASK 0x40
     52
     53#define MCBA_CAN_STATE_WRN_TH 95
     54#define MCBA_CAN_STATE_ERR_PSV_TH 127
     55
     56#define MCBA_TERMINATION_DISABLED CAN_TERMINATION_DISABLED
     57#define MCBA_TERMINATION_ENABLED 120
     58
     59struct mcba_usb_ctx {
     60	struct mcba_priv *priv;
     61	u32 ndx;
     62	bool can;
     63};
     64
     65/* Structure to hold all of our device specific stuff */
     66struct mcba_priv {
     67	struct can_priv can; /* must be the first member */
     68	struct sk_buff *echo_skb[MCBA_MAX_TX_URBS];
     69	struct mcba_usb_ctx tx_context[MCBA_MAX_TX_URBS];
     70	struct usb_device *udev;
     71	struct net_device *netdev;
     72	struct usb_anchor tx_submitted;
     73	struct usb_anchor rx_submitted;
     74	struct can_berr_counter bec;
     75	bool usb_ka_first_pass;
     76	bool can_ka_first_pass;
     77	bool can_speed_check;
     78	atomic_t free_ctx_cnt;
     79	void *rxbuf[MCBA_MAX_RX_URBS];
     80	dma_addr_t rxbuf_dma[MCBA_MAX_RX_URBS];
     81	int rx_pipe;
     82	int tx_pipe;
     83};
     84
     85/* CAN frame */
     86struct __packed mcba_usb_msg_can {
     87	u8 cmd_id;
     88	__be16 eid;
     89	__be16 sid;
     90	u8 dlc;
     91	u8 data[8];
     92	u8 timestamp[4];
     93	u8 checksum;
     94};
     95
     96/* command frame */
     97struct __packed mcba_usb_msg {
     98	u8 cmd_id;
     99	u8 unused[18];
    100};
    101
    102struct __packed mcba_usb_msg_ka_usb {
    103	u8 cmd_id;
    104	u8 termination_state;
    105	u8 soft_ver_major;
    106	u8 soft_ver_minor;
    107	u8 unused[15];
    108};
    109
    110struct __packed mcba_usb_msg_ka_can {
    111	u8 cmd_id;
    112	u8 tx_err_cnt;
    113	u8 rx_err_cnt;
    114	u8 rx_buff_ovfl;
    115	u8 tx_bus_off;
    116	__be16 can_bitrate;
    117	__le16 rx_lost;
    118	u8 can_stat;
    119	u8 soft_ver_major;
    120	u8 soft_ver_minor;
    121	u8 debug_mode;
    122	u8 test_complete;
    123	u8 test_result;
    124	u8 unused[4];
    125};
    126
    127struct __packed mcba_usb_msg_change_bitrate {
    128	u8 cmd_id;
    129	__be16 bitrate;
    130	u8 unused[16];
    131};
    132
    133struct __packed mcba_usb_msg_termination {
    134	u8 cmd_id;
    135	u8 termination;
    136	u8 unused[17];
    137};
    138
    139struct __packed mcba_usb_msg_fw_ver {
    140	u8 cmd_id;
    141	u8 pic;
    142	u8 unused[17];
    143};
    144
    145static const struct usb_device_id mcba_usb_table[] = {
    146	{ USB_DEVICE(MCBA_VENDOR_ID, MCBA_PRODUCT_ID) },
    147	{} /* Terminating entry */
    148};
    149
    150MODULE_DEVICE_TABLE(usb, mcba_usb_table);
    151
    152static const u16 mcba_termination[] = { MCBA_TERMINATION_DISABLED,
    153					MCBA_TERMINATION_ENABLED };
    154
    155static const u32 mcba_bitrate[] = { 20000,  33333,  50000,  80000,  83333,
    156				    100000, 125000, 150000, 175000, 200000,
    157				    225000, 250000, 275000, 300000, 500000,
    158				    625000, 800000, 1000000 };
    159
    160static inline void mcba_init_ctx(struct mcba_priv *priv)
    161{
    162	int i = 0;
    163
    164	for (i = 0; i < MCBA_MAX_TX_URBS; i++) {
    165		priv->tx_context[i].ndx = MCBA_CTX_FREE;
    166		priv->tx_context[i].priv = priv;
    167	}
    168
    169	atomic_set(&priv->free_ctx_cnt, ARRAY_SIZE(priv->tx_context));
    170}
    171
    172static inline struct mcba_usb_ctx *mcba_usb_get_free_ctx(struct mcba_priv *priv,
    173							 struct can_frame *cf)
    174{
    175	int i = 0;
    176	struct mcba_usb_ctx *ctx = NULL;
    177
    178	for (i = 0; i < MCBA_MAX_TX_URBS; i++) {
    179		if (priv->tx_context[i].ndx == MCBA_CTX_FREE) {
    180			ctx = &priv->tx_context[i];
    181			ctx->ndx = i;
    182
    183			if (cf)
    184				ctx->can = true;
    185			else
    186				ctx->can = false;
    187
    188			atomic_dec(&priv->free_ctx_cnt);
    189			break;
    190		}
    191	}
    192
    193	if (!atomic_read(&priv->free_ctx_cnt))
    194		/* That was the last free ctx. Slow down tx path */
    195		netif_stop_queue(priv->netdev);
    196
    197	return ctx;
    198}
    199
    200/* mcba_usb_free_ctx and mcba_usb_get_free_ctx are executed by different
    201 * threads. The order of execution in below function is important.
    202 */
    203static inline void mcba_usb_free_ctx(struct mcba_usb_ctx *ctx)
    204{
    205	/* Increase number of free ctxs before freeing ctx */
    206	atomic_inc(&ctx->priv->free_ctx_cnt);
    207
    208	ctx->ndx = MCBA_CTX_FREE;
    209
    210	/* Wake up the queue once ctx is marked free */
    211	netif_wake_queue(ctx->priv->netdev);
    212}
    213
    214static void mcba_usb_write_bulk_callback(struct urb *urb)
    215{
    216	struct mcba_usb_ctx *ctx = urb->context;
    217	struct net_device *netdev;
    218
    219	WARN_ON(!ctx);
    220
    221	netdev = ctx->priv->netdev;
    222
    223	/* free up our allocated buffer */
    224	usb_free_coherent(urb->dev, urb->transfer_buffer_length,
    225			  urb->transfer_buffer, urb->transfer_dma);
    226
    227	if (ctx->can) {
    228		if (!netif_device_present(netdev))
    229			return;
    230
    231		netdev->stats.tx_packets++;
    232		netdev->stats.tx_bytes += can_get_echo_skb(netdev, ctx->ndx,
    233							   NULL);
    234	}
    235
    236	if (urb->status)
    237		netdev_info(netdev, "Tx URB aborted (%d)\n", urb->status);
    238
    239	/* Release the context */
    240	mcba_usb_free_ctx(ctx);
    241}
    242
    243/* Send data to device */
    244static netdev_tx_t mcba_usb_xmit(struct mcba_priv *priv,
    245				 struct mcba_usb_msg *usb_msg,
    246				 struct mcba_usb_ctx *ctx)
    247{
    248	struct urb *urb;
    249	u8 *buf;
    250	int err;
    251
    252	/* create a URB, and a buffer for it, and copy the data to the URB */
    253	urb = usb_alloc_urb(0, GFP_ATOMIC);
    254	if (!urb)
    255		return -ENOMEM;
    256
    257	buf = usb_alloc_coherent(priv->udev, MCBA_USB_TX_BUFF_SIZE, GFP_ATOMIC,
    258				 &urb->transfer_dma);
    259	if (!buf) {
    260		err = -ENOMEM;
    261		goto nomembuf;
    262	}
    263
    264	memcpy(buf, usb_msg, MCBA_USB_TX_BUFF_SIZE);
    265
    266	usb_fill_bulk_urb(urb, priv->udev, priv->tx_pipe, buf, MCBA_USB_TX_BUFF_SIZE,
    267			  mcba_usb_write_bulk_callback, ctx);
    268
    269	urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
    270	usb_anchor_urb(urb, &priv->tx_submitted);
    271
    272	err = usb_submit_urb(urb, GFP_ATOMIC);
    273	if (unlikely(err))
    274		goto failed;
    275
    276	/* Release our reference to this URB, the USB core will eventually free
    277	 * it entirely.
    278	 */
    279	usb_free_urb(urb);
    280
    281	return 0;
    282
    283failed:
    284	usb_unanchor_urb(urb);
    285	usb_free_coherent(priv->udev, MCBA_USB_TX_BUFF_SIZE, buf,
    286			  urb->transfer_dma);
    287
    288	if (err == -ENODEV)
    289		netif_device_detach(priv->netdev);
    290	else
    291		netdev_warn(priv->netdev, "failed tx_urb %d\n", err);
    292
    293nomembuf:
    294	usb_free_urb(urb);
    295
    296	return err;
    297}
    298
    299/* Send data to device */
    300static netdev_tx_t mcba_usb_start_xmit(struct sk_buff *skb,
    301				       struct net_device *netdev)
    302{
    303	struct mcba_priv *priv = netdev_priv(netdev);
    304	struct can_frame *cf = (struct can_frame *)skb->data;
    305	struct mcba_usb_ctx *ctx = NULL;
    306	struct net_device_stats *stats = &priv->netdev->stats;
    307	u16 sid;
    308	int err;
    309	struct mcba_usb_msg_can usb_msg = {
    310		.cmd_id = MBCA_CMD_TRANSMIT_MESSAGE_EV
    311	};
    312
    313	if (can_dropped_invalid_skb(netdev, skb))
    314		return NETDEV_TX_OK;
    315
    316	ctx = mcba_usb_get_free_ctx(priv, cf);
    317	if (!ctx)
    318		return NETDEV_TX_BUSY;
    319
    320	if (cf->can_id & CAN_EFF_FLAG) {
    321		/* SIDH    | SIDL                 | EIDH   | EIDL
    322		 * 28 - 21 | 20 19 18 x x x 17 16 | 15 - 8 | 7 - 0
    323		 */
    324		sid = MCBA_SIDL_EXID_MASK;
    325		/* store 28-18 bits */
    326		sid |= (cf->can_id & 0x1ffc0000) >> 13;
    327		/* store 17-16 bits */
    328		sid |= (cf->can_id & 0x30000) >> 16;
    329		put_unaligned_be16(sid, &usb_msg.sid);
    330
    331		/* store 15-0 bits */
    332		put_unaligned_be16(cf->can_id & 0xffff, &usb_msg.eid);
    333	} else {
    334		/* SIDH   | SIDL
    335		 * 10 - 3 | 2 1 0 x x x x x
    336		 */
    337		put_unaligned_be16((cf->can_id & CAN_SFF_MASK) << 5,
    338				   &usb_msg.sid);
    339		usb_msg.eid = 0;
    340	}
    341
    342	usb_msg.dlc = cf->len;
    343
    344	memcpy(usb_msg.data, cf->data, usb_msg.dlc);
    345
    346	if (cf->can_id & CAN_RTR_FLAG)
    347		usb_msg.dlc |= MCBA_DLC_RTR_MASK;
    348
    349	can_put_echo_skb(skb, priv->netdev, ctx->ndx, 0);
    350
    351	err = mcba_usb_xmit(priv, (struct mcba_usb_msg *)&usb_msg, ctx);
    352	if (err)
    353		goto xmit_failed;
    354
    355	return NETDEV_TX_OK;
    356
    357xmit_failed:
    358	can_free_echo_skb(priv->netdev, ctx->ndx, NULL);
    359	mcba_usb_free_ctx(ctx);
    360	stats->tx_dropped++;
    361
    362	return NETDEV_TX_OK;
    363}
    364
    365/* Send cmd to device */
    366static void mcba_usb_xmit_cmd(struct mcba_priv *priv,
    367			      struct mcba_usb_msg *usb_msg)
    368{
    369	struct mcba_usb_ctx *ctx = NULL;
    370	int err;
    371
    372	ctx = mcba_usb_get_free_ctx(priv, NULL);
    373	if (!ctx) {
    374		netdev_err(priv->netdev,
    375			   "Lack of free ctx. Sending (%d) cmd aborted",
    376			   usb_msg->cmd_id);
    377
    378		return;
    379	}
    380
    381	err = mcba_usb_xmit(priv, usb_msg, ctx);
    382	if (err)
    383		netdev_err(priv->netdev, "Failed to send cmd (%d)",
    384			   usb_msg->cmd_id);
    385}
    386
    387static void mcba_usb_xmit_change_bitrate(struct mcba_priv *priv, u16 bitrate)
    388{
    389	struct mcba_usb_msg_change_bitrate usb_msg = {
    390		.cmd_id = MBCA_CMD_CHANGE_BIT_RATE
    391	};
    392
    393	put_unaligned_be16(bitrate, &usb_msg.bitrate);
    394
    395	mcba_usb_xmit_cmd(priv, (struct mcba_usb_msg *)&usb_msg);
    396}
    397
    398static void mcba_usb_xmit_read_fw_ver(struct mcba_priv *priv, u8 pic)
    399{
    400	struct mcba_usb_msg_fw_ver usb_msg = {
    401		.cmd_id = MBCA_CMD_READ_FW_VERSION,
    402		.pic = pic
    403	};
    404
    405	mcba_usb_xmit_cmd(priv, (struct mcba_usb_msg *)&usb_msg);
    406}
    407
    408static void mcba_usb_process_can(struct mcba_priv *priv,
    409				 struct mcba_usb_msg_can *msg)
    410{
    411	struct can_frame *cf;
    412	struct sk_buff *skb;
    413	struct net_device_stats *stats = &priv->netdev->stats;
    414	u16 sid;
    415
    416	skb = alloc_can_skb(priv->netdev, &cf);
    417	if (!skb)
    418		return;
    419
    420	sid = get_unaligned_be16(&msg->sid);
    421
    422	if (sid & MCBA_SIDL_EXID_MASK) {
    423		/* SIDH    | SIDL                 | EIDH   | EIDL
    424		 * 28 - 21 | 20 19 18 x x x 17 16 | 15 - 8 | 7 - 0
    425		 */
    426		cf->can_id = CAN_EFF_FLAG;
    427
    428		/* store 28-18 bits */
    429		cf->can_id |= (sid & 0xffe0) << 13;
    430		/* store 17-16 bits */
    431		cf->can_id |= (sid & 3) << 16;
    432		/* store 15-0 bits */
    433		cf->can_id |= get_unaligned_be16(&msg->eid);
    434	} else {
    435		/* SIDH   | SIDL
    436		 * 10 - 3 | 2 1 0 x x x x x
    437		 */
    438		cf->can_id = (sid & 0xffe0) >> 5;
    439	}
    440
    441	cf->len = can_cc_dlc2len(msg->dlc & MCBA_DLC_MASK);
    442
    443	if (msg->dlc & MCBA_DLC_RTR_MASK) {
    444		cf->can_id |= CAN_RTR_FLAG;
    445	} else {
    446		memcpy(cf->data, msg->data, cf->len);
    447
    448		stats->rx_bytes += cf->len;
    449	}
    450	stats->rx_packets++;
    451
    452	netif_rx(skb);
    453}
    454
    455static void mcba_usb_process_ka_usb(struct mcba_priv *priv,
    456				    struct mcba_usb_msg_ka_usb *msg)
    457{
    458	if (unlikely(priv->usb_ka_first_pass)) {
    459		netdev_info(priv->netdev, "PIC USB version %u.%u\n",
    460			    msg->soft_ver_major, msg->soft_ver_minor);
    461
    462		priv->usb_ka_first_pass = false;
    463	}
    464
    465	if (msg->termination_state)
    466		priv->can.termination = MCBA_TERMINATION_ENABLED;
    467	else
    468		priv->can.termination = MCBA_TERMINATION_DISABLED;
    469}
    470
    471static u32 convert_can2host_bitrate(struct mcba_usb_msg_ka_can *msg)
    472{
    473	const u32 bitrate = get_unaligned_be16(&msg->can_bitrate);
    474
    475	if ((bitrate == 33) || (bitrate == 83))
    476		return bitrate * 1000 + 333;
    477	else
    478		return bitrate * 1000;
    479}
    480
    481static void mcba_usb_process_ka_can(struct mcba_priv *priv,
    482				    struct mcba_usb_msg_ka_can *msg)
    483{
    484	if (unlikely(priv->can_ka_first_pass)) {
    485		netdev_info(priv->netdev, "PIC CAN version %u.%u\n",
    486			    msg->soft_ver_major, msg->soft_ver_minor);
    487
    488		priv->can_ka_first_pass = false;
    489	}
    490
    491	if (unlikely(priv->can_speed_check)) {
    492		const u32 bitrate = convert_can2host_bitrate(msg);
    493
    494		priv->can_speed_check = false;
    495
    496		if (bitrate != priv->can.bittiming.bitrate)
    497			netdev_err(
    498			    priv->netdev,
    499			    "Wrong bitrate reported by the device (%u). Expected %u",
    500			    bitrate, priv->can.bittiming.bitrate);
    501	}
    502
    503	priv->bec.txerr = msg->tx_err_cnt;
    504	priv->bec.rxerr = msg->rx_err_cnt;
    505
    506	if (msg->tx_bus_off)
    507		priv->can.state = CAN_STATE_BUS_OFF;
    508
    509	else if ((priv->bec.txerr > MCBA_CAN_STATE_ERR_PSV_TH) ||
    510		 (priv->bec.rxerr > MCBA_CAN_STATE_ERR_PSV_TH))
    511		priv->can.state = CAN_STATE_ERROR_PASSIVE;
    512
    513	else if ((priv->bec.txerr > MCBA_CAN_STATE_WRN_TH) ||
    514		 (priv->bec.rxerr > MCBA_CAN_STATE_WRN_TH))
    515		priv->can.state = CAN_STATE_ERROR_WARNING;
    516}
    517
    518static void mcba_usb_process_rx(struct mcba_priv *priv,
    519				struct mcba_usb_msg *msg)
    520{
    521	switch (msg->cmd_id) {
    522	case MBCA_CMD_I_AM_ALIVE_FROM_CAN:
    523		mcba_usb_process_ka_can(priv,
    524					(struct mcba_usb_msg_ka_can *)msg);
    525		break;
    526
    527	case MBCA_CMD_I_AM_ALIVE_FROM_USB:
    528		mcba_usb_process_ka_usb(priv,
    529					(struct mcba_usb_msg_ka_usb *)msg);
    530		break;
    531
    532	case MBCA_CMD_RECEIVE_MESSAGE:
    533		mcba_usb_process_can(priv, (struct mcba_usb_msg_can *)msg);
    534		break;
    535
    536	case MBCA_CMD_NOTHING_TO_SEND:
    537		/* Side effect of communication between PIC_USB and PIC_CAN.
    538		 * PIC_CAN is telling us that it has nothing to send
    539		 */
    540		break;
    541
    542	case MBCA_CMD_TRANSMIT_MESSAGE_RSP:
    543		/* Transmission response from the device containing timestamp */
    544		break;
    545
    546	default:
    547		netdev_warn(priv->netdev, "Unsupported msg (0x%X)",
    548			    msg->cmd_id);
    549		break;
    550	}
    551}
    552
    553/* Callback for reading data from device
    554 *
    555 * Check urb status, call read function and resubmit urb read operation.
    556 */
    557static void mcba_usb_read_bulk_callback(struct urb *urb)
    558{
    559	struct mcba_priv *priv = urb->context;
    560	struct net_device *netdev;
    561	int retval;
    562	int pos = 0;
    563
    564	netdev = priv->netdev;
    565
    566	if (!netif_device_present(netdev))
    567		return;
    568
    569	switch (urb->status) {
    570	case 0: /* success */
    571		break;
    572
    573	case -ENOENT:
    574	case -EPIPE:
    575	case -EPROTO:
    576	case -ESHUTDOWN:
    577		return;
    578
    579	default:
    580		netdev_info(netdev, "Rx URB aborted (%d)\n", urb->status);
    581
    582		goto resubmit_urb;
    583	}
    584
    585	while (pos < urb->actual_length) {
    586		struct mcba_usb_msg *msg;
    587
    588		if (pos + sizeof(struct mcba_usb_msg) > urb->actual_length) {
    589			netdev_err(priv->netdev, "format error\n");
    590			break;
    591		}
    592
    593		msg = (struct mcba_usb_msg *)(urb->transfer_buffer + pos);
    594		mcba_usb_process_rx(priv, msg);
    595
    596		pos += sizeof(struct mcba_usb_msg);
    597	}
    598
    599resubmit_urb:
    600
    601	usb_fill_bulk_urb(urb, priv->udev,
    602			  priv->rx_pipe,
    603			  urb->transfer_buffer, MCBA_USB_RX_BUFF_SIZE,
    604			  mcba_usb_read_bulk_callback, priv);
    605
    606	retval = usb_submit_urb(urb, GFP_ATOMIC);
    607
    608	if (retval == -ENODEV)
    609		netif_device_detach(netdev);
    610	else if (retval)
    611		netdev_err(netdev, "failed resubmitting read bulk urb: %d\n",
    612			   retval);
    613}
    614
    615/* Start USB device */
    616static int mcba_usb_start(struct mcba_priv *priv)
    617{
    618	struct net_device *netdev = priv->netdev;
    619	int err, i;
    620
    621	mcba_init_ctx(priv);
    622
    623	for (i = 0; i < MCBA_MAX_RX_URBS; i++) {
    624		struct urb *urb = NULL;
    625		u8 *buf;
    626		dma_addr_t buf_dma;
    627
    628		/* create a URB, and a buffer for it */
    629		urb = usb_alloc_urb(0, GFP_KERNEL);
    630		if (!urb) {
    631			err = -ENOMEM;
    632			break;
    633		}
    634
    635		buf = usb_alloc_coherent(priv->udev, MCBA_USB_RX_BUFF_SIZE,
    636					 GFP_KERNEL, &buf_dma);
    637		if (!buf) {
    638			netdev_err(netdev, "No memory left for USB buffer\n");
    639			usb_free_urb(urb);
    640			err = -ENOMEM;
    641			break;
    642		}
    643
    644		urb->transfer_dma = buf_dma;
    645
    646		usb_fill_bulk_urb(urb, priv->udev,
    647				  priv->rx_pipe,
    648				  buf, MCBA_USB_RX_BUFF_SIZE,
    649				  mcba_usb_read_bulk_callback, priv);
    650		urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
    651		usb_anchor_urb(urb, &priv->rx_submitted);
    652
    653		err = usb_submit_urb(urb, GFP_KERNEL);
    654		if (err) {
    655			usb_unanchor_urb(urb);
    656			usb_free_coherent(priv->udev, MCBA_USB_RX_BUFF_SIZE,
    657					  buf, buf_dma);
    658			usb_free_urb(urb);
    659			break;
    660		}
    661
    662		priv->rxbuf[i] = buf;
    663		priv->rxbuf_dma[i] = buf_dma;
    664
    665		/* Drop reference, USB core will take care of freeing it */
    666		usb_free_urb(urb);
    667	}
    668
    669	/* Did we submit any URBs */
    670	if (i == 0) {
    671		netdev_warn(netdev, "couldn't setup read URBs\n");
    672		return err;
    673	}
    674
    675	/* Warn if we've couldn't transmit all the URBs */
    676	if (i < MCBA_MAX_RX_URBS)
    677		netdev_warn(netdev, "rx performance may be slow\n");
    678
    679	mcba_usb_xmit_read_fw_ver(priv, MCBA_VER_REQ_USB);
    680	mcba_usb_xmit_read_fw_ver(priv, MCBA_VER_REQ_CAN);
    681
    682	return err;
    683}
    684
    685/* Open USB device */
    686static int mcba_usb_open(struct net_device *netdev)
    687{
    688	struct mcba_priv *priv = netdev_priv(netdev);
    689	int err;
    690
    691	/* common open */
    692	err = open_candev(netdev);
    693	if (err)
    694		return err;
    695
    696	priv->can_speed_check = true;
    697	priv->can.state = CAN_STATE_ERROR_ACTIVE;
    698
    699	netif_start_queue(netdev);
    700
    701	return 0;
    702}
    703
    704static void mcba_urb_unlink(struct mcba_priv *priv)
    705{
    706	int i;
    707
    708	usb_kill_anchored_urbs(&priv->rx_submitted);
    709
    710	for (i = 0; i < MCBA_MAX_RX_URBS; ++i)
    711		usb_free_coherent(priv->udev, MCBA_USB_RX_BUFF_SIZE,
    712				  priv->rxbuf[i], priv->rxbuf_dma[i]);
    713
    714	usb_kill_anchored_urbs(&priv->tx_submitted);
    715}
    716
    717/* Close USB device */
    718static int mcba_usb_close(struct net_device *netdev)
    719{
    720	struct mcba_priv *priv = netdev_priv(netdev);
    721
    722	priv->can.state = CAN_STATE_STOPPED;
    723
    724	netif_stop_queue(netdev);
    725
    726	/* Stop polling */
    727	mcba_urb_unlink(priv);
    728
    729	close_candev(netdev);
    730
    731	return 0;
    732}
    733
    734/* Set network device mode
    735 *
    736 * Maybe we should leave this function empty, because the device
    737 * set mode variable with open command.
    738 */
    739static int mcba_net_set_mode(struct net_device *netdev, enum can_mode mode)
    740{
    741	return 0;
    742}
    743
    744static int mcba_net_get_berr_counter(const struct net_device *netdev,
    745				     struct can_berr_counter *bec)
    746{
    747	struct mcba_priv *priv = netdev_priv(netdev);
    748
    749	bec->txerr = priv->bec.txerr;
    750	bec->rxerr = priv->bec.rxerr;
    751
    752	return 0;
    753}
    754
    755static const struct net_device_ops mcba_netdev_ops = {
    756	.ndo_open = mcba_usb_open,
    757	.ndo_stop = mcba_usb_close,
    758	.ndo_start_xmit = mcba_usb_start_xmit,
    759};
    760
    761/* Microchip CANBUS has hardcoded bittiming values by default.
    762 * This function sends request via USB to change the speed and align bittiming
    763 * values for presentation purposes only
    764 */
    765static int mcba_net_set_bittiming(struct net_device *netdev)
    766{
    767	struct mcba_priv *priv = netdev_priv(netdev);
    768	const u16 bitrate_kbps = priv->can.bittiming.bitrate / 1000;
    769
    770	mcba_usb_xmit_change_bitrate(priv, bitrate_kbps);
    771
    772	return 0;
    773}
    774
    775static int mcba_set_termination(struct net_device *netdev, u16 term)
    776{
    777	struct mcba_priv *priv = netdev_priv(netdev);
    778	struct mcba_usb_msg_termination usb_msg = {
    779		.cmd_id = MBCA_CMD_SETUP_TERMINATION_RESISTANCE
    780	};
    781
    782	if (term == MCBA_TERMINATION_ENABLED)
    783		usb_msg.termination = 1;
    784	else
    785		usb_msg.termination = 0;
    786
    787	mcba_usb_xmit_cmd(priv, (struct mcba_usb_msg *)&usb_msg);
    788
    789	return 0;
    790}
    791
    792static int mcba_usb_probe(struct usb_interface *intf,
    793			  const struct usb_device_id *id)
    794{
    795	struct net_device *netdev;
    796	struct mcba_priv *priv;
    797	int err;
    798	struct usb_device *usbdev = interface_to_usbdev(intf);
    799	struct usb_endpoint_descriptor *in, *out;
    800
    801	err = usb_find_common_endpoints(intf->cur_altsetting, &in, &out, NULL, NULL);
    802	if (err) {
    803		dev_err(&intf->dev, "Can't find endpoints\n");
    804		return err;
    805	}
    806
    807	netdev = alloc_candev(sizeof(struct mcba_priv), MCBA_MAX_TX_URBS);
    808	if (!netdev) {
    809		dev_err(&intf->dev, "Couldn't alloc candev\n");
    810		return -ENOMEM;
    811	}
    812
    813	priv = netdev_priv(netdev);
    814
    815	priv->udev = usbdev;
    816	priv->netdev = netdev;
    817	priv->usb_ka_first_pass = true;
    818	priv->can_ka_first_pass = true;
    819	priv->can_speed_check = false;
    820
    821	init_usb_anchor(&priv->rx_submitted);
    822	init_usb_anchor(&priv->tx_submitted);
    823
    824	usb_set_intfdata(intf, priv);
    825
    826	/* Init CAN device */
    827	priv->can.state = CAN_STATE_STOPPED;
    828	priv->can.termination_const = mcba_termination;
    829	priv->can.termination_const_cnt = ARRAY_SIZE(mcba_termination);
    830	priv->can.bitrate_const = mcba_bitrate;
    831	priv->can.bitrate_const_cnt = ARRAY_SIZE(mcba_bitrate);
    832
    833	priv->can.do_set_termination = mcba_set_termination;
    834	priv->can.do_set_mode = mcba_net_set_mode;
    835	priv->can.do_get_berr_counter = mcba_net_get_berr_counter;
    836	priv->can.do_set_bittiming = mcba_net_set_bittiming;
    837
    838	netdev->netdev_ops = &mcba_netdev_ops;
    839
    840	netdev->flags |= IFF_ECHO; /* we support local echo */
    841
    842	SET_NETDEV_DEV(netdev, &intf->dev);
    843
    844	err = register_candev(netdev);
    845	if (err) {
    846		netdev_err(netdev, "couldn't register CAN device: %d\n", err);
    847
    848		goto cleanup_free_candev;
    849	}
    850
    851	priv->rx_pipe = usb_rcvbulkpipe(priv->udev, in->bEndpointAddress);
    852	priv->tx_pipe = usb_sndbulkpipe(priv->udev, out->bEndpointAddress);
    853
    854	/* Start USB dev only if we have successfully registered CAN device */
    855	err = mcba_usb_start(priv);
    856	if (err) {
    857		if (err == -ENODEV)
    858			netif_device_detach(priv->netdev);
    859
    860		netdev_warn(netdev, "couldn't start device: %d\n", err);
    861
    862		goto cleanup_unregister_candev;
    863	}
    864
    865	dev_info(&intf->dev, "Microchip CAN BUS Analyzer connected\n");
    866
    867	return 0;
    868
    869cleanup_unregister_candev:
    870	unregister_candev(priv->netdev);
    871
    872cleanup_free_candev:
    873	free_candev(netdev);
    874
    875	return err;
    876}
    877
    878/* Called by the usb core when driver is unloaded or device is removed */
    879static void mcba_usb_disconnect(struct usb_interface *intf)
    880{
    881	struct mcba_priv *priv = usb_get_intfdata(intf);
    882
    883	usb_set_intfdata(intf, NULL);
    884
    885	netdev_info(priv->netdev, "device disconnected\n");
    886
    887	unregister_candev(priv->netdev);
    888	mcba_urb_unlink(priv);
    889	free_candev(priv->netdev);
    890}
    891
    892static struct usb_driver mcba_usb_driver = {
    893	.name = MCBA_MODULE_NAME,
    894	.probe = mcba_usb_probe,
    895	.disconnect = mcba_usb_disconnect,
    896	.id_table = mcba_usb_table,
    897};
    898
    899module_usb_driver(mcba_usb_driver);
    900
    901MODULE_AUTHOR("Remigiusz Kołłątaj <remigiusz.kollataj@mobica.com>");
    902MODULE_DESCRIPTION("SocketCAN driver for Microchip CAN BUS Analyzer Tool");
    903MODULE_LICENSE("GPL v2");