summaryrefslogtreecommitdiff
path: root/xpp/xproto.h
diff options
context:
space:
mode:
Diffstat (limited to 'xpp/xproto.h')
-rw-r--r--xpp/xproto.h94
1 files changed, 41 insertions, 53 deletions
diff --git a/xpp/xproto.h b/xpp/xproto.h
index e9b8120..9f0257f 100644
--- a/xpp/xproto.h
+++ b/xpp/xproto.h
@@ -29,6 +29,26 @@
#include <linux/proc_fs.h>
#include <zaptel.h>
+struct xpd_addr {
+ uint8_t unit:UNIT_BITS;
+ uint8_t subunit:SUBUNIT_BITS;
+ uint8_t reserved:1;
+ uint8_t sync_master:1;
+} PACKED;
+
+struct xpacket_header {
+ uint16_t packet_len:10;
+ uint16_t reserved:1;
+ uint16_t is_pcm:1;
+ uint16_t timeslot:4;
+ uint8_t opcode;
+ struct xpd_addr addr;
+} PACKED;
+
+#define XPACKET_OP(p) ((p)->head.opcode)
+#define XPACKET_LEN(p) ((p)->head.packet_len)
+#define XPACKET_ADDR(p) ((p)->head.addr)
+
#define PROTO_TABLE(n) n ## _protocol_table
/*
@@ -52,22 +72,15 @@ typedef byte xpd_type_t;
#define PCM_CHUNKSIZE (CHANNELS_PERXPD * 8) /* samples of 8 bytes */
-typedef struct xpd_addr {
- byte unit:UNIT_BITS;
- byte subunit:SUBUNIT_BITS;
- byte reserved:1;
- byte sync_master:1;
-} PACKED xpd_addr_t;
-
-bool valid_xpd_addr(const xpd_addr_t *addr);
-void xpd_set_addr(xpd_addr_t *addr, int xpd_num);
+bool valid_xpd_addr(const struct xpd_addr *addr);
+void xpd_set_addr(struct xpd_addr *addr, int xpd_num);
#define XPROTO_NAME(card,op) card ## _ ## op
#define XPROTO_HANDLER(card,op) XPROTO_NAME(card,op ## _handler)
#define XPROTO_CALLER(card,op) XPROTO_NAME(card,op ## _send)
#define HANDLER_DEF(card,op) \
- int XPROTO_HANDLER(card,op) ( \
+ static int XPROTO_HANDLER(card,op) ( \
xbus_t *xbus, \
xpd_t *xpd, \
const xproto_entry_t *cmd, \
@@ -79,23 +92,18 @@ void xpd_set_addr(xpd_addr_t *addr, int xpd_num);
int CALL_PROTO(card, op, xbus_t *xbus, xpd_t *xpd, ## __VA_ARGS__ )
#define HOSTCMD(card, op, ...) \
- DECLARE_CMD(card, op, ## __VA_ARGS__ ); \
- EXPORT_SYMBOL(XPROTO_CALLER(card, op)); \
- DECLARE_CMD(card, op, ## __VA_ARGS__ )
+ DECLARE_CMD(card, op, ## __VA_ARGS__ )
#define RPACKET_NAME(card,op) XPROTO_NAME(RPACKET_ ## card, op)
#define RPACKET_TYPE(card,op) struct RPACKET_NAME(card, op)
-#define DEF_RPACKET_DATA(card,op, ...) \
- RPACKET_TYPE(card,op) { \
- uint16_t datalen;\
- byte opcode; \
- xpd_addr_t addr; \
- __VA_ARGS__ \
+#define DEF_RPACKET_DATA(card,op, ...) \
+ RPACKET_TYPE(card,op) { \
+ struct xpacket_header head; \
+ __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_HEADERSIZE sizeof(struct xpacket_header)
+#define RPACKET_FIELD(p,card,op,field) (((RPACKET_TYPE(card,op) *)(p))->field)
#define RPACKET_SIZE(card,op) sizeof(RPACKET_TYPE(card,op))
#define XENTRY(prototab,module,op) \
@@ -106,12 +114,11 @@ void xpd_set_addr(xpd_addr_t *addr, int xpd_num);
.table = &PROTO_TABLE(prototab) \
}
-
-
-#define XPACKET_INIT(p, card, op) \
- do { \
- p->opcode = XPROTO_NAME(card,op); \
- p->datalen = RPACKET_SIZE(card,op); \
+#define XPACKET_INIT(p, card, op, to) \
+ do { \
+ XPACKET_OP(p) = XPROTO_NAME(card,op); \
+ XPACKET_LEN(p) = RPACKET_SIZE(card,op); \
+ xpd_set_addr(&XPACKET_ADDR(p), (to)); \
} while(0)
#define XFRAME_NEW(frm, p, xbus, card, op, to) \
@@ -124,8 +131,7 @@ void xpd_set_addr(xpd_addr_t *addr, int xpd_num);
(p) = xframe_next_packet(frm, len); \
if(!(p)) \
return -ENOMEM; \
- XPACKET_INIT(p, card, op); \
- xpd_set_addr(&(p)->addr, (to)); \
+ XPACKET_INIT(p, card, op, to); \
} while(0)
#endif
@@ -215,6 +221,7 @@ struct xops {
int (*card_ioctl)(xpd_t *xpd, int pos, unsigned int cmd, unsigned long arg);
int (*card_open)(xpd_t *xpd, lineno_t pos);
int (*card_close)(xpd_t *xpd, lineno_t pos);
+ int (*card_register_reply)(xbus_t *xbus, xpd_t *xpd, reg_cmd_t *reg);
int (*XPD_STATE)(xbus_t *xbus, xpd_t *xpd, bool on);
int (*RING)(xbus_t *xbus, xpd_t *xpd, lineno_t chan, bool on);
@@ -241,30 +248,14 @@ struct xproto_table {
#include "card_global.h"
#include "card_fxs.h"
#include "card_fxo.h"
-
-enum opcodes {
- XPROTO_NAME(GLOBAL, NULL_REPLY) = 0xFE,
- XPROTO_NAME(GLOBAL, DESC_REQ) = 0x04,
- XPROTO_NAME(GLOBAL, DEV_DESC) = 0x05,
- XPROTO_NAME(GLOBAL, REGISTER_REQUEST) = 0x0F,
-/**/
- XPROTO_NAME(GLOBAL, PCM_WRITE) = 0x11,
- XPROTO_NAME(GLOBAL, PCM_READ) = 0x12,
-/**/
- XPROTO_NAME(GLOBAL, SYNC_SOURCE) = 0x19,
- XPROTO_NAME(GLOBAL, SYNC_REPLY) = 0x1A,
-/**/
- XPROTO_NAME(GLOBAL, ERROR_CODE) = 0x22,
- XPROTO_NAME(GLOBAL, RESET_SYNC_COUNTERS) = 0x23,
-};
+#include "card_bri.h"
+#include "card_pri.h"
#define MEMBER(card,op) RPACKET_TYPE(card,op) RPACKET_NAME(card,op)
struct xpacket {
- uint16_t datalen;
- byte opcode;
- xpd_addr_t addr;
+ struct xpacket_header head;
union {
MEMBER(GLOBAL, NULL_REPLY);
MEMBER(GLOBAL, DESC_REQ);
@@ -275,10 +266,7 @@ struct xpacket {
MEMBER(GLOBAL, ERROR_CODE);
MEMBER(FXS, SIG_CHANGED);
- MEMBER(FXS, REGISTER_REPLY);
-
MEMBER(FXO, SIG_CHANGED);
- MEMBER(FXO, DAA_REPLY);
byte data[0];
};
@@ -288,7 +276,7 @@ struct xpacket {
void dump_packet(const char *msg, xpacket_t *packet, bool print_dbg);
void dump_reg_cmd(const char msg[], const reg_cmd_t *regcmd, bool writing);
int xframe_receive(xbus_t *xbus, xframe_t *xframe);
-void notify_bad_xpd(const char *funcname, xbus_t *xbus, const xpd_addr_t addr, const char *msg);
+void notify_bad_xpd(const char *funcname, xbus_t *xbus, const struct xpd_addr addr, const char *msg);
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);