Lines Matching refs:sl
143 static void slc_bump(struct slcan *sl) in slc_bump() argument
149 char *cmd = sl->rbuff; in slc_bump()
159 cf.can_dlc = sl->rbuff[SLC_CMD_LEN + SLC_SFF_ID_LEN]; in slc_bump()
160 sl->rbuff[SLC_CMD_LEN + SLC_SFF_ID_LEN] = 0; in slc_bump()
170 cf.can_dlc = sl->rbuff[SLC_CMD_LEN + SLC_EFF_ID_LEN]; in slc_bump()
171 sl->rbuff[SLC_CMD_LEN + SLC_EFF_ID_LEN] = 0; in slc_bump()
179 if (kstrtou32(sl->rbuff + SLC_CMD_LEN, 16, &tmpid)) in slc_bump()
209 skb->dev = sl->dev; in slc_bump()
215 can_skb_prv(skb)->ifindex = sl->dev->ifindex; in slc_bump()
220 sl->dev->stats.rx_packets++; in slc_bump()
221 sl->dev->stats.rx_bytes += cf.can_dlc; in slc_bump()
226 static void slcan_unesc(struct slcan *sl, unsigned char s) in slcan_unesc() argument
229 if (!test_and_clear_bit(SLF_ERROR, &sl->flags) && in slcan_unesc()
230 (sl->rcount > 4)) { in slcan_unesc()
231 slc_bump(sl); in slcan_unesc()
233 sl->rcount = 0; in slcan_unesc()
235 if (!test_bit(SLF_ERROR, &sl->flags)) { in slcan_unesc()
236 if (sl->rcount < SLC_MTU) { in slcan_unesc()
237 sl->rbuff[sl->rcount++] = s; in slcan_unesc()
240 sl->dev->stats.rx_over_errors++; in slcan_unesc()
241 set_bit(SLF_ERROR, &sl->flags); in slcan_unesc()
252 static void slc_encaps(struct slcan *sl, struct can_frame *cf) in slc_encaps() argument
259 pos = sl->xbuff; in slc_encaps()
303 set_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags); in slc_encaps()
304 actual = sl->tty->ops->write(sl->tty, sl->xbuff, pos - sl->xbuff); in slc_encaps()
305 sl->xleft = (pos - sl->xbuff) - actual; in slc_encaps()
306 sl->xhead = sl->xbuff + actual; in slc_encaps()
307 sl->dev->stats.tx_bytes += cf->can_dlc; in slc_encaps()
313 struct slcan *sl = container_of(work, struct slcan, tx_work); in slcan_transmit() local
316 spin_lock_bh(&sl->lock); in slcan_transmit()
318 if (!sl->tty || sl->magic != SLCAN_MAGIC || !netif_running(sl->dev)) { in slcan_transmit()
319 spin_unlock_bh(&sl->lock); in slcan_transmit()
323 if (sl->xleft <= 0) { in slcan_transmit()
326 sl->dev->stats.tx_packets++; in slcan_transmit()
327 clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags); in slcan_transmit()
328 spin_unlock_bh(&sl->lock); in slcan_transmit()
329 netif_wake_queue(sl->dev); in slcan_transmit()
333 actual = sl->tty->ops->write(sl->tty, sl->xhead, sl->xleft); in slcan_transmit()
334 sl->xleft -= actual; in slcan_transmit()
335 sl->xhead += actual; in slcan_transmit()
336 spin_unlock_bh(&sl->lock); in slcan_transmit()
345 struct slcan *sl; in slcan_write_wakeup() local
348 sl = rcu_dereference(tty->disc_data); in slcan_write_wakeup()
349 if (sl) in slcan_write_wakeup()
350 schedule_work(&sl->tx_work); in slcan_write_wakeup()
357 struct slcan *sl = netdev_priv(dev); in slc_xmit() local
362 spin_lock(&sl->lock); in slc_xmit()
364 spin_unlock(&sl->lock); in slc_xmit()
368 if (sl->tty == NULL) { in slc_xmit()
369 spin_unlock(&sl->lock); in slc_xmit()
373 netif_stop_queue(sl->dev); in slc_xmit()
374 slc_encaps(sl, (struct can_frame *) skb->data); /* encaps & send */ in slc_xmit()
375 spin_unlock(&sl->lock); in slc_xmit()
390 struct slcan *sl = netdev_priv(dev); in slc_close() local
392 spin_lock_bh(&sl->lock); in slc_close()
393 if (sl->tty) { in slc_close()
395 clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags); in slc_close()
398 sl->rcount = 0; in slc_close()
399 sl->xleft = 0; in slc_close()
400 spin_unlock_bh(&sl->lock); in slc_close()
408 struct slcan *sl = netdev_priv(dev); in slc_open() local
410 if (sl->tty == NULL) in slc_open()
413 sl->flags &= (1 << SLF_INUSE); in slc_open()
472 struct slcan *sl = (struct slcan *) tty->disc_data; in slcan_receive_buf() local
474 if (!sl || sl->magic != SLCAN_MAGIC || !netif_running(sl->dev)) in slcan_receive_buf()
480 if (!test_and_set_bit(SLF_ERROR, &sl->flags)) in slcan_receive_buf()
481 sl->dev->stats.rx_errors++; in slcan_receive_buf()
485 slcan_unesc(sl, *cp++); in slcan_receive_buf()
498 struct slcan *sl; in slc_sync() local
505 sl = netdev_priv(dev); in slc_sync()
506 if (sl->tty) in slc_sync()
520 struct slcan *sl; in slc_alloc() local
535 size = ALIGN(sizeof(*sl), NETDEV_ALIGN) + sizeof(struct can_ml_priv); in slc_alloc()
541 sl = netdev_priv(dev); in slc_alloc()
542 can_ml = (void *)sl + ALIGN(sizeof(*sl), NETDEV_ALIGN); in slc_alloc()
546 sl->magic = SLCAN_MAGIC; in slc_alloc()
547 sl->dev = dev; in slc_alloc()
548 spin_lock_init(&sl->lock); in slc_alloc()
549 INIT_WORK(&sl->tx_work, slcan_transmit); in slc_alloc()
552 return sl; in slc_alloc()
567 struct slcan *sl; in slcan_open() local
585 sl = tty->disc_data; in slcan_open()
589 if (sl && sl->magic == SLCAN_MAGIC) in slcan_open()
594 sl = slc_alloc(); in slcan_open()
595 if (sl == NULL) in slcan_open()
598 sl->tty = tty; in slcan_open()
599 tty->disc_data = sl; in slcan_open()
601 if (!test_bit(SLF_INUSE, &sl->flags)) { in slcan_open()
603 sl->rcount = 0; in slcan_open()
604 sl->xleft = 0; in slcan_open()
606 set_bit(SLF_INUSE, &sl->flags); in slcan_open()
608 err = register_netdevice(sl->dev); in slcan_open()
621 sl->tty = NULL; in slcan_open()
623 clear_bit(SLF_INUSE, &sl->flags); in slcan_open()
624 slc_free_netdev(sl->dev); in slcan_open()
627 free_netdev(sl->dev); in slcan_open()
647 struct slcan *sl = (struct slcan *) tty->disc_data; in slcan_close() local
650 if (!sl || sl->magic != SLCAN_MAGIC || sl->tty != tty) in slcan_close()
653 spin_lock_bh(&sl->lock); in slcan_close()
655 sl->tty = NULL; in slcan_close()
656 spin_unlock_bh(&sl->lock); in slcan_close()
659 flush_work(&sl->tx_work); in slcan_close()
662 unregister_netdev(sl->dev); in slcan_close()
676 struct slcan *sl = (struct slcan *) tty->disc_data; in slcan_ioctl() local
680 if (!sl || sl->magic != SLCAN_MAGIC) in slcan_ioctl()
685 tmp = strlen(sl->dev->name) + 1; in slcan_ioctl()
686 if (copy_to_user((void __user *)arg, sl->dev->name, tmp)) in slcan_ioctl()
737 struct slcan *sl; in slcan_exit() local
755 sl = netdev_priv(dev); in slcan_exit()
756 spin_lock_bh(&sl->lock); in slcan_exit()
757 if (sl->tty) { in slcan_exit()
759 tty_hangup(sl->tty); in slcan_exit()
761 spin_unlock_bh(&sl->lock); in slcan_exit()
774 sl = netdev_priv(dev); in slcan_exit()
775 if (sl->tty) { in slcan_exit()