diff options
author | sos <sos@FreeBSD.org> | 2003-02-20 20:02:32 +0000 |
---|---|---|
committer | sos <sos@FreeBSD.org> | 2003-02-20 20:02:32 +0000 |
commit | 93c9b5f5d15135bbb2fbe83962364b1b8d98dd7b (patch) | |
tree | 21f00885355e44a0cfacbbf172b07133dc03eb36 /sys/dev/ata/ata-raid.c | |
parent | 465aae958c94f33f1c58bf6e4932b8bbb8ac7c73 (diff) | |
download | FreeBSD-src-93c9b5f5d15135bbb2fbe83962364b1b8d98dd7b.zip FreeBSD-src-93c9b5f5d15135bbb2fbe83962364b1b8d98dd7b.tar.gz |
First round off updates/fixes to the ATA driver.
This moves all chipset specific code to a new file 'ata-chipset.c'.
Extensive use of tables and pointers to avoid having the same switch
on chipset type in several places, and to allow substituting various
functions for different HW arch needs.
Added PIO mode setup and all DMA modes.
Support for all known SiS chipsets. Thanks to Christoph Kukulies for
sponsoring a nice ASUS P4S8X SiS648 based board for this work!
Tested on: i386, PC98, alpha and sparc64
Diffstat (limited to 'sys/dev/ata/ata-raid.c')
-rw-r--r-- | sys/dev/ata/ata-raid.c | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/sys/dev/ata/ata-raid.c b/sys/dev/ata/ata-raid.c index 6dae432..909f20f 100644 --- a/sys/dev/ata/ata-raid.c +++ b/sys/dev/ata/ata-raid.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2000,2001,2002 Søren Schmidt <sos@FreeBSD.org> + * Copyright (c) 2000 - 2003 Søren Schmidt <sos@FreeBSD.org> * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -46,6 +46,7 @@ #include <machine/bus.h> #include <sys/rman.h> #include <dev/ata/ata-all.h> +#include <dev/ata/ata-pci.h> #include <dev/ata/ata-disk.h> #include <dev/ata/ata-raid.h> @@ -119,16 +120,12 @@ ata_raiddisk_attach(struct ad_softc *adp) return 0; } - switch(adp->device->channel->chiptype) { - case 0x4d33105a: case 0x4d38105a: case 0x4d30105a: - case 0x0d30105a: case 0x4d68105a: case 0x6268105a: - case 0x4d69105a: case 0x5275105a: case 0x6269105a: - case 0x7275105a: - + switch(adp->device->channel->chiptype & 0xffff) { + case ATA_PROMISE_ID: /* test RAID bit in PCI reg XXX */ return (ar_promise_read_conf(adp, ar_table, 0)); - case 0x00041103: case 0x00051103: case 0x00081103: + case ATA_HIGHPOINT_ID: return (ar_highpoint_read_conf(adp, ar_table)); default: @@ -228,7 +225,7 @@ ar_attach_raid(struct ar_softc *rdp, int update) else printf(" %d FREE ", disk); ad_print(AD_SOFTC(rdp->disks[disk])); - printf(" "); + printf(" "); ata_enclosure_print(AD_SOFTC(rdp->disks[disk])->device); } else if (rdp->disks[disk].flags & AR_DF_ASSIGNED) @@ -276,7 +273,7 @@ ata_raid_create(struct raid_setup *setup) } switch (rdp->disks[disk].device->channel->chiptype & 0xffff) { - case 0x1103: + case ATA_HIGHPOINT_ID: ctlr |= AR_F_HIGHPOINT_RAID; rdp->disks[disk].disk_sectors = AD_SOFTC(rdp->disks[disk])->total_secs; @@ -286,7 +283,7 @@ ata_raid_create(struct raid_setup *setup) ctlr |= AR_F_FREEBSD_RAID; /* FALLTHROUGH */ - case 0x105a: + case ATA_PROMISE_ID: ctlr |= AR_F_PROMISE_RAID; rdp->disks[disk].disk_sectors = PR_LBA(AD_SOFTC(rdp->disks[disk])); @@ -302,7 +299,7 @@ ata_raid_create(struct raid_setup *setup) rdp->flags |= ctlr; if (disk_size) - disk_size = min(rdp->disks[disk].disk_sectors, disk_size); + disk_size = min(rdp->disks[disk].disk_sectors, disk_size); else disk_size = rdp->disks[disk].disk_sectors; rdp->disks[disk].flags = @@ -376,7 +373,14 @@ ata_raid_create(struct raid_setup *setup) rdp->flags |= AR_F_READY; ar_table[array] = rdp; + + /* kick off rebuild here */ + if (setup->type == 2) { + rdp->disks[1].flags &= ~AR_DF_ONLINE; + rdp->disks[1].flags |= AR_DF_SPARE; + } ar_attach_raid(rdp, 1); + ata_raid_rebuild(array); setup->unit = array; return 0; } @@ -1184,7 +1188,7 @@ ar_promise_read_conf(struct ad_softc *adp, struct ar_softc **raidp, int local) if (!info->raid.generation || info->raid.generation > raid->generation){ raid->generation = info->raid.generation; raid->flags = AR_F_PROMISE_RAID; - if (local) + if (local) raid->flags |= AR_F_FREEBSD_RAID; raid->magic_0 = magic; raid->lun = array; |