aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firmware
diff options
context:
space:
mode:
authorMike Waychison <mikew@google.com>2011-03-11 20:43:11 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2011-03-14 11:40:50 -0400
commit4142ef146aee440731de956d9f9f3170d5a238ae (patch)
tree32bcb80883c10a7088806fda17bbf1730a4d781e /drivers/firmware
parentd502fbb0dc4d4babe5fb330257fa49a83fbf86a6 (diff)
efivars: parameterize efivars
Now that we all global variable state is encapsulated by struct efivars, parameterize all functions to the efivars local to the control flow rather than at file scope. We do this by removing the variable "efivars" at file scope and move its storage down to the end of the file. Variables get at efivars by storing the efivars pointer within each efivar_entry. The "new_var" and "del_var" binary attribute files get at the efivars through the private pointer. Signed-off-by: Mike Waychison <mikew@google.com> Cc: Matt Domsch <Matt_Domsch@dell.com>, Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/firmware')
-rw-r--r--drivers/firmware/efivars.c49
1 files changed, 31 insertions, 18 deletions
diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c
index 528ce47c1368..5633018c34af 100644
--- a/drivers/firmware/efivars.c
+++ b/drivers/firmware/efivars.c
@@ -103,8 +103,6 @@ struct efivars {
103 struct kset *kset; 103 struct kset *kset;
104 struct bin_attribute *new_var, *del_var; 104 struct bin_attribute *new_var, *del_var;
105}; 105};
106static struct efivars __efivars;
107static struct efivars *efivars = &__efivars;
108 106
109/* 107/*
110 * The maximum size of VariableName + Data = 1024 108 * The maximum size of VariableName + Data = 1024
@@ -124,6 +122,7 @@ struct efi_variable {
124 122
125 123
126struct efivar_entry { 124struct efivar_entry {
125 struct efivars *efivars;
127 struct efi_variable var; 126 struct efi_variable var;
128 struct list_head list; 127 struct list_head list;
129 struct kobject kobj; 128 struct kobject kobj;
@@ -150,9 +149,10 @@ struct efivar_attribute efivar_attr_##_name = { \
150 * Prototype for sysfs creation function 149 * Prototype for sysfs creation function
151 */ 150 */
152static int 151static int
153efivar_create_sysfs_entry(unsigned long variable_name_size, 152efivar_create_sysfs_entry(struct efivars *efivars,
154 efi_char16_t *variable_name, 153 unsigned long variable_name_size,
155 efi_guid_t *vendor_guid); 154 efi_char16_t *variable_name,
155 efi_guid_t *vendor_guid);
156 156
157/* Return the number of unicode characters in data */ 157/* Return the number of unicode characters in data */
158static unsigned long 158static unsigned long
@@ -176,7 +176,7 @@ utf8_strsize(efi_char16_t *data, unsigned long maxlength)
176} 176}
177 177
178static efi_status_t 178static efi_status_t
179get_var_data(struct efi_variable *var) 179get_var_data(struct efivars *efivars, struct efi_variable *var)
180{ 180{
181 efi_status_t status; 181 efi_status_t status;
182 182
@@ -221,7 +221,7 @@ efivar_attr_read(struct efivar_entry *entry, char *buf)
221 if (!entry || !buf) 221 if (!entry || !buf)
222 return -EINVAL; 222 return -EINVAL;
223 223
224 status = get_var_data(var); 224 status = get_var_data(entry->efivars, var);
225 if (status != EFI_SUCCESS) 225 if (status != EFI_SUCCESS)
226 return -EIO; 226 return -EIO;
227 227
@@ -244,7 +244,7 @@ efivar_size_read(struct efivar_entry *entry, char *buf)
244 if (!entry || !buf) 244 if (!entry || !buf)
245 return -EINVAL; 245 return -EINVAL;
246 246
247 status = get_var_data(var); 247 status = get_var_data(entry->efivars, var);
248 if (status != EFI_SUCCESS) 248 if (status != EFI_SUCCESS)
249 return -EIO; 249 return -EIO;
250 250
@@ -261,7 +261,7 @@ efivar_data_read(struct efivar_entry *entry, char *buf)
261 if (!entry || !buf) 261 if (!entry || !buf)
262 return -EINVAL; 262 return -EINVAL;
263 263
264 status = get_var_data(var); 264 status = get_var_data(entry->efivars, var);
265 if (status != EFI_SUCCESS) 265 if (status != EFI_SUCCESS)
266 return -EIO; 266 return -EIO;
267 267
@@ -276,6 +276,7 @@ static ssize_t
276efivar_store_raw(struct efivar_entry *entry, const char *buf, size_t count) 276efivar_store_raw(struct efivar_entry *entry, const char *buf, size_t count)
277{ 277{
278 struct efi_variable *new_var, *var = &entry->var; 278 struct efi_variable *new_var, *var = &entry->var;
279 struct efivars *efivars = entry->efivars;
279 efi_status_t status = EFI_NOT_FOUND; 280 efi_status_t status = EFI_NOT_FOUND;
280 281
281 if (count != sizeof(struct efi_variable)) 282 if (count != sizeof(struct efi_variable))
@@ -325,7 +326,7 @@ efivar_show_raw(struct efivar_entry *entry, char *buf)
325 if (!entry || !buf) 326 if (!entry || !buf)
326 return 0; 327 return 0;
327 328
328 status = get_var_data(var); 329 status = get_var_data(entry->efivars, var);
329 if (status != EFI_SUCCESS) 330 if (status != EFI_SUCCESS)
330 return -EIO; 331 return -EIO;
331 332
@@ -413,6 +414,7 @@ static ssize_t efivar_create(struct file *filp, struct kobject *kobj,
413 char *buf, loff_t pos, size_t count) 414 char *buf, loff_t pos, size_t count)
414{ 415{
415 struct efi_variable *new_var = (struct efi_variable *)buf; 416 struct efi_variable *new_var = (struct efi_variable *)buf;
417 struct efivars *efivars = bin_attr->private;
416 struct efivar_entry *search_efivar, *n; 418 struct efivar_entry *search_efivar, *n;
417 unsigned long strsize1, strsize2; 419 unsigned long strsize1, strsize2;
418 efi_status_t status = EFI_NOT_FOUND; 420 efi_status_t status = EFI_NOT_FOUND;
@@ -459,8 +461,11 @@ static ssize_t efivar_create(struct file *filp, struct kobject *kobj,
459 spin_unlock(&efivars->lock); 461 spin_unlock(&efivars->lock);
460 462
461 /* Create the entry in sysfs. Locking is not required here */ 463 /* Create the entry in sysfs. Locking is not required here */
462 status = efivar_create_sysfs_entry(utf8_strsize(new_var->VariableName, 464 status = efivar_create_sysfs_entry(efivars,
463 1024), new_var->VariableName, &new_var->VendorGuid); 465 utf8_strsize(new_var->VariableName,
466 1024),
467 new_var->VariableName,
468 &new_var->VendorGuid);
464 if (status) { 469 if (status) {
465 printk(KERN_WARNING "efivars: variable created, but sysfs entry wasn't.\n"); 470 printk(KERN_WARNING "efivars: variable created, but sysfs entry wasn't.\n");
466 } 471 }
@@ -472,6 +477,7 @@ static ssize_t efivar_delete(struct file *filp, struct kobject *kobj,
472 char *buf, loff_t pos, size_t count) 477 char *buf, loff_t pos, size_t count)
473{ 478{
474 struct efi_variable *del_var = (struct efi_variable *)buf; 479 struct efi_variable *del_var = (struct efi_variable *)buf;
480 struct efivars *efivars = bin_attr->private;
475 struct efivar_entry *search_efivar, *n; 481 struct efivar_entry *search_efivar, *n;
476 unsigned long strsize1, strsize2; 482 unsigned long strsize1, strsize2;
477 efi_status_t status = EFI_NOT_FOUND; 483 efi_status_t status = EFI_NOT_FOUND;
@@ -580,9 +586,10 @@ static struct kobject *efi_kobj;
580 * Returns 1 on failure, 0 on success 586 * Returns 1 on failure, 0 on success
581 */ 587 */
582static int 588static int
583efivar_create_sysfs_entry(unsigned long variable_name_size, 589efivar_create_sysfs_entry(struct efivars *efivars,
584 efi_char16_t *variable_name, 590 unsigned long variable_name_size,
585 efi_guid_t *vendor_guid) 591 efi_char16_t *variable_name,
592 efi_guid_t *vendor_guid)
586{ 593{
587 int i, short_name_size = variable_name_size / sizeof(efi_char16_t) + 38; 594 int i, short_name_size = variable_name_size / sizeof(efi_char16_t) + 38;
588 char *short_name; 595 char *short_name;
@@ -597,6 +604,7 @@ efivar_create_sysfs_entry(unsigned long variable_name_size,
597 return 1; 604 return 1;
598 } 605 }
599 606
607 new_efivar->efivars = efivars;
600 memcpy(new_efivar->var.VariableName, variable_name, 608 memcpy(new_efivar->var.VariableName, variable_name,
601 variable_name_size); 609 variable_name_size);
602 memcpy(&(new_efivar->var.VendorGuid), vendor_guid, sizeof(efi_guid_t)); 610 memcpy(&(new_efivar->var.VendorGuid), vendor_guid, sizeof(efi_guid_t));
@@ -691,6 +699,8 @@ out_free:
691 return error; 699 return error;
692} 700}
693 701
702static struct efivars __efivars;
703
694/* 704/*
695 * For now we register the efi subsystem with the firmware subsystem 705 * For now we register the efi subsystem with the firmware subsystem
696 * and the vars subsystem with the efi subsystem. In the future, it 706 * and the vars subsystem with the efi subsystem. In the future, it
@@ -706,6 +716,7 @@ efivars_init(void)
706 efi_guid_t vendor_guid; 716 efi_guid_t vendor_guid;
707 efi_char16_t *variable_name; 717 efi_char16_t *variable_name;
708 unsigned long variable_name_size = 1024; 718 unsigned long variable_name_size = 1024;
719 struct efivars *efivars = &__efivars;
709 int error = 0; 720 int error = 0;
710 721
711 if (!efi_enabled) 722 if (!efi_enabled)
@@ -751,9 +762,10 @@ efivars_init(void)
751 &vendor_guid); 762 &vendor_guid);
752 switch (status) { 763 switch (status) {
753 case EFI_SUCCESS: 764 case EFI_SUCCESS:
754 efivar_create_sysfs_entry(variable_name_size, 765 efivar_create_sysfs_entry(efivars,
755 variable_name, 766 variable_name_size,
756 &vendor_guid); 767 variable_name,
768 &vendor_guid);
757 break; 769 break;
758 case EFI_NOT_FOUND: 770 case EFI_NOT_FOUND:
759 break; 771 break;
@@ -788,6 +800,7 @@ out_free:
788static void __exit 800static void __exit
789efivars_exit(void) 801efivars_exit(void)
790{ 802{
803 struct efivars *efivars = &__efivars;
791 struct efivar_entry *entry, *n; 804 struct efivar_entry *entry, *n;
792 805
793 list_for_each_entry_safe(entry, n, &efivars->list, list) { 806 list_for_each_entry_safe(entry, n, &efivars->list, list) {