blob: 802233d41b25e8d167f61a825f529d5fc56b5881 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Ralf Baechle815f62b2005-08-24 18:06:36 +01002 * 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.
Linus Torvalds1da177e2005-04-16 15:20:36 -07005 *
Ralf Baechle815f62b2005-08-24 18:06:36 +01006 * 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.
Linus Torvalds1da177e2005-04-16 15:20:36 -070010 *
Ralf Baechle815f62b2005-08-24 18:06:36 +010011 * You should have received a copy of the GNU General Public License along
Jeff Kirsheradf8d3f2013-12-06 06:28:47 -080012 * with this program; if not, see <http://www.gnu.org/licenses/>.
Linus Torvalds1da177e2005-04-16 15:20:36 -070013 *
Ralf Baechle815f62b2005-08-24 18:06:36 +010014 * Copyright (C) Hans Alblas PE1AYX <hans@esrac.ele.tue.nl>
15 * Copyright (C) 2004, 05 Ralf Baechle DL5RB <ralf@linux-mips.org>
Ralf Baechle5793f4b2005-10-14 14:28:09 +010016 * Copyright (C) 2004, 05 Thomas Osterried DL9SAU <thomas@x-berg.in-berlin.de>
Linus Torvalds1da177e2005-04-16 15:20:36 -070017 */
Linus Torvalds1da177e2005-04-16 15:20:36 -070018#include <linux/module.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070019#include <linux/bitops.h>
Linus Torvalds7c0f6ba2016-12-24 11:46:01 -080020#include <linux/uaccess.h>
Ralf Baechle5793f4b2005-10-14 14:28:09 +010021#include <linux/crc16.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070022#include <linux/string.h>
23#include <linux/mm.h>
24#include <linux/interrupt.h>
25#include <linux/in.h>
26#include <linux/inet.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090027#include <linux/slab.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070028#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>
Marcelo Feitoza Parisicd8749b2005-07-15 11:16:42 +010037#include <linux/jiffies.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070038
39#include <net/ax25.h>
40
Ralf Baechle815f62b2005-08-24 18:06:36 +010041#define AX_MTU 236
Linus Torvalds1da177e2005-04-16 15:20:36 -070042
Ralf Baechle815f62b2005-08-24 18:06:36 +010043/* 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' */
Linus Torvalds1da177e2005-04-16 15:20:36 -070048
Ralf Baechle815f62b2005-08-24 18:06:36 +010049struct mkiss {
50 struct tty_struct *tty; /* ptr to TTY structure */
51 struct net_device *dev; /* easy for intr handling */
Linus Torvalds1da177e2005-04-16 15:20:36 -070052
Ralf Baechle815f62b2005-08-24 18:06:36 +010053 /* 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 */
Linus Torvalds1da177e2005-04-16 15:20:36 -070060
Ralf Baechle815f62b2005-08-24 18:06:36 +010061 /* Detailed SLIP statistics. */
62 int mtu; /* Our mtu (to spot changes!) */
63 int buffsize; /* Max buffers sizes */
Linus Torvalds1da177e2005-04-16 15:20:36 -070064
Ralf Baechle815f62b2005-08-24 18:06:36 +010065 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 */
Linus Torvalds1da177e2005-04-16 15:20:36 -070072
Ralf Baechle815f62b2005-08-24 18:06:36 +010073 int mode;
74 int crcmode; /* MW: for FlexNet, SMACK etc. */
Ralf Baechle5793f4b2005-10-14 14:28:09 +010075 int crcauto; /* CRC auto mode */
76
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
Ralf Baechle815f62b2005-08-24 18:06:36 +010082
83 atomic_t refcnt;
84 struct semaphore dead_sem;
Linus Torvalds1da177e2005-04-16 15:20:36 -070085};
86
87/*---------------------------------------------------------------------------*/
88
Ralf Baechle815f62b2005-08-24 18:06:36 +010089static 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
122};
123
Linus Torvalds1da177e2005-04-16 15:20:36 -0700124static unsigned short calc_crc_flex(unsigned char *cp, int size)
125{
Ralf Baechle815f62b2005-08-24 18:06:36 +0100126 unsigned short crc = 0xffff;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700127
Ralf Baechle815f62b2005-08-24 18:06:36 +0100128 while (size--)
129 crc = (crc << 8) ^ crc_flex_table[((crc >> 8) ^ *cp++) & 0xff];
130
131 return crc;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700132}
133
Linus Torvalds1da177e2005-04-16 15:20:36 -0700134static int check_crc_flex(unsigned char *cp, int size)
135{
Ralf Baechle815f62b2005-08-24 18:06:36 +0100136 unsigned short crc = 0xffff;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700137
Ralf Baechle815f62b2005-08-24 18:06:36 +0100138 if (size < 3)
139 return -1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700140
Ralf Baechle815f62b2005-08-24 18:06:36 +0100141 while (size--)
142 crc = (crc << 8) ^ crc_flex_table[((crc >> 8) ^ *cp++) & 0xff];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700143
Ralf Baechle815f62b2005-08-24 18:06:36 +0100144 if ((crc & 0xffff) != 0x7070)
145 return -1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700146
Ralf Baechle815f62b2005-08-24 18:06:36 +0100147 return 0;
148}
149
Ralf Baechle5793f4b2005-10-14 14:28:09 +0100150static int check_crc_16(unsigned char *cp, int size)
151{
152 unsigned short crc = 0x0000;
153
154 if (size < 3)
155 return -1;
156
157 crc = crc16(0, cp, size);
158
159 if (crc != 0x0000)
160 return -1;
161
162 return 0;
163}
164
Ralf Baechle815f62b2005-08-24 18:06:36 +0100165/*
166 * Standard encapsulation
167 */
168
169static int kiss_esc(unsigned char *s, unsigned char *d, int len)
170{
171 unsigned char *ptr = d;
172 unsigned char c;
173
174 /*
175 * Send an initial END character to flush out any data that may have
176 * accumulated in the receiver due to line noise.
177 */
178
179 *ptr++ = END;
180
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;
194 }
195 }
196
197 *ptr++ = END;
198
199 return ptr - d;
200}
201
202/*
203 * MW:
204 * OK its ugly, but tell me a better solution without copying the
205 * packet to a temporary buffer :-)
206 */
207static int kiss_esc_crc(unsigned char *s, unsigned char *d, unsigned short crc,
208 int len)
209{
210 unsigned char *ptr = d;
211 unsigned char c=0;
212
213 *ptr++ = END;
214 while (len > 0) {
215 if (len > 2)
216 c = *s++;
217 else if (len > 1)
218 c = crc >> 8;
Colin Ian King6f5d2952018-04-25 11:43:07 +0100219 else
Ralf Baechle815f62b2005-08-24 18:06:36 +0100220 c = crc & 0xff;
221
222 len--;
223
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;
236 }
237 }
238 *ptr++ = END;
239
240 return ptr - d;
241}
242
243/* Send one completely decapsulated AX.25 packet to the AX.25 layer. */
244static void ax_bump(struct mkiss *ax)
245{
246 struct sk_buff *skb;
247 int count;
248
249 spin_lock_bh(&ax->buflock);
250 if (ax->rbuff[0] > 0x0f) {
Ralf Baechle5793f4b2005-10-14 14:28:09 +0100251 if (ax->rbuff[0] & 0x80) {
252 if (check_crc_16(ax->rbuff, ax->rcount) < 0) {
Stephen Hemmingerddbe9a62009-01-09 13:01:40 +0000253 ax->dev->stats.rx_errors++;
Ralf Baechle5793f4b2005-10-14 14:28:09 +0100254 spin_unlock_bh(&ax->buflock);
255
Ralf Baechle815f62b2005-08-24 18:06:36 +0100256 return;
257 }
Ralf Baechle5793f4b2005-10-14 14:28:09 +0100258 if (ax->crcmode != CRC_MODE_SMACK && ax->crcauto) {
259 printk(KERN_INFO
Ralf Baechle7b1401c2009-10-01 14:48:25 -0700260 "mkiss: %s: Switching to crc-smack\n",
Ralf Baechle5793f4b2005-10-14 14:28:09 +0100261 ax->dev->name);
262 ax->crcmode = CRC_MODE_SMACK;
263 }
Ralf Baechle815f62b2005-08-24 18:06:36 +0100264 ax->rcount -= 2;
Ralf Baechle5793f4b2005-10-14 14:28:09 +0100265 *ax->rbuff &= ~0x80;
266 } else if (ax->rbuff[0] & 0x20) {
267 if (check_crc_flex(ax->rbuff, ax->rcount) < 0) {
Stephen Hemmingerddbe9a62009-01-09 13:01:40 +0000268 ax->dev->stats.rx_errors++;
Ralf Baechle5793f4b2005-10-14 14:28:09 +0100269 spin_unlock_bh(&ax->buflock);
270 return;
271 }
272 if (ax->crcmode != CRC_MODE_FLEX && ax->crcauto) {
273 printk(KERN_INFO
Ralf Baechle7b1401c2009-10-01 14:48:25 -0700274 "mkiss: %s: Switching to crc-flexnet\n",
Ralf Baechle5793f4b2005-10-14 14:28:09 +0100275 ax->dev->name);
276 ax->crcmode = CRC_MODE_FLEX;
277 }
278 ax->rcount -= 2;
279
280 /*
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
Ralf Baechle815f62b2005-08-24 18:06:36 +0100285 */
Ralf Baechle5793f4b2005-10-14 14:28:09 +0100286 *ax->rbuff &= ~0x20;
Ralf Baechle815f62b2005-08-24 18:06:36 +0100287 }
288 }
Ralf Baechle815f62b2005-08-24 18:06:36 +0100289
290 count = ax->rcount;
291
292 if ((skb = dev_alloc_skb(count)) == NULL) {
293 printk(KERN_ERR "mkiss: %s: memory squeeze, dropping packet.\n",
294 ax->dev->name);
Stephen Hemmingerddbe9a62009-01-09 13:01:40 +0000295 ax->dev->stats.rx_dropped++;
Jarek Poplawski9f30c762008-02-13 11:17:58 +0000296 spin_unlock_bh(&ax->buflock);
Ralf Baechle815f62b2005-08-24 18:06:36 +0100297 return;
298 }
299
Johannes Berg59ae1d12017-06-16 14:29:20 +0200300 skb_put_data(skb, ax->rbuff, count);
Ralf Baechle815f62b2005-08-24 18:06:36 +0100301 skb->protocol = ax25_type_trans(skb, ax->dev);
302 netif_rx(skb);
Stephen Hemmingerddbe9a62009-01-09 13:01:40 +0000303 ax->dev->stats.rx_packets++;
304 ax->dev->stats.rx_bytes += count;
Jarek Poplawski9f30c762008-02-13 11:17:58 +0000305 spin_unlock_bh(&ax->buflock);
Ralf Baechle815f62b2005-08-24 18:06:36 +0100306}
307
308static void kiss_unesc(struct mkiss *ax, unsigned char s)
309{
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);
315
316 if (!test_and_clear_bit(AXF_ERROR, &ax->flags) && (ax->rcount > 2))
317 ax_bump(ax);
318
319 clear_bit(AXF_ESCAPE, &ax->flags);
320 ax->rcount = 0;
321 return;
322
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;
334 }
335
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;
342 }
343
Stephen Hemmingerddbe9a62009-01-09 13:01:40 +0000344 ax->dev->stats.rx_over_errors++;
Ralf Baechle815f62b2005-08-24 18:06:36 +0100345 set_bit(AXF_ERROR, &ax->flags);
346 }
347 spin_unlock_bh(&ax->buflock);
348}
349
350static int ax_set_mac_address(struct net_device *dev, void *addr)
351{
352 struct sockaddr_ax25 *sa = addr;
353
Herbert Xu932ff272006-06-09 12:20:56 -0700354 netif_tx_lock_bh(dev);
David S. Millere308a5d2008-07-15 00:13:44 -0700355 netif_addr_lock(dev);
Ralf Baechle815f62b2005-08-24 18:06:36 +0100356 memcpy(dev->dev_addr, &sa->sax25_call, AX25_ADDR_LEN);
David S. Millere308a5d2008-07-15 00:13:44 -0700357 netif_addr_unlock(dev);
Herbert Xu932ff272006-06-09 12:20:56 -0700358 netif_tx_unlock_bh(dev);
Ralf Baechle815f62b2005-08-24 18:06:36 +0100359
360 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700361}
362
363/*---------------------------------------------------------------------------*/
364
Ralf Baechle815f62b2005-08-24 18:06:36 +0100365static void ax_changedmtu(struct mkiss *ax)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700366{
367 struct net_device *dev = ax->dev;
368 unsigned char *xbuff, *rbuff, *oxbuff, *orbuff;
369 int len;
370
371 len = dev->mtu * 2;
372
373 /*
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
377 */
378 if (len < 576 * 2)
379 len = 576 * 2;
380
381 xbuff = kmalloc(len + 4, GFP_ATOMIC);
382 rbuff = kmalloc(len + 4, GFP_ATOMIC);
383
384 if (xbuff == NULL || rbuff == NULL) {
Ralf Baechle815f62b2005-08-24 18:06:36 +0100385 printk(KERN_ERR "mkiss: %s: unable to grow ax25 buffers, "
386 "MTU change cancelled.\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700387 ax->dev->name);
388 dev->mtu = ax->mtu;
Jesper Juhlb4558ea2005-10-28 16:53:13 -0400389 kfree(xbuff);
390 kfree(rbuff);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700391 return;
392 }
393
394 spin_lock_bh(&ax->buflock);
395
396 oxbuff = ax->xbuff;
397 ax->xbuff = xbuff;
398 orbuff = ax->rbuff;
399 ax->rbuff = rbuff;
400
401 if (ax->xleft) {
402 if (ax->xleft <= len) {
403 memcpy(ax->xbuff, ax->xhead, ax->xleft);
404 } else {
405 ax->xleft = 0;
Stephen Hemmingerddbe9a62009-01-09 13:01:40 +0000406 dev->stats.tx_dropped++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700407 }
408 }
409
410 ax->xhead = ax->xbuff;
411
412 if (ax->rcount) {
413 if (ax->rcount <= len) {
414 memcpy(ax->rbuff, orbuff, ax->rcount);
415 } else {
416 ax->rcount = 0;
Stephen Hemmingerddbe9a62009-01-09 13:01:40 +0000417 dev->stats.rx_over_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700418 set_bit(AXF_ERROR, &ax->flags);
419 }
420 }
421
422 ax->mtu = dev->mtu + 73;
423 ax->buffsize = len;
424
425 spin_unlock_bh(&ax->buflock);
426
Ralf Baechle815f62b2005-08-24 18:06:36 +0100427 kfree(oxbuff);
428 kfree(orbuff);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700429}
430
431/* Encapsulate one AX.25 packet and stuff into a TTY queue. */
Ralf Baechle815f62b2005-08-24 18:06:36 +0100432static void ax_encaps(struct net_device *dev, unsigned char *icp, int len)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700433{
Ralf Baechle815f62b2005-08-24 18:06:36 +0100434 struct mkiss *ax = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700435 unsigned char *p;
436 int actual, count;
437
438 if (ax->mtu != ax->dev->mtu + 73) /* Someone has been ifconfigging */
439 ax_changedmtu(ax);
440
441 if (len > ax->mtu) { /* Sigh, shouldn't occur BUT ... */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700442 printk(KERN_ERR "mkiss: %s: truncating oversized transmit packet!\n", ax->dev->name);
Stephen Hemmingerddbe9a62009-01-09 13:01:40 +0000443 dev->stats.tx_dropped++;
Ralf Baechle815f62b2005-08-24 18:06:36 +0100444 netif_start_queue(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700445 return;
446 }
447
448 p = icp;
449
450 spin_lock_bh(&ax->buflock);
Ralf Baechle5793f4b2005-10-14 14:28:09 +0100451 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;
476 }
477 ax->crcauto = (cmd ? 0 : 1);
Colin Ian King45c1fd62017-09-27 22:45:13 +0100478 printk(KERN_INFO "mkiss: %s: crc mode set to %d\n",
479 ax->dev->name, cmd);
Ralf Baechle5793f4b2005-10-14 14:28:09 +0100480 }
481 spin_unlock_bh(&ax->buflock);
482 netif_start_queue(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700483
Ralf Baechle5793f4b2005-10-14 14:28:09 +0100484 return;
485 default:
Joe Perchesc2fd03a2012-06-04 12:44:18 +0000486 count = kiss_esc(p, ax->xbuff, len);
Ralf Baechle5793f4b2005-10-14 14:28:09 +0100487 }
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));
Joe Perchesc2fd03a2012-06-04 12:44:18 +0000498 count = kiss_esc_crc(p, ax->xbuff, crc, len+2);
Ralf Baechle5793f4b2005-10-14 14:28:09 +0100499 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);
Joe Perchesc2fd03a2012-06-04 12:44:18 +0000507 count = kiss_esc_crc(p, ax->xbuff, crc, len+2);
Ralf Baechle5793f4b2005-10-14 14:28:09 +0100508 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700509
Ralf Baechle5793f4b2005-10-14 14:28:09 +0100510 default:
Joe Perchesc2fd03a2012-06-04 12:44:18 +0000511 count = kiss_esc(p, ax->xbuff, len);
Ralf Baechle5793f4b2005-10-14 14:28:09 +0100512 }
513 }
Ralf Baechlec1854eb2006-01-08 22:31:04 -0800514 spin_unlock_bh(&ax->buflock);
Ralf Baechle5793f4b2005-10-14 14:28:09 +0100515
Ralf Baechle815f62b2005-08-24 18:06:36 +0100516 set_bit(TTY_DO_WRITE_WAKEUP, &ax->tty->flags);
Alan Coxf34d7a52008-04-30 00:54:13 -0700517 actual = ax->tty->ops->write(ax->tty, ax->xbuff, count);
Stephen Hemmingerddbe9a62009-01-09 13:01:40 +0000518 dev->stats.tx_packets++;
519 dev->stats.tx_bytes += actual;
Ralf Baechle815f62b2005-08-24 18:06:36 +0100520
Florian Westphal860e9532016-05-03 16:33:13 +0200521 netif_trans_update(ax->dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700522 ax->xleft = count - actual;
523 ax->xhead = ax->xbuff + actual;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700524}
525
Linus Torvalds1da177e2005-04-16 15:20:36 -0700526/* Encapsulate an AX.25 packet and kick it into a TTY queue. */
Stephen Hemminger36e4d642009-08-31 19:50:43 +0000527static netdev_tx_t ax_xmit(struct sk_buff *skb, struct net_device *dev)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700528{
Ralf Baechle815f62b2005-08-24 18:06:36 +0100529 struct mkiss *ax = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700530
Eric W. Biederman1d5da752015-03-03 09:41:47 -0600531 if (skb->protocol == htons(ETH_P_IP))
532 return ax25_ip_xmit(skb);
533
Linus Torvalds1da177e2005-04-16 15:20:36 -0700534 if (!netif_running(dev)) {
535 printk(KERN_ERR "mkiss: %s: xmit call when iface is down\n", dev->name);
Patrick McHardy5b548142009-06-12 06:22:29 +0000536 return NETDEV_TX_BUSY;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700537 }
538
539 if (netif_queue_stopped(dev)) {
540 /*
541 * May be we must check transmitter timeout here ?
542 * 14 Oct 1994 Dmitry Gorodchanin.
543 */
Florian Westphal4d0e9652016-05-03 16:30:59 +0200544 if (time_before(jiffies, dev_trans_start(dev) + 20 * HZ)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700545 /* 20 sec timeout not reached */
Patrick McHardy5b548142009-06-12 06:22:29 +0000546 return NETDEV_TX_BUSY;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700547 }
548
549 printk(KERN_ERR "mkiss: %s: transmit timed out, %s?\n", dev->name,
Eugene Teo56087842008-07-30 12:38:59 -0700550 (tty_chars_in_buffer(ax->tty) || ax->xleft) ?
Linus Torvalds1da177e2005-04-16 15:20:36 -0700551 "bad line quality" : "driver error");
552
553 ax->xleft = 0;
Ralf Baechle815f62b2005-08-24 18:06:36 +0100554 clear_bit(TTY_DO_WRITE_WAKEUP, &ax->tty->flags);
555 netif_start_queue(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700556 }
557
558 /* We were not busy, so we are now... :-) */
Dan Carpenterfeb27d12015-03-05 20:48:46 +0300559 netif_stop_queue(dev);
560 ax_encaps(dev, skb->data, skb->len);
561 kfree_skb(skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700562
Patrick McHardy6ed10652009-06-23 06:03:08 +0000563 return NETDEV_TX_OK;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700564}
565
Ralf Baechle815f62b2005-08-24 18:06:36 +0100566static int ax_open_dev(struct net_device *dev)
567{
568 struct mkiss *ax = netdev_priv(dev);
569
570 if (ax->tty == NULL)
571 return -ENODEV;
572
573 return 0;
574}
575
Linus Torvalds1da177e2005-04-16 15:20:36 -0700576/* Open the low-level part of the AX25 channel. Easy! */
577static int ax_open(struct net_device *dev)
578{
Ralf Baechle815f62b2005-08-24 18:06:36 +0100579 struct mkiss *ax = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700580 unsigned long len;
581
582 if (ax->tty == NULL)
583 return -ENODEV;
584
585 /*
586 * Allocate the frame buffers:
587 *
588 * rbuff Receive buffer.
589 * xbuff Transmit buffer.
590 */
591 len = dev->mtu * 2;
592
593 /*
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
597 */
598 if (len < 576 * 2)
599 len = 576 * 2;
600
601 if ((ax->rbuff = kmalloc(len + 4, GFP_KERNEL)) == NULL)
602 goto norbuff;
603
604 if ((ax->xbuff = kmalloc(len + 4, GFP_KERNEL)) == NULL)
605 goto noxbuff;
606
607 ax->mtu = dev->mtu + 73;
608 ax->buffsize = len;
609 ax->rcount = 0;
610 ax->xleft = 0;
611
612 ax->flags &= (1 << AXF_INUSE); /* Clear ESCAPE & ERROR flags */
613
614 spin_lock_init(&ax->buflock);
615
Linus Torvalds1da177e2005-04-16 15:20:36 -0700616 return 0;
617
618noxbuff:
619 kfree(ax->rbuff);
620
621norbuff:
622 return -ENOMEM;
623}
624
625
626/* Close the low-level part of the AX25 channel. Easy! */
627static int ax_close(struct net_device *dev)
628{
Ralf Baechle815f62b2005-08-24 18:06:36 +0100629 struct mkiss *ax = netdev_priv(dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700630
Ralf Baechle815f62b2005-08-24 18:06:36 +0100631 if (ax->tty)
632 clear_bit(TTY_DO_WRITE_WAKEUP, &ax->tty->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700633
634 netif_stop_queue(dev);
635
636 return 0;
637}
638
Stephen Hemminger6095e082009-01-09 13:01:41 +0000639static 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,
644};
645
Ralf Baechle815f62b2005-08-24 18:06:36 +0100646static void ax_setup(struct net_device *dev)
647{
Ralf Baechle815f62b2005-08-24 18:06:36 +0100648 /* Finish setting up the DEVICE info. */
649 dev->mtu = AX_MTU;
Ralf Baechle7ba1b682017-02-09 14:12:11 +0100650 dev->hard_header_len = AX25_MAX_HEADER_LEN;
651 dev->addr_len = AX25_ADDR_LEN;
Ralf Baechle815f62b2005-08-24 18:06:36 +0100652 dev->type = ARPHRD_AX25;
653 dev->tx_queue_len = 10;
Eric W. Biederman56fc7e72015-03-02 00:03:02 -0600654 dev->header_ops = &ax25_header_ops;
Stephen Hemminger6095e082009-01-09 13:01:41 +0000655 dev->netdev_ops = &ax_netdev_ops;
Stephen Hemminger3b04ddd2007-10-09 01:40:57 -0700656
Ralf Baechle815f62b2005-08-24 18:06:36 +0100657
Ralf Baechle15b1c0e2006-12-07 15:47:08 -0800658 memcpy(dev->broadcast, &ax25_bcast, AX25_ADDR_LEN);
659 memcpy(dev->dev_addr, &ax25_defaddr, AX25_ADDR_LEN);
Ralf Baechle815f62b2005-08-24 18:06:36 +0100660
661 dev->flags = IFF_BROADCAST | IFF_MULTICAST;
662}
663
664/*
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.
671 */
Ralf Baechled5919582005-10-04 12:22:16 +0100672static DEFINE_RWLOCK(disc_data_lock);
Ralf Baechle815f62b2005-08-24 18:06:36 +0100673
674static struct mkiss *mkiss_get(struct tty_struct *tty)
675{
676 struct mkiss *ax;
677
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);
683
684 return ax;
685}
686
687static void mkiss_put(struct mkiss *ax)
688{
689 if (atomic_dec_and_test(&ax->refcnt))
690 up(&ax->dead_sem);
691}
692
Ralf Baechle5793f4b2005-10-14 14:28:09 +0100693static int crc_force = 0; /* Can be overridden with insmod */
694
Ralf Baechle815f62b2005-08-24 18:06:36 +0100695static int mkiss_open(struct tty_struct *tty)
696{
697 struct net_device *dev;
698 struct mkiss *ax;
699 int err;
700
701 if (!capable(CAP_NET_ADMIN))
702 return -EPERM;
Alan Coxf34d7a52008-04-30 00:54:13 -0700703 if (tty->ops->write == NULL)
704 return -EOPNOTSUPP;
Ralf Baechle815f62b2005-08-24 18:06:36 +0100705
Tom Gundersenc835a672014-07-14 16:37:24 +0200706 dev = alloc_netdev(sizeof(struct mkiss), "ax%d", NET_NAME_UNKNOWN,
707 ax_setup);
Ralf Baechle815f62b2005-08-24 18:06:36 +0100708 if (!dev) {
709 err = -ENOMEM;
710 goto out;
711 }
712
713 ax = netdev_priv(dev);
714 ax->dev = dev;
715
716 spin_lock_init(&ax->buflock);
717 atomic_set(&ax->refcnt, 1);
Thomas Gleixner495e64b2010-09-07 14:32:18 +0000718 sema_init(&ax->dead_sem, 0);
Ralf Baechle815f62b2005-08-24 18:06:36 +0100719
720 ax->tty = tty;
721 tty->disc_data = ax;
Alan Cox33f0f882006-01-09 20:54:13 -0800722 tty->receive_room = 65535;
Ralf Baechle815f62b2005-08-24 18:06:36 +0100723
Alan Coxf34d7a52008-04-30 00:54:13 -0700724 tty_driver_flush_buffer(tty);
Ralf Baechle815f62b2005-08-24 18:06:36 +0100725
726 /* Restore default settings */
727 dev->type = ARPHRD_AX25;
728
729 /* Perform the low-level AX25 initialization. */
Fabio Estevam9d332d92015-08-10 14:22:43 -0300730 err = ax_open(ax->dev);
731 if (err)
Ralf Baechle815f62b2005-08-24 18:06:36 +0100732 goto out_free_netdev;
Ralf Baechle815f62b2005-08-24 18:06:36 +0100733
Fabio Estevam9d332d92015-08-10 14:22:43 -0300734 err = register_netdev(dev);
735 if (err)
Ralf Baechle815f62b2005-08-24 18:06:36 +0100736 goto out_free_buffers;
737
Ralf Baechle5793f4b2005-10-14 14:28:09 +0100738 /* 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;
762 }
763 ax->crcauto = (crc_force ? 0 : 1);
764
Ralf Baechle815f62b2005-08-24 18:06:36 +0100765 netif_start_queue(dev);
766
767 /* Done. We have linked the TTY line to a channel. */
768 return 0;
769
770out_free_buffers:
771 kfree(ax->rbuff);
772 kfree(ax->xbuff);
773
774out_free_netdev:
775 free_netdev(dev);
776
777out:
778 return err;
779}
780
781static void mkiss_close(struct tty_struct *tty)
782{
783 struct mkiss *ax;
784
Arnd Bergmann6e4e2f82011-07-01 17:30:00 -0700785 write_lock_bh(&disc_data_lock);
Ralf Baechle815f62b2005-08-24 18:06:36 +0100786 ax = tty->disc_data;
787 tty->disc_data = NULL;
Arnd Bergmann6e4e2f82011-07-01 17:30:00 -0700788 write_unlock_bh(&disc_data_lock);
Ralf Baechle815f62b2005-08-24 18:06:36 +0100789
Al Viro79ea13c2008-01-24 02:06:46 -0800790 if (!ax)
Ralf Baechle815f62b2005-08-24 18:06:36 +0100791 return;
792
793 /*
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.
796 */
797 if (!atomic_dec_and_test(&ax->refcnt))
798 down(&ax->dead_sem);
Alanfde55c42016-01-06 14:55:02 +0000799 /*
800 * Halt the transmit queue so that a new transmit cannot scribble
801 * on our buffers
802 */
803 netif_stop_queue(ax->dev);
Ralf Baechle815f62b2005-08-24 18:06:36 +0100804
Ralf Baechle815f62b2005-08-24 18:06:36 +0100805 /* Free all AX25 frame buffers. */
806 kfree(ax->rbuff);
807 kfree(ax->xbuff);
808
809 ax->tty = NULL;
David Millerd79f16c2015-12-17 16:05:49 -0500810
811 unregister_netdev(ax->dev);
Ralf Baechle815f62b2005-08-24 18:06:36 +0100812}
813
814/* Perform I/O control on an active ax25 channel. */
815static int mkiss_ioctl(struct tty_struct *tty, struct file *file,
816 unsigned int cmd, unsigned long arg)
817{
818 struct mkiss *ax = mkiss_get(tty);
Julia Lawallf40e0632008-12-16 15:43:29 -0800819 struct net_device *dev;
Ralf Baechle815f62b2005-08-24 18:06:36 +0100820 unsigned int tmp, err;
821
822 /* First make sure we're connected. */
823 if (ax == NULL)
824 return -ENXIO;
Julia Lawallf40e0632008-12-16 15:43:29 -0800825 dev = ax->dev;
Ralf Baechle815f62b2005-08-24 18:06:36 +0100826
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;
832
833 case SIOCGIFENCAP:
834 err = put_user(4, (int __user *) arg);
835 break;
836
837 case SIOCSIFENCAP:
838 if (get_user(tmp, (int __user *) arg)) {
839 err = -EFAULT;
840 break;
841 }
842
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;
848
849 err = 0;
850 break;
851
852 case SIOCSIFHWADDR: {
853 char addr[AX25_ADDR_LEN];
Ralf Baechle815f62b2005-08-24 18:06:36 +0100854
855 if (copy_from_user(&addr,
856 (void __user *) arg, AX25_ADDR_LEN)) {
857 err = -EFAULT;
858 break;
859 }
860
Herbert Xu932ff272006-06-09 12:20:56 -0700861 netif_tx_lock_bh(dev);
Ralf Baechle815f62b2005-08-24 18:06:36 +0100862 memcpy(dev->dev_addr, addr, AX25_ADDR_LEN);
Herbert Xu932ff272006-06-09 12:20:56 -0700863 netif_tx_unlock_bh(dev);
Ralf Baechle815f62b2005-08-24 18:06:36 +0100864
865 err = 0;
866 break;
867 }
868 default:
869 err = -ENOIOCTLCMD;
870 }
871
872 mkiss_put(ax);
873
874 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700875}
876
877/*
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.
882 */
Linus Torvalds55db4c62011-06-04 06:33:24 +0900883static void mkiss_receive_buf(struct tty_struct *tty, const unsigned char *cp,
884 char *fp, int count)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700885{
Ralf Baechle815f62b2005-08-24 18:06:36 +0100886 struct mkiss *ax = mkiss_get(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700887
Ralf Baechle815f62b2005-08-24 18:06:36 +0100888 if (!ax)
Linus Torvalds55db4c62011-06-04 06:33:24 +0900889 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700890
891 /*
892 * Argh! mtu change time! - costs us the packet part received
893 * at the change
894 */
895 if (ax->mtu != ax->dev->mtu + 73)
896 ax_changedmtu(ax);
897
898 /* Read the characters out of the buffer */
Linus Torvalds55db4c62011-06-04 06:33:24 +0900899 while (count--) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700900 if (fp != NULL && *fp++) {
901 if (!test_and_set_bit(AXF_ERROR, &ax->flags))
Stephen Hemmingerddbe9a62009-01-09 13:01:40 +0000902 ax->dev->stats.rx_errors++;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700903 cp++;
904 continue;
905 }
906
907 kiss_unesc(ax, *cp++);
908 }
Ralf Baechle815f62b2005-08-24 18:06:36 +0100909
910 mkiss_put(ax);
Alan Cox39c2e602008-04-30 00:54:18 -0700911 tty_unthrottle(tty);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700912}
913
Linus Torvalds1da177e2005-04-16 15:20:36 -0700914/*
Ralf Baechle815f62b2005-08-24 18:06:36 +0100915 * Called by the driver when there's room for more data. If we have
916 * more packets to send, we send them here.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700917 */
Ralf Baechle815f62b2005-08-24 18:06:36 +0100918static void mkiss_write_wakeup(struct tty_struct *tty)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700919{
Ralf Baechle815f62b2005-08-24 18:06:36 +0100920 struct mkiss *ax = mkiss_get(tty);
921 int actual;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700922
Ralf Baechle815f62b2005-08-24 18:06:36 +0100923 if (!ax)
924 return;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700925
Ralf Baechle815f62b2005-08-24 18:06:36 +0100926 if (ax->xleft <= 0) {
927 /* Now serial buffer is almost free & we can start
928 * transmission of another packet
929 */
930 clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700931
Ralf Baechle815f62b2005-08-24 18:06:36 +0100932 netif_wake_queue(ax->dev);
933 goto out;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700934 }
935
Alan Coxf34d7a52008-04-30 00:54:13 -0700936 actual = tty->ops->write(tty, ax->xhead, ax->xleft);
Ralf Baechle815f62b2005-08-24 18:06:36 +0100937 ax->xleft -= actual;
938 ax->xhead += actual;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700939
Ralf Baechle815f62b2005-08-24 18:06:36 +0100940out:
941 mkiss_put(ax);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700942}
943
Alan Coxa352def2008-07-16 21:53:12 +0100944static struct tty_ldisc_ops ax_ldisc = {
Ralf Baechle74cfe032005-10-12 23:11:01 +0100945 .owner = THIS_MODULE,
Ralf Baechle815f62b2005-08-24 18:06:36 +0100946 .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,
Ralf Baechle815f62b2005-08-24 18:06:36 +0100952 .write_wakeup = mkiss_write_wakeup
953};
Linus Torvalds1da177e2005-04-16 15:20:36 -0700954
Andi Kleenafa8c782012-10-04 17:11:58 -0700955static const char banner[] __initconst = KERN_INFO \
Ralf Baechle815f62b2005-08-24 18:06:36 +0100956 "mkiss: AX.25 Multikiss, Hans Albas PE1AYX\n";
Andi Kleenafa8c782012-10-04 17:11:58 -0700957static const char msg_regfail[] __initconst = KERN_ERR \
Ralf Baechle815f62b2005-08-24 18:06:36 +0100958 "mkiss: can't register line discipline (err = %d)\n";
Linus Torvalds1da177e2005-04-16 15:20:36 -0700959
960static int __init mkiss_init_driver(void)
961{
962 int status;
963
964 printk(banner);
965
Hannes Edereb33ae22009-02-14 11:33:21 +0000966 status = tty_register_ldisc(N_AX25, &ax_ldisc);
967 if (status != 0)
968 printk(msg_regfail, status);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700969
Linus Torvalds1da177e2005-04-16 15:20:36 -0700970 return status;
971}
972
Andi Kleenafa8c782012-10-04 17:11:58 -0700973static const char msg_unregfail[] = KERN_ERR \
Ralf Baechle815f62b2005-08-24 18:06:36 +0100974 "mkiss: can't unregister line discipline (err = %d)\n";
975
Linus Torvalds1da177e2005-04-16 15:20:36 -0700976static void __exit mkiss_exit_driver(void)
977{
Ralf Baechle815f62b2005-08-24 18:06:36 +0100978 int ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700979
Ralf Baechle815f62b2005-08-24 18:06:36 +0100980 if ((ret = tty_unregister_ldisc(N_AX25)))
981 printk(msg_unregfail, ret);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700982}
983
Ralf Baechle815f62b2005-08-24 18:06:36 +0100984MODULE_AUTHOR("Ralf Baechle DL5RB <ralf@linux-mips.org>");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700985MODULE_DESCRIPTION("KISS driver for AX.25 over TTYs");
Rusty Russell8d3b33f2006-03-25 03:07:05 -0800986module_param(crc_force, int, 0);
Ralf Baechle5793f4b2005-10-14 14:28:09 +0100987MODULE_PARM_DESC(crc_force, "crc [0 = auto | 1 = none | 2 = flexnet | 3 = smack]");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700988MODULE_LICENSE("GPL");
989MODULE_ALIAS_LDISC(N_AX25);
Ralf Baechle815f62b2005-08-24 18:06:36 +0100990
Linus Torvalds1da177e2005-04-16 15:20:36 -0700991module_init(mkiss_init_driver);
992module_exit(mkiss_exit_driver);