if (!pcibios_assign_all_busses()) in parent fixup

Pete Zaitcev zaitcev at redhat.com
Fri Apr 13 21:57:28 EDT 2007


Hi, Dominik:

Hope you're the right person to ask. I am wondering if this check is
really necessary:

static void __devinit pci_fixup_parent_subordinate_busnr(struct pci_bus *child, int max)
{
	struct pci_bus *parent = child->parent;

	/* Attempts to fix that up are really dangerous unless
	   we're going to re-assign all bus numbers. */
	if (!pcibios_assign_all_busses())
		return;
......

The problem is, Jay (on cc:) apparently has a laptop where a fixup is
necessary, and he would like to run it without pci=assign_buses
(have I got it right?).

This is what happens normally (actually, a current backport from
mainline to our 2.6.9 codebase, but same logic):

[root at postoak]# lspci -v | grep sub
	Bus: primary=00, secondary=01, subordinate=01, sec-latency=0
	Bus: primary=00, secondary=0a, subordinate=0a, sec-latency=32
	Bus: primary=0a, secondary=0b, subordinate=0e, sec-latency=176

Obviously the second subordinate 0x0a is too small. With the check
removed, Cardbus works:

[root at pinoak]# lspci -v |grep sub
       Bus: primary=00, secondary=01, subordinate=01, sec-latency=0
       Bus: primary=00, secondary=0a, subordinate=0e, sec-latency=32
       Bus: primary=0a, secondary=0b, subordinate=0e, sec-latency=176

I thought about this, and perhaps Jay is right. If we see such a blatant
problem, there's no other way but force the subordinate number, right?

-- Pete

P.S. I'm adding Kristen because apparently she was poking at bus
numbers last.



More information about the linux-pcmcia mailing list