platform/x86: dell-smbios: Link all dell-smbios-* modules together
Some race conditions were raised due to dell-smbios and its backends not being ready by the time that a consumer would call one of the exported methods. To avoid this problem, guarantee that all initialization has been done by linking them all together and running init for them all. As part of this change the Kconfig needs to be adjusted so that CONFIG_DELL_SMBIOS_SMM and CONFIG_DELL_SMBIOS_WMI are boolean rather than modules. CONFIG_DELL_SMBIOS is a visually selectable option again and both CONFIG_DELL_SMBIOS_WMI and CONFIG_DELL_SMBIOS_SMM are optional. Signed-off-by: Mario Limonciello <mario.limonciello@dell.com> [dvhart: Update prompt and help text for DELL_SMBIOS_* backends] Signed-off-by: Darren Hart (VMware) <dvhart@infradead.org>
This commit is contained in:

committed by
Darren Hart (VMware)

parent
ec34fe3859
commit
41e36f2f85
@@ -556,7 +556,7 @@ static void free_group(struct platform_device *pdev)
|
||||
static int __init dell_smbios_init(void)
|
||||
{
|
||||
const struct dmi_device *valid;
|
||||
int ret;
|
||||
int ret, wmi, smm;
|
||||
|
||||
valid = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, "Dell System", NULL);
|
||||
if (!valid) {
|
||||
@@ -591,8 +591,24 @@ static int __init dell_smbios_init(void)
|
||||
if (ret)
|
||||
goto fail_create_group;
|
||||
|
||||
/* register backends */
|
||||
wmi = init_dell_smbios_wmi();
|
||||
if (wmi)
|
||||
pr_debug("Failed to initialize WMI backend: %d\n", wmi);
|
||||
smm = init_dell_smbios_smm();
|
||||
if (smm)
|
||||
pr_debug("Failed to initialize SMM backend: %d\n", smm);
|
||||
if (wmi && smm) {
|
||||
pr_err("No SMBIOS backends available (wmi: %d, smm: %d)\n",
|
||||
wmi, smm);
|
||||
goto fail_sysfs;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
fail_sysfs:
|
||||
free_group(platform_device);
|
||||
|
||||
fail_create_group:
|
||||
platform_device_del(platform_device);
|
||||
|
||||
@@ -609,6 +625,8 @@ fail_platform_driver:
|
||||
|
||||
static void __exit dell_smbios_exit(void)
|
||||
{
|
||||
exit_dell_smbios_wmi();
|
||||
exit_dell_smbios_smm();
|
||||
mutex_lock(&smbios_mutex);
|
||||
if (platform_device) {
|
||||
free_group(platform_device);
|
||||
@@ -625,5 +643,6 @@ module_exit(dell_smbios_exit);
|
||||
MODULE_AUTHOR("Matthew Garrett <mjg@redhat.com>");
|
||||
MODULE_AUTHOR("Gabriele Mazzotta <gabriele.mzt@gmail.com>");
|
||||
MODULE_AUTHOR("Pali Rohár <pali.rohar@gmail.com>");
|
||||
MODULE_AUTHOR("Mario Limonciello <mario.limonciello@dell.com>");
|
||||
MODULE_DESCRIPTION("Common functions for kernel modules using Dell SMBIOS");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
Reference in New Issue
Block a user