From: Soumyajyotii Ssarkar <soumyajyotisarkar23@gmail.com>
These fixes ensure proper interrupt signaling and status
register behavior during SCSI operations:
- Mask DFE bit in ncr710_update_irq()
- Remove manual ISTAT_DIP clearing, let ncr710_update_irq()
handle it consistently
- Fix SSTAT0 read to clear unconditionally when non zero
- Fix SSTAT2 read was returning DSTAT instead
- Preserve DFE status bit when clearing DSTAT
Signed-off-by: Soumyajyotii Ssarkar <soumyajyotisarkar23@gmail.com>
Tested-by: Helge Deller <deller@gmx.de>
Signed-off-by: Helge Deller <deller@gmx.de>
---
hw/scsi/ncr53c710.c | 15 +++------------
1 file changed, 3 insertions(+), 12 deletions(-)
diff --git a/hw/scsi/ncr53c710.c b/hw/scsi/ncr53c710.c
index ac1ca4cef8..0b7734a129 100644
--- a/hw/scsi/ncr53c710.c
+++ b/hw/scsi/ncr53c710.c
@@ -593,7 +593,7 @@ static void ncr710_update_irq(NCR710State *s)
{
int level = 0;
- if (s->dstat) {
+ if (s->dstat & ~NCR710_DSTAT_DFE) {
if (s->dstat & s->dien) {
level = 1;
}
@@ -1785,7 +1785,6 @@ static uint8_t ncr710_reg_readb(NCR710State *s, int offset)
}
s->dstat = 0; /* Clear all DMA interrupt status bits */
s->dstat |= NCR710_DSTAT_DFE;
- s->istat &= ~NCR710_ISTAT_DIP;
ncr710_update_irq(s);
if (s->waiting == NCR710_WAIT_RESELECT && s->current &&
@@ -1811,7 +1810,7 @@ static uint8_t ncr710_reg_readb(NCR710State *s, int offset)
return ret;
case NCR710_SSTAT0_REG: /* SSTAT0 */
ret = s->sstat0;
- if (s->sstat0 != 0 && !(s->sstat0 & NCR710_SSTAT0_STO)) {
+ if (s->sstat0 != 0) {
s->sstat0 = 0;
s->istat &= ~NCR710_ISTAT_SIP;
ncr710_update_irq(s);
@@ -1824,14 +1823,7 @@ static uint8_t ncr710_reg_readb(NCR710State *s, int offset)
ret = s->sstat0;
break;
case NCR710_SSTAT2_REG: /* SSTAT2 */
- ret = s->dstat;
-
- if (s->dstat & NCR710_DSTAT_SIR) {
- /* SIR bit processing */
- }
- s->dstat = 0;
- s->istat &= ~NCR710_ISTAT_DIP;
- ncr710_update_irq(s);
+ ret = s->sstat2;
break;
CASE_GET_REG32(dsa, NCR710_DSA_REG)
break;
@@ -1902,7 +1894,6 @@ static uint8_t ncr710_reg_readb(NCR710State *s, int offset)
if (s->dsps == GOOD_STATUS_AFTER_STATUS &&
(s->dstat & NCR710_DSTAT_SIR)) {
s->dstat &= ~NCR710_DSTAT_SIR;
- s->istat &= ~NCR710_ISTAT_DIP;
ncr710_update_irq(s);
}
break;
--
2.52.0