diff options
Diffstat (limited to 'xpp/xproto.c')
-rw-r--r-- | xpp/xproto.c | 47 |
1 files changed, 28 insertions, 19 deletions
diff --git a/xpp/xproto.c b/xpp/xproto.c index c512479..fb179d1 100644 --- a/xpp/xproto.c +++ b/xpp/xproto.c @@ -38,12 +38,12 @@ static const xproto_table_t *xprotocol_tables[XPD_TYPE_NOMODULE]; #error MAX_XPDS is too small #endif -bool valid_xpd_addr(const xpd_addr_t *addr) +bool valid_xpd_addr(const struct xpd_addr *addr) { return ((addr->subunit & ~BITMASK(SUBUNIT_BITS)) == 0) && ((addr->unit & ~BITMASK(UNIT_BITS)) == 0); } -void xpd_set_addr(xpd_addr_t *addr, int xpd_num) +void xpd_set_addr(struct xpd_addr *addr, int xpd_num) { addr->unit = XBUS_UNIT(xpd_num); addr->subunit = XBUS_SUBUNIT(xpd_num); @@ -125,7 +125,7 @@ xproto_handler_t xproto_card_handler(const xproto_table_t *table, byte opcode) return xe->handler; } -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) { XBUS_NOTICE(xbus, "%s: non-existing address (%1d%1d): %s\n", funcname, addr.unit, addr.subunit, msg); @@ -141,13 +141,13 @@ int packet_process(xbus_t *xbus, xpacket_t *pack) int ret = -EPROTO; BUG_ON(!pack); - if(!valid_xpd_addr(&pack->addr)) { + if(!valid_xpd_addr(&XPACKET_ADDR(pack))) { if(printk_ratelimit()) dump_packet("packet_process -- bad address", pack, print_dbg); goto out; } - op = pack->opcode; - xpd = xpd_byaddr(xbus, pack->addr.unit, pack->addr.subunit); + op = XPACKET_OP(pack); + xpd = xpd_byaddr(xbus, XPACKET_ADDR(pack).unit, XPACKET_ADDR(pack).subunit); /* XPD may be NULL (e.g: during bus polling */ xe = xproto_global_entry(op); /*-------- Validations -----------*/ @@ -158,7 +158,7 @@ int packet_process(xbus_t *xbus, xpacket_t *pack) if(printk_ratelimit()) { XBUS_NOTICE(xbus, "%s: from %d%d opcode=0x%02X: no such global command.\n", __FUNCTION__, - pack->addr.unit, pack->addr.subunit, op); + XPACKET_ADDR(pack).unit, XPACKET_ADDR(pack).subunit, op); dump_packet("packet_process -- no such global command", pack, 1); } goto out; @@ -187,7 +187,7 @@ int packet_process(xbus_t *xbus, xpacket_t *pack) if(!table->packet_is_valid(pack)) { if(printk_ratelimit()) { ERR("xpp: %s: wrong size %d for opcode=0x%02X\n", - __FUNCTION__, pack->datalen, op); + __FUNCTION__, XPACKET_LEN(pack), op); dump_packet("packet_process -- wrong size", pack, print_dbg); } goto out; @@ -195,7 +195,7 @@ int packet_process(xbus_t *xbus, xpacket_t *pack) ret = 0; /* All well */ handler = xe->handler; BUG_ON(!handler); - XBUS_COUNTER(xbus, RX_BYTES) += pack->datalen; + XBUS_COUNTER(xbus, RX_BYTES) += XPACKET_LEN(pack); handler(xbus, xpd, xe, pack); out: return ret; @@ -210,6 +210,8 @@ int xframe_receive(xbus_t *xbus, xframe_t *xframe) xpacket_t *pack; int len; bool is_pcm; + struct timeval now; + int usec; p = xpacket_start = xframe->packets; xframe_end = xpacket_start + XFRAME_LEN(xframe); @@ -225,7 +227,7 @@ int xframe_receive(xbus_t *xbus, xframe_t *xframe) /* * We want to check that xframes do not mix PCM and other commands */ - is_pcm = ((xpacket_t *)p)->opcode == XPROTO_NAME(GLOBAL,PCM_READ); + is_pcm = XPACKET_OP((xpacket_t *)p) == XPROTO_NAME(GLOBAL,PCM_READ); if(print_dbg & DBG_PCM) { static int rate_limit; @@ -234,13 +236,13 @@ int xframe_receive(xbus_t *xbus, xframe_t *xframe) } do { pack = (xpacket_t *)p; - len = pack->datalen; + len = XPACKET_LEN(pack); /* Sanity checks */ - if(unlikely(is_pcm && pack->opcode != XPROTO_NAME(GLOBAL,PCM_READ) && printk_ratelimit())) { + if(unlikely(is_pcm && XPACKET_OP(pack) != XPROTO_NAME(GLOBAL,PCM_READ) && printk_ratelimit())) { XBUS_DBG(GENERAL, xbus, "Non-PCM packet within a PCM xframe\n"); dump_xframe("In PCM xframe", xbus, xframe); // goto bad_proto; - } else if(unlikely(!is_pcm && pack->opcode == XPROTO_NAME(GLOBAL,PCM_READ) && printk_ratelimit())) { + } else if(unlikely(!is_pcm && XPACKET_OP(pack) == XPROTO_NAME(GLOBAL,PCM_READ) && printk_ratelimit())) { XBUS_DBG(GENERAL, xbus, "A PCM packet within a Non-PCM xframe\n"); // goto bad_proto; } @@ -261,6 +263,12 @@ int xframe_receive(xbus_t *xbus, xframe_t *xframe) if(is_pcm) XBUS_COUNTER(xbus, RX_XFRAME_PCM)++; out: + /* Calculate total processing time */ + do_gettimeofday(&now); + usec = (now.tv_sec - xframe->tv_received.tv_sec) * 1000000 + + now.tv_usec - xframe->tv_received.tv_usec; + if(usec > xbus->max_rx_process) + xbus->max_rx_process = usec; xbus->ops->xframe_free(xbus, xframe); return ret; bad_proto: @@ -273,18 +281,18 @@ bad_proto: void dump_packet(const char *msg, xpacket_t *packet, bool print_dbg) { - byte op = packet->opcode; - byte *addr = (byte *)&packet->addr; + byte op = XPACKET_OP(packet); + byte *addr = (byte *)&XPACKET_ADDR(packet); if(!print_dbg) return; DBG(GENERAL, "%s: XPD=%1X-%1X (0x%X) OP=0x%02X LEN=%d", msg, - packet->addr.unit, - packet->addr.subunit, + XPACKET_ADDR(packet).unit, + XPACKET_ADDR(packet).subunit, *addr, op, - (byte)packet->datalen); + (byte)XPACKET_LEN(packet)); #if VERBOSE_DEBUG { int i; @@ -292,7 +300,7 @@ void dump_packet(const char *msg, xpacket_t *packet, bool print_dbg) if (print_dbg) printk(" BYTES: "); - for(i = 0; i < packet->datalen; i++) { + for(i = 0; i < XPACKET_LEN(packet); i++) { static int limiter = 0; if(i >= sizeof(xpacket_t)) { @@ -393,6 +401,7 @@ int xproto_register(const xproto_table_t *proto_table) CHECK_XOP(card_zaptel_postregistration); CHECK_XOP(card_hooksig); // CHECK_XOP(card_ioctl); // optional method -- call after testing + CHECK_XOP(card_register_reply); CHECK_XOP(XPD_STATE); CHECK_XOP(RING); CHECK_XOP(RELAY_OUT); |