Lines Matching refs:ax

245 static void ax_bump(struct mkiss *ax)
250 spin_lock_bh(&ax->buflock);
251 if (ax->rbuff[0] > 0x0f) {
252 if (ax->rbuff[0] & 0x80) {
253 if (check_crc_16(ax->rbuff, ax->rcount) < 0) {
254 ax->dev->stats.rx_errors++;
255 spin_unlock_bh(&ax->buflock);
259 if (ax->crcmode != CRC_MODE_SMACK && ax->crcauto) {
262 ax->dev->name);
263 ax->crcmode = CRC_MODE_SMACK;
265 ax->rcount -= 2;
266 *ax->rbuff &= ~0x80;
267 } else if (ax->rbuff[0] & 0x20) {
268 if (check_crc_flex(ax->rbuff, ax->rcount) < 0) {
269 ax->dev->stats.rx_errors++;
270 spin_unlock_bh(&ax->buflock);
273 if (ax->crcmode != CRC_MODE_FLEX && ax->crcauto) {
276 ax->dev->name);
277 ax->crcmode = CRC_MODE_FLEX;
279 ax->rcount -= 2;
287 *ax->rbuff &= ~0x20;
291 count = ax->rcount;
295 ax->dev->name);
296 ax->dev->stats.rx_dropped++;
297 spin_unlock_bh(&ax->buflock);
301 memcpy(skb_put(skb,count), ax->rbuff, count);
302 skb->protocol = ax25_type_trans(skb, ax->dev);
304 ax->dev->stats.rx_packets++;
305 ax->dev->stats.rx_bytes += count;
306 spin_unlock_bh(&ax->buflock);
309 static void kiss_unesc(struct mkiss *ax, unsigned char s)
314 if (test_bit(AXF_KEEPTEST, &ax->flags))
315 clear_bit(AXF_KEEPTEST, &ax->flags);
317 if (!test_and_clear_bit(AXF_ERROR, &ax->flags) && (ax->rcount > 2))
318 ax_bump(ax);
320 clear_bit(AXF_ESCAPE, &ax->flags);
321 ax->rcount = 0;
325 set_bit(AXF_ESCAPE, &ax->flags);
328 if (test_and_clear_bit(AXF_ESCAPE, &ax->flags))
332 if (test_and_clear_bit(AXF_ESCAPE, &ax->flags))
337 spin_lock_bh(&ax->buflock);
338 if (!test_bit(AXF_ERROR, &ax->flags)) {
339 if (ax->rcount < ax->buffsize) {
340 ax->rbuff[ax->rcount++] = s;
341 spin_unlock_bh(&ax->buflock);
345 ax->dev->stats.rx_over_errors++;
346 set_bit(AXF_ERROR, &ax->flags);
348 spin_unlock_bh(&ax->buflock);
366 static void ax_changedmtu(struct mkiss *ax)
368 struct net_device *dev = ax->dev;
388 ax->dev->name);
389 dev->mtu = ax->mtu;
395 spin_lock_bh(&ax->buflock);
397 oxbuff = ax->xbuff;
398 ax->xbuff = xbuff;
399 orbuff = ax->rbuff;
400 ax->rbuff = rbuff;
402 if (ax->xleft) {
403 if (ax->xleft <= len) {
404 memcpy(ax->xbuff, ax->xhead, ax->xleft);
406 ax->xleft = 0;
411 ax->xhead = ax->xbuff;
413 if (ax->rcount) {
414 if (ax->rcount <= len) {
415 memcpy(ax->rbuff, orbuff, ax->rcount);
417 ax->rcount = 0;
419 set_bit(AXF_ERROR, &ax->flags);
423 ax->mtu = dev->mtu + 73;
424 ax->buffsize = len;
426 spin_unlock_bh(&ax->buflock);
435 struct mkiss *ax = netdev_priv(dev);
439 if (ax->mtu != ax->dev->mtu + 73) /* Someone has been ifconfigging */
440 ax_changedmtu(ax);
442 if (len > ax->mtu) { /* Sigh, shouldn't occur BUT ... */
443 len = ax->mtu;
444 printk(KERN_ERR "mkiss: %s: truncating oversized transmit packet!\n", ax->dev->name);
452 spin_lock_bh(&ax->buflock);
466 ax->crcmode = CRC_MODE_SMACK;
469 ax->crcmode = CRC_MODE_FLEX;
472 ax->crcmode = CRC_MODE_NONE;
476 ax->crcmode = CRC_MODE_SMACK_TEST;
479 ax->crcauto = (cmd ? 0 : 1);
480 printk(KERN_INFO "mkiss: %s: crc mode %s %d\n", ax->dev->name, (len) ? "set to" : "is", cmd);
482 spin_unlock_bh(&ax->buflock);
487 count = kiss_esc(p, ax->xbuff, len);
491 switch (ax->crcmode) {
493 ax->crcmode = CRC_MODE_FLEX_TEST;
494 printk(KERN_INFO "mkiss: %s: Trying crc-smack\n", ax->dev->name);
499 count = kiss_esc_crc(p, ax->xbuff, crc, len+2);
502 ax->crcmode = CRC_MODE_NONE;
503 printk(KERN_INFO "mkiss: %s: Trying crc-flexnet\n", ax->dev->name);
508 count = kiss_esc_crc(p, ax->xbuff, crc, len+2);
512 count = kiss_esc(p, ax->xbuff, len);
515 spin_unlock_bh(&ax->buflock);
517 set_bit(TTY_DO_WRITE_WAKEUP, &ax->tty->flags);
518 actual = ax->tty->ops->write(ax->tty, ax->xbuff, count);
522 ax->dev->trans_start = jiffies;
523 ax->xleft = count - actual;
524 ax->xhead = ax->xbuff + actual;
530 struct mkiss *ax = netdev_priv(dev);
548 (tty_chars_in_buffer(ax->tty) || ax->xleft) ?
551 ax->xleft = 0;
552 clear_bit(TTY_DO_WRITE_WAKEUP, &ax->tty->flags);
568 struct mkiss *ax = netdev_priv(dev);
570 if (ax->tty == NULL)
605 struct mkiss *ax = netdev_priv(dev);
608 if (ax->tty == NULL)
627 if ((ax->rbuff = kmalloc(len + 4, GFP_KERNEL)) == NULL)
630 if ((ax->xbuff = kmalloc(len + 4, GFP_KERNEL)) == NULL)
633 ax->mtu = dev->mtu + 73;
634 ax->buffsize = len;
635 ax->rcount = 0;
636 ax->xleft = 0;
638 ax->flags &= (1 << AXF_INUSE); /* Clear ESCAPE & ERROR flags */
640 spin_lock_init(&ax->buflock);
645 kfree(ax->rbuff);
655 struct mkiss *ax = netdev_priv(dev);
657 if (ax->tty)
658 clear_bit(TTY_DO_WRITE_WAKEUP, &ax->tty->flags);
707 struct mkiss *ax;
710 ax = tty->disc_data;
711 if (ax)
712 atomic_inc(&ax->refcnt);
715 return ax;
718 static void mkiss_put(struct mkiss *ax)
720 if (atomic_dec_and_test(&ax->refcnt))
721 up(&ax->dead_sem);
729 struct mkiss *ax;
737 dev = alloc_netdev(sizeof(struct mkiss), "ax%d", NET_NAME_UNKNOWN,
744 ax = netdev_priv(dev);
745 ax->dev = dev;
747 spin_lock_init(&ax->buflock);
748 atomic_set(&ax->refcnt, 1);
749 sema_init(&ax->dead_sem, 0);
751 ax->tty = tty;
752 tty->disc_data = ax;
761 if ((err = ax_open(ax->dev))) {
771 ax->crcmode = CRC_MODE_SMACK;
773 ax->dev->name);
776 ax->crcmode = CRC_MODE_FLEX;
778 ax->dev->name);
781 ax->crcmode = CRC_MODE_NONE;
783 ax->dev->name);
790 ax->dev->name);
791 ax->crcmode = CRC_MODE_SMACK_TEST;
793 ax->crcauto = (crc_force ? 0 : 1);
801 kfree(ax->rbuff);
802 kfree(ax->xbuff);
813 struct mkiss *ax;
816 ax = tty->disc_data;
820 if (!ax)
827 if (!atomic_dec_and_test(&ax->refcnt))
828 down(&ax->dead_sem);
830 unregister_netdev(ax->dev);
833 kfree(ax->rbuff);
834 kfree(ax->xbuff);
836 ax->tty = NULL;
843 struct mkiss *ax = mkiss_get(tty);
848 if (ax == NULL)
850 dev = ax->dev;
854 err = copy_to_user((void __user *) arg, ax->dev->name,
855 strlen(ax->dev->name) + 1) ? -EFAULT : 0;
868 ax->mode = tmp;
897 mkiss_put(ax);
928 struct mkiss *ax = mkiss_get(tty);
930 if (!ax)
937 if (ax->mtu != ax->dev->mtu + 73)
938 ax_changedmtu(ax);
943 if (!test_and_set_bit(AXF_ERROR, &ax->flags))
944 ax->dev->stats.rx_errors++;
949 kiss_unesc(ax, *cp++);
952 mkiss_put(ax);
962 struct mkiss *ax = mkiss_get(tty);
965 if (!ax)
968 if (ax->xleft <= 0) {
974 netif_wake_queue(ax->dev);
978 actual = tty->ops->write(tty, ax->xhead, ax->xleft);
979 ax->xleft -= actual;
980 ax->xhead += actual;
983 mkiss_put(ax);