chiark / gitweb /
Merge branch 'master' from gregkh@master.kernel.org:/pub/scm/linux/hotplug/udev
[elogind.git] / extras / volume_id / volume_id / highpoint.c
index 72f7d28429413e111aac2165718cf42fa6b61cb8..33c4a8c9c0bff7643838271697491d1ee1808a48 100644 (file)
@@ -3,19 +3,9 @@
  *
  * Copyright (C) 2004 Kay Sievers <kay.sievers@vrfy.org>
  *
- *     This library is free software; you can redistribute it and/or
- *     modify it under the terms of the GNU Lesser General Public
- *     License as published by the Free Software Foundation; either
- *     version 2.1 of the License, or (at your option) any later version.
- *
- *     This library is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- *     Lesser General Public License for more details.
- *
- *     You should have received a copy of the GNU Lesser General Public
- *     License along with this library; if not, write to the Free Software
- *     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *     This program is free software; you can redistribute it and/or modify it
+ *     under the terms of the GNU General Public License as published by the
+ *     Free Software Foundation version 2 of the License.
  */
 
 #ifndef _GNU_SOURCE
 #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 0x%llx", (unsigned long long) off);
 
@@ -60,13 +57,42 @@ int volume_id_probe_highpoint_ataraid(struct volume_id *id, __u64 off)
        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;
 }