PCI: pciehp: Rename duplicate slot name N as N-1, N-2, N-M...
Commit3800345f72
(pciehp: fix slot name) introduces the pciehp_slot_with_bus module parameter, which was intended to help work around broken firmware that assigns the same name to multiple slots. Commit9e4f2e8d4d
(pciehp: add message about pciehp_slot_with_bus option) tells the user to use the above parameter in the event of a name collision. This approach is sub-optimal because it requires too much work from the user. Instead, let's rename the slot on behalf of the user. If firmware assigns the name N to multiple slots, then: The first registered slot is assigned N The second registered slot is assigned N-1 The third registered slot is assigned N-2 The Mth registered slot becomes N-M In the event we overflow the slot->name parameter, we report an error to the user. This is a temporary fix until the entire PCI core can be reworked such that individual drivers no longer have to manage their own slot names. Tested-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> Acked-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> Signed-off-by: Alex Chiang <achiang@hp.com> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
This commit is contained in:
committed by
Jesse Barnes
parent
6a55617ed5
commit
167e782e30
@@ -1030,15 +1030,6 @@ static void pcie_shutdown_notification(struct controller *ctrl)
|
||||
pciehp_free_irq(ctrl);
|
||||
}
|
||||
|
||||
static void make_slot_name(struct slot *slot)
|
||||
{
|
||||
if (pciehp_slot_with_bus)
|
||||
snprintf(slot->name, SLOT_NAME_SIZE, "%04d_%04d",
|
||||
slot->bus, slot->number);
|
||||
else
|
||||
snprintf(slot->name, SLOT_NAME_SIZE, "%d", slot->number);
|
||||
}
|
||||
|
||||
static int pcie_init_slot(struct controller *ctrl)
|
||||
{
|
||||
struct slot *slot;
|
||||
@@ -1053,7 +1044,7 @@ static int pcie_init_slot(struct controller *ctrl)
|
||||
slot->device = ctrl->slot_device_offset + slot->hp_slot;
|
||||
slot->hpc_ops = ctrl->hpc_ops;
|
||||
slot->number = ctrl->first_slot;
|
||||
make_slot_name(slot);
|
||||
snprintf(slot->name, SLOT_NAME_SIZE, "%d", slot->number);
|
||||
mutex_init(&slot->lock);
|
||||
INIT_DELAYED_WORK(&slot->work, pciehp_queue_pushbutton_work);
|
||||
list_add(&slot->slot_list, &ctrl->slot_list);
|
||||
|
Reference in New Issue
Block a user