diff options
Diffstat (limited to 'xpp/xpd.h')
-rw-r--r-- | xpp/xpd.h | 178 |
1 files changed, 94 insertions, 84 deletions
@@ -3,7 +3,7 @@ /* * Written by Oron Peled <oron@actcom.co.il> - * Copyright (C) 2004-2005, Xorcom + * Copyright (C) 2004-2006, Xorcom * * All rights reserved. * @@ -28,6 +28,7 @@ #ifdef __KERNEL__ #include <linux/kernel.h> +#include <linux/device.h> #include <asm/atomic.h> #include <asm/semaphore.h> #include <linux/moduleparam.h> @@ -61,20 +62,6 @@ #endif // __KERNEL__ -#define MAX_SPANNAME 20 -#define MAX_SPANDESC 40 -#define MAX_CHANNAME 20 - -#define XPD_NAMELEN 10 /* must be <= from maximal workqueue name */ -#define XPD_DESCLEN 20 -#define XBUS_NAMELEN 20 /* must be <= from maximal workqueue name */ -#define XBUS_DESCLEN 40 - -/* Hardware does not check bank_num yet. So only 4 cards can be used */ -#define MAX_XPDS 4 // 1 FXS + 2 E1/T1 + 1 (Quad * E1/T1) - -#define VALID_XPD_NUM(x) ((x) < MAX_XPDS && (x) >= 0) - typedef struct xbus_ops xbus_ops_t; typedef enum xbus_type { @@ -100,15 +87,17 @@ struct xbus_ops { void (*packet_free)(xbus_t *xbus, xpacket_t *p); }; +/* + * XBUS statistics counters + */ enum { XBUS_N_DESC_REQ, - XBUS_N_DEV_DESC, + XBUS_N_DEV_DESC_FULL, + XBUS_N_DEV_DESC_EMPTY, XBUS_N_PCM_WRITE, XBUS_N_PCM_READ, XBUS_N_TX_BYTES, XBUS_N_RX_BYTES, - XBUS_N_SOFTSIM_PACKETS, - XBUS_N_SIM_PACKETS, }; #define XBUS_COUNTER(xbus, counter) ((xbus)->counters[XBUS_N_ ## counter]) @@ -120,68 +109,76 @@ static struct xbus_counters { char *name; } xbus_counters[] = { C_(DESC_REQ), - C_(DEV_DESC), + C_(DEV_DESC_FULL), + C_(DEV_DESC_EMPTY), C_(PCM_WRITE), C_(PCM_READ), C_(TX_BYTES), C_(RX_BYTES), - C_(SOFTSIM_PACKETS), - C_(SIM_PACKETS), }; #undef C_ #define XBUS_COUNTER_MAX ARRAY_SIZE(xbus_counters) -struct xpd_sim { - bool simulated; - bool softloop_xpd; - int loopto; - xpd_type_t xpd_type; - xpp_line_t hookstate; +#define CARD_DESC_MAGIC 0xca9dde5c + +struct card_desc_struct { + struct list_head card_list; + u32 magic; + xbus_t *xbus; + byte rev; /* Revision number */ + byte type; /* LSB: 1 - to_phone, 0 - to_line */ + xpd_addr_t xpd_addr; }; +/* + * An xbus is a transport layer for Xorcom Protocol commands + */ struct xbus { - char busname[XBUS_NAMELEN]; /* only xbus_new set this */ - char busdesc[XBUS_DESCLEN]; /* lowlevel drivers set this */ - int num; - xbus_ops_t *ops; - struct xpd *xpds[MAX_XPDS]; + char busname[XBUS_NAMELEN]; /* only xbus_new set this */ + char busdesc[XBUS_DESCLEN]; /* lowlevel drivers set this */ + int num; + xbus_ops_t *ops; + struct xpd *xpds[MAX_XPDS]; + int max_packet_size; - /* Simulator data */ - xbus_type_t bus_type; -#if SOFT_SIMULATOR - struct xpd_sim sim[MAX_XPDS]; - struct workqueue_struct *sim_workqueue; - struct work_struct sim_work; // workqueue job for running simulator - packet_queue_t sim_packet_queue; -#endif + /* Device-Model */ + struct device the_bus; - spinlock_t lock; - - bool hardware_exists; /* Hardware is functional */ - int open_counter; /* Number of open channels */ - atomic_t packet_counter; /* Allocated packets */ - wait_queue_head_t packet_cache_empty; + /* Simulator data */ + xbus_type_t bus_type; - struct timer_list poll_timer; - struct rw_semaphore in_use; - int num_xpds; - void *priv; /* Pointer to transport level data structures */ + spinlock_t lock; -#ifdef XPP_PACKET_LOG - struct cyclic_buff *packet_log; -#endif + bool hardware_exists; /* Hardware is functional */ + int open_counter; /* Number of open channels */ + atomic_t packet_counter; /* Allocated packets */ + wait_queue_head_t packet_cache_empty; + + struct timer_list poll_timer; + /* + * Bus scanning + */ + atomic_t count_poll_answers; + struct list_head poll_results; + wait_queue_head_t wait_for_polls; + struct work_struct xpds_init_work; + struct completion xpds_initialized; + + struct rw_semaphore in_use; + int num_xpds; + void *priv; /* Pointer to transport level data structures */ #ifdef CONFIG_PROC_FS struct proc_dir_entry *proc_xbus_dir; struct proc_dir_entry *proc_xbus_summary; + struct proc_dir_entry *proc_xbus_waitfor_xpds; #endif /* statistics */ int counters[XBUS_COUNTER_MAX]; - }; #endif @@ -190,15 +187,11 @@ typedef enum xpd_direction { TO_PSTN = 1, } xpd_direction_t; -#define LINE_BITS (sizeof(xpp_line_t)*8) - - #ifdef __KERNEL__ -#define BIT_SET(x,i) ((x) |= (1 << (i))) -#define BIT_CLR(x,i) ((x) &= ~(1 << (i))) -#define IS_SET(x,i) (((x) & (1 << (i))) != 0) -#define BIT(i) (1 << (i)) +/* + * XPD statistics counters + */ enum { XPD_N_PCM_READ, XPD_N_PCM_WRITE, @@ -222,60 +215,74 @@ static struct xpd_counters { #define XPD_COUNTER_MAX (sizeof(xpd_counters)/sizeof(xpd_counters[0])) -enum leds { - LED_GREEN, - LED_RED, - LED_BLUE, -}; +#define LED_BLINK_PERIOD (HZ/8) -#define NUM_LEDS 3 +#define LED_ON 1 +#define LED_OFF 0 +#define LED_BLINK (-LED_BLINK_PERIOD) +/* Values of SLIC register 0x40 */ +enum fxs_state { + FXS_LINE_DISABLED = 0x00, + FXS_LINE_ENABLED = 0x01, + FXS_LINE_CID = 0x02, + FXS_LINE_TIPOPEN = 0x03, /* For GroundStart signalling */ + FXS_LINE_RING = 0x04, + FXS_LINE_REV_ACTIVE = 0x05 +}; + +/* + * An XPD is a single Xorcom Protocol Device + */ struct xpd { char xpdname[XPD_NAMELEN]; struct zt_span span; struct zt_chan *chans; int channels; xpd_type_t type; + byte revision; /* Card revision */ xpd_direction_t direction; /* TO_PHONE, TO_PSTN */ - xpp_line_t enabled_chans; /* hardware activation: 0 - off, 1 - on */ - xpp_line_t hookstate; /* 0 - ONHOOK, 1 - OFHOOK */ - xpp_line_t ledstate[NUM_LEDS]; /* 0 - OFF, 1 - ON */ + xpp_line_t no_pcm; /* Temporary: disable PCM (for USB-1) */ + xpp_line_t hookstate; /* Actual chip state: 0 - ONHOOK, 1 - OFHOOK */ + xpp_line_t cid_on; xpp_line_t digital_outputs; /* 0 - no, 1 - yes */ xpp_line_t digital_inputs; /* 0 - no, 1 - yes */ - int ringing[CHANNELS_PERXPD]; - bool ringer_on[CHANNELS_PERXPD]; /* For ring toggling */ - bool led_on[CHANNELS_PERXPD]; /* For led toggling */ - int lasttxhook[CHANNELS_PERXPD]; + int ringing[CHANNELS_PERXPD]; + bool ringer_on[CHANNELS_PERXPD]; /* For ring toggling */ + + wait_queue_head_t txstateq[CHANNELS_PERXPD]; /* waiting on the tx state to change */ + int delay_until_dialtone[CHANNELS_PERXPD]; - struct work_struct xpd_post_init; - xbus_t *xbus; + enum fxs_state lasttxhook[CHANNELS_PERXPD]; + int idletxhookstate[CHANNELS_PERXPD]; /* IDLE changing hook state */ + int ohttimer[CHANNELS_PERXPD]; + + xbus_t *xbus; /* The XBUS we are connected to */ spinlock_t lock; - atomic_t open_counter; /* Number of open channels */ + atomic_t open_counter; /* Number of open channels */ int flags; - unsigned int board_flags; -#define XPD_BOARD_LOOPBACK 1 - #ifdef CONFIG_PROC_FS struct proc_dir_entry *proc_xpd_dir; struct proc_dir_entry *proc_xpd_summary; struct proc_dir_entry *proc_xpd_ztregister; #endif - // Bit numbers of board_flags int counters[XPD_COUNTER_MAX]; - const xops_t *xops; /* Card level operations */ - void *priv; /* Card level private data */ - atomic_t card_present; + const xproto_table_t *xproto; /* Card level protocol table */ + const xops_t *xops; /* Card level operations */ + void *priv; /* Card level private data */ + bool card_present; unsigned int recv_errors; unsigned int seq_errors; unsigned long last_response; /* in jiffies */ unsigned id; + xpd_addr_t addr; struct list_head xpd_list; unsigned int timer_count; volatile u_char *writechunk; /* Double-word aligned write memory */ @@ -285,6 +292,9 @@ struct xpd { u_char ec_chunk2[CHANNELS_PERXPD][ZT_CHUNKSIZE]; }; +#define for_each_line(xpd,i) \ + for((i) = 0; (i) < (xpd)->channels; (i)++) + #endif #endif /* XPD_H */ |