Lines Matching refs:sl
48 static void x25_asy_unesc(struct x25_asy *sl, unsigned char c);
55 struct x25_asy *sl; in x25_asy_alloc() local
68 sl = netdev_priv(dev); in x25_asy_alloc()
70 if (!test_and_set_bit(SLF_INUSE, &sl->flags)) in x25_asy_alloc()
71 return sl; in x25_asy_alloc()
90 sl = netdev_priv(dev); in x25_asy_alloc()
96 set_bit(SLF_INUSE, &sl->flags); in x25_asy_alloc()
98 return sl; in x25_asy_alloc()
109 static void x25_asy_free(struct x25_asy *sl) in x25_asy_free() argument
112 kfree(sl->rbuff); in x25_asy_free()
113 sl->rbuff = NULL; in x25_asy_free()
114 kfree(sl->xbuff); in x25_asy_free()
115 sl->xbuff = NULL; in x25_asy_free()
117 if (!test_and_clear_bit(SLF_INUSE, &sl->flags)) in x25_asy_free()
118 netdev_err(sl->dev, "x25_asy_free for already free unit\n"); in x25_asy_free()
123 struct x25_asy *sl = netdev_priv(dev); in x25_asy_change_mtu() local
137 spin_lock_bh(&sl->lock); in x25_asy_change_mtu()
138 xbuff = xchg(&sl->xbuff, xbuff); in x25_asy_change_mtu()
139 if (sl->xleft) { in x25_asy_change_mtu()
140 if (sl->xleft <= len) { in x25_asy_change_mtu()
141 memcpy(sl->xbuff, sl->xhead, sl->xleft); in x25_asy_change_mtu()
143 sl->xleft = 0; in x25_asy_change_mtu()
147 sl->xhead = sl->xbuff; in x25_asy_change_mtu()
149 rbuff = xchg(&sl->rbuff, rbuff); in x25_asy_change_mtu()
150 if (sl->rcount) { in x25_asy_change_mtu()
151 if (sl->rcount <= len) { in x25_asy_change_mtu()
152 memcpy(sl->rbuff, rbuff, sl->rcount); in x25_asy_change_mtu()
154 sl->rcount = 0; in x25_asy_change_mtu()
156 set_bit(SLF_ERROR, &sl->flags); in x25_asy_change_mtu()
161 sl->buffsize = len; in x25_asy_change_mtu()
163 spin_unlock_bh(&sl->lock); in x25_asy_change_mtu()
173 static inline void x25_asy_lock(struct x25_asy *sl) in x25_asy_lock() argument
175 netif_stop_queue(sl->dev); in x25_asy_lock()
181 static inline void x25_asy_unlock(struct x25_asy *sl) in x25_asy_unlock() argument
183 netif_wake_queue(sl->dev); in x25_asy_unlock()
188 static void x25_asy_bump(struct x25_asy *sl) in x25_asy_bump() argument
190 struct net_device *dev = sl->dev; in x25_asy_bump()
195 count = sl->rcount; in x25_asy_bump()
200 netdev_warn(sl->dev, "memory squeeze, dropping packet\n"); in x25_asy_bump()
204 skb_put_data(skb, sl->rbuff, count); in x25_asy_bump()
205 err = lapb_data_received(sl->dev, skb); in x25_asy_bump()
215 static void x25_asy_encaps(struct x25_asy *sl, unsigned char *icp, int len) in x25_asy_encaps() argument
218 int actual, count, mtu = sl->dev->mtu; in x25_asy_encaps()
224 sl->dev->name); in x25_asy_encaps()
225 sl->dev->stats.tx_dropped++; in x25_asy_encaps()
226 x25_asy_unlock(sl); in x25_asy_encaps()
231 count = x25_asy_esc(p, sl->xbuff, len); in x25_asy_encaps()
241 set_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags); in x25_asy_encaps()
242 actual = sl->tty->ops->write(sl->tty, sl->xbuff, count); in x25_asy_encaps()
243 sl->xleft = count - actual; in x25_asy_encaps()
244 sl->xhead = sl->xbuff + actual; in x25_asy_encaps()
254 struct x25_asy *sl = tty->disc_data; in x25_asy_write_wakeup() local
257 if (!sl || sl->magic != X25_ASY_MAGIC || !netif_running(sl->dev)) in x25_asy_write_wakeup()
260 if (sl->xleft <= 0) { in x25_asy_write_wakeup()
263 sl->dev->stats.tx_packets++; in x25_asy_write_wakeup()
265 x25_asy_unlock(sl); in x25_asy_write_wakeup()
269 actual = tty->ops->write(tty, sl->xhead, sl->xleft); in x25_asy_write_wakeup()
270 sl->xleft -= actual; in x25_asy_write_wakeup()
271 sl->xhead += actual; in x25_asy_write_wakeup()
276 struct x25_asy *sl = netdev_priv(dev); in x25_asy_timeout() local
278 spin_lock(&sl->lock); in x25_asy_timeout()
284 (tty_chars_in_buffer(sl->tty) || sl->xleft) ? in x25_asy_timeout()
286 sl->xleft = 0; in x25_asy_timeout()
287 clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags); in x25_asy_timeout()
288 x25_asy_unlock(sl); in x25_asy_timeout()
290 spin_unlock(&sl->lock); in x25_asy_timeout()
298 struct x25_asy *sl = netdev_priv(dev); in x25_asy_xmit() local
301 if (!netif_running(sl->dev)) { in x25_asy_xmit()
388 struct x25_asy *sl = netdev_priv(dev); in x25_asy_data_transmit() local
390 spin_lock(&sl->lock); in x25_asy_data_transmit()
391 if (netif_queue_stopped(sl->dev) || sl->tty == NULL) { in x25_asy_data_transmit()
392 spin_unlock(&sl->lock); in x25_asy_data_transmit()
399 x25_asy_lock(sl); in x25_asy_data_transmit()
401 x25_asy_encaps(sl, skb->data, skb->len); in x25_asy_data_transmit()
404 spin_unlock(&sl->lock); in x25_asy_data_transmit()
413 struct x25_asy *sl = netdev_priv(dev); in x25_asy_connected() local
426 skb->protocol = x25_type_trans(skb, sl->dev); in x25_asy_connected()
432 struct x25_asy *sl = netdev_priv(dev); in x25_asy_disconnected() local
445 skb->protocol = x25_type_trans(skb, sl->dev); in x25_asy_disconnected()
462 struct x25_asy *sl = netdev_priv(dev); in x25_asy_open() local
465 if (sl->tty == NULL) in x25_asy_open()
477 sl->rbuff = kmalloc(len + 4, GFP_KERNEL); in x25_asy_open()
478 if (sl->rbuff == NULL) in x25_asy_open()
480 sl->xbuff = kmalloc(len + 4, GFP_KERNEL); in x25_asy_open()
481 if (sl->xbuff == NULL) in x25_asy_open()
484 sl->buffsize = len; in x25_asy_open()
485 sl->rcount = 0; in x25_asy_open()
486 sl->xleft = 0; in x25_asy_open()
487 sl->flags &= (1 << SLF_INUSE); /* Clear ESCAPE & ERROR flags */ in x25_asy_open()
492 kfree(sl->xbuff); in x25_asy_open()
493 sl->xbuff = NULL; in x25_asy_open()
495 kfree(sl->rbuff); in x25_asy_open()
496 sl->rbuff = NULL; in x25_asy_open()
505 struct x25_asy *sl = netdev_priv(dev); in x25_asy_close() local
507 spin_lock(&sl->lock); in x25_asy_close()
508 if (sl->tty) in x25_asy_close()
509 clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags); in x25_asy_close()
511 sl->rcount = 0; in x25_asy_close()
512 sl->xleft = 0; in x25_asy_close()
513 spin_unlock(&sl->lock); in x25_asy_close()
527 struct x25_asy *sl = tty->disc_data; in x25_asy_receive_buf() local
529 if (!sl || sl->magic != X25_ASY_MAGIC || !netif_running(sl->dev)) in x25_asy_receive_buf()
536 if (!test_and_set_bit(SLF_ERROR, &sl->flags)) in x25_asy_receive_buf()
537 sl->dev->stats.rx_errors++; in x25_asy_receive_buf()
541 x25_asy_unesc(sl, *cp++); in x25_asy_receive_buf()
555 struct x25_asy *sl; in x25_asy_open_tty() local
562 sl = x25_asy_alloc(); in x25_asy_open_tty()
563 if (sl == NULL) in x25_asy_open_tty()
566 sl->tty = tty; in x25_asy_open_tty()
567 tty->disc_data = sl; in x25_asy_open_tty()
573 sl->dev->type = ARPHRD_X25; in x25_asy_open_tty()
576 err = x25_asy_open(sl->dev); in x25_asy_open_tty()
578 x25_asy_free(sl); in x25_asy_open_tty()
594 struct x25_asy *sl = tty->disc_data; in x25_asy_close_tty() local
597 if (!sl || sl->magic != X25_ASY_MAGIC) in x25_asy_close_tty()
601 if (sl->dev->flags & IFF_UP) in x25_asy_close_tty()
602 dev_close(sl->dev); in x25_asy_close_tty()
606 sl->tty = NULL; in x25_asy_close_tty()
607 x25_asy_free(sl); in x25_asy_close_tty()
651 static void x25_asy_unesc(struct x25_asy *sl, unsigned char s) in x25_asy_unesc() argument
656 if (!test_and_clear_bit(SLF_ERROR, &sl->flags) && in x25_asy_unesc()
657 sl->rcount >= 2) in x25_asy_unesc()
658 x25_asy_bump(sl); in x25_asy_unesc()
659 clear_bit(SLF_ESCAPE, &sl->flags); in x25_asy_unesc()
660 sl->rcount = 0; in x25_asy_unesc()
663 set_bit(SLF_ESCAPE, &sl->flags); in x25_asy_unesc()
667 if (test_and_clear_bit(SLF_ESCAPE, &sl->flags)) in x25_asy_unesc()
671 if (!test_bit(SLF_ERROR, &sl->flags)) { in x25_asy_unesc()
672 if (sl->rcount < sl->buffsize) { in x25_asy_unesc()
673 sl->rbuff[sl->rcount++] = s; in x25_asy_unesc()
676 sl->dev->stats.rx_over_errors++; in x25_asy_unesc()
677 set_bit(SLF_ERROR, &sl->flags); in x25_asy_unesc()
686 struct x25_asy *sl = tty->disc_data; in x25_asy_ioctl() local
689 if (!sl || sl->magic != X25_ASY_MAGIC) in x25_asy_ioctl()
694 if (copy_to_user((void __user *)arg, sl->dev->name, in x25_asy_ioctl()
695 strlen(sl->dev->name) + 1)) in x25_asy_ioctl()
708 struct x25_asy *sl = netdev_priv(dev); in x25_asy_open_dev() local
709 if (sl->tty == NULL) in x25_asy_open_dev()
748 struct x25_asy *sl = netdev_priv(dev); in x25_asy_setup() local
750 sl->magic = X25_ASY_MAGIC; in x25_asy_setup()
751 sl->dev = dev; in x25_asy_setup()
752 spin_lock_init(&sl->lock); in x25_asy_setup()
753 set_bit(SLF_INUSE, &sl->flags); in x25_asy_setup()
815 struct x25_asy *sl = netdev_priv(dev); in exit_x25_asy() local
817 spin_lock_bh(&sl->lock); in exit_x25_asy()
818 if (sl->tty) in exit_x25_asy()
819 tty_hangup(sl->tty); in exit_x25_asy()
821 spin_unlock_bh(&sl->lock); in exit_x25_asy()