dmaengine: imx-sdma: Let the core do the device node validation
[linux/fpc-iii.git] / drivers / net / hamradio / mkiss.c
blob4938cf4c184c67644686ce21a3d7138e682e72bc
1 /*
2 * This program is free software; you can distribute it and/or modify it
3 * under the terms of the GNU General Public License (Version 2) as
4 * published by the Free Software Foundation.
6 * This program is distributed in the hope it will be useful, but WITHOUT
7 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
8 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
9 * for more details.
11 * You should have received a copy of the GNU General Public License along
12 * with this program; if not, see <http://www.gnu.org/licenses/>.
14 * Copyright (C) Hans Alblas PE1AYX <hans@esrac.ele.tue.nl>
15 * Copyright (C) 2004, 05 Ralf Baechle DL5RB <ralf@linux-mips.org>
16 * Copyright (C) 2004, 05 Thomas Osterried DL9SAU <thomas@x-berg.in-berlin.de>
18 #include <linux/module.h>
19 #include <linux/bitops.h>
20 #include <linux/uaccess.h>
21 #include <linux/crc16.h>
22 #include <linux/string.h>
23 #include <linux/mm.h>
24 #include <linux/interrupt.h>
25 #include <linux/in.h>
26 #include <linux/inet.h>
27 #include <linux/slab.h>
28 #include <linux/tty.h>
29 #include <linux/errno.h>
30 #include <linux/netdevice.h>
31 #include <linux/major.h>
32 #include <linux/init.h>
33 #include <linux/rtnetlink.h>
34 #include <linux/etherdevice.h>
35 #include <linux/skbuff.h>
36 #include <linux/if_arp.h>
37 #include <linux/jiffies.h>
39 #include <net/ax25.h>
41 #define AX_MTU 236
43 /* SLIP/KISS protocol characters. */
44 #define END 0300 /* indicates end of frame */
45 #define ESC 0333 /* indicates byte stuffing */
46 #define ESC_END 0334 /* ESC ESC_END means END 'data' */
47 #define ESC_ESC 0335 /* ESC ESC_ESC means ESC 'data' */
49 struct mkiss {
50 struct tty_struct *tty; /* ptr to TTY structure */
51 struct net_device *dev; /* easy for intr handling */
53 /* These are pointers to the malloc()ed frame buffers. */
54 spinlock_t buflock;/* lock for rbuf and xbuf */
55 unsigned char *rbuff; /* receiver buffer */
56 int rcount; /* received chars counter */
57 unsigned char *xbuff; /* transmitter buffer */
58 unsigned char *xhead; /* pointer to next byte to XMIT */
59 int xleft; /* bytes left in XMIT queue */
61 /* Detailed SLIP statistics. */
62 int mtu; /* Our mtu (to spot changes!) */
63 int buffsize; /* Max buffers sizes */
65 unsigned long flags; /* Flag values/ mode etc */
66 /* long req'd: used by set_bit --RR */
67 #define AXF_INUSE 0 /* Channel in use */
68 #define AXF_ESCAPE 1 /* ESC received */
69 #define AXF_ERROR 2 /* Parity, etc. error */
70 #define AXF_KEEPTEST 3 /* Keepalive test flag */
71 #define AXF_OUTWAIT 4 /* is outpacket was flag */
73 int mode;
74 int crcmode; /* MW: for FlexNet, SMACK etc. */
75 int crcauto; /* CRC auto mode */
77 #define CRC_MODE_NONE 0
78 #define CRC_MODE_FLEX 1
79 #define CRC_MODE_SMACK 2
80 #define CRC_MODE_FLEX_TEST 3
81 #define CRC_MODE_SMACK_TEST 4
83 atomic_t refcnt;
84 struct completion dead;
87 /*---------------------------------------------------------------------------*/
89 static const unsigned short crc_flex_table[] = {
90 0x0f87, 0x1e0e, 0x2c95, 0x3d1c, 0x49a3, 0x582a, 0x6ab1, 0x7b38,
91 0x83cf, 0x9246, 0xa0dd, 0xb154, 0xc5eb, 0xd462, 0xe6f9, 0xf770,
92 0x1f06, 0x0e8f, 0x3c14, 0x2d9d, 0x5922, 0x48ab, 0x7a30, 0x6bb9,
93 0x934e, 0x82c7, 0xb05c, 0xa1d5, 0xd56a, 0xc4e3, 0xf678, 0xe7f1,
94 0x2e85, 0x3f0c, 0x0d97, 0x1c1e, 0x68a1, 0x7928, 0x4bb3, 0x5a3a,
95 0xa2cd, 0xb344, 0x81df, 0x9056, 0xe4e9, 0xf560, 0xc7fb, 0xd672,
96 0x3e04, 0x2f8d, 0x1d16, 0x0c9f, 0x7820, 0x69a9, 0x5b32, 0x4abb,
97 0xb24c, 0xa3c5, 0x915e, 0x80d7, 0xf468, 0xe5e1, 0xd77a, 0xc6f3,
98 0x4d83, 0x5c0a, 0x6e91, 0x7f18, 0x0ba7, 0x1a2e, 0x28b5, 0x393c,
99 0xc1cb, 0xd042, 0xe2d9, 0xf350, 0x87ef, 0x9666, 0xa4fd, 0xb574,
100 0x5d02, 0x4c8b, 0x7e10, 0x6f99, 0x1b26, 0x0aaf, 0x3834, 0x29bd,
101 0xd14a, 0xc0c3, 0xf258, 0xe3d1, 0x976e, 0x86e7, 0xb47c, 0xa5f5,
102 0x6c81, 0x7d08, 0x4f93, 0x5e1a, 0x2aa5, 0x3b2c, 0x09b7, 0x183e,
103 0xe0c9, 0xf140, 0xc3db, 0xd252, 0xa6ed, 0xb764, 0x85ff, 0x9476,
104 0x7c00, 0x6d89, 0x5f12, 0x4e9b, 0x3a24, 0x2bad, 0x1936, 0x08bf,
105 0xf048, 0xe1c1, 0xd35a, 0xc2d3, 0xb66c, 0xa7e5, 0x957e, 0x84f7,
106 0x8b8f, 0x9a06, 0xa89d, 0xb914, 0xcdab, 0xdc22, 0xeeb9, 0xff30,
107 0x07c7, 0x164e, 0x24d5, 0x355c, 0x41e3, 0x506a, 0x62f1, 0x7378,
108 0x9b0e, 0x8a87, 0xb81c, 0xa995, 0xdd2a, 0xcca3, 0xfe38, 0xefb1,
109 0x1746, 0x06cf, 0x3454, 0x25dd, 0x5162, 0x40eb, 0x7270, 0x63f9,
110 0xaa8d, 0xbb04, 0x899f, 0x9816, 0xeca9, 0xfd20, 0xcfbb, 0xde32,
111 0x26c5, 0x374c, 0x05d7, 0x145e, 0x60e1, 0x7168, 0x43f3, 0x527a,
112 0xba0c, 0xab85, 0x991e, 0x8897, 0xfc28, 0xeda1, 0xdf3a, 0xceb3,
113 0x3644, 0x27cd, 0x1556, 0x04df, 0x7060, 0x61e9, 0x5372, 0x42fb,
114 0xc98b, 0xd802, 0xea99, 0xfb10, 0x8faf, 0x9e26, 0xacbd, 0xbd34,
115 0x45c3, 0x544a, 0x66d1, 0x7758, 0x03e7, 0x126e, 0x20f5, 0x317c,
116 0xd90a, 0xc883, 0xfa18, 0xeb91, 0x9f2e, 0x8ea7, 0xbc3c, 0xadb5,
117 0x5542, 0x44cb, 0x7650, 0x67d9, 0x1366, 0x02ef, 0x3074, 0x21fd,
118 0xe889, 0xf900, 0xcb9b, 0xda12, 0xaead, 0xbf24, 0x8dbf, 0x9c36,
119 0x64c1, 0x7548, 0x47d3, 0x565a, 0x22e5, 0x336c, 0x01f7, 0x107e,
120 0xf808, 0xe981, 0xdb1a, 0xca93, 0xbe2c, 0xafa5, 0x9d3e, 0x8cb7,
121 0x7440, 0x65c9, 0x5752, 0x46db, 0x3264, 0x23ed, 0x1176, 0x00ff
124 static unsigned short calc_crc_flex(unsigned char *cp, int size)
126 unsigned short crc = 0xffff;
128 while (size--)
129 crc = (crc << 8) ^ crc_flex_table[((crc >> 8) ^ *cp++) & 0xff];
131 return crc;
134 static int check_crc_flex(unsigned char *cp, int size)
136 unsigned short crc = 0xffff;
138 if (size < 3)
139 return -1;
141 while (size--)
142 crc = (crc << 8) ^ crc_flex_table[((crc >> 8) ^ *cp++) & 0xff];
144 if ((crc & 0xffff) != 0x7070)
145 return -1;
147 return 0;
150 static int check_crc_16(unsigned char *cp, int size)
152 unsigned short crc = 0x0000;
154 if (size < 3)
155 return -1;
157 crc = crc16(0, cp, size);
159 if (crc != 0x0000)
160 return -1;
162 return 0;
166 * Standard encapsulation
169 static int kiss_esc(unsigned char *s, unsigned char *d, int len)
171 unsigned char *ptr = d;
172 unsigned char c;
175 * Send an initial END character to flush out any data that may have
176 * accumulated in the receiver due to line noise.
179 *ptr++ = END;
181 while (len-- > 0) {
182 switch (c = *s++) {
183 case END:
184 *ptr++ = ESC;
185 *ptr++ = ESC_END;
186 break;
187 case ESC:
188 *ptr++ = ESC;
189 *ptr++ = ESC_ESC;
190 break;
191 default:
192 *ptr++ = c;
193 break;
197 *ptr++ = END;
199 return ptr - d;
203 * MW:
204 * OK its ugly, but tell me a better solution without copying the
205 * packet to a temporary buffer :-)
207 static int kiss_esc_crc(unsigned char *s, unsigned char *d, unsigned short crc,
208 int len)
210 unsigned char *ptr = d;
211 unsigned char c=0;
213 *ptr++ = END;
214 while (len > 0) {
215 if (len > 2)
216 c = *s++;
217 else if (len > 1)
218 c = crc >> 8;
219 else
220 c = crc & 0xff;
222 len--;
224 switch (c) {
225 case END:
226 *ptr++ = ESC;
227 *ptr++ = ESC_END;
228 break;
229 case ESC:
230 *ptr++ = ESC;
231 *ptr++ = ESC_ESC;
232 break;
233 default:
234 *ptr++ = c;
235 break;
238 *ptr++ = END;
240 return ptr - d;
243 /* Send one completely decapsulated AX.25 packet to the AX.25 layer. */
244 static void ax_bump(struct mkiss *ax)
246 struct sk_buff *skb;
247 int count;
249 spin_lock_bh(&ax->buflock);
250 if (ax->rbuff[0] > 0x0f) {
251 if (ax->rbuff[0] & 0x80) {
252 if (check_crc_16(ax->rbuff, ax->rcount) < 0) {
253 ax->dev->stats.rx_errors++;
254 spin_unlock_bh(&ax->buflock);
256 return;
258 if (ax->crcmode != CRC_MODE_SMACK && ax->crcauto) {
259 printk(KERN_INFO
260 "mkiss: %s: Switching to crc-smack\n",
261 ax->dev->name);
262 ax->crcmode = CRC_MODE_SMACK;
264 ax->rcount -= 2;
265 *ax->rbuff &= ~0x80;
266 } else if (ax->rbuff[0] & 0x20) {
267 if (check_crc_flex(ax->rbuff, ax->rcount) < 0) {
268 ax->dev->stats.rx_errors++;
269 spin_unlock_bh(&ax->buflock);
270 return;
272 if (ax->crcmode != CRC_MODE_FLEX && ax->crcauto) {
273 printk(KERN_INFO
274 "mkiss: %s: Switching to crc-flexnet\n",
275 ax->dev->name);
276 ax->crcmode = CRC_MODE_FLEX;
278 ax->rcount -= 2;
281 * dl9sau bugfix: the trailling two bytes flexnet crc
282 * will not be passed to the kernel. thus we have to
283 * correct the kissparm signature, because it indicates
284 * a crc but there's none
286 *ax->rbuff &= ~0x20;
290 count = ax->rcount;
292 if ((skb = dev_alloc_skb(count)) == NULL) {
293 printk(KERN_ERR "mkiss: %s: memory squeeze, dropping packet.\n",
294 ax->dev->name);
295 ax->dev->stats.rx_dropped++;
296 spin_unlock_bh(&ax->buflock);
297 return;
300 skb_put_data(skb, ax->rbuff, count);
301 skb->protocol = ax25_type_trans(skb, ax->dev);
302 netif_rx(skb);
303 ax->dev->stats.rx_packets++;
304 ax->dev->stats.rx_bytes += count;
305 spin_unlock_bh(&ax->buflock);
308 static void kiss_unesc(struct mkiss *ax, unsigned char s)
310 switch (s) {
311 case END:
312 /* drop keeptest bit = VSV */
313 if (test_bit(AXF_KEEPTEST, &ax->flags))
314 clear_bit(AXF_KEEPTEST, &ax->flags);
316 if (!test_and_clear_bit(AXF_ERROR, &ax->flags) && (ax->rcount > 2))
317 ax_bump(ax);
319 clear_bit(AXF_ESCAPE, &ax->flags);
320 ax->rcount = 0;
321 return;
323 case ESC:
324 set_bit(AXF_ESCAPE, &ax->flags);
325 return;
326 case ESC_ESC:
327 if (test_and_clear_bit(AXF_ESCAPE, &ax->flags))
328 s = ESC;
329 break;
330 case ESC_END:
331 if (test_and_clear_bit(AXF_ESCAPE, &ax->flags))
332 s = END;
333 break;
336 spin_lock_bh(&ax->buflock);
337 if (!test_bit(AXF_ERROR, &ax->flags)) {
338 if (ax->rcount < ax->buffsize) {
339 ax->rbuff[ax->rcount++] = s;
340 spin_unlock_bh(&ax->buflock);
341 return;
344 ax->dev->stats.rx_over_errors++;
345 set_bit(AXF_ERROR, &ax->flags);
347 spin_unlock_bh(&ax->buflock);
350 static int ax_set_mac_address(struct net_device *dev, void *addr)
352 struct sockaddr_ax25 *sa = addr;
354 netif_tx_lock_bh(dev);
355 netif_addr_lock(dev);
356 memcpy(dev->dev_addr, &sa->sax25_call, AX25_ADDR_LEN);
357 netif_addr_unlock(dev);
358 netif_tx_unlock_bh(dev);
360 return 0;
363 /*---------------------------------------------------------------------------*/
365 static void ax_changedmtu(struct mkiss *ax)
367 struct net_device *dev = ax->dev;
368 unsigned char *xbuff, *rbuff, *oxbuff, *orbuff;
369 int len;
371 len = dev->mtu * 2;
374 * allow for arrival of larger UDP packets, even if we say not to
375 * also fixes a bug in which SunOS sends 512-byte packets even with
376 * an MSS of 128
378 if (len < 576 * 2)
379 len = 576 * 2;
381 xbuff = kmalloc(len + 4, GFP_ATOMIC);
382 rbuff = kmalloc(len + 4, GFP_ATOMIC);
384 if (xbuff == NULL || rbuff == NULL) {
385 printk(KERN_ERR "mkiss: %s: unable to grow ax25 buffers, "
386 "MTU change cancelled.\n",
387 ax->dev->name);
388 dev->mtu = ax->mtu;
389 kfree(xbuff);
390 kfree(rbuff);
391 return;
394 spin_lock_bh(&ax->buflock);
396 oxbuff = ax->xbuff;
397 ax->xbuff = xbuff;
398 orbuff = ax->rbuff;
399 ax->rbuff = rbuff;
401 if (ax->xleft) {
402 if (ax->xleft <= len) {
403 memcpy(ax->xbuff, ax->xhead, ax->xleft);
404 } else {
405 ax->xleft = 0;
406 dev->stats.tx_dropped++;
410 ax->xhead = ax->xbuff;
412 if (ax->rcount) {
413 if (ax->rcount <= len) {
414 memcpy(ax->rbuff, orbuff, ax->rcount);
415 } else {
416 ax->rcount = 0;
417 dev->stats.rx_over_errors++;
418 set_bit(AXF_ERROR, &ax->flags);
422 ax->mtu = dev->mtu + 73;
423 ax->buffsize = len;
425 spin_unlock_bh(&ax->buflock);
427 kfree(oxbuff);
428 kfree(orbuff);
431 /* Encapsulate one AX.25 packet and stuff into a TTY queue. */
432 static void ax_encaps(struct net_device *dev, unsigned char *icp, int len)
434 struct mkiss *ax = netdev_priv(dev);
435 unsigned char *p;
436 int actual, count;
438 if (ax->mtu != ax->dev->mtu + 73) /* Someone has been ifconfigging */
439 ax_changedmtu(ax);
441 if (len > ax->mtu) { /* Sigh, shouldn't occur BUT ... */
442 printk(KERN_ERR "mkiss: %s: truncating oversized transmit packet!\n", ax->dev->name);
443 dev->stats.tx_dropped++;
444 netif_start_queue(dev);
445 return;
448 p = icp;
450 spin_lock_bh(&ax->buflock);
451 if ((*p & 0x0f) != 0) {
452 /* Configuration Command (kissparms(1).
453 * Protocol spec says: never append CRC.
454 * This fixes a very old bug in the linux
455 * kiss driver. -- dl9sau */
456 switch (*p & 0xff) {
457 case 0x85:
458 /* command from userspace especially for us,
459 * not for delivery to the tnc */
460 if (len > 1) {
461 int cmd = (p[1] & 0xff);
462 switch(cmd) {
463 case 3:
464 ax->crcmode = CRC_MODE_SMACK;
465 break;
466 case 2:
467 ax->crcmode = CRC_MODE_FLEX;
468 break;
469 case 1:
470 ax->crcmode = CRC_MODE_NONE;
471 break;
472 case 0:
473 default:
474 ax->crcmode = CRC_MODE_SMACK_TEST;
475 cmd = 0;
477 ax->crcauto = (cmd ? 0 : 1);
478 printk(KERN_INFO "mkiss: %s: crc mode set to %d\n",
479 ax->dev->name, cmd);
481 spin_unlock_bh(&ax->buflock);
482 netif_start_queue(dev);
484 return;
485 default:
486 count = kiss_esc(p, ax->xbuff, len);
488 } else {
489 unsigned short crc;
490 switch (ax->crcmode) {
491 case CRC_MODE_SMACK_TEST:
492 ax->crcmode = CRC_MODE_FLEX_TEST;
493 printk(KERN_INFO "mkiss: %s: Trying crc-smack\n", ax->dev->name);
494 // fall through
495 case CRC_MODE_SMACK:
496 *p |= 0x80;
497 crc = swab16(crc16(0, p, len));
498 count = kiss_esc_crc(p, ax->xbuff, crc, len+2);
499 break;
500 case CRC_MODE_FLEX_TEST:
501 ax->crcmode = CRC_MODE_NONE;
502 printk(KERN_INFO "mkiss: %s: Trying crc-flexnet\n", ax->dev->name);
503 // fall through
504 case CRC_MODE_FLEX:
505 *p |= 0x20;
506 crc = calc_crc_flex(p, len);
507 count = kiss_esc_crc(p, ax->xbuff, crc, len+2);
508 break;
510 default:
511 count = kiss_esc(p, ax->xbuff, len);
514 spin_unlock_bh(&ax->buflock);
516 set_bit(TTY_DO_WRITE_WAKEUP, &ax->tty->flags);
517 actual = ax->tty->ops->write(ax->tty, ax->xbuff, count);
518 dev->stats.tx_packets++;
519 dev->stats.tx_bytes += actual;
521 netif_trans_update(ax->dev);
522 ax->xleft = count - actual;
523 ax->xhead = ax->xbuff + actual;
526 /* Encapsulate an AX.25 packet and kick it into a TTY queue. */
527 static netdev_tx_t ax_xmit(struct sk_buff *skb, struct net_device *dev)
529 struct mkiss *ax = netdev_priv(dev);
531 if (skb->protocol == htons(ETH_P_IP))
532 return ax25_ip_xmit(skb);
534 if (!netif_running(dev)) {
535 printk(KERN_ERR "mkiss: %s: xmit call when iface is down\n", dev->name);
536 return NETDEV_TX_BUSY;
539 if (netif_queue_stopped(dev)) {
541 * May be we must check transmitter timeout here ?
542 * 14 Oct 1994 Dmitry Gorodchanin.
544 if (time_before(jiffies, dev_trans_start(dev) + 20 * HZ)) {
545 /* 20 sec timeout not reached */
546 return NETDEV_TX_BUSY;
549 printk(KERN_ERR "mkiss: %s: transmit timed out, %s?\n", dev->name,
550 (tty_chars_in_buffer(ax->tty) || ax->xleft) ?
551 "bad line quality" : "driver error");
553 ax->xleft = 0;
554 clear_bit(TTY_DO_WRITE_WAKEUP, &ax->tty->flags);
555 netif_start_queue(dev);
558 /* We were not busy, so we are now... :-) */
559 netif_stop_queue(dev);
560 ax_encaps(dev, skb->data, skb->len);
561 kfree_skb(skb);
563 return NETDEV_TX_OK;
566 static int ax_open_dev(struct net_device *dev)
568 struct mkiss *ax = netdev_priv(dev);
570 if (ax->tty == NULL)
571 return -ENODEV;
573 return 0;
576 /* Open the low-level part of the AX25 channel. Easy! */
577 static int ax_open(struct net_device *dev)
579 struct mkiss *ax = netdev_priv(dev);
580 unsigned long len;
582 if (ax->tty == NULL)
583 return -ENODEV;
586 * Allocate the frame buffers:
588 * rbuff Receive buffer.
589 * xbuff Transmit buffer.
591 len = dev->mtu * 2;
594 * allow for arrival of larger UDP packets, even if we say not to
595 * also fixes a bug in which SunOS sends 512-byte packets even with
596 * an MSS of 128
598 if (len < 576 * 2)
599 len = 576 * 2;
601 if ((ax->rbuff = kmalloc(len + 4, GFP_KERNEL)) == NULL)
602 goto norbuff;
604 if ((ax->xbuff = kmalloc(len + 4, GFP_KERNEL)) == NULL)
605 goto noxbuff;
607 ax->mtu = dev->mtu + 73;
608 ax->buffsize = len;
609 ax->rcount = 0;
610 ax->xleft = 0;
612 ax->flags &= (1 << AXF_INUSE); /* Clear ESCAPE & ERROR flags */
614 spin_lock_init(&ax->buflock);
616 return 0;
618 noxbuff:
619 kfree(ax->rbuff);
621 norbuff:
622 return -ENOMEM;
626 /* Close the low-level part of the AX25 channel. Easy! */
627 static int ax_close(struct net_device *dev)
629 struct mkiss *ax = netdev_priv(dev);
631 if (ax->tty)
632 clear_bit(TTY_DO_WRITE_WAKEUP, &ax->tty->flags);
634 netif_stop_queue(dev);
636 return 0;
639 static const struct net_device_ops ax_netdev_ops = {
640 .ndo_open = ax_open_dev,
641 .ndo_stop = ax_close,
642 .ndo_start_xmit = ax_xmit,
643 .ndo_set_mac_address = ax_set_mac_address,
646 static void ax_setup(struct net_device *dev)
648 /* Finish setting up the DEVICE info. */
649 dev->mtu = AX_MTU;
650 dev->hard_header_len = AX25_MAX_HEADER_LEN;
651 dev->addr_len = AX25_ADDR_LEN;
652 dev->type = ARPHRD_AX25;
653 dev->tx_queue_len = 10;
654 dev->header_ops = &ax25_header_ops;
655 dev->netdev_ops = &ax_netdev_ops;
658 memcpy(dev->broadcast, &ax25_bcast, AX25_ADDR_LEN);
659 memcpy(dev->dev_addr, &ax25_defaddr, AX25_ADDR_LEN);
661 dev->flags = IFF_BROADCAST | IFF_MULTICAST;
665 * We have a potential race on dereferencing tty->disc_data, because the tty
666 * layer provides no locking at all - thus one cpu could be running
667 * sixpack_receive_buf while another calls sixpack_close, which zeroes
668 * tty->disc_data and frees the memory that sixpack_receive_buf is using. The
669 * best way to fix this is to use a rwlock in the tty struct, but for now we
670 * use a single global rwlock for all ttys in ppp line discipline.
672 static DEFINE_RWLOCK(disc_data_lock);
674 static struct mkiss *mkiss_get(struct tty_struct *tty)
676 struct mkiss *ax;
678 read_lock(&disc_data_lock);
679 ax = tty->disc_data;
680 if (ax)
681 atomic_inc(&ax->refcnt);
682 read_unlock(&disc_data_lock);
684 return ax;
687 static void mkiss_put(struct mkiss *ax)
689 if (atomic_dec_and_test(&ax->refcnt))
690 complete(&ax->dead);
693 static int crc_force = 0; /* Can be overridden with insmod */
695 static int mkiss_open(struct tty_struct *tty)
697 struct net_device *dev;
698 struct mkiss *ax;
699 int err;
701 if (!capable(CAP_NET_ADMIN))
702 return -EPERM;
703 if (tty->ops->write == NULL)
704 return -EOPNOTSUPP;
706 dev = alloc_netdev(sizeof(struct mkiss), "ax%d", NET_NAME_UNKNOWN,
707 ax_setup);
708 if (!dev) {
709 err = -ENOMEM;
710 goto out;
713 ax = netdev_priv(dev);
714 ax->dev = dev;
716 spin_lock_init(&ax->buflock);
717 atomic_set(&ax->refcnt, 1);
718 init_completion(&ax->dead);
720 ax->tty = tty;
721 tty->disc_data = ax;
722 tty->receive_room = 65535;
724 tty_driver_flush_buffer(tty);
726 /* Restore default settings */
727 dev->type = ARPHRD_AX25;
729 /* Perform the low-level AX25 initialization. */
730 err = ax_open(ax->dev);
731 if (err)
732 goto out_free_netdev;
734 err = register_netdev(dev);
735 if (err)
736 goto out_free_buffers;
738 /* after register_netdev() - because else printk smashes the kernel */
739 switch (crc_force) {
740 case 3:
741 ax->crcmode = CRC_MODE_SMACK;
742 printk(KERN_INFO "mkiss: %s: crc mode smack forced.\n",
743 ax->dev->name);
744 break;
745 case 2:
746 ax->crcmode = CRC_MODE_FLEX;
747 printk(KERN_INFO "mkiss: %s: crc mode flexnet forced.\n",
748 ax->dev->name);
749 break;
750 case 1:
751 ax->crcmode = CRC_MODE_NONE;
752 printk(KERN_INFO "mkiss: %s: crc mode disabled.\n",
753 ax->dev->name);
754 break;
755 case 0:
756 /* fall through */
757 default:
758 crc_force = 0;
759 printk(KERN_INFO "mkiss: %s: crc mode is auto.\n",
760 ax->dev->name);
761 ax->crcmode = CRC_MODE_SMACK_TEST;
763 ax->crcauto = (crc_force ? 0 : 1);
765 netif_start_queue(dev);
767 /* Done. We have linked the TTY line to a channel. */
768 return 0;
770 out_free_buffers:
771 kfree(ax->rbuff);
772 kfree(ax->xbuff);
774 out_free_netdev:
775 free_netdev(dev);
777 out:
778 return err;
781 static void mkiss_close(struct tty_struct *tty)
783 struct mkiss *ax;
785 write_lock_bh(&disc_data_lock);
786 ax = tty->disc_data;
787 tty->disc_data = NULL;
788 write_unlock_bh(&disc_data_lock);
790 if (!ax)
791 return;
794 * We have now ensured that nobody can start using ap from now on, but
795 * we have to wait for all existing users to finish.
797 if (!atomic_dec_and_test(&ax->refcnt))
798 wait_for_completion(&ax->dead);
800 * Halt the transmit queue so that a new transmit cannot scribble
801 * on our buffers
803 netif_stop_queue(ax->dev);
805 /* Free all AX25 frame buffers. */
806 kfree(ax->rbuff);
807 kfree(ax->xbuff);
809 ax->tty = NULL;
811 unregister_netdev(ax->dev);
814 /* Perform I/O control on an active ax25 channel. */
815 static int mkiss_ioctl(struct tty_struct *tty, struct file *file,
816 unsigned int cmd, unsigned long arg)
818 struct mkiss *ax = mkiss_get(tty);
819 struct net_device *dev;
820 unsigned int tmp, err;
822 /* First make sure we're connected. */
823 if (ax == NULL)
824 return -ENXIO;
825 dev = ax->dev;
827 switch (cmd) {
828 case SIOCGIFNAME:
829 err = copy_to_user((void __user *) arg, ax->dev->name,
830 strlen(ax->dev->name) + 1) ? -EFAULT : 0;
831 break;
833 case SIOCGIFENCAP:
834 err = put_user(4, (int __user *) arg);
835 break;
837 case SIOCSIFENCAP:
838 if (get_user(tmp, (int __user *) arg)) {
839 err = -EFAULT;
840 break;
843 ax->mode = tmp;
844 dev->addr_len = AX25_ADDR_LEN;
845 dev->hard_header_len = AX25_KISS_HEADER_LEN +
846 AX25_MAX_HEADER_LEN + 3;
847 dev->type = ARPHRD_AX25;
849 err = 0;
850 break;
852 case SIOCSIFHWADDR: {
853 char addr[AX25_ADDR_LEN];
855 if (copy_from_user(&addr,
856 (void __user *) arg, AX25_ADDR_LEN)) {
857 err = -EFAULT;
858 break;
861 netif_tx_lock_bh(dev);
862 memcpy(dev->dev_addr, addr, AX25_ADDR_LEN);
863 netif_tx_unlock_bh(dev);
865 err = 0;
866 break;
868 default:
869 err = -ENOIOCTLCMD;
872 mkiss_put(ax);
874 return err;
878 * Handle the 'receiver data ready' interrupt.
879 * This function is called by the 'tty_io' module in the kernel when
880 * a block of data has been received, which can now be decapsulated
881 * and sent on to the AX.25 layer for further processing.
883 static void mkiss_receive_buf(struct tty_struct *tty, const unsigned char *cp,
884 char *fp, int count)
886 struct mkiss *ax = mkiss_get(tty);
888 if (!ax)
889 return;
892 * Argh! mtu change time! - costs us the packet part received
893 * at the change
895 if (ax->mtu != ax->dev->mtu + 73)
896 ax_changedmtu(ax);
898 /* Read the characters out of the buffer */
899 while (count--) {
900 if (fp != NULL && *fp++) {
901 if (!test_and_set_bit(AXF_ERROR, &ax->flags))
902 ax->dev->stats.rx_errors++;
903 cp++;
904 continue;
907 kiss_unesc(ax, *cp++);
910 mkiss_put(ax);
911 tty_unthrottle(tty);
915 * Called by the driver when there's room for more data. If we have
916 * more packets to send, we send them here.
918 static void mkiss_write_wakeup(struct tty_struct *tty)
920 struct mkiss *ax = mkiss_get(tty);
921 int actual;
923 if (!ax)
924 return;
926 if (ax->xleft <= 0) {
927 /* Now serial buffer is almost free & we can start
928 * transmission of another packet
930 clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
932 netif_wake_queue(ax->dev);
933 goto out;
936 actual = tty->ops->write(tty, ax->xhead, ax->xleft);
937 ax->xleft -= actual;
938 ax->xhead += actual;
940 out:
941 mkiss_put(ax);
944 static struct tty_ldisc_ops ax_ldisc = {
945 .owner = THIS_MODULE,
946 .magic = TTY_LDISC_MAGIC,
947 .name = "mkiss",
948 .open = mkiss_open,
949 .close = mkiss_close,
950 .ioctl = mkiss_ioctl,
951 .receive_buf = mkiss_receive_buf,
952 .write_wakeup = mkiss_write_wakeup
955 static const char banner[] __initconst = KERN_INFO \
956 "mkiss: AX.25 Multikiss, Hans Albas PE1AYX\n";
957 static const char msg_regfail[] __initconst = KERN_ERR \
958 "mkiss: can't register line discipline (err = %d)\n";
960 static int __init mkiss_init_driver(void)
962 int status;
964 printk(banner);
966 status = tty_register_ldisc(N_AX25, &ax_ldisc);
967 if (status != 0)
968 printk(msg_regfail, status);
970 return status;
973 static const char msg_unregfail[] = KERN_ERR \
974 "mkiss: can't unregister line discipline (err = %d)\n";
976 static void __exit mkiss_exit_driver(void)
978 int ret;
980 if ((ret = tty_unregister_ldisc(N_AX25)))
981 printk(msg_unregfail, ret);
984 MODULE_AUTHOR("Ralf Baechle DL5RB <ralf@linux-mips.org>");
985 MODULE_DESCRIPTION("KISS driver for AX.25 over TTYs");
986 module_param(crc_force, int, 0);
987 MODULE_PARM_DESC(crc_force, "crc [0 = auto | 1 = none | 2 = flexnet | 3 = smack]");
988 MODULE_LICENSE("GPL");
989 MODULE_ALIAS_LDISC(N_AX25);
991 module_init(mkiss_init_driver);
992 module_exit(mkiss_exit_driver);