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