xref: /linux/drivers/net/hamradio/yam.c (revision b6ebbac51bedf9e98e837688bc838f400196da5e)
1 /*****************************************************************************/
2 
3 /*
4  *    yam.c  -- YAM radio modem driver.
5  *
6  *      Copyright (C) 1998 Frederic Rible F1OAT (frible@teaser.fr)
7  *      Adapted from baycom.c driver written by Thomas Sailer (sailer@ife.ee.ethz.ch)
8  *
9  *      This program is free software; you can redistribute it and/or modify
10  *      it under the terms of the GNU General Public License as published by
11  *      the Free Software Foundation; either version 2 of the License, or
12  *      (at your option) any later version.
13  *
14  *      This program is distributed in the hope that it will be useful,
15  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
16  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  *      GNU General Public License for more details.
18  *
19  *      You should have received a copy of the GNU General Public License
20  *      along with this program; if not, write to the Free Software
21  *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22  *
23  *  Please note that the GPL allows you to use the driver, NOT the radio.
24  *  In order to use the radio, you need a license from the communications
25  *  authority of your country.
26  *
27  *
28  *  History:
29  *   0.0 F1OAT 06.06.98  Begin of work with baycom.c source code V 0.3
30  *   0.1 F1OAT 07.06.98  Add timer polling routine for channel arbitration
31  *   0.2 F6FBB 08.06.98  Added delay after FPGA programming
32  *   0.3 F6FBB 29.07.98  Delayed PTT implementation for dupmode=2
33  *   0.4 F6FBB 30.07.98  Added TxTail, Slottime and Persistence
34  *   0.5 F6FBB 01.08.98  Shared IRQs, /proc/net and network statistics
35  *   0.6 F6FBB 25.08.98  Added 1200Bds format
36  *   0.7 F6FBB 12.09.98  Added to the kernel configuration
37  *   0.8 F6FBB 14.10.98  Fixed slottime/persistence timing bug
38  *       OK1ZIA 2.09.01  Fixed "kfree_skb on hard IRQ"
39  *                       using dev_kfree_skb_any(). (important in 2.4 kernel)
40  *
41  */
42 
43 /*****************************************************************************/
44 
45 #include <linux/module.h>
46 #include <linux/types.h>
47 #include <linux/net.h>
48 #include <linux/in.h>
49 #include <linux/if.h>
50 #include <linux/slab.h>
51 #include <linux/errno.h>
52 #include <linux/bitops.h>
53 #include <linux/random.h>
54 #include <asm/io.h>
55 #include <linux/interrupt.h>
56 #include <linux/ioport.h>
57 #include <linux/firmware.h>
58 #include <linux/platform_device.h>
59 
60 #include <linux/netdevice.h>
61 #include <linux/if_arp.h>
62 #include <linux/etherdevice.h>
63 #include <linux/skbuff.h>
64 #include <net/ax25.h>
65 
66 #include <linux/kernel.h>
67 #include <linux/proc_fs.h>
68 #include <linux/seq_file.h>
69 #include <net/net_namespace.h>
70 
71 #include <asm/uaccess.h>
72 #include <linux/init.h>
73 
74 #include <linux/yam.h>
75 
76 /* --------------------------------------------------------------------- */
77 
78 static const char yam_drvname[] = "yam";
79 static const char yam_drvinfo[] __initconst = KERN_INFO \
80 	"YAM driver version 0.8 by F1OAT/F6FBB\n";
81 
82 /* --------------------------------------------------------------------- */
83 
84 #define FIRMWARE_9600	"yam/9600.bin"
85 #define FIRMWARE_1200	"yam/1200.bin"
86 
87 #define YAM_9600	1
88 #define YAM_1200	2
89 
90 #define NR_PORTS	4
91 #define YAM_MAGIC	0xF10A7654
92 
93 /* Transmitter states */
94 
95 #define TX_OFF		0
96 #define TX_HEAD		1
97 #define TX_DATA		2
98 #define TX_CRC1		3
99 #define TX_CRC2		4
100 #define TX_TAIL		5
101 
102 #define YAM_MAX_FRAME	1024
103 
104 #define DEFAULT_BITRATE	9600			/* bps */
105 #define DEFAULT_HOLDD	10			/* sec */
106 #define DEFAULT_TXD	300			/* ms */
107 #define DEFAULT_TXTAIL	10			/* ms */
108 #define DEFAULT_SLOT	100			/* ms */
109 #define DEFAULT_PERS	64			/* 0->255 */
110 
111 struct yam_port {
112 	int magic;
113 	int bitrate;
114 	int baudrate;
115 	int iobase;
116 	int irq;
117 	int dupmode;
118 
119 	struct net_device *dev;
120 
121 	int nb_rxint;
122 	int nb_mdint;
123 
124 	/* Parameters section */
125 
126 	int txd;				/* tx delay */
127 	int holdd;				/* duplex ptt delay */
128 	int txtail;				/* txtail delay */
129 	int slot;				/* slottime */
130 	int pers;				/* persistence */
131 
132 	/* Tx section */
133 
134 	int tx_state;
135 	int tx_count;
136 	int slotcnt;
137 	unsigned char tx_buf[YAM_MAX_FRAME];
138 	int tx_len;
139 	int tx_crcl, tx_crch;
140 	struct sk_buff_head send_queue;		/* Packets awaiting transmission */
141 
142 	/* Rx section */
143 
144 	int dcd;
145 	unsigned char rx_buf[YAM_MAX_FRAME];
146 	int rx_len;
147 	int rx_crcl, rx_crch;
148 };
149 
150 struct yam_mcs {
151 	unsigned char bits[YAM_FPGA_SIZE];
152 	int bitrate;
153 	struct yam_mcs *next;
154 };
155 
156 static struct net_device *yam_devs[NR_PORTS];
157 
158 static struct yam_mcs *yam_data;
159 
160 static DEFINE_TIMER(yam_timer, NULL, 0, 0);
161 
162 /* --------------------------------------------------------------------- */
163 
164 #define RBR(iobase)	(iobase+0)
165 #define THR(iobase)	(iobase+0)
166 #define IER(iobase)	(iobase+1)
167 #define IIR(iobase)	(iobase+2)
168 #define FCR(iobase)	(iobase+2)
169 #define LCR(iobase)	(iobase+3)
170 #define MCR(iobase)	(iobase+4)
171 #define LSR(iobase)	(iobase+5)
172 #define MSR(iobase)	(iobase+6)
173 #define SCR(iobase)	(iobase+7)
174 #define DLL(iobase)	(iobase+0)
175 #define DLM(iobase)	(iobase+1)
176 
177 #define YAM_EXTENT	8
178 
179 /* Interrupt Identification Register Bit Masks */
180 #define IIR_NOPEND	1
181 #define IIR_MSR		0
182 #define IIR_TX		2
183 #define IIR_RX		4
184 #define IIR_LSR		6
185 #define IIR_TIMEOUT	12			/* Fifo mode only */
186 
187 #define IIR_MASK	0x0F
188 
189 /* Interrupt Enable Register Bit Masks */
190 #define IER_RX		1			/* enable rx interrupt */
191 #define IER_TX		2			/* enable tx interrupt */
192 #define IER_LSR		4			/* enable line status interrupts */
193 #define IER_MSR		8			/* enable modem status interrupts */
194 
195 /* Modem Control Register Bit Masks */
196 #define MCR_DTR		0x01			/* DTR output */
197 #define MCR_RTS		0x02			/* RTS output */
198 #define MCR_OUT1	0x04			/* OUT1 output (not accessible in RS232) */
199 #define MCR_OUT2	0x08			/* Master Interrupt enable (must be set on PCs) */
200 #define MCR_LOOP	0x10			/* Loopback enable */
201 
202 /* Modem Status Register Bit Masks */
203 #define MSR_DCTS	0x01			/* Delta CTS input */
204 #define MSR_DDSR	0x02			/* Delta DSR */
205 #define MSR_DRIN	0x04			/* Delta RI */
206 #define MSR_DDCD	0x08			/* Delta DCD */
207 #define MSR_CTS		0x10			/* CTS input */
208 #define MSR_DSR		0x20			/* DSR input */
209 #define MSR_RING	0x40			/* RI  input */
210 #define MSR_DCD		0x80			/* DCD input */
211 
212 /* line status register bit mask */
213 #define LSR_RXC		0x01
214 #define LSR_OE		0x02
215 #define LSR_PE		0x04
216 #define LSR_FE		0x08
217 #define LSR_BREAK	0x10
218 #define LSR_THRE	0x20
219 #define LSR_TSRE	0x40
220 
221 /* Line Control Register Bit Masks */
222 #define LCR_DLAB	0x80
223 #define LCR_BREAK	0x40
224 #define LCR_PZERO	0x28
225 #define LCR_PEVEN	0x18
226 #define LCR_PODD	0x08
227 #define LCR_STOP1	0x00
228 #define LCR_STOP2	0x04
229 #define LCR_BIT5	0x00
230 #define LCR_BIT6	0x02
231 #define LCR_BIT7	0x01
232 #define LCR_BIT8	0x03
233 
234 /* YAM Modem <-> UART Port mapping */
235 
236 #define TX_RDY		MSR_DCTS		/* transmitter ready to send */
237 #define RX_DCD		MSR_DCD			/* carrier detect */
238 #define RX_FLAG		MSR_RING		/* hdlc flag received */
239 #define FPGA_DONE	MSR_DSR			/* FPGA is configured */
240 #define PTT_ON		(MCR_RTS|MCR_OUT2)	/* activate PTT */
241 #define PTT_OFF		(MCR_DTR|MCR_OUT2)	/* release PTT */
242 
243 #define ENABLE_RXINT	IER_RX			/* enable uart rx interrupt during rx */
244 #define ENABLE_TXINT	IER_MSR			/* enable uart ms interrupt during tx */
245 #define ENABLE_RTXINT	(IER_RX|IER_MSR)	/* full duplex operations */
246 
247 
248 /*************************************************************************
249 * CRC Tables
250 ************************************************************************/
251 
252 static const unsigned char chktabl[256] =
253 {0x00, 0x89, 0x12, 0x9b, 0x24, 0xad, 0x36, 0xbf, 0x48, 0xc1, 0x5a, 0xd3, 0x6c, 0xe5, 0x7e,
254  0xf7, 0x81, 0x08, 0x93, 0x1a, 0xa5, 0x2c, 0xb7, 0x3e, 0xc9, 0x40, 0xdb, 0x52, 0xed, 0x64,
255  0xff, 0x76, 0x02, 0x8b, 0x10, 0x99, 0x26, 0xaf, 0x34, 0xbd, 0x4a, 0xc3, 0x58, 0xd1, 0x6e,
256  0xe7, 0x7c, 0xf5, 0x83, 0x0a, 0x91, 0x18, 0xa7, 0x2e, 0xb5, 0x3c, 0xcb, 0x42, 0xd9, 0x50,
257  0xef, 0x66, 0xfd, 0x74, 0x04, 0x8d, 0x16, 0x9f, 0x20, 0xa9, 0x32, 0xbb, 0x4c, 0xc5, 0x5e,
258  0xd7, 0x68, 0xe1, 0x7a, 0xf3, 0x85, 0x0c, 0x97, 0x1e, 0xa1, 0x28, 0xb3, 0x3a, 0xcd, 0x44,
259  0xdf, 0x56, 0xe9, 0x60, 0xfb, 0x72, 0x06, 0x8f, 0x14, 0x9d, 0x22, 0xab, 0x30, 0xb9, 0x4e,
260  0xc7, 0x5c, 0xd5, 0x6a, 0xe3, 0x78, 0xf1, 0x87, 0x0e, 0x95, 0x1c, 0xa3, 0x2a, 0xb1, 0x38,
261  0xcf, 0x46, 0xdd, 0x54, 0xeb, 0x62, 0xf9, 0x70, 0x08, 0x81, 0x1a, 0x93, 0x2c, 0xa5, 0x3e,
262  0xb7, 0x40, 0xc9, 0x52, 0xdb, 0x64, 0xed, 0x76, 0xff, 0x89, 0x00, 0x9b, 0x12, 0xad, 0x24,
263  0xbf, 0x36, 0xc1, 0x48, 0xd3, 0x5a, 0xe5, 0x6c, 0xf7, 0x7e, 0x0a, 0x83, 0x18, 0x91, 0x2e,
264  0xa7, 0x3c, 0xb5, 0x42, 0xcb, 0x50, 0xd9, 0x66, 0xef, 0x74, 0xfd, 0x8b, 0x02, 0x99, 0x10,
265  0xaf, 0x26, 0xbd, 0x34, 0xc3, 0x4a, 0xd1, 0x58, 0xe7, 0x6e, 0xf5, 0x7c, 0x0c, 0x85, 0x1e,
266  0x97, 0x28, 0xa1, 0x3a, 0xb3, 0x44, 0xcd, 0x56, 0xdf, 0x60, 0xe9, 0x72, 0xfb, 0x8d, 0x04,
267  0x9f, 0x16, 0xa9, 0x20, 0xbb, 0x32, 0xc5, 0x4c, 0xd7, 0x5e, 0xe1, 0x68, 0xf3, 0x7a, 0x0e,
268  0x87, 0x1c, 0x95, 0x2a, 0xa3, 0x38, 0xb1, 0x46, 0xcf, 0x54, 0xdd, 0x62, 0xeb, 0x70, 0xf9,
269  0x8f, 0x06, 0x9d, 0x14, 0xab, 0x22, 0xb9, 0x30, 0xc7, 0x4e, 0xd5, 0x5c, 0xe3, 0x6a, 0xf1,
270  0x78};
271 static const unsigned char chktabh[256] =
272 {0x00, 0x11, 0x23, 0x32, 0x46, 0x57, 0x65, 0x74, 0x8c, 0x9d, 0xaf, 0xbe, 0xca, 0xdb, 0xe9,
273  0xf8, 0x10, 0x01, 0x33, 0x22, 0x56, 0x47, 0x75, 0x64, 0x9c, 0x8d, 0xbf, 0xae, 0xda, 0xcb,
274  0xf9, 0xe8, 0x21, 0x30, 0x02, 0x13, 0x67, 0x76, 0x44, 0x55, 0xad, 0xbc, 0x8e, 0x9f, 0xeb,
275  0xfa, 0xc8, 0xd9, 0x31, 0x20, 0x12, 0x03, 0x77, 0x66, 0x54, 0x45, 0xbd, 0xac, 0x9e, 0x8f,
276  0xfb, 0xea, 0xd8, 0xc9, 0x42, 0x53, 0x61, 0x70, 0x04, 0x15, 0x27, 0x36, 0xce, 0xdf, 0xed,
277  0xfc, 0x88, 0x99, 0xab, 0xba, 0x52, 0x43, 0x71, 0x60, 0x14, 0x05, 0x37, 0x26, 0xde, 0xcf,
278  0xfd, 0xec, 0x98, 0x89, 0xbb, 0xaa, 0x63, 0x72, 0x40, 0x51, 0x25, 0x34, 0x06, 0x17, 0xef,
279  0xfe, 0xcc, 0xdd, 0xa9, 0xb8, 0x8a, 0x9b, 0x73, 0x62, 0x50, 0x41, 0x35, 0x24, 0x16, 0x07,
280  0xff, 0xee, 0xdc, 0xcd, 0xb9, 0xa8, 0x9a, 0x8b, 0x84, 0x95, 0xa7, 0xb6, 0xc2, 0xd3, 0xe1,
281  0xf0, 0x08, 0x19, 0x2b, 0x3a, 0x4e, 0x5f, 0x6d, 0x7c, 0x94, 0x85, 0xb7, 0xa6, 0xd2, 0xc3,
282  0xf1, 0xe0, 0x18, 0x09, 0x3b, 0x2a, 0x5e, 0x4f, 0x7d, 0x6c, 0xa5, 0xb4, 0x86, 0x97, 0xe3,
283  0xf2, 0xc0, 0xd1, 0x29, 0x38, 0x0a, 0x1b, 0x6f, 0x7e, 0x4c, 0x5d, 0xb5, 0xa4, 0x96, 0x87,
284  0xf3, 0xe2, 0xd0, 0xc1, 0x39, 0x28, 0x1a, 0x0b, 0x7f, 0x6e, 0x5c, 0x4d, 0xc6, 0xd7, 0xe5,
285  0xf4, 0x80, 0x91, 0xa3, 0xb2, 0x4a, 0x5b, 0x69, 0x78, 0x0c, 0x1d, 0x2f, 0x3e, 0xd6, 0xc7,
286  0xf5, 0xe4, 0x90, 0x81, 0xb3, 0xa2, 0x5a, 0x4b, 0x79, 0x68, 0x1c, 0x0d, 0x3f, 0x2e, 0xe7,
287  0xf6, 0xc4, 0xd5, 0xa1, 0xb0, 0x82, 0x93, 0x6b, 0x7a, 0x48, 0x59, 0x2d, 0x3c, 0x0e, 0x1f,
288  0xf7, 0xe6, 0xd4, 0xc5, 0xb1, 0xa0, 0x92, 0x83, 0x7b, 0x6a, 0x58, 0x49, 0x3d, 0x2c, 0x1e,
289  0x0f};
290 
291 /*************************************************************************
292 * FPGA functions
293 ************************************************************************/
294 
295 static void delay(int ms)
296 {
297 	unsigned long timeout = jiffies + ((ms * HZ) / 1000);
298 	while (time_before(jiffies, timeout))
299 		cpu_relax();
300 }
301 
302 /*
303  * reset FPGA
304  */
305 
306 static void fpga_reset(int iobase)
307 {
308 	outb(0, IER(iobase));
309 	outb(LCR_DLAB | LCR_BIT5, LCR(iobase));
310 	outb(1, DLL(iobase));
311 	outb(0, DLM(iobase));
312 
313 	outb(LCR_BIT5, LCR(iobase));
314 	inb(LSR(iobase));
315 	inb(MSR(iobase));
316 	/* turn off FPGA supply voltage */
317 	outb(MCR_OUT1 | MCR_OUT2, MCR(iobase));
318 	delay(100);
319 	/* turn on FPGA supply voltage again */
320 	outb(MCR_DTR | MCR_RTS | MCR_OUT1 | MCR_OUT2, MCR(iobase));
321 	delay(100);
322 }
323 
324 /*
325  * send one byte to FPGA
326  */
327 
328 static int fpga_write(int iobase, unsigned char wrd)
329 {
330 	unsigned char bit;
331 	int k;
332 	unsigned long timeout = jiffies + HZ / 10;
333 
334 	for (k = 0; k < 8; k++) {
335 		bit = (wrd & 0x80) ? (MCR_RTS | MCR_DTR) : MCR_DTR;
336 		outb(bit | MCR_OUT1 | MCR_OUT2, MCR(iobase));
337 		wrd <<= 1;
338 		outb(0xfc, THR(iobase));
339 		while ((inb(LSR(iobase)) & LSR_TSRE) == 0)
340 			if (time_after(jiffies, timeout))
341 				return -1;
342 	}
343 
344 	return 0;
345 }
346 
347 /*
348  * predef should be 0 for loading user defined mcs
349  * predef should be YAM_1200 for loading predef 1200 mcs
350  * predef should be YAM_9600 for loading predef 9600 mcs
351  */
352 static unsigned char *add_mcs(unsigned char *bits, int bitrate,
353 			      unsigned int predef)
354 {
355 	const char *fw_name[2] = {FIRMWARE_9600, FIRMWARE_1200};
356 	const struct firmware *fw;
357 	struct platform_device *pdev;
358 	struct yam_mcs *p;
359 	int err;
360 
361 	switch (predef) {
362 	case 0:
363 		fw = NULL;
364 		break;
365 	case YAM_1200:
366 	case YAM_9600:
367 		predef--;
368 		pdev = platform_device_register_simple("yam", 0, NULL, 0);
369 		if (IS_ERR(pdev)) {
370 			printk(KERN_ERR "yam: Failed to register firmware\n");
371 			return NULL;
372 		}
373 		err = request_firmware(&fw, fw_name[predef], &pdev->dev);
374 		platform_device_unregister(pdev);
375 		if (err) {
376 			printk(KERN_ERR "Failed to load firmware \"%s\"\n",
377 			       fw_name[predef]);
378 			return NULL;
379 		}
380 		if (fw->size != YAM_FPGA_SIZE) {
381 			printk(KERN_ERR "Bogus length %zu in firmware \"%s\"\n",
382 			       fw->size, fw_name[predef]);
383 			release_firmware(fw);
384 			return NULL;
385 		}
386 		bits = (unsigned char *)fw->data;
387 		break;
388 	default:
389 		printk(KERN_ERR "yam: Invalid predef number %u\n", predef);
390 		return NULL;
391 	}
392 
393 	/* If it already exists, replace the bit data */
394 	p = yam_data;
395 	while (p) {
396 		if (p->bitrate == bitrate) {
397 			memcpy(p->bits, bits, YAM_FPGA_SIZE);
398 			goto out;
399 		}
400 		p = p->next;
401 	}
402 
403 	/* Allocate a new mcs */
404 	if ((p = kmalloc(sizeof(struct yam_mcs), GFP_KERNEL)) == NULL) {
405 		release_firmware(fw);
406 		return NULL;
407 	}
408 	memcpy(p->bits, bits, YAM_FPGA_SIZE);
409 	p->bitrate = bitrate;
410 	p->next = yam_data;
411 	yam_data = p;
412  out:
413 	release_firmware(fw);
414 	return p->bits;
415 }
416 
417 static unsigned char *get_mcs(int bitrate)
418 {
419 	struct yam_mcs *p;
420 
421 	p = yam_data;
422 	while (p) {
423 		if (p->bitrate == bitrate)
424 			return p->bits;
425 		p = p->next;
426 	}
427 
428 	/* Load predefined mcs data */
429 	switch (bitrate) {
430 	case 1200:
431 		/* setting predef as YAM_1200 for loading predef 1200 mcs */
432 		return add_mcs(NULL, bitrate, YAM_1200);
433 	default:
434 		/* setting predef as YAM_9600 for loading predef 9600 mcs */
435 		return add_mcs(NULL, bitrate, YAM_9600);
436 	}
437 }
438 
439 /*
440  * download bitstream to FPGA
441  * data is contained in bits[] array in yam1200.h resp. yam9600.h
442  */
443 
444 static int fpga_download(int iobase, int bitrate)
445 {
446 	int i, rc;
447 	unsigned char *pbits;
448 
449 	pbits = get_mcs(bitrate);
450 	if (pbits == NULL)
451 		return -1;
452 
453 	fpga_reset(iobase);
454 	for (i = 0; i < YAM_FPGA_SIZE; i++) {
455 		if (fpga_write(iobase, pbits[i])) {
456 			printk(KERN_ERR "yam: error in write cycle\n");
457 			return -1;			/* write... */
458 		}
459 	}
460 
461 	fpga_write(iobase, 0xFF);
462 	rc = inb(MSR(iobase));		/* check DONE signal */
463 
464 	/* Needed for some hardwares */
465 	delay(50);
466 
467 	return (rc & MSR_DSR) ? 0 : -1;
468 }
469 
470 
471 /************************************************************************
472 * Serial port init
473 ************************************************************************/
474 
475 static void yam_set_uart(struct net_device *dev)
476 {
477 	struct yam_port *yp = netdev_priv(dev);
478 	int divisor = 115200 / yp->baudrate;
479 
480 	outb(0, IER(dev->base_addr));
481 	outb(LCR_DLAB | LCR_BIT8, LCR(dev->base_addr));
482 	outb(divisor, DLL(dev->base_addr));
483 	outb(0, DLM(dev->base_addr));
484 	outb(LCR_BIT8, LCR(dev->base_addr));
485 	outb(PTT_OFF, MCR(dev->base_addr));
486 	outb(0x00, FCR(dev->base_addr));
487 
488 	/* Flush pending irq */
489 
490 	inb(RBR(dev->base_addr));
491 	inb(MSR(dev->base_addr));
492 
493 	/* Enable rx irq */
494 
495 	outb(ENABLE_RTXINT, IER(dev->base_addr));
496 }
497 
498 
499 /* --------------------------------------------------------------------- */
500 
501 enum uart {
502 	c_uart_unknown, c_uart_8250,
503 	c_uart_16450, c_uart_16550, c_uart_16550A
504 };
505 
506 static const char *uart_str[] =
507 {"unknown", "8250", "16450", "16550", "16550A"};
508 
509 static enum uart yam_check_uart(unsigned int iobase)
510 {
511 	unsigned char b1, b2, b3;
512 	enum uart u;
513 	enum uart uart_tab[] =
514 	{c_uart_16450, c_uart_unknown, c_uart_16550, c_uart_16550A};
515 
516 	b1 = inb(MCR(iobase));
517 	outb(b1 | 0x10, MCR(iobase));	/* loopback mode */
518 	b2 = inb(MSR(iobase));
519 	outb(0x1a, MCR(iobase));
520 	b3 = inb(MSR(iobase)) & 0xf0;
521 	outb(b1, MCR(iobase));		/* restore old values */
522 	outb(b2, MSR(iobase));
523 	if (b3 != 0x90)
524 		return c_uart_unknown;
525 	inb(RBR(iobase));
526 	inb(RBR(iobase));
527 	outb(0x01, FCR(iobase));	/* enable FIFOs */
528 	u = uart_tab[(inb(IIR(iobase)) >> 6) & 3];
529 	if (u == c_uart_16450) {
530 		outb(0x5a, SCR(iobase));
531 		b1 = inb(SCR(iobase));
532 		outb(0xa5, SCR(iobase));
533 		b2 = inb(SCR(iobase));
534 		if ((b1 != 0x5a) || (b2 != 0xa5))
535 			u = c_uart_8250;
536 	}
537 	return u;
538 }
539 
540 /******************************************************************************
541 * Rx Section
542 ******************************************************************************/
543 static inline void yam_rx_flag(struct net_device *dev, struct yam_port *yp)
544 {
545 	if (yp->dcd && yp->rx_len >= 3 && yp->rx_len < YAM_MAX_FRAME) {
546 		int pkt_len = yp->rx_len - 2 + 1;	/* -CRC + kiss */
547 		struct sk_buff *skb;
548 
549 		if ((yp->rx_crch & yp->rx_crcl) != 0xFF) {
550 			/* Bad crc */
551 		} else {
552 			if (!(skb = dev_alloc_skb(pkt_len))) {
553 				printk(KERN_WARNING "%s: memory squeeze, dropping packet\n", dev->name);
554 				++dev->stats.rx_dropped;
555 			} else {
556 				unsigned char *cp;
557 				cp = skb_put(skb, pkt_len);
558 				*cp++ = 0;		/* KISS kludge */
559 				memcpy(cp, yp->rx_buf, pkt_len - 1);
560 				skb->protocol = ax25_type_trans(skb, dev);
561 				netif_rx(skb);
562 				++dev->stats.rx_packets;
563 			}
564 		}
565 	}
566 	yp->rx_len = 0;
567 	yp->rx_crcl = 0x21;
568 	yp->rx_crch = 0xf3;
569 }
570 
571 static inline void yam_rx_byte(struct net_device *dev, struct yam_port *yp, unsigned char rxb)
572 {
573 	if (yp->rx_len < YAM_MAX_FRAME) {
574 		unsigned char c = yp->rx_crcl;
575 		yp->rx_crcl = (chktabl[c] ^ yp->rx_crch);
576 		yp->rx_crch = (chktabh[c] ^ rxb);
577 		yp->rx_buf[yp->rx_len++] = rxb;
578 	}
579 }
580 
581 /********************************************************************************
582 * TX Section
583 ********************************************************************************/
584 
585 static void ptt_on(struct net_device *dev)
586 {
587 	outb(PTT_ON, MCR(dev->base_addr));
588 }
589 
590 static void ptt_off(struct net_device *dev)
591 {
592 	outb(PTT_OFF, MCR(dev->base_addr));
593 }
594 
595 static netdev_tx_t yam_send_packet(struct sk_buff *skb,
596 					 struct net_device *dev)
597 {
598 	struct yam_port *yp = netdev_priv(dev);
599 
600 	if (skb->protocol == htons(ETH_P_IP))
601 		return ax25_ip_xmit(skb);
602 
603 	skb_queue_tail(&yp->send_queue, skb);
604 	netif_trans_update(dev);
605 	return NETDEV_TX_OK;
606 }
607 
608 static void yam_start_tx(struct net_device *dev, struct yam_port *yp)
609 {
610 	if ((yp->tx_state == TX_TAIL) || (yp->txd == 0))
611 		yp->tx_count = 1;
612 	else
613 		yp->tx_count = (yp->bitrate * yp->txd) / 8000;
614 	yp->tx_state = TX_HEAD;
615 	ptt_on(dev);
616 }
617 
618 static void yam_arbitrate(struct net_device *dev)
619 {
620 	struct yam_port *yp = netdev_priv(dev);
621 
622 	if (yp->magic != YAM_MAGIC || yp->tx_state != TX_OFF ||
623 	    skb_queue_empty(&yp->send_queue))
624 		return;
625 	/* tx_state is TX_OFF and there is data to send */
626 
627 	if (yp->dupmode) {
628 		/* Full duplex mode, don't wait */
629 		yam_start_tx(dev, yp);
630 		return;
631 	}
632 	if (yp->dcd) {
633 		/* DCD on, wait slotime ... */
634 		yp->slotcnt = yp->slot / 10;
635 		return;
636 	}
637 	/* Is slottime passed ? */
638 	if ((--yp->slotcnt) > 0)
639 		return;
640 
641 	yp->slotcnt = yp->slot / 10;
642 
643 	/* is random > persist ? */
644 	if ((prandom_u32() % 256) > yp->pers)
645 		return;
646 
647 	yam_start_tx(dev, yp);
648 }
649 
650 static void yam_dotimer(unsigned long dummy)
651 {
652 	int i;
653 
654 	for (i = 0; i < NR_PORTS; i++) {
655 		struct net_device *dev = yam_devs[i];
656 		if (dev && netif_running(dev))
657 			yam_arbitrate(dev);
658 	}
659 	yam_timer.expires = jiffies + HZ / 100;
660 	add_timer(&yam_timer);
661 }
662 
663 static void yam_tx_byte(struct net_device *dev, struct yam_port *yp)
664 {
665 	struct sk_buff *skb;
666 	unsigned char b, temp;
667 
668 	switch (yp->tx_state) {
669 	case TX_OFF:
670 		break;
671 	case TX_HEAD:
672 		if (--yp->tx_count <= 0) {
673 			if (!(skb = skb_dequeue(&yp->send_queue))) {
674 				ptt_off(dev);
675 				yp->tx_state = TX_OFF;
676 				break;
677 			}
678 			yp->tx_state = TX_DATA;
679 			if (skb->data[0] != 0) {
680 /*                              do_kiss_params(s, skb->data, skb->len); */
681 				dev_kfree_skb_any(skb);
682 				break;
683 			}
684 			yp->tx_len = skb->len - 1;	/* strip KISS byte */
685 			if (yp->tx_len >= YAM_MAX_FRAME || yp->tx_len < 2) {
686         			dev_kfree_skb_any(skb);
687 				break;
688 			}
689 			skb_copy_from_linear_data_offset(skb, 1,
690 							 yp->tx_buf,
691 							 yp->tx_len);
692 			dev_kfree_skb_any(skb);
693 			yp->tx_count = 0;
694 			yp->tx_crcl = 0x21;
695 			yp->tx_crch = 0xf3;
696 			yp->tx_state = TX_DATA;
697 		}
698 		break;
699 	case TX_DATA:
700 		b = yp->tx_buf[yp->tx_count++];
701 		outb(b, THR(dev->base_addr));
702 		temp = yp->tx_crcl;
703 		yp->tx_crcl = chktabl[temp] ^ yp->tx_crch;
704 		yp->tx_crch = chktabh[temp] ^ b;
705 		if (yp->tx_count >= yp->tx_len) {
706 			yp->tx_state = TX_CRC1;
707 		}
708 		break;
709 	case TX_CRC1:
710 		yp->tx_crch = chktabl[yp->tx_crcl] ^ yp->tx_crch;
711 		yp->tx_crcl = chktabh[yp->tx_crcl] ^ chktabl[yp->tx_crch] ^ 0xff;
712 		outb(yp->tx_crcl, THR(dev->base_addr));
713 		yp->tx_state = TX_CRC2;
714 		break;
715 	case TX_CRC2:
716 		outb(chktabh[yp->tx_crch] ^ 0xFF, THR(dev->base_addr));
717 		if (skb_queue_empty(&yp->send_queue)) {
718 			yp->tx_count = (yp->bitrate * yp->txtail) / 8000;
719 			if (yp->dupmode == 2)
720 				yp->tx_count += (yp->bitrate * yp->holdd) / 8;
721 			if (yp->tx_count == 0)
722 				yp->tx_count = 1;
723 			yp->tx_state = TX_TAIL;
724 		} else {
725 			yp->tx_count = 1;
726 			yp->tx_state = TX_HEAD;
727 		}
728 		++dev->stats.tx_packets;
729 		break;
730 	case TX_TAIL:
731 		if (--yp->tx_count <= 0) {
732 			yp->tx_state = TX_OFF;
733 			ptt_off(dev);
734 		}
735 		break;
736 	}
737 }
738 
739 /***********************************************************************************
740 * ISR routine
741 ************************************************************************************/
742 
743 static irqreturn_t yam_interrupt(int irq, void *dev_id)
744 {
745 	struct net_device *dev;
746 	struct yam_port *yp;
747 	unsigned char iir;
748 	int counter = 100;
749 	int i;
750 	int handled = 0;
751 
752 	for (i = 0; i < NR_PORTS; i++) {
753 		dev = yam_devs[i];
754 		yp = netdev_priv(dev);
755 
756 		if (!netif_running(dev))
757 			continue;
758 
759 		while ((iir = IIR_MASK & inb(IIR(dev->base_addr))) != IIR_NOPEND) {
760 			unsigned char msr = inb(MSR(dev->base_addr));
761 			unsigned char lsr = inb(LSR(dev->base_addr));
762 			unsigned char rxb;
763 
764 			handled = 1;
765 
766 			if (lsr & LSR_OE)
767 				++dev->stats.rx_fifo_errors;
768 
769 			yp->dcd = (msr & RX_DCD) ? 1 : 0;
770 
771 			if (--counter <= 0) {
772 				printk(KERN_ERR "%s: too many irq iir=%d\n",
773 						dev->name, iir);
774 				goto out;
775 			}
776 			if (msr & TX_RDY) {
777 				++yp->nb_mdint;
778 				yam_tx_byte(dev, yp);
779 			}
780 			if (lsr & LSR_RXC) {
781 				++yp->nb_rxint;
782 				rxb = inb(RBR(dev->base_addr));
783 				if (msr & RX_FLAG)
784 					yam_rx_flag(dev, yp);
785 				else
786 					yam_rx_byte(dev, yp, rxb);
787 			}
788 		}
789 	}
790 out:
791 	return IRQ_RETVAL(handled);
792 }
793 
794 #ifdef CONFIG_PROC_FS
795 
796 static void *yam_seq_start(struct seq_file *seq, loff_t *pos)
797 {
798 	return (*pos < NR_PORTS) ? yam_devs[*pos] : NULL;
799 }
800 
801 static void *yam_seq_next(struct seq_file *seq, void *v, loff_t *pos)
802 {
803 	++*pos;
804 	return (*pos < NR_PORTS) ? yam_devs[*pos] : NULL;
805 }
806 
807 static void yam_seq_stop(struct seq_file *seq, void *v)
808 {
809 }
810 
811 static int yam_seq_show(struct seq_file *seq, void *v)
812 {
813 	struct net_device *dev = v;
814 	const struct yam_port *yp = netdev_priv(dev);
815 
816 	seq_printf(seq, "Device %s\n", dev->name);
817 	seq_printf(seq, "  Up       %d\n", netif_running(dev));
818 	seq_printf(seq, "  Speed    %u\n", yp->bitrate);
819 	seq_printf(seq, "  IoBase   0x%x\n", yp->iobase);
820 	seq_printf(seq, "  BaudRate %u\n", yp->baudrate);
821 	seq_printf(seq, "  IRQ      %u\n", yp->irq);
822 	seq_printf(seq, "  TxState  %u\n", yp->tx_state);
823 	seq_printf(seq, "  Duplex   %u\n", yp->dupmode);
824 	seq_printf(seq, "  HoldDly  %u\n", yp->holdd);
825 	seq_printf(seq, "  TxDelay  %u\n", yp->txd);
826 	seq_printf(seq, "  TxTail   %u\n", yp->txtail);
827 	seq_printf(seq, "  SlotTime %u\n", yp->slot);
828 	seq_printf(seq, "  Persist  %u\n", yp->pers);
829 	seq_printf(seq, "  TxFrames %lu\n", dev->stats.tx_packets);
830 	seq_printf(seq, "  RxFrames %lu\n", dev->stats.rx_packets);
831 	seq_printf(seq, "  TxInt    %u\n", yp->nb_mdint);
832 	seq_printf(seq, "  RxInt    %u\n", yp->nb_rxint);
833 	seq_printf(seq, "  RxOver   %lu\n", dev->stats.rx_fifo_errors);
834 	seq_printf(seq, "\n");
835 	return 0;
836 }
837 
838 static const struct seq_operations yam_seqops = {
839 	.start = yam_seq_start,
840 	.next = yam_seq_next,
841 	.stop = yam_seq_stop,
842 	.show = yam_seq_show,
843 };
844 
845 static int yam_info_open(struct inode *inode, struct file *file)
846 {
847 	return seq_open(file, &yam_seqops);
848 }
849 
850 static const struct file_operations yam_info_fops = {
851 	.owner = THIS_MODULE,
852 	.open = yam_info_open,
853 	.read = seq_read,
854 	.llseek = seq_lseek,
855 	.release = seq_release,
856 };
857 
858 #endif
859 
860 
861 /* --------------------------------------------------------------------- */
862 
863 static int yam_open(struct net_device *dev)
864 {
865 	struct yam_port *yp = netdev_priv(dev);
866 	enum uart u;
867 	int i;
868 	int ret=0;
869 
870 	printk(KERN_INFO "Trying %s at iobase 0x%lx irq %u\n", dev->name, dev->base_addr, dev->irq);
871 
872 	if (!yp->bitrate)
873 		return -ENXIO;
874 	if (!dev->base_addr || dev->base_addr > 0x1000 - YAM_EXTENT ||
875 		dev->irq < 2 || dev->irq > 15) {
876 		return -ENXIO;
877 	}
878 	if (!request_region(dev->base_addr, YAM_EXTENT, dev->name))
879 	{
880 		printk(KERN_ERR "%s: cannot 0x%lx busy\n", dev->name, dev->base_addr);
881 		return -EACCES;
882 	}
883 	if ((u = yam_check_uart(dev->base_addr)) == c_uart_unknown) {
884 		printk(KERN_ERR "%s: cannot find uart type\n", dev->name);
885 		ret = -EIO;
886 		goto out_release_base;
887 	}
888 	if (fpga_download(dev->base_addr, yp->bitrate)) {
889 		printk(KERN_ERR "%s: cannot init FPGA\n", dev->name);
890 		ret = -EIO;
891 		goto out_release_base;
892 	}
893 	outb(0, IER(dev->base_addr));
894 	if (request_irq(dev->irq, yam_interrupt, IRQF_SHARED, dev->name, dev)) {
895 		printk(KERN_ERR "%s: irq %d busy\n", dev->name, dev->irq);
896 		ret = -EBUSY;
897 		goto out_release_base;
898 	}
899 
900 	yam_set_uart(dev);
901 
902 	netif_start_queue(dev);
903 
904 	yp->slotcnt = yp->slot / 10;
905 
906 	/* Reset overruns for all ports - FPGA programming makes overruns */
907 	for (i = 0; i < NR_PORTS; i++) {
908 		struct net_device *yam_dev = yam_devs[i];
909 
910 		inb(LSR(yam_dev->base_addr));
911 		yam_dev->stats.rx_fifo_errors = 0;
912 	}
913 
914 	printk(KERN_INFO "%s at iobase 0x%lx irq %u uart %s\n", dev->name, dev->base_addr, dev->irq,
915 		   uart_str[u]);
916 	return 0;
917 
918 out_release_base:
919 	release_region(dev->base_addr, YAM_EXTENT);
920 	return ret;
921 }
922 
923 /* --------------------------------------------------------------------- */
924 
925 static int yam_close(struct net_device *dev)
926 {
927 	struct sk_buff *skb;
928 	struct yam_port *yp = netdev_priv(dev);
929 
930 	if (!dev)
931 		return -EINVAL;
932 
933 	/*
934 	 * disable interrupts
935 	 */
936 	outb(0, IER(dev->base_addr));
937 	outb(1, MCR(dev->base_addr));
938 	/* Remove IRQ handler if last */
939 	free_irq(dev->irq,dev);
940 	release_region(dev->base_addr, YAM_EXTENT);
941 	netif_stop_queue(dev);
942 	while ((skb = skb_dequeue(&yp->send_queue)))
943 		dev_kfree_skb(skb);
944 
945 	printk(KERN_INFO "%s: close yam at iobase 0x%lx irq %u\n",
946 		   yam_drvname, dev->base_addr, dev->irq);
947 	return 0;
948 }
949 
950 /* --------------------------------------------------------------------- */
951 
952 static int yam_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
953 {
954 	struct yam_port *yp = netdev_priv(dev);
955 	struct yamdrv_ioctl_cfg yi;
956 	struct yamdrv_ioctl_mcs *ym;
957 	int ioctl_cmd;
958 
959 	if (copy_from_user(&ioctl_cmd, ifr->ifr_data, sizeof(int)))
960 		 return -EFAULT;
961 
962 	if (yp->magic != YAM_MAGIC)
963 		return -EINVAL;
964 
965 	if (!capable(CAP_NET_ADMIN))
966 		return -EPERM;
967 
968 	if (cmd != SIOCDEVPRIVATE)
969 		return -EINVAL;
970 
971 	switch (ioctl_cmd) {
972 
973 	case SIOCYAMRESERVED:
974 		return -EINVAL;			/* unused */
975 
976 	case SIOCYAMSMCS:
977 		if (netif_running(dev))
978 			return -EINVAL;		/* Cannot change this parameter when up */
979 		if ((ym = kmalloc(sizeof(struct yamdrv_ioctl_mcs), GFP_KERNEL)) == NULL)
980 			return -ENOBUFS;
981 		if (copy_from_user(ym, ifr->ifr_data, sizeof(struct yamdrv_ioctl_mcs))) {
982 			kfree(ym);
983 			return -EFAULT;
984 		}
985 		if (ym->bitrate > YAM_MAXBITRATE) {
986 			kfree(ym);
987 			return -EINVAL;
988 		}
989 		/* setting predef as 0 for loading userdefined mcs data */
990 		add_mcs(ym->bits, ym->bitrate, 0);
991 		kfree(ym);
992 		break;
993 
994 	case SIOCYAMSCFG:
995 		if (!capable(CAP_SYS_RAWIO))
996 			return -EPERM;
997 		if (copy_from_user(&yi, ifr->ifr_data, sizeof(struct yamdrv_ioctl_cfg)))
998 			 return -EFAULT;
999 
1000 		if ((yi.cfg.mask & YAM_IOBASE) && netif_running(dev))
1001 			return -EINVAL;		/* Cannot change this parameter when up */
1002 		if ((yi.cfg.mask & YAM_IRQ) && netif_running(dev))
1003 			return -EINVAL;		/* Cannot change this parameter when up */
1004 		if ((yi.cfg.mask & YAM_BITRATE) && netif_running(dev))
1005 			return -EINVAL;		/* Cannot change this parameter when up */
1006 		if ((yi.cfg.mask & YAM_BAUDRATE) && netif_running(dev))
1007 			return -EINVAL;		/* Cannot change this parameter when up */
1008 
1009 		if (yi.cfg.mask & YAM_IOBASE) {
1010 			yp->iobase = yi.cfg.iobase;
1011 			dev->base_addr = yi.cfg.iobase;
1012 		}
1013 		if (yi.cfg.mask & YAM_IRQ) {
1014 			if (yi.cfg.irq > 15)
1015 				return -EINVAL;
1016 			yp->irq = yi.cfg.irq;
1017 			dev->irq = yi.cfg.irq;
1018 		}
1019 		if (yi.cfg.mask & YAM_BITRATE) {
1020 			if (yi.cfg.bitrate > YAM_MAXBITRATE)
1021 				return -EINVAL;
1022 			yp->bitrate = yi.cfg.bitrate;
1023 		}
1024 		if (yi.cfg.mask & YAM_BAUDRATE) {
1025 			if (yi.cfg.baudrate > YAM_MAXBAUDRATE)
1026 				return -EINVAL;
1027 			yp->baudrate = yi.cfg.baudrate;
1028 		}
1029 		if (yi.cfg.mask & YAM_MODE) {
1030 			if (yi.cfg.mode > YAM_MAXMODE)
1031 				return -EINVAL;
1032 			yp->dupmode = yi.cfg.mode;
1033 		}
1034 		if (yi.cfg.mask & YAM_HOLDDLY) {
1035 			if (yi.cfg.holddly > YAM_MAXHOLDDLY)
1036 				return -EINVAL;
1037 			yp->holdd = yi.cfg.holddly;
1038 		}
1039 		if (yi.cfg.mask & YAM_TXDELAY) {
1040 			if (yi.cfg.txdelay > YAM_MAXTXDELAY)
1041 				return -EINVAL;
1042 			yp->txd = yi.cfg.txdelay;
1043 		}
1044 		if (yi.cfg.mask & YAM_TXTAIL) {
1045 			if (yi.cfg.txtail > YAM_MAXTXTAIL)
1046 				return -EINVAL;
1047 			yp->txtail = yi.cfg.txtail;
1048 		}
1049 		if (yi.cfg.mask & YAM_PERSIST) {
1050 			if (yi.cfg.persist > YAM_MAXPERSIST)
1051 				return -EINVAL;
1052 			yp->pers = yi.cfg.persist;
1053 		}
1054 		if (yi.cfg.mask & YAM_SLOTTIME) {
1055 			if (yi.cfg.slottime > YAM_MAXSLOTTIME)
1056 				return -EINVAL;
1057 			yp->slot = yi.cfg.slottime;
1058 			yp->slotcnt = yp->slot / 10;
1059 		}
1060 		break;
1061 
1062 	case SIOCYAMGCFG:
1063 		memset(&yi, 0, sizeof(yi));
1064 		yi.cfg.mask = 0xffffffff;
1065 		yi.cfg.iobase = yp->iobase;
1066 		yi.cfg.irq = yp->irq;
1067 		yi.cfg.bitrate = yp->bitrate;
1068 		yi.cfg.baudrate = yp->baudrate;
1069 		yi.cfg.mode = yp->dupmode;
1070 		yi.cfg.txdelay = yp->txd;
1071 		yi.cfg.holddly = yp->holdd;
1072 		yi.cfg.txtail = yp->txtail;
1073 		yi.cfg.persist = yp->pers;
1074 		yi.cfg.slottime = yp->slot;
1075 		if (copy_to_user(ifr->ifr_data, &yi, sizeof(struct yamdrv_ioctl_cfg)))
1076 			 return -EFAULT;
1077 		break;
1078 
1079 	default:
1080 		return -EINVAL;
1081 
1082 	}
1083 
1084 	return 0;
1085 }
1086 
1087 /* --------------------------------------------------------------------- */
1088 
1089 static int yam_set_mac_address(struct net_device *dev, void *addr)
1090 {
1091 	struct sockaddr *sa = (struct sockaddr *) addr;
1092 
1093 	/* addr is an AX.25 shifted ASCII mac address */
1094 	memcpy(dev->dev_addr, sa->sa_data, dev->addr_len);
1095 	return 0;
1096 }
1097 
1098 /* --------------------------------------------------------------------- */
1099 
1100 static const struct net_device_ops yam_netdev_ops = {
1101 	.ndo_open	     = yam_open,
1102 	.ndo_stop	     = yam_close,
1103 	.ndo_start_xmit      = yam_send_packet,
1104 	.ndo_do_ioctl 	     = yam_ioctl,
1105 	.ndo_set_mac_address = yam_set_mac_address,
1106 };
1107 
1108 static void yam_setup(struct net_device *dev)
1109 {
1110 	struct yam_port *yp = netdev_priv(dev);
1111 
1112 	yp->magic = YAM_MAGIC;
1113 	yp->bitrate = DEFAULT_BITRATE;
1114 	yp->baudrate = DEFAULT_BITRATE * 2;
1115 	yp->iobase = 0;
1116 	yp->irq = 0;
1117 	yp->dupmode = 0;
1118 	yp->holdd = DEFAULT_HOLDD;
1119 	yp->txd = DEFAULT_TXD;
1120 	yp->txtail = DEFAULT_TXTAIL;
1121 	yp->slot = DEFAULT_SLOT;
1122 	yp->pers = DEFAULT_PERS;
1123 	yp->dev = dev;
1124 
1125 	dev->base_addr = yp->iobase;
1126 	dev->irq = yp->irq;
1127 
1128 	skb_queue_head_init(&yp->send_queue);
1129 
1130 	dev->netdev_ops = &yam_netdev_ops;
1131 	dev->header_ops = &ax25_header_ops;
1132 
1133 	dev->type = ARPHRD_AX25;
1134 	dev->hard_header_len = AX25_MAX_HEADER_LEN;
1135 	dev->mtu = AX25_MTU;
1136 	dev->addr_len = AX25_ADDR_LEN;
1137 	memcpy(dev->broadcast, &ax25_bcast, AX25_ADDR_LEN);
1138 	memcpy(dev->dev_addr, &ax25_defaddr, AX25_ADDR_LEN);
1139 }
1140 
1141 static int __init yam_init_driver(void)
1142 {
1143 	struct net_device *dev;
1144 	int i, err;
1145 	char name[IFNAMSIZ];
1146 
1147 	printk(yam_drvinfo);
1148 
1149 	for (i = 0; i < NR_PORTS; i++) {
1150 		sprintf(name, "yam%d", i);
1151 
1152 		dev = alloc_netdev(sizeof(struct yam_port), name,
1153 				   NET_NAME_UNKNOWN, yam_setup);
1154 		if (!dev) {
1155 			pr_err("yam: cannot allocate net device\n");
1156 			err = -ENOMEM;
1157 			goto error;
1158 		}
1159 
1160 		err = register_netdev(dev);
1161 		if (err) {
1162 			printk(KERN_WARNING "yam: cannot register net device %s\n", dev->name);
1163 			goto error;
1164 		}
1165 		yam_devs[i] = dev;
1166 
1167 	}
1168 
1169 	yam_timer.function = yam_dotimer;
1170 	yam_timer.expires = jiffies + HZ / 100;
1171 	add_timer(&yam_timer);
1172 
1173 	proc_create("yam", S_IRUGO, init_net.proc_net, &yam_info_fops);
1174 	return 0;
1175  error:
1176 	while (--i >= 0) {
1177 		unregister_netdev(yam_devs[i]);
1178 		free_netdev(yam_devs[i]);
1179 	}
1180 	return err;
1181 }
1182 
1183 /* --------------------------------------------------------------------- */
1184 
1185 static void __exit yam_cleanup_driver(void)
1186 {
1187 	struct yam_mcs *p;
1188 	int i;
1189 
1190 	del_timer_sync(&yam_timer);
1191 	for (i = 0; i < NR_PORTS; i++) {
1192 		struct net_device *dev = yam_devs[i];
1193 		if (dev) {
1194 			unregister_netdev(dev);
1195 			free_netdev(dev);
1196 		}
1197 	}
1198 
1199 	while (yam_data) {
1200 		p = yam_data;
1201 		yam_data = yam_data->next;
1202 		kfree(p);
1203 	}
1204 
1205 	remove_proc_entry("yam", init_net.proc_net);
1206 }
1207 
1208 /* --------------------------------------------------------------------- */
1209 
1210 MODULE_AUTHOR("Frederic Rible F1OAT frible@teaser.fr");
1211 MODULE_DESCRIPTION("Yam amateur radio modem driver");
1212 MODULE_LICENSE("GPL");
1213 MODULE_FIRMWARE(FIRMWARE_1200);
1214 MODULE_FIRMWARE(FIRMWARE_9600);
1215 
1216 module_init(yam_init_driver);
1217 module_exit(yam_cleanup_driver);
1218 
1219 /* --------------------------------------------------------------------- */
1220 
1221