IB/hfi1: Check upper-case EFI variables
authorSebastian Sanchez <sebastian.sanchez@intel.com>
Wed, 8 Feb 2017 13:26:55 +0000 (05:26 -0800)
committerDoug Ledford <dledford@redhat.com>
Sun, 19 Feb 2017 14:18:37 +0000 (09:18 -0500)
The EFI variable that provides board ID is named
by the PCI address of the device, which is published
in upper-case, while the HFI1 driver reads the EFI
variable in lower-case.
This prevents returning the correct board id when
queried through sysfs. Read EFI variables in
upper-case if the lower-case read fails.

Reviewed-by: Easwar Hariharan <easwar.hariharan@intel.com>
Signed-off-by: Sebastian Sanchez <sebastian.sanchez@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/hfi1/efivar.c

index 106349fc1fb9bf5777284e15cfc83e9393ae380c..d106d23016ba0c4c15b56e3bdb33c31bab7f6408 100644 (file)
@@ -45,6 +45,7 @@
  *
  */
 
+#include <linux/ctype.h>
 #include "efivar.h"
 
 /* GUID for HFI1 variables in EFI */
@@ -150,15 +151,32 @@ fail:
 int read_hfi1_efi_var(struct hfi1_devdata *dd, const char *kind,
                      unsigned long *size, void **return_data)
 {
+       char prefix_name[64];
        char name[64];
+       int result;
+       int i;
 
        /* create a common prefix */
-       snprintf(name, sizeof(name), "%04x:%02x:%02x.%x-%s",
+       snprintf(prefix_name, sizeof(prefix_name), "%04x:%02x:%02x.%x",
                 pci_domain_nr(dd->pcidev->bus),
                 dd->pcidev->bus->number,
                 PCI_SLOT(dd->pcidev->devfn),
-                PCI_FUNC(dd->pcidev->devfn),
-                kind);
+                PCI_FUNC(dd->pcidev->devfn));
+       snprintf(name, sizeof(name), "%s-%s", prefix_name, kind);
+       result = read_efi_var(name, size, return_data);
+
+       /*
+        * If reading the lowercase EFI variable fail, read the uppercase
+        * variable.
+        */
+       if (result) {
+               /* Converting to uppercase */
+               for (i = 0; prefix_name[i]; i++)
+                       if (isalpha(prefix_name[i]))
+                               prefix_name[i] = toupper(prefix_name[i]);
+               snprintf(name, sizeof(name), "%s-%s", prefix_name, kind);
+               result = read_efi_var(name, size, return_data);
+       }
 
-       return read_efi_var(name, size, return_data);
+       return result;
 }