PCI: pciehp: Handle interrupts that happen during initialization.
Move the enabling of interrupts after all of the data structures are setup so that we can safely run the interrupt handler as soon as it is registered. Reviewed-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> Tested-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> Signed-off-by: Eric W. Biederman <ebiederm@aristanetworks.com> Signed-off-by: Jesse Barnes <jbarnes@hobbes.lan>
This commit is contained in:
committed by
Jesse Barnes
parent
1dec6b054d
commit
dbc7e1e567
@ -934,7 +934,7 @@ static void pcie_disable_notification(struct controller *ctrl)
|
||||
ctrl_warn(ctrl, "Cannot disable software notification\n");
|
||||
}
|
||||
|
||||
static int pcie_init_notification(struct controller *ctrl)
|
||||
int pcie_init_notification(struct controller *ctrl)
|
||||
{
|
||||
if (pciehp_request_irq(ctrl))
|
||||
return -1;
|
||||
@ -942,13 +942,17 @@ static int pcie_init_notification(struct controller *ctrl)
|
||||
pciehp_free_irq(ctrl);
|
||||
return -1;
|
||||
}
|
||||
ctrl->notification_enabled = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void pcie_shutdown_notification(struct controller *ctrl)
|
||||
{
|
||||
pcie_disable_notification(ctrl);
|
||||
pciehp_free_irq(ctrl);
|
||||
if (ctrl->notification_enabled) {
|
||||
pcie_disable_notification(ctrl);
|
||||
pciehp_free_irq(ctrl);
|
||||
ctrl->notification_enabled = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static int pcie_init_slot(struct controller *ctrl)
|
||||
@ -1110,13 +1114,8 @@ struct controller *pcie_init(struct pcie_device *dev)
|
||||
if (pcie_init_slot(ctrl))
|
||||
goto abort_ctrl;
|
||||
|
||||
if (pcie_init_notification(ctrl))
|
||||
goto abort_slot;
|
||||
|
||||
return ctrl;
|
||||
|
||||
abort_slot:
|
||||
pcie_cleanup_slot(ctrl);
|
||||
abort_ctrl:
|
||||
kfree(ctrl);
|
||||
abort:
|
||||
|
Reference in New Issue
Block a user