Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ems_usb: Added support for EMS CPC-USB/ARM7 CAN/USB interface

This patch adds support for one channel CAN/USB interace CPC-USB/ARM7 from
EMS Dr. Thomas Wuensche (http://www.ems-wuensche.com).

Signed-off-by: Sebastian Haas <haas@ems-wuensche.com>
Signed-off-by: Wolfgang Grandegger <wg@grandegger.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Sebastian Haas and committed by
David S. Miller
702171ad c1e815c0

+1169
+7
drivers/net/can/Kconfig
··· 75 75 CPC-PCIe and CPC-104P cards from EMS Dr. Thomas Wuensche 76 76 (http://www.ems-wuensche.de). 77 77 78 + config CAN_EMS_USB 79 + tristate "EMS CPC-USB/ARM7 CAN/USB interface" 80 + depends on USB && CAN_DEV 81 + ---help--- 82 + This driver is for the one channel CPC-USB/ARM7 CAN/USB interface 83 + from from EMS Dr. Thomas Wuensche (http://www.ems-wuensche.de). 84 + 78 85 config CAN_KVASER_PCI 79 86 tristate "Kvaser PCIcanx and Kvaser PCIcan PCI Cards" 80 87 depends on PCI && CAN_SJA1000
+2
drivers/net/can/Makefile
··· 7 7 obj-$(CONFIG_CAN_DEV) += can-dev.o 8 8 can-dev-y := dev.o 9 9 10 + obj-y += usb/ 11 + 10 12 obj-$(CONFIG_CAN_SJA1000) += sja1000/ 11 13 12 14 ccflags-$(CONFIG_CAN_DEBUG_DEVICES) := -DDEBUG
+5
drivers/net/can/usb/Makefile
··· 1 + # 2 + # Makefile for the Linux Controller Area Network USB drivers. 3 + # 4 + 5 + obj-$(CONFIG_CAN_EMS_USB) += ems_usb.o
+1155
drivers/net/can/usb/ems_usb.c
··· 1 + /* 2 + * CAN driver for EMS Dr. Thomas Wuensche CPC-USB/ARM7 3 + * 4 + * Copyright (C) 2004-2009 EMS Dr. Thomas Wuensche 5 + * 6 + * This program is free software; you can redistribute it and/or modify it 7 + * under the terms of the GNU General Public License as published 8 + * by the Free Software Foundation; version 2 of the License. 9 + * 10 + * This program is distributed in the hope that it will be useful, but 11 + * WITHOUT ANY WARRANTY; without even the implied warranty of 12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 + * General Public License for more details. 14 + * 15 + * You should have received a copy of the GNU General Public License along 16 + * with this program; if not, write to the Free Software Foundation, Inc., 17 + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 18 + */ 19 + #include <linux/init.h> 20 + #include <linux/signal.h> 21 + #include <linux/slab.h> 22 + #include <linux/module.h> 23 + #include <linux/netdevice.h> 24 + #include <linux/usb.h> 25 + 26 + #include <linux/can.h> 27 + #include <linux/can/dev.h> 28 + #include <linux/can/error.h> 29 + 30 + MODULE_AUTHOR("Sebastian Haas <haas@ems-wuensche.com>"); 31 + MODULE_DESCRIPTION("CAN driver for EMS Dr. Thomas Wuensche CAN/USB interfaces"); 32 + MODULE_LICENSE("GPL v2"); 33 + 34 + /* Control-Values for CPC_Control() Command Subject Selection */ 35 + #define CONTR_CAN_MESSAGE 0x04 36 + #define CONTR_CAN_STATE 0x0C 37 + #define CONTR_BUS_ERROR 0x1C 38 + 39 + /* Control Command Actions */ 40 + #define CONTR_CONT_OFF 0 41 + #define CONTR_CONT_ON 1 42 + #define CONTR_ONCE 2 43 + 44 + /* Messages from CPC to PC */ 45 + #define CPC_MSG_TYPE_CAN_FRAME 1 /* CAN data frame */ 46 + #define CPC_MSG_TYPE_RTR_FRAME 8 /* CAN remote frame */ 47 + #define CPC_MSG_TYPE_CAN_PARAMS 12 /* Actual CAN parameters */ 48 + #define CPC_MSG_TYPE_CAN_STATE 14 /* CAN state message */ 49 + #define CPC_MSG_TYPE_EXT_CAN_FRAME 16 /* Extended CAN data frame */ 50 + #define CPC_MSG_TYPE_EXT_RTR_FRAME 17 /* Extended remote frame */ 51 + #define CPC_MSG_TYPE_CONTROL 19 /* change interface behavior */ 52 + #define CPC_MSG_TYPE_CONFIRM 20 /* command processed confirmation */ 53 + #define CPC_MSG_TYPE_OVERRUN 21 /* overrun events */ 54 + #define CPC_MSG_TYPE_CAN_FRAME_ERROR 23 /* detected bus errors */ 55 + #define CPC_MSG_TYPE_ERR_COUNTER 25 /* RX/TX error counter */ 56 + 57 + /* Messages from the PC to the CPC interface */ 58 + #define CPC_CMD_TYPE_CAN_FRAME 1 /* CAN data frame */ 59 + #define CPC_CMD_TYPE_CONTROL 3 /* control of interface behavior */ 60 + #define CPC_CMD_TYPE_CAN_PARAMS 6 /* set CAN parameters */ 61 + #define CPC_CMD_TYPE_RTR_FRAME 13 /* CAN remote frame */ 62 + #define CPC_CMD_TYPE_CAN_STATE 14 /* CAN state message */ 63 + #define CPC_CMD_TYPE_EXT_CAN_FRAME 15 /* Extended CAN data frame */ 64 + #define CPC_CMD_TYPE_EXT_RTR_FRAME 16 /* Extended CAN remote frame */ 65 + #define CPC_CMD_TYPE_CAN_EXIT 200 /* exit the CAN */ 66 + 67 + #define CPC_CMD_TYPE_INQ_ERR_COUNTER 25 /* request the CAN error counters */ 68 + #define CPC_CMD_TYPE_CLEAR_MSG_QUEUE 8 /* clear CPC_MSG queue */ 69 + #define CPC_CMD_TYPE_CLEAR_CMD_QUEUE 28 /* clear CPC_CMD queue */ 70 + 71 + #define CPC_CC_TYPE_SJA1000 2 /* Philips basic CAN controller */ 72 + 73 + #define CPC_CAN_ECODE_ERRFRAME 0x01 /* Ecode type */ 74 + 75 + /* Overrun types */ 76 + #define CPC_OVR_EVENT_CAN 0x01 77 + #define CPC_OVR_EVENT_CANSTATE 0x02 78 + #define CPC_OVR_EVENT_BUSERROR 0x04 79 + 80 + /* 81 + * If the CAN controller lost a message we indicate it with the highest bit 82 + * set in the count field. 83 + */ 84 + #define CPC_OVR_HW 0x80 85 + 86 + /* Size of the "struct ems_cpc_msg" without the union */ 87 + #define CPC_MSG_HEADER_LEN 11 88 + #define CPC_CAN_MSG_MIN_SIZE 5 89 + 90 + /* Define these values to match your devices */ 91 + #define USB_CPCUSB_VENDOR_ID 0x12D6 92 + 93 + #define USB_CPCUSB_ARM7_PRODUCT_ID 0x0444 94 + 95 + /* Mode register NXP LPC2119/SJA1000 CAN Controller */ 96 + #define SJA1000_MOD_NORMAL 0x00 97 + #define SJA1000_MOD_RM 0x01 98 + 99 + /* ECC register NXP LPC2119/SJA1000 CAN Controller */ 100 + #define SJA1000_ECC_SEG 0x1F 101 + #define SJA1000_ECC_DIR 0x20 102 + #define SJA1000_ECC_ERR 0x06 103 + #define SJA1000_ECC_BIT 0x00 104 + #define SJA1000_ECC_FORM 0x40 105 + #define SJA1000_ECC_STUFF 0x80 106 + #define SJA1000_ECC_MASK 0xc0 107 + 108 + /* Status register content */ 109 + #define SJA1000_SR_BS 0x80 110 + #define SJA1000_SR_ES 0x40 111 + 112 + #define SJA1000_DEFAULT_OUTPUT_CONTROL 0xDA 113 + 114 + /* 115 + * The device actually uses a 16MHz clock to generate the CAN clock 116 + * but it expects SJA1000 bit settings based on 8MHz (is internally 117 + * converted). 118 + */ 119 + #define EMS_USB_ARM7_CLOCK 8000000 120 + 121 + /* 122 + * CAN-Message representation in a CPC_MSG. Message object type is 123 + * CPC_MSG_TYPE_CAN_FRAME or CPC_MSG_TYPE_RTR_FRAME or 124 + * CPC_MSG_TYPE_EXT_CAN_FRAME or CPC_MSG_TYPE_EXT_RTR_FRAME. 125 + */ 126 + struct cpc_can_msg { 127 + u32 id; 128 + u8 length; 129 + u8 msg[8]; 130 + }; 131 + 132 + /* Representation of the CAN parameters for the SJA1000 controller */ 133 + struct cpc_sja1000_params { 134 + u8 mode; 135 + u8 acc_code0; 136 + u8 acc_code1; 137 + u8 acc_code2; 138 + u8 acc_code3; 139 + u8 acc_mask0; 140 + u8 acc_mask1; 141 + u8 acc_mask2; 142 + u8 acc_mask3; 143 + u8 btr0; 144 + u8 btr1; 145 + u8 outp_contr; 146 + }; 147 + 148 + /* CAN params message representation */ 149 + struct cpc_can_params { 150 + u8 cc_type; 151 + 152 + /* Will support M16C CAN controller in the future */ 153 + union { 154 + struct cpc_sja1000_params sja1000; 155 + } cc_params; 156 + }; 157 + 158 + /* Structure for confirmed message handling */ 159 + struct cpc_confirm { 160 + u8 error; /* error code */ 161 + }; 162 + 163 + /* Structure for overrun conditions */ 164 + struct cpc_overrun { 165 + u8 event; 166 + u8 count; 167 + }; 168 + 169 + /* SJA1000 CAN errors (compatible to NXP LPC2119) */ 170 + struct cpc_sja1000_can_error { 171 + u8 ecc; 172 + u8 rxerr; 173 + u8 txerr; 174 + }; 175 + 176 + /* structure for CAN error conditions */ 177 + struct cpc_can_error { 178 + u8 ecode; 179 + 180 + struct { 181 + u8 cc_type; 182 + 183 + /* Other controllers may also provide error code capture regs */ 184 + union { 185 + struct cpc_sja1000_can_error sja1000; 186 + } regs; 187 + } cc; 188 + }; 189 + 190 + /* 191 + * Structure containing RX/TX error counter. This structure is used to request 192 + * the values of the CAN controllers TX and RX error counter. 193 + */ 194 + struct cpc_can_err_counter { 195 + u8 rx; 196 + u8 tx; 197 + }; 198 + 199 + /* Main message type used between library and application */ 200 + struct __attribute__ ((packed)) ems_cpc_msg { 201 + u8 type; /* type of message */ 202 + u8 length; /* length of data within union 'msg' */ 203 + u8 msgid; /* confirmation handle */ 204 + u32 ts_sec; /* timestamp in seconds */ 205 + u32 ts_nsec; /* timestamp in nano seconds */ 206 + 207 + union { 208 + u8 generic[64]; 209 + struct cpc_can_msg can_msg; 210 + struct cpc_can_params can_params; 211 + struct cpc_confirm confirmation; 212 + struct cpc_overrun overrun; 213 + struct cpc_can_error error; 214 + struct cpc_can_err_counter err_counter; 215 + u8 can_state; 216 + } msg; 217 + }; 218 + 219 + /* 220 + * Table of devices that work with this driver 221 + * NOTE: This driver supports only CPC-USB/ARM7 (LPC2119) yet. 222 + */ 223 + static struct usb_device_id ems_usb_table[] = { 224 + {USB_DEVICE(USB_CPCUSB_VENDOR_ID, USB_CPCUSB_ARM7_PRODUCT_ID)}, 225 + {} /* Terminating entry */ 226 + }; 227 + 228 + MODULE_DEVICE_TABLE(usb, ems_usb_table); 229 + 230 + #define RX_BUFFER_SIZE 64 231 + #define CPC_HEADER_SIZE 4 232 + #define INTR_IN_BUFFER_SIZE 4 233 + 234 + #define MAX_RX_URBS 10 235 + #define MAX_TX_URBS CAN_ECHO_SKB_MAX 236 + 237 + struct ems_usb; 238 + 239 + struct ems_tx_urb_context { 240 + struct ems_usb *dev; 241 + 242 + u32 echo_index; 243 + u8 dlc; 244 + }; 245 + 246 + struct ems_usb { 247 + struct can_priv can; /* must be the first member */ 248 + int open_time; 249 + 250 + struct sk_buff *echo_skb[MAX_TX_URBS]; 251 + 252 + struct usb_device *udev; 253 + struct net_device *netdev; 254 + 255 + atomic_t active_tx_urbs; 256 + struct usb_anchor tx_submitted; 257 + struct ems_tx_urb_context tx_contexts[MAX_TX_URBS]; 258 + 259 + struct usb_anchor rx_submitted; 260 + 261 + struct urb *intr_urb; 262 + 263 + u8 *tx_msg_buffer; 264 + 265 + u8 *intr_in_buffer; 266 + unsigned int free_slots; /* remember number of available slots */ 267 + 268 + struct ems_cpc_msg active_params; /* active controller parameters */ 269 + }; 270 + 271 + static void ems_usb_read_interrupt_callback(struct urb *urb) 272 + { 273 + struct ems_usb *dev = urb->context; 274 + struct net_device *netdev = dev->netdev; 275 + int err; 276 + 277 + if (!netif_device_present(netdev)) 278 + return; 279 + 280 + switch (urb->status) { 281 + case 0: 282 + dev->free_slots = dev->intr_in_buffer[1]; 283 + break; 284 + 285 + case -ECONNRESET: /* unlink */ 286 + case -ENOENT: 287 + case -ESHUTDOWN: 288 + return; 289 + 290 + default: 291 + dev_info(netdev->dev.parent, "Rx interrupt aborted %d\n", 292 + urb->status); 293 + break; 294 + } 295 + 296 + err = usb_submit_urb(urb, GFP_ATOMIC); 297 + 298 + if (err == -ENODEV) 299 + netif_device_detach(netdev); 300 + else if (err) 301 + dev_err(netdev->dev.parent, 302 + "failed resubmitting intr urb: %d\n", err); 303 + 304 + return; 305 + } 306 + 307 + static void ems_usb_rx_can_msg(struct ems_usb *dev, struct ems_cpc_msg *msg) 308 + { 309 + struct can_frame *cf; 310 + struct sk_buff *skb; 311 + int i; 312 + struct net_device_stats *stats = &dev->netdev->stats; 313 + 314 + skb = netdev_alloc_skb(dev->netdev, sizeof(struct can_frame)); 315 + if (skb == NULL) 316 + return; 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 = msg->msg.can_msg.id; 323 + cf->can_dlc = min_t(u8, msg->msg.can_msg.length, 8); 324 + 325 + if (msg->type == CPC_MSG_TYPE_EXT_CAN_FRAME 326 + || msg->type == CPC_MSG_TYPE_EXT_RTR_FRAME) 327 + cf->can_id |= CAN_EFF_FLAG; 328 + 329 + if (msg->type == CPC_MSG_TYPE_RTR_FRAME 330 + || msg->type == CPC_MSG_TYPE_EXT_RTR_FRAME) { 331 + cf->can_id |= CAN_RTR_FLAG; 332 + } else { 333 + for (i = 0; i < cf->can_dlc; i++) 334 + cf->data[i] = msg->msg.can_msg.msg[i]; 335 + } 336 + 337 + netif_rx(skb); 338 + 339 + stats->rx_packets++; 340 + stats->rx_bytes += cf->can_dlc; 341 + } 342 + 343 + static void ems_usb_rx_err(struct ems_usb *dev, struct ems_cpc_msg *msg) 344 + { 345 + struct can_frame *cf; 346 + struct sk_buff *skb; 347 + struct net_device_stats *stats = &dev->netdev->stats; 348 + 349 + skb = netdev_alloc_skb(dev->netdev, sizeof(struct can_frame)); 350 + if (skb == NULL) 351 + return; 352 + 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) { 362 + u8 state = msg->msg.can_state; 363 + 364 + if (state & SJA1000_SR_BS) { 365 + dev->can.state = CAN_STATE_BUS_OFF; 366 + cf->can_id |= CAN_ERR_BUSOFF; 367 + 368 + can_bus_off(dev->netdev); 369 + } else if (state & SJA1000_SR_ES) { 370 + dev->can.state = CAN_STATE_ERROR_WARNING; 371 + dev->can.can_stats.error_warning++; 372 + } else { 373 + dev->can.state = CAN_STATE_ERROR_ACTIVE; 374 + dev->can.can_stats.error_passive++; 375 + } 376 + } else if (msg->type == CPC_MSG_TYPE_CAN_FRAME_ERROR) { 377 + u8 ecc = msg->msg.error.cc.regs.sja1000.ecc; 378 + u8 txerr = msg->msg.error.cc.regs.sja1000.txerr; 379 + u8 rxerr = msg->msg.error.cc.regs.sja1000.rxerr; 380 + 381 + /* bus error interrupt */ 382 + dev->can.can_stats.bus_error++; 383 + stats->rx_errors++; 384 + 385 + cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR; 386 + 387 + switch (ecc & SJA1000_ECC_MASK) { 388 + case SJA1000_ECC_BIT: 389 + cf->data[2] |= CAN_ERR_PROT_BIT; 390 + break; 391 + case SJA1000_ECC_FORM: 392 + cf->data[2] |= CAN_ERR_PROT_FORM; 393 + break; 394 + case SJA1000_ECC_STUFF: 395 + cf->data[2] |= CAN_ERR_PROT_STUFF; 396 + break; 397 + default: 398 + cf->data[2] |= CAN_ERR_PROT_UNSPEC; 399 + cf->data[3] = ecc & SJA1000_ECC_SEG; 400 + break; 401 + } 402 + 403 + /* Error occured during transmission? */ 404 + if ((ecc & SJA1000_ECC_DIR) == 0) 405 + cf->data[2] |= CAN_ERR_PROT_TX; 406 + 407 + if (dev->can.state == CAN_STATE_ERROR_WARNING || 408 + dev->can.state == CAN_STATE_ERROR_PASSIVE) { 409 + cf->data[1] = (txerr > rxerr) ? 410 + CAN_ERR_CRTL_TX_PASSIVE : CAN_ERR_CRTL_RX_PASSIVE; 411 + } 412 + } else if (msg->type == CPC_MSG_TYPE_OVERRUN) { 413 + cf->can_id |= CAN_ERR_CRTL; 414 + cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW; 415 + 416 + stats->rx_over_errors++; 417 + stats->rx_errors++; 418 + } 419 + 420 + netif_rx(skb); 421 + 422 + stats->rx_packets++; 423 + stats->rx_bytes += cf->can_dlc; 424 + } 425 + 426 + /* 427 + * callback for bulk IN urb 428 + */ 429 + static void ems_usb_read_bulk_callback(struct urb *urb) 430 + { 431 + struct ems_usb *dev = urb->context; 432 + struct net_device *netdev; 433 + int retval; 434 + 435 + netdev = dev->netdev; 436 + 437 + if (!netif_device_present(netdev)) 438 + return; 439 + 440 + switch (urb->status) { 441 + case 0: /* success */ 442 + break; 443 + 444 + case -ENOENT: 445 + return; 446 + 447 + default: 448 + dev_info(netdev->dev.parent, "Rx URB aborted (%d)\n", 449 + urb->status); 450 + goto resubmit_urb; 451 + } 452 + 453 + if (urb->actual_length > CPC_HEADER_SIZE) { 454 + struct ems_cpc_msg *msg; 455 + u8 *ibuf = urb->transfer_buffer; 456 + u8 msg_count, again, start; 457 + 458 + msg_count = ibuf[0] & ~0x80; 459 + again = ibuf[0] & 0x80; 460 + 461 + start = CPC_HEADER_SIZE; 462 + 463 + while (msg_count) { 464 + msg = (struct ems_cpc_msg *)&ibuf[start]; 465 + 466 + switch (msg->type) { 467 + case CPC_MSG_TYPE_CAN_STATE: 468 + /* Process CAN state changes */ 469 + ems_usb_rx_err(dev, msg); 470 + break; 471 + 472 + case CPC_MSG_TYPE_CAN_FRAME: 473 + case CPC_MSG_TYPE_EXT_CAN_FRAME: 474 + case CPC_MSG_TYPE_RTR_FRAME: 475 + case CPC_MSG_TYPE_EXT_RTR_FRAME: 476 + ems_usb_rx_can_msg(dev, msg); 477 + break; 478 + 479 + case CPC_MSG_TYPE_CAN_FRAME_ERROR: 480 + /* Process errorframe */ 481 + ems_usb_rx_err(dev, msg); 482 + break; 483 + 484 + case CPC_MSG_TYPE_OVERRUN: 485 + /* Message lost while receiving */ 486 + ems_usb_rx_err(dev, msg); 487 + break; 488 + } 489 + 490 + start += CPC_MSG_HEADER_LEN + msg->length; 491 + msg_count--; 492 + 493 + if (start > urb->transfer_buffer_length) { 494 + dev_err(netdev->dev.parent, "format error\n"); 495 + break; 496 + } 497 + } 498 + } 499 + 500 + resubmit_urb: 501 + usb_fill_bulk_urb(urb, dev->udev, usb_rcvbulkpipe(dev->udev, 2), 502 + urb->transfer_buffer, RX_BUFFER_SIZE, 503 + ems_usb_read_bulk_callback, dev); 504 + 505 + retval = usb_submit_urb(urb, GFP_ATOMIC); 506 + 507 + if (retval == -ENODEV) 508 + netif_device_detach(netdev); 509 + else if (retval) 510 + dev_err(netdev->dev.parent, 511 + "failed resubmitting read bulk urb: %d\n", retval); 512 + 513 + return; 514 + } 515 + 516 + /* 517 + * callback for bulk IN urb 518 + */ 519 + static void ems_usb_write_bulk_callback(struct urb *urb) 520 + { 521 + struct ems_tx_urb_context *context = urb->context; 522 + struct ems_usb *dev; 523 + struct net_device *netdev; 524 + 525 + BUG_ON(!context); 526 + 527 + dev = context->dev; 528 + netdev = dev->netdev; 529 + 530 + /* free up our allocated buffer */ 531 + usb_buffer_free(urb->dev, urb->transfer_buffer_length, 532 + urb->transfer_buffer, urb->transfer_dma); 533 + 534 + atomic_dec(&dev->active_tx_urbs); 535 + 536 + if (!netif_device_present(netdev)) 537 + return; 538 + 539 + if (urb->status) 540 + dev_info(netdev->dev.parent, "Tx URB aborted (%d)\n", 541 + urb->status); 542 + 543 + netdev->trans_start = jiffies; 544 + 545 + /* transmission complete interrupt */ 546 + netdev->stats.tx_packets++; 547 + netdev->stats.tx_bytes += context->dlc; 548 + 549 + can_get_echo_skb(netdev, context->echo_index); 550 + 551 + /* Release context */ 552 + context->echo_index = MAX_TX_URBS; 553 + 554 + if (netif_queue_stopped(netdev)) 555 + netif_wake_queue(netdev); 556 + } 557 + 558 + /* 559 + * Send the given CPC command synchronously 560 + */ 561 + static int ems_usb_command_msg(struct ems_usb *dev, struct ems_cpc_msg *msg) 562 + { 563 + int actual_length; 564 + 565 + /* Copy payload */ 566 + memcpy(&dev->tx_msg_buffer[CPC_HEADER_SIZE], msg, 567 + msg->length + CPC_MSG_HEADER_LEN); 568 + 569 + /* Clear header */ 570 + memset(&dev->tx_msg_buffer[0], 0, CPC_HEADER_SIZE); 571 + 572 + return usb_bulk_msg(dev->udev, usb_sndbulkpipe(dev->udev, 2), 573 + &dev->tx_msg_buffer[0], 574 + msg->length + CPC_MSG_HEADER_LEN + CPC_HEADER_SIZE, 575 + &actual_length, 1000); 576 + } 577 + 578 + /* 579 + * Change CAN controllers' mode register 580 + */ 581 + static int ems_usb_write_mode(struct ems_usb *dev, u8 mode) 582 + { 583 + dev->active_params.msg.can_params.cc_params.sja1000.mode = mode; 584 + 585 + return ems_usb_command_msg(dev, &dev->active_params); 586 + } 587 + 588 + /* 589 + * Send a CPC_Control command to change behaviour when interface receives a CAN 590 + * message, bus error or CAN state changed notifications. 591 + */ 592 + static int ems_usb_control_cmd(struct ems_usb *dev, u8 val) 593 + { 594 + struct ems_cpc_msg cmd; 595 + 596 + cmd.type = CPC_CMD_TYPE_CONTROL; 597 + cmd.length = CPC_MSG_HEADER_LEN + 1; 598 + 599 + cmd.msgid = 0; 600 + 601 + cmd.msg.generic[0] = val; 602 + 603 + return ems_usb_command_msg(dev, &cmd); 604 + } 605 + 606 + /* 607 + * Start interface 608 + */ 609 + static int ems_usb_start(struct ems_usb *dev) 610 + { 611 + struct net_device *netdev = dev->netdev; 612 + int err, i; 613 + 614 + dev->intr_in_buffer[0] = 0; 615 + dev->free_slots = 15; /* initial size */ 616 + 617 + for (i = 0; i < MAX_RX_URBS; i++) { 618 + struct urb *urb = NULL; 619 + u8 *buf = NULL; 620 + 621 + /* create a URB, and a buffer for it */ 622 + urb = usb_alloc_urb(0, GFP_KERNEL); 623 + if (!urb) { 624 + dev_err(netdev->dev.parent, 625 + "No memory left for URBs\n"); 626 + return -ENOMEM; 627 + } 628 + 629 + buf = usb_buffer_alloc(dev->udev, RX_BUFFER_SIZE, GFP_KERNEL, 630 + &urb->transfer_dma); 631 + if (!buf) { 632 + dev_err(netdev->dev.parent, 633 + "No memory left for USB buffer\n"); 634 + usb_free_urb(urb); 635 + return -ENOMEM; 636 + } 637 + 638 + usb_fill_bulk_urb(urb, dev->udev, usb_rcvbulkpipe(dev->udev, 2), 639 + buf, RX_BUFFER_SIZE, 640 + ems_usb_read_bulk_callback, dev); 641 + urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 642 + usb_anchor_urb(urb, &dev->rx_submitted); 643 + 644 + err = usb_submit_urb(urb, GFP_KERNEL); 645 + if (err) { 646 + if (err == -ENODEV) 647 + netif_device_detach(dev->netdev); 648 + 649 + usb_unanchor_urb(urb); 650 + usb_buffer_free(dev->udev, RX_BUFFER_SIZE, buf, 651 + urb->transfer_dma); 652 + break; 653 + } 654 + 655 + /* Drop reference, USB core will take care of freeing it */ 656 + usb_free_urb(urb); 657 + } 658 + 659 + /* Did we submit any URBs */ 660 + if (i == 0) { 661 + dev_warn(netdev->dev.parent, "couldn't setup read URBs\n"); 662 + return err; 663 + } 664 + 665 + /* Warn if we've couldn't transmit all the URBs */ 666 + if (i < MAX_RX_URBS) 667 + dev_warn(netdev->dev.parent, "rx performance may be slow\n"); 668 + 669 + /* Setup and start interrupt URB */ 670 + usb_fill_int_urb(dev->intr_urb, dev->udev, 671 + usb_rcvintpipe(dev->udev, 1), 672 + dev->intr_in_buffer, 673 + INTR_IN_BUFFER_SIZE, 674 + ems_usb_read_interrupt_callback, dev, 1); 675 + 676 + err = usb_submit_urb(dev->intr_urb, GFP_KERNEL); 677 + if (err) { 678 + if (err == -ENODEV) 679 + netif_device_detach(dev->netdev); 680 + 681 + dev_warn(netdev->dev.parent, "intr URB submit failed: %d\n", 682 + err); 683 + 684 + return err; 685 + } 686 + 687 + /* CPC-USB will transfer received message to host */ 688 + err = ems_usb_control_cmd(dev, CONTR_CAN_MESSAGE | CONTR_CONT_ON); 689 + if (err) 690 + goto failed; 691 + 692 + /* CPC-USB will transfer CAN state changes to host */ 693 + err = ems_usb_control_cmd(dev, CONTR_CAN_STATE | CONTR_CONT_ON); 694 + if (err) 695 + goto failed; 696 + 697 + /* CPC-USB will transfer bus errors to host */ 698 + err = ems_usb_control_cmd(dev, CONTR_BUS_ERROR | CONTR_CONT_ON); 699 + if (err) 700 + goto failed; 701 + 702 + err = ems_usb_write_mode(dev, SJA1000_MOD_NORMAL); 703 + if (err) 704 + goto failed; 705 + 706 + dev->can.state = CAN_STATE_ERROR_ACTIVE; 707 + 708 + return 0; 709 + 710 + failed: 711 + if (err == -ENODEV) 712 + netif_device_detach(dev->netdev); 713 + 714 + dev_warn(netdev->dev.parent, "couldn't submit control: %d\n", err); 715 + 716 + return err; 717 + } 718 + 719 + static void unlink_all_urbs(struct ems_usb *dev) 720 + { 721 + int i; 722 + 723 + usb_unlink_urb(dev->intr_urb); 724 + 725 + usb_kill_anchored_urbs(&dev->rx_submitted); 726 + 727 + usb_kill_anchored_urbs(&dev->tx_submitted); 728 + atomic_set(&dev->active_tx_urbs, 0); 729 + 730 + for (i = 0; i < MAX_TX_URBS; i++) 731 + dev->tx_contexts[i].echo_index = MAX_TX_URBS; 732 + } 733 + 734 + static int ems_usb_open(struct net_device *netdev) 735 + { 736 + struct ems_usb *dev = netdev_priv(netdev); 737 + int err; 738 + 739 + err = ems_usb_write_mode(dev, SJA1000_MOD_RM); 740 + if (err) 741 + return err; 742 + 743 + /* common open */ 744 + err = open_candev(netdev); 745 + if (err) 746 + return err; 747 + 748 + /* finally start device */ 749 + err = ems_usb_start(dev); 750 + if (err) { 751 + if (err == -ENODEV) 752 + netif_device_detach(dev->netdev); 753 + 754 + dev_warn(netdev->dev.parent, "couldn't start device: %d\n", 755 + err); 756 + 757 + close_candev(netdev); 758 + 759 + return err; 760 + } 761 + 762 + dev->open_time = jiffies; 763 + 764 + netif_start_queue(netdev); 765 + 766 + return 0; 767 + } 768 + 769 + static netdev_tx_t ems_usb_start_xmit(struct sk_buff *skb, struct net_device *netdev) 770 + { 771 + struct ems_usb *dev = netdev_priv(netdev); 772 + struct ems_tx_urb_context *context = NULL; 773 + struct net_device_stats *stats = &netdev->stats; 774 + struct can_frame *cf = (struct can_frame *)skb->data; 775 + struct ems_cpc_msg *msg; 776 + struct urb *urb; 777 + u8 *buf; 778 + int i, err; 779 + size_t size = CPC_HEADER_SIZE + CPC_MSG_HEADER_LEN 780 + + sizeof(struct cpc_can_msg); 781 + 782 + /* create a URB, and a buffer for it, and copy the data to the URB */ 783 + urb = usb_alloc_urb(0, GFP_ATOMIC); 784 + if (!urb) { 785 + dev_err(netdev->dev.parent, "No memory left for URBs\n"); 786 + goto nomem; 787 + } 788 + 789 + buf = usb_buffer_alloc(dev->udev, size, GFP_ATOMIC, &urb->transfer_dma); 790 + if (!buf) { 791 + dev_err(netdev->dev.parent, "No memory left for USB buffer\n"); 792 + usb_free_urb(urb); 793 + goto nomem; 794 + } 795 + 796 + msg = (struct ems_cpc_msg *)&buf[CPC_HEADER_SIZE]; 797 + 798 + msg->msg.can_msg.id = cf->can_id & CAN_ERR_MASK; 799 + msg->msg.can_msg.length = cf->can_dlc; 800 + 801 + if (cf->can_id & CAN_RTR_FLAG) { 802 + msg->type = cf->can_id & CAN_EFF_FLAG ? 803 + CPC_CMD_TYPE_EXT_RTR_FRAME : CPC_CMD_TYPE_RTR_FRAME; 804 + 805 + msg->length = CPC_CAN_MSG_MIN_SIZE; 806 + } else { 807 + msg->type = cf->can_id & CAN_EFF_FLAG ? 808 + CPC_CMD_TYPE_EXT_CAN_FRAME : CPC_CMD_TYPE_CAN_FRAME; 809 + 810 + for (i = 0; i < cf->can_dlc; i++) 811 + msg->msg.can_msg.msg[i] = cf->data[i]; 812 + 813 + msg->length = CPC_CAN_MSG_MIN_SIZE + cf->can_dlc; 814 + } 815 + 816 + for (i = 0; i < MAX_TX_URBS; i++) { 817 + if (dev->tx_contexts[i].echo_index == MAX_TX_URBS) { 818 + context = &dev->tx_contexts[i]; 819 + break; 820 + } 821 + } 822 + 823 + /* 824 + * May never happen! When this happens we'd more URBs in flight as 825 + * allowed (MAX_TX_URBS). 826 + */ 827 + if (!context) { 828 + usb_unanchor_urb(urb); 829 + usb_buffer_free(dev->udev, size, buf, urb->transfer_dma); 830 + 831 + dev_warn(netdev->dev.parent, "couldn't find free context\n"); 832 + 833 + return NETDEV_TX_BUSY; 834 + } 835 + 836 + context->dev = dev; 837 + context->echo_index = i; 838 + context->dlc = cf->can_dlc; 839 + 840 + usb_fill_bulk_urb(urb, dev->udev, usb_sndbulkpipe(dev->udev, 2), buf, 841 + size, ems_usb_write_bulk_callback, context); 842 + urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 843 + usb_anchor_urb(urb, &dev->tx_submitted); 844 + 845 + can_put_echo_skb(skb, netdev, context->echo_index); 846 + 847 + atomic_inc(&dev->active_tx_urbs); 848 + 849 + err = usb_submit_urb(urb, GFP_ATOMIC); 850 + if (unlikely(err)) { 851 + can_free_echo_skb(netdev, context->echo_index); 852 + 853 + usb_unanchor_urb(urb); 854 + usb_buffer_free(dev->udev, size, buf, urb->transfer_dma); 855 + dev_kfree_skb(skb); 856 + 857 + atomic_dec(&dev->active_tx_urbs); 858 + 859 + if (err == -ENODEV) { 860 + netif_device_detach(netdev); 861 + } else { 862 + dev_warn(netdev->dev.parent, "failed tx_urb %d\n", err); 863 + 864 + stats->tx_dropped++; 865 + } 866 + } else { 867 + netdev->trans_start = jiffies; 868 + 869 + /* Slow down tx path */ 870 + if (atomic_read(&dev->active_tx_urbs) >= MAX_TX_URBS || 871 + dev->free_slots < 5) { 872 + netif_stop_queue(netdev); 873 + } 874 + } 875 + 876 + /* 877 + * Release our reference to this URB, the USB core will eventually free 878 + * it entirely. 879 + */ 880 + usb_free_urb(urb); 881 + 882 + return NETDEV_TX_OK; 883 + 884 + nomem: 885 + if (skb) 886 + dev_kfree_skb(skb); 887 + 888 + stats->tx_dropped++; 889 + 890 + return NETDEV_TX_OK; 891 + } 892 + 893 + static int ems_usb_close(struct net_device *netdev) 894 + { 895 + struct ems_usb *dev = netdev_priv(netdev); 896 + 897 + /* Stop polling */ 898 + unlink_all_urbs(dev); 899 + 900 + netif_stop_queue(netdev); 901 + 902 + /* Set CAN controller to reset mode */ 903 + if (ems_usb_write_mode(dev, SJA1000_MOD_RM)) 904 + dev_warn(netdev->dev.parent, "couldn't stop device"); 905 + 906 + close_candev(netdev); 907 + 908 + dev->open_time = 0; 909 + 910 + return 0; 911 + } 912 + 913 + static const struct net_device_ops ems_usb_netdev_ops = { 914 + .ndo_open = ems_usb_open, 915 + .ndo_stop = ems_usb_close, 916 + .ndo_start_xmit = ems_usb_start_xmit, 917 + }; 918 + 919 + static struct can_bittiming_const ems_usb_bittiming_const = { 920 + .name = "ems_usb", 921 + .tseg1_min = 1, 922 + .tseg1_max = 16, 923 + .tseg2_min = 1, 924 + .tseg2_max = 8, 925 + .sjw_max = 4, 926 + .brp_min = 1, 927 + .brp_max = 64, 928 + .brp_inc = 1, 929 + }; 930 + 931 + static int ems_usb_set_mode(struct net_device *netdev, enum can_mode mode) 932 + { 933 + struct ems_usb *dev = netdev_priv(netdev); 934 + 935 + if (!dev->open_time) 936 + return -EINVAL; 937 + 938 + switch (mode) { 939 + case CAN_MODE_START: 940 + if (ems_usb_write_mode(dev, SJA1000_MOD_NORMAL)) 941 + dev_warn(netdev->dev.parent, "couldn't start device"); 942 + 943 + if (netif_queue_stopped(netdev)) 944 + netif_wake_queue(netdev); 945 + break; 946 + 947 + default: 948 + return -EOPNOTSUPP; 949 + } 950 + 951 + return 0; 952 + } 953 + 954 + static int ems_usb_set_bittiming(struct net_device *netdev) 955 + { 956 + struct ems_usb *dev = netdev_priv(netdev); 957 + struct can_bittiming *bt = &dev->can.bittiming; 958 + u8 btr0, btr1; 959 + 960 + btr0 = ((bt->brp - 1) & 0x3f) | (((bt->sjw - 1) & 0x3) << 6); 961 + btr1 = ((bt->prop_seg + bt->phase_seg1 - 1) & 0xf) | 962 + (((bt->phase_seg2 - 1) & 0x7) << 4); 963 + if (dev->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) 964 + btr1 |= 0x80; 965 + 966 + dev_info(netdev->dev.parent, "setting BTR0=0x%02x BTR1=0x%02x\n", 967 + btr0, btr1); 968 + 969 + dev->active_params.msg.can_params.cc_params.sja1000.btr0 = btr0; 970 + dev->active_params.msg.can_params.cc_params.sja1000.btr1 = btr1; 971 + 972 + return ems_usb_command_msg(dev, &dev->active_params); 973 + } 974 + 975 + static void init_params_sja1000(struct ems_cpc_msg *msg) 976 + { 977 + struct cpc_sja1000_params *sja1000 = 978 + &msg->msg.can_params.cc_params.sja1000; 979 + 980 + msg->type = CPC_CMD_TYPE_CAN_PARAMS; 981 + msg->length = sizeof(struct cpc_can_params); 982 + msg->msgid = 0; 983 + 984 + msg->msg.can_params.cc_type = CPC_CC_TYPE_SJA1000; 985 + 986 + /* Acceptance filter open */ 987 + sja1000->acc_code0 = 0x00; 988 + sja1000->acc_code1 = 0x00; 989 + sja1000->acc_code2 = 0x00; 990 + sja1000->acc_code3 = 0x00; 991 + 992 + /* Acceptance filter open */ 993 + sja1000->acc_mask0 = 0xFF; 994 + sja1000->acc_mask1 = 0xFF; 995 + sja1000->acc_mask2 = 0xFF; 996 + sja1000->acc_mask3 = 0xFF; 997 + 998 + sja1000->btr0 = 0; 999 + sja1000->btr1 = 0; 1000 + 1001 + sja1000->outp_contr = SJA1000_DEFAULT_OUTPUT_CONTROL; 1002 + sja1000->mode = SJA1000_MOD_RM; 1003 + } 1004 + 1005 + /* 1006 + * probe function for new CPC-USB devices 1007 + */ 1008 + static int ems_usb_probe(struct usb_interface *intf, 1009 + const struct usb_device_id *id) 1010 + { 1011 + struct net_device *netdev; 1012 + struct ems_usb *dev; 1013 + int i, err = -ENOMEM; 1014 + 1015 + netdev = alloc_candev(sizeof(struct ems_usb)); 1016 + if (!netdev) { 1017 + dev_err(netdev->dev.parent, "Couldn't alloc candev\n"); 1018 + return -ENOMEM; 1019 + } 1020 + 1021 + dev = netdev_priv(netdev); 1022 + 1023 + dev->udev = interface_to_usbdev(intf); 1024 + dev->netdev = netdev; 1025 + 1026 + dev->can.state = CAN_STATE_STOPPED; 1027 + dev->can.clock.freq = EMS_USB_ARM7_CLOCK; 1028 + dev->can.bittiming_const = &ems_usb_bittiming_const; 1029 + dev->can.do_set_bittiming = ems_usb_set_bittiming; 1030 + dev->can.do_set_mode = ems_usb_set_mode; 1031 + 1032 + netdev->flags |= IFF_ECHO; /* we support local echo */ 1033 + 1034 + netdev->netdev_ops = &ems_usb_netdev_ops; 1035 + 1036 + netdev->flags |= IFF_ECHO; /* we support local echo */ 1037 + 1038 + init_usb_anchor(&dev->rx_submitted); 1039 + 1040 + init_usb_anchor(&dev->tx_submitted); 1041 + atomic_set(&dev->active_tx_urbs, 0); 1042 + 1043 + for (i = 0; i < MAX_TX_URBS; i++) 1044 + dev->tx_contexts[i].echo_index = MAX_TX_URBS; 1045 + 1046 + dev->intr_urb = usb_alloc_urb(0, GFP_KERNEL); 1047 + if (!dev->intr_urb) { 1048 + dev_err(netdev->dev.parent, "Couldn't alloc intr URB\n"); 1049 + goto cleanup_candev; 1050 + } 1051 + 1052 + dev->intr_in_buffer = kzalloc(INTR_IN_BUFFER_SIZE, GFP_KERNEL); 1053 + if (!dev->intr_in_buffer) { 1054 + dev_err(netdev->dev.parent, "Couldn't alloc Intr buffer\n"); 1055 + goto cleanup_intr_urb; 1056 + } 1057 + 1058 + dev->tx_msg_buffer = kzalloc(CPC_HEADER_SIZE + 1059 + sizeof(struct ems_cpc_msg), GFP_KERNEL); 1060 + if (!dev->tx_msg_buffer) { 1061 + dev_err(netdev->dev.parent, "Couldn't alloc Tx buffer\n"); 1062 + goto cleanup_intr_in_buffer; 1063 + } 1064 + 1065 + usb_set_intfdata(intf, dev); 1066 + 1067 + SET_NETDEV_DEV(netdev, &intf->dev); 1068 + 1069 + init_params_sja1000(&dev->active_params); 1070 + 1071 + err = ems_usb_command_msg(dev, &dev->active_params); 1072 + if (err) { 1073 + dev_err(netdev->dev.parent, 1074 + "couldn't initialize controller: %d\n", err); 1075 + goto cleanup_tx_msg_buffer; 1076 + } 1077 + 1078 + err = register_candev(netdev); 1079 + if (err) { 1080 + dev_err(netdev->dev.parent, 1081 + "couldn't register CAN device: %d\n", err); 1082 + goto cleanup_tx_msg_buffer; 1083 + } 1084 + 1085 + return 0; 1086 + 1087 + cleanup_tx_msg_buffer: 1088 + kfree(dev->tx_msg_buffer); 1089 + 1090 + cleanup_intr_in_buffer: 1091 + kfree(dev->intr_in_buffer); 1092 + 1093 + cleanup_intr_urb: 1094 + usb_free_urb(dev->intr_urb); 1095 + 1096 + cleanup_candev: 1097 + free_candev(netdev); 1098 + 1099 + return err; 1100 + } 1101 + 1102 + /* 1103 + * called by the usb core when the device is removed from the system 1104 + */ 1105 + static void ems_usb_disconnect(struct usb_interface *intf) 1106 + { 1107 + struct ems_usb *dev = usb_get_intfdata(intf); 1108 + 1109 + usb_set_intfdata(intf, NULL); 1110 + 1111 + if (dev) { 1112 + unregister_netdev(dev->netdev); 1113 + free_candev(dev->netdev); 1114 + 1115 + unlink_all_urbs(dev); 1116 + 1117 + usb_free_urb(dev->intr_urb); 1118 + 1119 + kfree(dev->intr_in_buffer); 1120 + } 1121 + } 1122 + 1123 + /* usb specific object needed to register this driver with the usb subsystem */ 1124 + static struct usb_driver ems_usb_driver = { 1125 + .name = "ems_usb", 1126 + .probe = ems_usb_probe, 1127 + .disconnect = ems_usb_disconnect, 1128 + .id_table = ems_usb_table, 1129 + }; 1130 + 1131 + static int __init ems_usb_init(void) 1132 + { 1133 + int err; 1134 + 1135 + printk(KERN_INFO "CPC-USB kernel driver loaded\n"); 1136 + 1137 + /* register this driver with the USB subsystem */ 1138 + err = usb_register(&ems_usb_driver); 1139 + 1140 + if (err) { 1141 + err("usb_register failed. Error number %d\n", err); 1142 + return err; 1143 + } 1144 + 1145 + return 0; 1146 + } 1147 + 1148 + static void __exit ems_usb_exit(void) 1149 + { 1150 + /* deregister this driver with the USB subsystem */ 1151 + usb_deregister(&ems_usb_driver); 1152 + } 1153 + 1154 + module_init(ems_usb_init); 1155 + module_exit(ems_usb_exit);