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:
parent
09ced95ce2
commit
545c505f44
1 changed files with 8 additions and 5 deletions
|
@ -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) |
|
||||||
|
|
Loading…
Add table
Reference in a new issue