Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 356126
b: refs/heads/master
c: 5392335
h: refs/heads/master
v: v3
  • Loading branch information
Sebastian Ott authored and Martin Schwidefsky committed Feb 14, 2013
1 parent 15b788c commit 2caaa47
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 41 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: add09d61fee72d7a346051332b6d99f18989504c
refs/heads/master: 53923354d69e4748506bfee932b7c6b309a15c21
4 changes: 3 additions & 1 deletion trunk/arch/s390/include/asm/pci.h
Original file line number Diff line number Diff line change
Expand Up @@ -185,9 +185,11 @@ void zpci_dma_exit(void);
/* Hotplug */
extern struct mutex zpci_list_lock;
extern struct list_head zpci_list;
extern struct pci_hp_callback_ops hotplug_ops;
extern unsigned int s390_pci_probe;

void zpci_register_hp_ops(struct pci_hp_callback_ops *);
void zpci_deregister_hp_ops(void);

/* FMB */
int zpci_fmb_enable_device(struct zpci_dev *);
int zpci_fmb_disable_device(struct zpci_dev *);
Expand Down
27 changes: 21 additions & 6 deletions trunk/arch/s390/pci/pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,7 @@ EXPORT_SYMBOL_GPL(zpci_list);
DEFINE_MUTEX(zpci_list_lock);
EXPORT_SYMBOL_GPL(zpci_list_lock);

struct pci_hp_callback_ops hotplug_ops;
EXPORT_SYMBOL_GPL(hotplug_ops);
static struct pci_hp_callback_ops *hotplug_ops;

static DECLARE_BITMAP(zpci_domain, ZPCI_NR_DEVICES);
static DEFINE_SPINLOCK(zpci_domain_lock);
Expand Down Expand Up @@ -974,8 +973,8 @@ int zpci_create_device(struct zpci_dev *zdev)

mutex_lock(&zpci_list_lock);
list_add_tail(&zdev->entry, &zpci_list);
if (hotplug_ops.create_slot)
hotplug_ops.create_slot(zdev);
if (hotplug_ops)
hotplug_ops->create_slot(zdev);
mutex_unlock(&zpci_list_lock);

if (zdev->state == ZPCI_FN_STATE_STANDBY)
Expand All @@ -989,8 +988,8 @@ int zpci_create_device(struct zpci_dev *zdev)
out_start:
mutex_lock(&zpci_list_lock);
list_del(&zdev->entry);
if (hotplug_ops.remove_slot)
hotplug_ops.remove_slot(zdev);
if (hotplug_ops)
hotplug_ops->remove_slot(zdev);
mutex_unlock(&zpci_list_lock);
out_bus:
zpci_free_domain(zdev);
Expand Down Expand Up @@ -1072,6 +1071,22 @@ static void zpci_mem_exit(void)
kmem_cache_destroy(zdev_fmb_cache);
}

void zpci_register_hp_ops(struct pci_hp_callback_ops *ops)
{
mutex_lock(&zpci_list_lock);
hotplug_ops = ops;
mutex_unlock(&zpci_list_lock);
}
EXPORT_SYMBOL_GPL(zpci_register_hp_ops);

void zpci_deregister_hp_ops(void)
{
mutex_lock(&zpci_list_lock);
hotplug_ops = NULL;
mutex_unlock(&zpci_list_lock);
}
EXPORT_SYMBOL_GPL(zpci_deregister_hp_ops);

unsigned int s390_pci_probe = 1;
EXPORT_SYMBOL_GPL(s390_pci_probe);

Expand Down
58 changes: 25 additions & 33 deletions trunk/drivers/pci/hotplug/s390_pci_hpc.c
Original file line number Diff line number Diff line change
Expand Up @@ -172,25 +172,6 @@ static int init_pci_slot(struct zpci_dev *zdev)
return -ENOMEM;
}

static int __init init_pci_slots(void)
{
struct zpci_dev *zdev;
int device = 0;

/*
* Create a structure for each slot, and register that slot
* with the pci_hotplug subsystem.
*/
mutex_lock(&zpci_list_lock);
list_for_each_entry(zdev, &zpci_list, entry) {
init_pci_slot(zdev);
device++;
}

mutex_unlock(&zpci_list_lock);
return (device) ? 0 : -ENODEV;
}

static void exit_pci_slot(struct zpci_dev *zdev)
{
struct list_head *tmp, *n;
Expand All @@ -205,6 +186,26 @@ static void exit_pci_slot(struct zpci_dev *zdev)
}
}

static struct pci_hp_callback_ops hp_ops = {
.create_slot = init_pci_slot,
.remove_slot = exit_pci_slot,
};

static void __init init_pci_slots(void)
{
struct zpci_dev *zdev;

/*
* Create a structure for each slot, and register that slot
* with the pci_hotplug subsystem.
*/
mutex_lock(&zpci_list_lock);
list_for_each_entry(zdev, &zpci_list, entry) {
init_pci_slot(zdev);
}
mutex_unlock(&zpci_list_lock);
}

static void __exit exit_pci_slots(void)
{
struct list_head *tmp, *n;
Expand All @@ -224,28 +225,19 @@ static void __exit exit_pci_slots(void)

static int __init pci_hotplug_s390_init(void)
{
/*
* Do specific initialization stuff for your driver here
* like initializing your controller hardware (if any) and
* determining the number of slots you have in the system
* right now.
*/

if (!s390_pci_probe)
return -EOPNOTSUPP;

/* register callbacks for slot handling from arch code */
mutex_lock(&zpci_list_lock);
hotplug_ops.create_slot = init_pci_slot;
hotplug_ops.remove_slot = exit_pci_slot;
mutex_unlock(&zpci_list_lock);
pr_info("registered hotplug slot callbacks\n");
return init_pci_slots();
zpci_register_hp_ops(&hp_ops);
init_pci_slots();

return 0;
}

static void __exit pci_hotplug_s390_exit(void)
{
exit_pci_slots();
zpci_deregister_hp_ops();
}

module_init(pci_hotplug_s390_init);
Expand Down

0 comments on commit 2caaa47

Please sign in to comment.