PCI: pciehp: remove slot_list field
Since PCIe downstream port has only one slot at most, we don't need 'slot_list' linked list to manage multiple slots under the port. Acked-by: Alex Chiang <achiang@hp.com> Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
This commit is contained in:
committed by
Jesse Barnes
parent
e2d4304b7d
commit
8720d27dab
@ -99,65 +99,59 @@ static void release_slot(struct hotplug_slot *hotplug_slot)
|
||||
kfree(hotplug_slot);
|
||||
}
|
||||
|
||||
static int init_slots(struct controller *ctrl)
|
||||
static int init_slot(struct controller *ctrl)
|
||||
{
|
||||
struct slot *slot;
|
||||
struct hotplug_slot *hotplug_slot;
|
||||
struct hotplug_slot_info *info;
|
||||
struct slot *slot = ctrl->slot;
|
||||
struct hotplug_slot *hotplug = NULL;
|
||||
struct hotplug_slot_info *info = NULL;
|
||||
char name[SLOT_NAME_SIZE];
|
||||
int retval = -ENOMEM;
|
||||
|
||||
list_for_each_entry(slot, &ctrl->slot_list, slot_list) {
|
||||
hotplug_slot = kzalloc(sizeof(*hotplug_slot), GFP_KERNEL);
|
||||
if (!hotplug_slot)
|
||||
goto error;
|
||||
hotplug = kzalloc(sizeof(*hotplug), GFP_KERNEL);
|
||||
if (!hotplug)
|
||||
goto out;
|
||||
|
||||
info = kzalloc(sizeof(*info), GFP_KERNEL);
|
||||
if (!info)
|
||||
goto error_hpslot;
|
||||
info = kzalloc(sizeof(*info), GFP_KERNEL);
|
||||
if (!info)
|
||||
goto out;
|
||||
|
||||
/* register this slot with the hotplug pci core */
|
||||
hotplug_slot->info = info;
|
||||
hotplug_slot->private = slot;
|
||||
hotplug_slot->release = &release_slot;
|
||||
hotplug_slot->ops = &pciehp_hotplug_slot_ops;
|
||||
slot->hotplug_slot = hotplug_slot;
|
||||
snprintf(name, SLOT_NAME_SIZE, "%u", slot->number);
|
||||
/* register this slot with the hotplug pci core */
|
||||
hotplug->info = info;
|
||||
hotplug->private = slot;
|
||||
hotplug->release = &release_slot;
|
||||
hotplug->ops = &pciehp_hotplug_slot_ops;
|
||||
slot->hotplug_slot = hotplug;
|
||||
snprintf(name, SLOT_NAME_SIZE, "%u", slot->number);
|
||||
|
||||
ctrl_dbg(ctrl, "Registering domain:bus:dev=%04x:%02x:%02x "
|
||||
"hp_slot=%x sun=%x slot_device_offset=%x\n",
|
||||
pci_domain_nr(ctrl->pci_dev->subordinate),
|
||||
slot->bus, slot->device, slot->hp_slot, slot->number,
|
||||
ctrl->slot_device_offset);
|
||||
retval = pci_hp_register(hotplug_slot,
|
||||
ctrl->pci_dev->subordinate,
|
||||
slot->device,
|
||||
name);
|
||||
if (retval) {
|
||||
ctrl_err(ctrl, "pci_hp_register failed with error %d\n",
|
||||
retval);
|
||||
goto error_info;
|
||||
}
|
||||
get_power_status(hotplug_slot, &info->power_status);
|
||||
get_attention_status(hotplug_slot, &info->attention_status);
|
||||
get_latch_status(hotplug_slot, &info->latch_status);
|
||||
get_adapter_status(hotplug_slot, &info->adapter_status);
|
||||
ctrl_dbg(ctrl, "Registering domain:bus:dev=%04x:%02x:%02x "
|
||||
"hp_slot=%x sun=%x slot_device_offset=%x\n",
|
||||
pci_domain_nr(ctrl->pci_dev->subordinate),
|
||||
slot->bus, slot->device, slot->hp_slot, slot->number,
|
||||
ctrl->slot_device_offset);
|
||||
retval = pci_hp_register(hotplug,
|
||||
ctrl->pci_dev->subordinate,
|
||||
slot->device,
|
||||
name);
|
||||
if (retval) {
|
||||
ctrl_err(ctrl,
|
||||
"pci_hp_register failed with error %d\n", retval);
|
||||
goto out;
|
||||
}
|
||||
get_power_status(hotplug, &info->power_status);
|
||||
get_attention_status(hotplug, &info->attention_status);
|
||||
get_latch_status(hotplug, &info->latch_status);
|
||||
get_adapter_status(hotplug, &info->adapter_status);
|
||||
out:
|
||||
if (retval) {
|
||||
kfree(info);
|
||||
kfree(hotplug);
|
||||
}
|
||||
|
||||
return 0;
|
||||
error_info:
|
||||
kfree(info);
|
||||
error_hpslot:
|
||||
kfree(hotplug_slot);
|
||||
error:
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void cleanup_slots(struct controller *ctrl)
|
||||
static void cleanup_slot(struct controller *ctrl)
|
||||
{
|
||||
struct slot *slot;
|
||||
list_for_each_entry(slot, &ctrl->slot_list, slot_list)
|
||||
pci_hp_deregister(slot->hotplug_slot);
|
||||
pci_hp_deregister(ctrl->slot->hotplug_slot);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -295,7 +289,7 @@ static int pciehp_probe(struct pcie_device *dev)
|
||||
{
|
||||
int rc;
|
||||
struct controller *ctrl;
|
||||
struct slot *t_slot;
|
||||
struct slot *slot;
|
||||
u8 value;
|
||||
struct pci_dev *pdev = dev->port;
|
||||
|
||||
@ -314,7 +308,7 @@ static int pciehp_probe(struct pcie_device *dev)
|
||||
set_service_data(dev, ctrl);
|
||||
|
||||
/* Setup the slot information structures */
|
||||
rc = init_slots(ctrl);
|
||||
rc = init_slot(ctrl);
|
||||
if (rc) {
|
||||
if (rc == -EBUSY)
|
||||
ctrl_warn(ctrl, "Slot already registered by another "
|
||||
@ -332,15 +326,15 @@ static int pciehp_probe(struct pcie_device *dev)
|
||||
}
|
||||
|
||||
/* Check if slot is occupied */
|
||||
t_slot = pciehp_find_slot(ctrl, ctrl->slot_device_offset);
|
||||
t_slot->hpc_ops->get_adapter_status(t_slot, &value);
|
||||
slot = ctrl->slot;
|
||||
slot->hpc_ops->get_adapter_status(slot, &value);
|
||||
if (value) {
|
||||
if (pciehp_force)
|
||||
pciehp_enable_slot(t_slot);
|
||||
pciehp_enable_slot(slot);
|
||||
} else {
|
||||
/* Power off slot if not occupied */
|
||||
if (POWER_CTRL(ctrl)) {
|
||||
rc = t_slot->hpc_ops->power_off_slot(t_slot);
|
||||
rc = slot->hpc_ops->power_off_slot(slot);
|
||||
if (rc)
|
||||
goto err_out_free_ctrl_slot;
|
||||
}
|
||||
@ -349,7 +343,7 @@ static int pciehp_probe(struct pcie_device *dev)
|
||||
return 0;
|
||||
|
||||
err_out_free_ctrl_slot:
|
||||
cleanup_slots(ctrl);
|
||||
cleanup_slot(ctrl);
|
||||
err_out_release_ctlr:
|
||||
ctrl->hpc_ops->release_ctlr(ctrl);
|
||||
err_out_none:
|
||||
@ -360,7 +354,7 @@ static void pciehp_remove (struct pcie_device *dev)
|
||||
{
|
||||
struct controller *ctrl = get_service_data(dev);
|
||||
|
||||
cleanup_slots(ctrl);
|
||||
cleanup_slot(ctrl);
|
||||
ctrl->hpc_ops->release_ctlr(ctrl);
|
||||
}
|
||||
|
||||
@ -376,20 +370,20 @@ static int pciehp_resume (struct pcie_device *dev)
|
||||
dev_info(&dev->device, "%s ENTRY\n", __func__);
|
||||
if (pciehp_force) {
|
||||
struct controller *ctrl = get_service_data(dev);
|
||||
struct slot *t_slot;
|
||||
struct slot *slot;
|
||||
u8 status;
|
||||
|
||||
/* reinitialize the chipset's event detection logic */
|
||||
pcie_enable_notification(ctrl);
|
||||
|
||||
t_slot = pciehp_find_slot(ctrl, ctrl->slot_device_offset);
|
||||
slot = ctrl->slot;
|
||||
|
||||
/* Check if slot is occupied */
|
||||
t_slot->hpc_ops->get_adapter_status(t_slot, &status);
|
||||
slot->hpc_ops->get_adapter_status(slot, &status);
|
||||
if (status)
|
||||
pciehp_enable_slot(t_slot);
|
||||
pciehp_enable_slot(slot);
|
||||
else
|
||||
pciehp_disable_slot(t_slot);
|
||||
pciehp_disable_slot(slot);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user