X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fpci%2Fhotplug%2Fpcihp_skeleton.c;h=f413495a2f2ca0fc2ea57399aa03598abba33f43;hb=9213980e6a70d8473e0ffd4b39ab5b6caaba9ff5;hp=35a0538f84681b2a19591ba3cd1dd121a52b9fd9;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/drivers/pci/hotplug/pcihp_skeleton.c b/drivers/pci/hotplug/pcihp_skeleton.c index 35a0538f8..f413495a2 100644 --- a/drivers/pci/hotplug/pcihp_skeleton.c +++ b/drivers/pci/hotplug/pcihp_skeleton.c @@ -30,16 +30,14 @@ #include #include +#include #include #include #include #include #include "pci_hotplug.h" - -#define SLOT_MAGIC 0x67267322 struct slot { - u32 magic; u8 number; struct hotplug_slot *hotplug_slot; struct list_head slot_list; @@ -47,11 +45,7 @@ struct slot { static LIST_HEAD(slot_list); -#if !defined(CONFIG_HOTPLUG_PCI_SKELETON_MODULE) - #define MY_NAME "pcihp_skeleton" -#else - #define MY_NAME THIS_MODULE->name -#endif +#define MY_NAME "pcihp_skeleton" #define dbg(format, arg...) \ do { \ @@ -69,14 +63,14 @@ static LIST_HEAD(slot_list); static int debug; static int num_slots; -#define DRIVER_VERSION "0.2" +#define DRIVER_VERSION "0.3" #define DRIVER_AUTHOR "Greg Kroah-Hartman " #define DRIVER_DESC "Hot Plug PCI Controller Skeleton Driver" MODULE_AUTHOR(DRIVER_AUTHOR); MODULE_DESCRIPTION(DRIVER_DESC); MODULE_LICENSE("GPL"); -MODULE_PARM(debug, "i"); +module_param(debug, bool, 644); MODULE_PARM_DESC(debug, "Debugging mode enabled or not"); static int enable_slot (struct hotplug_slot *slot); @@ -100,50 +94,12 @@ static struct hotplug_slot_ops skel_hotplug_slot_ops = { .get_adapter_status = get_adapter_status, }; - -/* Inline functions to check the sanity of a pointer that is passed to us */ -static inline int slot_paranoia_check (struct slot *slot, const char *function) +static int enable_slot(struct hotplug_slot *hotplug_slot) { - if (!slot) { - dbg("%s - slot == NULL", function); - return -1; - } - if (slot->magic != SLOT_MAGIC) { - dbg("%s - bad magic number for slot", function); - return -1; - } - if (!slot->hotplug_slot) { - dbg("%s - slot->hotplug_slot == NULL!", function); - return -1; - } - return 0; -} - -static inline struct slot *get_slot (struct hotplug_slot *hotplug_slot, const char *function) -{ - struct slot *slot; - - if (!hotplug_slot) { - dbg("%s - hotplug_slot == NULL\n", function); - return NULL; - } - - slot = (struct slot *)hotplug_slot->private; - if (slot_paranoia_check (slot, function)) - return NULL; - return slot; -} - - -static int enable_slot (struct hotplug_slot *hotplug_slot) -{ - struct slot *slot = get_slot (hotplug_slot, __FUNCTION__); + struct slot *slot = hotplug_slot->private; int retval = 0; - - if (slot == NULL) - return -ENODEV; - - dbg ("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); + + dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); /* * Fill in code here to enable the specified slot @@ -153,15 +109,12 @@ static int enable_slot (struct hotplug_slot *hotplug_slot) } -static int disable_slot (struct hotplug_slot *hotplug_slot) +static int disable_slot(struct hotplug_slot *hotplug_slot) { - struct slot *slot = get_slot (hotplug_slot, __FUNCTION__); + struct slot *slot = hotplug_slot->private; int retval = 0; - - if (slot == NULL) - return -ENODEV; - - dbg ("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); + + dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); /* * Fill in code here to disable the specified slot @@ -170,15 +123,12 @@ static int disable_slot (struct hotplug_slot *hotplug_slot) return retval; } -static int set_attention_status (struct hotplug_slot *hotplug_slot, u8 status) +static int set_attention_status(struct hotplug_slot *hotplug_slot, u8 status) { - struct slot *slot = get_slot (hotplug_slot, __FUNCTION__); + struct slot *slot = hotplug_slot->private; int retval = 0; - - if (slot == NULL) - return -ENODEV; - - dbg ("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); + + dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); switch (status) { case 0: @@ -198,32 +148,30 @@ static int set_attention_status (struct hotplug_slot *hotplug_slot, u8 status) return retval; } -static int hardware_test (struct hotplug_slot *hotplug_slot, u32 value) +static int hardware_test(struct hotplug_slot *hotplug_slot, u32 value) { - struct slot *slot = get_slot (hotplug_slot, __FUNCTION__); + struct slot *slot = hotplug_slot->private; int retval = 0; - - if (slot == NULL) - return -ENODEV; - - dbg ("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); - err ("No hardware tests are defined for this driver"); - retval = -ENODEV; + dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); + + switch (value) { + case 0: + /* Specify a test here */ + break; + case 1: + /* Specify another test here */ + break; + } - /* Or you can specify a test if you want to */ - return retval; } -static int get_power_status (struct hotplug_slot *hotplug_slot, u8 *value) +static int get_power_status(struct hotplug_slot *hotplug_slot, u8 *value) { - struct slot *slot = get_slot (hotplug_slot, __FUNCTION__); + struct slot *slot = hotplug_slot->private; int retval = 0; - - if (slot == NULL) - return -ENODEV; - + dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); /* @@ -234,14 +182,11 @@ static int get_power_status (struct hotplug_slot *hotplug_slot, u8 *value) return retval; } -static int get_attention_status (struct hotplug_slot *hotplug_slot, u8 *value) +static int get_attention_status(struct hotplug_slot *hotplug_slot, u8 *value) { - struct slot *slot = get_slot (hotplug_slot, __FUNCTION__); + struct slot *slot = hotplug_slot->private; int retval = 0; - - if (slot == NULL) - return -ENODEV; - + dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); /* @@ -252,14 +197,11 @@ static int get_attention_status (struct hotplug_slot *hotplug_slot, u8 *value) return retval; } -static int get_latch_status (struct hotplug_slot *hotplug_slot, u8 *value) +static int get_latch_status(struct hotplug_slot *hotplug_slot, u8 *value) { - struct slot *slot = get_slot (hotplug_slot, __FUNCTION__); + struct slot *slot = hotplug_slot->private; int retval = 0; - - if (slot == NULL) - return -ENODEV; - + dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); /* @@ -270,14 +212,11 @@ static int get_latch_status (struct hotplug_slot *hotplug_slot, u8 *value) return retval; } -static int get_adapter_status (struct hotplug_slot *hotplug_slot, u8 *value) +static int get_adapter_status(struct hotplug_slot *hotplug_slot, u8 *value) { - struct slot *slot = get_slot (hotplug_slot, __FUNCTION__); + struct slot *slot = hotplug_slot->private; int retval = 0; - - if (slot == NULL) - return -ENODEV; - + dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); /* @@ -288,13 +227,9 @@ static int get_adapter_status (struct hotplug_slot *hotplug_slot, u8 *value) return retval; } -static void release_slots(struct hotplug_slot *hotplug_slot) +static void release_slot(struct hotplug_slot *hotplug_slot) { - struct slot *slot = get_slot(hotplug_slot, __FUNCTION__); - int retval = 0; - - if (slot == NULL) - return -ENODEV; + struct slot *slot = hotplug_slot->private; dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name); kfree(slot->hotplug_slot->info); @@ -304,22 +239,26 @@ static void release_slots(struct hotplug_slot *hotplug_slot) } #define SLOT_NAME_SIZE 10 -static void make_slot_name (struct slot *slot) +static void make_slot_name(struct slot *slot) { /* * Stupid way to make a filename out of the slot name. * replace this if your hardware provides a better way to name slots. */ - snprintf (slot->hotplug_slot->name, SLOT_NAME_SIZE, "%d", slot->number); + snprintf(slot->hotplug_slot->name, SLOT_NAME_SIZE, "%d", slot->number); } -static int init_slots (void) +/** + * init_slots - initialize 'struct slot' structures for each slot + * + */ +static int __init init_slots(void) { struct slot *slot; struct hotplug_slot *hotplug_slot; struct hotplug_slot_info *info; char *name; - int retval = 0; + int retval = -ENOMEM; int i; /* @@ -327,43 +266,34 @@ static int init_slots (void) * with the pci_hotplug subsystem. */ for (i = 0; i < num_slots; ++i) { - slot = kmalloc (sizeof (struct slot), GFP_KERNEL); + slot = kmalloc(sizeof(struct slot), GFP_KERNEL); if (!slot) - return -ENOMEM; + goto error; memset(slot, 0, sizeof(struct slot)); - hotplug_slot = kmalloc (sizeof (struct hotplug_slot), GFP_KERNEL); - if (!hotplug_slot) { - kfree (slot); - return -ENOMEM; - } + hotplug_slot = kmalloc(sizeof(struct hotplug_slot), + GFP_KERNEL); + if (!hotplug_slot) + goto error_slot; memset(hotplug_slot, 0, sizeof (struct hotplug_slot)); slot->hotplug_slot = hotplug_slot; - info = kmalloc (sizeof (struct hotplug_slot_info), GFP_KERNEL); - if (!info) { - kfree (hotplug_slot); - kfree (slot); - return -ENOMEM; - } + info = kmalloc(sizeof(struct hotplug_slot_info), GFP_KERNEL); + if (!info) + goto error_hpslot; memset(info, 0, sizeof (struct hotplug_slot_info)); hotplug_slot->info = info; - name = kmalloc (SLOT_NAME_SIZE, GFP_KERNEL); - if (!name) { - kfree (info); - kfree (hotplug_slot); - kfree (slot); - return -ENOMEM; - } + name = kmalloc(SLOT_NAME_SIZE, GFP_KERNEL); + if (!name) + goto error_info; hotplug_slot->name = name; - slot->magic = SLOT_MAGIC; slot->number = i; hotplug_slot->private = slot; hotplug_slot->release = &release_slot; - make_slot_name (slot); + make_slot_name(slot); hotplug_slot->ops = &skel_hotplug_slot_ops; /* @@ -375,25 +305,31 @@ static int init_slots (void) info->latch_status = get_latch_status(slot); info->adapter_status = get_adapter_status(slot); - dbg ("registering slot %d\n", i); - retval = pci_hp_register (slot->hotplug_slot); + dbg("registering slot %d\n", i); + retval = pci_hp_register(slot->hotplug_slot); if (retval) { - err ("pci_hp_register failed with error %d\n", retval); - kfree (info); - kfree (name); - kfree (hotplug_slot); - kfree (slot); - return retval; + err("pci_hp_register failed with error %d\n", retval); + goto error_name; } /* add slot to our internal list */ - list_add (&slot->slot_list, &slot_list); + list_add(&slot->slot_list, &slot_list); } + return 0; +error_name: + kfree(name); +error_info: + kfree(info); +error_hpslot: + kfree(hotplug_slot); +error_slot: + kfree(slot); +error: return retval; } -static void cleanup_slots(void) +static void __exit cleanup_slots(void) { struct list_head *tmp; struct list_head *next; @@ -404,10 +340,10 @@ static void cleanup_slots(void) * Memory will be freed in release_slot() callback after slot's * lifespan is finished. */ - list_for_each_safe (tmp, next, &slot_list) { - slot = list_entry (tmp, struct slot, slot_list); - list_del (&slot->slot_list); - pci_hp_deregister (slot->hotplug_slot); + list_for_each_safe(tmp, next, &slot_list) { + slot = list_entry(tmp, struct slot, slot_list); + list_del(&slot->slot_list); + pci_hp_deregister(slot->hotplug_slot); } } @@ -415,20 +351,16 @@ static int __init pcihp_skel_init(void) { int retval; + info(DRIVER_DESC " version: " DRIVER_VERSION "\n"); /* * Do specific initialization stuff for your driver here - * Like initilizing your controller hardware (if any) and + * Like initializing your controller hardware (if any) and * determining the number of slots you have in the system * right now. */ num_slots = 5; - retval = init_slots(); - if (retval) - return retval; - - info (DRIVER_DESC " version: " DRIVER_VERSION "\n"); - return 0; + return init_slots(); } static void __exit pcihp_skel_exit(void) @@ -441,4 +373,3 @@ static void __exit pcihp_skel_exit(void) module_init(pcihp_skel_init); module_exit(pcihp_skel_exit); -