Fixed Cacodemon345's OHCI mess and implemented proper OHCI IRQ updating, fixes the Gigabyte GA-5AX POST.
This commit is contained in:
@@ -906,6 +906,7 @@ ali5237_write(int func, int addr, uint8_t val, void *priv)
|
||||
|
||||
case 0x0c: /* Cache Line Size */
|
||||
case 0x0d: /* Latency Timer */
|
||||
dev->usb_conf[addr] = val;
|
||||
break;
|
||||
|
||||
case 0x3c: /* Interrupt Line Register */
|
||||
@@ -1430,14 +1431,14 @@ ali7101_read(int func, int addr, void *priv)
|
||||
}
|
||||
|
||||
static void
|
||||
ali5237_usb_raise_interrupt(usb_t* usb, void *priv)
|
||||
ali5237_usb_update_interrupt(usb_t* usb, void *priv)
|
||||
{
|
||||
ali1543_t *dev = (ali1543_t *) priv;
|
||||
|
||||
if (!dev->usb_dev_enable)
|
||||
return;
|
||||
|
||||
pci_set_irq(dev->usb_slot, PCI_INTA);
|
||||
if (usb->irq_level)
|
||||
pci_set_mirq(4, !!(dev->pci_conf[0x74] & 0x10));
|
||||
else
|
||||
pci_clear_mirq(4, !!(dev->pci_conf[0x74] & 0x10));
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1590,10 +1591,10 @@ ali1543_init(const device_t *info)
|
||||
dev->smbus = device_add(&ali7101_smbus_device);
|
||||
|
||||
/* USB */
|
||||
dev->usb_params.parent_priv = dev;
|
||||
dev->usb_params.smi_handle = NULL;
|
||||
dev->usb_params.raise_interrupt = ali5237_usb_raise_interrupt;
|
||||
dev->usb = device_add_parameters(&usb_device, &dev->usb_params);
|
||||
dev->usb_params.parent_priv = dev;
|
||||
dev->usb_params.smi_handle = NULL;
|
||||
dev->usb_params.update_interrupt = ali5237_usb_update_interrupt;
|
||||
dev->usb = device_add_parameters(&usb_device, &dev->usb_params);
|
||||
|
||||
dev->type = info->local & 0xff;
|
||||
dev->offset = (info->local >> 8) & 0x7f;
|
||||
|
||||
@@ -1427,11 +1427,14 @@ piix_fast_off_count(void *priv)
|
||||
}
|
||||
|
||||
static void
|
||||
piix_usb_raise_interrupt(usb_t* usb, void *priv)
|
||||
piix_usb_update_interrupt(usb_t* usb, void *priv)
|
||||
{
|
||||
piix_t *dev = (piix_t *) priv;
|
||||
|
||||
pci_set_irq(dev->pci_slot, PCI_INTD);
|
||||
if (usb->irq_level)
|
||||
pci_set_irq(dev->pci_slot, PCI_INTD);
|
||||
else
|
||||
pci_clear_irq(dev->pci_slot, PCI_INTD);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1579,10 +1582,10 @@ piix_init(const device_t *info)
|
||||
}
|
||||
|
||||
if (dev->type >= 3) {
|
||||
dev->usb_params.parent_priv = dev;
|
||||
dev->usb_params.smi_handle = NULL;
|
||||
dev->usb_params.raise_interrupt = piix_usb_raise_interrupt;
|
||||
dev->usb = device_add_parameters(&usb_device, &dev->usb_params);
|
||||
dev->usb_params.parent_priv = dev;
|
||||
dev->usb_params.smi_handle = NULL;
|
||||
dev->usb_params.update_interrupt = piix_usb_update_interrupt;
|
||||
dev->usb = device_add_parameters(&usb_device, &dev->usb_params);
|
||||
}
|
||||
|
||||
if (dev->type > 3) {
|
||||
|
||||
@@ -641,7 +641,7 @@ pci_isa_bridge_read(int func, int addr, void *priv)
|
||||
}
|
||||
|
||||
static void
|
||||
sis_5571_usb_raise_interrupt(usb_t* usb, void* priv)
|
||||
sis_5571_usb_update_interrupt(usb_t* usb, void* priv)
|
||||
{
|
||||
sis_5571_t *dev = (sis_5571_t *) priv;
|
||||
|
||||
@@ -655,11 +655,17 @@ sis_5571_usb_raise_interrupt(usb_t* usb, void* priv)
|
||||
case 0x0d:
|
||||
break;
|
||||
default:
|
||||
picint(1 << dev->pci_conf_sb[0][0x68] & 0x0F);
|
||||
if (usb->irq_level)
|
||||
picint(1 << dev->pci_conf_sb[0][0x68] & 0x0f);
|
||||
else
|
||||
picintc(1 << dev->pci_conf_sb[0][0x68] & 0x0f);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
pci_set_irq(dev->sb_pci_slot, PCI_INTA);
|
||||
if (usb->irq_level)
|
||||
pci_set_irq(dev->sb_pci_slot, PCI_INTA);
|
||||
else
|
||||
pci_clear_irq(dev->sb_pci_slot, PCI_INTA);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -754,10 +760,10 @@ sis_5571_init(const device_t *info)
|
||||
dev->ide_drive[1] = device_add_inst(&sff8038i_device, 2);
|
||||
|
||||
/* USB */
|
||||
dev->usb_params.parent_priv = dev;
|
||||
dev->usb_params.raise_interrupt = sis_5571_usb_raise_interrupt;
|
||||
dev->usb_params.smi_handle = sis_5571_usb_handle_smi;
|
||||
dev->usb = device_add_parameters(&usb_device, &dev->usb_params);
|
||||
dev->usb_params.parent_priv = dev;
|
||||
dev->usb_params.update_interrupt = sis_5571_usb_update_interrupt;
|
||||
dev->usb_params.smi_handle = sis_5571_usb_handle_smi;
|
||||
dev->usb = device_add_parameters(&usb_device, &dev->usb_params);
|
||||
|
||||
sis_5571_reset(dev);
|
||||
|
||||
|
||||
@@ -875,11 +875,14 @@ stpc_setup(stpc_t *dev)
|
||||
}
|
||||
|
||||
static void
|
||||
stpc_usb_raise_interrupt(usb_t* usb, void* priv)
|
||||
stpc_usb_update_interrupt(usb_t* usb, void* priv)
|
||||
{
|
||||
stpc_t *dev = (stpc_t *) priv;
|
||||
|
||||
pci_set_irq(dev->usb_slot, PCI_INTA);
|
||||
if (usb->irq_level)
|
||||
pci_set_irq(dev->usb_slot, PCI_INTA);
|
||||
else
|
||||
pci_clear_irq(dev->usb_slot, PCI_INTA);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -907,9 +910,9 @@ stpc_init(const device_t *info)
|
||||
pci_add_card(PCI_ADD_NORTHBRIDGE, stpc_nb_read, stpc_nb_write, dev);
|
||||
dev->ide_slot = pci_add_card(PCI_ADD_SOUTHBRIDGE, stpc_isab_read, stpc_isab_write, dev);
|
||||
if (dev->local == STPC_ATLAS) {
|
||||
dev->usb_params.smi_handle = NULL;
|
||||
dev->usb_params.raise_interrupt = stpc_usb_raise_interrupt;
|
||||
dev->usb_params.parent_priv = dev;
|
||||
dev->usb_params.smi_handle = NULL;
|
||||
dev->usb_params.update_interrupt = stpc_usb_update_interrupt;
|
||||
dev->usb_params.parent_priv = dev;
|
||||
|
||||
dev->ide_slot = pci_add_card(PCI_ADD_SOUTHBRIDGE, stpc_ide_read, stpc_ide_write, dev);
|
||||
dev->usb = device_add_parameters(&usb_device, &dev->usb_params);
|
||||
|
||||
Reference in New Issue
Block a user