diff options
author | Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> | 2008-06-19 23:07:08 -0400 |
---|---|---|
committer | Jesse Barnes <jbarnes@virtuousgeek.org> | 2008-06-27 16:00:43 -0400 |
commit | c4635eb06af700820d658a163f06aff12e17cfb2 (patch) | |
tree | 97bae8af21e7dc26374de8d9ed45e9f112b7de5a /drivers/pci/hotplug/pciehp.h | |
parent | e4ec7a00ed30429030112e5591cf3138645727c2 (diff) |
pciehp: fix interrupt initialization
Current pciehp driver's intialization sequence is as follows:
(1) initialize controller data structure
(2) install interrupt handler
(3) enable software notification
(4) initialize controller specific slot data structure
(5) initialize generic slot data structure and register it to pci hotplug core
The interrupt handler of pciehp assumes that controller specific slot
data structure is already initialized. However, it is installed at (2)
before initializing controller specific slot data structure at
(4). Because of this, pciehp driver cannot handle the following cases
properly.
- If devices that shares IRQ with pciehp raise interrupts between (2) and (4).
- If hotplug events (e.g. MRL open) happen between (3) and (4).
We already have a workaround for this problem ("pciehp: fix NULL
dereference in interrupt handler: dbd79aed1aea2bece0bf43cc2ff3b2f9baf48a08).
But we still need fundamental fix.
This patch fix the problem by changing the initilization sequence as follows:
(1) initialize controller data structure
(2) initialize controller specific slot data structure
(3) install interrupt handler
(4) enable software notification
(5) initialize generic slot data structure and register it to pci hotplug core
Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Acked-by: Alex Chiang <achiang@hp.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Diffstat (limited to 'drivers/pci/hotplug/pciehp.h')
-rw-r--r-- | drivers/pci/hotplug/pciehp.h | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/pci/hotplug/pciehp.h b/drivers/pci/hotplug/pciehp.h index 8492fab800cc..d17233ae06f5 100644 --- a/drivers/pci/hotplug/pciehp.h +++ b/drivers/pci/hotplug/pciehp.h | |||
@@ -43,6 +43,7 @@ extern int pciehp_poll_mode; | |||
43 | extern int pciehp_poll_time; | 43 | extern int pciehp_poll_time; |
44 | extern int pciehp_debug; | 44 | extern int pciehp_debug; |
45 | extern int pciehp_force; | 45 | extern int pciehp_force; |
46 | extern int pciehp_slot_with_bus; | ||
46 | extern struct workqueue_struct *pciehp_wq; | 47 | extern struct workqueue_struct *pciehp_wq; |
47 | 48 | ||
48 | #define dbg(format, arg...) \ | 49 | #define dbg(format, arg...) \ |
@@ -156,10 +157,10 @@ extern u8 pciehp_handle_power_fault(struct slot *p_slot); | |||
156 | extern int pciehp_configure_device(struct slot *p_slot); | 157 | extern int pciehp_configure_device(struct slot *p_slot); |
157 | extern int pciehp_unconfigure_device(struct slot *p_slot); | 158 | extern int pciehp_unconfigure_device(struct slot *p_slot); |
158 | extern void pciehp_queue_pushbutton_work(struct work_struct *work); | 159 | extern void pciehp_queue_pushbutton_work(struct work_struct *work); |
159 | int pcie_init(struct controller *ctrl, struct pcie_device *dev); | 160 | struct controller *pcie_init(struct pcie_device *dev); |
160 | int pciehp_enable_slot(struct slot *p_slot); | 161 | int pciehp_enable_slot(struct slot *p_slot); |
161 | int pciehp_disable_slot(struct slot *p_slot); | 162 | int pciehp_disable_slot(struct slot *p_slot); |
162 | int pcie_init_hardware_part2(struct controller *ctrl, struct pcie_device *dev); | 163 | int pcie_enable_notification(struct controller *ctrl); |
163 | 164 | ||
164 | static inline struct slot *pciehp_find_slot(struct controller *ctrl, u8 device) | 165 | static inline struct slot *pciehp_find_slot(struct controller *ctrl, u8 device) |
165 | { | 166 | { |