What is the difference between number and secondary in pci_bus?
All
In the structure of pci_bus.
There is number, primary, secondary and subordinate.
primary and subordinate are easy to understand, while the number and secondary confused me.
I think secondary means the current bus number.
Then what number stands for?
In pci_alloc_child_bus(),child->number = child->secondary = busnr;
So they are the same?
Then we need two different field?
I search the git log while find these code is imported as the first commit. So I don't see the history.
Signature · 2 lines
Richard Yang Help you, Help me
Bjorn Helgaas
maintainerQuoted 8 lines · Richard Yang
All
In the structure of
pci_bus.
There is number, primary, secondary and subordinate.primary and subordinate are easy to understand, while the number and secondary confused me.
Quoted 7 lines
I think secondary means the current bus number.
Then what number stands for?In
pci_alloc_child_bus(),child->number=child->secondary= busnr;
So they are the same?
Then we need two different field?
Good questions.
Primary, secondary, and subordinate are really properties of the upstream bridge, not the bus itself. If we had a struct pci_bridge, they would logically live there. Primary is the bus number of the upstream side of the bridge. Secondary is the bus number of the bridge's downstream side. The bridge forwards config transactions with bus numbers between secondary and subordinate to its downstream side.
The "number of primary/secondary bridge" comments in struct pci_bus are wrong -- they are bus numbers, not bridge numbers. And the "max number of subordinate buses" comment is not really right either. Subordinate is just the largest bus number forwarded by the bridge. As a consequence, that limits the number of buses in the downstream hierarchy.
I have no idea why we have both number and secondary in struct pci_bus. It seems like they should always be the same. It would be an interesting exercise to figure out if they're ever different.
Bjorn
Quoted 12 lines · Bjorn Helgaas
Quoted 11 lines · Richard Yang
All
In the structure of
pci_bus.
There is number, primary, secondary and subordinate.primary and subordinate are easy to understand, while the number and secondary confused me.
I think secondary means the current bus number.
Then what number stands for?
Quoted 6 lines
Quoted 4 lines
In
pci_alloc_child_bus(),child->number=child->secondary= busnr;
So they are the same?
Then we need two different field?Good questions.
Thanks for your response.
Quoted 11 lines
Primary, secondary, and subordinate are really properties of the upstream bridge, not the bus itself. If we had a struct
pci_bridge, they would logically live there. Primary is the bus number of the upstream side of the bridge. Secondary is the bus number of the bridge's downstream side. The bridge forwards config transactions with bus numbers between secondary and subordinate to its downstream side.The "number of primary/secondary bridge" comments in struct
pci_busare wrong -- they are bus numbers, not bridge numbers. And the "max
So do you think it is better to change "bridge" to "number"?
Quoted 4 lines
number of subordinate buses" comment is not really right either. Subordinate is just the largest bus number forwarded by the bridge. As a consequence, that limits the number of buses in the downstream hierarchy.
Yes, sounds it is not very exact. Or just "subordinate bus" is ok?
Quoted 5 lines
I have no idea why we have both number and secondary in struct
pci_bus. It seems like they should always be the same. It would be an interesting exercise to figure out if they're ever different.
Do you think add some printk() at the end of pci_scan_bridge() is a good place to test this?
If they are the same, could we remove one?
BTW, I tried git blame to search who add these two fields. Seems those code is imported by 1da177e, which is the start of the git system.
Quoted 1 line
Bjorn
Signature · 2 lines
Richard Yang Help you, Help me