PDP11, Unibus and Qbus VAX: Fix VH interrupt delivery

- A hang during transition from DMA to programmed I/O.  Force
- Change to single character DMA operations before network transmit
This commit is contained in:
Mark Pizzolato 2020-02-17 02:51:02 -08:00
parent 09ced95ce2
commit 545c505f44

View file

@ -870,6 +870,8 @@ static int32 dq_tx_report ( int32 vh )
txq_idx[vh] -= 1; txq_idx[vh] -= 1;
for (i = 0; i < txq_idx[vh]; i++) for (i = 0; i < txq_idx[vh]; i++)
vh_txq[vh][i] = vh_txq[vh][i + 1]; vh_txq[vh][i] = vh_txq[vh][i + 1];
if ((txq_idx[vh] > 0) && (vh_csr[vh] & CSR_TXIE))
vh_set_txint (vh);
/* txq_idx[vh] -= 1; */ /* txq_idx[vh] -= 1; */
return (data & 0177777); return (data & 0177777);
} }
@ -1247,11 +1249,6 @@ static t_stat vh_wr ( int32 ldata,
/* catch the abort TX transition */ /* catch the abort TX transition */
if (!(lp->lnctrl & LNCTRL_TX_ABORT) && if (!(lp->lnctrl & LNCTRL_TX_ABORT) &&
(data & LNCTRL_TX_ABORT)) { (data & LNCTRL_TX_ABORT)) {
if ((lp->tbuf2 & TB2_TX_ENA) &&
(lp->tbuf2 & TB2_TX_DMA_START)) {
lp->tbuf2 &= ~TB2_TX_DMA_START;
q_tx_report (lp, 0);
}
if ((lp->tbuf2 & TB2_TX_ENA) && if ((lp->tbuf2 & TB2_TX_ENA) &&
(lp->txfifo_cnt != 0)) { (lp->txfifo_cnt != 0)) {
lp->txfifo_idx = lp->txfifo_cnt = 0; lp->txfifo_idx = lp->txfifo_cnt = 0;
@ -1388,6 +1385,11 @@ static void doDMA ( int32 vh,
status = 0; status = 0;
while (lp->tbuffct) { while (lp->tbuffct) {
uint8 buf; uint8 buf;
if (lp->lnctrl & LNCTRL_TX_ABORT) {
lp->tbuf2 &= ~TB2_TX_DMA_START;
q_tx_report (lp, 0);
break;
}
if (Map_ReadB (pa, 1, &buf)) { if (Map_ReadB (pa, 1, &buf)) {
status |= CSR_TX_DMA_ERR; status |= CSR_TX_DMA_ERR;
lp->tbuffct = 0; lp->tbuffct = 0;
@ -1399,6 +1401,7 @@ static void doDMA ( int32 vh,
/* pa = (pa + 1) & PAMASK; */ /* pa = (pa + 1) & PAMASK; */
pa = (pa + 1) & ((1 << 22) - 1); pa = (pa + 1) & ((1 << 22) - 1);
lp->tbuffct--; lp->tbuffct--;
break;
} }
lp->tbuf1 = pa & 0177777; lp->tbuf1 = pa & 0177777;
lp->tbuf2 = (lp->tbuf2 & ~TB2_M_TBUFFAD) | lp->tbuf2 = (lp->tbuf2 & ~TB2_M_TBUFFAD) |