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