summaryrefslogtreecommitdiff
path: root/xpp/xpd.h
diff options
context:
space:
mode:
Diffstat (limited to 'xpp/xpd.h')
-rw-r--r--xpp/xpd.h178
1 files changed, 94 insertions, 84 deletions
diff --git a/xpp/xpd.h b/xpp/xpd.h
index 1576274..4de2510 100644
--- a/xpp/xpd.h
+++ b/xpp/xpd.h
@@ -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 */