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