wd.c revision 1.443 1 /* $NetBSD: wd.c,v 1.443 2018/10/24 19:46:44 jdolecek 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.443 2018/10/24 19:46:44 jdolecek Exp $");
58
59 #include "opt_ata.h"
60 #include "opt_wd.h"
61
62 #include <sys/param.h>
63 #include <sys/systm.h>
64 #include <sys/kernel.h>
65 #include <sys/conf.h>
66 #include <sys/file.h>
67 #include <sys/stat.h>
68 #include <sys/ioctl.h>
69 #include <sys/buf.h>
70 #include <sys/bufq.h>
71 #include <sys/uio.h>
72 #include <sys/device.h>
73 #include <sys/disklabel.h>
74 #include <sys/disk.h>
75 #include <sys/syslog.h>
76 #include <sys/proc.h>
77 #include <sys/reboot.h>
78 #include <sys/vnode.h>
79 #include <sys/rndsource.h>
80
81 #include <sys/intr.h>
82 #include <sys/bus.h>
83
84 #include <dev/ata/atareg.h>
85 #include <dev/ata/atavar.h>
86 #include <dev/ata/wdvar.h>
87 #include <dev/ic/wdcreg.h>
88 #include <sys/ataio.h>
89 #include "locators.h"
90
91 #include <prop/proplib.h>
92
93 #define WDIORETRIES_SINGLE 4 /* number of retries for single-sector */
94 #define WDIORETRIES 5 /* number of retries before giving up */
95 #define RECOVERYTIME hz/2 /* time to wait before retrying a cmd */
96
97 #define WDUNIT(dev) DISKUNIT(dev)
98 #define WDPART(dev) DISKPART(dev)
99 #define WDMINOR(unit, part) DISKMINOR(unit, part)
100 #define MAKEWDDEV(maj, unit, part) MAKEDISKDEV(maj, unit, part)
101
102 #define WDLABELDEV(dev) (MAKEWDDEV(major(dev), WDUNIT(dev), RAW_PART))
103
104 #define DEBUG_FUNCS 0x08
105 #define DEBUG_PROBE 0x10
106 #define DEBUG_DETACH 0x20
107 #define DEBUG_XFERS 0x40
108 #ifdef ATADEBUG
109 #ifndef ATADEBUG_WD_MASK
110 #define ATADEBUG_WD_MASK 0x0
111 #endif
112 int wdcdebug_wd_mask = ATADEBUG_WD_MASK;
113 #define ATADEBUG_PRINT(args, level) \
114 if (wdcdebug_wd_mask & (level)) \
115 printf args
116 #else
117 #define ATADEBUG_PRINT(args, level)
118 #endif
119
120 static int wdprobe(device_t, cfdata_t, void *);
121 static void wdattach(device_t, device_t, void *);
122 static int wddetach(device_t, int);
123 static void wdperror(const struct wd_softc *, struct ata_xfer *);
124
125 static void wdminphys(struct buf *);
126
127 static int wd_firstopen(device_t, dev_t, int, int);
128 static int wd_lastclose(device_t);
129 static bool wd_suspend(device_t, const pmf_qual_t *);
130 static int wd_standby(struct wd_softc *, int);
131
132 CFATTACH_DECL3_NEW(wd, sizeof(struct wd_softc),
133 wdprobe, wdattach, wddetach, NULL, NULL, NULL, DVF_DETACH_SHUTDOWN);
134
135 extern struct cfdriver wd_cd;
136
137 static dev_type_open(wdopen);
138 static dev_type_close(wdclose);
139 static dev_type_read(wdread);
140 static dev_type_write(wdwrite);
141 static dev_type_ioctl(wdioctl);
142 static dev_type_strategy(wdstrategy);
143 static dev_type_dump(wddump);
144 static dev_type_size(wdsize);
145 static dev_type_discard(wddiscard);
146
147 const struct bdevsw wd_bdevsw = {
148 .d_open = wdopen,
149 .d_close = wdclose,
150 .d_strategy = wdstrategy,
151 .d_ioctl = wdioctl,
152 .d_dump = wddump,
153 .d_psize = wdsize,
154 .d_discard = wddiscard,
155 .d_flag = D_DISK
156 };
157
158 const struct cdevsw wd_cdevsw = {
159 .d_open = wdopen,
160 .d_close = wdclose,
161 .d_read = wdread,
162 .d_write = wdwrite,
163 .d_ioctl = wdioctl,
164 .d_stop = nostop,
165 .d_tty = notty,
166 .d_poll = nopoll,
167 .d_mmap = nommap,
168 .d_kqfilter = nokqfilter,
169 .d_discard = wddiscard,
170 .d_flag = D_DISK
171 };
172
173 /* #define WD_DUMP_NOT_TRUSTED if you just want to watch */
174 static int wddoingadump = 0;
175 static int wddumprecalibrated = 0;
176
177 /*
178 * Glue necessary to hook WDCIOCCOMMAND into physio
179 */
180
181 struct wd_ioctl {
182 LIST_ENTRY(wd_ioctl) wi_list;
183 struct buf wi_bp;
184 struct uio wi_uio;
185 struct iovec wi_iov;
186 atareq_t wi_atareq;
187 struct wd_softc *wi_softc;
188 };
189
190 static struct wd_ioctl *wi_find(struct buf *);
191 static void wi_free(struct wd_ioctl *);
192 static struct wd_ioctl *wi_get(struct wd_softc *);
193 static void wdioctlstrategy(struct buf *);
194
195 static void wdrestart(void *);
196 static void wdstart1(struct wd_softc *, struct buf *, struct ata_xfer *);
197 static int wd_diskstart(device_t, struct buf *);
198 static int wd_dumpblocks(device_t, void *, daddr_t, int);
199 static void wd_iosize(device_t, int *);
200 static int wd_discard(device_t, off_t, off_t);
201 static void wdbioretry(void *);
202 static void wdbiorequeue(void *);
203 static void wddone(device_t, struct ata_xfer *);
204 static int wd_get_params(struct wd_softc *, uint8_t, struct ataparams *);
205 static void wd_set_geometry(struct wd_softc *);
206 static int wd_flushcache(struct wd_softc *, int, bool);
207 static int wd_trim(struct wd_softc *, daddr_t, long);
208 static bool wd_shutdown(device_t, int);
209
210 static int wd_getcache(struct wd_softc *, int *);
211 static int wd_setcache(struct wd_softc *, int);
212
213 static void wd_sysctl_attach(struct wd_softc *);
214 static void wd_sysctl_detach(struct wd_softc *);
215
216 struct dkdriver wddkdriver = {
217 .d_open = wdopen,
218 .d_close = wdclose,
219 .d_strategy = wdstrategy,
220 .d_minphys = wdminphys,
221 .d_diskstart = wd_diskstart,
222 .d_dumpblocks = wd_dumpblocks,
223 .d_iosize = wd_iosize,
224 .d_firstopen = wd_firstopen,
225 .d_lastclose = wd_lastclose,
226 .d_discard = wd_discard
227 };
228
229 #ifdef HAS_BAD144_HANDLING
230 static void bad144intern(struct wd_softc *);
231 #endif
232
233 #define WD_QUIRK_SPLIT_MOD15_WRITE 0x0001 /* must split certain writes */
234
235 #define WD_QUIRK_FMT "\20\1SPLIT_MOD15_WRITE\2FORCE_LBA48"
236
237 /*
238 * Quirk table for IDE drives. Put more-specific matches first, since
239 * a simple globing routine is used for matching.
240 */
241 static const struct wd_quirk {
242 const char *wdq_match; /* inquiry pattern to match */
243 int wdq_quirks; /* drive quirks */
244 } wd_quirk_table[] = {
245 /*
246 * Some Seagate S-ATA drives have a PHY which can get confused
247 * with the way data is packetized by some S-ATA controllers.
248 *
249 * The work-around is to split in two any write transfer whose
250 * sector count % 15 == 1 (assuming 512 byte sectors).
251 *
252 * XXX This is an incomplete list. There are at least a couple
253 * XXX more model numbers. If you have trouble with such transfers
254 * XXX (8K is the most common) on Seagate S-ATA drives, please
255 * XXX notify thorpej (at) NetBSD.org.
256 *
257 * The ST360015AS has not yet been confirmed to have this
258 * issue, however, it is the only other drive in the
259 * Seagate Barracuda Serial ATA V family.
260 *
261 */
262 { "ST3120023AS",
263 WD_QUIRK_SPLIT_MOD15_WRITE },
264 { "ST380023AS",
265 WD_QUIRK_SPLIT_MOD15_WRITE },
266 { "ST360015AS",
267 WD_QUIRK_SPLIT_MOD15_WRITE },
268 { NULL,
269 0 }
270 };
271
272 static const struct wd_quirk *
273 wd_lookup_quirks(const char *name)
274 {
275 const struct wd_quirk *wdq;
276 const char *estr;
277
278 for (wdq = wd_quirk_table; wdq->wdq_match != NULL; wdq++) {
279 /*
280 * We only want exact matches (which include matches
281 * against globbing characters).
282 */
283 if (pmatch(name, wdq->wdq_match, &estr) == 2)
284 return (wdq);
285 }
286 return (NULL);
287 }
288
289 static int
290 wdprobe(device_t parent, cfdata_t match, void *aux)
291 {
292 struct ata_device *adev = aux;
293
294 if (adev == NULL)
295 return 0;
296 if (adev->adev_bustype->bustype_type != SCSIPI_BUSTYPE_ATA)
297 return 0;
298
299 if (match->cf_loc[ATA_HLCF_DRIVE] != ATA_HLCF_DRIVE_DEFAULT &&
300 match->cf_loc[ATA_HLCF_DRIVE] != adev->adev_drv_data->drive)
301 return 0;
302 return 1;
303 }
304
305 static void
306 wdattach(device_t parent, device_t self, void *aux)
307 {
308 struct wd_softc *wd = device_private(self);
309 struct dk_softc *dksc = &wd->sc_dksc;
310 struct ata_device *adev= aux;
311 int i, blank;
312 char tbuf[41], pbuf[9], c, *p, *q;
313 const struct wd_quirk *wdq;
314 int dtype = DKTYPE_UNKNOWN;
315
316 dksc->sc_dev = self;
317
318 ATADEBUG_PRINT(("wdattach\n"), DEBUG_FUNCS | DEBUG_PROBE);
319 mutex_init(&wd->sc_lock, MUTEX_DEFAULT, IPL_BIO);
320 #ifdef WD_SOFTBADSECT
321 SLIST_INIT(&wd->sc_bslist);
322 #endif
323 wd->atabus = adev->adev_bustype;
324 wd->drvp = adev->adev_drv_data;
325
326 wd->drvp->drv_openings = 1;
327 wd->drvp->drv_done = wddone;
328 wd->drvp->drv_softc = dksc->sc_dev; /* done in atabusconfig_thread()
329 but too late */
330
331 SLIST_INIT(&wd->sc_retry_list);
332 SLIST_INIT(&wd->sc_requeue_list);
333 callout_init(&wd->sc_retry_callout, 0); /* XXX MPSAFE */
334 callout_init(&wd->sc_requeue_callout, 0); /* XXX MPSAFE */
335 callout_init(&wd->sc_restart_diskqueue, 0); /* XXX MPSAFE */
336
337 aprint_naive("\n");
338 aprint_normal("\n");
339
340 /* read our drive info */
341 if (wd_get_params(wd, AT_WAIT, &wd->sc_params) != 0) {
342 aprint_error_dev(self, "IDENTIFY failed\n");
343 goto out;
344 }
345
346 for (blank = 0, p = wd->sc_params.atap_model, q = tbuf, i = 0;
347 i < sizeof(wd->sc_params.atap_model); i++) {
348 c = *p++;
349 if (c == '\0')
350 break;
351 if (c != ' ') {
352 if (blank) {
353 *q++ = ' ';
354 blank = 0;
355 }
356 *q++ = c;
357 } else
358 blank = 1;
359 }
360 *q++ = '\0';
361
362 aprint_normal_dev(self, "<%s>\n", tbuf);
363
364 wdq = wd_lookup_quirks(tbuf);
365 if (wdq != NULL)
366 wd->sc_quirks = wdq->wdq_quirks;
367
368 if (wd->sc_quirks != 0) {
369 char sbuf[sizeof(WD_QUIRK_FMT) + 64];
370 snprintb(sbuf, sizeof(sbuf), WD_QUIRK_FMT, wd->sc_quirks);
371 aprint_normal_dev(self, "quirks %s\n", sbuf);
372
373 if (wd->sc_quirks & WD_QUIRK_SPLIT_MOD15_WRITE) {
374 aprint_error_dev(self, "drive corrupts write transfers with certain controllers, consider replacing\n");
375 }
376 }
377
378 if ((wd->sc_params.atap_multi & 0xff) > 1) {
379 wd->drvp->multi = wd->sc_params.atap_multi & 0xff;
380 } else {
381 wd->drvp->multi = 1;
382 }
383
384 aprint_verbose_dev(self, "drive supports %d-sector PIO transfers,",
385 wd->drvp->multi);
386
387 /* 48-bit LBA addressing */
388 if ((wd->sc_params.atap_cmd2_en & ATA_CMD2_LBA48) != 0)
389 wd->sc_flags |= WDF_LBA48;
390
391 /* Prior to ATA-4, LBA was optional. */
392 if ((wd->sc_params.atap_capabilities1 & WDC_CAP_LBA) != 0)
393 wd->sc_flags |= WDF_LBA;
394 #if 0
395 /* ATA-4 requires LBA. */
396 if (wd->sc_params.atap_ataversion != 0xffff &&
397 wd->sc_params.atap_ataversion >= WDC_VER_ATA4)
398 wd->sc_flags |= WDF_LBA;
399 #endif
400
401 if ((wd->sc_flags & WDF_LBA48) != 0) {
402 aprint_verbose(" LBA48 addressing\n");
403 wd->sc_capacity =
404 ((uint64_t) wd->sc_params.atap_max_lba[3] << 48) |
405 ((uint64_t) wd->sc_params.atap_max_lba[2] << 32) |
406 ((uint64_t) wd->sc_params.atap_max_lba[1] << 16) |
407 ((uint64_t) wd->sc_params.atap_max_lba[0] << 0);
408 wd->sc_capacity28 =
409 (wd->sc_params.atap_capacity[1] << 16) |
410 wd->sc_params.atap_capacity[0];
411 } else if ((wd->sc_flags & WDF_LBA) != 0) {
412 aprint_verbose(" LBA addressing\n");
413 wd->sc_capacity28 = wd->sc_capacity =
414 (wd->sc_params.atap_capacity[1] << 16) |
415 wd->sc_params.atap_capacity[0];
416 } else {
417 aprint_verbose(" chs addressing\n");
418 wd->sc_capacity28 = wd->sc_capacity =
419 wd->sc_params.atap_cylinders *
420 wd->sc_params.atap_heads *
421 wd->sc_params.atap_sectors;
422 }
423 if ((wd->sc_params.atap_secsz & ATA_SECSZ_VALID_MASK) == ATA_SECSZ_VALID
424 && ((wd->sc_params.atap_secsz & ATA_SECSZ_LLS) != 0)) {
425 wd->sc_blksize = 2ULL *
426 ((uint32_t)((wd->sc_params.atap_lls_secsz[1] << 16) |
427 wd->sc_params.atap_lls_secsz[0]));
428 } else {
429 wd->sc_blksize = 512;
430 }
431 wd->sc_capacity512 = (wd->sc_capacity * wd->sc_blksize) / DEV_BSIZE;
432 format_bytes(pbuf, sizeof(pbuf), wd->sc_capacity * wd->sc_blksize);
433 aprint_normal_dev(self, "%s, %d cyl, %d head, %d sec, "
434 "%d bytes/sect x %llu sectors\n",
435 pbuf,
436 (wd->sc_flags & WDF_LBA) ? (int)(wd->sc_capacity /
437 (wd->sc_params.atap_heads * wd->sc_params.atap_sectors)) :
438 wd->sc_params.atap_cylinders,
439 wd->sc_params.atap_heads, wd->sc_params.atap_sectors,
440 wd->sc_blksize, (unsigned long long)wd->sc_capacity);
441
442 ATADEBUG_PRINT(("%s: atap_dmatiming_mimi=%d, atap_dmatiming_recom=%d\n",
443 device_xname(self), wd->sc_params.atap_dmatiming_mimi,
444 wd->sc_params.atap_dmatiming_recom), DEBUG_PROBE);
445
446 if (wd->sc_blksize <= 0 || !powerof2(wd->sc_blksize) ||
447 wd->sc_blksize < DEV_BSIZE || wd->sc_blksize > MAXPHYS) {
448 aprint_normal_dev(self, "WARNING: block size %u "
449 "might not actually work\n", wd->sc_blksize);
450 }
451
452 if (strcmp(wd->sc_params.atap_model, "ST506") == 0)
453 dtype = DKTYPE_ST506;
454 else
455 dtype = DKTYPE_ESDI;
456
457 out:
458 /*
459 * Initialize and attach the disk structure.
460 */
461 dk_init(dksc, self, dtype);
462 disk_init(&dksc->sc_dkdev, dksc->sc_xname, &wddkdriver);
463
464 /* Attach dk and disk subsystems */
465 dk_attach(dksc);
466 disk_attach(&dksc->sc_dkdev);
467 wd_set_geometry(wd);
468
469 bufq_alloc(&dksc->sc_bufq, BUFQ_DISK_DEFAULT_STRAT, BUFQ_SORT_RAWBLOCK);
470
471 /* reference to label structure, used by ata code */
472 wd->drvp->lp = dksc->sc_dkdev.dk_label;
473
474 /* Discover wedges on this disk. */
475 dkwedge_discover(&dksc->sc_dkdev);
476
477 if (!pmf_device_register1(self, wd_suspend, NULL, wd_shutdown))
478 aprint_error_dev(self, "couldn't establish power handler\n");
479
480 wd_sysctl_attach(wd);
481 }
482
483 static bool
484 wd_suspend(device_t dv, const pmf_qual_t *qual)
485 {
486 struct wd_softc *sc = device_private(dv);
487
488 /* the adapter needs to be enabled */
489 if (sc->atabus->ata_addref(sc->drvp))
490 return true; /* no need to complain */
491
492 wd_flushcache(sc, AT_WAIT, false);
493 wd_standby(sc, AT_WAIT);
494
495 sc->atabus->ata_delref(sc->drvp);
496 return true;
497 }
498
499 static int
500 wddetach(device_t self, int flags)
501 {
502 struct wd_softc *wd = device_private(self);
503 struct dk_softc *dksc = &wd->sc_dksc;
504 int bmaj, cmaj, i, mn, rc;
505
506 if ((rc = disk_begindetach(&dksc->sc_dkdev, wd_lastclose, self, flags)) != 0)
507 return rc;
508
509 /* locate the major number */
510 bmaj = bdevsw_lookup_major(&wd_bdevsw);
511 cmaj = cdevsw_lookup_major(&wd_cdevsw);
512
513 /* Nuke the vnodes for any open instances. */
514 for (i = 0; i < MAXPARTITIONS; i++) {
515 mn = WDMINOR(device_unit(self), i);
516 vdevgone(bmaj, mn, mn, VBLK);
517 vdevgone(cmaj, mn, mn, VCHR);
518 }
519
520 dk_drain(dksc);
521
522 /* Kill off any pending commands. */
523 mutex_enter(&wd->sc_lock);
524 wd->atabus->ata_killpending(wd->drvp);
525
526 callout_halt(&wd->sc_retry_callout, &wd->sc_lock);
527 callout_destroy(&wd->sc_retry_callout);
528 callout_halt(&wd->sc_requeue_callout, &wd->sc_lock);
529 callout_destroy(&wd->sc_requeue_callout);
530 callout_halt(&wd->sc_restart_diskqueue, &wd->sc_lock);
531 callout_destroy(&wd->sc_restart_diskqueue);
532
533 mutex_exit(&wd->sc_lock);
534
535 bufq_free(dksc->sc_bufq);
536
537 if (flags & DETACH_POWEROFF)
538 wd_standby(wd, AT_POLL);
539
540 /* Delete all of our wedges. */
541 dkwedge_delall(&dksc->sc_dkdev);
542
543 /* Detach from the disk list. */
544 disk_detach(&dksc->sc_dkdev);
545 disk_destroy(&dksc->sc_dkdev);
546
547 dk_detach(dksc);
548
549 #ifdef WD_SOFTBADSECT
550 /* Clean out the bad sector list */
551 while (!SLIST_EMPTY(&wd->sc_bslist)) {
552 struct disk_badsectors *dbs = SLIST_FIRST(&wd->sc_bslist);
553 SLIST_REMOVE_HEAD(&wd->sc_bslist, dbs_next);
554 kmem_free(dbs, sizeof(*dbs));
555 }
556 wd->sc_bscount = 0;
557 #endif
558
559 pmf_device_deregister(self);
560
561 wd_sysctl_detach(wd);
562
563 mutex_destroy(&wd->sc_lock);
564
565 wd->drvp->drive_type = ATA_DRIVET_NONE; /* no drive any more here */
566 wd->drvp->drive_flags = 0;
567
568 return (0);
569 }
570
571 /*
572 * Read/write routine for a buffer. Validates the arguments and schedules the
573 * transfer. Does not wait for the transfer to complete.
574 */
575 static void
576 wdstrategy(struct buf *bp)
577 {
578 struct wd_softc *wd =
579 device_lookup_private(&wd_cd, WDUNIT(bp->b_dev));
580 struct dk_softc *dksc = &wd->sc_dksc;
581
582 ATADEBUG_PRINT(("wdstrategy (%s)\n", dksc->sc_xname),
583 DEBUG_XFERS);
584
585 /* If device invalidated (e.g. media change, door open,
586 * device detachment), then error.
587 */
588 if ((wd->sc_flags & WDF_LOADED) == 0 ||
589 !device_is_enabled(dksc->sc_dev))
590 goto err;
591
592 #ifdef WD_SOFTBADSECT
593 /*
594 * If the transfer about to be attempted contains only a block that
595 * is known to be bad then return an error for the transfer without
596 * even attempting to start a transfer up under the premis that we
597 * will just end up doing more retries for a transfer that will end
598 * up failing again.
599 */
600 if (__predict_false(!SLIST_EMPTY(&wd->sc_bslist))) {
601 struct disklabel *lp = dksc->sc_dkdev.dk_label;
602 struct disk_badsectors *dbs;
603 daddr_t blkno, maxblk;
604
605 /* convert the block number to absolute */
606 if (lp->d_secsize >= DEV_BSIZE)
607 blkno = bp->b_blkno / (lp->d_secsize / DEV_BSIZE);
608 else
609 blkno = bp->b_blkno * (DEV_BSIZE / lp->d_secsize);
610 if (WDPART(bp->b_dev) != RAW_PART)
611 blkno += lp->d_partitions[WDPART(bp->b_dev)].p_offset;
612 maxblk = blkno + (bp->b_bcount / wd->sc_blksize) - 1;
613
614 mutex_enter(&wd->sc_lock);
615 SLIST_FOREACH(dbs, &wd->sc_bslist, dbs_next)
616 if ((dbs->dbs_min <= bp->b_rawblkno &&
617 bp->b_rawblkno <= dbs->dbs_max) ||
618 (dbs->dbs_min <= maxblk && maxblk <= dbs->dbs_max)){
619 mutex_exit(&wd->sc_lock);
620 goto err;
621 }
622 mutex_exit(&wd->sc_lock);
623 }
624 #endif
625
626 dk_strategy(dksc, bp);
627 return;
628
629 err:
630 bp->b_error = EIO;
631 bp->b_resid = bp->b_bcount;
632 biodone(bp);
633 }
634
635 static void
636 wdstart1(struct wd_softc *wd, struct buf *bp, struct ata_xfer *xfer)
637 {
638 struct dk_softc *dksc = &wd->sc_dksc;
639
640 KASSERT(bp == xfer->c_bio.bp || xfer->c_bio.bp == NULL);
641 KASSERT((xfer->c_flags & (C_WAITACT|C_FREE)) == 0);
642
643 /* Reset state, so that retries don't use stale info */
644 if (__predict_false(xfer->c_retries > 0)) {
645 xfer->c_flags = 0;
646 memset(&xfer->c_bio, 0, sizeof(xfer->c_bio));
647 }
648
649 xfer->c_bio.blkno = bp->b_rawblkno;
650 xfer->c_bio.bcount = bp->b_bcount;
651 xfer->c_bio.databuf = bp->b_data;
652 xfer->c_bio.blkdone = 0;
653 xfer->c_bio.bp = bp;
654
655 #ifdef WD_CHAOS_MONKEY
656 /*
657 * Override blkno to be over device capacity to trigger error,
658 * but only if it's read, to avoid trashing disk contents should
659 * the command be clipped, or otherwise misinterpreted, by the
660 * driver or controller.
661 */
662 if (BUF_ISREAD(bp) && xfer->c_retries == 0 && wd->drv_chaos_freq > 0 &&
663 (++wd->drv_chaos_cnt % wd->drv_chaos_freq) == 0) {
664 device_printf(dksc->sc_dev, "%s: chaos xfer %"PRIxPTR"\n",
665 __func__, (intptr_t)xfer & PAGE_MASK);
666 xfer->c_bio.blkno = 7777777 + wd->sc_capacity;
667 xfer->c_flags |= C_CHAOS;
668 }
669 #endif
670
671 /*
672 * If we're retrying, retry in single-sector mode. This will give us
673 * the sector number of the problem, and will eventually allow the
674 * transfer to succeed. If FUA is requested, we can't actually
675 * do this, as ATA_SINGLE is usually executed as PIO transfer by drivers
676 * which support it, and that isn't compatible with NCQ/FUA.
677 */
678 if (xfer->c_retries >= WDIORETRIES_SINGLE &&
679 (bp->b_flags & B_MEDIA_FUA) == 0)
680 xfer->c_bio.flags = ATA_SINGLE;
681 else
682 xfer->c_bio.flags = 0;
683
684 /*
685 * request LBA48 transfers when supported by the controller
686 * and needed by transfer offset or size.
687 */
688 if (wd->sc_flags & WDF_LBA48 &&
689 (((xfer->c_bio.blkno +
690 xfer->c_bio.bcount / dksc->sc_dkdev.dk_geom.dg_secsize) >
691 wd->sc_capacity28) ||
692 ((xfer->c_bio.bcount / dksc->sc_dkdev.dk_geom.dg_secsize) > 128)))
693 xfer->c_bio.flags |= ATA_LBA48;
694
695 /*
696 * If NCQ was negotiated, always use it for the first several attempts.
697 * Since device cancels all outstanding requests on error, downgrade
698 * to non-NCQ on retry, so that the retried transfer would not cause
699 * cascade failure for the other transfers if it fails again.
700 * If FUA was requested, we can't downgrade, as that would violate
701 * the semantics - FUA would not be honored. In that case, continue
702 * retrying with NCQ.
703 */
704 if (WD_USE_NCQ(wd) && (xfer->c_retries < WDIORETRIES_SINGLE ||
705 (bp->b_flags & B_MEDIA_FUA) != 0)) {
706 xfer->c_bio.flags |= ATA_LBA48;
707 xfer->c_flags |= C_NCQ;
708
709 if (WD_USE_NCQ_PRIO(wd) &&
710 BIO_GETPRIO(bp) == BPRIO_TIMECRITICAL)
711 xfer->c_bio.flags |= ATA_PRIO_HIGH;
712 }
713
714 if (wd->sc_flags & WDF_LBA)
715 xfer->c_bio.flags |= ATA_LBA;
716 if (bp->b_flags & B_READ)
717 xfer->c_bio.flags |= ATA_READ;
718 if (bp->b_flags & B_MEDIA_FUA) {
719 /* If not using NCQ, the command WRITE DMA FUA EXT is LBA48 */
720 KASSERT((wd->sc_flags & WDF_LBA48) != 0);
721 if ((xfer->c_flags & C_NCQ) == 0)
722 xfer->c_bio.flags |= ATA_LBA48;
723
724 xfer->c_bio.flags |= ATA_FUA;
725 }
726
727 switch (wd->atabus->ata_bio(wd->drvp, xfer)) {
728 case ATACMD_TRY_AGAIN:
729 panic("wdstart1: try again");
730 break;
731 case ATACMD_QUEUED:
732 case ATACMD_COMPLETE:
733 break;
734 default:
735 panic("wdstart1: bad return code from ata_bio()");
736 }
737 }
738
739 static int
740 wd_diskstart(device_t dev, struct buf *bp)
741 {
742 struct wd_softc *wd = device_private(dev);
743 #ifdef ATADEBUG
744 struct dk_softc *dksc = &wd->sc_dksc;
745 #endif
746 struct ata_xfer *xfer;
747
748 mutex_enter(&wd->sc_lock);
749
750 xfer = ata_get_xfer(wd->drvp->chnl_softc, false);
751 if (xfer == NULL) {
752 ATADEBUG_PRINT(("wd_diskstart %s no xfer\n",
753 dksc->sc_xname), DEBUG_XFERS);
754
755 /*
756 * No available memory, retry later. This happens very rarely
757 * and only under memory pressure, so wait relatively long
758 * before retry.
759 */
760 if (!callout_pending(&wd->sc_restart_diskqueue)) {
761 callout_reset(&wd->sc_restart_diskqueue, hz / 2,
762 wdrestart, dev);
763 }
764
765 mutex_exit(&wd->sc_lock);
766 return EAGAIN;
767 }
768
769 wdstart1(wd, bp, xfer);
770
771 mutex_exit(&wd->sc_lock);
772
773 return 0;
774 }
775
776 /*
777 * Queue a drive for I/O.
778 */
779 static void
780 wdrestart(void *x)
781 {
782 device_t self = x;
783 struct wd_softc *wd = device_private(self);
784 struct dk_softc *dksc = &wd->sc_dksc;
785
786 ATADEBUG_PRINT(("wdstart %s\n", dksc->sc_xname),
787 DEBUG_XFERS);
788
789 if (!device_is_active(dksc->sc_dev))
790 return;
791
792 dk_start(dksc, NULL);
793 }
794
795 static void
796 wddone(device_t self, struct ata_xfer *xfer)
797 {
798 struct wd_softc *wd = device_private(self);
799 struct dk_softc *dksc = &wd->sc_dksc;
800 const char *errmsg;
801 int do_perror = 0;
802 struct buf *bp;
803
804 ATADEBUG_PRINT(("wddone %s\n", dksc->sc_xname),
805 DEBUG_XFERS);
806
807 if (__predict_false(wddoingadump)) {
808 /* just drop it to the floor */
809 ata_free_xfer(wd->drvp->chnl_softc, xfer);
810 return;
811 }
812
813 bp = xfer->c_bio.bp;
814 KASSERT(bp != NULL);
815
816 bp->b_resid = xfer->c_bio.bcount;
817 switch (xfer->c_bio.error) {
818 case ERR_DMA:
819 errmsg = "DMA error";
820 goto retry;
821 case ERR_DF:
822 errmsg = "device fault";
823 goto retry;
824 case TIMEOUT:
825 errmsg = "device timeout";
826 goto retry;
827 case REQUEUE:
828 errmsg = "requeue";
829 goto retry2;
830 case ERR_RESET:
831 errmsg = "channel reset";
832 goto retry2;
833 case ERROR:
834 /* Don't care about media change bits */
835 if (xfer->c_bio.r_error != 0 &&
836 (xfer->c_bio.r_error & ~(WDCE_MC | WDCE_MCR)) == 0)
837 goto noerror;
838 errmsg = "error";
839 do_perror = 1;
840 retry: /* Just reset and retry. Can we do more ? */
841 if ((xfer->c_flags & C_RECOVERED) == 0) {
842 int wflags = (xfer->c_flags & C_POLL) ? AT_POLL : 0;
843 ata_channel_lock(wd->drvp->chnl_softc);
844 ata_thread_run(wd->drvp->chnl_softc, wflags,
845 ATACH_TH_DRIVE_RESET, wd->drvp->drive);
846 ata_channel_unlock(wd->drvp->chnl_softc);
847 }
848 retry2:
849 mutex_enter(&wd->sc_lock);
850
851 diskerr(bp, "wd", errmsg, LOG_PRINTF,
852 xfer->c_bio.blkdone, dksc->sc_dkdev.dk_label);
853 if (xfer->c_retries < WDIORETRIES)
854 printf(", xfer %"PRIxPTR", retry %d",
855 (intptr_t)xfer & PAGE_MASK,
856 xfer->c_retries);
857 printf("\n");
858 if (do_perror)
859 wdperror(wd, xfer);
860
861 if (xfer->c_retries < WDIORETRIES) {
862 xfer->c_retries++;
863
864 /* Rerun ASAP if just requeued */
865 if (xfer->c_bio.error == REQUEUE) {
866 SLIST_INSERT_HEAD(&wd->sc_requeue_list, xfer,
867 c_retrychain);
868 callout_reset(&wd->sc_requeue_callout,
869 1, wdbiorequeue, wd);
870 } else {
871 SLIST_INSERT_HEAD(&wd->sc_retry_list, xfer,
872 c_retrychain);
873 callout_reset(&wd->sc_retry_callout,
874 RECOVERYTIME, wdbioretry, wd);
875 }
876
877 mutex_exit(&wd->sc_lock);
878 return;
879 }
880
881 mutex_exit(&wd->sc_lock);
882
883 #ifdef WD_SOFTBADSECT
884 /*
885 * Not all errors indicate a failed block but those that do,
886 * put the block on the bad-block list for the device. Only
887 * do this for reads because the drive should do it for writes,
888 * itself, according to Manuel.
889 */
890 if ((bp->b_flags & B_READ) &&
891 ((wd->drvp->ata_vers >= 4 && xfer->c_bio.r_error & 64) ||
892 (wd->drvp->ata_vers < 4 && xfer->c_bio.r_error & 192))) {
893 struct disk_badsectors *dbs;
894
895 dbs = kmem_zalloc(sizeof *dbs, KM_NOSLEEP);
896 if (dbs == NULL) {
897 aprint_error_dev(dksc->sc_dev,
898 "failed to add bad block to list\n");
899 goto out;
900 }
901
902 dbs->dbs_min = bp->b_rawblkno;
903 dbs->dbs_max = dbs->dbs_min +
904 (bp->b_bcount /wd->sc_blksize) - 1;
905 microtime(&dbs->dbs_failedat);
906
907 mutex_enter(&wd->sc_lock);
908 SLIST_INSERT_HEAD(&wd->sc_bslist, dbs, dbs_next);
909 wd->sc_bscount++;
910 mutex_exit(&wd->sc_lock);
911 }
912 out:
913 #endif
914 bp->b_error = EIO;
915 break;
916 case NOERROR:
917 #ifdef WD_CHAOS_MONKEY
918 /*
919 * For example Parallels AHCI emulation doesn't actually
920 * return error for the invalid I/O, so just re-run
921 * the request and do not panic.
922 */
923 if (__predict_false(xfer->c_flags & C_CHAOS)) {
924 xfer->c_bio.error = REQUEUE;
925 errmsg = "chaos noerror";
926 goto retry2;
927 }
928 #endif
929
930 noerror: if ((xfer->c_bio.flags & ATA_CORR) || xfer->c_retries > 0)
931 device_printf(dksc->sc_dev,
932 "soft error (corrected) xfer %"PRIxPTR"\n",
933 (intptr_t)xfer & PAGE_MASK);
934 break;
935 case ERR_NODEV:
936 bp->b_error = EIO;
937 break;
938 }
939 if (__predict_false(bp->b_error != 0) && bp->b_resid == 0) {
940 /*
941 * the disk or controller sometimes report a complete
942 * xfer, when there has been an error. This is wrong,
943 * assume nothing got transfered in this case
944 */
945 bp->b_resid = bp->b_bcount;
946 }
947
948 ata_free_xfer(wd->drvp->chnl_softc, xfer);
949
950 dk_done(dksc, bp);
951 }
952
953 static void
954 wdbioretry(void *v)
955 {
956 struct wd_softc *wd = v;
957 struct ata_xfer *xfer;
958
959 ATADEBUG_PRINT(("%s %s\n", __func__, wd->sc_dksc.sc_xname),
960 DEBUG_XFERS);
961
962 mutex_enter(&wd->sc_lock);
963 while ((xfer = SLIST_FIRST(&wd->sc_retry_list))) {
964 SLIST_REMOVE_HEAD(&wd->sc_retry_list, c_retrychain);
965 wdstart1(wd, xfer->c_bio.bp, xfer);
966 }
967 mutex_exit(&wd->sc_lock);
968 }
969
970 static void
971 wdbiorequeue(void *v)
972 {
973 struct wd_softc *wd = v;
974 struct ata_xfer *xfer;
975
976 ATADEBUG_PRINT(("%s %s\n", __func__, wd->sc_dksc.sc_xname),
977 DEBUG_XFERS);
978
979 mutex_enter(&wd->sc_lock);
980 while ((xfer = SLIST_FIRST(&wd->sc_requeue_list))) {
981 SLIST_REMOVE_HEAD(&wd->sc_requeue_list, c_retrychain);
982 wdstart1(wd, xfer->c_bio.bp, xfer);
983 }
984 mutex_exit(&wd->sc_lock);
985 }
986
987 static void
988 wdminphys(struct buf *bp)
989 {
990 const struct wd_softc * const wd =
991 device_lookup_private(&wd_cd, WDUNIT(bp->b_dev));
992 int maxsectors;
993
994 /*
995 * The limit is actually 65536 for LBA48 and 256 for non-LBA48,
996 * but that requires to set the count for the ATA command
997 * to 0, which is somewhat error prone, so better stay safe.
998 */
999 if (wd->sc_flags & WDF_LBA48)
1000 maxsectors = 65535;
1001 else
1002 maxsectors = 128;
1003
1004 if (bp->b_bcount > (wd->sc_blksize * maxsectors))
1005 bp->b_bcount = (wd->sc_blksize * maxsectors);
1006
1007 minphys(bp);
1008 }
1009
1010 static void
1011 wd_iosize(device_t dev, int *count)
1012 {
1013 struct buf B;
1014 int bmaj;
1015
1016 bmaj = bdevsw_lookup_major(&wd_bdevsw);
1017 B.b_dev = MAKEWDDEV(bmaj,device_unit(dev),RAW_PART);
1018 B.b_bcount = *count;
1019
1020 wdminphys(&B);
1021
1022 *count = B.b_bcount;
1023 }
1024
1025 static int
1026 wdread(dev_t dev, struct uio *uio, int flags)
1027 {
1028
1029 ATADEBUG_PRINT(("wdread\n"), DEBUG_XFERS);
1030 return (physio(wdstrategy, NULL, dev, B_READ, wdminphys, uio));
1031 }
1032
1033 static int
1034 wdwrite(dev_t dev, struct uio *uio, int flags)
1035 {
1036
1037 ATADEBUG_PRINT(("wdwrite\n"), DEBUG_XFERS);
1038 return (physio(wdstrategy, NULL, dev, B_WRITE, wdminphys, uio));
1039 }
1040
1041 static int
1042 wdopen(dev_t dev, int flag, int fmt, struct lwp *l)
1043 {
1044 struct wd_softc *wd;
1045 struct dk_softc *dksc;
1046 int unit, part, error;
1047
1048 ATADEBUG_PRINT(("wdopen\n"), DEBUG_FUNCS);
1049 unit = WDUNIT(dev);
1050 wd = device_lookup_private(&wd_cd, unit);
1051 if (wd == NULL)
1052 return (ENXIO);
1053 dksc = &wd->sc_dksc;
1054
1055 if (! device_is_active(dksc->sc_dev))
1056 return (ENODEV);
1057
1058 part = WDPART(dev);
1059
1060 if (wd->sc_capacity == 0)
1061 return (ENODEV);
1062
1063 /*
1064 * If any partition is open, but the disk has been invalidated,
1065 * disallow further opens.
1066 */
1067 if ((wd->sc_flags & (WDF_OPEN | WDF_LOADED)) == WDF_OPEN) {
1068 if (part != RAW_PART || fmt != S_IFCHR)
1069 return EIO;
1070 }
1071
1072 error = dk_open(dksc, dev, flag, fmt, l);
1073
1074 return error;
1075 }
1076
1077 /*
1078 * Serialized by caller
1079 */
1080 static int
1081 wd_firstopen(device_t self, dev_t dev, int flag, int fmt)
1082 {
1083 struct wd_softc *wd = device_private(self);
1084 struct dk_softc *dksc = &wd->sc_dksc;
1085 int error;
1086
1087 error = wd->atabus->ata_addref(wd->drvp);
1088 if (error)
1089 return error;
1090
1091 if ((wd->sc_flags & WDF_LOADED) == 0) {
1092 int param_error;
1093
1094 /* Load the physical device parameters. */
1095 param_error = wd_get_params(wd, AT_WAIT, &wd->sc_params);
1096 if (param_error != 0) {
1097 aprint_error_dev(dksc->sc_dev, "IDENTIFY failed\n");
1098 error = EIO;
1099 goto bad;
1100 }
1101 wd_set_geometry(wd);
1102 wd->sc_flags |= WDF_LOADED;
1103 }
1104
1105 wd->sc_flags |= WDF_OPEN;
1106 return 0;
1107
1108 bad:
1109 wd->atabus->ata_delref(wd->drvp);
1110 return error;
1111 }
1112
1113 /*
1114 * Caller must hold wd->sc_dk.dk_openlock.
1115 */
1116 static int
1117 wd_lastclose(device_t self)
1118 {
1119 struct wd_softc *wd = device_private(self);
1120
1121 KASSERTMSG(bufq_peek(wd->sc_dksc.sc_bufq) == NULL, "bufq not empty");
1122
1123 wd_flushcache(wd, AT_WAIT, false);
1124
1125 wd->atabus->ata_delref(wd->drvp);
1126 wd->sc_flags &= ~WDF_OPEN;
1127
1128 return 0;
1129 }
1130
1131 static int
1132 wdclose(dev_t dev, int flag, int fmt, struct lwp *l)
1133 {
1134 struct wd_softc *wd;
1135 struct dk_softc *dksc;
1136 int unit;
1137
1138 unit = WDUNIT(dev);
1139 wd = device_lookup_private(&wd_cd, unit);
1140 dksc = &wd->sc_dksc;
1141
1142 return dk_close(dksc, dev, flag, fmt, l);
1143 }
1144
1145 void
1146 wdperror(const struct wd_softc *wd, struct ata_xfer *xfer)
1147 {
1148 static const char *const errstr0_3[] = {"address mark not found",
1149 "track 0 not found", "aborted command", "media change requested",
1150 "id not found", "media changed", "uncorrectable data error",
1151 "bad block detected"};
1152 static const char *const errstr4_5[] = {
1153 "obsolete (address mark not found)",
1154 "no media/write protected", "aborted command",
1155 "media change requested", "id not found", "media changed",
1156 "uncorrectable data error", "interface CRC error"};
1157 const char *const *errstr;
1158 int i;
1159 const char *sep = "";
1160
1161 const struct dk_softc *dksc = &wd->sc_dksc;
1162 const char *devname = dksc->sc_xname;
1163 struct ata_drive_datas *drvp = wd->drvp;
1164 int errno = xfer->c_bio.r_error;
1165
1166 if (drvp->ata_vers >= 4)
1167 errstr = errstr4_5;
1168 else
1169 errstr = errstr0_3;
1170
1171 printf("%s: (", devname);
1172
1173 if (errno == 0)
1174 printf("error not notified");
1175
1176 for (i = 0; i < 8; i++) {
1177 if (errno & (1 << i)) {
1178 printf("%s%s", sep, errstr[i]);
1179 sep = ", ";
1180 }
1181 }
1182 printf(")\n");
1183 }
1184
1185 int
1186 wdioctl(dev_t dev, u_long cmd, void *addr, int flag, struct lwp *l)
1187 {
1188 struct wd_softc *wd =
1189 device_lookup_private(&wd_cd, WDUNIT(dev));
1190 struct dk_softc *dksc = &wd->sc_dksc;
1191
1192 ATADEBUG_PRINT(("wdioctl\n"), DEBUG_FUNCS);
1193
1194 if ((wd->sc_flags & WDF_LOADED) == 0)
1195 return EIO;
1196
1197 switch (cmd) {
1198 #ifdef HAS_BAD144_HANDLING
1199 case DIOCSBAD:
1200 if ((flag & FWRITE) == 0)
1201 return EBADF;
1202 dksc->sc_dkdev.dk_cpulabel->bad = *(struct dkbad *)addr;
1203 dksc->sc_dkdev.dk_label->d_flags |= D_BADSECT;
1204 bad144intern(wd);
1205 return 0;
1206 #endif
1207 #ifdef WD_SOFTBADSECT
1208 case DIOCBSLIST :
1209 {
1210 uint32_t count, missing, skip;
1211 struct disk_badsecinfo dbsi;
1212 struct disk_badsectors *dbs;
1213 size_t available;
1214 uint8_t *laddr;
1215
1216 dbsi = *(struct disk_badsecinfo *)addr;
1217 missing = wd->sc_bscount;
1218 count = 0;
1219 available = dbsi.dbsi_bufsize;
1220 skip = dbsi.dbsi_skip;
1221 laddr = (uint8_t *)dbsi.dbsi_buffer;
1222
1223 /*
1224 * We start this loop with the expectation that all of the
1225 * entries will be missed and decrement this counter each
1226 * time we either skip over one (already copied out) or
1227 * we actually copy it back to user space. The structs
1228 * holding the bad sector information are copied directly
1229 * back to user space whilst the summary is returned via
1230 * the struct passed in via the ioctl.
1231 */
1232 mutex_enter(&wd->sc_lock);
1233 SLIST_FOREACH(dbs, &wd->sc_bslist, dbs_next) {
1234 if (skip > 0) {
1235 missing--;
1236 skip--;
1237 continue;
1238 }
1239 if (available < sizeof(*dbs))
1240 break;
1241 available -= sizeof(*dbs);
1242 copyout(dbs, laddr, sizeof(*dbs));
1243 laddr += sizeof(*dbs);
1244 missing--;
1245 count++;
1246 }
1247 mutex_exit(&wd->sc_lock);
1248 dbsi.dbsi_left = missing;
1249 dbsi.dbsi_copied = count;
1250 *(struct disk_badsecinfo *)addr = dbsi;
1251 return 0;
1252 }
1253
1254 case DIOCBSFLUSH :
1255 /* Clean out the bad sector list */
1256 mutex_enter(&wd->sc_lock);
1257 while (!SLIST_EMPTY(&wd->sc_bslist)) {
1258 struct disk_badsectors *dbs =
1259 SLIST_FIRST(&wd->sc_bslist);
1260 SLIST_REMOVE_HEAD(&wd->sc_bslist, dbs_next);
1261 kmem_free(dbs, sizeof(*dbs));
1262 }
1263 mutex_exit(&wd->sc_lock);
1264 wd->sc_bscount = 0;
1265 return 0;
1266 #endif
1267
1268 #ifdef notyet
1269 case DIOCWFORMAT:
1270 if ((flag & FWRITE) == 0)
1271 return EBADF;
1272 {
1273 register struct format_op *fop;
1274 struct iovec aiov;
1275 struct uio auio;
1276 int error1;
1277
1278 fop = (struct format_op *)addr;
1279 aiov.iov_base = fop->df_buf;
1280 aiov.iov_len = fop->df_count;
1281 auio.uio_iov = &aiov;
1282 auio.uio_iovcnt = 1;
1283 auio.uio_resid = fop->df_count;
1284 auio.uio_offset =
1285 fop->df_startblk * wd->sc_dk.dk_label->d_secsize;
1286 auio.uio_vmspace = l->l_proc->p_vmspace;
1287 error1 = physio(wdformat, NULL, dev, B_WRITE, wdminphys,
1288 &auio);
1289 fop->df_count -= auio.uio_resid;
1290 fop->df_reg[0] = wdc->sc_status;
1291 fop->df_reg[1] = wdc->sc_error;
1292 return error1;
1293 }
1294 #endif
1295 case DIOCGCACHE:
1296 return wd_getcache(wd, (int *)addr);
1297
1298 case DIOCSCACHE:
1299 return wd_setcache(wd, *(int *)addr);
1300
1301 case DIOCCACHESYNC:
1302 return wd_flushcache(wd, AT_WAIT, true);
1303
1304 case ATAIOCCOMMAND:
1305 /*
1306 * Make sure this command is (relatively) safe first
1307 */
1308 if ((((atareq_t *) addr)->flags & ATACMD_READ) == 0 &&
1309 (flag & FWRITE) == 0)
1310 return (EBADF);
1311 {
1312 struct wd_ioctl *wi;
1313 atareq_t *atareq = (atareq_t *) addr;
1314 int error1;
1315
1316 wi = wi_get(wd);
1317 wi->wi_atareq = *atareq;
1318
1319 if (atareq->datalen && atareq->flags &
1320 (ATACMD_READ | ATACMD_WRITE)) {
1321 void *tbuf;
1322 if (atareq->datalen < DEV_BSIZE
1323 && atareq->command == WDCC_IDENTIFY) {
1324 tbuf = kmem_zalloc(DEV_BSIZE, KM_SLEEP);
1325 wi->wi_iov.iov_base = tbuf;
1326 wi->wi_iov.iov_len = DEV_BSIZE;
1327 UIO_SETUP_SYSSPACE(&wi->wi_uio);
1328 } else {
1329 tbuf = NULL;
1330 wi->wi_iov.iov_base = atareq->databuf;
1331 wi->wi_iov.iov_len = atareq->datalen;
1332 wi->wi_uio.uio_vmspace = l->l_proc->p_vmspace;
1333 }
1334 wi->wi_uio.uio_iov = &wi->wi_iov;
1335 wi->wi_uio.uio_iovcnt = 1;
1336 wi->wi_uio.uio_resid = atareq->datalen;
1337 wi->wi_uio.uio_offset = 0;
1338 wi->wi_uio.uio_rw =
1339 (atareq->flags & ATACMD_READ) ? B_READ : B_WRITE;
1340 error1 = physio(wdioctlstrategy, &wi->wi_bp, dev,
1341 (atareq->flags & ATACMD_READ) ? B_READ : B_WRITE,
1342 wdminphys, &wi->wi_uio);
1343 if (tbuf != NULL && error1 == 0) {
1344 error1 = copyout(tbuf, atareq->databuf,
1345 atareq->datalen);
1346 kmem_free(tbuf, DEV_BSIZE);
1347 }
1348 } else {
1349 /* No need to call physio if we don't have any
1350 user data */
1351 wi->wi_bp.b_flags = 0;
1352 wi->wi_bp.b_data = 0;
1353 wi->wi_bp.b_bcount = 0;
1354 wi->wi_bp.b_dev = dev;
1355 wi->wi_bp.b_proc = l->l_proc;
1356 wdioctlstrategy(&wi->wi_bp);
1357 error1 = wi->wi_bp.b_error;
1358 }
1359 *atareq = wi->wi_atareq;
1360 wi_free(wi);
1361 return(error1);
1362 }
1363
1364 default:
1365 return dk_ioctl(dksc, dev, cmd, addr, flag, l);
1366 }
1367
1368 #ifdef DIAGNOSTIC
1369 panic("wdioctl: impossible");
1370 #endif
1371 }
1372
1373 static int
1374 wd_discard(device_t dev, off_t pos, off_t len)
1375 {
1376 struct wd_softc *wd = device_private(dev);
1377 daddr_t bno;
1378 long size, done;
1379 long maxatonce, amount;
1380 int result;
1381
1382 if (!(wd->sc_params.atap_ata_major & WDC_VER_ATA7)
1383 || !(wd->sc_params.support_dsm & ATA_SUPPORT_DSM_TRIM)) {
1384 /* not supported; ignore request */
1385 ATADEBUG_PRINT(("wddiscard (unsupported)\n"), DEBUG_FUNCS);
1386 return 0;
1387 }
1388 maxatonce = 0xffff; /*wd->sc_params.max_dsm_blocks*/
1389
1390 ATADEBUG_PRINT(("wddiscard\n"), DEBUG_FUNCS);
1391
1392 if ((wd->sc_flags & WDF_LOADED) == 0)
1393 return EIO;
1394
1395 /* round the start up and the end down */
1396 bno = (pos + wd->sc_blksize - 1) / wd->sc_blksize;
1397 size = ((pos + len) / wd->sc_blksize) - bno;
1398
1399 done = 0;
1400 while (done < size) {
1401 amount = size - done;
1402 if (amount > maxatonce) {
1403 amount = maxatonce;
1404 }
1405 result = wd_trim(wd, bno + done, amount);
1406 if (result) {
1407 return result;
1408 }
1409 done += amount;
1410 }
1411 return 0;
1412 }
1413
1414 static int
1415 wddiscard(dev_t dev, off_t pos, off_t len)
1416 {
1417 struct wd_softc *wd;
1418 struct dk_softc *dksc;
1419 int unit;
1420
1421 unit = WDUNIT(dev);
1422 wd = device_lookup_private(&wd_cd, unit);
1423 dksc = &wd->sc_dksc;
1424
1425 return dk_discard(dksc, dev, pos, len);
1426 }
1427
1428 #ifdef B_FORMAT
1429 int
1430 wdformat(struct buf *bp)
1431 {
1432
1433 bp->b_flags |= B_FORMAT;
1434 return wdstrategy(bp);
1435 }
1436 #endif
1437
1438 int
1439 wdsize(dev_t dev)
1440 {
1441 struct wd_softc *wd;
1442 struct dk_softc *dksc;
1443 int unit;
1444
1445 ATADEBUG_PRINT(("wdsize\n"), DEBUG_FUNCS);
1446
1447 unit = WDUNIT(dev);
1448 wd = device_lookup_private(&wd_cd, unit);
1449 if (wd == NULL)
1450 return (-1);
1451 dksc = &wd->sc_dksc;
1452
1453 if (!device_is_active(dksc->sc_dev))
1454 return (-1);
1455
1456 return dk_size(dksc, dev);
1457 }
1458
1459 /*
1460 * Dump core after a system crash.
1461 */
1462 static int
1463 wddump(dev_t dev, daddr_t blkno, void *va, size_t size)
1464 {
1465 struct wd_softc *wd;
1466 struct dk_softc *dksc;
1467 int unit;
1468
1469 /* Check if recursive dump; if so, punt. */
1470 if (wddoingadump)
1471 return EFAULT;
1472 wddoingadump = 1;
1473
1474 unit = WDUNIT(dev);
1475 wd = device_lookup_private(&wd_cd, unit);
1476 if (wd == NULL)
1477 return (ENXIO);
1478 dksc = &wd->sc_dksc;
1479
1480 return dk_dump(dksc, dev, blkno, va, size);
1481 }
1482
1483 static int
1484 wd_dumpblocks(device_t dev, void *va, daddr_t blkno, int nblk)
1485 {
1486 struct wd_softc *wd = device_private(dev);
1487 struct dk_softc *dksc = &wd->sc_dksc;
1488 struct disk_geom *dg = &dksc->sc_dkdev.dk_geom;
1489 struct ata_xfer *xfer = &wd->dump_xfer;
1490 int err;
1491
1492 /* Recalibrate, if first dump transfer. */
1493 if (wddumprecalibrated == 0) {
1494 wddumprecalibrated = 1;
1495 ata_channel_lock(wd->drvp->chnl_softc);
1496 /* This will directly execute the reset due to AT_POLL */
1497 ata_thread_run(wd->drvp->chnl_softc, AT_POLL,
1498 ATACH_TH_DRIVE_RESET, wd->drvp->drive);
1499
1500 wd->drvp->state = RESET;
1501 ata_channel_unlock(wd->drvp->chnl_softc);
1502 }
1503
1504 memset(xfer, 0, sizeof(*xfer));
1505 xfer->c_flags |= C_PRIVATE_ALLOC | C_SKIP_QUEUE;
1506
1507 xfer->c_bio.blkno = blkno;
1508 xfer->c_bio.flags = ATA_POLL;
1509 if (wd->sc_flags & WDF_LBA48 &&
1510 (xfer->c_bio.blkno + nblk) > wd->sc_capacity28)
1511 xfer->c_bio.flags |= ATA_LBA48;
1512 if (wd->sc_flags & WDF_LBA)
1513 xfer->c_bio.flags |= ATA_LBA;
1514 xfer->c_bio.bcount = nblk * dg->dg_secsize;
1515 xfer->c_bio.databuf = va;
1516 #ifndef WD_DUMP_NOT_TRUSTED
1517 switch (err = wd->atabus->ata_bio(wd->drvp, xfer)) {
1518 case ATACMD_TRY_AGAIN:
1519 panic("wddump: try again");
1520 break;
1521 case ATACMD_QUEUED:
1522 panic("wddump: polled command has been queued");
1523 break;
1524 case ATACMD_COMPLETE:
1525 break;
1526 default:
1527 panic("wddump: unknown atacmd code %d", err);
1528 }
1529 switch(err = xfer->c_bio.error) {
1530 case TIMEOUT:
1531 printf("wddump: device timed out");
1532 err = EIO;
1533 break;
1534 case ERR_DF:
1535 printf("wddump: drive fault");
1536 err = EIO;
1537 break;
1538 case ERR_DMA:
1539 printf("wddump: DMA error");
1540 err = EIO;
1541 break;
1542 case ERROR:
1543 printf("wddump: ");
1544 wdperror(wd, xfer);
1545 err = EIO;
1546 break;
1547 case NOERROR:
1548 err = 0;
1549 break;
1550 default:
1551 panic("wddump: unknown error type %x", err);
1552 }
1553
1554 if (err != 0) {
1555 printf("\n");
1556 return err;
1557 }
1558 #else /* WD_DUMP_NOT_TRUSTED */
1559 /* Let's just talk about this first... */
1560 printf("wd%d: dump addr 0x%x, cylin %d, head %d, sector %d\n",
1561 unit, va, cylin, head, sector);
1562 delay(500 * 1000); /* half a second */
1563 #endif
1564
1565 wddoingadump = 0;
1566 return 0;
1567 }
1568
1569 #ifdef HAS_BAD144_HANDLING
1570 /*
1571 * Internalize the bad sector table.
1572 */
1573 void
1574 bad144intern(struct wd_softc *wd)
1575 {
1576 struct dk_softc *dksc = &wd->sc_dksc;
1577 struct dkbad *bt = &dksc->sc_dkdev.dk_cpulabel->bad;
1578 struct disklabel *lp = dksc->sc_dkdev.dk_label;
1579 int i = 0;
1580
1581 ATADEBUG_PRINT(("bad144intern\n"), DEBUG_XFERS);
1582
1583 for (; i < NBT_BAD; i++) {
1584 if (bt->bt_bad[i].bt_cyl == 0xffff)
1585 break;
1586 wd->drvp->badsect[i] =
1587 bt->bt_bad[i].bt_cyl * lp->d_secpercyl +
1588 (bt->bt_bad[i].bt_trksec >> 8) * lp->d_nsectors +
1589 (bt->bt_bad[i].bt_trksec & 0xff);
1590 }
1591 for (; i < NBT_BAD+1; i++)
1592 wd->drvp->badsect[i] = -1;
1593 }
1594 #endif
1595
1596 static void
1597 wd_set_geometry(struct wd_softc *wd)
1598 {
1599 struct dk_softc *dksc = &wd->sc_dksc;
1600 struct disk_geom *dg = &dksc->sc_dkdev.dk_geom;
1601
1602 memset(dg, 0, sizeof(*dg));
1603
1604 dg->dg_secperunit = wd->sc_capacity;
1605 dg->dg_secsize = wd->sc_blksize;
1606 dg->dg_nsectors = wd->sc_params.atap_sectors;
1607 dg->dg_ntracks = wd->sc_params.atap_heads;
1608 if ((wd->sc_flags & WDF_LBA) == 0)
1609 dg->dg_ncylinders = wd->sc_params.atap_cylinders;
1610
1611 disk_set_info(dksc->sc_dev, &dksc->sc_dkdev, NULL);
1612 }
1613
1614 int
1615 wd_get_params(struct wd_softc *wd, uint8_t flags, struct ataparams *params)
1616 {
1617
1618 switch (wd->atabus->ata_get_params(wd->drvp, flags, params)) {
1619 case CMD_AGAIN:
1620 return 1;
1621 case CMD_ERR:
1622 if (wd->drvp->drive_type != ATA_DRIVET_OLD)
1623 return 1;
1624 /*
1625 * We `know' there's a drive here; just assume it's old.
1626 * This geometry is only used to read the MBR and print a
1627 * (false) attach message.
1628 */
1629 strncpy(params->atap_model, "ST506",
1630 sizeof params->atap_model);
1631 params->atap_config = ATA_CFG_FIXED;
1632 params->atap_cylinders = 1024;
1633 params->atap_heads = 8;
1634 params->atap_sectors = 17;
1635 params->atap_multi = 1;
1636 params->atap_capabilities1 = params->atap_capabilities2 = 0;
1637 wd->drvp->ata_vers = -1; /* Mark it as pre-ATA */
1638 /* FALLTHROUGH */
1639 case CMD_OK:
1640 return 0;
1641 default:
1642 panic("wd_get_params: bad return code from ata_get_params");
1643 /* NOTREACHED */
1644 }
1645 }
1646
1647 int
1648 wd_getcache(struct wd_softc *wd, int *bitsp)
1649 {
1650 struct ataparams params;
1651
1652 if (wd_get_params(wd, AT_WAIT, ¶ms) != 0)
1653 return EIO;
1654 if (params.atap_cmd_set1 == 0x0000 ||
1655 params.atap_cmd_set1 == 0xffff ||
1656 (params.atap_cmd_set1 & WDC_CMD1_CACHE) == 0) {
1657 *bitsp = 0;
1658 return 0;
1659 }
1660 *bitsp = DKCACHE_WCHANGE | DKCACHE_READ;
1661 if (params.atap_cmd1_en & WDC_CMD1_CACHE)
1662 *bitsp |= DKCACHE_WRITE;
1663
1664 if (WD_USE_NCQ(wd) || (wd->drvp->drive_flags & ATA_DRIVE_WFUA))
1665 *bitsp |= DKCACHE_FUA;
1666
1667 return 0;
1668 }
1669
1670 const char at_errbits[] = "\20\10ERROR\11TIMEOU\12DF";
1671
1672 int
1673 wd_setcache(struct wd_softc *wd, int bits)
1674 {
1675 struct dk_softc *dksc = &wd->sc_dksc;
1676 struct ataparams params;
1677 struct ata_xfer *xfer;
1678 int error;
1679
1680 if (wd_get_params(wd, AT_WAIT, ¶ms) != 0)
1681 return EIO;
1682
1683 if (params.atap_cmd_set1 == 0x0000 ||
1684 params.atap_cmd_set1 == 0xffff ||
1685 (params.atap_cmd_set1 & WDC_CMD1_CACHE) == 0)
1686 return EOPNOTSUPP;
1687
1688 if ((bits & DKCACHE_READ) == 0 ||
1689 (bits & DKCACHE_SAVE) != 0)
1690 return EOPNOTSUPP;
1691
1692 xfer = ata_get_xfer(wd->drvp->chnl_softc, true);
1693
1694 xfer->c_ata_c.r_command = SET_FEATURES;
1695 xfer->c_ata_c.r_st_bmask = 0;
1696 xfer->c_ata_c.r_st_pmask = 0;
1697 xfer->c_ata_c.timeout = 30000; /* 30s timeout */
1698 xfer->c_ata_c.flags = AT_WAIT;
1699 if (bits & DKCACHE_WRITE)
1700 xfer->c_ata_c.r_features = WDSF_WRITE_CACHE_EN;
1701 else
1702 xfer->c_ata_c.r_features = WDSF_WRITE_CACHE_DS;
1703 if (wd->atabus->ata_exec_command(wd->drvp, xfer) != ATACMD_COMPLETE) {
1704 aprint_error_dev(dksc->sc_dev,
1705 "wd_setcache command not complete\n");
1706 error = EIO;
1707 goto out;
1708 }
1709
1710 if (xfer->c_ata_c.flags & (AT_ERROR | AT_TIMEOU | AT_DF)) {
1711 char sbuf[sizeof(at_errbits) + 64];
1712 snprintb(sbuf, sizeof(sbuf), at_errbits, xfer->c_ata_c.flags);
1713 aprint_error_dev(dksc->sc_dev, "wd_setcache: status=%s\n", sbuf);
1714 error = EIO;
1715 goto out;
1716 }
1717
1718 error = 0;
1719
1720 out:
1721 ata_free_xfer(wd->drvp->chnl_softc, xfer);
1722 return error;
1723 }
1724
1725 static int
1726 wd_standby(struct wd_softc *wd, int flags)
1727 {
1728 struct dk_softc *dksc = &wd->sc_dksc;
1729 struct ata_xfer *xfer;
1730 int error;
1731
1732 xfer = ata_get_xfer(wd->drvp->chnl_softc, true);
1733
1734 xfer->c_ata_c.r_command = WDCC_STANDBY_IMMED;
1735 xfer->c_ata_c.r_st_bmask = WDCS_DRDY;
1736 xfer->c_ata_c.r_st_pmask = WDCS_DRDY;
1737 xfer->c_ata_c.flags = flags;
1738 xfer->c_ata_c.timeout = 30000; /* 30s timeout */
1739 if (wd->atabus->ata_exec_command(wd->drvp, xfer) != ATACMD_COMPLETE) {
1740 aprint_error_dev(dksc->sc_dev,
1741 "standby immediate command didn't complete\n");
1742 error = EIO;
1743 goto out;
1744 }
1745 if (xfer->c_ata_c.flags & AT_ERROR) {
1746 if (xfer->c_ata_c.r_error == WDCE_ABRT) {
1747 /* command not supported */
1748 error = ENODEV;
1749 goto out;
1750 }
1751 }
1752 if (xfer->c_ata_c.flags & (AT_ERROR | AT_TIMEOU | AT_DF)) {
1753 char sbuf[sizeof(at_errbits) + 64];
1754 snprintb(sbuf, sizeof(sbuf), at_errbits, xfer->c_ata_c.flags);
1755 aprint_error_dev(dksc->sc_dev, "wd_standby: status=%s\n", sbuf);
1756 error = EIO;
1757 goto out;
1758 }
1759 error = 0;
1760
1761 out:
1762 ata_free_xfer(wd->drvp->chnl_softc, xfer);
1763 return error;
1764 }
1765
1766 int
1767 wd_flushcache(struct wd_softc *wd, int flags, bool start_self)
1768 {
1769 struct dk_softc *dksc = &wd->sc_dksc;
1770 struct ata_xfer *xfer;
1771 int error;
1772
1773 /*
1774 * WDCC_FLUSHCACHE is here since ATA-4, but some drives report
1775 * only ATA-2 and still support it.
1776 */
1777 if (wd->drvp->ata_vers < 4 &&
1778 ((wd->sc_params.atap_cmd_set2 & WDC_CMD2_FC) == 0 ||
1779 wd->sc_params.atap_cmd_set2 == 0xffff))
1780 return ENODEV;
1781
1782 xfer = ata_get_xfer(wd->drvp->chnl_softc, true);
1783
1784 if ((wd->sc_params.atap_cmd2_en & ATA_CMD2_LBA48) != 0 &&
1785 (wd->sc_params.atap_cmd2_en & ATA_CMD2_FCE) != 0) {
1786 xfer->c_ata_c.r_command = WDCC_FLUSHCACHE_EXT;
1787 flags |= AT_LBA48;
1788 } else
1789 xfer->c_ata_c.r_command = WDCC_FLUSHCACHE;
1790 xfer->c_ata_c.r_st_bmask = WDCS_DRDY;
1791 xfer->c_ata_c.r_st_pmask = WDCS_DRDY;
1792 xfer->c_ata_c.flags = flags | AT_READREG;
1793 xfer->c_ata_c.timeout = 300000; /* 5m timeout */
1794 if (wd->atabus->ata_exec_command(wd->drvp, xfer) != ATACMD_COMPLETE) {
1795 aprint_error_dev(dksc->sc_dev,
1796 "flush cache command didn't complete\n");
1797 error = EIO;
1798 goto out_xfer;
1799 }
1800 if (xfer->c_ata_c.flags & AT_ERROR) {
1801 if (xfer->c_ata_c.r_error == WDCE_ABRT) {
1802 /* command not supported */
1803 error = ENODEV;
1804 goto out_xfer;
1805 }
1806 }
1807 if (xfer->c_ata_c.flags & (AT_ERROR | AT_TIMEOU | AT_DF)) {
1808 char sbuf[sizeof(at_errbits) + 64];
1809 snprintb(sbuf, sizeof(sbuf), at_errbits, xfer->c_ata_c.flags);
1810 aprint_error_dev(dksc->sc_dev, "wd_flushcache: status=%s\n",
1811 sbuf);
1812 error = EIO;
1813 goto out_xfer;
1814 }
1815 error = 0;
1816
1817 out_xfer:
1818 ata_free_xfer(wd->drvp->chnl_softc, xfer);
1819 return error;
1820 }
1821
1822 /*
1823 * Execute TRIM command, assumes sleep context.
1824 */
1825 static int
1826 wd_trim(struct wd_softc *wd, daddr_t bno, long size)
1827 {
1828 struct dk_softc *dksc = &wd->sc_dksc;
1829 struct ata_xfer *xfer;
1830 int error;
1831 unsigned char *req;
1832
1833 xfer = ata_get_xfer(wd->drvp->chnl_softc, true);
1834
1835 req = kmem_zalloc(512, KM_SLEEP);
1836 req[0] = bno & 0xff;
1837 req[1] = (bno >> 8) & 0xff;
1838 req[2] = (bno >> 16) & 0xff;
1839 req[3] = (bno >> 24) & 0xff;
1840 req[4] = (bno >> 32) & 0xff;
1841 req[5] = (bno >> 40) & 0xff;
1842 req[6] = size & 0xff;
1843 req[7] = (size >> 8) & 0xff;
1844
1845 /*
1846 * XXX We could possibly use NCQ TRIM, which supports executing
1847 * this command concurrently. It would need some investigation, some
1848 * early or not so early disk firmware caused data loss with NCQ TRIM.
1849 * atastart() et.al would need to be adjusted to allow and support
1850 * running several non-I/O ATA commands in parallel.
1851 */
1852
1853 xfer->c_ata_c.r_command = ATA_DATA_SET_MANAGEMENT;
1854 xfer->c_ata_c.r_count = 1;
1855 xfer->c_ata_c.r_features = ATA_SUPPORT_DSM_TRIM;
1856 xfer->c_ata_c.r_st_bmask = WDCS_DRDY;
1857 xfer->c_ata_c.r_st_pmask = WDCS_DRDY;
1858 xfer->c_ata_c.timeout = 30000; /* 30s timeout */
1859 xfer->c_ata_c.data = req;
1860 xfer->c_ata_c.bcount = 512;
1861 xfer->c_ata_c.flags |= AT_WRITE | AT_WAIT;
1862 if (wd->atabus->ata_exec_command(wd->drvp, xfer) != ATACMD_COMPLETE) {
1863 aprint_error_dev(dksc->sc_dev,
1864 "trim command didn't complete\n");
1865 kmem_free(req, 512);
1866 error = EIO;
1867 goto out;
1868 }
1869 kmem_free(req, 512);
1870 if (xfer->c_ata_c.flags & AT_ERROR) {
1871 if (xfer->c_ata_c.r_error == WDCE_ABRT) {
1872 /* command not supported */
1873 error = ENODEV;
1874 goto out;
1875 }
1876 }
1877 if (xfer->c_ata_c.flags & (AT_ERROR | AT_TIMEOU | AT_DF)) {
1878 char sbuf[sizeof(at_errbits) + 64];
1879 snprintb(sbuf, sizeof(sbuf), at_errbits, xfer->c_ata_c.flags);
1880 aprint_error_dev(dksc->sc_dev, "wd_trim: status=%s\n",
1881 sbuf);
1882 error = EIO;
1883 goto out;
1884 }
1885 error = 0;
1886
1887 out:
1888 ata_free_xfer(wd->drvp->chnl_softc, xfer);
1889 return error;
1890 }
1891
1892 bool
1893 wd_shutdown(device_t dev, int how)
1894 {
1895 struct wd_softc *wd = device_private(dev);
1896
1897 /* the adapter needs to be enabled */
1898 if (wd->atabus->ata_addref(wd->drvp))
1899 return true; /* no need to complain */
1900
1901 wd_flushcache(wd, AT_POLL, false);
1902 if ((how & RB_POWERDOWN) == RB_POWERDOWN)
1903 wd_standby(wd, AT_POLL);
1904 return true;
1905 }
1906
1907 /*
1908 * Allocate space for a ioctl queue structure. Mostly taken from
1909 * scsipi_ioctl.c
1910 */
1911 struct wd_ioctl *
1912 wi_get(struct wd_softc *wd)
1913 {
1914 struct wd_ioctl *wi;
1915
1916 wi = kmem_zalloc(sizeof(struct wd_ioctl), KM_SLEEP);
1917 wi->wi_softc = wd;
1918 buf_init(&wi->wi_bp);
1919
1920 return (wi);
1921 }
1922
1923 /*
1924 * Free an ioctl structure and remove it from our list
1925 */
1926
1927 void
1928 wi_free(struct wd_ioctl *wi)
1929 {
1930 buf_destroy(&wi->wi_bp);
1931 kmem_free(wi, sizeof(*wi));
1932 }
1933
1934 /*
1935 * Find a wd_ioctl structure based on the struct buf.
1936 */
1937
1938 struct wd_ioctl *
1939 wi_find(struct buf *bp)
1940 {
1941 return container_of(bp, struct wd_ioctl, wi_bp);
1942 }
1943
1944 static uint
1945 wi_sector_size(const struct wd_ioctl * const wi)
1946 {
1947 switch (wi->wi_atareq.command) {
1948 case WDCC_READ:
1949 case WDCC_WRITE:
1950 case WDCC_READMULTI:
1951 case WDCC_WRITEMULTI:
1952 case WDCC_READDMA:
1953 case WDCC_WRITEDMA:
1954 case WDCC_READ_EXT:
1955 case WDCC_WRITE_EXT:
1956 case WDCC_READMULTI_EXT:
1957 case WDCC_WRITEMULTI_EXT:
1958 case WDCC_READDMA_EXT:
1959 case WDCC_WRITEDMA_EXT:
1960 case WDCC_READ_FPDMA_QUEUED:
1961 case WDCC_WRITE_FPDMA_QUEUED:
1962 return wi->wi_softc->sc_blksize;
1963 default:
1964 return 512;
1965 }
1966 }
1967
1968 /*
1969 * Ioctl pseudo strategy routine
1970 *
1971 * This is mostly stolen from scsipi_ioctl.c:scsistrategy(). What
1972 * happens here is:
1973 *
1974 * - wdioctl() queues a wd_ioctl structure.
1975 *
1976 * - wdioctl() calls physio/wdioctlstrategy based on whether or not
1977 * user space I/O is required. If physio() is called, physio() eventually
1978 * calls wdioctlstrategy().
1979 *
1980 * - In either case, wdioctlstrategy() calls wd->atabus->ata_exec_command()
1981 * to perform the actual command
1982 *
1983 * The reason for the use of the pseudo strategy routine is because
1984 * when doing I/O to/from user space, physio _really_ wants to be in
1985 * the loop. We could put the entire buffer into the ioctl request
1986 * structure, but that won't scale if we want to do things like download
1987 * microcode.
1988 */
1989
1990 void
1991 wdioctlstrategy(struct buf *bp)
1992 {
1993 struct wd_ioctl *wi;
1994 struct ata_xfer *xfer;
1995 int error = 0;
1996
1997 wi = wi_find(bp);
1998 if (wi == NULL) {
1999 printf("wdioctlstrategy: "
2000 "No matching ioctl request found in queue\n");
2001 error = EINVAL;
2002 goto out2;
2003 }
2004
2005 xfer = ata_get_xfer(wi->wi_softc->drvp->chnl_softc, true);
2006
2007 /*
2008 * Abort if physio broke up the transfer
2009 */
2010
2011 if (bp->b_bcount != wi->wi_atareq.datalen) {
2012 printf("physio split wd ioctl request... cannot proceed\n");
2013 error = EIO;
2014 goto out;
2015 }
2016
2017 /*
2018 * Abort if we didn't get a buffer size that was a multiple of
2019 * our sector size (or overflows CHS/LBA28 sector count)
2020 */
2021
2022 if ((bp->b_bcount % wi_sector_size(wi)) != 0 ||
2023 (bp->b_bcount / wi_sector_size(wi)) >=
2024 (1 << NBBY)) {
2025 error = EINVAL;
2026 goto out;
2027 }
2028
2029 /*
2030 * Make sure a timeout was supplied in the ioctl request
2031 */
2032
2033 if (wi->wi_atareq.timeout == 0) {
2034 error = EINVAL;
2035 goto out;
2036 }
2037
2038 if (wi->wi_atareq.flags & ATACMD_READ)
2039 xfer->c_ata_c.flags |= AT_READ;
2040 else if (wi->wi_atareq.flags & ATACMD_WRITE)
2041 xfer->c_ata_c.flags |= AT_WRITE;
2042
2043 if (wi->wi_atareq.flags & ATACMD_READREG)
2044 xfer->c_ata_c.flags |= AT_READREG;
2045
2046 if ((wi->wi_atareq.flags & ATACMD_LBA) != 0)
2047 xfer->c_ata_c.flags |= AT_LBA;
2048
2049 xfer->c_ata_c.flags |= AT_WAIT;
2050
2051 xfer->c_ata_c.timeout = wi->wi_atareq.timeout;
2052 xfer->c_ata_c.r_command = wi->wi_atareq.command;
2053 xfer->c_ata_c.r_lba = ((wi->wi_atareq.head & 0x0f) << 24) |
2054 (wi->wi_atareq.cylinder << 8) |
2055 wi->wi_atareq.sec_num;
2056 xfer->c_ata_c.r_count = wi->wi_atareq.sec_count;
2057 xfer->c_ata_c.r_features = wi->wi_atareq.features;
2058 xfer->c_ata_c.r_st_bmask = WDCS_DRDY;
2059 xfer->c_ata_c.r_st_pmask = WDCS_DRDY;
2060 xfer->c_ata_c.data = wi->wi_bp.b_data;
2061 xfer->c_ata_c.bcount = wi->wi_bp.b_bcount;
2062
2063 if (wi->wi_softc->atabus->ata_exec_command(wi->wi_softc->drvp, xfer)
2064 != ATACMD_COMPLETE) {
2065 wi->wi_atareq.retsts = ATACMD_ERROR;
2066 error = EIO;
2067 goto out;
2068 }
2069
2070 if (xfer->c_ata_c.flags & (AT_ERROR | AT_TIMEOU | AT_DF)) {
2071 if (xfer->c_ata_c.flags & AT_ERROR) {
2072 wi->wi_atareq.retsts = ATACMD_ERROR;
2073 wi->wi_atareq.error = xfer->c_ata_c.r_error;
2074 } else if (xfer->c_ata_c.flags & AT_DF)
2075 wi->wi_atareq.retsts = ATACMD_DF;
2076 else
2077 wi->wi_atareq.retsts = ATACMD_TIMEOUT;
2078 } else {
2079 wi->wi_atareq.retsts = ATACMD_OK;
2080 if (wi->wi_atareq.flags & ATACMD_READREG) {
2081 wi->wi_atareq.command = xfer->c_ata_c.r_status;
2082 wi->wi_atareq.features = xfer->c_ata_c.r_error;
2083 wi->wi_atareq.sec_count = xfer->c_ata_c.r_count;
2084 wi->wi_atareq.sec_num = xfer->c_ata_c.r_lba & 0xff;
2085 wi->wi_atareq.head = (xfer->c_ata_c.r_device & 0xf0) |
2086 ((xfer->c_ata_c.r_lba >> 24) & 0x0f);
2087 wi->wi_atareq.cylinder =
2088 (xfer->c_ata_c.r_lba >> 8) & 0xffff;
2089 wi->wi_atareq.error = xfer->c_ata_c.r_error;
2090 }
2091 }
2092
2093 out:
2094 ata_free_xfer(wi->wi_softc->drvp->chnl_softc, xfer);
2095 out2:
2096 bp->b_error = error;
2097 if (error)
2098 bp->b_resid = bp->b_bcount;
2099 biodone(bp);
2100 }
2101
2102 static void
2103 wd_sysctl_attach(struct wd_softc *wd)
2104 {
2105 struct dk_softc *dksc = &wd->sc_dksc;
2106 const struct sysctlnode *node;
2107 int error;
2108
2109 /* sysctl set-up */
2110 if (sysctl_createv(&wd->nodelog, 0, NULL, &node,
2111 0, CTLTYPE_NODE, dksc->sc_xname,
2112 SYSCTL_DESCR("wd driver settings"),
2113 NULL, 0, NULL, 0,
2114 CTL_HW, CTL_CREATE, CTL_EOL) != 0) {
2115 aprint_error_dev(dksc->sc_dev,
2116 "could not create %s.%s sysctl node\n",
2117 "hw", dksc->sc_xname);
2118 return;
2119 }
2120
2121 wd->drv_ncq = true;
2122 if ((error = sysctl_createv(&wd->nodelog, 0, NULL, NULL,
2123 CTLFLAG_READWRITE, CTLTYPE_BOOL, "use_ncq",
2124 SYSCTL_DESCR("use NCQ if supported"),
2125 NULL, 0, &wd->drv_ncq, 0,
2126 CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL))
2127 != 0) {
2128 aprint_error_dev(dksc->sc_dev,
2129 "could not create %s.%s.use_ncq sysctl - error %d\n",
2130 "hw", dksc->sc_xname, error);
2131 return;
2132 }
2133
2134 wd->drv_ncq_prio = false;
2135 if ((error = sysctl_createv(&wd->nodelog, 0, NULL, NULL,
2136 CTLFLAG_READWRITE, CTLTYPE_BOOL, "use_ncq_prio",
2137 SYSCTL_DESCR("use NCQ PRIORITY if supported"),
2138 NULL, 0, &wd->drv_ncq_prio, 0,
2139 CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL))
2140 != 0) {
2141 aprint_error_dev(dksc->sc_dev,
2142 "could not create %s.%s.use_ncq_prio sysctl - error %d\n",
2143 "hw", dksc->sc_xname, error);
2144 return;
2145 }
2146
2147 #ifdef WD_CHAOS_MONKEY
2148 wd->drv_chaos_freq = 0;
2149 if ((error = sysctl_createv(&wd->nodelog, 0, NULL, NULL,
2150 CTLFLAG_READWRITE, CTLTYPE_INT, "chaos_freq",
2151 SYSCTL_DESCR("simulated bio read error rate"),
2152 NULL, 0, &wd->drv_chaos_freq, 0,
2153 CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL))
2154 != 0) {
2155 aprint_error_dev(dksc->sc_dev,
2156 "could not create %s.%s.chaos_freq sysctl - error %d\n",
2157 "hw", dksc->sc_xname, error);
2158 return;
2159 }
2160
2161 wd->drv_chaos_cnt = 0;
2162 if ((error = sysctl_createv(&wd->nodelog, 0, NULL, NULL,
2163 CTLFLAG_READONLY, CTLTYPE_INT, "chaos_cnt",
2164 SYSCTL_DESCR("number of processed bio reads"),
2165 NULL, 0, &wd->drv_chaos_cnt, 0,
2166 CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL))
2167 != 0) {
2168 aprint_error_dev(dksc->sc_dev,
2169 "could not create %s.%s.chaos_cnt sysctl - error %d\n",
2170 "hw", dksc->sc_xname, error);
2171 return;
2172 }
2173 #endif
2174
2175 }
2176
2177 static void
2178 wd_sysctl_detach(struct wd_softc *wd)
2179 {
2180 sysctl_teardown(&wd->nodelog);
2181 }
2182
2183 #ifdef ATADEBUG
2184 int wddebug(void);
2185
2186 int
2187 wddebug(void)
2188 {
2189 struct wd_softc *wd;
2190 struct dk_softc *dksc;
2191 int unit;
2192
2193 for (unit = 0; unit <= 3; unit++) {
2194 wd = device_lookup_private(&wd_cd, unit);
2195 if (wd == NULL)
2196 continue;
2197 dksc = &wd->sc_dksc;
2198 printf("%s fl %x bufq %p:\n",
2199 dksc->sc_xname, wd->sc_flags, bufq_peek(dksc->sc_bufq));
2200
2201 atachannel_debug(wd->drvp->chnl_softc);
2202 }
2203 return 0;
2204 }
2205 #endif /* ATADEBUG */
2206