Hi All,
kdb shows proc_ide_create() stuck in a loop when booting on a Compaq
Armada 7730MT while attached to the docking station.
This is a unique IDE hardware setup. Channel ide0's controller is in
the laptop, while ide1 is a separate controller (pci device) in the
docking station and is not always present.
This seems to be triggering a bug in ide-proc.c:
void proc_ide_create(void)
{
#ifdef CONFIG_BLK_DEV_IDEPCI
ide_pci_host_proc_t *p = ide_pci_host_proc_list;
#endif /* CONFIG_BLK_DEV_IDEPCI */
proc_ide_root = proc_mkdir("ide", 0);
if (!proc_ide_root) return;
create_proc_ide_interfaces();
create_proc_read_entry("drivers", 0, proc_ide_root,
proc_ide_read_drivers, NULL);
#ifdef CONFIG_BLK_DEV_IDEPCI
while (p != NULL) <------------------- INFINITE LOOP HERE
{
if (p->name != NULL && p->set == 1 && p->get_info != NULL)
{
p->parent = proc_ide_root;
create_proc_info_entry(p->name, 0, p->parent,
p->get_info);
p->set = 2;
}
p = p->next;
}
#endif /* CONFIG_BLK_DEV_IDEPCI */
}
I'm not sure if the problem is in the loop or bad data being setup
before it starts.
Assistance fixing it would be appreciated.
Regards,
Jeremy Jackson
Hi,
(watch crossposting when replying all)
I'm hoping to reach the maintainer of the Linux IDE driver for the
Compaq TriFlex controller. I have a problem with this driver when used
with a Compaq Armada 7730MT while docked in the base station.
The driver appears to only support one triflex controller, due to a
missing check (that other chipset drivers have) that should prevent it
from registering a /proc interface more than once. The result is that
it hangs on boot in proc_ide_create() in an infinite loop.
triflex.c:
static unsigned int __init init_chipset_triflex(struct pci_dev *dev,
const char *name)
{
#ifdef CONFIG_PROC_FS
ide_pci_register_host_proc(&triflex_proc);
#endif
return 0;
}
It also appears that triflex_get_info() doesn't support more that one
controller.
I won't go into more detail until I can establish who might care :)
Regards,
Jeremy Jackson