From c91b2cd29653da525d1a37cf680f4a75b2d3b208 Mon Sep 17 00:00:00 2001 From: tzafrir Date: Fri, 14 Sep 2007 22:29:36 +0000 Subject: New xpp release (Xorcom rev 4648): * New firmware protocol version: 2.8 . * New firmwares fix input ports offhook. * Cleanup INFO() messages during module loading. * USB: Receive queue with TASKLETS [r4600]. Controlled by rx_tasklet parameter to xpp_usb module (can be changed in runtime). * The pcm_tasklet parameter in xpp module is deprecated: - Does not actually do anything. - If set during module loading, shows an ERR() message. - Also appears in /proc/xpp/sync * FXS: Hardware DTMF detection by default, can be disabled by setting dtmf_detection=0 parameter to xpd_fxs. PCM is muted when DTMF key is pressed. * zapconf: - Can now generate users.conf compatible with asterisk-gui. - Optional command-line arguments denoting which files to generate. Possible values are 'zaptel', 'zapata' and 'users'. - Defaults to creating zaptel and zapata. git-svn-id: http://svn.digium.com/svn/zaptel/branches/1.2@3019 5390a7c7-147a-4af0-8ec9-7488f05a26cb --- xpp/card_global.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 10 deletions(-) (limited to 'xpp/card_global.c') diff --git a/xpp/card_global.c b/xpp/card_global.c index 3aece9c..2a8bdd8 100644 --- a/xpp/card_global.c +++ b/xpp/card_global.c @@ -60,6 +60,36 @@ static void global_packet_dump(const char *msg, xpacket_t *pack); return ret; } +int xpp_register_request(xbus_t *xbus, xpd_t *xpd, + byte chipsel, bool writing, bool do_subreg, byte regnum, byte subreg, byte data_low, byte data_high) +{ + int ret = 0; + xframe_t *xframe; + xpacket_t *pack; + reg_cmd_t *reg_cmd; + + if(!xbus) { + DBG(REGS, "NO XBUS\n"); + return -EINVAL; + } + XFRAME_NEW(xframe, pack, xbus, GLOBAL, REGISTER_REQUEST, xpd->xbus_idx); + LINE_DBG(REGS, xpd, chipsel, "%c%c R%02X S%02X %02X %02X\n", + (writing)?'W':'R', + (do_subreg)?'S':'D', + regnum, subreg, data_low, data_high); + reg_cmd = &RPACKET_FIELD(pack, GLOBAL, REGISTER_REQUEST, reg_cmd); + reg_cmd->bytes = sizeof(*reg_cmd) - 1; // do not count the 'bytes' field + REG_FIELD(reg_cmd, chipsel) = chipsel; + REG_FIELD(reg_cmd, read_request) = (writing) ? 0 : 1; + REG_FIELD(reg_cmd, do_subreg) = do_subreg; + REG_FIELD(reg_cmd, regnum) = regnum; + REG_FIELD(reg_cmd, subreg) = subreg; + REG_FIELD(reg_cmd, data_low) = data_low; + REG_FIELD(reg_cmd, data_high) = data_high; + ret = send_cmd_frame(xbus, xframe); + return ret; +} + /* * The XPD parameter is totaly ignored by the driver and firmware as well. */ @@ -94,7 +124,7 @@ static void global_packet_dump(const char *msg, xpacket_t *pack); HANDLER_DEF(GLOBAL, NULL_REPLY) { - XBUS_DBG(GENERAL, xbus, "got len=%d\n", pack->datalen); + XBUS_DBG(GENERAL, xbus, "got len=%d\n", XPACKET_LEN(pack)); return 0; } @@ -114,7 +144,7 @@ HANDLER_DEF(GLOBAL, DEV_DESC) card_desc->type = RPACKET_FIELD(pack, GLOBAL, DEV_DESC, type); card_desc->subtype = RPACKET_FIELD(pack, GLOBAL, DEV_DESC, subtype); card_desc->rev = RPACKET_FIELD(pack, GLOBAL, DEV_DESC, rev); - card_desc->xpd_addr = RPACKET_FIELD(pack, GLOBAL, DEV_DESC, addr); + card_desc->xpd_addr = RPACKET_FIELD(pack, GLOBAL, DEV_DESC, head.addr); card_desc->line_status = RPACKET_FIELD(pack, GLOBAL, DEV_DESC, line_status); XBUS_DBG(GENERAL, xbus, "XPD=%d%d type=%d.%d rev=%d line_status=0x%04X\n", card_desc->xpd_addr.unit, @@ -127,9 +157,22 @@ HANDLER_DEF(GLOBAL, DEV_DESC) return 0; } +HANDLER_DEF(GLOBAL, REGISTER_REPLY) +{ + reg_cmd_t *reg = &RPACKET_FIELD(pack, GLOBAL, REGISTER_REPLY, regcmd); + + if(!xpd) { + XBUS_NOTICE(xbus, "%s: received %s for non-existing unit (%1d%1d)\n", + __FUNCTION__, cmd->name, + XPACKET_ADDR(pack).unit, XPACKET_ADDR(pack).subunit); + return -EPROTO; + } + return CALL_XMETHOD(card_register_reply, xbus, xpd, reg); +} + HANDLER_DEF(GLOBAL, PCM_READ) { - xpd_addr_t addr = RPACKET_FIELD(pack, GLOBAL, PCM_READ, addr); + struct xpd_addr addr = RPACKET_FIELD(pack, GLOBAL, PCM_READ, head.addr); struct timeval now; unsigned long sec_diff; unsigned long usec_diff; @@ -196,7 +239,7 @@ HANDLER_DEF(GLOBAL, SYNC_REPLY) BUG_ON(!xbus); if(!xpd) { - notify_bad_xpd(__FUNCTION__, xbus, pack->addr, cmd->name); + notify_bad_xpd(__FUNCTION__, xbus, XPACKET_ADDR(pack), cmd->name); return -EPROTO; } XPD_DBG(GENERAL, xpd, "mode=0x%X drift=%d\n", mode, drift); @@ -219,7 +262,7 @@ HANDLER_DEF(GLOBAL, ERROR_CODE) return 0; if(!xpd) { snprintf(tmp_name, TMP_NAME_LEN, "%s(%1d%1d)", xbus->busname, - pack->addr.unit, pack->addr.subunit); + XPACKET_ADDR(pack).unit, XPACKET_ADDR(pack).subunit); } else { snprintf(tmp_name, TMP_NAME_LEN, "%s/%s", xbus->busname, xpd->xpdname); } @@ -252,6 +295,7 @@ xproto_table_t PROTO_TABLE(GLOBAL) = { XENTRY( GLOBAL, GLOBAL, PCM_READ ), XENTRY( GLOBAL, GLOBAL, SYNC_REPLY ), XENTRY( GLOBAL, GLOBAL, ERROR_CODE ), + XENTRY( GLOBAL, GLOBAL, REGISTER_REPLY ), }, .name = "GLOBAL", .packet_is_valid = global_packet_is_valid, @@ -263,7 +307,7 @@ static bool global_packet_is_valid(xpacket_t *pack) const xproto_entry_t *xe; //DBG(GENERAL, "\n"); - xe = xproto_global_entry(pack->opcode); + xe = xproto_global_entry(XPACKET_OP(pack)); return xe != NULL; } @@ -280,7 +324,7 @@ static bool pcm_valid(xpd_t *xpd, xpacket_t *pack) uint16_t good_len; BUG_ON(!pack); - BUG_ON(pack->opcode != XPROTO_NAME(GLOBAL, PCM_READ)); + BUG_ON(XPACKET_OP(pack) != XPROTO_NAME(GLOBAL, PCM_READ)); /* * Don't use for_each_line(xpd, i) here because for BRI it will ignore the channels of the other * xpd's in the same unit. @@ -290,13 +334,13 @@ static bool pcm_valid(xpd_t *xpd, xpacket_t *pack) count++; /* FRAMES: include opcode in calculation */ good_len = RPACKET_HEADERSIZE + sizeof(xpp_line_t) + count * 8; - if(pack->datalen != good_len) { + if(XPACKET_LEN(pack) != good_len) { static int rate_limit = 0; XPD_COUNTER(xpd, RECV_ERRORS)++; if((rate_limit++ % 1000) <= 10) { - XPD_ERR(xpd, "BAD PCM REPLY: pack->datalen=%d (should be %d), count=%d\n", - pack->datalen, good_len, count); + XPD_ERR(xpd, "BAD PCM REPLY: packet_len=%d (should be %d), count=%d\n", + XPACKET_LEN(pack), good_len, count); dump_packet("BAD PCM REPLY", pack, 1); } return 0; @@ -382,3 +426,4 @@ int run_initialize_registers(xpd_t *xpd) } EXPORT_SYMBOL(run_initialize_registers); +EXPORT_SYMBOL(xpp_register_request); -- cgit v1.2.3