> > The 'unable to get irq 255' message is very suspicious -- I suspect that
> > something is putting -1 into a byte somewhere...
>
> I've narrowed this down to the function ide_setup_pci_device in the file
> ide-dma.c (kernel 2.1.70):
> --------
> __initfunc(static void ide_setup_pci_device (byte bus, byte fn, unsigned
> int bmiba, ide_pci_device_t *d))
> {
> unsigned int port, at_least_one_hwif_enabled = 0;
> unsigned short base = 0, ctl = 0;
> byte tmp = 0, pciirq = 0;
> ide_hwif_t *hwif;
>
> if (pcibios_read_config_byte(bus, fn, 0x3c, &pciirq))
> pciirq = 0; /* probe later if not set */
> for (port = 0; port <= 1; ++port) {
> ---------
> The pcibios_read_config_byte() call is returning PCIBIOS_SUCCESSFUL and
> putting 0xFF into pciirq. This ultimately causes a panic as the kernel
> cannot allocate IRQ 255 and thus cannot mount the root device.
>
> I'm not a PCI hacker; I don't know what the above call is supposed to
> return, or whether 0xFF is a valid error code that we are supposed to be
> checking for, or what. But the code above is currently broken.
The problem is that 255 means no interrupt line AFAIR. Bios should
initialize this field in all PCI headers. Try changing your BIOS settings
first. And checking the return value of pcibios_read_config_byte is
essentially useless, since this function is only allowed to return
success in theory (on my PC it does actually return other error codes).
Gabriel.