Lines Matching +full:0 +full:- +full:576

1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (C) 2004, 05 Ralf Baechle DL5RB <ralf@linux-mips.org>
6 * Copyright (C) 2004, 05 Thomas Osterried DL9SAU <thomas@x-berg.in-berlin.de>
59 /* long req'd: used by set_bit --RR */
60 #define AXF_INUSE 0 /* Channel in use */
70 #define CRC_MODE_NONE 0
80 /*---------------------------------------------------------------------------*/
83 0x0f87, 0x1e0e, 0x2c95, 0x3d1c, 0x49a3, 0x582a, 0x6ab1, 0x7b38,
84 0x83cf, 0x9246, 0xa0dd, 0xb154, 0xc5eb, 0xd462, 0xe6f9, 0xf770,
85 0x1f06, 0x0e8f, 0x3c14, 0x2d9d, 0x5922, 0x48ab, 0x7a30, 0x6bb9,
86 0x934e, 0x82c7, 0xb05c, 0xa1d5, 0xd56a, 0xc4e3, 0xf678, 0xe7f1,
87 0x2e85, 0x3f0c, 0x0d97, 0x1c1e, 0x68a1, 0x7928, 0x4bb3, 0x5a3a,
88 0xa2cd, 0xb344, 0x81df, 0x9056, 0xe4e9, 0xf560, 0xc7fb, 0xd672,
89 0x3e04, 0x2f8d, 0x1d16, 0x0c9f, 0x7820, 0x69a9, 0x5b32, 0x4abb,
90 0xb24c, 0xa3c5, 0x915e, 0x80d7, 0xf468, 0xe5e1, 0xd77a, 0xc6f3,
91 0x4d83, 0x5c0a, 0x6e91, 0x7f18, 0x0ba7, 0x1a2e, 0x28b5, 0x393c,
92 0xc1cb, 0xd042, 0xe2d9, 0xf350, 0x87ef, 0x9666, 0xa4fd, 0xb574,
93 0x5d02, 0x4c8b, 0x7e10, 0x6f99, 0x1b26, 0x0aaf, 0x3834, 0x29bd,
94 0xd14a, 0xc0c3, 0xf258, 0xe3d1, 0x976e, 0x86e7, 0xb47c, 0xa5f5,
95 0x6c81, 0x7d08, 0x4f93, 0x5e1a, 0x2aa5, 0x3b2c, 0x09b7, 0x183e,
96 0xe0c9, 0xf140, 0xc3db, 0xd252, 0xa6ed, 0xb764, 0x85ff, 0x9476,
97 0x7c00, 0x6d89, 0x5f12, 0x4e9b, 0x3a24, 0x2bad, 0x1936, 0x08bf,
98 0xf048, 0xe1c1, 0xd35a, 0xc2d3, 0xb66c, 0xa7e5, 0x957e, 0x84f7,
99 0x8b8f, 0x9a06, 0xa89d, 0xb914, 0xcdab, 0xdc22, 0xeeb9, 0xff30,
100 0x07c7, 0x164e, 0x24d5, 0x355c, 0x41e3, 0x506a, 0x62f1, 0x7378,
101 0x9b0e, 0x8a87, 0xb81c, 0xa995, 0xdd2a, 0xcca3, 0xfe38, 0xefb1,
102 0x1746, 0x06cf, 0x3454, 0x25dd, 0x5162, 0x40eb, 0x7270, 0x63f9,
103 0xaa8d, 0xbb04, 0x899f, 0x9816, 0xeca9, 0xfd20, 0xcfbb, 0xde32,
104 0x26c5, 0x374c, 0x05d7, 0x145e, 0x60e1, 0x7168, 0x43f3, 0x527a,
105 0xba0c, 0xab85, 0x991e, 0x8897, 0xfc28, 0xeda1, 0xdf3a, 0xceb3,
106 0x3644, 0x27cd, 0x1556, 0x04df, 0x7060, 0x61e9, 0x5372, 0x42fb,
107 0xc98b, 0xd802, 0xea99, 0xfb10, 0x8faf, 0x9e26, 0xacbd, 0xbd34,
108 0x45c3, 0x544a, 0x66d1, 0x7758, 0x03e7, 0x126e, 0x20f5, 0x317c,
109 0xd90a, 0xc883, 0xfa18, 0xeb91, 0x9f2e, 0x8ea7, 0xbc3c, 0xadb5,
110 0x5542, 0x44cb, 0x7650, 0x67d9, 0x1366, 0x02ef, 0x3074, 0x21fd,
111 0xe889, 0xf900, 0xcb9b, 0xda12, 0xaead, 0xbf24, 0x8dbf, 0x9c36,
112 0x64c1, 0x7548, 0x47d3, 0x565a, 0x22e5, 0x336c, 0x01f7, 0x107e,
113 0xf808, 0xe981, 0xdb1a, 0xca93, 0xbe2c, 0xafa5, 0x9d3e, 0x8cb7,
114 0x7440, 0x65c9, 0x5752, 0x46db, 0x3264, 0x23ed, 0x1176, 0x00ff
119 unsigned short crc = 0xffff; in calc_crc_flex()
121 while (size--) in calc_crc_flex()
122 crc = (crc << 8) ^ crc_flex_table[((crc >> 8) ^ *cp++) & 0xff]; in calc_crc_flex()
129 unsigned short crc = 0xffff; in check_crc_flex()
132 return -1; in check_crc_flex()
134 while (size--) in check_crc_flex()
135 crc = (crc << 8) ^ crc_flex_table[((crc >> 8) ^ *cp++) & 0xff]; in check_crc_flex()
137 if ((crc & 0xffff) != 0x7070) in check_crc_flex()
138 return -1; in check_crc_flex()
140 return 0; in check_crc_flex()
145 unsigned short crc = 0x0000; in check_crc_16()
148 return -1; in check_crc_16()
150 crc = crc16(0, cp, size); in check_crc_16()
152 if (crc != 0x0000) in check_crc_16()
153 return -1; in check_crc_16()
155 return 0; in check_crc_16()
174 while (len-- > 0) { in kiss_esc()
192 return ptr - d; in kiss_esc()
198 * packet to a temporary buffer :-)
204 unsigned char c=0; in kiss_esc_crc()
207 while (len > 0) { in kiss_esc_crc()
213 c = crc & 0xff; in kiss_esc_crc()
215 len--; in kiss_esc_crc()
233 return ptr - d; in kiss_esc_crc()
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()
253 "mkiss: %s: Switching to crc-smack\n", 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()
267 "mkiss: %s: Switching to crc-flexnet\n", 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()
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()
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()
349 __dev_addr_set(dev, &sa->sax25_call, AX25_ADDR_LEN); in ax_set_mac_address()
353 return 0; in ax_set_mac_address()
356 /*---------------------------------------------------------------------------*/
360 struct net_device *dev = ax->dev; in ax_changedmtu()
364 len = dev->mtu * 2; in ax_changedmtu()
368 * also fixes a bug in which SunOS sends 512-byte packets even with in ax_changedmtu()
371 if (len < 576 * 2) in ax_changedmtu()
372 len = 576 * 2; 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()
399 dev->stats.tx_dropped++; 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()
410 dev->stats.rx_over_errors++; 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()
431 if (ax->mtu != ax->dev->mtu + 73) /* Someone has been ifconfigging */ 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()
436 dev->stats.tx_dropped++; in ax_encaps()
443 spin_lock_bh(&ax->buflock); in ax_encaps()
444 if ((*p & 0x0f) != 0) { in ax_encaps()
448 * kiss driver. -- dl9sau */ in ax_encaps()
449 switch (*p & 0xff) { in ax_encaps()
450 case 0x85: in ax_encaps()
454 int cmd = (p[1] & 0xff); 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()
465 case 0: in ax_encaps()
467 ax->crcmode = CRC_MODE_SMACK_TEST; in ax_encaps()
468 cmd = 0; 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()
489 *p |= 0x80; in ax_encaps()
490 crc = swab16(crc16(0, p, len)); 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()
498 *p |= 0x20; 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()
511 dev->stats.tx_packets++; in ax_encaps()
512 dev->stats.tx_bytes += actual; 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()
524 if (skb->protocol == htons(ETH_P_IP)) in ax_xmit()
528 printk(KERN_ERR "mkiss: %s: xmit call when iface is down\n", dev->name); in ax_xmit()
542 printk(KERN_ERR "mkiss: %s: transmit timed out, %s?\n", dev->name, in ax_xmit()
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()
551 /* We were not busy, so we are now... :-) */ in ax_xmit()
553 ax_encaps(dev, skb->data, skb->len); in ax_xmit()
563 if (ax->tty == NULL) in ax_open_dev()
564 return -ENODEV; in ax_open_dev()
566 return 0; in ax_open_dev()
569 /* Open the low-level part of the AX25 channel. Easy! */
575 if (ax->tty == NULL) in ax_open()
576 return -ENODEV; in ax_open()
584 len = dev->mtu * 2; in ax_open()
588 * also fixes a bug in which SunOS sends 512-byte packets even with in ax_open()
591 if (len < 576 * 2) in ax_open()
592 len = 576 * 2; 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()
609 return 0; in ax_open()
612 kfree(ax->rbuff); in ax_open()
615 return -ENOMEM; in ax_open()
619 /* Close the low-level part of the AX25 channel. Easy! */
624 if (ax->tty) in ax_close()
625 clear_bit(TTY_DO_WRITE_WAKEUP, &ax->tty->flags); in ax_close()
629 return 0; in ax_close()
642 dev->mtu = AX_MTU; in ax_setup()
643 dev->hard_header_len = AX25_MAX_HEADER_LEN; in ax_setup()
644 dev->addr_len = AX25_ADDR_LEN; in ax_setup()
645 dev->type = ARPHRD_AX25; in ax_setup()
646 dev->tx_queue_len = 10; in ax_setup()
647 dev->header_ops = &ax25_header_ops; in ax_setup()
648 dev->netdev_ops = &ax_netdev_ops; in ax_setup()
651 memcpy(dev->broadcast, &ax25_bcast, AX25_ADDR_LEN); in ax_setup()
654 dev->flags = IFF_BROADCAST | IFF_MULTICAST; in ax_setup()
658 * We have a potential race on dereferencing tty->disc_data, because the tty
659 * layer provides no locking at all - thus one cpu could be running
661 * tty->disc_data and frees the memory that sixpack_receive_buf is using. The
672 ax = tty->disc_data; in mkiss_get()
674 refcount_inc(&ax->refcnt); in mkiss_get()
682 if (refcount_dec_and_test(&ax->refcnt)) in mkiss_put()
683 complete(&ax->dead); in mkiss_put()
686 static int crc_force = 0; /* Can be overridden with insmod */
695 return -EPERM; in mkiss_open()
696 if (tty->ops->write == NULL) in mkiss_open()
697 return -EOPNOTSUPP; in mkiss_open()
702 err = -ENOMEM; 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()
715 tty->receive_room = 65535; in mkiss_open()
720 dev->type = ARPHRD_AX25; in mkiss_open()
722 /* Perform the low-level AX25 initialization. */ in mkiss_open()
723 err = ax_open(ax->dev); in mkiss_open()
731 /* after register_netdev() - because else printk smashes the kernel */ 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()
748 case 0: in mkiss_open()
750 crc_force = 0; 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()
760 return 0; in mkiss_open()
763 kfree(ax->rbuff); in mkiss_open()
764 kfree(ax->xbuff); in mkiss_open()
778 ax = tty->disc_data; in mkiss_close()
779 tty->disc_data = NULL; 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()
818 return -ENXIO; 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()
833 err = -EFAULT; in mkiss_ioctl()
837 ax->mode = tmp; in mkiss_ioctl()
838 dev->addr_len = AX25_ADDR_LEN; in mkiss_ioctl()
839 dev->hard_header_len = AX25_KISS_HEADER_LEN + in mkiss_ioctl()
841 dev->type = ARPHRD_AX25; in mkiss_ioctl()
843 err = 0; in mkiss_ioctl()
851 err = -EFAULT; in mkiss_ioctl()
859 err = 0; in mkiss_ioctl()
863 err = -ENOIOCTLCMD; in mkiss_ioctl()
886 * Argh! mtu change time! - costs us the packet part received in mkiss_receive_buf()
889 if (ax->mtu != ax->dev->mtu + 73) in mkiss_receive_buf()
893 while (count--) { 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()
920 if (ax->xleft <= 0) { in mkiss_write_wakeup()
924 clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); 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()
961 if (status != 0) in mkiss_init_driver()
972 MODULE_AUTHOR("Ralf Baechle DL5RB <ralf@linux-mips.org>");
974 module_param(crc_force, int, 0);
975 MODULE_PARM_DESC(crc_force, "crc [0 = auto | 1 = none | 2 = flexnet | 3 = smack]");