[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] escc: update transmit status bits when switching to async mode
From: |
Mark Cave-Ayland |
Subject: |
[PATCH] escc: update transmit status bits when switching to async mode |
Date: |
Mon, 1 Nov 2021 20:30:49 +0000 |
The recent ESCC reset changes cause a regression when attemping to use a real
SS-5 Sun PROM instead of OpenBIOS. The Sun PROM doesn't send an explicit reset
command to the ESCC but gets stuck in a loop probing the keyboard waiting for
STATUS_TXEMPTY to be set in R_STATUS followed by SPEC_ALLSENT in R_SPEC.
Reading through the ESCC datasheet again indicates that SPEC_ALLSENT is updated
when a write to W_TXCTRL1 selects async mode, or remains high if sync mode is
selected. Whilst there is no explicit mention of STATUS_TXEMPTY, the ESCC device
emulation always updates these two register bits together when transmitting
data.
Add extra logic to update both transmit status bits accordingly when writing to
W_TXCTRL1 which enables the Sun PROM to initialise and boot again under QEMU.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
---
hw/char/escc.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/hw/char/escc.c b/hw/char/escc.c
index 0fce4f6324..b33cdc229f 100644
--- a/hw/char/escc.c
+++ b/hw/char/escc.c
@@ -575,6 +575,18 @@ static void escc_mem_write(void *opaque, hwaddr addr,
s->wregs[s->reg] = val;
break;
case W_TXCTRL1:
+ s->wregs[s->reg] = val;
+ if (val & TXCTRL1_STPMSK) {
+ ESCCSERIOQueue *q = &s->queue;
+ if (s->type == escc_serial || q->count == 0) {
+ s->rregs[R_STATUS] |= STATUS_TXEMPTY;
+ s->rregs[R_SPEC] |= SPEC_ALLSENT;
+ }
+ } else {
+ s->rregs[R_STATUS] &= ~STATUS_TXEMPTY;
+ s->rregs[R_SPEC] |= SPEC_ALLSENT;
+ }
+ /* fallthrough */
case W_TXCTRL2:
s->wregs[s->reg] = val;
escc_update_parameters(s);
--
2.20.1
- [PATCH] escc: update transmit status bits when switching to async mode,
Mark Cave-Ayland <=