vserver 1.9.5.x5
[linux-2.6.git] / arch / ia64 / sn / kernel / mca.c
index 3b313e0..857774b 100644 (file)
 #include <linux/kernel.h>
 #include <linux/timer.h>
 #include <linux/vmalloc.h>
-#include <asm/sn/sgi.h>
 #include <asm/mca.h>
 #include <asm/sal.h>
 #include <asm/sn/sn_sal.h>
 
-
-
 /*
  * Interval for calling SAL to poll for errors that do NOT cause error
  * interrupts. SAL will raise a CPEI if any errors are present that
@@ -24,7 +21,6 @@
  */
 #define CPEI_INTERVAL  (5*HZ)
 
-
 struct timer_list sn_cpei_timer;
 void sn_init_cpei_timer(void);
 
@@ -42,8 +38,7 @@ static u64 *sn_oemdata_size, sn_oemdata_bufsize;
  * info for platform errors.  buf is appended to sn_oemdata, resizing as
  * required.
  */
-static int
-print_hook(const char *fmt, ...)
+static int print_hook(const char *fmt, ...)
 {
        char buf[400];
        int len;
@@ -55,7 +50,8 @@ print_hook(const char *fmt, ...)
        while (*sn_oemdata_size + len + 1 > sn_oemdata_bufsize) {
                u8 *newbuf = vmalloc(sn_oemdata_bufsize += 1000);
                if (!newbuf) {
-                       printk(KERN_ERR "%s: unable to extend sn_oemdata\n", __FUNCTION__);
+                       printk(KERN_ERR "%s: unable to extend sn_oemdata\n",
+                              __FUNCTION__);
                        return 0;
                }
                memcpy(newbuf, *sn_oemdata, *sn_oemdata_size);
@@ -67,9 +63,7 @@ print_hook(const char *fmt, ...)
        return 0;
 }
 
-
-static void
-sn_cpei_handler(int irq, void *devid, struct pt_regs *regs)
+static void sn_cpei_handler(int irq, void *devid, struct pt_regs *regs)
 {
        /*
         * this function's sole purpose is to call SAL when we receive
@@ -82,16 +76,13 @@ sn_cpei_handler(int irq, void *devid, struct pt_regs *regs)
        ia64_sn_plat_cpei_handler();
 }
 
-
-static void
-sn_cpei_timer_handler(unsigned long dummy)
+static void sn_cpei_timer_handler(unsigned long dummy)
 {
        sn_cpei_handler(-1, NULL, NULL);
        mod_timer(&sn_cpei_timer, jiffies + CPEI_INTERVAL);
 }
 
-void
-sn_init_cpei_timer(void)
+void sn_init_cpei_timer(void)
 {
        init_timer(&sn_cpei_timer);
        sn_cpei_timer.expires = jiffies + CPEI_INTERVAL;
@@ -100,16 +91,14 @@ sn_init_cpei_timer(void)
 }
 
 static int
-sn_platform_plat_specific_err_print(const u8 *sect_header, u8 **oemdata, u64 *oemdata_size)
+sn_platform_plat_specific_err_print(const u8 * sect_header, u8 ** oemdata,
+                                   u64 * oemdata_size)
 {
-       sal_log_plat_specific_err_info_t *psei = (sal_log_plat_specific_err_info_t *)sect_header;
-       if (!psei->valid.oem_data)
-               return 0;
        down(&sn_oemdata_mutex);
        sn_oemdata = oemdata;
        sn_oemdata_size = oemdata_size;
        sn_oemdata_bufsize = 0;
-       ia64_sn_plat_specific_err_print(print_hook, (char *)psei);
+       ia64_sn_plat_specific_err_print(print_hook, (char *)sect_header);
        up(&sn_oemdata_mutex);
        return 0;
 }
@@ -120,13 +109,21 @@ sn_platform_plat_specific_err_print(const u8 *sect_header, u8 **oemdata, u64 *oe
 int sn_salinfo_platform_oemdata(const u8 *sect_header, u8 **oemdata, u64 *oemdata_size)
 {
        efi_guid_t guid = *(efi_guid_t *)sect_header;
+       int valid = 0;
        *oemdata_size = 0;
        vfree(*oemdata);
        *oemdata = NULL;
-       if (efi_guidcmp(guid, SAL_PLAT_SPECIFIC_ERR_SECT_GUID) == 0 ||
-           efi_guidcmp(guid, SAL_PLAT_MEM_DEV_ERR_SECT_GUID) == 0)
+       if (efi_guidcmp(guid, SAL_PLAT_SPECIFIC_ERR_SECT_GUID) == 0) {
+               sal_log_plat_specific_err_info_t *psei = (sal_log_plat_specific_err_info_t *)sect_header;
+               valid = psei->valid.oem_data;
+       } else if (efi_guidcmp(guid, SAL_PLAT_MEM_DEV_ERR_SECT_GUID) == 0) {
+               sal_log_mem_dev_err_info_t *mdei = (sal_log_mem_dev_err_info_t *)sect_header;
+               valid = mdei->valid.oem_data;
+       }
+       if (valid)
                return sn_platform_plat_specific_err_print(sect_header, oemdata, oemdata_size);
-       return 0;
+       else
+               return 0;
 }
 
 static int __init sn_salinfo_init(void)