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