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:
@@ -57,6 +57,9 @@ sermouse_timer(void *priv)
|
||||
|
||||
ms->delay = 0;
|
||||
|
||||
if (ms->pos == -1)
|
||||
{
|
||||
ms->pos = 0;
|
||||
switch(ms->type) {
|
||||
case SERMOUSE_TYPE_MICROSOFT:
|
||||
/* This identifies a two-button Microsoft Serial mouse. */
|
||||
@@ -73,6 +76,7 @@ sermouse_timer(void *priv)
|
||||
/* No action needed. */
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -83,6 +87,7 @@ sermouse_poll(int x, int y, int z, int b, void *priv)
|
||||
uint8_t buff[16];
|
||||
int len;
|
||||
|
||||
if (!(serial_ier(0) & 1)) return(1);
|
||||
if (!x && !y && b == ms->oldb) return(1);
|
||||
|
||||
ms->oldb = b;
|
||||
@@ -142,9 +147,12 @@ sermouse_poll(int x, int y, int z, int b, void *priv)
|
||||
pclog(" ] (%d)\n", len);
|
||||
#endif
|
||||
|
||||
if (!(serial_mctrl(0) & 0x10))
|
||||
{
|
||||
/* Send the packet to the bottom-half of the attached port. */
|
||||
for (b=0; b<len; b++)
|
||||
serial_write_fifo(ms->serial, buff[b], 1);
|
||||
}
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
15
src/pci.c
15
src/pci.c
@@ -75,6 +75,19 @@ uint8_t elcr_read(uint16_t port, void *priv)
|
||||
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);
|
||||
uint8_t pci_type2_read(uint16_t port, void *priv);
|
||||
|
||||
@@ -188,6 +201,8 @@ void pci_init(int type)
|
||||
|
||||
PCI = 1;
|
||||
|
||||
elcr_reset();
|
||||
|
||||
io_sethandler(0x04d0, 0x0002, elcr_read, NULL, NULL, elcr_write, NULL, NULL, NULL);
|
||||
|
||||
if (type == PCI_CONFIG_TYPE_1)
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
void elcr_reset(void);
|
||||
|
||||
void pci_init(int type);
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user