1 /*
2 * cycx_x25.c	Cyclom 2X WAN Link Driver.  X.25 module.
3 *
4 * Author:	Arnaldo Carvalho de Melo <acme@conectiva.com.br>
5 *
6 * Copyright:	(c) 1998-2001 Arnaldo Carvalho de Melo
7 *
8 * Based on sdla_x25.c by Gene Kozin <genek@compuserve.com>
9 *
10 *		This program is free software; you can redistribute it and/or
11 *		modify it under the terms of the GNU General Public License
12 *		as published by the Free Software Foundation; either version
13 *		2 of the License, or (at your option) any later version.
14 * ============================================================================
15 * 2001/01/12	acme		use dev_kfree_skb_irq on interrupt context
16 * 2000/04/02	acme		dprintk, cycx_debug
17 * 				fixed the bug introduced in get_dev_by_lcn and
18 * 				get_dev_by_dte_addr by the anonymous hacker
19 * 				that converted this driver to softnet
20 * 2000/01/08	acme		cleanup
21 * 1999/10/27	acme		use ARPHRD_HWX25 so that the X.25 stack know
22 *				that we have a X.25 stack implemented in
23 *				firmware onboard
24 * 1999/10/18	acme		support for X.25 sockets in if_send,
25 *				beware: socket(AF_X25...) IS WORK IN PROGRESS,
26 *				TCP/IP over X.25 via wanrouter not affected,
27 *				working.
28 * 1999/10/09	acme		chan_disc renamed to chan_disconnect,
29 * 				began adding support for X.25 sockets:
30 * 				conf->protocol in new_if
31 * 1999/10/05	acme		fixed return E... to return -E...
32 * 1999/08/10	acme		serialized access to the card thru a spinlock
33 *				in x25_exec
34 * 1999/08/09	acme		removed per channel spinlocks
35 *				removed references to enable_tx_int
36 * 1999/05/28	acme		fixed nibble_to_byte, ackvc now properly treated
37 *				if_send simplified
38 * 1999/05/25	acme		fixed t1, t2, t21 & t23 configuration
39 *				use spinlocks instead of cli/sti in some points
40 * 1999/05/24	acme		finished the x25_get_stat function
41 * 1999/05/23	acme		dev->type = ARPHRD_X25 (tcpdump only works,
42 *				AFAIT, with ARPHRD_ETHER). This seems to be
43 *				needed to use socket(AF_X25)...
44 *				Now the config file must specify a peer media
45 *				address for svc channels over a crossover cable.
46 *				Removed hold_timeout from x25_channel_t,
47 *				not used.
48 *				A little enhancement in the DEBUG processing
49 * 1999/05/22	acme		go to DISCONNECTED in disconnect_confirm_intr,
50 *				instead of chan_disc.
51 * 1999/05/16	marcelo		fixed timer initialization in SVCs
52 * 1999/01/05	acme		x25_configure now get (most of) all
53 *				parameters...
54 * 1999/01/05	acme		pktlen now (correctly) uses log2 (value
55 *				configured)
56 * 1999/01/03	acme		judicious use of data types (u8, u16, u32, etc)
57 * 1999/01/03	acme		cyx_isr: reset dpmbase to acknowledge
58 *				indication (interrupt from cyclom 2x)
59 * 1999/01/02	acme		cyx_isr: first hackings...
60 * 1999/01/0203  acme 		when initializing an array don't give less
61 *				elements than declared...
62 * 				example: char send_cmd[6] = "?\xFF\x10";
63 *          			you'll gonna lose a couple hours, 'cause your
64 *				brain won't admit that there's an error in the
65 *				above declaration...  the side effect is that
66 *				memset is put into the unresolved symbols
67 *				instead of using the inline memset functions...
68 * 1999/01/02    acme 		began chan_connect, chan_send, x25_send
69 * 1998/12/31	acme		x25_configure
70 *				this code can be compiled as non module
71 * 1998/12/27	acme		code cleanup
72 *				IPX code wiped out! let's decrease code
73 *				complexity for now, remember: I'm learning! :)
74 *                               bps_to_speed_code OK
75 * 1998/12/26	acme		Minimal debug code cleanup
76 * 1998/08/08	acme		Initial version.
77 */
78 
79 #define CYCLOMX_X25_DEBUG 1
80 
81 #include <linux/version.h>
82 #include <linux/kernel.h>	/* printk(), and other useful stuff */
83 #include <linux/stddef.h>	/* offsetof(), etc. */
84 #include <linux/errno.h>	/* return codes */
85 #include <linux/string.h>	/* inline memset(), etc. */
86 #include <linux/slab.h>	/* kmalloc(), kfree() */
87 #include <linux/wanrouter.h>	/* WAN router definitions */
88 #include <asm/byteorder.h>	/* htons(), etc. */
89 #include <linux/if_arp.h>       /* ARPHRD_HWX25 */
90 #include <linux/cyclomx.h>	/* Cyclom 2X common user API definitions */
91 #include <linux/cycx_x25.h>	/* X.25 firmware API definitions */
92 
93 /* Defines & Macros */
94 #define MAX_CMD_RETRY	5
95 #define X25_CHAN_MTU	2048	/* unfragmented logical channel MTU */
96 
97 /* Data Structures */
98 /* This is an extension of the 'struct net_device' we create for each network
99    interface to keep the rest of X.25 channel-specific data. */
100 typedef struct x25_channel {
101 	/* This member must be first. */
102 	struct net_device *slave;	/* WAN slave */
103 
104 	char name[WAN_IFNAME_SZ+1];	/* interface name, ASCIIZ */
105 	char addr[WAN_ADDRESS_SZ+1];	/* media address, ASCIIZ */
106 	char *local_addr;		/* local media address, ASCIIZ -
107 					   svc thru crossover cable */
108 	s16 lcn;			/* logical channel number/conn.req.key*/
109 	u8 link;
110 	struct timer_list timer;	/* timer used for svc channel disc. */
111 	u16 protocol;			/* ethertype, 0 - multiplexed */
112 	u8 svc;				/* 0 - permanent, 1 - switched */
113 	u8 state;			/* channel state */
114 	u8 drop_sequence;		/* mark sequence for dropping */
115 	u32 idle_tmout;			/* sec, before disconnecting */
116 	struct sk_buff *rx_skb;		/* receive socket buffer */
117 	cycx_t *card;			/* -> owner */
118 	struct net_device_stats ifstats;/* interface statistics */
119 } x25_channel_t;
120 
121 /* Function Prototypes */
122 /* WAN link driver entry points. These are called by the WAN router module. */
123 static int update (wan_device_t *wandev),
124 	   new_if (wan_device_t *wandev, struct net_device *dev,
125 		   wanif_conf_t *conf),
126 	   del_if (wan_device_t *wandev, struct net_device *dev);
127 
128 /* Network device interface */
129 static int if_init (struct net_device *dev),
130 	   if_open (struct net_device *dev),
131 	   if_close (struct net_device *dev),
132 	   if_header (struct sk_buff *skb, struct net_device *dev,
133 		      u16 type, void *daddr, void *saddr, unsigned len),
134 	   if_rebuild_hdr (struct sk_buff *skb),
135 	   if_send (struct sk_buff *skb, struct net_device *dev);
136 
137 static struct net_device_stats * if_stats (struct net_device *dev);
138 
139 /* Interrupt handlers */
140 static void cyx_isr (cycx_t *card),
141 	    tx_intr (cycx_t *card, TX25Cmd *cmd),
142 	    rx_intr (cycx_t *card, TX25Cmd *cmd),
143 	    log_intr (cycx_t *card, TX25Cmd *cmd),
144 	    stat_intr (cycx_t *card, TX25Cmd *cmd),
145 	    connect_confirm_intr (cycx_t *card, TX25Cmd *cmd),
146 	    disconnect_confirm_intr (cycx_t *card, TX25Cmd *cmd),
147 	    connect_intr (cycx_t *card, TX25Cmd *cmd),
148 	    disconnect_intr (cycx_t *card, TX25Cmd *cmd),
149 	    spur_intr (cycx_t *card, TX25Cmd *cmd);
150 
151 /* X.25 firmware interface functions */
152 static int x25_configure (cycx_t *card, TX25Config *conf),
153 	   x25_get_stats (cycx_t *card),
154 	   x25_send (cycx_t *card, u8 link, u8 lcn, u8 bitm, int len,
155 		     void *buf),
156 	   x25_connect_response (cycx_t *card, x25_channel_t *chan),
157 	   x25_disconnect_response (cycx_t *card, u8 link, u8 lcn);
158 
159 /* channel functions */
160 static int chan_connect (struct net_device *dev),
161     	   chan_send (struct net_device *dev, struct sk_buff *skb);
162 
163 static void chan_disconnect (struct net_device *dev),
164 	    chan_x25_send_event(struct net_device *dev, u8 event);
165 
166 /* Miscellaneous functions */
167 static void set_chan_state (struct net_device *dev, u8 state),
168 	    chan_timer (unsigned long d);
169 
170 static void nibble_to_byte (u8 *s, u8 *d, u8 len, u8 nibble),
171 	    reset_timer (struct net_device *dev);
172 
173 static u8 bps_to_speed_code (u32 bps);
174 static u8 log2 (u32 n);
175 
176 static unsigned dec_to_uint (u8 *str, int len);
177 
178 static struct net_device *get_dev_by_lcn (wan_device_t *wandev, s16 lcn);
179 static struct net_device *get_dev_by_dte_addr (wan_device_t *wandev, char *dte);
180 
181 #ifdef CYCLOMX_X25_DEBUG
182 static void hex_dump(char *msg, unsigned char *p, int len);
183 static void x25_dump_config(TX25Config *conf);
184 static void x25_dump_stats(TX25Stats *stats);
185 static void x25_dump_devs(wan_device_t *wandev);
186 #else
187 #define hex_dump(msg, p, len)
188 #define x25_dump_config(conf)
189 #define x25_dump_stats(stats)
190 #define x25_dump_devs(wandev)
191 #endif
192 /* Public Functions */
193 
194 /* X.25 Protocol Initialization routine.
195  *
196  * This routine is called by the main Cyclom 2X module during setup.  At this
197  * point adapter is completely initialized and X.25 firmware is running.
198  *  o configure adapter
199  *  o initialize protocol-specific fields of the adapter data space.
200  *
201  * Return:	0	o.k.
202  *		< 0	failure.  */
cyx_init(cycx_t * card,wandev_conf_t * conf)203 int cyx_init (cycx_t *card, wandev_conf_t *conf)
204 {
205 	TX25Config cfg;
206 
207 	/* Verify configuration ID */
208 	if (conf->config_id != WANCONFIG_X25) {
209 		printk(KERN_INFO "%s: invalid configuration ID %u!\n",
210 				 card->devname, conf->config_id);
211 		return -EINVAL;
212 	}
213 
214 	/* Initialize protocol-specific fields */
215 	card->mbox  = card->hw.dpmbase + X25_MBOX_OFFS;
216 	card->u.x.connection_keys = 0;
217 	card->u.x.lock = SPIN_LOCK_UNLOCKED;
218 
219 	/* Configure adapter. Here we set reasonable defaults, then parse
220 	 * device configuration structure and set configuration options.
221 	 * Most configuration options are verified and corrected (if
222 	 * necessary) since we can't rely on the adapter to do so and don't
223 	 * want it to fail either. */
224 	memset(&cfg, 0, sizeof(cfg));
225 	cfg.link = 0;
226 	cfg.clock = conf->clocking == WANOPT_EXTERNAL ? 8 : 55;
227 	cfg.speed = bps_to_speed_code(conf->bps);
228 	cfg.n3win = 7;
229 	cfg.n2win = 2;
230 	cfg.n2 = 5;
231 	cfg.nvc = 1;
232 	cfg.npvc = 1;
233 	cfg.flags = 0x02; /* default = V35 */
234 	cfg.t1 = 10;   /* line carrier timeout */
235 	cfg.t2 = 29;   /* tx timeout */
236 	cfg.t21 = 180; /* CALL timeout */
237 	cfg.t23 = 180; /* CLEAR timeout */
238 
239 	/* adjust MTU */
240 	if (!conf->mtu || conf->mtu >= 512)
241 		card->wandev.mtu = 512;
242 	else if (conf->mtu >= 256)
243 		card->wandev.mtu = 256;
244 	else if (conf->mtu >= 128)
245 		card->wandev.mtu = 128;
246 	else
247 		card->wandev.mtu = 64;
248 
249 	cfg.pktlen = log2(card->wandev.mtu);
250 
251 	if (conf->station == WANOPT_DTE) {
252 		cfg.locaddr = 3; /* DTE */
253 		cfg.remaddr = 1; /* DCE */
254 	} else {
255 		cfg.locaddr = 1; /* DCE */
256 		cfg.remaddr = 3; /* DTE */
257 	}
258 
259         if (conf->interface == WANOPT_RS232)
260 	        cfg.flags = 0;      /* FIXME just reset the 2nd bit */
261 
262 	if (conf->u.x25.hi_pvc) {
263 		card->u.x.hi_pvc = min_t(unsigned int, conf->u.x25.hi_pvc, 4095);
264 		card->u.x.lo_pvc = min_t(unsigned int, conf->u.x25.lo_pvc, card->u.x.hi_pvc);
265 	}
266 
267 	if (conf->u.x25.hi_svc) {
268 		card->u.x.hi_svc = min_t(unsigned int, conf->u.x25.hi_svc, 4095);
269 		card->u.x.lo_svc = min_t(unsigned int, conf->u.x25.lo_svc, card->u.x.hi_svc);
270 	}
271 
272 	if (card->u.x.lo_pvc == 255)
273 		cfg.npvc = 0;
274 	else
275 		cfg.npvc = card->u.x.hi_pvc - card->u.x.lo_pvc + 1;
276 
277 	cfg.nvc = card->u.x.hi_svc - card->u.x.lo_svc + 1 + cfg.npvc;
278 
279 	if (conf->u.x25.hdlc_window)
280 		cfg.n2win = min_t(unsigned int, conf->u.x25.hdlc_window, 7);
281 
282 	if (conf->u.x25.pkt_window)
283 		cfg.n3win = min_t(unsigned int, conf->u.x25.pkt_window, 7);
284 
285 	if (conf->u.x25.t1)
286 		cfg.t1 = min_t(unsigned int, conf->u.x25.t1, 30);
287 
288 	if (conf->u.x25.t2)
289 		cfg.t2 = min_t(unsigned int, conf->u.x25.t2, 30);
290 
291 	if (conf->u.x25.t11_t21)
292 		cfg.t21 = min_t(unsigned int, conf->u.x25.t11_t21, 30);
293 
294 	if (conf->u.x25.t13_t23)
295 		cfg.t23 = min_t(unsigned int, conf->u.x25.t13_t23, 30);
296 
297 	if (conf->u.x25.n2)
298 		cfg.n2 = min_t(unsigned int, conf->u.x25.n2, 30);
299 
300 	/* initialize adapter */
301 	if (x25_configure(card, &cfg))
302 		return -EIO;
303 
304 	/* Initialize protocol-specific fields of adapter data space */
305 	card->wandev.bps	= conf->bps;
306 	card->wandev.interface	= conf->interface;
307 	card->wandev.clocking	= conf->clocking;
308 	card->wandev.station	= conf->station;
309 	card->isr		= cyx_isr;
310 	card->exec		= NULL;
311 	card->wandev.update	= update;
312 	card->wandev.new_if	= new_if;
313 	card->wandev.del_if	= del_if;
314 	card->wandev.state	= WAN_DISCONNECTED;
315 
316 	return 0;
317 }
318 
319 /* WAN Device Driver Entry Points */
320 /* Update device status & statistics. */
update(wan_device_t * wandev)321 static int update (wan_device_t *wandev)
322 {
323 	/* sanity checks */
324 	if (!wandev || !wandev->private)
325 		return -EFAULT;
326 
327 	if (wandev->state == WAN_UNCONFIGURED)
328 		return -ENODEV;
329 
330 	x25_get_stats(wandev->private);
331 
332 	return 0;
333 }
334 
335 /* Create new logical channel.
336  * This routine is called by the router when ROUTER_IFNEW IOCTL is being
337  * handled.
338  * o parse media- and hardware-specific configuration
339  * o make sure that a new channel can be created
340  * o allocate resources, if necessary
341  * o prepare network device structure for registration.
342  *
343  * Return:	0	o.k.
344  *		< 0	failure (channel will not be created) */
new_if(wan_device_t * wandev,struct net_device * dev,wanif_conf_t * conf)345 static int new_if (wan_device_t *wandev, struct net_device *dev,
346 		   wanif_conf_t *conf)
347 {
348 	cycx_t *card = wandev->private;
349 	x25_channel_t *chan;
350 	int err = 0;
351 
352 	if (!conf->name[0] || strlen(conf->name) > WAN_IFNAME_SZ) {
353 		printk(KERN_INFO "%s: invalid interface name!\n",card->devname);
354 		return -EINVAL;
355 	}
356 
357 	/* allocate and initialize private data */
358 	if ((chan = kmalloc(sizeof(x25_channel_t), GFP_KERNEL)) == NULL)
359 		return -ENOMEM;
360 
361 	memset(chan, 0, sizeof(x25_channel_t));
362 	strcpy(chan->name, conf->name);
363 	chan->card = card;
364 	chan->link = conf->port;
365 	chan->protocol = conf->protocol ? ETH_P_X25 : ETH_P_IP;
366 	chan->rx_skb = NULL;
367 	/* only used in svc connected thru crossover cable */
368 	chan->local_addr = NULL;
369 
370 	if (conf->addr[0] == '@') {	/* SVC */
371 		int len = strlen(conf->local_addr);
372 
373 		if (len) {
374 			if (len > WAN_ADDRESS_SZ) {
375 				printk(KERN_ERR "%s: %s local addr too long!\n",
376 						wandev->name, chan->name);
377 				kfree(chan);
378 				return -EINVAL;
379 			} else {
380 				chan->local_addr = kmalloc(len + 1, GFP_KERNEL);
381 
382 				if (!chan->local_addr) {
383 					kfree(chan);
384 					return -ENOMEM;
385 				}
386 			}
387 
388                 	strncpy(chan->local_addr, conf->local_addr,
389 				WAN_ADDRESS_SZ);
390 		}
391 
392                 chan->svc = 1;
393                 strncpy(chan->addr, &conf->addr[1], WAN_ADDRESS_SZ);
394 		init_timer(&chan->timer);
395 		chan->timer.function = chan_timer;
396 		chan->timer.data = (unsigned long)dev;
397 
398                 /* Set channel timeouts (default if not specified) */
399                 chan->idle_tmout = conf->idle_timeout ? conf->idle_timeout : 90;
400         } else if (is_digit(conf->addr[0])) {	/* PVC */
401 		s16 lcn = dec_to_uint(conf->addr, 0);
402 
403 		if (lcn >= card->u.x.lo_pvc && lcn <= card->u.x.hi_pvc)
404 			chan->lcn = lcn;
405 		else {
406 			printk(KERN_ERR
407 				"%s: PVC %u is out of range on interface %s!\n",
408 				wandev->name, lcn, chan->name);
409 			err = -EINVAL;
410 		}
411 	} else {
412 		printk(KERN_ERR "%s: invalid media address on interface %s!\n",
413 				wandev->name, chan->name);
414 		err = -EINVAL;
415 	}
416 
417 	if (err) {
418 		if (chan->local_addr)
419 			kfree(chan->local_addr);
420 
421 		kfree(chan);
422 		return err;
423 	}
424 
425 	/* prepare network device data space for registration */
426 	strcpy(dev->name, chan->name);
427 	dev->init = if_init;
428 	dev->priv = chan;
429 
430 	return 0;
431 }
432 
433 /* Delete logical channel. */
del_if(wan_device_t * wandev,struct net_device * dev)434 static int del_if (wan_device_t *wandev, struct net_device *dev)
435 {
436 	if (dev->priv) {
437 		x25_channel_t *chan = dev->priv;
438 
439 		if (chan->svc) {
440 			if (chan->local_addr)
441 				kfree(chan->local_addr);
442 
443 			if (chan->state == WAN_CONNECTED)
444 				del_timer(&chan->timer);
445 		}
446 
447 		kfree(chan);
448 		dev->priv = NULL;
449 	}
450 
451 	return 0;
452 }
453 
454 /* Network Device Interface */
455 /* Initialize Linux network interface.
456  *
457  * This routine is called only once for each interface, during Linux network
458  * interface registration.  Returning anything but zero will fail interface
459  * registration. */
if_init(struct net_device * dev)460 static int if_init (struct net_device *dev)
461 {
462 	x25_channel_t *chan = dev->priv;
463 	cycx_t *card = chan->card;
464 	wan_device_t *wandev = &card->wandev;
465 
466 	/* Initialize device driver entry points */
467 	dev->open = if_open;
468 	dev->stop = if_close;
469 	dev->hard_header = if_header;
470 	dev->rebuild_header = if_rebuild_hdr;
471 	dev->hard_start_xmit = if_send;
472 	dev->get_stats = if_stats;
473 
474 	/* Initialize media-specific parameters */
475 	dev->mtu = X25_CHAN_MTU;
476 	dev->type = ARPHRD_HWX25;	/* ARP h/w type */
477 	dev->hard_header_len = 0;	/* media header length */
478 	dev->addr_len = 0;		/* hardware address length */
479 
480 	if (!chan->svc)
481 		*(u16*)dev->dev_addr = htons(chan->lcn);
482 
483 	/* Initialize hardware parameters (just for reference) */
484 	dev->irq = wandev->irq;
485 	dev->dma = wandev->dma;
486 	dev->base_addr = wandev->ioport;
487 	dev->mem_start = (unsigned long)wandev->maddr;
488 	dev->mem_end = (unsigned long)(wandev->maddr + wandev->msize - 1);
489 	dev->flags |= IFF_NOARP;
490 
491         /* Set transmit buffer queue length */
492         dev->tx_queue_len = 10;
493 
494 	/* Initialize socket buffers */
495 	set_chan_state(dev, WAN_DISCONNECTED);
496 
497 	return 0;
498 }
499 
500 /* Open network interface.
501  * o prevent module from unloading by incrementing use count
502  * o if link is disconnected then initiate connection
503  *
504  * Return 0 if O.k. or errno.  */
if_open(struct net_device * dev)505 static int if_open (struct net_device *dev)
506 {
507 	x25_channel_t *chan = dev->priv;
508 	cycx_t *card = chan->card;
509 
510 	if (netif_running(dev))
511 		return -EBUSY; /* only one open is allowed */
512 
513 	netif_start_queue(dev);
514 	cyclomx_mod_inc_use_count(card);
515 
516 	return 0;
517 }
518 
519 /* Close network interface.
520  * o reset flags.
521  * o if there's no more open channels then disconnect physical link. */
if_close(struct net_device * dev)522 static int if_close (struct net_device *dev)
523 {
524 	x25_channel_t *chan = dev->priv;
525 	cycx_t *card = chan->card;
526 
527 	netif_stop_queue(dev);
528 
529 	if (chan->state == WAN_CONNECTED || chan->state == WAN_CONNECTING)
530 		chan_disconnect(dev);
531 
532 	cyclomx_mod_dec_use_count(card);
533 
534 	return 0;
535 }
536 
537 /* Build media header.
538  * o encapsulate packet according to encapsulation type.
539  *
540  * The trick here is to put packet type (Ethertype) into 'protocol' field of
541  * the socket buffer, so that we don't forget it.  If encapsulation fails,
542  * set skb->protocol to 0 and discard packet later.
543  *
544  * Return:	media header length. */
if_header(struct sk_buff * skb,struct net_device * dev,u16 type,void * daddr,void * saddr,unsigned len)545 static int if_header (struct sk_buff *skb, struct net_device *dev,
546 		      u16 type, void *daddr, void *saddr, unsigned len)
547 {
548 	skb->protocol = type;
549 
550 	return dev->hard_header_len;
551 }
552 
553 /* * Re-build media header.
554  * Return:	1	physical address resolved.
555  *		0	physical address not resolved */
if_rebuild_hdr(struct sk_buff * skb)556 static int if_rebuild_hdr (struct sk_buff *skb)
557 {
558 	return 1;
559 }
560 
561 /* Send a packet on a network interface.
562  * o set busy flag (marks start of the transmission).
563  * o check link state. If link is not up, then drop the packet.
564  * o check channel status. If it's down then initiate a call.
565  * o pass a packet to corresponding WAN device.
566  * o free socket buffer
567  *
568  * Return:	0	complete (socket buffer must be freed)
569  *		non-0	packet may be re-transmitted (tbusy must be set)
570  *
571  * Notes:
572  * 1. This routine is called either by the protocol stack or by the "net
573  *    bottom half" (with interrupts enabled).
574  * 2. Setting tbusy flag will inhibit further transmit requests from the
575  *    protocol stack and can be used for flow control with protocol layer. */
if_send(struct sk_buff * skb,struct net_device * dev)576 static int if_send (struct sk_buff *skb, struct net_device *dev)
577 {
578 	x25_channel_t *chan = dev->priv;
579 	cycx_t *card = chan->card;
580 
581 	if (!chan->svc)
582 		chan->protocol = skb->protocol;
583 
584 	if (card->wandev.state != WAN_CONNECTED)
585 		++chan->ifstats.tx_dropped;
586         else if (chan->svc && chan->protocol &&
587 		 chan->protocol != skb->protocol) {
588                 printk(KERN_INFO
589                         "%s: unsupported Ethertype 0x%04X on interface %s!\n",
590                         card->devname, skb->protocol, dev->name);
591                 ++chan->ifstats.tx_errors;
592         } else if (chan->protocol == ETH_P_IP) {
593 		switch (chan->state) {
594 			case WAN_DISCONNECTED:
595 				if (chan_connect(dev)) {
596 					netif_stop_queue(dev);
597 					return -EBUSY;
598 				}
599 				/* fall thru */
600 			case WAN_CONNECTED:
601 				reset_timer(dev);
602 				dev->trans_start = jiffies;
603 				netif_stop_queue(dev);
604 
605 				if (chan_send(dev, skb))
606 					return -EBUSY;
607 
608 				break;
609 			default:
610 				++chan->ifstats.tx_dropped;
611 				++card->wandev.stats.tx_dropped;
612 		}
613 	} else { /* chan->protocol == ETH_P_X25 */
614 		switch (skb->data[0]) {
615 			case 0: break;
616 			case 1: /* Connect request */
617 				chan_connect(dev);
618 				goto free_packet;
619 		        case 2: /* Disconnect request */
620 				chan_disconnect(dev);
621 				goto free_packet;
622 		        default:
623 				printk(KERN_INFO
624 				       "%s: unknown %d x25-iface request on %s!\n",
625                        			card->devname, skb->data[0], dev->name);
626                			++chan->ifstats.tx_errors;
627 				goto free_packet;
628 		}
629 
630 		skb_pull(skb, 1); /* Remove control byte */
631 		reset_timer(dev);
632 		dev->trans_start = jiffies;
633 		netif_stop_queue(dev);
634 
635 		if (chan_send(dev, skb)) {
636 			/* prepare for future retransmissions */
637 			skb_push(skb, 1);
638 			return -EBUSY;
639 		}
640 	}
641 
642 free_packet:
643 	dev_kfree_skb(skb);
644 
645 	return 0;
646 }
647 
648 /* Get Ethernet-style interface statistics.
649  * Return a pointer to struct net_device_stats */
if_stats(struct net_device * dev)650 static struct net_device_stats *if_stats (struct net_device *dev)
651 {
652         x25_channel_t *chan = dev->priv;
653 
654 	return chan ? &chan->ifstats : NULL;
655 }
656 
657 /* Interrupt Handlers */
658 /* X.25 Interrupt Service Routine. */
cyx_isr(cycx_t * card)659 static void cyx_isr (cycx_t *card)
660 {
661 	TX25Cmd cmd;
662 	u16 z = 0;
663 
664 	card->in_isr = 1;
665 	card->buff_int_mode_unbusy = 0;
666 	cycx_peek(&card->hw, X25_RXMBOX_OFFS, &cmd, sizeof(cmd));
667 
668 	switch (cmd.command) {
669 		case X25_DATA_INDICATION:
670 			rx_intr(card, &cmd);
671 			break;
672 		case X25_ACK_FROM_VC:
673 			tx_intr(card, &cmd);
674 			break;
675 		case X25_LOG:
676 			log_intr(card, &cmd);
677 			break;
678 		case X25_STATISTIC:
679 			stat_intr(card, &cmd);
680 			break;
681 		case X25_CONNECT_CONFIRM:
682 			connect_confirm_intr(card, &cmd);
683 			break;
684 		case X25_CONNECT_INDICATION:
685 			connect_intr(card, &cmd);
686 			break;
687 		case X25_DISCONNECT_INDICATION:
688 			disconnect_intr(card, &cmd);
689 			break;
690 		case X25_DISCONNECT_CONFIRM:
691 			disconnect_confirm_intr(card, &cmd);
692 			break;
693 		case X25_LINE_ON:
694 			cyclomx_set_state(card, WAN_CONNECTED);
695 			break;
696 		case X25_LINE_OFF:
697 			cyclomx_set_state(card, WAN_DISCONNECTED);
698 			break;
699 		default:
700 			spur_intr(card, &cmd); /* unwanted interrupt */
701 	}
702 
703 	cycx_poke(&card->hw, 0, &z, sizeof(z));
704 	cycx_poke(&card->hw, X25_RXMBOX_OFFS, &z, sizeof(z));
705 	card->in_isr = 0;
706 }
707 
708 /* Transmit interrupt handler.
709  *	o Release socket buffer
710  *	o Clear 'tbusy' flag */
tx_intr(cycx_t * card,TX25Cmd * cmd)711 static void tx_intr (cycx_t *card, TX25Cmd *cmd)
712 {
713 	struct net_device *dev;
714 	wan_device_t *wandev = &card->wandev;
715 	u8 lcn;
716 
717 	cycx_peek(&card->hw, cmd->buf, &lcn, sizeof(lcn));
718 
719 	/* unbusy device and then dev_tint(); */
720 	if ((dev = get_dev_by_lcn(wandev, lcn)) != NULL) {
721 		card->buff_int_mode_unbusy = 1;
722 		netif_wake_queue(dev);
723 	} else
724 		printk(KERN_ERR "%s:ackvc for inexistent lcn %d\n",
725 				 card->devname, lcn);
726 }
727 
728 /* Receive interrupt handler.
729  * This routine handles fragmented IP packets using M-bit according to the
730  * RFC1356.
731  * o map logical channel number to network interface.
732  * o allocate socket buffer or append received packet to the existing one.
733  * o if M-bit is reset (i.e. it's the last packet in a sequence) then
734  *   decapsulate packet and pass socket buffer to the protocol stack.
735  *
736  * Notes:
737  * 1. When allocating a socket buffer, if M-bit is set then more data is
738  *    coming and we have to allocate buffer for the maximum IP packet size
739  *    expected on this channel.
740  * 2. If something goes wrong and X.25 packet has to be dropped (e.g. no
741  *    socket buffers available) the whole packet sequence must be discarded. */
rx_intr(cycx_t * card,TX25Cmd * cmd)742 static void rx_intr (cycx_t *card, TX25Cmd *cmd)
743 {
744 	wan_device_t *wandev = &card->wandev;
745 	struct net_device *dev;
746 	x25_channel_t *chan;
747 	struct sk_buff *skb;
748 	u8 bitm, lcn;
749 	int pktlen = cmd->len - 5;
750 
751 	cycx_peek(&card->hw, cmd->buf, &lcn, sizeof(lcn));
752 	cycx_peek(&card->hw, cmd->buf + 4, &bitm, sizeof(bitm));
753 	bitm &= 0x10;
754 
755 	if ((dev = get_dev_by_lcn(wandev, lcn)) == NULL) {
756 		/* Invalid channel, discard packet */
757 		printk(KERN_INFO "%s: receiving on orphaned LCN %d!\n",
758 				 card->devname, lcn);
759 		return;
760 	}
761 
762 	chan = dev->priv;
763 	reset_timer(dev);
764 
765 	if (chan->drop_sequence) {
766 		if (!bitm)
767 			chan->drop_sequence = 0;
768 		else
769 			return;
770 	}
771 
772 	if ((skb = chan->rx_skb) == NULL) {
773 		/* Allocate new socket buffer */
774 		int bufsize = bitm ? dev->mtu : pktlen;
775 
776 		if ((skb = dev_alloc_skb((chan->protocol == ETH_P_X25 ? 1 : 0) +
777 					 bufsize +
778 					 dev->hard_header_len)) == NULL) {
779 			printk(KERN_INFO "%s: no socket buffers available!\n",
780 					 card->devname);
781 			chan->drop_sequence = 1;
782 			++chan->ifstats.rx_dropped;
783 			return;
784 		}
785 
786 		if (chan->protocol == ETH_P_X25) /* X.25 socket layer control */
787 			/* 0 = data packet (dev_alloc_skb zeroed skb->data) */
788 			skb_put(skb, 1);
789 
790 		skb->dev = dev;
791 		skb->protocol = htons(chan->protocol);
792 		chan->rx_skb = skb;
793 	}
794 
795 	if (skb_tailroom(skb) < pktlen) {
796 		/* No room for the packet. Call off the whole thing! */
797 		dev_kfree_skb_irq(skb);
798 		chan->rx_skb = NULL;
799 
800 		if (bitm)
801 			chan->drop_sequence = 1;
802 
803 		printk(KERN_INFO "%s: unexpectedly long packet sequence "
804 			"on interface %s!\n", card->devname, dev->name);
805 		++chan->ifstats.rx_length_errors;
806 		return;
807 	}
808 
809 	/* Append packet to the socket buffer  */
810 	cycx_peek(&card->hw, cmd->buf + 5, skb_put(skb, pktlen), pktlen);
811 
812 	if (bitm)
813 		return; /* more data is coming */
814 
815 	chan->rx_skb = NULL;		/* dequeue packet */
816 
817 	++chan->ifstats.rx_packets;
818 	chan->ifstats.rx_bytes += pktlen;
819 
820 	skb->mac.raw = skb->data;
821 	netif_rx(skb);
822 	dev->last_rx = jiffies;		/* timestamp */
823 }
824 
825 /* Connect interrupt handler. */
connect_intr(cycx_t * card,TX25Cmd * cmd)826 static void connect_intr (cycx_t *card, TX25Cmd *cmd)
827 {
828 	wan_device_t *wandev = &card->wandev;
829 	struct net_device *dev = NULL;
830 	x25_channel_t *chan;
831 	u8 d[32],
832 	   loc[24],
833 	   rem[24];
834 	u8 lcn, sizeloc, sizerem;
835 
836 	cycx_peek(&card->hw, cmd->buf, &lcn, sizeof(lcn));
837 	cycx_peek(&card->hw, cmd->buf + 5, &sizeloc, sizeof(sizeloc));
838 	cycx_peek(&card->hw, cmd->buf + 6, d, cmd->len - 6);
839 
840 	sizerem = sizeloc >> 4;
841 	sizeloc &= 0x0F;
842 
843 	loc[0] = rem[0] = '\0';
844 
845 	if (sizeloc)
846 		nibble_to_byte(d, loc, sizeloc, 0);
847 
848 	if (sizerem)
849 		nibble_to_byte(d + (sizeloc >> 1), rem, sizerem, sizeloc & 1);
850 
851 	dprintk(1, KERN_INFO "connect_intr:lcn=%d, local=%s, remote=%s\n",
852 			  lcn, loc, rem);
853 
854 	if ((dev = get_dev_by_dte_addr(wandev, rem)) == NULL) {
855 		/* Invalid channel, discard packet */
856 		printk(KERN_INFO "%s: connect not expected: remote %s!\n",
857 				 card->devname, rem);
858 		return;
859 	}
860 
861 	chan = dev->priv;
862 	chan->lcn = lcn;
863 	x25_connect_response(card, chan);
864 	set_chan_state(dev, WAN_CONNECTED);
865 }
866 
867 /* Connect confirm interrupt handler. */
connect_confirm_intr(cycx_t * card,TX25Cmd * cmd)868 static void connect_confirm_intr (cycx_t *card, TX25Cmd *cmd)
869 {
870 	wan_device_t *wandev = &card->wandev;
871 	struct net_device *dev;
872 	x25_channel_t *chan;
873 	u8 lcn, key;
874 
875 	cycx_peek(&card->hw, cmd->buf, &lcn, sizeof(lcn));
876 	cycx_peek(&card->hw, cmd->buf + 1, &key, sizeof(key));
877 	dprintk(1, KERN_INFO "%s: connect_confirm_intr:lcn=%d, key=%d\n",
878 			  card->devname, lcn, key);
879 
880 	if ((dev = get_dev_by_lcn(wandev, -key)) == NULL) {
881 		/* Invalid channel, discard packet */
882 		clear_bit(--key, (void*)&card->u.x.connection_keys);
883 		printk(KERN_INFO "%s: connect confirm not expected: lcn %d, "
884 				 "key=%d!\n", card->devname, lcn, key);
885 		return;
886 	}
887 
888 	clear_bit(--key, (void*)&card->u.x.connection_keys);
889 	chan = dev->priv;
890 	chan->lcn = lcn;
891 	set_chan_state(dev, WAN_CONNECTED);
892 }
893 
894 /* Disconnect confirm interrupt handler. */
disconnect_confirm_intr(cycx_t * card,TX25Cmd * cmd)895 static void disconnect_confirm_intr (cycx_t *card, TX25Cmd *cmd)
896 {
897 	wan_device_t *wandev = &card->wandev;
898 	struct net_device *dev;
899 	u8 lcn;
900 
901 	cycx_peek(&card->hw, cmd->buf, &lcn, sizeof(lcn));
902 	dprintk(1, KERN_INFO "%s: disconnect_confirm_intr:lcn=%d\n",
903 			  card->devname, lcn);
904 	if ((dev = get_dev_by_lcn(wandev, lcn)) == NULL) {
905 		/* Invalid channel, discard packet */
906 		printk(KERN_INFO "%s:disconnect confirm not expected!:lcn %d\n",
907 				 card->devname, lcn);
908 		return;
909 	}
910 
911 	set_chan_state(dev, WAN_DISCONNECTED);
912 }
913 
914 /* disconnect interrupt handler. */
disconnect_intr(cycx_t * card,TX25Cmd * cmd)915 static void disconnect_intr (cycx_t *card, TX25Cmd *cmd)
916 {
917 	wan_device_t *wandev = &card->wandev;
918 	struct net_device *dev;
919 	u8 lcn;
920 
921 	cycx_peek(&card->hw, cmd->buf, &lcn, sizeof(lcn));
922 	dprintk(1, KERN_INFO "disconnect_intr:lcn=%d\n", lcn);
923 
924 	if ((dev = get_dev_by_lcn(wandev, lcn)) != NULL) {
925 		x25_channel_t *chan = dev->priv;
926 
927 		x25_disconnect_response(card, chan->link, lcn);
928 		set_chan_state(dev, WAN_DISCONNECTED);
929 	} else
930 		x25_disconnect_response(card, 0, lcn);
931 }
932 
933 /* LOG interrupt handler. */
log_intr(cycx_t * card,TX25Cmd * cmd)934 static void log_intr (cycx_t *card, TX25Cmd *cmd)
935 {
936 #if CYCLOMX_X25_DEBUG
937 	char bf[20];
938 	u16 size, toread, link, msg_code;
939 	u8 code, routine;
940 
941 	cycx_peek(&card->hw, cmd->buf, &msg_code, sizeof(msg_code));
942 	cycx_peek(&card->hw, cmd->buf + 2, &link, sizeof(link));
943 	cycx_peek(&card->hw, cmd->buf + 4, &size, sizeof(size));
944 	/* at most 20 bytes are available... thanks to Daniela :) */
945 	toread = size < 20 ? size : 20;
946 	cycx_peek(&card->hw, cmd->buf + 10, &bf, toread);
947 	cycx_peek(&card->hw, cmd->buf + 10 + toread, &code, 1);
948 	cycx_peek(&card->hw, cmd->buf + 10 + toread + 1, &routine, 1);
949 
950 	printk(KERN_INFO "cyx_isr: X25_LOG (0x4500) indic.:\n");
951 	printk(KERN_INFO "cmd->buf=0x%X\n", cmd->buf);
952 	printk(KERN_INFO "Log message code=0x%X\n", msg_code);
953 	printk(KERN_INFO "Link=%d\n", link);
954 	printk(KERN_INFO "log code=0x%X\n", code);
955 	printk(KERN_INFO "log routine=0x%X\n", routine);
956 	printk(KERN_INFO "Message size=%d\n", size);
957 	hex_dump("Message", bf, toread);
958 #endif
959 }
960 
961 /* STATISTIC interrupt handler. */
stat_intr(cycx_t * card,TX25Cmd * cmd)962 static void stat_intr (cycx_t *card, TX25Cmd *cmd)
963 {
964 	cycx_peek(&card->hw, cmd->buf, &card->u.x.stats,
965 		  sizeof(card->u.x.stats));
966 	hex_dump("stat_intr", (unsigned char*)&card->u.x.stats,
967 		 sizeof(card->u.x.stats));
968 	x25_dump_stats(&card->u.x.stats);
969 	wake_up_interruptible(&card->wait_stats);
970 }
971 
972 /* Spurious interrupt handler.
973  * o print a warning
974  * If number of spurious interrupts exceeded some limit, then ??? */
spur_intr(cycx_t * card,TX25Cmd * cmd)975 static void spur_intr (cycx_t *card, TX25Cmd *cmd)
976 {
977 	printk(KERN_INFO "%s: spurious interrupt (0x%X)!\n",
978 			 card->devname, cmd->command);
979 }
980 #ifdef CYCLOMX_X25_DEBUG
hex_dump(char * msg,unsigned char * p,int len)981 static void hex_dump(char *msg, unsigned char *p, int len)
982 {
983 	unsigned char hex[1024],
984 	    	* phex = hex;
985 
986 	if (len >= (sizeof(hex) / 2))
987 		len = (sizeof(hex) / 2) - 1;
988 
989 	while (len--) {
990 		sprintf(phex, "%02x", *p++);
991 		phex += 2;
992 	}
993 
994 	printk(KERN_INFO "%s: %s\n", msg, hex);
995 }
996 #endif
997 
998 /* Cyclom 2X Firmware-Specific Functions */
999 /* Exec X.25 command. */
x25_exec(cycx_t * card,int command,int link,void * d1,int len1,void * d2,int len2)1000 static int x25_exec (cycx_t *card, int command, int link,
1001 		     void *d1, int len1, void *d2, int len2)
1002 {
1003 	TX25Cmd c;
1004 	unsigned long flags;
1005 	u32 addr = 0x1200 + 0x2E0 * link + 0x1E2;
1006 	u8 retry = MAX_CMD_RETRY;
1007 	int err = 0;
1008 
1009 	c.command = command;
1010 	c.link = link;
1011 	c.len = len1 + len2;
1012 
1013 	spin_lock_irqsave(&card->u.x.lock, flags);
1014 
1015 	/* write command */
1016 	cycx_poke(&card->hw, X25_MBOX_OFFS, &c, sizeof(c) - sizeof(c.buf));
1017 
1018 	/* write X.25 data */
1019 	if (d1) {
1020 		cycx_poke(&card->hw, addr, d1, len1);
1021 
1022 		if (d2) {
1023 			if (len2 > 254) {
1024 				u32 addr1 = 0xA00 + 0x400 * link;
1025 
1026 				cycx_poke(&card->hw, addr + len1, d2, 249);
1027 				cycx_poke(&card->hw, addr1, ((u8*)d2) + 249,
1028 					  len2 - 249);
1029 			} else
1030 				cycx_poke(&card->hw, addr + len1, d2, len2);
1031 		}
1032 	}
1033 
1034 	/* generate interruption, executing command */
1035 	cycx_intr(&card->hw);
1036 
1037 	/* wait till card->mbox == 0 */
1038 	do {
1039 		err = cycx_exec(card->mbox);
1040 	} while (retry-- && err);
1041 
1042 	spin_unlock_irqrestore(&card->u.x.lock, flags);
1043 
1044 	return err;
1045 }
1046 
1047 /* Configure adapter. */
x25_configure(cycx_t * card,TX25Config * conf)1048 static int x25_configure (cycx_t *card, TX25Config *conf)
1049 {
1050 	struct {
1051 		u16 nlinks;
1052 		TX25Config conf[2];
1053 	} x25_cmd_conf;
1054 
1055 	memset (&x25_cmd_conf, 0, sizeof(x25_cmd_conf));
1056 	x25_cmd_conf.nlinks = 2;
1057 	x25_cmd_conf.conf[0] = *conf;
1058 	/* FIXME: we need to find a way in the wanrouter framework
1059 		  to configure the second link, for now lets use it
1060 		  with the same config from the first link, fixing
1061 		  the interface type to RS232, the speed in 38400 and
1062 		  the clock to external */
1063 	x25_cmd_conf.conf[1] = *conf;
1064 	x25_cmd_conf.conf[1].link = 1;
1065 	x25_cmd_conf.conf[1].speed = 5; /* 38400 */
1066 	x25_cmd_conf.conf[1].clock = 8;
1067 	x25_cmd_conf.conf[1].flags = 0; /* default = RS232 */
1068 
1069 	x25_dump_config(&x25_cmd_conf.conf[0]);
1070 	x25_dump_config(&x25_cmd_conf.conf[1]);
1071 
1072 	return x25_exec(card, X25_CONFIG, 0,
1073 			&x25_cmd_conf, sizeof(x25_cmd_conf), NULL, 0);
1074 }
1075 
1076 /* Get protocol statistics. */
x25_get_stats(cycx_t * card)1077 static int x25_get_stats (cycx_t *card)
1078 {
1079 	/* the firmware expects 20 in the size field!!!
1080 	   thanks to Daniela */
1081 	int err = x25_exec(card, X25_STATISTIC, 0, NULL, 20, NULL, 0);
1082 
1083 	if (err)
1084 		return err;
1085 
1086 	interruptible_sleep_on(&card->wait_stats);
1087 
1088 	if (signal_pending(current))
1089 		return -EINTR;
1090 
1091 	card->wandev.stats.rx_packets = card->u.x.stats.n2_rx_frames;
1092 	card->wandev.stats.rx_over_errors = card->u.x.stats.rx_over_errors;
1093 	card->wandev.stats.rx_crc_errors = card->u.x.stats.rx_crc_errors;
1094 	card->wandev.stats.rx_length_errors = 0; /* not available from fw */
1095 	card->wandev.stats.rx_frame_errors = 0; /* not available from fw */
1096 	card->wandev.stats.rx_missed_errors = card->u.x.stats.rx_aborts;
1097 	card->wandev.stats.rx_dropped = 0; /* not available from fw */
1098 	card->wandev.stats.rx_errors = 0; /* not available from fw */
1099 	card->wandev.stats.tx_packets = card->u.x.stats.n2_tx_frames;
1100 	card->wandev.stats.tx_aborted_errors = card->u.x.stats.tx_aborts;
1101 	card->wandev.stats.tx_dropped = 0; /* not available from fw */
1102 	card->wandev.stats.collisions = 0; /* not available from fw */
1103 	card->wandev.stats.tx_errors = 0; /* not available from fw */
1104 
1105 	x25_dump_devs(&card->wandev);
1106 
1107 	return 0;
1108 }
1109 
1110 /* return the number of nibbles */
byte_to_nibble(u8 * s,u8 * d,char * nibble)1111 static int byte_to_nibble(u8 *s, u8 *d, char *nibble)
1112 {
1113         int i = 0;
1114 
1115         if (*nibble && *s) {
1116                 d[i] |= *s++ - '0';
1117                 *nibble = 0;
1118                 ++i;
1119         }
1120 
1121         while (*s) {
1122                 d[i] = (*s - '0') << 4;
1123                 if (*(s + 1))
1124 			d[i] |= *(s + 1) - '0';
1125                 else {
1126                         *nibble = 1;
1127                         break;
1128                 }
1129                 ++i;
1130                 s += 2;
1131         }
1132 
1133         return i;
1134 }
1135 
nibble_to_byte(u8 * s,u8 * d,u8 len,u8 nibble)1136 static void nibble_to_byte(u8 *s, u8 *d, u8 len, u8 nibble)
1137 {
1138 	if (nibble) {
1139 		*d++ = '0' + (*s++ & 0x0F);
1140 		--len;
1141 	}
1142 
1143 	while (len) {
1144 		*d++ = '0' + (*s >> 4);
1145 
1146 		if (--len) {
1147 			*d++ = '0' + (*s & 0x0F);
1148 			--len;
1149 		} else break;
1150 
1151 		++s;
1152 	}
1153 
1154 	*d = '\0';
1155 }
1156 
1157 /* Place X.25 call. */
x25_place_call(cycx_t * card,x25_channel_t * chan)1158 static int x25_place_call (cycx_t *card, x25_channel_t *chan)
1159 {
1160 	int err = 0,
1161 	    len;
1162 	char d[64],
1163 	     nibble = 0,
1164 	     mylen = chan->local_addr ? strlen(chan->local_addr) : 0,
1165 	     remotelen = strlen(chan->addr);
1166 	u8 key;
1167 
1168 	if (card->u.x.connection_keys == ~0UL) {
1169 		printk(KERN_INFO "%s: too many simultaneous connection "
1170 				 "requests!\n", card->devname);
1171 		return -EAGAIN;
1172 	}
1173 
1174 	key = ffz(card->u.x.connection_keys);
1175 	set_bit(key, (void*)&card->u.x.connection_keys);
1176 	++key;
1177 	dprintk(1, KERN_INFO "%s:x25_place_call:key=%d\n", card->devname, key);
1178 	memset(d, 0, sizeof(d));
1179 	d[1] = key; /* user key */
1180 	d[2] = 0x10;
1181 	d[4] = 0x0B;
1182 
1183 	len = byte_to_nibble(chan->addr, d + 6, &nibble);
1184 
1185 	if (chan->local_addr)
1186 		len += byte_to_nibble(chan->local_addr, d + 6 + len, &nibble);
1187 
1188 	if (nibble)
1189 		++len;
1190 
1191 	d[5] = mylen << 4 | remotelen;
1192 	d[6 + len + 1] = 0xCC; /* TCP/IP over X.25, thanks to Daniela :) */
1193 
1194 	if ((err = x25_exec(card, X25_CONNECT_REQUEST, chan->link,
1195 			    &d, 7 + len + 1, NULL, 0)) != 0)
1196 		clear_bit(--key, (void*)&card->u.x.connection_keys);
1197 	else
1198                 chan->lcn = -key;
1199 
1200         return err;
1201 }
1202 
1203 /* Place X.25 CONNECT RESPONSE. */
x25_connect_response(cycx_t * card,x25_channel_t * chan)1204 static int x25_connect_response (cycx_t *card, x25_channel_t *chan)
1205 {
1206 	u8 d[8];
1207 
1208 	memset(d, 0, sizeof(d));
1209 	d[0] = d[3] = chan->lcn;
1210 	d[2] = 0x10;
1211 	d[4] = 0x0F;
1212 	d[7] = 0xCC; /* TCP/IP over X.25, thanks Daniela */
1213 
1214 	return x25_exec(card, X25_CONNECT_RESPONSE, chan->link, &d, 8, NULL, 0);
1215 }
1216 
1217 /* Place X.25 DISCONNECT RESPONSE.  */
x25_disconnect_response(cycx_t * card,u8 link,u8 lcn)1218 static int x25_disconnect_response (cycx_t *card, u8 link, u8 lcn)
1219 {
1220 	char d[5];
1221 
1222 	memset(d, 0, sizeof(d));
1223 	d[0] = d[3] = lcn;
1224 	d[2] = 0x10;
1225 	d[4] = 0x17;
1226 
1227 	return x25_exec(card, X25_DISCONNECT_RESPONSE, link, &d, 5, NULL, 0);
1228 }
1229 
1230 /* Clear X.25 call.  */
x25_clear_call(cycx_t * card,u8 link,u8 lcn,u8 cause,u8 diagn)1231 static int x25_clear_call (cycx_t *card, u8 link, u8 lcn, u8 cause, u8 diagn)
1232 {
1233 	u8 d[7];
1234 
1235 	memset(d, 0, sizeof(d));
1236 	d[0] = d[3] = lcn;
1237 	d[2] = 0x10;
1238 	d[4] = 0x13;
1239 	d[5] = cause;
1240 	d[6] = diagn;
1241 
1242 	return x25_exec(card, X25_DISCONNECT_REQUEST, link, d, 7, NULL, 0);
1243 }
1244 
1245 /* Send X.25 data packet. */
x25_send(cycx_t * card,u8 link,u8 lcn,u8 bitm,int len,void * buf)1246 static int x25_send (cycx_t *card, u8 link, u8 lcn, u8 bitm, int len, void *buf)
1247 {
1248 	u8 d[] = "?\xFF\x10??";
1249 
1250 	d[0] = d[3] = lcn;
1251 	d[4] = bitm;
1252 
1253 	return x25_exec(card, X25_DATA_REQUEST, link, &d, 5, buf, len);
1254 }
1255 
1256 /* Miscellaneous */
1257 /* Find network device by its channel number.  */
get_dev_by_lcn(wan_device_t * wandev,s16 lcn)1258 static struct net_device *get_dev_by_lcn (wan_device_t *wandev, s16 lcn)
1259 {
1260 	struct net_device *dev = wandev->dev;
1261 	x25_channel_t *chan;
1262 
1263 	while (dev) {
1264 		chan = (x25_channel_t*)dev->priv;
1265 
1266 		if (chan->lcn == lcn)
1267 			break;
1268 		dev = chan->slave;
1269 	}
1270 	return dev;
1271 }
1272 
1273 /* Find network device by its remote dte address. */
get_dev_by_dte_addr(wan_device_t * wandev,char * dte)1274 static struct net_device *get_dev_by_dte_addr (wan_device_t *wandev, char *dte)
1275 {
1276 	struct net_device *dev = wandev->dev;
1277 	x25_channel_t *chan;
1278 
1279 	while (dev) {
1280 		chan = (x25_channel_t*)dev->priv;
1281 
1282 		if (!strcmp(chan->addr, dte))
1283 			break;
1284 		dev = chan->slave;
1285 	}
1286 	return dev;
1287 }
1288 
1289 /* Initiate connection on the logical channel.
1290  * o for PVC we just get channel configuration
1291  * o for SVCs place an X.25 call
1292  *
1293  * Return:	0	connected
1294  *		>0	connection in progress
1295  *		<0	failure */
chan_connect(struct net_device * dev)1296 static int chan_connect (struct net_device *dev)
1297 {
1298 	x25_channel_t *chan = dev->priv;
1299 	cycx_t *card = chan->card;
1300 
1301 	if (chan->svc) {
1302                 if (!chan->addr[0])
1303 			return -EINVAL; /* no destination address */
1304 
1305                 dprintk(1, KERN_INFO "%s: placing X.25 call to %s...\n",
1306 				  card->devname, chan->addr);
1307 
1308                 if (x25_place_call(card, chan))
1309 			return -EIO;
1310 
1311                 set_chan_state(dev, WAN_CONNECTING);
1312                 return 1;
1313         } else
1314 		set_chan_state(dev, WAN_CONNECTED);
1315 
1316 	return 0;
1317 }
1318 
1319 /* Disconnect logical channel.
1320  * o if SVC then clear X.25 call */
chan_disconnect(struct net_device * dev)1321 static void chan_disconnect (struct net_device *dev)
1322 {
1323 	x25_channel_t *chan = dev->priv;
1324 
1325 	if (chan->svc) {
1326 		x25_clear_call(chan->card, chan->link, chan->lcn, 0, 0);
1327 		set_chan_state(dev, WAN_DISCONNECTING);
1328 	} else
1329 		set_chan_state(dev, WAN_DISCONNECTED);
1330 }
1331 
1332 /* Called by kernel timer */
chan_timer(unsigned long d)1333 static void chan_timer (unsigned long d)
1334 {
1335 	struct net_device *dev = (struct net_device *)d;
1336 	x25_channel_t *chan = dev->priv;
1337 
1338 	if (chan->state == WAN_CONNECTED)
1339 		chan_disconnect(dev);
1340 	else
1341 		printk(KERN_ERR "%s: chan_timer for svc (%s) not connected!\n",
1342 				chan->card->devname, dev->name);
1343 }
1344 
1345 /* Set logical channel state. */
set_chan_state(struct net_device * dev,u8 state)1346 static void set_chan_state (struct net_device *dev, u8 state)
1347 {
1348 	x25_channel_t *chan = dev->priv;
1349 	cycx_t *card = chan->card;
1350 	long flags;
1351 	char *string_state = NULL;
1352 
1353 	spin_lock_irqsave(&card->lock, flags);
1354 
1355 	if (chan->state != state) {
1356 		if (chan->svc && chan->state == WAN_CONNECTED)
1357 			del_timer(&chan->timer);
1358 
1359 		switch (state) {
1360 			case WAN_CONNECTED:
1361 				string_state = "connected!";
1362 				*(u16*)dev->dev_addr = htons(chan->lcn);
1363 				netif_wake_queue(dev);
1364 				reset_timer(dev);
1365 
1366 				if (chan->protocol == ETH_P_X25)
1367 					chan_x25_send_event(dev, 1);
1368 
1369 				break;
1370 
1371 			case WAN_CONNECTING:
1372 				string_state = "connecting...";
1373 				break;
1374 
1375 			case WAN_DISCONNECTING:
1376 				string_state = "disconnecting...";
1377 				break;
1378 
1379 			case WAN_DISCONNECTED:
1380 				string_state = "disconnected!";
1381 
1382 				if (chan->svc) {
1383 					*(unsigned short*)dev->dev_addr = 0;
1384 					chan->lcn = 0;
1385                                 }
1386 
1387 				if (chan->protocol == ETH_P_X25)
1388 					chan_x25_send_event(dev, 2);
1389 
1390 				netif_wake_queue(dev);
1391 				break;
1392 		}
1393 
1394 		printk (KERN_INFO "%s: interface %s %s\n", card->devname,
1395 				  dev->name, string_state);
1396 		chan->state = state;
1397 	}
1398 
1399 	spin_unlock_irqrestore(&card->lock, flags);
1400 }
1401 
1402 /* Send packet on a logical channel.
1403  *	When this function is called, tx_skb field of the channel data space
1404  *	points to the transmit socket buffer.  When transmission is complete,
1405  *	release socket buffer and reset 'tbusy' flag.
1406  *
1407  * Return:	0	- transmission complete
1408  *		1	- busy
1409  *
1410  * Notes:
1411  * 1. If packet length is greater than MTU for this channel, we'll fragment
1412  *    the packet into 'complete sequence' using M-bit.
1413  * 2. When transmission is complete, an event notification should be issued
1414  *    to the router.  */
chan_send(struct net_device * dev,struct sk_buff * skb)1415 static int chan_send (struct net_device *dev, struct sk_buff *skb)
1416 {
1417 	x25_channel_t *chan = dev->priv;
1418 	cycx_t *card = chan->card;
1419 	int bitm = 0;		/* final packet */
1420 	unsigned len = skb->len;
1421 
1422 	if (skb->len > card->wandev.mtu) {
1423 		len = card->wandev.mtu;
1424 		bitm = 0x10;		/* set M-bit (more data) */
1425 	}
1426 
1427 	if (x25_send(card, chan->link, chan->lcn, bitm, len, skb->data))
1428 		return 1;
1429 
1430 	if (bitm) {
1431 		skb_pull(skb, len);
1432 		return 1;
1433 	}
1434 
1435 	++chan->ifstats.tx_packets;
1436 	chan->ifstats.tx_bytes += len;
1437 
1438 	return 0;
1439 }
1440 
1441 /* Send event (connection, disconnection, etc) to X.25 socket layer */
1442 
chan_x25_send_event(struct net_device * dev,u8 event)1443 static void chan_x25_send_event(struct net_device *dev, u8 event)
1444 {
1445         struct sk_buff *skb;
1446         unsigned char *ptr;
1447 
1448         if ((skb = dev_alloc_skb(1)) == NULL) {
1449                 printk(KERN_ERR "%s: out of memory\n", __FUNCTION__);
1450                 return;
1451         }
1452 
1453         ptr  = skb_put(skb, 1);
1454         *ptr = event;
1455 
1456         skb->dev = dev;
1457         skb->protocol = htons(ETH_P_X25);
1458         skb->mac.raw = skb->data;
1459         skb->pkt_type = PACKET_HOST;
1460 
1461         netif_rx(skb);
1462 	dev->last_rx = jiffies;		/* timestamp */
1463 }
1464 
1465 /* Convert line speed in bps to a number used by cyclom 2x code. */
bps_to_speed_code(u32 bps)1466 static u8 bps_to_speed_code (u32 bps)
1467 {
1468 	u8 number = 0; /* defaults to the lowest (1200) speed ;> */
1469 
1470 	     if (bps >= 512000) number = 8;
1471 	else if (bps >= 256000) number = 7;
1472 	else if (bps >= 64000)  number = 6;
1473 	else if (bps >= 38400)  number = 5;
1474 	else if (bps >= 19200)  number = 4;
1475 	else if (bps >= 9600)   number = 3;
1476 	else if (bps >= 4800)   number = 2;
1477 	else if (bps >= 2400)   number = 1;
1478 
1479 	return number;
1480 }
1481 
1482 /* log base 2 */
log2(u32 n)1483 static u8 log2 (u32 n)
1484 {
1485         u8 log = 0;
1486 
1487         if (!n)
1488 		return 0;
1489 
1490         while (n > 1) {
1491                 n >>= 1;
1492                 ++log;
1493         }
1494 
1495         return log;
1496 }
1497 
1498 /* Convert decimal string to unsigned integer.
1499  * If len != 0 then only 'len' characters of the string are converted. */
dec_to_uint(u8 * str,int len)1500 static unsigned dec_to_uint (u8 *str, int len)
1501 {
1502 	unsigned val = 0;
1503 
1504 	if (!len)
1505 		len = strlen(str);
1506 
1507 	for (; len && is_digit(*str); ++str, --len)
1508 		val = (val * 10) + (*str - (unsigned) '0');
1509 
1510 	return val;
1511 }
1512 
reset_timer(struct net_device * dev)1513 static void reset_timer(struct net_device *dev)
1514 {
1515 	x25_channel_t *chan = dev->priv;
1516 
1517 	if (chan->svc)
1518 		mod_timer(&chan->timer, jiffies+chan->idle_tmout*HZ);
1519 }
1520 #ifdef CYCLOMX_X25_DEBUG
x25_dump_config(TX25Config * conf)1521 static void x25_dump_config(TX25Config *conf)
1522 {
1523 	printk(KERN_INFO "X.25 configuration\n");
1524 	printk(KERN_INFO "-----------------\n");
1525 	printk(KERN_INFO "link number=%d\n", conf->link);
1526 	printk(KERN_INFO "line speed=%d\n", conf->speed);
1527 	printk(KERN_INFO "clock=%sternal\n", conf->clock == 8 ? "Ex" : "In");
1528 	printk(KERN_INFO "# level 2 retransm.=%d\n", conf->n2);
1529 	printk(KERN_INFO "level 2 window=%d\n", conf->n2win);
1530 	printk(KERN_INFO "level 3 window=%d\n", conf->n3win);
1531 	printk(KERN_INFO "# logical channels=%d\n", conf->nvc);
1532 	printk(KERN_INFO "level 3 pkt len=%d\n", conf->pktlen);
1533 	printk(KERN_INFO "my address=%d\n", conf->locaddr);
1534 	printk(KERN_INFO "remote address=%d\n", conf->remaddr);
1535 	printk(KERN_INFO "t1=%d seconds\n", conf->t1);
1536 	printk(KERN_INFO "t2=%d seconds\n", conf->t2);
1537 	printk(KERN_INFO "t21=%d seconds\n", conf->t21);
1538 	printk(KERN_INFO "# PVCs=%d\n", conf->npvc);
1539 	printk(KERN_INFO "t23=%d seconds\n", conf->t23);
1540 	printk(KERN_INFO "flags=0x%x\n", conf->flags);
1541 }
1542 
x25_dump_stats(TX25Stats * stats)1543 static void x25_dump_stats(TX25Stats *stats)
1544 {
1545 	printk(KERN_INFO "X.25 statistics\n");
1546 	printk(KERN_INFO "--------------\n");
1547 	printk(KERN_INFO "rx_crc_errors=%d\n", stats->rx_crc_errors);
1548 	printk(KERN_INFO "rx_over_errors=%d\n", stats->rx_over_errors);
1549 	printk(KERN_INFO "n2_tx_frames=%d\n", stats->n2_tx_frames);
1550 	printk(KERN_INFO "n2_rx_frames=%d\n", stats->n2_rx_frames);
1551 	printk(KERN_INFO "tx_timeouts=%d\n", stats->tx_timeouts);
1552 	printk(KERN_INFO "rx_timeouts=%d\n", stats->rx_timeouts);
1553 	printk(KERN_INFO "n3_tx_packets=%d\n", stats->n3_tx_packets);
1554 	printk(KERN_INFO "n3_rx_packets=%d\n", stats->n3_rx_packets);
1555 	printk(KERN_INFO "tx_aborts=%d\n", stats->tx_aborts);
1556 	printk(KERN_INFO "rx_aborts=%d\n", stats->rx_aborts);
1557 }
1558 
x25_dump_devs(wan_device_t * wandev)1559 static void x25_dump_devs(wan_device_t *wandev)
1560 {
1561 	struct net_device *dev = wandev->dev;
1562 
1563 	printk(KERN_INFO "X.25 dev states\n");
1564 	printk(KERN_INFO "name: addr:           txoff:  protocol:\n");
1565 	printk(KERN_INFO "---------------------------------------\n");
1566 
1567 	while(dev) {
1568 		x25_channel_t *chan = dev->priv;
1569 
1570 		printk(KERN_INFO "%-5.5s %-15.15s   %d     ETH_P_%s\n",
1571 				 chan->name, chan->addr, netif_queue_stopped(dev),
1572 				 chan->protocol == ETH_P_IP ? "IP" : "X25");
1573 		dev = chan->slave;
1574 	}
1575 }
1576 
1577 #endif /* CYCLOMX_X25_DEBUG */
1578 /* End */
1579