PDP10,PDP11,VAX: Fix for DMC/DMR error which lost track of pending transmit buffers when timeouts happened during DDCMP protocol startup. Fixes #109

This commit is contained in:
Mark Pizzolato 2014-02-11 13:32:37 -08:00
parent 897491deea
commit d7c63d61f2

View file

@ -638,7 +638,8 @@ DDCMP_STATETABLE DDCMP_TABLE[] = {
ddcmp_StopTimer}}, ddcmp_StopTimer}},
{ 6, IStart, {ddcmp_ReceiveStrt}, AStart, {ddcmp_SendStack, { 6, IStart, {ddcmp_ReceiveStrt}, AStart, {ddcmp_SendStack,
ddcmp_StartTimer}}, ddcmp_StartTimer}},
{ 7, IStart, {ddcmp_TimerExpired}, IStart, {ddcmp_SendStrt, { 7, IStart, {ddcmp_TimerExpired}, IStart, {ddcmp_ResetVariables,
ddcmp_SendStrt,
ddcmp_StartTimer}}, ddcmp_StartTimer}},
{ 8, IStart, {ddcmp_ReceiveMaintMsg}, Maintenance, {ddcmp_ResetVariables, { 8, IStart, {ddcmp_ReceiveMaintMsg}, Maintenance, {ddcmp_ResetVariables,
ddcmp_NotifyMaintRcvd}}, ddcmp_NotifyMaintRcvd}},
@ -853,7 +854,7 @@ while (*Actions)
} }
++Actions; ++Actions;
if (Name->Name) if (Name->Name)
sprintf (&buf[strlen(buf)], "%s%s", Name->Name, *Actions ? " && " : ""); sprintf (&buf[strlen(buf)], "%s%s", Name->Name, *Actions ? " + " : "");
} }
return buf; return buf;
} }
@ -1428,6 +1429,48 @@ if (detail) {
fprintf (st, " actual_bytes_transferred: 0x%04X\n", buffer->actual_bytes_transferred); fprintf (st, " actual_bytes_transferred: 0x%04X\n", buffer->actual_bytes_transferred);
if (buffer->buffer_return_time) if (buffer->buffer_return_time)
fprintf (st, " buffer_return_time: 0x%08X\n", buffer->buffer_return_time); fprintf (st, " buffer_return_time: 0x%08X\n", buffer->buffer_return_time);
if (strcmp(queue->name, "transmit") == 0) {
uint8 *msg = buffer->transfer_buffer;
static const char *const flags [4] = { "..", ".Q", "S.", "SQ" };
static const char *const nak[18] = { "", " (HCRC)", " (DCRC)", " (REPREPLY)", /* 0-3 */
"", "", "", "", /* 4-7 */
" (NOBUF)", " (RXOVR)", "", "", /* 8-11 */
"", "", "", "", /* 12-15 */
" (TOOLONG)", " (HDRFMT)" }; /* 16-17 */
const char *flag = flags[msg[2]>>6];
int msg2 = msg[2] & 0x3F;
switch (msg[0]) {
case DDCMP_SOH: /* Data Message */
fprintf (st, "Data Message, Count: %d, Num: %d, Flags: %s, Resp: %d, HDRCRC: %s, DATACRC: %s\n", (msg2 << 8)|msg[1], msg[4], flag, msg[3],
(0 == ddcmp_crc16 (0, msg, 8)) ? "OK" : "BAD", (0 == ddcmp_crc16 (0, msg+8, 2+((msg2 << 8)|msg[1]))) ? "OK" : "BAD");
break;
case DDCMP_ENQ: /* Control Message */
fprintf (st, "Control: Type: %d ", msg[1]);
switch (msg[1]) {
case DDCMP_CTL_ACK: /* ACK */
fprintf (st, "(ACK) ACKSUB: %d, Flags: %s, Resp: %d\n", msg2, flag, msg[3]);
break;
case DDCMP_CTL_NAK: /* NAK */
fprintf (st, "(NAK) Reason: %d%s, Flags: %s, Resp: %d\n", msg2, ((msg2 > 17)? "": nak[msg2]), flag, msg[3]);
break;
case DDCMP_CTL_REP: /* REP */
fprintf (st, "(REP) REPSUB: %d, Num: %d, Flags: %s\n", msg2, msg[4], flag);
break;
case DDCMP_CTL_STRT: /* STRT */
fprintf (st, "(STRT) STRTSUB: %d, Flags: %s\n", msg2, flag);
break;
case DDCMP_CTL_STACK: /* STACK */
fprintf (st, "(STACK) STCKSUB: %d, Flags: %s\n", msg2, flag);
break;
default: /* Unknown */
fprintf (st, "(Unknown=0%o)\n", msg[1]);
break;
}
if (buffer->count != DDCMP_HEADER_SIZE)
fprintf (st, "Unexpected Control Message Length: %d expected %d\n", buffer->count, DDCMP_HEADER_SIZE);
}
}
same = 0; same = 0;
} }
else else