Deleted Added
full compact
30c30
< __FBSDID("$FreeBSD: head/sys/dev/ata/ata-raid.c 153416 2005-12-14 13:07:49Z sos $");
---
> __FBSDID("$FreeBSD: head/sys/dev/ata/ata-raid.c 153446 2005-12-15 13:30:23Z sos $");
67a68
> static int ata_raid_wipe_metadata(struct ar_softc *rdp);
83a85
> static int ata_raid_via_write_meta(struct ar_softc *rdp);
911c913
< rdp->disks[disk].sectors = PR_LBA(rdp->disks[disk].dev);
---
> rdp->disks[disk].sectors = PROMISE_LBA(rdp->disks[disk].dev);
941c943
< rdp->disks[disk].sectors = PR_LBA(rdp->disks[disk].dev);
---
> rdp->disks[disk].sectors = PROMISE_LBA(rdp->disks[disk].dev);
1122c1124
< ata_raid_write_metadata(rdp); /* XXX SOS wipe metadata instead? */
---
> ata_raid_wipe_metadata(rdp);
1310a1313,1315
>
> case AR_F_VIA_RAID:
> return ata_raid_via_write_meta(rdp);
1333,1334d1337
< case AR_F_VIA_RAID:
< return ata_raid_via_write_meta(rdp);
1342a1346,1435
> static int
> ata_raid_wipe_metadata(struct ar_softc *rdp)
> {
> int disk, error = 0;
> u_int64_t lba;
> u_int32_t size;
> u_int8_t *meta;
>
> for (disk = 0; disk < rdp->total_disks; disk++) {
> if (rdp->disks[disk].dev) {
> switch (rdp->format) {
> case AR_F_ADAPTEC_RAID:
> lba = ADP_LBA(rdp->disks[disk].dev);
> size = sizeof(struct adaptec_raid_conf);
> break;
>
> case AR_F_HPTV2_RAID:
> lba = HPTV2_LBA(rdp->disks[disk].dev);
> size = sizeof(struct hptv2_raid_conf);
> break;
>
> case AR_F_HPTV3_RAID:
> lba = HPTV3_LBA(rdp->disks[disk].dev);
> size = sizeof(struct hptv3_raid_conf);
> break;
>
> case AR_F_INTEL_RAID:
> lba = INTEL_LBA(rdp->disks[disk].dev);
> size = 3 * 512; /* XXX SOS */
> break;
>
> case AR_F_ITE_RAID:
> lba = ITE_LBA(rdp->disks[disk].dev);
> size = sizeof(struct ite_raid_conf);
> break;
>
> case AR_F_LSIV2_RAID:
> lba = LSIV2_LBA(rdp->disks[disk].dev);
> size = sizeof(struct lsiv2_raid_conf);
> break;
>
> case AR_F_LSIV3_RAID:
> lba = LSIV3_LBA(rdp->disks[disk].dev);
> size = sizeof(struct lsiv3_raid_conf);
> break;
>
> case AR_F_NVIDIA_RAID:
> lba = NVIDIA_LBA(rdp->disks[disk].dev);
> size = sizeof(struct nvidia_raid_conf);
> break;
>
> case AR_F_FREEBSD_RAID:
> case AR_F_PROMISE_RAID:
> lba = PROMISE_LBA(rdp->disks[disk].dev);
> size = sizeof(struct promise_raid_conf);
> break;
>
> case AR_F_SII_RAID:
> lba = SII_LBA(rdp->disks[disk].dev);
> size = sizeof(struct sii_raid_conf);
> break;
>
> case AR_F_SIS_RAID:
> lba = SIS_LBA(rdp->disks[disk].dev);
> size = sizeof(struct sis_raid_conf);
> break;
>
> case AR_F_VIA_RAID:
> lba = VIA_LBA(rdp->disks[disk].dev);
> size = sizeof(struct via_raid_conf);
> break;
>
> default:
> printf("ar%d: wiping of %s metadata is NOT supported yet\n",
> rdp->lun, ata_raid_format(rdp));
> return ENXIO;
> }
> if (!(meta = malloc(size, M_AR, M_NOWAIT | M_ZERO)))
> return ENOMEM;
> if (ata_raid_rw(rdp->disks[disk].dev, lba, meta, size,
> ATA_R_WRITE | ATA_R_DIRECT)) {
> device_printf(rdp->disks[disk].dev, "wipe metadata failed\n");
> error = EIO;
> }
> free(meta, M_AR);
> }
> }
> return error;
> }
>
2667c2760
< if (ata_raid_rw(parent, PR_LBA(parent),
---
> if (ata_raid_rw(parent, PROMISE_LBA(parent),
2976c3069,3070
< if (ata_raid_rw(rdp->disks[disk].dev, PR_LBA(rdp->disks[disk].dev),
---
> if (ata_raid_rw(rdp->disks[disk].dev,
> PROMISE_LBA(rdp->disks[disk].dev),
3365c3459
< /* calc the checksum and compare for valid */
---
> /* calculate checksum and compare for valid */
3398c3492
< raid->width = meta->stripe_layout & VIA_L_MASK;
---
> raid->width = meta->stripe_layout & VIA_L_DISKS;
3412c3506
< raid->width = meta->stripe_layout & VIA_L_MASK;
---
> raid->width = meta->stripe_layout & VIA_L_DISKS;
3420c3514
< raid->width = meta->stripe_layout & VIA_L_MASK;
---
> raid->width = meta->stripe_layout & VIA_L_DISKS;
3441c3535,3536
< raid->interleave = 0x08 << (meta->stripe_layout >> VIA_L_SHIFT);
---
> raid->interleave =
> 0x08 << ((meta->stripe_layout & VIA_L_MASK) >> VIA_L_SHIFT);
3453c3548
< for (disk = 0; disk < 8; disk++) {
---
> for (disk = 0; disk < raid->total_disks; disk++) {
3455a3551,3552
> bcopy(&meta->disk_id, raid->disks[disk].serial,
> sizeof(u_int32_t));
3471a3569,3573
> static int
> ata_raid_via_write_meta(struct ar_softc *rdp)
> {
> struct via_raid_conf *meta;
> int disk, error = 0;
3472a3575,3653
> if (!(meta = (struct via_raid_conf *)
> malloc(sizeof(struct via_raid_conf), M_AR, M_NOWAIT | M_ZERO))) {
> printf("ar%d: failed to allocate metadata storage\n", rdp->lun);
> return ENOMEM;
> }
>
> rdp->generation++;
>
> meta->magic = VIA_MAGIC;
> meta->dummy_0 = 0x02;
> switch (rdp->type) {
> case AR_T_SPAN:
> meta->type = VIA_T_SPAN;
> meta->stripe_layout = (rdp->total_disks & VIA_L_DISKS);
> break;
>
> case AR_T_RAID0:
> meta->type = VIA_T_RAID0;
> meta->stripe_layout = ((rdp->interleave >> 1) & VIA_L_MASK);
> meta->stripe_layout |= (rdp->total_disks & VIA_L_DISKS);
> break;
>
> case AR_T_RAID1:
> meta->type = VIA_T_RAID1;
> meta->stripe_layout = (rdp->total_disks & VIA_L_DISKS);
> break;
>
> case AR_T_RAID5:
> meta->type = VIA_T_RAID5;
> meta->stripe_layout = ((rdp->interleave >> 1) & VIA_L_MASK);
> meta->stripe_layout |= (rdp->total_disks & VIA_L_DISKS);
> break;
>
> case AR_T_RAID01:
> meta->type = VIA_T_RAID01;
> meta->stripe_layout = ((rdp->interleave >> 1) & VIA_L_MASK);
> meta->stripe_layout |= (rdp->width & VIA_L_DISKS);
> break;
>
> default:
> free(meta, M_AR);
> return ENODEV;
> }
> meta->type |= VIA_T_BOOTABLE; /* XXX SOS */
> meta->disk_sectors =
> rdp->total_sectors / (rdp->width - (rdp->type == AR_RAID5));
> for (disk = 0; disk < rdp->total_disks; disk++)
> meta->disks[disk] = (u_int32_t)rdp->disks[disk].dev;
>
> for (disk = 0; disk < rdp->total_disks; disk++) {
> if (rdp->disks[disk].dev) {
> u_int8_t *ptr;
> int count;
>
> meta->disk_index = disk * sizeof(u_int32_t);
> if (rdp->type == AR_T_RAID01)
> meta->disk_index = ((meta->disk_index & 0x08) << 2) |
> (meta->disk_index & ~0x08);
> meta->disk_id = meta->disks[disk];
> meta->checksum = 0;
> for (ptr = (u_int8_t *)meta, count = 0; count < 50; count++)
> meta->checksum += *ptr++;
>
> if (testing || bootverbose)
> ata_raid_via_print_meta(meta);
>
> if (ata_raid_rw(rdp->disks[disk].dev,
> VIA_LBA(rdp->disks[disk].dev),
> meta, sizeof(struct via_raid_conf),
> ATA_R_WRITE | ATA_R_DIRECT)) {
> device_printf(rdp->disks[disk].dev, "write metadata failed\n");
> error = EIO;
> }
> }
> }
> free(meta, M_AR);
> return error;
> }
>
4432,4434c4613,4616
< printf("stripe_disks %d\n", meta->stripe_layout & VIA_L_MASK);
< printf("stripe_sectors %d\n",
< 0x08 << (meta->stripe_layout >> VIA_L_SHIFT));
---
> printf("stripe_layout 0x%02x\n", meta->stripe_layout);
> printf(" stripe_disks %d\n", meta->stripe_layout & VIA_L_DISKS);
> printf(" stripe_sectors %d\n",
> 0x08 << ((meta->stripe_layout & VIA_L_MASK) >> VIA_L_SHIFT));