diff options
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/hotplug/shpchp.h | 4 | ||||
-rw-r--r-- | drivers/pci/hotplug/shpchp_core.c | 25 | ||||
-rw-r--r-- | drivers/pci/hotplug/shpchp_ctrl.c | 2 |
3 files changed, 10 insertions, 21 deletions
diff --git a/drivers/pci/hotplug/shpchp.h b/drivers/pci/hotplug/shpchp.h index c0be7a1c3ff..f6d606dde69 100644 --- a/drivers/pci/hotplug/shpchp.h +++ b/drivers/pci/hotplug/shpchp.h @@ -78,7 +78,7 @@ struct event_info { }; struct controller { - struct controller *next; + struct list_head ctrl_list; struct mutex crit_sect; /* critical section mutex */ struct php_ctlr_state_s *hpc_ctlr_handle; /* HPC controller handle */ int num_slots; /* Number of slots on ctlr */ @@ -204,7 +204,7 @@ extern void shpchp_remove_ctrl_files(struct controller *ctrl); /* Global variables */ -extern struct controller *shpchp_ctrl_list; +extern struct list_head shpchp_ctrl_list; struct ctrl_reg { volatile u32 base_offset; diff --git a/drivers/pci/hotplug/shpchp_core.c b/drivers/pci/hotplug/shpchp_core.c index 547bf5d6fcc..0dd0642e691 100644 --- a/drivers/pci/hotplug/shpchp_core.c +++ b/drivers/pci/hotplug/shpchp_core.c @@ -38,7 +38,7 @@ int shpchp_debug; int shpchp_poll_mode; int shpchp_poll_time; -struct controller *shpchp_ctrl_list; /* = NULL */ +LIST_HEAD(shpchp_ctrl_list); #define DRIVER_VERSION "0.4" #define DRIVER_AUTHOR "Dan Zink <dan.zink@compaq.com>, Greg Kroah-Hartman <greg@kroah.com>, Dely Sy <dely.l.sy@intel.com>" @@ -452,13 +452,7 @@ static int shpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent) /* Finish setting up the hot plug ctrl device */ ctrl->next_event = 0; - if (!shpchp_ctrl_list) { - shpchp_ctrl_list = ctrl; - ctrl->next = NULL; - } else { - ctrl->next = shpchp_ctrl_list; - shpchp_ctrl_list = ctrl; - } + list_add(&ctrl->ctrl_list, &shpchp_ctrl_list); shpchp_create_ctrl_files(ctrl); @@ -493,22 +487,17 @@ static int shpc_start_thread(void) static void __exit unload_shpchpd(void) { + struct list_head *tmp; + struct list_head *next; struct controller *ctrl; - struct controller *tctrl; - - ctrl = shpchp_ctrl_list; - while (ctrl) { + list_for_each_safe(tmp, next, &shpchp_ctrl_list) { + ctrl = list_entry(tmp, struct controller, ctrl_list); shpchp_remove_ctrl_files(ctrl); cleanup_slots(ctrl); - kfree (ctrl->pci_bus); ctrl->hpc_ops->release_ctlr(ctrl); - - tctrl = ctrl; - ctrl = ctrl->next; - - kfree(tctrl); + kfree(ctrl); } /* Stop the notification mechanism */ diff --git a/drivers/pci/hotplug/shpchp_ctrl.c b/drivers/pci/hotplug/shpchp_ctrl.c index 65e69252e2f..3a8e733aead 100644 --- a/drivers/pci/hotplug/shpchp_ctrl.c +++ b/drivers/pci/hotplug/shpchp_ctrl.c @@ -688,7 +688,7 @@ static int event_thread(void* data) if (pushbutton_pending) shpchp_pushbutton_thread(pushbutton_pending); else - for (ctrl = shpchp_ctrl_list; ctrl; ctrl=ctrl->next) + list_for_each_entry(ctrl, &shpchp_ctrl_list, ctrl_list) interrupt_event_handler(ctrl); } dbg("event_thread signals exit\n"); |