Lines Matching full:sl

121 	struct slcan *sl = netdev_priv(ndev);  in slcan_err_rst_on_open()  local
123 return !!test_bit(CF_ERR_RST, &sl->cmd_flags); in slcan_err_rst_on_open()
128 struct slcan *sl = netdev_priv(ndev); in slcan_enable_err_rst_on_open() local
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()
180 static void slcan_bump_frame(struct slcan *sl) in slcan_bump_frame() argument
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()
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()
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()
250 sl->dev->stats.rx_packets++; 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()
270 static void slcan_bump_state(struct slcan *sl) in slcan_bump_state() argument
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()
334 static void slcan_bump_err(struct slcan *sl) in slcan_bump_err() argument
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()
353 if ((len + SLCAN_CMD_LEN + 1) > sl->rcount) in slcan_bump_err()
450 static void slcan_bump(struct slcan *sl) in slcan_bump() argument
452 switch (sl->rbuff[0]) { in slcan_bump()
460 return slcan_bump_frame(sl); in slcan_bump()
462 return slcan_bump_err(sl); in slcan_bump()
464 return slcan_bump_state(sl); in slcan_bump()
471 static void slcan_unesc(struct slcan *sl, unsigned char s) in slcan_unesc() argument
474 if (!test_and_clear_bit(SLF_ERROR, &sl->flags)) in slcan_unesc()
475 slcan_bump(sl); 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()
496 static void slcan_encaps(struct slcan *sl, struct can_frame *cf) in slcan_encaps() argument
503 pos = sl->xbuff; in slcan_encaps()
537 sl->dev->stats.tx_bytes += cf->len; 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()
559 struct slcan *sl = container_of(work, struct slcan, tx_work); in slcan_transmit() local
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() local
602 schedule_work(&sl->tx_work); in slcan_write_wakeup()
609 struct slcan *sl = netdev_priv(dev); in slcan_netdev_xmit() local
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()
640 static int slcan_transmit_cmd(struct slcan *sl, const unsigned char *cmd) in slcan_transmit_cmd() argument
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()
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()
673 struct slcan *sl = netdev_priv(dev); in slcan_netdev_close() local
676 if (sl->can.bittiming.bitrate && in slcan_netdev_close()
677 sl->can.bittiming.bitrate != CAN_BITRATE_UNKNOWN) { in slcan_netdev_close()
678 err = slcan_transmit_cmd(sl, "C\r"); 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()
702 struct slcan *sl = netdev_priv(dev); in slcan_netdev_open() local
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()
730 err = slcan_transmit_cmd(sl, cmd); in slcan_netdev_open()
738 if (test_bit(CF_ERR_RST, &sl->cmd_flags)) { in slcan_netdev_open()
739 err = slcan_transmit_cmd(sl, "F\r"); in slcan_netdev_open()
747 if (sl->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) { in slcan_netdev_open()
748 err = slcan_transmit_cmd(sl, "L\r"); in slcan_netdev_open()
755 err = slcan_transmit_cmd(sl, "O\r"); in slcan_netdev_open()
764 sl->can.state = CAN_STATE_ERROR_ACTIVE; in slcan_netdev_open()
794 struct slcan *sl = tty->disc_data; in slcan_receive_buf() local
796 if (!netif_running(sl->dev)) 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()
807 slcan_unesc(sl, *cp++); in slcan_receive_buf()
820 struct slcan *sl; in slcan_open() local
829 dev = alloc_candev(sizeof(*sl), 1); in slcan_open()
833 sl = netdev_priv(dev); 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()
854 sl->tty = tty; in slcan_open()
855 tty->disc_data = sl; in slcan_open()
878 struct slcan *sl = tty->disc_data; in slcan_close() local
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()
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() local
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()