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>
114 return !!test_bit(CF_ERR_RST, &sl->cmd_flags); in slcan_err_rst_on_open()
122 return -EBUSY; in slcan_enable_err_rst_on_open()
125 set_bit(CF_ERR_RST, &sl->cmd_flags); in slcan_enable_err_rst_on_open()
127 clear_bit(CF_ERR_RST, &sl->cmd_flags); in slcan_enable_err_rst_on_open()
140 * RTR-bit is set. This causes another ECU to send a CAN frame with the
147 * RTR frames are defined as 'r' types - normal frames have 't' type:
154 * The <dlc> is a one byte ASCII number ('0' - '8')
177 char *cmd = sl->rbuff; in slcan_bump_frame()
179 skb = alloc_can_skb(sl->dev, &cf); in slcan_bump_frame()
181 sl->dev->stats.rx_dropped++; in slcan_bump_frame()
187 cf->can_id = CAN_RTR_FLAG; in slcan_bump_frame()
191 cf->len = sl->rbuff[SLCAN_CMD_LEN + SLCAN_SFF_ID_LEN]; in slcan_bump_frame()
192 sl->rbuff[SLCAN_CMD_LEN + SLCAN_SFF_ID_LEN] = 0; in slcan_bump_frame()
197 cf->can_id = CAN_RTR_FLAG; in slcan_bump_frame()
200 cf->can_id |= CAN_EFF_FLAG; in slcan_bump_frame()
202 cf->len = sl->rbuff[SLCAN_CMD_LEN + SLCAN_EFF_ID_LEN]; in slcan_bump_frame()
203 sl->rbuff[SLCAN_CMD_LEN + SLCAN_EFF_ID_LEN] = 0; in slcan_bump_frame()
211 if (kstrtou32(sl->rbuff + SLCAN_CMD_LEN, 16, &tmpid)) in slcan_bump_frame()
214 cf->can_id |= tmpid; in slcan_bump_frame()
217 if (cf->len >= '0' && cf->len < '9') in slcan_bump_frame()
218 cf->len -= '0'; in slcan_bump_frame()
223 if (!(cf->can_id & CAN_RTR_FLAG)) { in slcan_bump_frame()
224 for (i = 0; i < cf->len; i++) { in slcan_bump_frame()
229 cf->data[i] = (tmp << 4); in slcan_bump_frame()
234 cf->data[i] |= tmp; in slcan_bump_frame()
238 sl->dev->stats.rx_packets++; in slcan_bump_frame()
239 if (!(cf->can_id & CAN_RTR_FLAG)) in slcan_bump_frame()
240 sl->dev->stats.rx_bytes += cf->len; in slcan_bump_frame()
246 sl->dev->stats.rx_errors++; in slcan_bump_frame()
255 * sb256256 : state bus-off: rx counter 256, tx counter 256
260 struct net_device *dev = sl->dev; in slcan_bump_state()
263 char *cmd = sl->rbuff; in slcan_bump_state()
284 if (state == sl->can.state || sl->rcount < SLCAN_STATE_FRAME_LEN) in slcan_bump_state()
293 cmd -= SLCAN_STATE_BE_RXCNT_LEN; in slcan_bump_state()
306 cf->can_id |= CAN_ERR_CNT; in slcan_bump_state()
307 cf->data[6] = txerr; in slcan_bump_state()
308 cf->data[7] = rxerr; in slcan_bump_state()
324 struct net_device *dev = sl->dev; in slcan_bump_err()
327 char *cmd = sl->rbuff; in slcan_bump_err()
334 len -= '0'; in slcan_bump_err()
338 if ((len + SLCAN_CMD_LEN + 1) > sl->rcount) in slcan_bump_err()
344 cf->can_id |= CAN_ERR_PROT | CAN_ERR_BUSERROR; in slcan_bump_err()
353 cf->can_id |= CAN_ERR_ACK; in slcan_bump_err()
354 cf->data[3] = CAN_ERR_PROT_LOC_ACK; in slcan_bump_err()
362 cf->data[2] |= CAN_ERR_PROT_BIT0; in slcan_bump_err()
369 cf->data[2] |= CAN_ERR_PROT_BIT1; in slcan_bump_err()
376 cf->data[2] |= CAN_ERR_PROT_BIT; in slcan_bump_err()
377 cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ; in slcan_bump_err()
385 cf->data[2] |= CAN_ERR_PROT_FORM; in slcan_bump_err()
393 cf->can_id |= CAN_ERR_CRTL; in slcan_bump_err()
394 cf->data[1] = CAN_ERR_CRTL_RX_OVERFLOW; in slcan_bump_err()
402 cf->can_id |= CAN_ERR_CRTL; in slcan_bump_err()
403 cf->data[1] = CAN_ERR_CRTL_TX_OVERFLOW; in slcan_bump_err()
411 cf->data[2] |= CAN_ERR_PROT_STUFF; in slcan_bump_err()
423 dev->stats.rx_errors++; in slcan_bump_err()
426 dev->stats.rx_over_errors++; in slcan_bump_err()
429 dev->stats.tx_errors++; in slcan_bump_err()
437 switch (sl->rbuff[0]) { in slcan_bump()
459 if (!test_and_clear_bit(SLF_ERROR, &sl->flags) && in slcan_unesc()
460 sl->rcount > 4) in slcan_unesc()
463 sl->rcount = 0; in slcan_unesc()
465 if (!test_bit(SLF_ERROR, &sl->flags)) { in slcan_unesc()
466 if (sl->rcount < SLCAN_MTU) { in slcan_unesc()
467 sl->rbuff[sl->rcount++] = s; in slcan_unesc()
471 sl->dev->stats.rx_over_errors++; in slcan_unesc()
472 set_bit(SLF_ERROR, &sl->flags); in slcan_unesc()
487 canid_t id = cf->can_id; in slcan_encaps()
489 pos = sl->xbuff; in slcan_encaps()
491 if (cf->can_id & CAN_RTR_FLAG) in slcan_encaps()
496 /* determine number of chars for the CAN-identifier */ in slcan_encaps()
497 if (cf->can_id & CAN_EFF_FLAG) { in slcan_encaps()
509 *endpos-- = hex_asc_upper[id & 0xf]; in slcan_encaps()
513 pos += (cf->can_id & CAN_EFF_FLAG) ? in slcan_encaps()
516 *pos++ = cf->len + '0'; in slcan_encaps()
519 if (!(cf->can_id & CAN_RTR_FLAG)) { in slcan_encaps()
520 for (i = 0; i < cf->len; i++) in slcan_encaps()
521 pos = hex_byte_pack_upper(pos, cf->data[i]); in slcan_encaps()
523 sl->dev->stats.tx_bytes += cf->len; in slcan_encaps()
530 * the transfer may be completed inside the ops->write() in slcan_encaps()
536 set_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags); in slcan_encaps()
537 actual = sl->tty->ops->write(sl->tty, sl->xbuff, pos - sl->xbuff); in slcan_encaps()
538 sl->xleft = (pos - sl->xbuff) - actual; in slcan_encaps()
539 sl->xhead = sl->xbuff + actual; in slcan_encaps()
548 spin_lock_bh(&sl->lock); in slcan_transmit()
550 if (unlikely(!netif_running(sl->dev)) && in slcan_transmit()
551 likely(!test_bit(SLF_XCMD, &sl->flags))) { in slcan_transmit()
552 spin_unlock_bh(&sl->lock); in slcan_transmit()
556 if (sl->xleft <= 0) { in slcan_transmit()
557 if (unlikely(test_bit(SLF_XCMD, &sl->flags))) { in slcan_transmit()
558 clear_bit(SLF_XCMD, &sl->flags); in slcan_transmit()
559 clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags); in slcan_transmit()
560 spin_unlock_bh(&sl->lock); in slcan_transmit()
561 wake_up(&sl->xcmd_wait); in slcan_transmit()
568 sl->dev->stats.tx_packets++; in slcan_transmit()
569 clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags); in slcan_transmit()
570 spin_unlock_bh(&sl->lock); in slcan_transmit()
571 netif_wake_queue(sl->dev); in slcan_transmit()
575 actual = sl->tty->ops->write(sl->tty, sl->xhead, sl->xleft); in slcan_transmit()
576 sl->xleft -= actual; in slcan_transmit()
577 sl->xhead += actual; in slcan_transmit()
578 spin_unlock_bh(&sl->lock); in slcan_transmit()
586 struct slcan *sl = tty->disc_data; in slcan_write_wakeup()
588 schedule_work(&sl->tx_work); in slcan_write_wakeup()
600 spin_lock(&sl->lock); in slcan_netdev_xmit()
602 spin_unlock(&sl->lock); in slcan_netdev_xmit()
606 if (!sl->tty) { in slcan_netdev_xmit()
607 spin_unlock(&sl->lock); in slcan_netdev_xmit()
611 netif_stop_queue(sl->dev); in slcan_netdev_xmit()
612 slcan_encaps(sl, (struct can_frame *)skb->data); /* encaps & send */ in slcan_netdev_xmit()
613 spin_unlock(&sl->lock); in slcan_netdev_xmit()
630 spin_lock(&sl->lock); in slcan_transmit_cmd()
631 if (!sl->tty) { in slcan_transmit_cmd()
632 spin_unlock(&sl->lock); in slcan_transmit_cmd()
633 return -ENODEV; in slcan_transmit_cmd()
636 n = scnprintf(sl->xbuff, sizeof(sl->xbuff), "%s", cmd); in slcan_transmit_cmd()
637 set_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags); in slcan_transmit_cmd()
638 actual = sl->tty->ops->write(sl->tty, sl->xbuff, n); in slcan_transmit_cmd()
639 sl->xleft = n - actual; in slcan_transmit_cmd()
640 sl->xhead = sl->xbuff + actual; in slcan_transmit_cmd()
641 set_bit(SLF_XCMD, &sl->flags); in slcan_transmit_cmd()
642 spin_unlock(&sl->lock); in slcan_transmit_cmd()
643 ret = wait_event_interruptible_timeout(sl->xcmd_wait, in slcan_transmit_cmd()
644 !test_bit(SLF_XCMD, &sl->flags), in slcan_transmit_cmd()
646 clear_bit(SLF_XCMD, &sl->flags); in slcan_transmit_cmd()
647 if (ret == -ERESTARTSYS) in slcan_transmit_cmd()
651 return -ETIMEDOUT; in slcan_transmit_cmd()
656 /* Netdevice UP -> DOWN routine */
662 if (sl->can.bittiming.bitrate && in slcan_netdev_close()
663 sl->can.bittiming.bitrate != CAN_BITRATE_UNKNOWN) { in slcan_netdev_close()
671 clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags); in slcan_netdev_close()
672 flush_work(&sl->tx_work); in slcan_netdev_close()
675 sl->rcount = 0; in slcan_netdev_close()
676 sl->xleft = 0; in slcan_netdev_close()
678 sl->can.state = CAN_STATE_STOPPED; in slcan_netdev_close()
679 if (sl->can.bittiming.bitrate == CAN_BITRATE_UNKNOWN) in slcan_netdev_close()
680 sl->can.bittiming.bitrate = CAN_BITRATE_UNSET; in slcan_netdev_close()
685 /* Netdevice DOWN -> UP routine */
693 * `ip link set <iface> type can bitrate <baud>' and therefore in slcan_netdev_open()
694 * can.bittiming.bitrate is CAN_BITRATE_UNSET (0), causing in slcan_netdev_open()
697 if (sl->can.bittiming.bitrate == CAN_BITRATE_UNSET) in slcan_netdev_open()
698 sl->can.bittiming.bitrate = CAN_BITRATE_UNKNOWN; in slcan_netdev_open()
706 if (sl->can.bittiming.bitrate != CAN_BITRATE_UNKNOWN) { in slcan_netdev_open()
708 if (sl->can.bittiming.bitrate == slcan_bitrate_const[s]) in slcan_netdev_open()
712 /* The CAN framework has already validate the bitrate value, in slcan_netdev_open()
719 "failed to send bitrate command 'C\\rS%d\\r'\n", in slcan_netdev_open()
724 if (test_bit(CF_ERR_RST, &sl->cmd_flags)) { in slcan_netdev_open()
733 if (sl->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) { in slcan_netdev_open()
737 "failed to send listen-only command 'L\\r'\n"); in slcan_netdev_open()
750 sl->can.state = CAN_STATE_ERROR_ACTIVE; in slcan_netdev_open()
774 * be re-entered while running but other ldisc functions may be called
780 struct slcan *sl = tty->disc_data; in slcan_receive_buf()
782 if (!netif_running(sl->dev)) in slcan_receive_buf()
786 while (count--) { in slcan_receive_buf()
788 if (!test_and_set_bit(SLF_ERROR, &sl->flags)) in slcan_receive_buf()
789 sl->dev->stats.rx_errors++; in slcan_receive_buf()
797 /* Open the high-level part of the SLCAN channel.
810 return -EPERM; in slcan_open()
812 if (!tty->ops->write) in slcan_open()
813 return -EOPNOTSUPP; in slcan_open()
817 return -ENFILE; in slcan_open()
822 tty->receive_room = 65536; /* We don't flow control */ in slcan_open()
823 sl->rcount = 0; in slcan_open()
824 sl->xleft = 0; in slcan_open()
825 spin_lock_init(&sl->lock); in slcan_open()
826 INIT_WORK(&sl->tx_work, slcan_transmit); in slcan_open()
827 init_waitqueue_head(&sl->xcmd_wait); in slcan_open()
830 sl->can.bitrate_const = slcan_bitrate_const; in slcan_open()
831 sl->can.bitrate_const_cnt = ARRAY_SIZE(slcan_bitrate_const); in slcan_open()
832 sl->can.ctrlmode_supported = CAN_CTRLMODE_LISTENONLY; in slcan_open()
835 sl->dev = dev; in slcan_open()
836 dev->netdev_ops = &slcan_netdev_ops; in slcan_open()
837 dev->ethtool_ops = &slcan_ethtool_ops; in slcan_open()
840 sl->tty = tty; in slcan_open()
841 tty->disc_data = sl; in slcan_open()
850 netdev_info(dev, "slcan on %s.\n", tty->name); in slcan_open()
864 struct slcan *sl = tty->disc_data; in slcan_close()
866 unregister_candev(sl->dev); in slcan_close()
872 flush_work(&sl->tx_work); in slcan_close()
875 spin_lock_bh(&sl->lock); in slcan_close()
876 tty->disc_data = NULL; in slcan_close()
877 sl->tty = NULL; in slcan_close()
878 spin_unlock_bh(&sl->lock); in slcan_close()
880 netdev_info(sl->dev, "slcan off %s.\n", tty->name); in slcan_close()
881 free_candev(sl->dev); in slcan_close()
888 struct slcan *sl = tty->disc_data; in slcan_ioctl()
893 tmp = strlen(sl->dev->name) + 1; in slcan_ioctl()
894 if (copy_to_user((void __user *)arg, sl->dev->name, tmp)) in slcan_ioctl()
895 return -EFAULT; in slcan_ioctl()
899 return -EINVAL; in slcan_ioctl()
934 * userspace - tty_ldisc.c takes care of the module's refcount. in slcan_exit()