ALi M1543(C) IDE fixes, fixes Windows 95 IDE driver.
This commit is contained in:
@@ -197,6 +197,7 @@ ali1533_write(int func, int addr, uint8_t val, void *priv)
|
|||||||
case 0x44: /* Set IRQ Line for Primary IDE if it's on native mode */
|
case 0x44: /* Set IRQ Line for Primary IDE if it's on native mode */
|
||||||
dev->pci_conf[addr] = val & 0xdf;
|
dev->pci_conf[addr] = val & 0xdf;
|
||||||
soft_reset_pci = !!(val & 0x80);
|
soft_reset_pci = !!(val & 0x80);
|
||||||
|
pci_set_mirq_level(PCI_MIRQ0, !(val & 0x10));
|
||||||
pci_set_mirq_level(PCI_MIRQ2, !(val & 0x10));
|
pci_set_mirq_level(PCI_MIRQ2, !(val & 0x10));
|
||||||
ali1543_log("INTAJ = IRQ %i\n", ali1533_irq_routing[val & 0x0f]);
|
ali1543_log("INTAJ = IRQ %i\n", ali1533_irq_routing[val & 0x0f]);
|
||||||
pci_set_mirq_routing(PCI_MIRQ0, ali1533_irq_routing[val & 0x0f]);
|
pci_set_mirq_routing(PCI_MIRQ0, ali1533_irq_routing[val & 0x0f]);
|
||||||
@@ -417,6 +418,7 @@ ali1533_write(int func, int addr, uint8_t val, void *priv)
|
|||||||
|
|
||||||
case 0x75: /* Set IRQ Line for Secondary IDE if it's on native mode */
|
case 0x75: /* Set IRQ Line for Secondary IDE if it's on native mode */
|
||||||
dev->pci_conf[addr] = val & 0x1f;
|
dev->pci_conf[addr] = val & 0x1f;
|
||||||
|
pci_set_mirq_level(PCI_MIRQ1, !(val & 0x10));
|
||||||
pci_set_mirq_level(PCI_MIRQ3, !(val & 0x10));
|
pci_set_mirq_level(PCI_MIRQ3, !(val & 0x10));
|
||||||
ali1543_log("INTBJ = IRQ %i\n", ali1533_irq_routing[val & 0x0f]);
|
ali1543_log("INTBJ = IRQ %i\n", ali1533_irq_routing[val & 0x0f]);
|
||||||
pci_set_mirq_routing(PCI_MIRQ1, ali1533_irq_routing[val & 0x0f]);
|
pci_set_mirq_routing(PCI_MIRQ1, ali1533_irq_routing[val & 0x0f]);
|
||||||
@@ -704,7 +706,7 @@ ali5229_chip_reset(ali1543_t *dev)
|
|||||||
ali5229_write(0, 0x09, 0xfa, dev);
|
ali5229_write(0, 0x09, 0xfa, dev);
|
||||||
ali5229_write(0, 0x52, 0x00, dev);
|
ali5229_write(0, 0x52, 0x00, dev);
|
||||||
|
|
||||||
ali5229_write(0, 0x50, 0x00, dev);
|
ali5229_write(0, 0x50, 0x02, dev);
|
||||||
|
|
||||||
sff_set_slot(dev->ide_controller[0], dev->ide_slot);
|
sff_set_slot(dev->ide_controller[0], dev->ide_slot);
|
||||||
sff_set_slot(dev->ide_controller[1], dev->ide_slot);
|
sff_set_slot(dev->ide_controller[1], dev->ide_slot);
|
||||||
@@ -717,7 +719,7 @@ static void
|
|||||||
ali5229_write(int func, int addr, uint8_t val, void *priv)
|
ali5229_write(int func, int addr, uint8_t val, void *priv)
|
||||||
{
|
{
|
||||||
ali1543_t *dev = (ali1543_t *) priv;
|
ali1543_t *dev = (ali1543_t *) priv;
|
||||||
ali1543_log("M5229: dev->ide_conf[%02x] = %02x\n", addr, val);
|
ali1543_log("M5229: [W] dev->ide_conf[%02x] = %02x\n", addr, val);
|
||||||
|
|
||||||
if (func > 0)
|
if (func > 0)
|
||||||
return;
|
return;
|
||||||
@@ -756,6 +758,10 @@ ali5229_write(int func, int addr, uint8_t val, void *priv)
|
|||||||
ali5229_ide_irq_handler(dev);
|
ali5229_ide_irq_handler(dev);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 0x0d: /* LT - Latency Timer */
|
||||||
|
dev->ide_conf[addr] = val;
|
||||||
|
break;
|
||||||
|
|
||||||
/* Primary Base Address */
|
/* Primary Base Address */
|
||||||
case 0x10:
|
case 0x10:
|
||||||
case 0x11:
|
case 0x11:
|
||||||
@@ -887,13 +893,15 @@ ali5229_read(int func, int addr, void *priv)
|
|||||||
if (dev->ide_dev_enable && (func == 0)) {
|
if (dev->ide_dev_enable && (func == 0)) {
|
||||||
ret = dev->ide_conf[addr];
|
ret = dev->ide_conf[addr];
|
||||||
if ((addr == 0x09) && !(dev->ide_conf[0x50] & 0x02))
|
if ((addr == 0x09) && !(dev->ide_conf[0x50] & 0x02))
|
||||||
ret &= 0x0f;
|
ret = (ret & 0x0f) | 0x80;
|
||||||
else if (addr == 0x50)
|
else if (addr == 0x50)
|
||||||
ret = (ret & 0xfe) | (dev->ide_dev_enable ? 0x01 : 0x00);
|
ret = (ret & 0xfe) | (dev->ide_dev_enable ? 0x01 : 0x00);
|
||||||
else if (addr == 0x75)
|
else if (addr == 0x75)
|
||||||
ret = ide_read_ali_75();
|
ret = ide_read_ali_75();
|
||||||
else if (addr == 0x76)
|
else if (addr == 0x76)
|
||||||
ret = ide_read_ali_76();
|
ret = ide_read_ali_76();
|
||||||
|
|
||||||
|
ali1543_log("M5229: [R] dev->ide_conf[%02x] = %02x\n", addr, ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
Reference in New Issue
Block a user