chiark / gitweb /
fix GGC signed pointer warnings and switch volume_id to stdint
[elogind.git] / extras / volume_id / volume_id / highpoint.c
index e13fd6de618d5df0a35dd93590155d242bfa561f..baa278ba806042829fab0b1f2475e06f40faf1c8 100644 (file)
 #include <string.h>
 #include <errno.h>
 #include <ctype.h>
-#include <asm/types.h>
 
 #include "volume_id.h"
 #include "logging.h"
 #include "util.h"
 #include "highpoint.h"
 
-struct hpt37x {
-       __u8    filler1[32];
-       __u32   magic;
-       __u32   magic_0;
-       __u32   magic_1;
-} __attribute__((packed)) *hpt;
+struct hpt37x_meta {
+       uint8_t         filler1[32];
+       uint32_t        magic;
+} __attribute__((packed));
+
+struct hpt45x_meta {
+       uint32_t        magic;
+} __attribute__((packed));
 
 #define HPT37X_CONFIG_OFF              0x1200
 #define HPT37X_MAGIC_OK                        0x5a7816f0
 #define HPT37X_MAGIC_BAD               0x5a7816fd
 
-int volume_id_probe_highpoint_ataraid(struct volume_id *id, __u64 off)
+#define HPT45X_MAGIC_OK                        0x5a7816f3
+#define HPT45X_MAGIC_BAD               0x5a7816fd
+
+
+int volume_id_probe_highpoint_37x_raid(struct volume_id *id, uint64_t off)
 {
-       const __u8 *buf;
+       const uint8_t *buf;
+       struct hpt37x_meta *hpt;
+       uint32_t magic;
 
-       dbg("probing at offset %llu", off);
+       dbg("probing at offset 0x%llx", (unsigned long long) off);
 
        buf = volume_id_get_buffer(id, off + HPT37X_CONFIG_OFF, 0x200);
        if (buf == NULL)
                return -1;
 
-       hpt = (struct hpt37x *) buf;
+       hpt = (struct hpt37x_meta *) buf;
+       magic = le32_to_cpu(hpt->magic);
+       if (magic != HPT37X_MAGIC_OK && magic != HPT37X_MAGIC_BAD)
+               return -1;
+
+       volume_id_set_usage(id, VOLUME_ID_RAID);
+       id->type = "highpoint_raid_member";
+
+       return 0;
+}
+
+int volume_id_probe_highpoint_45x_raid(struct volume_id *id, uint64_t off, uint64_t size)
+{
+       const uint8_t *buf;
+       struct hpt45x_meta *hpt;
+       uint64_t meta_off;
+       uint32_t magic;
+
+       dbg("probing at offset 0x%llx, size 0x%llx",
+           (unsigned long long) off, (unsigned long long) size);
+
+       if (size < 0x10000)
+               return -1;
+
+       meta_off = ((size / 0x200)-11) * 0x200;
+       buf = volume_id_get_buffer(id, off + meta_off, 0x200);
+       if (buf == NULL)
+               return -1;
 
-       if (hpt->magic != HPT37X_MAGIC_OK && hpt->magic != HPT37X_MAGIC_BAD)
+       hpt = (struct hpt45x_meta *) buf;
+       magic = le32_to_cpu(hpt->magic);
+       if (magic != HPT45X_MAGIC_OK && magic != HPT45X_MAGIC_BAD)
                return -1;
 
        volume_id_set_usage(id, VOLUME_ID_RAID);
-       id->type = "hpt_ataraid_member";
+       id->type = "highpoint_raid_member";
 
        return 0;
 }