Lines Matching +full:max +full:- +full:bitrate

2  * slcan.c - serial line CAN interface driver (using tty line discipline)
11 * can327.c Author : Max Staudt <max-linux@enpas.org>
123 return !!test_bit(CF_ERR_RST, &sl->cmd_flags); in slcan_err_rst_on_open()
131 return -EBUSY; in slcan_enable_err_rst_on_open()
134 set_bit(CF_ERR_RST, &sl->cmd_flags); in slcan_enable_err_rst_on_open()
136 clear_bit(CF_ERR_RST, &sl->cmd_flags); in slcan_enable_err_rst_on_open()
149 * RTR-bit is set. This causes another ECU to send a CAN frame with the
156 * RTR frames are defined as 'r' types - normal frames have 't' type:
163 * The <dlc> is a one byte ASCII number ('0' - '8')
186 char *cmd = sl->rbuff; in slcan_bump_frame()
188 if (sl->rcount < SLCAN_FRAME_MSG_LEN_MIN) in slcan_bump_frame()
191 skb = alloc_can_skb(sl->dev, &cf); in slcan_bump_frame()
193 sl->dev->stats.rx_dropped++; in slcan_bump_frame()
199 cf->can_id = CAN_RTR_FLAG; in slcan_bump_frame()
203 cf->len = sl->rbuff[SLCAN_CMD_LEN + SLCAN_SFF_ID_LEN]; in slcan_bump_frame()
204 sl->rbuff[SLCAN_CMD_LEN + SLCAN_SFF_ID_LEN] = 0; in slcan_bump_frame()
209 cf->can_id = CAN_RTR_FLAG; in slcan_bump_frame()
212 cf->can_id |= CAN_EFF_FLAG; in slcan_bump_frame()
214 cf->len = sl->rbuff[SLCAN_CMD_LEN + SLCAN_EFF_ID_LEN]; in slcan_bump_frame()
215 sl->rbuff[SLCAN_CMD_LEN + SLCAN_EFF_ID_LEN] = 0; in slcan_bump_frame()
223 if (kstrtou32(sl->rbuff + SLCAN_CMD_LEN, 16, &tmpid)) in slcan_bump_frame()
226 cf->can_id |= tmpid; in slcan_bump_frame()
229 if (cf->len >= '0' && cf->len < '9') in slcan_bump_frame()
230 cf->len -= '0'; in slcan_bump_frame()
235 if (!(cf->can_id & CAN_RTR_FLAG)) { in slcan_bump_frame()
236 for (i = 0; i < cf->len; i++) { in slcan_bump_frame()
241 cf->data[i] = (tmp << 4); in slcan_bump_frame()
246 cf->data[i] |= tmp; in slcan_bump_frame()
250 sl->dev->stats.rx_packets++; in slcan_bump_frame()
251 if (!(cf->can_id & CAN_RTR_FLAG)) in slcan_bump_frame()
252 sl->dev->stats.rx_bytes += cf->len; in slcan_bump_frame()
258 sl->dev->stats.rx_errors++; in slcan_bump_frame()
267 * sb256256 : state bus-off: rx counter 256, tx counter 256
272 struct net_device *dev = sl->dev; in slcan_bump_state()
275 char *cmd = sl->rbuff; in slcan_bump_state()
296 if (state == sl->can.state || sl->rcount != SLCAN_STATE_MSG_LEN) in slcan_bump_state()
305 cmd -= SLCAN_STATE_BE_RXCNT_LEN; in slcan_bump_state()
318 cf->can_id |= CAN_ERR_CNT; in slcan_bump_state()
319 cf->data[6] = txerr; in slcan_bump_state()
320 cf->data[7] = rxerr; in slcan_bump_state()
336 struct net_device *dev = sl->dev; in slcan_bump_err()
339 char *cmd = sl->rbuff; in slcan_bump_err()
343 if (sl->rcount < SLCAN_ERROR_MSG_LEN_MIN) in slcan_bump_err()
349 len -= '0'; in slcan_bump_err()
353 if ((len + SLCAN_CMD_LEN + 1) > sl->rcount) in slcan_bump_err()
359 cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR; in slcan_bump_err()
368 cf->can_id |= CAN_ERR_ACK; in slcan_bump_err()
369 cf->data[3] = CAN_ERR_PROT_LOC_ACK; in slcan_bump_err()
377 cf->data[2] |= CAN_ERR_PROT_BIT0; in slcan_bump_err()
384 cf->data[2] |= CAN_ERR_PROT_BIT1; in slcan_bump_err()
391 cf->data[2] |= CAN_ERR_PROT_BIT; in slcan_bump_err()
392 cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ; in slcan_bump_err()
400 cf->data[2] |= CAN_ERR_PROT_FORM; in slcan_bump_err()
408 cf->can_id |= CAN_ERR_CRTL; in slcan_bump_err()
409 cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW; in slcan_bump_err()
417 cf->can_id |= CAN_ERR_CRTL; in slcan_bump_err()
418 cf->data[1] = CAN_ERR_CRTL_TX_OVERFLOW; in slcan_bump_err()
426 cf->data[2] |= CAN_ERR_PROT_STUFF; in slcan_bump_err()
438 dev->stats.rx_errors++; in slcan_bump_err()
441 dev->stats.rx_over_errors++; in slcan_bump_err()
444 dev->stats.tx_errors++; in slcan_bump_err()
452 switch (sl->rbuff[0]) { in slcan_bump()
474 if (!test_and_clear_bit(SLF_ERROR, &sl->flags)) in slcan_unesc()
477 sl->rcount = 0; in slcan_unesc()
479 if (!test_bit(SLF_ERROR, &sl->flags)) { in slcan_unesc()
480 if (sl->rcount < SLCAN_MTU) { in slcan_unesc()
481 sl->rbuff[sl->rcount++] = s; in slcan_unesc()
485 sl->dev->stats.rx_over_errors++; in slcan_unesc()
486 set_bit(SLF_ERROR, &sl->flags); in slcan_unesc()
501 canid_t id = cf->can_id; in slcan_encaps()
503 pos = sl->xbuff; in slcan_encaps()
505 if (cf->can_id & CAN_RTR_FLAG) in slcan_encaps()
510 /* determine number of chars for the CAN-identifier */ in slcan_encaps()
511 if (cf->can_id & CAN_EFF_FLAG) { in slcan_encaps()
523 *endpos-- = hex_asc_upper[id & 0xf]; in slcan_encaps()
527 pos += (cf->can_id & CAN_EFF_FLAG) ? in slcan_encaps()
530 *pos++ = cf->len + '0'; in slcan_encaps()
533 if (!(cf->can_id & CAN_RTR_FLAG)) { in slcan_encaps()
534 for (i = 0; i < cf->len; i++) in slcan_encaps()
535 pos = hex_byte_pack_upper(pos, cf->data[i]); in slcan_encaps()
537 sl->dev->stats.tx_bytes += cf->len; in slcan_encaps()
544 * the transfer may be completed inside the ops->write() in slcan_encaps()
550 set_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags); in slcan_encaps()
551 actual = sl->tty->ops->write(sl->tty, sl->xbuff, pos - sl->xbuff); in slcan_encaps()
552 sl->xleft = (pos - sl->xbuff) - actual; in slcan_encaps()
553 sl->xhead = sl->xbuff + actual; in slcan_encaps()
562 spin_lock_bh(&sl->lock); in slcan_transmit()
564 if (unlikely(!netif_running(sl->dev)) && in slcan_transmit()
565 likely(!test_bit(SLF_XCMD, &sl->flags))) { in slcan_transmit()
566 spin_unlock_bh(&sl->lock); in slcan_transmit()
570 if (sl->xleft <= 0) { in slcan_transmit()
571 if (unlikely(test_bit(SLF_XCMD, &sl->flags))) { in slcan_transmit()
572 clear_bit(SLF_XCMD, &sl->flags); in slcan_transmit()
573 clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags); in slcan_transmit()
574 spin_unlock_bh(&sl->lock); in slcan_transmit()
575 wake_up(&sl->xcmd_wait); in slcan_transmit()
582 sl->dev->stats.tx_packets++; in slcan_transmit()
583 clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags); in slcan_transmit()
584 spin_unlock_bh(&sl->lock); in slcan_transmit()
585 netif_wake_queue(sl->dev); in slcan_transmit()
589 actual = sl->tty->ops->write(sl->tty, sl->xhead, sl->xleft); in slcan_transmit()
590 sl->xleft -= actual; in slcan_transmit()
591 sl->xhead += actual; in slcan_transmit()
592 spin_unlock_bh(&sl->lock); in slcan_transmit()
600 struct slcan *sl = tty->disc_data; in slcan_write_wakeup()
602 schedule_work(&sl->tx_work); in slcan_write_wakeup()
614 spin_lock(&sl->lock); in slcan_netdev_xmit()
616 spin_unlock(&sl->lock); in slcan_netdev_xmit()
620 if (!sl->tty) { in slcan_netdev_xmit()
621 spin_unlock(&sl->lock); in slcan_netdev_xmit()
625 netif_stop_queue(sl->dev); in slcan_netdev_xmit()
626 slcan_encaps(sl, (struct can_frame *)skb->data); /* encaps & send */ in slcan_netdev_xmit()
627 spin_unlock(&sl->lock); in slcan_netdev_xmit()
644 spin_lock(&sl->lock); in slcan_transmit_cmd()
645 if (!sl->tty) { in slcan_transmit_cmd()
646 spin_unlock(&sl->lock); in slcan_transmit_cmd()
647 return -ENODEV; in slcan_transmit_cmd()
650 n = scnprintf(sl->xbuff, sizeof(sl->xbuff), "%s", cmd); in slcan_transmit_cmd()
651 set_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags); in slcan_transmit_cmd()
652 actual = sl->tty->ops->write(sl->tty, sl->xbuff, n); in slcan_transmit_cmd()
653 sl->xleft = n - actual; in slcan_transmit_cmd()
654 sl->xhead = sl->xbuff + actual; in slcan_transmit_cmd()
655 set_bit(SLF_XCMD, &sl->flags); in slcan_transmit_cmd()
656 spin_unlock(&sl->lock); in slcan_transmit_cmd()
657 ret = wait_event_interruptible_timeout(sl->xcmd_wait, in slcan_transmit_cmd()
658 !test_bit(SLF_XCMD, &sl->flags), in slcan_transmit_cmd()
660 clear_bit(SLF_XCMD, &sl->flags); in slcan_transmit_cmd()
661 if (ret == -ERESTARTSYS) in slcan_transmit_cmd()
665 return -ETIMEDOUT; in slcan_transmit_cmd()
670 /* Netdevice UP -> DOWN routine */
676 if (sl->can.bittiming.bitrate && in slcan_netdev_close()
677 sl->can.bittiming.bitrate != CAN_BITRATE_UNKNOWN) { in slcan_netdev_close()
685 clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags); in slcan_netdev_close()
686 flush_work(&sl->tx_work); in slcan_netdev_close()
689 sl->rcount = 0; in slcan_netdev_close()
690 sl->xleft = 0; in slcan_netdev_close()
692 sl->can.state = CAN_STATE_STOPPED; in slcan_netdev_close()
693 if (sl->can.bittiming.bitrate == CAN_BITRATE_UNKNOWN) in slcan_netdev_close()
694 sl->can.bittiming.bitrate = CAN_BITRATE_UNSET; in slcan_netdev_close()
699 /* Netdevice DOWN -> UP routine */
707 * `ip link set <iface> type can bitrate <baud>' and therefore in slcan_netdev_open()
708 * can.bittiming.bitrate is CAN_BITRATE_UNSET (0), causing in slcan_netdev_open()
711 if (sl->can.bittiming.bitrate == CAN_BITRATE_UNSET) in slcan_netdev_open()
712 sl->can.bittiming.bitrate = CAN_BITRATE_UNKNOWN; in slcan_netdev_open()
720 if (sl->can.bittiming.bitrate != CAN_BITRATE_UNKNOWN) { in slcan_netdev_open()
722 if (sl->can.bittiming.bitrate == slcan_bitrate_const[s]) in slcan_netdev_open()
726 /* The CAN framework has already validate the bitrate value, in slcan_netdev_open()
733 "failed to send bitrate command 'C\\rS%d\\r'\n", in slcan_netdev_open()
738 if (test_bit(CF_ERR_RST, &sl->cmd_flags)) { in slcan_netdev_open()
747 if (sl->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) { in slcan_netdev_open()
751 "failed to send listen-only command 'L\\r'\n"); in slcan_netdev_open()
764 sl->can.state = CAN_STATE_ERROR_ACTIVE; in slcan_netdev_open()
788 * be re-entered while running but other ldisc functions may be called
794 struct slcan *sl = tty->disc_data; in slcan_receive_buf()
796 if (!netif_running(sl->dev)) in slcan_receive_buf()
800 while (count--) { in slcan_receive_buf()
802 if (!test_and_set_bit(SLF_ERROR, &sl->flags)) in slcan_receive_buf()
803 sl->dev->stats.rx_errors++; in slcan_receive_buf()
811 /* Open the high-level part of the SLCAN channel.
824 return -EPERM; in slcan_open()
826 if (!tty->ops->write) in slcan_open()
827 return -EOPNOTSUPP; in slcan_open()
831 return -ENFILE; in slcan_open()
836 tty->receive_room = 65536; /* We don't flow control */ in slcan_open()
837 sl->rcount = 0; in slcan_open()
838 sl->xleft = 0; in slcan_open()
839 spin_lock_init(&sl->lock); in slcan_open()
840 INIT_WORK(&sl->tx_work, slcan_transmit); in slcan_open()
841 init_waitqueue_head(&sl->xcmd_wait); in slcan_open()
844 sl->can.bitrate_const = slcan_bitrate_const; in slcan_open()
845 sl->can.bitrate_const_cnt = ARRAY_SIZE(slcan_bitrate_const); in slcan_open()
846 sl->can.ctrlmode_supported = CAN_CTRLMODE_LISTENONLY; in slcan_open()
849 sl->dev = dev; in slcan_open()
850 dev->netdev_ops = &slcan_netdev_ops; in slcan_open()
851 dev->ethtool_ops = &slcan_ethtool_ops; in slcan_open()
854 sl->tty = tty; in slcan_open()
855 tty->disc_data = sl; in slcan_open()
864 netdev_info(dev, "slcan on %s.\n", tty->name); in slcan_open()
878 struct slcan *sl = tty->disc_data; in slcan_close()
880 unregister_candev(sl->dev); in slcan_close()
886 flush_work(&sl->tx_work); in slcan_close()
889 spin_lock_bh(&sl->lock); in slcan_close()
890 tty->disc_data = NULL; in slcan_close()
891 sl->tty = NULL; in slcan_close()
892 spin_unlock_bh(&sl->lock); in slcan_close()
894 netdev_info(sl->dev, "slcan off %s.\n", tty->name); in slcan_close()
895 free_candev(sl->dev); in slcan_close()
902 struct slcan *sl = tty->disc_data; in slcan_ioctl()
907 tmp = strlen(sl->dev->name) + 1; in slcan_ioctl()
908 if (copy_to_user((void __user *)arg, sl->dev->name, tmp)) in slcan_ioctl()
909 return -EFAULT; in slcan_ioctl()
913 return -EINVAL; in slcan_ioctl()
948 * userspace - tty_ldisc.c takes care of the module's refcount. in slcan_exit()