Lines Matching refs:ax
237 static void ax_bump(struct mkiss *ax) in ax_bump() argument
242 spin_lock_bh(&ax->buflock); in ax_bump()
243 if (ax->rbuff[0] > 0x0f) { in ax_bump()
244 if (ax->rbuff[0] & 0x80) { in ax_bump()
245 if (check_crc_16(ax->rbuff, ax->rcount) < 0) { in ax_bump()
246 ax->dev->stats.rx_errors++; in ax_bump()
247 spin_unlock_bh(&ax->buflock); in ax_bump()
251 if (ax->crcmode != CRC_MODE_SMACK && ax->crcauto) { in ax_bump()
254 ax->dev->name); in ax_bump()
255 ax->crcmode = CRC_MODE_SMACK; in ax_bump()
257 ax->rcount -= 2; in ax_bump()
258 *ax->rbuff &= ~0x80; in ax_bump()
259 } else if (ax->rbuff[0] & 0x20) { in ax_bump()
260 if (check_crc_flex(ax->rbuff, ax->rcount) < 0) { in ax_bump()
261 ax->dev->stats.rx_errors++; in ax_bump()
262 spin_unlock_bh(&ax->buflock); in ax_bump()
265 if (ax->crcmode != CRC_MODE_FLEX && ax->crcauto) { in ax_bump()
268 ax->dev->name); in ax_bump()
269 ax->crcmode = CRC_MODE_FLEX; in ax_bump()
271 ax->rcount -= 2; in ax_bump()
279 *ax->rbuff &= ~0x20; in ax_bump()
283 count = ax->rcount; in ax_bump()
287 ax->dev->name); in ax_bump()
288 ax->dev->stats.rx_dropped++; in ax_bump()
289 spin_unlock_bh(&ax->buflock); in ax_bump()
293 skb_put_data(skb, ax->rbuff, count); in ax_bump()
294 skb->protocol = ax25_type_trans(skb, ax->dev); in ax_bump()
296 ax->dev->stats.rx_packets++; in ax_bump()
297 ax->dev->stats.rx_bytes += count; in ax_bump()
298 spin_unlock_bh(&ax->buflock); in ax_bump()
301 static void kiss_unesc(struct mkiss *ax, unsigned char s) in kiss_unesc() argument
306 if (test_bit(AXF_KEEPTEST, &ax->flags)) in kiss_unesc()
307 clear_bit(AXF_KEEPTEST, &ax->flags); in kiss_unesc()
309 if (!test_and_clear_bit(AXF_ERROR, &ax->flags) && (ax->rcount > 2)) in kiss_unesc()
310 ax_bump(ax); in kiss_unesc()
312 clear_bit(AXF_ESCAPE, &ax->flags); in kiss_unesc()
313 ax->rcount = 0; in kiss_unesc()
317 set_bit(AXF_ESCAPE, &ax->flags); in kiss_unesc()
320 if (test_and_clear_bit(AXF_ESCAPE, &ax->flags)) in kiss_unesc()
324 if (test_and_clear_bit(AXF_ESCAPE, &ax->flags)) in kiss_unesc()
329 spin_lock_bh(&ax->buflock); in kiss_unesc()
330 if (!test_bit(AXF_ERROR, &ax->flags)) { in kiss_unesc()
331 if (ax->rcount < ax->buffsize) { in kiss_unesc()
332 ax->rbuff[ax->rcount++] = s; in kiss_unesc()
333 spin_unlock_bh(&ax->buflock); in kiss_unesc()
337 ax->dev->stats.rx_over_errors++; in kiss_unesc()
338 set_bit(AXF_ERROR, &ax->flags); in kiss_unesc()
340 spin_unlock_bh(&ax->buflock); in kiss_unesc()
358 static void ax_changedmtu(struct mkiss *ax) in ax_changedmtu() argument
360 struct net_device *dev = ax->dev; in ax_changedmtu()
380 ax->dev->name); in ax_changedmtu()
381 dev->mtu = ax->mtu; in ax_changedmtu()
387 spin_lock_bh(&ax->buflock); in ax_changedmtu()
389 oxbuff = ax->xbuff; in ax_changedmtu()
390 ax->xbuff = xbuff; in ax_changedmtu()
391 orbuff = ax->rbuff; in ax_changedmtu()
392 ax->rbuff = rbuff; in ax_changedmtu()
394 if (ax->xleft) { in ax_changedmtu()
395 if (ax->xleft <= len) { in ax_changedmtu()
396 memcpy(ax->xbuff, ax->xhead, ax->xleft); in ax_changedmtu()
398 ax->xleft = 0; in ax_changedmtu()
403 ax->xhead = ax->xbuff; in ax_changedmtu()
405 if (ax->rcount) { in ax_changedmtu()
406 if (ax->rcount <= len) { in ax_changedmtu()
407 memcpy(ax->rbuff, orbuff, ax->rcount); in ax_changedmtu()
409 ax->rcount = 0; in ax_changedmtu()
411 set_bit(AXF_ERROR, &ax->flags); in ax_changedmtu()
415 ax->mtu = dev->mtu + 73; in ax_changedmtu()
416 ax->buffsize = len; in ax_changedmtu()
418 spin_unlock_bh(&ax->buflock); in ax_changedmtu()
427 struct mkiss *ax = netdev_priv(dev); in ax_encaps() local
431 if (ax->mtu != ax->dev->mtu + 73) /* Someone has been ifconfigging */ in ax_encaps()
432 ax_changedmtu(ax); in ax_encaps()
434 if (len > ax->mtu) { /* Sigh, shouldn't occur BUT ... */ in ax_encaps()
435 printk(KERN_ERR "mkiss: %s: truncating oversized transmit packet!\n", ax->dev->name); in ax_encaps()
443 spin_lock_bh(&ax->buflock); in ax_encaps()
457 ax->crcmode = CRC_MODE_SMACK; in ax_encaps()
460 ax->crcmode = CRC_MODE_FLEX; in ax_encaps()
463 ax->crcmode = CRC_MODE_NONE; in ax_encaps()
467 ax->crcmode = CRC_MODE_SMACK_TEST; in ax_encaps()
470 ax->crcauto = (cmd ? 0 : 1); in ax_encaps()
472 ax->dev->name, cmd); in ax_encaps()
474 spin_unlock_bh(&ax->buflock); in ax_encaps()
479 count = kiss_esc(p, ax->xbuff, len); in ax_encaps()
483 switch (ax->crcmode) { in ax_encaps()
485 ax->crcmode = CRC_MODE_FLEX_TEST; in ax_encaps()
486 printk(KERN_INFO "mkiss: %s: Trying crc-smack\n", ax->dev->name); in ax_encaps()
491 count = kiss_esc_crc(p, ax->xbuff, crc, len+2); in ax_encaps()
494 ax->crcmode = CRC_MODE_NONE; in ax_encaps()
495 printk(KERN_INFO "mkiss: %s: Trying crc-flexnet\n", ax->dev->name); in ax_encaps()
500 count = kiss_esc_crc(p, ax->xbuff, crc, len+2); in ax_encaps()
504 count = kiss_esc(p, ax->xbuff, len); in ax_encaps()
507 spin_unlock_bh(&ax->buflock); in ax_encaps()
509 set_bit(TTY_DO_WRITE_WAKEUP, &ax->tty->flags); in ax_encaps()
510 actual = ax->tty->ops->write(ax->tty, ax->xbuff, count); in ax_encaps()
514 netif_trans_update(ax->dev); in ax_encaps()
515 ax->xleft = count - actual; in ax_encaps()
516 ax->xhead = ax->xbuff + actual; in ax_encaps()
522 struct mkiss *ax = netdev_priv(dev); in ax_xmit() local
543 (tty_chars_in_buffer(ax->tty) || ax->xleft) ? in ax_xmit()
546 ax->xleft = 0; in ax_xmit()
547 clear_bit(TTY_DO_WRITE_WAKEUP, &ax->tty->flags); in ax_xmit()
561 struct mkiss *ax = netdev_priv(dev); in ax_open_dev() local
563 if (ax->tty == NULL) in ax_open_dev()
572 struct mkiss *ax = netdev_priv(dev); in ax_open() local
575 if (ax->tty == NULL) in ax_open()
594 if ((ax->rbuff = kmalloc(len + 4, GFP_KERNEL)) == NULL) in ax_open()
597 if ((ax->xbuff = kmalloc(len + 4, GFP_KERNEL)) == NULL) in ax_open()
600 ax->mtu = dev->mtu + 73; in ax_open()
601 ax->buffsize = len; in ax_open()
602 ax->rcount = 0; in ax_open()
603 ax->xleft = 0; in ax_open()
605 ax->flags &= (1 << AXF_INUSE); /* Clear ESCAPE & ERROR flags */ in ax_open()
607 spin_lock_init(&ax->buflock); in ax_open()
612 kfree(ax->rbuff); in ax_open()
622 struct mkiss *ax = netdev_priv(dev); in ax_close() local
624 if (ax->tty) in ax_close()
625 clear_bit(TTY_DO_WRITE_WAKEUP, &ax->tty->flags); in ax_close()
669 struct mkiss *ax; in mkiss_get() local
672 ax = tty->disc_data; in mkiss_get()
673 if (ax) in mkiss_get()
674 refcount_inc(&ax->refcnt); in mkiss_get()
677 return ax; in mkiss_get()
680 static void mkiss_put(struct mkiss *ax) in mkiss_put() argument
682 if (refcount_dec_and_test(&ax->refcnt)) in mkiss_put()
683 complete(&ax->dead); in mkiss_put()
691 struct mkiss *ax; in mkiss_open() local
706 ax = netdev_priv(dev); in mkiss_open()
707 ax->dev = dev; in mkiss_open()
709 spin_lock_init(&ax->buflock); in mkiss_open()
710 refcount_set(&ax->refcnt, 1); in mkiss_open()
711 init_completion(&ax->dead); in mkiss_open()
713 ax->tty = tty; in mkiss_open()
714 tty->disc_data = ax; in mkiss_open()
723 err = ax_open(ax->dev); in mkiss_open()
734 ax->crcmode = CRC_MODE_SMACK; in mkiss_open()
736 ax->dev->name); in mkiss_open()
739 ax->crcmode = CRC_MODE_FLEX; in mkiss_open()
741 ax->dev->name); in mkiss_open()
744 ax->crcmode = CRC_MODE_NONE; in mkiss_open()
746 ax->dev->name); in mkiss_open()
752 ax->dev->name); in mkiss_open()
753 ax->crcmode = CRC_MODE_SMACK_TEST; in mkiss_open()
755 ax->crcauto = (crc_force ? 0 : 1); in mkiss_open()
763 kfree(ax->rbuff); in mkiss_open()
764 kfree(ax->xbuff); in mkiss_open()
775 struct mkiss *ax; in mkiss_close() local
778 ax = tty->disc_data; in mkiss_close()
782 if (!ax) in mkiss_close()
789 if (!refcount_dec_and_test(&ax->refcnt)) in mkiss_close()
790 wait_for_completion(&ax->dead); in mkiss_close()
795 netif_stop_queue(ax->dev); in mkiss_close()
797 unregister_netdev(ax->dev); in mkiss_close()
800 kfree(ax->rbuff); in mkiss_close()
801 kfree(ax->xbuff); in mkiss_close()
803 ax->tty = NULL; in mkiss_close()
805 free_netdev(ax->dev); in mkiss_close()
812 struct mkiss *ax = mkiss_get(tty); in mkiss_ioctl() local
817 if (ax == NULL) in mkiss_ioctl()
819 dev = ax->dev; in mkiss_ioctl()
823 err = copy_to_user((void __user *) arg, ax->dev->name, in mkiss_ioctl()
824 strlen(ax->dev->name) + 1) ? -EFAULT : 0; in mkiss_ioctl()
837 ax->mode = tmp; in mkiss_ioctl()
866 mkiss_put(ax); in mkiss_ioctl()
880 struct mkiss *ax = mkiss_get(tty); in mkiss_receive_buf() local
882 if (!ax) in mkiss_receive_buf()
889 if (ax->mtu != ax->dev->mtu + 73) in mkiss_receive_buf()
890 ax_changedmtu(ax); in mkiss_receive_buf()
895 if (!test_and_set_bit(AXF_ERROR, &ax->flags)) in mkiss_receive_buf()
896 ax->dev->stats.rx_errors++; in mkiss_receive_buf()
901 kiss_unesc(ax, *cp++); in mkiss_receive_buf()
904 mkiss_put(ax); in mkiss_receive_buf()
914 struct mkiss *ax = mkiss_get(tty); in mkiss_write_wakeup() local
917 if (!ax) in mkiss_write_wakeup()
920 if (ax->xleft <= 0) { in mkiss_write_wakeup()
926 netif_wake_queue(ax->dev); in mkiss_write_wakeup()
930 actual = tty->ops->write(tty, ax->xhead, ax->xleft); in mkiss_write_wakeup()
931 ax->xleft -= actual; in mkiss_write_wakeup()
932 ax->xhead += actual; in mkiss_write_wakeup()
935 mkiss_put(ax); in mkiss_write_wakeup()