Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

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