PCI turbo reset control and PCI initialization functions now reset the ELCR registers, the PIC, and the PCI IRQ statuses, fixes PCI cards being stuck unable to issue IRQ's after soft and hard resets.

This commit is contained in:
OBattler
2017-06-21 19:42:36 +02:00
parent 8ce19c2386
commit 585c08d156
4 changed files with 43 additions and 16 deletions

View File

@@ -57,6 +57,9 @@ sermouse_timer(void *priv)
ms->delay = 0; ms->delay = 0;
if (ms->pos == -1)
{
ms->pos = 0;
switch(ms->type) { switch(ms->type) {
case SERMOUSE_TYPE_MICROSOFT: case SERMOUSE_TYPE_MICROSOFT:
/* This identifies a two-button Microsoft Serial mouse. */ /* This identifies a two-button Microsoft Serial mouse. */
@@ -73,6 +76,7 @@ sermouse_timer(void *priv)
/* No action needed. */ /* No action needed. */
break; break;
} }
}
} }
@@ -83,6 +87,7 @@ sermouse_poll(int x, int y, int z, int b, void *priv)
uint8_t buff[16]; uint8_t buff[16];
int len; int len;
if (!(serial_ier(0) & 1)) return(1);
if (!x && !y && b == ms->oldb) return(1); if (!x && !y && b == ms->oldb) return(1);
ms->oldb = b; ms->oldb = b;
@@ -142,9 +147,12 @@ sermouse_poll(int x, int y, int z, int b, void *priv)
pclog(" ] (%d)\n", len); pclog(" ] (%d)\n", len);
#endif #endif
if (!(serial_mctrl(0) & 0x10))
{
/* Send the packet to the bottom-half of the attached port. */ /* Send the packet to the bottom-half of the attached port. */
for (b=0; b<len; b++) for (b=0; b<len; b++)
serial_write_fifo(ms->serial, buff[b], 1); serial_write_fifo(ms->serial, buff[b], 1);
}
return(0); return(0);
} }

View File

@@ -75,6 +75,19 @@ uint8_t elcr_read(uint16_t port, void *priv)
return elcr[port & 1]; return elcr[port & 1];
} }
void elcr_reset(void)
{
int i = 0;
pic_reset();
elcr[0] = elcr[1] = 0;
for (i = 0; i < 32; i++)
{
pci_irq_active[i] = 0;
}
}
void pci_type2_write(uint16_t port, uint8_t val, void *priv); void pci_type2_write(uint16_t port, uint8_t val, void *priv);
uint8_t pci_type2_read(uint16_t port, void *priv); uint8_t pci_type2_read(uint16_t port, void *priv);
@@ -188,6 +201,8 @@ void pci_init(int type)
PCI = 1; PCI = 1;
elcr_reset();
io_sethandler(0x04d0, 0x0002, elcr_read, NULL, NULL, elcr_write, NULL, NULL, NULL); io_sethandler(0x04d0, 0x0002, elcr_read, NULL, NULL, elcr_write, NULL, NULL, NULL);
if (type == PCI_CONFIG_TYPE_1) if (type == PCI_CONFIG_TYPE_1)

View File

@@ -1,3 +1,5 @@
void elcr_reset(void);
void pci_init(int type); void pci_init(int type);
void pci_slot(int card); void pci_slot(int card);
void pci_add_specific(int card, uint8_t (*read)(int func, int addr, void *priv), void (*write)(int func, int addr, uint8_t val, void *priv), void *priv); void pci_add_specific(int card, uint8_t (*read)(int func, int addr, void *priv), void (*write)(int func, int addr, uint8_t val, void *priv), void *priv);

View File

@@ -169,6 +169,8 @@ void trc_reset(uint8_t val)
port_92_reset(); port_92_reset();
keyboard_at_reset(); keyboard_at_reset();
elcr_reset();
} }
resetx86(); resetx86();
} }