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]; /* NOTE: name of the queue limited by system
218 * to 10 characters */
220 return 0; /* already initialized */
223 snprintf(name
, sizeof(name
), "%s%d", pi
->up
->devname
, pi
->portnum
);
225 #ifdef RLD_RESTART_DEBUG
226 pr_info(">> %s: creating workqueue <%s> for Port %d.\n",
227 __func__
, name
, pi
->portnum
); /* RLD DEBUG */
229 pi
->wq_port
= create_singlethread_workqueue(name
);
232 return 0; /* success */
236 c4_wq_port_cleanup(mpi_t
*pi
)
239 * PORT POINT: cannot call this if WQ is statically allocated w/in
240 * structure since it calls kfree(wq);
243 destroy_workqueue(pi
->wq_port
); /* this also calls
244 * flush_workqueue() */
249 /***************************************************************************/
252 c4_linux_interrupt(int irq
, void *dev_instance
)
254 struct net_device
*ndev
= dev_instance
;
256 return musycc_intr_th_handler(netdev_priv(ndev
));
260 #ifdef CONFIG_SBE_PMCC4_NCOMM
262 c4_ebus_interrupt(int irq
, void *dev_instance
)
264 struct net_device
*ndev
= dev_instance
;
266 return c4_ebus_intr_th_handler(netdev_priv(ndev
));
272 void_open(struct net_device
*ndev
)
274 pr_info("%s: trying to open master device !\n", ndev
->name
);
280 chan_open(struct net_device
*ndev
)
282 hdlc_device
*hdlc
= dev_to_hdlc(ndev
);
283 const struct c4_priv
*priv
= hdlc
->priv
;
286 ret
= hdlc_open(ndev
);
288 pr_info("hdlc_open failure, err %d.\n", ret
);
292 ret
= c4_chan_up(priv
->ci
, priv
->channum
);
295 try_module_get(THIS_MODULE
);
296 netif_start_queue(ndev
);
297 return 0; /* no error = success */
302 chan_close(struct net_device
*ndev
)
304 hdlc_device
*hdlc
= dev_to_hdlc(ndev
);
305 const struct c4_priv
*priv
= hdlc
->priv
;
307 netif_stop_queue(ndev
);
308 musycc_chan_down((ci_t
*) 0, priv
->channum
);
310 module_put(THIS_MODULE
);
316 chan_dev_ioctl(struct net_device
*dev
, struct ifreq
*ifr
, int cmd
)
318 return hdlc_ioctl(dev
, ifr
, cmd
);
323 chan_attach_noop(struct net_device
*ndev
, unsigned short foo_1
,
324 unsigned short foo_2
)
326 /* our driver has nothing to do here, show's
333 static struct net_device_stats
*
334 chan_get_stats(struct net_device
*ndev
)
337 struct net_device_stats
*nstats
;
338 struct sbecom_chan_stats
*stats
;
342 struct c4_priv
*priv
;
344 priv
= (struct c4_priv
*)dev_to_hdlc(ndev
)->priv
;
345 channum
= priv
->channum
;
348 ch
= c4_find_chan(channum
);
352 nstats
= &ndev
->stats
;
355 memset(nstats
, 0, sizeof(struct net_device_stats
));
356 nstats
->rx_packets
= stats
->rx_packets
;
357 nstats
->tx_packets
= stats
->tx_packets
;
358 nstats
->rx_bytes
= stats
->rx_bytes
;
359 nstats
->tx_bytes
= stats
->tx_bytes
;
360 nstats
->rx_errors
= stats
->rx_length_errors
+
361 stats
->rx_over_errors
+
362 stats
->rx_crc_errors
+
363 stats
->rx_frame_errors
+
364 stats
->rx_fifo_errors
+
365 stats
->rx_missed_errors
;
366 nstats
->tx_errors
= stats
->tx_dropped
+
367 stats
->tx_aborted_errors
+
368 stats
->tx_fifo_errors
;
369 nstats
->rx_dropped
= stats
->rx_dropped
;
370 nstats
->tx_dropped
= stats
->tx_dropped
;
372 nstats
->rx_length_errors
= stats
->rx_length_errors
;
373 nstats
->rx_over_errors
= stats
->rx_over_errors
;
374 nstats
->rx_crc_errors
= stats
->rx_crc_errors
;
375 nstats
->rx_frame_errors
= stats
->rx_frame_errors
;
376 nstats
->rx_fifo_errors
= stats
->rx_fifo_errors
;
377 nstats
->rx_missed_errors
= stats
->rx_missed_errors
;
379 nstats
->tx_aborted_errors
= stats
->tx_aborted_errors
;
380 nstats
->tx_fifo_errors
= stats
->tx_fifo_errors
;
387 get_ci_by_dev(struct net_device
*ndev
)
389 return (ci_t
*)(netdev_priv(ndev
));
394 c4_linux_xmit(struct sk_buff
*skb
, struct net_device
*ndev
)
396 const struct c4_priv
*priv
;
399 hdlc_device
*hdlc
= dev_to_hdlc(ndev
);
403 rval
= musycc_start_xmit(priv
->ci
, priv
->channum
, skb
);
407 static const struct net_device_ops chan_ops
= {
408 .ndo_open
= chan_open
,
409 .ndo_stop
= chan_close
,
410 .ndo_start_xmit
= c4_linux_xmit
,
411 .ndo_do_ioctl
= chan_dev_ioctl
,
412 .ndo_get_stats
= chan_get_stats
,
415 static struct net_device
*
416 create_chan(struct net_device
*ndev
, ci_t
*ci
,
417 struct sbecom_chan_param
*cp
)
420 struct net_device
*dev
;
424 if (c4_find_chan(cp
->channum
))
425 return NULL
; /* channel already exists */
428 struct c4_priv
*priv
;
430 /* allocate then fill in private data structure */
431 priv
= OS_kmalloc(sizeof(struct c4_priv
));
433 pr_warning("%s: no memory for net_device !\n",
437 dev
= alloc_hdlcdev(priv
);
439 pr_warning("%s: no memory for hdlc_device !\n",
445 priv
->channum
= cp
->channum
;
448 hdlc
= dev_to_hdlc(dev
);
450 dev
->base_addr
= 0; /* not I/O mapped */
451 dev
->irq
= ndev
->irq
;
452 dev
->type
= ARPHRD_RAWHDLC
;
453 *dev
->name
= 0; /* default ifconfig name = "hdlc" */
455 hi
= (hdw_info_t
*)ci
->hdw_info
;
456 if (hi
->mfg_info_sts
== EEPROM_OK
) {
457 switch (hi
->promfmt
) {
458 case PROM_FORMAT_TYPE1
:
459 memcpy(dev
->dev_addr
,
460 (FLD_TYPE1
*) (hi
->mfg_info
.pft1
.Serial
), 6);
462 case PROM_FORMAT_TYPE2
:
463 memcpy(dev
->dev_addr
,
464 (FLD_TYPE2
*) (hi
->mfg_info
.pft2
.Serial
), 6);
467 memset(dev
->dev_addr
, 0, 6);
471 memset(dev
->dev_addr
, 0, 6);
473 hdlc
->xmit
= c4_linux_xmit
;
475 dev
->netdev_ops
= &chan_ops
;
477 * The native hdlc stack calls this 'attach' routine during
478 * hdlc_raw_ioctl(), passing parameters for line encoding and parity.
479 * Since hdlc_raw_ioctl() stack does not interrogate whether an 'attach'
480 * routine is actually registered or not, we supply a dummy routine which
481 * does nothing (since encoding and parity are setup for our driver via a
482 * special configuration application).
485 hdlc
->attach
= chan_attach_noop
;
487 /* needed due to Ioctl calling sequence */
489 ret
= register_hdlc_device(dev
);
490 /* NOTE: <stats> setting must occur AFTER registration in order to "take" */
491 dev
->tx_queue_len
= MAX_DEFAULT_IFQLEN
;
493 /* needed due to Ioctl calling sequence */
496 if (cxt1e1_log_level
>= LOG_WARN
)
497 pr_info("%s: create_chan[%d] registration error = %d.\n",
498 ci
->devname
, cp
->channum
, ret
);
501 /* failed to register */
508 /* the idea here is to get port information and pass it back (using pointer) */
510 do_get_port(struct net_device
*ndev
, void *data
)
513 ci_t
*ci
; /* ci stands for card information */
514 struct sbecom_port_param pp
;/* copy data to kernel land */
516 if (copy_from_user(&pp
, data
, sizeof(struct sbecom_port_param
)))
518 if (pp
.portnum
>= MUSYCC_NPORTS
)
520 ci
= get_ci_by_dev(ndev
);
522 return -EINVAL
; /* get card info */
524 ret
= mkret(c4_get_port(ci
, pp
.portnum
));
527 if (copy_to_user(data
, &ci
->port
[pp
.portnum
].p
,
528 sizeof(struct sbecom_port_param
)))
533 /* this function copys the user data and then calls the real action function */
535 do_set_port(struct net_device
*ndev
, void *data
)
537 ci_t
*ci
; /* ci stands for card information */
538 struct sbecom_port_param pp
;/* copy data to kernel land */
540 if (copy_from_user(&pp
, data
, sizeof(struct sbecom_port_param
)))
542 if (pp
.portnum
>= MUSYCC_NPORTS
)
544 ci
= get_ci_by_dev(ndev
);
546 return -EINVAL
; /* get card info */
548 if (pp
.portnum
>= ci
->max_port
) /* sanity check */
551 memcpy(&ci
->port
[pp
.portnum
].p
, &pp
, sizeof(struct sbecom_port_param
));
552 return mkret(c4_set_port(ci
, pp
.portnum
));
555 /* work the port loopback mode as per directed */
557 do_port_loop(struct net_device
*ndev
, void *data
)
559 struct sbecom_port_param pp
;
562 if (copy_from_user(&pp
, data
, sizeof(struct sbecom_port_param
)))
564 ci
= get_ci_by_dev(ndev
);
567 return mkret(c4_loop_port(ci
, pp
.portnum
, pp
.port_mode
));
570 /* set the specified register with the given value / or just read it */
572 do_framer_rw(struct net_device
*ndev
, void *data
)
574 struct sbecom_port_param pp
;
578 if (copy_from_user(&pp
, data
, sizeof(struct sbecom_port_param
)))
580 ci
= get_ci_by_dev(ndev
);
583 ret
= mkret(c4_frame_rw(ci
, &pp
));
586 if (copy_to_user(data
, &pp
, sizeof(struct sbecom_port_param
)))
591 /* set the specified register with the given value / or just read it */
593 do_pld_rw(struct net_device
*ndev
, void *data
)
595 struct sbecom_port_param pp
;
599 if (copy_from_user(&pp
, data
, sizeof(struct sbecom_port_param
)))
601 ci
= get_ci_by_dev(ndev
);
604 ret
= mkret(c4_pld_rw(ci
, &pp
));
607 if (copy_to_user(data
, &pp
, sizeof(struct sbecom_port_param
)))
612 /* set the specified register with the given value / or just read it */
614 do_musycc_rw(struct net_device
*ndev
, void *data
)
616 struct c4_musycc_param mp
;
620 if (copy_from_user(&mp
, data
, sizeof(struct c4_musycc_param
)))
622 ci
= get_ci_by_dev(ndev
);
625 ret
= mkret(c4_musycc_rw(ci
, &mp
));
628 if (copy_to_user(data
, &mp
, sizeof(struct c4_musycc_param
)))
634 do_get_chan(struct net_device
*ndev
, void *data
)
636 struct sbecom_chan_param cp
;
639 if (copy_from_user(&cp
, data
,
640 sizeof(struct sbecom_chan_param
)))
643 ret
= mkret(c4_get_chan(cp
.channum
, &cp
));
647 if (copy_to_user(data
, &cp
, sizeof(struct sbecom_chan_param
)))
653 do_set_chan(struct net_device
*ndev
, void *data
)
655 struct sbecom_chan_param cp
;
659 if (copy_from_user(&cp
, data
, sizeof(struct sbecom_chan_param
)))
661 ci
= get_ci_by_dev(ndev
);
664 switch (ret
= mkret(c4_set_chan(cp
.channum
, &cp
)))
674 do_create_chan(struct net_device
*ndev
, void *data
)
677 struct net_device
*dev
;
678 struct sbecom_chan_param cp
;
681 if (copy_from_user(&cp
, data
, sizeof(struct sbecom_chan_param
)))
683 ci
= get_ci_by_dev(ndev
);
686 dev
= create_chan(ndev
, ci
, &cp
);
689 ret
= mkret(c4_new_chan(ci
, cp
.port
, cp
.channum
, dev
));
691 /* needed due to Ioctl calling sequence */
693 unregister_hdlc_device(dev
);
694 /* needed due to Ioctl calling sequence */
702 do_get_chan_stats(struct net_device
*ndev
, void *data
)
704 struct c4_chan_stats_wrap ccs
;
707 if (copy_from_user(&ccs
, data
,
708 sizeof(struct c4_chan_stats_wrap
)))
710 switch (ret
= mkret(c4_get_chan_stats(ccs
.channum
, &ccs
.stats
)))
717 if (copy_to_user(data
, &ccs
,
718 sizeof(struct c4_chan_stats_wrap
)))
723 do_set_loglevel(struct net_device
*ndev
, void *data
)
725 unsigned int cxt1e1_log_level
;
727 if (copy_from_user(&cxt1e1_log_level
, data
, sizeof(int)))
729 sbecom_set_loglevel(cxt1e1_log_level
);
734 do_deluser(struct net_device
*ndev
, int lockit
)
736 if (ndev
->flags
& IFF_UP
)
742 const struct c4_priv
*priv
;
745 priv
= (struct c4_priv
*)dev_to_hdlc(ndev
)->priv
;
747 channum
= priv
->channum
;
749 ch
= c4_find_chan(channum
);
752 ch
->user
= NULL
; /* will be freed, below */
755 /* needed if Ioctl calling sequence */
758 unregister_hdlc_device(ndev
);
759 /* needed if Ioctl calling sequence */
767 do_del_chan(struct net_device
*musycc_dev
, void *data
)
769 struct sbecom_chan_param cp
;
770 char buf
[sizeof(CHANNAME
) + 3];
771 struct net_device
*dev
;
774 if (copy_from_user(&cp
, data
,
775 sizeof(struct sbecom_chan_param
)))
777 if (cp
.channum
> 999)
779 snprintf(buf
, sizeof(buf
), CHANNAME
"%d", cp
.channum
);
780 dev
= __dev_get_by_name(&init_net
, buf
);
783 ret
= do_deluser(dev
, 1);
786 return c4_del_chan(cp
.channum
);
788 int c4_reset_board(void *);
791 do_reset(struct net_device
*musycc_dev
, void *data
)
793 const struct c4_priv
*priv
;
796 for (i
= 0; i
< 128; i
++) {
797 struct net_device
*ndev
;
798 char buf
[sizeof(CHANNAME
) + 3];
800 sprintf(buf
, CHANNAME
"%d", i
);
801 ndev
= __dev_get_by_name(&init_net
, buf
);
804 priv
= dev_to_hdlc(ndev
)->priv
;
806 if ((unsigned long) (priv
->ci
) ==
807 (unsigned long) (netdev_priv(musycc_dev
))) {
808 ndev
->flags
&= ~IFF_UP
;
809 netif_stop_queue(ndev
);
817 do_reset_chan_stats(struct net_device
*musycc_dev
, void *data
)
819 struct sbecom_chan_param cp
;
821 if (copy_from_user(&cp
, data
,
822 sizeof(struct sbecom_chan_param
)))
824 return mkret(c4_del_chan_stats(cp
.channum
));
828 c4_ioctl(struct net_device
*ndev
, struct ifreq
*ifr
, int cmd
)
838 struct sbe_brd_info bip
;
839 struct sbe_drv_info dip
;
840 struct sbe_iid_info iip
;
841 struct sbe_brd_addr bap
;
842 struct sbecom_chan_stats stats
;
843 struct sbecom_chan_param param
;
844 struct temux_card_stats cards
;
845 struct sbecom_card_param cardp
;
846 struct sbecom_framer_param frp
;
851 if (!capable(CAP_SYS_ADMIN
))
853 if (cmd
!= SIOCDEVPRIVATE
+ 15)
855 ci
= get_ci_by_dev(ndev
);
858 if (ci
->state
!= C_RUNNING
)
860 if (copy_from_user(&iocmd
, ifr
->ifr_data
, sizeof(iocmd
)))
863 if (copy_from_user(&len
, ifr
->ifr_data
+ sizeof(iocmd
), sizeof(len
)))
868 pr_info("c4_ioctl: iocmd %x, dir %x type %x nr %x iolen %d.\n", iocmd
,
869 _IOC_DIR(iocmd
), _IOC_TYPE(iocmd
), _IOC_NR(iocmd
),
872 iolen
= _IOC_SIZE(iocmd
);
873 if (iolen
> sizeof(arg
))
875 data
= ifr
->ifr_data
+ sizeof(iocmd
);
876 if (copy_from_user(&arg
, data
, iolen
))
881 case SBE_IOC_PORT_GET
:
882 ret
= do_get_port(ndev
, data
);
884 case SBE_IOC_PORT_SET
:
885 ret
= do_set_port(ndev
, data
);
887 case SBE_IOC_CHAN_GET
:
888 ret
= do_get_chan(ndev
, data
);
890 case SBE_IOC_CHAN_SET
:
891 ret
= do_set_chan(ndev
, data
);
894 ret
= do_del_chan(ndev
, data
);
896 case SBE_IOC_CHAN_NEW
:
897 ret
= do_create_chan(ndev
, data
);
899 case SBE_IOC_CHAN_GET_STAT
:
900 ret
= do_get_chan_stats(ndev
, data
);
902 case SBE_IOC_LOGLEVEL
:
903 ret
= do_set_loglevel(ndev
, data
);
905 case SBE_IOC_RESET_DEV
:
906 ret
= do_reset(ndev
, data
);
908 case SBE_IOC_CHAN_DEL_STAT
:
909 ret
= do_reset_chan_stats(ndev
, data
);
912 ret
= do_port_loop(ndev
, data
);
915 ret
= do_framer_rw(ndev
, data
);
918 ret
= do_musycc_rw(ndev
, data
);
921 ret
= do_pld_rw(ndev
, data
);
923 case SBE_IOC_IID_GET
:
924 ret
= (iolen
== sizeof(struct sbe_iid_info
)) ?
925 c4_get_iidinfo(ci
, &arg
.u
.iip
) : -EFAULT
;
926 if (ret
== 0) /* no error, copy data */
927 if (copy_to_user(data
, &arg
, iolen
))
937 static const struct net_device_ops c4_ops
= {
938 .ndo_open
= void_open
,
939 .ndo_start_xmit
= c4_linux_xmit
,
940 .ndo_do_ioctl
= c4_ioctl
,
943 static void c4_setup(struct net_device
*dev
)
945 dev
->type
= ARPHRD_VOID
;
946 dev
->netdev_ops
= &c4_ops
;
949 struct net_device
*__init
950 c4_add_dev(hdw_info_t
*hi
, int brdno
, unsigned long f0
, unsigned long f1
,
953 struct net_device
*ndev
;
956 ndev
= alloc_netdev(sizeof(ci_t
), SBE_IFACETMPL
, c4_setup
);
958 pr_warning("%s: no memory for struct net_device !\n",
963 ci
= (ci_t
*)(netdev_priv(ndev
));
967 ci
->state
= C_INIT
; /* mark as hardware not available */
970 ci
->brdno
= ci
->next
? ci
->next
->brdno
+ 1 : 0;
973 CI
= ci
; /* DEBUG, only board 0 usage */
975 strcpy(ci
->devname
, hi
->devname
);
978 #if defined(SBE_ISR_TASKLET)
979 tasklet_init(&ci
->ci_musycc_isr_tasklet
,
980 (void (*) (unsigned long)) musycc_intr_bh_tasklet
,
983 if (atomic_read(&ci
->ci_musycc_isr_tasklet
.count
) == 0)
984 tasklet_disable_nosync(&ci
->ci_musycc_isr_tasklet
);
985 #elif defined(SBE_ISR_IMMEDIATE)
986 ci
->ci_musycc_isr_tq
.routine
= (void *)(unsigned long)musycc_intr_bh_tasklet
;
987 ci
->ci_musycc_isr_tq
.data
= ci
;
991 if (register_netdev(ndev
) ||
992 (c4_init(ci
, (u_char
*) f0
, (u_char
*) f1
) != SBE_DRVR_SUCCESS
)) {
993 OS_kfree(netdev_priv(ndev
));
998 /*************************************************************
999 * int request_irq(unsigned int irq,
1000 * void (*handler)(int, void *, struct pt_regs *),
1001 * unsigned long flags, const char *dev_name, void *dev_id);
1003 * irq -> The interrupt number that is being requested.
1004 * handler -> Pointer to handling function being installed.
1005 * flags -> A bit mask of options related to interrupt management.
1006 * dev_name -> String used in /proc/interrupts to show owner of interrupt.
1007 * dev_id -> Pointer (for shared interrupt lines) to point to its own
1008 * private data area (to identify which device is interrupting).
1010 * extern void free_irq(unsigned int irq, void *dev_id);
1011 **************************************************************/
1013 if (request_irq(irq0
, &c4_linux_interrupt
,
1015 ndev
->name
, ndev
)) {
1016 pr_warning("%s: MUSYCC could not get irq: %d\n",
1018 unregister_netdev(ndev
);
1019 OS_kfree(netdev_priv(ndev
));
1024 #ifdef CONFIG_SBE_PMCC4_NCOMM
1025 if (request_irq(irq1
, &c4_ebus_interrupt
, IRQF_SHARED
, ndev
->name
, ndev
)) {
1026 pr_warning("%s: EBUS could not get irq: %d\n", hi
->devname
, irq1
);
1027 unregister_netdev(ndev
);
1028 free_irq(irq0
, ndev
);
1029 OS_kfree(netdev_priv(ndev
));
1036 /* setup board identification information */
1041 /* also sets PROM format type (promfmt) for later usage */
1042 hdw_sn_get(hi
, brdno
);
1044 switch (hi
->promfmt
) {
1045 case PROM_FORMAT_TYPE1
:
1046 memcpy(ndev
->dev_addr
,
1047 (FLD_TYPE1
*) (hi
->mfg_info
.pft1
.Serial
), 6);
1048 /* unaligned data acquisition */
1049 memcpy(&tmp
, (FLD_TYPE1
*) (hi
->mfg_info
.pft1
.Id
), 4);
1050 ci
->brd_id
= cpu_to_be32(tmp
);
1052 case PROM_FORMAT_TYPE2
:
1053 memcpy(ndev
->dev_addr
,
1054 (FLD_TYPE2
*) (hi
->mfg_info
.pft2
.Serial
), 6);
1055 /* unaligned data acquisition */
1056 memcpy(&tmp
, (FLD_TYPE2
*) (hi
->mfg_info
.pft2
.Id
), 4);
1057 ci
->brd_id
= cpu_to_be32(tmp
);
1061 memset(ndev
->dev_addr
, 0, 6);
1066 /* requires bid to be preset */
1067 sbeid_set_hdwbid(ci
);
1069 /* requires hdw_bid to be preset */
1070 sbeid_set_bdtype(ci
);
1074 #ifdef CONFIG_PROC_FS
1075 sbecom_proc_brd_init(ci
);
1077 #if defined(SBE_ISR_TASKLET)
1078 tasklet_enable(&ci
->ci_musycc_isr_tasklet
);
1081 error_flag
= c4_init2(ci
);
1082 if (error_flag
!= SBE_DRVR_SUCCESS
) {
1083 #ifdef CONFIG_PROC_FS
1084 sbecom_proc_brd_cleanup(ci
);
1086 unregister_netdev(ndev
);
1087 free_irq(irq1
, ndev
);
1088 free_irq(irq0
, ndev
);
1089 OS_kfree(netdev_priv(ndev
));
1091 /* failure, error_flag is set */
1102 rtn
= c4hw_attach_all();
1104 return -rtn
; /* installation failure - see system log */
1106 /* housekeeping notifications */
1107 if (cxt1e1_log_level
!= log_level_default
)
1108 pr_info("NOTE: driver parameter <cxt1e1_log_level> changed from default %d to %d.\n",
1109 log_level_default
, cxt1e1_log_level
);
1110 if (cxt1e1_max_mru
!= max_mru_default
)
1111 pr_info("NOTE: driver parameter <cxt1e1_max_mru> changed from default %d to %d.\n",
1112 max_mru_default
, cxt1e1_max_mru
);
1113 if (cxt1e1_max_mtu
!= max_mtu_default
)
1114 pr_info("NOTE: driver parameter <cxt1e1_max_mtu> changed from default %d to %d.\n",
1115 max_mtu_default
, cxt1e1_max_mtu
);
1116 if (max_rxdesc_used
!= max_rxdesc_default
) {
1117 if (max_rxdesc_used
> 2000)
1118 max_rxdesc_used
= 2000; /* out-of-bounds reset */
1119 pr_info("NOTE: driver parameter <max_rxdesc_used> changed from default %d to %d.\n",
1120 max_rxdesc_default
, max_rxdesc_used
);
1122 if (max_txdesc_used
!= max_txdesc_default
) {
1123 if (max_txdesc_used
> 1000)
1124 max_txdesc_used
= 1000; /* out-of-bounds reset */
1125 pr_info("NOTE: driver parameter <max_txdesc_used> changed from default %d to %d.\n",
1126 max_txdesc_default
, max_txdesc_used
);
1128 return 0; /* installation success */
1133 * find any still allocated hdlc registrations and unregister via call to
1142 struct net_device
*ndev
;
1145 for (i
= 0, hi
= hdw_info
; i
< MAX_BOARDS
; i
++, hi
++) {
1146 if (hi
->ndev
) { /* a board has been attached */
1147 ci
= (ci_t
*)(netdev_priv(hi
->ndev
));
1148 for (j
= 0; j
< ci
->max_port
; j
++)
1149 for (k
= 0; k
< MUSYCC_NCHANS
; k
++) {
1150 ndev
= ci
->port
[j
].chan
[k
]->user
;
1152 do_deluser(ndev
, 0);
1162 cleanup_hdlc(); /* delete any missed channels */
1166 pr_info("SBE - driver removed.\n");
1169 module_init(c4_mod_init
);
1170 module_exit(c4_mod_remove
);
1172 MODULE_AUTHOR("SBE Technical Services <support@sbei.com>");
1173 MODULE_DESCRIPTION("wanPCI-CxT1E1 Generic HDLC WAN Driver module");
1174 #ifdef MODULE_LICENSE
1175 MODULE_LICENSE("GPL");
1178 /*** End-of-File ***/
This page took 0.08555 seconds and 5 git commands to generate.