summaryrefslogtreecommitdiffstats
path: root/sys/dev/ata/ata-raid.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/ata/ata-raid.h')
-rw-r--r--sys/dev/ata/ata-raid.h198
1 files changed, 117 insertions, 81 deletions
diff --git a/sys/dev/ata/ata-raid.h b/sys/dev/ata/ata-raid.h
index c5a242e..acc3eb0 100644
--- a/sys/dev/ata/ata-raid.h
+++ b/sys/dev/ata/ata-raid.h
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2000,2001 Søren Schmidt <sos@FreeBSD.org>
+ * Copyright (c) 2000,2001,2002 Søren Schmidt <sos@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -28,44 +28,62 @@
* $FreeBSD$
*/
+struct ar_disk {
+ struct ata_device *device;
+ off_t last_lba; /* last lba used */
+ int flags;
+#define AR_DF_PRESENT 0x00000001
+#define AR_DF_ASSIGNED 0x00000002
+#define AR_DF_SPARE 0x00000004
+#define AR_DF_ONLINE 0x00000008
+};
+
+#define MAX_ARRAYS 16
+#define MAX_DISKS 16
+#define AR_PROXIMITY 2048
+
struct ar_softc {
- int lun;
- int32_t magic_0;
- int32_t magic_1;
- int flags;
-#define AR_F_RAID_0 0x0001 /* STRIPE */
-#define AR_F_RAID_1 0x0002 /* MIRROR */
-#define AR_F_SPAN 0x0004 /* SPAN */
-#define AR_F_CONF_DONE 0x0008
+ int lun;
+ int32_t magic_0; /* ident for this array */
+ int32_t magic_1; /* ident for this array */
+ int flags;
+#define AR_F_RAID0 0x0001 /* STRIPE */
+#define AR_F_RAID1 0x0002 /* MIRROR */
+#define AR_F_SPAN 0x0004 /* SPAN */
+#define AR_F_READY 0x0100
+#define AR_F_DEGRADED 0x0200
+#define AR_F_REBUILDING 0x0400
+#define AR_F_PROMISE_RAID 0x1000
+#define AR_F_HIGHPOINT_RAID 0x2000
- int num_subdisks;
- struct ad_softc *subdisk[8];
- int num_mirrordisks;
- struct ad_softc *mirrordisk[8];
- int interleave;
- int last_disk;
- int32_t last_lba[8][2];
-
- u_int16_t heads;
- u_int16_t sectors;
- u_int32_t cylinders;
- u_int32_t total_secs;
- int reserved; /* sectors that are NOT to be used */
- int offset; /* offset from start of disk */
-
- struct disk disk; /* disklabel/slice stuff */
- dev_t dev; /* device place holder */
-
+ int total_disks; /* number of disks in this array */
+ int generation; /* generation of this array */
+ struct ar_disk disks[MAX_DISKS]; /* ptr to each disk in array */
+ int width; /* array width in disks */
+ u_int16_t heads;
+ u_int16_t sectors;
+ u_int32_t cylinders;
+ u_int64_t total_sectors;
+ int interleave; /* interleave in bytes */
+ int reserved; /* sectors that are NOT to be used */
+ int offset; /* offset from start of disk */
+ u_int64_t lock_start; /* start of locked area for rebuild */
+ u_int64_t lock_end; /* end of locked area for rebuild */
+ struct disk disk; /* disklabel/slice stuff */
+ dev_t dev; /* device place holder */
};
struct ar_buf {
- struct bio bp;
- struct bio *org;
- int drive;
- struct ar_buf *mirror;
- int done;
+ struct bio bp;
+ struct bio *org;
+ struct ar_buf *mirror;
+ int drive;
+ int flags;
+#define AB_F_DONE 0x01
};
+#define HPT_LBA 9
+
struct highpoint_raid_conf {
int8_t filler1[32];
u_int32_t magic; /* 0x20 */
@@ -75,24 +93,27 @@ struct highpoint_raid_conf {
u_int32_t magic_0;
u_int32_t magic_1;
u_int32_t order;
-#define HPT_O_MIRROR 0x01
-#define HPT_O_STRIPE 0x02
+#define HPT_O_RAID0 0x00
+#define HPT_O_RAID1 0x01
+#define HPT_O_RAID01DST 0x02
+#define HPT_O_RAID01SRC 0x03
+#define HPT_O_RAIDMASK 0x03
#define HPT_O_OK 0x04
- u_int8_t raid_disks;
- u_int8_t raid0_shift;
+ u_int8_t array_width;
+ u_int8_t stripe_shift;
u_int8_t type;
-#define HPT_T_RAID_0 0x00
-#define HPT_T_RAID_1 0x01
-#define HPT_T_RAID_01_RAID_0 0x02
+#define HPT_T_RAID0 0x00
+#define HPT_T_RAID1 0x01
+#define HPT_T_RAID01_RAID0 0x02
#define HPT_T_SPAN 0x03
#define HPT_T_RAID_3 0x04
#define HPT_T_RAID_5 0x05
#define HPT_T_SINGLEDISK 0x06
-#define HPT_T_RAID_01_RAID_1 0x07
+#define HPT_T_RAID01_RAID1 0x07
u_int8_t disk_number;
- u_int32_t total_secs;
+ u_int32_t total_sectors;
u_int32_t disk_mode;
u_int32_t boot_mode;
u_int8_t boot_disk;
@@ -102,8 +123,8 @@ struct highpoint_raid_conf {
struct {
u_int32_t timestamp;
u_int8_t reason;
-#define HPT_R_REMOVED 0xfe
-#define HPT_R_BROKEN 0xff
+#define HPT_R_REMOVED 0xfe
+#define HPT_R_BROKEN 0xff
u_int8_t disk;
u_int8_t status;
@@ -113,62 +134,77 @@ struct highpoint_raid_conf {
int8_t filler2[60];
} __attribute__((packed));
+#define PR_LBA(adp) \
+ (((adp->total_secs / (adp->heads * adp->sectors)) * \
+ adp->heads * adp->sectors) - adp->sectors)
+
struct promise_raid_conf {
char promise_id[24];
#define PR_MAGIC "Promise Technology, Inc."
- int32_t dummy_0;
- int8_t magic_0[8];
- int16_t magic_1;
- int32_t magic_2;
- int8_t filler1[470];
+ u_int32_t dummy_0;
+ u_int8_t magic_0[8];
+ u_int16_t magic_1;
+ u_int32_t magic_2;
+ u_int8_t filler1[470];
struct {
- int32_t flags; /* 0x200 */
-#define PR_F_READY 0x00000080
-#define PR_F_SPARE 0x00000040
-#define PR_F_DOWN 0x00000020
+ u_int32_t integrity; /* 0x200 */
+#define PR_I_VALID 0x00000080
+
+ u_int8_t flags;
#define PR_F_VALID 0x00000001
+#define PR_F_ONLINE 0x00000002
+#define PR_F_ASSIGNED 0x00000004
+#define PR_F_SPARE 0x00000008
+#define PR_F_DUPLICATE 0x00000010
+#define PR_F_REDIR 0x00000020
+#define PR_F_DOWN 0x00000040
+#define PR_F_READY 0x00000080
- int8_t dummy_0;
- int8_t disk_number;
- int8_t channel;
- int8_t device;
- int8_t magic_0[8];
- int32_t disk_offset; /* 0x210 */
- int32_t disk_secs;
- int32_t dummy_1;
- int16_t dummy_2;
- int8_t status;
-#define PR_S_DEFINED 0x01
-#define PR_S_ONLINE 0x02
-#define PR_S_OFFLINE 0x10
-
- int8_t type;
-#define PR_T_STRIPE 0x00
-#define PR_T_MIRROR 0x01
-#define PR_T_STRIPE_MIRROR 0x04
-#define PR_T_SPAN 0x08
+ u_int8_t disk_number;
+ u_int8_t channel;
+ u_int8_t device;
+ u_int8_t magic_0[8];
+ u_int32_t disk_offset; /* 0x210 */
+ u_int32_t disk_sectors;
+ u_int32_t dummy_1;
+ u_int16_t generation;
+ u_int8_t status;
+#define PR_S_VALID 0x01
+#define PR_S_ONLINE 0x02
+#define PR_S_INITED 0x04
+#define PR_S_READY 0x08
+#define PR_S_DEGRADED 0x10
+#define PR_S_MARKED 0x20
+
+ u_int8_t type;
+#define PR_T_RAID0 0x00
+#define PR_T_RAID1 0x01
+#define PR_T_RAID3 0x02
+#define PR_T_RAID5 0x04
+#define PR_T_SPAN 0x08
u_int8_t total_disks; /* 0x220 */
- u_int8_t raid0_shift;
- u_int8_t raid0_disks;
+ u_int8_t stripe_shift;
+ u_int8_t array_width;
u_int8_t array_number;
- u_int32_t total_secs;
+ u_int32_t total_sectors;
u_int16_t cylinders;
u_int8_t heads;
u_int8_t sectors;
int8_t magic_1[8];
- struct {
- int8_t flags;
- int8_t dummy_0;
- int8_t channel;
- int8_t device;
- int8_t magic_0[8];
+ struct { /* 0x240 */
+ u_int8_t flags;
+ u_int8_t dummy_0;
+ u_int8_t channel;
+ u_int8_t device;
+ u_int8_t magic_0[8];
} disk[8];
} raid;
int32_t filler2[346];
- uint32_t checksum;
+ u_int32_t checksum;
} __attribute__((packed));
int ar_probe(struct ad_softc *);
+void ar_attach(void);
OpenPOWER on IntegriCloud