[PATCH] Re: Kernel freeze on boot (.123-.125) in IDE init

Richard Lyons (rick@powerup.com.au)
Sat, 24 Oct 1998 18:02:16 +1000 (EST)


This works for me. It seems that the PnP init routines in the Asus
BIOS don't allocate an address for the Promise BIOS (I'm assuming this
is how it works, PnP is a mystery to me). When the kernel enables
the Promise BIOS, it gets mapped somewhere that confuses the hell
out of the kernel, or overlays something vital. I played around
with auto-relocation, but decided simplicity is a virtue, so if
there's no address for the BIOS, it doesn't get enabled.

diff -rc linux-2.1.125/drivers/block/ide-pci.c linux/drivers/block/ide-pci.c
*** linux-2.1.125/drivers/block/ide-pci.c Tue Sep 29 04:09:52 1998
--- linux/drivers/block/ide-pci.c Sat Oct 24 16:40:44 1998
***************
*** 158,177 ****
*/
__initfunc(static unsigned int ide_special_settings (struct pci_dev *dev, const char *name))
{
- unsigned int addressbios = 0;
-
- pci_read_config_dword(dev, PCI_ROM_ADDRESS, &addressbios);
-
switch(dev->device) {
case PCI_DEVICE_ID_ARTOP_ATP850UF:
case PCI_DEVICE_ID_PROMISE_20246:
! pci_write_config_byte(dev, PCI_ROM_ADDRESS, PCI_ROM_ADDRESS_ENABLE);
! printk("%s: ROM enabled ", name);
!
! if (!addressbios) {
! printk("but no address\n");
! } else {
! printk("at 0x%08x\n", addressbios);
}

if ((dev->class >> 8) == PCI_CLASS_STORAGE_RAID) {
--- 158,171 ----
*/
__initfunc(static unsigned int ide_special_settings (struct pci_dev *dev, const char *name))
{
switch(dev->device) {
case PCI_DEVICE_ID_ARTOP_ATP850UF:
case PCI_DEVICE_ID_PROMISE_20246:
! if (dev->rom_address) {
! pci_write_config_dword(dev, PCI_ROM_ADDRESS,
! dev->rom_address | PCI_ROM_ADDRESS_ENABLE);
! printk("%s: ROM enabled at 0x%08lx\n",
! name, dev->rom_address);
}

if ((dev->class >> 8) == PCI_CLASS_STORAGE_RAID) {

Cheers,
Rick.

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/