Deleted Added
full compact
ata-raid.c (153416) ata-raid.c (153446)
1/*-
2 * Copyright (c) 2000 - 2005 S�ren Schmidt <sos@FreeBSD.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer,
10 * without modification, immediately at the beginning of the file.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 2000 - 2005 S�ren Schmidt <sos@FreeBSD.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer,
10 * without modification, immediately at the beginning of the file.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <sys/cdefs.h>
30__FBSDID("$FreeBSD: head/sys/dev/ata/ata-raid.c 153416 2005-12-14 13:07:49Z sos $");
30__FBSDID("$FreeBSD: head/sys/dev/ata/ata-raid.c 153446 2005-12-15 13:30:23Z sos $");
31
32#include "opt_ata.h"
33#include <sys/param.h>
34#include <sys/systm.h>
35#include <sys/ata.h>
36#include <sys/kernel.h>
37#include <sys/malloc.h>
38#include <sys/module.h>
39#include <sys/endian.h>
40#include <sys/bio.h>
41#include <sys/bus.h>
42#include <sys/conf.h>
43#include <sys/disk.h>
44#include <sys/cons.h>
45#include <sys/sema.h>
46#include <sys/taskqueue.h>
47#include <vm/uma.h>
48#include <machine/bus.h>
49#include <sys/rman.h>
50#include <dev/pci/pcivar.h>
51#include <geom/geom_disk.h>
52#include <dev/ata/ata-all.h>
53#include <dev/ata/ata-disk.h>
54#include <dev/ata/ata-raid.h>
55#include <dev/ata/ata-pci.h>
56#include <ata_if.h>
57
58/* prototypes */
59static void ata_raid_done(struct ata_request *request);
60static void ata_raid_config_changed(struct ar_softc *rdp, int writeback);
61static int ata_raid_status(struct ata_ioc_raid_config *config);
62static int ata_raid_create(struct ata_ioc_raid_config *config);
63static int ata_raid_delete(int array);
64static int ata_raid_addspare(struct ata_ioc_raid_config *config);
65static int ata_raid_rebuild(int array);
66static int ata_raid_read_metadata(device_t subdisk);
67static int ata_raid_write_metadata(struct ar_softc *rdp);
31
32#include "opt_ata.h"
33#include <sys/param.h>
34#include <sys/systm.h>
35#include <sys/ata.h>
36#include <sys/kernel.h>
37#include <sys/malloc.h>
38#include <sys/module.h>
39#include <sys/endian.h>
40#include <sys/bio.h>
41#include <sys/bus.h>
42#include <sys/conf.h>
43#include <sys/disk.h>
44#include <sys/cons.h>
45#include <sys/sema.h>
46#include <sys/taskqueue.h>
47#include <vm/uma.h>
48#include <machine/bus.h>
49#include <sys/rman.h>
50#include <dev/pci/pcivar.h>
51#include <geom/geom_disk.h>
52#include <dev/ata/ata-all.h>
53#include <dev/ata/ata-disk.h>
54#include <dev/ata/ata-raid.h>
55#include <dev/ata/ata-pci.h>
56#include <ata_if.h>
57
58/* prototypes */
59static void ata_raid_done(struct ata_request *request);
60static void ata_raid_config_changed(struct ar_softc *rdp, int writeback);
61static int ata_raid_status(struct ata_ioc_raid_config *config);
62static int ata_raid_create(struct ata_ioc_raid_config *config);
63static int ata_raid_delete(int array);
64static int ata_raid_addspare(struct ata_ioc_raid_config *config);
65static int ata_raid_rebuild(int array);
66static int ata_raid_read_metadata(device_t subdisk);
67static int ata_raid_write_metadata(struct ar_softc *rdp);
68static int ata_raid_wipe_metadata(struct ar_softc *rdp);
68static int ata_raid_adaptec_read_meta(device_t dev, struct ar_softc **raidp);
69static int ata_raid_hptv2_read_meta(device_t dev, struct ar_softc **raidp);
70static int ata_raid_hptv2_write_meta(struct ar_softc *rdp);
71static int ata_raid_hptv3_read_meta(device_t dev, struct ar_softc **raidp);
72static int ata_raid_intel_read_meta(device_t dev, struct ar_softc **raidp);
73static int ata_raid_intel_write_meta(struct ar_softc *rdp);
74static int ata_raid_ite_read_meta(device_t dev, struct ar_softc **raidp);
75static int ata_raid_lsiv2_read_meta(device_t dev, struct ar_softc **raidp);
76static int ata_raid_lsiv3_read_meta(device_t dev, struct ar_softc **raidp);
77static int ata_raid_nvidia_read_meta(device_t dev, struct ar_softc **raidp);
78static int ata_raid_promise_read_meta(device_t dev, struct ar_softc **raidp, int native);
79static int ata_raid_promise_write_meta(struct ar_softc *rdp);
80static int ata_raid_sii_read_meta(device_t dev, struct ar_softc **raidp);
81static int ata_raid_sis_read_meta(device_t dev, struct ar_softc **raidp);
82static int ata_raid_sis_write_meta(struct ar_softc *rdp);
83static int ata_raid_via_read_meta(device_t dev, struct ar_softc **raidp);
69static int ata_raid_adaptec_read_meta(device_t dev, struct ar_softc **raidp);
70static int ata_raid_hptv2_read_meta(device_t dev, struct ar_softc **raidp);
71static int ata_raid_hptv2_write_meta(struct ar_softc *rdp);
72static int ata_raid_hptv3_read_meta(device_t dev, struct ar_softc **raidp);
73static int ata_raid_intel_read_meta(device_t dev, struct ar_softc **raidp);
74static int ata_raid_intel_write_meta(struct ar_softc *rdp);
75static int ata_raid_ite_read_meta(device_t dev, struct ar_softc **raidp);
76static int ata_raid_lsiv2_read_meta(device_t dev, struct ar_softc **raidp);
77static int ata_raid_lsiv3_read_meta(device_t dev, struct ar_softc **raidp);
78static int ata_raid_nvidia_read_meta(device_t dev, struct ar_softc **raidp);
79static int ata_raid_promise_read_meta(device_t dev, struct ar_softc **raidp, int native);
80static int ata_raid_promise_write_meta(struct ar_softc *rdp);
81static int ata_raid_sii_read_meta(device_t dev, struct ar_softc **raidp);
82static int ata_raid_sis_read_meta(device_t dev, struct ar_softc **raidp);
83static int ata_raid_sis_write_meta(struct ar_softc *rdp);
84static int ata_raid_via_read_meta(device_t dev, struct ar_softc **raidp);
85static int ata_raid_via_write_meta(struct ar_softc *rdp);
84static struct ata_request *ata_raid_init_request(struct ar_softc *rdp, struct bio *bio);
85static int ata_raid_send_request(struct ata_request *request);
86static int ata_raid_rw(device_t dev, u_int64_t lba, void *data, u_int bcount, int flags);
87static char * ata_raid_format(struct ar_softc *rdp);
88static char * ata_raid_type(struct ar_softc *rdp);
89static char * ata_raid_flags(struct ar_softc *rdp);
90
91/* debugging only */
92static void ata_raid_print_meta(struct ar_softc *meta);
93static void ata_raid_adaptec_print_meta(struct adaptec_raid_conf *meta);
94static void ata_raid_hptv2_print_meta(struct hptv2_raid_conf *meta);
95static void ata_raid_hptv3_print_meta(struct hptv3_raid_conf *meta);
96static void ata_raid_intel_print_meta(struct intel_raid_conf *meta);
97static void ata_raid_ite_print_meta(struct ite_raid_conf *meta);
98static void ata_raid_lsiv2_print_meta(struct lsiv2_raid_conf *meta);
99static void ata_raid_lsiv3_print_meta(struct lsiv3_raid_conf *meta);
100static void ata_raid_nvidia_print_meta(struct nvidia_raid_conf *meta);
101static void ata_raid_promise_print_meta(struct promise_raid_conf *meta);
102static void ata_raid_sii_print_meta(struct sii_raid_conf *meta);
103static void ata_raid_sis_print_meta(struct sis_raid_conf *meta);
104static void ata_raid_via_print_meta(struct via_raid_conf *meta);
105
106/* internal vars */
107static struct ar_softc *ata_raid_arrays[MAX_ARRAYS];
108static MALLOC_DEFINE(M_AR, "ar_driver", "ATA PseudoRAID driver");
109static devclass_t ata_raid_sub_devclass;
110static int testing = 0;
111
112/* device structures */
113static disk_strategy_t ata_raid_strategy;
114//static dumper_t ata_raid_dump;
115
116static void
117ata_raid_attach(struct ar_softc *rdp, int writeback)
118{
119 char buffer[32];
120 int disk;
121
122 mtx_init(&rdp->lock, "ATA PseudoRAID metadata lock", NULL, MTX_DEF);
123 ata_raid_config_changed(rdp, writeback);
124
125 /* sanitize arrays total_size % (width * interleave) == 0 */
126 if (rdp->type == AR_T_RAID0 || rdp->type == AR_T_RAID01 ||
127 rdp->type == AR_T_RAID5) {
128 rdp->total_sectors = (rdp->total_sectors/(rdp->interleave*rdp->width))*
129 (rdp->interleave * rdp->width);
130 sprintf(buffer, " (stripe %d KB)",
131 (rdp->interleave * DEV_BSIZE) / 1024);
132 }
133 else
134 buffer[0] = '\0';
135 rdp->disk = disk_alloc();
136 rdp->disk->d_strategy = ata_raid_strategy;
137 //rdp->disk->d_dump = ata_raid_dump;
138 rdp->disk->d_name = "ar";
139 rdp->disk->d_sectorsize = DEV_BSIZE;
140 rdp->disk->d_mediasize = (off_t)rdp->total_sectors * DEV_BSIZE;
141 rdp->disk->d_fwsectors = rdp->sectors;
142 rdp->disk->d_fwheads = rdp->heads;
143 rdp->disk->d_maxsize = 128 * DEV_BSIZE;
144 rdp->disk->d_drv1 = rdp;
145 rdp->disk->d_unit = rdp->lun;
146 disk_create(rdp->disk, DISK_VERSION);
147
148 printf("ar%d: %lluMB <%s %s%s> status: %s\n", rdp->lun,
149 (unsigned long long)(rdp->total_sectors / ((1024L*1024L)/DEV_BSIZE)),
150 ata_raid_format(rdp), ata_raid_type(rdp),
151 buffer, ata_raid_flags(rdp));
152
153 if (testing || bootverbose)
154 printf("ar%d: %llu sectors [%dC/%dH/%dS] <%s> subdisks defined as:\n",
155 rdp->lun, (unsigned long long)rdp->total_sectors,
156 rdp->cylinders, rdp->heads, rdp->sectors, rdp->name);
157
158 for (disk = 0; disk < rdp->total_disks; disk++) {
159 printf("ar%d: disk%d ", rdp->lun, disk);
160 if (rdp->disks[disk].dev) {
161 if (rdp->disks[disk].flags & AR_DF_PRESENT) {
162 /* status of this disk in the array */
163 if (rdp->disks[disk].flags & AR_DF_ONLINE)
164 printf("READY ");
165 else if (rdp->disks[disk].flags & AR_DF_SPARE)
166 printf("SPARE ");
167 else
168 printf("FREE ");
169
170 /* what type of disk is this in the array */
171 switch (rdp->type) {
172 case AR_T_RAID1:
173 case AR_T_RAID01:
174 if (disk < rdp->width)
175 printf("(master) ");
176 else
177 printf("(mirror) ");
178 }
179
180 /* which physical disk is used */
181 printf("using %s at ata%d-%s\n",
182 device_get_nameunit(rdp->disks[disk].dev),
183 device_get_unit(device_get_parent(rdp->disks[disk].dev)),
184 (((struct ata_device *)
185 device_get_softc(rdp->disks[disk].dev))->unit ==
186 ATA_MASTER) ? "master" : "slave");
187 }
188 else if (rdp->disks[disk].flags & AR_DF_ASSIGNED)
189 printf("DOWN\n");
190 else
191 printf("INVALID no RAID config on this subdisk\n");
192 }
193 else
194 printf("DOWN no device found for this subdisk\n");
195 }
196}
197
198static int
199ata_raid_ioctl(u_long cmd, caddr_t data)
200{
201 struct ata_ioc_raid_config *config = (struct ata_ioc_raid_config *)data;
202 int *lun = (int *)data;
203 int error = EOPNOTSUPP;
204
205 switch (cmd) {
206 case IOCATARAIDSTATUS:
207 error = ata_raid_status(config);
208 break;
209
210 case IOCATARAIDCREATE:
211 error = ata_raid_create(config);
212 break;
213
214 case IOCATARAIDDELETE:
215 error = ata_raid_delete(*lun);
216 break;
217
218 case IOCATARAIDADDSPARE:
219 error = ata_raid_addspare(config);
220 break;
221
222 case IOCATARAIDREBUILD:
223 error = ata_raid_rebuild(*lun);
224 break;
225 }
226 return error;
227}
228
229static void
230ata_raid_strategy(struct bio *bp)
231{
232 struct ar_softc *rdp = bp->bio_disk->d_drv1;
233 struct ata_request *request;
234 caddr_t data;
235 u_int64_t blkno, lba, blk = 0;
236 int count, chunk, drv, par = 0, change = 0;
237
238 if (!(rdp->status & AR_S_READY) ||
239 (bp->bio_cmd != BIO_READ && bp->bio_cmd != BIO_WRITE)) {
240 biofinish(bp, NULL, EIO);
241 return;
242 }
243
244 bp->bio_resid = bp->bio_bcount;
245 for (count = howmany(bp->bio_bcount, DEV_BSIZE),
246 blkno = bp->bio_pblkno, data = bp->bio_data;
247 count > 0;
248 count -= chunk, blkno += chunk, data += (chunk * DEV_BSIZE)) {
249
250 switch (rdp->type) {
251 case AR_T_RAID1:
252 drv = 0;
253 lba = blkno;
254 chunk = count;
255 break;
256
257 case AR_T_JBOD:
258 case AR_T_SPAN:
259 drv = 0;
260 lba = blkno;
261 while (lba >= rdp->disks[drv].sectors)
262 lba -= rdp->disks[drv++].sectors;
263 chunk = min(rdp->disks[drv].sectors - lba, count);
264 break;
265
266 case AR_T_RAID0:
267 case AR_T_RAID01:
268 chunk = blkno % rdp->interleave;
269 drv = (blkno / rdp->interleave) % rdp->width;
270 lba = (((blkno/rdp->interleave)/rdp->width)*rdp->interleave)+chunk;
271 chunk = min(count, rdp->interleave - chunk);
272 break;
273
274 case AR_T_RAID5:
275 drv = (blkno / rdp->interleave) % (rdp->width - 1);
276 par = rdp->width - 1 -
277 (blkno / (rdp->interleave * (rdp->width - 1))) % rdp->width;
278 if (drv >= par)
279 drv++;
280 lba = ((blkno/rdp->interleave)/(rdp->width-1))*(rdp->interleave) +
281 ((blkno%(rdp->interleave*(rdp->width-1)))%rdp->interleave);
282 chunk = min(count, rdp->interleave - (lba % rdp->interleave));
283 break;
284
285 default:
286 printf("ar%d: unknown array type in ata_raid_strategy\n", rdp->lun);
287 biofinish(bp, NULL, EIO);
288 return;
289 }
290
291 /* offset on all but "first on HPTv2" */
292 if (!(drv == 0 && rdp->format == AR_F_HPTV2_RAID))
293 lba += rdp->offset_sectors;
294
295 if (!(request = ata_raid_init_request(rdp, bp))) {
296 biofinish(bp, NULL, EIO);
297 return;
298 }
299 request->data = data;
300 request->bytecount = chunk * DEV_BSIZE;
301 request->u.ata.lba = lba;
302 request->u.ata.count = request->bytecount / DEV_BSIZE;
303
304 switch (rdp->type) {
305 case AR_T_JBOD:
306 case AR_T_SPAN:
307 case AR_T_RAID0:
308 if (((rdp->disks[drv].flags & (AR_DF_PRESENT|AR_DF_ONLINE)) ==
309 (AR_DF_PRESENT|AR_DF_ONLINE) && !rdp->disks[drv].dev)) {
310 rdp->disks[drv].flags &= ~AR_DF_ONLINE;
311 ata_raid_config_changed(rdp, 1);
312 ata_free_request(request);
313 biofinish(bp, NULL, EIO);
314 return;
315 }
316 request->this = drv;
317 request->dev = rdp->disks[request->this].dev;
318 ata_raid_send_request(request);
319 break;
320
321 case AR_T_RAID1:
322 case AR_T_RAID01:
323 if ((rdp->disks[drv].flags &
324 (AR_DF_PRESENT|AR_DF_ONLINE))==(AR_DF_PRESENT|AR_DF_ONLINE) &&
325 !rdp->disks[drv].dev) {
326 rdp->disks[drv].flags &= ~AR_DF_ONLINE;
327 change = 1;
328 }
329 if ((rdp->disks[drv + rdp->width].flags &
330 (AR_DF_PRESENT|AR_DF_ONLINE))==(AR_DF_PRESENT|AR_DF_ONLINE) &&
331 !rdp->disks[drv + rdp->width].dev) {
332 rdp->disks[drv + rdp->width].flags &= ~AR_DF_ONLINE;
333 change = 1;
334 }
335 if (change)
336 ata_raid_config_changed(rdp, 1);
337 if (!(rdp->status & AR_S_READY)) {
338 ata_free_request(request);
339 biofinish(bp, NULL, EIO);
340 return;
341 }
342
343 if (rdp->status & AR_S_REBUILDING)
344 blk = ((lba / rdp->interleave) * rdp->width) * rdp->interleave +
345 (rdp->interleave * (drv % rdp->width)) +
346 lba % rdp->interleave;;
347
348 if (bp->bio_cmd == BIO_READ) {
349 int src_online =
350 (rdp->disks[drv].flags & AR_DF_ONLINE);
351 int mir_online =
352 (rdp->disks[drv+rdp->width].flags & AR_DF_ONLINE);
353
354 /* if mirror gone or close to last access on source */
355 if (!mir_online ||
356 ((src_online) &&
357 bp->bio_pblkno >=
358 (rdp->disks[drv].last_lba - AR_PROXIMITY) &&
359 bp->bio_pblkno <=
360 (rdp->disks[drv].last_lba + AR_PROXIMITY))) {
361 rdp->toggle = 0;
362 }
363 /* if source gone or close to last access on mirror */
364 else if (!src_online ||
365 ((mir_online) &&
366 bp->bio_pblkno >=
367 (rdp->disks[drv+rdp->width].last_lba-AR_PROXIMITY) &&
368 bp->bio_pblkno <=
369 (rdp->disks[drv+rdp->width].last_lba+AR_PROXIMITY))) {
370 drv += rdp->width;
371 rdp->toggle = 1;
372 }
373 /* not close to any previous access, toggle */
374 else {
375 if (rdp->toggle)
376 rdp->toggle = 0;
377 else {
378 drv += rdp->width;
379 rdp->toggle = 1;
380 }
381 }
382
383 if ((rdp->status & AR_S_REBUILDING) &&
384 (blk <= rdp->rebuild_lba) &&
385 ((blk + chunk) > rdp->rebuild_lba)) {
386 struct ata_composite *composite;
387 struct ata_request *rebuild;
388 int this;
389
390 /* figure out what part to rebuild */
391 if (drv < rdp->width)
392 this = drv + rdp->width;
393 else
394 this = drv - rdp->width;
395
396 /* do we have a spare to rebuild on ? */
397 if (rdp->disks[this].flags & AR_DF_SPARE) {
398 if ((composite = ata_alloc_composite())) {
399 if ((rebuild = ata_alloc_request())) {
400 rdp->rebuild_lba = blk + chunk;
401 bcopy(request, rebuild,
402 sizeof(struct ata_request));
403 rebuild->this = this;
404 rebuild->dev = rdp->disks[this].dev;
405 rebuild->flags &= ~ATA_R_READ;
406 rebuild->flags |= ATA_R_WRITE;
407 mtx_init(&composite->lock,
408 "ATA PseudoRAID rebuild lock",
409 NULL, MTX_DEF);
410 composite->residual = request->bytecount;
411 composite->rd_needed |= (1 << drv);
412 composite->wr_depend |= (1 << drv);
413 composite->wr_needed |= (1 << this);
414 composite->request[drv] = request;
415 composite->request[this] = rebuild;
416 request->composite = composite;
417 rebuild->composite = composite;
418 ata_raid_send_request(rebuild);
419 }
420 else {
421 ata_free_composite(composite);
422 printf("DOH! ata_alloc_request failed!\n");
423 }
424 }
425 else {
426 printf("DOH! ata_alloc_composite failed!\n");
427 }
428 }
429 else if (rdp->disks[this].flags & AR_DF_ONLINE) {
430 /*
431 * if we got here we are a chunk of a RAID01 that
432 * does not need a rebuild, but we need to increment
433 * the rebuild_lba address to get the rebuild to
434 * move to the next chunk correctly
435 */
436 rdp->rebuild_lba = blk + chunk;
437 }
438 else
439 printf("DOH! we didn't find the rebuild part\n");
440 }
441 }
442 if (bp->bio_cmd == BIO_WRITE) {
443 if ((rdp->disks[drv+rdp->width].flags & AR_DF_ONLINE) ||
444 ((rdp->status & AR_S_REBUILDING) &&
445 (rdp->disks[drv+rdp->width].flags & AR_DF_SPARE) &&
446 ((blk < rdp->rebuild_lba) ||
447 ((blk <= rdp->rebuild_lba) &&
448 ((blk + chunk) > rdp->rebuild_lba))))) {
449 if ((rdp->disks[drv].flags & AR_DF_ONLINE) ||
450 ((rdp->status & AR_S_REBUILDING) &&
451 (rdp->disks[drv].flags & AR_DF_SPARE) &&
452 ((blk < rdp->rebuild_lba) ||
453 ((blk <= rdp->rebuild_lba) &&
454 ((blk + chunk) > rdp->rebuild_lba))))) {
455 struct ata_request *mirror;
456 struct ata_composite *composite;
457 int this = drv + rdp->width;
458
459 if ((composite = ata_alloc_composite())) {
460 if ((mirror = ata_alloc_request())) {
461 rdp->rebuild_lba = blk + chunk;
462 bcopy(request, mirror,
463 sizeof(struct ata_request));
464 mirror->this = this;
465 mirror->dev = rdp->disks[this].dev;
466 mtx_init(&composite->lock,
467 "ATA PseudoRAID mirror lock",
468 NULL, MTX_DEF);
469 composite->residual = request->bytecount;
470 composite->wr_needed |= (1 << drv);
471 composite->wr_needed |= (1 << this);
472 composite->request[drv] = request;
473 composite->request[this] = mirror;
474 request->composite = composite;
475 mirror->composite = composite;
476 ata_raid_send_request(mirror);
477 rdp->disks[this].last_lba =
478 bp->bio_pblkno + chunk;
479 }
480 else {
481 ata_free_composite(composite);
482 printf("DOH! ata_alloc_request failed!\n");
483 }
484 }
485 else {
486 printf("DOH! ata_alloc_composite failed!\n");
487 }
488 }
489 else
490 drv += rdp->width;
491 }
492 }
493 request->this = drv;
494 request->dev = rdp->disks[request->this].dev;
495 ata_raid_send_request(request);
496 rdp->disks[request->this].last_lba = bp->bio_pblkno + chunk;
497 break;
498
499 case AR_T_RAID5:
500 if (((rdp->disks[drv].flags & (AR_DF_PRESENT|AR_DF_ONLINE)) ==
501 (AR_DF_PRESENT|AR_DF_ONLINE) && !rdp->disks[drv].dev)) {
502 rdp->disks[drv].flags &= ~AR_DF_ONLINE;
503 change = 1;
504 }
505 if (((rdp->disks[par].flags & (AR_DF_PRESENT|AR_DF_ONLINE)) ==
506 (AR_DF_PRESENT|AR_DF_ONLINE) && !rdp->disks[par].dev)) {
507 rdp->disks[par].flags &= ~AR_DF_ONLINE;
508 change = 1;
509 }
510 if (change)
511 ata_raid_config_changed(rdp, 1);
512 if (!(rdp->status & AR_S_READY)) {
513 ata_free_request(request);
514 biofinish(bp, NULL, EIO);
515 return;
516 }
517 if (rdp->status & AR_S_DEGRADED) {
518 /* do the XOR game if possible */
519 }
520 else {
521 request->this = drv;
522 request->dev = rdp->disks[request->this].dev;
523 if (bp->bio_cmd == BIO_READ) {
524 ata_raid_send_request(request);
525 }
526 if (bp->bio_cmd == BIO_WRITE) {
527 ata_raid_send_request(request);
528 // sikre at l�s-modify-skriv til hver disk er atomarisk.
529 // par kopi af request
530 // l�se orgdata fra drv
531 // skriv nydata til drv
532 // l�se parorgdata fra par
533 // skriv orgdata xor parorgdata xor nydata til par
534 }
535 }
536 break;
537
538 default:
539 printf("ar%d: unknown array type in ata_raid_strategy\n", rdp->lun);
540 }
541 }
542}
543
544static void
545ata_raid_done(struct ata_request *request)
546{
547 struct ar_softc *rdp = request->driver;
548 struct ata_composite *composite = NULL;
549 struct bio *bp = request->bio;
550 int i, mirror, finished = 0;
551
552 switch (rdp->type) {
553 case AR_T_JBOD:
554 case AR_T_SPAN:
555 case AR_T_RAID0:
556 if (request->result) {
557 rdp->disks[request->this].flags &= ~AR_DF_ONLINE;
558 ata_raid_config_changed(rdp, 1);
559 bp->bio_error = request->result;
560 finished = 1;
561 }
562 else {
563 bp->bio_resid -= request->donecount;
564 if (!bp->bio_resid)
565 finished = 1;
566 }
567 break;
568
569 case AR_T_RAID1:
570 case AR_T_RAID01:
571 if (request->this < rdp->width)
572 mirror = request->this + rdp->width;
573 else
574 mirror = request->this - rdp->width;
575 if (request->result) {
576 rdp->disks[request->this].flags &= ~AR_DF_ONLINE;
577 ata_raid_config_changed(rdp, 1);
578 }
579 if (rdp->status & AR_S_READY) {
580 u_int64_t blk = 0;
581
582 if (rdp->status & AR_S_REBUILDING)
583 blk = ((request->u.ata.lba / rdp->interleave) * rdp->width) *
584 rdp->interleave + (rdp->interleave *
585 (request->this % rdp->width)) +
586 request->u.ata.lba % rdp->interleave;
587
588 if (bp->bio_cmd == BIO_READ) {
589
590 /* is this a rebuild composite */
591 if ((composite = request->composite)) {
592 mtx_lock(&composite->lock);
593
594 /* handle the read part of a rebuild composite */
595 if (request->flags & ATA_R_READ) {
596
597 /* if read failed array is now broken */
598 if (request->result) {
599 rdp->disks[request->this].flags &= ~AR_DF_ONLINE;
600 ata_raid_config_changed(rdp, 1);
601 bp->bio_error = request->result;
602 rdp->rebuild_lba = blk;
603 finished = 1;
604 }
605
606 /* good data, update how far we've gotten */
607 else {
608 bp->bio_resid -= request->donecount;
609 composite->residual -= request->donecount;
610 if (!composite->residual) {
611 if (composite->wr_done & (1 << mirror))
612 finished = 1;
613 }
614 }
615 }
616
617 /* handle the write part of a rebuild composite */
618 else if (request->flags & ATA_R_WRITE) {
619 if (composite->rd_done & (1 << mirror)) {
620 if (request->result) {
621 printf("DOH! rebuild failed\n"); /* XXX SOS */
622 rdp->rebuild_lba = blk;
623 }
624 if (!composite->residual)
625 finished = 1;
626 }
627 }
628 mtx_unlock(&composite->lock);
629 }
630
631 /* if read failed retry on the mirror */
632 else if (request->result) {
633 request->dev = rdp->disks[mirror].dev;
634 ata_raid_send_request(request);
635 return;
636 }
637
638 /* we have good data */
639 else {
640 bp->bio_resid -= request->donecount;
641 if (!bp->bio_resid)
642 finished = 1;
643 }
644 }
645 else if (bp->bio_cmd == BIO_WRITE) {
646 /* do we have a mirror or rebuild to deal with ? */
647 if ((composite = request->composite)) {
648 mtx_lock(&composite->lock);
649 if (composite->wr_done & (1 << mirror)) {
650 if (request->result) {
651 if (composite->request[mirror]->result) {
652 printf("DOH! all disks failed and got here\n");
653 bp->bio_error = EIO;
654 }
655 if (rdp->status & AR_S_REBUILDING) {
656 rdp->rebuild_lba = blk;
657 printf("DOH! rebuild failed\n"); /* XXX SOS */
658 }
659 bp->bio_resid -=
660 composite->request[mirror]->donecount;
661 composite->residual -=
662 composite->request[mirror]->donecount;
663 }
664 else {
665 bp->bio_resid -= request->donecount;
666 composite->residual -= request->donecount;
667 }
668 if (!composite->residual)
669 finished = 1;
670 }
671 mtx_unlock(&composite->lock);
672 }
673 /* no mirror we are done */
674 else {
675 bp->bio_resid -= request->donecount;
676 if (!bp->bio_resid)
677 finished = 1;
678 }
679 }
680 }
681 else
682 biofinish(bp, NULL, request->result);
683 break;
684
685 case AR_T_RAID5:
686 if (request->result) {
687 rdp->disks[request->this].flags &= ~AR_DF_ONLINE;
688 ata_raid_config_changed(rdp, 1);
689 if (rdp->status & AR_S_READY) {
690 if (bp->bio_cmd == BIO_READ) {
691 /* do the XOR game to recover data */
692 }
693 if (bp->bio_cmd == BIO_WRITE) {
694 /* if the parity failed we're OK sortof */
695 /* otherwise wee need to do the XOR long dance */
696 }
697 finished = 1;
698 }
699 else
700 biofinish(bp, NULL, request->result);
701 }
702 else {
703 // did we have an XOR game going ??
704 bp->bio_resid -= request->donecount;
705 if (!bp->bio_resid)
706 finished = 1;
707 }
708 break;
709
710 default:
711 printf("ar%d: unknown array type in ata_raid_done\n", rdp->lun);
712 }
713
714 if (finished) {
715 if ((rdp->status & AR_S_REBUILDING) &&
716 rdp->rebuild_lba >= rdp->total_sectors) {
717 int disk;
718
719 for (disk = 0; disk < rdp->total_disks; disk++) {
720 if ((rdp->disks[disk].flags &
721 (AR_DF_PRESENT | AR_DF_ASSIGNED | AR_DF_SPARE)) ==
722 (AR_DF_PRESENT | AR_DF_ASSIGNED | AR_DF_SPARE)) {
723 rdp->disks[disk].flags &= ~AR_DF_SPARE;
724 rdp->disks[disk].flags |= AR_DF_ONLINE;
725 }
726 }
727 rdp->status &= ~AR_S_REBUILDING;
728 ata_raid_config_changed(rdp, 1);
729 }
730 if (!bp->bio_resid)
731 biodone(bp);
732 }
733
734 if (composite) {
735 if (finished) {
736 /* we are done with this composite, free all resources */
737 for (i = 0; i < 32; i++) {
738 if (composite->rd_needed & (1 << i) ||
739 composite->wr_needed & (1 << i)) {
740 ata_free_request(composite->request[i]);
741 }
742 }
743 mtx_destroy(&composite->lock);
744 ata_free_composite(composite);
745 }
746 }
747 else
748 ata_free_request(request);
749}
750
751static void
752ata_raid_config_changed(struct ar_softc *rdp, int writeback)
753{
754 int disk, count, status;
755
756 mtx_lock(&rdp->lock);
757 /* set default all working mode */
758 status = rdp->status;
759 rdp->status &= ~AR_S_DEGRADED;
760 rdp->status |= AR_S_READY;
761
762 /* make sure all lost drives are accounted for */
763 for (disk = 0; disk < rdp->total_disks; disk++) {
764 if (!(rdp->disks[disk].flags & AR_DF_PRESENT))
765 rdp->disks[disk].flags &= ~AR_DF_ONLINE;
766 }
767
768 /* depending on RAID type figure out our health status */
769 switch (rdp->type) {
770 case AR_T_JBOD:
771 case AR_T_SPAN:
772 case AR_T_RAID0:
773 for (disk = 0; disk < rdp->total_disks; disk++)
774 if (!(rdp->disks[disk].flags & AR_DF_ONLINE))
775 rdp->status &= ~AR_S_READY;
776 break;
777
778 case AR_T_RAID1:
779 case AR_T_RAID01:
780 for (disk = 0; disk < rdp->width; disk++) {
781 if (!(rdp->disks[disk].flags & AR_DF_ONLINE) &&
782 !(rdp->disks[disk + rdp->width].flags & AR_DF_ONLINE)) {
783 rdp->status &= ~AR_S_READY;
784 }
785 else if (((rdp->disks[disk].flags & AR_DF_ONLINE) &&
786 !(rdp->disks[disk + rdp->width].flags & AR_DF_ONLINE)) ||
787 (!(rdp->disks[disk].flags & AR_DF_ONLINE) &&
788 (rdp->disks [disk + rdp->width].flags & AR_DF_ONLINE))) {
789 rdp->status |= AR_S_DEGRADED;
790 }
791 }
792 break;
793
794 case AR_T_RAID5:
795 for (count = 0, disk = 0; disk < rdp->total_disks; disk++) {
796 if (!(rdp->disks[disk].flags & AR_DF_ONLINE))
797 count++;
798 }
799 if (count) {
800 if (count > 1)
801 rdp->status &= ~AR_S_READY;
802 else
803 rdp->status |= AR_S_DEGRADED;
804 }
805 break;
806 default:
807 rdp->status &= ~AR_S_READY;
808 }
809
810 if (rdp->status != status) {
811 if (!(rdp->status & AR_S_READY)) {
812 printf("ar%d: FAILURE - %s array broken\n",
813 rdp->lun, ata_raid_type(rdp));
814 }
815 else if (rdp->status & AR_S_DEGRADED) {
816 if (rdp->type & (AR_T_RAID1 | AR_T_RAID01))
817 printf("ar%d: WARNING - mirror", rdp->lun);
818 else
819 printf("ar%d: WARNING - parity", rdp->lun);
820 printf(" protection lost. %s array in DEGRADED mode\n",
821 ata_raid_type(rdp));
822 }
823 }
824 mtx_unlock(&rdp->lock);
825 if (writeback)
826 ata_raid_write_metadata(rdp);
827
828}
829
830static int
831ata_raid_status(struct ata_ioc_raid_config *config)
832{
833 struct ar_softc *rdp;
834 int i;
835
836 if (!(rdp = ata_raid_arrays[config->lun]))
837 return ENXIO;
838
839 config->type = rdp->type;
840 config->total_disks = rdp->total_disks;
841 for (i = 0; i < rdp->total_disks; i++ ) {
842 if ((rdp->disks[i].flags & AR_DF_PRESENT) && rdp->disks[i].dev)
843 config->disks[i] = device_get_unit(rdp->disks[i].dev);
844 else
845 config->disks[i] = -1;
846 }
847 config->interleave = rdp->interleave;
848 config->status = rdp->status;
849 config->progress = 100 * rdp->rebuild_lba / rdp->total_sectors;
850 return 0;
851}
852
853static int
854ata_raid_create(struct ata_ioc_raid_config *config)
855{
856 struct ar_softc *rdp;
857 device_t subdisk;
858 int array, disk;
859 int ctlr = 0, disk_size = 0, total_disks = 0;
860
861 for (array = 0; array < MAX_ARRAYS; array++) {
862 if (!ata_raid_arrays[array])
863 break;
864 }
865 if (array >= MAX_ARRAYS)
866 return ENOSPC;
867
868 if (!(rdp = (struct ar_softc*)malloc(sizeof(struct ar_softc), M_AR,
869 M_NOWAIT | M_ZERO))) {
870 printf("ar%d: no memory for metadata storage\n", array);
871 return ENOMEM;
872 }
873
874 for (disk = 0; disk < config->total_disks; disk++) {
875 if ((subdisk = devclass_get_device(ata_raid_sub_devclass,
876 config->disks[disk]))) {
877 struct ata_raid_subdisk *ars = device_get_softc(subdisk);
878
879 /* is device already assigned to another array ? */
880 if (ars->raid[rdp->volume]) {
881 config->disks[disk] = -1;
882 free(rdp, M_AR);
883 return EBUSY;
884 }
885 rdp->disks[disk].dev = device_get_parent(subdisk);
886
887 switch (pci_get_vendor(GRANDPARENT(rdp->disks[disk].dev))) {
888 case ATA_HIGHPOINT_ID:
889 /*
890 * we need some way to decide if it should be v2 or v3
891 * for now just use v2 since the v3 BIOS knows how to
892 * handle that as well.
893 */
894 ctlr = AR_F_HPTV2_RAID;
895 rdp->disks[disk].sectors = HPTV3_LBA(rdp->disks[disk].dev);
896 break;
897
898 case ATA_INTEL_ID:
899 ctlr = AR_F_INTEL_RAID;
900 rdp->disks[disk].sectors = INTEL_LBA(rdp->disks[disk].dev);
901 break;
902
903 case ATA_ITE_ID:
904 ctlr = AR_F_ITE_RAID;
905 rdp->disks[disk].sectors = ITE_LBA(rdp->disks[disk].dev);
906 break;
907
908 case 0: /* XXX SOS cover up for bug in our PCI code */
909 case ATA_PROMISE_ID:
910 ctlr = AR_F_PROMISE_RAID;
86static struct ata_request *ata_raid_init_request(struct ar_softc *rdp, struct bio *bio);
87static int ata_raid_send_request(struct ata_request *request);
88static int ata_raid_rw(device_t dev, u_int64_t lba, void *data, u_int bcount, int flags);
89static char * ata_raid_format(struct ar_softc *rdp);
90static char * ata_raid_type(struct ar_softc *rdp);
91static char * ata_raid_flags(struct ar_softc *rdp);
92
93/* debugging only */
94static void ata_raid_print_meta(struct ar_softc *meta);
95static void ata_raid_adaptec_print_meta(struct adaptec_raid_conf *meta);
96static void ata_raid_hptv2_print_meta(struct hptv2_raid_conf *meta);
97static void ata_raid_hptv3_print_meta(struct hptv3_raid_conf *meta);
98static void ata_raid_intel_print_meta(struct intel_raid_conf *meta);
99static void ata_raid_ite_print_meta(struct ite_raid_conf *meta);
100static void ata_raid_lsiv2_print_meta(struct lsiv2_raid_conf *meta);
101static void ata_raid_lsiv3_print_meta(struct lsiv3_raid_conf *meta);
102static void ata_raid_nvidia_print_meta(struct nvidia_raid_conf *meta);
103static void ata_raid_promise_print_meta(struct promise_raid_conf *meta);
104static void ata_raid_sii_print_meta(struct sii_raid_conf *meta);
105static void ata_raid_sis_print_meta(struct sis_raid_conf *meta);
106static void ata_raid_via_print_meta(struct via_raid_conf *meta);
107
108/* internal vars */
109static struct ar_softc *ata_raid_arrays[MAX_ARRAYS];
110static MALLOC_DEFINE(M_AR, "ar_driver", "ATA PseudoRAID driver");
111static devclass_t ata_raid_sub_devclass;
112static int testing = 0;
113
114/* device structures */
115static disk_strategy_t ata_raid_strategy;
116//static dumper_t ata_raid_dump;
117
118static void
119ata_raid_attach(struct ar_softc *rdp, int writeback)
120{
121 char buffer[32];
122 int disk;
123
124 mtx_init(&rdp->lock, "ATA PseudoRAID metadata lock", NULL, MTX_DEF);
125 ata_raid_config_changed(rdp, writeback);
126
127 /* sanitize arrays total_size % (width * interleave) == 0 */
128 if (rdp->type == AR_T_RAID0 || rdp->type == AR_T_RAID01 ||
129 rdp->type == AR_T_RAID5) {
130 rdp->total_sectors = (rdp->total_sectors/(rdp->interleave*rdp->width))*
131 (rdp->interleave * rdp->width);
132 sprintf(buffer, " (stripe %d KB)",
133 (rdp->interleave * DEV_BSIZE) / 1024);
134 }
135 else
136 buffer[0] = '\0';
137 rdp->disk = disk_alloc();
138 rdp->disk->d_strategy = ata_raid_strategy;
139 //rdp->disk->d_dump = ata_raid_dump;
140 rdp->disk->d_name = "ar";
141 rdp->disk->d_sectorsize = DEV_BSIZE;
142 rdp->disk->d_mediasize = (off_t)rdp->total_sectors * DEV_BSIZE;
143 rdp->disk->d_fwsectors = rdp->sectors;
144 rdp->disk->d_fwheads = rdp->heads;
145 rdp->disk->d_maxsize = 128 * DEV_BSIZE;
146 rdp->disk->d_drv1 = rdp;
147 rdp->disk->d_unit = rdp->lun;
148 disk_create(rdp->disk, DISK_VERSION);
149
150 printf("ar%d: %lluMB <%s %s%s> status: %s\n", rdp->lun,
151 (unsigned long long)(rdp->total_sectors / ((1024L*1024L)/DEV_BSIZE)),
152 ata_raid_format(rdp), ata_raid_type(rdp),
153 buffer, ata_raid_flags(rdp));
154
155 if (testing || bootverbose)
156 printf("ar%d: %llu sectors [%dC/%dH/%dS] <%s> subdisks defined as:\n",
157 rdp->lun, (unsigned long long)rdp->total_sectors,
158 rdp->cylinders, rdp->heads, rdp->sectors, rdp->name);
159
160 for (disk = 0; disk < rdp->total_disks; disk++) {
161 printf("ar%d: disk%d ", rdp->lun, disk);
162 if (rdp->disks[disk].dev) {
163 if (rdp->disks[disk].flags & AR_DF_PRESENT) {
164 /* status of this disk in the array */
165 if (rdp->disks[disk].flags & AR_DF_ONLINE)
166 printf("READY ");
167 else if (rdp->disks[disk].flags & AR_DF_SPARE)
168 printf("SPARE ");
169 else
170 printf("FREE ");
171
172 /* what type of disk is this in the array */
173 switch (rdp->type) {
174 case AR_T_RAID1:
175 case AR_T_RAID01:
176 if (disk < rdp->width)
177 printf("(master) ");
178 else
179 printf("(mirror) ");
180 }
181
182 /* which physical disk is used */
183 printf("using %s at ata%d-%s\n",
184 device_get_nameunit(rdp->disks[disk].dev),
185 device_get_unit(device_get_parent(rdp->disks[disk].dev)),
186 (((struct ata_device *)
187 device_get_softc(rdp->disks[disk].dev))->unit ==
188 ATA_MASTER) ? "master" : "slave");
189 }
190 else if (rdp->disks[disk].flags & AR_DF_ASSIGNED)
191 printf("DOWN\n");
192 else
193 printf("INVALID no RAID config on this subdisk\n");
194 }
195 else
196 printf("DOWN no device found for this subdisk\n");
197 }
198}
199
200static int
201ata_raid_ioctl(u_long cmd, caddr_t data)
202{
203 struct ata_ioc_raid_config *config = (struct ata_ioc_raid_config *)data;
204 int *lun = (int *)data;
205 int error = EOPNOTSUPP;
206
207 switch (cmd) {
208 case IOCATARAIDSTATUS:
209 error = ata_raid_status(config);
210 break;
211
212 case IOCATARAIDCREATE:
213 error = ata_raid_create(config);
214 break;
215
216 case IOCATARAIDDELETE:
217 error = ata_raid_delete(*lun);
218 break;
219
220 case IOCATARAIDADDSPARE:
221 error = ata_raid_addspare(config);
222 break;
223
224 case IOCATARAIDREBUILD:
225 error = ata_raid_rebuild(*lun);
226 break;
227 }
228 return error;
229}
230
231static void
232ata_raid_strategy(struct bio *bp)
233{
234 struct ar_softc *rdp = bp->bio_disk->d_drv1;
235 struct ata_request *request;
236 caddr_t data;
237 u_int64_t blkno, lba, blk = 0;
238 int count, chunk, drv, par = 0, change = 0;
239
240 if (!(rdp->status & AR_S_READY) ||
241 (bp->bio_cmd != BIO_READ && bp->bio_cmd != BIO_WRITE)) {
242 biofinish(bp, NULL, EIO);
243 return;
244 }
245
246 bp->bio_resid = bp->bio_bcount;
247 for (count = howmany(bp->bio_bcount, DEV_BSIZE),
248 blkno = bp->bio_pblkno, data = bp->bio_data;
249 count > 0;
250 count -= chunk, blkno += chunk, data += (chunk * DEV_BSIZE)) {
251
252 switch (rdp->type) {
253 case AR_T_RAID1:
254 drv = 0;
255 lba = blkno;
256 chunk = count;
257 break;
258
259 case AR_T_JBOD:
260 case AR_T_SPAN:
261 drv = 0;
262 lba = blkno;
263 while (lba >= rdp->disks[drv].sectors)
264 lba -= rdp->disks[drv++].sectors;
265 chunk = min(rdp->disks[drv].sectors - lba, count);
266 break;
267
268 case AR_T_RAID0:
269 case AR_T_RAID01:
270 chunk = blkno % rdp->interleave;
271 drv = (blkno / rdp->interleave) % rdp->width;
272 lba = (((blkno/rdp->interleave)/rdp->width)*rdp->interleave)+chunk;
273 chunk = min(count, rdp->interleave - chunk);
274 break;
275
276 case AR_T_RAID5:
277 drv = (blkno / rdp->interleave) % (rdp->width - 1);
278 par = rdp->width - 1 -
279 (blkno / (rdp->interleave * (rdp->width - 1))) % rdp->width;
280 if (drv >= par)
281 drv++;
282 lba = ((blkno/rdp->interleave)/(rdp->width-1))*(rdp->interleave) +
283 ((blkno%(rdp->interleave*(rdp->width-1)))%rdp->interleave);
284 chunk = min(count, rdp->interleave - (lba % rdp->interleave));
285 break;
286
287 default:
288 printf("ar%d: unknown array type in ata_raid_strategy\n", rdp->lun);
289 biofinish(bp, NULL, EIO);
290 return;
291 }
292
293 /* offset on all but "first on HPTv2" */
294 if (!(drv == 0 && rdp->format == AR_F_HPTV2_RAID))
295 lba += rdp->offset_sectors;
296
297 if (!(request = ata_raid_init_request(rdp, bp))) {
298 biofinish(bp, NULL, EIO);
299 return;
300 }
301 request->data = data;
302 request->bytecount = chunk * DEV_BSIZE;
303 request->u.ata.lba = lba;
304 request->u.ata.count = request->bytecount / DEV_BSIZE;
305
306 switch (rdp->type) {
307 case AR_T_JBOD:
308 case AR_T_SPAN:
309 case AR_T_RAID0:
310 if (((rdp->disks[drv].flags & (AR_DF_PRESENT|AR_DF_ONLINE)) ==
311 (AR_DF_PRESENT|AR_DF_ONLINE) && !rdp->disks[drv].dev)) {
312 rdp->disks[drv].flags &= ~AR_DF_ONLINE;
313 ata_raid_config_changed(rdp, 1);
314 ata_free_request(request);
315 biofinish(bp, NULL, EIO);
316 return;
317 }
318 request->this = drv;
319 request->dev = rdp->disks[request->this].dev;
320 ata_raid_send_request(request);
321 break;
322
323 case AR_T_RAID1:
324 case AR_T_RAID01:
325 if ((rdp->disks[drv].flags &
326 (AR_DF_PRESENT|AR_DF_ONLINE))==(AR_DF_PRESENT|AR_DF_ONLINE) &&
327 !rdp->disks[drv].dev) {
328 rdp->disks[drv].flags &= ~AR_DF_ONLINE;
329 change = 1;
330 }
331 if ((rdp->disks[drv + rdp->width].flags &
332 (AR_DF_PRESENT|AR_DF_ONLINE))==(AR_DF_PRESENT|AR_DF_ONLINE) &&
333 !rdp->disks[drv + rdp->width].dev) {
334 rdp->disks[drv + rdp->width].flags &= ~AR_DF_ONLINE;
335 change = 1;
336 }
337 if (change)
338 ata_raid_config_changed(rdp, 1);
339 if (!(rdp->status & AR_S_READY)) {
340 ata_free_request(request);
341 biofinish(bp, NULL, EIO);
342 return;
343 }
344
345 if (rdp->status & AR_S_REBUILDING)
346 blk = ((lba / rdp->interleave) * rdp->width) * rdp->interleave +
347 (rdp->interleave * (drv % rdp->width)) +
348 lba % rdp->interleave;;
349
350 if (bp->bio_cmd == BIO_READ) {
351 int src_online =
352 (rdp->disks[drv].flags & AR_DF_ONLINE);
353 int mir_online =
354 (rdp->disks[drv+rdp->width].flags & AR_DF_ONLINE);
355
356 /* if mirror gone or close to last access on source */
357 if (!mir_online ||
358 ((src_online) &&
359 bp->bio_pblkno >=
360 (rdp->disks[drv].last_lba - AR_PROXIMITY) &&
361 bp->bio_pblkno <=
362 (rdp->disks[drv].last_lba + AR_PROXIMITY))) {
363 rdp->toggle = 0;
364 }
365 /* if source gone or close to last access on mirror */
366 else if (!src_online ||
367 ((mir_online) &&
368 bp->bio_pblkno >=
369 (rdp->disks[drv+rdp->width].last_lba-AR_PROXIMITY) &&
370 bp->bio_pblkno <=
371 (rdp->disks[drv+rdp->width].last_lba+AR_PROXIMITY))) {
372 drv += rdp->width;
373 rdp->toggle = 1;
374 }
375 /* not close to any previous access, toggle */
376 else {
377 if (rdp->toggle)
378 rdp->toggle = 0;
379 else {
380 drv += rdp->width;
381 rdp->toggle = 1;
382 }
383 }
384
385 if ((rdp->status & AR_S_REBUILDING) &&
386 (blk <= rdp->rebuild_lba) &&
387 ((blk + chunk) > rdp->rebuild_lba)) {
388 struct ata_composite *composite;
389 struct ata_request *rebuild;
390 int this;
391
392 /* figure out what part to rebuild */
393 if (drv < rdp->width)
394 this = drv + rdp->width;
395 else
396 this = drv - rdp->width;
397
398 /* do we have a spare to rebuild on ? */
399 if (rdp->disks[this].flags & AR_DF_SPARE) {
400 if ((composite = ata_alloc_composite())) {
401 if ((rebuild = ata_alloc_request())) {
402 rdp->rebuild_lba = blk + chunk;
403 bcopy(request, rebuild,
404 sizeof(struct ata_request));
405 rebuild->this = this;
406 rebuild->dev = rdp->disks[this].dev;
407 rebuild->flags &= ~ATA_R_READ;
408 rebuild->flags |= ATA_R_WRITE;
409 mtx_init(&composite->lock,
410 "ATA PseudoRAID rebuild lock",
411 NULL, MTX_DEF);
412 composite->residual = request->bytecount;
413 composite->rd_needed |= (1 << drv);
414 composite->wr_depend |= (1 << drv);
415 composite->wr_needed |= (1 << this);
416 composite->request[drv] = request;
417 composite->request[this] = rebuild;
418 request->composite = composite;
419 rebuild->composite = composite;
420 ata_raid_send_request(rebuild);
421 }
422 else {
423 ata_free_composite(composite);
424 printf("DOH! ata_alloc_request failed!\n");
425 }
426 }
427 else {
428 printf("DOH! ata_alloc_composite failed!\n");
429 }
430 }
431 else if (rdp->disks[this].flags & AR_DF_ONLINE) {
432 /*
433 * if we got here we are a chunk of a RAID01 that
434 * does not need a rebuild, but we need to increment
435 * the rebuild_lba address to get the rebuild to
436 * move to the next chunk correctly
437 */
438 rdp->rebuild_lba = blk + chunk;
439 }
440 else
441 printf("DOH! we didn't find the rebuild part\n");
442 }
443 }
444 if (bp->bio_cmd == BIO_WRITE) {
445 if ((rdp->disks[drv+rdp->width].flags & AR_DF_ONLINE) ||
446 ((rdp->status & AR_S_REBUILDING) &&
447 (rdp->disks[drv+rdp->width].flags & AR_DF_SPARE) &&
448 ((blk < rdp->rebuild_lba) ||
449 ((blk <= rdp->rebuild_lba) &&
450 ((blk + chunk) > rdp->rebuild_lba))))) {
451 if ((rdp->disks[drv].flags & AR_DF_ONLINE) ||
452 ((rdp->status & AR_S_REBUILDING) &&
453 (rdp->disks[drv].flags & AR_DF_SPARE) &&
454 ((blk < rdp->rebuild_lba) ||
455 ((blk <= rdp->rebuild_lba) &&
456 ((blk + chunk) > rdp->rebuild_lba))))) {
457 struct ata_request *mirror;
458 struct ata_composite *composite;
459 int this = drv + rdp->width;
460
461 if ((composite = ata_alloc_composite())) {
462 if ((mirror = ata_alloc_request())) {
463 rdp->rebuild_lba = blk + chunk;
464 bcopy(request, mirror,
465 sizeof(struct ata_request));
466 mirror->this = this;
467 mirror->dev = rdp->disks[this].dev;
468 mtx_init(&composite->lock,
469 "ATA PseudoRAID mirror lock",
470 NULL, MTX_DEF);
471 composite->residual = request->bytecount;
472 composite->wr_needed |= (1 << drv);
473 composite->wr_needed |= (1 << this);
474 composite->request[drv] = request;
475 composite->request[this] = mirror;
476 request->composite = composite;
477 mirror->composite = composite;
478 ata_raid_send_request(mirror);
479 rdp->disks[this].last_lba =
480 bp->bio_pblkno + chunk;
481 }
482 else {
483 ata_free_composite(composite);
484 printf("DOH! ata_alloc_request failed!\n");
485 }
486 }
487 else {
488 printf("DOH! ata_alloc_composite failed!\n");
489 }
490 }
491 else
492 drv += rdp->width;
493 }
494 }
495 request->this = drv;
496 request->dev = rdp->disks[request->this].dev;
497 ata_raid_send_request(request);
498 rdp->disks[request->this].last_lba = bp->bio_pblkno + chunk;
499 break;
500
501 case AR_T_RAID5:
502 if (((rdp->disks[drv].flags & (AR_DF_PRESENT|AR_DF_ONLINE)) ==
503 (AR_DF_PRESENT|AR_DF_ONLINE) && !rdp->disks[drv].dev)) {
504 rdp->disks[drv].flags &= ~AR_DF_ONLINE;
505 change = 1;
506 }
507 if (((rdp->disks[par].flags & (AR_DF_PRESENT|AR_DF_ONLINE)) ==
508 (AR_DF_PRESENT|AR_DF_ONLINE) && !rdp->disks[par].dev)) {
509 rdp->disks[par].flags &= ~AR_DF_ONLINE;
510 change = 1;
511 }
512 if (change)
513 ata_raid_config_changed(rdp, 1);
514 if (!(rdp->status & AR_S_READY)) {
515 ata_free_request(request);
516 biofinish(bp, NULL, EIO);
517 return;
518 }
519 if (rdp->status & AR_S_DEGRADED) {
520 /* do the XOR game if possible */
521 }
522 else {
523 request->this = drv;
524 request->dev = rdp->disks[request->this].dev;
525 if (bp->bio_cmd == BIO_READ) {
526 ata_raid_send_request(request);
527 }
528 if (bp->bio_cmd == BIO_WRITE) {
529 ata_raid_send_request(request);
530 // sikre at l�s-modify-skriv til hver disk er atomarisk.
531 // par kopi af request
532 // l�se orgdata fra drv
533 // skriv nydata til drv
534 // l�se parorgdata fra par
535 // skriv orgdata xor parorgdata xor nydata til par
536 }
537 }
538 break;
539
540 default:
541 printf("ar%d: unknown array type in ata_raid_strategy\n", rdp->lun);
542 }
543 }
544}
545
546static void
547ata_raid_done(struct ata_request *request)
548{
549 struct ar_softc *rdp = request->driver;
550 struct ata_composite *composite = NULL;
551 struct bio *bp = request->bio;
552 int i, mirror, finished = 0;
553
554 switch (rdp->type) {
555 case AR_T_JBOD:
556 case AR_T_SPAN:
557 case AR_T_RAID0:
558 if (request->result) {
559 rdp->disks[request->this].flags &= ~AR_DF_ONLINE;
560 ata_raid_config_changed(rdp, 1);
561 bp->bio_error = request->result;
562 finished = 1;
563 }
564 else {
565 bp->bio_resid -= request->donecount;
566 if (!bp->bio_resid)
567 finished = 1;
568 }
569 break;
570
571 case AR_T_RAID1:
572 case AR_T_RAID01:
573 if (request->this < rdp->width)
574 mirror = request->this + rdp->width;
575 else
576 mirror = request->this - rdp->width;
577 if (request->result) {
578 rdp->disks[request->this].flags &= ~AR_DF_ONLINE;
579 ata_raid_config_changed(rdp, 1);
580 }
581 if (rdp->status & AR_S_READY) {
582 u_int64_t blk = 0;
583
584 if (rdp->status & AR_S_REBUILDING)
585 blk = ((request->u.ata.lba / rdp->interleave) * rdp->width) *
586 rdp->interleave + (rdp->interleave *
587 (request->this % rdp->width)) +
588 request->u.ata.lba % rdp->interleave;
589
590 if (bp->bio_cmd == BIO_READ) {
591
592 /* is this a rebuild composite */
593 if ((composite = request->composite)) {
594 mtx_lock(&composite->lock);
595
596 /* handle the read part of a rebuild composite */
597 if (request->flags & ATA_R_READ) {
598
599 /* if read failed array is now broken */
600 if (request->result) {
601 rdp->disks[request->this].flags &= ~AR_DF_ONLINE;
602 ata_raid_config_changed(rdp, 1);
603 bp->bio_error = request->result;
604 rdp->rebuild_lba = blk;
605 finished = 1;
606 }
607
608 /* good data, update how far we've gotten */
609 else {
610 bp->bio_resid -= request->donecount;
611 composite->residual -= request->donecount;
612 if (!composite->residual) {
613 if (composite->wr_done & (1 << mirror))
614 finished = 1;
615 }
616 }
617 }
618
619 /* handle the write part of a rebuild composite */
620 else if (request->flags & ATA_R_WRITE) {
621 if (composite->rd_done & (1 << mirror)) {
622 if (request->result) {
623 printf("DOH! rebuild failed\n"); /* XXX SOS */
624 rdp->rebuild_lba = blk;
625 }
626 if (!composite->residual)
627 finished = 1;
628 }
629 }
630 mtx_unlock(&composite->lock);
631 }
632
633 /* if read failed retry on the mirror */
634 else if (request->result) {
635 request->dev = rdp->disks[mirror].dev;
636 ata_raid_send_request(request);
637 return;
638 }
639
640 /* we have good data */
641 else {
642 bp->bio_resid -= request->donecount;
643 if (!bp->bio_resid)
644 finished = 1;
645 }
646 }
647 else if (bp->bio_cmd == BIO_WRITE) {
648 /* do we have a mirror or rebuild to deal with ? */
649 if ((composite = request->composite)) {
650 mtx_lock(&composite->lock);
651 if (composite->wr_done & (1 << mirror)) {
652 if (request->result) {
653 if (composite->request[mirror]->result) {
654 printf("DOH! all disks failed and got here\n");
655 bp->bio_error = EIO;
656 }
657 if (rdp->status & AR_S_REBUILDING) {
658 rdp->rebuild_lba = blk;
659 printf("DOH! rebuild failed\n"); /* XXX SOS */
660 }
661 bp->bio_resid -=
662 composite->request[mirror]->donecount;
663 composite->residual -=
664 composite->request[mirror]->donecount;
665 }
666 else {
667 bp->bio_resid -= request->donecount;
668 composite->residual -= request->donecount;
669 }
670 if (!composite->residual)
671 finished = 1;
672 }
673 mtx_unlock(&composite->lock);
674 }
675 /* no mirror we are done */
676 else {
677 bp->bio_resid -= request->donecount;
678 if (!bp->bio_resid)
679 finished = 1;
680 }
681 }
682 }
683 else
684 biofinish(bp, NULL, request->result);
685 break;
686
687 case AR_T_RAID5:
688 if (request->result) {
689 rdp->disks[request->this].flags &= ~AR_DF_ONLINE;
690 ata_raid_config_changed(rdp, 1);
691 if (rdp->status & AR_S_READY) {
692 if (bp->bio_cmd == BIO_READ) {
693 /* do the XOR game to recover data */
694 }
695 if (bp->bio_cmd == BIO_WRITE) {
696 /* if the parity failed we're OK sortof */
697 /* otherwise wee need to do the XOR long dance */
698 }
699 finished = 1;
700 }
701 else
702 biofinish(bp, NULL, request->result);
703 }
704 else {
705 // did we have an XOR game going ??
706 bp->bio_resid -= request->donecount;
707 if (!bp->bio_resid)
708 finished = 1;
709 }
710 break;
711
712 default:
713 printf("ar%d: unknown array type in ata_raid_done\n", rdp->lun);
714 }
715
716 if (finished) {
717 if ((rdp->status & AR_S_REBUILDING) &&
718 rdp->rebuild_lba >= rdp->total_sectors) {
719 int disk;
720
721 for (disk = 0; disk < rdp->total_disks; disk++) {
722 if ((rdp->disks[disk].flags &
723 (AR_DF_PRESENT | AR_DF_ASSIGNED | AR_DF_SPARE)) ==
724 (AR_DF_PRESENT | AR_DF_ASSIGNED | AR_DF_SPARE)) {
725 rdp->disks[disk].flags &= ~AR_DF_SPARE;
726 rdp->disks[disk].flags |= AR_DF_ONLINE;
727 }
728 }
729 rdp->status &= ~AR_S_REBUILDING;
730 ata_raid_config_changed(rdp, 1);
731 }
732 if (!bp->bio_resid)
733 biodone(bp);
734 }
735
736 if (composite) {
737 if (finished) {
738 /* we are done with this composite, free all resources */
739 for (i = 0; i < 32; i++) {
740 if (composite->rd_needed & (1 << i) ||
741 composite->wr_needed & (1 << i)) {
742 ata_free_request(composite->request[i]);
743 }
744 }
745 mtx_destroy(&composite->lock);
746 ata_free_composite(composite);
747 }
748 }
749 else
750 ata_free_request(request);
751}
752
753static void
754ata_raid_config_changed(struct ar_softc *rdp, int writeback)
755{
756 int disk, count, status;
757
758 mtx_lock(&rdp->lock);
759 /* set default all working mode */
760 status = rdp->status;
761 rdp->status &= ~AR_S_DEGRADED;
762 rdp->status |= AR_S_READY;
763
764 /* make sure all lost drives are accounted for */
765 for (disk = 0; disk < rdp->total_disks; disk++) {
766 if (!(rdp->disks[disk].flags & AR_DF_PRESENT))
767 rdp->disks[disk].flags &= ~AR_DF_ONLINE;
768 }
769
770 /* depending on RAID type figure out our health status */
771 switch (rdp->type) {
772 case AR_T_JBOD:
773 case AR_T_SPAN:
774 case AR_T_RAID0:
775 for (disk = 0; disk < rdp->total_disks; disk++)
776 if (!(rdp->disks[disk].flags & AR_DF_ONLINE))
777 rdp->status &= ~AR_S_READY;
778 break;
779
780 case AR_T_RAID1:
781 case AR_T_RAID01:
782 for (disk = 0; disk < rdp->width; disk++) {
783 if (!(rdp->disks[disk].flags & AR_DF_ONLINE) &&
784 !(rdp->disks[disk + rdp->width].flags & AR_DF_ONLINE)) {
785 rdp->status &= ~AR_S_READY;
786 }
787 else if (((rdp->disks[disk].flags & AR_DF_ONLINE) &&
788 !(rdp->disks[disk + rdp->width].flags & AR_DF_ONLINE)) ||
789 (!(rdp->disks[disk].flags & AR_DF_ONLINE) &&
790 (rdp->disks [disk + rdp->width].flags & AR_DF_ONLINE))) {
791 rdp->status |= AR_S_DEGRADED;
792 }
793 }
794 break;
795
796 case AR_T_RAID5:
797 for (count = 0, disk = 0; disk < rdp->total_disks; disk++) {
798 if (!(rdp->disks[disk].flags & AR_DF_ONLINE))
799 count++;
800 }
801 if (count) {
802 if (count > 1)
803 rdp->status &= ~AR_S_READY;
804 else
805 rdp->status |= AR_S_DEGRADED;
806 }
807 break;
808 default:
809 rdp->status &= ~AR_S_READY;
810 }
811
812 if (rdp->status != status) {
813 if (!(rdp->status & AR_S_READY)) {
814 printf("ar%d: FAILURE - %s array broken\n",
815 rdp->lun, ata_raid_type(rdp));
816 }
817 else if (rdp->status & AR_S_DEGRADED) {
818 if (rdp->type & (AR_T_RAID1 | AR_T_RAID01))
819 printf("ar%d: WARNING - mirror", rdp->lun);
820 else
821 printf("ar%d: WARNING - parity", rdp->lun);
822 printf(" protection lost. %s array in DEGRADED mode\n",
823 ata_raid_type(rdp));
824 }
825 }
826 mtx_unlock(&rdp->lock);
827 if (writeback)
828 ata_raid_write_metadata(rdp);
829
830}
831
832static int
833ata_raid_status(struct ata_ioc_raid_config *config)
834{
835 struct ar_softc *rdp;
836 int i;
837
838 if (!(rdp = ata_raid_arrays[config->lun]))
839 return ENXIO;
840
841 config->type = rdp->type;
842 config->total_disks = rdp->total_disks;
843 for (i = 0; i < rdp->total_disks; i++ ) {
844 if ((rdp->disks[i].flags & AR_DF_PRESENT) && rdp->disks[i].dev)
845 config->disks[i] = device_get_unit(rdp->disks[i].dev);
846 else
847 config->disks[i] = -1;
848 }
849 config->interleave = rdp->interleave;
850 config->status = rdp->status;
851 config->progress = 100 * rdp->rebuild_lba / rdp->total_sectors;
852 return 0;
853}
854
855static int
856ata_raid_create(struct ata_ioc_raid_config *config)
857{
858 struct ar_softc *rdp;
859 device_t subdisk;
860 int array, disk;
861 int ctlr = 0, disk_size = 0, total_disks = 0;
862
863 for (array = 0; array < MAX_ARRAYS; array++) {
864 if (!ata_raid_arrays[array])
865 break;
866 }
867 if (array >= MAX_ARRAYS)
868 return ENOSPC;
869
870 if (!(rdp = (struct ar_softc*)malloc(sizeof(struct ar_softc), M_AR,
871 M_NOWAIT | M_ZERO))) {
872 printf("ar%d: no memory for metadata storage\n", array);
873 return ENOMEM;
874 }
875
876 for (disk = 0; disk < config->total_disks; disk++) {
877 if ((subdisk = devclass_get_device(ata_raid_sub_devclass,
878 config->disks[disk]))) {
879 struct ata_raid_subdisk *ars = device_get_softc(subdisk);
880
881 /* is device already assigned to another array ? */
882 if (ars->raid[rdp->volume]) {
883 config->disks[disk] = -1;
884 free(rdp, M_AR);
885 return EBUSY;
886 }
887 rdp->disks[disk].dev = device_get_parent(subdisk);
888
889 switch (pci_get_vendor(GRANDPARENT(rdp->disks[disk].dev))) {
890 case ATA_HIGHPOINT_ID:
891 /*
892 * we need some way to decide if it should be v2 or v3
893 * for now just use v2 since the v3 BIOS knows how to
894 * handle that as well.
895 */
896 ctlr = AR_F_HPTV2_RAID;
897 rdp->disks[disk].sectors = HPTV3_LBA(rdp->disks[disk].dev);
898 break;
899
900 case ATA_INTEL_ID:
901 ctlr = AR_F_INTEL_RAID;
902 rdp->disks[disk].sectors = INTEL_LBA(rdp->disks[disk].dev);
903 break;
904
905 case ATA_ITE_ID:
906 ctlr = AR_F_ITE_RAID;
907 rdp->disks[disk].sectors = ITE_LBA(rdp->disks[disk].dev);
908 break;
909
910 case 0: /* XXX SOS cover up for bug in our PCI code */
911 case ATA_PROMISE_ID:
912 ctlr = AR_F_PROMISE_RAID;
911 rdp->disks[disk].sectors = PR_LBA(rdp->disks[disk].dev);
913 rdp->disks[disk].sectors = PROMISE_LBA(rdp->disks[disk].dev);
912 break;
913
914 case ATA_SIS_ID:
915 ctlr = AR_F_SIS_RAID;
916 rdp->disks[disk].sectors = SIS_LBA(rdp->disks[disk].dev);
917 break;
918
919 case ATA_ATI_ID:
920 case ATA_VIA_ID:
921 ctlr = AR_F_VIA_RAID;
922 rdp->disks[disk].sectors = VIA_LBA(rdp->disks[disk].dev);
923 break;
924
925 default:
926 /* XXX SOS
927 * right, so here we are, we have an ATA chip and we want
928 * to create a RAID and store the metadata.
929 * we need to find a way to tell what kind of metadata this
930 * hardware's BIOS might be using (good ideas are welcomed)
931 * for now we just use our own native FreeBSD format.
932 * the only way to get support for the BIOS format is to
933 * setup the RAID from there, in that case we pickup the
934 * metadata format from the disks (if we support it).
935 */
936 printf("WARNING!! - not able to determine metadata format\n"
937 "WARNING!! - Using FreeBSD PsuedoRAID metadata\n"
938 "If that is not what you want, use the BIOS to "
939 "create the array\n");
940 ctlr = AR_F_FREEBSD_RAID;
914 break;
915
916 case ATA_SIS_ID:
917 ctlr = AR_F_SIS_RAID;
918 rdp->disks[disk].sectors = SIS_LBA(rdp->disks[disk].dev);
919 break;
920
921 case ATA_ATI_ID:
922 case ATA_VIA_ID:
923 ctlr = AR_F_VIA_RAID;
924 rdp->disks[disk].sectors = VIA_LBA(rdp->disks[disk].dev);
925 break;
926
927 default:
928 /* XXX SOS
929 * right, so here we are, we have an ATA chip and we want
930 * to create a RAID and store the metadata.
931 * we need to find a way to tell what kind of metadata this
932 * hardware's BIOS might be using (good ideas are welcomed)
933 * for now we just use our own native FreeBSD format.
934 * the only way to get support for the BIOS format is to
935 * setup the RAID from there, in that case we pickup the
936 * metadata format from the disks (if we support it).
937 */
938 printf("WARNING!! - not able to determine metadata format\n"
939 "WARNING!! - Using FreeBSD PsuedoRAID metadata\n"
940 "If that is not what you want, use the BIOS to "
941 "create the array\n");
942 ctlr = AR_F_FREEBSD_RAID;
941 rdp->disks[disk].sectors = PR_LBA(rdp->disks[disk].dev);
943 rdp->disks[disk].sectors = PROMISE_LBA(rdp->disks[disk].dev);
942 break;
943 }
944
945 /* we need all disks to be of the same format */
946 if ((rdp->format & AR_F_FORMAT_MASK) &&
947 (rdp->format & AR_F_FORMAT_MASK) != (ctlr & AR_F_FORMAT_MASK)) {
948 free(rdp, M_AR);
949 return EXDEV;
950 }
951 else
952 rdp->format = ctlr;
953
954 /* use the smallest disk of the lots size */
955 /* gigabyte boundry ??? XXX SOS */
956 if (disk_size)
957 disk_size = min(rdp->disks[disk].sectors, disk_size);
958 else
959 disk_size = rdp->disks[disk].sectors;
960 rdp->disks[disk].flags =
961 (AR_DF_PRESENT | AR_DF_ASSIGNED | AR_DF_ONLINE);
962
963 total_disks++;
964 }
965 else {
966 config->disks[disk] = -1;
967 free(rdp, M_AR);
968 return ENXIO;
969 }
970 }
971
972 if (total_disks != config->total_disks) {
973 free(rdp, M_AR);
974 return ENODEV;
975 }
976
977 switch (config->type) {
978 case AR_T_JBOD:
979 case AR_T_SPAN:
980 case AR_T_RAID0:
981 break;
982
983 case AR_T_RAID1:
984 if (total_disks != 2) {
985 free(rdp, M_AR);
986 return EPERM;
987 }
988 break;
989
990 case AR_T_RAID01:
991 if (total_disks % 2 != 0) {
992 free(rdp, M_AR);
993 return EPERM;
994 }
995 break;
996
997 case AR_T_RAID5:
998 if (total_disks < 3) {
999 free(rdp, M_AR);
1000 return EPERM;
1001 }
1002 break;
1003
1004 default:
1005 free(rdp, M_AR);
1006 return EOPNOTSUPP;
1007 }
1008 rdp->type = config->type;
1009 rdp->lun = array;
1010 if (rdp->type == AR_T_RAID0 || rdp->type == AR_T_RAID01 ||
1011 rdp->type == AR_T_RAID5) {
1012 int bit = 0;
1013
1014 while (config->interleave >>= 1)
1015 bit++;
1016 rdp->interleave = 1 << bit;
1017 }
1018 rdp->offset_sectors = 0;
1019
1020 /* values that depend on metadata format */
1021 switch (rdp->format) {
1022 case AR_F_ADAPTEC_RAID:
1023 rdp->interleave = min(max(32, rdp->interleave), 128); /*+*/
1024 break;
1025
1026 case AR_F_HPTV2_RAID:
1027 rdp->interleave = min(max(8, rdp->interleave), 128); /*+*/
1028 rdp->offset_sectors = HPTV2_LBA(x) + 1;
1029 break;
1030
1031 case AR_F_HPTV3_RAID:
1032 rdp->interleave = min(max(32, rdp->interleave), 4096); /*+*/
1033 break;
1034
1035 case AR_F_INTEL_RAID:
1036 rdp->interleave = min(max(8, rdp->interleave), 256); /*+*/
1037 break;
1038
1039 case AR_F_ITE_RAID:
1040 rdp->interleave = min(max(2, rdp->interleave), 128); /*+*/
1041 break;
1042
1043 case AR_F_LSIV2_RAID:
1044 rdp->interleave = min(max(2, rdp->interleave), 4096);
1045 break;
1046
1047 case AR_F_LSIV3_RAID:
1048 rdp->interleave = min(max(2, rdp->interleave), 256);
1049 break;
1050
1051 case AR_F_PROMISE_RAID:
1052 rdp->interleave = min(max(2, rdp->interleave), 2048); /*+*/
1053 break;
1054
1055 case AR_F_SII_RAID:
1056 rdp->interleave = min(max(8, rdp->interleave), 256); /*+*/
1057 break;
1058
1059 case AR_F_SIS_RAID:
1060 rdp->interleave = min(max(32, rdp->interleave), 512); /*+*/
1061 break;
1062
1063 case AR_F_VIA_RAID:
1064 rdp->interleave = min(max(8, rdp->interleave), 128); /*+*/
1065 break;
1066 }
1067
1068 rdp->total_disks = total_disks;
1069 rdp->width = total_disks / (rdp->type & (AR_RAID1 | AR_T_RAID01) ? 2 : 1);
1070 rdp->total_sectors = disk_size * (rdp->width - (rdp->type == AR_RAID5));
1071 rdp->heads = 255;
1072 rdp->sectors = 63;
1073 rdp->cylinders = rdp->total_sectors / (255 * 63);
1074 rdp->rebuild_lba = 0;
1075 rdp->status |= AR_S_READY;
1076
1077 /* we are committed to this array, grap the subdisks */
1078 for (disk = 0; disk < config->total_disks; disk++) {
1079 if ((subdisk = devclass_get_device(ata_raid_sub_devclass,
1080 config->disks[disk]))) {
1081 struct ata_raid_subdisk *ars = device_get_softc(subdisk);
1082
1083 ars->raid[rdp->volume] = rdp;
1084 ars->disk_number[rdp->volume] = disk;
1085 }
1086 }
1087 ata_raid_attach(rdp, 1);
1088 ata_raid_arrays[array] = rdp;
1089 config->lun = array;
1090 return 0;
1091}
1092
1093static int
1094ata_raid_delete(int array)
1095{
1096 struct ar_softc *rdp;
1097 device_t subdisk;
1098 int disk;
1099
1100 if (!(rdp = ata_raid_arrays[array]))
1101 return ENXIO;
1102
1103 rdp->status &= ~AR_S_READY;
1104 disk_destroy(rdp->disk);
1105
1106 for (disk = 0; disk < rdp->total_disks; disk++) {
1107 if ((rdp->disks[disk].flags & AR_DF_PRESENT) && rdp->disks[disk].dev) {
1108 if ((subdisk = devclass_get_device(ata_raid_sub_devclass,
1109 device_get_unit(rdp->disks[disk].dev)))) {
1110 struct ata_raid_subdisk *ars = device_get_softc(subdisk);
1111
1112 if (ars->raid[rdp->volume] != rdp) /* XXX SOS */
1113 device_printf(subdisk, "DOH! this disk doesn't belong\n");
1114 if (ars->disk_number[rdp->volume] != disk) /* XXX SOS */
1115 device_printf(subdisk, "DOH! this disk number is wrong\n");
1116 ars->raid[rdp->volume] = NULL;
1117 ars->disk_number[rdp->volume] = -1;
1118 }
1119 rdp->disks[disk].flags = 0;
1120 }
1121 }
944 break;
945 }
946
947 /* we need all disks to be of the same format */
948 if ((rdp->format & AR_F_FORMAT_MASK) &&
949 (rdp->format & AR_F_FORMAT_MASK) != (ctlr & AR_F_FORMAT_MASK)) {
950 free(rdp, M_AR);
951 return EXDEV;
952 }
953 else
954 rdp->format = ctlr;
955
956 /* use the smallest disk of the lots size */
957 /* gigabyte boundry ??? XXX SOS */
958 if (disk_size)
959 disk_size = min(rdp->disks[disk].sectors, disk_size);
960 else
961 disk_size = rdp->disks[disk].sectors;
962 rdp->disks[disk].flags =
963 (AR_DF_PRESENT | AR_DF_ASSIGNED | AR_DF_ONLINE);
964
965 total_disks++;
966 }
967 else {
968 config->disks[disk] = -1;
969 free(rdp, M_AR);
970 return ENXIO;
971 }
972 }
973
974 if (total_disks != config->total_disks) {
975 free(rdp, M_AR);
976 return ENODEV;
977 }
978
979 switch (config->type) {
980 case AR_T_JBOD:
981 case AR_T_SPAN:
982 case AR_T_RAID0:
983 break;
984
985 case AR_T_RAID1:
986 if (total_disks != 2) {
987 free(rdp, M_AR);
988 return EPERM;
989 }
990 break;
991
992 case AR_T_RAID01:
993 if (total_disks % 2 != 0) {
994 free(rdp, M_AR);
995 return EPERM;
996 }
997 break;
998
999 case AR_T_RAID5:
1000 if (total_disks < 3) {
1001 free(rdp, M_AR);
1002 return EPERM;
1003 }
1004 break;
1005
1006 default:
1007 free(rdp, M_AR);
1008 return EOPNOTSUPP;
1009 }
1010 rdp->type = config->type;
1011 rdp->lun = array;
1012 if (rdp->type == AR_T_RAID0 || rdp->type == AR_T_RAID01 ||
1013 rdp->type == AR_T_RAID5) {
1014 int bit = 0;
1015
1016 while (config->interleave >>= 1)
1017 bit++;
1018 rdp->interleave = 1 << bit;
1019 }
1020 rdp->offset_sectors = 0;
1021
1022 /* values that depend on metadata format */
1023 switch (rdp->format) {
1024 case AR_F_ADAPTEC_RAID:
1025 rdp->interleave = min(max(32, rdp->interleave), 128); /*+*/
1026 break;
1027
1028 case AR_F_HPTV2_RAID:
1029 rdp->interleave = min(max(8, rdp->interleave), 128); /*+*/
1030 rdp->offset_sectors = HPTV2_LBA(x) + 1;
1031 break;
1032
1033 case AR_F_HPTV3_RAID:
1034 rdp->interleave = min(max(32, rdp->interleave), 4096); /*+*/
1035 break;
1036
1037 case AR_F_INTEL_RAID:
1038 rdp->interleave = min(max(8, rdp->interleave), 256); /*+*/
1039 break;
1040
1041 case AR_F_ITE_RAID:
1042 rdp->interleave = min(max(2, rdp->interleave), 128); /*+*/
1043 break;
1044
1045 case AR_F_LSIV2_RAID:
1046 rdp->interleave = min(max(2, rdp->interleave), 4096);
1047 break;
1048
1049 case AR_F_LSIV3_RAID:
1050 rdp->interleave = min(max(2, rdp->interleave), 256);
1051 break;
1052
1053 case AR_F_PROMISE_RAID:
1054 rdp->interleave = min(max(2, rdp->interleave), 2048); /*+*/
1055 break;
1056
1057 case AR_F_SII_RAID:
1058 rdp->interleave = min(max(8, rdp->interleave), 256); /*+*/
1059 break;
1060
1061 case AR_F_SIS_RAID:
1062 rdp->interleave = min(max(32, rdp->interleave), 512); /*+*/
1063 break;
1064
1065 case AR_F_VIA_RAID:
1066 rdp->interleave = min(max(8, rdp->interleave), 128); /*+*/
1067 break;
1068 }
1069
1070 rdp->total_disks = total_disks;
1071 rdp->width = total_disks / (rdp->type & (AR_RAID1 | AR_T_RAID01) ? 2 : 1);
1072 rdp->total_sectors = disk_size * (rdp->width - (rdp->type == AR_RAID5));
1073 rdp->heads = 255;
1074 rdp->sectors = 63;
1075 rdp->cylinders = rdp->total_sectors / (255 * 63);
1076 rdp->rebuild_lba = 0;
1077 rdp->status |= AR_S_READY;
1078
1079 /* we are committed to this array, grap the subdisks */
1080 for (disk = 0; disk < config->total_disks; disk++) {
1081 if ((subdisk = devclass_get_device(ata_raid_sub_devclass,
1082 config->disks[disk]))) {
1083 struct ata_raid_subdisk *ars = device_get_softc(subdisk);
1084
1085 ars->raid[rdp->volume] = rdp;
1086 ars->disk_number[rdp->volume] = disk;
1087 }
1088 }
1089 ata_raid_attach(rdp, 1);
1090 ata_raid_arrays[array] = rdp;
1091 config->lun = array;
1092 return 0;
1093}
1094
1095static int
1096ata_raid_delete(int array)
1097{
1098 struct ar_softc *rdp;
1099 device_t subdisk;
1100 int disk;
1101
1102 if (!(rdp = ata_raid_arrays[array]))
1103 return ENXIO;
1104
1105 rdp->status &= ~AR_S_READY;
1106 disk_destroy(rdp->disk);
1107
1108 for (disk = 0; disk < rdp->total_disks; disk++) {
1109 if ((rdp->disks[disk].flags & AR_DF_PRESENT) && rdp->disks[disk].dev) {
1110 if ((subdisk = devclass_get_device(ata_raid_sub_devclass,
1111 device_get_unit(rdp->disks[disk].dev)))) {
1112 struct ata_raid_subdisk *ars = device_get_softc(subdisk);
1113
1114 if (ars->raid[rdp->volume] != rdp) /* XXX SOS */
1115 device_printf(subdisk, "DOH! this disk doesn't belong\n");
1116 if (ars->disk_number[rdp->volume] != disk) /* XXX SOS */
1117 device_printf(subdisk, "DOH! this disk number is wrong\n");
1118 ars->raid[rdp->volume] = NULL;
1119 ars->disk_number[rdp->volume] = -1;
1120 }
1121 rdp->disks[disk].flags = 0;
1122 }
1123 }
1122 ata_raid_write_metadata(rdp); /* XXX SOS wipe metadata instead? */
1124 ata_raid_wipe_metadata(rdp);
1123 ata_raid_arrays[array] = NULL;
1124 free(rdp, M_AR);
1125 return 0;
1126}
1127
1128static int
1129ata_raid_addspare(struct ata_ioc_raid_config *config)
1130{
1131 struct ar_softc *rdp;
1132 device_t subdisk;
1133 int disk;
1134
1135 if (!(rdp = ata_raid_arrays[config->lun]))
1136 return ENXIO;
1137 if (!(rdp->status & AR_S_DEGRADED) || !(rdp->status & AR_S_READY))
1138 return ENXIO;
1139 if (rdp->status & AR_S_REBUILDING)
1140 return EBUSY;
1141 switch (rdp->type) {
1142 case AR_T_RAID1:
1143 case AR_T_RAID01:
1144 case AR_T_RAID5:
1145 for (disk = 0; disk < rdp->total_disks; disk++ ) {
1146
1147 if (((rdp->disks[disk].flags & (AR_DF_PRESENT | AR_DF_ONLINE)) ==
1148 (AR_DF_PRESENT | AR_DF_ONLINE)) && rdp->disks[disk].dev)
1149 continue;
1150
1151 if ((subdisk = devclass_get_device(ata_raid_sub_devclass,
1152 config->disks[0] ))) {
1153 struct ata_raid_subdisk *ars = device_get_softc(subdisk);
1154
1155 if (ars->raid[rdp->volume])
1156 return EBUSY;
1157
1158 /* XXX SOS validate size etc etc */
1159 ars->raid[rdp->volume] = rdp;
1160 ars->disk_number[rdp->volume] = disk;
1161 rdp->disks[disk].dev = device_get_parent(subdisk);
1162 rdp->disks[disk].flags =
1163 (AR_DF_PRESENT | AR_DF_ASSIGNED | AR_DF_SPARE);
1164
1165 device_printf(rdp->disks[disk].dev,
1166 "inserted into ar%d disk%d as spare\n",
1167 rdp->lun, disk);
1168 ata_raid_config_changed(rdp, 1);
1169 return 0;
1170 }
1171 }
1172 return ENXIO;
1173
1174 default:
1175 return EPERM;
1176 }
1177}
1178
1179static int
1180ata_raid_rebuild(int array)
1181{
1182 struct ar_softc *rdp;
1183 int disk, count;
1184
1185 if (!(rdp = ata_raid_arrays[array]))
1186 return ENXIO;
1187 /* XXX SOS we should lock the rdp softc here */
1188 if (!(rdp->status & AR_S_DEGRADED) || !(rdp->status & AR_S_READY))
1189 return ENXIO;
1190 if (rdp->status & AR_S_REBUILDING)
1191 return EBUSY;
1192
1193 switch (rdp->type) {
1194 case AR_T_RAID1:
1195 case AR_T_RAID01:
1196 case AR_T_RAID5:
1197 for (count = 0, disk = 0; disk < rdp->total_disks; disk++ ) {
1198 if (((rdp->disks[disk].flags &
1199 (AR_DF_PRESENT|AR_DF_ASSIGNED|AR_DF_ONLINE|AR_DF_SPARE)) ==
1200 (AR_DF_PRESENT | AR_DF_ASSIGNED | AR_DF_SPARE)) &&
1201 rdp->disks[disk].dev) {
1202 count++;
1203 }
1204 }
1205
1206 if (count) {
1207 rdp->rebuild_lba = 0;
1208 rdp->status |= AR_S_REBUILDING;
1209 return 0;
1210 }
1211 return EIO;
1212
1213 default:
1214 return EPERM;
1215 }
1216}
1217
1218static int
1219ata_raid_read_metadata(device_t subdisk)
1220{
1221 devclass_t pci_devclass = devclass_find("pci");
1222 devclass_t devclass=device_get_devclass(GRANDPARENT(GRANDPARENT(subdisk)));
1223
1224 /* prioritize vendor native metadata layout if possible */
1225 if (devclass == pci_devclass) {
1226 switch (pci_get_vendor(GRANDPARENT(device_get_parent(subdisk)))) {
1227 case ATA_HIGHPOINT_ID:
1228 if (ata_raid_hptv3_read_meta(subdisk, ata_raid_arrays))
1229 return 0;
1230 if (ata_raid_hptv2_read_meta(subdisk, ata_raid_arrays))
1231 return 0;
1232 break;
1233
1234 case ATA_INTEL_ID:
1235 if (ata_raid_intel_read_meta(subdisk, ata_raid_arrays))
1236 return 0;
1237 break;
1238
1239 case ATA_ITE_ID:
1240 if (ata_raid_ite_read_meta(subdisk, ata_raid_arrays))
1241 return 0;
1242 break;
1243
1244 case ATA_NVIDIA_ID:
1245 if (ata_raid_nvidia_read_meta(subdisk, ata_raid_arrays))
1246 return 0;
1247 break;
1248
1249 case 0: /* XXX SOS cover up for bug in our PCI code */
1250 case ATA_PROMISE_ID:
1251 if (ata_raid_promise_read_meta(subdisk, ata_raid_arrays, 0))
1252 return 0;
1253 break;
1254
1255 case ATA_ATI_ID:
1256 case ATA_SILICON_IMAGE_ID:
1257 if (ata_raid_sii_read_meta(subdisk, ata_raid_arrays))
1258 return 0;
1259 break;
1260
1261 case ATA_SIS_ID:
1262 if (ata_raid_sis_read_meta(subdisk, ata_raid_arrays))
1263 return 0;
1264 break;
1265
1266 case ATA_VIA_ID:
1267 if (ata_raid_via_read_meta(subdisk, ata_raid_arrays))
1268 return 0;
1269 break;
1270 }
1271 }
1272
1273 /* handle controllers that have multiple layout possibilities */
1274 /* NOTE: the order of these are not insignificant */
1275
1276 /* Adaptec HostRAID */
1277 if (ata_raid_adaptec_read_meta(subdisk, ata_raid_arrays))
1278 return 0;
1279
1280 /* LSILogic v3 and v2 */
1281 if (ata_raid_lsiv3_read_meta(subdisk, ata_raid_arrays))
1282 return 0;
1283 if (ata_raid_lsiv2_read_meta(subdisk, ata_raid_arrays))
1284 return 0;
1285
1286 /* if none of the above matched, try FreeBSD native format */
1287 return ata_raid_promise_read_meta(subdisk, ata_raid_arrays, 1);
1288}
1289
1290static int
1291ata_raid_write_metadata(struct ar_softc *rdp)
1292{
1293 switch (rdp->format) {
1294 case AR_F_FREEBSD_RAID:
1295 case AR_F_PROMISE_RAID:
1296 return ata_raid_promise_write_meta(rdp);
1297
1298 case AR_F_HPTV3_RAID:
1299 case AR_F_HPTV2_RAID:
1300 /*
1301 * always write HPT v2 metadata, the v3 BIOS knows it as well.
1302 * this is handy since we cannot know what version BIOS is on there
1303 */
1304 return ata_raid_hptv2_write_meta(rdp);
1305
1306 case AR_F_INTEL_RAID:
1307 return ata_raid_intel_write_meta(rdp);
1308
1309 case AR_F_SIS_RAID:
1310 return ata_raid_sis_write_meta(rdp);
1125 ata_raid_arrays[array] = NULL;
1126 free(rdp, M_AR);
1127 return 0;
1128}
1129
1130static int
1131ata_raid_addspare(struct ata_ioc_raid_config *config)
1132{
1133 struct ar_softc *rdp;
1134 device_t subdisk;
1135 int disk;
1136
1137 if (!(rdp = ata_raid_arrays[config->lun]))
1138 return ENXIO;
1139 if (!(rdp->status & AR_S_DEGRADED) || !(rdp->status & AR_S_READY))
1140 return ENXIO;
1141 if (rdp->status & AR_S_REBUILDING)
1142 return EBUSY;
1143 switch (rdp->type) {
1144 case AR_T_RAID1:
1145 case AR_T_RAID01:
1146 case AR_T_RAID5:
1147 for (disk = 0; disk < rdp->total_disks; disk++ ) {
1148
1149 if (((rdp->disks[disk].flags & (AR_DF_PRESENT | AR_DF_ONLINE)) ==
1150 (AR_DF_PRESENT | AR_DF_ONLINE)) && rdp->disks[disk].dev)
1151 continue;
1152
1153 if ((subdisk = devclass_get_device(ata_raid_sub_devclass,
1154 config->disks[0] ))) {
1155 struct ata_raid_subdisk *ars = device_get_softc(subdisk);
1156
1157 if (ars->raid[rdp->volume])
1158 return EBUSY;
1159
1160 /* XXX SOS validate size etc etc */
1161 ars->raid[rdp->volume] = rdp;
1162 ars->disk_number[rdp->volume] = disk;
1163 rdp->disks[disk].dev = device_get_parent(subdisk);
1164 rdp->disks[disk].flags =
1165 (AR_DF_PRESENT | AR_DF_ASSIGNED | AR_DF_SPARE);
1166
1167 device_printf(rdp->disks[disk].dev,
1168 "inserted into ar%d disk%d as spare\n",
1169 rdp->lun, disk);
1170 ata_raid_config_changed(rdp, 1);
1171 return 0;
1172 }
1173 }
1174 return ENXIO;
1175
1176 default:
1177 return EPERM;
1178 }
1179}
1180
1181static int
1182ata_raid_rebuild(int array)
1183{
1184 struct ar_softc *rdp;
1185 int disk, count;
1186
1187 if (!(rdp = ata_raid_arrays[array]))
1188 return ENXIO;
1189 /* XXX SOS we should lock the rdp softc here */
1190 if (!(rdp->status & AR_S_DEGRADED) || !(rdp->status & AR_S_READY))
1191 return ENXIO;
1192 if (rdp->status & AR_S_REBUILDING)
1193 return EBUSY;
1194
1195 switch (rdp->type) {
1196 case AR_T_RAID1:
1197 case AR_T_RAID01:
1198 case AR_T_RAID5:
1199 for (count = 0, disk = 0; disk < rdp->total_disks; disk++ ) {
1200 if (((rdp->disks[disk].flags &
1201 (AR_DF_PRESENT|AR_DF_ASSIGNED|AR_DF_ONLINE|AR_DF_SPARE)) ==
1202 (AR_DF_PRESENT | AR_DF_ASSIGNED | AR_DF_SPARE)) &&
1203 rdp->disks[disk].dev) {
1204 count++;
1205 }
1206 }
1207
1208 if (count) {
1209 rdp->rebuild_lba = 0;
1210 rdp->status |= AR_S_REBUILDING;
1211 return 0;
1212 }
1213 return EIO;
1214
1215 default:
1216 return EPERM;
1217 }
1218}
1219
1220static int
1221ata_raid_read_metadata(device_t subdisk)
1222{
1223 devclass_t pci_devclass = devclass_find("pci");
1224 devclass_t devclass=device_get_devclass(GRANDPARENT(GRANDPARENT(subdisk)));
1225
1226 /* prioritize vendor native metadata layout if possible */
1227 if (devclass == pci_devclass) {
1228 switch (pci_get_vendor(GRANDPARENT(device_get_parent(subdisk)))) {
1229 case ATA_HIGHPOINT_ID:
1230 if (ata_raid_hptv3_read_meta(subdisk, ata_raid_arrays))
1231 return 0;
1232 if (ata_raid_hptv2_read_meta(subdisk, ata_raid_arrays))
1233 return 0;
1234 break;
1235
1236 case ATA_INTEL_ID:
1237 if (ata_raid_intel_read_meta(subdisk, ata_raid_arrays))
1238 return 0;
1239 break;
1240
1241 case ATA_ITE_ID:
1242 if (ata_raid_ite_read_meta(subdisk, ata_raid_arrays))
1243 return 0;
1244 break;
1245
1246 case ATA_NVIDIA_ID:
1247 if (ata_raid_nvidia_read_meta(subdisk, ata_raid_arrays))
1248 return 0;
1249 break;
1250
1251 case 0: /* XXX SOS cover up for bug in our PCI code */
1252 case ATA_PROMISE_ID:
1253 if (ata_raid_promise_read_meta(subdisk, ata_raid_arrays, 0))
1254 return 0;
1255 break;
1256
1257 case ATA_ATI_ID:
1258 case ATA_SILICON_IMAGE_ID:
1259 if (ata_raid_sii_read_meta(subdisk, ata_raid_arrays))
1260 return 0;
1261 break;
1262
1263 case ATA_SIS_ID:
1264 if (ata_raid_sis_read_meta(subdisk, ata_raid_arrays))
1265 return 0;
1266 break;
1267
1268 case ATA_VIA_ID:
1269 if (ata_raid_via_read_meta(subdisk, ata_raid_arrays))
1270 return 0;
1271 break;
1272 }
1273 }
1274
1275 /* handle controllers that have multiple layout possibilities */
1276 /* NOTE: the order of these are not insignificant */
1277
1278 /* Adaptec HostRAID */
1279 if (ata_raid_adaptec_read_meta(subdisk, ata_raid_arrays))
1280 return 0;
1281
1282 /* LSILogic v3 and v2 */
1283 if (ata_raid_lsiv3_read_meta(subdisk, ata_raid_arrays))
1284 return 0;
1285 if (ata_raid_lsiv2_read_meta(subdisk, ata_raid_arrays))
1286 return 0;
1287
1288 /* if none of the above matched, try FreeBSD native format */
1289 return ata_raid_promise_read_meta(subdisk, ata_raid_arrays, 1);
1290}
1291
1292static int
1293ata_raid_write_metadata(struct ar_softc *rdp)
1294{
1295 switch (rdp->format) {
1296 case AR_F_FREEBSD_RAID:
1297 case AR_F_PROMISE_RAID:
1298 return ata_raid_promise_write_meta(rdp);
1299
1300 case AR_F_HPTV3_RAID:
1301 case AR_F_HPTV2_RAID:
1302 /*
1303 * always write HPT v2 metadata, the v3 BIOS knows it as well.
1304 * this is handy since we cannot know what version BIOS is on there
1305 */
1306 return ata_raid_hptv2_write_meta(rdp);
1307
1308 case AR_F_INTEL_RAID:
1309 return ata_raid_intel_write_meta(rdp);
1310
1311 case AR_F_SIS_RAID:
1312 return ata_raid_sis_write_meta(rdp);
1313
1314 case AR_F_VIA_RAID:
1315 return ata_raid_via_write_meta(rdp);
1311#if 0
1312 case AR_F_HPTV3_RAID:
1313 return ata_raid_hptv3_write_meta(rdp);
1314
1315 case AR_F_ADAPTEC_RAID:
1316 return ata_raid_adaptec_write_meta(rdp);
1317
1318 case AR_F_ITE_RAID:
1319 return ata_raid_ite_write_meta(rdp);
1320
1321 case AR_F_LSIV2_RAID:
1322 return ata_raid_lsiv2_write_meta(rdp);
1323
1324 case AR_F_LSIV3_RAID:
1325 return ata_raid_lsiv3_write_meta(rdp);
1326
1327 case AR_F_NVIDIA_RAID:
1328 return ata_raid_nvidia_write_meta(rdp);
1329
1330 case AR_F_SII_RAID:
1331 return ata_raid_sii_write_meta(rdp);
1332
1316#if 0
1317 case AR_F_HPTV3_RAID:
1318 return ata_raid_hptv3_write_meta(rdp);
1319
1320 case AR_F_ADAPTEC_RAID:
1321 return ata_raid_adaptec_write_meta(rdp);
1322
1323 case AR_F_ITE_RAID:
1324 return ata_raid_ite_write_meta(rdp);
1325
1326 case AR_F_LSIV2_RAID:
1327 return ata_raid_lsiv2_write_meta(rdp);
1328
1329 case AR_F_LSIV3_RAID:
1330 return ata_raid_lsiv3_write_meta(rdp);
1331
1332 case AR_F_NVIDIA_RAID:
1333 return ata_raid_nvidia_write_meta(rdp);
1334
1335 case AR_F_SII_RAID:
1336 return ata_raid_sii_write_meta(rdp);
1337
1333 case AR_F_VIA_RAID:
1334 return ata_raid_via_write_meta(rdp);
1335#endif
1336 default:
1337 printf("ar%d: writing of %s metadata is NOT supported yet\n",
1338 rdp->lun, ata_raid_format(rdp));
1339 }
1340 return -1;
1341}
1342
1338#endif
1339 default:
1340 printf("ar%d: writing of %s metadata is NOT supported yet\n",
1341 rdp->lun, ata_raid_format(rdp));
1342 }
1343 return -1;
1344}
1345
1346static int
1347ata_raid_wipe_metadata(struct ar_softc *rdp)
1348{
1349 int disk, error = 0;
1350 u_int64_t lba;
1351 u_int32_t size;
1352 u_int8_t *meta;
1353
1354 for (disk = 0; disk < rdp->total_disks; disk++) {
1355 if (rdp->disks[disk].dev) {
1356 switch (rdp->format) {
1357 case AR_F_ADAPTEC_RAID:
1358 lba = ADP_LBA(rdp->disks[disk].dev);
1359 size = sizeof(struct adaptec_raid_conf);
1360 break;
1361
1362 case AR_F_HPTV2_RAID:
1363 lba = HPTV2_LBA(rdp->disks[disk].dev);
1364 size = sizeof(struct hptv2_raid_conf);
1365 break;
1366
1367 case AR_F_HPTV3_RAID:
1368 lba = HPTV3_LBA(rdp->disks[disk].dev);
1369 size = sizeof(struct hptv3_raid_conf);
1370 break;
1371
1372 case AR_F_INTEL_RAID:
1373 lba = INTEL_LBA(rdp->disks[disk].dev);
1374 size = 3 * 512; /* XXX SOS */
1375 break;
1376
1377 case AR_F_ITE_RAID:
1378 lba = ITE_LBA(rdp->disks[disk].dev);
1379 size = sizeof(struct ite_raid_conf);
1380 break;
1381
1382 case AR_F_LSIV2_RAID:
1383 lba = LSIV2_LBA(rdp->disks[disk].dev);
1384 size = sizeof(struct lsiv2_raid_conf);
1385 break;
1386
1387 case AR_F_LSIV3_RAID:
1388 lba = LSIV3_LBA(rdp->disks[disk].dev);
1389 size = sizeof(struct lsiv3_raid_conf);
1390 break;
1391
1392 case AR_F_NVIDIA_RAID:
1393 lba = NVIDIA_LBA(rdp->disks[disk].dev);
1394 size = sizeof(struct nvidia_raid_conf);
1395 break;
1396
1397 case AR_F_FREEBSD_RAID:
1398 case AR_F_PROMISE_RAID:
1399 lba = PROMISE_LBA(rdp->disks[disk].dev);
1400 size = sizeof(struct promise_raid_conf);
1401 break;
1402
1403 case AR_F_SII_RAID:
1404 lba = SII_LBA(rdp->disks[disk].dev);
1405 size = sizeof(struct sii_raid_conf);
1406 break;
1407
1408 case AR_F_SIS_RAID:
1409 lba = SIS_LBA(rdp->disks[disk].dev);
1410 size = sizeof(struct sis_raid_conf);
1411 break;
1412
1413 case AR_F_VIA_RAID:
1414 lba = VIA_LBA(rdp->disks[disk].dev);
1415 size = sizeof(struct via_raid_conf);
1416 break;
1417
1418 default:
1419 printf("ar%d: wiping of %s metadata is NOT supported yet\n",
1420 rdp->lun, ata_raid_format(rdp));
1421 return ENXIO;
1422 }
1423 if (!(meta = malloc(size, M_AR, M_NOWAIT | M_ZERO)))
1424 return ENOMEM;
1425 if (ata_raid_rw(rdp->disks[disk].dev, lba, meta, size,
1426 ATA_R_WRITE | ATA_R_DIRECT)) {
1427 device_printf(rdp->disks[disk].dev, "wipe metadata failed\n");
1428 error = EIO;
1429 }
1430 free(meta, M_AR);
1431 }
1432 }
1433 return error;
1434}
1435
1343/* Adaptec HostRAID Metadata */
1344static int
1345ata_raid_adaptec_read_meta(device_t dev, struct ar_softc **raidp)
1346{
1347 struct ata_raid_subdisk *ars = device_get_softc(dev);
1348 device_t parent = device_get_parent(dev);
1349 struct adaptec_raid_conf *meta;
1350 struct ar_softc *raid;
1351 int array, disk, retval = 0;
1352
1353 if (!(meta = (struct adaptec_raid_conf *)
1354 malloc(sizeof(struct adaptec_raid_conf), M_AR, M_NOWAIT | M_ZERO)))
1355 return ENOMEM;
1356
1357 if (ata_raid_rw(parent, ADP_LBA(parent),
1358 meta, sizeof(struct adaptec_raid_conf), ATA_R_READ)) {
1359 if (testing || bootverbose)
1360 device_printf(parent, "Adaptec read metadata failed\n");
1361 goto adaptec_out;
1362 }
1363
1364 /* check if this is a Adaptec RAID struct */
1365 if (meta->magic_0 != ADP_MAGIC_0 || meta->magic_3 != ADP_MAGIC_3) {
1366 if (testing || bootverbose)
1367 device_printf(parent, "Adaptec check1 failed\n");
1368 goto adaptec_out;
1369 }
1370
1371 if (testing || bootverbose)
1372 ata_raid_adaptec_print_meta(meta);
1373
1374 /* now convert Adaptec metadata into our generic form */
1375 for (array = 0; array < MAX_ARRAYS; array++) {
1376 if (!raidp[array]) {
1377 raidp[array] =
1378 (struct ar_softc *)malloc(sizeof(struct ar_softc), M_AR,
1379 M_NOWAIT | M_ZERO);
1380 if (!raidp[array]) {
1381 device_printf(parent, "failed to allocate metadata storage\n");
1382 goto adaptec_out;
1383 }
1384 }
1385 raid = raidp[array];
1386 if (raid->format && (raid->format != AR_F_ADAPTEC_RAID))
1387 continue;
1388
1389 if (raid->magic_0 && raid->magic_0 != meta->configs[0].magic_0)
1390 continue;
1391
1392 if (!meta->generation || be32toh(meta->generation) > raid->generation) {
1393 switch (meta->configs[0].type) {
1394 case ADP_T_RAID0:
1395 raid->magic_0 = meta->configs[0].magic_0;
1396 raid->type = AR_T_RAID0;
1397 raid->interleave = 1 << (meta->configs[0].stripe_shift >> 1);
1398 raid->width = be16toh(meta->configs[0].total_disks);
1399 break;
1400
1401 case ADP_T_RAID1:
1402 raid->magic_0 = meta->configs[0].magic_0;
1403 raid->type = AR_T_RAID1;
1404 raid->width = be16toh(meta->configs[0].total_disks) / 2;
1405 break;
1406
1407 default:
1408 device_printf(parent, "Adaptec unknown RAID type 0x%02x\n",
1409 meta->configs[0].type);
1410 free(raidp[array], M_AR);
1411 raidp[array] = NULL;
1412 goto adaptec_out;
1413 }
1414
1415 raid->format = AR_F_ADAPTEC_RAID;
1416 raid->generation = be32toh(meta->generation);
1417 raid->total_disks = be16toh(meta->configs[0].total_disks);
1418 raid->total_sectors = be32toh(meta->configs[0].sectors);
1419 raid->heads = 255;
1420 raid->sectors = 63;
1421 raid->cylinders = raid->total_sectors / (63 * 255);
1422 raid->offset_sectors = 0;
1423 raid->rebuild_lba = 0;
1424 raid->lun = array;
1425 strncpy(raid->name, meta->configs[0].name,
1426 min(sizeof(raid->name), sizeof(meta->configs[0].name)));
1427
1428 /* clear out any old info */
1429 if (raid->generation) {
1430 for (disk = 0; disk < raid->total_disks; disk++) {
1431 raid->disks[disk].dev = NULL;
1432 raid->disks[disk].flags = 0;
1433 }
1434 }
1435 }
1436 if (be32toh(meta->generation) >= raid->generation) {
1437 struct ata_device *atadev = device_get_softc(parent);
1438 struct ata_channel *ch = device_get_softc(GRANDPARENT(dev));
1439 int disk_number = (ch->unit << !(ch->flags & ATA_NO_SLAVE)) +
1440 ATA_DEV(atadev->unit);
1441
1442 raid->disks[disk_number].dev = parent;
1443 raid->disks[disk_number].sectors =
1444 be32toh(meta->configs[disk_number + 1].sectors);
1445 raid->disks[disk_number].flags =
1446 (AR_DF_ONLINE | AR_DF_PRESENT | AR_DF_ASSIGNED);
1447 ars->raid[raid->volume] = raid;
1448 ars->disk_number[raid->volume] = disk_number;
1449 retval = 1;
1450 }
1451 break;
1452 }
1453
1454adaptec_out:
1455 free(meta, M_AR);
1456 return retval;
1457}
1458
1459/* Highpoint V2 RocketRAID Metadata */
1460static int
1461ata_raid_hptv2_read_meta(device_t dev, struct ar_softc **raidp)
1462{
1463 struct ata_raid_subdisk *ars = device_get_softc(dev);
1464 device_t parent = device_get_parent(dev);
1465 struct hptv2_raid_conf *meta;
1466 struct ar_softc *raid = NULL;
1467 int array, disk_number = 0, retval = 0;
1468
1469 if (!(meta = (struct hptv2_raid_conf *)
1470 malloc(sizeof(struct hptv2_raid_conf), M_AR, M_NOWAIT | M_ZERO)))
1471 return ENOMEM;
1472
1473 if (ata_raid_rw(parent, HPTV2_LBA(parent),
1474 meta, sizeof(struct hptv2_raid_conf), ATA_R_READ)) {
1475 if (testing || bootverbose)
1476 device_printf(parent, "HighPoint (v2) read metadata failed\n");
1477 goto hptv2_out;
1478 }
1479
1480 /* check if this is a HighPoint v2 RAID struct */
1481 if (meta->magic != HPTV2_MAGIC_OK && meta->magic != HPTV2_MAGIC_BAD) {
1482 if (testing || bootverbose)
1483 device_printf(parent, "HighPoint (v2) check1 failed\n");
1484 goto hptv2_out;
1485 }
1486
1487 /* is this disk defined, or an old leftover/spare ? */
1488 if (!meta->magic_0) {
1489 if (testing || bootverbose)
1490 device_printf(parent, "HighPoint (v2) check2 failed\n");
1491 goto hptv2_out;
1492 }
1493
1494 if (testing || bootverbose)
1495 ata_raid_hptv2_print_meta(meta);
1496
1497 /* now convert HighPoint (v2) metadata into our generic form */
1498 for (array = 0; array < MAX_ARRAYS; array++) {
1499 if (!raidp[array]) {
1500 raidp[array] =
1501 (struct ar_softc *)malloc(sizeof(struct ar_softc), M_AR,
1502 M_NOWAIT | M_ZERO);
1503 if (!raidp[array]) {
1504 device_printf(parent, "failed to allocate metadata storage\n");
1505 goto hptv2_out;
1506 }
1507 }
1508 raid = raidp[array];
1509 if (raid->format && (raid->format != AR_F_HPTV2_RAID))
1510 continue;
1511
1512 switch (meta->type) {
1513 case HPTV2_T_RAID0:
1514 if ((meta->order & (HPTV2_O_RAID0|HPTV2_O_OK)) ==
1515 (HPTV2_O_RAID0|HPTV2_O_OK))
1516 goto highpoint_raid1;
1517 if (meta->order & (HPTV2_O_RAID0 | HPTV2_O_RAID1))
1518 goto highpoint_raid01;
1519 if (raid->magic_0 && raid->magic_0 != meta->magic_0)
1520 continue;
1521 raid->magic_0 = meta->magic_0;
1522 raid->type = AR_T_RAID0;
1523 raid->interleave = 1 << meta->stripe_shift;
1524 disk_number = meta->disk_number;
1525 if (!(meta->order & HPTV2_O_OK))
1526 meta->magic = 0; /* mark bad */
1527 break;
1528
1529 case HPTV2_T_RAID1:
1530highpoint_raid1:
1531 if (raid->magic_0 && raid->magic_0 != meta->magic_0)
1532 continue;
1533 raid->magic_0 = meta->magic_0;
1534 raid->type = AR_T_RAID1;
1535 disk_number = (meta->disk_number > 0);
1536 break;
1537
1538 case HPTV2_T_RAID01_RAID0:
1539highpoint_raid01:
1540 if (meta->order & HPTV2_O_RAID0) {
1541 if ((raid->magic_0 && raid->magic_0 != meta->magic_0) ||
1542 (raid->magic_1 && raid->magic_1 != meta->magic_1))
1543 continue;
1544 raid->magic_0 = meta->magic_0;
1545 raid->magic_1 = meta->magic_1;
1546 raid->type = AR_T_RAID01;
1547 raid->interleave = 1 << meta->stripe_shift;
1548 disk_number = meta->disk_number;
1549 }
1550 else {
1551 if (raid->magic_1 && raid->magic_1 != meta->magic_1)
1552 continue;
1553 raid->magic_1 = meta->magic_1;
1554 raid->type = AR_T_RAID01;
1555 raid->interleave = 1 << meta->stripe_shift;
1556 disk_number = meta->disk_number + meta->array_width;
1557 if (!(meta->order & HPTV2_O_RAID1))
1558 meta->magic = 0; /* mark bad */
1559 }
1560 break;
1561
1562 case HPTV2_T_SPAN:
1563 if (raid->magic_0 && raid->magic_0 != meta->magic_0)
1564 continue;
1565 raid->magic_0 = meta->magic_0;
1566 raid->type = AR_T_SPAN;
1567 disk_number = meta->disk_number;
1568 break;
1569
1570 default:
1571 device_printf(parent, "Highpoint (v2) unknown RAID type 0x%02x\n",
1572 meta->type);
1573 free(raidp[array], M_AR);
1574 raidp[array] = NULL;
1575 goto hptv2_out;
1576 }
1577
1578 raid->format |= AR_F_HPTV2_RAID;
1579 raid->disks[disk_number].dev = parent;
1580 raid->disks[disk_number].flags = (AR_DF_PRESENT | AR_DF_ASSIGNED);
1581 raid->lun = array;
1582 strncpy(raid->name, meta->name_1,
1583 min(sizeof(raid->name), sizeof(meta->name_1)));
1584 if (meta->magic == HPTV2_MAGIC_OK) {
1585 raid->disks[disk_number].flags |= AR_DF_ONLINE;
1586 raid->width = meta->array_width;
1587 raid->total_sectors = meta->total_sectors;
1588 raid->heads = 255;
1589 raid->sectors = 63;
1590 raid->cylinders = raid->total_sectors / (63 * 255);
1591 raid->offset_sectors = HPTV2_LBA(parent) + 1;
1592 raid->rebuild_lba = meta->rebuild_lba;
1593 raid->disks[disk_number].sectors =
1594 raid->total_sectors / raid->width;
1595 }
1596 else
1597 raid->disks[disk_number].flags &= ~AR_DF_ONLINE;
1598
1599 if ((raid->type & AR_T_RAID0) && (raid->total_disks < raid->width))
1600 raid->total_disks = raid->width;
1601 if (disk_number >= raid->total_disks)
1602 raid->total_disks = disk_number + 1;
1603 ars->raid[raid->volume] = raid;
1604 ars->disk_number[raid->volume] = disk_number;
1605 retval = 1;
1606 break;
1607 }
1608
1609hptv2_out:
1610 free(meta, M_AR);
1611 return retval;
1612}
1613
1614static int
1615ata_raid_hptv2_write_meta(struct ar_softc *rdp)
1616{
1617 struct hptv2_raid_conf *meta;
1618 struct timeval timestamp;
1619 int disk, error = 0;
1620
1621 if (!(meta = (struct hptv2_raid_conf *)
1622 malloc(sizeof(struct hptv2_raid_conf), M_AR, M_NOWAIT | M_ZERO))) {
1623 printf("ar%d: failed to allocate metadata storage\n", rdp->lun);
1624 return ENOMEM;
1625 }
1626
1627 microtime(&timestamp);
1628 rdp->magic_0 = timestamp.tv_sec + 2;
1629 rdp->magic_1 = timestamp.tv_sec;
1630
1631 for (disk = 0; disk < rdp->total_disks; disk++) {
1632 if ((rdp->disks[disk].flags & (AR_DF_PRESENT | AR_DF_ONLINE)) ==
1633 (AR_DF_PRESENT | AR_DF_ONLINE))
1634 meta->magic = HPTV2_MAGIC_OK;
1635 if (rdp->disks[disk].flags & AR_DF_ASSIGNED) {
1636 meta->magic_0 = rdp->magic_0;
1637 if (strlen(rdp->name))
1638 strncpy(meta->name_1, rdp->name, sizeof(meta->name_1));
1639 else
1640 strcpy(meta->name_1, "FreeBSD");
1641 }
1642 meta->disk_number = disk;
1643
1644 switch (rdp->type) {
1645 case AR_T_RAID0:
1646 meta->type = HPTV2_T_RAID0;
1647 strcpy(meta->name_2, "RAID 0");
1648 if (rdp->disks[disk].flags & AR_DF_ONLINE)
1649 meta->order = HPTV2_O_OK;
1650 break;
1651
1652 case AR_T_RAID1:
1653 meta->type = HPTV2_T_RAID0;
1654 strcpy(meta->name_2, "RAID 1");
1655 meta->disk_number = (disk < rdp->width) ? disk : disk + 5;
1656 meta->order = HPTV2_O_RAID0 | HPTV2_O_OK;
1657 break;
1658
1659 case AR_T_RAID01:
1660 meta->type = HPTV2_T_RAID01_RAID0;
1661 strcpy(meta->name_2, "RAID 0+1");
1662 if (rdp->disks[disk].flags & AR_DF_ONLINE) {
1663 if (disk < rdp->width) {
1664 meta->order = (HPTV2_O_RAID0 | HPTV2_O_RAID1);
1665 meta->magic_0 = rdp->magic_0 - 1;
1666 }
1667 else {
1668 meta->order = HPTV2_O_RAID1;
1669 meta->disk_number -= rdp->width;
1670 }
1671 }
1672 else
1673 meta->magic_0 = rdp->magic_0 - 1;
1674 meta->magic_1 = rdp->magic_1;
1675 break;
1676
1677 case AR_T_SPAN:
1678 meta->type = HPTV2_T_SPAN;
1679 strcpy(meta->name_2, "SPAN");
1680 break;
1681 default:
1682 free(meta, M_AR);
1683 return ENODEV;
1684 }
1685
1686 meta->array_width = rdp->width;
1687 meta->stripe_shift = (rdp->width > 1) ? (ffs(rdp->interleave)-1) : 0;
1688 meta->total_sectors = rdp->total_sectors;
1689 meta->rebuild_lba = rdp->rebuild_lba;
1690 if (testing || bootverbose)
1691 ata_raid_hptv2_print_meta(meta);
1692 if (rdp->disks[disk].dev) {
1693 if (ata_raid_rw(rdp->disks[disk].dev,
1694 HPTV2_LBA(rdp->disks[disk].dev), meta,
1695 sizeof(struct promise_raid_conf),
1696 ATA_R_WRITE | ATA_R_DIRECT)) {
1697 device_printf(rdp->disks[disk].dev, "write metadata failed\n");
1698 error = EIO;
1699 }
1700 }
1701 }
1702 free(meta, M_AR);
1703 return error;
1704}
1705
1706/* Highpoint V3 RocketRAID Metadata */
1707static int
1708ata_raid_hptv3_read_meta(device_t dev, struct ar_softc **raidp)
1709{
1710 struct ata_raid_subdisk *ars = device_get_softc(dev);
1711 device_t parent = device_get_parent(dev);
1712 struct hptv3_raid_conf *meta;
1713 struct ar_softc *raid = NULL;
1714 int array, disk_number, retval = 0;
1715
1716 if (!(meta = (struct hptv3_raid_conf *)
1717 malloc(sizeof(struct hptv3_raid_conf), M_AR, M_NOWAIT | M_ZERO)))
1718 return ENOMEM;
1719
1720 if (ata_raid_rw(parent, HPTV3_LBA(parent),
1721 meta, sizeof(struct hptv3_raid_conf), ATA_R_READ)) {
1722 if (testing || bootverbose)
1723 device_printf(parent, "HighPoint (v3) read metadata failed\n");
1724 goto hptv3_out;
1725 }
1726
1727 /* check if this is a HighPoint v3 RAID struct */
1728 if (meta->magic != HPTV3_MAGIC) {
1729 if (testing || bootverbose)
1730 device_printf(parent, "HighPoint (v3) check1 failed\n");
1731 goto hptv3_out;
1732 }
1733
1734 /* check if there are any config_entries */
1735 if (meta->config_entries < 1) {
1736 if (testing || bootverbose)
1737 device_printf(parent, "HighPoint (v3) check2 failed\n");
1738 goto hptv3_out;
1739 }
1740
1741 if (testing || bootverbose)
1742 ata_raid_hptv3_print_meta(meta);
1743
1744 /* now convert HighPoint (v3) metadata into our generic form */
1745 for (array = 0; array < MAX_ARRAYS; array++) {
1746 if (!raidp[array]) {
1747 raidp[array] =
1748 (struct ar_softc *)malloc(sizeof(struct ar_softc), M_AR,
1749 M_NOWAIT | M_ZERO);
1750 if (!raidp[array]) {
1751 device_printf(parent, "failed to allocate metadata storage\n");
1752 goto hptv3_out;
1753 }
1754 }
1755 raid = raidp[array];
1756 if (raid->format && (raid->format != AR_F_HPTV3_RAID))
1757 continue;
1758
1759 if ((raid->format & AR_F_HPTV3_RAID) && raid->magic_0 != meta->magic_0)
1760 continue;
1761
1762 switch (meta->configs[0].type) {
1763 case HPTV3_T_RAID0:
1764 raid->type = AR_T_RAID0;
1765 raid->width = meta->configs[0].total_disks;
1766 disk_number = meta->configs[0].disk_number;
1767 break;
1768
1769 case HPTV3_T_RAID1:
1770 raid->type = AR_T_RAID1;
1771 raid->width = meta->configs[0].total_disks / 2;
1772 disk_number = meta->configs[0].disk_number;
1773 break;
1774
1775 case HPTV3_T_RAID5:
1776 raid->type = AR_T_RAID5;
1777 raid->width = meta->configs[0].total_disks;
1778 disk_number = meta->configs[0].disk_number;
1779 break;
1780
1781 case HPTV3_T_SPAN:
1782 raid->type = AR_T_SPAN;
1783 raid->width = meta->configs[0].total_disks;
1784 disk_number = meta->configs[0].disk_number;
1785 break;
1786
1787 default:
1788 device_printf(parent, "Highpoint (v3) unknown RAID type 0x%02x\n",
1789 meta->configs[0].type);
1790 free(raidp[array], M_AR);
1791 raidp[array] = NULL;
1792 goto hptv3_out;
1793 }
1794 if (meta->config_entries == 2) {
1795 switch (meta->configs[1].type) {
1796 case HPTV3_T_RAID1:
1797 if (raid->type == AR_T_RAID0) {
1798 raid->type = AR_T_RAID01;
1799 disk_number = meta->configs[1].disk_number +
1800 (meta->configs[0].disk_number << 1);
1801 break;
1802 }
1803 default:
1804 device_printf(parent, "Highpoint (v3) unknown level 2 0x%02x\n",
1805 meta->configs[1].type);
1806 free(raidp[array], M_AR);
1807 raidp[array] = NULL;
1808 goto hptv3_out;
1809 }
1810 }
1811
1812 raid->magic_0 = meta->magic_0;
1813 raid->format = AR_F_HPTV3_RAID;
1814 raid->generation = meta->timestamp;
1815 raid->interleave = 1 << meta->configs[0].stripe_shift;
1816 raid->total_disks = meta->configs[0].total_disks +
1817 meta->configs[1].total_disks;
1818 raid->total_sectors = meta->configs[0].total_sectors +
1819 ((u_int64_t)meta->configs_high[0].total_sectors << 32);
1820 raid->heads = 255;
1821 raid->sectors = 63;
1822 raid->cylinders = raid->total_sectors / (63 * 255);
1823 raid->offset_sectors = 0;
1824 raid->rebuild_lba = meta->configs[0].rebuild_lba +
1825 ((u_int64_t)meta->configs_high[0].rebuild_lba << 32);
1826 raid->lun = array;
1827 strncpy(raid->name, meta->name,
1828 min(sizeof(raid->name), sizeof(meta->name)));
1829 raid->disks[disk_number].sectors = raid->total_sectors /
1830 (raid->type == AR_T_RAID5 ? raid->width - 1 : raid->width);
1831 raid->disks[disk_number].dev = parent;
1832 raid->disks[disk_number].flags =
1833 (AR_DF_PRESENT | AR_DF_ASSIGNED | AR_DF_ONLINE);
1834 ars->raid[raid->volume] = raid;
1835 ars->disk_number[raid->volume] = disk_number;
1836 retval = 1;
1837 break;
1838 }
1839
1840hptv3_out:
1841 free(meta, M_AR);
1842 return retval;
1843}
1844
1845/* Intel MatrixRAID Metadata */
1846static int
1847ata_raid_intel_read_meta(device_t dev, struct ar_softc **raidp)
1848{
1849 struct ata_raid_subdisk *ars = device_get_softc(dev);
1850 device_t parent = device_get_parent(dev);
1851 struct intel_raid_conf *meta;
1852 struct intel_raid_mapping *map;
1853 struct ar_softc *raid = NULL;
1854 u_int32_t checksum, *ptr;
1855 int array, count, disk, volume = 1, retval = 0;
1856 char *tmp;
1857
1858 if (!(meta = (struct intel_raid_conf *)
1859 malloc(1536, M_AR, M_NOWAIT | M_ZERO)))
1860 return ENOMEM;
1861
1862 if (ata_raid_rw(parent, INTEL_LBA(parent), meta, 1024, ATA_R_READ)) {
1863 if (testing || bootverbose)
1864 device_printf(parent, "Intel read metadata failed\n");
1865 goto intel_out;
1866 }
1867 tmp = (char *)meta;
1868 bcopy(tmp, tmp+1024, 512);
1869 bcopy(tmp+512, tmp, 1024);
1870 bzero(tmp+1024, 512);
1871
1872 /* check if this is a Intel RAID struct */
1873 if (strncmp(meta->intel_id, INTEL_MAGIC, strlen(INTEL_MAGIC))) {
1874 if (testing || bootverbose)
1875 device_printf(parent, "Intel check1 failed\n");
1876 goto intel_out;
1877 }
1878
1879 for (checksum = 0, ptr = (u_int32_t *)meta, count = 0;
1880 count < (meta->config_size / sizeof(u_int32_t)); count++) {
1881 checksum += *ptr++;
1882 }
1883 checksum -= meta->checksum;
1884 if (checksum != meta->checksum) {
1885 if (testing || bootverbose)
1886 device_printf(parent, "Intel check2 failed\n");
1887 goto intel_out;
1888 }
1889
1890 if (testing || bootverbose)
1891 ata_raid_intel_print_meta(meta);
1892
1893 map = (struct intel_raid_mapping *)&meta->disk[meta->total_disks];
1894
1895 /* now convert Intel metadata into our generic form */
1896 for (array = 0; array < MAX_ARRAYS; array++) {
1897 if (!raidp[array]) {
1898 raidp[array] =
1899 (struct ar_softc *)malloc(sizeof(struct ar_softc), M_AR,
1900 M_NOWAIT | M_ZERO);
1901 if (!raidp[array]) {
1902 device_printf(parent, "failed to allocate metadata storage\n");
1903 goto intel_out;
1904 }
1905 }
1906 raid = raidp[array];
1907 if (raid->format && (raid->format != AR_F_INTEL_RAID))
1908 continue;
1909
1910 if ((raid->format & AR_F_INTEL_RAID) &&
1911 (raid->magic_0 != meta->config_id))
1912 continue;
1913
1914 /*
1915 * update our knowledge about the array config based on generation
1916 * NOTE: there can be multiple volumes on a disk set
1917 */
1918 if (!meta->generation || meta->generation > raid->generation) {
1919 switch (map->type) {
1920 case INTEL_T_RAID0:
1921 raid->type = AR_T_RAID0;
1922 raid->width = map->total_disks;
1923 break;
1924
1925 case INTEL_T_RAID1:
1926 if (map->total_disks == 4)
1927 raid->type = AR_T_RAID01;
1928 else
1929 raid->type = AR_T_RAID1;
1930 raid->width = map->total_disks / 2;
1931 break;
1932
1933 case INTEL_T_RAID5:
1934 raid->type = AR_T_RAID5;
1935 raid->width = map->total_disks;
1936 break;
1937
1938 default:
1939 device_printf(parent, "Intel unknown RAID type 0x%02x\n",
1940 map->type);
1941 free(raidp[array], M_AR);
1942 raidp[array] = NULL;
1943 goto intel_out;
1944 }
1945
1946 switch (map->status) {
1947 case INTEL_S_READY:
1948 raid->status = AR_S_READY;
1949 break;
1950 case INTEL_S_DEGRADED:
1951 raid->status |= AR_S_DEGRADED;
1952 break;
1953 case INTEL_S_DISABLED:
1954 case INTEL_S_FAILURE:
1955 raid->status = 0;
1956 }
1957
1958 raid->magic_0 = meta->config_id;
1959 raid->format = AR_F_INTEL_RAID;
1960 raid->generation = meta->generation;
1961 raid->interleave = map->stripe_sectors;
1962 raid->total_disks = map->total_disks;
1963 raid->total_sectors = map->total_sectors;
1964 raid->heads = 255;
1965 raid->sectors = 63;
1966 raid->cylinders = raid->total_sectors / (63 * 255);
1967 raid->offset_sectors = map->offset;
1968 raid->rebuild_lba = 0;
1969 raid->lun = array;
1970 raid->volume = volume - 1;
1971 strncpy(raid->name, map->name,
1972 min(sizeof(raid->name), sizeof(map->name)));
1973
1974 /* clear out any old info */
1975 for (disk = 0; disk < raid->total_disks; disk++) {
1976 raid->disks[disk].dev = NULL;
1977 bcopy(meta->disk[map->disk_idx[disk]].serial,
1978 raid->disks[disk].serial,
1979 sizeof(raid->disks[disk].serial));
1980 raid->disks[disk].sectors =
1981 meta->disk[map->disk_idx[disk]].sectors;
1982 raid->disks[disk].flags = 0;
1983 if (meta->disk[map->disk_idx[disk]].flags & INTEL_F_ONLINE)
1984 raid->disks[disk].flags |= AR_DF_ONLINE;
1985 if (meta->disk[map->disk_idx[disk]].flags & INTEL_F_ASSIGNED)
1986 raid->disks[disk].flags |= AR_DF_ASSIGNED;
1987 if (meta->disk[map->disk_idx[disk]].flags & INTEL_F_SPARE) {
1988 raid->disks[disk].flags &= ~(AR_DF_ONLINE | AR_DF_ASSIGNED);
1989 raid->disks[disk].flags |= AR_DF_SPARE;
1990 }
1991 if (meta->disk[map->disk_idx[disk]].flags & INTEL_F_DOWN)
1992 raid->disks[disk].flags &= ~AR_DF_ONLINE;
1993 }
1994 }
1995 if (meta->generation >= raid->generation) {
1996 for (disk = 0; disk < raid->total_disks; disk++) {
1997 struct ata_device *atadev = device_get_softc(parent);
1998
1999 if (!strncmp(raid->disks[disk].serial, atadev->param.serial,
2000 sizeof(raid->disks[disk].serial))) {
2001 raid->disks[disk].dev = parent;
2002 raid->disks[disk].flags |= (AR_DF_PRESENT | AR_DF_ONLINE);
2003 ars->raid[raid->volume] = raid;
2004 ars->disk_number[raid->volume] = disk;
2005 retval = 1;
2006 }
2007 }
2008 }
2009 if (retval) {
2010 if (volume < meta->total_volumes) {
2011 map = (struct intel_raid_mapping *)
2012 &map->disk_idx[map->total_disks];
2013 volume++;
2014 retval = 0;
2015 continue;
2016 }
2017 break;
2018 }
2019 else {
2020 free(raidp[array], M_AR);
2021 raidp[array] = NULL;
2022 if (volume == 2)
2023 retval = 1;
2024 }
2025 }
2026
2027intel_out:
2028 free(meta, M_AR);
2029 return retval;
2030}
2031
2032static int
2033ata_raid_intel_write_meta(struct ar_softc *rdp)
2034{
2035 struct intel_raid_conf *meta;
2036 struct intel_raid_mapping *map;
2037 struct timeval timestamp;
2038 u_int32_t checksum, *ptr;
2039 int count, disk, error = 0;
2040 char *tmp;
2041
2042 if (!(meta = (struct intel_raid_conf *)
2043 malloc(1536, M_AR, M_NOWAIT | M_ZERO))) {
2044 printf("ar%d: failed to allocate metadata storage\n", rdp->lun);
2045 return ENOMEM;
2046 }
2047
2048 rdp->generation++;
2049 microtime(&timestamp);
2050
2051 bcopy(INTEL_MAGIC, meta->intel_id, sizeof(meta->intel_id));
2052 bcopy(INTEL_VERSION_1100, meta->version, sizeof(meta->version));
2053 meta->config_id = timestamp.tv_sec;
2054 meta->generation = rdp->generation;
2055 meta->total_disks = rdp->total_disks;
2056 meta->total_volumes = 1; /* XXX SOS */
2057 for (disk = 0; disk < rdp->total_disks; disk++) {
2058 if (rdp->disks[disk].dev) {
2059 struct ata_channel *ch =
2060 device_get_softc(device_get_parent(rdp->disks[disk].dev));
2061 struct ata_device *atadev =
2062 device_get_softc(rdp->disks[disk].dev);
2063
2064 bcopy(atadev->param.serial, meta->disk[disk].serial,
2065 sizeof(rdp->disks[disk].serial));
2066 meta->disk[disk].sectors = rdp->disks[disk].sectors;
2067 meta->disk[disk].id = (ch->unit << 16) | ATA_DEV(atadev->unit);
2068 }
2069 else
2070 meta->disk[disk].sectors = rdp->total_sectors / rdp->width;
2071 meta->disk[disk].flags = 0;
2072 if (rdp->disks[disk].flags & AR_DF_SPARE)
2073 meta->disk[disk].flags |= INTEL_F_SPARE;
2074 else {
2075 if (rdp->disks[disk].flags & AR_DF_ONLINE)
2076 meta->disk[disk].flags |= INTEL_F_ONLINE;
2077 else
2078 meta->disk[disk].flags |= INTEL_F_DOWN;
2079 if (rdp->disks[disk].flags & AR_DF_ASSIGNED)
2080 meta->disk[disk].flags |= INTEL_F_ASSIGNED;
2081 }
2082 }
2083 map = (struct intel_raid_mapping *)&meta->disk[meta->total_disks];
2084
2085 bcopy(rdp->name, map->name, sizeof(rdp->name));
2086 map->total_sectors = rdp->total_sectors;
2087 map->state = 12; /* XXX SOS */
2088 map->offset = rdp->offset_sectors;
2089 map->stripe_count = rdp->total_sectors / (rdp->interleave*rdp->total_disks);
2090 map->stripe_sectors = rdp->interleave;
2091 map->disk_sectors = rdp->total_sectors / rdp->width;
2092 map->status = INTEL_S_READY; /* XXX SOS */
2093 switch (rdp->type) {
2094 case AR_T_RAID0:
2095 map->type = INTEL_T_RAID0;
2096 break;
2097 case AR_T_RAID1:
2098 map->type = INTEL_T_RAID1;
2099 break;
2100 case AR_T_RAID01:
2101 map->type = INTEL_T_RAID1;
2102 break;
2103 case AR_T_RAID5:
2104 map->type = INTEL_T_RAID5;
2105 break;
2106 default:
2107 free(meta, M_AR);
2108 return ENODEV;
2109 }
2110 map->total_disks = rdp->total_disks;
2111 map->magic[0] = 0x02;
2112 map->magic[1] = 0xff;
2113 map->magic[2] = 0x01;
2114 for (disk = 0; disk < rdp->total_disks; disk++)
2115 map->disk_idx[disk] = disk;
2116
2117 meta->config_size = (char *)&map->disk_idx[disk] - (char *)meta;
2118 for (checksum = 0, ptr = (u_int32_t *)meta, count = 0;
2119 count < (meta->config_size / sizeof(u_int32_t)); count++) {
2120 checksum += *ptr++;
2121 }
2122 meta->checksum = checksum;
2123
2124 if (testing || bootverbose)
2125 ata_raid_intel_print_meta(meta);
2126
2127 tmp = (char *)meta;
2128 bcopy(tmp, tmp+1024, 512);
2129 bcopy(tmp+512, tmp, 1024);
2130 bzero(tmp+1024, 512);
2131
2132 for (disk = 0; disk < rdp->total_disks; disk++) {
2133 if (rdp->disks[disk].dev) {
2134 if (ata_raid_rw(rdp->disks[disk].dev,
2135 INTEL_LBA(rdp->disks[disk].dev),
2136 meta, 1024, ATA_R_WRITE | ATA_R_DIRECT)) {
2137 device_printf(rdp->disks[disk].dev, "write metadata failed\n");
2138 error = EIO;
2139 }
2140 }
2141 }
2142 free(meta, M_AR);
2143 return error;
2144}
2145
2146
2147/* Integrated Technology Express Metadata */
2148static int
2149ata_raid_ite_read_meta(device_t dev, struct ar_softc **raidp)
2150{
2151 struct ata_raid_subdisk *ars = device_get_softc(dev);
2152 device_t parent = device_get_parent(dev);
2153 struct ite_raid_conf *meta;
2154 struct ar_softc *raid = NULL;
2155 int array, disk_number, count, retval = 0;
2156 u_int16_t *ptr;
2157
2158 if (!(meta = (struct ite_raid_conf *)
2159 malloc(sizeof(struct ite_raid_conf), M_AR, M_NOWAIT | M_ZERO)))
2160 return ENOMEM;
2161
2162 if (ata_raid_rw(parent, ITE_LBA(parent),
2163 meta, sizeof(struct ite_raid_conf), ATA_R_READ)) {
2164 if (testing || bootverbose)
2165 device_printf(parent, "ITE read metadata failed\n");
2166 goto ite_out;
2167 }
2168
2169 /* check if this is a ITE RAID struct */
2170 for (ptr = (u_int16_t *)meta->ite_id, count = 0;
2171 count < sizeof(meta->ite_id)/sizeof(uint16_t); count++)
2172 ptr[count] = be16toh(ptr[count]);
2173
2174 if (strncmp(meta->ite_id, ITE_MAGIC, strlen(ITE_MAGIC))) {
2175 if (testing || bootverbose)
2176 device_printf(parent, "ITE check1 failed\n");
2177 goto ite_out;
2178 }
2179
2180 if (testing || bootverbose)
2181 ata_raid_ite_print_meta(meta);
2182
2183 /* now convert ITE metadata into our generic form */
2184 for (array = 0; array < MAX_ARRAYS; array++) {
2185 if ((raid = raidp[array])) {
2186 if (raid->format != AR_F_ITE_RAID)
2187 continue;
2188 if (raid->magic_0 != *((u_int64_t *)meta->timestamp_0))
2189 continue;
2190 }
2191
2192 /* if we dont have a disks timestamp the RAID is invalidated */
2193 if (*((u_int64_t *)meta->timestamp_1) == 0)
2194 goto ite_out;
2195
2196 if (!raid) {
2197 raidp[array] = (struct ar_softc *)malloc(sizeof(struct ar_softc),
2198 M_AR, M_NOWAIT | M_ZERO);
2199 if (!(raid = raidp[array])) {
2200 device_printf(parent, "failed to allocate metadata storage\n");
2201 goto ite_out;
2202 }
2203 }
2204
2205 switch (meta->type) {
2206 case ITE_T_RAID0:
2207 raid->type = AR_T_RAID0;
2208 raid->width = meta->array_width;
2209 raid->total_disks = meta->array_width;
2210 disk_number = meta->disk_number;
2211 break;
2212
2213 case ITE_T_RAID1:
2214 raid->type = AR_T_RAID1;
2215 raid->width = 1;
2216 raid->total_disks = 2;
2217 disk_number = meta->disk_number;
2218 break;
2219
2220 case ITE_T_RAID01:
2221 raid->type = AR_T_RAID01;
2222 raid->width = meta->array_width;
2223 raid->total_disks = 4;
2224 disk_number = ((meta->disk_number & 0x02) >> 1) |
2225 ((meta->disk_number & 0x01) << 1);
2226 break;
2227
2228 case ITE_T_SPAN:
2229 raid->type = AR_T_SPAN;
2230 raid->width = 1;
2231 raid->total_disks = meta->array_width;
2232 disk_number = meta->disk_number;
2233 break;
2234
2235 default:
2236 device_printf(parent, "ITE unknown RAID type 0x%02x\n", meta->type);
2237 free(raidp[array], M_AR);
2238 raidp[array] = NULL;
2239 goto ite_out;
2240 }
2241
2242 raid->magic_0 = *((u_int64_t *)meta->timestamp_0);
2243 raid->format = AR_F_ITE_RAID;
2244 raid->generation = 0;
2245 raid->interleave = meta->stripe_sectors;
2246 raid->total_sectors = meta->total_sectors;
2247 raid->heads = 255;
2248 raid->sectors = 63;
2249 raid->cylinders = raid->total_sectors / (63 * 255);
2250 raid->offset_sectors = 0;
2251 raid->rebuild_lba = 0;
2252 raid->lun = array;
2253
2254 raid->disks[disk_number].dev = parent;
2255 raid->disks[disk_number].sectors = raid->total_sectors / raid->width;
2256 raid->disks[disk_number].flags =
2257 (AR_DF_PRESENT | AR_DF_ASSIGNED | AR_DF_ONLINE);
2258 ars->raid[raid->volume] = raid;
2259 ars->disk_number[raid->volume] = disk_number;
2260 retval = 1;
2261 break;
2262 }
2263ite_out:
2264 free(meta, M_AR);
2265 return retval;
2266}
2267
2268/* LSILogic V2 MegaRAID Metadata */
2269static int
2270ata_raid_lsiv2_read_meta(device_t dev, struct ar_softc **raidp)
2271{
2272 struct ata_raid_subdisk *ars = device_get_softc(dev);
2273 device_t parent = device_get_parent(dev);
2274 struct lsiv2_raid_conf *meta;
2275 struct ar_softc *raid = NULL;
2276 int array, retval = 0;
2277
2278 if (!(meta = (struct lsiv2_raid_conf *)
2279 malloc(sizeof(struct lsiv2_raid_conf), M_AR, M_NOWAIT | M_ZERO)))
2280 return ENOMEM;
2281
2282 if (ata_raid_rw(parent, LSIV2_LBA(parent),
2283 meta, sizeof(struct lsiv2_raid_conf), ATA_R_READ)) {
2284 if (testing || bootverbose)
2285 device_printf(parent, "LSI (v2) read metadata failed\n");
2286 goto lsiv2_out;
2287 }
2288
2289 /* check if this is a LSI RAID struct */
2290 if (strncmp(meta->lsi_id, LSIV2_MAGIC, strlen(LSIV2_MAGIC))) {
2291 if (testing || bootverbose)
2292 device_printf(parent, "LSI (v2) check1 failed\n");
2293 goto lsiv2_out;
2294 }
2295
2296 if (testing || bootverbose)
2297 ata_raid_lsiv2_print_meta(meta);
2298
2299 /* now convert LSI (v2) config meta into our generic form */
2300 for (array = 0; array < MAX_ARRAYS; array++) {
2301 int raid_entry, conf_entry;
2302
2303 if (!raidp[array + meta->raid_number]) {
2304 raidp[array + meta->raid_number] =
2305 (struct ar_softc *)malloc(sizeof(struct ar_softc), M_AR,
2306 M_NOWAIT | M_ZERO);
2307 if (!raidp[array + meta->raid_number]) {
2308 device_printf(parent, "failed to allocate metadata storage\n");
2309 goto lsiv2_out;
2310 }
2311 }
2312 raid = raidp[array + meta->raid_number];
2313 if (raid->format && (raid->format != AR_F_LSIV2_RAID))
2314 continue;
2315
2316 if (raid->magic_0 &&
2317 ((raid->magic_0 != meta->timestamp) ||
2318 (raid->magic_1 != meta->raid_number)))
2319 continue;
2320
2321 array += meta->raid_number;
2322
2323 raid_entry = meta->raid_number;
2324 conf_entry = (meta->configs[raid_entry].raid.config_offset >> 4) +
2325 meta->disk_number - 1;
2326
2327 switch (meta->configs[raid_entry].raid.type) {
2328 case LSIV2_T_RAID0:
2329 raid->magic_0 = meta->timestamp;
2330 raid->magic_1 = meta->raid_number;
2331 raid->type = AR_T_RAID0;
2332 raid->interleave = meta->configs[raid_entry].raid.stripe_sectors;
2333 raid->width = meta->configs[raid_entry].raid.array_width;
2334 break;
2335
2336 case LSIV2_T_RAID1:
2337 raid->magic_0 = meta->timestamp;
2338 raid->magic_1 = meta->raid_number;
2339 raid->type = AR_T_RAID1;
2340 raid->width = meta->configs[raid_entry].raid.array_width;
2341 break;
2342
2343 case LSIV2_T_RAID0 | LSIV2_T_RAID1:
2344 raid->magic_0 = meta->timestamp;
2345 raid->magic_1 = meta->raid_number;
2346 raid->type = AR_T_RAID01;
2347 raid->interleave = meta->configs[raid_entry].raid.stripe_sectors;
2348 raid->width = meta->configs[raid_entry].raid.array_width;
2349 break;
2350
2351 default:
2352 device_printf(parent, "LSI v2 unknown RAID type 0x%02x\n",
2353 meta->configs[raid_entry].raid.type);
2354 free(raidp[array], M_AR);
2355 raidp[array] = NULL;
2356 goto lsiv2_out;
2357 }
2358
2359 raid->format = AR_F_LSIV2_RAID;
2360 raid->generation = 0;
2361 raid->total_disks = meta->configs[raid_entry].raid.disk_count;
2362 raid->total_sectors = meta->configs[raid_entry].raid.total_sectors;
2363 raid->heads = 255;
2364 raid->sectors = 63;
2365 raid->cylinders = raid->total_sectors / (63 * 255);
2366 raid->offset_sectors = 0;
2367 raid->rebuild_lba = 0;
2368 raid->lun = array;
2369
2370 if (meta->configs[conf_entry].disk.device != LSIV2_D_NONE) {
2371 raid->disks[meta->disk_number].dev = parent;
2372 raid->disks[meta->disk_number].sectors =
2373 meta->configs[conf_entry].disk.disk_sectors;
2374 raid->disks[meta->disk_number].flags =
2375 (AR_DF_ONLINE | AR_DF_PRESENT | AR_DF_ASSIGNED);
2376 ars->raid[raid->volume] = raid;
2377 ars->disk_number[raid->volume] = meta->disk_number;
2378 retval = 1;
2379 }
2380 else
2381 raid->disks[meta->disk_number].flags &= ~AR_DF_ONLINE;
2382
2383 break;
2384 }
2385
2386lsiv2_out:
2387 free(meta, M_AR);
2388 return retval;
2389}
2390
2391/* LSILogic V3 MegaRAID Metadata */
2392static int
2393ata_raid_lsiv3_read_meta(device_t dev, struct ar_softc **raidp)
2394{
2395 struct ata_raid_subdisk *ars = device_get_softc(dev);
2396 device_t parent = device_get_parent(dev);
2397 struct lsiv3_raid_conf *meta;
2398 struct ar_softc *raid = NULL;
2399 u_int8_t checksum, *ptr;
2400 int array, entry, count, disk_number, retval = 0;
2401
2402 if (!(meta = (struct lsiv3_raid_conf *)
2403 malloc(sizeof(struct lsiv3_raid_conf), M_AR, M_NOWAIT | M_ZERO)))
2404 return ENOMEM;
2405
2406 if (ata_raid_rw(parent, LSIV3_LBA(parent),
2407 meta, sizeof(struct lsiv3_raid_conf), ATA_R_READ)) {
2408 if (testing || bootverbose)
2409 device_printf(parent, "LSI (v3) read metadata failed\n");
2410 goto lsiv3_out;
2411 }
2412
2413 /* check if this is a LSI RAID struct */
2414 if (strncmp(meta->lsi_id, LSIV3_MAGIC, strlen(LSIV3_MAGIC))) {
2415 if (testing || bootverbose)
2416 device_printf(parent, "LSI (v3) check1 failed\n");
2417 goto lsiv3_out;
2418 }
2419
2420 /* check if the checksum is OK */
2421 for (checksum = 0, ptr = meta->lsi_id, count = 0; count < 512; count++)
2422 checksum += *ptr++;
2423 if (checksum) {
2424 if (testing || bootverbose)
2425 device_printf(parent, "LSI (v3) check2 failed\n");
2426 goto lsiv3_out;
2427 }
2428
2429 if (testing || bootverbose)
2430 ata_raid_lsiv3_print_meta(meta);
2431
2432 /* now convert LSI (v3) config meta into our generic form */
2433 for (array = 0, entry = 0; array < MAX_ARRAYS && entry < 8;) {
2434 if (!raidp[array]) {
2435 raidp[array] =
2436 (struct ar_softc *)malloc(sizeof(struct ar_softc), M_AR,
2437 M_NOWAIT | M_ZERO);
2438 if (!raidp[array]) {
2439 device_printf(parent, "failed to allocate metadata storage\n");
2440 goto lsiv3_out;
2441 }
2442 }
2443 raid = raidp[array];
2444 if (raid->format && (raid->format != AR_F_LSIV3_RAID)) {
2445 array++;
2446 continue;
2447 }
2448
2449 if ((raid->format == AR_F_LSIV3_RAID) &&
2450 (raid->magic_0 != meta->timestamp)) {
2451 array++;
2452 continue;
2453 }
2454
2455 switch (meta->raid[entry].total_disks) {
2456 case 0:
2457 entry++;
2458 continue;
2459 case 1:
2460 if (meta->raid[entry].device == meta->device) {
2461 disk_number = 0;
2462 break;
2463 }
2464 if (raid->format)
2465 array++;
2466 entry++;
2467 continue;
2468 case 2:
2469 disk_number = (meta->device & (LSIV3_D_DEVICE|LSIV3_D_CHANNEL))?1:0;
2470 break;
2471 default:
2472 device_printf(parent, "lsiv3 > 2 disk support untested!!\n");
2473 disk_number = (meta->device & LSIV3_D_DEVICE ? 1 : 0) +
2474 (meta->device & LSIV3_D_CHANNEL ? 2 : 0);
2475 break;
2476 }
2477
2478 switch (meta->raid[entry].type) {
2479 case LSIV3_T_RAID0:
2480 raid->type = AR_T_RAID0;
2481 raid->width = meta->raid[entry].total_disks;
2482 break;
2483
2484 case LSIV3_T_RAID1:
2485 raid->type = AR_T_RAID1;
2486 raid->width = meta->raid[entry].array_width;
2487 break;
2488
2489 default:
2490 device_printf(parent, "LSI v3 unknown RAID type 0x%02x\n",
2491 meta->raid[entry].type);
2492 free(raidp[array], M_AR);
2493 raidp[array] = NULL;
2494 entry++;
2495 continue;
2496 }
2497
2498 raid->magic_0 = meta->timestamp;
2499 raid->format = AR_F_LSIV3_RAID;
2500 raid->generation = 0;
2501 raid->interleave = meta->raid[entry].stripe_pages * 8;
2502 raid->total_disks = meta->raid[entry].total_disks;
2503 raid->total_sectors = raid->width * meta->raid[entry].sectors;
2504 raid->heads = 255;
2505 raid->sectors = 63;
2506 raid->cylinders = raid->total_sectors / (63 * 255);
2507 raid->offset_sectors = meta->raid[entry].offset;
2508 raid->rebuild_lba = 0;
2509 raid->lun = array;
2510
2511 raid->disks[disk_number].dev = parent;
2512 raid->disks[disk_number].sectors = raid->total_sectors / raid->width;
2513 raid->disks[disk_number].flags =
2514 (AR_DF_PRESENT | AR_DF_ASSIGNED | AR_DF_ONLINE);
2515 ars->raid[raid->volume] = raid;
2516 ars->disk_number[raid->volume] = disk_number;
2517 retval = 1;
2518 entry++;
2519 array++;
2520 }
2521
2522lsiv3_out:
2523 free(meta, M_AR);
2524 return retval;
2525}
2526
2527/* nVidia MediaShield Metadata */
2528static int
2529ata_raid_nvidia_read_meta(device_t dev, struct ar_softc **raidp)
2530{
2531 struct ata_raid_subdisk *ars = device_get_softc(dev);
2532 device_t parent = device_get_parent(dev);
2533 struct nvidia_raid_conf *meta;
2534 struct ar_softc *raid = NULL;
2535 u_int32_t checksum, *ptr;
2536 int array, count, retval = 0;
2537
2538 if (!(meta = (struct nvidia_raid_conf *)
2539 malloc(sizeof(struct nvidia_raid_conf), M_AR, M_NOWAIT | M_ZERO)))
2540 return ENOMEM;
2541
2542 if (ata_raid_rw(parent, NVIDIA_LBA(parent),
2543 meta, sizeof(struct nvidia_raid_conf), ATA_R_READ)) {
2544 if (testing || bootverbose)
2545 device_printf(parent, "nVidia read metadata failed\n");
2546 goto nvidia_out;
2547 }
2548
2549 /* check if this is a nVidia RAID struct */
2550 if (strncmp(meta->nvidia_id, NV_MAGIC, strlen(NV_MAGIC))) {
2551 if (testing || bootverbose)
2552 device_printf(parent, "nVidia check1 failed\n");
2553 goto nvidia_out;
2554 }
2555
2556 /* check if the checksum is OK */
2557 for (checksum = 0, ptr = (u_int32_t*)meta, count = 0;
2558 count < meta->config_size; count++)
2559 checksum += *ptr++;
2560 if (checksum) {
2561 if (testing || bootverbose)
2562 device_printf(parent, "nVidia check2 failed\n");
2563 goto nvidia_out;
2564 }
2565
2566 if (testing || bootverbose)
2567 ata_raid_nvidia_print_meta(meta);
2568
2569 /* now convert nVidia meta into our generic form */
2570 for (array = 0; array < MAX_ARRAYS; array++) {
2571 if (!raidp[array]) {
2572 raidp[array] =
2573 (struct ar_softc *)malloc(sizeof(struct ar_softc), M_AR,
2574 M_NOWAIT | M_ZERO);
2575 if (!raidp[array]) {
2576 device_printf(parent, "failed to allocate metadata storage\n");
2577 goto nvidia_out;
2578 }
2579 }
2580 raid = raidp[array];
2581 if (raid->format && (raid->format != AR_F_NVIDIA_RAID))
2582 continue;
2583
2584 if (raid->format == AR_F_NVIDIA_RAID &&
2585 ((raid->magic_0 != meta->magic_1) ||
2586 (raid->magic_1 != meta->magic_2))) {
2587 continue;
2588 }
2589
2590 switch (meta->type) {
2591 case NV_T_SPAN:
2592 raid->type = AR_T_SPAN;
2593 break;
2594
2595 case NV_T_RAID0:
2596 raid->type = AR_T_RAID0;
2597 break;
2598
2599 case NV_T_RAID1:
2600 raid->type = AR_T_RAID1;
2601 break;
2602
2603 case NV_T_RAID5:
2604 raid->type = AR_T_RAID5;
2605 break;
2606
2607 case NV_T_RAID01:
2608 raid->type = AR_T_RAID01;
2609 break;
2610
2611 default:
2612 device_printf(parent, "nVidia unknown RAID type 0x%02x\n",
2613 meta->type);
2614 free(raidp[array], M_AR);
2615 raidp[array] = NULL;
2616 goto nvidia_out;
2617 }
2618 raid->magic_0 = meta->magic_1;
2619 raid->magic_1 = meta->magic_2;
2620 raid->format = AR_F_NVIDIA_RAID;
2621 raid->generation = 0;
2622 raid->interleave = meta->stripe_sectors;
2623 raid->width = meta->array_width;
2624 raid->total_disks = meta->total_disks;
2625 raid->total_sectors = meta->total_sectors;
2626 raid->heads = 255;
2627 raid->sectors = 63;
2628 raid->cylinders = raid->total_sectors / (63 * 255);
2629 raid->offset_sectors = 0;
2630 raid->rebuild_lba = meta->rebuild_lba;
2631 raid->lun = array;
2632 raid->status = AR_S_READY;
2633 if (meta->status & NV_S_DEGRADED)
2634 raid->status |= AR_S_DEGRADED;
2635
2636 raid->disks[meta->disk_number].dev = parent;
2637 raid->disks[meta->disk_number].sectors =
2638 raid->total_sectors / raid->width;
2639 raid->disks[meta->disk_number].flags =
2640 (AR_DF_PRESENT | AR_DF_ASSIGNED | AR_DF_ONLINE);
2641 ars->raid[raid->volume] = raid;
2642 ars->disk_number[raid->volume] = meta->disk_number;
2643 retval = 1;
2644 break;
2645 }
2646
2647nvidia_out:
2648 free(meta, M_AR);
2649 return retval;
2650}
2651
2652/* Promise FastTrak Metadata */
2653static int
2654ata_raid_promise_read_meta(device_t dev, struct ar_softc **raidp, int native)
2655{
2656 struct ata_raid_subdisk *ars = device_get_softc(dev);
2657 device_t parent = device_get_parent(dev);
2658 struct promise_raid_conf *meta;
2659 struct ar_softc *raid;
2660 u_int32_t checksum, *ptr;
2661 int array, count, disk, disksum = 0, retval = 0;
2662
2663 if (!(meta = (struct promise_raid_conf *)
2664 malloc(sizeof(struct promise_raid_conf), M_AR, M_NOWAIT | M_ZERO)))
2665 return ENOMEM;
2666
1436/* Adaptec HostRAID Metadata */
1437static int
1438ata_raid_adaptec_read_meta(device_t dev, struct ar_softc **raidp)
1439{
1440 struct ata_raid_subdisk *ars = device_get_softc(dev);
1441 device_t parent = device_get_parent(dev);
1442 struct adaptec_raid_conf *meta;
1443 struct ar_softc *raid;
1444 int array, disk, retval = 0;
1445
1446 if (!(meta = (struct adaptec_raid_conf *)
1447 malloc(sizeof(struct adaptec_raid_conf), M_AR, M_NOWAIT | M_ZERO)))
1448 return ENOMEM;
1449
1450 if (ata_raid_rw(parent, ADP_LBA(parent),
1451 meta, sizeof(struct adaptec_raid_conf), ATA_R_READ)) {
1452 if (testing || bootverbose)
1453 device_printf(parent, "Adaptec read metadata failed\n");
1454 goto adaptec_out;
1455 }
1456
1457 /* check if this is a Adaptec RAID struct */
1458 if (meta->magic_0 != ADP_MAGIC_0 || meta->magic_3 != ADP_MAGIC_3) {
1459 if (testing || bootverbose)
1460 device_printf(parent, "Adaptec check1 failed\n");
1461 goto adaptec_out;
1462 }
1463
1464 if (testing || bootverbose)
1465 ata_raid_adaptec_print_meta(meta);
1466
1467 /* now convert Adaptec metadata into our generic form */
1468 for (array = 0; array < MAX_ARRAYS; array++) {
1469 if (!raidp[array]) {
1470 raidp[array] =
1471 (struct ar_softc *)malloc(sizeof(struct ar_softc), M_AR,
1472 M_NOWAIT | M_ZERO);
1473 if (!raidp[array]) {
1474 device_printf(parent, "failed to allocate metadata storage\n");
1475 goto adaptec_out;
1476 }
1477 }
1478 raid = raidp[array];
1479 if (raid->format && (raid->format != AR_F_ADAPTEC_RAID))
1480 continue;
1481
1482 if (raid->magic_0 && raid->magic_0 != meta->configs[0].magic_0)
1483 continue;
1484
1485 if (!meta->generation || be32toh(meta->generation) > raid->generation) {
1486 switch (meta->configs[0].type) {
1487 case ADP_T_RAID0:
1488 raid->magic_0 = meta->configs[0].magic_0;
1489 raid->type = AR_T_RAID0;
1490 raid->interleave = 1 << (meta->configs[0].stripe_shift >> 1);
1491 raid->width = be16toh(meta->configs[0].total_disks);
1492 break;
1493
1494 case ADP_T_RAID1:
1495 raid->magic_0 = meta->configs[0].magic_0;
1496 raid->type = AR_T_RAID1;
1497 raid->width = be16toh(meta->configs[0].total_disks) / 2;
1498 break;
1499
1500 default:
1501 device_printf(parent, "Adaptec unknown RAID type 0x%02x\n",
1502 meta->configs[0].type);
1503 free(raidp[array], M_AR);
1504 raidp[array] = NULL;
1505 goto adaptec_out;
1506 }
1507
1508 raid->format = AR_F_ADAPTEC_RAID;
1509 raid->generation = be32toh(meta->generation);
1510 raid->total_disks = be16toh(meta->configs[0].total_disks);
1511 raid->total_sectors = be32toh(meta->configs[0].sectors);
1512 raid->heads = 255;
1513 raid->sectors = 63;
1514 raid->cylinders = raid->total_sectors / (63 * 255);
1515 raid->offset_sectors = 0;
1516 raid->rebuild_lba = 0;
1517 raid->lun = array;
1518 strncpy(raid->name, meta->configs[0].name,
1519 min(sizeof(raid->name), sizeof(meta->configs[0].name)));
1520
1521 /* clear out any old info */
1522 if (raid->generation) {
1523 for (disk = 0; disk < raid->total_disks; disk++) {
1524 raid->disks[disk].dev = NULL;
1525 raid->disks[disk].flags = 0;
1526 }
1527 }
1528 }
1529 if (be32toh(meta->generation) >= raid->generation) {
1530 struct ata_device *atadev = device_get_softc(parent);
1531 struct ata_channel *ch = device_get_softc(GRANDPARENT(dev));
1532 int disk_number = (ch->unit << !(ch->flags & ATA_NO_SLAVE)) +
1533 ATA_DEV(atadev->unit);
1534
1535 raid->disks[disk_number].dev = parent;
1536 raid->disks[disk_number].sectors =
1537 be32toh(meta->configs[disk_number + 1].sectors);
1538 raid->disks[disk_number].flags =
1539 (AR_DF_ONLINE | AR_DF_PRESENT | AR_DF_ASSIGNED);
1540 ars->raid[raid->volume] = raid;
1541 ars->disk_number[raid->volume] = disk_number;
1542 retval = 1;
1543 }
1544 break;
1545 }
1546
1547adaptec_out:
1548 free(meta, M_AR);
1549 return retval;
1550}
1551
1552/* Highpoint V2 RocketRAID Metadata */
1553static int
1554ata_raid_hptv2_read_meta(device_t dev, struct ar_softc **raidp)
1555{
1556 struct ata_raid_subdisk *ars = device_get_softc(dev);
1557 device_t parent = device_get_parent(dev);
1558 struct hptv2_raid_conf *meta;
1559 struct ar_softc *raid = NULL;
1560 int array, disk_number = 0, retval = 0;
1561
1562 if (!(meta = (struct hptv2_raid_conf *)
1563 malloc(sizeof(struct hptv2_raid_conf), M_AR, M_NOWAIT | M_ZERO)))
1564 return ENOMEM;
1565
1566 if (ata_raid_rw(parent, HPTV2_LBA(parent),
1567 meta, sizeof(struct hptv2_raid_conf), ATA_R_READ)) {
1568 if (testing || bootverbose)
1569 device_printf(parent, "HighPoint (v2) read metadata failed\n");
1570 goto hptv2_out;
1571 }
1572
1573 /* check if this is a HighPoint v2 RAID struct */
1574 if (meta->magic != HPTV2_MAGIC_OK && meta->magic != HPTV2_MAGIC_BAD) {
1575 if (testing || bootverbose)
1576 device_printf(parent, "HighPoint (v2) check1 failed\n");
1577 goto hptv2_out;
1578 }
1579
1580 /* is this disk defined, or an old leftover/spare ? */
1581 if (!meta->magic_0) {
1582 if (testing || bootverbose)
1583 device_printf(parent, "HighPoint (v2) check2 failed\n");
1584 goto hptv2_out;
1585 }
1586
1587 if (testing || bootverbose)
1588 ata_raid_hptv2_print_meta(meta);
1589
1590 /* now convert HighPoint (v2) metadata into our generic form */
1591 for (array = 0; array < MAX_ARRAYS; array++) {
1592 if (!raidp[array]) {
1593 raidp[array] =
1594 (struct ar_softc *)malloc(sizeof(struct ar_softc), M_AR,
1595 M_NOWAIT | M_ZERO);
1596 if (!raidp[array]) {
1597 device_printf(parent, "failed to allocate metadata storage\n");
1598 goto hptv2_out;
1599 }
1600 }
1601 raid = raidp[array];
1602 if (raid->format && (raid->format != AR_F_HPTV2_RAID))
1603 continue;
1604
1605 switch (meta->type) {
1606 case HPTV2_T_RAID0:
1607 if ((meta->order & (HPTV2_O_RAID0|HPTV2_O_OK)) ==
1608 (HPTV2_O_RAID0|HPTV2_O_OK))
1609 goto highpoint_raid1;
1610 if (meta->order & (HPTV2_O_RAID0 | HPTV2_O_RAID1))
1611 goto highpoint_raid01;
1612 if (raid->magic_0 && raid->magic_0 != meta->magic_0)
1613 continue;
1614 raid->magic_0 = meta->magic_0;
1615 raid->type = AR_T_RAID0;
1616 raid->interleave = 1 << meta->stripe_shift;
1617 disk_number = meta->disk_number;
1618 if (!(meta->order & HPTV2_O_OK))
1619 meta->magic = 0; /* mark bad */
1620 break;
1621
1622 case HPTV2_T_RAID1:
1623highpoint_raid1:
1624 if (raid->magic_0 && raid->magic_0 != meta->magic_0)
1625 continue;
1626 raid->magic_0 = meta->magic_0;
1627 raid->type = AR_T_RAID1;
1628 disk_number = (meta->disk_number > 0);
1629 break;
1630
1631 case HPTV2_T_RAID01_RAID0:
1632highpoint_raid01:
1633 if (meta->order & HPTV2_O_RAID0) {
1634 if ((raid->magic_0 && raid->magic_0 != meta->magic_0) ||
1635 (raid->magic_1 && raid->magic_1 != meta->magic_1))
1636 continue;
1637 raid->magic_0 = meta->magic_0;
1638 raid->magic_1 = meta->magic_1;
1639 raid->type = AR_T_RAID01;
1640 raid->interleave = 1 << meta->stripe_shift;
1641 disk_number = meta->disk_number;
1642 }
1643 else {
1644 if (raid->magic_1 && raid->magic_1 != meta->magic_1)
1645 continue;
1646 raid->magic_1 = meta->magic_1;
1647 raid->type = AR_T_RAID01;
1648 raid->interleave = 1 << meta->stripe_shift;
1649 disk_number = meta->disk_number + meta->array_width;
1650 if (!(meta->order & HPTV2_O_RAID1))
1651 meta->magic = 0; /* mark bad */
1652 }
1653 break;
1654
1655 case HPTV2_T_SPAN:
1656 if (raid->magic_0 && raid->magic_0 != meta->magic_0)
1657 continue;
1658 raid->magic_0 = meta->magic_0;
1659 raid->type = AR_T_SPAN;
1660 disk_number = meta->disk_number;
1661 break;
1662
1663 default:
1664 device_printf(parent, "Highpoint (v2) unknown RAID type 0x%02x\n",
1665 meta->type);
1666 free(raidp[array], M_AR);
1667 raidp[array] = NULL;
1668 goto hptv2_out;
1669 }
1670
1671 raid->format |= AR_F_HPTV2_RAID;
1672 raid->disks[disk_number].dev = parent;
1673 raid->disks[disk_number].flags = (AR_DF_PRESENT | AR_DF_ASSIGNED);
1674 raid->lun = array;
1675 strncpy(raid->name, meta->name_1,
1676 min(sizeof(raid->name), sizeof(meta->name_1)));
1677 if (meta->magic == HPTV2_MAGIC_OK) {
1678 raid->disks[disk_number].flags |= AR_DF_ONLINE;
1679 raid->width = meta->array_width;
1680 raid->total_sectors = meta->total_sectors;
1681 raid->heads = 255;
1682 raid->sectors = 63;
1683 raid->cylinders = raid->total_sectors / (63 * 255);
1684 raid->offset_sectors = HPTV2_LBA(parent) + 1;
1685 raid->rebuild_lba = meta->rebuild_lba;
1686 raid->disks[disk_number].sectors =
1687 raid->total_sectors / raid->width;
1688 }
1689 else
1690 raid->disks[disk_number].flags &= ~AR_DF_ONLINE;
1691
1692 if ((raid->type & AR_T_RAID0) && (raid->total_disks < raid->width))
1693 raid->total_disks = raid->width;
1694 if (disk_number >= raid->total_disks)
1695 raid->total_disks = disk_number + 1;
1696 ars->raid[raid->volume] = raid;
1697 ars->disk_number[raid->volume] = disk_number;
1698 retval = 1;
1699 break;
1700 }
1701
1702hptv2_out:
1703 free(meta, M_AR);
1704 return retval;
1705}
1706
1707static int
1708ata_raid_hptv2_write_meta(struct ar_softc *rdp)
1709{
1710 struct hptv2_raid_conf *meta;
1711 struct timeval timestamp;
1712 int disk, error = 0;
1713
1714 if (!(meta = (struct hptv2_raid_conf *)
1715 malloc(sizeof(struct hptv2_raid_conf), M_AR, M_NOWAIT | M_ZERO))) {
1716 printf("ar%d: failed to allocate metadata storage\n", rdp->lun);
1717 return ENOMEM;
1718 }
1719
1720 microtime(&timestamp);
1721 rdp->magic_0 = timestamp.tv_sec + 2;
1722 rdp->magic_1 = timestamp.tv_sec;
1723
1724 for (disk = 0; disk < rdp->total_disks; disk++) {
1725 if ((rdp->disks[disk].flags & (AR_DF_PRESENT | AR_DF_ONLINE)) ==
1726 (AR_DF_PRESENT | AR_DF_ONLINE))
1727 meta->magic = HPTV2_MAGIC_OK;
1728 if (rdp->disks[disk].flags & AR_DF_ASSIGNED) {
1729 meta->magic_0 = rdp->magic_0;
1730 if (strlen(rdp->name))
1731 strncpy(meta->name_1, rdp->name, sizeof(meta->name_1));
1732 else
1733 strcpy(meta->name_1, "FreeBSD");
1734 }
1735 meta->disk_number = disk;
1736
1737 switch (rdp->type) {
1738 case AR_T_RAID0:
1739 meta->type = HPTV2_T_RAID0;
1740 strcpy(meta->name_2, "RAID 0");
1741 if (rdp->disks[disk].flags & AR_DF_ONLINE)
1742 meta->order = HPTV2_O_OK;
1743 break;
1744
1745 case AR_T_RAID1:
1746 meta->type = HPTV2_T_RAID0;
1747 strcpy(meta->name_2, "RAID 1");
1748 meta->disk_number = (disk < rdp->width) ? disk : disk + 5;
1749 meta->order = HPTV2_O_RAID0 | HPTV2_O_OK;
1750 break;
1751
1752 case AR_T_RAID01:
1753 meta->type = HPTV2_T_RAID01_RAID0;
1754 strcpy(meta->name_2, "RAID 0+1");
1755 if (rdp->disks[disk].flags & AR_DF_ONLINE) {
1756 if (disk < rdp->width) {
1757 meta->order = (HPTV2_O_RAID0 | HPTV2_O_RAID1);
1758 meta->magic_0 = rdp->magic_0 - 1;
1759 }
1760 else {
1761 meta->order = HPTV2_O_RAID1;
1762 meta->disk_number -= rdp->width;
1763 }
1764 }
1765 else
1766 meta->magic_0 = rdp->magic_0 - 1;
1767 meta->magic_1 = rdp->magic_1;
1768 break;
1769
1770 case AR_T_SPAN:
1771 meta->type = HPTV2_T_SPAN;
1772 strcpy(meta->name_2, "SPAN");
1773 break;
1774 default:
1775 free(meta, M_AR);
1776 return ENODEV;
1777 }
1778
1779 meta->array_width = rdp->width;
1780 meta->stripe_shift = (rdp->width > 1) ? (ffs(rdp->interleave)-1) : 0;
1781 meta->total_sectors = rdp->total_sectors;
1782 meta->rebuild_lba = rdp->rebuild_lba;
1783 if (testing || bootverbose)
1784 ata_raid_hptv2_print_meta(meta);
1785 if (rdp->disks[disk].dev) {
1786 if (ata_raid_rw(rdp->disks[disk].dev,
1787 HPTV2_LBA(rdp->disks[disk].dev), meta,
1788 sizeof(struct promise_raid_conf),
1789 ATA_R_WRITE | ATA_R_DIRECT)) {
1790 device_printf(rdp->disks[disk].dev, "write metadata failed\n");
1791 error = EIO;
1792 }
1793 }
1794 }
1795 free(meta, M_AR);
1796 return error;
1797}
1798
1799/* Highpoint V3 RocketRAID Metadata */
1800static int
1801ata_raid_hptv3_read_meta(device_t dev, struct ar_softc **raidp)
1802{
1803 struct ata_raid_subdisk *ars = device_get_softc(dev);
1804 device_t parent = device_get_parent(dev);
1805 struct hptv3_raid_conf *meta;
1806 struct ar_softc *raid = NULL;
1807 int array, disk_number, retval = 0;
1808
1809 if (!(meta = (struct hptv3_raid_conf *)
1810 malloc(sizeof(struct hptv3_raid_conf), M_AR, M_NOWAIT | M_ZERO)))
1811 return ENOMEM;
1812
1813 if (ata_raid_rw(parent, HPTV3_LBA(parent),
1814 meta, sizeof(struct hptv3_raid_conf), ATA_R_READ)) {
1815 if (testing || bootverbose)
1816 device_printf(parent, "HighPoint (v3) read metadata failed\n");
1817 goto hptv3_out;
1818 }
1819
1820 /* check if this is a HighPoint v3 RAID struct */
1821 if (meta->magic != HPTV3_MAGIC) {
1822 if (testing || bootverbose)
1823 device_printf(parent, "HighPoint (v3) check1 failed\n");
1824 goto hptv3_out;
1825 }
1826
1827 /* check if there are any config_entries */
1828 if (meta->config_entries < 1) {
1829 if (testing || bootverbose)
1830 device_printf(parent, "HighPoint (v3) check2 failed\n");
1831 goto hptv3_out;
1832 }
1833
1834 if (testing || bootverbose)
1835 ata_raid_hptv3_print_meta(meta);
1836
1837 /* now convert HighPoint (v3) metadata into our generic form */
1838 for (array = 0; array < MAX_ARRAYS; array++) {
1839 if (!raidp[array]) {
1840 raidp[array] =
1841 (struct ar_softc *)malloc(sizeof(struct ar_softc), M_AR,
1842 M_NOWAIT | M_ZERO);
1843 if (!raidp[array]) {
1844 device_printf(parent, "failed to allocate metadata storage\n");
1845 goto hptv3_out;
1846 }
1847 }
1848 raid = raidp[array];
1849 if (raid->format && (raid->format != AR_F_HPTV3_RAID))
1850 continue;
1851
1852 if ((raid->format & AR_F_HPTV3_RAID) && raid->magic_0 != meta->magic_0)
1853 continue;
1854
1855 switch (meta->configs[0].type) {
1856 case HPTV3_T_RAID0:
1857 raid->type = AR_T_RAID0;
1858 raid->width = meta->configs[0].total_disks;
1859 disk_number = meta->configs[0].disk_number;
1860 break;
1861
1862 case HPTV3_T_RAID1:
1863 raid->type = AR_T_RAID1;
1864 raid->width = meta->configs[0].total_disks / 2;
1865 disk_number = meta->configs[0].disk_number;
1866 break;
1867
1868 case HPTV3_T_RAID5:
1869 raid->type = AR_T_RAID5;
1870 raid->width = meta->configs[0].total_disks;
1871 disk_number = meta->configs[0].disk_number;
1872 break;
1873
1874 case HPTV3_T_SPAN:
1875 raid->type = AR_T_SPAN;
1876 raid->width = meta->configs[0].total_disks;
1877 disk_number = meta->configs[0].disk_number;
1878 break;
1879
1880 default:
1881 device_printf(parent, "Highpoint (v3) unknown RAID type 0x%02x\n",
1882 meta->configs[0].type);
1883 free(raidp[array], M_AR);
1884 raidp[array] = NULL;
1885 goto hptv3_out;
1886 }
1887 if (meta->config_entries == 2) {
1888 switch (meta->configs[1].type) {
1889 case HPTV3_T_RAID1:
1890 if (raid->type == AR_T_RAID0) {
1891 raid->type = AR_T_RAID01;
1892 disk_number = meta->configs[1].disk_number +
1893 (meta->configs[0].disk_number << 1);
1894 break;
1895 }
1896 default:
1897 device_printf(parent, "Highpoint (v3) unknown level 2 0x%02x\n",
1898 meta->configs[1].type);
1899 free(raidp[array], M_AR);
1900 raidp[array] = NULL;
1901 goto hptv3_out;
1902 }
1903 }
1904
1905 raid->magic_0 = meta->magic_0;
1906 raid->format = AR_F_HPTV3_RAID;
1907 raid->generation = meta->timestamp;
1908 raid->interleave = 1 << meta->configs[0].stripe_shift;
1909 raid->total_disks = meta->configs[0].total_disks +
1910 meta->configs[1].total_disks;
1911 raid->total_sectors = meta->configs[0].total_sectors +
1912 ((u_int64_t)meta->configs_high[0].total_sectors << 32);
1913 raid->heads = 255;
1914 raid->sectors = 63;
1915 raid->cylinders = raid->total_sectors / (63 * 255);
1916 raid->offset_sectors = 0;
1917 raid->rebuild_lba = meta->configs[0].rebuild_lba +
1918 ((u_int64_t)meta->configs_high[0].rebuild_lba << 32);
1919 raid->lun = array;
1920 strncpy(raid->name, meta->name,
1921 min(sizeof(raid->name), sizeof(meta->name)));
1922 raid->disks[disk_number].sectors = raid->total_sectors /
1923 (raid->type == AR_T_RAID5 ? raid->width - 1 : raid->width);
1924 raid->disks[disk_number].dev = parent;
1925 raid->disks[disk_number].flags =
1926 (AR_DF_PRESENT | AR_DF_ASSIGNED | AR_DF_ONLINE);
1927 ars->raid[raid->volume] = raid;
1928 ars->disk_number[raid->volume] = disk_number;
1929 retval = 1;
1930 break;
1931 }
1932
1933hptv3_out:
1934 free(meta, M_AR);
1935 return retval;
1936}
1937
1938/* Intel MatrixRAID Metadata */
1939static int
1940ata_raid_intel_read_meta(device_t dev, struct ar_softc **raidp)
1941{
1942 struct ata_raid_subdisk *ars = device_get_softc(dev);
1943 device_t parent = device_get_parent(dev);
1944 struct intel_raid_conf *meta;
1945 struct intel_raid_mapping *map;
1946 struct ar_softc *raid = NULL;
1947 u_int32_t checksum, *ptr;
1948 int array, count, disk, volume = 1, retval = 0;
1949 char *tmp;
1950
1951 if (!(meta = (struct intel_raid_conf *)
1952 malloc(1536, M_AR, M_NOWAIT | M_ZERO)))
1953 return ENOMEM;
1954
1955 if (ata_raid_rw(parent, INTEL_LBA(parent), meta, 1024, ATA_R_READ)) {
1956 if (testing || bootverbose)
1957 device_printf(parent, "Intel read metadata failed\n");
1958 goto intel_out;
1959 }
1960 tmp = (char *)meta;
1961 bcopy(tmp, tmp+1024, 512);
1962 bcopy(tmp+512, tmp, 1024);
1963 bzero(tmp+1024, 512);
1964
1965 /* check if this is a Intel RAID struct */
1966 if (strncmp(meta->intel_id, INTEL_MAGIC, strlen(INTEL_MAGIC))) {
1967 if (testing || bootverbose)
1968 device_printf(parent, "Intel check1 failed\n");
1969 goto intel_out;
1970 }
1971
1972 for (checksum = 0, ptr = (u_int32_t *)meta, count = 0;
1973 count < (meta->config_size / sizeof(u_int32_t)); count++) {
1974 checksum += *ptr++;
1975 }
1976 checksum -= meta->checksum;
1977 if (checksum != meta->checksum) {
1978 if (testing || bootverbose)
1979 device_printf(parent, "Intel check2 failed\n");
1980 goto intel_out;
1981 }
1982
1983 if (testing || bootverbose)
1984 ata_raid_intel_print_meta(meta);
1985
1986 map = (struct intel_raid_mapping *)&meta->disk[meta->total_disks];
1987
1988 /* now convert Intel metadata into our generic form */
1989 for (array = 0; array < MAX_ARRAYS; array++) {
1990 if (!raidp[array]) {
1991 raidp[array] =
1992 (struct ar_softc *)malloc(sizeof(struct ar_softc), M_AR,
1993 M_NOWAIT | M_ZERO);
1994 if (!raidp[array]) {
1995 device_printf(parent, "failed to allocate metadata storage\n");
1996 goto intel_out;
1997 }
1998 }
1999 raid = raidp[array];
2000 if (raid->format && (raid->format != AR_F_INTEL_RAID))
2001 continue;
2002
2003 if ((raid->format & AR_F_INTEL_RAID) &&
2004 (raid->magic_0 != meta->config_id))
2005 continue;
2006
2007 /*
2008 * update our knowledge about the array config based on generation
2009 * NOTE: there can be multiple volumes on a disk set
2010 */
2011 if (!meta->generation || meta->generation > raid->generation) {
2012 switch (map->type) {
2013 case INTEL_T_RAID0:
2014 raid->type = AR_T_RAID0;
2015 raid->width = map->total_disks;
2016 break;
2017
2018 case INTEL_T_RAID1:
2019 if (map->total_disks == 4)
2020 raid->type = AR_T_RAID01;
2021 else
2022 raid->type = AR_T_RAID1;
2023 raid->width = map->total_disks / 2;
2024 break;
2025
2026 case INTEL_T_RAID5:
2027 raid->type = AR_T_RAID5;
2028 raid->width = map->total_disks;
2029 break;
2030
2031 default:
2032 device_printf(parent, "Intel unknown RAID type 0x%02x\n",
2033 map->type);
2034 free(raidp[array], M_AR);
2035 raidp[array] = NULL;
2036 goto intel_out;
2037 }
2038
2039 switch (map->status) {
2040 case INTEL_S_READY:
2041 raid->status = AR_S_READY;
2042 break;
2043 case INTEL_S_DEGRADED:
2044 raid->status |= AR_S_DEGRADED;
2045 break;
2046 case INTEL_S_DISABLED:
2047 case INTEL_S_FAILURE:
2048 raid->status = 0;
2049 }
2050
2051 raid->magic_0 = meta->config_id;
2052 raid->format = AR_F_INTEL_RAID;
2053 raid->generation = meta->generation;
2054 raid->interleave = map->stripe_sectors;
2055 raid->total_disks = map->total_disks;
2056 raid->total_sectors = map->total_sectors;
2057 raid->heads = 255;
2058 raid->sectors = 63;
2059 raid->cylinders = raid->total_sectors / (63 * 255);
2060 raid->offset_sectors = map->offset;
2061 raid->rebuild_lba = 0;
2062 raid->lun = array;
2063 raid->volume = volume - 1;
2064 strncpy(raid->name, map->name,
2065 min(sizeof(raid->name), sizeof(map->name)));
2066
2067 /* clear out any old info */
2068 for (disk = 0; disk < raid->total_disks; disk++) {
2069 raid->disks[disk].dev = NULL;
2070 bcopy(meta->disk[map->disk_idx[disk]].serial,
2071 raid->disks[disk].serial,
2072 sizeof(raid->disks[disk].serial));
2073 raid->disks[disk].sectors =
2074 meta->disk[map->disk_idx[disk]].sectors;
2075 raid->disks[disk].flags = 0;
2076 if (meta->disk[map->disk_idx[disk]].flags & INTEL_F_ONLINE)
2077 raid->disks[disk].flags |= AR_DF_ONLINE;
2078 if (meta->disk[map->disk_idx[disk]].flags & INTEL_F_ASSIGNED)
2079 raid->disks[disk].flags |= AR_DF_ASSIGNED;
2080 if (meta->disk[map->disk_idx[disk]].flags & INTEL_F_SPARE) {
2081 raid->disks[disk].flags &= ~(AR_DF_ONLINE | AR_DF_ASSIGNED);
2082 raid->disks[disk].flags |= AR_DF_SPARE;
2083 }
2084 if (meta->disk[map->disk_idx[disk]].flags & INTEL_F_DOWN)
2085 raid->disks[disk].flags &= ~AR_DF_ONLINE;
2086 }
2087 }
2088 if (meta->generation >= raid->generation) {
2089 for (disk = 0; disk < raid->total_disks; disk++) {
2090 struct ata_device *atadev = device_get_softc(parent);
2091
2092 if (!strncmp(raid->disks[disk].serial, atadev->param.serial,
2093 sizeof(raid->disks[disk].serial))) {
2094 raid->disks[disk].dev = parent;
2095 raid->disks[disk].flags |= (AR_DF_PRESENT | AR_DF_ONLINE);
2096 ars->raid[raid->volume] = raid;
2097 ars->disk_number[raid->volume] = disk;
2098 retval = 1;
2099 }
2100 }
2101 }
2102 if (retval) {
2103 if (volume < meta->total_volumes) {
2104 map = (struct intel_raid_mapping *)
2105 &map->disk_idx[map->total_disks];
2106 volume++;
2107 retval = 0;
2108 continue;
2109 }
2110 break;
2111 }
2112 else {
2113 free(raidp[array], M_AR);
2114 raidp[array] = NULL;
2115 if (volume == 2)
2116 retval = 1;
2117 }
2118 }
2119
2120intel_out:
2121 free(meta, M_AR);
2122 return retval;
2123}
2124
2125static int
2126ata_raid_intel_write_meta(struct ar_softc *rdp)
2127{
2128 struct intel_raid_conf *meta;
2129 struct intel_raid_mapping *map;
2130 struct timeval timestamp;
2131 u_int32_t checksum, *ptr;
2132 int count, disk, error = 0;
2133 char *tmp;
2134
2135 if (!(meta = (struct intel_raid_conf *)
2136 malloc(1536, M_AR, M_NOWAIT | M_ZERO))) {
2137 printf("ar%d: failed to allocate metadata storage\n", rdp->lun);
2138 return ENOMEM;
2139 }
2140
2141 rdp->generation++;
2142 microtime(&timestamp);
2143
2144 bcopy(INTEL_MAGIC, meta->intel_id, sizeof(meta->intel_id));
2145 bcopy(INTEL_VERSION_1100, meta->version, sizeof(meta->version));
2146 meta->config_id = timestamp.tv_sec;
2147 meta->generation = rdp->generation;
2148 meta->total_disks = rdp->total_disks;
2149 meta->total_volumes = 1; /* XXX SOS */
2150 for (disk = 0; disk < rdp->total_disks; disk++) {
2151 if (rdp->disks[disk].dev) {
2152 struct ata_channel *ch =
2153 device_get_softc(device_get_parent(rdp->disks[disk].dev));
2154 struct ata_device *atadev =
2155 device_get_softc(rdp->disks[disk].dev);
2156
2157 bcopy(atadev->param.serial, meta->disk[disk].serial,
2158 sizeof(rdp->disks[disk].serial));
2159 meta->disk[disk].sectors = rdp->disks[disk].sectors;
2160 meta->disk[disk].id = (ch->unit << 16) | ATA_DEV(atadev->unit);
2161 }
2162 else
2163 meta->disk[disk].sectors = rdp->total_sectors / rdp->width;
2164 meta->disk[disk].flags = 0;
2165 if (rdp->disks[disk].flags & AR_DF_SPARE)
2166 meta->disk[disk].flags |= INTEL_F_SPARE;
2167 else {
2168 if (rdp->disks[disk].flags & AR_DF_ONLINE)
2169 meta->disk[disk].flags |= INTEL_F_ONLINE;
2170 else
2171 meta->disk[disk].flags |= INTEL_F_DOWN;
2172 if (rdp->disks[disk].flags & AR_DF_ASSIGNED)
2173 meta->disk[disk].flags |= INTEL_F_ASSIGNED;
2174 }
2175 }
2176 map = (struct intel_raid_mapping *)&meta->disk[meta->total_disks];
2177
2178 bcopy(rdp->name, map->name, sizeof(rdp->name));
2179 map->total_sectors = rdp->total_sectors;
2180 map->state = 12; /* XXX SOS */
2181 map->offset = rdp->offset_sectors;
2182 map->stripe_count = rdp->total_sectors / (rdp->interleave*rdp->total_disks);
2183 map->stripe_sectors = rdp->interleave;
2184 map->disk_sectors = rdp->total_sectors / rdp->width;
2185 map->status = INTEL_S_READY; /* XXX SOS */
2186 switch (rdp->type) {
2187 case AR_T_RAID0:
2188 map->type = INTEL_T_RAID0;
2189 break;
2190 case AR_T_RAID1:
2191 map->type = INTEL_T_RAID1;
2192 break;
2193 case AR_T_RAID01:
2194 map->type = INTEL_T_RAID1;
2195 break;
2196 case AR_T_RAID5:
2197 map->type = INTEL_T_RAID5;
2198 break;
2199 default:
2200 free(meta, M_AR);
2201 return ENODEV;
2202 }
2203 map->total_disks = rdp->total_disks;
2204 map->magic[0] = 0x02;
2205 map->magic[1] = 0xff;
2206 map->magic[2] = 0x01;
2207 for (disk = 0; disk < rdp->total_disks; disk++)
2208 map->disk_idx[disk] = disk;
2209
2210 meta->config_size = (char *)&map->disk_idx[disk] - (char *)meta;
2211 for (checksum = 0, ptr = (u_int32_t *)meta, count = 0;
2212 count < (meta->config_size / sizeof(u_int32_t)); count++) {
2213 checksum += *ptr++;
2214 }
2215 meta->checksum = checksum;
2216
2217 if (testing || bootverbose)
2218 ata_raid_intel_print_meta(meta);
2219
2220 tmp = (char *)meta;
2221 bcopy(tmp, tmp+1024, 512);
2222 bcopy(tmp+512, tmp, 1024);
2223 bzero(tmp+1024, 512);
2224
2225 for (disk = 0; disk < rdp->total_disks; disk++) {
2226 if (rdp->disks[disk].dev) {
2227 if (ata_raid_rw(rdp->disks[disk].dev,
2228 INTEL_LBA(rdp->disks[disk].dev),
2229 meta, 1024, ATA_R_WRITE | ATA_R_DIRECT)) {
2230 device_printf(rdp->disks[disk].dev, "write metadata failed\n");
2231 error = EIO;
2232 }
2233 }
2234 }
2235 free(meta, M_AR);
2236 return error;
2237}
2238
2239
2240/* Integrated Technology Express Metadata */
2241static int
2242ata_raid_ite_read_meta(device_t dev, struct ar_softc **raidp)
2243{
2244 struct ata_raid_subdisk *ars = device_get_softc(dev);
2245 device_t parent = device_get_parent(dev);
2246 struct ite_raid_conf *meta;
2247 struct ar_softc *raid = NULL;
2248 int array, disk_number, count, retval = 0;
2249 u_int16_t *ptr;
2250
2251 if (!(meta = (struct ite_raid_conf *)
2252 malloc(sizeof(struct ite_raid_conf), M_AR, M_NOWAIT | M_ZERO)))
2253 return ENOMEM;
2254
2255 if (ata_raid_rw(parent, ITE_LBA(parent),
2256 meta, sizeof(struct ite_raid_conf), ATA_R_READ)) {
2257 if (testing || bootverbose)
2258 device_printf(parent, "ITE read metadata failed\n");
2259 goto ite_out;
2260 }
2261
2262 /* check if this is a ITE RAID struct */
2263 for (ptr = (u_int16_t *)meta->ite_id, count = 0;
2264 count < sizeof(meta->ite_id)/sizeof(uint16_t); count++)
2265 ptr[count] = be16toh(ptr[count]);
2266
2267 if (strncmp(meta->ite_id, ITE_MAGIC, strlen(ITE_MAGIC))) {
2268 if (testing || bootverbose)
2269 device_printf(parent, "ITE check1 failed\n");
2270 goto ite_out;
2271 }
2272
2273 if (testing || bootverbose)
2274 ata_raid_ite_print_meta(meta);
2275
2276 /* now convert ITE metadata into our generic form */
2277 for (array = 0; array < MAX_ARRAYS; array++) {
2278 if ((raid = raidp[array])) {
2279 if (raid->format != AR_F_ITE_RAID)
2280 continue;
2281 if (raid->magic_0 != *((u_int64_t *)meta->timestamp_0))
2282 continue;
2283 }
2284
2285 /* if we dont have a disks timestamp the RAID is invalidated */
2286 if (*((u_int64_t *)meta->timestamp_1) == 0)
2287 goto ite_out;
2288
2289 if (!raid) {
2290 raidp[array] = (struct ar_softc *)malloc(sizeof(struct ar_softc),
2291 M_AR, M_NOWAIT | M_ZERO);
2292 if (!(raid = raidp[array])) {
2293 device_printf(parent, "failed to allocate metadata storage\n");
2294 goto ite_out;
2295 }
2296 }
2297
2298 switch (meta->type) {
2299 case ITE_T_RAID0:
2300 raid->type = AR_T_RAID0;
2301 raid->width = meta->array_width;
2302 raid->total_disks = meta->array_width;
2303 disk_number = meta->disk_number;
2304 break;
2305
2306 case ITE_T_RAID1:
2307 raid->type = AR_T_RAID1;
2308 raid->width = 1;
2309 raid->total_disks = 2;
2310 disk_number = meta->disk_number;
2311 break;
2312
2313 case ITE_T_RAID01:
2314 raid->type = AR_T_RAID01;
2315 raid->width = meta->array_width;
2316 raid->total_disks = 4;
2317 disk_number = ((meta->disk_number & 0x02) >> 1) |
2318 ((meta->disk_number & 0x01) << 1);
2319 break;
2320
2321 case ITE_T_SPAN:
2322 raid->type = AR_T_SPAN;
2323 raid->width = 1;
2324 raid->total_disks = meta->array_width;
2325 disk_number = meta->disk_number;
2326 break;
2327
2328 default:
2329 device_printf(parent, "ITE unknown RAID type 0x%02x\n", meta->type);
2330 free(raidp[array], M_AR);
2331 raidp[array] = NULL;
2332 goto ite_out;
2333 }
2334
2335 raid->magic_0 = *((u_int64_t *)meta->timestamp_0);
2336 raid->format = AR_F_ITE_RAID;
2337 raid->generation = 0;
2338 raid->interleave = meta->stripe_sectors;
2339 raid->total_sectors = meta->total_sectors;
2340 raid->heads = 255;
2341 raid->sectors = 63;
2342 raid->cylinders = raid->total_sectors / (63 * 255);
2343 raid->offset_sectors = 0;
2344 raid->rebuild_lba = 0;
2345 raid->lun = array;
2346
2347 raid->disks[disk_number].dev = parent;
2348 raid->disks[disk_number].sectors = raid->total_sectors / raid->width;
2349 raid->disks[disk_number].flags =
2350 (AR_DF_PRESENT | AR_DF_ASSIGNED | AR_DF_ONLINE);
2351 ars->raid[raid->volume] = raid;
2352 ars->disk_number[raid->volume] = disk_number;
2353 retval = 1;
2354 break;
2355 }
2356ite_out:
2357 free(meta, M_AR);
2358 return retval;
2359}
2360
2361/* LSILogic V2 MegaRAID Metadata */
2362static int
2363ata_raid_lsiv2_read_meta(device_t dev, struct ar_softc **raidp)
2364{
2365 struct ata_raid_subdisk *ars = device_get_softc(dev);
2366 device_t parent = device_get_parent(dev);
2367 struct lsiv2_raid_conf *meta;
2368 struct ar_softc *raid = NULL;
2369 int array, retval = 0;
2370
2371 if (!(meta = (struct lsiv2_raid_conf *)
2372 malloc(sizeof(struct lsiv2_raid_conf), M_AR, M_NOWAIT | M_ZERO)))
2373 return ENOMEM;
2374
2375 if (ata_raid_rw(parent, LSIV2_LBA(parent),
2376 meta, sizeof(struct lsiv2_raid_conf), ATA_R_READ)) {
2377 if (testing || bootverbose)
2378 device_printf(parent, "LSI (v2) read metadata failed\n");
2379 goto lsiv2_out;
2380 }
2381
2382 /* check if this is a LSI RAID struct */
2383 if (strncmp(meta->lsi_id, LSIV2_MAGIC, strlen(LSIV2_MAGIC))) {
2384 if (testing || bootverbose)
2385 device_printf(parent, "LSI (v2) check1 failed\n");
2386 goto lsiv2_out;
2387 }
2388
2389 if (testing || bootverbose)
2390 ata_raid_lsiv2_print_meta(meta);
2391
2392 /* now convert LSI (v2) config meta into our generic form */
2393 for (array = 0; array < MAX_ARRAYS; array++) {
2394 int raid_entry, conf_entry;
2395
2396 if (!raidp[array + meta->raid_number]) {
2397 raidp[array + meta->raid_number] =
2398 (struct ar_softc *)malloc(sizeof(struct ar_softc), M_AR,
2399 M_NOWAIT | M_ZERO);
2400 if (!raidp[array + meta->raid_number]) {
2401 device_printf(parent, "failed to allocate metadata storage\n");
2402 goto lsiv2_out;
2403 }
2404 }
2405 raid = raidp[array + meta->raid_number];
2406 if (raid->format && (raid->format != AR_F_LSIV2_RAID))
2407 continue;
2408
2409 if (raid->magic_0 &&
2410 ((raid->magic_0 != meta->timestamp) ||
2411 (raid->magic_1 != meta->raid_number)))
2412 continue;
2413
2414 array += meta->raid_number;
2415
2416 raid_entry = meta->raid_number;
2417 conf_entry = (meta->configs[raid_entry].raid.config_offset >> 4) +
2418 meta->disk_number - 1;
2419
2420 switch (meta->configs[raid_entry].raid.type) {
2421 case LSIV2_T_RAID0:
2422 raid->magic_0 = meta->timestamp;
2423 raid->magic_1 = meta->raid_number;
2424 raid->type = AR_T_RAID0;
2425 raid->interleave = meta->configs[raid_entry].raid.stripe_sectors;
2426 raid->width = meta->configs[raid_entry].raid.array_width;
2427 break;
2428
2429 case LSIV2_T_RAID1:
2430 raid->magic_0 = meta->timestamp;
2431 raid->magic_1 = meta->raid_number;
2432 raid->type = AR_T_RAID1;
2433 raid->width = meta->configs[raid_entry].raid.array_width;
2434 break;
2435
2436 case LSIV2_T_RAID0 | LSIV2_T_RAID1:
2437 raid->magic_0 = meta->timestamp;
2438 raid->magic_1 = meta->raid_number;
2439 raid->type = AR_T_RAID01;
2440 raid->interleave = meta->configs[raid_entry].raid.stripe_sectors;
2441 raid->width = meta->configs[raid_entry].raid.array_width;
2442 break;
2443
2444 default:
2445 device_printf(parent, "LSI v2 unknown RAID type 0x%02x\n",
2446 meta->configs[raid_entry].raid.type);
2447 free(raidp[array], M_AR);
2448 raidp[array] = NULL;
2449 goto lsiv2_out;
2450 }
2451
2452 raid->format = AR_F_LSIV2_RAID;
2453 raid->generation = 0;
2454 raid->total_disks = meta->configs[raid_entry].raid.disk_count;
2455 raid->total_sectors = meta->configs[raid_entry].raid.total_sectors;
2456 raid->heads = 255;
2457 raid->sectors = 63;
2458 raid->cylinders = raid->total_sectors / (63 * 255);
2459 raid->offset_sectors = 0;
2460 raid->rebuild_lba = 0;
2461 raid->lun = array;
2462
2463 if (meta->configs[conf_entry].disk.device != LSIV2_D_NONE) {
2464 raid->disks[meta->disk_number].dev = parent;
2465 raid->disks[meta->disk_number].sectors =
2466 meta->configs[conf_entry].disk.disk_sectors;
2467 raid->disks[meta->disk_number].flags =
2468 (AR_DF_ONLINE | AR_DF_PRESENT | AR_DF_ASSIGNED);
2469 ars->raid[raid->volume] = raid;
2470 ars->disk_number[raid->volume] = meta->disk_number;
2471 retval = 1;
2472 }
2473 else
2474 raid->disks[meta->disk_number].flags &= ~AR_DF_ONLINE;
2475
2476 break;
2477 }
2478
2479lsiv2_out:
2480 free(meta, M_AR);
2481 return retval;
2482}
2483
2484/* LSILogic V3 MegaRAID Metadata */
2485static int
2486ata_raid_lsiv3_read_meta(device_t dev, struct ar_softc **raidp)
2487{
2488 struct ata_raid_subdisk *ars = device_get_softc(dev);
2489 device_t parent = device_get_parent(dev);
2490 struct lsiv3_raid_conf *meta;
2491 struct ar_softc *raid = NULL;
2492 u_int8_t checksum, *ptr;
2493 int array, entry, count, disk_number, retval = 0;
2494
2495 if (!(meta = (struct lsiv3_raid_conf *)
2496 malloc(sizeof(struct lsiv3_raid_conf), M_AR, M_NOWAIT | M_ZERO)))
2497 return ENOMEM;
2498
2499 if (ata_raid_rw(parent, LSIV3_LBA(parent),
2500 meta, sizeof(struct lsiv3_raid_conf), ATA_R_READ)) {
2501 if (testing || bootverbose)
2502 device_printf(parent, "LSI (v3) read metadata failed\n");
2503 goto lsiv3_out;
2504 }
2505
2506 /* check if this is a LSI RAID struct */
2507 if (strncmp(meta->lsi_id, LSIV3_MAGIC, strlen(LSIV3_MAGIC))) {
2508 if (testing || bootverbose)
2509 device_printf(parent, "LSI (v3) check1 failed\n");
2510 goto lsiv3_out;
2511 }
2512
2513 /* check if the checksum is OK */
2514 for (checksum = 0, ptr = meta->lsi_id, count = 0; count < 512; count++)
2515 checksum += *ptr++;
2516 if (checksum) {
2517 if (testing || bootverbose)
2518 device_printf(parent, "LSI (v3) check2 failed\n");
2519 goto lsiv3_out;
2520 }
2521
2522 if (testing || bootverbose)
2523 ata_raid_lsiv3_print_meta(meta);
2524
2525 /* now convert LSI (v3) config meta into our generic form */
2526 for (array = 0, entry = 0; array < MAX_ARRAYS && entry < 8;) {
2527 if (!raidp[array]) {
2528 raidp[array] =
2529 (struct ar_softc *)malloc(sizeof(struct ar_softc), M_AR,
2530 M_NOWAIT | M_ZERO);
2531 if (!raidp[array]) {
2532 device_printf(parent, "failed to allocate metadata storage\n");
2533 goto lsiv3_out;
2534 }
2535 }
2536 raid = raidp[array];
2537 if (raid->format && (raid->format != AR_F_LSIV3_RAID)) {
2538 array++;
2539 continue;
2540 }
2541
2542 if ((raid->format == AR_F_LSIV3_RAID) &&
2543 (raid->magic_0 != meta->timestamp)) {
2544 array++;
2545 continue;
2546 }
2547
2548 switch (meta->raid[entry].total_disks) {
2549 case 0:
2550 entry++;
2551 continue;
2552 case 1:
2553 if (meta->raid[entry].device == meta->device) {
2554 disk_number = 0;
2555 break;
2556 }
2557 if (raid->format)
2558 array++;
2559 entry++;
2560 continue;
2561 case 2:
2562 disk_number = (meta->device & (LSIV3_D_DEVICE|LSIV3_D_CHANNEL))?1:0;
2563 break;
2564 default:
2565 device_printf(parent, "lsiv3 > 2 disk support untested!!\n");
2566 disk_number = (meta->device & LSIV3_D_DEVICE ? 1 : 0) +
2567 (meta->device & LSIV3_D_CHANNEL ? 2 : 0);
2568 break;
2569 }
2570
2571 switch (meta->raid[entry].type) {
2572 case LSIV3_T_RAID0:
2573 raid->type = AR_T_RAID0;
2574 raid->width = meta->raid[entry].total_disks;
2575 break;
2576
2577 case LSIV3_T_RAID1:
2578 raid->type = AR_T_RAID1;
2579 raid->width = meta->raid[entry].array_width;
2580 break;
2581
2582 default:
2583 device_printf(parent, "LSI v3 unknown RAID type 0x%02x\n",
2584 meta->raid[entry].type);
2585 free(raidp[array], M_AR);
2586 raidp[array] = NULL;
2587 entry++;
2588 continue;
2589 }
2590
2591 raid->magic_0 = meta->timestamp;
2592 raid->format = AR_F_LSIV3_RAID;
2593 raid->generation = 0;
2594 raid->interleave = meta->raid[entry].stripe_pages * 8;
2595 raid->total_disks = meta->raid[entry].total_disks;
2596 raid->total_sectors = raid->width * meta->raid[entry].sectors;
2597 raid->heads = 255;
2598 raid->sectors = 63;
2599 raid->cylinders = raid->total_sectors / (63 * 255);
2600 raid->offset_sectors = meta->raid[entry].offset;
2601 raid->rebuild_lba = 0;
2602 raid->lun = array;
2603
2604 raid->disks[disk_number].dev = parent;
2605 raid->disks[disk_number].sectors = raid->total_sectors / raid->width;
2606 raid->disks[disk_number].flags =
2607 (AR_DF_PRESENT | AR_DF_ASSIGNED | AR_DF_ONLINE);
2608 ars->raid[raid->volume] = raid;
2609 ars->disk_number[raid->volume] = disk_number;
2610 retval = 1;
2611 entry++;
2612 array++;
2613 }
2614
2615lsiv3_out:
2616 free(meta, M_AR);
2617 return retval;
2618}
2619
2620/* nVidia MediaShield Metadata */
2621static int
2622ata_raid_nvidia_read_meta(device_t dev, struct ar_softc **raidp)
2623{
2624 struct ata_raid_subdisk *ars = device_get_softc(dev);
2625 device_t parent = device_get_parent(dev);
2626 struct nvidia_raid_conf *meta;
2627 struct ar_softc *raid = NULL;
2628 u_int32_t checksum, *ptr;
2629 int array, count, retval = 0;
2630
2631 if (!(meta = (struct nvidia_raid_conf *)
2632 malloc(sizeof(struct nvidia_raid_conf), M_AR, M_NOWAIT | M_ZERO)))
2633 return ENOMEM;
2634
2635 if (ata_raid_rw(parent, NVIDIA_LBA(parent),
2636 meta, sizeof(struct nvidia_raid_conf), ATA_R_READ)) {
2637 if (testing || bootverbose)
2638 device_printf(parent, "nVidia read metadata failed\n");
2639 goto nvidia_out;
2640 }
2641
2642 /* check if this is a nVidia RAID struct */
2643 if (strncmp(meta->nvidia_id, NV_MAGIC, strlen(NV_MAGIC))) {
2644 if (testing || bootverbose)
2645 device_printf(parent, "nVidia check1 failed\n");
2646 goto nvidia_out;
2647 }
2648
2649 /* check if the checksum is OK */
2650 for (checksum = 0, ptr = (u_int32_t*)meta, count = 0;
2651 count < meta->config_size; count++)
2652 checksum += *ptr++;
2653 if (checksum) {
2654 if (testing || bootverbose)
2655 device_printf(parent, "nVidia check2 failed\n");
2656 goto nvidia_out;
2657 }
2658
2659 if (testing || bootverbose)
2660 ata_raid_nvidia_print_meta(meta);
2661
2662 /* now convert nVidia meta into our generic form */
2663 for (array = 0; array < MAX_ARRAYS; array++) {
2664 if (!raidp[array]) {
2665 raidp[array] =
2666 (struct ar_softc *)malloc(sizeof(struct ar_softc), M_AR,
2667 M_NOWAIT | M_ZERO);
2668 if (!raidp[array]) {
2669 device_printf(parent, "failed to allocate metadata storage\n");
2670 goto nvidia_out;
2671 }
2672 }
2673 raid = raidp[array];
2674 if (raid->format && (raid->format != AR_F_NVIDIA_RAID))
2675 continue;
2676
2677 if (raid->format == AR_F_NVIDIA_RAID &&
2678 ((raid->magic_0 != meta->magic_1) ||
2679 (raid->magic_1 != meta->magic_2))) {
2680 continue;
2681 }
2682
2683 switch (meta->type) {
2684 case NV_T_SPAN:
2685 raid->type = AR_T_SPAN;
2686 break;
2687
2688 case NV_T_RAID0:
2689 raid->type = AR_T_RAID0;
2690 break;
2691
2692 case NV_T_RAID1:
2693 raid->type = AR_T_RAID1;
2694 break;
2695
2696 case NV_T_RAID5:
2697 raid->type = AR_T_RAID5;
2698 break;
2699
2700 case NV_T_RAID01:
2701 raid->type = AR_T_RAID01;
2702 break;
2703
2704 default:
2705 device_printf(parent, "nVidia unknown RAID type 0x%02x\n",
2706 meta->type);
2707 free(raidp[array], M_AR);
2708 raidp[array] = NULL;
2709 goto nvidia_out;
2710 }
2711 raid->magic_0 = meta->magic_1;
2712 raid->magic_1 = meta->magic_2;
2713 raid->format = AR_F_NVIDIA_RAID;
2714 raid->generation = 0;
2715 raid->interleave = meta->stripe_sectors;
2716 raid->width = meta->array_width;
2717 raid->total_disks = meta->total_disks;
2718 raid->total_sectors = meta->total_sectors;
2719 raid->heads = 255;
2720 raid->sectors = 63;
2721 raid->cylinders = raid->total_sectors / (63 * 255);
2722 raid->offset_sectors = 0;
2723 raid->rebuild_lba = meta->rebuild_lba;
2724 raid->lun = array;
2725 raid->status = AR_S_READY;
2726 if (meta->status & NV_S_DEGRADED)
2727 raid->status |= AR_S_DEGRADED;
2728
2729 raid->disks[meta->disk_number].dev = parent;
2730 raid->disks[meta->disk_number].sectors =
2731 raid->total_sectors / raid->width;
2732 raid->disks[meta->disk_number].flags =
2733 (AR_DF_PRESENT | AR_DF_ASSIGNED | AR_DF_ONLINE);
2734 ars->raid[raid->volume] = raid;
2735 ars->disk_number[raid->volume] = meta->disk_number;
2736 retval = 1;
2737 break;
2738 }
2739
2740nvidia_out:
2741 free(meta, M_AR);
2742 return retval;
2743}
2744
2745/* Promise FastTrak Metadata */
2746static int
2747ata_raid_promise_read_meta(device_t dev, struct ar_softc **raidp, int native)
2748{
2749 struct ata_raid_subdisk *ars = device_get_softc(dev);
2750 device_t parent = device_get_parent(dev);
2751 struct promise_raid_conf *meta;
2752 struct ar_softc *raid;
2753 u_int32_t checksum, *ptr;
2754 int array, count, disk, disksum = 0, retval = 0;
2755
2756 if (!(meta = (struct promise_raid_conf *)
2757 malloc(sizeof(struct promise_raid_conf), M_AR, M_NOWAIT | M_ZERO)))
2758 return ENOMEM;
2759
2667 if (ata_raid_rw(parent, PR_LBA(parent),
2760 if (ata_raid_rw(parent, PROMISE_LBA(parent),
2668 meta, sizeof(struct promise_raid_conf), ATA_R_READ)) {
2669 if (testing || bootverbose)
2670 device_printf(parent, "%s read metadata failed\n",
2671 native ? "FreeBSD" : "Promise");
2672 goto promise_out;
2673 }
2674
2675 /* check the signature */
2676 if (native) {
2677 if (strncmp(meta->promise_id, ATA_MAGIC, strlen(ATA_MAGIC))) {
2678 if (testing || bootverbose)
2679 device_printf(parent, "FreeBSD check1 failed\n");
2680 goto promise_out;
2681 }
2682 }
2683 else {
2684 if (strncmp(meta->promise_id, PR_MAGIC, strlen(PR_MAGIC))) {
2685 if (testing || bootverbose)
2686 device_printf(parent, "Promise check1 failed\n");
2687 goto promise_out;
2688 }
2689 }
2690
2691 /* check if the checksum is OK */
2692 for (checksum = 0, ptr = (u_int32_t *)meta, count = 0; count < 511; count++)
2693 checksum += *ptr++;
2694 if (checksum != *ptr) {
2695 if (testing || bootverbose)
2696 device_printf(parent, "%s check2 failed\n",
2697 native ? "FreeBSD" : "Promise");
2698 goto promise_out;
2699 }
2700
2701 /* check on disk integrity status */
2702 if (meta->raid.integrity != PR_I_VALID) {
2703 if (testing || bootverbose)
2704 device_printf(parent, "%s check3 failed\n",
2705 native ? "FreeBSD" : "Promise");
2706 goto promise_out;
2707 }
2708
2709 if (testing || bootverbose)
2710 ata_raid_promise_print_meta(meta);
2711
2712 /* now convert Promise metadata into our generic form */
2713 for (array = 0; array < MAX_ARRAYS; array++) {
2714 if (!raidp[array]) {
2715 raidp[array] =
2716 (struct ar_softc *)malloc(sizeof(struct ar_softc), M_AR,
2717 M_NOWAIT | M_ZERO);
2718 if (!raidp[array]) {
2719 device_printf(parent, "failed to allocate metadata storage\n");
2720 goto promise_out;
2721 }
2722 }
2723 raid = raidp[array];
2724 if (raid->format &&
2725 (raid->format != (native ? AR_F_FREEBSD_RAID : AR_F_PROMISE_RAID)))
2726 continue;
2727
2728 if ((raid->format == (native ? AR_F_FREEBSD_RAID : AR_F_PROMISE_RAID))&&
2729 !(meta->raid.magic_1 == (raid->magic_1)))
2730 continue;
2731
2732 /* update our knowledge about the array config based on generation */
2733 if (!meta->raid.generation || meta->raid.generation > raid->generation){
2734 switch (meta->raid.type) {
2735 case PR_T_SPAN:
2736 raid->type = AR_T_SPAN;
2737 break;
2738
2739 case PR_T_JBOD:
2740 raid->type = AR_T_JBOD;
2741 break;
2742
2743 case PR_T_RAID0:
2744 raid->type = AR_T_RAID0;
2745 break;
2746
2747 case PR_T_RAID1:
2748 raid->type = AR_T_RAID1;
2749 if (meta->raid.array_width > 1)
2750 raid->type = AR_T_RAID01;
2751 break;
2752
2753 case PR_T_RAID5:
2754 raid->type = AR_T_RAID5;
2755 break;
2756
2757 default:
2758 device_printf(parent, "%s unknown RAID type 0x%02x\n",
2759 native ? "FreeBSD" : "Promise", meta->raid.type);
2760 free(raidp[array], M_AR);
2761 raidp[array] = NULL;
2762 goto promise_out;
2763 }
2764 raid->magic_1 = meta->raid.magic_1;
2765 raid->format = (native ? AR_F_FREEBSD_RAID : AR_F_PROMISE_RAID);
2766 raid->generation = meta->raid.generation;
2767 raid->interleave = 1 << meta->raid.stripe_shift;
2768 raid->width = meta->raid.array_width;
2769 raid->total_disks = meta->raid.total_disks;
2770 raid->heads = meta->raid.heads + 1;
2771 raid->sectors = meta->raid.sectors;
2772 raid->cylinders = meta->raid.cylinders + 1;
2773 raid->total_sectors = meta->raid.total_sectors;
2774 raid->offset_sectors = 0;
2775 raid->rebuild_lba = meta->raid.rebuild_lba;
2776 raid->lun = array;
2777 if ((meta->raid.status &
2778 (PR_S_VALID | PR_S_ONLINE | PR_S_INITED | PR_S_READY)) ==
2779 (PR_S_VALID | PR_S_ONLINE | PR_S_INITED | PR_S_READY)) {
2780 raid->status |= AR_S_READY;
2781 if (meta->raid.status & PR_S_DEGRADED)
2782 raid->status |= AR_S_DEGRADED;
2783 }
2784 else
2785 raid->status &= ~AR_S_READY;
2786
2787 /* convert disk flags to our internal types */
2788 for (disk = 0; disk < meta->raid.total_disks; disk++) {
2789 raid->disks[disk].dev = NULL;
2790 raid->disks[disk].flags = 0;
2791 *((u_int64_t *)(raid->disks[disk].serial)) =
2792 meta->raid.disk[disk].magic_0;
2793 disksum += meta->raid.disk[disk].flags;
2794 if (meta->raid.disk[disk].flags & PR_F_ONLINE)
2795 raid->disks[disk].flags |= AR_DF_ONLINE;
2796 if (meta->raid.disk[disk].flags & PR_F_ASSIGNED)
2797 raid->disks[disk].flags |= AR_DF_ASSIGNED;
2798 if (meta->raid.disk[disk].flags & PR_F_SPARE) {
2799 raid->disks[disk].flags &= ~(AR_DF_ONLINE | AR_DF_ASSIGNED);
2800 raid->disks[disk].flags |= AR_DF_SPARE;
2801 }
2802 if (meta->raid.disk[disk].flags & (PR_F_REDIR | PR_F_DOWN))
2803 raid->disks[disk].flags &= ~AR_DF_ONLINE;
2804 }
2805 if (!disksum) {
2806 device_printf(parent, "%s subdisks has no flags\n",
2807 native ? "FreeBSD" : "Promise");
2808 free(raidp[array], M_AR);
2809 raidp[array] = NULL;
2810 goto promise_out;
2811 }
2812 }
2813 if (meta->raid.generation >= raid->generation) {
2814 int disk_number = meta->raid.disk_number;
2815
2816 if (raid->disks[disk_number].flags && (meta->magic_0 ==
2817 *((u_int64_t *)(raid->disks[disk_number].serial)))) {
2818 raid->disks[disk_number].dev = parent;
2819 raid->disks[disk_number].flags |= AR_DF_PRESENT;
2820 raid->disks[disk_number].sectors = meta->raid.disk_sectors;
2821 if ((raid->disks[disk_number].flags &
2822 (AR_DF_PRESENT | AR_DF_ASSIGNED | AR_DF_ONLINE)) ==
2823 (AR_DF_PRESENT | AR_DF_ASSIGNED | AR_DF_ONLINE)) {
2824 ars->raid[raid->volume] = raid;
2825 ars->disk_number[raid->volume] = disk_number;
2826 retval = 1;
2827 }
2828 }
2829 }
2830 break;
2831 }
2832
2833promise_out:
2834 free(meta, M_AR);
2835 return retval;
2836}
2837
2838static int
2839ata_raid_promise_write_meta(struct ar_softc *rdp)
2840{
2841 struct promise_raid_conf *meta;
2842 struct timeval timestamp;
2843 u_int32_t *ckptr;
2844 int count, disk, drive, error = 0;
2845
2846 if (!(meta = (struct promise_raid_conf *)
2847 malloc(sizeof(struct promise_raid_conf), M_AR, M_NOWAIT))) {
2848 printf("ar%d: failed to allocate metadata storage\n", rdp->lun);
2849 return ENOMEM;
2850 }
2851
2852 rdp->generation++;
2853 microtime(&timestamp);
2854
2855 for (disk = 0; disk < rdp->total_disks; disk++) {
2856 for (count = 0; count < sizeof(struct promise_raid_conf); count++)
2857 *(((u_int8_t *)meta) + count) = 255 - (count % 256);
2858 meta->dummy_0 = 0x00020000;
2859 meta->raid.disk_number = disk;
2860
2861 if (rdp->disks[disk].dev) {
2862 struct ata_device *atadev = device_get_softc(rdp->disks[disk].dev);
2863 struct ata_channel *ch =
2864 device_get_softc(device_get_parent(rdp->disks[disk].dev));
2865
2866 meta->raid.channel = ch->unit;
2867 meta->raid.device = ATA_DEV(atadev->unit);
2868 meta->raid.disk_sectors = rdp->disks[disk].sectors;
2869 meta->raid.disk_offset = rdp->offset_sectors;
2870 }
2871 else {
2872 meta->raid.channel = 0;
2873 meta->raid.device = 0;
2874 meta->raid.disk_sectors = 0;
2875 meta->raid.disk_offset = 0;
2876 }
2877 meta->magic_0 = PR_MAGIC0(meta->raid) | timestamp.tv_sec;
2878 meta->magic_1 = timestamp.tv_sec >> 16;
2879 meta->magic_2 = timestamp.tv_sec;
2880 meta->raid.integrity = PR_I_VALID;
2881 meta->raid.magic_0 = meta->magic_0;
2882 meta->raid.rebuild_lba = rdp->rebuild_lba;
2883 meta->raid.generation = rdp->generation;
2884
2885 if (rdp->status & AR_S_READY) {
2886 meta->raid.flags = (PR_F_VALID | PR_F_ASSIGNED | PR_F_ONLINE);
2887 meta->raid.status =
2888 (PR_S_VALID | PR_S_ONLINE | PR_S_INITED | PR_S_READY);
2889 if (rdp->status & AR_S_DEGRADED)
2890 meta->raid.status |= PR_S_DEGRADED;
2891 else
2892 meta->raid.status |= PR_S_FUNCTIONAL;
2893 }
2894 else {
2895 meta->raid.flags = PR_F_DOWN;
2896 meta->raid.status = 0;
2897 }
2898
2899 switch (rdp->type) {
2900 case AR_T_RAID0:
2901 meta->raid.type = PR_T_RAID0;
2902 break;
2903 case AR_T_RAID1:
2904 meta->raid.type = PR_T_RAID1;
2905 break;
2906 case AR_T_RAID01:
2907 meta->raid.type = PR_T_RAID1;
2908 break;
2909 case AR_T_RAID5:
2910 meta->raid.type = PR_T_RAID5;
2911 break;
2912 case AR_T_SPAN:
2913 meta->raid.type = PR_T_SPAN;
2914 break;
2915 case AR_T_JBOD:
2916 meta->raid.type = PR_T_JBOD;
2917 break;
2918 default:
2919 free(meta, M_AR);
2920 return ENODEV;
2921 }
2922
2923 meta->raid.total_disks = rdp->total_disks;
2924 meta->raid.stripe_shift = ffs(rdp->interleave) - 1;
2925 meta->raid.array_width = rdp->width;
2926 meta->raid.array_number = rdp->lun;
2927 meta->raid.total_sectors = rdp->total_sectors;
2928 meta->raid.cylinders = rdp->cylinders - 1;
2929 meta->raid.heads = rdp->heads - 1;
2930 meta->raid.sectors = rdp->sectors;
2931 meta->raid.magic_1 = (u_int64_t)meta->magic_2<<16 | meta->magic_1;
2932
2933 bzero(&meta->raid.disk, 8 * 12);
2934 for (drive = 0; drive < rdp->total_disks; drive++) {
2935 meta->raid.disk[drive].flags = 0;
2936 if (rdp->disks[drive].flags & AR_DF_PRESENT)
2937 meta->raid.disk[drive].flags |= PR_F_VALID;
2938 if (rdp->disks[drive].flags & AR_DF_ASSIGNED)
2939 meta->raid.disk[drive].flags |= PR_F_ASSIGNED;
2940 if (rdp->disks[drive].flags & AR_DF_ONLINE)
2941 meta->raid.disk[drive].flags |= PR_F_ONLINE;
2942 else
2943 if (rdp->disks[drive].flags & AR_DF_PRESENT)
2944 meta->raid.disk[drive].flags = (PR_F_REDIR | PR_F_DOWN);
2945 if (rdp->disks[drive].flags & AR_DF_SPARE)
2946 meta->raid.disk[drive].flags |= PR_F_SPARE;
2947 meta->raid.disk[drive].dummy_0 = 0x0;
2948 if (rdp->disks[drive].dev) {
2949 struct ata_channel *ch =
2950 device_get_softc(device_get_parent(rdp->disks[drive].dev));
2951 struct ata_device *atadev =
2952 device_get_softc(rdp->disks[drive].dev);
2953
2954 meta->raid.disk[drive].channel = ch->unit;
2955 meta->raid.disk[drive].device = ATA_DEV(atadev->unit);
2956 }
2957 meta->raid.disk[drive].magic_0 =
2958 PR_MAGIC0(meta->raid.disk[drive]) | timestamp.tv_sec;
2959 }
2960
2961 if (rdp->disks[disk].dev) {
2962 if ((rdp->disks[disk].flags & (AR_DF_PRESENT | AR_DF_ONLINE)) ==
2963 (AR_DF_PRESENT | AR_DF_ONLINE)) {
2964 if (rdp->format == AR_F_FREEBSD_RAID)
2965 bcopy(ATA_MAGIC, meta->promise_id, sizeof(ATA_MAGIC));
2966 else
2967 bcopy(PR_MAGIC, meta->promise_id, sizeof(PR_MAGIC));
2968 }
2969 else
2970 bzero(meta->promise_id, sizeof(meta->promise_id));
2971 meta->checksum = 0;
2972 for (ckptr = (int32_t *)meta, count = 0; count < 511; count++)
2973 meta->checksum += *ckptr++;
2974 if (testing || bootverbose)
2975 ata_raid_promise_print_meta(meta);
2761 meta, sizeof(struct promise_raid_conf), ATA_R_READ)) {
2762 if (testing || bootverbose)
2763 device_printf(parent, "%s read metadata failed\n",
2764 native ? "FreeBSD" : "Promise");
2765 goto promise_out;
2766 }
2767
2768 /* check the signature */
2769 if (native) {
2770 if (strncmp(meta->promise_id, ATA_MAGIC, strlen(ATA_MAGIC))) {
2771 if (testing || bootverbose)
2772 device_printf(parent, "FreeBSD check1 failed\n");
2773 goto promise_out;
2774 }
2775 }
2776 else {
2777 if (strncmp(meta->promise_id, PR_MAGIC, strlen(PR_MAGIC))) {
2778 if (testing || bootverbose)
2779 device_printf(parent, "Promise check1 failed\n");
2780 goto promise_out;
2781 }
2782 }
2783
2784 /* check if the checksum is OK */
2785 for (checksum = 0, ptr = (u_int32_t *)meta, count = 0; count < 511; count++)
2786 checksum += *ptr++;
2787 if (checksum != *ptr) {
2788 if (testing || bootverbose)
2789 device_printf(parent, "%s check2 failed\n",
2790 native ? "FreeBSD" : "Promise");
2791 goto promise_out;
2792 }
2793
2794 /* check on disk integrity status */
2795 if (meta->raid.integrity != PR_I_VALID) {
2796 if (testing || bootverbose)
2797 device_printf(parent, "%s check3 failed\n",
2798 native ? "FreeBSD" : "Promise");
2799 goto promise_out;
2800 }
2801
2802 if (testing || bootverbose)
2803 ata_raid_promise_print_meta(meta);
2804
2805 /* now convert Promise metadata into our generic form */
2806 for (array = 0; array < MAX_ARRAYS; array++) {
2807 if (!raidp[array]) {
2808 raidp[array] =
2809 (struct ar_softc *)malloc(sizeof(struct ar_softc), M_AR,
2810 M_NOWAIT | M_ZERO);
2811 if (!raidp[array]) {
2812 device_printf(parent, "failed to allocate metadata storage\n");
2813 goto promise_out;
2814 }
2815 }
2816 raid = raidp[array];
2817 if (raid->format &&
2818 (raid->format != (native ? AR_F_FREEBSD_RAID : AR_F_PROMISE_RAID)))
2819 continue;
2820
2821 if ((raid->format == (native ? AR_F_FREEBSD_RAID : AR_F_PROMISE_RAID))&&
2822 !(meta->raid.magic_1 == (raid->magic_1)))
2823 continue;
2824
2825 /* update our knowledge about the array config based on generation */
2826 if (!meta->raid.generation || meta->raid.generation > raid->generation){
2827 switch (meta->raid.type) {
2828 case PR_T_SPAN:
2829 raid->type = AR_T_SPAN;
2830 break;
2831
2832 case PR_T_JBOD:
2833 raid->type = AR_T_JBOD;
2834 break;
2835
2836 case PR_T_RAID0:
2837 raid->type = AR_T_RAID0;
2838 break;
2839
2840 case PR_T_RAID1:
2841 raid->type = AR_T_RAID1;
2842 if (meta->raid.array_width > 1)
2843 raid->type = AR_T_RAID01;
2844 break;
2845
2846 case PR_T_RAID5:
2847 raid->type = AR_T_RAID5;
2848 break;
2849
2850 default:
2851 device_printf(parent, "%s unknown RAID type 0x%02x\n",
2852 native ? "FreeBSD" : "Promise", meta->raid.type);
2853 free(raidp[array], M_AR);
2854 raidp[array] = NULL;
2855 goto promise_out;
2856 }
2857 raid->magic_1 = meta->raid.magic_1;
2858 raid->format = (native ? AR_F_FREEBSD_RAID : AR_F_PROMISE_RAID);
2859 raid->generation = meta->raid.generation;
2860 raid->interleave = 1 << meta->raid.stripe_shift;
2861 raid->width = meta->raid.array_width;
2862 raid->total_disks = meta->raid.total_disks;
2863 raid->heads = meta->raid.heads + 1;
2864 raid->sectors = meta->raid.sectors;
2865 raid->cylinders = meta->raid.cylinders + 1;
2866 raid->total_sectors = meta->raid.total_sectors;
2867 raid->offset_sectors = 0;
2868 raid->rebuild_lba = meta->raid.rebuild_lba;
2869 raid->lun = array;
2870 if ((meta->raid.status &
2871 (PR_S_VALID | PR_S_ONLINE | PR_S_INITED | PR_S_READY)) ==
2872 (PR_S_VALID | PR_S_ONLINE | PR_S_INITED | PR_S_READY)) {
2873 raid->status |= AR_S_READY;
2874 if (meta->raid.status & PR_S_DEGRADED)
2875 raid->status |= AR_S_DEGRADED;
2876 }
2877 else
2878 raid->status &= ~AR_S_READY;
2879
2880 /* convert disk flags to our internal types */
2881 for (disk = 0; disk < meta->raid.total_disks; disk++) {
2882 raid->disks[disk].dev = NULL;
2883 raid->disks[disk].flags = 0;
2884 *((u_int64_t *)(raid->disks[disk].serial)) =
2885 meta->raid.disk[disk].magic_0;
2886 disksum += meta->raid.disk[disk].flags;
2887 if (meta->raid.disk[disk].flags & PR_F_ONLINE)
2888 raid->disks[disk].flags |= AR_DF_ONLINE;
2889 if (meta->raid.disk[disk].flags & PR_F_ASSIGNED)
2890 raid->disks[disk].flags |= AR_DF_ASSIGNED;
2891 if (meta->raid.disk[disk].flags & PR_F_SPARE) {
2892 raid->disks[disk].flags &= ~(AR_DF_ONLINE | AR_DF_ASSIGNED);
2893 raid->disks[disk].flags |= AR_DF_SPARE;
2894 }
2895 if (meta->raid.disk[disk].flags & (PR_F_REDIR | PR_F_DOWN))
2896 raid->disks[disk].flags &= ~AR_DF_ONLINE;
2897 }
2898 if (!disksum) {
2899 device_printf(parent, "%s subdisks has no flags\n",
2900 native ? "FreeBSD" : "Promise");
2901 free(raidp[array], M_AR);
2902 raidp[array] = NULL;
2903 goto promise_out;
2904 }
2905 }
2906 if (meta->raid.generation >= raid->generation) {
2907 int disk_number = meta->raid.disk_number;
2908
2909 if (raid->disks[disk_number].flags && (meta->magic_0 ==
2910 *((u_int64_t *)(raid->disks[disk_number].serial)))) {
2911 raid->disks[disk_number].dev = parent;
2912 raid->disks[disk_number].flags |= AR_DF_PRESENT;
2913 raid->disks[disk_number].sectors = meta->raid.disk_sectors;
2914 if ((raid->disks[disk_number].flags &
2915 (AR_DF_PRESENT | AR_DF_ASSIGNED | AR_DF_ONLINE)) ==
2916 (AR_DF_PRESENT | AR_DF_ASSIGNED | AR_DF_ONLINE)) {
2917 ars->raid[raid->volume] = raid;
2918 ars->disk_number[raid->volume] = disk_number;
2919 retval = 1;
2920 }
2921 }
2922 }
2923 break;
2924 }
2925
2926promise_out:
2927 free(meta, M_AR);
2928 return retval;
2929}
2930
2931static int
2932ata_raid_promise_write_meta(struct ar_softc *rdp)
2933{
2934 struct promise_raid_conf *meta;
2935 struct timeval timestamp;
2936 u_int32_t *ckptr;
2937 int count, disk, drive, error = 0;
2938
2939 if (!(meta = (struct promise_raid_conf *)
2940 malloc(sizeof(struct promise_raid_conf), M_AR, M_NOWAIT))) {
2941 printf("ar%d: failed to allocate metadata storage\n", rdp->lun);
2942 return ENOMEM;
2943 }
2944
2945 rdp->generation++;
2946 microtime(&timestamp);
2947
2948 for (disk = 0; disk < rdp->total_disks; disk++) {
2949 for (count = 0; count < sizeof(struct promise_raid_conf); count++)
2950 *(((u_int8_t *)meta) + count) = 255 - (count % 256);
2951 meta->dummy_0 = 0x00020000;
2952 meta->raid.disk_number = disk;
2953
2954 if (rdp->disks[disk].dev) {
2955 struct ata_device *atadev = device_get_softc(rdp->disks[disk].dev);
2956 struct ata_channel *ch =
2957 device_get_softc(device_get_parent(rdp->disks[disk].dev));
2958
2959 meta->raid.channel = ch->unit;
2960 meta->raid.device = ATA_DEV(atadev->unit);
2961 meta->raid.disk_sectors = rdp->disks[disk].sectors;
2962 meta->raid.disk_offset = rdp->offset_sectors;
2963 }
2964 else {
2965 meta->raid.channel = 0;
2966 meta->raid.device = 0;
2967 meta->raid.disk_sectors = 0;
2968 meta->raid.disk_offset = 0;
2969 }
2970 meta->magic_0 = PR_MAGIC0(meta->raid) | timestamp.tv_sec;
2971 meta->magic_1 = timestamp.tv_sec >> 16;
2972 meta->magic_2 = timestamp.tv_sec;
2973 meta->raid.integrity = PR_I_VALID;
2974 meta->raid.magic_0 = meta->magic_0;
2975 meta->raid.rebuild_lba = rdp->rebuild_lba;
2976 meta->raid.generation = rdp->generation;
2977
2978 if (rdp->status & AR_S_READY) {
2979 meta->raid.flags = (PR_F_VALID | PR_F_ASSIGNED | PR_F_ONLINE);
2980 meta->raid.status =
2981 (PR_S_VALID | PR_S_ONLINE | PR_S_INITED | PR_S_READY);
2982 if (rdp->status & AR_S_DEGRADED)
2983 meta->raid.status |= PR_S_DEGRADED;
2984 else
2985 meta->raid.status |= PR_S_FUNCTIONAL;
2986 }
2987 else {
2988 meta->raid.flags = PR_F_DOWN;
2989 meta->raid.status = 0;
2990 }
2991
2992 switch (rdp->type) {
2993 case AR_T_RAID0:
2994 meta->raid.type = PR_T_RAID0;
2995 break;
2996 case AR_T_RAID1:
2997 meta->raid.type = PR_T_RAID1;
2998 break;
2999 case AR_T_RAID01:
3000 meta->raid.type = PR_T_RAID1;
3001 break;
3002 case AR_T_RAID5:
3003 meta->raid.type = PR_T_RAID5;
3004 break;
3005 case AR_T_SPAN:
3006 meta->raid.type = PR_T_SPAN;
3007 break;
3008 case AR_T_JBOD:
3009 meta->raid.type = PR_T_JBOD;
3010 break;
3011 default:
3012 free(meta, M_AR);
3013 return ENODEV;
3014 }
3015
3016 meta->raid.total_disks = rdp->total_disks;
3017 meta->raid.stripe_shift = ffs(rdp->interleave) - 1;
3018 meta->raid.array_width = rdp->width;
3019 meta->raid.array_number = rdp->lun;
3020 meta->raid.total_sectors = rdp->total_sectors;
3021 meta->raid.cylinders = rdp->cylinders - 1;
3022 meta->raid.heads = rdp->heads - 1;
3023 meta->raid.sectors = rdp->sectors;
3024 meta->raid.magic_1 = (u_int64_t)meta->magic_2<<16 | meta->magic_1;
3025
3026 bzero(&meta->raid.disk, 8 * 12);
3027 for (drive = 0; drive < rdp->total_disks; drive++) {
3028 meta->raid.disk[drive].flags = 0;
3029 if (rdp->disks[drive].flags & AR_DF_PRESENT)
3030 meta->raid.disk[drive].flags |= PR_F_VALID;
3031 if (rdp->disks[drive].flags & AR_DF_ASSIGNED)
3032 meta->raid.disk[drive].flags |= PR_F_ASSIGNED;
3033 if (rdp->disks[drive].flags & AR_DF_ONLINE)
3034 meta->raid.disk[drive].flags |= PR_F_ONLINE;
3035 else
3036 if (rdp->disks[drive].flags & AR_DF_PRESENT)
3037 meta->raid.disk[drive].flags = (PR_F_REDIR | PR_F_DOWN);
3038 if (rdp->disks[drive].flags & AR_DF_SPARE)
3039 meta->raid.disk[drive].flags |= PR_F_SPARE;
3040 meta->raid.disk[drive].dummy_0 = 0x0;
3041 if (rdp->disks[drive].dev) {
3042 struct ata_channel *ch =
3043 device_get_softc(device_get_parent(rdp->disks[drive].dev));
3044 struct ata_device *atadev =
3045 device_get_softc(rdp->disks[drive].dev);
3046
3047 meta->raid.disk[drive].channel = ch->unit;
3048 meta->raid.disk[drive].device = ATA_DEV(atadev->unit);
3049 }
3050 meta->raid.disk[drive].magic_0 =
3051 PR_MAGIC0(meta->raid.disk[drive]) | timestamp.tv_sec;
3052 }
3053
3054 if (rdp->disks[disk].dev) {
3055 if ((rdp->disks[disk].flags & (AR_DF_PRESENT | AR_DF_ONLINE)) ==
3056 (AR_DF_PRESENT | AR_DF_ONLINE)) {
3057 if (rdp->format == AR_F_FREEBSD_RAID)
3058 bcopy(ATA_MAGIC, meta->promise_id, sizeof(ATA_MAGIC));
3059 else
3060 bcopy(PR_MAGIC, meta->promise_id, sizeof(PR_MAGIC));
3061 }
3062 else
3063 bzero(meta->promise_id, sizeof(meta->promise_id));
3064 meta->checksum = 0;
3065 for (ckptr = (int32_t *)meta, count = 0; count < 511; count++)
3066 meta->checksum += *ckptr++;
3067 if (testing || bootverbose)
3068 ata_raid_promise_print_meta(meta);
2976 if (ata_raid_rw(rdp->disks[disk].dev, PR_LBA(rdp->disks[disk].dev),
3069 if (ata_raid_rw(rdp->disks[disk].dev,
3070 PROMISE_LBA(rdp->disks[disk].dev),
2977 meta, sizeof(struct promise_raid_conf),
2978 ATA_R_WRITE | ATA_R_DIRECT)) {
2979 device_printf(rdp->disks[disk].dev, "write metadata failed\n");
2980 error = EIO;
2981 }
2982 }
2983 }
2984 free(meta, M_AR);
2985 return error;
2986}
2987
2988/* Silicon Image Medley Metadata */
2989static int
2990ata_raid_sii_read_meta(device_t dev, struct ar_softc **raidp)
2991{
2992 struct ata_raid_subdisk *ars = device_get_softc(dev);
2993 device_t parent = device_get_parent(dev);
2994 struct sii_raid_conf *meta;
2995 struct ar_softc *raid = NULL;
2996 u_int16_t checksum, *ptr;
2997 int array, count, disk, retval = 0;
2998
2999 if (!(meta = (struct sii_raid_conf *)
3000 malloc(sizeof(struct sii_raid_conf), M_AR, M_NOWAIT | M_ZERO)))
3001 return ENOMEM;
3002
3003 if (ata_raid_rw(parent, SII_LBA(parent),
3004 meta, sizeof(struct sii_raid_conf), ATA_R_READ)) {
3005 if (testing || bootverbose)
3006 device_printf(parent, "Silicon Image read metadata failed\n");
3007 goto sii_out;
3008 }
3009
3010 /* check if this is a Silicon Image (Medley) RAID struct */
3011 for (checksum = 0, ptr = (u_int16_t *)meta, count = 0; count < 160; count++)
3012 checksum += *ptr++;
3013 if (checksum) {
3014 if (testing || bootverbose)
3015 device_printf(parent, "Silicon Image check1 failed\n");
3016 goto sii_out;
3017 }
3018
3019 for (checksum = 0, ptr = (u_int16_t *)meta, count = 0; count < 256; count++)
3020 checksum += *ptr++;
3021 if (checksum != meta->checksum_1) {
3022 if (testing || bootverbose)
3023 device_printf(parent, "Silicon Image check2 failed\n");
3024 goto sii_out;
3025 }
3026
3027 /* check verison */
3028 if (meta->version_major != 0x0002 ||
3029 (meta->version_minor != 0x0000 && meta->version_minor != 0x0001)) {
3030 if (testing || bootverbose)
3031 device_printf(parent, "Silicon Image check3 failed\n");
3032 goto sii_out;
3033 }
3034
3035 if (testing || bootverbose)
3036 ata_raid_sii_print_meta(meta);
3037
3038 /* now convert Silicon Image meta into our generic form */
3039 for (array = 0; array < MAX_ARRAYS; array++) {
3040 if (!raidp[array]) {
3041 raidp[array] =
3042 (struct ar_softc *)malloc(sizeof(struct ar_softc), M_AR,
3043 M_NOWAIT | M_ZERO);
3044 if (!raidp[array]) {
3045 device_printf(parent, "failed to allocate metadata storage\n");
3046 goto sii_out;
3047 }
3048 }
3049 raid = raidp[array];
3050 if (raid->format && (raid->format != AR_F_SII_RAID))
3051 continue;
3052
3053 if (raid->format == AR_F_SII_RAID &&
3054 (raid->magic_0 != *((u_int64_t *)meta->timestamp))) {
3055 continue;
3056 }
3057
3058 /* update our knowledge about the array config based on generation */
3059 if (!meta->generation || meta->generation > raid->generation) {
3060 switch (meta->type) {
3061 case SII_T_RAID0:
3062 raid->type = AR_T_RAID0;
3063 break;
3064
3065 case SII_T_RAID1:
3066 raid->type = AR_T_RAID1;
3067 break;
3068
3069 case SII_T_RAID01:
3070 raid->type = AR_T_RAID01;
3071 break;
3072
3073 case SII_T_SPARE:
3074 device_printf(parent, "Silicon Image SPARE disk\n");
3075 free(raidp[array], M_AR);
3076 raidp[array] = NULL;
3077 goto sii_out;
3078
3079 default:
3080 device_printf(parent,"Silicon Image unknown RAID type 0x%02x\n",
3081 meta->type);
3082 free(raidp[array], M_AR);
3083 raidp[array] = NULL;
3084 goto sii_out;
3085 }
3086 raid->magic_0 = *((u_int64_t *)meta->timestamp);
3087 raid->format = AR_F_SII_RAID;
3088 raid->generation = meta->generation;
3089 raid->interleave = meta->stripe_sectors;
3090 raid->width = (meta->raid0_disks != 0xff) ? meta->raid0_disks : 1;
3091 raid->total_disks =
3092 ((meta->raid0_disks != 0xff) ? meta->raid0_disks : 0) +
3093 ((meta->raid1_disks != 0xff) ? meta->raid1_disks : 0);
3094 raid->total_sectors = meta->total_sectors;
3095 raid->heads = 255;
3096 raid->sectors = 63;
3097 raid->cylinders = raid->total_sectors / (63 * 255);
3098 raid->offset_sectors = 0;
3099 raid->rebuild_lba = meta->rebuild_lba;
3100 raid->lun = array;
3101 strncpy(raid->name, meta->name,
3102 min(sizeof(raid->name), sizeof(meta->name)));
3103
3104 /* clear out any old info */
3105 if (raid->generation) {
3106 for (disk = 0; disk < raid->total_disks; disk++) {
3107 raid->disks[disk].dev = NULL;
3108 raid->disks[disk].flags = 0;
3109 }
3110 }
3111 }
3112 if (meta->generation >= raid->generation) {
3113 /* XXX SOS add check for the right physical disk by serial# */
3114 if (meta->status & SII_S_READY) {
3115 int disk_number = (raid->type == AR_T_RAID01) ?
3116 meta->raid1_ident + (meta->raid0_ident << 1) :
3117 meta->disk_number;
3118
3119 raid->disks[disk_number].dev = parent;
3120 raid->disks[disk_number].sectors =
3121 raid->total_sectors / raid->width;
3122 raid->disks[disk_number].flags =
3123 (AR_DF_ONLINE | AR_DF_PRESENT | AR_DF_ASSIGNED);
3124 ars->raid[raid->volume] = raid;
3125 ars->disk_number[raid->volume] = disk_number;
3126 retval = 1;
3127 }
3128 }
3129 break;
3130 }
3131
3132sii_out:
3133 free(meta, M_AR);
3134 return retval;
3135}
3136
3137/* Silicon Integrated Systems Metadata */
3138static int
3139ata_raid_sis_read_meta(device_t dev, struct ar_softc **raidp)
3140{
3141 struct ata_raid_subdisk *ars = device_get_softc(dev);
3142 device_t parent = device_get_parent(dev);
3143 struct sis_raid_conf *meta;
3144 struct ar_softc *raid = NULL;
3145 int array, disk_number, drive, retval = 0;
3146
3147 if (!(meta = (struct sis_raid_conf *)
3148 malloc(sizeof(struct sis_raid_conf), M_AR, M_NOWAIT | M_ZERO)))
3149 return ENOMEM;
3150
3151 if (ata_raid_rw(parent, SIS_LBA(parent),
3152 meta, sizeof(struct sis_raid_conf), ATA_R_READ)) {
3153 if (testing || bootverbose)
3154 device_printf(parent,
3155 "Silicon Integrated Systems read metadata failed\n");
3156 }
3157
3158 /* check for SiS magic */
3159 if (meta->magic != SIS_MAGIC) {
3160 if (testing || bootverbose)
3161 device_printf(parent,
3162 "Silicon Integrated Systems check1 failed\n");
3163 goto sis_out;
3164 }
3165
3166 if (testing || bootverbose)
3167 ata_raid_sis_print_meta(meta);
3168
3169 /* now convert SiS meta into our generic form */
3170 for (array = 0; array < MAX_ARRAYS; array++) {
3171 if (!raidp[array]) {
3172 raidp[array] =
3173 (struct ar_softc *)malloc(sizeof(struct ar_softc), M_AR,
3174 M_NOWAIT | M_ZERO);
3175 if (!raidp[array]) {
3176 device_printf(parent, "failed to allocate metadata storage\n");
3177 goto sis_out;
3178 }
3179 }
3180
3181 raid = raidp[array];
3182 if (raid->format && (raid->format != AR_F_SIS_RAID))
3183 continue;
3184
3185 if ((raid->format == AR_F_SIS_RAID) &&
3186 ((raid->magic_0 != meta->controller_pci_id) ||
3187 (raid->magic_1 != meta->timestamp))) {
3188 continue;
3189 }
3190
3191 switch (meta->type_total_disks & SIS_T_MASK) {
3192 case SIS_T_JBOD:
3193 raid->type = AR_T_JBOD;
3194 raid->width = (meta->type_total_disks & SIS_D_MASK);
3195 raid->total_sectors += SIS_LBA(parent);
3196 break;
3197
3198 case SIS_T_RAID0:
3199 raid->type = AR_T_RAID0;
3200 raid->width = (meta->type_total_disks & SIS_D_MASK);
3201 if (!raid->total_sectors ||
3202 (raid->total_sectors > (raid->width * SIS_LBA(parent))))
3203 raid->total_sectors = raid->width * SIS_LBA(parent);
3204 break;
3205
3206 case SIS_T_RAID1:
3207 raid->type = AR_T_RAID1;
3208 raid->width = 1;
3209 if (!raid->total_sectors || (raid->total_sectors > SIS_LBA(parent)))
3210 raid->total_sectors = SIS_LBA(parent);
3211 break;
3212
3213 default:
3214 device_printf(parent, "Silicon Integrated Systems "
3215 "unknown RAID type 0x%08x\n", meta->magic);
3216 free(raidp[array], M_AR);
3217 raidp[array] = NULL;
3218 goto sis_out;
3219 }
3220 raid->magic_0 = meta->controller_pci_id;
3221 raid->magic_1 = meta->timestamp;
3222 raid->format = AR_F_SIS_RAID;
3223 raid->generation = 0;
3224 raid->interleave = meta->stripe_sectors;
3225 raid->total_disks = (meta->type_total_disks & SIS_D_MASK);
3226 raid->heads = 255;
3227 raid->sectors = 63;
3228 raid->cylinders = raid->total_sectors / (63 * 255);
3229 raid->offset_sectors = 0;
3230 raid->rebuild_lba = 0;
3231 raid->lun = array;
3232 /* XXX SOS if total_disks > 2 this doesn't float */
3233 if (((meta->disks & SIS_D_MASTER) >> 4) == meta->disk_number)
3234 disk_number = 0;
3235 else
3236 disk_number = 1;
3237
3238 for (drive = 0; drive < raid->total_disks; drive++) {
3239 raid->disks[drive].sectors = raid->total_sectors/raid->width;
3240 if (drive == disk_number) {
3241 raid->disks[disk_number].dev = parent;
3242 raid->disks[disk_number].flags =
3243 (AR_DF_ONLINE | AR_DF_PRESENT | AR_DF_ASSIGNED);
3244 ars->raid[raid->volume] = raid;
3245 ars->disk_number[raid->volume] = disk_number;
3246 }
3247 }
3248 retval = 1;
3249 break;
3250 }
3251
3252sis_out:
3253 free(meta, M_AR);
3254 return retval;
3255}
3256
3257static int
3258ata_raid_sis_write_meta(struct ar_softc *rdp)
3259{
3260 struct sis_raid_conf *meta;
3261 struct timeval timestamp;
3262 int disk, error = 0;
3263
3264 if (!(meta = (struct sis_raid_conf *)
3265 malloc(sizeof(struct sis_raid_conf), M_AR, M_NOWAIT | M_ZERO))) {
3266 printf("ar%d: failed to allocate metadata storage\n", rdp->lun);
3267 return ENOMEM;
3268 }
3269
3270 rdp->generation++;
3271 microtime(&timestamp);
3272
3273 meta->magic = SIS_MAGIC;
3274 /* XXX SOS if total_disks > 2 this doesn't float */
3275 for (disk = 0; disk < rdp->total_disks; disk++) {
3276 if (rdp->disks[disk].dev) {
3277 struct ata_channel *ch =
3278 device_get_softc(device_get_parent(rdp->disks[disk].dev));
3279 struct ata_device *atadev = device_get_softc(rdp->disks[disk].dev);
3280 int disk_number = 1 + ATA_DEV(atadev->unit) + (ch->unit << 1);
3281
3282 meta->disks |= disk_number << ((1 - disk) << 2);
3283 }
3284 }
3285 switch (rdp->type) {
3286 case AR_T_JBOD:
3287 meta->type_total_disks = SIS_T_JBOD;
3288 break;
3289
3290 case AR_T_RAID0:
3291 meta->type_total_disks = SIS_T_RAID0;
3292 break;
3293
3294 case AR_T_RAID1:
3295 meta->type_total_disks = SIS_T_RAID1;
3296 break;
3297
3298 default:
3299 free(meta, M_AR);
3300 return ENODEV;
3301 }
3302 meta->type_total_disks |= (rdp->total_disks & SIS_D_MASK);
3303 meta->stripe_sectors = rdp->interleave;
3304 meta->timestamp = timestamp.tv_sec;
3305
3306 for (disk = 0; disk < rdp->total_disks; disk++) {
3307 if (rdp->disks[disk].dev) {
3308 struct ata_channel *ch =
3309 device_get_softc(device_get_parent(rdp->disks[disk].dev));
3310 struct ata_device *atadev = device_get_softc(rdp->disks[disk].dev);
3311
3312 meta->controller_pci_id =
3313 (pci_get_vendor(GRANDPARENT(rdp->disks[disk].dev)) << 16) |
3314 pci_get_device(GRANDPARENT(rdp->disks[disk].dev));
3315 bcopy(atadev->param.model, meta->model, sizeof(meta->model));
3316
3317 /* XXX SOS if total_disks > 2 this may not float */
3318 meta->disk_number = 1 + ATA_DEV(atadev->unit) + (ch->unit << 1);
3319
3320 if (testing || bootverbose)
3321 ata_raid_sis_print_meta(meta);
3322
3323 if (ata_raid_rw(rdp->disks[disk].dev,
3324 SIS_LBA(rdp->disks[disk].dev),
3325 meta, sizeof(struct sis_raid_conf),
3326 ATA_R_WRITE | ATA_R_DIRECT)) {
3327 device_printf(rdp->disks[disk].dev, "write metadata failed\n");
3328 error = EIO;
3329 }
3330 }
3331 }
3332 free(meta, M_AR);
3333 return error;
3334}
3335
3336/* VIA Tech V-RAID Metadata */
3337static int
3338ata_raid_via_read_meta(device_t dev, struct ar_softc **raidp)
3339{
3340 struct ata_raid_subdisk *ars = device_get_softc(dev);
3341 device_t parent = device_get_parent(dev);
3342 struct via_raid_conf *meta;
3343 struct ar_softc *raid = NULL;
3344 u_int8_t checksum, *ptr;
3345 int array, count, disk, retval = 0;
3346
3347 if (!(meta = (struct via_raid_conf *)
3348 malloc(sizeof(struct via_raid_conf), M_AR, M_NOWAIT | M_ZERO)))
3349 return ENOMEM;
3350
3351 if (ata_raid_rw(parent, VIA_LBA(parent),
3352 meta, sizeof(struct via_raid_conf), ATA_R_READ)) {
3353 if (testing || bootverbose)
3354 device_printf(parent, "VIA read metadata failed\n");
3355 goto via_out;
3356 }
3357
3358 /* check if this is a VIA RAID struct */
3359 if (meta->magic != VIA_MAGIC) {
3360 if (testing || bootverbose)
3361 device_printf(parent, "VIA check1 failed\n");
3362 goto via_out;
3363 }
3364
3071 meta, sizeof(struct promise_raid_conf),
3072 ATA_R_WRITE | ATA_R_DIRECT)) {
3073 device_printf(rdp->disks[disk].dev, "write metadata failed\n");
3074 error = EIO;
3075 }
3076 }
3077 }
3078 free(meta, M_AR);
3079 return error;
3080}
3081
3082/* Silicon Image Medley Metadata */
3083static int
3084ata_raid_sii_read_meta(device_t dev, struct ar_softc **raidp)
3085{
3086 struct ata_raid_subdisk *ars = device_get_softc(dev);
3087 device_t parent = device_get_parent(dev);
3088 struct sii_raid_conf *meta;
3089 struct ar_softc *raid = NULL;
3090 u_int16_t checksum, *ptr;
3091 int array, count, disk, retval = 0;
3092
3093 if (!(meta = (struct sii_raid_conf *)
3094 malloc(sizeof(struct sii_raid_conf), M_AR, M_NOWAIT | M_ZERO)))
3095 return ENOMEM;
3096
3097 if (ata_raid_rw(parent, SII_LBA(parent),
3098 meta, sizeof(struct sii_raid_conf), ATA_R_READ)) {
3099 if (testing || bootverbose)
3100 device_printf(parent, "Silicon Image read metadata failed\n");
3101 goto sii_out;
3102 }
3103
3104 /* check if this is a Silicon Image (Medley) RAID struct */
3105 for (checksum = 0, ptr = (u_int16_t *)meta, count = 0; count < 160; count++)
3106 checksum += *ptr++;
3107 if (checksum) {
3108 if (testing || bootverbose)
3109 device_printf(parent, "Silicon Image check1 failed\n");
3110 goto sii_out;
3111 }
3112
3113 for (checksum = 0, ptr = (u_int16_t *)meta, count = 0; count < 256; count++)
3114 checksum += *ptr++;
3115 if (checksum != meta->checksum_1) {
3116 if (testing || bootverbose)
3117 device_printf(parent, "Silicon Image check2 failed\n");
3118 goto sii_out;
3119 }
3120
3121 /* check verison */
3122 if (meta->version_major != 0x0002 ||
3123 (meta->version_minor != 0x0000 && meta->version_minor != 0x0001)) {
3124 if (testing || bootverbose)
3125 device_printf(parent, "Silicon Image check3 failed\n");
3126 goto sii_out;
3127 }
3128
3129 if (testing || bootverbose)
3130 ata_raid_sii_print_meta(meta);
3131
3132 /* now convert Silicon Image meta into our generic form */
3133 for (array = 0; array < MAX_ARRAYS; array++) {
3134 if (!raidp[array]) {
3135 raidp[array] =
3136 (struct ar_softc *)malloc(sizeof(struct ar_softc), M_AR,
3137 M_NOWAIT | M_ZERO);
3138 if (!raidp[array]) {
3139 device_printf(parent, "failed to allocate metadata storage\n");
3140 goto sii_out;
3141 }
3142 }
3143 raid = raidp[array];
3144 if (raid->format && (raid->format != AR_F_SII_RAID))
3145 continue;
3146
3147 if (raid->format == AR_F_SII_RAID &&
3148 (raid->magic_0 != *((u_int64_t *)meta->timestamp))) {
3149 continue;
3150 }
3151
3152 /* update our knowledge about the array config based on generation */
3153 if (!meta->generation || meta->generation > raid->generation) {
3154 switch (meta->type) {
3155 case SII_T_RAID0:
3156 raid->type = AR_T_RAID0;
3157 break;
3158
3159 case SII_T_RAID1:
3160 raid->type = AR_T_RAID1;
3161 break;
3162
3163 case SII_T_RAID01:
3164 raid->type = AR_T_RAID01;
3165 break;
3166
3167 case SII_T_SPARE:
3168 device_printf(parent, "Silicon Image SPARE disk\n");
3169 free(raidp[array], M_AR);
3170 raidp[array] = NULL;
3171 goto sii_out;
3172
3173 default:
3174 device_printf(parent,"Silicon Image unknown RAID type 0x%02x\n",
3175 meta->type);
3176 free(raidp[array], M_AR);
3177 raidp[array] = NULL;
3178 goto sii_out;
3179 }
3180 raid->magic_0 = *((u_int64_t *)meta->timestamp);
3181 raid->format = AR_F_SII_RAID;
3182 raid->generation = meta->generation;
3183 raid->interleave = meta->stripe_sectors;
3184 raid->width = (meta->raid0_disks != 0xff) ? meta->raid0_disks : 1;
3185 raid->total_disks =
3186 ((meta->raid0_disks != 0xff) ? meta->raid0_disks : 0) +
3187 ((meta->raid1_disks != 0xff) ? meta->raid1_disks : 0);
3188 raid->total_sectors = meta->total_sectors;
3189 raid->heads = 255;
3190 raid->sectors = 63;
3191 raid->cylinders = raid->total_sectors / (63 * 255);
3192 raid->offset_sectors = 0;
3193 raid->rebuild_lba = meta->rebuild_lba;
3194 raid->lun = array;
3195 strncpy(raid->name, meta->name,
3196 min(sizeof(raid->name), sizeof(meta->name)));
3197
3198 /* clear out any old info */
3199 if (raid->generation) {
3200 for (disk = 0; disk < raid->total_disks; disk++) {
3201 raid->disks[disk].dev = NULL;
3202 raid->disks[disk].flags = 0;
3203 }
3204 }
3205 }
3206 if (meta->generation >= raid->generation) {
3207 /* XXX SOS add check for the right physical disk by serial# */
3208 if (meta->status & SII_S_READY) {
3209 int disk_number = (raid->type == AR_T_RAID01) ?
3210 meta->raid1_ident + (meta->raid0_ident << 1) :
3211 meta->disk_number;
3212
3213 raid->disks[disk_number].dev = parent;
3214 raid->disks[disk_number].sectors =
3215 raid->total_sectors / raid->width;
3216 raid->disks[disk_number].flags =
3217 (AR_DF_ONLINE | AR_DF_PRESENT | AR_DF_ASSIGNED);
3218 ars->raid[raid->volume] = raid;
3219 ars->disk_number[raid->volume] = disk_number;
3220 retval = 1;
3221 }
3222 }
3223 break;
3224 }
3225
3226sii_out:
3227 free(meta, M_AR);
3228 return retval;
3229}
3230
3231/* Silicon Integrated Systems Metadata */
3232static int
3233ata_raid_sis_read_meta(device_t dev, struct ar_softc **raidp)
3234{
3235 struct ata_raid_subdisk *ars = device_get_softc(dev);
3236 device_t parent = device_get_parent(dev);
3237 struct sis_raid_conf *meta;
3238 struct ar_softc *raid = NULL;
3239 int array, disk_number, drive, retval = 0;
3240
3241 if (!(meta = (struct sis_raid_conf *)
3242 malloc(sizeof(struct sis_raid_conf), M_AR, M_NOWAIT | M_ZERO)))
3243 return ENOMEM;
3244
3245 if (ata_raid_rw(parent, SIS_LBA(parent),
3246 meta, sizeof(struct sis_raid_conf), ATA_R_READ)) {
3247 if (testing || bootverbose)
3248 device_printf(parent,
3249 "Silicon Integrated Systems read metadata failed\n");
3250 }
3251
3252 /* check for SiS magic */
3253 if (meta->magic != SIS_MAGIC) {
3254 if (testing || bootverbose)
3255 device_printf(parent,
3256 "Silicon Integrated Systems check1 failed\n");
3257 goto sis_out;
3258 }
3259
3260 if (testing || bootverbose)
3261 ata_raid_sis_print_meta(meta);
3262
3263 /* now convert SiS meta into our generic form */
3264 for (array = 0; array < MAX_ARRAYS; array++) {
3265 if (!raidp[array]) {
3266 raidp[array] =
3267 (struct ar_softc *)malloc(sizeof(struct ar_softc), M_AR,
3268 M_NOWAIT | M_ZERO);
3269 if (!raidp[array]) {
3270 device_printf(parent, "failed to allocate metadata storage\n");
3271 goto sis_out;
3272 }
3273 }
3274
3275 raid = raidp[array];
3276 if (raid->format && (raid->format != AR_F_SIS_RAID))
3277 continue;
3278
3279 if ((raid->format == AR_F_SIS_RAID) &&
3280 ((raid->magic_0 != meta->controller_pci_id) ||
3281 (raid->magic_1 != meta->timestamp))) {
3282 continue;
3283 }
3284
3285 switch (meta->type_total_disks & SIS_T_MASK) {
3286 case SIS_T_JBOD:
3287 raid->type = AR_T_JBOD;
3288 raid->width = (meta->type_total_disks & SIS_D_MASK);
3289 raid->total_sectors += SIS_LBA(parent);
3290 break;
3291
3292 case SIS_T_RAID0:
3293 raid->type = AR_T_RAID0;
3294 raid->width = (meta->type_total_disks & SIS_D_MASK);
3295 if (!raid->total_sectors ||
3296 (raid->total_sectors > (raid->width * SIS_LBA(parent))))
3297 raid->total_sectors = raid->width * SIS_LBA(parent);
3298 break;
3299
3300 case SIS_T_RAID1:
3301 raid->type = AR_T_RAID1;
3302 raid->width = 1;
3303 if (!raid->total_sectors || (raid->total_sectors > SIS_LBA(parent)))
3304 raid->total_sectors = SIS_LBA(parent);
3305 break;
3306
3307 default:
3308 device_printf(parent, "Silicon Integrated Systems "
3309 "unknown RAID type 0x%08x\n", meta->magic);
3310 free(raidp[array], M_AR);
3311 raidp[array] = NULL;
3312 goto sis_out;
3313 }
3314 raid->magic_0 = meta->controller_pci_id;
3315 raid->magic_1 = meta->timestamp;
3316 raid->format = AR_F_SIS_RAID;
3317 raid->generation = 0;
3318 raid->interleave = meta->stripe_sectors;
3319 raid->total_disks = (meta->type_total_disks & SIS_D_MASK);
3320 raid->heads = 255;
3321 raid->sectors = 63;
3322 raid->cylinders = raid->total_sectors / (63 * 255);
3323 raid->offset_sectors = 0;
3324 raid->rebuild_lba = 0;
3325 raid->lun = array;
3326 /* XXX SOS if total_disks > 2 this doesn't float */
3327 if (((meta->disks & SIS_D_MASTER) >> 4) == meta->disk_number)
3328 disk_number = 0;
3329 else
3330 disk_number = 1;
3331
3332 for (drive = 0; drive < raid->total_disks; drive++) {
3333 raid->disks[drive].sectors = raid->total_sectors/raid->width;
3334 if (drive == disk_number) {
3335 raid->disks[disk_number].dev = parent;
3336 raid->disks[disk_number].flags =
3337 (AR_DF_ONLINE | AR_DF_PRESENT | AR_DF_ASSIGNED);
3338 ars->raid[raid->volume] = raid;
3339 ars->disk_number[raid->volume] = disk_number;
3340 }
3341 }
3342 retval = 1;
3343 break;
3344 }
3345
3346sis_out:
3347 free(meta, M_AR);
3348 return retval;
3349}
3350
3351static int
3352ata_raid_sis_write_meta(struct ar_softc *rdp)
3353{
3354 struct sis_raid_conf *meta;
3355 struct timeval timestamp;
3356 int disk, error = 0;
3357
3358 if (!(meta = (struct sis_raid_conf *)
3359 malloc(sizeof(struct sis_raid_conf), M_AR, M_NOWAIT | M_ZERO))) {
3360 printf("ar%d: failed to allocate metadata storage\n", rdp->lun);
3361 return ENOMEM;
3362 }
3363
3364 rdp->generation++;
3365 microtime(&timestamp);
3366
3367 meta->magic = SIS_MAGIC;
3368 /* XXX SOS if total_disks > 2 this doesn't float */
3369 for (disk = 0; disk < rdp->total_disks; disk++) {
3370 if (rdp->disks[disk].dev) {
3371 struct ata_channel *ch =
3372 device_get_softc(device_get_parent(rdp->disks[disk].dev));
3373 struct ata_device *atadev = device_get_softc(rdp->disks[disk].dev);
3374 int disk_number = 1 + ATA_DEV(atadev->unit) + (ch->unit << 1);
3375
3376 meta->disks |= disk_number << ((1 - disk) << 2);
3377 }
3378 }
3379 switch (rdp->type) {
3380 case AR_T_JBOD:
3381 meta->type_total_disks = SIS_T_JBOD;
3382 break;
3383
3384 case AR_T_RAID0:
3385 meta->type_total_disks = SIS_T_RAID0;
3386 break;
3387
3388 case AR_T_RAID1:
3389 meta->type_total_disks = SIS_T_RAID1;
3390 break;
3391
3392 default:
3393 free(meta, M_AR);
3394 return ENODEV;
3395 }
3396 meta->type_total_disks |= (rdp->total_disks & SIS_D_MASK);
3397 meta->stripe_sectors = rdp->interleave;
3398 meta->timestamp = timestamp.tv_sec;
3399
3400 for (disk = 0; disk < rdp->total_disks; disk++) {
3401 if (rdp->disks[disk].dev) {
3402 struct ata_channel *ch =
3403 device_get_softc(device_get_parent(rdp->disks[disk].dev));
3404 struct ata_device *atadev = device_get_softc(rdp->disks[disk].dev);
3405
3406 meta->controller_pci_id =
3407 (pci_get_vendor(GRANDPARENT(rdp->disks[disk].dev)) << 16) |
3408 pci_get_device(GRANDPARENT(rdp->disks[disk].dev));
3409 bcopy(atadev->param.model, meta->model, sizeof(meta->model));
3410
3411 /* XXX SOS if total_disks > 2 this may not float */
3412 meta->disk_number = 1 + ATA_DEV(atadev->unit) + (ch->unit << 1);
3413
3414 if (testing || bootverbose)
3415 ata_raid_sis_print_meta(meta);
3416
3417 if (ata_raid_rw(rdp->disks[disk].dev,
3418 SIS_LBA(rdp->disks[disk].dev),
3419 meta, sizeof(struct sis_raid_conf),
3420 ATA_R_WRITE | ATA_R_DIRECT)) {
3421 device_printf(rdp->disks[disk].dev, "write metadata failed\n");
3422 error = EIO;
3423 }
3424 }
3425 }
3426 free(meta, M_AR);
3427 return error;
3428}
3429
3430/* VIA Tech V-RAID Metadata */
3431static int
3432ata_raid_via_read_meta(device_t dev, struct ar_softc **raidp)
3433{
3434 struct ata_raid_subdisk *ars = device_get_softc(dev);
3435 device_t parent = device_get_parent(dev);
3436 struct via_raid_conf *meta;
3437 struct ar_softc *raid = NULL;
3438 u_int8_t checksum, *ptr;
3439 int array, count, disk, retval = 0;
3440
3441 if (!(meta = (struct via_raid_conf *)
3442 malloc(sizeof(struct via_raid_conf), M_AR, M_NOWAIT | M_ZERO)))
3443 return ENOMEM;
3444
3445 if (ata_raid_rw(parent, VIA_LBA(parent),
3446 meta, sizeof(struct via_raid_conf), ATA_R_READ)) {
3447 if (testing || bootverbose)
3448 device_printf(parent, "VIA read metadata failed\n");
3449 goto via_out;
3450 }
3451
3452 /* check if this is a VIA RAID struct */
3453 if (meta->magic != VIA_MAGIC) {
3454 if (testing || bootverbose)
3455 device_printf(parent, "VIA check1 failed\n");
3456 goto via_out;
3457 }
3458
3365 /* calc the checksum and compare for valid */
3459 /* calculate checksum and compare for valid */
3366 for (checksum = 0, ptr = (u_int8_t *)meta, count = 0; count < 50; count++)
3367 checksum += *ptr++;
3368 if (checksum != meta->checksum) {
3369 if (testing || bootverbose)
3370 device_printf(parent, "VIA check2 failed\n");
3371 goto via_out;
3372 }
3373
3374 if (testing || bootverbose)
3375 ata_raid_via_print_meta(meta);
3376
3377 /* now convert VIA meta into our generic form */
3378 for (array = 0; array < MAX_ARRAYS; array++) {
3379 if (!raidp[array]) {
3380 raidp[array] =
3381 (struct ar_softc *)malloc(sizeof(struct ar_softc), M_AR,
3382 M_NOWAIT | M_ZERO);
3383 if (!raidp[array]) {
3384 device_printf(parent, "failed to allocate metadata storage\n");
3385 goto via_out;
3386 }
3387 }
3388 raid = raidp[array];
3389 if (raid->format && (raid->format != AR_F_VIA_RAID))
3390 continue;
3391
3392 if (raid->format == AR_F_VIA_RAID && (raid->magic_0 != meta->disks[0]))
3393 continue;
3394
3395 switch (meta->type & VIA_T_MASK) {
3396 case VIA_T_RAID0:
3397 raid->type = AR_T_RAID0;
3460 for (checksum = 0, ptr = (u_int8_t *)meta, count = 0; count < 50; count++)
3461 checksum += *ptr++;
3462 if (checksum != meta->checksum) {
3463 if (testing || bootverbose)
3464 device_printf(parent, "VIA check2 failed\n");
3465 goto via_out;
3466 }
3467
3468 if (testing || bootverbose)
3469 ata_raid_via_print_meta(meta);
3470
3471 /* now convert VIA meta into our generic form */
3472 for (array = 0; array < MAX_ARRAYS; array++) {
3473 if (!raidp[array]) {
3474 raidp[array] =
3475 (struct ar_softc *)malloc(sizeof(struct ar_softc), M_AR,
3476 M_NOWAIT | M_ZERO);
3477 if (!raidp[array]) {
3478 device_printf(parent, "failed to allocate metadata storage\n");
3479 goto via_out;
3480 }
3481 }
3482 raid = raidp[array];
3483 if (raid->format && (raid->format != AR_F_VIA_RAID))
3484 continue;
3485
3486 if (raid->format == AR_F_VIA_RAID && (raid->magic_0 != meta->disks[0]))
3487 continue;
3488
3489 switch (meta->type & VIA_T_MASK) {
3490 case VIA_T_RAID0:
3491 raid->type = AR_T_RAID0;
3398 raid->width = meta->stripe_layout & VIA_L_MASK;
3492 raid->width = meta->stripe_layout & VIA_L_DISKS;
3399 if (!raid->total_sectors ||
3400 (raid->total_sectors > (raid->width * meta->disk_sectors)))
3401 raid->total_sectors = raid->width * meta->disk_sectors;
3402 break;
3403
3404 case VIA_T_RAID1:
3405 raid->type = AR_T_RAID1;
3406 raid->width = 1;
3407 raid->total_sectors = meta->disk_sectors;
3408 break;
3409
3410 case VIA_T_RAID01:
3411 raid->type = AR_T_RAID01;
3493 if (!raid->total_sectors ||
3494 (raid->total_sectors > (raid->width * meta->disk_sectors)))
3495 raid->total_sectors = raid->width * meta->disk_sectors;
3496 break;
3497
3498 case VIA_T_RAID1:
3499 raid->type = AR_T_RAID1;
3500 raid->width = 1;
3501 raid->total_sectors = meta->disk_sectors;
3502 break;
3503
3504 case VIA_T_RAID01:
3505 raid->type = AR_T_RAID01;
3412 raid->width = meta->stripe_layout & VIA_L_MASK;
3506 raid->width = meta->stripe_layout & VIA_L_DISKS;
3413 if (!raid->total_sectors ||
3414 (raid->total_sectors > (raid->width * meta->disk_sectors)))
3415 raid->total_sectors = raid->width * meta->disk_sectors;
3416 break;
3417
3418 case VIA_T_RAID5:
3419 raid->type = AR_T_RAID5;
3507 if (!raid->total_sectors ||
3508 (raid->total_sectors > (raid->width * meta->disk_sectors)))
3509 raid->total_sectors = raid->width * meta->disk_sectors;
3510 break;
3511
3512 case VIA_T_RAID5:
3513 raid->type = AR_T_RAID5;
3420 raid->width = meta->stripe_layout & VIA_L_MASK;
3514 raid->width = meta->stripe_layout & VIA_L_DISKS;
3421 if (!raid->total_sectors ||
3422 (raid->total_sectors > ((raid->width - 1)*meta->disk_sectors)))
3423 raid->total_sectors = (raid->width - 1) * meta->disk_sectors;
3424 break;
3425
3426 case VIA_T_SPAN:
3427 raid->type = AR_T_SPAN;
3428 raid->width = 1;
3429 raid->total_sectors += meta->disk_sectors;
3430 break;
3431
3432 default:
3433 device_printf(parent,"VIA unknown RAID type 0x%02x\n", meta->type);
3434 free(raidp[array], M_AR);
3435 raidp[array] = NULL;
3436 goto via_out;
3437 }
3438 raid->magic_0 = meta->disks[0];
3439 raid->format = AR_F_VIA_RAID;
3440 raid->generation = 0;
3515 if (!raid->total_sectors ||
3516 (raid->total_sectors > ((raid->width - 1)*meta->disk_sectors)))
3517 raid->total_sectors = (raid->width - 1) * meta->disk_sectors;
3518 break;
3519
3520 case VIA_T_SPAN:
3521 raid->type = AR_T_SPAN;
3522 raid->width = 1;
3523 raid->total_sectors += meta->disk_sectors;
3524 break;
3525
3526 default:
3527 device_printf(parent,"VIA unknown RAID type 0x%02x\n", meta->type);
3528 free(raidp[array], M_AR);
3529 raidp[array] = NULL;
3530 goto via_out;
3531 }
3532 raid->magic_0 = meta->disks[0];
3533 raid->format = AR_F_VIA_RAID;
3534 raid->generation = 0;
3441 raid->interleave = 0x08 << (meta->stripe_layout >> VIA_L_SHIFT);
3535 raid->interleave =
3536 0x08 << ((meta->stripe_layout & VIA_L_MASK) >> VIA_L_SHIFT);
3442 for (count = 0, disk = 0; disk < 8; disk++)
3443 if (meta->disks[disk])
3444 count++;
3445 raid->total_disks = count;
3446 raid->heads = 255;
3447 raid->sectors = 63;
3448 raid->cylinders = raid->total_sectors / (63 * 255);
3449 raid->offset_sectors = 0;
3450 raid->rebuild_lba = 0;
3451 raid->lun = array;
3452
3537 for (count = 0, disk = 0; disk < 8; disk++)
3538 if (meta->disks[disk])
3539 count++;
3540 raid->total_disks = count;
3541 raid->heads = 255;
3542 raid->sectors = 63;
3543 raid->cylinders = raid->total_sectors / (63 * 255);
3544 raid->offset_sectors = 0;
3545 raid->rebuild_lba = 0;
3546 raid->lun = array;
3547
3453 for (disk = 0; disk < 8; disk++) {
3548 for (disk = 0; disk < raid->total_disks; disk++) {
3454 if (meta->disks[disk] == meta->disk_id) {
3455 raid->disks[disk].dev = parent;
3549 if (meta->disks[disk] == meta->disk_id) {
3550 raid->disks[disk].dev = parent;
3551 bcopy(&meta->disk_id, raid->disks[disk].serial,
3552 sizeof(u_int32_t));
3456 raid->disks[disk].sectors = meta->disk_sectors;
3457 raid->disks[disk].flags =
3458 (AR_DF_ONLINE | AR_DF_PRESENT | AR_DF_ASSIGNED);
3459 ars->raid[raid->volume] = raid;
3460 ars->disk_number[raid->volume] = disk;
3461 retval = 1;
3462 break;
3463 }
3464 }
3465 break;
3466 }
3467
3468via_out:
3469 free(meta, M_AR);
3470 return retval;
3471}
3553 raid->disks[disk].sectors = meta->disk_sectors;
3554 raid->disks[disk].flags =
3555 (AR_DF_ONLINE | AR_DF_PRESENT | AR_DF_ASSIGNED);
3556 ars->raid[raid->volume] = raid;
3557 ars->disk_number[raid->volume] = disk;
3558 retval = 1;
3559 break;
3560 }
3561 }
3562 break;
3563 }
3564
3565via_out:
3566 free(meta, M_AR);
3567 return retval;
3568}
3569static int
3570ata_raid_via_write_meta(struct ar_softc *rdp)
3571{
3572 struct via_raid_conf *meta;
3573 int disk, error = 0;
3472
3574
3575 if (!(meta = (struct via_raid_conf *)
3576 malloc(sizeof(struct via_raid_conf), M_AR, M_NOWAIT | M_ZERO))) {
3577 printf("ar%d: failed to allocate metadata storage\n", rdp->lun);
3578 return ENOMEM;
3579 }
3580
3581 rdp->generation++;
3582
3583 meta->magic = VIA_MAGIC;
3584 meta->dummy_0 = 0x02;
3585 switch (rdp->type) {
3586 case AR_T_SPAN:
3587 meta->type = VIA_T_SPAN;
3588 meta->stripe_layout = (rdp->total_disks & VIA_L_DISKS);
3589 break;
3590
3591 case AR_T_RAID0:
3592 meta->type = VIA_T_RAID0;
3593 meta->stripe_layout = ((rdp->interleave >> 1) & VIA_L_MASK);
3594 meta->stripe_layout |= (rdp->total_disks & VIA_L_DISKS);
3595 break;
3596
3597 case AR_T_RAID1:
3598 meta->type = VIA_T_RAID1;
3599 meta->stripe_layout = (rdp->total_disks & VIA_L_DISKS);
3600 break;
3601
3602 case AR_T_RAID5:
3603 meta->type = VIA_T_RAID5;
3604 meta->stripe_layout = ((rdp->interleave >> 1) & VIA_L_MASK);
3605 meta->stripe_layout |= (rdp->total_disks & VIA_L_DISKS);
3606 break;
3607
3608 case AR_T_RAID01:
3609 meta->type = VIA_T_RAID01;
3610 meta->stripe_layout = ((rdp->interleave >> 1) & VIA_L_MASK);
3611 meta->stripe_layout |= (rdp->width & VIA_L_DISKS);
3612 break;
3613
3614 default:
3615 free(meta, M_AR);
3616 return ENODEV;
3617 }
3618 meta->type |= VIA_T_BOOTABLE; /* XXX SOS */
3619 meta->disk_sectors =
3620 rdp->total_sectors / (rdp->width - (rdp->type == AR_RAID5));
3621 for (disk = 0; disk < rdp->total_disks; disk++)
3622 meta->disks[disk] = (u_int32_t)rdp->disks[disk].dev;
3623
3624 for (disk = 0; disk < rdp->total_disks; disk++) {
3625 if (rdp->disks[disk].dev) {
3626 u_int8_t *ptr;
3627 int count;
3628
3629 meta->disk_index = disk * sizeof(u_int32_t);
3630 if (rdp->type == AR_T_RAID01)
3631 meta->disk_index = ((meta->disk_index & 0x08) << 2) |
3632 (meta->disk_index & ~0x08);
3633 meta->disk_id = meta->disks[disk];
3634 meta->checksum = 0;
3635 for (ptr = (u_int8_t *)meta, count = 0; count < 50; count++)
3636 meta->checksum += *ptr++;
3637
3638 if (testing || bootverbose)
3639 ata_raid_via_print_meta(meta);
3640
3641 if (ata_raid_rw(rdp->disks[disk].dev,
3642 VIA_LBA(rdp->disks[disk].dev),
3643 meta, sizeof(struct via_raid_conf),
3644 ATA_R_WRITE | ATA_R_DIRECT)) {
3645 device_printf(rdp->disks[disk].dev, "write metadata failed\n");
3646 error = EIO;
3647 }
3648 }
3649 }
3650 free(meta, M_AR);
3651 return error;
3652}
3653
3473static struct ata_request *
3474ata_raid_init_request(struct ar_softc *rdp, struct bio *bio)
3475{
3476 struct ata_request *request;
3477
3478 if (!(request = ata_alloc_request())) {
3479 printf("FAILURE - out of memory in ata_raid_init_request\n");
3480 return NULL;
3481 }
3482 request->timeout = 5;
3483 request->retries = 2;
3484 request->callback = ata_raid_done;
3485 request->driver = rdp;
3486 request->bio = bio;
3487 switch (request->bio->bio_cmd) {
3488 case BIO_READ:
3489 request->flags = ATA_R_READ;
3490 break;
3491 case BIO_WRITE:
3492 request->flags = ATA_R_WRITE;
3493 break;
3494 }
3495 return request;
3496}
3497
3498static int
3499ata_raid_send_request(struct ata_request *request)
3500{
3501 struct ata_device *atadev = device_get_softc(request->dev);
3502
3503 request->transfersize = min(request->bytecount, atadev->max_iosize);
3504 if (request->flags & ATA_R_READ) {
3505 if (atadev->mode >= ATA_DMA) {
3506 request->flags |= ATA_R_DMA;
3507 request->u.ata.command = ATA_READ_DMA;
3508 }
3509 else if (atadev->max_iosize > DEV_BSIZE)
3510 request->u.ata.command = ATA_READ_MUL;
3511 else
3512 request->u.ata.command = ATA_READ;
3513 }
3514 else if (request->flags & ATA_R_WRITE) {
3515 if (atadev->mode >= ATA_DMA) {
3516 request->flags |= ATA_R_DMA;
3517 request->u.ata.command = ATA_WRITE_DMA;
3518 }
3519 else if (atadev->max_iosize > DEV_BSIZE)
3520 request->u.ata.command = ATA_WRITE_MUL;
3521 else
3522 request->u.ata.command = ATA_WRITE;
3523 }
3524 else {
3525 device_printf(request->dev, "FAILURE - unknown IO operation\n");
3526 ata_free_request(request);
3527 return EIO;
3528 }
3529 request->flags |= (ATA_R_ORDERED | ATA_R_THREAD);
3530 ata_queue_request(request);
3531 return 0;
3532}
3533
3534static int
3535ata_raid_rw(device_t dev, u_int64_t lba, void *data, u_int bcount, int flags)
3536{
3537 struct ata_device *atadev = device_get_softc(dev);
3538 struct ata_request *request;
3539 int error;
3540
3541 if (bcount % DEV_BSIZE) {
3542 device_printf(dev, "FAILURE - transfers must be modulo sectorsize\n");
3543 return ENOMEM;
3544 }
3545
3546 if (!(request = ata_alloc_request())) {
3547 device_printf(dev, "FAILURE - out of memory in ata_raid_rw\n");
3548 return ENOMEM;
3549 }
3550
3551 /* setup request */
3552 request->dev = dev;
3553 request->timeout = 10;
3554 request->retries = 0;
3555 request->data = data;
3556 request->bytecount = bcount;
3557 request->transfersize = DEV_BSIZE;
3558 request->u.ata.lba = lba;
3559 request->u.ata.count = request->bytecount / DEV_BSIZE;
3560 request->flags = flags;
3561
3562 if (flags & ATA_R_READ) {
3563 if (atadev->mode >= ATA_DMA) {
3564 request->u.ata.command = ATA_READ_DMA;
3565 request->flags |= ATA_R_DMA;
3566 }
3567 else
3568 request->u.ata.command = ATA_READ;
3569 ata_queue_request(request);
3570 }
3571 else if (flags & ATA_R_WRITE) {
3572 if (atadev->mode >= ATA_DMA) {
3573 request->u.ata.command = ATA_WRITE_DMA;
3574 request->flags |= ATA_R_DMA;
3575 }
3576 else
3577 request->u.ata.command = ATA_WRITE;
3578 ata_queue_request(request);
3579 }
3580 else {
3581 device_printf(dev, "FAILURE - unknown IO operation\n");
3582 request->result = EIO;
3583 }
3584 error = request->result;
3585 ata_free_request(request);
3586 return error;
3587}
3588
3589/*
3590 * module handeling
3591 */
3592static int
3593ata_raid_subdisk_probe(device_t dev)
3594{
3595 device_quiet(dev);
3596 return 0;
3597}
3598
3599static int
3600ata_raid_subdisk_attach(device_t dev)
3601{
3602 struct ata_raid_subdisk *ars = device_get_softc(dev);
3603 int volume;
3604
3605 for (volume = 0; volume < MAX_VOLUMES; volume++) {
3606 ars->raid[volume] = NULL;
3607 ars->disk_number[volume] = -1;
3608 }
3609 ata_raid_read_metadata(dev);
3610 return 0;
3611}
3612
3613static int
3614ata_raid_subdisk_detach(device_t dev)
3615{
3616 struct ata_raid_subdisk *ars = device_get_softc(dev);
3617 int volume;
3618
3619 for (volume = 0; volume < MAX_VOLUMES; volume++) {
3620 if (ars->raid[volume]) {
3621 ars->raid[volume]->disks[ars->disk_number[volume]].flags &=
3622 ~(AR_DF_PRESENT | AR_DF_ONLINE);
3623 ars->raid[volume]->disks[ars->disk_number[volume]].dev = NULL;
3624 ata_raid_config_changed(ars->raid[volume], 1);
3625 ars->raid[volume] = NULL;
3626 ars->disk_number[volume] = -1;
3627 }
3628 }
3629 return 0;
3630}
3631
3632static device_method_t ata_raid_sub_methods[] = {
3633 /* device interface */
3634 DEVMETHOD(device_probe, ata_raid_subdisk_probe),
3635 DEVMETHOD(device_attach, ata_raid_subdisk_attach),
3636 DEVMETHOD(device_detach, ata_raid_subdisk_detach),
3637 { 0, 0 }
3638};
3639
3640static driver_t ata_raid_sub_driver = {
3641 "subdisk",
3642 ata_raid_sub_methods,
3643 sizeof(struct ata_raid_subdisk)
3644};
3645
3646DRIVER_MODULE(subdisk, ad, ata_raid_sub_driver, ata_raid_sub_devclass, NULL, NULL);
3647
3648static int
3649ata_raid_module_event_handler(module_t mod, int what, void *arg)
3650{
3651 int i;
3652
3653 switch (what) {
3654 case MOD_LOAD:
3655 if (testing || bootverbose)
3656 printf("ATA PseudoRAID loaded\n");
3657#if 0
3658 /* setup table to hold metadata for all ATA PseudoRAID arrays */
3659 ata_raid_arrays = malloc(sizeof(struct ar_soft *) * MAX_ARRAYS,
3660 M_AR, M_NOWAIT | M_ZERO);
3661 if (!ata_raid_arrays) {
3662 printf("ataraid: no memory for metadata storage\n");
3663 return ENOMEM;
3664 }
3665#endif
3666 /* attach found PseudoRAID arrays */
3667 for (i = 0; i < MAX_ARRAYS; i++) {
3668 struct ar_softc *rdp = ata_raid_arrays[i];
3669
3670 if (!rdp || !rdp->format)
3671 continue;
3672 if (testing || bootverbose)
3673 ata_raid_print_meta(rdp);
3674 ata_raid_attach(rdp, 0);
3675 }
3676 ata_raid_ioctl_func = ata_raid_ioctl;
3677 return 0;
3678
3679 case MOD_UNLOAD:
3680 /* detach found PseudoRAID arrays */
3681 for (i = 0; i < MAX_ARRAYS; i++) {
3682 struct ar_softc *rdp = ata_raid_arrays[i];
3683
3684 if (!rdp || !rdp->status)
3685 continue;
3686 disk_destroy(rdp->disk);
3687 }
3688 if (testing || bootverbose)
3689 printf("ATA PseudoRAID unloaded\n");
3690#if 0
3691 free(ata_raid_arrays, M_AR);
3692#endif
3693 ata_raid_ioctl_func = NULL;
3694 return 0;
3695
3696 default:
3697 return EOPNOTSUPP;
3698 }
3699}
3700
3701static moduledata_t ata_raid_moduledata =
3702 { "ataraid", ata_raid_module_event_handler, NULL };
3703DECLARE_MODULE(ata, ata_raid_moduledata, SI_SUB_RAID, SI_ORDER_FIRST);
3704MODULE_VERSION(ataraid, 1);
3705MODULE_DEPEND(ataraid, ata, 1, 1, 1);
3706MODULE_DEPEND(ataraid, ad, 1, 1, 1);
3707
3708static char *
3709ata_raid_format(struct ar_softc *rdp)
3710{
3711 switch (rdp->format) {
3712 case AR_F_FREEBSD_RAID: return "FreeBSD PseudoRAID";
3713 case AR_F_ADAPTEC_RAID: return "Adaptec HostRAID";
3714 case AR_F_HPTV2_RAID: return "HighPoint v2 RocketRAID";
3715 case AR_F_HPTV3_RAID: return "HighPoint v3 RocketRAID";
3716 case AR_F_INTEL_RAID: return "Intel MatrixRAID";
3717 case AR_F_ITE_RAID: return "Integrated Technology Express";
3718 case AR_F_LSIV2_RAID: return "LSILogic v2 MegaRAID";
3719 case AR_F_LSIV3_RAID: return "LSILogic v3 MegaRAID";
3720 case AR_F_NVIDIA_RAID: return "nVidia MediaShield";
3721 case AR_F_PROMISE_RAID: return "Promise Fasttrak";
3722 case AR_F_SII_RAID: return "Silicon Image Medley";
3723 case AR_F_SIS_RAID: return "Silicon Integrated Systems";
3724 case AR_F_VIA_RAID: return "VIA Tech V-RAID";
3725 default: return "UNKNOWN";
3726 }
3727}
3728
3729static char *
3730ata_raid_type(struct ar_softc *rdp)
3731{
3732 switch (rdp->type) {
3733 case AR_T_JBOD: return "JBOD";
3734 case AR_T_SPAN: return "SPAN";
3735 case AR_T_RAID0: return "RAID0";
3736 case AR_T_RAID1: return "RAID1";
3737 case AR_T_RAID3: return "RAID3";
3738 case AR_T_RAID4: return "RAID4";
3739 case AR_T_RAID5: return "RAID5";
3740 case AR_T_RAID01: return "RAID0+1";
3741 default: return "UNKNOWN";
3742 }
3743}
3744
3745static char *
3746ata_raid_flags(struct ar_softc *rdp)
3747{
3748 switch (rdp->status & (AR_S_READY | AR_S_DEGRADED | AR_S_REBUILDING)) {
3749 case AR_S_READY: return "READY";
3750 case AR_S_READY | AR_S_DEGRADED: return "DEGRADED";
3751 case AR_S_READY | AR_S_REBUILDING:
3752 case AR_S_READY | AR_S_DEGRADED | AR_S_REBUILDING: return "REBUILDING";
3753 default: return "BROKEN";
3754 }
3755}
3756
3757/* debugging gunk */
3758static void
3759ata_raid_print_meta(struct ar_softc *raid)
3760{
3761 int i;
3762
3763 printf("********** ATA PseudoRAID ar%d Metadata **********\n", raid->lun);
3764 printf("=================================================\n");
3765 printf("format %s\n", ata_raid_format(raid));
3766 printf("type %s\n", ata_raid_type(raid));
3767 printf("flags 0x%02x %b\n", raid->status, raid->status,
3768 "\20\3REBUILDING\2DEGRADED\1READY\n");
3769 printf("magic_0 0x%016llx\n",(unsigned long long)raid->magic_0);
3770 printf("magic_1 0x%016llx\n",(unsigned long long)raid->magic_1);
3771 printf("generation %u\n", raid->generation);
3772 printf("total_sectors %llu\n",
3773 (unsigned long long)raid->total_sectors);
3774 printf("offset_sectors %llu\n",
3775 (unsigned long long)raid->offset_sectors);
3776 printf("heads %u\n", raid->heads);
3777 printf("sectors %u\n", raid->sectors);
3778 printf("cylinders %u\n", raid->cylinders);
3779 printf("width %u\n", raid->width);
3780 printf("interleave %u\n", raid->interleave);
3781 printf("total_disks %u\n", raid->total_disks);
3782 for (i = 0; i < raid->total_disks; i++) {
3783 printf(" disk %d: flags = 0x%02x %b\n", i, raid->disks[i].flags,
3784 raid->disks[i].flags, "\20\4ONLINE\3SPARE\2ASSIGNED\1PRESENT\n");
3785 if (raid->disks[i].dev) {
3786 printf(" ");
3787 device_printf(raid->disks[i].dev, " sectors %lld\n",
3788 (long long)raid->disks[i].sectors);
3789 }
3790 }
3791 printf("=================================================\n");
3792}
3793
3794static char *
3795ata_raid_adaptec_type(int type)
3796{
3797 static char buffer[16];
3798
3799 switch (type) {
3800 case ADP_T_RAID0: return "RAID0";
3801 case ADP_T_RAID1: return "RAID1";
3802 default: sprintf(buffer, "UNKNOWN 0x%02x", type);
3803 return buffer;
3804 }
3805}
3806
3807static void
3808ata_raid_adaptec_print_meta(struct adaptec_raid_conf *meta)
3809{
3810 int i;
3811
3812 printf("********* ATA Adaptec HostRAID Metadata *********\n");
3813 printf("magic_0 <0x%08x>\n", be32toh(meta->magic_0));
3814 printf("generation 0x%08x\n", be32toh(meta->generation));
3815 printf("dummy_0 0x%04x\n", be16toh(meta->dummy_0));
3816 printf("total_configs %u\n", be16toh(meta->total_configs));
3817 printf("dummy_1 0x%04x\n", be16toh(meta->dummy_1));
3818 printf("checksum 0x%04x\n", be16toh(meta->checksum));
3819 printf("dummy_2 0x%08x\n", be32toh(meta->dummy_2));
3820 printf("dummy_3 0x%08x\n", be32toh(meta->dummy_3));
3821 printf("flags 0x%08x\n", be32toh(meta->flags));
3822 printf("timestamp 0x%08x\n", be32toh(meta->timestamp));
3823 printf("dummy_4 0x%08x 0x%08x 0x%08x 0x%08x\n",
3824 be32toh(meta->dummy_4[0]), be32toh(meta->dummy_4[1]),
3825 be32toh(meta->dummy_4[2]), be32toh(meta->dummy_4[3]));
3826 printf("dummy_5 0x%08x 0x%08x 0x%08x 0x%08x\n",
3827 be32toh(meta->dummy_5[0]), be32toh(meta->dummy_5[1]),
3828 be32toh(meta->dummy_5[2]), be32toh(meta->dummy_5[3]));
3829
3830 for (i = 0; i < be16toh(meta->total_configs); i++) {
3831 printf(" %d total_disks %u\n", i,
3832 be16toh(meta->configs[i].disk_number));
3833 printf(" %d generation %u\n", i,
3834 be16toh(meta->configs[i].generation));
3835 printf(" %d magic_0 0x%08x\n", i,
3836 be32toh(meta->configs[i].magic_0));
3837 printf(" %d dummy_0 0x%02x\n", i, meta->configs[i].dummy_0);
3838 printf(" %d type %s\n", i,
3839 ata_raid_adaptec_type(meta->configs[i].type));
3840 printf(" %d dummy_1 0x%02x\n", i, meta->configs[i].dummy_1);
3841 printf(" %d flags %d\n", i,
3842 be32toh(meta->configs[i].flags));
3843 printf(" %d dummy_2 0x%02x\n", i, meta->configs[i].dummy_2);
3844 printf(" %d dummy_3 0x%02x\n", i, meta->configs[i].dummy_3);
3845 printf(" %d dummy_4 0x%02x\n", i, meta->configs[i].dummy_4);
3846 printf(" %d dummy_5 0x%02x\n", i, meta->configs[i].dummy_5);
3847 printf(" %d disk_number %u\n", i,
3848 be32toh(meta->configs[i].disk_number));
3849 printf(" %d dummy_6 0x%08x\n", i,
3850 be32toh(meta->configs[i].dummy_6));
3851 printf(" %d sectors %u\n", i,
3852 be32toh(meta->configs[i].sectors));
3853 printf(" %d stripe_shift %u\n", i,
3854 be16toh(meta->configs[i].stripe_shift));
3855 printf(" %d dummy_7 0x%08x\n", i,
3856 be32toh(meta->configs[i].dummy_7));
3857 printf(" %d dummy_8 0x%08x 0x%08x 0x%08x 0x%08x\n", i,
3858 be32toh(meta->configs[i].dummy_8[0]),
3859 be32toh(meta->configs[i].dummy_8[1]),
3860 be32toh(meta->configs[i].dummy_8[2]),
3861 be32toh(meta->configs[i].dummy_8[3]));
3862 printf(" %d name <%s>\n", i, meta->configs[i].name);
3863 }
3864 printf("magic_1 <0x%08x>\n", be32toh(meta->magic_1));
3865 printf("magic_2 <0x%08x>\n", be32toh(meta->magic_2));
3866 printf("magic_3 <0x%08x>\n", be32toh(meta->magic_3));
3867 printf("magic_4 <0x%08x>\n", be32toh(meta->magic_4));
3868 printf("=================================================\n");
3869}
3870
3871static char *
3872ata_raid_hptv2_type(int type)
3873{
3874 static char buffer[16];
3875
3876 switch (type) {
3877 case HPTV2_T_RAID0: return "RAID0";
3878 case HPTV2_T_RAID1: return "RAID1";
3879 case HPTV2_T_RAID01_RAID0: return "RAID01_RAID0";
3880 case HPTV2_T_SPAN: return "SPAN";
3881 case HPTV2_T_RAID_3: return "RAID3";
3882 case HPTV2_T_RAID_5: return "RAID5";
3883 case HPTV2_T_JBOD: return "JBOD";
3884 case HPTV2_T_RAID01_RAID1: return "RAID01_RAID1";
3885 default: sprintf(buffer, "UNKNOWN 0x%02x", type);
3886 return buffer;
3887 }
3888}
3889
3890static void
3891ata_raid_hptv2_print_meta(struct hptv2_raid_conf *meta)
3892{
3893 int i;
3894
3895 printf("****** ATA Highpoint V2 RocketRAID Metadata *****\n");
3896 printf("magic 0x%08x\n", meta->magic);
3897 printf("magic_0 0x%08x\n", meta->magic_0);
3898 printf("magic_1 0x%08x\n", meta->magic_1);
3899 printf("order 0x%08x\n", meta->order);
3900 printf("array_width %u\n", meta->array_width);
3901 printf("stripe_shift %u\n", meta->stripe_shift);
3902 printf("type %s\n", ata_raid_hptv2_type(meta->type));
3903 printf("disk_number %u\n", meta->disk_number);
3904 printf("total_sectors %u\n", meta->total_sectors);
3905 printf("disk_mode 0x%08x\n", meta->disk_mode);
3906 printf("boot_mode 0x%08x\n", meta->boot_mode);
3907 printf("boot_disk 0x%02x\n", meta->boot_disk);
3908 printf("boot_protect 0x%02x\n", meta->boot_protect);
3909 printf("log_entries 0x%02x\n", meta->error_log_entries);
3910 printf("log_index 0x%02x\n", meta->error_log_index);
3911 if (meta->error_log_entries) {
3912 printf(" timestamp reason disk status sectors lba\n");
3913 for (i = meta->error_log_index;
3914 i < meta->error_log_index + meta->error_log_entries; i++)
3915 printf(" 0x%08x 0x%02x 0x%02x 0x%02x 0x%02x 0x%08x\n",
3916 meta->errorlog[i%32].timestamp,
3917 meta->errorlog[i%32].reason,
3918 meta->errorlog[i%32].disk, meta->errorlog[i%32].status,
3919 meta->errorlog[i%32].sectors, meta->errorlog[i%32].lba);
3920 }
3921 printf("rebuild_lba 0x%08x\n", meta->rebuild_lba);
3922 printf("dummy_1 0x%02x\n", meta->dummy_1);
3923 printf("name_1 <%.15s>\n", meta->name_1);
3924 printf("dummy_2 0x%02x\n", meta->dummy_2);
3925 printf("name_2 <%.15s>\n", meta->name_2);
3926 printf("=================================================\n");
3927}
3928
3929static char *
3930ata_raid_hptv3_type(int type)
3931{
3932 static char buffer[16];
3933
3934 switch (type) {
3935 case HPTV3_T_SPARE: return "SPARE";
3936 case HPTV3_T_JBOD: return "JBOD";
3937 case HPTV3_T_SPAN: return "SPAN";
3938 case HPTV3_T_RAID0: return "RAID0";
3939 case HPTV3_T_RAID1: return "RAID1";
3940 case HPTV3_T_RAID3: return "RAID3";
3941 case HPTV3_T_RAID5: return "RAID5";
3942 default: sprintf(buffer, "UNKNOWN 0x%02x", type);
3943 return buffer;
3944 }
3945}
3946
3947static void
3948ata_raid_hptv3_print_meta(struct hptv3_raid_conf *meta)
3949{
3950 int i;
3951
3952 printf("****** ATA Highpoint V3 RocketRAID Metadata *****\n");
3953 printf("magic 0x%08x\n", meta->magic);
3954 printf("magic_0 0x%08x\n", meta->magic_0);
3955 printf("checksum_0 0x%02x\n", meta->checksum_0);
3956 printf("mode 0x%02x\n", meta->mode);
3957 printf("user_mode 0x%02x\n", meta->user_mode);
3958 printf("config_entries 0x%02x\n", meta->config_entries);
3959 for (i = 0; i < meta->config_entries; i++) {
3960 printf("config %d:\n", i);
3961 printf(" total_sectors %llu\n",
3962 (unsigned long long)(meta->configs[0].total_sectors +
3963 ((u_int64_t)meta->configs_high[0].total_sectors << 32)));
3964 printf(" type %s\n",
3965 ata_raid_hptv3_type(meta->configs[i].type));
3966 printf(" total_disks %u\n", meta->configs[i].total_disks);
3967 printf(" disk_number %u\n", meta->configs[i].disk_number);
3968 printf(" stripe_shift %u\n", meta->configs[i].stripe_shift);
3969 printf(" status %b\n", meta->configs[i].status,
3970 "\20\2RAID5\1NEED_REBUILD\n");
3971 printf(" critical_disks %u\n", meta->configs[i].critical_disks);
3972 printf(" rebuild_lba %llu\n",
3973 (unsigned long long)(meta->configs_high[0].rebuild_lba +
3974 ((u_int64_t)meta->configs_high[0].rebuild_lba << 32)));
3975 }
3976 printf("name <%.16s>\n", meta->name);
3977 printf("timestamp 0x%08x\n", meta->timestamp);
3978 printf("description <%.16s>\n", meta->description);
3979 printf("creator <%.16s>\n", meta->creator);
3980 printf("checksum_1 0x%02x\n", meta->checksum_1);
3981 printf("dummy_0 0x%02x\n", meta->dummy_0);
3982 printf("dummy_1 0x%02x\n", meta->dummy_1);
3983 printf("flags %b\n", meta->flags,
3984 "\20\4RCACHE\3WCACHE\2NCQ\1TCQ\n");
3985 printf("=================================================\n");
3986}
3987
3988static char *
3989ata_raid_intel_type(int type)
3990{
3991 static char buffer[16];
3992
3993 switch (type) {
3994 case INTEL_T_RAID0: return "RAID0";
3995 case INTEL_T_RAID1: return "RAID1";
3996 case INTEL_T_RAID5: return "RAID5";
3997 default: sprintf(buffer, "UNKNOWN 0x%02x", type);
3998 return buffer;
3999 }
4000}
4001
4002static void
4003ata_raid_intel_print_meta(struct intel_raid_conf *meta)
4004{
4005 struct intel_raid_mapping *map;
4006 int i, j;
4007
4008 printf("********* ATA Intel MatrixRAID Metadata *********\n");
4009 printf("intel_id <%.24s>\n", meta->intel_id);
4010 printf("version <%.6s>\n", meta->version);
4011 printf("checksum 0x%08x\n", meta->checksum);
4012 printf("config_size 0x%08x\n", meta->config_size);
4013 printf("config_id 0x%08x\n", meta->config_id);
4014 printf("generation 0x%08x\n", meta->generation);
4015 printf("total_disks %u\n", meta->total_disks);
4016 printf("total_volumes %u\n", meta->total_volumes);
4017 printf("DISK# serial disk_sectors disk_id flags\n");
4018 for (i = 0; i < meta->total_disks; i++ ) {
4019 printf(" %d <%.16s> %u 0x%08x 0x%08x\n", i,
4020 meta->disk[i].serial, meta->disk[i].sectors,
4021 meta->disk[i].id, meta->disk[i].flags);
4022 }
4023 map = (struct intel_raid_mapping *)&meta->disk[meta->total_disks];
4024 for (j = 0; j < meta->total_volumes; j++) {
4025 printf("name %.16s\n", map->name);
4026 printf("total_sectors %llu\n",
4027 (unsigned long long)map->total_sectors);
4028 printf("state %u\n", map->state);
4029 printf("reserved %u\n", map->reserved);
4030 printf("offset %u\n", map->offset);
4031 printf("disk_sectors %u\n", map->disk_sectors);
4032 printf("stripe_count %u\n", map->stripe_count);
4033 printf("stripe_sectors %u\n", map->stripe_sectors);
4034 printf("status %u\n", map->status);
4035 printf("type %s\n", ata_raid_intel_type(map->type));
4036 printf("total_disks %u\n", map->total_disks);
4037 printf("magic[0] 0x%02x\n", map->magic[0]);
4038 printf("magic[1] 0x%02x\n", map->magic[1]);
4039 printf("magic[2] 0x%02x\n", map->magic[2]);
4040 for (i = 0; i < map->total_disks; i++ ) {
4041 printf(" disk %d at disk_idx 0x%08x\n", i, map->disk_idx[i]);
4042 }
4043 map = (struct intel_raid_mapping *)&map->disk_idx[map->total_disks];
4044 }
4045 printf("=================================================\n");
4046}
4047
4048static char *
4049ata_raid_ite_type(int type)
4050{
4051 static char buffer[16];
4052
4053 switch (type) {
4054 case ITE_T_RAID0: return "RAID0";
4055 case ITE_T_RAID1: return "RAID1";
4056 case ITE_T_RAID01: return "RAID0+1";
4057 case ITE_T_SPAN: return "SPAN";
4058 default: sprintf(buffer, "UNKNOWN 0x%02x", type);
4059 return buffer;
4060 }
4061}
4062
4063static void
4064ata_raid_ite_print_meta(struct ite_raid_conf *meta)
4065{
4066 printf("*** ATA Integrated Technology Express Metadata **\n");
4067 printf("ite_id <%.40s>\n", meta->ite_id);
4068 printf("timestamp_0 %04x/%02x/%02x %02x:%02x:%02x.%02x\n",
4069 *((u_int16_t *)meta->timestamp_0), meta->timestamp_0[2],
4070 meta->timestamp_0[3], meta->timestamp_0[5], meta->timestamp_0[4],
4071 meta->timestamp_0[7], meta->timestamp_0[6]);
4072 printf("total_sectors %lld\n",
4073 (unsigned long long)meta->total_sectors);
4074 printf("type %s\n", ata_raid_ite_type(meta->type));
4075 printf("stripe_1kblocks %u\n", meta->stripe_1kblocks);
4076 printf("timestamp_1 %04x/%02x/%02x %02x:%02x:%02x.%02x\n",
4077 *((u_int16_t *)meta->timestamp_1), meta->timestamp_1[2],
4078 meta->timestamp_1[3], meta->timestamp_1[5], meta->timestamp_1[4],
4079 meta->timestamp_1[7], meta->timestamp_1[6]);
4080 printf("stripe_sectors %u\n", meta->stripe_sectors);
4081 printf("array_width %u\n", meta->array_width);
4082 printf("disk_number %u\n", meta->disk_number);
4083 printf("disk_sectors %u\n", meta->disk_sectors);
4084 printf("=================================================\n");
4085}
4086
4087static char *
4088ata_raid_lsiv2_type(int type)
4089{
4090 static char buffer[16];
4091
4092 switch (type) {
4093 case LSIV2_T_RAID0: return "RAID0";
4094 case LSIV2_T_RAID1: return "RAID1";
4095 case LSIV2_T_SPARE: return "SPARE";
4096 default: sprintf(buffer, "UNKNOWN 0x%02x", type);
4097 return buffer;
4098 }
4099}
4100
4101static void
4102ata_raid_lsiv2_print_meta(struct lsiv2_raid_conf *meta)
4103{
4104 int i;
4105
4106 printf("******* ATA LSILogic V2 MegaRAID Metadata *******\n");
4107 printf("lsi_id <%s>\n", meta->lsi_id);
4108 printf("dummy_0 0x%02x\n", meta->dummy_0);
4109 printf("flags 0x%02x\n", meta->flags);
4110 printf("version 0x%04x\n", meta->version);
4111 printf("config_entries 0x%02x\n", meta->config_entries);
4112 printf("raid_count 0x%02x\n", meta->raid_count);
4113 printf("total_disks 0x%02x\n", meta->total_disks);
4114 printf("dummy_1 0x%02x\n", meta->dummy_1);
4115 printf("dummy_2 0x%04x\n", meta->dummy_2);
4116 for (i = 0; i < meta->config_entries; i++) {
4117 printf(" type %s\n",
4118 ata_raid_lsiv2_type(meta->configs[i].raid.type));
4119 printf(" dummy_0 %02x\n", meta->configs[i].raid.dummy_0);
4120 printf(" stripe_sectors %u\n",
4121 meta->configs[i].raid.stripe_sectors);
4122 printf(" array_width %u\n",
4123 meta->configs[i].raid.array_width);
4124 printf(" disk_count %u\n", meta->configs[i].raid.disk_count);
4125 printf(" config_offset %u\n",
4126 meta->configs[i].raid.config_offset);
4127 printf(" dummy_1 %u\n", meta->configs[i].raid.dummy_1);
4128 printf(" flags %02x\n", meta->configs[i].raid.flags);
4129 printf(" total_sectors %u\n",
4130 meta->configs[i].raid.total_sectors);
4131 }
4132 printf("disk_number 0x%02x\n", meta->disk_number);
4133 printf("raid_number 0x%02x\n", meta->raid_number);
4134 printf("timestamp 0x%08x\n", meta->timestamp);
4135 printf("=================================================\n");
4136}
4137
4138static char *
4139ata_raid_lsiv3_type(int type)
4140{
4141 static char buffer[16];
4142
4143 switch (type) {
4144 case LSIV3_T_RAID0: return "RAID0";
4145 case LSIV3_T_RAID1: return "RAID1";
4146 default: sprintf(buffer, "UNKNOWN 0x%02x", type);
4147 return buffer;
4148 }
4149}
4150
4151static void
4152ata_raid_lsiv3_print_meta(struct lsiv3_raid_conf *meta)
4153{
4154 int i;
4155
4156 printf("******* ATA LSILogic V3 MegaRAID Metadata *******\n");
4157 printf("lsi_id <%.6s>\n", meta->lsi_id);
4158 printf("dummy_0 0x%04x\n", meta->dummy_0);
4159 printf("version 0x%04x\n", meta->version);
4160 printf("dummy_0 0x%04x\n", meta->dummy_1);
4161 printf("RAID configs:\n");
4162 for (i = 0; i < 8; i++) {
4163 if (meta->raid[i].total_disks) {
4164 printf("%02d stripe_pages %u\n", i,
4165 meta->raid[i].stripe_pages);
4166 printf("%02d type %s\n", i,
4167 ata_raid_lsiv3_type(meta->raid[i].type));
4168 printf("%02d total_disks %u\n", i,
4169 meta->raid[i].total_disks);
4170 printf("%02d array_width %u\n", i,
4171 meta->raid[i].array_width);
4172 printf("%02d sectors %u\n", i, meta->raid[i].sectors);
4173 printf("%02d offset %u\n", i, meta->raid[i].offset);
4174 printf("%02d device 0x%02x\n", i,
4175 meta->raid[i].device);
4176 }
4177 }
4178 printf("DISK configs:\n");
4179 for (i = 0; i < 6; i++) {
4180 if (meta->disk[i].disk_sectors) {
4181 printf("%02d disk_sectors %u\n", i,
4182 meta->disk[i].disk_sectors);
4183 printf("%02d flags 0x%02x\n", i, meta->disk[i].flags);
4184 }
4185 }
4186 printf("device 0x%02x\n", meta->device);
4187 printf("timestamp 0x%08x\n", meta->timestamp);
4188 printf("checksum_1 0x%02x\n", meta->checksum_1);
4189 printf("=================================================\n");
4190}
4191
4192static char *
4193ata_raid_nvidia_type(int type)
4194{
4195 static char buffer[16];
4196
4197 switch (type) {
4198 case NV_T_SPAN: return "SPAN";
4199 case NV_T_RAID0: return "RAID0";
4200 case NV_T_RAID1: return "RAID1";
4201 case NV_T_RAID3: return "RAID3";
4202 case NV_T_RAID5: return "RAID5";
4203 case NV_T_RAID01: return "RAID0+1";
4204 default: sprintf(buffer, "UNKNOWN 0x%02x", type);
4205 return buffer;
4206 }
4207}
4208
4209static void
4210ata_raid_nvidia_print_meta(struct nvidia_raid_conf *meta)
4211{
4212 printf("******** ATA nVidia MediaShield Metadata ********\n");
4213 printf("nvidia_id <%.8s>\n", meta->nvidia_id);
4214 printf("config_size %d\n", meta->config_size);
4215 printf("checksum 0x%08x\n", meta->checksum);
4216 printf("version 0x%04x\n", meta->version);
4217 printf("disk_number %d\n", meta->disk_number);
4218 printf("dummy_0 0x%02x\n", meta->dummy_0);
4219 printf("total_sectors %d\n", meta->total_sectors);
4220 printf("sectors_size %d\n", meta->sector_size);
4221 printf("serial %.16s\n", meta->serial);
4222 printf("revision %.4s\n", meta->revision);
4223 printf("dummy_1 0x%08x\n", meta->dummy_1);
4224 printf("magic_0 0x%08x\n", meta->magic_0);
4225 printf("magic_1 0x%016llx\n",(unsigned long long)meta->magic_1);
4226 printf("magic_2 0x%016llx\n",(unsigned long long)meta->magic_2);
4227 printf("flags 0x%02x\n", meta->flags);
4228 printf("array_width %d\n", meta->array_width);
4229 printf("total_disks %d\n", meta->total_disks);
4230 printf("dummy_2 0x%02x\n", meta->dummy_2);
4231 printf("type %s\n", ata_raid_nvidia_type(meta->type));
4232 printf("dummy_3 0x%04x\n", meta->dummy_3);
4233 printf("stripe_sectors %d\n", meta->stripe_sectors);
4234 printf("stripe_bytes %d\n", meta->stripe_bytes);
4235 printf("stripe_shift %d\n", meta->stripe_shift);
4236 printf("stripe_mask 0x%08x\n", meta->stripe_mask);
4237 printf("stripe_sizesectors %d\n", meta->stripe_sizesectors);
4238 printf("stripe_sizebytes %d\n", meta->stripe_sizebytes);
4239 printf("rebuild_lba %d\n", meta->rebuild_lba);
4240 printf("dummy_4 0x%08x\n", meta->dummy_4);
4241 printf("dummy_5 0x%08x\n", meta->dummy_5);
4242 printf("status 0x%08x\n", meta->status);
4243 printf("=================================================\n");
4244}
4245
4246static char *
4247ata_raid_promise_type(int type)
4248{
4249 static char buffer[16];
4250
4251 switch (type) {
4252 case PR_T_RAID0: return "RAID0";
4253 case PR_T_RAID1: return "RAID1";
4254 case PR_T_RAID3: return "RAID3";
4255 case PR_T_RAID5: return "RAID5";
4256 case PR_T_SPAN: return "SPAN";
4257 default: sprintf(buffer, "UNKNOWN 0x%02x", type);
4258 return buffer;
4259 }
4260}
4261
4262static void
4263ata_raid_promise_print_meta(struct promise_raid_conf *meta)
4264{
4265 int i;
4266
4267 printf("********* ATA Promise FastTrak Metadata *********\n");
4268 printf("promise_id <%s>\n", meta->promise_id);
4269 printf("dummy_0 0x%08x\n", meta->dummy_0);
4270 printf("magic_0 0x%016llx\n",(unsigned long long)meta->magic_0);
4271 printf("magic_1 0x%04x\n", meta->magic_1);
4272 printf("magic_2 0x%08x\n", meta->magic_2);
4273 printf("integrity 0x%08x %b\n", meta->raid.integrity,
4274 meta->raid.integrity, "\20\10VALID\n" );
4275 printf("flags 0x%02x %b\n",
4276 meta->raid.flags, meta->raid.flags,
4277 "\20\10READY\7DOWN\6REDIR\5DUPLICATE\4SPARE"
4278 "\3ASSIGNED\2ONLINE\1VALID\n");
4279 printf("disk_number %d\n", meta->raid.disk_number);
4280 printf("channel 0x%02x\n", meta->raid.channel);
4281 printf("device 0x%02x\n", meta->raid.device);
4282 printf("magic_0 0x%016llx\n",
4283 (unsigned long long)meta->raid.magic_0);
4284 printf("disk_offset %u\n", meta->raid.disk_offset);
4285 printf("disk_sectors %u\n", meta->raid.disk_sectors);
4286 printf("rebuild_lba 0x%08x\n", meta->raid.rebuild_lba);
4287 printf("generation 0x%04x\n", meta->raid.generation);
4288 printf("status 0x%02x %b\n",
4289 meta->raid.status, meta->raid.status,
4290 "\20\6MARKED\5DEGRADED\4READY\3INITED\2ONLINE\1VALID\n");
4291 printf("type %s\n", ata_raid_promise_type(meta->raid.type));
4292 printf("total_disks %u\n", meta->raid.total_disks);
4293 printf("stripe_shift %u\n", meta->raid.stripe_shift);
4294 printf("array_width %u\n", meta->raid.array_width);
4295 printf("array_number %u\n", meta->raid.array_number);
4296 printf("total_sectors %u\n", meta->raid.total_sectors);
4297 printf("cylinders %u\n", meta->raid.cylinders);
4298 printf("heads %u\n", meta->raid.heads);
4299 printf("sectors %u\n", meta->raid.sectors);
4300 printf("magic_1 0x%016llx\n",
4301 (unsigned long long)meta->raid.magic_1);
4302 printf("DISK# flags dummy_0 channel device magic_0\n");
4303 for (i = 0; i < 8; i++) {
4304 printf(" %d %b 0x%02x 0x%02x 0x%02x ",
4305 i, meta->raid.disk[i].flags,
4306 "\20\10READY\7DOWN\6REDIR\5DUPLICATE\4SPARE"
4307 "\3ASSIGNED\2ONLINE\1VALID\n", meta->raid.disk[i].dummy_0,
4308 meta->raid.disk[i].channel, meta->raid.disk[i].device);
4309 printf("0x%016llx\n",
4310 (unsigned long long)meta->raid.disk[i].magic_0);
4311 }
4312 printf("checksum 0x%08x\n", meta->checksum);
4313 printf("=================================================\n");
4314}
4315
4316static char *
4317ata_raid_sii_type(int type)
4318{
4319 static char buffer[16];
4320
4321 switch (type) {
4322 case SII_T_RAID0: return "RAID0";
4323 case SII_T_RAID1: return "RAID1";
4324 case SII_T_RAID01: return "RAID0+1";
4325 case SII_T_SPARE: return "SPARE";
4326 default: sprintf(buffer, "UNKNOWN 0x%02x", type);
4327 return buffer;
4328 }
4329}
4330
4331static void
4332ata_raid_sii_print_meta(struct sii_raid_conf *meta)
4333{
4334 printf("******* ATA Silicon Image Medley Metadata *******\n");
4335 printf("total_sectors %llu\n",
4336 (unsigned long long)meta->total_sectors);
4337 printf("dummy_0 0x%04x\n", meta->dummy_0);
4338 printf("dummy_1 0x%04x\n", meta->dummy_1);
4339 printf("controller_pci_id 0x%08x\n", meta->controller_pci_id);
4340 printf("version_minor 0x%04x\n", meta->version_minor);
4341 printf("version_major 0x%04x\n", meta->version_major);
4342 printf("timestamp 20%02x/%02x/%02x %02x:%02x:%02x\n",
4343 meta->timestamp[5], meta->timestamp[4], meta->timestamp[3],
4344 meta->timestamp[2], meta->timestamp[1], meta->timestamp[0]);
4345 printf("stripe_sectors %u\n", meta->stripe_sectors);
4346 printf("dummy_2 0x%04x\n", meta->dummy_2);
4347 printf("disk_number %u\n", meta->disk_number);
4348 printf("type %s\n", ata_raid_sii_type(meta->type));
4349 printf("raid0_disks %u\n", meta->raid0_disks);
4350 printf("raid0_ident %u\n", meta->raid0_ident);
4351 printf("raid1_disks %u\n", meta->raid1_disks);
4352 printf("raid1_ident %u\n", meta->raid1_ident);
4353 printf("rebuild_lba %llu\n", (unsigned long long)meta->rebuild_lba);
4354 printf("generation 0x%08x\n", meta->generation);
4355 printf("status 0x%02x %b\n",
4356 meta->status, meta->status,
4357 "\20\1READY\n");
4358 printf("base_raid1_position %02x\n", meta->base_raid1_position);
4359 printf("base_raid0_position %02x\n", meta->base_raid0_position);
4360 printf("position %02x\n", meta->position);
4361 printf("dummy_3 %04x\n", meta->dummy_3);
4362 printf("name <%.16s>\n", meta->name);
4363 printf("checksum_0 0x%04x\n", meta->checksum_0);
4364 printf("checksum_1 0x%04x\n", meta->checksum_1);
4365 printf("=================================================\n");
4366}
4367
4368static char *
4369ata_raid_sis_type(int type)
4370{
4371 static char buffer[16];
4372
4373 switch (type) {
4374 case SIS_T_JBOD: return "JBOD";
4375 case SIS_T_RAID0: return "RAID0";
4376 case SIS_T_RAID1: return "RAID1";
4377 default: sprintf(buffer, "UNKNOWN 0x%02x", type);
4378 return buffer;
4379 }
4380}
4381
4382static void
4383ata_raid_sis_print_meta(struct sis_raid_conf *meta)
4384{
4385 printf("**** ATA Silicon Integrated Systems Metadata ****\n");
4386 printf("magic 0x%04x\n", meta->magic);
4387 printf("disks 0x%02x\n", meta->disks);
4388 printf("type %s\n",
4389 ata_raid_sis_type(meta->type_total_disks & SIS_T_MASK));
4390 printf("total_disks %u\n", meta->type_total_disks & SIS_D_MASK);
4391 printf("dummy_0 0x%08x\n", meta->dummy_0);
4392 printf("controller_pci_id 0x%08x\n", meta->controller_pci_id);
4393 printf("stripe_sectors %u\n", meta->stripe_sectors);
4394 printf("dummy_1 0x%04x\n", meta->dummy_1);
4395 printf("timestamp 0x%08x\n", meta->timestamp);
4396 printf("model %.40s\n", meta->model);
4397 printf("disk_number %u\n", meta->disk_number);
4398 printf("dummy_2 0x%02x 0x%02x 0x%02x\n",
4399 meta->dummy_2[0], meta->dummy_2[1], meta->dummy_2[2]);
4400 printf("=================================================\n");
4401}
4402
4403static char *
4404ata_raid_via_type(int type)
4405{
4406 static char buffer[16];
4407
4408 switch (type) {
4409 case VIA_T_RAID0: return "RAID0";
4410 case VIA_T_RAID1: return "RAID1";
4411 case VIA_T_RAID5: return "RAID5";
4412 case VIA_T_RAID01: return "RAID0+1";
4413 case VIA_T_SPAN: return "SPAN";
4414 default: sprintf(buffer, "UNKNOWN 0x%02x", type);
4415 return buffer;
4416 }
4417}
4418
4419static void
4420ata_raid_via_print_meta(struct via_raid_conf *meta)
4421{
4422 int i;
4423
4424 printf("*************** ATA VIA Metadata ****************\n");
4425 printf("magic 0x%02x\n", meta->magic);
4426 printf("dummy_0 0x%02x\n", meta->dummy_0);
4427 printf("type %s\n",
4428 ata_raid_via_type(meta->type & VIA_T_MASK));
4429 printf("bootable %d\n", meta->type & VIA_T_BOOTABLE);
4430 printf("unknown %d\n", meta->type & VIA_T_UNKNOWN);
4431 printf("disk_index 0x%02x\n", meta->disk_index);
3654static struct ata_request *
3655ata_raid_init_request(struct ar_softc *rdp, struct bio *bio)
3656{
3657 struct ata_request *request;
3658
3659 if (!(request = ata_alloc_request())) {
3660 printf("FAILURE - out of memory in ata_raid_init_request\n");
3661 return NULL;
3662 }
3663 request->timeout = 5;
3664 request->retries = 2;
3665 request->callback = ata_raid_done;
3666 request->driver = rdp;
3667 request->bio = bio;
3668 switch (request->bio->bio_cmd) {
3669 case BIO_READ:
3670 request->flags = ATA_R_READ;
3671 break;
3672 case BIO_WRITE:
3673 request->flags = ATA_R_WRITE;
3674 break;
3675 }
3676 return request;
3677}
3678
3679static int
3680ata_raid_send_request(struct ata_request *request)
3681{
3682 struct ata_device *atadev = device_get_softc(request->dev);
3683
3684 request->transfersize = min(request->bytecount, atadev->max_iosize);
3685 if (request->flags & ATA_R_READ) {
3686 if (atadev->mode >= ATA_DMA) {
3687 request->flags |= ATA_R_DMA;
3688 request->u.ata.command = ATA_READ_DMA;
3689 }
3690 else if (atadev->max_iosize > DEV_BSIZE)
3691 request->u.ata.command = ATA_READ_MUL;
3692 else
3693 request->u.ata.command = ATA_READ;
3694 }
3695 else if (request->flags & ATA_R_WRITE) {
3696 if (atadev->mode >= ATA_DMA) {
3697 request->flags |= ATA_R_DMA;
3698 request->u.ata.command = ATA_WRITE_DMA;
3699 }
3700 else if (atadev->max_iosize > DEV_BSIZE)
3701 request->u.ata.command = ATA_WRITE_MUL;
3702 else
3703 request->u.ata.command = ATA_WRITE;
3704 }
3705 else {
3706 device_printf(request->dev, "FAILURE - unknown IO operation\n");
3707 ata_free_request(request);
3708 return EIO;
3709 }
3710 request->flags |= (ATA_R_ORDERED | ATA_R_THREAD);
3711 ata_queue_request(request);
3712 return 0;
3713}
3714
3715static int
3716ata_raid_rw(device_t dev, u_int64_t lba, void *data, u_int bcount, int flags)
3717{
3718 struct ata_device *atadev = device_get_softc(dev);
3719 struct ata_request *request;
3720 int error;
3721
3722 if (bcount % DEV_BSIZE) {
3723 device_printf(dev, "FAILURE - transfers must be modulo sectorsize\n");
3724 return ENOMEM;
3725 }
3726
3727 if (!(request = ata_alloc_request())) {
3728 device_printf(dev, "FAILURE - out of memory in ata_raid_rw\n");
3729 return ENOMEM;
3730 }
3731
3732 /* setup request */
3733 request->dev = dev;
3734 request->timeout = 10;
3735 request->retries = 0;
3736 request->data = data;
3737 request->bytecount = bcount;
3738 request->transfersize = DEV_BSIZE;
3739 request->u.ata.lba = lba;
3740 request->u.ata.count = request->bytecount / DEV_BSIZE;
3741 request->flags = flags;
3742
3743 if (flags & ATA_R_READ) {
3744 if (atadev->mode >= ATA_DMA) {
3745 request->u.ata.command = ATA_READ_DMA;
3746 request->flags |= ATA_R_DMA;
3747 }
3748 else
3749 request->u.ata.command = ATA_READ;
3750 ata_queue_request(request);
3751 }
3752 else if (flags & ATA_R_WRITE) {
3753 if (atadev->mode >= ATA_DMA) {
3754 request->u.ata.command = ATA_WRITE_DMA;
3755 request->flags |= ATA_R_DMA;
3756 }
3757 else
3758 request->u.ata.command = ATA_WRITE;
3759 ata_queue_request(request);
3760 }
3761 else {
3762 device_printf(dev, "FAILURE - unknown IO operation\n");
3763 request->result = EIO;
3764 }
3765 error = request->result;
3766 ata_free_request(request);
3767 return error;
3768}
3769
3770/*
3771 * module handeling
3772 */
3773static int
3774ata_raid_subdisk_probe(device_t dev)
3775{
3776 device_quiet(dev);
3777 return 0;
3778}
3779
3780static int
3781ata_raid_subdisk_attach(device_t dev)
3782{
3783 struct ata_raid_subdisk *ars = device_get_softc(dev);
3784 int volume;
3785
3786 for (volume = 0; volume < MAX_VOLUMES; volume++) {
3787 ars->raid[volume] = NULL;
3788 ars->disk_number[volume] = -1;
3789 }
3790 ata_raid_read_metadata(dev);
3791 return 0;
3792}
3793
3794static int
3795ata_raid_subdisk_detach(device_t dev)
3796{
3797 struct ata_raid_subdisk *ars = device_get_softc(dev);
3798 int volume;
3799
3800 for (volume = 0; volume < MAX_VOLUMES; volume++) {
3801 if (ars->raid[volume]) {
3802 ars->raid[volume]->disks[ars->disk_number[volume]].flags &=
3803 ~(AR_DF_PRESENT | AR_DF_ONLINE);
3804 ars->raid[volume]->disks[ars->disk_number[volume]].dev = NULL;
3805 ata_raid_config_changed(ars->raid[volume], 1);
3806 ars->raid[volume] = NULL;
3807 ars->disk_number[volume] = -1;
3808 }
3809 }
3810 return 0;
3811}
3812
3813static device_method_t ata_raid_sub_methods[] = {
3814 /* device interface */
3815 DEVMETHOD(device_probe, ata_raid_subdisk_probe),
3816 DEVMETHOD(device_attach, ata_raid_subdisk_attach),
3817 DEVMETHOD(device_detach, ata_raid_subdisk_detach),
3818 { 0, 0 }
3819};
3820
3821static driver_t ata_raid_sub_driver = {
3822 "subdisk",
3823 ata_raid_sub_methods,
3824 sizeof(struct ata_raid_subdisk)
3825};
3826
3827DRIVER_MODULE(subdisk, ad, ata_raid_sub_driver, ata_raid_sub_devclass, NULL, NULL);
3828
3829static int
3830ata_raid_module_event_handler(module_t mod, int what, void *arg)
3831{
3832 int i;
3833
3834 switch (what) {
3835 case MOD_LOAD:
3836 if (testing || bootverbose)
3837 printf("ATA PseudoRAID loaded\n");
3838#if 0
3839 /* setup table to hold metadata for all ATA PseudoRAID arrays */
3840 ata_raid_arrays = malloc(sizeof(struct ar_soft *) * MAX_ARRAYS,
3841 M_AR, M_NOWAIT | M_ZERO);
3842 if (!ata_raid_arrays) {
3843 printf("ataraid: no memory for metadata storage\n");
3844 return ENOMEM;
3845 }
3846#endif
3847 /* attach found PseudoRAID arrays */
3848 for (i = 0; i < MAX_ARRAYS; i++) {
3849 struct ar_softc *rdp = ata_raid_arrays[i];
3850
3851 if (!rdp || !rdp->format)
3852 continue;
3853 if (testing || bootverbose)
3854 ata_raid_print_meta(rdp);
3855 ata_raid_attach(rdp, 0);
3856 }
3857 ata_raid_ioctl_func = ata_raid_ioctl;
3858 return 0;
3859
3860 case MOD_UNLOAD:
3861 /* detach found PseudoRAID arrays */
3862 for (i = 0; i < MAX_ARRAYS; i++) {
3863 struct ar_softc *rdp = ata_raid_arrays[i];
3864
3865 if (!rdp || !rdp->status)
3866 continue;
3867 disk_destroy(rdp->disk);
3868 }
3869 if (testing || bootverbose)
3870 printf("ATA PseudoRAID unloaded\n");
3871#if 0
3872 free(ata_raid_arrays, M_AR);
3873#endif
3874 ata_raid_ioctl_func = NULL;
3875 return 0;
3876
3877 default:
3878 return EOPNOTSUPP;
3879 }
3880}
3881
3882static moduledata_t ata_raid_moduledata =
3883 { "ataraid", ata_raid_module_event_handler, NULL };
3884DECLARE_MODULE(ata, ata_raid_moduledata, SI_SUB_RAID, SI_ORDER_FIRST);
3885MODULE_VERSION(ataraid, 1);
3886MODULE_DEPEND(ataraid, ata, 1, 1, 1);
3887MODULE_DEPEND(ataraid, ad, 1, 1, 1);
3888
3889static char *
3890ata_raid_format(struct ar_softc *rdp)
3891{
3892 switch (rdp->format) {
3893 case AR_F_FREEBSD_RAID: return "FreeBSD PseudoRAID";
3894 case AR_F_ADAPTEC_RAID: return "Adaptec HostRAID";
3895 case AR_F_HPTV2_RAID: return "HighPoint v2 RocketRAID";
3896 case AR_F_HPTV3_RAID: return "HighPoint v3 RocketRAID";
3897 case AR_F_INTEL_RAID: return "Intel MatrixRAID";
3898 case AR_F_ITE_RAID: return "Integrated Technology Express";
3899 case AR_F_LSIV2_RAID: return "LSILogic v2 MegaRAID";
3900 case AR_F_LSIV3_RAID: return "LSILogic v3 MegaRAID";
3901 case AR_F_NVIDIA_RAID: return "nVidia MediaShield";
3902 case AR_F_PROMISE_RAID: return "Promise Fasttrak";
3903 case AR_F_SII_RAID: return "Silicon Image Medley";
3904 case AR_F_SIS_RAID: return "Silicon Integrated Systems";
3905 case AR_F_VIA_RAID: return "VIA Tech V-RAID";
3906 default: return "UNKNOWN";
3907 }
3908}
3909
3910static char *
3911ata_raid_type(struct ar_softc *rdp)
3912{
3913 switch (rdp->type) {
3914 case AR_T_JBOD: return "JBOD";
3915 case AR_T_SPAN: return "SPAN";
3916 case AR_T_RAID0: return "RAID0";
3917 case AR_T_RAID1: return "RAID1";
3918 case AR_T_RAID3: return "RAID3";
3919 case AR_T_RAID4: return "RAID4";
3920 case AR_T_RAID5: return "RAID5";
3921 case AR_T_RAID01: return "RAID0+1";
3922 default: return "UNKNOWN";
3923 }
3924}
3925
3926static char *
3927ata_raid_flags(struct ar_softc *rdp)
3928{
3929 switch (rdp->status & (AR_S_READY | AR_S_DEGRADED | AR_S_REBUILDING)) {
3930 case AR_S_READY: return "READY";
3931 case AR_S_READY | AR_S_DEGRADED: return "DEGRADED";
3932 case AR_S_READY | AR_S_REBUILDING:
3933 case AR_S_READY | AR_S_DEGRADED | AR_S_REBUILDING: return "REBUILDING";
3934 default: return "BROKEN";
3935 }
3936}
3937
3938/* debugging gunk */
3939static void
3940ata_raid_print_meta(struct ar_softc *raid)
3941{
3942 int i;
3943
3944 printf("********** ATA PseudoRAID ar%d Metadata **********\n", raid->lun);
3945 printf("=================================================\n");
3946 printf("format %s\n", ata_raid_format(raid));
3947 printf("type %s\n", ata_raid_type(raid));
3948 printf("flags 0x%02x %b\n", raid->status, raid->status,
3949 "\20\3REBUILDING\2DEGRADED\1READY\n");
3950 printf("magic_0 0x%016llx\n",(unsigned long long)raid->magic_0);
3951 printf("magic_1 0x%016llx\n",(unsigned long long)raid->magic_1);
3952 printf("generation %u\n", raid->generation);
3953 printf("total_sectors %llu\n",
3954 (unsigned long long)raid->total_sectors);
3955 printf("offset_sectors %llu\n",
3956 (unsigned long long)raid->offset_sectors);
3957 printf("heads %u\n", raid->heads);
3958 printf("sectors %u\n", raid->sectors);
3959 printf("cylinders %u\n", raid->cylinders);
3960 printf("width %u\n", raid->width);
3961 printf("interleave %u\n", raid->interleave);
3962 printf("total_disks %u\n", raid->total_disks);
3963 for (i = 0; i < raid->total_disks; i++) {
3964 printf(" disk %d: flags = 0x%02x %b\n", i, raid->disks[i].flags,
3965 raid->disks[i].flags, "\20\4ONLINE\3SPARE\2ASSIGNED\1PRESENT\n");
3966 if (raid->disks[i].dev) {
3967 printf(" ");
3968 device_printf(raid->disks[i].dev, " sectors %lld\n",
3969 (long long)raid->disks[i].sectors);
3970 }
3971 }
3972 printf("=================================================\n");
3973}
3974
3975static char *
3976ata_raid_adaptec_type(int type)
3977{
3978 static char buffer[16];
3979
3980 switch (type) {
3981 case ADP_T_RAID0: return "RAID0";
3982 case ADP_T_RAID1: return "RAID1";
3983 default: sprintf(buffer, "UNKNOWN 0x%02x", type);
3984 return buffer;
3985 }
3986}
3987
3988static void
3989ata_raid_adaptec_print_meta(struct adaptec_raid_conf *meta)
3990{
3991 int i;
3992
3993 printf("********* ATA Adaptec HostRAID Metadata *********\n");
3994 printf("magic_0 <0x%08x>\n", be32toh(meta->magic_0));
3995 printf("generation 0x%08x\n", be32toh(meta->generation));
3996 printf("dummy_0 0x%04x\n", be16toh(meta->dummy_0));
3997 printf("total_configs %u\n", be16toh(meta->total_configs));
3998 printf("dummy_1 0x%04x\n", be16toh(meta->dummy_1));
3999 printf("checksum 0x%04x\n", be16toh(meta->checksum));
4000 printf("dummy_2 0x%08x\n", be32toh(meta->dummy_2));
4001 printf("dummy_3 0x%08x\n", be32toh(meta->dummy_3));
4002 printf("flags 0x%08x\n", be32toh(meta->flags));
4003 printf("timestamp 0x%08x\n", be32toh(meta->timestamp));
4004 printf("dummy_4 0x%08x 0x%08x 0x%08x 0x%08x\n",
4005 be32toh(meta->dummy_4[0]), be32toh(meta->dummy_4[1]),
4006 be32toh(meta->dummy_4[2]), be32toh(meta->dummy_4[3]));
4007 printf("dummy_5 0x%08x 0x%08x 0x%08x 0x%08x\n",
4008 be32toh(meta->dummy_5[0]), be32toh(meta->dummy_5[1]),
4009 be32toh(meta->dummy_5[2]), be32toh(meta->dummy_5[3]));
4010
4011 for (i = 0; i < be16toh(meta->total_configs); i++) {
4012 printf(" %d total_disks %u\n", i,
4013 be16toh(meta->configs[i].disk_number));
4014 printf(" %d generation %u\n", i,
4015 be16toh(meta->configs[i].generation));
4016 printf(" %d magic_0 0x%08x\n", i,
4017 be32toh(meta->configs[i].magic_0));
4018 printf(" %d dummy_0 0x%02x\n", i, meta->configs[i].dummy_0);
4019 printf(" %d type %s\n", i,
4020 ata_raid_adaptec_type(meta->configs[i].type));
4021 printf(" %d dummy_1 0x%02x\n", i, meta->configs[i].dummy_1);
4022 printf(" %d flags %d\n", i,
4023 be32toh(meta->configs[i].flags));
4024 printf(" %d dummy_2 0x%02x\n", i, meta->configs[i].dummy_2);
4025 printf(" %d dummy_3 0x%02x\n", i, meta->configs[i].dummy_3);
4026 printf(" %d dummy_4 0x%02x\n", i, meta->configs[i].dummy_4);
4027 printf(" %d dummy_5 0x%02x\n", i, meta->configs[i].dummy_5);
4028 printf(" %d disk_number %u\n", i,
4029 be32toh(meta->configs[i].disk_number));
4030 printf(" %d dummy_6 0x%08x\n", i,
4031 be32toh(meta->configs[i].dummy_6));
4032 printf(" %d sectors %u\n", i,
4033 be32toh(meta->configs[i].sectors));
4034 printf(" %d stripe_shift %u\n", i,
4035 be16toh(meta->configs[i].stripe_shift));
4036 printf(" %d dummy_7 0x%08x\n", i,
4037 be32toh(meta->configs[i].dummy_7));
4038 printf(" %d dummy_8 0x%08x 0x%08x 0x%08x 0x%08x\n", i,
4039 be32toh(meta->configs[i].dummy_8[0]),
4040 be32toh(meta->configs[i].dummy_8[1]),
4041 be32toh(meta->configs[i].dummy_8[2]),
4042 be32toh(meta->configs[i].dummy_8[3]));
4043 printf(" %d name <%s>\n", i, meta->configs[i].name);
4044 }
4045 printf("magic_1 <0x%08x>\n", be32toh(meta->magic_1));
4046 printf("magic_2 <0x%08x>\n", be32toh(meta->magic_2));
4047 printf("magic_3 <0x%08x>\n", be32toh(meta->magic_3));
4048 printf("magic_4 <0x%08x>\n", be32toh(meta->magic_4));
4049 printf("=================================================\n");
4050}
4051
4052static char *
4053ata_raid_hptv2_type(int type)
4054{
4055 static char buffer[16];
4056
4057 switch (type) {
4058 case HPTV2_T_RAID0: return "RAID0";
4059 case HPTV2_T_RAID1: return "RAID1";
4060 case HPTV2_T_RAID01_RAID0: return "RAID01_RAID0";
4061 case HPTV2_T_SPAN: return "SPAN";
4062 case HPTV2_T_RAID_3: return "RAID3";
4063 case HPTV2_T_RAID_5: return "RAID5";
4064 case HPTV2_T_JBOD: return "JBOD";
4065 case HPTV2_T_RAID01_RAID1: return "RAID01_RAID1";
4066 default: sprintf(buffer, "UNKNOWN 0x%02x", type);
4067 return buffer;
4068 }
4069}
4070
4071static void
4072ata_raid_hptv2_print_meta(struct hptv2_raid_conf *meta)
4073{
4074 int i;
4075
4076 printf("****** ATA Highpoint V2 RocketRAID Metadata *****\n");
4077 printf("magic 0x%08x\n", meta->magic);
4078 printf("magic_0 0x%08x\n", meta->magic_0);
4079 printf("magic_1 0x%08x\n", meta->magic_1);
4080 printf("order 0x%08x\n", meta->order);
4081 printf("array_width %u\n", meta->array_width);
4082 printf("stripe_shift %u\n", meta->stripe_shift);
4083 printf("type %s\n", ata_raid_hptv2_type(meta->type));
4084 printf("disk_number %u\n", meta->disk_number);
4085 printf("total_sectors %u\n", meta->total_sectors);
4086 printf("disk_mode 0x%08x\n", meta->disk_mode);
4087 printf("boot_mode 0x%08x\n", meta->boot_mode);
4088 printf("boot_disk 0x%02x\n", meta->boot_disk);
4089 printf("boot_protect 0x%02x\n", meta->boot_protect);
4090 printf("log_entries 0x%02x\n", meta->error_log_entries);
4091 printf("log_index 0x%02x\n", meta->error_log_index);
4092 if (meta->error_log_entries) {
4093 printf(" timestamp reason disk status sectors lba\n");
4094 for (i = meta->error_log_index;
4095 i < meta->error_log_index + meta->error_log_entries; i++)
4096 printf(" 0x%08x 0x%02x 0x%02x 0x%02x 0x%02x 0x%08x\n",
4097 meta->errorlog[i%32].timestamp,
4098 meta->errorlog[i%32].reason,
4099 meta->errorlog[i%32].disk, meta->errorlog[i%32].status,
4100 meta->errorlog[i%32].sectors, meta->errorlog[i%32].lba);
4101 }
4102 printf("rebuild_lba 0x%08x\n", meta->rebuild_lba);
4103 printf("dummy_1 0x%02x\n", meta->dummy_1);
4104 printf("name_1 <%.15s>\n", meta->name_1);
4105 printf("dummy_2 0x%02x\n", meta->dummy_2);
4106 printf("name_2 <%.15s>\n", meta->name_2);
4107 printf("=================================================\n");
4108}
4109
4110static char *
4111ata_raid_hptv3_type(int type)
4112{
4113 static char buffer[16];
4114
4115 switch (type) {
4116 case HPTV3_T_SPARE: return "SPARE";
4117 case HPTV3_T_JBOD: return "JBOD";
4118 case HPTV3_T_SPAN: return "SPAN";
4119 case HPTV3_T_RAID0: return "RAID0";
4120 case HPTV3_T_RAID1: return "RAID1";
4121 case HPTV3_T_RAID3: return "RAID3";
4122 case HPTV3_T_RAID5: return "RAID5";
4123 default: sprintf(buffer, "UNKNOWN 0x%02x", type);
4124 return buffer;
4125 }
4126}
4127
4128static void
4129ata_raid_hptv3_print_meta(struct hptv3_raid_conf *meta)
4130{
4131 int i;
4132
4133 printf("****** ATA Highpoint V3 RocketRAID Metadata *****\n");
4134 printf("magic 0x%08x\n", meta->magic);
4135 printf("magic_0 0x%08x\n", meta->magic_0);
4136 printf("checksum_0 0x%02x\n", meta->checksum_0);
4137 printf("mode 0x%02x\n", meta->mode);
4138 printf("user_mode 0x%02x\n", meta->user_mode);
4139 printf("config_entries 0x%02x\n", meta->config_entries);
4140 for (i = 0; i < meta->config_entries; i++) {
4141 printf("config %d:\n", i);
4142 printf(" total_sectors %llu\n",
4143 (unsigned long long)(meta->configs[0].total_sectors +
4144 ((u_int64_t)meta->configs_high[0].total_sectors << 32)));
4145 printf(" type %s\n",
4146 ata_raid_hptv3_type(meta->configs[i].type));
4147 printf(" total_disks %u\n", meta->configs[i].total_disks);
4148 printf(" disk_number %u\n", meta->configs[i].disk_number);
4149 printf(" stripe_shift %u\n", meta->configs[i].stripe_shift);
4150 printf(" status %b\n", meta->configs[i].status,
4151 "\20\2RAID5\1NEED_REBUILD\n");
4152 printf(" critical_disks %u\n", meta->configs[i].critical_disks);
4153 printf(" rebuild_lba %llu\n",
4154 (unsigned long long)(meta->configs_high[0].rebuild_lba +
4155 ((u_int64_t)meta->configs_high[0].rebuild_lba << 32)));
4156 }
4157 printf("name <%.16s>\n", meta->name);
4158 printf("timestamp 0x%08x\n", meta->timestamp);
4159 printf("description <%.16s>\n", meta->description);
4160 printf("creator <%.16s>\n", meta->creator);
4161 printf("checksum_1 0x%02x\n", meta->checksum_1);
4162 printf("dummy_0 0x%02x\n", meta->dummy_0);
4163 printf("dummy_1 0x%02x\n", meta->dummy_1);
4164 printf("flags %b\n", meta->flags,
4165 "\20\4RCACHE\3WCACHE\2NCQ\1TCQ\n");
4166 printf("=================================================\n");
4167}
4168
4169static char *
4170ata_raid_intel_type(int type)
4171{
4172 static char buffer[16];
4173
4174 switch (type) {
4175 case INTEL_T_RAID0: return "RAID0";
4176 case INTEL_T_RAID1: return "RAID1";
4177 case INTEL_T_RAID5: return "RAID5";
4178 default: sprintf(buffer, "UNKNOWN 0x%02x", type);
4179 return buffer;
4180 }
4181}
4182
4183static void
4184ata_raid_intel_print_meta(struct intel_raid_conf *meta)
4185{
4186 struct intel_raid_mapping *map;
4187 int i, j;
4188
4189 printf("********* ATA Intel MatrixRAID Metadata *********\n");
4190 printf("intel_id <%.24s>\n", meta->intel_id);
4191 printf("version <%.6s>\n", meta->version);
4192 printf("checksum 0x%08x\n", meta->checksum);
4193 printf("config_size 0x%08x\n", meta->config_size);
4194 printf("config_id 0x%08x\n", meta->config_id);
4195 printf("generation 0x%08x\n", meta->generation);
4196 printf("total_disks %u\n", meta->total_disks);
4197 printf("total_volumes %u\n", meta->total_volumes);
4198 printf("DISK# serial disk_sectors disk_id flags\n");
4199 for (i = 0; i < meta->total_disks; i++ ) {
4200 printf(" %d <%.16s> %u 0x%08x 0x%08x\n", i,
4201 meta->disk[i].serial, meta->disk[i].sectors,
4202 meta->disk[i].id, meta->disk[i].flags);
4203 }
4204 map = (struct intel_raid_mapping *)&meta->disk[meta->total_disks];
4205 for (j = 0; j < meta->total_volumes; j++) {
4206 printf("name %.16s\n", map->name);
4207 printf("total_sectors %llu\n",
4208 (unsigned long long)map->total_sectors);
4209 printf("state %u\n", map->state);
4210 printf("reserved %u\n", map->reserved);
4211 printf("offset %u\n", map->offset);
4212 printf("disk_sectors %u\n", map->disk_sectors);
4213 printf("stripe_count %u\n", map->stripe_count);
4214 printf("stripe_sectors %u\n", map->stripe_sectors);
4215 printf("status %u\n", map->status);
4216 printf("type %s\n", ata_raid_intel_type(map->type));
4217 printf("total_disks %u\n", map->total_disks);
4218 printf("magic[0] 0x%02x\n", map->magic[0]);
4219 printf("magic[1] 0x%02x\n", map->magic[1]);
4220 printf("magic[2] 0x%02x\n", map->magic[2]);
4221 for (i = 0; i < map->total_disks; i++ ) {
4222 printf(" disk %d at disk_idx 0x%08x\n", i, map->disk_idx[i]);
4223 }
4224 map = (struct intel_raid_mapping *)&map->disk_idx[map->total_disks];
4225 }
4226 printf("=================================================\n");
4227}
4228
4229static char *
4230ata_raid_ite_type(int type)
4231{
4232 static char buffer[16];
4233
4234 switch (type) {
4235 case ITE_T_RAID0: return "RAID0";
4236 case ITE_T_RAID1: return "RAID1";
4237 case ITE_T_RAID01: return "RAID0+1";
4238 case ITE_T_SPAN: return "SPAN";
4239 default: sprintf(buffer, "UNKNOWN 0x%02x", type);
4240 return buffer;
4241 }
4242}
4243
4244static void
4245ata_raid_ite_print_meta(struct ite_raid_conf *meta)
4246{
4247 printf("*** ATA Integrated Technology Express Metadata **\n");
4248 printf("ite_id <%.40s>\n", meta->ite_id);
4249 printf("timestamp_0 %04x/%02x/%02x %02x:%02x:%02x.%02x\n",
4250 *((u_int16_t *)meta->timestamp_0), meta->timestamp_0[2],
4251 meta->timestamp_0[3], meta->timestamp_0[5], meta->timestamp_0[4],
4252 meta->timestamp_0[7], meta->timestamp_0[6]);
4253 printf("total_sectors %lld\n",
4254 (unsigned long long)meta->total_sectors);
4255 printf("type %s\n", ata_raid_ite_type(meta->type));
4256 printf("stripe_1kblocks %u\n", meta->stripe_1kblocks);
4257 printf("timestamp_1 %04x/%02x/%02x %02x:%02x:%02x.%02x\n",
4258 *((u_int16_t *)meta->timestamp_1), meta->timestamp_1[2],
4259 meta->timestamp_1[3], meta->timestamp_1[5], meta->timestamp_1[4],
4260 meta->timestamp_1[7], meta->timestamp_1[6]);
4261 printf("stripe_sectors %u\n", meta->stripe_sectors);
4262 printf("array_width %u\n", meta->array_width);
4263 printf("disk_number %u\n", meta->disk_number);
4264 printf("disk_sectors %u\n", meta->disk_sectors);
4265 printf("=================================================\n");
4266}
4267
4268static char *
4269ata_raid_lsiv2_type(int type)
4270{
4271 static char buffer[16];
4272
4273 switch (type) {
4274 case LSIV2_T_RAID0: return "RAID0";
4275 case LSIV2_T_RAID1: return "RAID1";
4276 case LSIV2_T_SPARE: return "SPARE";
4277 default: sprintf(buffer, "UNKNOWN 0x%02x", type);
4278 return buffer;
4279 }
4280}
4281
4282static void
4283ata_raid_lsiv2_print_meta(struct lsiv2_raid_conf *meta)
4284{
4285 int i;
4286
4287 printf("******* ATA LSILogic V2 MegaRAID Metadata *******\n");
4288 printf("lsi_id <%s>\n", meta->lsi_id);
4289 printf("dummy_0 0x%02x\n", meta->dummy_0);
4290 printf("flags 0x%02x\n", meta->flags);
4291 printf("version 0x%04x\n", meta->version);
4292 printf("config_entries 0x%02x\n", meta->config_entries);
4293 printf("raid_count 0x%02x\n", meta->raid_count);
4294 printf("total_disks 0x%02x\n", meta->total_disks);
4295 printf("dummy_1 0x%02x\n", meta->dummy_1);
4296 printf("dummy_2 0x%04x\n", meta->dummy_2);
4297 for (i = 0; i < meta->config_entries; i++) {
4298 printf(" type %s\n",
4299 ata_raid_lsiv2_type(meta->configs[i].raid.type));
4300 printf(" dummy_0 %02x\n", meta->configs[i].raid.dummy_0);
4301 printf(" stripe_sectors %u\n",
4302 meta->configs[i].raid.stripe_sectors);
4303 printf(" array_width %u\n",
4304 meta->configs[i].raid.array_width);
4305 printf(" disk_count %u\n", meta->configs[i].raid.disk_count);
4306 printf(" config_offset %u\n",
4307 meta->configs[i].raid.config_offset);
4308 printf(" dummy_1 %u\n", meta->configs[i].raid.dummy_1);
4309 printf(" flags %02x\n", meta->configs[i].raid.flags);
4310 printf(" total_sectors %u\n",
4311 meta->configs[i].raid.total_sectors);
4312 }
4313 printf("disk_number 0x%02x\n", meta->disk_number);
4314 printf("raid_number 0x%02x\n", meta->raid_number);
4315 printf("timestamp 0x%08x\n", meta->timestamp);
4316 printf("=================================================\n");
4317}
4318
4319static char *
4320ata_raid_lsiv3_type(int type)
4321{
4322 static char buffer[16];
4323
4324 switch (type) {
4325 case LSIV3_T_RAID0: return "RAID0";
4326 case LSIV3_T_RAID1: return "RAID1";
4327 default: sprintf(buffer, "UNKNOWN 0x%02x", type);
4328 return buffer;
4329 }
4330}
4331
4332static void
4333ata_raid_lsiv3_print_meta(struct lsiv3_raid_conf *meta)
4334{
4335 int i;
4336
4337 printf("******* ATA LSILogic V3 MegaRAID Metadata *******\n");
4338 printf("lsi_id <%.6s>\n", meta->lsi_id);
4339 printf("dummy_0 0x%04x\n", meta->dummy_0);
4340 printf("version 0x%04x\n", meta->version);
4341 printf("dummy_0 0x%04x\n", meta->dummy_1);
4342 printf("RAID configs:\n");
4343 for (i = 0; i < 8; i++) {
4344 if (meta->raid[i].total_disks) {
4345 printf("%02d stripe_pages %u\n", i,
4346 meta->raid[i].stripe_pages);
4347 printf("%02d type %s\n", i,
4348 ata_raid_lsiv3_type(meta->raid[i].type));
4349 printf("%02d total_disks %u\n", i,
4350 meta->raid[i].total_disks);
4351 printf("%02d array_width %u\n", i,
4352 meta->raid[i].array_width);
4353 printf("%02d sectors %u\n", i, meta->raid[i].sectors);
4354 printf("%02d offset %u\n", i, meta->raid[i].offset);
4355 printf("%02d device 0x%02x\n", i,
4356 meta->raid[i].device);
4357 }
4358 }
4359 printf("DISK configs:\n");
4360 for (i = 0; i < 6; i++) {
4361 if (meta->disk[i].disk_sectors) {
4362 printf("%02d disk_sectors %u\n", i,
4363 meta->disk[i].disk_sectors);
4364 printf("%02d flags 0x%02x\n", i, meta->disk[i].flags);
4365 }
4366 }
4367 printf("device 0x%02x\n", meta->device);
4368 printf("timestamp 0x%08x\n", meta->timestamp);
4369 printf("checksum_1 0x%02x\n", meta->checksum_1);
4370 printf("=================================================\n");
4371}
4372
4373static char *
4374ata_raid_nvidia_type(int type)
4375{
4376 static char buffer[16];
4377
4378 switch (type) {
4379 case NV_T_SPAN: return "SPAN";
4380 case NV_T_RAID0: return "RAID0";
4381 case NV_T_RAID1: return "RAID1";
4382 case NV_T_RAID3: return "RAID3";
4383 case NV_T_RAID5: return "RAID5";
4384 case NV_T_RAID01: return "RAID0+1";
4385 default: sprintf(buffer, "UNKNOWN 0x%02x", type);
4386 return buffer;
4387 }
4388}
4389
4390static void
4391ata_raid_nvidia_print_meta(struct nvidia_raid_conf *meta)
4392{
4393 printf("******** ATA nVidia MediaShield Metadata ********\n");
4394 printf("nvidia_id <%.8s>\n", meta->nvidia_id);
4395 printf("config_size %d\n", meta->config_size);
4396 printf("checksum 0x%08x\n", meta->checksum);
4397 printf("version 0x%04x\n", meta->version);
4398 printf("disk_number %d\n", meta->disk_number);
4399 printf("dummy_0 0x%02x\n", meta->dummy_0);
4400 printf("total_sectors %d\n", meta->total_sectors);
4401 printf("sectors_size %d\n", meta->sector_size);
4402 printf("serial %.16s\n", meta->serial);
4403 printf("revision %.4s\n", meta->revision);
4404 printf("dummy_1 0x%08x\n", meta->dummy_1);
4405 printf("magic_0 0x%08x\n", meta->magic_0);
4406 printf("magic_1 0x%016llx\n",(unsigned long long)meta->magic_1);
4407 printf("magic_2 0x%016llx\n",(unsigned long long)meta->magic_2);
4408 printf("flags 0x%02x\n", meta->flags);
4409 printf("array_width %d\n", meta->array_width);
4410 printf("total_disks %d\n", meta->total_disks);
4411 printf("dummy_2 0x%02x\n", meta->dummy_2);
4412 printf("type %s\n", ata_raid_nvidia_type(meta->type));
4413 printf("dummy_3 0x%04x\n", meta->dummy_3);
4414 printf("stripe_sectors %d\n", meta->stripe_sectors);
4415 printf("stripe_bytes %d\n", meta->stripe_bytes);
4416 printf("stripe_shift %d\n", meta->stripe_shift);
4417 printf("stripe_mask 0x%08x\n", meta->stripe_mask);
4418 printf("stripe_sizesectors %d\n", meta->stripe_sizesectors);
4419 printf("stripe_sizebytes %d\n", meta->stripe_sizebytes);
4420 printf("rebuild_lba %d\n", meta->rebuild_lba);
4421 printf("dummy_4 0x%08x\n", meta->dummy_4);
4422 printf("dummy_5 0x%08x\n", meta->dummy_5);
4423 printf("status 0x%08x\n", meta->status);
4424 printf("=================================================\n");
4425}
4426
4427static char *
4428ata_raid_promise_type(int type)
4429{
4430 static char buffer[16];
4431
4432 switch (type) {
4433 case PR_T_RAID0: return "RAID0";
4434 case PR_T_RAID1: return "RAID1";
4435 case PR_T_RAID3: return "RAID3";
4436 case PR_T_RAID5: return "RAID5";
4437 case PR_T_SPAN: return "SPAN";
4438 default: sprintf(buffer, "UNKNOWN 0x%02x", type);
4439 return buffer;
4440 }
4441}
4442
4443static void
4444ata_raid_promise_print_meta(struct promise_raid_conf *meta)
4445{
4446 int i;
4447
4448 printf("********* ATA Promise FastTrak Metadata *********\n");
4449 printf("promise_id <%s>\n", meta->promise_id);
4450 printf("dummy_0 0x%08x\n", meta->dummy_0);
4451 printf("magic_0 0x%016llx\n",(unsigned long long)meta->magic_0);
4452 printf("magic_1 0x%04x\n", meta->magic_1);
4453 printf("magic_2 0x%08x\n", meta->magic_2);
4454 printf("integrity 0x%08x %b\n", meta->raid.integrity,
4455 meta->raid.integrity, "\20\10VALID\n" );
4456 printf("flags 0x%02x %b\n",
4457 meta->raid.flags, meta->raid.flags,
4458 "\20\10READY\7DOWN\6REDIR\5DUPLICATE\4SPARE"
4459 "\3ASSIGNED\2ONLINE\1VALID\n");
4460 printf("disk_number %d\n", meta->raid.disk_number);
4461 printf("channel 0x%02x\n", meta->raid.channel);
4462 printf("device 0x%02x\n", meta->raid.device);
4463 printf("magic_0 0x%016llx\n",
4464 (unsigned long long)meta->raid.magic_0);
4465 printf("disk_offset %u\n", meta->raid.disk_offset);
4466 printf("disk_sectors %u\n", meta->raid.disk_sectors);
4467 printf("rebuild_lba 0x%08x\n", meta->raid.rebuild_lba);
4468 printf("generation 0x%04x\n", meta->raid.generation);
4469 printf("status 0x%02x %b\n",
4470 meta->raid.status, meta->raid.status,
4471 "\20\6MARKED\5DEGRADED\4READY\3INITED\2ONLINE\1VALID\n");
4472 printf("type %s\n", ata_raid_promise_type(meta->raid.type));
4473 printf("total_disks %u\n", meta->raid.total_disks);
4474 printf("stripe_shift %u\n", meta->raid.stripe_shift);
4475 printf("array_width %u\n", meta->raid.array_width);
4476 printf("array_number %u\n", meta->raid.array_number);
4477 printf("total_sectors %u\n", meta->raid.total_sectors);
4478 printf("cylinders %u\n", meta->raid.cylinders);
4479 printf("heads %u\n", meta->raid.heads);
4480 printf("sectors %u\n", meta->raid.sectors);
4481 printf("magic_1 0x%016llx\n",
4482 (unsigned long long)meta->raid.magic_1);
4483 printf("DISK# flags dummy_0 channel device magic_0\n");
4484 for (i = 0; i < 8; i++) {
4485 printf(" %d %b 0x%02x 0x%02x 0x%02x ",
4486 i, meta->raid.disk[i].flags,
4487 "\20\10READY\7DOWN\6REDIR\5DUPLICATE\4SPARE"
4488 "\3ASSIGNED\2ONLINE\1VALID\n", meta->raid.disk[i].dummy_0,
4489 meta->raid.disk[i].channel, meta->raid.disk[i].device);
4490 printf("0x%016llx\n",
4491 (unsigned long long)meta->raid.disk[i].magic_0);
4492 }
4493 printf("checksum 0x%08x\n", meta->checksum);
4494 printf("=================================================\n");
4495}
4496
4497static char *
4498ata_raid_sii_type(int type)
4499{
4500 static char buffer[16];
4501
4502 switch (type) {
4503 case SII_T_RAID0: return "RAID0";
4504 case SII_T_RAID1: return "RAID1";
4505 case SII_T_RAID01: return "RAID0+1";
4506 case SII_T_SPARE: return "SPARE";
4507 default: sprintf(buffer, "UNKNOWN 0x%02x", type);
4508 return buffer;
4509 }
4510}
4511
4512static void
4513ata_raid_sii_print_meta(struct sii_raid_conf *meta)
4514{
4515 printf("******* ATA Silicon Image Medley Metadata *******\n");
4516 printf("total_sectors %llu\n",
4517 (unsigned long long)meta->total_sectors);
4518 printf("dummy_0 0x%04x\n", meta->dummy_0);
4519 printf("dummy_1 0x%04x\n", meta->dummy_1);
4520 printf("controller_pci_id 0x%08x\n", meta->controller_pci_id);
4521 printf("version_minor 0x%04x\n", meta->version_minor);
4522 printf("version_major 0x%04x\n", meta->version_major);
4523 printf("timestamp 20%02x/%02x/%02x %02x:%02x:%02x\n",
4524 meta->timestamp[5], meta->timestamp[4], meta->timestamp[3],
4525 meta->timestamp[2], meta->timestamp[1], meta->timestamp[0]);
4526 printf("stripe_sectors %u\n", meta->stripe_sectors);
4527 printf("dummy_2 0x%04x\n", meta->dummy_2);
4528 printf("disk_number %u\n", meta->disk_number);
4529 printf("type %s\n", ata_raid_sii_type(meta->type));
4530 printf("raid0_disks %u\n", meta->raid0_disks);
4531 printf("raid0_ident %u\n", meta->raid0_ident);
4532 printf("raid1_disks %u\n", meta->raid1_disks);
4533 printf("raid1_ident %u\n", meta->raid1_ident);
4534 printf("rebuild_lba %llu\n", (unsigned long long)meta->rebuild_lba);
4535 printf("generation 0x%08x\n", meta->generation);
4536 printf("status 0x%02x %b\n",
4537 meta->status, meta->status,
4538 "\20\1READY\n");
4539 printf("base_raid1_position %02x\n", meta->base_raid1_position);
4540 printf("base_raid0_position %02x\n", meta->base_raid0_position);
4541 printf("position %02x\n", meta->position);
4542 printf("dummy_3 %04x\n", meta->dummy_3);
4543 printf("name <%.16s>\n", meta->name);
4544 printf("checksum_0 0x%04x\n", meta->checksum_0);
4545 printf("checksum_1 0x%04x\n", meta->checksum_1);
4546 printf("=================================================\n");
4547}
4548
4549static char *
4550ata_raid_sis_type(int type)
4551{
4552 static char buffer[16];
4553
4554 switch (type) {
4555 case SIS_T_JBOD: return "JBOD";
4556 case SIS_T_RAID0: return "RAID0";
4557 case SIS_T_RAID1: return "RAID1";
4558 default: sprintf(buffer, "UNKNOWN 0x%02x", type);
4559 return buffer;
4560 }
4561}
4562
4563static void
4564ata_raid_sis_print_meta(struct sis_raid_conf *meta)
4565{
4566 printf("**** ATA Silicon Integrated Systems Metadata ****\n");
4567 printf("magic 0x%04x\n", meta->magic);
4568 printf("disks 0x%02x\n", meta->disks);
4569 printf("type %s\n",
4570 ata_raid_sis_type(meta->type_total_disks & SIS_T_MASK));
4571 printf("total_disks %u\n", meta->type_total_disks & SIS_D_MASK);
4572 printf("dummy_0 0x%08x\n", meta->dummy_0);
4573 printf("controller_pci_id 0x%08x\n", meta->controller_pci_id);
4574 printf("stripe_sectors %u\n", meta->stripe_sectors);
4575 printf("dummy_1 0x%04x\n", meta->dummy_1);
4576 printf("timestamp 0x%08x\n", meta->timestamp);
4577 printf("model %.40s\n", meta->model);
4578 printf("disk_number %u\n", meta->disk_number);
4579 printf("dummy_2 0x%02x 0x%02x 0x%02x\n",
4580 meta->dummy_2[0], meta->dummy_2[1], meta->dummy_2[2]);
4581 printf("=================================================\n");
4582}
4583
4584static char *
4585ata_raid_via_type(int type)
4586{
4587 static char buffer[16];
4588
4589 switch (type) {
4590 case VIA_T_RAID0: return "RAID0";
4591 case VIA_T_RAID1: return "RAID1";
4592 case VIA_T_RAID5: return "RAID5";
4593 case VIA_T_RAID01: return "RAID0+1";
4594 case VIA_T_SPAN: return "SPAN";
4595 default: sprintf(buffer, "UNKNOWN 0x%02x", type);
4596 return buffer;
4597 }
4598}
4599
4600static void
4601ata_raid_via_print_meta(struct via_raid_conf *meta)
4602{
4603 int i;
4604
4605 printf("*************** ATA VIA Metadata ****************\n");
4606 printf("magic 0x%02x\n", meta->magic);
4607 printf("dummy_0 0x%02x\n", meta->dummy_0);
4608 printf("type %s\n",
4609 ata_raid_via_type(meta->type & VIA_T_MASK));
4610 printf("bootable %d\n", meta->type & VIA_T_BOOTABLE);
4611 printf("unknown %d\n", meta->type & VIA_T_UNKNOWN);
4612 printf("disk_index 0x%02x\n", meta->disk_index);
4432 printf("stripe_disks %d\n", meta->stripe_layout & VIA_L_MASK);
4433 printf("stripe_sectors %d\n",
4434 0x08 << (meta->stripe_layout >> VIA_L_SHIFT));
4613 printf("stripe_layout 0x%02x\n", meta->stripe_layout);
4614 printf(" stripe_disks %d\n", meta->stripe_layout & VIA_L_DISKS);
4615 printf(" stripe_sectors %d\n",
4616 0x08 << ((meta->stripe_layout & VIA_L_MASK) >> VIA_L_SHIFT));
4435 printf("disk_sectors %llu\n",
4436 (unsigned long long)meta->disk_sectors);
4437 printf("disk_id 0x%08x\n", meta->disk_id);
4438 printf("DISK# disk_id\n");
4439 for (i = 0; i < 8; i++) {
4440 if (meta->disks[i])
4441 printf(" %d 0x%08x\n", i, meta->disks[i]);
4442 }
4443 printf("checksum 0x%02x\n", meta->checksum);
4444 printf("=================================================\n");
4445}
4617 printf("disk_sectors %llu\n",
4618 (unsigned long long)meta->disk_sectors);
4619 printf("disk_id 0x%08x\n", meta->disk_id);
4620 printf("DISK# disk_id\n");
4621 for (i = 0; i < 8; i++) {
4622 if (meta->disks[i])
4623 printf(" %d 0x%08x\n", i, meta->disks[i]);
4624 }
4625 printf("checksum 0x%02x\n", meta->checksum);
4626 printf("=================================================\n");
4627}