diff options
author | Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> | 2006-02-21 18:45:45 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-03-23 17:35:13 -0500 |
commit | f7391f5325ea744f0632f7ef39a90085162743ac (patch) | |
tree | a7368b2ca639211743ba7fbc0dab7a9efaea02b7 /drivers/pci/hotplug/shpchp.h | |
parent | 68c0b671491088d79611fa965bbf94b3bc0024a4 (diff) |
[PATCH] shpchp: event handling rework
The event handler of SHPCHP driver is unnecessarily very complex. In
addition, current event handler can only a fixed number of events at
the same time, and some of events would be lost if several number of
events happened at the same time.
This patch simplify the event handler by using 'work queue', and it
also fix the above-mentioned issue.
Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Signed-off-by: Kristen Carlson Accardi <kristen.c.accardi@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/pci/hotplug/shpchp.h')
-rw-r--r-- | drivers/pci/hotplug/shpchp.h | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/drivers/pci/hotplug/shpchp.h b/drivers/pci/hotplug/shpchp.h index 6e1fb1bdc243..87db07cfebdf 100644 --- a/drivers/pci/hotplug/shpchp.h +++ b/drivers/pci/hotplug/shpchp.h | |||
@@ -46,6 +46,7 @@ | |||
46 | extern int shpchp_poll_mode; | 46 | extern int shpchp_poll_mode; |
47 | extern int shpchp_poll_time; | 47 | extern int shpchp_poll_time; |
48 | extern int shpchp_debug; | 48 | extern int shpchp_debug; |
49 | extern struct workqueue_struct *shpchp_wq; | ||
49 | 50 | ||
50 | /*#define dbg(format, arg...) do { if (shpchp_debug) printk(KERN_DEBUG "%s: " format, MY_NAME , ## arg); } while (0)*/ | 51 | /*#define dbg(format, arg...) do { if (shpchp_debug) printk(KERN_DEBUG "%s: " format, MY_NAME , ## arg); } while (0)*/ |
51 | #define dbg(format, arg...) do { if (shpchp_debug) printk("%s: " format, MY_NAME , ## arg); } while (0) | 52 | #define dbg(format, arg...) do { if (shpchp_debug) printk("%s: " format, MY_NAME , ## arg); } while (0) |
@@ -70,11 +71,13 @@ struct slot { | |||
70 | struct hotplug_slot *hotplug_slot; | 71 | struct hotplug_slot *hotplug_slot; |
71 | struct list_head slot_list; | 72 | struct list_head slot_list; |
72 | char name[SLOT_NAME_SIZE]; | 73 | char name[SLOT_NAME_SIZE]; |
74 | struct work_struct work; /* work for button event */ | ||
73 | }; | 75 | }; |
74 | 76 | ||
75 | struct event_info { | 77 | struct event_info { |
76 | u32 event_type; | 78 | u32 event_type; |
77 | u8 hp_slot; | 79 | struct slot *p_slot; |
80 | struct work_struct work; | ||
78 | }; | 81 | }; |
79 | 82 | ||
80 | struct controller { | 83 | struct controller { |
@@ -85,11 +88,9 @@ struct controller { | |||
85 | int num_slots; /* Number of slots on ctlr */ | 88 | int num_slots; /* Number of slots on ctlr */ |
86 | int slot_num_inc; /* 1 or -1 */ | 89 | int slot_num_inc; /* 1 or -1 */ |
87 | struct pci_dev *pci_dev; | 90 | struct pci_dev *pci_dev; |
88 | struct event_info event_queue[10]; | ||
89 | struct list_head slot_list; | 91 | struct list_head slot_list; |
90 | struct hpc_ops *hpc_ops; | 92 | struct hpc_ops *hpc_ops; |
91 | wait_queue_head_t queue; /* sleep & wake process */ | 93 | wait_queue_head_t queue; /* sleep & wake process */ |
92 | u8 next_event; | ||
93 | u8 bus; | 94 | u8 bus; |
94 | u8 device; | 95 | u8 device; |
95 | u8 function; | 96 | u8 function; |
@@ -180,9 +181,6 @@ struct hotplug_params { | |||
180 | /* sysfs functions for the hotplug controller info */ | 181 | /* sysfs functions for the hotplug controller info */ |
181 | extern void shpchp_create_ctrl_files (struct controller *ctrl); | 182 | extern void shpchp_create_ctrl_files (struct controller *ctrl); |
182 | 183 | ||
183 | /* controller functions */ | ||
184 | extern int shpchp_event_start_thread(void); | ||
185 | extern void shpchp_event_stop_thread(void); | ||
186 | extern int shpchp_enable_slot(struct slot *slot); | 184 | extern int shpchp_enable_slot(struct slot *slot); |
187 | extern int shpchp_disable_slot(struct slot *slot); | 185 | extern int shpchp_disable_slot(struct slot *slot); |
188 | 186 | ||
@@ -201,7 +199,8 @@ extern void get_hp_params_from_firmware(struct pci_dev *dev, | |||
201 | extern int shpchprm_get_physical_slot_number(struct controller *ctrl, | 199 | extern int shpchprm_get_physical_slot_number(struct controller *ctrl, |
202 | u32 *sun, u8 busnum, u8 devnum); | 200 | u32 *sun, u8 busnum, u8 devnum); |
203 | extern void shpchp_remove_ctrl_files(struct controller *ctrl); | 201 | extern void shpchp_remove_ctrl_files(struct controller *ctrl); |
204 | 202 | extern void cleanup_slots(struct controller *ctrl); | |
203 | extern void shpchp_pushbutton_thread(void *data); | ||
205 | 204 | ||
206 | /* Global variables */ | 205 | /* Global variables */ |
207 | extern struct list_head shpchp_ctrl_list; | 206 | extern struct list_head shpchp_ctrl_list; |