summaryrefslogtreecommitdiff
path: root/xpp/card_global.c
diff options
context:
space:
mode:
authortzafrir <tzafrir@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2007-09-14 22:29:36 +0000
committertzafrir <tzafrir@5390a7c7-147a-4af0-8ec9-7488f05a26cb>2007-09-14 22:29:36 +0000
commitc91b2cd29653da525d1a37cf680f4a75b2d3b208 (patch)
treef26185291a7ebb24902a2737d6e5b1fed75bb8c1 /xpp/card_global.c
parent236601045ee0a95930414d8d5f822d9a61054aae (diff)
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
Diffstat (limited to 'xpp/card_global.c')
-rw-r--r--xpp/card_global.c65
1 files changed, 55 insertions, 10 deletions
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);