wd.c revision 1.389 1 /* $NetBSD: wd.c,v 1.389 2011/10/27 13:07:37 jakllsch Exp $ */
2
3 /*
4 * Copyright (c) 1998, 2001 Manuel Bouyer. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
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 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27 /*-
28 * Copyright (c) 1998, 2003, 2004 The NetBSD Foundation, Inc.
29 * All rights reserved.
30 *
31 * This code is derived from software contributed to The NetBSD Foundation
32 * by Charles M. Hannum and by Onno van der Linden.
33 *
34 * Redistribution and use in source and binary forms, with or without
35 * modification, are permitted provided that the following conditions
36 * are met:
37 * 1. Redistributions of source code must retain the above copyright
38 * notice, this list of conditions and the following disclaimer.
39 * 2. Redistributions in binary form must reproduce the above copyright
40 * notice, this list of conditions and the following disclaimer in the
41 * documentation and/or other materials provided with the distribution.
42 *
43 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
44 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
45 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
46 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
47 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
48 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
49 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
50 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
51 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
52 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
53 * POSSIBILITY OF SUCH DAMAGE.
54 */
55
56 #include <sys/cdefs.h>
57 __KERNEL_RCSID(0, "$NetBSD: wd.c,v 1.389 2011/10/27 13:07:37 jakllsch Exp $");
58
59 #include "opt_ata.h"
60
61 #include "rnd.h"
62
63 #include <sys/param.h>
64 #include <sys/systm.h>
65 #include <sys/kernel.h>
66 #include <sys/conf.h>
67 #include <sys/file.h>
68 #include <sys/stat.h>
69 #include <sys/ioctl.h>
70 #include <sys/buf.h>
71 #include <sys/bufq.h>
72 #include <sys/uio.h>
73 #include <sys/malloc.h>
74 #include <sys/device.h>
75 #include <sys/disklabel.h>
76 #include <sys/disk.h>
77 #include <sys/syslog.h>
78 #include <sys/proc.h>
79 #include <sys/reboot.h>
80 #include <sys/vnode.h>
81 #if NRND > 0
82 #include <sys/rnd.h>
83 #endif
84
85 #include <sys/intr.h>
86 #include <sys/bus.h>
87
88 #include <dev/ata/atareg.h>
89 #include <dev/ata/atavar.h>
90 #include <dev/ata/wdvar.h>
91 #include <dev/ic/wdcreg.h>
92 #include <sys/ataio.h>
93 #include "locators.h"
94
95 #include <prop/proplib.h>
96
97 #define WDIORETRIES_SINGLE 4 /* number of retries before single-sector */
98 #define WDIORETRIES 5 /* number of retries before giving up */
99 #define RECOVERYTIME hz/2 /* time to wait before retrying a cmd */
100
101 #define WDUNIT(dev) DISKUNIT(dev)
102 #define WDPART(dev) DISKPART(dev)
103 #define WDMINOR(unit, part) DISKMINOR(unit, part)
104 #define MAKEWDDEV(maj, unit, part) MAKEDISKDEV(maj, unit, part)
105
106 #define WDLABELDEV(dev) (MAKEWDDEV(major(dev), WDUNIT(dev), RAW_PART))
107
108 #define DEBUG_INTR 0x01
109 #define DEBUG_XFERS 0x02
110 #define DEBUG_STATUS 0x04
111 #define DEBUG_FUNCS 0x08
112 #define DEBUG_PROBE 0x10
113 #ifdef ATADEBUG
114 int wdcdebug_wd_mask = 0x0;
115 #define ATADEBUG_PRINT(args, level) \
116 if (wdcdebug_wd_mask & (level)) \
117 printf args
118 #else
119 #define ATADEBUG_PRINT(args, level)
120 #endif
121
122 int wdprobe(device_t, cfdata_t, void *);
123 void wdattach(device_t, device_t, void *);
124 int wddetach(device_t, int);
125 int wdprint(void *, char *);
126 void wdperror(const struct wd_softc *);
127
128 static void wdminphys(struct buf *);
129
130 static int wdlastclose(device_t);
131 static bool wd_suspend(device_t, const pmf_qual_t *);
132 static int wd_standby(struct wd_softc *, int);
133
134 CFATTACH_DECL3_NEW(wd, sizeof(struct wd_softc),
135 wdprobe, wdattach, wddetach, NULL, NULL, NULL, DVF_DETACH_SHUTDOWN);
136
137 extern struct cfdriver wd_cd;
138
139 dev_type_open(wdopen);
140 dev_type_close(wdclose);
141 dev_type_read(wdread);
142 dev_type_write(wdwrite);
143 dev_type_ioctl(wdioctl);
144 dev_type_strategy(wdstrategy);
145 dev_type_dump(wddump);
146 dev_type_size(wdsize);
147
148 const struct bdevsw wd_bdevsw = {
149 wdopen, wdclose, wdstrategy, wdioctl, wddump, wdsize, D_DISK
150 };
151
152 const struct cdevsw wd_cdevsw = {
153 wdopen, wdclose, wdread, wdwrite, wdioctl,
154 nostop, notty, nopoll, nommap, nokqfilter, D_DISK
155 };
156
157 /*
158 * Glue necessary to hook WDCIOCCOMMAND into physio
159 */
160
161 struct wd_ioctl {
162 LIST_ENTRY(wd_ioctl) wi_list;
163 struct buf wi_bp;
164 struct uio wi_uio;
165 struct iovec wi_iov;
166 atareq_t wi_atareq;
167 struct wd_softc *wi_softc;
168 };
169
170 LIST_HEAD(, wd_ioctl) wi_head;
171
172 struct wd_ioctl *wi_find(struct buf *);
173 void wi_free(struct wd_ioctl *);
174 struct wd_ioctl *wi_get(void);
175 void wdioctlstrategy(struct buf *);
176
177 void wdgetdefaultlabel(struct wd_softc *, struct disklabel *);
178 void wdgetdisklabel(struct wd_softc *);
179 void wdstart(void *);
180 void wdstart1(struct wd_softc*, struct buf *);
181 void wdrestart(void *);
182 void wddone(void *);
183 int wd_get_params(struct wd_softc *, u_int8_t, struct ataparams *);
184 int wd_flushcache(struct wd_softc *, int);
185 bool wd_shutdown(device_t, int);
186
187 int wd_getcache(struct wd_softc *, int *);
188 int wd_setcache(struct wd_softc *, int);
189
190 struct dkdriver wddkdriver = { wdstrategy, wdminphys };
191
192 #ifdef HAS_BAD144_HANDLING
193 static void bad144intern(struct wd_softc *);
194 #endif
195
196 #define WD_QUIRK_SPLIT_MOD15_WRITE 0x0001 /* must split certain writes */
197
198 #define WD_QUIRK_FMT "\20\1SPLIT_MOD15_WRITE\2FORCE_LBA48"
199
200 /*
201 * Quirk table for IDE drives. Put more-specific matches first, since
202 * a simple globing routine is used for matching.
203 */
204 static const struct wd_quirk {
205 const char *wdq_match; /* inquiry pattern to match */
206 int wdq_quirks; /* drive quirks */
207 } wd_quirk_table[] = {
208 /*
209 * Some Seagate S-ATA drives have a PHY which can get confused
210 * with the way data is packetized by some S-ATA controllers.
211 *
212 * The work-around is to split in two any write transfer whose
213 * sector count % 15 == 1 (assuming 512 byte sectors).
214 *
215 * XXX This is an incomplete list. There are at least a couple
216 * XXX more model numbers. If you have trouble with such transfers
217 * XXX (8K is the most common) on Seagate S-ATA drives, please
218 * XXX notify thorpej (at) NetBSD.org.
219 *
220 * The ST360015AS has not yet been confirmed to have this
221 * issue, however, it is the only other drive in the
222 * Seagate Barracuda Serial ATA V family.
223 *
224 */
225 { "ST3120023AS",
226 WD_QUIRK_SPLIT_MOD15_WRITE },
227 { "ST380023AS",
228 WD_QUIRK_SPLIT_MOD15_WRITE },
229 { "ST360015AS",
230 WD_QUIRK_SPLIT_MOD15_WRITE },
231 { NULL,
232 0 }
233 };
234
235 static const struct wd_quirk *
236 wd_lookup_quirks(const char *name)
237 {
238 const struct wd_quirk *wdq;
239 const char *estr;
240
241 for (wdq = wd_quirk_table; wdq->wdq_match != NULL; wdq++) {
242 /*
243 * We only want exact matches (which include matches
244 * against globbing characters).
245 */
246 if (pmatch(name, wdq->wdq_match, &estr) == 2)
247 return (wdq);
248 }
249 return (NULL);
250 }
251
252 int
253 wdprobe(device_t parent, cfdata_t match, void *aux)
254 {
255 struct ata_device *adev = aux;
256
257 if (adev == NULL)
258 return 0;
259 if (adev->adev_bustype->bustype_type != SCSIPI_BUSTYPE_ATA)
260 return 0;
261
262 if (match->cf_loc[ATA_HLCF_DRIVE] != ATA_HLCF_DRIVE_DEFAULT &&
263 match->cf_loc[ATA_HLCF_DRIVE] != adev->adev_drv_data->drive)
264 return 0;
265 return 1;
266 }
267
268 void
269 wdattach(device_t parent, device_t self, void *aux)
270 {
271 struct wd_softc *wd = device_private(self);
272 struct ata_device *adev= aux;
273 int i, blank;
274 char tbuf[41], pbuf[9], c, *p, *q;
275 const struct wd_quirk *wdq;
276
277 wd->sc_dev = self;
278
279 ATADEBUG_PRINT(("wdattach\n"), DEBUG_FUNCS | DEBUG_PROBE);
280 callout_init(&wd->sc_restart_ch, 0);
281 bufq_alloc(&wd->sc_q, BUFQ_DISK_DEFAULT_STRAT, BUFQ_SORT_RAWBLOCK);
282 #ifdef WD_SOFTBADSECT
283 SLIST_INIT(&wd->sc_bslist);
284 #endif
285 wd->atabus = adev->adev_bustype;
286 wd->openings = adev->adev_openings;
287 wd->drvp = adev->adev_drv_data;
288
289 wd->drvp->drv_done = wddone;
290 wd->drvp->drv_softc = wd->sc_dev;
291
292 aprint_naive("\n");
293 aprint_normal("\n");
294
295 /* read our drive info */
296 if (wd_get_params(wd, AT_WAIT, &wd->sc_params) != 0) {
297 aprint_error_dev(self, "IDENTIFY failed\n");
298 return;
299 }
300
301 for (blank = 0, p = wd->sc_params.atap_model, q = tbuf, i = 0;
302 i < sizeof(wd->sc_params.atap_model); i++) {
303 c = *p++;
304 if (c == '\0')
305 break;
306 if (c != ' ') {
307 if (blank) {
308 *q++ = ' ';
309 blank = 0;
310 }
311 *q++ = c;
312 } else
313 blank = 1;
314 }
315 *q++ = '\0';
316
317 aprint_normal_dev(self, "<%s>\n", tbuf);
318
319 wdq = wd_lookup_quirks(tbuf);
320 if (wdq != NULL)
321 wd->sc_quirks = wdq->wdq_quirks;
322
323 if (wd->sc_quirks != 0) {
324 char sbuf[sizeof(WD_QUIRK_FMT) + 64];
325 snprintb(sbuf, sizeof(sbuf), WD_QUIRK_FMT, wd->sc_quirks);
326 aprint_normal_dev(self, "quirks %s\n", sbuf);
327 }
328
329 if ((wd->sc_params.atap_multi & 0xff) > 1) {
330 wd->sc_multi = wd->sc_params.atap_multi & 0xff;
331 } else {
332 wd->sc_multi = 1;
333 }
334
335 aprint_verbose_dev(self, "drive supports %d-sector PIO transfers,",
336 wd->sc_multi);
337
338 /* 48-bit LBA addressing */
339 if ((wd->sc_params.atap_cmd2_en & ATA_CMD2_LBA48) != 0)
340 wd->sc_flags |= WDF_LBA48;
341
342 /* Prior to ATA-4, LBA was optional. */
343 if ((wd->sc_params.atap_capabilities1 & WDC_CAP_LBA) != 0)
344 wd->sc_flags |= WDF_LBA;
345 #if 0
346 /* ATA-4 requires LBA. */
347 if (wd->sc_params.atap_ataversion != 0xffff &&
348 wd->sc_params.atap_ataversion >= WDC_VER_ATA4)
349 wd->sc_flags |= WDF_LBA;
350 #endif
351
352 if ((wd->sc_flags & WDF_LBA48) != 0) {
353 aprint_verbose(" LBA48 addressing\n");
354 wd->sc_capacity =
355 ((u_int64_t) wd->sc_params.atap_max_lba[3] << 48) |
356 ((u_int64_t) wd->sc_params.atap_max_lba[2] << 32) |
357 ((u_int64_t) wd->sc_params.atap_max_lba[1] << 16) |
358 ((u_int64_t) wd->sc_params.atap_max_lba[0] << 0);
359 wd->sc_capacity28 =
360 (wd->sc_params.atap_capacity[1] << 16) |
361 wd->sc_params.atap_capacity[0];
362 } else if ((wd->sc_flags & WDF_LBA) != 0) {
363 aprint_verbose(" LBA addressing\n");
364 wd->sc_capacity28 = wd->sc_capacity =
365 (wd->sc_params.atap_capacity[1] << 16) |
366 wd->sc_params.atap_capacity[0];
367 } else {
368 aprint_verbose(" chs addressing\n");
369 wd->sc_capacity28 = wd->sc_capacity =
370 wd->sc_params.atap_cylinders *
371 wd->sc_params.atap_heads *
372 wd->sc_params.atap_sectors;
373 }
374 format_bytes(pbuf, sizeof(pbuf), wd->sc_capacity * DEV_BSIZE);
375 aprint_normal_dev(self, "%s, %d cyl, %d head, %d sec, "
376 "%d bytes/sect x %llu sectors\n",
377 pbuf,
378 (wd->sc_flags & WDF_LBA) ? (int)(wd->sc_capacity /
379 (wd->sc_params.atap_heads * wd->sc_params.atap_sectors)) :
380 wd->sc_params.atap_cylinders,
381 wd->sc_params.atap_heads, wd->sc_params.atap_sectors,
382 DEV_BSIZE, (unsigned long long)wd->sc_capacity);
383
384 ATADEBUG_PRINT(("%s: atap_dmatiming_mimi=%d, atap_dmatiming_recom=%d\n",
385 device_xname(self), wd->sc_params.atap_dmatiming_mimi,
386 wd->sc_params.atap_dmatiming_recom), DEBUG_PROBE);
387 /*
388 * Initialize and attach the disk structure.
389 */
390 /* we fill in dk_info later */
391 disk_init(&wd->sc_dk, device_xname(wd->sc_dev), &wddkdriver);
392 disk_attach(&wd->sc_dk);
393 wd->sc_wdc_bio.lp = wd->sc_dk.dk_label;
394 #if NRND > 0
395 rnd_attach_source(&wd->rnd_source, device_xname(wd->sc_dev),
396 RND_TYPE_DISK, 0);
397 #endif
398
399 /* Discover wedges on this disk. */
400 dkwedge_discover(&wd->sc_dk);
401
402 if (!pmf_device_register1(self, wd_suspend, NULL, wd_shutdown))
403 aprint_error_dev(self, "couldn't establish power handler\n");
404 }
405
406 static bool
407 wd_suspend(device_t dv, const pmf_qual_t *qual)
408 {
409 struct wd_softc *sc = device_private(dv);
410
411 wd_flushcache(sc, AT_WAIT);
412 wd_standby(sc, AT_WAIT);
413 return true;
414 }
415
416 int
417 wddetach(device_t self, int flags)
418 {
419 struct wd_softc *sc = device_private(self);
420 int bmaj, cmaj, i, mn, rc, s;
421
422 if ((rc = disk_begindetach(&sc->sc_dk, wdlastclose, self, flags)) != 0)
423 return rc;
424
425 /* locate the major number */
426 bmaj = bdevsw_lookup_major(&wd_bdevsw);
427 cmaj = cdevsw_lookup_major(&wd_cdevsw);
428
429 /* Nuke the vnodes for any open instances. */
430 for (i = 0; i < MAXPARTITIONS; i++) {
431 mn = WDMINOR(device_unit(self), i);
432 vdevgone(bmaj, mn, mn, VBLK);
433 vdevgone(cmaj, mn, mn, VCHR);
434 }
435
436 /* Delete all of our wedges. */
437 dkwedge_delall(&sc->sc_dk);
438
439 s = splbio();
440
441 /* Kill off any queued buffers. */
442 bufq_drain(sc->sc_q);
443
444 bufq_free(sc->sc_q);
445 sc->atabus->ata_killpending(sc->drvp);
446
447 splx(s);
448
449 /* Detach disk. */
450 disk_detach(&sc->sc_dk);
451 disk_destroy(&sc->sc_dk);
452
453 #ifdef WD_SOFTBADSECT
454 /* Clean out the bad sector list */
455 while (!SLIST_EMPTY(&sc->sc_bslist)) {
456 void *head = SLIST_FIRST(&sc->sc_bslist);
457 SLIST_REMOVE_HEAD(&sc->sc_bslist, dbs_next);
458 free(head, M_TEMP);
459 }
460 sc->sc_bscount = 0;
461 #endif
462
463 pmf_device_deregister(self);
464
465 #if NRND > 0
466 /* Unhook the entropy source. */
467 rnd_detach_source(&sc->rnd_source);
468 #endif
469
470 callout_destroy(&sc->sc_restart_ch);
471
472 sc->drvp->drive_flags = 0; /* no drive any more here */
473
474 return (0);
475 }
476
477 /*
478 * Read/write routine for a buffer. Validates the arguments and schedules the
479 * transfer. Does not wait for the transfer to complete.
480 */
481 void
482 wdstrategy(struct buf *bp)
483 {
484 struct wd_softc *wd =
485 device_lookup_private(&wd_cd, WDUNIT(bp->b_dev));
486 struct disklabel *lp = wd->sc_dk.dk_label;
487 daddr_t blkno;
488 int s;
489
490 ATADEBUG_PRINT(("wdstrategy (%s)\n", device_xname(wd->sc_dev)),
491 DEBUG_XFERS);
492
493 /* Valid request? */
494 if (bp->b_blkno < 0 ||
495 (bp->b_bcount % lp->d_secsize) != 0 ||
496 (bp->b_bcount / lp->d_secsize) >= (1 << NBBY)) {
497 bp->b_error = EINVAL;
498 goto done;
499 }
500
501 /* If device invalidated (e.g. media change, door open,
502 * device detachment), then error.
503 */
504 if ((wd->sc_flags & WDF_LOADED) == 0 ||
505 !device_is_enabled(wd->sc_dev)) {
506 bp->b_error = EIO;
507 goto done;
508 }
509
510 /* If it's a null transfer, return immediately. */
511 if (bp->b_bcount == 0)
512 goto done;
513
514 /*
515 * Do bounds checking, adjust transfer. if error, process.
516 * If end of partition, just return.
517 */
518 if (WDPART(bp->b_dev) == RAW_PART) {
519 if (bounds_check_with_mediasize(bp, DEV_BSIZE,
520 wd->sc_capacity) <= 0)
521 goto done;
522 } else {
523 if (bounds_check_with_label(&wd->sc_dk, bp,
524 (wd->sc_flags & (WDF_WLABEL|WDF_LABELLING)) != 0) <= 0)
525 goto done;
526 }
527
528 /*
529 * Now convert the block number to absolute and put it in
530 * terms of the device's logical block size.
531 */
532 if (lp->d_secsize >= DEV_BSIZE)
533 blkno = bp->b_blkno / (lp->d_secsize / DEV_BSIZE);
534 else
535 blkno = bp->b_blkno * (DEV_BSIZE / lp->d_secsize);
536
537 if (WDPART(bp->b_dev) != RAW_PART)
538 blkno += lp->d_partitions[WDPART(bp->b_dev)].p_offset;
539
540 bp->b_rawblkno = blkno;
541
542 #ifdef WD_SOFTBADSECT
543 /*
544 * If the transfer about to be attempted contains only a block that
545 * is known to be bad then return an error for the transfer without
546 * even attempting to start a transfer up under the premis that we
547 * will just end up doing more retries for a transfer that will end
548 * up failing again.
549 * XXX:SMP - mutex required to protect with DIOCBSFLUSH
550 */
551 if (__predict_false(!SLIST_EMPTY(&wd->sc_bslist))) {
552 struct disk_badsectors *dbs;
553 daddr_t maxblk = blkno + (bp->b_bcount >> DEV_BSHIFT) - 1;
554
555 SLIST_FOREACH(dbs, &wd->sc_bslist, dbs_next)
556 if ((dbs->dbs_min <= blkno && blkno <= dbs->dbs_max) ||
557 (dbs->dbs_min <= maxblk && maxblk <= dbs->dbs_max)){
558 bp->b_error = EIO;
559 goto done;
560 }
561 }
562 #endif
563
564 /* Queue transfer on drive, activate drive and controller if idle. */
565 s = splbio();
566 bufq_put(wd->sc_q, bp);
567 wdstart(wd);
568 splx(s);
569 return;
570 done:
571 /* Toss transfer; we're done early. */
572 bp->b_resid = bp->b_bcount;
573 biodone(bp);
574 }
575
576 /*
577 * Queue a drive for I/O.
578 */
579 void
580 wdstart(void *arg)
581 {
582 struct wd_softc *wd = arg;
583 struct buf *bp = NULL;
584
585 ATADEBUG_PRINT(("wdstart %s\n", device_xname(wd->sc_dev)),
586 DEBUG_XFERS);
587
588 if (!device_is_active(wd->sc_dev))
589 return;
590
591 while (wd->openings > 0) {
592
593 /* Is there a buf for us ? */
594 if ((bp = bufq_get(wd->sc_q)) == NULL)
595 return;
596
597 /*
598 * Make the command. First lock the device
599 */
600 wd->openings--;
601
602 wd->retries = 0;
603 wdstart1(wd, bp);
604 }
605 }
606
607 static void
608 wd_split_mod15_write(struct buf *bp)
609 {
610 struct buf *obp = bp->b_private;
611 struct wd_softc *sc =
612 device_lookup_private(&wd_cd, DISKUNIT(obp->b_dev));
613 int s;
614
615 if (__predict_false(bp->b_error != 0)) {
616 /*
617 * Propagate the error. If this was the first half of
618 * the original transfer, make sure to account for that
619 * in the residual.
620 */
621 if (bp->b_data == obp->b_data)
622 bp->b_resid += bp->b_bcount;
623 goto done;
624 }
625
626 /*
627 * If this was the second half of the transfer, we're all done!
628 */
629 if (bp->b_data != obp->b_data)
630 goto done;
631
632 /*
633 * Advance the pointer to the second half and issue that command
634 * using the same opening.
635 */
636 bp->b_flags = obp->b_flags;
637 bp->b_oflags = obp->b_oflags;
638 bp->b_cflags = obp->b_cflags;
639 bp->b_data = (char *)bp->b_data + bp->b_bcount;
640 bp->b_blkno += (bp->b_bcount / 512);
641 bp->b_rawblkno += (bp->b_bcount / 512);
642 s = splbio();
643 wdstart1(sc, bp);
644 splx(s);
645 return;
646
647 done:
648 obp->b_error = bp->b_error;
649 obp->b_resid = bp->b_resid;
650 s = splbio();
651 putiobuf(bp);
652 biodone(obp);
653 sc->openings++;
654 splx(s);
655 /* wddone() will call wdstart() */
656 }
657
658 void
659 wdstart1(struct wd_softc *wd, struct buf *bp)
660 {
661
662 /*
663 * Deal with the "split mod15 write" quirk. We just divide the
664 * transfer in two, doing the first half and then then second half
665 * with the same command opening.
666 *
667 * Note we MUST do this here, because we can't let insertion
668 * into the bufq cause the transfers to be re-merged.
669 */
670 if (__predict_false((wd->sc_quirks & WD_QUIRK_SPLIT_MOD15_WRITE) != 0 &&
671 (bp->b_flags & B_READ) == 0 &&
672 bp->b_bcount > 512 &&
673 ((bp->b_bcount / 512) % 15) == 1)) {
674 struct buf *nbp;
675
676 /* already at splbio */
677 nbp = getiobuf(NULL, false);
678 if (__predict_false(nbp == NULL)) {
679 /* No memory -- fail the iop. */
680 bp->b_error = ENOMEM;
681 bp->b_resid = bp->b_bcount;
682 biodone(bp);
683 wd->openings++;
684 return;
685 }
686
687 nbp->b_error = 0;
688 nbp->b_proc = bp->b_proc;
689 nbp->b_dev = bp->b_dev;
690
691 nbp->b_bcount = bp->b_bcount / 2;
692 nbp->b_bufsize = bp->b_bcount / 2;
693 nbp->b_data = bp->b_data;
694
695 nbp->b_blkno = bp->b_blkno;
696 nbp->b_rawblkno = bp->b_rawblkno;
697
698 nbp->b_flags = bp->b_flags;
699 nbp->b_oflags = bp->b_oflags;
700 nbp->b_cflags = bp->b_cflags;
701 nbp->b_iodone = wd_split_mod15_write;
702
703 /* Put ptr to orig buf in b_private and use new buf */
704 nbp->b_private = bp;
705
706 BIO_COPYPRIO(nbp, bp);
707
708 bp = nbp;
709 }
710
711 wd->sc_wdc_bio.blkno = bp->b_rawblkno;
712 wd->sc_wdc_bio.bcount = bp->b_bcount;
713 wd->sc_wdc_bio.databuf = bp->b_data;
714 wd->sc_wdc_bio.blkdone =0;
715 KASSERT(bp == wd->sc_bp || wd->sc_bp == NULL);
716 wd->sc_bp = bp;
717 /*
718 * If we're retrying, retry in single-sector mode. This will give us
719 * the sector number of the problem, and will eventually allow the
720 * transfer to succeed.
721 */
722 if (wd->retries >= WDIORETRIES_SINGLE)
723 wd->sc_wdc_bio.flags = ATA_SINGLE;
724 else
725 wd->sc_wdc_bio.flags = 0;
726 if (wd->sc_flags & WDF_LBA48 &&
727 (wd->sc_wdc_bio.blkno +
728 wd->sc_wdc_bio.bcount / wd->sc_dk.dk_label->d_secsize) >
729 wd->sc_capacity28)
730 wd->sc_wdc_bio.flags |= ATA_LBA48;
731 if (wd->sc_flags & WDF_LBA)
732 wd->sc_wdc_bio.flags |= ATA_LBA;
733 if (bp->b_flags & B_READ)
734 wd->sc_wdc_bio.flags |= ATA_READ;
735 /* Instrumentation. */
736 disk_busy(&wd->sc_dk);
737 switch (wd->atabus->ata_bio(wd->drvp, &wd->sc_wdc_bio)) {
738 case ATACMD_TRY_AGAIN:
739 callout_reset(&wd->sc_restart_ch, hz, wdrestart, wd);
740 break;
741 case ATACMD_QUEUED:
742 case ATACMD_COMPLETE:
743 break;
744 default:
745 panic("wdstart1: bad return code from ata_bio()");
746 }
747 }
748
749 void
750 wddone(void *v)
751 {
752 struct wd_softc *wd = device_private(v);
753 struct buf *bp = wd->sc_bp;
754 const char *errmsg;
755 int do_perror = 0;
756
757 ATADEBUG_PRINT(("wddone %s\n", device_xname(wd->sc_dev)),
758 DEBUG_XFERS);
759 if (bp == NULL)
760 return;
761 bp->b_resid = wd->sc_wdc_bio.bcount;
762 switch (wd->sc_wdc_bio.error) {
763 case ERR_DMA:
764 errmsg = "DMA error";
765 goto retry;
766 case ERR_DF:
767 errmsg = "device fault";
768 goto retry;
769 case TIMEOUT:
770 errmsg = "device timeout";
771 goto retry;
772 case ERR_RESET:
773 errmsg = "channel reset";
774 goto retry2;
775 case ERROR:
776 /* Don't care about media change bits */
777 if (wd->sc_wdc_bio.r_error != 0 &&
778 (wd->sc_wdc_bio.r_error & ~(WDCE_MC | WDCE_MCR)) == 0)
779 goto noerror;
780 errmsg = "error";
781 do_perror = 1;
782 retry: /* Just reset and retry. Can we do more ? */
783 (*wd->atabus->ata_reset_drive)(wd->drvp, AT_RST_NOCMD);
784 retry2:
785 diskerr(bp, "wd", errmsg, LOG_PRINTF,
786 wd->sc_wdc_bio.blkdone, wd->sc_dk.dk_label);
787 if (wd->retries < WDIORETRIES)
788 printf(", retrying");
789 printf("\n");
790 if (do_perror)
791 wdperror(wd);
792 if (wd->retries < WDIORETRIES) {
793 wd->retries++;
794 callout_reset(&wd->sc_restart_ch, RECOVERYTIME,
795 wdrestart, wd);
796 return;
797 }
798
799 #ifdef WD_SOFTBADSECT
800 /*
801 * Not all errors indicate a failed block but those that do,
802 * put the block on the bad-block list for the device. Only
803 * do this for reads because the drive should do it for writes,
804 * itself, according to Manuel.
805 */
806 if ((bp->b_flags & B_READ) &&
807 ((wd->drvp->ata_vers >= 4 && wd->sc_wdc_bio.r_error & 64) ||
808 (wd->drvp->ata_vers < 4 && wd->sc_wdc_bio.r_error & 192))) {
809 struct disk_badsectors *dbs;
810
811 dbs = malloc(sizeof *dbs, M_TEMP, M_WAITOK);
812 dbs->dbs_min = bp->b_rawblkno;
813 dbs->dbs_max = dbs->dbs_min + (bp->b_bcount >> DEV_BSHIFT) - 1;
814 microtime(&dbs->dbs_failedat);
815 SLIST_INSERT_HEAD(&wd->sc_bslist, dbs, dbs_next);
816 wd->sc_bscount++;
817 }
818 #endif
819 bp->b_error = EIO;
820 break;
821 case NOERROR:
822 noerror: if ((wd->sc_wdc_bio.flags & ATA_CORR) || wd->retries > 0)
823 aprint_error_dev(wd->sc_dev,
824 "soft error (corrected)\n");
825 break;
826 case ERR_NODEV:
827 bp->b_error = EIO;
828 break;
829 }
830 disk_unbusy(&wd->sc_dk, (bp->b_bcount - bp->b_resid),
831 (bp->b_flags & B_READ));
832 #if NRND > 0
833 rnd_add_uint32(&wd->rnd_source, bp->b_blkno);
834 #endif
835 /* XXX Yuck, but we don't want to increment openings in this case */
836 if (__predict_false(bp->b_iodone == wd_split_mod15_write))
837 biodone(bp);
838 else {
839 biodone(bp);
840 wd->openings++;
841 }
842 KASSERT(wd->sc_bp != NULL);
843 wd->sc_bp = NULL;
844 wdstart(wd);
845 }
846
847 void
848 wdrestart(void *v)
849 {
850 struct wd_softc *wd = v;
851 struct buf *bp = wd->sc_bp;
852 int s;
853
854 ATADEBUG_PRINT(("wdrestart %s\n", device_xname(wd->sc_dev)),
855 DEBUG_XFERS);
856 s = splbio();
857 wdstart1(v, bp);
858 splx(s);
859 }
860
861 static void
862 wdminphys(struct buf *bp)
863 {
864
865 if (bp->b_bcount > (512 * 128)) {
866 bp->b_bcount = (512 * 128);
867 }
868 minphys(bp);
869 }
870
871 int
872 wdread(dev_t dev, struct uio *uio, int flags)
873 {
874
875 ATADEBUG_PRINT(("wdread\n"), DEBUG_XFERS);
876 return (physio(wdstrategy, NULL, dev, B_READ, wdminphys, uio));
877 }
878
879 int
880 wdwrite(dev_t dev, struct uio *uio, int flags)
881 {
882
883 ATADEBUG_PRINT(("wdwrite\n"), DEBUG_XFERS);
884 return (physio(wdstrategy, NULL, dev, B_WRITE, wdminphys, uio));
885 }
886
887 int
888 wdopen(dev_t dev, int flag, int fmt, struct lwp *l)
889 {
890 struct wd_softc *wd;
891 int part, error;
892
893 ATADEBUG_PRINT(("wdopen\n"), DEBUG_FUNCS);
894 wd = device_lookup_private(&wd_cd, WDUNIT(dev));
895 if (wd == NULL)
896 return (ENXIO);
897
898 if (! device_is_active(wd->sc_dev))
899 return (ENODEV);
900
901 part = WDPART(dev);
902
903 mutex_enter(&wd->sc_dk.dk_openlock);
904
905 /*
906 * If there are wedges, and this is not RAW_PART, then we
907 * need to fail.
908 */
909 if (wd->sc_dk.dk_nwedges != 0 && part != RAW_PART) {
910 error = EBUSY;
911 goto bad1;
912 }
913
914 /*
915 * If this is the first open of this device, add a reference
916 * to the adapter.
917 */
918 if (wd->sc_dk.dk_openmask == 0 &&
919 (error = wd->atabus->ata_addref(wd->drvp)) != 0)
920 goto bad1;
921
922 if (wd->sc_dk.dk_openmask != 0) {
923 /*
924 * If any partition is open, but the disk has been invalidated,
925 * disallow further opens.
926 */
927 if ((wd->sc_flags & WDF_LOADED) == 0) {
928 error = EIO;
929 goto bad2;
930 }
931 } else {
932 if ((wd->sc_flags & WDF_LOADED) == 0) {
933 wd->sc_flags |= WDF_LOADED;
934
935 /* Load the physical device parameters. */
936 wd_get_params(wd, AT_WAIT, &wd->sc_params);
937
938 /* Load the partition info if not already loaded. */
939 wdgetdisklabel(wd);
940 }
941 }
942
943 /* Check that the partition exists. */
944 if (part != RAW_PART &&
945 (part >= wd->sc_dk.dk_label->d_npartitions ||
946 wd->sc_dk.dk_label->d_partitions[part].p_fstype == FS_UNUSED)) {
947 error = ENXIO;
948 goto bad2;
949 }
950
951 /* Insure only one open at a time. */
952 switch (fmt) {
953 case S_IFCHR:
954 wd->sc_dk.dk_copenmask |= (1 << part);
955 break;
956 case S_IFBLK:
957 wd->sc_dk.dk_bopenmask |= (1 << part);
958 break;
959 }
960 wd->sc_dk.dk_openmask =
961 wd->sc_dk.dk_copenmask | wd->sc_dk.dk_bopenmask;
962
963 mutex_exit(&wd->sc_dk.dk_openlock);
964 return 0;
965
966 bad2:
967 if (wd->sc_dk.dk_openmask == 0)
968 wd->atabus->ata_delref(wd->drvp);
969 bad1:
970 mutex_exit(&wd->sc_dk.dk_openlock);
971 return error;
972 }
973
974 /*
975 * Caller must hold wd->sc_dk.dk_openlock.
976 */
977 static int
978 wdlastclose(device_t self)
979 {
980 struct wd_softc *wd = device_private(self);
981
982 wd_flushcache(wd, AT_WAIT);
983
984 if (! (wd->sc_flags & WDF_KLABEL))
985 wd->sc_flags &= ~WDF_LOADED;
986
987 wd->atabus->ata_delref(wd->drvp);
988
989 return 0;
990 }
991
992 int
993 wdclose(dev_t dev, int flag, int fmt, struct lwp *l)
994 {
995 struct wd_softc *wd =
996 device_lookup_private(&wd_cd, WDUNIT(dev));
997 int part = WDPART(dev);
998
999 ATADEBUG_PRINT(("wdclose\n"), DEBUG_FUNCS);
1000
1001 mutex_enter(&wd->sc_dk.dk_openlock);
1002
1003 switch (fmt) {
1004 case S_IFCHR:
1005 wd->sc_dk.dk_copenmask &= ~(1 << part);
1006 break;
1007 case S_IFBLK:
1008 wd->sc_dk.dk_bopenmask &= ~(1 << part);
1009 break;
1010 }
1011 wd->sc_dk.dk_openmask =
1012 wd->sc_dk.dk_copenmask | wd->sc_dk.dk_bopenmask;
1013
1014 if (wd->sc_dk.dk_openmask == 0)
1015 wdlastclose(wd->sc_dev);
1016
1017 mutex_exit(&wd->sc_dk.dk_openlock);
1018 return 0;
1019 }
1020
1021 void
1022 wdgetdefaultlabel(struct wd_softc *wd, struct disklabel *lp)
1023 {
1024
1025 ATADEBUG_PRINT(("wdgetdefaultlabel\n"), DEBUG_FUNCS);
1026 memset(lp, 0, sizeof(struct disklabel));
1027
1028 lp->d_secsize = DEV_BSIZE;
1029 lp->d_ntracks = wd->sc_params.atap_heads;
1030 lp->d_nsectors = wd->sc_params.atap_sectors;
1031 lp->d_ncylinders = (wd->sc_flags & WDF_LBA) ? wd->sc_capacity /
1032 (wd->sc_params.atap_heads * wd->sc_params.atap_sectors) :
1033 wd->sc_params.atap_cylinders;
1034 lp->d_secpercyl = lp->d_ntracks * lp->d_nsectors;
1035
1036 if (strcmp(wd->sc_params.atap_model, "ST506") == 0)
1037 lp->d_type = DTYPE_ST506;
1038 else
1039 lp->d_type = DTYPE_ESDI;
1040
1041 strncpy(lp->d_typename, wd->sc_params.atap_model, 16);
1042 strncpy(lp->d_packname, "fictitious", 16);
1043 if (wd->sc_capacity > UINT32_MAX)
1044 lp->d_secperunit = UINT32_MAX;
1045 else
1046 lp->d_secperunit = wd->sc_capacity;
1047 lp->d_rpm = 3600;
1048 lp->d_interleave = 1;
1049 lp->d_flags = 0;
1050
1051 lp->d_partitions[RAW_PART].p_offset = 0;
1052 lp->d_partitions[RAW_PART].p_size =
1053 lp->d_secperunit * (lp->d_secsize / DEV_BSIZE);
1054 lp->d_partitions[RAW_PART].p_fstype = FS_UNUSED;
1055 lp->d_npartitions = RAW_PART + 1;
1056
1057 lp->d_magic = DISKMAGIC;
1058 lp->d_magic2 = DISKMAGIC;
1059 lp->d_checksum = dkcksum(lp);
1060 }
1061
1062 /*
1063 * Fabricate a default disk label, and try to read the correct one.
1064 */
1065 void
1066 wdgetdisklabel(struct wd_softc *wd)
1067 {
1068 struct disklabel *lp = wd->sc_dk.dk_label;
1069 const char *errstring;
1070 int s;
1071
1072 ATADEBUG_PRINT(("wdgetdisklabel\n"), DEBUG_FUNCS);
1073
1074 memset(wd->sc_dk.dk_cpulabel, 0, sizeof(struct cpu_disklabel));
1075
1076 wdgetdefaultlabel(wd, lp);
1077
1078 wd->sc_badsect[0] = -1;
1079
1080 if (wd->drvp->state > RESET) {
1081 s = splbio();
1082 wd->drvp->drive_flags |= DRIVE_RESET;
1083 splx(s);
1084 }
1085 errstring = readdisklabel(MAKEWDDEV(0, device_unit(wd->sc_dev),
1086 RAW_PART), wdstrategy, lp,
1087 wd->sc_dk.dk_cpulabel);
1088 if (errstring) {
1089 /*
1090 * This probably happened because the drive's default
1091 * geometry doesn't match the DOS geometry. We
1092 * assume the DOS geometry is now in the label and try
1093 * again. XXX This is a kluge.
1094 */
1095 if (wd->drvp->state > RESET) {
1096 s = splbio();
1097 wd->drvp->drive_flags |= DRIVE_RESET;
1098 splx(s);
1099 }
1100 errstring = readdisklabel(MAKEWDDEV(0, device_unit(wd->sc_dev),
1101 RAW_PART), wdstrategy, lp, wd->sc_dk.dk_cpulabel);
1102 }
1103 if (errstring) {
1104 aprint_error_dev(wd->sc_dev, "%s\n", errstring);
1105 return;
1106 }
1107
1108 if (wd->drvp->state > RESET) {
1109 s = splbio();
1110 wd->drvp->drive_flags |= DRIVE_RESET;
1111 splx(s);
1112 }
1113 #ifdef HAS_BAD144_HANDLING
1114 if ((lp->d_flags & D_BADSECT) != 0)
1115 bad144intern(wd);
1116 #endif
1117 }
1118
1119 void
1120 wdperror(const struct wd_softc *wd)
1121 {
1122 static const char *const errstr0_3[] = {"address mark not found",
1123 "track 0 not found", "aborted command", "media change requested",
1124 "id not found", "media changed", "uncorrectable data error",
1125 "bad block detected"};
1126 static const char *const errstr4_5[] = {
1127 "obsolete (address mark not found)",
1128 "no media/write protected", "aborted command",
1129 "media change requested", "id not found", "media changed",
1130 "uncorrectable data error", "interface CRC error"};
1131 const char *const *errstr;
1132 int i;
1133 const char *sep = "";
1134
1135 const char *devname = device_xname(wd->sc_dev);
1136 struct ata_drive_datas *drvp = wd->drvp;
1137 int errno = wd->sc_wdc_bio.r_error;
1138
1139 if (drvp->ata_vers >= 4)
1140 errstr = errstr4_5;
1141 else
1142 errstr = errstr0_3;
1143
1144 printf("%s: (", devname);
1145
1146 if (errno == 0)
1147 printf("error not notified");
1148
1149 for (i = 0; i < 8; i++) {
1150 if (errno & (1 << i)) {
1151 printf("%s%s", sep, errstr[i]);
1152 sep = ", ";
1153 }
1154 }
1155 printf(")\n");
1156 }
1157
1158 int
1159 wdioctl(dev_t dev, u_long xfer, void *addr, int flag, struct lwp *l)
1160 {
1161 struct wd_softc *wd =
1162 device_lookup_private(&wd_cd, WDUNIT(dev));
1163 int error = 0, s;
1164 #ifdef __HAVE_OLD_DISKLABEL
1165 struct disklabel *newlabel = NULL;
1166 #endif
1167
1168 ATADEBUG_PRINT(("wdioctl\n"), DEBUG_FUNCS);
1169
1170 if ((wd->sc_flags & WDF_LOADED) == 0)
1171 return EIO;
1172
1173 error = disk_ioctl(&wd->sc_dk, xfer, addr, flag, l);
1174 if (error != EPASSTHROUGH)
1175 return (error);
1176
1177 switch (xfer) {
1178 #ifdef HAS_BAD144_HANDLING
1179 case DIOCSBAD:
1180 if ((flag & FWRITE) == 0)
1181 return EBADF;
1182 wd->sc_dk.dk_cpulabel->bad = *(struct dkbad *)addr;
1183 wd->sc_dk.dk_label->d_flags |= D_BADSECT;
1184 bad144intern(wd);
1185 return 0;
1186 #endif
1187 #ifdef WD_SOFTBADSECT
1188 case DIOCBSLIST :
1189 {
1190 u_int32_t count, missing, skip;
1191 struct disk_badsecinfo dbsi;
1192 struct disk_badsectors *dbs;
1193 size_t available;
1194 uint8_t *laddr;
1195
1196 dbsi = *(struct disk_badsecinfo *)addr;
1197 missing = wd->sc_bscount;
1198 count = 0;
1199 available = dbsi.dbsi_bufsize;
1200 skip = dbsi.dbsi_skip;
1201 laddr = (uint8_t *)dbsi.dbsi_buffer;
1202
1203 /*
1204 * We start this loop with the expectation that all of the
1205 * entries will be missed and decrement this counter each
1206 * time we either skip over one (already copied out) or
1207 * we actually copy it back to user space. The structs
1208 * holding the bad sector information are copied directly
1209 * back to user space whilst the summary is returned via
1210 * the struct passed in via the ioctl.
1211 */
1212 SLIST_FOREACH(dbs, &wd->sc_bslist, dbs_next) {
1213 if (skip > 0) {
1214 missing--;
1215 skip--;
1216 continue;
1217 }
1218 if (available < sizeof(*dbs))
1219 break;
1220 available -= sizeof(*dbs);
1221 copyout(dbs, laddr, sizeof(*dbs));
1222 laddr += sizeof(*dbs);
1223 missing--;
1224 count++;
1225 }
1226 dbsi.dbsi_left = missing;
1227 dbsi.dbsi_copied = count;
1228 *(struct disk_badsecinfo *)addr = dbsi;
1229 return 0;
1230 }
1231
1232 case DIOCBSFLUSH :
1233 /* Clean out the bad sector list */
1234 while (!SLIST_EMPTY(&wd->sc_bslist)) {
1235 void *head = SLIST_FIRST(&wd->sc_bslist);
1236 SLIST_REMOVE_HEAD(&wd->sc_bslist, dbs_next);
1237 free(head, M_TEMP);
1238 }
1239 wd->sc_bscount = 0;
1240 return 0;
1241 #endif
1242 case DIOCGDINFO:
1243 *(struct disklabel *)addr = *(wd->sc_dk.dk_label);
1244 return 0;
1245 #ifdef __HAVE_OLD_DISKLABEL
1246 case ODIOCGDINFO:
1247 newlabel = malloc(sizeof *newlabel, M_TEMP, M_WAITOK);
1248 if (newlabel == NULL)
1249 return EIO;
1250 *newlabel = *(wd->sc_dk.dk_label);
1251 if (newlabel->d_npartitions <= OLDMAXPARTITIONS)
1252 memcpy(addr, newlabel, sizeof (struct olddisklabel));
1253 else
1254 error = ENOTTY;
1255 free(newlabel, M_TEMP);
1256 return error;
1257 #endif
1258
1259 case DIOCGPART:
1260 ((struct partinfo *)addr)->disklab = wd->sc_dk.dk_label;
1261 ((struct partinfo *)addr)->part =
1262 &wd->sc_dk.dk_label->d_partitions[WDPART(dev)];
1263 return 0;
1264
1265 case DIOCWDINFO:
1266 case DIOCSDINFO:
1267 #ifdef __HAVE_OLD_DISKLABEL
1268 case ODIOCWDINFO:
1269 case ODIOCSDINFO:
1270 #endif
1271 {
1272 struct disklabel *lp;
1273
1274 if ((flag & FWRITE) == 0)
1275 return EBADF;
1276
1277 #ifdef __HAVE_OLD_DISKLABEL
1278 if (xfer == ODIOCSDINFO || xfer == ODIOCWDINFO) {
1279 newlabel = malloc(sizeof *newlabel, M_TEMP, M_WAITOK);
1280 if (newlabel == NULL)
1281 return EIO;
1282 memset(newlabel, 0, sizeof newlabel);
1283 memcpy(newlabel, addr, sizeof (struct olddisklabel));
1284 lp = newlabel;
1285 } else
1286 #endif
1287 lp = (struct disklabel *)addr;
1288
1289 mutex_enter(&wd->sc_dk.dk_openlock);
1290 wd->sc_flags |= WDF_LABELLING;
1291
1292 error = setdisklabel(wd->sc_dk.dk_label,
1293 lp, /*wd->sc_dk.dk_openmask : */0,
1294 wd->sc_dk.dk_cpulabel);
1295 if (error == 0) {
1296 if (wd->drvp->state > RESET) {
1297 s = splbio();
1298 wd->drvp->drive_flags |= DRIVE_RESET;
1299 splx(s);
1300 }
1301 if (xfer == DIOCWDINFO
1302 #ifdef __HAVE_OLD_DISKLABEL
1303 || xfer == ODIOCWDINFO
1304 #endif
1305 )
1306 error = writedisklabel(WDLABELDEV(dev),
1307 wdstrategy, wd->sc_dk.dk_label,
1308 wd->sc_dk.dk_cpulabel);
1309 }
1310
1311 wd->sc_flags &= ~WDF_LABELLING;
1312 mutex_exit(&wd->sc_dk.dk_openlock);
1313 #ifdef __HAVE_OLD_DISKLABEL
1314 if (newlabel != NULL)
1315 free(newlabel, M_TEMP);
1316 #endif
1317 return error;
1318 }
1319
1320 case DIOCKLABEL:
1321 if (*(int *)addr)
1322 wd->sc_flags |= WDF_KLABEL;
1323 else
1324 wd->sc_flags &= ~WDF_KLABEL;
1325 return 0;
1326
1327 case DIOCWLABEL:
1328 if ((flag & FWRITE) == 0)
1329 return EBADF;
1330 if (*(int *)addr)
1331 wd->sc_flags |= WDF_WLABEL;
1332 else
1333 wd->sc_flags &= ~WDF_WLABEL;
1334 return 0;
1335
1336 case DIOCGDEFLABEL:
1337 wdgetdefaultlabel(wd, (struct disklabel *)addr);
1338 return 0;
1339 #ifdef __HAVE_OLD_DISKLABEL
1340 case ODIOCGDEFLABEL:
1341 newlabel = malloc(sizeof *newlabel, M_TEMP, M_WAITOK);
1342 if (newlabel == NULL)
1343 return EIO;
1344 wdgetdefaultlabel(wd, newlabel);
1345 if (newlabel->d_npartitions <= OLDMAXPARTITIONS)
1346 memcpy(addr, &newlabel, sizeof (struct olddisklabel));
1347 else
1348 error = ENOTTY;
1349 free(newlabel, M_TEMP);
1350 return error;
1351 #endif
1352
1353 #ifdef notyet
1354 case DIOCWFORMAT:
1355 if ((flag & FWRITE) == 0)
1356 return EBADF;
1357 {
1358 register struct format_op *fop;
1359 struct iovec aiov;
1360 struct uio auio;
1361
1362 fop = (struct format_op *)addr;
1363 aiov.iov_base = fop->df_buf;
1364 aiov.iov_len = fop->df_count;
1365 auio.uio_iov = &aiov;
1366 auio.uio_iovcnt = 1;
1367 auio.uio_resid = fop->df_count;
1368 auio.uio_offset =
1369 fop->df_startblk * wd->sc_dk.dk_label->d_secsize;
1370 auio.uio_vmspace = l->l_proc->p_vmspace;
1371 error = physio(wdformat, NULL, dev, B_WRITE, wdminphys,
1372 &auio);
1373 fop->df_count -= auio.uio_resid;
1374 fop->df_reg[0] = wdc->sc_status;
1375 fop->df_reg[1] = wdc->sc_error;
1376 return error;
1377 }
1378 #endif
1379 case DIOCGCACHE:
1380 return wd_getcache(wd, (int *)addr);
1381
1382 case DIOCSCACHE:
1383 return wd_setcache(wd, *(int *)addr);
1384
1385 case DIOCCACHESYNC:
1386 return wd_flushcache(wd, AT_WAIT);
1387
1388 case ATAIOCCOMMAND:
1389 /*
1390 * Make sure this command is (relatively) safe first
1391 */
1392 if ((((atareq_t *) addr)->flags & ATACMD_READ) == 0 &&
1393 (flag & FWRITE) == 0)
1394 return (EBADF);
1395 {
1396 struct wd_ioctl *wi;
1397 atareq_t *atareq = (atareq_t *) addr;
1398 int error1;
1399
1400 wi = wi_get();
1401 wi->wi_softc = wd;
1402 wi->wi_atareq = *atareq;
1403
1404 if (atareq->datalen && atareq->flags &
1405 (ATACMD_READ | ATACMD_WRITE)) {
1406 void *tbuf;
1407 if (atareq->datalen < DEV_BSIZE
1408 && atareq->command == WDCC_IDENTIFY) {
1409 tbuf = malloc(DEV_BSIZE, M_TEMP, M_WAITOK);
1410 wi->wi_iov.iov_base = tbuf;
1411 wi->wi_iov.iov_len = DEV_BSIZE;
1412 UIO_SETUP_SYSSPACE(&wi->wi_uio);
1413 } else {
1414 tbuf = NULL;
1415 wi->wi_iov.iov_base = atareq->databuf;
1416 wi->wi_iov.iov_len = atareq->datalen;
1417 wi->wi_uio.uio_vmspace = l->l_proc->p_vmspace;
1418 }
1419 wi->wi_uio.uio_iov = &wi->wi_iov;
1420 wi->wi_uio.uio_iovcnt = 1;
1421 wi->wi_uio.uio_resid = atareq->datalen;
1422 wi->wi_uio.uio_offset = 0;
1423 wi->wi_uio.uio_rw =
1424 (atareq->flags & ATACMD_READ) ? B_READ : B_WRITE;
1425 error1 = physio(wdioctlstrategy, &wi->wi_bp, dev,
1426 (atareq->flags & ATACMD_READ) ? B_READ : B_WRITE,
1427 wdminphys, &wi->wi_uio);
1428 if (tbuf != NULL && error1 == 0) {
1429 error1 = copyout(tbuf, atareq->databuf,
1430 atareq->datalen);
1431 free(tbuf, M_TEMP);
1432 }
1433 } else {
1434 /* No need to call physio if we don't have any
1435 user data */
1436 wi->wi_bp.b_flags = 0;
1437 wi->wi_bp.b_data = 0;
1438 wi->wi_bp.b_bcount = 0;
1439 wi->wi_bp.b_dev = 0;
1440 wi->wi_bp.b_proc = l->l_proc;
1441 wdioctlstrategy(&wi->wi_bp);
1442 error1 = wi->wi_bp.b_error;
1443 }
1444 *atareq = wi->wi_atareq;
1445 wi_free(wi);
1446 return(error1);
1447 }
1448
1449 case DIOCAWEDGE:
1450 {
1451 struct dkwedge_info *dkw = (void *) addr;
1452
1453 if ((flag & FWRITE) == 0)
1454 return (EBADF);
1455
1456 /* If the ioctl happens here, the parent is us. */
1457 strcpy(dkw->dkw_parent, device_xname(wd->sc_dev));
1458 return (dkwedge_add(dkw));
1459 }
1460
1461 case DIOCDWEDGE:
1462 {
1463 struct dkwedge_info *dkw = (void *) addr;
1464
1465 if ((flag & FWRITE) == 0)
1466 return (EBADF);
1467
1468 /* If the ioctl happens here, the parent is us. */
1469 strcpy(dkw->dkw_parent, device_xname(wd->sc_dev));
1470 return (dkwedge_del(dkw));
1471 }
1472
1473 case DIOCLWEDGES:
1474 {
1475 struct dkwedge_list *dkwl = (void *) addr;
1476
1477 return (dkwedge_list(&wd->sc_dk, dkwl, l));
1478 }
1479
1480 case DIOCGSTRATEGY:
1481 {
1482 struct disk_strategy *dks = (void *)addr;
1483
1484 s = splbio();
1485 strlcpy(dks->dks_name, bufq_getstrategyname(wd->sc_q),
1486 sizeof(dks->dks_name));
1487 splx(s);
1488 dks->dks_paramlen = 0;
1489
1490 return 0;
1491 }
1492
1493 case DIOCSSTRATEGY:
1494 {
1495 struct disk_strategy *dks = (void *)addr;
1496 struct bufq_state *new;
1497 struct bufq_state *old;
1498
1499 if ((flag & FWRITE) == 0) {
1500 return EBADF;
1501 }
1502 if (dks->dks_param != NULL) {
1503 return EINVAL;
1504 }
1505 dks->dks_name[sizeof(dks->dks_name) - 1] = 0; /* ensure term */
1506 error = bufq_alloc(&new, dks->dks_name,
1507 BUFQ_EXACT|BUFQ_SORT_RAWBLOCK);
1508 if (error) {
1509 return error;
1510 }
1511 s = splbio();
1512 old = wd->sc_q;
1513 bufq_move(new, old);
1514 wd->sc_q = new;
1515 splx(s);
1516 bufq_free(old);
1517
1518 return 0;
1519 }
1520
1521 default:
1522 return ENOTTY;
1523 }
1524
1525 #ifdef DIAGNOSTIC
1526 panic("wdioctl: impossible");
1527 #endif
1528 }
1529
1530 #ifdef B_FORMAT
1531 int
1532 wdformat(struct buf *bp)
1533 {
1534
1535 bp->b_flags |= B_FORMAT;
1536 return wdstrategy(bp);
1537 }
1538 #endif
1539
1540 int
1541 wdsize(dev_t dev)
1542 {
1543 struct wd_softc *wd;
1544 int part, omask;
1545 int size;
1546
1547 ATADEBUG_PRINT(("wdsize\n"), DEBUG_FUNCS);
1548
1549 wd = device_lookup_private(&wd_cd, WDUNIT(dev));
1550 if (wd == NULL)
1551 return (-1);
1552
1553 part = WDPART(dev);
1554 omask = wd->sc_dk.dk_openmask & (1 << part);
1555
1556 if (omask == 0 && wdopen(dev, 0, S_IFBLK, NULL) != 0)
1557 return (-1);
1558 if (wd->sc_dk.dk_label->d_partitions[part].p_fstype != FS_SWAP)
1559 size = -1;
1560 else
1561 size = wd->sc_dk.dk_label->d_partitions[part].p_size *
1562 (wd->sc_dk.dk_label->d_secsize / DEV_BSIZE);
1563 if (omask == 0 && wdclose(dev, 0, S_IFBLK, NULL) != 0)
1564 return (-1);
1565 return (size);
1566 }
1567
1568 /* #define WD_DUMP_NOT_TRUSTED if you just want to watch */
1569 static int wddoingadump = 0;
1570 static int wddumprecalibrated = 0;
1571
1572 /*
1573 * Dump core after a system crash.
1574 */
1575 int
1576 wddump(dev_t dev, daddr_t blkno, void *va, size_t size)
1577 {
1578 struct wd_softc *wd; /* disk unit to do the I/O */
1579 struct disklabel *lp; /* disk's disklabel */
1580 int part, err;
1581 int nblks; /* total number of sectors left to write */
1582
1583 /* Check if recursive dump; if so, punt. */
1584 if (wddoingadump)
1585 return EFAULT;
1586 wddoingadump = 1;
1587
1588 wd = device_lookup_private(&wd_cd, WDUNIT(dev));
1589 if (wd == NULL)
1590 return (ENXIO);
1591
1592 part = WDPART(dev);
1593
1594 /* Convert to disk sectors. Request must be a multiple of size. */
1595 lp = wd->sc_dk.dk_label;
1596 if ((size % lp->d_secsize) != 0)
1597 return EFAULT;
1598 nblks = size / lp->d_secsize;
1599 blkno = blkno / (lp->d_secsize / DEV_BSIZE);
1600
1601 /* Check transfer bounds against partition size. */
1602 if ((blkno < 0) || ((blkno + nblks) > lp->d_partitions[part].p_size))
1603 return EINVAL;
1604
1605 /* Offset block number to start of partition. */
1606 blkno += lp->d_partitions[part].p_offset;
1607
1608 /* Recalibrate, if first dump transfer. */
1609 if (wddumprecalibrated == 0) {
1610 wddumprecalibrated = 1;
1611 (*wd->atabus->ata_reset_drive)(wd->drvp,
1612 AT_POLL | AT_RST_EMERG);
1613 wd->drvp->state = RESET;
1614 }
1615
1616 wd->sc_bp = NULL;
1617 wd->sc_wdc_bio.blkno = blkno;
1618 wd->sc_wdc_bio.flags = ATA_POLL;
1619 if (wd->sc_flags & WDF_LBA48 &&
1620 (wd->sc_wdc_bio.blkno + nblks) > wd->sc_capacity28)
1621 wd->sc_wdc_bio.flags |= ATA_LBA48;
1622 if (wd->sc_flags & WDF_LBA)
1623 wd->sc_wdc_bio.flags |= ATA_LBA;
1624 wd->sc_wdc_bio.bcount = nblks * lp->d_secsize;
1625 wd->sc_wdc_bio.databuf = va;
1626 #ifndef WD_DUMP_NOT_TRUSTED
1627 switch (err = wd->atabus->ata_bio(wd->drvp, &wd->sc_wdc_bio)) {
1628 case ATACMD_TRY_AGAIN:
1629 panic("wddump: try again");
1630 break;
1631 case ATACMD_QUEUED:
1632 panic("wddump: polled command has been queued");
1633 break;
1634 case ATACMD_COMPLETE:
1635 break;
1636 default:
1637 panic("wddump: unknown atacmd code %d", err);
1638 }
1639 switch(err = wd->sc_wdc_bio.error) {
1640 case TIMEOUT:
1641 printf("wddump: device timed out");
1642 err = EIO;
1643 break;
1644 case ERR_DF:
1645 printf("wddump: drive fault");
1646 err = EIO;
1647 break;
1648 case ERR_DMA:
1649 printf("wddump: DMA error");
1650 err = EIO;
1651 break;
1652 case ERROR:
1653 printf("wddump: ");
1654 wdperror(wd);
1655 err = EIO;
1656 break;
1657 case NOERROR:
1658 err = 0;
1659 break;
1660 default:
1661 panic("wddump: unknown error type %d", err);
1662 }
1663 if (err != 0) {
1664 printf("\n");
1665 return err;
1666 }
1667 #else /* WD_DUMP_NOT_TRUSTED */
1668 /* Let's just talk about this first... */
1669 printf("wd%d: dump addr 0x%x, cylin %d, head %d, sector %d\n",
1670 unit, va, cylin, head, sector);
1671 delay(500 * 1000); /* half a second */
1672 #endif
1673
1674 wddoingadump = 0;
1675 return 0;
1676 }
1677
1678 #ifdef HAS_BAD144_HANDLING
1679 /*
1680 * Internalize the bad sector table.
1681 */
1682 void
1683 bad144intern(struct wd_softc *wd)
1684 {
1685 struct dkbad *bt = &wd->sc_dk.dk_cpulabel->bad;
1686 struct disklabel *lp = wd->sc_dk.dk_label;
1687 int i = 0;
1688
1689 ATADEBUG_PRINT(("bad144intern\n"), DEBUG_XFERS);
1690
1691 for (; i < NBT_BAD; i++) {
1692 if (bt->bt_bad[i].bt_cyl == 0xffff)
1693 break;
1694 wd->sc_badsect[i] =
1695 bt->bt_bad[i].bt_cyl * lp->d_secpercyl +
1696 (bt->bt_bad[i].bt_trksec >> 8) * lp->d_nsectors +
1697 (bt->bt_bad[i].bt_trksec & 0xff);
1698 }
1699 for (; i < NBT_BAD+1; i++)
1700 wd->sc_badsect[i] = -1;
1701 }
1702 #endif
1703
1704 static void
1705 wd_params_to_properties(struct wd_softc *wd, struct ataparams *params)
1706 {
1707 prop_dictionary_t disk_info, odisk_info, geom;
1708 const char *cp;
1709
1710 disk_info = prop_dictionary_create();
1711
1712 if (strcmp(wd->sc_params.atap_model, "ST506") == 0)
1713 cp = "ST506";
1714 else {
1715 /* XXX Should have a case for ATA here, too. */
1716 cp = "ESDI";
1717 }
1718 prop_dictionary_set_cstring_nocopy(disk_info, "type", cp);
1719
1720 geom = prop_dictionary_create();
1721
1722 prop_dictionary_set_uint64(geom, "sectors-per-unit", wd->sc_capacity);
1723
1724 prop_dictionary_set_uint32(geom, "sector-size",
1725 DEV_BSIZE /* XXX 512? */);
1726
1727 prop_dictionary_set_uint16(geom, "sectors-per-track",
1728 wd->sc_params.atap_sectors);
1729
1730 prop_dictionary_set_uint16(geom, "tracks-per-cylinder",
1731 wd->sc_params.atap_heads);
1732
1733 if (wd->sc_flags & WDF_LBA)
1734 prop_dictionary_set_uint64(geom, "cylinders-per-unit",
1735 wd->sc_capacity /
1736 (wd->sc_params.atap_heads *
1737 wd->sc_params.atap_sectors));
1738 else
1739 prop_dictionary_set_uint16(geom, "cylinders-per-unit",
1740 wd->sc_params.atap_cylinders);
1741
1742 prop_dictionary_set(disk_info, "geometry", geom);
1743 prop_object_release(geom);
1744
1745 prop_dictionary_set(device_properties(wd->sc_dev),
1746 "disk-info", disk_info);
1747
1748 /*
1749 * Don't release disk_info here; we keep a reference to it.
1750 * disk_detach() will release it when we go away.
1751 */
1752
1753 odisk_info = wd->sc_dk.dk_info;
1754 wd->sc_dk.dk_info = disk_info;
1755 if (odisk_info)
1756 prop_object_release(odisk_info);
1757 }
1758
1759 int
1760 wd_get_params(struct wd_softc *wd, u_int8_t flags, struct ataparams *params)
1761 {
1762
1763 switch (wd->atabus->ata_get_params(wd->drvp, flags, params)) {
1764 case CMD_AGAIN:
1765 return 1;
1766 case CMD_ERR:
1767 /*
1768 * We `know' there's a drive here; just assume it's old.
1769 * This geometry is only used to read the MBR and print a
1770 * (false) attach message.
1771 */
1772 strncpy(params->atap_model, "ST506",
1773 sizeof params->atap_model);
1774 params->atap_config = ATA_CFG_FIXED;
1775 params->atap_cylinders = 1024;
1776 params->atap_heads = 8;
1777 params->atap_sectors = 17;
1778 params->atap_multi = 1;
1779 params->atap_capabilities1 = params->atap_capabilities2 = 0;
1780 wd->drvp->ata_vers = -1; /* Mark it as pre-ATA */
1781 /* FALLTHROUGH */
1782 case CMD_OK:
1783 wd_params_to_properties(wd, params);
1784 return 0;
1785 default:
1786 panic("wd_get_params: bad return code from ata_get_params");
1787 /* NOTREACHED */
1788 }
1789 }
1790
1791 int
1792 wd_getcache(struct wd_softc *wd, int *bitsp)
1793 {
1794 struct ataparams params;
1795
1796 if (wd_get_params(wd, AT_WAIT, ¶ms) != 0)
1797 return EIO;
1798 if (params.atap_cmd_set1 == 0x0000 ||
1799 params.atap_cmd_set1 == 0xffff ||
1800 (params.atap_cmd_set1 & WDC_CMD1_CACHE) == 0) {
1801 *bitsp = 0;
1802 return 0;
1803 }
1804 *bitsp = DKCACHE_WCHANGE | DKCACHE_READ;
1805 if (params.atap_cmd1_en & WDC_CMD1_CACHE)
1806 *bitsp |= DKCACHE_WRITE;
1807
1808 return 0;
1809 }
1810
1811 const char at_errbits[] = "\20\10ERROR\11TIMEOU\12DF";
1812
1813 int
1814 wd_setcache(struct wd_softc *wd, int bits)
1815 {
1816 struct ataparams params;
1817 struct ata_command ata_c;
1818
1819 if (wd_get_params(wd, AT_WAIT, ¶ms) != 0)
1820 return EIO;
1821
1822 if (params.atap_cmd_set1 == 0x0000 ||
1823 params.atap_cmd_set1 == 0xffff ||
1824 (params.atap_cmd_set1 & WDC_CMD1_CACHE) == 0)
1825 return EOPNOTSUPP;
1826
1827 if ((bits & DKCACHE_READ) == 0 ||
1828 (bits & DKCACHE_SAVE) != 0)
1829 return EOPNOTSUPP;
1830
1831 memset(&ata_c, 0, sizeof(struct ata_command));
1832 ata_c.r_command = SET_FEATURES;
1833 ata_c.r_st_bmask = 0;
1834 ata_c.r_st_pmask = 0;
1835 ata_c.timeout = 30000; /* 30s timeout */
1836 ata_c.flags = AT_WAIT;
1837 if (bits & DKCACHE_WRITE)
1838 ata_c.r_features = WDSF_WRITE_CACHE_EN;
1839 else
1840 ata_c.r_features = WDSF_WRITE_CACHE_DS;
1841 if (wd->atabus->ata_exec_command(wd->drvp, &ata_c) != ATACMD_COMPLETE) {
1842 aprint_error_dev(wd->sc_dev,
1843 "wd_setcache command not complete\n");
1844 return EIO;
1845 }
1846 if (ata_c.flags & (AT_ERROR | AT_TIMEOU | AT_DF)) {
1847 char sbuf[sizeof(at_errbits) + 64];
1848 snprintb(sbuf, sizeof(sbuf), at_errbits, ata_c.flags);
1849 aprint_error_dev(wd->sc_dev, "wd_setcache: status=%s\n", sbuf);
1850 return EIO;
1851 }
1852 return 0;
1853 }
1854
1855 static int
1856 wd_standby(struct wd_softc *wd, int flags)
1857 {
1858 struct ata_command ata_c;
1859
1860 memset(&ata_c, 0, sizeof(struct ata_command));
1861 ata_c.r_command = WDCC_STANDBY_IMMED;
1862 ata_c.r_st_bmask = WDCS_DRDY;
1863 ata_c.r_st_pmask = WDCS_DRDY;
1864 ata_c.flags = flags;
1865 ata_c.timeout = 30000; /* 30s timeout */
1866 if (wd->atabus->ata_exec_command(wd->drvp, &ata_c) != ATACMD_COMPLETE) {
1867 aprint_error_dev(wd->sc_dev,
1868 "standby immediate command didn't complete\n");
1869 return EIO;
1870 }
1871 if (ata_c.flags & AT_ERROR) {
1872 if (ata_c.r_error == WDCE_ABRT) /* command not supported */
1873 return ENODEV;
1874 }
1875 if (ata_c.flags & (AT_ERROR | AT_TIMEOU | AT_DF)) {
1876 char sbuf[sizeof(at_errbits) + 64];
1877 snprintb(sbuf, sizeof(sbuf), at_errbits, ata_c.flags);
1878 aprint_error_dev(wd->sc_dev, "wd_standby: status=%s\n", sbuf);
1879 return EIO;
1880 }
1881 return 0;
1882 }
1883
1884 int
1885 wd_flushcache(struct wd_softc *wd, int flags)
1886 {
1887 struct ata_command ata_c;
1888
1889 /*
1890 * WDCC_FLUSHCACHE is here since ATA-4, but some drives report
1891 * only ATA-2 and still support it.
1892 */
1893 if (wd->drvp->ata_vers < 4 &&
1894 ((wd->sc_params.atap_cmd_set2 & WDC_CMD2_FC) == 0 ||
1895 wd->sc_params.atap_cmd_set2 == 0xffff))
1896 return ENODEV;
1897 memset(&ata_c, 0, sizeof(struct ata_command));
1898 if ((wd->sc_params.atap_cmd2_en & ATA_CMD2_LBA48) != 0 &&
1899 (wd->sc_params.atap_cmd2_en & ATA_CMD2_FCE) != 0)
1900 ata_c.r_command = WDCC_FLUSHCACHE_EXT;
1901 else
1902 ata_c.r_command = WDCC_FLUSHCACHE;
1903 ata_c.r_st_bmask = WDCS_DRDY;
1904 ata_c.r_st_pmask = WDCS_DRDY;
1905 ata_c.flags = flags;
1906 ata_c.timeout = 30000; /* 30s timeout */
1907 if (wd->atabus->ata_exec_command(wd->drvp, &ata_c) != ATACMD_COMPLETE) {
1908 aprint_error_dev(wd->sc_dev,
1909 "flush cache command didn't complete\n");
1910 return EIO;
1911 }
1912 if (ata_c.flags & AT_ERROR) {
1913 if (ata_c.r_error == WDCE_ABRT) /* command not supported */
1914 return ENODEV;
1915 }
1916 if (ata_c.flags & (AT_ERROR | AT_TIMEOU | AT_DF)) {
1917 char sbuf[sizeof(at_errbits) + 64];
1918 snprintb(sbuf, sizeof(sbuf), at_errbits, ata_c.flags);
1919 aprint_error_dev(wd->sc_dev, "wd_flushcache: status=%s\n",
1920 sbuf);
1921 return EIO;
1922 }
1923 return 0;
1924 }
1925
1926 bool
1927 wd_shutdown(device_t dev, int how)
1928 {
1929 struct wd_softc *wd = device_private(dev);
1930
1931 /* the adapter needs to be enabled */
1932 if (wd->atabus->ata_addref(wd->drvp))
1933 return true; /* no need to complain */
1934
1935 wd_flushcache(wd, AT_POLL);
1936 if ((how & RB_POWERDOWN) == RB_POWERDOWN)
1937 wd_standby(wd, AT_POLL);
1938 return true;
1939 }
1940
1941 /*
1942 * Allocate space for a ioctl queue structure. Mostly taken from
1943 * scsipi_ioctl.c
1944 */
1945 struct wd_ioctl *
1946 wi_get(void)
1947 {
1948 struct wd_ioctl *wi;
1949 int s;
1950
1951 wi = malloc(sizeof(struct wd_ioctl), M_TEMP, M_WAITOK|M_ZERO);
1952 buf_init(&wi->wi_bp);
1953 s = splbio();
1954 LIST_INSERT_HEAD(&wi_head, wi, wi_list);
1955 splx(s);
1956 return (wi);
1957 }
1958
1959 /*
1960 * Free an ioctl structure and remove it from our list
1961 */
1962
1963 void
1964 wi_free(struct wd_ioctl *wi)
1965 {
1966 int s;
1967
1968 s = splbio();
1969 LIST_REMOVE(wi, wi_list);
1970 splx(s);
1971 buf_destroy(&wi->wi_bp);
1972 free(wi, M_TEMP);
1973 }
1974
1975 /*
1976 * Find a wd_ioctl structure based on the struct buf.
1977 */
1978
1979 struct wd_ioctl *
1980 wi_find(struct buf *bp)
1981 {
1982 struct wd_ioctl *wi;
1983 int s;
1984
1985 s = splbio();
1986 for (wi = wi_head.lh_first; wi != 0; wi = wi->wi_list.le_next)
1987 if (bp == &wi->wi_bp)
1988 break;
1989 splx(s);
1990 return (wi);
1991 }
1992
1993 /*
1994 * Ioctl pseudo strategy routine
1995 *
1996 * This is mostly stolen from scsipi_ioctl.c:scsistrategy(). What
1997 * happens here is:
1998 *
1999 * - wdioctl() queues a wd_ioctl structure.
2000 *
2001 * - wdioctl() calls physio/wdioctlstrategy based on whether or not
2002 * user space I/O is required. If physio() is called, physio() eventually
2003 * calls wdioctlstrategy().
2004 *
2005 * - In either case, wdioctlstrategy() calls wd->atabus->ata_exec_command()
2006 * to perform the actual command
2007 *
2008 * The reason for the use of the pseudo strategy routine is because
2009 * when doing I/O to/from user space, physio _really_ wants to be in
2010 * the loop. We could put the entire buffer into the ioctl request
2011 * structure, but that won't scale if we want to do things like download
2012 * microcode.
2013 */
2014
2015 void
2016 wdioctlstrategy(struct buf *bp)
2017 {
2018 struct wd_ioctl *wi;
2019 struct ata_command ata_c;
2020 int error = 0;
2021
2022 wi = wi_find(bp);
2023 if (wi == NULL) {
2024 printf("wdioctlstrategy: "
2025 "No matching ioctl request found in queue\n");
2026 error = EINVAL;
2027 goto bad;
2028 }
2029
2030 memset(&ata_c, 0, sizeof(ata_c));
2031
2032 /*
2033 * Abort if physio broke up the transfer
2034 */
2035
2036 if (bp->b_bcount != wi->wi_atareq.datalen) {
2037 printf("physio split wd ioctl request... cannot proceed\n");
2038 error = EIO;
2039 goto bad;
2040 }
2041
2042 /*
2043 * Abort if we didn't get a buffer size that was a multiple of
2044 * our sector size (or was larger than NBBY)
2045 */
2046
2047 if ((bp->b_bcount % wi->wi_softc->sc_dk.dk_label->d_secsize) != 0 ||
2048 (bp->b_bcount / wi->wi_softc->sc_dk.dk_label->d_secsize) >=
2049 (1 << NBBY)) {
2050 error = EINVAL;
2051 goto bad;
2052 }
2053
2054 /*
2055 * Make sure a timeout was supplied in the ioctl request
2056 */
2057
2058 if (wi->wi_atareq.timeout == 0) {
2059 error = EINVAL;
2060 goto bad;
2061 }
2062
2063 if (wi->wi_atareq.flags & ATACMD_READ)
2064 ata_c.flags |= AT_READ;
2065 else if (wi->wi_atareq.flags & ATACMD_WRITE)
2066 ata_c.flags |= AT_WRITE;
2067
2068 if (wi->wi_atareq.flags & ATACMD_READREG)
2069 ata_c.flags |= AT_READREG;
2070
2071 ata_c.flags |= AT_WAIT;
2072
2073 ata_c.timeout = wi->wi_atareq.timeout;
2074 ata_c.r_command = wi->wi_atareq.command;
2075 ata_c.r_head = wi->wi_atareq.head & 0x0f;
2076 ata_c.r_cyl = wi->wi_atareq.cylinder;
2077 ata_c.r_sector = wi->wi_atareq.sec_num;
2078 ata_c.r_count = wi->wi_atareq.sec_count;
2079 ata_c.r_features = wi->wi_atareq.features;
2080 ata_c.r_st_bmask = WDCS_DRDY;
2081 ata_c.r_st_pmask = WDCS_DRDY;
2082 ata_c.data = wi->wi_bp.b_data;
2083 ata_c.bcount = wi->wi_bp.b_bcount;
2084
2085 if (wi->wi_softc->atabus->ata_exec_command(wi->wi_softc->drvp, &ata_c)
2086 != ATACMD_COMPLETE) {
2087 wi->wi_atareq.retsts = ATACMD_ERROR;
2088 goto bad;
2089 }
2090
2091 if (ata_c.flags & (AT_ERROR | AT_TIMEOU | AT_DF)) {
2092 if (ata_c.flags & AT_ERROR) {
2093 wi->wi_atareq.retsts = ATACMD_ERROR;
2094 wi->wi_atareq.error = ata_c.r_error;
2095 } else if (ata_c.flags & AT_DF)
2096 wi->wi_atareq.retsts = ATACMD_DF;
2097 else
2098 wi->wi_atareq.retsts = ATACMD_TIMEOUT;
2099 } else {
2100 wi->wi_atareq.retsts = ATACMD_OK;
2101 if (wi->wi_atareq.flags & ATACMD_READREG) {
2102 wi->wi_atareq.head = ata_c.r_head ;
2103 wi->wi_atareq.cylinder = ata_c.r_cyl;
2104 wi->wi_atareq.sec_num = ata_c.r_sector;
2105 wi->wi_atareq.sec_count = ata_c.r_count;
2106 wi->wi_atareq.features = ata_c.r_features;
2107 wi->wi_atareq.error = ata_c.r_error;
2108 }
2109 }
2110
2111 bp->b_error = 0;
2112 biodone(bp);
2113 return;
2114 bad:
2115 bp->b_error = error;
2116 biodone(bp);
2117 }
2118