platform/x86: dell-smbios-base: Support systems without tokens
authorMario Limonciello <mario.limonciello@dell.com>
Fri, 15 Jun 2018 17:12:51 +0000 (12:12 -0500)
committerDarren Hart (VMware) <dvhart@infradead.org>
Tue, 26 Jun 2018 22:01:52 +0000 (15:01 -0700)
Some Dell servers can use dell-smbios but they don't support the
token interface.  Make it optional.

Signed-off-by: Mario Limonciello <mario.limonciello@dell.com>
Signed-off-by: Darren Hart (VMware) <dvhart@infradead.org>
drivers/platform/x86/dell-smbios-base.c

index 9dc282e..0537d44 100644 (file)
@@ -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];
@@ -565,11 +574,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;
@@ -583,13 +587,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)
@@ -600,7 +597,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;
@@ -628,7 +634,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);
        }