summaryrefslogtreecommitdiff
path: root/kernel/xpp/xproto.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/xpp/xproto.c')
-rw-r--r--kernel/xpp/xproto.c102
1 files changed, 66 insertions, 36 deletions
diff --git a/kernel/xpp/xproto.c b/kernel/xpp/xproto.c
index 010f0de..c3aa34e 100644
--- a/kernel/xpp/xproto.c
+++ b/kernel/xpp/xproto.c
@@ -30,7 +30,7 @@
static const char rcsid[] = "$Id$";
-extern int print_dbg;
+extern int debug;
static const xproto_table_t *xprotocol_tables[XPD_TYPE_NOMODULE];
@@ -68,7 +68,7 @@ xproto_handler_t xproto_global_handler(byte opcode)
return xproto_card_handler(&PROTO_TABLE(GLOBAL), opcode);
}
-const xproto_table_t *xproto_table(xpd_type_t cardtype)
+static const xproto_table_t *xproto_table(xpd_type_t cardtype)
{
if(cardtype >= XPD_TYPE_NOMODULE)
return NULL;
@@ -125,7 +125,7 @@ void notify_bad_xpd(const char *funcname, xbus_t *xbus, const struct xpd_addr ad
funcname, addr.unit, addr.subunit, msg);
}
-int packet_process(xbus_t *xbus, xpacket_t *pack)
+static int packet_process(xbus_t *xbus, xpacket_t *pack)
{
byte op;
const xproto_entry_t *xe;
@@ -140,7 +140,7 @@ int packet_process(xbus_t *xbus, xpacket_t *pack)
XBUS_NOTICE(xbus, "%s: from %d%d: bad address.\n",
__FUNCTION__,
XPACKET_ADDR_UNIT(pack), XPACKET_ADDR_SUBUNIT(pack));
- dump_packet("packet_process -- bad address", pack, print_dbg);
+ dump_packet("packet_process -- bad address", pack, debug);
}
goto out;
}
@@ -186,7 +186,7 @@ int packet_process(xbus_t *xbus, xpacket_t *pack)
if(printk_ratelimit()) {
ERR("xpp: %s: wrong size %d for opcode=0x%02X\n",
__FUNCTION__, XPACKET_LEN(pack), op);
- dump_packet("packet_process -- wrong size", pack, print_dbg);
+ dump_packet("packet_process -- wrong size", pack, debug);
}
goto out;
}
@@ -207,6 +207,8 @@ static int xframe_receive_cmd(xbus_t *xbus, xframe_t *xframe)
int len;
int ret;
+ if(debug & DBG_COMMANDS)
+ dump_xframe("RX-CMD", xbus, xframe, DBG_ANY);
p = xframe->packets;
xframe_end = p + XFRAME_LEN(xframe);
do {
@@ -218,7 +220,7 @@ static int xframe_receive_cmd(xbus_t *xbus, xframe_t *xframe)
if((rate_limit++ % 1003) == 0) {
XBUS_DBG(GENERAL, xbus, "A PCM packet within a Non-PCM xframe\n");
- dump_xframe("In Non-PCM xframe", xbus, xframe, print_dbg);
+ dump_xframe("In Non-PCM xframe", xbus, xframe, debug);
}
ret = -EPROTO;
goto out;
@@ -229,7 +231,7 @@ static int xframe_receive_cmd(xbus_t *xbus, xframe_t *xframe)
if((rate_limit++ % 1003) == 0) {
XBUS_NOTICE(xbus, "Invalid packet length %d\n", len);
- dump_xframe("BAD LENGTH", xbus, xframe, print_dbg);
+ dump_xframe("BAD LENGTH", xbus, xframe, debug);
}
ret = -EPROTO;
goto out;
@@ -255,7 +257,7 @@ int xframe_receive(xbus_t *xbus, xframe_t *xframe)
if((rate_limit++ % 1003) == 0) {
XBUS_NOTICE(xbus, "short xframe\n");
- dump_xframe("short xframe", xbus, xframe, print_dbg);
+ dump_xframe("short xframe", xbus, xframe, debug);
}
FREE_RECV_XFRAME(xbus, xframe);
return -EPROTO;
@@ -287,12 +289,12 @@ int xframe_receive(xbus_t *xbus, xframe_t *xframe)
#define VERBOSE_DEBUG 1
#define ERR_REPORT_LIMIT 20
-void dump_packet(const char *msg, const xpacket_t *packet, bool print_dbg)
+void dump_packet(const char *msg, const xpacket_t *packet, bool debug)
{
byte op = XPACKET_OP(packet);
byte *addr = (byte *)&XPACKET_ADDR(packet);
- if(!print_dbg)
+ if(!debug)
return;
printk(KERN_DEBUG "%s: XPD=%1X-%1X%c (0x%X) OP=0x%02X LEN=%d",
msg,
@@ -322,7 +324,7 @@ void dump_packet(const char *msg, const xpacket_t *packet, bool print_dbg)
limiter++;
break;
}
- if (print_dbg)
+ if (debug)
printk("%02X ", p[i]);
}
}
@@ -330,39 +332,69 @@ void dump_packet(const char *msg, const xpacket_t *packet, bool print_dbg)
printk("\n");
}
-void dump_reg_cmd(const char msg[], const reg_cmd_t *regcmd, bool writing)
+void dump_reg_cmd(const char msg[], bool writing, xbus_t *xbus,
+ byte unit, xportno_t port, const reg_cmd_t *regcmd)
{
char action;
- byte chipsel;
-
+ char modifier;
+ char port_buf[MAX_PROC_WRITE];
+ char reg_buf[MAX_PROC_WRITE];
+ char data_buf[MAX_PROC_WRITE];
+
+ if(regcmd->bytes > sizeof(*regcmd) - 1) { /* The size byte is not included */
+ PORT_NOTICE(xbus, unit, port, "%s: %s: Too long: regcmd->bytes = %d\n",
+ __FUNCTION__, msg, regcmd->bytes);
+ return;
+ }
+ if(regcmd->is_multibyte) {
+ char buf[MAX_PROC_WRITE + 1];
+ int i;
+ int n = 0;
+ size_t len = regcmd->bytes;
+ const byte *p = REG_XDATA(regcmd);
+
+ buf[0] = '\0';
+ for(i = 0; i < len && n < MAX_PROC_WRITE; i++)
+ n += snprintf(&buf[n], MAX_PROC_WRITE - n, "%02X ", p[i]);
+ PORT_DBG(REGS, xbus, unit, port,
+ "UNIT-%d PORT-%d: Multibyte(eoframe=%d) %s[0..%zd]: %s%s\n",
+ unit, port, regcmd->eoframe,
+ msg, len-1, buf, (n >= MAX_PROC_WRITE)?"...":"");
+ return;
+ }
if(regcmd->bytes != sizeof(*regcmd) - 1) { /* The size byte is not included */
- NOTICE("%s: Wrong size: regcmd->bytes = %d\n", __FUNCTION__, regcmd->bytes);
+ PORT_NOTICE(xbus, unit, port, "%s: %s: Wrong size: regcmd->bytes = %d\n",
+ __FUNCTION__, msg, regcmd->bytes);
return;
}
- if(writing && (REG_FIELD(regcmd, chipsel) & 0x80))
- ERR("Sending register command with reading bit ON\n");
- action = (writing) ? 'W' : 'R';
- chipsel = REG_FIELD(regcmd, chipsel) & ~0x80;
+ snprintf(port_buf, MAX_PROC_WRITE, "%d%s",
+ regcmd->portnum,
+ (REG_FIELD(regcmd, all_ports_broadcast)) ? "*" : "");
+ action = (REG_FIELD(regcmd, read_request)) ? 'R' : 'W';
+ modifier = 'D';
if(REG_FIELD(regcmd, do_subreg)) {
- DBG(GENERAL, "%s: %d %cS %02X %02X [%02X] # data_high=%X m=%d eof=%d\n", msg, chipsel, action,
+ snprintf(reg_buf, MAX_PROC_WRITE, "%02X %02X",
REG_FIELD(regcmd, regnum),
- REG_FIELD(regcmd, subreg),
- REG_FIELD(regcmd, data_low),
- REG_FIELD(regcmd, data_high),
- regcmd->multibyte, regcmd->eoframe);
- } else if(REG_FIELD(regcmd, regnum) == 0x1E) {
- DBG(GENERAL, "%s: %d %cI %02X [%02X %02X] # m=%d eof=%d\n", msg, chipsel, action,
- REG_FIELD(regcmd, subreg),
- REG_FIELD(regcmd, data_low),
- REG_FIELD(regcmd, data_high),
- regcmd->multibyte, regcmd->eoframe);
+ REG_FIELD(regcmd, subreg));
+ modifier = 'S';
} else {
- DBG(GENERAL, "%s: %d %cD %02X [%02X] # data_high=%X m=%d eof=%d\n", msg, chipsel, action,
- REG_FIELD(regcmd, regnum),
+ snprintf(reg_buf, MAX_PROC_WRITE, "%02X",
+ REG_FIELD(regcmd, regnum));
+ }
+ if(REG_FIELD(regcmd, read_request)) {
+ data_buf[0] = '\0';
+ } else if(REG_FIELD(regcmd, do_datah)) {
+ snprintf(data_buf, MAX_PROC_WRITE, "%02X %02X",
REG_FIELD(regcmd, data_low),
- REG_FIELD(regcmd, data_high),
- regcmd->multibyte, regcmd->eoframe);
+ REG_FIELD(regcmd, data_high));
+ modifier = 'I';
+ } else {
+ snprintf(data_buf, MAX_PROC_WRITE, "%02X",
+ REG_FIELD(regcmd, data_low));
}
+ PORT_DBG(REGS, xbus, unit, port, "%s: %s %c%c %s %s\n",
+ msg, port_buf, action, modifier,
+ reg_buf, data_buf);
}
const char *xproto_name(xpd_type_t xpd_type)
@@ -411,8 +443,6 @@ int xproto_register(const xproto_table_t *proto_table)
// 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);
xprotocol_tables[type] = proto_table;
return 0;