summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorsos <sos@FreeBSD.org>2005-12-14 13:07:49 +0000
committersos <sos@FreeBSD.org>2005-12-14 13:07:49 +0000
commit024393974926883a14f0ecb8a32bb767f287258f (patch)
treea25997cb077e35ac170bea36b85dfe111b726f01 /sys
parent35ed584f73d859f19ef39c27e7aadc08cba12a88 (diff)
downloadFreeBSD-src-024393974926883a14f0ecb8a32bb767f287258f.zip
FreeBSD-src-024393974926883a14f0ecb8a32bb767f287258f.tar.gz
Add RAID0+1 and RAID5 support to VIA RAID code.
Fix support for multiple arrays.
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/ata/ata-raid.c25
-rw-r--r--sys/dev/ata/ata-raid.h6
2 files changed, 28 insertions, 3 deletions
diff --git a/sys/dev/ata/ata-raid.c b/sys/dev/ata/ata-raid.c
index 41e77a4..016a2e0 100644
--- a/sys/dev/ata/ata-raid.c
+++ b/sys/dev/ata/ata-raid.c
@@ -3407,6 +3407,22 @@ ata_raid_via_read_meta(device_t dev, struct ar_softc **raidp)
raid->total_sectors = meta->disk_sectors;
break;
+ case VIA_T_RAID01:
+ raid->type = AR_T_RAID01;
+ raid->width = meta->stripe_layout & VIA_L_MASK;
+ if (!raid->total_sectors ||
+ (raid->total_sectors > (raid->width * meta->disk_sectors)))
+ raid->total_sectors = raid->width * meta->disk_sectors;
+ break;
+
+ case VIA_T_RAID5:
+ raid->type = AR_T_RAID5;
+ raid->width = meta->stripe_layout & VIA_L_MASK;
+ if (!raid->total_sectors ||
+ (raid->total_sectors > ((raid->width - 1)*meta->disk_sectors)))
+ raid->total_sectors = (raid->width - 1) * meta->disk_sectors;
+ break;
+
case VIA_T_SPAN:
raid->type = AR_T_SPAN;
raid->width = 1;
@@ -3430,10 +3446,12 @@ ata_raid_via_read_meta(device_t dev, struct ar_softc **raidp)
raid->heads = 255;
raid->sectors = 63;
raid->cylinders = raid->total_sectors / (63 * 255);
+ raid->offset_sectors = 0;
+ raid->rebuild_lba = 0;
+ raid->lun = array;
for (disk = 0; disk < 8; disk++) {
- if ((meta->disks[disk] == meta->disk_id) &&
- ((disk * sizeof(int32_t)) == (meta->disk_index & VIA_D_MASK))) {
+ if (meta->disks[disk] == meta->disk_id) {
raid->disks[disk].dev = parent;
raid->disks[disk].sectors = meta->disk_sectors;
raid->disks[disk].flags =
@@ -4390,6 +4408,8 @@ ata_raid_via_type(int type)
switch (type) {
case VIA_T_RAID0: return "RAID0";
case VIA_T_RAID1: return "RAID1";
+ case VIA_T_RAID5: return "RAID5";
+ case VIA_T_RAID01: return "RAID0+1";
case VIA_T_SPAN: return "SPAN";
default: sprintf(buffer, "UNKNOWN 0x%02x", type);
return buffer;
@@ -4407,6 +4427,7 @@ ata_raid_via_print_meta(struct via_raid_conf *meta)
printf("type %s\n",
ata_raid_via_type(meta->type & VIA_T_MASK));
printf("bootable %d\n", meta->type & VIA_T_BOOTABLE);
+ printf("unknown %d\n", meta->type & VIA_T_UNKNOWN);
printf("disk_index 0x%02x\n", meta->disk_index);
printf("stripe_disks %d\n", meta->stripe_layout & VIA_L_MASK);
printf("stripe_sectors %d\n",
diff --git a/sys/dev/ata/ata-raid.h b/sys/dev/ata/ata-raid.h
index 2af8ef3..f807076 100644
--- a/sys/dev/ata/ata-raid.h
+++ b/sys/dev/ata/ata-raid.h
@@ -743,15 +743,19 @@ struct via_raid_conf {
u_int8_t dummy_0;
u_int8_t type;
-#define VIA_T_MASK 0xfe
+#define VIA_T_MASK 0x7e
#define VIA_T_BOOTABLE 0x01
#define VIA_T_RAID0 0x04
#define VIA_T_RAID1 0x0c
+#define VIA_T_RAID01 0x4c
+#define VIA_T_RAID5 0x2c
#define VIA_T_SPAN 0x44
+#define VIA_T_UNKNOWN 0x80
u_int8_t disk_index;
#define VIA_D_MASK 0x0f
#define VIA_D_DEGRADED 0x10
+#define VIA_D_HIGH_IDX 0x20
u_int8_t stripe_layout;
#define VIA_L_MASK 0x07
OpenPOWER on IntegriCloud