summaryrefslogtreecommitdiff
path: root/xpp/xproto.c
diff options
context:
space:
mode:
Diffstat (limited to 'xpp/xproto.c')
-rw-r--r--xpp/xproto.c47
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);