]> err.no Git - util-linux/commitdiff
blkid: add Silicon Image Medlay RAID
authorKarel Zak <kzak@redhat.com>
Tue, 9 Sep 2008 09:32:06 +0000 (11:32 +0200)
committerKarel Zak <kzak@redhat.com>
Wed, 11 Feb 2009 22:21:44 +0000 (23:21 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
libs/blkid/src/probe.c
libs/blkid/src/probers/Makefile.am
libs/blkid/src/probers/probers.h
libs/blkid/src/probers/silicon_raid.c [new file with mode: 0644]

index e54c528b811dc8f8f4cd8a852e763c07131c8aae..ac389873212b732cf635c3dc2c877093240b69d6 100644 (file)
@@ -44,7 +44,8 @@ static const struct blkid_idinfo *idinfos[] =
        &jmicron_idinfo,
        &lsi_idinfo,
        &nvraid_idinfo,
-       &pdcraid_idinfo
+       &pdcraid_idinfo,
+       &silraid_idinfo
 };
 
 #ifndef ARRAY_SIZE
index c866fa509a63b1b46ae3fc6533e0373ac5109610..0b36608e65de5cca6cee46e0cca691a7edb9c664 100644 (file)
@@ -13,6 +13,7 @@ libprobers_a_SOURCES =        probers.h \
                        jmicron_raid.c \
                        lsi_raid.c \
                        nvidia_raid.c \
-                       promise_raid.c
+                       promise_raid.c \
+                       silicon_raid.c
 
 all-local: $(lib_LIBRARIES)
index 860280989a80177fe66e02ee6aac08c18e442996..10e2aee5166ebc912a073deccb0f487948f9748c 100644 (file)
@@ -25,5 +25,6 @@ extern const struct blkid_idinfo jmicron_idinfo;
 extern const struct blkid_idinfo lsi_idinfo;
 extern const struct blkid_idinfo nvraid_idinfo;
 extern const struct blkid_idinfo pdcraid_idinfo;
+extern const struct blkid_idinfo silraid_idinfo;
 
 #endif /* _BLKID_PROBE_H */
diff --git a/libs/blkid/src/probers/silicon_raid.c b/libs/blkid/src/probers/silicon_raid.c
new file mode 100644 (file)
index 0000000..1af920a
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2008 Karel Zak <kzak@redhat.com>
+ * Copyright (C) 2005 Kay Sievers <kay.sievers@vrfy.org>
+ *
+ * This file 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; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This file 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 General Public License for more details.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+#include <stdint.h>
+
+#include "blkidP.h"
+
+struct silicon_meta {
+       uint8_t         unknown0[0x2E];
+       uint8_t         ascii_version[0x36 - 0x2E];
+       uint8_t         diskname[0x56 - 0x36];
+       uint8_t         unknown1[0x60 - 0x56];
+       uint32_t        magic;
+       uint32_t        unknown1a[0x6C - 0x64];
+       uint32_t        array_sectors_low;
+       uint32_t        array_sectors_high;
+       uint8_t         unknown2[0x78 - 0x74];
+       uint32_t        thisdisk_sectors;
+       uint8_t         unknown3[0x100 - 0x7C];
+       uint8_t         unknown4[0x104 - 0x100];
+       uint16_t        product_id;
+       uint16_t        vendor_id;
+       uint16_t        minor_ver;
+       uint16_t        major_ver;
+};
+
+#define SILICON_MAGIC          0x2F000000
+
+
+static int probe_silraid(blkid_probe pr, const struct blkid_idmag *mag)
+{
+       uint64_t meta_off;
+       struct silicon_meta *sil;
+
+       if (pr->size < 0x10000)
+               return -1;
+
+       meta_off = ((pr->size / 0x200) - 1) * 0x200;
+
+       sil = (struct silicon_meta *) blkid_probe_get_buffer(pr,
+                                               meta_off, 0x200);
+       if (!sil)
+               return -1;
+
+       if (le32_to_cpu(sil->magic) != SILICON_MAGIC)
+               return -1;
+
+       if (blkid_probe_sprintf_version(pr, "%u.%u",
+                               le16_to_cpu(sil->major_ver),
+                               le16_to_cpu(sil->minor_ver)) != 0)
+               return -1;
+
+       return 0;
+}
+
+const struct blkid_idinfo silraid_idinfo = {
+       .name           = "silicon_medley_raid_member",
+       .usage          = BLKID_USAGE_RAID,
+       .probefunc      = probe_silraid
+};
+
+