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
140 spin_lock_bh(&sl->lock); in x25_asy_change_mtu()
141 xbuff = xchg(&sl->xbuff, xbuff); in x25_asy_change_mtu()
142 if (sl->xleft) { in x25_asy_change_mtu()
143 if (sl->xleft <= len) { in x25_asy_change_mtu()
144 memcpy(sl->xbuff, sl->xhead, sl->xleft); in x25_asy_change_mtu()
146 sl->xleft = 0; in x25_asy_change_mtu()
150 sl->xhead = sl->xbuff; in x25_asy_change_mtu()
152 rbuff = xchg(&sl->rbuff, rbuff); in x25_asy_change_mtu()
153 if (sl->rcount) { in x25_asy_change_mtu()
154 if (sl->rcount <= len) { in x25_asy_change_mtu()
155 memcpy(sl->rbuff, rbuff, sl->rcount); in x25_asy_change_mtu()
157 sl->rcount = 0; in x25_asy_change_mtu()
159 set_bit(SLF_ERROR, &sl->flags); in x25_asy_change_mtu()
164 sl->buffsize = len; in x25_asy_change_mtu()
166 spin_unlock_bh(&sl->lock); in x25_asy_change_mtu()
176 static inline void x25_asy_lock(struct x25_asy *sl) in x25_asy_lock() argument
178 netif_stop_queue(sl->dev); in x25_asy_lock()
184 static inline void x25_asy_unlock(struct x25_asy *sl) in x25_asy_unlock() argument
186 netif_wake_queue(sl->dev); in x25_asy_unlock()
191 static void x25_asy_bump(struct x25_asy *sl) in x25_asy_bump() argument
193 struct net_device *dev = sl->dev; in x25_asy_bump()
198 count = sl->rcount; in x25_asy_bump()
203 netdev_warn(sl->dev, "memory squeeze, dropping packet\n"); in x25_asy_bump()
208 memcpy(skb_put(skb, count), sl->rbuff, count); in x25_asy_bump()
209 skb->protocol = x25_type_trans(skb, sl->dev); in x25_asy_bump()
221 static void x25_asy_encaps(struct x25_asy *sl, unsigned char *icp, int len) in x25_asy_encaps() argument
224 int actual, count, mtu = sl->dev->mtu; in x25_asy_encaps()
230 sl->dev->name); in x25_asy_encaps()
231 sl->dev->stats.tx_dropped++; in x25_asy_encaps()
232 x25_asy_unlock(sl); in x25_asy_encaps()
237 count = x25_asy_esc(p, sl->xbuff, len); in x25_asy_encaps()
247 set_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags); in x25_asy_encaps()
248 actual = sl->tty->ops->write(sl->tty, sl->xbuff, count); in x25_asy_encaps()
249 sl->xleft = count - actual; in x25_asy_encaps()
250 sl->xhead = sl->xbuff + actual; in x25_asy_encaps()
252 clear_bit(SLF_OUTWAIT, &sl->flags); /* reset outfill flag */ in x25_asy_encaps()
262 struct x25_asy *sl = tty->disc_data; in x25_asy_write_wakeup() local
265 if (!sl || sl->magic != X25_ASY_MAGIC || !netif_running(sl->dev)) in x25_asy_write_wakeup()
268 if (sl->xleft <= 0) { in x25_asy_write_wakeup()
271 sl->dev->stats.tx_packets++; in x25_asy_write_wakeup()
273 x25_asy_unlock(sl); in x25_asy_write_wakeup()
277 actual = tty->ops->write(tty, sl->xhead, sl->xleft); in x25_asy_write_wakeup()
278 sl->xleft -= actual; in x25_asy_write_wakeup()
279 sl->xhead += actual; in x25_asy_write_wakeup()
284 struct x25_asy *sl = netdev_priv(dev); in x25_asy_timeout() local
286 spin_lock(&sl->lock); in x25_asy_timeout()
292 (tty_chars_in_buffer(sl->tty) || sl->xleft) ? in x25_asy_timeout()
294 sl->xleft = 0; in x25_asy_timeout()
295 clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags); in x25_asy_timeout()
296 x25_asy_unlock(sl); in x25_asy_timeout()
298 spin_unlock(&sl->lock); in x25_asy_timeout()
306 struct x25_asy *sl = netdev_priv(dev); in x25_asy_xmit() local
309 if (!netif_running(sl->dev)) { in x25_asy_xmit()
378 struct x25_asy *sl = netdev_priv(dev); in x25_asy_data_transmit() local
380 spin_lock(&sl->lock); in x25_asy_data_transmit()
381 if (netif_queue_stopped(sl->dev) || sl->tty == NULL) { in x25_asy_data_transmit()
382 spin_unlock(&sl->lock); in x25_asy_data_transmit()
389 x25_asy_lock(sl); in x25_asy_data_transmit()
391 x25_asy_encaps(sl, skb->data, skb->len); in x25_asy_data_transmit()
394 spin_unlock(&sl->lock); in x25_asy_data_transmit()
403 struct x25_asy *sl = netdev_priv(dev); in x25_asy_connected() local
416 skb->protocol = x25_type_trans(skb, sl->dev); in x25_asy_connected()
422 struct x25_asy *sl = netdev_priv(dev); in x25_asy_disconnected() local
435 skb->protocol = x25_type_trans(skb, sl->dev); in x25_asy_disconnected()
452 struct x25_asy *sl = netdev_priv(dev); in x25_asy_open() local
456 if (sl->tty == NULL) in x25_asy_open()
468 sl->rbuff = kmalloc(len + 4, GFP_KERNEL); in x25_asy_open()
469 if (sl->rbuff == NULL) in x25_asy_open()
471 sl->xbuff = kmalloc(len + 4, GFP_KERNEL); in x25_asy_open()
472 if (sl->xbuff == NULL) in x25_asy_open()
475 sl->buffsize = len; in x25_asy_open()
476 sl->rcount = 0; in x25_asy_open()
477 sl->xleft = 0; in x25_asy_open()
478 sl->flags &= (1 << SLF_INUSE); /* Clear ESCAPE & ERROR flags */ in x25_asy_open()
490 kfree(sl->xbuff); in x25_asy_open()
492 kfree(sl->rbuff); in x25_asy_open()
501 struct x25_asy *sl = netdev_priv(dev); in x25_asy_close() local
503 spin_lock(&sl->lock); in x25_asy_close()
504 if (sl->tty) in x25_asy_close()
505 clear_bit(TTY_DO_WRITE_WAKEUP, &sl->tty->flags); in x25_asy_close()
508 sl->rcount = 0; in x25_asy_close()
509 sl->xleft = 0; in x25_asy_close()
510 spin_unlock(&sl->lock); in x25_asy_close()
524 struct x25_asy *sl = tty->disc_data; in x25_asy_receive_buf() local
526 if (!sl || sl->magic != X25_ASY_MAGIC || !netif_running(sl->dev)) in x25_asy_receive_buf()
533 if (!test_and_set_bit(SLF_ERROR, &sl->flags)) in x25_asy_receive_buf()
534 sl->dev->stats.rx_errors++; in x25_asy_receive_buf()
538 x25_asy_unesc(sl, *cp++); in x25_asy_receive_buf()
552 struct x25_asy *sl; in x25_asy_open_tty() local
559 sl = x25_asy_alloc(); in x25_asy_open_tty()
560 if (sl == NULL) in x25_asy_open_tty()
563 sl->tty = tty; in x25_asy_open_tty()
564 tty->disc_data = sl; in x25_asy_open_tty()
570 sl->dev->type = ARPHRD_X25; in x25_asy_open_tty()
573 err = x25_asy_open(sl->dev); in x25_asy_open_tty()
589 struct x25_asy *sl = tty->disc_data; in x25_asy_close_tty() local
593 if (!sl || sl->magic != X25_ASY_MAGIC) in x25_asy_close_tty()
597 if (sl->dev->flags & IFF_UP) in x25_asy_close_tty()
598 dev_close(sl->dev); in x25_asy_close_tty()
601 err = lapb_unregister(sl->dev); in x25_asy_close_tty()
607 sl->tty = NULL; in x25_asy_close_tty()
608 x25_asy_free(sl); in x25_asy_close_tty()
652 static void x25_asy_unesc(struct x25_asy *sl, unsigned char s) in x25_asy_unesc() argument
657 if (!test_and_clear_bit(SLF_ERROR, &sl->flags) && in x25_asy_unesc()
658 sl->rcount > 2) in x25_asy_unesc()
659 x25_asy_bump(sl); in x25_asy_unesc()
660 clear_bit(SLF_ESCAPE, &sl->flags); in x25_asy_unesc()
661 sl->rcount = 0; in x25_asy_unesc()
664 set_bit(SLF_ESCAPE, &sl->flags); in x25_asy_unesc()
668 if (test_and_clear_bit(SLF_ESCAPE, &sl->flags)) in x25_asy_unesc()
672 if (!test_bit(SLF_ERROR, &sl->flags)) { in x25_asy_unesc()
673 if (sl->rcount < sl->buffsize) { in x25_asy_unesc()
674 sl->rbuff[sl->rcount++] = s; in x25_asy_unesc()
677 sl->dev->stats.rx_over_errors++; in x25_asy_unesc()
678 set_bit(SLF_ERROR, &sl->flags); in x25_asy_unesc()
687 struct x25_asy *sl = tty->disc_data; in x25_asy_ioctl() local
690 if (!sl || sl->magic != X25_ASY_MAGIC) in x25_asy_ioctl()
695 if (copy_to_user((void __user *)arg, sl->dev->name, in x25_asy_ioctl()
696 strlen(sl->dev->name) + 1)) in x25_asy_ioctl()
723 struct x25_asy *sl = netdev_priv(dev); in x25_asy_open_dev() local
724 if (sl->tty == NULL) in x25_asy_open_dev()
740 struct x25_asy *sl = netdev_priv(dev); in x25_asy_setup() local
742 sl->magic = X25_ASY_MAGIC; in x25_asy_setup()
743 sl->dev = dev; in x25_asy_setup()
744 spin_lock_init(&sl->lock); in x25_asy_setup()
745 set_bit(SLF_INUSE, &sl->flags); in x25_asy_setup()
802 struct x25_asy *sl = netdev_priv(dev); in exit_x25_asy() local
804 spin_lock_bh(&sl->lock); in exit_x25_asy()
805 if (sl->tty) in exit_x25_asy()
806 tty_hangup(sl->tty); in exit_x25_asy()
808 spin_unlock_bh(&sl->lock); in exit_x25_asy()