wanpipe-7.0.21.tgz
This commit is contained in:
parent
a0440cbb4a
commit
0d59b592a4
|
@ -1,2 +1,2 @@
|
|||
wanpipe_linux: git ver 152b9f5
|
||||
wanpipe_common: git ver 8b632be
|
||||
wanpipe_linux: git ver 45abca5
|
||||
wanpipe_common: git ver 410a541
|
||||
|
|
|
@ -1 +1 @@
|
|||
wanpipe-7.0.20
|
||||
wanpipe-7.0.21
|
||||
|
|
13
ChangeLog
13
ChangeLog
|
@ -2,12 +2,21 @@
|
|||
WANPIPE TDM VOICE - IP/WAN Package
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
Author: Nenad Corbic <ncorbic@sangoma.com>
|
||||
Copyright (c) 1995-2016 Sangoma Technologies Inc.
|
||||
Copyright (c) 1995-2017 Sangoma Technologies Inc.
|
||||
|
||||
For more info visit: http://wiki.sangoma.com
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
* Tue Oct 4 2017 7.0.21
|
||||
==================================================================
|
||||
- Fix BRI intermittent frame loss or delay
|
||||
- Support for Kernel version 4.7+
|
||||
- BRI LINK activation logic update when hardhdlc is enable
|
||||
- Added verification for temporary storage
|
||||
- Setup and Makefile to support kernel version 4.7+
|
||||
- Fix tx timeout print undir tdm api data mode.
|
||||
|
||||
|
||||
* Mon May 19 2016 Nenad Corbic <ncorbic@sangoma.com> - 7.0.20
|
||||
==================================================================
|
||||
- Compilation fix in non-dahdi mode
|
||||
|
|
7
Makefile
7
Makefile
|
@ -181,6 +181,13 @@ KERN_SK_FOR_NODE_FEATURE=$(shell grep "sk_for_each.*node" $(KSRC)/include/net/so
|
|||
EXTRA_CFLAGS+=-DKERN_SK_FOR_NODE_FEATURE=$(KERN_SK_FOR_NODE_FEATURE)
|
||||
endif
|
||||
|
||||
ifneq (,$(wildcard $(KDIR)/include/linux/netdevice.h))
|
||||
KERN_NETIF_TRANS_UPDATE=$(shell grep "netif_trans_update" $(KDIR)/include/linux/netdevice.h -c)
|
||||
EXTRA_CFLAGS+=-DKERN_NETIF_TRANS_UPDATE=$(KERN_NETIF_TRANS_UPDATE)
|
||||
else
|
||||
KERN_NETIF_TRANS_UPDATE=$(shell grep "netif_trans_update" $(KSRC)/include/linux/netdevice.h -c)
|
||||
EXTRA_CFLAGS+=-DKERN_NETIF_TRANS_UPDATE=$(KERN_NETIF_TRANS_UPDATE)
|
||||
endif
|
||||
|
||||
# First pass, kernel Makefile reads module objects
|
||||
ifneq ($(KERNELRELEASE),)
|
||||
|
|
25
Setup
25
Setup
|
@ -193,7 +193,27 @@ check_kern_sock_for_feature ()
|
|||
fi
|
||||
}
|
||||
|
||||
check_kern_netdevice_feature ()
|
||||
{
|
||||
if [ -e $SOURCEDIR/include/linux/netdevice.h ];then
|
||||
eval "grep \"netif_trans_update\" $SOURCEDIR/include/linux/netdevice.h >/dev/null 2>/dev/null"
|
||||
if [ $? -eq 0 ]; then
|
||||
KERN_NETIF_TRANS_UPDATE="-DKERN_NETIF_TRANS_UPDATE=1"
|
||||
else
|
||||
KERN_NETIF_TRANS_UPDATE="-DKERN_NETIF_TRANS_UPDATE=0"
|
||||
fi
|
||||
PROTOCOL_DEFINES="$PROTOCOL_DEFINES $KERN_NETIF_TRANS_UPDATE "
|
||||
|
||||
elif [ -e $DEBSRCDIR/include/linux/netdevice.h ];then
|
||||
eval "grep \"netif_trans_update\" $DEBSRCDIR/include/linux/netdevice.h >/dev/null 2>/dev/null"
|
||||
if [ $? -eq 0 ]; then
|
||||
KERN_NETIF_TRANS_UPDATE="-DKERN_NETIF_TRANS_UPDATE=1"
|
||||
else
|
||||
KERN_NETIF_TRANS_UPDATE="-DKERN_NETIF_TRANS_UPDATE=0"
|
||||
fi
|
||||
PROTOCOL_DEFINES="$PROTOCOL_DEFINES $KERN_NETIF_TRANS_UPDATE "
|
||||
fi
|
||||
}
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Display error message.
|
||||
|
@ -3604,7 +3624,8 @@ CFLAGS="$CC -Wp,-MD,.wanpipe.o.d -nostdinc -iwithprefix include -D__LINUX__ -Dli
|
|||
check_kern_pde_feature
|
||||
|
||||
check_kern_sock_for_feature
|
||||
|
||||
|
||||
check_kern_netdevice_feature
|
||||
|
||||
if [ "$BRI_MODULE_TEST" = "YES" ]; then
|
||||
PROTOCOL_DEFINES="$PROTOCOL_DEFINES -DBUILD_MOD_TESTER"
|
||||
|
@ -7387,7 +7408,7 @@ KERNEL_UNAME=`uname -r`
|
|||
PKG_NAME=wanpipe
|
||||
DISTR_NAME="WANPIPE"
|
||||
PROD=wanrouter
|
||||
PROD_VER=7.0.20
|
||||
PROD_VER=7.0.21
|
||||
PROD_HOME=`pwd`
|
||||
META_CONF=$PROD_HOME/$PROD.rc
|
||||
WAN_INTR_DIR=$PROD_HOME/interfaces
|
||||
|
|
|
@ -6,7 +6,7 @@ WEC=../../../../patches/kdrivers/wanec
|
|||
WECOCT=../../../../patches/kdrivers/wanec/oct6100_api/include
|
||||
|
||||
INCLUDES=-I../ -I/usr/include -I/usr/src/libpri -I$(WLINC) -I$(WEC) -I$(WECOCT) -I$(WANINC) -I$(WANINC)/oct6100_api -I$(WANINC)/oct6100_api/oct6100api -I. -Ihdlc -I/usr/local/include
|
||||
CFLAGS += -D__LINUX__ -D_REENTRANT -D_GNU_SOURCE -O2 -DWANPIPE_TDM_API
|
||||
CFLAGS += -D__LINUX__ -D_REENTRANT -D_GNU_SOURCE -O0 -DWANPIPE_TDM_API
|
||||
CCFLAGS += -Wall -Wstrict-prototypes -Wmissing-prototypes -g
|
||||
|
||||
all: hdlc_test
|
||||
|
|
|
@ -831,7 +831,7 @@ void *process_con_tx(void *obj)
|
|||
break;
|
||||
}
|
||||
}
|
||||
log_printf("\nTx Unloading HDLC %p\n",slot);
|
||||
log_printf("\nTx Unloading HDLC \n");
|
||||
|
||||
thread_exit:
|
||||
|
||||
|
|
|
@ -2871,6 +2871,36 @@ int _LIBSNG_CALL sangoma_get_fe_status(sng_fd_t fd, wanpipe_api_t *tdm_api, unsi
|
|||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef WP_API_FEATURE_GET_FE_STATS
|
||||
int _LIBSNG_CALL sangoma_get_fe_stats(sng_fd_t fd, wanpipe_api_t *tdm_api, sdla_te_pmon_t *pmon_stats)
|
||||
{
|
||||
int err;
|
||||
|
||||
WANPIPE_API_INIT_CHAN(tdm_api, 0);
|
||||
SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
|
||||
tdm_api->wp_cmd.cmd = WP_API_CMD_GET_FE_STATS;
|
||||
err = sangoma_cmd_exec(fd, tdm_api);
|
||||
if (err == 0) {
|
||||
if (pmon_stats) {
|
||||
memcpy(pmon_stats, &tdm_api->wp_cmd.pmon_stats, sizeof(tdm_api->wp_cmd.pmon_stats));
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
int _LIBSNG_CALL sangoma_reset_fe_stats(sng_fd_t fd, wanpipe_api_t *tdm_api)
|
||||
{
|
||||
int err;
|
||||
|
||||
WANPIPE_API_INIT_CHAN(tdm_api, 0);
|
||||
SANGOMA_INIT_TDM_API_CMD_RESULT(*tdm_api);
|
||||
tdm_api->wp_cmd.cmd = WP_API_CMD_RESET_FE_STATS;
|
||||
err = sangoma_cmd_exec(fd, tdm_api);
|
||||
return err;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* get current Line Connection state - Connected/Disconnected */
|
||||
#ifdef WP_API_FEATURE_LINK_STATUS
|
||||
int _LIBSNG_CALL sangoma_get_link_status(sng_fd_t fd, wanpipe_api_t *tdm_api, unsigned char *current_status)
|
||||
|
|
|
@ -1093,6 +1093,30 @@ int _LIBSNG_CALL sangoma_set_fe_status(sng_fd_t fd, wanpipe_api_t *tdm_api, unsi
|
|||
|
||||
|
||||
|
||||
#ifdef WP_API_FEATURE_GET_FE_STATS
|
||||
|
||||
/*!
|
||||
\fn int sangoma_set_fe_stats(sng_fd_t fd, wanpipe_api_t *tdm_api, sdla_te_pmon_t *pmon_stats)
|
||||
\brief Get Front End Statistics
|
||||
\param fd device file descriptor
|
||||
\param tdm_api tdm api command structure
|
||||
\param pmon_stats front end satistics structure
|
||||
\return non-zero: error, 0: ok
|
||||
*/
|
||||
int _LIBSNG_CALL sangoma_get_fe_stats(sng_fd_t fd, wanpipe_api_t *tdm_api, sdla_te_pmon_t *pmon_stats);
|
||||
|
||||
/*!
|
||||
\fn int sangoma_reset_fe_stats(sng_fd_t fd, wanpipe_api_t *tdm_api)
|
||||
\brief Get Front End Statistics
|
||||
\param fd device file descriptor
|
||||
\param tdm_api tdm api command structure
|
||||
\return non-zero: error, 0: ok
|
||||
*/
|
||||
int _LIBSNG_CALL sangoma_reset_fe_stats(sng_fd_t fd, wanpipe_api_t *tdm_api);
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#ifdef WP_API_FEATURE_BUFFER_MULT
|
||||
/*!
|
||||
\fn int sangoma_tdm_set_buffer_multiplier(sng_fd_t fd, wanpipe_api_t *tdm_api, unsigned int multiplier)
|
||||
|
@ -1627,6 +1651,44 @@ int _LIBSNG_CALL sangoma_driver_port_start(sng_fd_t fd, port_management_struct_t
|
|||
int _LIBSNG_CALL sangoma_driver_port_stop(sng_fd_t fd, port_management_struct_t *port_mgmnt, unsigned short port_no);
|
||||
|
||||
|
||||
/*!
|
||||
\fn int sangoma_driver_port_start_if(sng_fd_t fd, port_management_struct_t *port_mgmnt, unsigned short port_no, unsigned short if_no)
|
||||
\brief Start a Port's interface, create Sangoma Communication interfaces.
|
||||
\param[in] fd Port Device file descriptor
|
||||
\param[out] port_mgmnt pointer to a port_management_struct_t structure.
|
||||
On return, sangoma_driver_port_stop() updates operation_status field
|
||||
of this structure.
|
||||
\param[in] port_no 1-based Port Number. Port numbers correspond to Port Names.
|
||||
For example, a 2-Port card will have ports named WANPIPE1 and WANPIPE2.
|
||||
\param[in] if_no 1-based Interface Number. Interface numbers correspond to Interface Names.
|
||||
For example, w1g1 on linux, wanpipe1_if2 on windows
|
||||
\return non-zero: system error. Call OS specific code to find cause of the error.
|
||||
Linux example: strerror(errno)
|
||||
Windows example: combination of GetLastError()/FormatMessage()
|
||||
zero: no system error. Check port_mgmt->operation_status.
|
||||
*/
|
||||
int _LIBSNG_CALL sangoma_driver_port_start_if(sng_fd_t fd, port_management_struct_t *port_mgmnt, unsigned short port_no, unsigned short if_no);
|
||||
|
||||
|
||||
/*!
|
||||
\fn int sangoma_driver_port_stop_if(sng_fd_t fd, port_management_struct_t *port_mgmnt, unsigned short port_no, unsigned short if_no)
|
||||
\brief Start a Port's interface, create Sangoma Communication interfaces.
|
||||
\param[in] fd Port Device file descriptor
|
||||
\param[out] port_mgmnt pointer to a port_management_struct_t structure.
|
||||
On return, sangoma_driver_port_stop() updates operation_status field
|
||||
of this structure.
|
||||
\param[in] port_no 1-based Port Number. Port numbers correspond to Port Names.
|
||||
For example, a 2-Port card will have ports named WANPIPE1 and WANPIPE2.
|
||||
\param[in] if_no 1-based Interface Number. Interface numbers correspond to Interface Names.
|
||||
For example, w1g1 on linux, wanpipe1_if2 on windows
|
||||
\return non-zero: system error. Call OS specific code to find cause of the error.
|
||||
Linux example: strerror(errno)
|
||||
Windows example: combination of GetLastError()/FormatMessage()
|
||||
zero: no system error. Check port_mgmt->operation_status.
|
||||
*/
|
||||
int _LIBSNG_CALL sangoma_driver_port_stop_if(sng_fd_t fd, port_management_struct_t *port_mgmnt, unsigned short port_no, unsigned short if_no);
|
||||
|
||||
|
||||
/*!
|
||||
\fn int sangoma_driver_port_set_config(sng_fd_t fd, port_cfg_t *port_cfg, unsigned short port_no)
|
||||
\brief Set Port's "Volatile" configuration. The configuration will not persist between system restarts.
|
||||
|
|
|
@ -148,6 +148,46 @@ int _LIBSNG_CALL sangoma_mgmt_cmd(sng_fd_t fd, wan_udp_hdr_t* wan_udp)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int _LIBSNG_CALL sangoma_driver_port_start_if(sng_fd_t fd, port_management_struct_t *port_mgmnt, unsigned short port_no, unsigned short if_no)
|
||||
{
|
||||
int err;
|
||||
port_mgmnt->operation_status = SANG_STATUS_GENERAL_ERROR;
|
||||
port_mgmnt->command_code = START_PORT_IF_CONFIG;
|
||||
port_mgmnt->port_no = port_no;
|
||||
port_mgmnt->data[0] = if_no;
|
||||
port_mgmnt->intf_no = if_no;
|
||||
|
||||
err = sangoma_port_mgmnt_ioctl(fd, port_mgmnt);
|
||||
if (err) {
|
||||
/* ioctl failed */
|
||||
return err;
|
||||
}
|
||||
|
||||
return port_mgmnt->operation_status;
|
||||
}
|
||||
|
||||
int _LIBSNG_CALL sangoma_driver_port_stop_if(sng_fd_t fd, port_management_struct_t *port_mgmnt, unsigned short port_no, unsigned short if_no)
|
||||
{
|
||||
int err;
|
||||
port_mgmnt->operation_status = SANG_STATUS_GENERAL_ERROR;
|
||||
port_mgmnt->command_code = STOP_PORT_IF;
|
||||
port_mgmnt->port_no = port_no;
|
||||
|
||||
#if defined __LINUX__
|
||||
sprintf(port_mgmnt->data,"w%dg%d",port_no, if_no);
|
||||
#else
|
||||
port_mgmnt->intf_no = if_no;
|
||||
#endif
|
||||
|
||||
err = sangoma_port_mgmnt_ioctl(fd, port_mgmnt);
|
||||
if (err) {
|
||||
/* ioctl failed */
|
||||
return err;
|
||||
}
|
||||
|
||||
return port_mgmnt->operation_status;
|
||||
}
|
||||
|
||||
int _LIBSNG_CALL sangoma_driver_port_start(sng_fd_t fd, port_management_struct_t *port_mgmnt, unsigned short port_no)
|
||||
{
|
||||
int err;
|
||||
|
|
|
@ -87,6 +87,7 @@ int write_data_to_file(unsigned char *data, unsigned int data_length);
|
|||
int sangoma_print_stats(sng_fd_t sangoma_dev);
|
||||
void cleanup(void);
|
||||
int handle_fe_rw (void);
|
||||
int sangoma_print_fe_stats(sng_fd_t sangoma_dev);
|
||||
|
||||
#ifdef __WINDOWS__
|
||||
BOOL WINAPI TerminateHandler(DWORD dwCtrlType);
|
||||
|
@ -221,6 +222,65 @@ int sangoma_print_stats(sng_fd_t sangoma_dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int sangoma_print_fe_stats(sng_fd_t sangoma_dev)
|
||||
{
|
||||
int err;
|
||||
wanpipe_api_t wp_api;
|
||||
sdla_fe_stats_t fe_stats_struct;
|
||||
sdla_fe_stats_t *fe_stats = &fe_stats_struct;
|
||||
sdla_te_pmon_t pmon_struct;
|
||||
sdla_te_pmon_t* pmon = &pmon_struct;
|
||||
memset(&wp_api,0,sizeof(wp_api));
|
||||
|
||||
#if 0
|
||||
sangoma_reset_fe_stats(sangoma_dev, &wp_api);
|
||||
#endif
|
||||
|
||||
err=sangoma_get_fe_stats(sangoma_dev, &wp_api, pmon);
|
||||
if (err) {
|
||||
printf("sangoma_get_fe_stats(() failed (err: %d (0x%X))!\n", err, err);
|
||||
return 1;
|
||||
}
|
||||
|
||||
printf("\n******* FE STATISTICS *******\n");
|
||||
|
||||
printf("\n\n***** Performance Monitoring Counters *****\n\n");
|
||||
if (pmon->mask & WAN_TE_BIT_PMON_LCV){
|
||||
printf("Line Code Violation\t: %d\n",
|
||||
pmon->lcv_errors);
|
||||
}
|
||||
if (pmon->mask & WAN_TE_BIT_PMON_BEE){
|
||||
printf("Bit Errors (CRC6/Ft/Fs)\t: %d\n",
|
||||
pmon->bee_errors);
|
||||
}
|
||||
if (pmon->mask & WAN_TE_BIT_PMON_OOF){
|
||||
printf("Out of Frame Errors\t: %d\n",
|
||||
pmon->oof_errors);
|
||||
}
|
||||
if (pmon->mask & WAN_TE_BIT_PMON_FEB){
|
||||
printf("Far End Block Errors\t: %d\n",
|
||||
pmon->feb_errors);
|
||||
}
|
||||
if (pmon->mask & WAN_TE_BIT_PMON_CRC4){
|
||||
printf("CRC4 Errors\t\t: %d\n",
|
||||
pmon->crc4_errors);
|
||||
}
|
||||
if (pmon->mask & WAN_TE_BIT_PMON_FER){
|
||||
printf("Framing Bit Errors\t: %d\n",
|
||||
pmon->fer_errors);
|
||||
}
|
||||
if (pmon->mask & WAN_TE_BIT_PMON_FAS){
|
||||
printf("FAS Errors\t\t: %d\n",
|
||||
pmon->fas_errors);
|
||||
}
|
||||
printf("Sync Errors\t\t: %d\n",
|
||||
pmon->sync_errors);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
\fn int read_data(uint32_t dev_index)
|
||||
\brief Read data buffer from a device
|
||||
|
@ -972,6 +1032,8 @@ int open_sangoma_device()
|
|||
sangoma_flush_bufs(dev_fd,&tdm_api);
|
||||
|
||||
sangoma_print_stats(dev_fd);
|
||||
sangoma_print_fe_stats(dev_fd);
|
||||
|
||||
|
||||
|
||||
return err;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
Package: wanpipe
|
||||
Version: 7.0.20-0
|
||||
Version: 7.0.21-0
|
||||
Section: networking
|
||||
Priority: optional
|
||||
Architecture: all
|
||||
|
|
|
@ -237,8 +237,9 @@ typedef struct aft_config
|
|||
|
||||
static __inline u32 AFT_PORT_REG(sdla_t *card, u32 reg)
|
||||
{
|
||||
char comm_port;
|
||||
if (AFT_NEEDS_DEFAULT_REG_OFFSET(card->adptr_type)) {
|
||||
char comm_port = card->wandev.comm_port;
|
||||
comm_port = (char)card->wandev.comm_port;
|
||||
if (card->adptr_type == AFT_ADPTR_W400) {
|
||||
/* Force GSM comm port to 0, as we fake ports in the driver */
|
||||
comm_port = 0;
|
||||
|
|
|
@ -644,7 +644,9 @@ enum {
|
|||
|
||||
FLUSH_PORT_OPERATIONAL_STATS, //Reset port's statistics counters in API driver.
|
||||
|
||||
WANPIPE_HARDWARE_RESCAN /* Re scan the PCI & USB bus for sangoma hardware */
|
||||
WANPIPE_HARDWARE_RESCAN, /* Re scan the PCI & USB bus for sangoma hardware */
|
||||
START_PORT_IF_CONFIG, /* Start interface with Port number and interface number */
|
||||
STOP_PORT_IF /* Stop interface with Port number and interface number */
|
||||
|
||||
};
|
||||
|
||||
|
@ -711,6 +713,7 @@ typedef struct {
|
|||
unsigned int command_code; /* Management Command Code */
|
||||
unsigned int operation_status; /* operation completion status */
|
||||
unsigned short port_no; /* port number */
|
||||
unsigned short intf_no; /* interface number */
|
||||
unsigned char data[PORT_MGMT_MAX_DATA_SIZE]; /* data buffer passed from/to caller */
|
||||
}port_management_struct_t;
|
||||
|
||||
|
|
|
@ -130,7 +130,7 @@ static int __inline aft_timing_stop_calculate_elapsed(aft_driver_timing_t *drv_t
|
|||
|
||||
struct timeval current_tv;
|
||||
do_gettimeofday(¤t_tv);
|
||||
elapsed=aft_calc_elapsed(&drv_timing->timing_tv,¤t_tv);
|
||||
elapsed=(unsigned long)aft_calc_elapsed(&drv_timing->timing_tv,¤t_tv);
|
||||
|
||||
if (elapsed > drv_timing->max_latency) {
|
||||
drv_timing->max_latency=elapsed;
|
||||
|
@ -173,7 +173,7 @@ static int __inline aft_timing_stop_calculate_elapsed(aft_driver_timing_t *drv_t
|
|||
if (elapsed > drv_timing->latency_avg + limit) {
|
||||
drv_timing->above_avg++;
|
||||
}
|
||||
if (drv_timing->latency_avg > limit) {
|
||||
if ((int)drv_timing->latency_avg > limit) {
|
||||
if (drv_timing->latency_avg - limit > elapsed) {
|
||||
drv_timing->below_avg++;
|
||||
}
|
||||
|
|
|
@ -68,7 +68,7 @@ static __inline int read_reg_ds26519_fpga (sdla_t* card, u32 addr){
|
|||
addr = addr & 0X3FFF;
|
||||
addr = addr | 0x8000;
|
||||
SDLA_HW_T116_FE_ACCESS_BLOCK;
|
||||
card->hw_iface.bus_write_2(card->hw,0x44,addr);
|
||||
card->hw_iface.bus_write_2(card->hw,0x44,(u16)addr);
|
||||
SDLA_HW_T116_FE_ACCESS_BLOCK;
|
||||
card->hw_iface.bus_read_4(card->hw,0x44,&data);
|
||||
SDLA_HW_T116_FE_ACCESS_BLOCK;
|
||||
|
@ -82,7 +82,7 @@ static __inline int write_reg_ds26519_fpga (sdla_t* card, u32 addr, u32 data){
|
|||
addr = addr & 0X3FFF;
|
||||
addr = addr | 0x8000;
|
||||
SDLA_HW_T116_FE_ACCESS_BLOCK;
|
||||
card->hw_iface.bus_write_2(card->hw,0x44,addr);
|
||||
card->hw_iface.bus_write_2(card->hw,0x44,(u16)addr);
|
||||
SDLA_HW_T116_FE_ACCESS_BLOCK;
|
||||
shifted_data = (data << 16) & 0x00FF0000;
|
||||
card->hw_iface.bus_write_4(card->hw,0x44,shifted_data);
|
||||
|
|
|
@ -285,8 +285,9 @@ typedef struct {
|
|||
int num_ports; /* number of S and U interfaces */
|
||||
int max_fifo; /* always 4 fifos per port */
|
||||
u_int8_t max_z; /* fifo depth -1 */
|
||||
|
||||
|
||||
u32 fifo_irqmsk;
|
||||
u32 prev_fifoirq;
|
||||
|
||||
bri_xhfc_port_t port[BRI_MAX_PORTS_PER_CHIP]; /* 2 ports - one for each Line intercace */
|
||||
|
||||
|
|
|
@ -268,7 +268,7 @@
|
|||
#define WAN_T1_ALARM_THRESHOLD_AIS_OFF (1) // must be 10s
|
||||
#define WAN_T1_ALARM_THRESHOLD_LOS_ON (3) // must be 2.5s
|
||||
#define WAN_T1_ALARM_THRESHOLD_LOS_OFF (1) // must be 10s
|
||||
#define WAN_T1_ALARM_THRESHOLD_RAI_ON (3) // must be 2.5s
|
||||
#define WAN_T1_ALARM_THRESHOLD_RAI_ON (4) // in loopback condition we have to set higher debounce time
|
||||
#define WAN_T1_ALARM_THRESHOLD_RAI_OFF (1) // must be 10s
|
||||
|
||||
/* TE1 critical flag */
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
#define __WANPIPE_API_IFACE_H_
|
||||
|
||||
#include "wanpipe_api_hdr.h"
|
||||
#include "sdla_te1.h"
|
||||
|
||||
/*!
|
||||
\typedef sng_fd_t
|
||||
|
@ -96,6 +97,7 @@ typedef int sng_fd_t;
|
|||
#define WP_API_FEATURE_SS7_FORCE_RX 1
|
||||
#define WP_API_FEATURE_SS7_CFG_STATUS 1
|
||||
#define WP_API_FEATURE_LIBSNG_HWEC_DTMF_REMOVAL 1
|
||||
#define WP_API_FEATURE_GET_FE_STATS 1
|
||||
|
||||
|
||||
/*!
|
||||
|
@ -300,6 +302,8 @@ enum wanpipe_api_cmds
|
|||
WP_API_CMD_EC_IOCTL, /*!< Execute command in HWEC module of the Driver */
|
||||
WP_API_CMD_SS7_FORCE_RX, /*!< Force SS7 Receive */
|
||||
WP_API_CMD_SS7_GET_CFG_STATUS, /*!< Get current ss7 configuration status */
|
||||
WP_API_CMD_GET_FE_STATS, /*!< Get full fe statistics */
|
||||
WP_API_CMD_RESET_FE_STATS, /*!< Reset FE Pmon statistics */
|
||||
|
||||
/* Add only debugging commands here */
|
||||
WP_API_CMD_GEN_FIFO_ERR_TX=500,
|
||||
|
@ -753,6 +757,7 @@ typedef struct wanpipe_api_cmd
|
|||
wan_driver_version_t version;
|
||||
wan_iovec_list_t iovec_list;
|
||||
wan_api_ss7_cfg_status_t ss7_cfg_status;
|
||||
sdla_te_pmon_t pmon_stats;
|
||||
struct {
|
||||
unsigned char data[WANPIPE_API_CMD_SZ_UNION];
|
||||
unsigned int data_len;
|
||||
|
|
|
@ -363,6 +363,7 @@ typedef struct wan_xilinx_conf
|
|||
unsigned char hw_port_map; /* A108 hw port map: Default or Linear */
|
||||
unsigned short rx_fifo_trigger;
|
||||
unsigned short tx_fifo_trigger;
|
||||
unsigned char fe_sync_disable;
|
||||
} wan_xilinx_conf_t;
|
||||
|
||||
typedef struct wan_xilinx_conf_if
|
||||
|
|
|
@ -2392,7 +2392,6 @@ static __inline void wan_netif_fake_init(netdevice_t *d)
|
|||
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
static struct net_device *sng_alloc_netdev(int sizeof_priv, const char *name,
|
||||
void (*setup)(struct net_device *))
|
||||
|
@ -2403,6 +2402,7 @@ static struct net_device *sng_alloc_netdev(int sizeof_priv, const char *name,
|
|||
return alloc_netdev(sizeof_priv, name, setup);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
static __inline void*
|
||||
|
@ -2642,7 +2642,9 @@ static __inline int wan_netif_mcount(netdevice_t* dev)
|
|||
|
||||
static __inline int wan_netif_set_ticks(netdevice_t* dev, unsigned long ticks)
|
||||
{
|
||||
#if defined(__LINUX__) || defined(__WINDOWS__)
|
||||
#if defined(__LINUX__) && defined(KERN_NETIF_TRANS_UPDATE) && (KERN_NETIF_TRANS_UPDATE > 0)
|
||||
netif_trans_update(dev);
|
||||
#elif defined(__LINUX__) || defined(__WINDOWS__)
|
||||
dev->trans_start = ticks;
|
||||
#elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__)
|
||||
#else
|
||||
|
|
|
@ -179,7 +179,7 @@ void *PDE_DATA(const struct inode *inode)
|
|||
#define LINUX_3_0
|
||||
/* Not sure exactly when they removed write_proc_t, but in 3.11.8 is not there anymore */
|
||||
#if defined(KERN_PROC_PDE_FEATURE) && KERN_PROC_PDE_FEATURE > 0
|
||||
typedef int (write_proc_t)(char *, char **, off_t, int, int);
|
||||
typedef int (write_proc_t)(struct file *, const char *, unsigned long, void *);
|
||||
#endif
|
||||
#ifndef pci_dev_b
|
||||
#define pci_dev_b(n) list_entry(n, struct pci_dev, bus_list)
|
||||
|
|
|
@ -261,6 +261,7 @@ typedef struct wplip_link
|
|||
|
||||
#ifdef WPLIP_TTY_SUPPORT
|
||||
struct tty_struct *tty;
|
||||
struct tty_port tty_port;
|
||||
unsigned int tty_minor;
|
||||
unsigned int tty_open;
|
||||
unsigned char *tty_buf;
|
||||
|
|
|
@ -10,14 +10,14 @@
|
|||
#define WANPIPE_COMPANY "Sangoma Technologies Inc"
|
||||
|
||||
/********** LINUX **********/
|
||||
#define WANPIPE_VERSION "7.0.20"
|
||||
#define WANPIPE_VERSION "7.0.21"
|
||||
#define WANPIPE_SUB_VERSION "0"
|
||||
#define WANPIPE_LITE_VERSION "1.1.1"
|
||||
|
||||
#if defined(__LINUX__)
|
||||
#define WANPIPE_VERSION_MAJOR 7
|
||||
#define WANPIPE_VERSION_MINOR 0
|
||||
#define WANPIPE_VERSION_MINOR1 20
|
||||
#define WANPIPE_VERSION_MINOR1 21
|
||||
#define WANPIPE_VERSION_MINOR2 0
|
||||
#endif
|
||||
|
||||
|
@ -42,15 +42,15 @@
|
|||
|
||||
# define WP_BUILD_NBE41_HPBOA 0
|
||||
|
||||
# define WANPIPE_VERSION_MAJOR 7
|
||||
# define WANPIPE_VERSION_MINOR 0
|
||||
# define WANPIPE_VERSION_MAJOR 7
|
||||
# define WANPIPE_VERSION_MINOR 0
|
||||
|
||||
# if WP_BUILD_NBE41_HPBOA
|
||||
# define WANPIPE_VERSION_MINOR1 0
|
||||
# define WANPIPE_VERSION_MINOR2 0
|
||||
# define WANPIPE_VERSION_MINOR1 20
|
||||
# define WANPIPE_VERSION_MINOR2 0
|
||||
# else
|
||||
# define WANPIPE_VERSION_MINOR1 0
|
||||
# define WANPIPE_VERSION_MINOR2 0
|
||||
# define WANPIPE_VERSION_MINOR1 20
|
||||
# define WANPIPE_VERSION_MINOR2 0
|
||||
# endif
|
||||
|
||||
# undef VER_PRODUCTVERSION
|
||||
|
@ -59,17 +59,17 @@
|
|||
# undef VER_COMPANYNAME_STR
|
||||
|
||||
# if WP_BUILD_NBE41_HPBOA
|
||||
# define VER_PRODUCTVERSION 7,0,0,0
|
||||
# define VER_PRODUCTVERSION_STR "7.0.0.0"
|
||||
# define VER_PRODUCTVERSION 7,0,20,0
|
||||
# define VER_PRODUCTVERSION_STR "7.0.20.0"
|
||||
# else
|
||||
# define VER_PRODUCTVERSION 7,0,0,0
|
||||
# define VER_PRODUCTVERSION_STR "7.0.0.0"
|
||||
# define VER_PRODUCTVERSION 7,0,20,0
|
||||
# define VER_PRODUCTVERSION_STR "7.0.20.0"
|
||||
# endif
|
||||
|
||||
# define __BUILDDATE__ Dec 24, 2012
|
||||
|
||||
# define VER_COMPANYNAME_STR "Sangoma Technologies Corporation"
|
||||
# define VER_LEGALCOPYRIGHT_YEARS "1984-2012"
|
||||
# define VER_LEGALCOPYRIGHT_YEARS "1984-2016"
|
||||
# define VER_LEGALCOPYRIGHT_STR "Copyright (c) Sangoma Technologies Corp."
|
||||
# define VER_PRODUCTNAME_STR "Sangoma WANPIPE (TM)"
|
||||
|
||||
|
@ -78,11 +78,11 @@
|
|||
# undef WANPIPE_SUB_VERSION
|
||||
|
||||
# if WP_BUILD_NBE41_HPBOA
|
||||
# define WANPIPE_VERSION_Windows "7.0.0"
|
||||
# define WANPIPE_SUB_VERSION_Windows "0"
|
||||
# define WANPIPE_VERSION_Windows "7.0.20"
|
||||
# define WANPIPE_SUB_VERSION_Windows "0"
|
||||
# else
|
||||
# define WANPIPE_VERSION_Windows "7.0.0"
|
||||
# define WANPIPE_SUB_VERSION_Windows "0"
|
||||
# define WANPIPE_VERSION_Windows "7.0.20"
|
||||
# define WANPIPE_SUB_VERSION_Windows "0"
|
||||
# endif
|
||||
|
||||
# define WANPIPE_VERSION_BETA_Windows 0
|
||||
|
|
|
@ -478,6 +478,7 @@ int wanpipe_wandev_create(void);
|
|||
int wanpipe_wandev_free(void);
|
||||
|
||||
int wan_device_new_if (wan_device_t *wandev, wanif_conf_t *u_conf, int user);
|
||||
int wan_device_del_if (wan_device_t *wandev, char *u_name, int user);
|
||||
int wan_device_shutdown (wan_device_t *wandev, wandev_conf_t *u_conf);
|
||||
int wan_device_setup (wan_device_t *wandev, wandev_conf_t *u_conf, int user);
|
||||
wan_device_t *wan_find_wandev_device(char *name);
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,4 +1,5 @@
|
|||
/*====================================================================
|
||||
lip_link->tty_port.count++;
|
||||
*
|
||||
*
|
||||
*
|
||||
|
@ -7,7 +8,7 @@
|
|||
#include <linux/wanpipe_lip.h>
|
||||
|
||||
#define NR_PORTS 32
|
||||
#define WAN_TTY_MAJOR 240
|
||||
#define WAN_TTY_MAJOR 0
|
||||
#define WAN_TTY_MINOR 0
|
||||
|
||||
#define WPLIP_MINOR_DEV(_port) (tty_lip_link_map[_port])
|
||||
|
@ -191,6 +192,7 @@ static void wanpipe_tty_close(struct tty_struct *tty, struct file * filp)
|
|||
wplip_spin_unlock_irq(&lip_link->bh_lock,&smp_flags);
|
||||
|
||||
}
|
||||
tty_port_close(&lip_link->tty_port, tty, filp);
|
||||
return;
|
||||
}
|
||||
static int wanpipe_tty_open(struct tty_struct *tty, struct file * filp)
|
||||
|
@ -204,14 +206,14 @@ static int wanpipe_tty_open(struct tty_struct *tty, struct file * filp)
|
|||
|
||||
if (!tty->driver_data){
|
||||
int port;
|
||||
#ifdef LINUX_2_6
|
||||
port = tty->index;
|
||||
#else
|
||||
port = MINOR(tty->device) - tty->driver.minor_start;
|
||||
#endif
|
||||
if ((port < 0) || (port >= NR_PORTS))
|
||||
if ((port < 0) || (port >= NR_PORTS)){
|
||||
DEBUG_ERROR("TTY Open index %d out of range\n",port);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
DEBUG_EVENT("Opening TTY Driver on port %i!\n",port);
|
||||
|
||||
tty->driver_data = WPLIP_MINOR_DEV(port);
|
||||
if (!tty->driver_data)
|
||||
return -ENODEV;
|
||||
|
@ -220,6 +222,7 @@ static int wanpipe_tty_open(struct tty_struct *tty, struct file * filp)
|
|||
lip_link = (wplip_link_t*)tty->driver_data;
|
||||
|
||||
if (!lip_link){
|
||||
DEBUG_ERROR("TTY Open failed to find lip port for index %d\n",tty->index);
|
||||
wplip_spin_lock_irq(&lip_link->bh_lock,&smp_flags);
|
||||
lip_link->tty=NULL;
|
||||
wplip_spin_unlock_irq(&lip_link->bh_lock,&smp_flags);
|
||||
|
@ -241,6 +244,8 @@ static int wanpipe_tty_open(struct tty_struct *tty, struct file * filp)
|
|||
}
|
||||
|
||||
++lip_link->tty_open;
|
||||
lip_link->tty_port.count++;
|
||||
tty_port_tty_set(&lip_link->tty_port, tty);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -582,6 +587,23 @@ int wanpipe_tty_read_proc(char *page, char **start, off_t off, int count,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int wanpipe_tty_carrier_raised(struct tty_port *port)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static void wanpipe_tty_dtr_rts(struct tty_port *port, int raise)
|
||||
{
|
||||
}
|
||||
static void wanpipe_tty_do_close(struct tty_port *port)
|
||||
{
|
||||
}
|
||||
|
||||
static int wanpipe_tty_port_activate(struct tty_port *port, struct tty_struct *tty)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#ifdef LINUX_2_6
|
||||
static struct tty_operations wanpipe_tty_ops = {
|
||||
.open = wanpipe_tty_open,
|
||||
|
@ -599,9 +621,22 @@ static struct tty_operations wanpipe_tty_ops = {
|
|||
.stop = wanpipe_tty_stop,
|
||||
.start = wanpipe_tty_start,
|
||||
.hangup = wanpipe_tty_hangup,
|
||||
.break_ctl = NULL,
|
||||
.wait_until_sent = NULL,
|
||||
.tiocmget = NULL,
|
||||
.tiocmset = NULL,
|
||||
.proc_fops = NULL,
|
||||
|
||||
};
|
||||
#endif
|
||||
|
||||
static const struct tty_port_operations wp_port_ops = {
|
||||
.activate = wanpipe_tty_port_activate,
|
||||
.carrier_raised = wanpipe_tty_carrier_raised,
|
||||
.dtr_rts = wanpipe_tty_dtr_rts,
|
||||
.shutdown = wanpipe_tty_do_close,
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* The serial driver boot-time initialization code!
|
||||
|
@ -641,10 +676,7 @@ int wplip_reg_tty(wplip_link_t *lip_link, wanif_conf_t *cfg)
|
|||
|
||||
serial_driver->magic = TTY_DRIVER_MAGIC;
|
||||
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
|
||||
serial_driver->owner = THIS_MODULE;
|
||||
#endif
|
||||
|
||||
serial_driver->driver_name = "wanpipe_tty";
|
||||
#if (LINUX_VERSION_CODE > 0x2032D && defined(CONFIG_DEVFS_FS))
|
||||
serial_driver->name = "ttyWP/%d";
|
||||
|
@ -659,54 +691,16 @@ int wplip_reg_tty(wplip_link_t *lip_link, wanif_conf_t *cfg)
|
|||
serial_driver->init_termios = tty_std_termios;
|
||||
serial_driver->init_termios.c_cflag =
|
||||
B9600 | CS8 | CREAD | HUPCL | CLOCAL;
|
||||
serial_driver->flags = TTY_DRIVER_REAL_RAW;
|
||||
serial_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
|
||||
|
||||
|
||||
#ifdef LINUX_2_6
|
||||
tty_set_operations(serial_driver, &wanpipe_tty_ops);
|
||||
#else
|
||||
serial_driver->refcount = &serial_refcount;
|
||||
serial_driver->table = serial_table;
|
||||
serial_driver->termios = serial_termios;
|
||||
serial_driver->termios_locked = serial_termios_locked;
|
||||
|
||||
serial_driver->open = wanpipe_tty_open;
|
||||
serial_driver->close = wanpipe_tty_close;
|
||||
serial_driver->write = wanpipe_tty_write;
|
||||
|
||||
serial_driver->put_char = wanpipe_tty_put_char;
|
||||
serial_driver->flush_chars = wanpipe_tty_flush_chars;
|
||||
serial_driver->write_room = wanpipe_tty_write_room;
|
||||
serial_driver->chars_in_buffer = wanpipe_tty_chars_in_buffer;
|
||||
serial_driver->flush_buffer = wanpipe_tty_flush_buffer;
|
||||
//serial_driver->ioctl = wanpipe_tty_ioctl;
|
||||
serial_driver->throttle = wanpipe_tty_throttle;
|
||||
serial_driver->unthrottle = wanpipe_tty_unthrottle;
|
||||
serial_driver->send_xchar = wanpipe_tty_send_xchar;
|
||||
serial_driver->set_termios = wanpipe_tty_set_termios;
|
||||
serial_driver->stop = wanpipe_tty_stop;
|
||||
serial_driver->start = wanpipe_tty_start;
|
||||
serial_driver->hangup = wanpipe_tty_hangup;
|
||||
serial_driver->break_ctl = wanpipe_tty_break;
|
||||
serial_driver->wait_until_sent = wanpipe_tty_wait_until_sent;
|
||||
serial_driver->read_proc = wanpipe_tty_read_proc;
|
||||
|
||||
/*
|
||||
* The callout device is just like normal device except for
|
||||
* major number and the subtype code.
|
||||
*/
|
||||
callout_driver = serial_driver;
|
||||
#if (LINUX_VERSION_CODE > 0x2032D && defined(CONFIG_DEVFS_FS))
|
||||
callout_driver.name = "cuwp/%d";
|
||||
#else
|
||||
callout_driver.name = "cuwp";
|
||||
#endif
|
||||
callout_driver.major = TTYAUX_MAJOR;
|
||||
callout_driver.subtype = SERIAL_TYPE_CALLOUT;
|
||||
callout_driver.read_proc = 0;
|
||||
callout_driver.proc_entry = 0;
|
||||
#endif
|
||||
|
||||
|
||||
if (tty_register_driver(serial_driver)){
|
||||
DEBUG_EVENT( "%s: Failed to register serial driver!\n",
|
||||
lip_link->name);
|
||||
|
@ -714,13 +708,6 @@ int wplip_reg_tty(wplip_link_t *lip_link, wanif_conf_t *cfg)
|
|||
serial_driver=NULL;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
#ifndef LINUX_2_6
|
||||
if (tty_register_driver(&callout_driver)){
|
||||
DEBUG_EVENT( "%s: Failed to register callout driver!\n",
|
||||
lip_link->name);
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
@ -749,19 +736,26 @@ int wplip_reg_tty(wplip_link_t *lip_link, wanif_conf_t *cfg)
|
|||
state->close_delay = 5*HZ/10;
|
||||
state->closing_wait = 30*HZ;
|
||||
|
||||
#ifndef LINUX_2_6
|
||||
state->callout_termios = callout_driver.init_termios;
|
||||
state->normal_termios = serial_driver->init_termios;
|
||||
#endif
|
||||
state->icount.cts = state->icount.dsr =
|
||||
state->icount.rng = state->icount.dcd = 0;
|
||||
state->icount.rng = state->icount.dcd = 0;
|
||||
state->icount.rx = state->icount.tx = 0;
|
||||
state->icount.frame = state->icount.parity = 0;
|
||||
state->icount.overrun = state->icount.brk = 0;
|
||||
state->irq = 0;
|
||||
|
||||
DEBUG_EVENT("TTY Port Init\n");
|
||||
tty_port_init(&lip_link->tty_port);
|
||||
lip_link->tty_port.closing_wait = 30*HZ;;
|
||||
lip_link->tty_port.close_delay = HZ / 2;
|
||||
lip_link->tty_port.flags = 0;
|
||||
|
||||
lip_link->tty_port.ops = &wp_port_ops;
|
||||
|
||||
tty_port_register_device(&lip_link->tty_port, serial_driver, lip_link->tty_minor, NULL );
|
||||
|
||||
WAN_TASKQ_INIT((&lip_link->tty_task_queue),0,tty_poll_task,lip_link);
|
||||
|
||||
|
||||
lip_link->tty_opt=1;
|
||||
return 0;
|
||||
}
|
||||
|
@ -780,27 +774,22 @@ int wplip_unreg_tty(wplip_link_t *lip_link)
|
|||
return -EBUSY;
|
||||
}
|
||||
|
||||
tty_unregister_device(serial_driver, lip_link->tty_minor);
|
||||
tty_port_destroy(&lip_link->tty_port);
|
||||
|
||||
if ((--tty_init_cnt) == 0 && serial_driver){
|
||||
int e1;
|
||||
#ifndef LINUX_2_6
|
||||
serial_driver->refcount=0;
|
||||
#endif
|
||||
if ((e1 = tty_unregister_driver(serial_driver))){
|
||||
DEBUG_EVENT( "SERIAL: failed to unregister serial driver (%d)\n",
|
||||
e1);
|
||||
}
|
||||
put_tty_driver(serial_driver);
|
||||
serial_driver=NULL;
|
||||
#ifndef LINUX_2_6
|
||||
if ((e1 = tty_unregister_driver(&callout_driver))){
|
||||
DEBUG_EVENT( "SERIAL: failed to unregister callout driver (%d)\n",
|
||||
e1);
|
||||
}
|
||||
#endif
|
||||
DEBUG_EVENT( "%s: Unregistering TTY Driver, Major %i\n",
|
||||
lip_link->name,WAN_TTY_MAJOR);
|
||||
|
||||
}
|
||||
|
||||
wplip_spin_lock_irq(&lip_link->bh_lock,&smp_flags);
|
||||
lip_link->tty=NULL;
|
||||
|
||||
|
|
|
@ -503,18 +503,18 @@ int a104_led_ctrl(sdla_t *card, int color, int led_pos, int on)
|
|||
}
|
||||
|
||||
if(IS_56K_CARD(card)){
|
||||
aft_56k_write_cpld(card,card->wandev.comm_port + 0x08,card->u.aft.led_ctrl);
|
||||
aft_56k_write_cpld(card,card->wandev.comm_port + 0x08,(u16)card->u.aft.led_ctrl);
|
||||
}else{
|
||||
if (card->adptr_type == A108_ADPTR_8TE1) {
|
||||
/* On A108 Card the leds are flipped. So the top offset is for leds 1 to 4
|
||||
and vice versa */
|
||||
if (card->wandev.comm_port < 4) {
|
||||
aft_te1_write_cpld(card,(4+card->wandev.comm_port) + 0x08,card->u.aft.led_ctrl);
|
||||
aft_te1_write_cpld(card,(4+card->wandev.comm_port) + 0x08,(u16)card->u.aft.led_ctrl);
|
||||
} else {
|
||||
aft_te1_write_cpld(card,(card->wandev.comm_port-4) + 0x08,card->u.aft.led_ctrl);
|
||||
aft_te1_write_cpld(card,(card->wandev.comm_port-4) + 0x08,(u16)card->u.aft.led_ctrl);
|
||||
}
|
||||
} else {
|
||||
aft_te1_write_cpld(card,card->wandev.comm_port + 0x08,card->u.aft.led_ctrl);
|
||||
aft_te1_write_cpld(card,card->wandev.comm_port + 0x08,(u16)card->u.aft.led_ctrl);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -997,6 +997,10 @@ int a104_set_digital_fe_clock(sdla_t * card)
|
|||
if (card->u.aft.firm_id == AFT_DS_FE_CORE_ID){
|
||||
mclk_ver=AFT_TDMV_SHARK_A108_FRM_CLK_SYNC_VER;
|
||||
switch(card->adptr_type){
|
||||
case A116_ADPTR_16TE1:
|
||||
/* A116 is actually two 8 port cards */
|
||||
max_port=8;
|
||||
break;
|
||||
case A108_ADPTR_8TE1:
|
||||
max_port=8;
|
||||
break;
|
||||
|
|
|
@ -482,17 +482,17 @@ int aft_bri_led_ctrl(sdla_t *card, int color, int led_pos, int on)
|
|||
|
||||
case WAN_AFT_RED:
|
||||
if (on){
|
||||
wan_set_bit(red_bit,®);
|
||||
wan_set_bit(red_bit,(volatile long *)®);
|
||||
}else{
|
||||
wan_clear_bit(red_bit,®);
|
||||
wan_clear_bit(red_bit,(volatile long *)®);
|
||||
}
|
||||
break;
|
||||
|
||||
case WAN_AFT_GREEN:
|
||||
if (on){
|
||||
wan_set_bit(green_bit,®);
|
||||
wan_set_bit(green_bit,(volatile long *)®);
|
||||
}else{
|
||||
wan_clear_bit(green_bit,®);
|
||||
wan_clear_bit(green_bit,(volatile long *)®);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
@ -534,7 +534,7 @@ int aft_bri_cpld0_set(sdla_t *card, int hwec_reset)
|
|||
DEBUG_TEST("%s: Writing to CPLD0 0x%02X (REG=0x%08X)\n",
|
||||
card->devname,cpld_reg,reg);
|
||||
|
||||
aft_bri_write_cpld(card,0x00,cpld_reg);
|
||||
aft_bri_write_cpld(card,0x00,(unsigned short)cpld_reg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -5723,7 +5723,7 @@ static void aft_rx_post_complete (sdla_t *card, private_area_t *chan,
|
|||
* flag. If data is not greater than 3, then
|
||||
* we have a 0 length frame. Thus discard
|
||||
* (only if HDLC engine enabled) */
|
||||
if (len <= 3 || len >= chan->dma_mru) {
|
||||
if (len <= 3 || len >= (unsigned int)chan->dma_mru) {
|
||||
|
||||
/* if we got an invalid hdlc frame and pkt_error is not set.
|
||||
we must indicate that the packet is bad and update statistics */
|
||||
|
@ -5794,7 +5794,7 @@ static void aft_rx_post_complete (sdla_t *card, private_area_t *chan,
|
|||
wan_skb_pull(skb, sizeof(wp_rx_element_t));
|
||||
*new_skb=skb;
|
||||
|
||||
} else if (!skip_copy_back && len > aft_rx_copyback) {
|
||||
} else if (!skip_copy_back && len > (unsigned int)aft_rx_copyback) {
|
||||
/* The rx size is big enough, thus
|
||||
* send this buffer up the stack
|
||||
* and allocate another one */
|
||||
|
@ -6388,7 +6388,7 @@ static void wp_bh (void *data, int pending)
|
|||
|
||||
do {
|
||||
|
||||
if (SYSTEM_TICKS-timeout > 2){
|
||||
if (SYSTEM_TICKS-timeout > 10) {
|
||||
#if 0
|
||||
DEBUG_EVENT("%s: BH Squeeze - breaking out of wp_bh loop!\n",chan->if_name);
|
||||
#if defined(__WINDOWS__)
|
||||
|
@ -6827,7 +6827,7 @@ static int wp_aft_fifo_per_port_isr(sdla_t *card)
|
|||
void **card_list=__sdla_get_ptr_isr_array(card->hw);
|
||||
sdla_t *tmp_card;
|
||||
int max_lines = AFT_MAX_PORTS(card);
|
||||
for (i=0;i<max_lines;i++) {
|
||||
for (i=0;i<(u32)max_lines;i++) {
|
||||
tmp_card=(sdla_t*)card_list[i];
|
||||
if (tmp_card &&
|
||||
!wan_test_bit(CARD_DOWN,&tmp_card->wandev.critical)) {
|
||||
|
@ -7373,7 +7373,7 @@ if (1){
|
|||
/* All ports within the card share the same port */
|
||||
comm_port = 0;
|
||||
} else {
|
||||
comm_port = card->wandev.comm_port;
|
||||
comm_port = (char)card->wandev.comm_port;
|
||||
}
|
||||
|
||||
if (wan_test_bit(AFT_LCFG_FIFO_INTR_BIT,&card->u.aft.lcfg_reg) &&
|
||||
|
@ -7767,14 +7767,26 @@ global_irq_skip:
|
|||
__sdla_bus_write_4(card->hw,AFT_PORT_REG(card,AFT_LINE_CFG_REG), lcfg_reg);
|
||||
__sdla_bus_read_4(card->hw,AFT_PORT_REG(card,AFT_LINE_CFG_REG), &lcfg_reg);
|
||||
card->u.aft.lcfg_reg=lcfg_reg;
|
||||
|
||||
disable_data_error_intr(card,LINK_DOWN);
|
||||
|
||||
if (!card->u.aft.cfg.fe_sync_disable) {
|
||||
disable_data_error_intr(card,LINK_DOWN);
|
||||
}
|
||||
WAN_PMON_SYNC_ERROR(card);
|
||||
|
||||
if (!wan_test_bit(AFT_FE_RESTART,&card->u.aft.port_task_cmd)) {
|
||||
DEBUG_ERROR("%s: Warning: Front End Lost Synchronization (sync_cnt=%i,c=%i,f=%i)\n",
|
||||
card->devname,sync_cnt,card->wandev.state,card->fe.fe_status);
|
||||
aft_core_taskq_trigger(card,AFT_FE_RESTART);
|
||||
DEBUG_ERROR("%s: Warning: Front End Lost Sync (sync_cnt=%i,state=%i,fe=%i,rsync_cfg=%i framer:[lcv=%i,bee=%i,oof=%i,feb=%i,crc4=%i,fer=%i,fas=%i])\n",
|
||||
card->devname,sync_cnt,card->wandev.state,card->fe.fe_status,
|
||||
card->u.aft.cfg.fe_sync_disable,
|
||||
card->fe.fe_stats.te_pmon.lcv_errors,
|
||||
card->fe.fe_stats.te_pmon.bee_errors,
|
||||
card->fe.fe_stats.te_pmon.oof_errors,
|
||||
card->fe.fe_stats.te_pmon.feb_errors,
|
||||
card->fe.fe_stats.te_pmon.crc4_errors,
|
||||
card->fe.fe_stats.te_pmon.fer_errors,
|
||||
card->fe.fe_stats.te_pmon.fas_errors);
|
||||
if (!card->u.aft.cfg.fe_sync_disable) {
|
||||
aft_core_taskq_trigger(card,AFT_FE_RESTART);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -8380,7 +8392,7 @@ static void wp_aft_wdt_per_port_isr(sdla_t *card, int wdt_intr)
|
|||
to distrub the timer interrup by reseting it */
|
||||
if (wdt_intr && card->wdt_timeout) {
|
||||
aft_wdt_reset(card);
|
||||
aft_wdt_set(card,card->wdt_timeout);
|
||||
aft_wdt_set(card,(unsigned char)card->wdt_timeout);
|
||||
}
|
||||
|
||||
if (AFT_HAS_FAKE_PORTS(card)) {
|
||||
|
@ -11477,7 +11489,7 @@ static void aft_port_task (void * card_ptr, int arg)
|
|||
|
||||
if (wan_test_and_clear_bit(AFT_FE_SET_CLOCK,&card->u.aft.port_task_cmd)){
|
||||
if (wan_test_bit(CARD_REF_OSC,&card->wandev.critical) && WAN_TE1_CLK(&card->fe) == WAN_MASTER_CLK) {
|
||||
int tmp = WAN_TE1_REFCLK(&card->fe);
|
||||
UINT8 tmp = WAN_TE1_REFCLK(&card->fe);
|
||||
WAN_TE1_REFCLK(&card->fe)=0;
|
||||
aft_chip_set_clock(card);
|
||||
WAN_TE1_REFCLK(&card->fe)=tmp;
|
||||
|
|
|
@ -654,7 +654,7 @@ int aft_tdm_api_init(sdla_t *card, private_area_t *chan, wanif_conf_t *conf)
|
|||
chan->wp_tdm_api_dev->cfg.tx_queue_sz = MAX_AFT_DMA_CHAINS;
|
||||
|
||||
|
||||
chan->wp_tdm_api_dev->tdm_chan = chan_no;
|
||||
chan->wp_tdm_api_dev->tdm_chan = (u8)chan_no;
|
||||
|
||||
if (IS_TE1_CARD(card)) {
|
||||
if (IS_T1_CARD(card)){
|
||||
|
@ -742,7 +742,7 @@ int aft_tdm_api_init(sdla_t *card, private_area_t *chan, wanif_conf_t *conf)
|
|||
chan->wp_tdm_api_dev->cfg.usr_mtu_mru = chan->mtu;
|
||||
|
||||
/* Overwite the chan number based on group number */
|
||||
chan->wp_tdm_api_dev->tdm_chan = (u8)chan->if_cnt;
|
||||
chan->wp_tdm_api_dev->tdm_chan = (u8)chan->first_time_slot;
|
||||
}
|
||||
|
||||
switch(chan->wp_tdm_api_dev->cfg.hw_tdm_coding) {
|
||||
|
@ -855,7 +855,7 @@ int aft_sw_hdlc_rx_data (void *priv_ptr, u8 *rx_data, int rx_len, uint32_t err_c
|
|||
data=wan_skb_put(skb,rx_len);
|
||||
memcpy(data,rx_data,rx_len);
|
||||
|
||||
err=aft_bh_rx(chan, skb, err_code, rx_len);
|
||||
err=aft_bh_rx(chan, skb, (u8)err_code, rx_len);
|
||||
if (err) {
|
||||
/* FIXME: This will not work on WINDOWS */
|
||||
wan_skb_free(skb);
|
||||
|
|
|
@ -1825,7 +1825,7 @@ int process_udp_mgmt_pkt(sdla_t* card, netdevice_t* dev, private_area_t* chan, i
|
|||
break;
|
||||
|
||||
case WANPIPEMON_GET_BIOS_ENCLOSURE3_SERIAL_NUMBER:
|
||||
wan_udp_pkt->wan_udp_return_code =
|
||||
wan_udp_pkt->wan_udp_return_code = (unsigned char)
|
||||
wp_get_motherboard_enclosure_serial_number(wan_udp_pkt->wan_udp_data,
|
||||
sizeof(wan_udp_pkt->wan_udp_data));
|
||||
|
||||
|
@ -1907,7 +1907,7 @@ int process_udp_mgmt_pkt(sdla_t* card, netdevice_t* dev, private_area_t* chan, i
|
|||
}
|
||||
|
||||
} else {
|
||||
wan_udp_pkt->wan_udp_return_code = err;
|
||||
wan_udp_pkt->wan_udp_return_code = (unsigned char)err;
|
||||
}
|
||||
wan_spin_unlock_irq(&card->wandev.lock,&smp_flags);
|
||||
}
|
||||
|
@ -2528,6 +2528,7 @@ void wanpipe_wake_stack(private_area_t* chan)
|
|||
#ifdef AFT_TDM_API_SUPPORT
|
||||
if (is_tdm_api(chan,chan->wp_tdm_api_dev)) {
|
||||
wanpipe_tdm_api_kick(chan->wp_tdm_api_dev);
|
||||
wan_netif_set_ticks(chan->common.dev, SYSTEM_TICKS);
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
|
@ -2542,6 +2543,7 @@ void wanpipe_wake_stack(private_area_t* chan)
|
|||
#ifdef AFT_TDM_API_SUPPORT
|
||||
if (is_tdm_api(chan,chan->wp_tdm_api_dev)){
|
||||
wanpipe_tdm_api_kick(chan->wp_tdm_api_dev);
|
||||
wan_netif_set_ticks(chan->common.dev, SYSTEM_TICKS);
|
||||
}
|
||||
#endif
|
||||
} else if (chan->common.usedby == ANNEXG) {
|
||||
|
|
|
@ -568,7 +568,7 @@ static int sdla_ds_te1_device_id(sdla_fe_t* fe)
|
|||
|
||||
/*CHECK FOF THE T116 ID*/
|
||||
if (value == DEVICE_ID_DS26519){
|
||||
fe->fe_chip_id = value;
|
||||
fe->fe_chip_id = (unsigned char)value;
|
||||
}else{
|
||||
fe->fe_chip_id = WAN_TE1_DEVICE_ID;
|
||||
}
|
||||
|
@ -4340,6 +4340,10 @@ static int sdla_ds_te1_swirq_alarm(sdla_fe_t* fe, int type)
|
|||
|
||||
if (swirq->subtype == WAN_TE1_SWIRQ_SUBTYPE_ALARM_ON){
|
||||
|
||||
if (fe->fe_status == FE_DISCONNECTED && type == WAN_TE1_SWIRQ_TYPE_ALARM_RAI) {
|
||||
swirq->delay=0;
|
||||
}
|
||||
|
||||
if (WAN_STIMEOUT(swirq->start, swirq->delay)){
|
||||
/* Got real LOS alarm */
|
||||
if (type == WAN_TE1_SWIRQ_TYPE_ALARM_AIS){
|
||||
|
@ -6104,7 +6108,7 @@ static int sdla_ds_te1_udp(sdla_fe_t *fe, void* p_udp_cmd, unsigned char* data)
|
|||
event.type = TE_RBS_READ;
|
||||
event.delay = POLLING_TE1_TIMER;
|
||||
err=sdla_ds_te1_exec_event(fe, &event, &pending);
|
||||
udp_cmd->wan_cmd_return_code = err;
|
||||
udp_cmd->wan_cmd_return_code = (unsigned char)err;
|
||||
|
||||
}else if (fe_debug->mode == WAN_FE_DEBUG_RBS_PRINT){
|
||||
/* Enable extra debugging */
|
||||
|
@ -6166,7 +6170,7 @@ static int sdla_ds_te1_udp(sdla_fe_t *fe, void* p_udp_cmd, unsigned char* data)
|
|||
event.te_event.rbs_channel = fe_debug->fe_debug_rbs.channel;
|
||||
event.te_event.rbs_abcd = fe_debug->fe_debug_rbs.abcd;
|
||||
err=sdla_ds_te1_exec_event(fe, &event, &pending);
|
||||
udp_cmd->wan_cmd_return_code = err;
|
||||
udp_cmd->wan_cmd_return_code = (unsigned char)err;
|
||||
|
||||
}
|
||||
break;
|
||||
|
@ -6221,7 +6225,7 @@ static int sdla_ds_te1_udp(sdla_fe_t *fe, void* p_udp_cmd, unsigned char* data)
|
|||
fe->te_param.reg_dbg_busy = 0;
|
||||
}
|
||||
|
||||
udp_cmd->wan_cmd_return_code = err;
|
||||
udp_cmd->wan_cmd_return_code = (unsigned char)err;
|
||||
break;
|
||||
|
||||
case WAN_FE_DEBUG_ALARM:
|
||||
|
|
|
@ -753,9 +753,11 @@ static void adsl_tx_timeout (netdevice_t *dev)
|
|||
* that our device never stays busy more than 5 seconds. So this
|
||||
* is only used as a last resort.
|
||||
*/
|
||||
#if defined(__LINUX__)
|
||||
# if defined(KERN_NETIF_TRANS_UPDATE) && KERN_NETIF_TRANS_UPDATE > 0
|
||||
netif_trans_update(dev);
|
||||
# elif defined(__LINUX__)
|
||||
dev->trans_start = SYSTEM_TICKS;
|
||||
#endif
|
||||
# endif
|
||||
card->wandev.stats.collisions++;
|
||||
|
||||
adsl_timeout(card->u.adsl.adapter);
|
||||
|
@ -1223,7 +1225,9 @@ adsl_output(netdevice_t* dev, netskb_t* skb, struct sockaddr* dst, struct rtentr
|
|||
wpabs_skb_free(skb);
|
||||
WAN_NETIF_START_QUEUE(dev);
|
||||
card->wandev.stats.tx_carrier_errors++;
|
||||
#if defined(__LINUX__) || defined(__WINDOWS__)
|
||||
#if defined(KERN_NETIF_TRANS_UPDATE) && KERN_NETIF_TRANS_UPDATE > 0
|
||||
netif_trans_update(dev);
|
||||
#elif defined(__LINUX__) || defined(__WINDOWS__)
|
||||
dev->trans_start = SYSTEM_TICKS;
|
||||
return 0;
|
||||
#else
|
||||
|
@ -1249,7 +1253,11 @@ adsl_output(netdevice_t* dev, netskb_t* skb, struct sockaddr* dst, struct rtentr
|
|||
#endif
|
||||
|
||||
#if defined(__LINUX__)
|
||||
# if defined(KERN_NETIF_TRANS_UPDATE) && KERN_NETIF_TRANS_UPDATE > 0
|
||||
netif_trans_update(dev);
|
||||
# else
|
||||
dev->trans_start = SYSTEM_TICKS;
|
||||
# endif
|
||||
status = adsl_send(adsl->pAdapter, skb, 0);
|
||||
wan_spin_lock_irq(&card->wandev.lock,&smp_flags);
|
||||
if (status == 1){
|
||||
|
@ -1266,7 +1274,11 @@ adsl_output(netdevice_t* dev, netskb_t* skb, struct sockaddr* dst, struct rtentr
|
|||
}
|
||||
wan_spin_unlock_irq(&card->wandev.lock,&smp_flags);
|
||||
#elif defined(__WINDOWS__)
|
||||
# if defined(KERN_NETIF_TRANS_UPDATE) && KERN_NETIF_TRANS_UPDATE > 0
|
||||
netif_trans_update(dev);
|
||||
# else
|
||||
dev->trans_start = SYSTEM_TICKS;
|
||||
# endif
|
||||
status = adsl_send(adsl->pAdapter, skb, 0);
|
||||
wan_spin_lock_irq(&card->wandev.lock,&smp_flags);
|
||||
if (status == 1){
|
||||
|
@ -1499,7 +1511,11 @@ void adsl_tx_complete(void* dev_id, int length, int txStatus)
|
|||
}
|
||||
|
||||
#if defined(__LINUX__) || defined(__WINDOWS__)
|
||||
# if defined(KERN_NETIF_TRANS_UPDATE) && KERN_NETIF_TRANS_UPDATE > 0
|
||||
netif_trans_update(ifp);
|
||||
# else
|
||||
ifp->trans_start = SYSTEM_TICKS;
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined(__WINDOWS__)
|
||||
|
@ -2036,7 +2052,7 @@ static int process_udp_mgmt_pkt(sdla_t* card, netdevice_t* netdev, adsl_private_
|
|||
break;
|
||||
|
||||
case WANPIPEMON_GET_BIOS_ENCLOSURE3_SERIAL_NUMBER:
|
||||
wan_udp_pkt->wan_udp_return_code =
|
||||
wan_udp_pkt->wan_udp_return_code = (unsigned char)
|
||||
wp_get_motherboard_enclosure_serial_number(wan_udp_pkt->wan_udp_data,
|
||||
sizeof(wan_udp_pkt->wan_udp_data));
|
||||
|
||||
|
|
|
@ -259,8 +259,8 @@ static void s508_unlock (sdla_t *card, unsigned long *smp_flags);
|
|||
|
||||
static int chdlc_get_config_info(void* priv, struct seq_file* m, int*);
|
||||
static int chdlc_get_status_info(void* priv, struct seq_file* m, int*);
|
||||
static int chdlc_set_dev_config(struct file*, const char*, unsigned long, void *);
|
||||
static int chdlc_set_if_info(struct file*, const char*, unsigned long, void *);
|
||||
static int chdlc_set_dev_config(struct file*, const char *, unsigned long, void *);
|
||||
static int chdlc_set_if_info(struct file*, const char *, unsigned long, void *);
|
||||
|
||||
static void chdlc_enable_timer(void* card_id);
|
||||
static void chdlc_handle_front_end_state(void* card_id);
|
||||
|
@ -299,7 +299,7 @@ int wp_asyhdlc_init (sdla_t* card, wandev_conf_t* conf)
|
|||
|
||||
/* Verify configuration ID */
|
||||
if (conf->config_id != WANCONFIG_ASYHDLC) {
|
||||
printk(KERN_INFO "%s: invalid configuration ID %u!\n",
|
||||
printk(KERN_INFO "%s: invalid configuration ID %lu!\n",
|
||||
card->devname, conf->config_id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -451,8 +451,8 @@ int wp_asyhdlc_init (sdla_t* card, wandev_conf_t* conf)
|
|||
// Proc fs functions
|
||||
card->wandev.get_config_info = &chdlc_get_config_info;
|
||||
card->wandev.get_status_info = &chdlc_get_status_info;
|
||||
card->wandev.set_dev_config = &chdlc_set_dev_config;
|
||||
card->wandev.set_if_info = &chdlc_set_if_info;
|
||||
card->wandev.set_dev_config = chdlc_set_dev_config;
|
||||
card->wandev.set_if_info = chdlc_set_if_info;
|
||||
|
||||
/* reset the number of times the 'update()' proc has been called */
|
||||
card->u.c.update_call_count = 0;
|
||||
|
@ -1292,8 +1292,12 @@ static int if_send (struct sk_buff* skb, netdevice_t* dev)
|
|||
}else{
|
||||
++card->wandev.stats.tx_packets;
|
||||
card->wandev.stats.tx_bytes += len;
|
||||
#if defined(LINUX_2_4)||defined(LINUX_2_6)
|
||||
dev->trans_start = jiffies;
|
||||
#if defined(LINUX_2_4) || defined(LINUX_2_6)
|
||||
# if defined(KERN_NETIF_TRANS_UPDATE) && KERN_NETIF_TRANS_UPDATE > 0
|
||||
netif_trans_update(dev);
|
||||
# else
|
||||
dev->trans_start = jiffies;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2288,7 +2288,9 @@ static int if_send (struct sk_buff* skb, netdevice_t* dev)
|
|||
!test_bit(WAIT_DEVICE_BUFFERS,&bstrm_priv_area->tq_control)){
|
||||
card->hw_iface.set_bit(card->hw, card->intr_perm_off, APP_INT_ON_TX_BLOCK);
|
||||
}
|
||||
#if defined(LINUX_2_4)||defined(LINUX_2_6)
|
||||
#if defined(KERN_NETIF_TRANS_UPDATE) && KERN_NETIF_TRANS_UPDATE > 0
|
||||
netif_trans_update(dev);
|
||||
#elif defined(LINUX_2_4) || defined(LINUX_2_6)
|
||||
dev->trans_start = jiffies;
|
||||
#endif
|
||||
|
||||
|
|
|
@ -249,7 +249,7 @@ static int wp_bri_event_ctrl(sdla_fe_t*, wan_event_ctrl_t*);
|
|||
|
||||
static int32_t wp_bri_dchan_tx(sdla_fe_t *fe, void *src_data_buffer, u32 buffer_len);
|
||||
|
||||
static void *wp_bri_dchan_rx(sdla_fe_t *fe, u8 mod_no, u8 port_no);
|
||||
static void *wp_bri_dchan_rx(sdla_fe_t *fe, u8 mod_no, u8 port_no, u32 * pending_data);
|
||||
|
||||
static int wp_bri_get_fe_status(sdla_fe_t *fe, unsigned char *status, int notused);
|
||||
static int wp_bri_set_fe_status(sdla_fe_t *fe, unsigned char status);
|
||||
|
@ -357,10 +357,15 @@ static void xhfc_waitbusy(sdla_fe_t *fe, u32 mod_no)
|
|||
}
|
||||
}
|
||||
|
||||
static inline void xhfc_resetfifo_flag(sdla_fe_t *fe, u32 mod_no, u8 flag)
|
||||
{
|
||||
WRITE_REG(A_INC_RES_FIFO, flag);
|
||||
xhfc_waitbusy(fe, mod_no);
|
||||
}
|
||||
|
||||
static inline void xhfc_resetfifo(sdla_fe_t *fe, u32 mod_no)
|
||||
{
|
||||
WRITE_REG(A_INC_RES_FIFO, M_RES_FIFO | M_RES_FIFO_ERR);
|
||||
xhfc_waitbusy(fe, mod_no);
|
||||
return xhfc_resetfifo_flag(fe, mod_no,M_RES_FIFO | M_RES_FIFO_ERR);
|
||||
}
|
||||
|
||||
static void xhfc_select_fifo(sdla_fe_t *fe, u32 mod_no, u8 fifo)
|
||||
|
@ -523,20 +528,19 @@ static int32_t __config_clock_routing(sdla_fe_t *fe, u32 mod_no, u8 master_mode)
|
|||
}
|
||||
|
||||
if (fe->bri_param.mod[mod_no].type != MOD_TYPE_TE && master_mode) {
|
||||
DEBUG_ERROR("%s: Module %d: error configuring clock routing on NT\n",
|
||||
DEBUG_ERROR("%s: Module %d: error configuring clock routing on NT\n",
|
||||
fe->name, mod_no);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
DEBUG_EVENT("%s: %s Clock line recovery Module=%d Port=%d: %s\n",
|
||||
fe->name, WP_BRI_DECODE_MOD_TYPE(fe->bri_param.mod[mod_no].type),
|
||||
REPORT_MOD_NO(mod_no), fe_line_no_to_port_no(fe)+1,
|
||||
DEBUG_EVENT("%s: %s Clock line recovery Module=%d Port=%d: %s\n",
|
||||
fe->name, WP_BRI_DECODE_MOD_TYPE(fe->bri_param.mod[mod_no].type),
|
||||
REPORT_MOD_NO(mod_no), fe_line_no_to_port_no(fe)+1,
|
||||
(master_mode == WANOPT_YES ? "Enabled" : "Disabled"));
|
||||
|
||||
|
||||
/************************************************************************/
|
||||
|
||||
#if 0
|
||||
/************************************************************************/
|
||||
{
|
||||
reg_r_su_sync r_su_sync;
|
||||
r_su_sync.reg = 0;
|
||||
|
@ -728,9 +732,7 @@ static int32_t init_xfhc(sdla_fe_t *fe, u32 mod_no)
|
|||
a_con_hdlc.reg = 0;
|
||||
|
||||
a_con_hdlc.bit.v_iff = 1;/* InterFrameFill=ones */
|
||||
/* Interrupt every 2^n bytes. n = V_FIFO_IRQ+2 in register A_CON_HDLC. p. 137 */
|
||||
/*a_con_hdlc.bit.v_fifo_irq = 3;*/ /* 2^(3+2) = 32 bytes an interrupt is generated */
|
||||
a_con_hdlc.bit.v_fifo_irq = 4; /* 2^(4+2) = 64 bytes an interrupt is generated */
|
||||
a_con_hdlc.bit.v_fifo_irq = 1; /* an interrupt is generated */
|
||||
|
||||
DEBUG_HFC_INIT("=========== port_no: %d ========\n", port_no);
|
||||
/* D - Tx of port_no */
|
||||
|
@ -739,9 +741,9 @@ static int32_t init_xfhc(sdla_fe_t *fe, u32 mod_no)
|
|||
WRITE_REG(A_CON_HDLC, a_con_hdlc.reg);
|
||||
/* 16kbit/s */
|
||||
WRITE_REG(A_SUBCH_CFG, 2);
|
||||
#if 0
|
||||
#if 1
|
||||
/* interrupts at end of frame only */
|
||||
WRITE_REG(A_FIFO_CTRL, 1);
|
||||
WRITE_REG(A_FIFO_CTRL, 0x1);
|
||||
#else
|
||||
/* Interrupts at end of frame AND at fifo threshold.
|
||||
Will work as 'transmit interrupt'. */
|
||||
|
@ -754,9 +756,10 @@ static int32_t init_xfhc(sdla_fe_t *fe, u32 mod_no)
|
|||
WRITE_REG(A_CON_HDLC, a_con_hdlc.reg);
|
||||
/* 16kbit/s */
|
||||
WRITE_REG(A_SUBCH_CFG, 2);
|
||||
#if 0
|
||||
|
||||
#if 1
|
||||
/* interrupts at end of frame only */
|
||||
WRITE_REG(A_FIFO_CTRL, 1);
|
||||
WRITE_REG(A_FIFO_CTRL, 0x1);
|
||||
#else
|
||||
/* interrupts at end of frame AND at fifo threshold */
|
||||
WRITE_REG(A_FIFO_CTRL, 0x5);
|
||||
|
@ -975,6 +978,40 @@ static int32_t check_f0cl_increment(sdla_fe_t *fe, u8 old_f0cl, u8 new_f0cl, int
|
|||
return 0;
|
||||
}
|
||||
|
||||
// these functions are used for making sure indexes are properly read
|
||||
|
||||
static u8 read_reg_volatile(sdla_fe_t *fe, u8 mod_no, u8 reg)
|
||||
{
|
||||
const u16 max_num = 128;
|
||||
u16 cur_num = max_num+1;
|
||||
|
||||
u8 res = READ_REG(reg);
|
||||
|
||||
while (--cur_num)
|
||||
{
|
||||
const u8 chk = READ_REG(reg);
|
||||
|
||||
if (res == chk)
|
||||
{
|
||||
if (cur_num != max_num) {
|
||||
DEBUG_RX1("%s: stable 0x%02X (0x%02X) after %u reads\n",
|
||||
fe->name, reg, res, max_num - cur_num + 1);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
res = chk;
|
||||
}
|
||||
|
||||
DEBUG_WARNING("%s: unable to get stable read from 0x%02X (using 0x%02X)\n", fe->name, reg, res);
|
||||
return res;
|
||||
}
|
||||
|
||||
#define READ_REG_VOLATILE(reg) \
|
||||
read_reg_volatile(fe, mod_no, reg)
|
||||
|
||||
|
||||
typedef enum _DCHAN_RC{
|
||||
DCHAN_STATUS_BUSY = 1,
|
||||
DCHAN_STATUS_COMPLETE,
|
||||
|
@ -991,15 +1028,20 @@ static u8 xhfc_write_fifo_dchan(sdla_fe_t *fe, u8 mod_no,
|
|||
u8 *buf = NULL;
|
||||
int *len = NULL,
|
||||
*idx = NULL;
|
||||
|
||||
u8 fcnt, tcnt, i;
|
||||
u8 free;
|
||||
u8 f1, f2;
|
||||
u8 z1, z2;
|
||||
|
||||
reg_a_fifo_sta fstat;
|
||||
|
||||
u8 *data;
|
||||
u8 rc;
|
||||
sdla_t *card = (sdla_t*)fe->card;
|
||||
private_area_t *chan=NULL;
|
||||
int fifo_usage;
|
||||
|
||||
u8 fifo_free;
|
||||
u8 fifo_usage;
|
||||
|
||||
buf = port->dtxbuf; /* data buffer */
|
||||
len = &port->bytes2transmit; /* hdlc packet len */
|
||||
|
@ -1010,67 +1052,95 @@ static u8 xhfc_write_fifo_dchan(sdla_fe_t *fe, u8 mod_no,
|
|||
/* select the D-channel TX fifo */
|
||||
xhfc_select_fifo(fe, mod_no, (port->idx*8+4));
|
||||
|
||||
fstat.reg = READ_REG(A_FIFO_STA);
|
||||
if (fstat.reg) WRITE_REG( A_INC_RES_FIFO, 8);
|
||||
fstat.reg = READ_REG_VOLATILE(A_FIFO_STA);
|
||||
|
||||
free = (bri_module->max_z - (READ_REG( A_USAGE)));
|
||||
*free_space = free;
|
||||
|
||||
TX_FAST_DBG("%s(): Line:%d: free: %d\n", __FUNCTION__, __LINE__, free);
|
||||
if (fstat.reg & (M_FIFO_ERR|M_ABO_DONE)) {
|
||||
xhfc_resetfifo_flag(fe, mod_no, M_RES_FIFO_ERR);
|
||||
TX_FAST_DBG("%s(%d, %d) TX FIFO ERROR (%02X)\n", __FUNCTION__, mod_no, port->idx, fstat.reg);
|
||||
}
|
||||
|
||||
tcnt = ((free >= (*len - *idx)) ? (*len - *idx) : free);
|
||||
z1 = READ_REG_VOLATILE( A_Z1);
|
||||
z2 = READ_REG_VOLATILE( A_Z2);
|
||||
|
||||
f1 = READ_REG( A_F1);
|
||||
f2 = READ_REG( A_F2);
|
||||
fcnt = 0x07 - ((f1 - f2) & 0x07); /* free frame count in tx fifo */
|
||||
fifo_usage = z1 >= z2 ? (z1 - z2) : (bri_module->max_z - (z2 - z1)) + 1;
|
||||
fifo_free = (bri_module->max_z - fifo_usage);
|
||||
|
||||
TX_FAST_DBG("%s(): free: %d, fcnt: %d, tcnt: %d\n", __FUNCTION__, free, fcnt, tcnt);
|
||||
*free_space = fifo_free;
|
||||
|
||||
TX_EXTRA_DBG("%s(): START: usage: 0x%X, z1: 0x%X z2: 0x%X f1: 0x%X: f2:0x%X f0c:0x%X\n",
|
||||
__FUNCTION__, READ_REG( A_USAGE),READ_REG( A_Z1),READ_REG( A_Z2),f1,f2,READ_REG( R_F0_CNTL));
|
||||
TX_FAST_DBG("%s(): Line:%d: free: %d\n", __FUNCTION__, __LINE__, fifo_free);
|
||||
|
||||
if (free && fcnt && tcnt) {
|
||||
data = buf + *idx;
|
||||
*idx += tcnt;
|
||||
tcnt = ((fifo_free >= (*len - *idx)) ? (*len - *idx) : fifo_free);
|
||||
|
||||
TX_EXTRA_DBG("%s(): tcnt: %d, *idx: %d, fstat.reg: 0x%X, fstat.bit.v_fifo_err: %d\n",
|
||||
__FUNCTION__, tcnt, *idx, fstat.reg, fstat.bit.v_fifo_err);
|
||||
TX_EXTRA_DBG("%s(): tcnt: %d, *idx: %d, *len %d, fstat.reg: 0x%X, free %d, usage: %d\n",
|
||||
__FUNCTION__, tcnt, *idx, *len, fstat.reg, fifo_free, fifo_usage);
|
||||
|
||||
/* write data to FIFO */
|
||||
i=0;
|
||||
while (i<tcnt) {
|
||||
WRITE_REG(A_FIFO_DATA, *(data+i));
|
||||
i++;
|
||||
}
|
||||
if (tcnt) {
|
||||
f1 = READ_REG_VOLATILE( A_F1);
|
||||
f2 = READ_REG_VOLATILE( A_F2);
|
||||
|
||||
/* terminate frame */
|
||||
if (*idx == *len) {
|
||||
xhfc_increment_fifo(fe, mod_no);/* incrementing fifo sends the frame out */
|
||||
/******** free frame/byte count in FIFOs *********
|
||||
* *
|
||||
* condition buffer sections *
|
||||
* 0 LAST *
|
||||
* f1 >= f2 -> | (free) F2 (used) F1 (free) | *
|
||||
* f1 < f2 -> | (busy) F1 (free) F2 (busy) | *
|
||||
* *
|
||||
**************************************************/
|
||||
|
||||
fcnt = (f1 >= f2 ? (0x07 - f1) + f2 : (f2 - f1) - 1);
|
||||
|
||||
TX_FAST_DBG("%s(): free: %d, fcnt: %d, tcnt: %d\n", __FUNCTION__, fifo_free, fcnt, tcnt);
|
||||
|
||||
TX_EXTRA_DBG("%s(): START: usage: 0x%X, z1: 0x%X z2: 0x%X f1: 0x%X: f2:0x%X f0c:0x%X\n",
|
||||
__FUNCTION__, READ_REG( A_USAGE),READ_REG( A_Z1),READ_REG( A_Z2),f1,f2,READ_REG( R_F0_CNTL));
|
||||
|
||||
if (fifo_free && fcnt) {
|
||||
data = buf + *idx;
|
||||
*idx += tcnt;
|
||||
|
||||
/* write data to FIFO */
|
||||
i=0;
|
||||
while (i<tcnt) {
|
||||
WRITE_REG(A_FIFO_DATA, *(data+i));
|
||||
i++;
|
||||
}
|
||||
|
||||
/* terminate frame */
|
||||
if (*idx == *len) {
|
||||
xhfc_increment_fifo(fe, mod_no);/* incrementing fifo sends the frame out */
|
||||
#if !TX_EMPTY_FIFO
|
||||
*len = 0;
|
||||
*idx = 0;
|
||||
#endif
|
||||
DEBUG_HFC_TX("%s(): finished frame transmission.\n", __FUNCTION__);
|
||||
rc = DCHAN_STATUS_COMPLETE;
|
||||
#if !TX_EMPTY_FIFO
|
||||
chan=(private_area_t*)card->u.aft.dev_to_ch_map[BRI_DCHAN_LOGIC_CHAN];
|
||||
if (chan) {
|
||||
*len = 0;
|
||||
*idx = 0;
|
||||
TX_FAST_DBG("%s(): calling wanpipe_wake_stack()\n", __FUNCTION__);
|
||||
wanpipe_wake_stack(chan);
|
||||
}
|
||||
#endif
|
||||
DEBUG_HFC_TX("%s(%d, %d): finished frame transmission.\n", __FUNCTION__, mod_no, port->idx);
|
||||
rc = DCHAN_STATUS_COMPLETE;
|
||||
#if !TX_EMPTY_FIFO
|
||||
chan=(private_area_t*)card->u.aft.dev_to_ch_map[BRI_DCHAN_LOGIC_CHAN];
|
||||
if (chan) {
|
||||
*len = 0;
|
||||
*idx = 0;
|
||||
TX_FAST_DBG("%s(): calling wanpipe_wake_stack()\n", __FUNCTION__);
|
||||
wanpipe_wake_stack(chan);
|
||||
}
|
||||
#endif
|
||||
|
||||
}else{
|
||||
xhfc_select_fifo(fe, mod_no, (port->idx*8+4));/* addition ?? */
|
||||
}else{
|
||||
xhfc_select_fifo(fe, mod_no, (port->idx*8+4));/* addition ?? */
|
||||
|
||||
DEBUG_HFC_TX("%s(): transmitted a part of frame.\n", __FUNCTION__);
|
||||
rc = DCHAN_STATUS_INCOMPLETE;
|
||||
DEBUG_HFC_TX(KERN_INFO "%s(%d, %d): transmitted part of a frame.\n", __FUNCTION__, mod_no, port->idx);
|
||||
rc = DCHAN_STATUS_INCOMPLETE;
|
||||
}
|
||||
}else{
|
||||
DEBUG_HFC_TX(KERN_INFO "%s(%d, %d): NO space (free=%u, usage=%u, fcnt=%u, tcnt=%u)!\n",
|
||||
__FUNCTION__, mod_no, port->idx, fifo_free, fifo_usage, fcnt, tcnt);
|
||||
|
||||
rc = DCHAN_STATUS_BUSY; /* there is NO free space in tx fifo */
|
||||
}
|
||||
}else{
|
||||
DEBUG_HFC_TX("%s(): NO free space in tx fifo!!\n", __FUNCTION__);
|
||||
rc = DCHAN_STATUS_BUSY; /* there is NO free space in tx fifo */
|
||||
} else {
|
||||
DEBUG_HFC_TX("%s(%d, %d): nothing to send (free=%u, usage=%u, fcnt=%u, tcnt=%u)\n",
|
||||
__FUNCTION__, mod_no, port->idx, fifo_free, fifo_usage, fcnt, tcnt);
|
||||
|
||||
rc = DCHAN_STATUS_COMPLETE;
|
||||
}
|
||||
|
||||
TX_EXTRA_DBG("%s(): END: eof usage: 0x%X, z1: 0x%X z2: 0x%X f1: 0x%X: f2:0x%X f0c:0x%X\n",
|
||||
|
@ -1080,13 +1150,15 @@ static u8 xhfc_write_fifo_dchan(sdla_fe_t *fe, u8 mod_no,
|
|||
#if TX_EMPTY_FIFO
|
||||
chan=(private_area_t*)card->u.aft.dev_to_ch_map[BRI_DCHAN_LOGIC_CHAN];
|
||||
|
||||
/* make sure FIFO is empty before notifying the kernel about free TX space */
|
||||
fifo_usage = READ_REG(A_USAGE);
|
||||
TX_FAST_DBG("%s(): chan: 0x%p, TX FIFO usage: %d\n", __FUNCTION__, chan, fifo_usage);
|
||||
z1 = READ_REG_VOLATILE( A_Z1);
|
||||
z2 = READ_REG_VOLATILE( A_Z2);
|
||||
|
||||
fifo_usage = z1 >= z2 ? (z1 - z2) : bri_module->max_z - (z2 - z1);
|
||||
fifo_free = (bri_module->max_z - fifo_usage);
|
||||
|
||||
if (chan) {
|
||||
if(fifo_usage == 0){
|
||||
/* FIFO is empty */
|
||||
if(fifo_usage < (bri_module->max_z >> 1)) {
|
||||
/* FIFO has enough space */
|
||||
/*WP_DELAY(10000);*/
|
||||
*len = 0;
|
||||
*idx = 0;
|
||||
|
@ -1095,6 +1167,9 @@ static u8 xhfc_write_fifo_dchan(sdla_fe_t *fe, u8 mod_no,
|
|||
wanpipe_wake_stack(chan);
|
||||
}
|
||||
}
|
||||
|
||||
TX_EXTRA_DBG("%s(): tcnt: %d, *idx: %d, *len %d, fstat.reg: 0x%X, free %d, usage: %d\n",
|
||||
__FUNCTION__, tcnt, *idx, *len, fstat.reg, fifo_free, fifo_usage);
|
||||
#endif
|
||||
|
||||
DEBUG_HFC_TX("%s(): returning: %d.\n", __FUNCTION__, rc);
|
||||
|
@ -1152,6 +1227,8 @@ static int32_t wp_bri_dchan_tx(sdla_fe_t *fe, void *src_data_buffer, u32 buffer_
|
|||
}
|
||||
|
||||
if(port_ptr->bytes2transmit){
|
||||
TX_EXTRA_DBG("%s(): %s: transmit EBUSY (queued = %u)\n",
|
||||
fe->name, __FUNCTION__, port_ptr->bytes2transmit);
|
||||
/* still transmitting previous frame */
|
||||
return -EBUSY;
|
||||
}
|
||||
|
@ -1263,171 +1340,201 @@ static void dump_data(u8 *data, int data_len)
|
|||
#endif/* CHECK_DATA */
|
||||
|
||||
static int xhfc_read_fifo_dchan(sdla_fe_t *fe, u8 mod_no,
|
||||
wp_bri_module_t *bri_module, bri_xhfc_port_t *port, int *rx_data_len)
|
||||
wp_bri_module_t *bri_module, bri_xhfc_port_t *port, u32 *rx_data_len)
|
||||
{
|
||||
u8 *buf = port->drxbuf;
|
||||
int *idx = &port->drx_indx;
|
||||
u8 *data; /* pointer for new data */
|
||||
u8 rcnt, i;
|
||||
u8 rcnt, fcnt, i;
|
||||
u8 f1=0, f2=0, z1=0, z2=0;
|
||||
|
||||
reg_a_fifo_sta fstat;
|
||||
|
||||
/* select D-RX fifo */
|
||||
xhfc_select_fifo(fe, mod_no, (port->idx * 8) + 5);
|
||||
|
||||
fstat.reg = READ_REG(A_FIFO_STA);
|
||||
|
||||
if (fstat.reg & M_FIFO_ERR) {
|
||||
xhfc_resetfifo_flag(fe, mod_no, M_RES_FIFO_ERR);
|
||||
RX_EXTRA_DBG("%s(%d, %d) RX FIFO ERROR (%u)\n", __FUNCTION__, mod_no, port->idx, fstat.reg);
|
||||
}
|
||||
|
||||
/* hdlc rcnt */
|
||||
f1 = READ_REG( A_F1);
|
||||
f2 = READ_REG( A_F2);
|
||||
z1 = READ_REG( A_Z1);
|
||||
z2 = READ_REG( A_Z2);
|
||||
f1 = READ_REG_VOLATILE( A_F1);
|
||||
f2 = READ_REG_VOLATILE( A_F2);
|
||||
|
||||
rcnt = (z1 - z2) & bri_module->max_z;
|
||||
if (f1 != f2)
|
||||
rcnt++;
|
||||
z1 = READ_REG_VOLATILE( A_Z1);
|
||||
z2 = READ_REG_VOLATILE( A_Z2);
|
||||
|
||||
/* debug message of F and Z counters */
|
||||
/* used frame + index count in rx fifo *
|
||||
* *
|
||||
* same logic as tx, but reversed (free instead of used) *
|
||||
* *
|
||||
* when overlap happens we need to add one (+1) to the used byte/frame *
|
||||
* count for considering the extra "empty" slot represented by f1==f2 */
|
||||
|
||||
fcnt = f1 >= f2 ? (f1 - f2) : (0x07 - f2) + f1 + 1;
|
||||
rcnt = z1 >= z2 ? (z1 - z2) : (bri_module->max_z - z2) + z1 + 1;
|
||||
|
||||
RX_EXTRA_DBG("%s(%d, %d): fcnt: %d, rcnt: %d, *idx %d, z1 %d, z2 %d, f1 %d, f2 %d\n",
|
||||
__FUNCTION__, mod_no, port->idx, fcnt, rcnt, *idx, z1, z2, f1, f2);
|
||||
|
||||
/* debug message of F and Z counters */
|
||||
RX_EXTRA_DBG("%s(): START: usage: 0x%X, z1: 0x%X z2: 0x%X f1: 0x%X: f2:0x%X f0c:0x%X\n",
|
||||
__FUNCTION__,
|
||||
__FUNCTION__,
|
||||
READ_REG(A_USAGE), READ_REG( A_Z1), READ_REG(A_Z2),f1,f2,READ_REG( R_F0_CNTL));
|
||||
|
||||
if (rcnt > 0) {
|
||||
data = buf + *idx;
|
||||
*idx += rcnt;
|
||||
if(*idx >= MAX_DFRAME_LEN_L1){
|
||||
if (!fcnt)
|
||||
{
|
||||
RX_EXTRA_DBG("%s(): END: eof usage: 0x%X, z1: 0x%X z2: 0x%X f1: 0x%X: f2:0x%X f0c:0x%X\n",
|
||||
__FUNCTION__,
|
||||
READ_REG(A_USAGE), READ_REG( A_Z1), READ_REG(A_Z2),f1,f2,READ_REG( R_F0_CNTL));
|
||||
|
||||
*rx_data_len = rcnt;
|
||||
|
||||
if (rcnt != 0) {
|
||||
RX_EXTRA_DBG("%s: no frame, %u bytes\n", fe->name, rcnt);
|
||||
} else {
|
||||
RX_EXTRA_DBG("%s(): RX FIFO is empty! (z1=%u,z2=%u,f1=%u,f2=%u)\n", __FUNCTION__, z1, z2, f1, f2);
|
||||
}
|
||||
return DCHAN_STATUS_EMPTY;
|
||||
} else {
|
||||
// extra byte after end of frame
|
||||
++rcnt;
|
||||
}
|
||||
|
||||
data = buf + *idx;
|
||||
*idx += rcnt;
|
||||
if(*idx >= MAX_DFRAME_LEN_L1){
|
||||
if (0 && WAN_NET_RATELIMIT()) {
|
||||
DEBUG_EVENT("%s: %s(): frame in mod_no %d, port_no %d > maximum size of %d bytes!\n",
|
||||
fe->name, __FUNCTION__, mod_no, port->idx, MAX_DFRAME_LEN_L1);
|
||||
}
|
||||
*idx = 0;
|
||||
*rx_data_len = 0;
|
||||
return DCHAN_STATUS_EMPTY;
|
||||
}
|
||||
|
||||
DEBUG_HFC_RX("rcnt: %d\n", rcnt);
|
||||
/* read data from FIFO */
|
||||
i=0;
|
||||
while (i < rcnt) {
|
||||
*(data+i) = READ_REG(A_FIFO_DATA);
|
||||
i++;
|
||||
}
|
||||
|
||||
/* hdlc frame termination */
|
||||
if (fcnt) {
|
||||
xhfc_increment_fifo(fe, mod_no);
|
||||
/* check minimum frame size */
|
||||
if (*idx < 4) {
|
||||
if (0 && WAN_NET_RATELIMIT()) {
|
||||
DEBUG_EVENT("%s: %s(): frame in mod_no %d, port_no %d > maximum size of %d bytes!\n",
|
||||
fe->name, __FUNCTION__, mod_no, port->idx, MAX_DFRAME_LEN_L1);
|
||||
DEBUG_EVENT("%s: %s(): frame in mod_no %d, port_no %d < minimum size of 4 bytes (%u)!\n",
|
||||
fe->name, __FUNCTION__, mod_no, port->idx, *idx);
|
||||
}
|
||||
*idx = 0;
|
||||
*rx_data_len = 0;
|
||||
return DCHAN_STATUS_EMPTY;
|
||||
}
|
||||
|
||||
DEBUG_HFC_RX("rcnt: %d\n", rcnt);
|
||||
/* read data from FIFO */
|
||||
i=0;
|
||||
while (i < rcnt) {
|
||||
*(data+i) = READ_REG(A_FIFO_DATA);
|
||||
i++;
|
||||
}
|
||||
|
||||
/* hdlc frame termination */
|
||||
if (f1 != f2) {
|
||||
xhfc_increment_fifo(fe, mod_no);
|
||||
/* check minimum frame size */
|
||||
if (*idx < 4) {
|
||||
if (0 && WAN_NET_RATELIMIT()) {
|
||||
DEBUG_EVENT("%s: %s(): frame in mod_no %d, port_no %d < minimum size of 4 bytes!\n",
|
||||
fe->name, __FUNCTION__, mod_no, port->idx);
|
||||
}
|
||||
*idx = 0;
|
||||
*rx_data_len = 0;
|
||||
return DCHAN_STATUS_EMPTY;
|
||||
/* check crc */
|
||||
if (buf[(*idx) - 1]) {
|
||||
if (0 && WAN_NET_RATELIMIT()) {
|
||||
DEBUG_EVENT("%s: %s(): CRC-error in frame in mod_no %d, port_no %d!\n",
|
||||
fe->name, __FUNCTION__, mod_no, port->idx);
|
||||
}
|
||||
|
||||
/* check crc */
|
||||
if (buf[(*idx) - 1]) {
|
||||
if (0 && WAN_NET_RATELIMIT()) {
|
||||
DEBUG_ERROR("%s: %s(): CRC-error in frame in mod_no %d, port_no %d!\n",
|
||||
fe->name, __FUNCTION__, mod_no, port->idx);
|
||||
}
|
||||
*idx = 0;
|
||||
*rx_data_len = 0;
|
||||
return DCHAN_STATUS_EMPTY;
|
||||
}
|
||||
|
||||
/* D-Channel debug to syslog */
|
||||
DBG_RX_DATA("%lu:D-RX len(%02i):\n", jiffies, (*idx));
|
||||
#if 0
|
||||
i = 0;
|
||||
while(i < (*idx)){
|
||||
printk("%02x ", buf[i++]);
|
||||
if (i == (*idx - 3)){
|
||||
printk ("- ");
|
||||
}
|
||||
}
|
||||
printk("\n");
|
||||
#endif
|
||||
*rx_data_len = *idx - 3;/* discard CRC and STATUS - 3 bytes */
|
||||
/* STATUS is the last byte of a frame in the fifo
|
||||
which is used to check if CRC is correct or not.
|
||||
|
||||
After the ending flag of a frame the XHFC-2SU checks the HDLC CRC checksum.
|
||||
If it is correct one byte with all <EFBFBD>0<EFBFBD>s is inserted behind
|
||||
the CRC data in the FIFO named STAT (see Fig. 4.2). This last byte of a frame in the FIFO is different
|
||||
from all <EFBFBD>0<EFBFBD>s if there is no correct CRC field at the end of the frame.
|
||||
If the STAT value is 0xFF, the HDLC frame ended with at least 8 bits <EFBFBD>1<EFBFBD>s. This is similar to an abort
|
||||
HDLC frame condition.
|
||||
The ending flag of a HDLC frame can also be the starting flag of the next frame.
|
||||
page 122.
|
||||
*/
|
||||
#if CHECK_DATA
|
||||
if(check_data(port->drxbuf, *rx_data_len)){
|
||||
dump_chip_SRAM(fe, mod_no, port->idx);
|
||||
dump_chip_SRAM(fe, mod_no, port->idx);
|
||||
reset_chip(fe, mod_no);
|
||||
dump_data(port->drxbuf, *idx);
|
||||
}
|
||||
#endif
|
||||
*idx = 0;
|
||||
|
||||
RX_EXTRA_DBG("%s(): END: eof usage: 0x%X, z1: 0x%X z2: 0x%X f1: 0x%X: f2:0x%X f0c:0x%X\n",
|
||||
__FUNCTION__,
|
||||
READ_REG(A_USAGE), READ_REG( A_Z1), READ_REG(A_Z2),f1,f2,READ_REG( R_F0_CNTL));
|
||||
|
||||
DEBUG_HFC_RX("%s(): finished receiving a frame.\n", __FUNCTION__);
|
||||
return DCHAN_STATUS_COMPLETE;
|
||||
}else{
|
||||
|
||||
RX_EXTRA_DBG("%s(): END: eof usage: 0x%X, z1: 0x%X z2: 0x%X f1: 0x%X: f2:0x%X f0c:0x%X\n",
|
||||
__FUNCTION__,
|
||||
READ_REG(A_USAGE), READ_REG( A_Z1), READ_REG(A_Z2),f1,f2,READ_REG( R_F0_CNTL));
|
||||
|
||||
DEBUG_HFC_RX("%s(): received a part of frame.\n", __FUNCTION__);
|
||||
return DCHAN_STATUS_INCOMPLETE;
|
||||
*rx_data_len = 0;
|
||||
return DCHAN_STATUS_EMPTY;
|
||||
}
|
||||
}else{
|
||||
|
||||
#if 0
|
||||
/* D-Channel debug to syslog */
|
||||
DBG_RX_DATA("%lu:D-RX len(%02i):\n", jiffies, (*idx));
|
||||
i = 0;
|
||||
while(i < (*idx)){
|
||||
printk("%02x ", buf[i++]);
|
||||
if (i == (*idx - 3)){
|
||||
printk ("- ");
|
||||
}
|
||||
}
|
||||
printk("\n");
|
||||
#endif
|
||||
*rx_data_len = *idx - 3;/* discard CRC and STATUS - 3 bytes */
|
||||
/* STATUS is the last byte of a frame in the fifo
|
||||
which is used to check if CRC is correct or not.
|
||||
|
||||
After the ending flag of a frame the XHFC-2SU checks the HDLC CRC checksum.
|
||||
If it is correct one byte with all <EFBFBD>0<EFBFBD>s is inserted behind
|
||||
the CRC data in the FIFO named STAT (see Fig. 4.2). This last byte of a frame in the FIFO is different
|
||||
from all <EFBFBD>0<EFBFBD>s if there is no correct CRC field at the end of the frame.
|
||||
If the STAT value is 0xFF, the HDLC frame ended with at least 8 bits <EFBFBD>1<EFBFBD>s. This is similar to an abort
|
||||
HDLC frame condition.
|
||||
The ending flag of a HDLC frame can also be the starting flag of the next frame.
|
||||
page 122.
|
||||
*/
|
||||
#if CHECK_DATA
|
||||
if(check_data(port->drxbuf, *rx_data_len)){
|
||||
dump_chip_SRAM(fe, mod_no, port->idx);
|
||||
dump_chip_SRAM(fe, mod_no, port->idx);
|
||||
reset_chip(fe, mod_no);
|
||||
dump_data(port->drxbuf, *idx);
|
||||
}
|
||||
#endif
|
||||
*idx = 0;
|
||||
|
||||
RX_EXTRA_DBG("%s(): END: eof usage: 0x%X, z1: 0x%X z2: 0x%X f1: 0x%X: f2:0x%X f0c:0x%X\n",
|
||||
__FUNCTION__,
|
||||
READ_REG(A_USAGE), READ_REG( A_Z1), READ_REG(A_Z2),f1,f2,READ_REG( R_F0_CNTL));
|
||||
__FUNCTION__,
|
||||
READ_REG(A_USAGE), READ_REG( A_Z1), READ_REG(A_Z2),f1,f2,READ_REG( R_F0_CNTL));
|
||||
|
||||
DEBUG_HFC_RX("%s(): RX FIFO is empty!\n", __FUNCTION__);
|
||||
return DCHAN_STATUS_EMPTY;
|
||||
DEBUG_HFC_RX("%s(): finished receiving a frame.\n", __FUNCTION__);
|
||||
return DCHAN_STATUS_COMPLETE;
|
||||
} else {
|
||||
RX_EXTRA_DBG("%s(): END: eof usage: 0x%X, z1: 0x%X z2: 0x%X f1: 0x%X: f2:0x%X f0c:0x%X\n",
|
||||
__FUNCTION__,
|
||||
READ_REG(A_USAGE), READ_REG( A_Z1), READ_REG(A_Z2),f1,f2,READ_REG( R_F0_CNTL));
|
||||
|
||||
DEBUG_HFC_RX("%s(): received a part of frame.\n", __FUNCTION__);
|
||||
return DCHAN_STATUS_INCOMPLETE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void *wp_bri_dchan_rx(sdla_fe_t *fe, u8 mod_no, u8 port_no)
|
||||
static void *wp_bri_dchan_rx(sdla_fe_t *fe, u8 mod_no, u8 port_no, u32 * rx_data_len)
|
||||
{
|
||||
sdla_bri_param_t *bri = &fe->bri_param;
|
||||
wp_bri_module_t *bri_module;
|
||||
bri_xhfc_port_t *port_ptr;
|
||||
netskb_t *skb;
|
||||
u8 *skb_data_area;
|
||||
int rc, rx_data_len = 0;
|
||||
|
||||
int rc;
|
||||
|
||||
/* Note: D channel is slow (less than 2 bytes / ms!!) */
|
||||
DEBUG_HFC_RX("%s(): line: %d, mod_no: %d port_no: %d\n", __FUNCTION__, __LINE__, mod_no, port_no);
|
||||
|
||||
bri_module = &bri->mod[mod_no];
|
||||
port_ptr = &bri_module->port[port_no];
|
||||
|
||||
rc = xhfc_read_fifo_dchan(fe, mod_no, bri_module, port_ptr, &rx_data_len);
|
||||
*rx_data_len = 0;
|
||||
|
||||
rc = xhfc_read_fifo_dchan(fe, mod_no, bri_module, port_ptr, rx_data_len);
|
||||
|
||||
skb = NULL;
|
||||
if((rc == DCHAN_STATUS_COMPLETE) && (rx_data_len < MAX_DFRAME_LEN_L1) && (rx_data_len > 0)){
|
||||
if((rc == DCHAN_STATUS_COMPLETE) && (*rx_data_len < MAX_DFRAME_LEN_L1) && (*rx_data_len > 0)){
|
||||
/**************************/
|
||||
skb = wan_skb_alloc(rx_data_len);
|
||||
skb = wan_skb_alloc(*rx_data_len);
|
||||
if(skb == NULL){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
skb_data_area = wan_skb_put(skb, rx_data_len);
|
||||
memcpy(skb_data_area, port_ptr->drxbuf, rx_data_len);
|
||||
skb_data_area = wan_skb_put(skb, *rx_data_len);
|
||||
memcpy(skb_data_area, port_ptr->drxbuf, *rx_data_len);
|
||||
|
||||
#if 0
|
||||
{
|
||||
int ind;
|
||||
for(ind = 0; ind < rx_data_len; ind++){
|
||||
for(ind = 0; ind < *rx_data_len; ind++){
|
||||
if(skb_data_area[ind] != ind){
|
||||
DEBUG_RX1("rx: skb_data_area[0x%x] is: 0x%x != 0x%x!!\n",
|
||||
ind, skb_data_area[ind], ind);
|
||||
|
@ -2518,9 +2625,9 @@ static void bri_enable_interrupts(sdla_fe_t *fe, u32 mod_no, u8 port_no)
|
|||
WRITE_REG(R_SU_IRQMSK, 0);
|
||||
|
||||
r_ti_wd.reg = 0x0;
|
||||
/* Configure Timer Interrupt - every 2.048 seconds (page 289, 297).
|
||||
Used for SU port_no state monitoring. */
|
||||
r_ti_wd.bit.v_ev_ts = 0xD;
|
||||
/* Configure Timer Interrupt - every 1 sec (page 289, 297).
|
||||
Used for SU port_no state monitoring + polling fifo IRQs. */
|
||||
r_ti_wd.bit.v_ev_ts = 0xC;
|
||||
/* Watch Dog interrupt not used */
|
||||
r_ti_wd.bit.v_wd_ts = 0x0;
|
||||
WRITE_REG(R_TI_WD, r_ti_wd.reg);
|
||||
|
@ -3469,13 +3576,14 @@ sdla_fe_t *get_FE_ptr_for_port(sdla_fe_t *original_fe, u8 mod_no, u8 port_no)
|
|||
static int32_t xhfc_interrupt(sdla_fe_t *fe, u8 mod_no)
|
||||
{
|
||||
sdla_fe_t *new_fe;
|
||||
int32_t fifo_irq = 0;
|
||||
uint32_t fifo_irq;
|
||||
sdla_bri_param_t *bri = &fe->bri_param;
|
||||
wp_bri_module_t *bri_module;
|
||||
u8 port_no, i;
|
||||
reg_a_su_rd_sta new_su_state;
|
||||
reg_r_su_irq r_su_irq;
|
||||
reg_r_misc_irq r_misc_irq;
|
||||
uint32_t rx_chan_bit;
|
||||
|
||||
if(validate_physical_mod_no(mod_no, __FUNCTION__)){
|
||||
return 0;
|
||||
|
@ -3494,8 +3602,21 @@ static int32_t xhfc_interrupt(sdla_fe_t *fe, u8 mod_no)
|
|||
r_misc_irq.reg = READ_REG(R_MISC_IRQ);
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
fifo_irq = 0;
|
||||
for (port_no = 0; port_no < bri_module->num_ports; port_no++) {
|
||||
for (i = 0; i < bri_module->num_ports; i++)
|
||||
{
|
||||
new_fe = get_FE_ptr_for_port(fe, mod_no, i);
|
||||
|
||||
if(new_fe == NULL){
|
||||
/* 'port_no' is not used by any 'wanpipe' */
|
||||
continue;
|
||||
}
|
||||
|
||||
fe = new_fe;
|
||||
|
||||
mod_no = fe_line_no_to_physical_mod_no(fe);
|
||||
port_no = fe_line_no_to_port_no(fe);
|
||||
|
||||
DBG_MODULE_TESTER("get fifo IRQ state for port_no %d\n", port_no);
|
||||
|
||||
|
@ -3503,6 +3624,14 @@ static int32_t xhfc_interrupt(sdla_fe_t *fe, u8 mod_no)
|
|||
fifo_irq |= (READ_REG(R_FIFO_BL0_IRQ + port_no) << (port_no * 8));
|
||||
|
||||
DBG_MODULE_TESTER("fifo_irq: 0x%X\n", fifo_irq);
|
||||
|
||||
}
|
||||
|
||||
if (bri_module->prev_fifoirq != fifo_irq)
|
||||
{
|
||||
DEBUG_HFC_IRQ("%s():%s: fifo IRQ: now = 0x%04X, prev = 0x%04X (%d)\n",
|
||||
__FUNCTION__, fe->name,
|
||||
fifo_irq, bri_module->prev_fifoirq, bri_module->num_ports);
|
||||
}
|
||||
|
||||
/***************************************************************************/
|
||||
|
@ -3519,6 +3648,9 @@ static int32_t xhfc_interrupt(sdla_fe_t *fe, u8 mod_no)
|
|||
|
||||
mod_no = fe_line_no_to_physical_mod_no(fe);
|
||||
port_no = fe_line_no_to_port_no(fe);
|
||||
|
||||
rx_chan_bit = 1 << (port_no*8+5);
|
||||
|
||||
/****************************************************************/
|
||||
|
||||
if(r_misc_irq.reg & M_TI_IRQ){
|
||||
|
@ -3570,26 +3702,21 @@ static int32_t xhfc_interrupt(sdla_fe_t *fe, u8 mod_no)
|
|||
|
||||
}/* if(r_misc_irq.reg & M_TI_IRQ || (r_su_irq.reg & (1 << port_no))) */
|
||||
|
||||
if(bri_module->port[port_no].bytes2transmit){
|
||||
u8 free_space;
|
||||
|
||||
TX_FAST_DBG("%s(): port_no: %d, bytes2transmit: %d, dtx_indx: %d\n",
|
||||
__FUNCTION__, port_no, bri_module->port[port_no].bytes2transmit,
|
||||
bri_module->port[port_no].dtx_indx);
|
||||
|
||||
xhfc_write_fifo_dchan(fe, mod_no, bri_module, &bri_module->port[port_no], &free_space);
|
||||
}
|
||||
|
||||
/* receive D-Channel Data */
|
||||
if (fifo_irq & (1 << (port_no*8+5)) ) {
|
||||
netskb_t *skb = NULL;
|
||||
DBG_MODULE_TESTER("There is Rx D-Channel Data for port_no %d\n", port_no);
|
||||
|
||||
skb = wp_bri_dchan_rx(fe, mod_no, port_no);
|
||||
if(skb != NULL){
|
||||
if (((fifo_irq | bri_module->prev_fifoirq) & rx_chan_bit) || (r_misc_irq.reg & M_TI_IRQ)) {
|
||||
uint32_t rx_chan_pending = 0;
|
||||
u8 rx_read_skb = 0;
|
||||
|
||||
for (;;) {
|
||||
sdla_t *card = (sdla_t*)fe->card;
|
||||
private_area_t *chan;
|
||||
|
||||
netskb_t *skb = wp_bri_dchan_rx(fe, mod_no, port_no, &rx_chan_pending);
|
||||
|
||||
if (!skb) break;
|
||||
|
||||
DEBUG_HFC_IRQ("%s(): Module: %d, port_no: %d.\n", __FUNCTION__, mod_no, port_no);
|
||||
chan=(private_area_t*)card->u.aft.dev_to_ch_map[BRI_DCHAN_LOGIC_CHAN];
|
||||
|
||||
|
@ -3600,11 +3727,43 @@ static int32_t xhfc_interrupt(sdla_fe_t *fe, u8 mod_no)
|
|||
break;
|
||||
}
|
||||
wan_skb_queue_tail(&chan->wp_rx_bri_dchan_complete_list, skb);
|
||||
|
||||
if (skb || rx_chan_pending) {
|
||||
rx_read_skb = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (rx_read_skb) {
|
||||
sdla_t *card = (sdla_t*)fe->card;
|
||||
private_area_t *chan=(private_area_t*)card->u.aft.dev_to_ch_map[BRI_DCHAN_LOGIC_CHAN];
|
||||
|
||||
DEBUG_HFC_IRQ("%s(): chan ptr: 0x%p\n", __FUNCTION__, chan);
|
||||
if (!chan){
|
||||
DEBUG_ERROR("%s: Error: BRI D-Chan: No Device for Rx data.(logical ch=%d)\n",
|
||||
card->devname, BRI_DCHAN_LOGIC_CHAN);
|
||||
break;
|
||||
}
|
||||
|
||||
WAN_TASKLET_SCHEDULE((&chan->common.bh_task));
|
||||
}
|
||||
|
||||
}/* if ( fifo_irq & (1 << (port_no*8+5)) ) */
|
||||
}/* for (port_no = 0; port_no < bri_module->num_ports; port_no++) */
|
||||
if (rx_read_skb || rx_chan_pending) {
|
||||
bri_module->prev_fifoirq |= rx_chan_bit;
|
||||
} else {
|
||||
bri_module->prev_fifoirq &= ~rx_chan_bit;
|
||||
}
|
||||
}
|
||||
|
||||
if(bri_module->port[port_no].bytes2transmit){
|
||||
u8 free_space;
|
||||
|
||||
TX_FAST_DBG("%s(): port_no: %d, bytes2transmit: %d, dtx_indx: %d\n",
|
||||
__FUNCTION__, port_no, bri_module->port[port_no].bytes2transmit,
|
||||
bri_module->port[port_no].dtx_indx);
|
||||
|
||||
xhfc_write_fifo_dchan(fe, mod_no, bri_module, &bri_module->port[port_no], &free_space);
|
||||
}
|
||||
}
|
||||
/***************************************************************************/
|
||||
|
||||
return 1;
|
||||
|
|
|
@ -1738,9 +1738,9 @@ static void wp_tdmv_tx_hdlc_hard(struct zt_chan *chan)
|
|||
WAN_ASSERT_VOID(wp->card == NULL);
|
||||
card = wp->card;
|
||||
|
||||
/* If the module is TE and line is not connected, we could be in
|
||||
power saving mode. Try to wake up the line */
|
||||
if (aft_is_bri_te_card(card) && card->wandev.state != WAN_CONNECTED) {
|
||||
/* If line is not connected, we could be in power saving mode.
|
||||
* Therefore, try to wake up the line */
|
||||
if (card->wandev.state != WAN_CONNECTED) {
|
||||
wan_smp_flag_t smp_flags;
|
||||
card->hw_iface.hw_lock(card->hw,&smp_flags);
|
||||
card->wandev.fe_iface.set_fe_status(&card->fe, WAN_FE_CONNECTED);
|
||||
|
|
|
@ -1639,7 +1639,11 @@ static int if_send (struct sk_buff* skb, netdevice_t* dev)
|
|||
++card->wandev.stats.tx_packets;
|
||||
card->wandev.stats.tx_bytes += len;
|
||||
#if defined(LINUX_2_4)||defined(LINUX_2_6)
|
||||
dev->trans_start = jiffies;
|
||||
# if defined(KERN_NETIF_TRANS_UPDATE) && KERN_NETIF_TRANS_UPDATE > 0
|
||||
netif_trans_update(dev);
|
||||
# else
|
||||
dev->trans_start = jiffies;
|
||||
# endif
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1655,7 +1655,9 @@ static void if_tx_timeout (netdevice_t *dev)
|
|||
atomic_inc(&card->u.f.tx_interrupts_pending);
|
||||
card->hw_iface.set_bit(card->hw, card->intr_perm_off, FR_INTR_TXRDY);
|
||||
|
||||
#if defined(LINUX_2_4) || defined(LINUX_2_6)
|
||||
#if defined(KERN_NETIF_TRANS_UPDATE) && KERN_NETIF_TRANS_UPDATE > 0
|
||||
netif_trans_update(dev);
|
||||
#elif defined(LINUX_2_4) || defined(LINUX_2_6)
|
||||
dev->trans_start = jiffies;
|
||||
#endif
|
||||
|
||||
|
@ -1959,7 +1961,9 @@ static int if_send (struct sk_buff* skb, netdevice_t* dev)
|
|||
|
||||
chan->ifstats.tx_bytes += skb->len;
|
||||
card->wandev.stats.tx_bytes += skb->len;
|
||||
#if defined(LINUX_2_4) || defined(LINUX_2_6)
|
||||
#if defined(KERN_NETIF_TRANS_UPDATE) && KERN_NETIF_TRANS_UPDATE > 0
|
||||
netif_trans_update(dev);
|
||||
#elif defined(LINUX_2_4) || defined(LINUX_2_6)
|
||||
dev->trans_start = jiffies;
|
||||
#endif
|
||||
}
|
||||
|
@ -3074,7 +3078,9 @@ static void tx_intr(sdla_t *card)
|
|||
chan->delay_skb = NULL;
|
||||
chan->transmit_length = 0;
|
||||
|
||||
#if defined(LINUX_2_4) || defined(LINUX_2_6)
|
||||
#if defined(KERN_NETIF_TRANS_UPDATE) && KERN_NETIF_TRANS_UPDATE > 0
|
||||
netif_trans_update(dev);
|
||||
#elif defined(LINUX_2_4) || defined(LINUX_2_6)
|
||||
dev->trans_start = jiffies;
|
||||
#endif
|
||||
|
||||
|
|
|
@ -280,10 +280,10 @@ static int wp_gsm_udp(sdla_fe_t *fe, void *p_udp_cmd, unsigned char *data)
|
|||
udp_cmd->wan_cmd_return_code = WAN_CMD_OK;
|
||||
udp_cmd->wan_cmd_data_len = 0;
|
||||
if (gsm_udp && gsm_udp->u.uart_debug == WAN_TRUE) {
|
||||
wan_set_bit(AFT_GSM_UART_DEBUG_ENABLED_BIT, &card->TracingEnabled);
|
||||
wan_set_bit(AFT_GSM_UART_DEBUG_ENABLED_BIT, (volatile long *)&card->TracingEnabled);
|
||||
DEBUG_EVENT("%s: UART debugging enabled\n", card->devname);
|
||||
} else {
|
||||
wan_clear_bit(AFT_GSM_UART_DEBUG_ENABLED_BIT, &card->TracingEnabled);
|
||||
wan_clear_bit(AFT_GSM_UART_DEBUG_ENABLED_BIT, (volatile long *)&card->TracingEnabled);
|
||||
DEBUG_EVENT("%s: UART debugging disabled\n", card->devname);
|
||||
}
|
||||
}
|
||||
|
@ -294,7 +294,7 @@ static int wp_gsm_udp(sdla_fe_t *fe, void *p_udp_cmd, unsigned char *data)
|
|||
udp_cmd->wan_cmd_return_code = WAN_CMD_OK;
|
||||
udp_cmd->wan_cmd_data_len = 0;
|
||||
DEBUG_EVENT("%s: Audio debugging toggled\n", card->devname);
|
||||
wan_set_bit(AFT_GSM_AUDIO_DEBUG_TOGGLE_BIT, &card->TracingEnabled);
|
||||
wan_set_bit(AFT_GSM_AUDIO_DEBUG_TOGGLE_BIT, (volatile long *)&card->TracingEnabled);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -553,7 +553,7 @@ int wp_gsm_uart_rx_fifo(void *pcard, unsigned char *rx_buff, int reqlen)
|
|||
card->hw_iface.bus_read_4(card->hw, AFT_GSM_MOD_REG(mod_no, AFT_GSM_UART_RX_REG), ®);
|
||||
rx_buff[i] = (reg & 0xFF);
|
||||
}
|
||||
if (wan_test_bit(AFT_GSM_UART_DEBUG_ENABLED_BIT, &card->TracingEnabled)) {
|
||||
if (wan_test_bit(AFT_GSM_UART_DEBUG_ENABLED_BIT, (volatile long *)&card->TracingEnabled)) {
|
||||
DEBUG_EVENT("%s: UART RX %d bytes: %s\n", card->devname, num_bytes, format_uart_data(rx_debug, rx_buff, num_bytes));
|
||||
}
|
||||
return num_bytes;
|
||||
|
@ -629,7 +629,7 @@ int wp_gsm_uart_tx_fifo(void *pcard, unsigned char *tx_buff, int len)
|
|||
reg = (tx_buff[i] & 0xFF);
|
||||
card->hw_iface.bus_write_4(card->hw, AFT_GSM_MOD_REG(mod_no, AFT_GSM_UART_TX_REG), reg);
|
||||
}
|
||||
if (wan_test_bit(AFT_GSM_UART_DEBUG_ENABLED_BIT, &card->TracingEnabled)) {
|
||||
if (wan_test_bit(AFT_GSM_UART_DEBUG_ENABLED_BIT, (volatile long *)&card->TracingEnabled)) {
|
||||
DEBUG_EVENT("%s: UART TX %d bytes: %s\n", card->devname, len, format_uart_data(tx_debug, tx_buff, len));
|
||||
}
|
||||
return len;
|
||||
|
|
|
@ -1171,7 +1171,11 @@ static int if_send (struct sk_buff *skb, netdevice_t *dev)
|
|||
card->wandev.stats.tx_bytes += skb->len;
|
||||
start_net_queue(dev);
|
||||
#if defined(LINUX_2_4)||defined(LINUX_2_6)
|
||||
# if defined(KERN_NETIF_TRANS_UPDATE) && KERN_NETIF_TRANS_UPDATE > 0
|
||||
netif_trans_update(dev);
|
||||
# else
|
||||
dev->trans_start = jiffies;
|
||||
# endif
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
|
|
@ -340,7 +340,7 @@ static int32_t wp_serial_config(void *pfe)
|
|||
return -EINVAL;
|
||||
};
|
||||
|
||||
cpld_reg_val=aft_serial_read_cpld(card,cpld_reg);
|
||||
cpld_reg_val=aft_serial_read_cpld(card,(unsigned short)cpld_reg);
|
||||
|
||||
if (card->wandev.electrical_interface == WANOPT_X21) {
|
||||
wan_set_bit(AFT_SERIAL_LCFG_X21_MODE_BIT, ®);
|
||||
|
@ -364,12 +364,12 @@ static int32_t wp_serial_config(void *pfe)
|
|||
|
||||
if (card->wandev.clocking == WANOPT_INTERNAL) {
|
||||
if (card->wandev.electrical_interface == WANOPT_X21) {
|
||||
aft_serial_write_cpld(card,cpld_reg,0x07);
|
||||
aft_serial_write_cpld(card,(unsigned short)cpld_reg,0x07);
|
||||
}else{
|
||||
aft_serial_write_cpld(card,cpld_reg,0x05);
|
||||
aft_serial_write_cpld(card,(unsigned short)cpld_reg,0x05);
|
||||
}
|
||||
} else {
|
||||
aft_serial_write_cpld(card,cpld_reg,0x01);
|
||||
aft_serial_write_cpld(card,(unsigned short)cpld_reg,0x01);
|
||||
}
|
||||
} else {
|
||||
if (wan_test_bit(2,&cpld_reg_val)) {
|
||||
|
@ -381,9 +381,9 @@ static int32_t wp_serial_config(void *pfe)
|
|||
}
|
||||
|
||||
if (card->wandev.electrical_interface == WANOPT_X21) {
|
||||
aft_serial_write_cpld(card,cpld_reg,0x03);
|
||||
aft_serial_write_cpld(card,(unsigned short)cpld_reg,0x03);
|
||||
} else {
|
||||
aft_serial_write_cpld(card,cpld_reg,0x01);
|
||||
aft_serial_write_cpld(card,(unsigned short)cpld_reg,0x01);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -400,13 +400,13 @@ static int32_t wp_serial_config(void *pfe)
|
|||
cpld_reg=0x09;
|
||||
}
|
||||
|
||||
cpld_reg_val=aft_serial_read_cpld(card,cpld_reg);
|
||||
cpld_reg_val=aft_serial_read_cpld(card,(unsigned short)cpld_reg);
|
||||
if(card->wandev.clocking) {
|
||||
wan_set_bit((WAN_FE_LINENO(fe)%2), &cpld_reg_val);
|
||||
} else {
|
||||
wan_clear_bit((WAN_FE_LINENO(fe)%2), &cpld_reg_val);
|
||||
}
|
||||
aft_serial_write_cpld(card,cpld_reg,cpld_reg_val);
|
||||
aft_serial_write_cpld(card,(unsigned short)cpld_reg,(u16)cpld_reg_val);
|
||||
|
||||
break;
|
||||
|
||||
|
@ -558,9 +558,9 @@ static int32_t wp_serial_unconfig(void *pfe)
|
|||
cpld_reg=0x09;
|
||||
}
|
||||
|
||||
cpld_reg_val=aft_serial_read_cpld(card,cpld_reg);
|
||||
cpld_reg_val=aft_serial_read_cpld(card,(unsigned short)cpld_reg);
|
||||
wan_clear_bit((WAN_FE_LINENO(fe)%2), &cpld_reg_val);
|
||||
aft_serial_write_cpld(card,cpld_reg,cpld_reg_val);
|
||||
aft_serial_write_cpld(card,(unsigned short)cpld_reg,(u16)cpld_reg_val);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -654,7 +654,7 @@ int wp_xilinx_init (sdla_t* card, wandev_conf_t* conf)
|
|||
|
||||
card->u.aft.cfg.mru=conf->u.aft.mru;
|
||||
if (!card->u.aft.cfg.mru){
|
||||
card->u.aft.cfg.mru = card->wandev.mtu;
|
||||
card->u.aft.cfg.mru = (unsigned short)card->wandev.mtu;
|
||||
}
|
||||
|
||||
if (card->u.aft.cfg.mru > MAX_WP_PRI_MTU ||
|
||||
|
@ -1596,7 +1596,7 @@ static int new_if_private (wan_device_t* wandev, netdevice_t* dev, wanif_conf_t*
|
|||
if (!chan->hdlc_eng){
|
||||
unsigned char *buf;
|
||||
|
||||
chan->max_idle_size=chan->mru;
|
||||
chan->max_idle_size=(u16)chan->mru;
|
||||
chan->idle_flag = conf->u.aft.idle_flag;
|
||||
|
||||
DEBUG_EVENT("%s: Idle Flag :0x%02X\n",
|
||||
|
@ -2645,7 +2645,7 @@ static int wanpipe_xilinx_send (netskb_t* skb, netdevice_t* dev)
|
|||
wan_spin_unlock_irq(&card->wandev.lock, &smp_flags);
|
||||
goto xilinx_tx_dma;
|
||||
|
||||
} else if (wan_skb_queue_len(&chan->wp_tx_pending_list) > chan->max_tx_bufs){
|
||||
} else if (wan_skb_queue_len(&chan->wp_tx_pending_list) > (int)chan->max_tx_bufs){
|
||||
wan_smp_flag_t smp_flags;
|
||||
DEBUG_TEST("%s(): line: %d\n", __FUNCTION__, __LINE__);
|
||||
|
||||
|
@ -4495,7 +4495,7 @@ static void xilinx_rx_post_complete (sdla_t *card, private_area_t *chan,
|
|||
* on alignment value, received from DMA */
|
||||
len=(((chan->dma_mru>>2)-len)<<2) - (~(rx_el->align)&RxDMA_LO_ALIGNMENT_BIT_MASK);
|
||||
|
||||
if (len < 1 || len > chan->dma_mru){
|
||||
if (len < 1 || len > (unsigned int)chan->dma_mru){
|
||||
chan->if_stats.rx_frame_errors++;
|
||||
chan->errstats.Rx_hdlc_corrupiton++;
|
||||
goto rx_comp_error;
|
||||
|
@ -4507,7 +4507,7 @@ static void xilinx_rx_post_complete (sdla_t *card, private_area_t *chan,
|
|||
* the RX buffers are all of equal length */
|
||||
len=(((chan->mru>>2)-len)<<2) - (~(0x03)&RxDMA_LO_ALIGNMENT_BIT_MASK);
|
||||
|
||||
if (len < 1 || len > chan->mru){
|
||||
if (len < 1 || len > (unsigned int)chan->mru){
|
||||
chan->if_stats.rx_frame_errors++;
|
||||
goto rx_comp_error;
|
||||
}
|
||||
|
@ -4535,7 +4535,7 @@ static void xilinx_rx_post_complete (sdla_t *card, private_area_t *chan,
|
|||
}
|
||||
|
||||
|
||||
if (len > aft_rx_copyback){
|
||||
if (len > (unsigned int)aft_rx_copyback){
|
||||
|
||||
#if defined(__OpenBSD__)
|
||||
/* Try not to return our mbuf to the kernel.
|
||||
|
@ -4620,7 +4620,7 @@ static char request_xilinx_logical_channel_num (sdla_t *card, private_area_t *ch
|
|||
|
||||
for (i=0;i<card->u.aft.num_of_time_slots;i++){
|
||||
if (!wan_test_and_set_bit(i,&card->u.aft.logic_ch_map)){
|
||||
logic_ch=i;
|
||||
logic_ch=(char)i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -4662,7 +4662,7 @@ static void free_xilinx_logical_channel_num (sdla_t *card, int logic_ch)
|
|||
card->u.aft.dev_to_ch_map[logic_ch]=NULL;
|
||||
|
||||
if (logic_ch >= card->u.aft.top_logic_ch){
|
||||
int i;
|
||||
unsigned char i;
|
||||
|
||||
card->u.aft.top_logic_ch=XILINX_DEFLT_ACTIVE_CH;
|
||||
|
||||
|
@ -5781,7 +5781,7 @@ static int process_udp_mgmt_pkt(sdla_t* card, netdevice_t* dev,
|
|||
|
||||
|
||||
case WAN_GET_PROTOCOL:
|
||||
wan_udp_pkt->wan_udp_data[0] = card->wandev.config_id;
|
||||
wan_udp_pkt->wan_udp_data[0] = (unsigned char)card->wandev.config_id;
|
||||
wan_udp_pkt->wan_udp_return_code = CMD_OK;
|
||||
wan_udp_pkt->wan_udp_data_len = 1;
|
||||
break;
|
||||
|
@ -5807,7 +5807,7 @@ static int process_udp_mgmt_pkt(sdla_t* card, netdevice_t* dev,
|
|||
break;
|
||||
|
||||
case WANPIPEMON_GET_BIOS_ENCLOSURE3_SERIAL_NUMBER:
|
||||
wan_udp_pkt->wan_udp_return_code =
|
||||
wan_udp_pkt->wan_udp_return_code = (unsigned int)
|
||||
wp_get_motherboard_enclosure_serial_number(wan_udp_pkt->wan_udp_data,
|
||||
sizeof(wan_udp_pkt->wan_udp_data));
|
||||
|
||||
|
@ -5875,7 +5875,7 @@ static void port_set_state (sdla_t *card, int state)
|
|||
break;
|
||||
}
|
||||
|
||||
card->wandev.state = state;
|
||||
card->wandev.state = (char)state;
|
||||
#if defined(__WINDOWS__)
|
||||
{
|
||||
int i;
|
||||
|
@ -6199,7 +6199,7 @@ static int xilinx_write_bios(sdla_t *card, wan_cmd_api_t *api_cmd)
|
|||
#endif
|
||||
card->hw_iface.pci_write_config_dword(card->hw,
|
||||
(card->wandev.S514_cpu_no[0] == SDLA_CPU_A) ? 0x10 : 0x14,
|
||||
card->u.aft.bar);
|
||||
(u32)card->u.aft.bar);
|
||||
card->hw_iface.pci_write_config_dword(card->hw, 0x3C, card->wandev.irq);
|
||||
card->hw_iface.pci_write_config_dword(card->hw, 0x0C, 0x0000ff00);
|
||||
|
||||
|
@ -6735,10 +6735,10 @@ static int set_chan_state(sdla_t* card, netdevice_t* dev, int state)
|
|||
set_netdev_state(card, dev, state);
|
||||
#endif
|
||||
|
||||
chan->common.state = state;
|
||||
chan->common.state = (unsigned char)state;
|
||||
|
||||
for (ch_ptr=chan; ch_ptr != NULL; ch_ptr=ch_ptr->next){
|
||||
ch_ptr->common.state=state;
|
||||
ch_ptr->common.state=(unsigned char)state;
|
||||
if (ch_ptr->tdmv_zaptel_cfg) {
|
||||
continue;
|
||||
}
|
||||
|
@ -6836,7 +6836,7 @@ static int request_fifo_baddr_and_size(sdla_t *card, private_area_t *chan)
|
|||
DEBUG_TEST("%s:%s: Optimal Fifo Size =%d Timeslots=%d \n",
|
||||
card->devname,chan->if_name,req_fifo_size,chan->num_of_time_slots);
|
||||
|
||||
fifo_size=map_fifo_baddr_and_size(card,req_fifo_size,&chan->fifo_base_addr);
|
||||
fifo_size=(unsigned char)map_fifo_baddr_and_size(card,req_fifo_size,&chan->fifo_base_addr);
|
||||
if (fifo_size == 0 || chan->fifo_base_addr == 31){
|
||||
DEBUG_EVENT("%s:%s: Error: Failed to obtain fifo size %d or addr %d \n",
|
||||
card->devname,chan->if_name,fifo_size,chan->fifo_base_addr);
|
||||
|
@ -6887,7 +6887,7 @@ static int map_fifo_baddr_and_size(sdla_t *card, unsigned char fifo_size, unsign
|
|||
continue;
|
||||
}
|
||||
card->u.aft.fifo_addr_map |= reg<<i;
|
||||
*addr=i;
|
||||
*addr=(unsigned char)i;
|
||||
|
||||
DEBUG_TEST("%s: Card fifo Map 0x%lX Addr =%d\n",
|
||||
card->devname,card->u.aft.fifo_addr_map,i);
|
||||
|
@ -7793,7 +7793,7 @@ static int aft_tdmv_if_init(sdla_t *card, private_area_t *chan, wanif_conf_t *co
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
chan->mtu = chan->mru = card->u.aft.cfg.mru = card->wandev.mtu;
|
||||
chan->mtu = chan->mru = card->u.aft.cfg.mru = (unsigned short)card->wandev.mtu;
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -2336,7 +2336,7 @@ int sdla_get_hw_info(sdlahw_t* hw)
|
|||
from PCI_CORE_REV_REG (0xFC) */
|
||||
u16 new_core_rev = 0x00;
|
||||
sdla_bus_read_2(hw, SDLA_REG_OFF(hwcard, PCI_CORE_REV_REG), &new_core_rev);
|
||||
hwcard->core_rev = new_core_rev;
|
||||
hwcard->core_rev = (unsigned char)new_core_rev;
|
||||
}
|
||||
|
||||
if (hwcard->adptr_subtype == AFT_SUBTYPE_NORMAL){
|
||||
|
@ -11174,7 +11174,7 @@ static sdla_dma_addr_t sdla_pci_map_dma(void *phw, void *buf, int len, int ctrl)
|
|||
{
|
||||
/* translate virtual to physical */
|
||||
PHYSICAL_ADDRESS phaTemp = MmGetPhysicalAddress(buf);
|
||||
return phaTemp.QuadPart;
|
||||
return (sdla_dma_addr_t)phaTemp.QuadPart;
|
||||
}
|
||||
#else
|
||||
return virt_to_phys(buf);
|
||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -15,7 +15,9 @@
|
|||
|
||||
#include "wanpipe_cdev_iface.h"
|
||||
|
||||
#ifdef LINUX_2_4
|
||||
#define WP_CDEV_MAJOR 241
|
||||
#endif
|
||||
#define WP_CDEV_MINOR_OFFSET 0
|
||||
#define WP_CDEV_MAX_MINORS 5000
|
||||
|
||||
|
@ -50,6 +52,8 @@ static struct class_simple *wp_cdev_class = NULL;
|
|||
|
||||
#endif/* #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) */
|
||||
|
||||
static dev_t wanpipe_dev = 0;
|
||||
|
||||
|
||||
# define WP_CDEV_SPAN_MASK 0xFFFF
|
||||
# define WP_CDEV_SPAN_SHIFT 5 //8
|
||||
|
@ -183,17 +187,16 @@ int wanpipe_global_cdev_init(void)
|
|||
wp_cdev_class = class_create(THIS_MODULE, "wanpipe");
|
||||
|
||||
#else
|
||||
dev_t dev = MKDEV(WP_CDEV_MAJOR, 0);
|
||||
|
||||
if ((err=register_chrdev_region(dev, WP_CDEV_MAX_MINORS, "wanpipe"))) {
|
||||
DEBUG_ERROR("%s(): Error unable to register device!\n",__FUNCTION__);
|
||||
if ((err=alloc_chrdev_region(&wanpipe_dev, 0, WP_CDEV_MAX_MINORS, "wanpipe"))) {
|
||||
DEBUG_ERROR("%s(): Error unable to alloc wanpipe device: %d\n",__FUNCTION__, err);
|
||||
return err;
|
||||
}
|
||||
|
||||
cdev_init(&wp_cdev_dev, &wp_cdev_fops);
|
||||
if (cdev_add(&wp_cdev_dev, dev, WP_CDEV_MAX_MINORS)) {
|
||||
if (cdev_add(&wp_cdev_dev, wanpipe_dev, WP_CDEV_MAX_MINORS)) {
|
||||
kobject_put(&wp_cdev_dev.kobj);
|
||||
unregister_chrdev_region(dev, WP_CDEV_MAX_MINORS);
|
||||
unregister_chrdev_region(wanpipe_dev, WP_CDEV_MAX_MINORS);
|
||||
DEBUG_ERROR("%s(): Error cdev_add!\n",__FUNCTION__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -202,7 +205,7 @@ int wanpipe_global_cdev_init(void)
|
|||
if (IS_ERR(wp_cdev_class)) {
|
||||
DEBUG_ERROR("%s(): Error creating class!\n",__FUNCTION__);
|
||||
cdev_del(&wp_cdev_dev);
|
||||
unregister_chrdev_region(dev, WP_CDEV_MAX_MINORS);
|
||||
unregister_chrdev_region(wanpipe_dev, WP_CDEV_MAX_MINORS);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -242,7 +245,7 @@ int wanpipe_global_cdev_free(void)
|
|||
unregister_chrdev(WP_CDEV_MAJOR, "wanpipe");
|
||||
#else
|
||||
cdev_del(&wp_cdev_dev);
|
||||
unregister_chrdev_region(MKDEV(WP_CDEV_MAJOR, 0), WP_CDEV_MAX_MINORS);
|
||||
unregister_chrdev_region(wanpipe_dev, WP_CDEV_MAX_MINORS);
|
||||
|
||||
bus_unregister(&wanpipe_device_bus);
|
||||
#endif
|
||||
|
@ -509,8 +512,12 @@ static int wanpipe_create_cdev(wanpipe_cdev_t *cdev, int minor, int *counter)
|
|||
wan_spin_lock_init(&cdev_priv->lock, lname);
|
||||
init_waitqueue_head(&cdev_priv->poll_wait);
|
||||
|
||||
#ifdef LINUX_2_4
|
||||
WP_CLASS_DEV_CREATE(wp_cdev_class,
|
||||
MKDEV(WP_CDEV_MAJOR, minor), NULL, NULL,cdev->name);
|
||||
#else
|
||||
WP_CLASS_DEV_CREATE(wp_cdev_class, MKDEV(MAJOR(wanpipe_dev), minor), NULL, NULL,cdev->name);
|
||||
#endif
|
||||
|
||||
DEBUG_CDEV("%s(): CREATING CDEV DEVICE MINOR 0x%X! cdev=%p idx=%p\n",
|
||||
__FUNCTION__,minor,cdev,wandev.idx[minor]);
|
||||
|
@ -550,8 +557,12 @@ static int wanpipe_free_cdev(wanpipe_cdev_t *cdev, int minor, int *counter)
|
|||
cdev->priv=NULL;
|
||||
wan_free(cdev_priv);
|
||||
|
||||
#ifdef LINUX_2_4
|
||||
class_device_destroy(wp_cdev_class,
|
||||
MKDEV(WP_CDEV_MAJOR, minor));
|
||||
#else
|
||||
class_device_destroy(wp_cdev_class, MKDEV(MAJOR(wanpipe_dev), minor));
|
||||
#endif
|
||||
|
||||
DEBUG_CDEV("%s(): FREEING CDEV DEVICE MINOR 0x%X!\n",__FUNCTION__,minor);
|
||||
|
||||
|
@ -728,6 +739,8 @@ static ssize_t wp_cdev_write(struct file *file, const char *usrbuf, size_t count
|
|||
wanpipe_cdev_t *cdev;
|
||||
wan_iovec_t iovstack[WP_UIO_MAX_SZ];
|
||||
wan_iovec_t *iov=iovstack;
|
||||
wan_iovec_t iovstack1[WP_UIO_MAX_SZ];
|
||||
wan_iovec_t *iov1=iovstack1;
|
||||
wan_msghdr_t msg_sys;
|
||||
wan_msghdr_t msg_sys1;
|
||||
wan_msghdr_t *msg = (wan_msghdr_t*)usrbuf;
|
||||
|
@ -756,12 +769,16 @@ static ssize_t wp_cdev_write(struct file *file, const char *usrbuf, size_t count
|
|||
if (msg_sys.msg_iovlen > WP_UIO_MAX_SZ)
|
||||
return -EFAULT;
|
||||
|
||||
|
||||
err=wan_verify_iovec(&msg_sys, iov, NULL, 0);
|
||||
if (err < 0) {
|
||||
return err;
|
||||
}
|
||||
|
||||
err=wan_verify_iovec(&msg_sys1, iov1, NULL, 0);
|
||||
if (err < 0) {
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
/* Update the count with length obtained from verify */
|
||||
count = err;
|
||||
|
|
|
@ -265,7 +265,11 @@ static int wan_iface_init(netdevice_t* dev)
|
|||
dev->addr_len = 0;
|
||||
*(u8*)dev->dev_addr = 0;
|
||||
|
||||
#if defined(KERN_NETIF_TRANS_UPDATE) && KERN_NETIF_TRANS_UPDATE > 0
|
||||
netif_trans_update(dev);
|
||||
#else
|
||||
dev->trans_start = SYSTEM_TICKS;
|
||||
#endif
|
||||
|
||||
/* Initialize socket buffers */
|
||||
dev_init_buffers(dev);
|
||||
|
@ -300,7 +304,11 @@ static int wan_iface_eth_init(netdevice_t* dev)
|
|||
}
|
||||
dev->tx_queue_len = 100;
|
||||
|
||||
#if defined(KERN_NETIF_TRANS_UPDATE) && KERN_NETIF_TRANS_UPDATE > 0
|
||||
netif_trans_update(dev);
|
||||
#else
|
||||
dev->trans_start = SYSTEM_TICKS;
|
||||
#endif
|
||||
|
||||
/* Initialize socket buffers */
|
||||
dev_init_buffers(dev);
|
||||
|
|
|
@ -401,7 +401,7 @@ static void rx_bit_to_su (wp_mtp1_link_t * p_lnk, u8 bit)
|
|||
/* a reasonable SU octet has been recovered; store it in a
|
||||
* signal unit buffer; TODO: this buffer should be allocated
|
||||
* mem, right? */
|
||||
p_lnk->rx_buf[p_lnk->rx_buf_len]=p_lnk->r_accum;
|
||||
p_lnk->rx_buf[p_lnk->rx_buf_len]=(u8)p_lnk->r_accum;
|
||||
p_lnk->rx_buf_len++;
|
||||
|
||||
/* reset the counters */
|
||||
|
@ -946,10 +946,10 @@ int wp_mtp1_tx_bh_handler(void *mtp1, u8 *data, int mtu)
|
|||
int k;
|
||||
u16 crc;
|
||||
|
||||
while ((p_lnk->tbs.cur_index - p_lnk->tbs.card_index) < mtu) {
|
||||
while ((int)(p_lnk->tbs.cur_index - p_lnk->tbs.card_index) < mtu) {
|
||||
skb=wan_skb_dequeue(&p_lnk->tbs.tx_q);
|
||||
if (skb) {
|
||||
crc = wan_skb_csum(skb);
|
||||
crc = (u16)wan_skb_csum(skb);
|
||||
daed_tx(mtp1_link, wan_skb_data(skb), wan_skb_len(skb), &crc);
|
||||
wan_skb_queue_tail(&p_lnk->tbs.tx_q_dealloc,skb);
|
||||
if (wan_skb_queue_len(&p_lnk->tbs.tx_q) < WP_MTP1_MAX_TX_Q) {
|
||||
|
@ -968,7 +968,7 @@ int wp_mtp1_tx_bh_handler(void *mtp1, u8 *data, int mtu)
|
|||
}
|
||||
}
|
||||
if (skb) {
|
||||
crc = wan_skb_csum(skb);
|
||||
crc = (u16)wan_skb_csum(skb);
|
||||
daed_tx(mtp1_link, wan_skb_data(skb), wan_skb_len(skb), &crc);
|
||||
if (wan_skb_queue_len(&p_lnk->tbs.tx_r_q)){
|
||||
wan_skb_queue_tail(&p_lnk->tbs.tx_q_dealloc,skb);
|
||||
|
|
|
@ -1159,7 +1159,11 @@ static void if_tx_timeout (netdevice_t *dev)
|
|||
card->devname,wan_netif_name(dev));
|
||||
WAN_NETIF_WAKE_QUEUE (dev);
|
||||
#if defined(__LINUX__)
|
||||
# if (LINUX_VERSION_CODE > KERNEL_VERSION(4,7,0))
|
||||
netif_trans_update(dev);
|
||||
# else
|
||||
dev->trans_start = SYSTEM_TICKS;
|
||||
# endif
|
||||
#endif
|
||||
if (chan->common.usedby == STACK){
|
||||
wanpipe_lip_kick(chan,0);
|
||||
|
@ -1375,7 +1379,11 @@ static int if_send(netdevice_t *dev, netskb_t *skb, struct sockaddr *dst,struct
|
|||
++card->wandev.stats.tx_packets;
|
||||
card->wandev.stats.tx_bytes += wan_skb_len(skb);
|
||||
#if defined(__LINUX__)
|
||||
# if (LINUX_VERSION_CODE > KERNEL_VERSION(4,7,0))
|
||||
netif_trans_update(dev);
|
||||
# else
|
||||
dev->trans_start = SYSTEM_TICKS;
|
||||
# endif
|
||||
#endif
|
||||
WAN_NETIF_START_QUEUE(dev);
|
||||
|
||||
|
|
|
@ -2614,7 +2614,7 @@ wp_MD5Final(md5byte digest[16], struct wp_MD5Context *ctx)
|
|||
|
||||
byteSwap(ctx->buf, 4);
|
||||
memcpy(digest, ctx->buf, 16);
|
||||
memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */
|
||||
memset(ctx, 0, sizeof(struct wp_MD5Context)); /* In case it's sensitive */
|
||||
}
|
||||
|
||||
#ifndef ASM_MD5
|
||||
|
|
|
@ -1017,7 +1017,7 @@ int wanpipe_tdm_api_kick(wanpipe_tdm_api_dev_t *tdm_api)
|
|||
rc=tdm_api->write_hdlc_check(tdm_api->chan, 0, tdm_api->buffer_multiplier);
|
||||
}
|
||||
if (rc == 0 ||
|
||||
wan_skb_queue_len(&tdm_api->wp_rx_list) >= tdm_api->buffer_multiplier ||
|
||||
wan_skb_queue_len(&tdm_api->wp_rx_list) >= (int)tdm_api->buffer_multiplier ||
|
||||
wan_skb_queue_len(&tdm_api->wp_event_list)) {
|
||||
wp_tdm_api_start(tdm_api);
|
||||
if (wan_test_bit(0,&tdm_api->used)) {
|
||||
|
@ -1374,6 +1374,8 @@ static int wp_tdmapi_read_msg(void *obj, netskb_t **skb_ptr, wp_api_hdr_t *hdr,
|
|||
hdr->wp_api_hdr_operation_status = SANG_STATUS_RX_DATA_AVAILABLE;
|
||||
hdr->wp_api_hdr_data_length = wan_skb_len(skb)-sizeof(wp_api_hdr_t);
|
||||
|
||||
hdr->wp_api_rx_hdr_errors = card->fe.fe_stats.te_pmon.sync_errors;
|
||||
|
||||
if (wan_skb_len(skb) >= sizeof(wp_api_hdr_t)) {
|
||||
/* Copy back the updated header info into the skb header
|
||||
section. */
|
||||
|
@ -1433,7 +1435,7 @@ static int wp_tdmapi_tx (wanpipe_tdm_api_dev_t *tdm_api, netskb_t *skb, wp_api_
|
|||
|
||||
len = wan_skb_len(skb) / tdm_api->buffer_multiplier;
|
||||
|
||||
for (i=0;i<tdm_api->buffer_multiplier;i++) {
|
||||
for (i=0;i<(int)tdm_api->buffer_multiplier;i++) {
|
||||
|
||||
nskb=wan_skb_kalloc(len+sizeof(wp_api_hdr_t));
|
||||
if (!nskb) {
|
||||
|
@ -1869,7 +1871,7 @@ static unsigned int wp_tdmapi_poll(void *obj)
|
|||
if (!wan_test_bit(0,&tdm_api->cfg.rx_disable)) {
|
||||
/* tdm_api->buffer_multiplir is by default 1 so we can use it to check
|
||||
for available buffers */
|
||||
if (wan_skb_queue_len(&tdm_api->wp_rx_list) >= tdm_api->buffer_multiplier) {
|
||||
if (wan_skb_queue_len(&tdm_api->wp_rx_list) >= (int)tdm_api->buffer_multiplier) {
|
||||
ret |= POLLIN | POLLRDNORM;
|
||||
}
|
||||
}
|
||||
|
@ -1895,7 +1897,7 @@ static int wanpipe_tdm_api_handle_event(wanpipe_tdm_api_dev_t *tdm_api, netskb_t
|
|||
|
||||
wan_get_timestamp(&sec, &usec);
|
||||
|
||||
p_tdmapi_event->time_stamp_sec = sec;
|
||||
p_tdmapi_event->time_stamp_sec = (u32)sec;
|
||||
p_tdmapi_event->time_stamp_usec = usec;
|
||||
|
||||
wan_skb_queue_tail(&tdm_api->wp_event_list,skb);
|
||||
|
@ -1969,7 +1971,7 @@ static int wanpipe_tdm_api_ioctl_handle_tdm_api_cmd(wanpipe_tdm_api_dev_t *tdm_a
|
|||
|
||||
|
||||
/* Set the span/channel so that user knows which channel its using */
|
||||
usr_tdm_api.chan=channel;
|
||||
usr_tdm_api.chan=(unsigned int)channel;
|
||||
|
||||
if (card) {
|
||||
/* must NOT do it for ctrl device! */
|
||||
|
@ -1985,6 +1987,8 @@ static int wanpipe_tdm_api_ioctl_handle_tdm_api_cmd(wanpipe_tdm_api_dev_t *tdm_a
|
|||
case WP_API_CMD_GET_STATS:
|
||||
case WP_API_CMD_GET_FULL_CFG:
|
||||
case WP_API_CMD_GET_FE_STATUS:
|
||||
case WP_API_CMD_GET_FE_STATS:
|
||||
case WP_API_CMD_RESET_FE_STATS:
|
||||
case WP_API_CMD_SET_FE_STATUS:
|
||||
case WP_API_CMD_READ_EVENT:
|
||||
case WP_API_CMD_GET_FE_ALARMS:
|
||||
|
@ -2302,6 +2306,27 @@ static int wanpipe_tdm_api_ioctl_handle_tdm_api_cmd(wanpipe_tdm_api_dev_t *tdm_a
|
|||
|
||||
break;
|
||||
|
||||
case WP_API_CMD_GET_FE_STATS:
|
||||
if (card && card->wandev.fe_iface.read_pmon){
|
||||
wan_smp_flag_t smp_flags1;
|
||||
card->hw_iface.hw_lock(card->hw,&smp_flags1);
|
||||
card->wandev.fe_iface.read_pmon(&card->fe, 0);
|
||||
card->hw_iface.hw_unlock(card->hw,&smp_flags1);
|
||||
memcpy(&usr_tdm_api.pmon_stats, &card->fe.fe_stats.te_pmon, sizeof(card->fe.fe_stats.te_pmon));
|
||||
}
|
||||
break;
|
||||
|
||||
case WP_API_CMD_RESET_FE_STATS:
|
||||
if (card && card->wandev.fe_iface.flush_pmon){
|
||||
wan_smp_flag_t smp_flags1;
|
||||
card->hw_iface.hw_lock(card->hw,&smp_flags1);
|
||||
card->wandev.fe_iface.flush_pmon(&card->fe);
|
||||
card->hw_iface.hw_unlock(card->hw,&smp_flags1);
|
||||
memcpy(&usr_tdm_api.pmon_stats, &card->fe.fe_stats.te_pmon, sizeof(card->fe.fe_stats.te_pmon));
|
||||
}
|
||||
memset(&card->fe.fe_stats.te_pmon, 0x00, sizeof(card->fe.fe_stats.te_pmon));
|
||||
break;
|
||||
|
||||
case WP_API_CMD_GET_STATS:
|
||||
|
||||
if (WPTDM_SPAN_OP_MODE(tdm_api) || tdm_api->hdlc_framing) {
|
||||
|
@ -2682,7 +2707,7 @@ static int wanpipe_tdm_api_ioctl_handle_tdm_api_cmd(wanpipe_tdm_api_dev_t *tdm_a
|
|||
if (tdm_api->rx_gain) {
|
||||
int i;
|
||||
for (i=0;i<256;i++) {
|
||||
tdm_api->rx_gain[i]=i;
|
||||
tdm_api->rx_gain[i]=(u8)i;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -2691,7 +2716,7 @@ static int wanpipe_tdm_api_ioctl_handle_tdm_api_cmd(wanpipe_tdm_api_dev_t *tdm_a
|
|||
if (tdm_api->tx_gain) {
|
||||
int i;
|
||||
for (i=0;i<256;i++) {
|
||||
tdm_api->tx_gain[i]=i;
|
||||
tdm_api->tx_gain[i]=(u8)i;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -3363,7 +3388,7 @@ static int wanpipe_tdm_api_channelized_rx (wanpipe_tdm_api_dev_t *tdm_api, u8 *r
|
|||
memcpy((u8*)data_ptr,rx_data,len);
|
||||
|
||||
skblen = wan_skb_len(tdm_api->rx_skb);
|
||||
if (skblen >= tdm_api->mtu_mru) {
|
||||
if (skblen >= (int)tdm_api->mtu_mru) {
|
||||
|
||||
wanpipe_tdm_timestamp_hdr(rx_hdr);
|
||||
|
||||
|
@ -3443,13 +3468,13 @@ static __inline int wp_tdmapi_check_fakepolarity(u8 *buf, int len, wanpipe_tdm_a
|
|||
lower_thres_val = -1 * fake_polarity_thres;
|
||||
|
||||
for (i=0;i<len;i++) {
|
||||
linear_sample = wanpipe_codec_convert_to_linear(buf[i],tdm_api->cfg.hw_tdm_coding);
|
||||
linear_sample = wanpipe_codec_convert_to_linear(buf[i],(u8)tdm_api->cfg.hw_tdm_coding);
|
||||
|
||||
if (linear_sample > upper_thres_val || linear_sample < lower_thres_val) {
|
||||
if (WAN_NET_RATELIMIT()) {
|
||||
DEBUG_EVENT("%s: Possible CID signal detected, faking polarity reverse event on module %d\n", card->devname, channo);
|
||||
}
|
||||
wp_tdmapi_report_fakepolarityreverse(card,channo);
|
||||
wp_tdmapi_report_fakepolarityreverse(card,(u8)channo);
|
||||
fxo->readcid = 1;
|
||||
fxo->cidtimer = fe->rm_param.intcount;
|
||||
return 1;
|
||||
|
@ -3718,7 +3743,7 @@ int wanpipe_tdm_api_span_rx (wanpipe_tdm_api_dev_t *tdm_api, netskb_t *skb)
|
|||
|
||||
/* Buffer multiplier is by default 1 so we can use it to check if there
|
||||
is something in the rx_list */
|
||||
if (wan_skb_queue_len(&tdm_api->wp_rx_list) >= tdm_api->buffer_multiplier) {
|
||||
if (wan_skb_queue_len(&tdm_api->wp_rx_list) >= (int)tdm_api->buffer_multiplier) {
|
||||
wp_wakeup_rx_tdmapi(tdm_api);
|
||||
}
|
||||
|
||||
|
|
|
@ -245,7 +245,7 @@ static int wp_tdev_ioctl(void *obj, int cmd, void *udata)
|
|||
/* udata is a pointer to wanpipe_tdm_api_cmd_t */
|
||||
memcpy(utcmd, udata, sizeof(wanpipe_timer_api_t));
|
||||
#else
|
||||
if (WAN_COPY_FROM_USER(&utcmd, /* davidr: looks like a wrong pointer */
|
||||
if (WAN_COPY_FROM_USER(utcmd, /* davidr: looks like a wrong pointer */
|
||||
udata,
|
||||
sizeof(wanpipe_timer_api_t))){
|
||||
return -EFAULT;
|
||||
|
@ -292,9 +292,9 @@ static int wp_tdev_ioctl(void *obj, int cmd, void *udata)
|
|||
/* udata is a pointer to wanpipe_tdm_api_cmd_t */
|
||||
memcpy(udata, utcmd, sizeof(wanpipe_timer_api_t));
|
||||
#else
|
||||
if (WAN_COPY_FROM_USER(&udata,
|
||||
&utcmd,
|
||||
sizeof(wanpipe_timer_api_t))){
|
||||
if (WAN_COPY_TO_USER(udata,
|
||||
utcmd,
|
||||
sizeof(wanpipe_timer_api_t))){
|
||||
return -EFAULT;
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -1011,8 +1011,8 @@ int wan_capture_trace_packet_buffer(sdla_t *card, wan_trace_t* trace_info, char
|
|||
trc_el.data_avail = 1;
|
||||
trc_el.time_stamp =
|
||||
(unsigned short)((((trc_el.sec * 1000000) + trc_el.usec) / 1000) % 0xFFFF);
|
||||
trc_el.real_length = len;
|
||||
trc_el.channel=channel;
|
||||
trc_el.real_length = (unsigned short)len;
|
||||
trc_el.channel=(unsigned char)channel;
|
||||
|
||||
buf=wan_skb_put(new_skb, sizeof(wan_trace_pkt_t));
|
||||
memcpy(buf,(caddr_t)&trc_el,sizeof(wan_trace_pkt_t));
|
||||
|
|
|
@ -265,7 +265,11 @@ static int wan_iface_init(netdevice_t* dev)
|
|||
dev->addr_len = 0;
|
||||
*(u8*)dev->dev_addr = 0;
|
||||
|
||||
#if defined(KERN_NETIF_TRANS_UPDATE) && KERN_NETIF_TRANS_UPDATE > 0
|
||||
netif_trans_update(dev);
|
||||
#else
|
||||
dev->trans_start = SYSTEM_TICKS;
|
||||
#endif
|
||||
|
||||
/* Initialize socket buffers */
|
||||
dev_init_buffers(dev);
|
||||
|
@ -300,7 +304,11 @@ static int wan_iface_eth_init(netdevice_t* dev)
|
|||
}
|
||||
dev->tx_queue_len = 100;
|
||||
|
||||
#if defined(KERN_NETIF_TRANS_UPDATE) && KERN_NETIF_TRANS_UPDATE > 0
|
||||
netif_trans_update(dev);
|
||||
#else
|
||||
dev->trans_start = SYSTEM_TICKS;
|
||||
#endif
|
||||
|
||||
/* Initialize socket buffers */
|
||||
dev_init_buffers(dev);
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
#include "wanpipe_cdev_iface.h"
|
||||
#include "sdladrv.h"
|
||||
|
||||
|
||||
/*=================================================
|
||||
* Type Defines
|
||||
*================================================*/
|
||||
|
@ -55,6 +54,8 @@ static int wanpipe_mgmnt_get_hardware_info(wanpipe_wandev_t *wdev, wan_device_t
|
|||
static int wanpipe_mgmnt_stop_port(wanpipe_wandev_t *wdev, wan_device_t *wandev, port_management_struct_t *usr_port_mgmnt);
|
||||
static int wanpipe_mgmnt_start_port(wanpipe_wandev_t *wdev, wan_device_t *wandev, port_management_struct_t *usr_port_mgmnt);
|
||||
static int wanpipe_mgmnt_get_driver_version(wanpipe_wandev_t *wdev, wan_device_t *wandev, port_management_struct_t *usr_port_mgmnt);
|
||||
static int wanpipe_mgmnt_start_port_if(wanpipe_wandev_t *wdev, wan_device_t *wandev, unsigned short if_no);
|
||||
static int wanpipe_mgmnt_stop_port_if(wanpipe_wandev_t *wdev, wan_device_t *wandev, char* if_name);
|
||||
|
||||
|
||||
/*=================================================
|
||||
|
@ -255,6 +256,16 @@ static int wanpipe_port_management(wanpipe_wandev_t *wdev, void *data)
|
|||
/* Not supported */
|
||||
break;
|
||||
|
||||
case START_PORT_IF_CONFIG:
|
||||
/* Start specific port/interface */
|
||||
err=wanpipe_mgmnt_start_port_if(wdev, wandev, (unsigned short)usr_port_mgmnt->data[0]);
|
||||
break;
|
||||
case STOP_PORT_IF:
|
||||
/* Stop specific port/interface */
|
||||
err=wanpipe_mgmnt_stop_port_if(wdev, wandev, usr_port_mgmnt->data);
|
||||
break;
|
||||
|
||||
|
||||
case GET_DRIVER_VERSION:
|
||||
/* Fill in "DRIVER_VERSION" structure. */
|
||||
err = wanpipe_mgmnt_get_driver_version(wdev, wandev, usr_port_mgmnt);
|
||||
|
@ -527,7 +538,62 @@ static int wanpipe_mgmnt_start_port(wanpipe_wandev_t *wdev, wan_device_t *wandev
|
|||
return err;
|
||||
}
|
||||
|
||||
static int wanpipe_mgmnt_stop_port_if(wanpipe_wandev_t *wdev, wan_device_t *wandev, char * if_name)
|
||||
{
|
||||
return wan_device_del_if (wandev, if_name, 0);
|
||||
}
|
||||
|
||||
|
||||
static int wanpipe_mgmnt_start_port_if(wanpipe_wandev_t *wdev, wan_device_t *wandev, unsigned short if_no)
|
||||
{
|
||||
int err=-EINVAL;
|
||||
int i;
|
||||
wanpipe_port_cfg_t *port_cfg=wandev->port_cfg;
|
||||
|
||||
if (!wandev->port_cfg) {
|
||||
/* No configuration present */
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
#if 0
|
||||
err=wan_device_setup(wandev, &port_cfg->wandev_conf, 0);
|
||||
if (err) {
|
||||
DEBUG_EVENT("%s: Error: Failed to configure device\n",
|
||||
__FUNCTION__);
|
||||
return err;
|
||||
}
|
||||
#endif
|
||||
|
||||
for (i = 0; i < port_cfg->num_of_ifs; i++) {
|
||||
if (i==if_no-1) {
|
||||
err=wan_device_new_if (wandev, &port_cfg->if_cfg[i], 0);
|
||||
if (err) {
|
||||
DEBUG_EVENT("%s: Error: Failed to configure interface %i\n",
|
||||
__FUNCTION__,i);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
err=-ENODEV;
|
||||
for (i = 0; i < port_cfg->num_of_ifs; i++) {
|
||||
if (i==if_no-1) {
|
||||
netdevice_t *dev = wan_dev_get_by_name(port_cfg->if_cfg[i].name);
|
||||
if (dev) {
|
||||
dev_put(dev);
|
||||
rtnl_lock();
|
||||
err=dev_change_flags(dev,(dev->flags|IFF_UP));
|
||||
rtnl_unlock();
|
||||
} else {
|
||||
err=-ENODEV;
|
||||
}
|
||||
|
||||
if (err) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -156,7 +156,6 @@ int wan_device_setup(wan_device_t *wandev, wandev_conf_t *u_conf, int user);
|
|||
static int wan_device_stat(wan_device_t *wandev, wandev_stat_t *u_stat);
|
||||
int wan_device_shutdown(wan_device_t *wandev, wandev_conf_t *u_conf);
|
||||
int wan_device_new_if(wan_device_t *wandev, wanif_conf_t *u_conf, int user);
|
||||
static int wan_device_del_if(wan_device_t *wandev, char *u_name);
|
||||
static int wan_device_debugging(wan_device_t *wandev);
|
||||
|
||||
static int wan_device_new_if_lip(wan_device_t *wandev, wanif_conf_t *u_conf);
|
||||
|
@ -585,7 +584,7 @@ WAN_IOCTL_RET_TYPE WANDEF_IOCTL_FUNC(wanrouter_ioctl, struct file *file, unsigne
|
|||
|
||||
case ROUTER_IFDEL:
|
||||
ADMIN_CHECK();
|
||||
err = wan_device_del_if(wandev, (void*)arg);
|
||||
err = wan_device_del_if(wandev, (void*)arg, 1);
|
||||
break;
|
||||
|
||||
#ifdef CONFIG_PRODUCT_WANPIPE_ANNEXG
|
||||
|
@ -1002,7 +1001,7 @@ wan_device_new_if_exit:
|
|||
* o copy configuration data to kernel address space
|
||||
*/
|
||||
|
||||
static int wan_device_del_if (wan_device_t *wandev, char *u_name)
|
||||
int wan_device_del_if (wan_device_t *wandev, char *u_name, int user)
|
||||
{
|
||||
struct wan_dev_le *devle;
|
||||
netdevice_t *dev=NULL;
|
||||
|
@ -1015,15 +1014,19 @@ static int wan_device_del_if (wan_device_t *wandev, char *u_name)
|
|||
|
||||
memset(name, 0, sizeof(name));
|
||||
|
||||
if(copy_from_user(name, u_name, WAN_IFNAME_SZ))
|
||||
return -EFAULT;
|
||||
if (user) {
|
||||
if(copy_from_user(name, u_name, WAN_IFNAME_SZ))
|
||||
return -EFAULT;
|
||||
} else {
|
||||
memcpy(name, u_name, WAN_IFNAME_SZ);
|
||||
}
|
||||
|
||||
WAN_LIST_FOREACH(devle, &wandev->dev_head, dev_link){
|
||||
dev = WAN_DEVLE2DEV(devle);
|
||||
if (dev && !strcmp(name, wan_netif_name(dev))){
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (devle == NULL || dev == NULL){
|
||||
if ((dev = wan_dev_get_by_name(name)) == NULL){
|
||||
|
|
|
@ -1756,43 +1756,43 @@ int wanec_ISR(wan_ec_t *ec, int verbose)
|
|||
}
|
||||
if (ec->f_InterruptFlag.fFatalReadTimeout == TRUE){
|
||||
wan_ec_isr_error_print(
|
||||
"%s: A read to the external memory has failed!\n",
|
||||
ec->name);
|
||||
"%s: A read to the external memory has failed!\n %s",
|
||||
ec->name, " ");
|
||||
}
|
||||
if (ec->f_InterruptFlag.fErrorRefreshTooLate == TRUE){
|
||||
wan_ec_isr_error_print(
|
||||
"%s: Error Refresh Too Late!\n",
|
||||
ec->name);
|
||||
"%s: Error Refresh Too Late!\n %s",
|
||||
ec->name, " ");
|
||||
}
|
||||
if (ec->f_InterruptFlag.fErrorPllJitter == TRUE){
|
||||
wan_ec_isr_error_print(
|
||||
"%s: Error Pll Jitter\n",
|
||||
ec->name);
|
||||
"%s: Error Pll Jitter\n %s",
|
||||
ec->name, " ");
|
||||
}
|
||||
if (ec->f_InterruptFlag.fErrorH100OutOfSync == TRUE && !ec->ignore_H100){
|
||||
wan_ec_isr_error_print(
|
||||
"%s: The H100 slave has lost its framing on the bus!\n",
|
||||
ec->name);
|
||||
"%s: The H100 slave has lost its framing on the bus!\n %s",
|
||||
ec->name, " ");
|
||||
}
|
||||
if (ec->f_InterruptFlag.fErrorH100ClkA == TRUE){
|
||||
wan_ec_isr_error_print(
|
||||
"%s: The CT_C8_A clock behavior does not conform to the H.100 spec!\n",
|
||||
ec->name);
|
||||
"%s: The CT_C8_A clock behavior does not conform to the H.100 spec!\n %s",
|
||||
ec->name, " ");
|
||||
}
|
||||
if (ec->f_InterruptFlag.fErrorH100FrameA == TRUE){
|
||||
wan_ec_isr_error_print(
|
||||
"%s: The CT_FRAME_A clock behavior does not comform to the H.100 spec!\n",
|
||||
ec->name);
|
||||
"%s: The CT_FRAME_A clock behavior does not comform to the H.100 spec!\n %s",
|
||||
ec->name, " ");
|
||||
}
|
||||
if (ec->f_InterruptFlag.fErrorH100ClkB == TRUE){
|
||||
wan_ec_isr_error_print(
|
||||
"%s: The CT_C8_B clock is not running a 16.384 MHz!\n",
|
||||
ec->name);
|
||||
"%s: The CT_C8_B clock is not running a 16.384 MHz!\n %s",
|
||||
ec->name, " ");
|
||||
}
|
||||
if (ec->f_InterruptFlag.fErrorOverflowToneEvents == TRUE){
|
||||
wan_ec_isr_error_print(
|
||||
"%s: Error: Tone Event buffer has overflowed\n",
|
||||
ec->name);
|
||||
"%s: Error: Tone Event buffer has overflowed\n %s",
|
||||
ec->name, " ");
|
||||
}
|
||||
if (ec->f_InterruptFlag.fToneEventsPending == TRUE){
|
||||
PRINT2(verbose, "%s: Tone Event pending....\n",
|
||||
|
|
|
@ -46,8 +46,10 @@
|
|||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef WP_CONFIG_DEVFS_FS
|
||||
#define WP_ECDEV_MAJOR 242
|
||||
#define WP_ECDEV_MINOR_OFFSET 0
|
||||
#endif
|
||||
#define WANEC_DEV_MAX_MINORS 256
|
||||
|
||||
#ifdef WP_ECDEV_UDEV
|
||||
|
||||
|
@ -65,6 +67,13 @@
|
|||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,13)
|
||||
static struct class *wanec_dev_class = NULL;
|
||||
static struct cdev wanec_cdev = {
|
||||
#ifndef LINUX_FEAT_2624
|
||||
.kobj = {.name = "wp_ec", },
|
||||
#endif
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
static dev_t wanec_dev = 0;
|
||||
#else
|
||||
static struct class_simple *wanec_dev_class = NULL;
|
||||
#define class_create class_simple_create
|
||||
|
@ -140,15 +149,22 @@ int wanec_create_dev(void)
|
|||
return err;
|
||||
}
|
||||
#else
|
||||
if ((err = register_chrdev(WP_ECDEV_MAJOR, "wp_ec", &wanec_dev_fops))) {
|
||||
DEBUG_EVENT("Unable to register tor device on %d\n", WP_ECDEV_MAJOR);
|
||||
if ((err=alloc_chrdev_region(&wanec_dev, 0, WANEC_DEV_MAX_MINORS, "wp_ec"))) {
|
||||
DEBUG_EVENT("Unable to alloc chrdev region for wanpipe ec device with %d minors\n", WANEC_DEV_MAX_MINORS);
|
||||
return err;
|
||||
}
|
||||
cdev_init(&wanec_cdev, &wanec_dev_fops);
|
||||
if (cdev_add(&wanec_cdev, wanec_dev, WANEC_DEV_MAX_MINORS)) {
|
||||
kobject_put(&wanec_cdev.kobj);
|
||||
unregister_chrdev_region(wanec_dev, WANEC_DEV_MAX_MINORS);
|
||||
DEBUG_ERROR("%s(): Error wanec cdev_add!\n",__FUNCTION__);
|
||||
return -EINVAL;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef WP_ECDEV_UDEV
|
||||
WP_CLASS_DEV_CREATE( wanec_dev_class,
|
||||
MKDEV(WP_ECDEV_MAJOR, 0),
|
||||
MKDEV(MAJOR(wanec_dev), 0),
|
||||
NULL,NULL,
|
||||
WANEC_DEV_NAME);
|
||||
#endif
|
||||
|
@ -170,7 +186,7 @@ int wanec_remove_dev(void)
|
|||
|
||||
#ifdef WP_ECDEV_UDEV
|
||||
class_device_destroy( wanec_dev_class,
|
||||
MKDEV(WP_ECDEV_MAJOR, 0));
|
||||
MKDEV(MAJOR(wanec_dev), 0));
|
||||
#endif
|
||||
|
||||
#ifdef WP_CONFIG_DEVFS_FS
|
||||
|
@ -184,7 +200,8 @@ int wanec_remove_dev(void)
|
|||
#ifdef WP_CONFIG_DEVFS_FS
|
||||
devfs_unregister_chrdev(WP_ECDEV_MAJOR, "wp_ec");
|
||||
#else
|
||||
unregister_chrdev(WP_ECDEV_MAJOR, "wp_ec");
|
||||
cdev_del(&wanec_cdev);
|
||||
unregister_chrdev_region(wanec_dev, WANEC_DEV_MAX_MINORS);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%define WANPIPE_VER wanpipe-modules
|
||||
%define name %{WANPIPE_VER}
|
||||
%define version 7.0.20
|
||||
%define version 7.0.21
|
||||
%define release 0
|
||||
%define serial 1
|
||||
%define MODULES_DIR /lib/modules
|
||||
|
@ -58,6 +58,15 @@ fi
|
|||
|
||||
|
||||
%changelog
|
||||
* Tue Oct 4 2017 7.0.21
|
||||
==================================================================
|
||||
- Fix BRI intermittent frame loss or delay
|
||||
- Support for Kernel version 4.7+
|
||||
- BRI LINK activation logic update when hardhdlc is enable
|
||||
- Added verification for temporary storage
|
||||
- Setup and Makefile to support kernel version 4.7+
|
||||
- Fix tx timeout print undir tdm api data mode.
|
||||
|
||||
|
||||
* Mon May 19 2016 Nenad Corbic <ncorbic@sangoma.com> - 7.0.20
|
||||
==================================================================
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
%define WANPIPE_VER wanpipe-util
|
||||
%define name %{WANPIPE_VER}
|
||||
%define version 7.0.20
|
||||
%define version 7.0.21
|
||||
%define release 0
|
||||
%define serial 1
|
||||
%define UTILS_DIR /usr/sbin
|
||||
|
@ -228,6 +228,15 @@ chmod 755 /usr/local/sbin/setup-sangoma
|
|||
|
||||
|
||||
%changelog
|
||||
* Tue Oct 4 2017 7.0.21
|
||||
==================================================================
|
||||
- Fix BRI intermittent frame loss or delay
|
||||
- Support for Kernel version 4.7+
|
||||
- BRI LINK activation logic update when hardhdlc is enable
|
||||
- Added verification for temporary storage
|
||||
- Setup and Makefile to support kernel version 4.7+
|
||||
- Fix tx timeout print undir tdm api data mode.
|
||||
|
||||
|
||||
* Mon May 19 2016 Nenad Corbic <ncorbic@sangoma.com> - 7.0.20
|
||||
==================================================================
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
%define KERNEL_VERSION %{?kern_ver}
|
||||
%define WANPIPE_VER wanpipe
|
||||
%define name %{WANPIPE_VER}
|
||||
%define version 7.0.20
|
||||
%define version 7.0.21
|
||||
%define release 0
|
||||
%define serial 1
|
||||
%define UTILS_DIR /usr/sbin
|
||||
|
@ -245,6 +245,15 @@ chmod 755 /usr/local/sbin/setup-sangoma
|
|||
|
||||
|
||||
%changelog
|
||||
* Tue Oct 4 2017 7.0.21
|
||||
==================================================================
|
||||
- Fix BRI intermittent frame loss or delay
|
||||
- Support for Kernel version 4.7+
|
||||
- BRI LINK activation logic update when hardhdlc is enable
|
||||
- Added verification for temporary storage
|
||||
- Setup and Makefile to support kernel version 4.7+
|
||||
- Fix tx timeout print undir tdm api data mode.
|
||||
|
||||
|
||||
* Mon May 19 2016 Nenad Corbic <ncorbic@sangoma.com> - 7.0.20
|
||||
==================================================================
|
||||
|
|
|
@ -2231,7 +2231,7 @@ init_global_params()
|
|||
{
|
||||
|
||||
if [ $OSYSTEM = "Linux" ]; then
|
||||
ROUTER_VERSION=7.0.20
|
||||
ROUTER_VERSION=7.0.21
|
||||
IFCONFIG_LIST=ifconfig
|
||||
MODULE_STAT=lsmod
|
||||
WAN_DRIVERS="wanpipe"
|
||||
|
|
|
@ -454,6 +454,7 @@ static key_word_t xilinx_conftab[] = /* Xilinx specific configuration */
|
|||
{ "RX_FIFO_TRIGGER", smemof(wan_xilinx_conf_t, rx_fifo_trigger), DTYPE_USHORT },
|
||||
{ "TX_FIFO_TRIGGER", smemof(wan_xilinx_conf_t, tx_fifo_trigger), DTYPE_USHORT },
|
||||
{ "GLOBAL_POLL_IRQ", smemof(wan_xilinx_conf_t, global_poll_irq), DTYPE_UCHAR },
|
||||
{ "FE_SYNC_DISABLE", smemof(wan_xilinx_conf_t, fe_sync_disable), DTYPE_UCHAR},
|
||||
{ NULL, 0, 0 }
|
||||
};
|
||||
|
||||
|
|
|
@ -1034,7 +1034,15 @@ static void line_trace(int trace_mode)
|
|||
to.tv_sec = 0;
|
||||
to.tv_usec = 0;
|
||||
for(;;) {
|
||||
|
||||
|
||||
/* sleep for some time in order to control CPU utilization
|
||||
* by wanpipemon trace command when no_exit is enable */
|
||||
if (no_exit) {
|
||||
if (to.tv_usec) {
|
||||
wp_usleep(to.tv_usec);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef __WINDOWS__
|
||||
if (!no_exit) {
|
||||
if(to.tv_usec){
|
||||
|
@ -1977,7 +1985,9 @@ static int write_ft1_te1_56k_config (void)
|
|||
|
||||
case WAN_MEDIA_T1:
|
||||
case WAN_MEDIA_E1:
|
||||
#if defined(__LINUX__)
|
||||
err=write_te1_56k_config();
|
||||
#endif
|
||||
break;
|
||||
|
||||
case WAN_MEDIA_DS3:
|
||||
|
|
|
@ -1174,7 +1174,7 @@ void wp_trace_output(wp_trace_output_iface_t *trace_iface)
|
|||
}
|
||||
|
||||
print_pcap_file_header(trace_iface);
|
||||
printf("Staring PCAP File Trace in: %s\n\n",
|
||||
printf("Starting PCAP File Trace in: %s\n\n",
|
||||
pcap_output_file_name);
|
||||
trace_iface->init=1;
|
||||
}
|
||||
|
|
|
@ -1831,7 +1831,7 @@ try_trace_again:
|
|||
}
|
||||
|
||||
print_pcap_file_header(trace_iface);
|
||||
printf("Staring PCAP File Trace in: %s\n\n",
|
||||
printf("Starting PCAP File Trace in: %s\n\n",
|
||||
pcap_output_file_name);
|
||||
trace_iface->init=1;
|
||||
}
|
||||
|
|
11
wanpipe.spec
11
wanpipe.spec
|
@ -25,7 +25,7 @@
|
|||
#
|
||||
|
||||
%define NAME wanpipe
|
||||
%define VERSION 7.0.20
|
||||
%define VERSION 7.0.21
|
||||
%define RELEASE 0
|
||||
%define KVERSION %{?kernel}
|
||||
%define KSRC %{?ksrc}
|
||||
|
@ -259,6 +259,15 @@ fi
|
|||
################################################################################
|
||||
|
||||
%changelog
|
||||
* Tue Oct 4 2017 7.0.21
|
||||
==================================================================
|
||||
- Fix BRI intermittent frame loss or delay
|
||||
- Support for Kernel version 4.7+
|
||||
- BRI LINK activation logic update when hardhdlc is enable
|
||||
- Added verification for temporary storage
|
||||
- Setup and Makefile to support kernel version 4.7+
|
||||
- Fix tx timeout print undir tdm api data mode.
|
||||
|
||||
|
||||
* Mon May 19 2016 Nenad Corbic <ncorbic@sangoma.com> - 7.0.20
|
||||
==================================================================
|
||||
|
|
Loading…
Reference in New Issue