wanpipe-7.0.21.tgz

This commit is contained in:
Harald Welte 2021-12-29 19:06:55 +01:00
parent a0440cbb4a
commit 0d59b592a4
72 changed files with 1111 additions and 460 deletions

View File

@ -1,2 +1,2 @@
wanpipe_linux: git ver 152b9f5
wanpipe_common: git ver 8b632be
wanpipe_linux: git ver 45abca5
wanpipe_common: git ver 410a541

View File

@ -1 +1 @@
wanpipe-7.0.20
wanpipe-7.0.21

View File

@ -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

View File

@ -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
View File

@ -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

View File

@ -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

View File

@ -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:

View File

@ -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)

View File

@ -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.

View File

@ -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;

View File

@ -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;

View File

@ -1,5 +1,5 @@
Package: wanpipe
Version: 7.0.20-0
Version: 7.0.21-0
Section: networking
Priority: optional
Architecture: all

View File

@ -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;

View File

@ -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;

View File

@ -130,7 +130,7 @@ static int __inline aft_timing_stop_calculate_elapsed(aft_driver_timing_t *drv_t
struct timeval current_tv;
do_gettimeofday(&current_tv);
elapsed=aft_calc_elapsed(&drv_timing->timing_tv,&current_tv);
elapsed=(unsigned long)aft_calc_elapsed(&drv_timing->timing_tv,&current_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++;
}

View File

@ -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);

View File

@ -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 */

View File

@ -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 */

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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;

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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,&reg);
wan_set_bit(red_bit,(volatile long *)&reg);
}else{
wan_clear_bit(red_bit,&reg);
wan_clear_bit(red_bit,(volatile long *)&reg);
}
break;
case WAN_AFT_GREEN:
if (on){
wan_set_bit(green_bit,&reg);
wan_set_bit(green_bit,(volatile long *)&reg);
}else{
wan_clear_bit(green_bit,&reg);
wan_clear_bit(green_bit,(volatile long *)&reg);
}
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;
}

View File

@ -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;

View File

@ -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);

View File

@ -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) {

View File

@ -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:

View File

@ -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));

View File

@ -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
}
}

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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
}
}

View File

@ -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

View File

@ -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), &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;

View File

@ -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
}
}

View File

@ -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, &reg);
@ -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;
}

View File

@ -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;
}

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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

View File

@ -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);
}

View File

@ -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

View File

@ -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));

View File

@ -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);

View File

@ -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;
}

View File

@ -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){

View File

@ -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",

View File

@ -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;
}

View File

@ -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
==================================================================

View File

@ -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
==================================================================

View File

@ -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
==================================================================

View File

@ -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"

View File

@ -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 }
};

View File

@ -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:

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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
==================================================================