1 /* Copyright (C) 2007-2008 One Stop Systems
2 * Copyright (C) 2003-2006 SBE, Inc.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
15 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
17 #include <linux/types.h>
18 #include <linux/netdevice.h>
19 #include <linux/module.h>
20 #include <linux/hdlc.h>
21 #include <linux/if_arp.h>
22 #include <linux/init.h>
23 #include <asm/uaccess.h>
24 #include <linux/rtnetlink.h>
25 #include <linux/skbuff.h>
26 #include "pmcc4_sysdep.h"
27 #include "sbecom_inline_linux.h"
30 #include "pmcc4_ioctls.h"
31 #include "pmcc4_private.h"
34 /*******************************************************************************
35 * Error out early if we have compiler trouble.
37 * (This section is included from the kernel's init/main.c as a friendly
38 * spiderman recommendation...)
40 * Versions of gcc older than that listed below may actually compile and link
41 * okay, but the end product can have subtle run time bugs. To avoid associated
42 * bogus bug reports, we flatly refuse to compile with a gcc that is known to be
43 * too old from the very beginning.
45 #if (__GNUC__ < 3) || (__GNUC__ == 3 && __GNUC_MINOR__ < 2)
46 #error Sorry, your GCC is too old. It builds incorrect kernels.
49 #if __GNUC__ == 4 && __GNUC_MINOR__ == 1 && __GNUC_PATCHLEVEL__ == 0
50 #warning gcc-4.1.0 is known to miscompile the kernel. A different compiler version is recommended.
53 /*******************************************************************************/
55 #define CHANNAME "hdlc"
57 /*******************************************************************/
58 /* forward references */
59 status_t c4_chan_work_init(mpi_t *, mch_t *);
60 void musycc_wq_chan_restart(void *);
61 status_t __init c4_init(ci_t *, u_char *, u_char *);
62 status_t __init c4_init2(ci_t *);
63 ci_t *__init c4_new(void *);
64 int __init c4hw_attach_all(void);
65 void __init hdw_sn_get(hdw_info_t *, int);
67 #ifdef CONFIG_SBE_PMCC4_NCOMM
68 irqreturn_t c4_ebus_intr_th_handler(void *);
71 int c4_frame_rw(ci_t *, struct sbecom_port_param *);
72 status_t c4_get_port(ci_t *, int);
73 int c4_loop_port(ci_t *, int, u_int8_t);
74 int c4_musycc_rw(ci_t *, struct c4_musycc_param *);
75 int c4_new_chan(ci_t *, int, int, void *);
76 status_t c4_set_port(ci_t *, int);
77 int c4_pld_rw(ci_t *, struct sbecom_port_param *);
78 void cleanup_devs(void);
79 void cleanup_ioremap(void);
80 status_t musycc_chan_down(ci_t *, int);
81 irqreturn_t musycc_intr_th_handler(void *);
82 int musycc_start_xmit(ci_t *, int, void *);
85 extern struct s_hdw_info hdw_info[];
87 #if defined(CONFIG_SBE_HDLC_V7) || defined(CONFIG_SBE_WAN256T3_HDLC_V7) || \
88 defined(CONFIG_SBE_HDLC_V7_MODULE) || defined(CONFIG_SBE_WAN256T3_HDLC_V7_MODULE)
95 #define V7(x) (x ## _v7)
96 extern int hdlc_netif_rx_v7(hdlc_device *, struct sk_buff *);
97 extern int register_hdlc_device_v7(hdlc_device *);
98 extern int unregister_hdlc_device_v7(hdlc_device *);
104 int error_flag; /* module load error reporting */
105 int cxt1e1_log_level = LOG_ERROR;
106 int log_level_default = LOG_ERROR;
107 module_param(cxt1e1_log_level, int, 0444);
109 int cxt1e1_max_mru = MUSYCC_MRU;
110 int max_mru_default = MUSYCC_MRU;
111 module_param(cxt1e1_max_mru, int, 0444);
113 int cxt1e1_max_mtu = MUSYCC_MTU;
114 int max_mtu_default = MUSYCC_MTU;
115 module_param(cxt1e1_max_mtu, int, 0444);
117 int max_txdesc_used = MUSYCC_TXDESC_MIN;
118 int max_txdesc_default = MUSYCC_TXDESC_MIN;
119 module_param(max_txdesc_used, int, 0444);
121 int max_rxdesc_used = MUSYCC_RXDESC_MIN;
122 int max_rxdesc_default = MUSYCC_RXDESC_MIN;
123 module_param(max_rxdesc_used, int, 0444);
125 /****************************************************************************/
126 /****************************************************************************/
127 /****************************************************************************/
130 getuserbychan(int channum)
134 ch = c4_find_chan(channum);
135 return ch ? ch->user : NULL;
140 get_hdlc_name(hdlc_device *hdlc)
142 struct c4_priv *priv = hdlc->priv;
143 struct net_device *dev = getuserbychan(priv->channum);
158 /***************************************************************************/
159 #include <linux/workqueue.h>
162 * One workqueue (wq) per port (since musycc allows simultaneous group
163 * commands), with individual data for each channel:
165 * mpi_t -> struct workqueue_struct *wq_port; (dynamically allocated using
166 * create_workqueue())
168 * With work structure (work) statically allocated for each channel:
170 * mch_t -> struct work_struct ch_work; (statically allocated using ???)
176 * Called by the start transmit routine when a channel TX_ENABLE is to be
177 * issued. This queues the transmission start request among other channels
178 * within a port's group.
181 c4_wk_chan_restart(mch_t *ch)
185 #ifdef RLD_RESTART_DEBUG
186 pr_info(">> %s: queueing Port %d Chan %d, mch_t @ %p\n",
187 __func__, pi->portnum, ch->channum, ch);
190 /* create new entry w/in workqueue for this channel and let'er rip */
192 /** queue_work(struct workqueue_struct *queue,
193 ** struct work_struct *work);
195 queue_work(pi->wq_port, &ch->ch_work);
199 c4_wk_chan_init(mpi_t *pi, mch_t *ch)
202 * this will be used to restart a stopped channel
205 /** INIT_WORK(struct work_struct *work,
206 ** void (*function)(void *),
209 INIT_WORK(&ch->ch_work, (void *)musycc_wq_chan_restart);
210 return 0; /* success */
214 c4_wq_port_init(mpi_t *pi)
217 char name[16], *np; /* NOTE: name of the queue limited by system
218 * to 10 characters */
221 return 0; /* already initialized */
225 sprintf(np, "%s%d", pi->up->devname, pi->portnum); /* IE pmcc4-01) */
227 #ifdef RLD_RESTART_DEBUG
228 pr_info(">> %s: creating workqueue <%s> for Port %d.\n",
229 __func__, name, pi->portnum); /* RLD DEBUG */
231 pi->wq_port = create_singlethread_workqueue(name);
234 return 0; /* success */
238 c4_wq_port_cleanup(mpi_t *pi)
241 * PORT POINT: cannot call this if WQ is statically allocated w/in
242 * structure since it calls kfree(wq);
246 destroy_workqueue(pi->wq_port); /* this also calls
247 * flush_workqueue() */
252 /***************************************************************************/
255 c4_linux_interrupt(int irq, void *dev_instance)
257 struct net_device *ndev = dev_instance;
259 return musycc_intr_th_handler(netdev_priv(ndev));
263 #ifdef CONFIG_SBE_PMCC4_NCOMM
265 c4_ebus_interrupt(int irq, void *dev_instance)
267 struct net_device *ndev = dev_instance;
269 return c4_ebus_intr_th_handler(netdev_priv(ndev));
275 void_open(struct net_device *ndev)
277 pr_info("%s: trying to open master device !\n", ndev->name);
283 chan_open(struct net_device *ndev)
285 hdlc_device *hdlc = dev_to_hdlc(ndev);
286 const struct c4_priv *priv = hdlc->priv;
289 ret = hdlc_open(ndev);
291 pr_info("hdlc_open failure, err %d.\n", ret);
295 ret = c4_chan_up(priv->ci, priv->channum);
298 try_module_get(THIS_MODULE);
299 netif_start_queue(ndev);
300 return 0; /* no error = success */
305 chan_close(struct net_device *ndev)
307 hdlc_device *hdlc = dev_to_hdlc(ndev);
308 const struct c4_priv *priv = hdlc->priv;
310 netif_stop_queue(ndev);
311 musycc_chan_down((ci_t *) 0, priv->channum);
313 module_put(THIS_MODULE);
319 chan_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
321 return hdlc_ioctl(dev, ifr, cmd);
326 chan_attach_noop(struct net_device *ndev, unsigned short foo_1,
327 unsigned short foo_2)
329 /* our driver has nothing to do here, show's
336 static struct net_device_stats *
337 chan_get_stats(struct net_device *ndev)
340 struct net_device_stats *nstats;
341 struct sbecom_chan_stats *stats;
345 struct c4_priv *priv;
347 priv = (struct c4_priv *)dev_to_hdlc(ndev)->priv;
348 channum = priv->channum;
351 ch = c4_find_chan(channum);
355 nstats = &ndev->stats;
358 memset(nstats, 0, sizeof(struct net_device_stats));
359 nstats->rx_packets = stats->rx_packets;
360 nstats->tx_packets = stats->tx_packets;
361 nstats->rx_bytes = stats->rx_bytes;
362 nstats->tx_bytes = stats->tx_bytes;
363 nstats->rx_errors = stats->rx_length_errors +
364 stats->rx_over_errors +
365 stats->rx_crc_errors +
366 stats->rx_frame_errors +
367 stats->rx_fifo_errors +
368 stats->rx_missed_errors;
369 nstats->tx_errors = stats->tx_dropped +
370 stats->tx_aborted_errors +
371 stats->tx_fifo_errors;
372 nstats->rx_dropped = stats->rx_dropped;
373 nstats->tx_dropped = stats->tx_dropped;
375 nstats->rx_length_errors = stats->rx_length_errors;
376 nstats->rx_over_errors = stats->rx_over_errors;
377 nstats->rx_crc_errors = stats->rx_crc_errors;
378 nstats->rx_frame_errors = stats->rx_frame_errors;
379 nstats->rx_fifo_errors = stats->rx_fifo_errors;
380 nstats->rx_missed_errors = stats->rx_missed_errors;
382 nstats->tx_aborted_errors = stats->tx_aborted_errors;
383 nstats->tx_fifo_errors = stats->tx_fifo_errors;
390 get_ci_by_dev(struct net_device *ndev)
392 return (ci_t *)(netdev_priv(ndev));
397 c4_linux_xmit(struct sk_buff *skb, struct net_device *ndev)
399 const struct c4_priv *priv;
402 hdlc_device *hdlc = dev_to_hdlc(ndev);
406 rval = musycc_start_xmit(priv->ci, priv->channum, skb);
410 static const struct net_device_ops chan_ops = {
411 .ndo_open = chan_open,
412 .ndo_stop = chan_close,
413 .ndo_start_xmit = c4_linux_xmit,
414 .ndo_do_ioctl = chan_dev_ioctl,
415 .ndo_get_stats = chan_get_stats,
418 static struct net_device *
419 create_chan(struct net_device *ndev, ci_t *ci,
420 struct sbecom_chan_param *cp)
423 struct net_device *dev;
427 if (c4_find_chan(cp->channum))
428 return NULL; /* channel already exists */
431 struct c4_priv *priv;
433 /* allocate then fill in private data structure */
434 priv = OS_kmalloc(sizeof(struct c4_priv));
437 pr_warning("%s: no memory for net_device !\n",
441 dev = alloc_hdlcdev(priv);
444 pr_warning("%s: no memory for hdlc_device !\n",
450 priv->channum = cp->channum;
453 hdlc = dev_to_hdlc(dev);
455 dev->base_addr = 0; /* not I/O mapped */
456 dev->irq = ndev->irq;
457 dev->type = ARPHRD_RAWHDLC;
458 *dev->name = 0; /* default ifconfig name = "hdlc" */
460 hi = (hdw_info_t *)ci->hdw_info;
461 if (hi->mfg_info_sts == EEPROM_OK)
465 case PROM_FORMAT_TYPE1:
466 memcpy(dev->dev_addr,
467 (FLD_TYPE1 *) (hi->mfg_info.pft1.Serial), 6);
469 case PROM_FORMAT_TYPE2:
470 memcpy(dev->dev_addr,
471 (FLD_TYPE2 *) (hi->mfg_info.pft2.Serial), 6);
474 memset(dev->dev_addr, 0, 6);
479 memset(dev->dev_addr, 0, 6);
482 hdlc->xmit = c4_linux_xmit;
484 dev->netdev_ops = &chan_ops;
486 * The native hdlc stack calls this 'attach' routine during
487 * hdlc_raw_ioctl(), passing parameters for line encoding and parity.
488 * Since hdlc_raw_ioctl() stack does not interrogate whether an 'attach'
489 * routine is actually registered or not, we supply a dummy routine which
490 * does nothing (since encoding and parity are setup for our driver via a
491 * special configuration application).
494 hdlc->attach = chan_attach_noop;
496 /* needed due to Ioctl calling sequence */
498 ret = register_hdlc_device(dev);
499 /* NOTE: <stats> setting must occur AFTER registration in order to "take" */
500 dev->tx_queue_len = MAX_DEFAULT_IFQLEN;
502 /* needed due to Ioctl calling sequence */
506 if (cxt1e1_log_level >= LOG_WARN)
507 pr_info("%s: create_chan[%d] registration error = %d.\n",
508 ci->devname, cp->channum, ret);
511 /* failed to register */
518 /* the idea here is to get port information and pass it back (using pointer) */
520 do_get_port(struct net_device *ndev, void *data)
523 ci_t *ci; /* ci stands for card information */
524 struct sbecom_port_param pp;/* copy data to kernel land */
526 if (copy_from_user(&pp, data, sizeof(struct sbecom_port_param)))
528 if (pp.portnum >= MUSYCC_NPORTS)
530 ci = get_ci_by_dev(ndev);
532 return -EINVAL; /* get card info */
534 ret = mkret(c4_get_port(ci, pp.portnum));
537 if (copy_to_user(data, &ci->port[pp.portnum].p,
538 sizeof(struct sbecom_port_param)))
543 /* this function copys the user data and then calls the real action function */
545 do_set_port(struct net_device *ndev, void *data)
547 ci_t *ci; /* ci stands for card information */
548 struct sbecom_port_param pp;/* copy data to kernel land */
550 if (copy_from_user(&pp, data, sizeof(struct sbecom_port_param)))
552 if (pp.portnum >= MUSYCC_NPORTS)
554 ci = get_ci_by_dev(ndev);
556 return -EINVAL; /* get card info */
558 if (pp.portnum >= ci->max_port) /* sanity check */
561 memcpy(&ci->port[pp.portnum].p, &pp, sizeof(struct sbecom_port_param));
562 return mkret(c4_set_port(ci, pp.portnum));
565 /* work the port loopback mode as per directed */
567 do_port_loop(struct net_device *ndev, void *data)
569 struct sbecom_port_param pp;
572 if (copy_from_user(&pp, data, sizeof(struct sbecom_port_param)))
574 ci = get_ci_by_dev(ndev);
577 return mkret(c4_loop_port(ci, pp.portnum, pp.port_mode));
580 /* set the specified register with the given value / or just read it */
582 do_framer_rw(struct net_device *ndev, void *data)
584 struct sbecom_port_param pp;
588 if (copy_from_user(&pp, data, sizeof(struct sbecom_port_param)))
590 ci = get_ci_by_dev(ndev);
593 ret = mkret(c4_frame_rw(ci, &pp));
596 if (copy_to_user(data, &pp, sizeof(struct sbecom_port_param)))
601 /* set the specified register with the given value / or just read it */
603 do_pld_rw(struct net_device *ndev, void *data)
605 struct sbecom_port_param pp;
609 if (copy_from_user(&pp, data, sizeof(struct sbecom_port_param)))
611 ci = get_ci_by_dev(ndev);
614 ret = mkret(c4_pld_rw(ci, &pp));
617 if (copy_to_user(data, &pp, sizeof(struct sbecom_port_param)))
622 /* set the specified register with the given value / or just read it */
624 do_musycc_rw(struct net_device *ndev, void *data)
626 struct c4_musycc_param mp;
630 if (copy_from_user(&mp, data, sizeof(struct c4_musycc_param)))
632 ci = get_ci_by_dev(ndev);
635 ret = mkret(c4_musycc_rw(ci, &mp));
638 if (copy_to_user(data, &mp, sizeof(struct c4_musycc_param)))
644 do_get_chan(struct net_device *ndev, void *data)
646 struct sbecom_chan_param cp;
649 if (copy_from_user(&cp, data,
650 sizeof(struct sbecom_chan_param)))
653 ret = mkret(c4_get_chan(cp.channum, &cp));
657 if (copy_to_user(data, &cp, sizeof(struct sbecom_chan_param)))
663 do_set_chan(struct net_device *ndev, void *data)
665 struct sbecom_chan_param cp;
669 if (copy_from_user(&cp, data, sizeof(struct sbecom_chan_param)))
671 ci = get_ci_by_dev(ndev);
674 switch (ret = mkret(c4_set_chan(cp.channum, &cp)))
684 do_create_chan(struct net_device *ndev, void *data)
687 struct net_device *dev;
688 struct sbecom_chan_param cp;
691 if (copy_from_user(&cp, data, sizeof(struct sbecom_chan_param)))
693 ci = get_ci_by_dev(ndev);
696 dev = create_chan(ndev, ci, &cp);
699 ret = mkret(c4_new_chan(ci, cp.port, cp.channum, dev));
702 /* needed due to Ioctl calling sequence */
704 unregister_hdlc_device(dev);
705 /* needed due to Ioctl calling sequence */
713 do_get_chan_stats(struct net_device *ndev, void *data)
715 struct c4_chan_stats_wrap ccs;
718 if (copy_from_user(&ccs, data,
719 sizeof(struct c4_chan_stats_wrap)))
721 switch (ret = mkret(c4_get_chan_stats(ccs.channum, &ccs.stats)))
728 if (copy_to_user(data, &ccs,
729 sizeof(struct c4_chan_stats_wrap)))
734 do_set_loglevel(struct net_device *ndev, void *data)
736 unsigned int cxt1e1_log_level;
738 if (copy_from_user(&cxt1e1_log_level, data, sizeof(int)))
740 sbecom_set_loglevel(cxt1e1_log_level);
745 do_deluser(struct net_device *ndev, int lockit)
747 if (ndev->flags & IFF_UP)
753 const struct c4_priv *priv;
756 priv = (struct c4_priv *)dev_to_hdlc(ndev)->priv;
758 channum = priv->channum;
760 ch = c4_find_chan(channum);
763 ch->user = NULL; /* will be freed, below */
766 /* needed if Ioctl calling sequence */
769 unregister_hdlc_device(ndev);
770 /* needed if Ioctl calling sequence */
778 do_del_chan(struct net_device *musycc_dev, void *data)
780 struct sbecom_chan_param cp;
781 char buf[sizeof(CHANNAME) + 3];
782 struct net_device *dev;
785 if (copy_from_user(&cp, data,
786 sizeof(struct sbecom_chan_param)))
788 if (cp.channum > 999)
790 snprintf(buf, sizeof(buf), CHANNAME "%d", cp.channum);
791 dev = __dev_get_by_name(&init_net, buf);
794 ret = do_deluser(dev, 1);
797 return c4_del_chan(cp.channum);
799 int c4_reset_board(void *);
802 do_reset(struct net_device *musycc_dev, void *data)
804 const struct c4_priv *priv;
807 for (i = 0; i < 128; i++)
809 struct net_device *ndev;
810 char buf[sizeof(CHANNAME) + 3];
812 sprintf(buf, CHANNAME "%d", i);
813 ndev = __dev_get_by_name(&init_net, buf);
816 priv = dev_to_hdlc(ndev)->priv;
818 if ((unsigned long) (priv->ci) ==
819 (unsigned long) (netdev_priv(musycc_dev)))
821 ndev->flags &= ~IFF_UP;
822 netif_stop_queue(ndev);
830 do_reset_chan_stats(struct net_device *musycc_dev, void *data)
832 struct sbecom_chan_param cp;
834 if (copy_from_user(&cp, data,
835 sizeof(struct sbecom_chan_param)))
837 return mkret(c4_del_chan_stats(cp.channum));
841 c4_ioctl(struct net_device *ndev, struct ifreq *ifr, int cmd)
853 struct sbe_brd_info bip;
854 struct sbe_drv_info dip;
855 struct sbe_iid_info iip;
856 struct sbe_brd_addr bap;
857 struct sbecom_chan_stats stats;
858 struct sbecom_chan_param param;
859 struct temux_card_stats cards;
860 struct sbecom_card_param cardp;
861 struct sbecom_framer_param frp;
866 if (!capable(CAP_SYS_ADMIN))
868 if (cmd != SIOCDEVPRIVATE + 15)
870 ci = get_ci_by_dev(ndev);
873 if (ci->state != C_RUNNING)
875 if (copy_from_user(&iocmd, ifr->ifr_data, sizeof(iocmd)))
878 if (copy_from_user(&len, ifr->ifr_data + sizeof(iocmd), sizeof(len)))
883 pr_info("c4_ioctl: iocmd %x, dir %x type %x nr %x iolen %d.\n", iocmd,
884 _IOC_DIR(iocmd), _IOC_TYPE(iocmd), _IOC_NR(iocmd),
887 iolen = _IOC_SIZE(iocmd);
888 data = ifr->ifr_data + sizeof(iocmd);
889 if (copy_from_user(&arg, data, iolen))
895 case SBE_IOC_PORT_GET:
896 //pr_info(">> SBE_IOC_PORT_GET Ioctl...\n");
897 ret = do_get_port(ndev, data);
899 case SBE_IOC_PORT_SET:
900 //pr_info(">> SBE_IOC_PORT_SET Ioctl...\n");
901 ret = do_set_port(ndev, data);
903 case SBE_IOC_CHAN_GET:
904 //pr_info(">> SBE_IOC_CHAN_GET Ioctl...\n");
905 ret = do_get_chan(ndev, data);
907 case SBE_IOC_CHAN_SET:
908 //pr_info(">> SBE_IOC_CHAN_SET Ioctl...\n");
909 ret = do_set_chan(ndev, data);
912 //pr_info(">> C4_DEL_CHAN Ioctl...\n");
913 ret = do_del_chan(ndev, data);
915 case SBE_IOC_CHAN_NEW:
916 ret = do_create_chan(ndev, data);
918 case SBE_IOC_CHAN_GET_STAT:
919 ret = do_get_chan_stats(ndev, data);
921 case SBE_IOC_LOGLEVEL:
922 ret = do_set_loglevel(ndev, data);
924 case SBE_IOC_RESET_DEV:
925 ret = do_reset(ndev, data);
927 case SBE_IOC_CHAN_DEL_STAT:
928 ret = do_reset_chan_stats(ndev, data);
931 ret = do_port_loop(ndev, data);
934 ret = do_framer_rw(ndev, data);
937 ret = do_musycc_rw(ndev, data);
940 ret = do_pld_rw(ndev, data);
942 case SBE_IOC_IID_GET:
943 ret = (iolen == sizeof(struct sbe_iid_info)) ?
944 c4_get_iidinfo(ci, &arg.u.iip) : -EFAULT;
945 if (ret == 0) /* no error, copy data */
946 if (copy_to_user(data, &arg, iolen))
950 //pr_info(">> c4_ioctl: EINVAL - unknown iocmd <%x>\n", iocmd);
957 static const struct net_device_ops c4_ops = {
958 .ndo_open = void_open,
959 .ndo_start_xmit = c4_linux_xmit,
960 .ndo_do_ioctl = c4_ioctl,
963 static void c4_setup(struct net_device *dev)
965 dev->type = ARPHRD_VOID;
966 dev->netdev_ops = &c4_ops;
969 struct net_device *__init
970 c4_add_dev(hdw_info_t *hi, int brdno, unsigned long f0, unsigned long f1,
973 struct net_device *ndev;
976 ndev = alloc_netdev(sizeof(ci_t), SBE_IFACETMPL, c4_setup);
979 pr_warning("%s: no memory for struct net_device !\n",
984 ci = (ci_t *)(netdev_priv(ndev));
988 ci->state = C_INIT; /* mark as hardware not available */
991 ci->brdno = ci->next ? ci->next->brdno + 1 : 0;
994 CI = ci; /* DEBUG, only board 0 usage */
996 strcpy(ci->devname, hi->devname);
999 #if defined(SBE_ISR_TASKLET)
1000 tasklet_init(&ci->ci_musycc_isr_tasklet,
1001 (void (*) (unsigned long)) musycc_intr_bh_tasklet,
1002 (unsigned long) ci);
1004 if (atomic_read(&ci->ci_musycc_isr_tasklet.count) == 0)
1005 tasklet_disable_nosync(&ci->ci_musycc_isr_tasklet);
1006 #elif defined(SBE_ISR_IMMEDIATE)
1007 ci->ci_musycc_isr_tq.routine = (void *)(unsigned long)musycc_intr_bh_tasklet;
1008 ci->ci_musycc_isr_tq.data = ci;
1012 if (register_netdev(ndev) ||
1013 (c4_init(ci, (u_char *) f0, (u_char *) f1) != SBE_DRVR_SUCCESS))
1015 OS_kfree(netdev_priv(ndev));
1017 error_flag = ENODEV;
1020 /*************************************************************
1021 * int request_irq(unsigned int irq,
1022 * void (*handler)(int, void *, struct pt_regs *),
1023 * unsigned long flags, const char *dev_name, void *dev_id);
1025 * irq -> The interrupt number that is being requested.
1026 * handler -> Pointer to handling function being installed.
1027 * flags -> A bit mask of options related to interrupt management.
1028 * dev_name -> String used in /proc/interrupts to show owner of interrupt.
1029 * dev_id -> Pointer (for shared interrupt lines) to point to its own
1030 * private data area (to identify which device is interrupting).
1032 * extern void free_irq(unsigned int irq, void *dev_id);
1033 **************************************************************/
1035 if (request_irq(irq0, &c4_linux_interrupt,
1039 pr_warning("%s: MUSYCC could not get irq: %d\n",
1041 unregister_netdev(ndev);
1042 OS_kfree(netdev_priv(ndev));
1047 #ifdef CONFIG_SBE_PMCC4_NCOMM
1048 if (request_irq(irq1, &c4_ebus_interrupt, IRQF_SHARED, ndev->name, ndev))
1050 pr_warning("%s: EBUS could not get irq: %d\n", hi->devname, irq1);
1051 unregister_netdev(ndev);
1052 free_irq(irq0, ndev);
1053 OS_kfree(netdev_priv(ndev));
1060 /* setup board identification information */
1065 /* also sets PROM format type (promfmt) for later usage */
1066 hdw_sn_get(hi, brdno);
1068 switch (hi->promfmt)
1070 case PROM_FORMAT_TYPE1:
1071 memcpy(ndev->dev_addr,
1072 (FLD_TYPE1 *) (hi->mfg_info.pft1.Serial), 6);
1073 /* unaligned data acquisition */
1074 memcpy(&tmp, (FLD_TYPE1 *) (hi->mfg_info.pft1.Id), 4);
1075 ci->brd_id = cpu_to_be32(tmp);
1077 case PROM_FORMAT_TYPE2:
1078 memcpy(ndev->dev_addr,
1079 (FLD_TYPE2 *) (hi->mfg_info.pft2.Serial), 6);
1080 /* unaligned data acquisition */
1081 memcpy(&tmp, (FLD_TYPE2 *) (hi->mfg_info.pft2.Id), 4);
1082 ci->brd_id = cpu_to_be32(tmp);
1086 memset(ndev->dev_addr, 0, 6);
1091 /* requires bid to be preset */
1092 sbeid_set_hdwbid(ci);
1094 /* requires hdw_bid to be preset */
1095 sbeid_set_bdtype(ci);
1099 #ifdef CONFIG_PROC_FS
1100 sbecom_proc_brd_init(ci);
1102 #if defined(SBE_ISR_TASKLET)
1103 tasklet_enable(&ci->ci_musycc_isr_tasklet);
1106 error_flag = c4_init2(ci);
1107 if (error_flag != SBE_DRVR_SUCCESS) {
1108 #ifdef CONFIG_PROC_FS
1109 sbecom_proc_brd_cleanup(ci);
1111 unregister_netdev(ndev);
1112 free_irq(irq1, ndev);
1113 free_irq(irq0, ndev);
1114 OS_kfree(netdev_priv(ndev));
1116 /* failure, error_flag is set */
1127 rtn = c4hw_attach_all();
1129 return -rtn; /* installation failure - see system log */
1131 /* housekeeping notifications */
1132 if (cxt1e1_log_level != log_level_default)
1133 pr_info("NOTE: driver parameter <cxt1e1_log_level> changed from default %d to %d.\n",
1134 log_level_default, cxt1e1_log_level);
1135 if (cxt1e1_max_mru != max_mru_default)
1136 pr_info("NOTE: driver parameter <cxt1e1_max_mru> changed from default %d to %d.\n",
1137 max_mru_default, cxt1e1_max_mru);
1138 if (cxt1e1_max_mtu != max_mtu_default)
1139 pr_info("NOTE: driver parameter <cxt1e1_max_mtu> changed from default %d to %d.\n",
1140 max_mtu_default, cxt1e1_max_mtu);
1141 if (max_rxdesc_used != max_rxdesc_default)
1143 if (max_rxdesc_used > 2000)
1144 max_rxdesc_used = 2000; /* out-of-bounds reset */
1145 pr_info("NOTE: driver parameter <max_rxdesc_used> changed from default %d to %d.\n",
1146 max_rxdesc_default, max_rxdesc_used);
1148 if (max_txdesc_used != max_txdesc_default)
1150 if (max_txdesc_used > 1000)
1151 max_txdesc_used = 1000; /* out-of-bounds reset */
1152 pr_info("NOTE: driver parameter <max_txdesc_used> changed from default %d to %d.\n",
1153 max_txdesc_default, max_txdesc_used);
1155 return 0; /* installation success */
1160 * find any still allocated hdlc registrations and unregister via call to
1169 struct net_device *ndev;
1172 for (i = 0, hi = hdw_info; i < MAX_BOARDS; i++, hi++)
1174 if (hi->ndev) /* a board has been attached */
1176 ci = (ci_t *)(netdev_priv(hi->ndev));
1177 for (j = 0; j < ci->max_port; j++)
1178 for (k = 0; k < MUSYCC_NCHANS; k++) {
1179 ndev = ci->port[j].chan[k]->user;
1182 do_deluser(ndev, 0);
1193 cleanup_hdlc(); /* delete any missed channels */
1197 pr_info("SBE - driver removed.\n");
1200 module_init(c4_mod_init);
1201 module_exit(c4_mod_remove);
1203 MODULE_AUTHOR("SBE Technical Services <support@sbei.com>");
1204 MODULE_DESCRIPTION("wanPCI-CxT1E1 Generic HDLC WAN Driver module");
1205 #ifdef MODULE_LICENSE
1206 MODULE_LICENSE("GPL");
1209 /*** End-of-File ***/