Some Dell servers can use dell-smbios but they don't support the
token interface.  Make it optional.

Signed-off-by: Mario Limonciello <[email protected]>
---
 drivers/platform/x86/dell-smbios-base.c | 35 ++++++++++++++++++++-------------
 1 file changed, 21 insertions(+), 14 deletions(-)

diff --git a/drivers/platform/x86/dell-smbios-base.c 
b/drivers/platform/x86/dell-smbios-base.c
index 446dbff..ac88032 100644
--- a/drivers/platform/x86/dell-smbios-base.c
+++ b/drivers/platform/x86/dell-smbios-base.c
@@ -212,6 +212,12 @@ int dell_smbios_call_filter(struct device *d,
        if ((buffer->cmd_class == CLASS_TOKEN_READ ||
             buffer->cmd_class == CLASS_TOKEN_WRITE) &&
             buffer->cmd_select < 3) {
+               /* tokens enabled ? */
+               if (!da_tokens) {
+                       dev_dbg(d, "no token support on this system\n");
+                       return -EINVAL;
+               }
+
                /* find the matching token ID */
                for (i = 0; i < da_num_tokens; i++) {
                        if (da_tokens[i].location != buffer->input[0])
@@ -315,6 +321,9 @@ struct calling_interface_token *dell_smbios_find_token(int 
tokenid)
 {
        int i;
 
+       if (!da_tokens)
+               return NULL;
+
        for (i = 0; i < da_num_tokens; i++) {
                if (da_tokens[i].tokenID == tokenid)
                        return &da_tokens[i];
@@ -570,11 +579,6 @@ static int __init dell_smbios_init(void)
 
        dmi_walk(find_tokens, NULL);
 
-       if (!da_tokens)  {
-               pr_info("Unable to find dmi tokens\n");
-               return -ENODEV;
-       }
-
        ret = platform_driver_register(&platform_driver);
        if (ret)
                goto fail_platform_driver;
@@ -588,13 +592,6 @@ static int __init dell_smbios_init(void)
        if (ret)
                goto fail_platform_device_add;
 
-       /* duplicate tokens will cause problems building sysfs files */
-       zero_duplicates(&platform_device->dev);
-
-       ret = build_tokens_sysfs(platform_device);
-       if (ret)
-               goto fail_create_group;
-
        /* register backends */
        wmi = init_dell_smbios_wmi();
        if (wmi)
@@ -605,7 +602,16 @@ static int __init dell_smbios_init(void)
        if (wmi && smm) {
                pr_err("No SMBIOS backends available (wmi: %d, smm: %d)\n",
                        wmi, smm);
-               goto fail_sysfs;
+               goto fail_create_group;
+       }
+
+       if (da_tokens)  {
+               /* duplicate tokens will cause problems building sysfs files */
+               zero_duplicates(&platform_device->dev);
+
+               ret = build_tokens_sysfs(platform_device);
+               if (ret)
+                       goto fail_sysfs;
        }
 
        return 0;
@@ -633,7 +639,8 @@ static void __exit dell_smbios_exit(void)
        exit_dell_smbios_smm();
        mutex_lock(&smbios_mutex);
        if (platform_device) {
-               free_group(platform_device);
+               if (da_tokens)
+                       free_group(platform_device);
                platform_device_unregister(platform_device);
                platform_driver_unregister(&platform_driver);
        }
-- 
2.7.4

Reply via email to