Proper masking of VIA IDE registers
This commit is contained in:
@@ -170,8 +170,8 @@ pipc_reset_hard(void *priv)
|
||||
dev->ide_regs[0x34] = 0xc0;
|
||||
dev->ide_regs[0x3c] = 0x0e;
|
||||
|
||||
if (dev->local < VIA_PIPC_686A)
|
||||
dev->ide_regs[0x40] = 0x08;
|
||||
if (dev->local <= VIA_PIPC_586B)
|
||||
dev->ide_regs[0x40] = 0x04;
|
||||
dev->ide_regs[0x41] = 0x02;
|
||||
dev->ide_regs[0x42] = 0x09;
|
||||
dev->ide_regs[0x43] = (dev->local >= VIA_PIPC_686A) ? 0x0a : 0x3a;
|
||||
@@ -426,7 +426,7 @@ pipc_read(int func, int addr, void *priv)
|
||||
else if ((func <= (pm_func + 2)) && !(dev->pci_isa_regs[0x85] & ((func == (pm_func + 1)) ? 0x04 : 0x08))) /* AC97 / MC97 */
|
||||
ret = dev->ac97_regs[func - pm_func - 1][addr];
|
||||
|
||||
pipc_log("PIPC: read(%d, %02X) = %02X\n", func, addr, ret);
|
||||
if (func == 1) pipc_log("PIPC: read(%d, %02X) = %02X\n", func, addr, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -461,7 +461,7 @@ pipc_write(int func, int addr, uint8_t val, void *priv)
|
||||
if (func > dev->max_func)
|
||||
return;
|
||||
|
||||
pipc_log("PIPC: write(%d, %02X, %02X)\n", func, addr, val);
|
||||
if (func == 1) pipc_log("PIPC: write(%d, %02X, %02X)\n", func, addr, val);
|
||||
|
||||
if (func == 0) { /* PCI-ISA bridge */
|
||||
/* Read-only addresses */
|
||||
@@ -656,10 +656,37 @@ pipc_write(int func, int addr, uint8_t val, void *priv)
|
||||
break;
|
||||
|
||||
case 0x40:
|
||||
dev->ide_regs[0x40] = val;
|
||||
if (dev->local <= VIA_PIPC_586B) {
|
||||
dev->ide_regs[0x40] = val & 0x03;
|
||||
dev->ide_regs[0x40] |= 0x04;
|
||||
} else
|
||||
dev->ide_regs[0x40] = val & 0x0f;
|
||||
pipc_ide_handlers(dev);
|
||||
break;
|
||||
|
||||
case 0x50: case 0x52:
|
||||
if (dev->local <= VIA_PIPC_586B)
|
||||
dev->ide_regs[addr] = val & 0xe3;
|
||||
else if (dev->local <= VIA_PIPC_596B)
|
||||
dev->ide_regs[addr] = val & 0xeb;
|
||||
else if (dev->local <= VIA_PIPC_686A)
|
||||
dev->ide_regs[addr] = val & 0xef;
|
||||
else
|
||||
dev->ide_regs[addr] = val & 0xf7;
|
||||
break;
|
||||
case 0x51: case 0x53:
|
||||
if (dev->local <= VIA_PIPC_596B)
|
||||
dev->ide_regs[addr] = val & 0xe3;
|
||||
else if (dev->local <= VIA_PIPC_686A)
|
||||
dev->ide_regs[addr] = val & 0xe7;
|
||||
else
|
||||
dev->ide_regs[addr] = val & 0xf7;
|
||||
break;
|
||||
|
||||
case 0x61: case 0x69:
|
||||
dev->ide_regs[addr] = val & 0x0f;
|
||||
break;
|
||||
|
||||
default:
|
||||
dev->ide_regs[addr] = val;
|
||||
break;
|
||||
|
Reference in New Issue
Block a user