summaryrefslogtreecommitdiff
path: root/xpp/xproto.h
diff options
context:
space:
mode:
Diffstat (limited to 'xpp/xproto.h')
-rw-r--r--xpp/xproto.h54
1 files changed, 28 insertions, 26 deletions
diff --git a/xpp/xproto.h b/xpp/xproto.h
index 377c06e..f567119 100644
--- a/xpp/xproto.h
+++ b/xpp/xproto.h
@@ -28,7 +28,6 @@
#include <linux/list.h>
#include <linux/proc_fs.h>
#include <zaptel.h>
-#endif
#define PROTO_TABLE(n) n ## _protocol_table
@@ -61,9 +60,9 @@ typedef struct xpd_addr {
bool valid_xpd_addr(const xpd_addr_t *addr);
int xpd_addr2num(const xpd_addr_t *addr);
void xpd_set_addr(xpd_addr_t *addr, int xpd_num);
+xpd_t *xpd_by_addr(const xbus_t *xbus, int unit, int subunit);
#define XPD_NUM(x) xpd_addr2num(&x)
-#define MAX_XPACKET_DATALEN 100
#define XPROTO_NAME(card,op) card ## _ ## op
#define XPROTO_HANDLER(card,op) XPROTO_NAME(card,op ## _handler)
@@ -90,24 +89,21 @@ void xpd_set_addr(xpd_addr_t *addr, int xpd_num);
#define RPACKET_TYPE(card,op) struct RPACKET_NAME(card, op)
#define DEF_RPACKET_DATA(card,op, ...) \
- struct RPACKET_NAME(card,op) { \
+ RPACKET_TYPE(card,op) { \
+ uint16_t datalen;\
byte opcode; \
xpd_addr_t addr; \
__VA_ARGS__ \
} PACKED
-
+#define RPACKET_HEADERSIZE (sizeof(uint16_t) + sizeof(xpd_addr_t) + 1)
#define RPACKET_CAST(p,card,op) ((RPACKET_TYPE(card,op) *)p)
#define RPACKET_FIELD(p,card,op,field) (RPACKET_CAST(p,card,op)->field)
#define RPACKET_SIZE(card,op) sizeof(RPACKET_TYPE(card,op))
-#define RPACKET_DATALEN(card,op) (RPACKET_SIZE(card,op) - sizeof(xpd_addr_t) - 1)
-
-#define PACKET_LEN(p) \
- ((p)->datalen + sizeof(xpd_addr_t) + 1)
#define XENTRY(prototab,module,op) \
[ XPROTO_NAME(module,op) ] = { \
.handler = XPROTO_HANDLER(module,op), \
- .datalen = RPACKET_DATALEN(module,op), \
+ .datalen = RPACKET_SIZE(module,op), \
.name = #op, \
.table = &PROTO_TABLE(prototab) \
}
@@ -116,18 +112,25 @@ void xpd_set_addr(xpd_addr_t *addr, int xpd_num);
#define XPACKET_INIT(p, card, op) \
do { \
- p->content.opcode = XPROTO_NAME(card,op); \
- p->datalen = RPACKET_DATALEN(card,op); \
+ p->opcode = XPROTO_NAME(card,op); \
+ p->datalen = RPACKET_SIZE(card,op); \
} while(0)
-#define XPACKET_NEW(p, xbus, card, op, to) \
+#define XFRAME_NEW(frm, p, xbus, card, op, to) \
do { \
- p = xbus->ops->packet_new(xbus, GFP_ATOMIC); \
+ int len = RPACKET_SIZE(card,op); \
+ \
+ frm = xbus->ops->xframe_new(xbus, GFP_ATOMIC); \
+ if(!frm) \
+ return -ENOMEM; \
+ p = xframe_next_packet(frm, len); \
if(!p) \
return -ENOMEM; \
XPACKET_INIT(p, card, op); \
- xpd_set_addr(&p->content.addr, to); \
- } while(0);
+ xpd_set_addr(&p->addr, to); \
+ } while(0)
+
+#endif
/*--------------------------- register handling --------------------------------*/
/*
@@ -178,6 +181,7 @@ typedef struct reg_cmd {
#define REG_FIELD(regptr,member) ((regptr)->alt.r.member)
#define REG_XDATA(regptr) ((regptr)->alt.d.xdata)
+#ifdef __KERNEL__
/*--------------------------- protocol tables ----------------------------------*/
typedef struct xproto_entry xproto_entry_t;
@@ -209,12 +213,13 @@ struct xops {
int (*card_zaptel_postregistration)(xpd_t *xpd, bool on);
int (*card_hooksig)(xbus_t *xbus, xpd_t *xpd, int pos, zt_txsig_t txsig);
int (*card_ioctl)(xpd_t *xpd, int pos, unsigned int cmd, unsigned long arg);
+ int (*span_startup)(xpd_t *xpd);
+ int (*span_shutdown)(xpd_t *xpd);
+ int (*chan_onhooktransfer)(xbus_t *xbus, xpd_t *xpd, lineno_t chan, int millies);
int (*SYNC_SOURCE)(xbus_t *xbus, xpd_t *xpd, bool setit, bool is_master);
- int (*PCM_WRITE)(xbus_t *xbus, xpd_t *xpd, xpp_line_t offhook, volatile byte *buf);
int (*XPD_STATE)(xbus_t *xbus, xpd_t *xpd, bool on);
- int (*CHAN_CID)(xbus_t *xbus, xpd_t *xpd, lineno_t chan);
int (*RING)(xbus_t *xbus, xpd_t *xpd, lineno_t chan, bool on);
int (*RELAY_OUT)(xbus_t *xbus, xpd_t *xpd, byte which, bool on);
};
@@ -258,7 +263,8 @@ enum opcodes {
#define MEMBER(card,op) RPACKET_TYPE(card,op) RPACKET_NAME(card,op)
-struct xpacket_raw {
+struct xpacket {
+ uint16_t datalen;
byte opcode;
xpd_addr_t addr;
union {
@@ -278,21 +284,17 @@ struct xpacket_raw {
byte data[0];
};
+ /* Last byte is chksum */
} PACKED;
-struct xpacket {
- xpacket_raw_t content;
- int datalen;
- struct list_head list;
- void *packet_priv;
-};
-
void dump_packet(const char *msg, xpacket_t *packet, bool print_dbg);
void dump_reg_cmd(const char msg[], reg_cmd_t *regcmd);
-int packet_receive(xbus_t *xbus, xpacket_t *pack);
+int xframe_receive(xbus_t *xbus, xframe_t *xframe);
int xproto_register(const xproto_table_t *proto_table);
void xproto_unregister(const xproto_table_t *proto_table);
const xproto_entry_t *xproto_global_entry(byte opcode);
const char *xproto_name(xpd_type_t xpd_type);
+#endif /* __KERNEL__ */
+
#endif /* XPROTO_H */