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