diff options
Diffstat (limited to 'xpp/xproto.h')
-rw-r--r-- | xpp/xproto.h | 51 |
1 files changed, 27 insertions, 24 deletions
diff --git a/xpp/xproto.h b/xpp/xproto.h index 383ce4b..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,6 +60,7 @@ 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) @@ -90,23 +90,20 @@ void xpd_set_addr(xpd_addr_t *addr, int xpd_num); #define DEF_RPACKET_DATA(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) \ } @@ -115,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 --------------------------------*/ /* @@ -177,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; @@ -208,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); }; @@ -257,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 { @@ -277,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 */ |