From 0b0678b19306167e152ea68ecd76211842ff3b1a Mon Sep 17 00:00:00 2001 From: sos Date: Fri, 8 Mar 2002 11:33:52 +0000 Subject: [PATCH] Support newer Highpoint BIOS's extended config. --- sys/dev/ata/ata-raid.c | 37 ++++++++++++++++--------------------- sys/dev/ata/ata-raid.h | 11 +++++++++-- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/sys/dev/ata/ata-raid.c b/sys/dev/ata/ata-raid.c index 5724fab5b9c7..0f61f4f9b2a4 100644 --- a/sys/dev/ata/ata-raid.c +++ b/sys/dev/ata/ata-raid.c @@ -814,8 +814,11 @@ ar_highpoint_write_conf(struct ar_softc *rdp) if ((rdp->disks[disk].flags & (AR_DF_PRESENT | AR_DF_ONLINE)) == (AR_DF_PRESENT | AR_DF_ONLINE)) config->magic = HPT_MAGIC_OK; - if (rdp->disks[disk].flags & AR_DF_ASSIGNED) + if (rdp->disks[disk].flags & AR_DF_ASSIGNED) { config->magic_0 = rdp->magic_0; + config->magic_2 = HPT_MAGIC_2; + strcpy(config->name_1, "FreeBSD ATARAID"); + } config->disk_number = disk; switch (rdp->flags & (AR_F_RAID0 | AR_F_RAID1 | AR_F_SPAN)) { @@ -825,44 +828,36 @@ ar_highpoint_write_conf(struct ar_softc *rdp) config->order = HPT_O_READY; else config->order = HPT_O_DOWN; + strcpy(config->name_2, "RAID 0"); break; case AR_F_RAID1: config->type = HPT_T_RAID1; config->disk_number = (disk < rdp->width) ? disk : disk + 10; + strcpy(config->name_2, "RAID 1"); break; case AR_F_RAID0 | AR_F_RAID1: config->magic_1 = rdp->magic_1; config->type = HPT_T_RAID01_RAID0; -#if 0 - if ((rdp->flags & (AR_F_READY | AR_F_DEGRADED)) == AR_F_READY) - if (disk < rdp->width) - config->order = HPT_O_RAID01SRC; - else - config->order = HPT_O_RAID01DST; - else - if (rdp->disks[disk].flags & AR_DF_ONLINE) - config->order = HPT_O_RAID01DEGRADED; - else - config->order = HPT_O_DOWN; -#else if (rdp->disks[disk].flags & AR_DF_ONLINE) - if (disk < rdp->width) + if (disk < rdp->width) { config->order = HPT_O_RAID01SRC; - else + config->magic_0 = rdp->magic_0 - 1; + strcpy(config->name_2, "RAID 0+1 SRC"); + } + else { config->order = HPT_O_RAID01DST; + config->disk_number -= rdp->width; + strcpy(config->name_2, "RAID 0+1 DST"); + } else config->order = HPT_O_DOWN; -#endif - if (disk >= rdp->width) { - config->magic_0 = rdp->magic_0 + 1; - config->disk_number -= rdp->width; - } break; case AR_F_SPAN: config->type = HPT_T_SPAN; + strcpy(config->name_2, "SPAN"); break; } @@ -1174,7 +1169,7 @@ ar_rw(struct ad_softc *adp, u_int32_t lba, int count, caddr_t data, int flags) if (flags & AR_WAIT) bp->bio_done = (void *)wakeup; else - bp->bio_done = ar_rw_done; + bp->bio_done = ar_rw_done; AR_STRATEGY(bp); if (flags & AR_WAIT) { error = tsleep(bp, PRIBIO, "arrw", 0); diff --git a/sys/dev/ata/ata-raid.h b/sys/dev/ata/ata-raid.h index 9b10af6c04c6..03a7e16aae60 100644 --- a/sys/dev/ata/ata-raid.h +++ b/sys/dev/ata/ata-raid.h @@ -35,7 +35,7 @@ #define AR_READ 0x01 #define AR_WRITE 0x02 #define AR_WAIT 0x04 -#define AR_STRATEGY(x) (x)->bio_dev->si_disk->d_devsw->d_strategy((x)) +#define AR_STRATEGY(x) (x)->bio_dev->si_disk->d_devsw->d_strategy((x)) #define AD_SOFTC(x) ((struct ad_softc *)(x.device->driver)) struct ar_disk { @@ -137,7 +137,14 @@ struct highpoint_raid_conf { u_int8_t sectors; u_int32_t lba; } errorlog[32]; - int8_t filler2[60]; + int8_t filler2[16]; + u_int32_t magic_2; +#define HPT_MAGIC_2 0x7fffffff + u_int8_t dummy_1; + u_int8_t name_1[15]; + u_int8_t dummy_2; + u_int8_t name_2[15]; + int8_t filler3[8]; } __attribute__((packed));