Release 4.11 drivers/pci/hotplug/rpaphp_slot.c
/*
* RPA Virtual I/O device functions
* Copyright (C) 2004 Linda Xie <lxie@us.ibm.com>
*
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
* NON INFRINGEMENT. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* Send feedback to <lxie@us.ibm.com>
*
*/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/sysfs.h>
#include <linux/pci.h>
#include <linux/string.h>
#include <linux/slab.h>
#include <asm/rtas.h>
#include "rpaphp.h"
/* free up the memory used by a slot */
static void rpaphp_release_slot(struct hotplug_slot *hotplug_slot)
{
struct slot *slot = (struct slot *) hotplug_slot->private;
dealloc_slot_struct(slot);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linda Xie | 30 | 100.00% | 1 | 100.00% |
Total | 30 | 100.00% | 1 | 100.00% |
void dealloc_slot_struct(struct slot *slot)
{
kfree(slot->hotplug_slot->info);
kfree(slot->name);
kfree(slot->hotplug_slot);
kfree(slot);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linda Xie | 38 | 100.00% | 1 | 100.00% |
Total | 38 | 100.00% | 1 | 100.00% |
struct slot *alloc_slot_struct(struct device_node *dn,
int drc_index, char *drc_name, int power_domain)
{
struct slot *slot;
slot = kzalloc(sizeof(struct slot), GFP_KERNEL);
if (!slot)
goto error_nomem;
slot->hotplug_slot = kzalloc(sizeof(struct hotplug_slot), GFP_KERNEL);
if (!slot->hotplug_slot)
goto error_slot;
slot->hotplug_slot->info = kzalloc(sizeof(struct hotplug_slot_info),
GFP_KERNEL);
if (!slot->hotplug_slot->info)
goto error_hpslot;
slot->name = kstrdup(drc_name, GFP_KERNEL);
if (!slot->name)
goto error_info;
slot->dn = dn;
slot->index = drc_index;
slot->power_domain = power_domain;
slot->hotplug_slot->private = slot;
slot->hotplug_slot->ops = &rpaphp_hotplug_slot_ops;
slot->hotplug_slot->release = &rpaphp_release_slot;
return (slot);
error_info:
kfree(slot->hotplug_slot->info);
error_hpslot:
kfree(slot->hotplug_slot);
error_slot:
kfree(slot);
error_nomem:
return NULL;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linda Xie | 159 | 77.94% | 4 | 50.00% |
Rolf Eike Beer | 39 | 19.12% | 1 | 12.50% |
Eric Sesterhenn / Snakebyte | 3 | 1.47% | 1 | 12.50% |
Linas Vepstas | 2 | 0.98% | 1 | 12.50% |
Alexander Chiang | 1 | 0.49% | 1 | 12.50% |
Total | 204 | 100.00% | 8 | 100.00% |
static int is_registered(struct slot *slot)
{
struct slot *tmp_slot;
list_for_each_entry(tmp_slot, &rpaphp_slot_head, rpaphp_slot_list) {
if (!strcmp(tmp_slot->name, slot->name))
return 1;
}
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linda Xie | 46 | 100.00% | 2 | 100.00% |
Total | 46 | 100.00% | 2 | 100.00% |
int rpaphp_deregister_slot(struct slot *slot)
{
int retval = 0;
struct hotplug_slot *php_slot = slot->hotplug_slot;
dbg("%s - Entry: deregistering slot=%s\n",
__func__, slot->name);
list_del(&slot->rpaphp_slot_list);
retval = pci_hp_deregister(php_slot);
if (retval)
err("Problem unregistering a slot %s\n", slot->name);
dbg("%s - Exit: rc[%d]\n", __func__, retval);
return retval;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linda Xie | 72 | 96.00% | 2 | 50.00% |
Harvey Harrison | 2 | 2.67% | 1 | 25.00% |
Linas Vepstas | 1 | 1.33% | 1 | 25.00% |
Total | 75 | 100.00% | 4 | 100.00% |
EXPORT_SYMBOL_GPL(rpaphp_deregister_slot);
int rpaphp_register_slot(struct slot *slot)
{
struct hotplug_slot *php_slot = slot->hotplug_slot;
struct device_node *child;
u32 my_index;
int retval;
int slotno = -1;
dbg("%s registering slot:path[%s] index[%x], name[%s] pdomain[%x] type[%d]\n",
__func__, slot->dn->full_name, slot->index, slot->name,
slot->power_domain, slot->type);
/* should not try to register the same slot twice */
if (is_registered(slot)) {
err("rpaphp_register_slot: slot[%s] is already registered\n", slot->name);
return -EAGAIN;
}
for_each_child_of_node(slot->dn, child) {
retval = of_property_read_u32(child, "ibm,my-drc-index", &my_index);
if (my_index == slot->index) {
slotno = PCI_SLOT(PCI_DN(child)->devfn);
of_node_put(child);
break;
}
}
retval = pci_hp_register(php_slot, slot->bus, slotno, slot->name);
if (retval) {
err("pci_hp_register failed with error %d\n", retval);
return retval;
}
/* add slot to our internal list */
list_add(&slot->rpaphp_slot_list, &rpaphp_slot_head);
info("Slot [%s] registered\n", slot->name);
return 0;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linda Xie | 94 | 48.70% | 2 | 18.18% |
Tyrel Datwyler | 41 | 21.24% | 1 | 9.09% |
Alexander Chiang | 28 | 14.51% | 2 | 18.18% |
Linas Vepstas | 27 | 13.99% | 4 | 36.36% |
Paul Mackerras | 2 | 1.04% | 1 | 9.09% |
Harvey Harrison | 1 | 0.52% | 1 | 9.09% |
Total | 193 | 100.00% | 11 | 100.00% |
Overall Contributors
Person | Tokens | Prop | Commits | CommitProp |
Linda Xie | 454 | 73.58% | 4 | 19.05% |
Tyrel Datwyler | 41 | 6.65% | 1 | 4.76% |
Rolf Eike Beer | 40 | 6.48% | 2 | 9.52% |
Linas Vepstas | 35 | 5.67% | 5 | 23.81% |
Alexander Chiang | 29 | 4.70% | 3 | 14.29% |
Tim Schmielau | 6 | 0.97% | 1 | 4.76% |
David Gibson | 3 | 0.49% | 1 | 4.76% |
Harvey Harrison | 3 | 0.49% | 1 | 4.76% |
Eric Sesterhenn / Snakebyte | 3 | 0.49% | 1 | 4.76% |
Paul Mackerras | 2 | 0.32% | 1 | 4.76% |
Björn Helgaas | 1 | 0.16% | 1 | 4.76% |
Total | 617 | 100.00% | 21 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.