|
@@ -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;
|
|
|
-
|
|
|
- info = kzalloc(sizeof(*info), GFP_KERNEL);
|
|
|
- if (!info)
|
|
|
- goto error_hpslot;
|
|
|
-
|
|
|
- /* 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);
|
|
|
-
|
|
|
- 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);
|
|
|
+ hotplug = kzalloc(sizeof(*hotplug), GFP_KERNEL);
|
|
|
+ if (!hotplug)
|
|
|
+ goto out;
|
|
|
+
|
|
|
+ info = kzalloc(sizeof(*info), GFP_KERNEL);
|
|
|
+ if (!info)
|
|
|
+ goto out;
|
|
|
+
|
|
|
+ /* 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,
|
|
|
+ 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;
|
|
|
}
|