4b4609db9f89c2ce9cf02ad6e0b1649af13c01bf
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 int __init
c4hw_attach_all(void);
64 void __init
hdw_sn_get(hdw_info_t
*, int);
66 #ifdef CONFIG_SBE_PMCC4_NCOMM
67 irqreturn_t
c4_ebus_intr_th_handler(void *);
70 int c4_frame_rw(ci_t
*, struct sbecom_port_param
*);
71 status_t
c4_get_port(ci_t
*, int);
72 int c4_loop_port(ci_t
*, int, u_int8_t
);
73 int c4_musycc_rw(ci_t
*, struct c4_musycc_param
*);
74 int c4_new_chan(ci_t
*, int, int, void *);
75 status_t
c4_set_port(ci_t
*, int);
76 int c4_pld_rw(ci_t
*, struct sbecom_port_param
*);
77 void cleanup_devs(void);
78 void cleanup_ioremap(void);
79 status_t
musycc_chan_down(ci_t
*, int);
80 irqreturn_t
musycc_intr_th_handler(void *);
81 int musycc_start_xmit(ci_t
*, int, void *);
84 extern struct s_hdw_info hdw_info
[];
86 #if defined(CONFIG_SBE_HDLC_V7) || defined(CONFIG_SBE_WAN256T3_HDLC_V7) || \
87 defined(CONFIG_SBE_HDLC_V7_MODULE) || defined(CONFIG_SBE_WAN256T3_HDLC_V7_MODULE)
94 #define V7(x) (x ## _v7)
95 extern int hdlc_netif_rx_v7(hdlc_device
*, struct sk_buff
*);
96 extern int register_hdlc_device_v7(hdlc_device
*);
97 extern int unregister_hdlc_device_v7(hdlc_device
*);
103 int error_flag
; /* module load error reporting */
104 int cxt1e1_log_level
= LOG_ERROR
;
105 static int log_level_default
= LOG_ERROR
;
106 module_param(cxt1e1_log_level
, int, 0444);
108 int cxt1e1_max_mru
= MUSYCC_MRU
;
109 static int max_mru_default
= MUSYCC_MRU
;
110 module_param(cxt1e1_max_mru
, int, 0444);
112 int cxt1e1_max_mtu
= MUSYCC_MTU
;
113 int max_mtu_default
= MUSYCC_MTU
;
114 module_param(cxt1e1_max_mtu
, int, 0444);
116 int max_txdesc_used
= MUSYCC_TXDESC_MIN
;
117 int max_txdesc_default
= MUSYCC_TXDESC_MIN
;
118 module_param(max_txdesc_used
, int, 0444);
120 int max_rxdesc_used
= MUSYCC_RXDESC_MIN
;
121 int max_rxdesc_default
= MUSYCC_RXDESC_MIN
;
122 module_param(max_rxdesc_used
, int, 0444);
124 /****************************************************************************/
125 /****************************************************************************/
126 /****************************************************************************/
129 getuserbychan(int channum
)
133 ch
= c4_find_chan(channum
);
134 return ch
? ch
->user
: NULL
;
139 get_hdlc_name(hdlc_device
*hdlc
)
141 struct c4_priv
*priv
= hdlc
->priv
;
142 struct net_device
*dev
= getuserbychan(priv
->channum
);
147 /***************************************************************************/
148 #include <linux/workqueue.h>
151 * One workqueue (wq) per port (since musycc allows simultaneous group
152 * commands), with individual data for each channel:
154 * mpi_t -> struct workqueue_struct *wq_port; (dynamically allocated using
155 * create_workqueue())
157 * With work structure (work) statically allocated for each channel:
159 * mch_t -> struct work_struct ch_work; (statically allocated using ???)
165 * Called by the start transmit routine when a channel TX_ENABLE is to be
166 * issued. This queues the transmission start request among other channels
167 * within a port's group.
170 c4_wk_chan_restart(mch_t
*ch
)
174 #ifdef RLD_RESTART_DEBUG
175 pr_info(">> %s: queueing Port %d Chan %d, mch_t @ %p\n",
176 __func__
, pi
->portnum
, ch
->channum
, ch
);
179 /* create new entry w/in workqueue for this channel and let'er rip */
181 /** queue_work(struct workqueue_struct *queue,
182 ** struct work_struct *work);
184 queue_work(pi
->wq_port
, &ch
->ch_work
);
188 c4_wk_chan_init(mpi_t
*pi
, mch_t
*ch
)
191 * this will be used to restart a stopped channel
194 /** INIT_WORK(struct work_struct *work,
195 ** void (*function)(void *),
198 INIT_WORK(&ch
->ch_work
, (void *)musycc_wq_chan_restart
);
199 return 0; /* success */
203 c4_wq_port_init(mpi_t
*pi
)
206 char name
[16]; /* NOTE: name of the queue limited by system
207 * to 10 characters */
209 return 0; /* already initialized */
212 snprintf(name
, sizeof(name
), "%s%d", pi
->up
->devname
, pi
->portnum
);
214 #ifdef RLD_RESTART_DEBUG
215 pr_info(">> %s: creating workqueue <%s> for Port %d.\n",
216 __func__
, name
, pi
->portnum
); /* RLD DEBUG */
218 pi
->wq_port
= create_singlethread_workqueue(name
);
221 return 0; /* success */
225 c4_wq_port_cleanup(mpi_t
*pi
)
228 * PORT POINT: cannot call this if WQ is statically allocated w/in
229 * structure since it calls kfree(wq);
232 destroy_workqueue(pi
->wq_port
); /* this also calls
233 * flush_workqueue() */
238 /***************************************************************************/
241 c4_linux_interrupt(int irq
, void *dev_instance
)
243 struct net_device
*ndev
= dev_instance
;
245 return musycc_intr_th_handler(netdev_priv(ndev
));
249 #ifdef CONFIG_SBE_PMCC4_NCOMM
251 c4_ebus_interrupt(int irq
, void *dev_instance
)
253 struct net_device
*ndev
= dev_instance
;
255 return c4_ebus_intr_th_handler(netdev_priv(ndev
));
261 void_open(struct net_device
*ndev
)
263 pr_info("%s: trying to open master device !\n", ndev
->name
);
269 chan_open(struct net_device
*ndev
)
271 hdlc_device
*hdlc
= dev_to_hdlc(ndev
);
272 const struct c4_priv
*priv
= hdlc
->priv
;
275 ret
= hdlc_open(ndev
);
277 pr_info("hdlc_open failure, err %d.\n", ret
);
281 ret
= c4_chan_up(priv
->ci
, priv
->channum
);
284 try_module_get(THIS_MODULE
);
285 netif_start_queue(ndev
);
286 return 0; /* no error = success */
291 chan_close(struct net_device
*ndev
)
293 hdlc_device
*hdlc
= dev_to_hdlc(ndev
);
294 const struct c4_priv
*priv
= hdlc
->priv
;
296 netif_stop_queue(ndev
);
297 musycc_chan_down((ci_t
*) 0, priv
->channum
);
299 module_put(THIS_MODULE
);
305 chan_dev_ioctl(struct net_device
*dev
, struct ifreq
*ifr
, int cmd
)
307 return hdlc_ioctl(dev
, ifr
, cmd
);
312 chan_attach_noop(struct net_device
*ndev
, unsigned short foo_1
,
313 unsigned short foo_2
)
315 /* our driver has nothing to do here, show's
322 static struct net_device_stats
*
323 chan_get_stats(struct net_device
*ndev
)
326 struct net_device_stats
*nstats
;
327 struct sbecom_chan_stats
*stats
;
331 struct c4_priv
*priv
;
333 priv
= (struct c4_priv
*)dev_to_hdlc(ndev
)->priv
;
334 channum
= priv
->channum
;
337 ch
= c4_find_chan(channum
);
341 nstats
= &ndev
->stats
;
344 memset(nstats
, 0, sizeof(struct net_device_stats
));
345 nstats
->rx_packets
= stats
->rx_packets
;
346 nstats
->tx_packets
= stats
->tx_packets
;
347 nstats
->rx_bytes
= stats
->rx_bytes
;
348 nstats
->tx_bytes
= stats
->tx_bytes
;
349 nstats
->rx_errors
= stats
->rx_length_errors
+
350 stats
->rx_over_errors
+
351 stats
->rx_crc_errors
+
352 stats
->rx_frame_errors
+
353 stats
->rx_fifo_errors
+
354 stats
->rx_missed_errors
;
355 nstats
->tx_errors
= stats
->tx_dropped
+
356 stats
->tx_aborted_errors
+
357 stats
->tx_fifo_errors
;
358 nstats
->rx_dropped
= stats
->rx_dropped
;
359 nstats
->tx_dropped
= stats
->tx_dropped
;
361 nstats
->rx_length_errors
= stats
->rx_length_errors
;
362 nstats
->rx_over_errors
= stats
->rx_over_errors
;
363 nstats
->rx_crc_errors
= stats
->rx_crc_errors
;
364 nstats
->rx_frame_errors
= stats
->rx_frame_errors
;
365 nstats
->rx_fifo_errors
= stats
->rx_fifo_errors
;
366 nstats
->rx_missed_errors
= stats
->rx_missed_errors
;
368 nstats
->tx_aborted_errors
= stats
->tx_aborted_errors
;
369 nstats
->tx_fifo_errors
= stats
->tx_fifo_errors
;
376 get_ci_by_dev(struct net_device
*ndev
)
378 return (ci_t
*)(netdev_priv(ndev
));
383 c4_linux_xmit(struct sk_buff
*skb
, struct net_device
*ndev
)
385 const struct c4_priv
*priv
;
388 hdlc_device
*hdlc
= dev_to_hdlc(ndev
);
392 rval
= musycc_start_xmit(priv
->ci
, priv
->channum
, skb
);
396 static const struct net_device_ops chan_ops
= {
397 .ndo_open
= chan_open
,
398 .ndo_stop
= chan_close
,
399 .ndo_start_xmit
= c4_linux_xmit
,
400 .ndo_do_ioctl
= chan_dev_ioctl
,
401 .ndo_get_stats
= chan_get_stats
,
404 static struct net_device
*
405 create_chan(struct net_device
*ndev
, ci_t
*ci
,
406 struct sbecom_chan_param
*cp
)
409 struct net_device
*dev
;
413 if (c4_find_chan(cp
->channum
))
414 return NULL
; /* channel already exists */
417 struct c4_priv
*priv
;
419 /* allocate then fill in private data structure */
420 priv
= kzalloc(sizeof(struct c4_priv
), GFP_KERNEL
);
422 pr_warning("%s: no memory for net_device !\n",
426 dev
= alloc_hdlcdev(priv
);
428 pr_warning("%s: no memory for hdlc_device !\n",
434 priv
->channum
= cp
->channum
;
437 hdlc
= dev_to_hdlc(dev
);
439 dev
->base_addr
= 0; /* not I/O mapped */
440 dev
->irq
= ndev
->irq
;
441 dev
->type
= ARPHRD_RAWHDLC
;
442 *dev
->name
= 0; /* default ifconfig name = "hdlc" */
444 hi
= (hdw_info_t
*)ci
->hdw_info
;
445 if (hi
->mfg_info_sts
== EEPROM_OK
) {
446 switch (hi
->promfmt
) {
447 case PROM_FORMAT_TYPE1
:
448 memcpy(dev
->dev_addr
,
449 (FLD_TYPE1
*) (hi
->mfg_info
.pft1
.Serial
), 6);
451 case PROM_FORMAT_TYPE2
:
452 memcpy(dev
->dev_addr
,
453 (FLD_TYPE2
*) (hi
->mfg_info
.pft2
.Serial
), 6);
456 memset(dev
->dev_addr
, 0, 6);
460 memset(dev
->dev_addr
, 0, 6);
462 hdlc
->xmit
= c4_linux_xmit
;
464 dev
->netdev_ops
= &chan_ops
;
466 * The native hdlc stack calls this 'attach' routine during
467 * hdlc_raw_ioctl(), passing parameters for line encoding and parity.
468 * Since hdlc_raw_ioctl() stack does not interrogate whether an 'attach'
469 * routine is actually registered or not, we supply a dummy routine which
470 * does nothing (since encoding and parity are setup for our driver via a
471 * special configuration application).
474 hdlc
->attach
= chan_attach_noop
;
476 /* needed due to Ioctl calling sequence */
478 ret
= register_hdlc_device(dev
);
479 /* NOTE: <stats> setting must occur AFTER registration in order to "take" */
480 dev
->tx_queue_len
= MAX_DEFAULT_IFQLEN
;
482 /* needed due to Ioctl calling sequence */
485 if (cxt1e1_log_level
>= LOG_WARN
)
486 pr_info("%s: create_chan[%d] registration error = %d.\n",
487 ci
->devname
, cp
->channum
, ret
);
490 /* failed to register */
497 /* the idea here is to get port information and pass it back (using pointer) */
499 do_get_port(struct net_device
*ndev
, void *data
)
502 ci_t
*ci
; /* ci stands for card information */
503 struct sbecom_port_param pp
;/* copy data to kernel land */
505 if (copy_from_user(&pp
, data
, sizeof(struct sbecom_port_param
)))
507 if (pp
.portnum
>= MUSYCC_NPORTS
)
509 ci
= get_ci_by_dev(ndev
);
511 return -EINVAL
; /* get card info */
513 ret
= c4_get_port(ci
, pp
.portnum
);
516 if (copy_to_user(data
, &ci
->port
[pp
.portnum
].p
,
517 sizeof(struct sbecom_port_param
)))
522 /* this function copys the user data and then calls the real action function */
524 do_set_port(struct net_device
*ndev
, void *data
)
526 ci_t
*ci
; /* ci stands for card information */
527 struct sbecom_port_param pp
;/* copy data to kernel land */
529 if (copy_from_user(&pp
, data
, sizeof(struct sbecom_port_param
)))
531 if (pp
.portnum
>= MUSYCC_NPORTS
)
533 ci
= get_ci_by_dev(ndev
);
535 return -EINVAL
; /* get card info */
537 if (pp
.portnum
>= ci
->max_port
) /* sanity check */
540 memcpy(&ci
->port
[pp
.portnum
].p
, &pp
, sizeof(struct sbecom_port_param
));
541 return c4_set_port(ci
, pp
.portnum
);
544 /* work the port loopback mode as per directed */
546 do_port_loop(struct net_device
*ndev
, void *data
)
548 struct sbecom_port_param pp
;
551 if (copy_from_user(&pp
, data
, sizeof(struct sbecom_port_param
)))
553 ci
= get_ci_by_dev(ndev
);
556 return c4_loop_port(ci
, pp
.portnum
, pp
.port_mode
);
559 /* set the specified register with the given value / or just read it */
561 do_framer_rw(struct net_device
*ndev
, void *data
)
563 struct sbecom_port_param pp
;
567 if (copy_from_user(&pp
, data
, sizeof(struct sbecom_port_param
)))
569 ci
= get_ci_by_dev(ndev
);
572 ret
= c4_frame_rw(ci
, &pp
);
575 if (copy_to_user(data
, &pp
, sizeof(struct sbecom_port_param
)))
580 /* set the specified register with the given value / or just read it */
582 do_pld_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
);
594 ret
= c4_pld_rw(ci
, &pp
);
597 if (copy_to_user(data
, &pp
, sizeof(struct sbecom_port_param
)))
602 /* set the specified register with the given value / or just read it */
604 do_musycc_rw(struct net_device
*ndev
, void *data
)
606 struct c4_musycc_param mp
;
610 if (copy_from_user(&mp
, data
, sizeof(struct c4_musycc_param
)))
612 ci
= get_ci_by_dev(ndev
);
615 ret
= c4_musycc_rw(ci
, &mp
);
618 if (copy_to_user(data
, &mp
, sizeof(struct c4_musycc_param
)))
624 do_get_chan(struct net_device
*ndev
, void *data
)
626 struct sbecom_chan_param cp
;
629 if (copy_from_user(&cp
, data
,
630 sizeof(struct sbecom_chan_param
)))
633 ret
= c4_get_chan(cp
.channum
, &cp
);
637 if (copy_to_user(data
, &cp
, sizeof(struct sbecom_chan_param
)))
643 do_set_chan(struct net_device
*ndev
, void *data
)
645 struct sbecom_chan_param cp
;
648 if (copy_from_user(&cp
, data
, sizeof(struct sbecom_chan_param
)))
650 ci
= get_ci_by_dev(ndev
);
653 return c4_set_chan(cp
.channum
, &cp
);
657 do_create_chan(struct net_device
*ndev
, void *data
)
660 struct net_device
*dev
;
661 struct sbecom_chan_param cp
;
664 if (copy_from_user(&cp
, data
, sizeof(struct sbecom_chan_param
)))
666 ci
= get_ci_by_dev(ndev
);
669 dev
= create_chan(ndev
, ci
, &cp
);
672 ret
= c4_new_chan(ci
, cp
.port
, cp
.channum
, dev
);
674 /* needed due to Ioctl calling sequence */
676 unregister_hdlc_device(dev
);
677 /* needed due to Ioctl calling sequence */
685 do_get_chan_stats(struct net_device
*ndev
, void *data
)
687 struct c4_chan_stats_wrap ccs
;
690 if (copy_from_user(&ccs
, data
,
691 sizeof(struct c4_chan_stats_wrap
)))
694 ret
= c4_get_chan_stats(ccs
.channum
, &ccs
.stats
);
698 if (copy_to_user(data
, &ccs
,
699 sizeof(struct c4_chan_stats_wrap
)))
704 do_set_loglevel(struct net_device
*ndev
, void *data
)
706 unsigned int cxt1e1_log_level
;
708 if (copy_from_user(&cxt1e1_log_level
, data
, sizeof(int)))
710 sbecom_set_loglevel(cxt1e1_log_level
);
715 do_deluser(struct net_device
*ndev
, int lockit
)
717 if (ndev
->flags
& IFF_UP
)
723 const struct c4_priv
*priv
;
726 priv
= (struct c4_priv
*)dev_to_hdlc(ndev
)->priv
;
728 channum
= priv
->channum
;
730 ch
= c4_find_chan(channum
);
733 ch
->user
= NULL
; /* will be freed, below */
736 /* needed if Ioctl calling sequence */
739 unregister_hdlc_device(ndev
);
740 /* needed if Ioctl calling sequence */
748 do_del_chan(struct net_device
*musycc_dev
, void *data
)
750 struct sbecom_chan_param cp
;
751 char buf
[sizeof(CHANNAME
) + 3];
752 struct net_device
*dev
;
755 if (copy_from_user(&cp
, data
,
756 sizeof(struct sbecom_chan_param
)))
758 if (cp
.channum
> 999)
760 snprintf(buf
, sizeof(buf
), CHANNAME
"%d", cp
.channum
);
761 dev
= __dev_get_by_name(&init_net
, buf
);
764 ret
= do_deluser(dev
, 1);
767 return c4_del_chan(cp
.channum
);
769 int c4_reset_board(void *);
772 do_reset(struct net_device
*musycc_dev
, void *data
)
774 const struct c4_priv
*priv
;
777 for (i
= 0; i
< 128; i
++) {
778 struct net_device
*ndev
;
779 char buf
[sizeof(CHANNAME
) + 3];
781 sprintf(buf
, CHANNAME
"%d", i
);
782 ndev
= __dev_get_by_name(&init_net
, buf
);
785 priv
= dev_to_hdlc(ndev
)->priv
;
787 if ((unsigned long) (priv
->ci
) ==
788 (unsigned long) (netdev_priv(musycc_dev
))) {
789 ndev
->flags
&= ~IFF_UP
;
790 netif_stop_queue(ndev
);
798 do_reset_chan_stats(struct net_device
*musycc_dev
, void *data
)
800 struct sbecom_chan_param cp
;
802 if (copy_from_user(&cp
, data
,
803 sizeof(struct sbecom_chan_param
)))
805 return c4_del_chan_stats(cp
.channum
);
809 c4_ioctl(struct net_device
*ndev
, struct ifreq
*ifr
, int cmd
)
819 struct sbe_brd_info bip
;
820 struct sbe_drv_info dip
;
821 struct sbe_iid_info iip
;
822 struct sbe_brd_addr bap
;
823 struct sbecom_chan_stats stats
;
824 struct sbecom_chan_param param
;
825 struct temux_card_stats cards
;
826 struct sbecom_card_param cardp
;
827 struct sbecom_framer_param frp
;
832 if (!capable(CAP_SYS_ADMIN
))
834 if (cmd
!= SIOCDEVPRIVATE
+ 15)
836 ci
= get_ci_by_dev(ndev
);
839 if (ci
->state
!= C_RUNNING
)
841 if (copy_from_user(&iocmd
, ifr
->ifr_data
, sizeof(iocmd
)))
844 if (copy_from_user(&len
, ifr
->ifr_data
+ sizeof(iocmd
), sizeof(len
)))
849 pr_info("c4_ioctl: iocmd %x, dir %x type %x nr %x iolen %d.\n", iocmd
,
850 _IOC_DIR(iocmd
), _IOC_TYPE(iocmd
), _IOC_NR(iocmd
),
853 iolen
= _IOC_SIZE(iocmd
);
854 if (iolen
> sizeof(arg
))
856 data
= ifr
->ifr_data
+ sizeof(iocmd
);
857 if (copy_from_user(&arg
, data
, iolen
))
862 case SBE_IOC_PORT_GET
:
863 ret
= do_get_port(ndev
, data
);
865 case SBE_IOC_PORT_SET
:
866 ret
= do_set_port(ndev
, data
);
868 case SBE_IOC_CHAN_GET
:
869 ret
= do_get_chan(ndev
, data
);
871 case SBE_IOC_CHAN_SET
:
872 ret
= do_set_chan(ndev
, data
);
875 ret
= do_del_chan(ndev
, data
);
877 case SBE_IOC_CHAN_NEW
:
878 ret
= do_create_chan(ndev
, data
);
880 case SBE_IOC_CHAN_GET_STAT
:
881 ret
= do_get_chan_stats(ndev
, data
);
883 case SBE_IOC_LOGLEVEL
:
884 ret
= do_set_loglevel(ndev
, data
);
886 case SBE_IOC_RESET_DEV
:
887 ret
= do_reset(ndev
, data
);
889 case SBE_IOC_CHAN_DEL_STAT
:
890 ret
= do_reset_chan_stats(ndev
, data
);
893 ret
= do_port_loop(ndev
, data
);
896 ret
= do_framer_rw(ndev
, data
);
899 ret
= do_musycc_rw(ndev
, data
);
902 ret
= do_pld_rw(ndev
, data
);
904 case SBE_IOC_IID_GET
:
905 ret
= (iolen
== sizeof(struct sbe_iid_info
)) ?
906 c4_get_iidinfo(ci
, &arg
.u
.iip
) : -EFAULT
;
907 if (ret
== 0) /* no error, copy data */
908 if (copy_to_user(data
, &arg
, iolen
))
918 static const struct net_device_ops c4_ops
= {
919 .ndo_open
= void_open
,
920 .ndo_start_xmit
= c4_linux_xmit
,
921 .ndo_do_ioctl
= c4_ioctl
,
924 static void c4_setup(struct net_device
*dev
)
926 dev
->type
= ARPHRD_VOID
;
927 dev
->netdev_ops
= &c4_ops
;
930 struct net_device
*__init
931 c4_add_dev(hdw_info_t
*hi
, int brdno
, unsigned long f0
, unsigned long f1
,
934 struct net_device
*ndev
;
937 ndev
= alloc_netdev(sizeof(ci_t
), SBE_IFACETMPL
, c4_setup
);
939 pr_warning("%s: no memory for struct net_device !\n",
941 error_flag
= -ENOMEM
;
944 ci
= (ci_t
*)(netdev_priv(ndev
));
948 ci
->state
= C_INIT
; /* mark as hardware not available */
951 ci
->brdno
= ci
->next
? ci
->next
->brdno
+ 1 : 0;
954 CI
= ci
; /* DEBUG, only board 0 usage */
956 strcpy(ci
->devname
, hi
->devname
);
959 #if defined(SBE_ISR_TASKLET)
960 tasklet_init(&ci
->ci_musycc_isr_tasklet
,
961 (void (*) (unsigned long)) musycc_intr_bh_tasklet
,
964 if (atomic_read(&ci
->ci_musycc_isr_tasklet
.count
) == 0)
965 tasklet_disable_nosync(&ci
->ci_musycc_isr_tasklet
);
966 #elif defined(SBE_ISR_IMMEDIATE)
967 ci
->ci_musycc_isr_tq
.routine
= (void *)(unsigned long)musycc_intr_bh_tasklet
;
968 ci
->ci_musycc_isr_tq
.data
= ci
;
972 if (register_netdev(ndev
) ||
973 (c4_init(ci
, (u_char
*) f0
, (u_char
*) f1
) != SBE_DRVR_SUCCESS
)) {
974 kfree(netdev_priv(ndev
));
976 error_flag
= -ENODEV
;
979 /*************************************************************
980 * int request_irq(unsigned int irq,
981 * void (*handler)(int, void *, struct pt_regs *),
982 * unsigned long flags, const char *dev_name, void *dev_id);
984 * irq -> The interrupt number that is being requested.
985 * handler -> Pointer to handling function being installed.
986 * flags -> A bit mask of options related to interrupt management.
987 * dev_name -> String used in /proc/interrupts to show owner of interrupt.
988 * dev_id -> Pointer (for shared interrupt lines) to point to its own
989 * private data area (to identify which device is interrupting).
991 * extern void free_irq(unsigned int irq, void *dev_id);
992 **************************************************************/
994 if (request_irq(irq0
, &c4_linux_interrupt
,
997 pr_warning("%s: MUSYCC could not get irq: %d\n",
999 unregister_netdev(ndev
);
1000 kfree(netdev_priv(ndev
));
1005 #ifdef CONFIG_SBE_PMCC4_NCOMM
1006 if (request_irq(irq1
, &c4_ebus_interrupt
, IRQF_SHARED
, ndev
->name
, ndev
)) {
1007 pr_warning("%s: EBUS could not get irq: %d\n", hi
->devname
, irq1
);
1008 unregister_netdev(ndev
);
1009 free_irq(irq0
, ndev
);
1010 kfree(netdev_priv(ndev
));
1017 /* setup board identification information */
1022 /* also sets PROM format type (promfmt) for later usage */
1023 hdw_sn_get(hi
, brdno
);
1025 switch (hi
->promfmt
) {
1026 case PROM_FORMAT_TYPE1
:
1027 memcpy(ndev
->dev_addr
,
1028 (FLD_TYPE1
*) (hi
->mfg_info
.pft1
.Serial
), 6);
1029 /* unaligned data acquisition */
1030 memcpy(&tmp
, (FLD_TYPE1
*) (hi
->mfg_info
.pft1
.Id
), 4);
1031 ci
->brd_id
= cpu_to_be32(tmp
);
1033 case PROM_FORMAT_TYPE2
:
1034 memcpy(ndev
->dev_addr
,
1035 (FLD_TYPE2
*) (hi
->mfg_info
.pft2
.Serial
), 6);
1036 /* unaligned data acquisition */
1037 memcpy(&tmp
, (FLD_TYPE2
*) (hi
->mfg_info
.pft2
.Id
), 4);
1038 ci
->brd_id
= cpu_to_be32(tmp
);
1042 memset(ndev
->dev_addr
, 0, 6);
1047 /* requires bid to be preset */
1048 sbeid_set_hdwbid(ci
);
1050 /* requires hdw_bid to be preset */
1051 sbeid_set_bdtype(ci
);
1055 #ifdef CONFIG_PROC_FS
1056 sbecom_proc_brd_init(ci
);
1058 #if defined(SBE_ISR_TASKLET)
1059 tasklet_enable(&ci
->ci_musycc_isr_tasklet
);
1062 error_flag
= c4_init2(ci
);
1063 if (error_flag
!= SBE_DRVR_SUCCESS
) {
1064 #ifdef CONFIG_PROC_FS
1065 sbecom_proc_brd_cleanup(ci
);
1067 unregister_netdev(ndev
);
1068 free_irq(irq1
, ndev
);
1069 free_irq(irq0
, ndev
);
1070 kfree(netdev_priv(ndev
));
1072 /* failure, error_flag is set */
1083 rtn
= c4hw_attach_all();
1085 return -rtn
; /* installation failure - see system log */
1087 /* housekeeping notifications */
1088 if (cxt1e1_log_level
!= log_level_default
)
1089 pr_info("NOTE: driver parameter <cxt1e1_log_level> changed from default %d to %d.\n",
1090 log_level_default
, cxt1e1_log_level
);
1091 if (cxt1e1_max_mru
!= max_mru_default
)
1092 pr_info("NOTE: driver parameter <cxt1e1_max_mru> changed from default %d to %d.\n",
1093 max_mru_default
, cxt1e1_max_mru
);
1094 if (cxt1e1_max_mtu
!= max_mtu_default
)
1095 pr_info("NOTE: driver parameter <cxt1e1_max_mtu> changed from default %d to %d.\n",
1096 max_mtu_default
, cxt1e1_max_mtu
);
1097 if (max_rxdesc_used
!= max_rxdesc_default
) {
1098 if (max_rxdesc_used
> 2000)
1099 max_rxdesc_used
= 2000; /* out-of-bounds reset */
1100 pr_info("NOTE: driver parameter <max_rxdesc_used> changed from default %d to %d.\n",
1101 max_rxdesc_default
, max_rxdesc_used
);
1103 if (max_txdesc_used
!= max_txdesc_default
) {
1104 if (max_txdesc_used
> 1000)
1105 max_txdesc_used
= 1000; /* out-of-bounds reset */
1106 pr_info("NOTE: driver parameter <max_txdesc_used> changed from default %d to %d.\n",
1107 max_txdesc_default
, max_txdesc_used
);
1109 return 0; /* installation success */
1114 * find any still allocated hdlc registrations and unregister via call to
1123 struct net_device
*ndev
;
1126 for (i
= 0, hi
= hdw_info
; i
< MAX_BOARDS
; i
++, hi
++) {
1127 if (hi
->ndev
) { /* a board has been attached */
1128 ci
= (ci_t
*)(netdev_priv(hi
->ndev
));
1129 for (j
= 0; j
< ci
->max_port
; j
++)
1130 for (k
= 0; k
< MUSYCC_NCHANS
; k
++) {
1131 ndev
= ci
->port
[j
].chan
[k
]->user
;
1133 do_deluser(ndev
, 0);
1143 cleanup_hdlc(); /* delete any missed channels */
1147 pr_info("SBE - driver removed.\n");
1150 module_init(c4_mod_init
);
1151 module_exit(c4_mod_remove
);
1153 MODULE_AUTHOR("SBE Technical Services <support@sbei.com>");
1154 MODULE_DESCRIPTION("wanPCI-CxT1E1 Generic HDLC WAN Driver module");
1155 #ifdef MODULE_LICENSE
1156 MODULE_LICENSE("GPL");
1159 /*** End-of-File ***/
This page took 0.052852 seconds and 4 git commands to generate.