Lines Matching +full:sync +full:- +full:token

1 /*-
4 * SPDX-License-Identifier: BSD-2-Clause
84 * ATA -> LOGDIR -> IDDIR -> SUP -> ATA_ZONE
402 softc->delete_available |= (1 << delete_method); \
404 softc->delete_available &= ~(1 << delete_method); \
497 * 6-byte CDB.
542 * EXATELECOM (Sigmatel) i-Bead 100/105 USB Flash MP3 Player
545 {T_DIRECT, SIP_MEDIA_REMOVABLE, "EXATEL", "i-BEAD10*", "*"},
598 * SEAGRAND NP-900 MP3 Player
601 {T_DIRECT, SIP_MEDIA_REMOVABLE, "SEAGRAND", "NP-900*", "*"},
632 {T_DIRECT, SIP_MEDIA_REMOVABLE, "TEAC" , "FD-05*", "*"},
637 * Kingston DataTraveler II+ USB Pen-Drive.
682 {T_DIRECT, SIP_MEDIA_REMOVABLE, "USB-DISK", "FreeDik-FlashUsb",
703 * United MP5512 Portable MP3 Player (2-in-1 USB DISK/MP3)
749 * Genesys 6-in-1 Card Reader
760 {T_DIRECT, SIP_MEDIA_REMOVABLE, "CAMERA*", "4MP-9J6*",
781 * X-Micro Flash Disk
784 {T_DIRECT, SIP_MEDIA_REMOVABLE, "X-Micro", "Flash Disk",
829 * I/O Magic USB flash - Giga Bank
832 {T_DIRECT, SIP_MEDIA_FIXED, "GS-Magic", "stor*", "*"},
853 * Storcase (Kingston) InfoStation IFS FC2/SATA-R 201A
856 {T_DIRECT, SIP_MEDIA_FIXED, "IFS", "FC2/SATA-R*",
861 * Samsung YP-U3 mp3-player
864 {T_DIRECT, SIP_MEDIA_REMOVABLE, "Samsung", "YP-U3",
873 * Sony Cyber-Shot DSC cameras
895 * I-O Data USB Flash Disk
898 {T_DIRECT, SIP_MEDIA_REMOVABLE, "I-O DATA", "USB Flash Disk*",
1138 * Olympus digital cameras (C-3040ZOOM, C-2040ZOOM, C-1)
1146 * Olympus digital cameras (D-370)
1154 * Olympus digital cameras (E-100RS, E-10).
1162 * Olympus FE-210 camera
1184 * Laser MP3-2GA13 MP3 player
1204 { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "Corsair CSSD-F*", "*" },
1236 { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "M4-CT???M4SSD2*", "*" },
1244 { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "C300-CTFDDAC???MAG*",
1289 * Intel X25-M Series SSDs
1324 { T_DIRECT, SIP_MEDIA_FIXED, "*", "OCZ-AGILITY2*", "*" },
1332 { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "OCZ-AGILITY3*", "*" },
1356 { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "OCZ-VERTEX3*", "*" },
1364 { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "OCZ-VERTEX4*", "*" },
1445 * connected via SATA-to-SAS interposer and because of this
1469 * Hama Innostor USB-Stick
1485 * MX-ES USB Drive by Mach Xtreme
1601 "Disable detection of write-protected disks");
1662 "max -- also bogus"
1672 token_sanity(da_ref_token token) in token_sanity() argument
1674 if ((unsigned)token >= DA_REF_MAX) in token_sanity()
1675 panic("Bad token value passed in %d\n", token); in token_sanity()
1679 da_periph_hold(struct cam_periph *periph, int priority, da_ref_token token) in da_periph_hold() argument
1683 token_sanity(token); in da_periph_hold()
1685 da_ref_text[token], token, err); in da_periph_hold()
1688 struct da_softc *softc = periph->softc; in da_periph_hold()
1690 cnt = atomic_fetchadd_int(&softc->ref_flags[token], 1); in da_periph_hold()
1692 panic("Re-holding for reason %d, cnt = %d", token, cnt); in da_periph_hold()
1698 da_periph_unhold(struct cam_periph *periph, da_ref_token token) in da_periph_unhold() argument
1701 struct da_softc *softc = periph->softc; in da_periph_unhold()
1703 token_sanity(token); in da_periph_unhold()
1705 da_ref_text[token], token); in da_periph_unhold()
1706 cnt = atomic_fetchadd_int(&softc->ref_flags[token], -1); in da_periph_unhold()
1708 panic("Unholding %d with cnt = %d", token, cnt); in da_periph_unhold()
1713 da_periph_acquire(struct cam_periph *periph, da_ref_token token) in da_periph_acquire() argument
1717 token_sanity(token); in da_periph_acquire()
1719 da_ref_text[token], token, err); in da_periph_acquire()
1722 struct da_softc *softc = periph->softc; in da_periph_acquire()
1724 cnt = atomic_fetchadd_int(&softc->ref_flags[token], 1); in da_periph_acquire()
1726 panic("Re-refing for reason %d, cnt = %d", token, cnt); in da_periph_acquire()
1732 da_periph_release(struct cam_periph *periph, da_ref_token token) in da_periph_release() argument
1735 struct da_softc *softc = periph->softc; in da_periph_release()
1737 token_sanity(token); in da_periph_release()
1739 da_ref_text[token], token); in da_periph_release()
1740 cnt = atomic_fetchadd_int(&softc->ref_flags[token], -1); in da_periph_release()
1742 panic("Releasing %d with cnt = %d", token, cnt); in da_periph_release()
1747 da_periph_release_locked(struct cam_periph *periph, da_ref_token token) in da_periph_release_locked() argument
1750 struct da_softc *softc = periph->softc; in da_periph_release_locked()
1752 token_sanity(token); in da_periph_release_locked()
1754 da_ref_text[token], token); in da_periph_release_locked()
1755 cnt = atomic_fetchadd_int(&softc->ref_flags[token], -1); in da_periph_release_locked()
1757 panic("releasing (locked) %d with cnt = %d", token, cnt); in da_periph_release_locked()
1768 #define da_periph_hold(periph, prio, token) cam_periph_hold((periph), (prio)) argument
1769 #define da_periph_unhold(periph, token) cam_periph_unhold((periph)) argument
1770 #define da_periph_acquire(periph, token) cam_periph_acquire((periph)) argument
1771 #define da_periph_release(periph, token) cam_periph_release((periph)) argument
1772 #define da_periph_release_locked(periph, token) cam_periph_release_locked((periph)) argument
1782 periph = (struct cam_periph *)dp->d_drv1; in daopen()
1794 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE | CAM_DEBUG_PERIPH, in daopen()
1797 softc = (struct da_softc *)periph->softc; in daopen()
1801 error = cam_periph_sleep(periph, &softc->disk->d_mediasize, PRIBIO, in daopen()
1804 xpt_print(periph->path, "unable to retrieve capacity data\n"); in daopen()
1806 if (periph->flags & CAM_PERIPH_INVALID) in daopen()
1809 if (error == 0 && (softc->flags & DA_FLAG_PACK_REMOVABLE) != 0 && in daopen()
1810 (softc->quirks & DA_Q_NO_PREVENT) == 0) in daopen()
1814 * Only 'validate' the pack if the media size is non-zero and the in daopen()
1820 if (error == 0 && softc->params.sectors != 0) in daopen()
1821 softc->flags &= ~DA_FLAG_PACK_INVALID; in daopen()
1823 softc->flags |= DA_FLAG_PACK_INVALID; in daopen()
1826 softc->flags |= DA_FLAG_OPEN; in daopen()
1844 periph = (struct cam_periph *)dp->d_drv1; in daclose()
1845 softc = (struct da_softc *)periph->softc; in daclose()
1847 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE | CAM_DEBUG_PERIPH, in daclose()
1852 if ((softc->flags & DA_FLAG_DIRTY) != 0 && in daclose()
1853 (softc->quirks & DA_Q_NO_SYNC_CACHE) == 0 && in daclose()
1854 (softc->flags & DA_FLAG_PACK_INVALID) == 0) { in daclose()
1856 scsi_synchronize_cache(&ccb->csio, /*retries*/1, in daclose()
1862 softc->disk->d_devstat); in daclose()
1863 softc->flags &= ~DA_FLAG_DIRTY; in daclose()
1868 if ((softc->flags & DA_FLAG_PACK_REMOVABLE) != 0 && in daclose()
1869 (softc->quirks & DA_Q_NO_PREVENT) == 0) in daclose()
1880 if ((softc->flags & DA_FLAG_PACK_REMOVABLE) != 0) in daclose()
1881 softc->disk->d_devstat->flags |= DEVSTAT_BS_UNAVAILABLE; in daclose()
1883 softc->flags &= ~DA_FLAG_OPEN; in daclose()
1884 while (softc->refcount != 0) in daclose()
1885 cam_periph_sleep(periph, &softc->refcount, PRIBIO, "daclose", 1); in daclose()
1894 struct da_softc *softc = (struct da_softc *)periph->softc; in daschedule()
1896 if (softc->state != DA_STATE_NORMAL) in daschedule()
1899 cam_iosched_schedule(softc->cam_iosched, periph); in daschedule()
1913 periph = (struct cam_periph *)bp->bio_disk->d_drv1; in dastrategy()
1914 softc = (struct da_softc *)periph->softc; in dastrategy()
1921 * - the medium is missing in dastrategy()
1922 * - its size is unknown in dastrategy()
1923 * - it differs from the medium present at daopen in dastrategy()
1924 * - we're tearing the cam periph device down in dastrategy()
1929 if ((softc->flags & DA_FLAG_PACK_INVALID)) { in dastrategy()
1935 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dastrategy(%p)\n", bp)); in dastrategy()
1942 if (bp->bio_cmd == BIO_ZONE) in dastrategy()
1943 bp->bio_flags |= BIO_ORDERED; in dastrategy()
1948 cam_iosched_queue_work(softc->cam_iosched, bp); in dastrategy()
1970 periph = dp->d_drv1; in dadump()
1971 softc = (struct da_softc *)periph->softc; in dadump()
1972 secsize = softc->params.secsize; in dadump()
1978 if ((softc->flags & DA_FLAG_PACK_INVALID) != 0) in dadump()
1983 xpt_setup_ccb(&csio.ccb_h, periph->path, CAM_PRIORITY_NORMAL); in dadump()
1991 /*minimum_cmd_size*/ softc->minimum_cmd_size, in dadump()
2006 * Sync the disk cache contents to the physical media. in dadump()
2008 if ((softc->quirks & DA_Q_NO_SYNC_CACHE) == 0) { in dadump()
2009 xpt_setup_ccb(&csio.ccb_h, periph->path, CAM_PRIORITY_NORMAL); in dadump()
2022 xpt_print(periph->path, "Synchronize cache failed\n"); in dadump()
2036 periph = (struct cam_periph *)bp->bio_disk->d_drv1; in dagetattr()
2038 ret = xpt_getattr(bp->bio_data, bp->bio_length, bp->bio_attribute, in dagetattr()
2039 periph->path); in dagetattr()
2042 bp->bio_completed = bp->bio_length; in dagetattr()
2081 periph = (struct cam_periph *)dp->d_drv1; in dadiskgonecb()
2091 softc = (struct da_softc *)periph->softc; in daoninvalidate()
2094 * De-register any async callbacks. in daoninvalidate()
2096 xpt_register_async(0, daasync, periph, periph->path); in daoninvalidate()
2098 softc->flags |= DA_FLAG_PACK_INVALID; in daoninvalidate()
2100 softc->invalidations++; in daoninvalidate()
2109 cam_iosched_flush(softc->cam_iosched, NULL, ENXIO); in daoninvalidate()
2115 disk_gone(softc->disk); in daoninvalidate()
2123 softc = (struct da_softc *)periph->softc; in dacleanup()
2127 cam_iosched_fini(softc->cam_iosched); in dacleanup()
2132 if ((softc->flags & DA_FLAG_SCTX_INIT) != 0) { in dacleanup()
2134 if (sysctl_ctx_free(&softc->sysctl_stats_ctx) != 0) in dacleanup()
2135 xpt_print(periph->path, in dacleanup()
2138 if (sysctl_ctx_free(&softc->sysctl_ctx) != 0) in dacleanup()
2139 xpt_print(periph->path, in dacleanup()
2143 callout_drain(&softc->mediapoll_c); in dacleanup()
2144 disk_destroy(softc->disk); in dacleanup()
2145 callout_drain(&softc->sendordered_c); in dacleanup()
2168 if (cgd->protocol != PROTO_SCSI) in daasync()
2170 if (SID_QUAL(&cgd->inq_data) != SID_QUAL_LU_CONNECTED) in daasync()
2172 if (SID_TYPE(&cgd->inq_data) != T_DIRECT in daasync()
2173 && SID_TYPE(&cgd->inq_data) != T_RBC in daasync()
2174 && SID_TYPE(&cgd->inq_data) != T_OPTICAL in daasync()
2175 && SID_TYPE(&cgd->inq_data) != T_ZBC_HM) in daasync()
2203 softc = periph->softc; in daasync()
2204 disk_attr_changed(softc->disk, "GEOM::physpath", in daasync()
2214 softc = (struct da_softc *)periph->softc; in daasync()
2222 if (xpt_path_periph(ccb->ccb_h.path) != periph && in daasync()
2227 xpt_print(ccb->ccb_h.path, in daasync()
2230 softc->flags &= ~DA_FLAG_PROBED; in daasync()
2235 softc->flags &= ~DA_FLAG_PROBED; in daasync()
2236 disk_media_changed(softc->disk, M_NOWAIT); in daasync()
2239 xpt_print(ccb->ccb_h.path, in daasync()
2242 softc->flags &= ~DA_FLAG_PROBED; in daasync()
2254 softc = (struct da_softc *)periph->softc; in daasync()
2255 if (!cam_iosched_has_work_flags(softc->cam_iosched, DA_WORK_TUR) && in daasync()
2256 (softc->flags & DA_FLAG_TUR_PENDING) == 0) { in daasync()
2258 cam_iosched_set_work_flags(softc->cam_iosched, DA_WORK_TUR); in daasync()
2269 softc = (struct da_softc *)periph->softc; in daasync()
2274 softc->flags |= DA_FLAG_RETRY_UA; in daasync()
2275 LIST_FOREACH(ccbh, &softc->pending_ccbs, periph_links.le) in daasync()
2276 ccbh->ccb_state |= DA_CCB_RETRY_UA; in daasync()
2281 softc = (struct da_softc *)periph->softc; in daasync()
2282 softc->flags &= ~DA_FLAG_PROBED; in daasync()
2303 if (periph->flags & CAM_PERIPH_INVALID) { in dasysctlinit()
2308 softc = (struct da_softc *)periph->softc; in dasysctlinit()
2309 snprintf(tmpstr, sizeof(tmpstr), "CAM DA unit %d", periph->unit_number); in dasysctlinit()
2310 snprintf(tmpstr2, sizeof(tmpstr2), "%d", periph->unit_number); in dasysctlinit()
2312 sysctl_ctx_init(&softc->sysctl_ctx); in dasysctlinit()
2314 softc->flags |= DA_FLAG_SCTX_INIT; in dasysctlinit()
2316 softc->sysctl_tree = SYSCTL_ADD_NODE_WITH_LABEL(&softc->sysctl_ctx, in dasysctlinit()
2319 if (softc->sysctl_tree == NULL) { in dasysctlinit()
2329 SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in dasysctlinit()
2334 SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in dasysctlinit()
2339 SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in dasysctlinit()
2342 &softc->minimum_cmd_size, 0, dacmdsizesysctl, "I", in dasysctlinit()
2344 SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, in dasysctlinit()
2345 SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, in dasysctlinit()
2346 "trim_count", CTLFLAG_RD, &softc->trim_count, in dasysctlinit()
2348 SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, in dasysctlinit()
2349 SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, in dasysctlinit()
2350 "trim_ranges", CTLFLAG_RD, &softc->trim_ranges, in dasysctlinit()
2352 SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, in dasysctlinit()
2353 SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, in dasysctlinit()
2354 "trim_lbas", CTLFLAG_RD, &softc->trim_lbas, in dasysctlinit()
2357 SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in dasysctlinit()
2362 SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in dasysctlinit()
2367 SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, in dasysctlinit()
2368 SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, in dasysctlinit()
2369 "optimal_seq_zones", CTLFLAG_RD, &softc->optimal_seq_zones, in dasysctlinit()
2371 SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, in dasysctlinit()
2372 SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, in dasysctlinit()
2374 &softc->optimal_nonseq_zones, in dasysctlinit()
2375 "Optimal Number of Non-Sequentially Written Sequential Write " in dasysctlinit()
2377 SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, in dasysctlinit()
2378 SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, in dasysctlinit()
2379 "max_seq_zones", CTLFLAG_RD, &softc->max_seq_zones, in dasysctlinit()
2382 SYSCTL_ADD_INT(&softc->sysctl_ctx, in dasysctlinit()
2383 SYSCTL_CHILDREN(softc->sysctl_tree), in dasysctlinit()
2387 &softc->error_inject, in dasysctlinit()
2391 SYSCTL_ADD_INT(&softc->sysctl_ctx, in dasysctlinit()
2392 SYSCTL_CHILDREN(softc->sysctl_tree), in dasysctlinit()
2396 &softc->p_type, in dasysctlinit()
2400 SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in dasysctlinit()
2404 SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in dasysctlinit()
2408 SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in dasysctlinit()
2410 &softc->flags, (u_int)DA_FLAG_ROTATING, dabitsysctl, "I", in dasysctlinit()
2412 SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in dasysctlinit()
2414 &softc->flags, (u_int)DA_FLAG_UNMAPPEDIO, dabitsysctl, "I", in dasysctlinit()
2418 SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in dasysctlinit()
2428 xpt_setup_ccb(&cts.ccb_h, periph->path, CAM_PRIORITY_NONE); in dasysctlinit()
2440 if (fc->valid & CTS_FC_VALID_WWPN) { in dasysctlinit()
2441 softc->wwpn = fc->wwpn; in dasysctlinit()
2442 SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, in dasysctlinit()
2443 SYSCTL_CHILDREN(softc->sysctl_tree), in dasysctlinit()
2445 &softc->wwpn, "World Wide Port Name"); in dasysctlinit()
2454 softc->sysctl_stats_tree = SYSCTL_ADD_NODE(&softc->sysctl_stats_ctx, in dasysctlinit()
2455 SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, "stats", in dasysctlinit()
2457 SYSCTL_ADD_INT(&softc->sysctl_stats_ctx, in dasysctlinit()
2458 SYSCTL_CHILDREN(softc->sysctl_stats_tree), in dasysctlinit()
2462 &softc->errors, in dasysctlinit()
2465 SYSCTL_ADD_INT(&softc->sysctl_stats_ctx, in dasysctlinit()
2466 SYSCTL_CHILDREN(softc->sysctl_stats_tree), in dasysctlinit()
2470 &softc->timeouts, in dasysctlinit()
2473 SYSCTL_ADD_INT(&softc->sysctl_stats_ctx, in dasysctlinit()
2474 SYSCTL_CHILDREN(softc->sysctl_stats_tree), in dasysctlinit()
2478 &softc->invalidations, in dasysctlinit()
2483 cam_iosched_sysctl_init(softc->cam_iosched, &softc->sysctl_ctx, in dasysctlinit()
2484 softc->sysctl_tree); in dasysctlinit()
2498 value = softc->disk->d_delmaxsize; in dadeletemaxsysctl()
2500 if ((error != 0) || (req->newptr == NULL)) in dadeletemaxsysctl()
2504 if (value > dadeletemaxsize(softc, softc->delete_method)) { in dadeletemaxsysctl()
2507 softc->disk->d_delmaxsize = value; in dadeletemaxsysctl()
2522 || (req->newptr == NULL)) in dacmdsizesysctl()
2553 if ((error != 0) || (req->newptr == NULL)) in dasysctlsofttimeout()
2568 softc->delete_method = delete_method; in dadeletemethodset()
2569 softc->disk->d_delmaxsize = dadeletemaxsize(softc, delete_method); in dadeletemethodset()
2570 softc->delete_func = da_delete_functions[delete_method]; in dadeletemethodset()
2572 if (softc->delete_method > DA_DELETE_DISABLE) in dadeletemethodset()
2573 softc->disk->d_flags |= DISKFLAG_CANDELETE; in dadeletemethodset()
2575 softc->disk->d_flags &= ~DISKFLAG_CANDELETE; in dadeletemethodset()
2585 sectors = (off_t)softc->unmap_max_lba; in dadeletemaxsize()
2588 sectors = (off_t)ATA_DSM_RANGE_MAX * softc->trim_max_ranges; in dadeletemaxsize()
2591 sectors = omin(softc->ws_max_blks, WS16_MAX_BLKS); in dadeletemaxsize()
2595 sectors = omin(softc->ws_max_blks, WS10_MAX_BLKS); in dadeletemaxsize()
2601 return (off_t)softc->params.secsize * in dadeletemaxsize()
2602 omin(sectors, softc->params.sectors); in dadeletemaxsize()
2610 softc = (struct da_softc *)periph->softc; in daprobedone()
2616 if (bootverbose && (softc->flags & DA_FLAG_ANNOUNCED) == 0) { in daprobedone()
2623 if ((softc->delete_available & (1 << i)) == 0 && in daprobedone()
2624 i != softc->delete_method) in daprobedone()
2630 if (i == softc->delete_method) in daprobedone()
2635 printf("%s%d: %s\n", periph->periph_name, in daprobedone()
2636 periph->unit_number, buf); in daprobedone()
2638 if ((softc->disk->d_flags & DISKFLAG_WRITE_PROTECT) != 0 && in daprobedone()
2639 (softc->flags & DA_FLAG_ANNOUNCED) == 0) { in daprobedone()
2640 printf("%s%d: Write Protected\n", periph->periph_name, in daprobedone()
2641 periph->unit_number); in daprobedone()
2653 softc->state = DA_STATE_NORMAL; in daprobedone()
2654 softc->flags |= DA_FLAG_PROBED; in daprobedone()
2656 wakeup(&softc->disk->d_mediasize); in daprobedone()
2657 if ((softc->flags & DA_FLAG_ANNOUNCED) == 0) { in daprobedone()
2658 softc->flags |= DA_FLAG_ANNOUNCED; in daprobedone()
2665 disk_create(softc->disk, DISK_VERSION); in daprobedone()
2678 i = softc->delete_method_pref; in dadeletemethodchoose()
2679 methods = softc->delete_available | (1 << DA_DELETE_DISABLE); in dadeletemethodchoose()
2685 /* Use the pre-defined order to choose the best performing delete. */ in dadeletemethodchoose()
2689 if (softc->delete_available & (1 << i)) { in dadeletemethodchoose()
2708 if (error || !req->newptr) in dabitsysctl()
2722 if (softc->flags != 0) in daflagssysctl()
2723 sbuf_printf(&sbuf, "0x%b", (unsigned)softc->flags, DA_FLAG_STRING); in daflagssysctl()
2740 if (softc->quirks != 0) in daquirkssysctl()
2741 sbuf_printf(&sbuf, "0x%b", (unsigned)softc->quirks, DA_Q_BIT_STRING); in daquirkssysctl()
2760 value = softc->delete_method; in dadeletemethodsysctl()
2767 if (error != 0 || req->newptr == NULL) in dadeletemethodsysctl()
2775 softc->delete_method_pref = i; in dadeletemethodsysctl()
2789 switch (softc->zone_mode) { in dazonemodesysctl()
2825 if (softc->zone_flags & da_zone_desc_table[i].value) { in dazonesupsysctl()
2867 LIST_INIT(&softc->pending_ccbs); in daregister()
2868 softc->state = DA_STATE_PROBE_WP; in daregister()
2869 bioq_init(&softc->delete_run_queue); in daregister()
2870 if (SID_IS_REMOVABLE(&cgd->inq_data)) in daregister()
2871 softc->flags |= DA_FLAG_PACK_REMOVABLE; in daregister()
2872 softc->unmap_max_ranges = UNMAP_MAX_RANGES; in daregister()
2873 softc->unmap_max_lba = UNMAP_RANGE_MAX; in daregister()
2874 softc->unmap_gran = 0; in daregister()
2875 softc->unmap_gran_align = 0; in daregister()
2876 softc->ws_max_blks = WS16_MAX_BLKS; in daregister()
2877 softc->trim_max_ranges = ATA_TRIM_MAX_RANGES; in daregister()
2878 softc->flags |= DA_FLAG_ROTATING; in daregister()
2880 periph->softc = softc; in daregister()
2885 match = cam_quirkmatch((caddr_t)&cgd->inq_data, in daregister()
2891 softc->quirks = ((struct da_quirk_entry *)match)->quirks; in daregister()
2893 softc->quirks = DA_Q_NONE; in daregister()
2896 xpt_path_inq(&cpi, periph->path); in daregister()
2898 softc->quirks |= DA_Q_NO_6_BYTE; in daregister()
2902 periph->unit_number); in daregister()
2903 quirks = softc->quirks; in daregister()
2905 softc->quirks = quirks; in daregister()
2907 if (SID_TYPE(&cgd->inq_data) == T_ZBC_HM) in daregister()
2908 softc->zone_mode = DA_ZONE_HOST_MANAGED; in daregister()
2909 else if (softc->quirks & DA_Q_SMR_DM) in daregister()
2910 softc->zone_mode = DA_ZONE_DRIVE_MANAGED; in daregister()
2912 softc->zone_mode = DA_ZONE_NONE; in daregister()
2914 if (softc->zone_mode != DA_ZONE_NONE) { in daregister()
2917 softc->zone_interface = DA_ZONE_IF_ATA_SAT; in daregister()
2919 softc->zone_interface = DA_ZONE_IF_ATA_PASS; in daregister()
2921 softc->zone_interface = DA_ZONE_IF_SCSI; in daregister()
2924 TASK_INIT(&softc->sysctl_task, 0, dasysctlinit, periph); in daregister()
2927 * Let XPT know we can use UMA-allocated CCBs. in daregister()
2932 periph->ccb_zone = da_ccb_zone; in daregister()
2945 callout_init_mtx(&softc->sendordered_c, cam_periph_mtx(periph), 0); in daregister()
2946 callout_reset_sbt(&softc->sendordered_c, in daregister()
2954 if (softc->quirks & DA_Q_NO_6_BYTE || SID_TYPE(&cgd->inq_data) == T_RBC) in daregister()
2955 softc->minimum_cmd_size = 10; in daregister()
2957 softc->minimum_cmd_size = 6; in daregister()
2963 periph->unit_number); in daregister()
2964 TUNABLE_INT_FETCH(tmpstr, &softc->minimum_cmd_size); in daregister()
2969 if (softc->minimum_cmd_size > 12) in daregister()
2970 softc->minimum_cmd_size = 16; in daregister()
2971 else if (softc->minimum_cmd_size > 10) in daregister()
2972 softc->minimum_cmd_size = 12; in daregister()
2973 else if (softc->minimum_cmd_size > 6) in daregister()
2974 softc->minimum_cmd_size = 10; in daregister()
2976 softc->minimum_cmd_size = 6; in daregister()
2979 softc->mode_page = SMS_ALL_PAGES_PAGE; in daregister()
2982 if (SID_ANSI_REV(&cgd->inq_data) >= SCSI_REV_SPC3 && in daregister()
2983 (softc->quirks & DA_Q_NO_RC16) == 0) { in daregister()
2984 softc->flags |= DA_FLAG_CAN_RC16; in daregister()
2990 softc->disk = disk_alloc(); in daregister()
2991 softc->disk->d_devstat = devstat_new_entry(periph->periph_name, in daregister()
2992 periph->unit_number, 0, in daregister()
2994 SID_TYPE(&cgd->inq_data) | in daregister()
2997 softc->disk->d_open = daopen; in daregister()
2998 softc->disk->d_close = daclose; in daregister()
2999 softc->disk->d_strategy = dastrategy; in daregister()
3000 if (cam_sim_pollable(periph->sim)) in daregister()
3001 softc->disk->d_dump = dadump; in daregister()
3002 softc->disk->d_getattr = dagetattr; in daregister()
3003 softc->disk->d_gone = dadiskgonecb; in daregister()
3004 softc->disk->d_name = "da"; in daregister()
3005 softc->disk->d_drv1 = periph; in daregister()
3007 softc->maxio = DFLTPHYS; /* traditional default */ in daregister()
3009 softc->maxio = maxphys; /* for safety */ in daregister()
3011 softc->maxio = cpi.maxio; in daregister()
3012 if (softc->quirks & DA_Q_128KB) in daregister()
3013 softc->maxio = min(softc->maxio, 128 * 1024); in daregister()
3014 softc->disk->d_maxsize = softc->maxio; in daregister()
3015 softc->disk->d_unit = periph->unit_number; in daregister()
3016 softc->disk->d_flags = DISKFLAG_DIRECT_COMPLETION | DISKFLAG_CANZONE; in daregister()
3017 if ((softc->quirks & DA_Q_NO_SYNC_CACHE) == 0) in daregister()
3018 softc->disk->d_flags |= DISKFLAG_CANFLUSHCACHE; in daregister()
3020 softc->flags |= DA_FLAG_UNMAPPEDIO; in daregister()
3021 softc->disk->d_flags |= DISKFLAG_UNMAPPED_BIO; in daregister()
3023 cam_strvis(softc->disk->d_descr, cgd->inq_data.vendor, in daregister()
3024 sizeof(cgd->inq_data.vendor), sizeof(softc->disk->d_descr)); in daregister()
3025 strlcat(softc->disk->d_descr, " ", sizeof(softc->disk->d_descr)); in daregister()
3026 cam_strvis(&softc->disk->d_descr[strlen(softc->disk->d_descr)], in daregister()
3027 cgd->inq_data.product, sizeof(cgd->inq_data.product), in daregister()
3028 sizeof(softc->disk->d_descr) - strlen(softc->disk->d_descr)); in daregister()
3029 softc->disk->d_hba_vendor = cpi.hba_vendor; in daregister()
3030 softc->disk->d_hba_device = cpi.hba_device; in daregister()
3031 softc->disk->d_hba_subvendor = cpi.hba_subvendor; in daregister()
3032 softc->disk->d_hba_subdevice = cpi.hba_subdevice; in daregister()
3033 snprintf(softc->disk->d_attachment, sizeof(softc->disk->d_attachment), in daregister()
3036 if (cam_iosched_init(&softc->cam_iosched, periph, softc->disk, in daregister()
3054 AC_INQ_CHANGED, daasync, periph, periph->path); in daregister()
3059 callout_init_mtx(&softc->mediapoll_c, cam_periph_mtx(periph), 0); in daregister()
3060 if ((softc->flags & DA_FLAG_PACK_REMOVABLE) && in daregister()
3061 (cgd->inq_flags & SID_AEN) == 0 && in daregister()
3063 callout_reset_sbt(&softc->mediapoll_c, da_poll_period * SBT_1S, in daregister()
3088 return -1; in da_zone_bio_to_scsi()
3100 if (bp->bio_cmd != BIO_ZONE) { in da_zone_cmd()
3105 softc = periph->softc; in da_zone_cmd()
3107 switch (bp->bio_zone.zone_cmd) { in da_zone_cmd()
3116 zone_sa = da_zone_bio_to_scsi(bp->bio_zone.zone_cmd); in da_zone_cmd()
3117 if (zone_sa == -1) { in da_zone_cmd()
3118 xpt_print(periph->path, "Cannot translate zone " in da_zone_cmd()
3119 "cmd %#x to SCSI\n", bp->bio_zone.zone_cmd); in da_zone_cmd()
3125 lba = bp->bio_zone.zone_params.rwp.id; in da_zone_cmd()
3127 if (bp->bio_zone.zone_params.rwp.flags & in da_zone_cmd()
3131 if (softc->zone_interface != DA_ZONE_IF_ATA_PASS) { in da_zone_cmd()
3132 scsi_zbc_out(&ccb->csio, in da_zone_cmd()
3149 * supports it. This is new as of SAT-4. in da_zone_cmd()
3152 * ZBC -> ZAC translation, since they are both in da_zone_cmd()
3153 * in the SAT-4 spec. in da_zone_cmd()
3161 * 4. It requires a 32-byte CDB, which at least at in da_zone_cmd()
3166 error = scsi_ata_zac_mgmt_out(&ccb->csio, in da_zone_cmd()
3182 xpt_print(periph->path, in da_zone_cmd()
3197 rep = &bp->bio_zone.zone_params.report; in da_zone_cmd()
3199 num_entries = rep->entries_allocated; in da_zone_cmd()
3201 xpt_print(periph->path, "No entries allocated for " in da_zone_cmd()
3208 alloc_size = min(alloc_size, softc->disk->d_maxsize); in da_zone_cmd()
3211 xpt_print(periph->path, "Unable to allocate memory " in da_zone_cmd()
3217 if (softc->zone_interface != DA_ZONE_IF_ATA_PASS) { in da_zone_cmd()
3218 scsi_zbc_in(&ccb->csio, in da_zone_cmd()
3223 /*zone_start_lba*/ rep->starting_id, in da_zone_cmd()
3224 /*zone_options*/ rep->rep_options, in da_zone_cmd()
3235 * supports it. This is new as of SAT-4. in da_zone_cmd()
3238 * ZBC -> ZAC translation, since they are both in da_zone_cmd()
3239 * in the SAT-4 spec. in da_zone_cmd()
3247 * 4. It requires a 32-byte CDB, which at least at in da_zone_cmd()
3252 error = scsi_ata_zac_mgmt_in(&ccb->csio, in da_zone_cmd()
3258 /*zone_id*/ rep->starting_id, in da_zone_cmd()
3259 /*zone_flags*/ rep->rep_options, in da_zone_cmd()
3268 xpt_print(periph->path, in da_zone_cmd()
3282 * it. devstat uses bio_bcount - bio_resid to calculate in da_zone_cmd()
3284 * uses bio_length - bio_resid to calculate the amount of in da_zone_cmd()
3299 bp->bio_bcount = bp->bio_length; in da_zone_cmd()
3308 params = &bp->bio_zone.zone_params.disk_params; in da_zone_cmd()
3311 switch (softc->zone_mode) { in da_zone_cmd()
3313 params->zone_mode = DISK_ZONE_MODE_DRIVE_MANAGED; in da_zone_cmd()
3316 params->zone_mode = DISK_ZONE_MODE_HOST_AWARE; in da_zone_cmd()
3319 params->zone_mode = DISK_ZONE_MODE_HOST_MANAGED; in da_zone_cmd()
3323 params->zone_mode = DISK_ZONE_MODE_NONE; in da_zone_cmd()
3327 if (softc->zone_flags & DA_ZONE_FLAG_URSWRZ) in da_zone_cmd()
3328 params->flags |= DISK_ZONE_DISK_URSWRZ; in da_zone_cmd()
3330 if (softc->zone_flags & DA_ZONE_FLAG_OPT_SEQ_SET) { in da_zone_cmd()
3331 params->optimal_seq_zones = softc->optimal_seq_zones; in da_zone_cmd()
3332 params->flags |= DISK_ZONE_OPT_SEQ_SET; in da_zone_cmd()
3335 if (softc->zone_flags & DA_ZONE_FLAG_OPT_NONSEQ_SET) { in da_zone_cmd()
3336 params->optimal_nonseq_zones = in da_zone_cmd()
3337 softc->optimal_nonseq_zones; in da_zone_cmd()
3338 params->flags |= DISK_ZONE_OPT_NONSEQ_SET; in da_zone_cmd()
3341 if (softc->zone_flags & DA_ZONE_FLAG_MAX_SEQ_SET) { in da_zone_cmd()
3342 params->max_seq_zones = softc->max_seq_zones; in da_zone_cmd()
3343 params->flags |= DISK_ZONE_MAX_SEQ_SET; in da_zone_cmd()
3345 if (softc->zone_flags & DA_ZONE_FLAG_RZ_SUP) in da_zone_cmd()
3346 params->flags |= DISK_ZONE_RZ_SUP; in da_zone_cmd()
3348 if (softc->zone_flags & DA_ZONE_FLAG_OPEN_SUP) in da_zone_cmd()
3349 params->flags |= DISK_ZONE_OPEN_SUP; in da_zone_cmd()
3351 if (softc->zone_flags & DA_ZONE_FLAG_CLOSE_SUP) in da_zone_cmd()
3352 params->flags |= DISK_ZONE_CLOSE_SUP; in da_zone_cmd()
3354 if (softc->zone_flags & DA_ZONE_FLAG_FINISH_SUP) in da_zone_cmd()
3355 params->flags |= DISK_ZONE_FINISH_SUP; in da_zone_cmd()
3357 if (softc->zone_flags & DA_ZONE_FLAG_RWP_SUP) in da_zone_cmd()
3358 params->flags |= DISK_ZONE_RWP_SUP; in da_zone_cmd()
3372 uint32_t priority = start_ccb->ccb_h.pinfo.priority; in dastart()
3375 softc = (struct da_softc *)periph->softc; in dastart()
3377 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dastart\n")); in dastart()
3391 if ((softc->state != DA_STATE_NORMAL && priority != CAM_PRIORITY_DEV) || in dastart()
3392 (softc->state == DA_STATE_NORMAL && priority != CAM_PRIORITY_NORMAL)) { in dastart()
3393 xpt_print(periph->path, "Bad priority for state %d prio %d\n", in dastart()
3394 softc->state, priority); in dastart()
3400 switch (softc->state) { in dastart()
3407 bp = cam_iosched_next_bio(softc->cam_iosched); in dastart()
3409 if (cam_iosched_has_work_flags(softc->cam_iosched, in dastart()
3411 softc->flags |= DA_FLAG_TUR_PENDING; in dastart()
3412 cam_iosched_clr_work_flags(softc->cam_iosched, in dastart()
3414 scsi_test_unit_ready(&start_ccb->csio, in dastart()
3420 start_ccb->ccb_h.ccb_bp = NULL; in dastart()
3421 start_ccb->ccb_h.ccb_state = DA_CCB_TUR; in dastart()
3428 if (bp->bio_cmd == BIO_DELETE) { in dastart()
3429 if (softc->delete_func != NULL) { in dastart()
3430 softc->delete_func(periph, start_ccb, bp); in dastart()
3442 if (cam_iosched_has_work_flags(softc->cam_iosched, in dastart()
3444 cam_iosched_clr_work_flags(softc->cam_iosched, in dastart()
3449 if ((bp->bio_flags & BIO_ORDERED) != 0 || in dastart()
3450 (softc->flags & DA_FLAG_NEED_OTAG) != 0) { in dastart()
3451 softc->flags &= ~DA_FLAG_NEED_OTAG; in dastart()
3452 softc->flags |= DA_FLAG_WAS_OTAG; in dastart()
3458 switch (bp->bio_cmd) { in dastart()
3467 if (bp->bio_cmd == BIO_WRITE) { in dastart()
3468 softc->flags |= DA_FLAG_DIRTY; in dastart()
3474 data_ptr = bp->bio_data; in dastart()
3475 if ((bp->bio_flags & (BIO_UNMAPPED|BIO_VLIST)) != 0) { in dastart()
3480 scsi_read_write(&start_ccb->csio, in dastart()
3486 softc->minimum_cmd_size, in dastart()
3487 /*lba*/bp->bio_pblkno, in dastart()
3488 /*block_count*/bp->bio_bcount / in dastart()
3489 softc->params.secsize, in dastart()
3491 /*dxfer_len*/ bp->bio_bcount, in dastart()
3495 start_ccb->csio.bio = bp; in dastart()
3501 * If we don't support sync cache, or the disk in dastart()
3502 * isn't dirty, FLUSH is a no-op. Use the in dastart()
3506 if ((softc->quirks & DA_Q_NO_SYNC_CACHE) != 0 || in dastart()
3507 (softc->flags & DA_FLAG_DIRTY) == 0) { in dastart()
3517 scsi_synchronize_cache(&start_ccb->csio, in dastart()
3527 * Either this sync cache will be successful, or it in dastart()
3533 softc->flags &= ~DA_FLAG_DIRTY; in dastart()
3563 start_ccb->ccb_h.ccb_state = DA_CCB_BUFFER_IO; in dastart()
3564 start_ccb->ccb_h.flags |= CAM_UNLOCKED; in dastart()
3565 start_ccb->ccb_h.softtimeout = sbttotv(da_default_softtimeout); in dastart()
3568 LIST_INSERT_HEAD(&softc->pending_ccbs, in dastart()
3569 &start_ccb->ccb_h, periph_links.le); in dastart()
3572 if ((softc->flags & DA_FLAG_RETRY_UA) != 0) { in dastart()
3573 start_ccb->ccb_h.ccb_state |= DA_CCB_RETRY_UA; in dastart()
3574 softc->flags &= ~DA_FLAG_RETRY_UA; in dastart()
3577 start_ccb->ccb_h.ccb_bp = bp; in dastart()
3578 softc->refcount++; in dastart()
3592 if (da_disable_wp_detection || softc->mode_page < 0) { in dastart()
3593 if ((softc->flags & DA_FLAG_CAN_RC16) != 0) in dastart()
3594 softc->state = DA_STATE_PROBE_RC16; in dastart()
3596 softc->state = DA_STATE_PROBE_RC; in dastart()
3602 xpt_print(periph->path, "Unable to send mode sense - " in dastart()
3604 if ((softc->flags & DA_FLAG_CAN_RC16) != 0) in dastart()
3605 softc->state = DA_STATE_PROBE_RC16; in dastart()
3607 softc->state = DA_STATE_PROBE_RC; in dastart()
3610 scsi_mode_sense_len(&start_ccb->csio, in dastart()
3616 /*page*/ softc->mode_page, in dastart()
3619 /*minimum_cmd_size*/ softc->minimum_cmd_size, in dastart()
3622 start_ccb->ccb_h.ccb_bp = NULL; in dastart()
3623 start_ccb->ccb_h.ccb_state = DA_CCB_PROBE_WP; in dastart()
3638 scsi_read_capacity(&start_ccb->csio, in dastart()
3645 start_ccb->ccb_h.ccb_bp = NULL; in dastart()
3646 start_ccb->ccb_h.ccb_state = DA_CCB_PROBE_RC; in dastart()
3661 scsi_read_capacity_16(&start_ccb->csio, in dastart()
3672 start_ccb->ccb_h.ccb_bp = NULL; in dastart()
3673 start_ccb->ccb_h.ccb_state = DA_CCB_PROBE_RC16; in dastart()
3683 * If we get here we don't support any SBC-3 delete in dastart()
3686 * support it according to T10/1799-D Revision 31 in dastart()
3691 softc->state = DA_STATE_PROBE_BLK_LIMITS; in dastart()
3704 scsi_inquiry(&start_ccb->csio, in dastart()
3714 start_ccb->ccb_h.ccb_bp = NULL; in dastart()
3715 start_ccb->ccb_h.ccb_state = DA_CCB_PROBE_LBP; in dastart()
3725 softc->state = DA_STATE_PROBE_BDC; in dastart()
3738 scsi_inquiry(&start_ccb->csio, in dastart()
3748 start_ccb->ccb_h.ccb_bp = NULL; in dastart()
3749 start_ccb->ccb_h.ccb_state = DA_CCB_PROBE_BLK_LIMITS; in dastart()
3758 softc->state = DA_STATE_PROBE_ATA; in dastart()
3771 scsi_inquiry(&start_ccb->csio, in dastart()
3781 start_ccb->ccb_h.ccb_bp = NULL; in dastart()
3782 start_ccb->ccb_h.ccb_state = DA_CCB_PROBE_BDC; in dastart()
3791 /* XXX Future: skip if already not doing SYNC CACHE */ in dastart()
3809 scsi_mode_sense(&start_ccb->csio, in dastart()
3820 start_ccb->ccb_h.ccb_bp = NULL; in dastart()
3821 start_ccb->ccb_h.ccb_state = DA_CCB_PROBE_CACHE; in dastart()
3830 if ((softc->zone_mode == DA_ZONE_HOST_AWARE) in dastart()
3831 || (softc->zone_mode == DA_ZONE_HOST_MANAGED)) { in dastart()
3839 softc->state = DA_STATE_PROBE_ZONE; in dastart()
3846 ata_params = &periph->path->device->ident_data; in dastart()
3848 scsi_ata_identify(&start_ccb->csio, in dastart()
3856 start_ccb->ccb_h.ccb_bp = NULL; in dastart()
3857 start_ccb->ccb_h.ccb_state = DA_CCB_PROBE_ATA; in dastart()
3868 if ((softc->flags & DA_FLAG_CAN_ATA_LOG) == 0) { in dastart()
3885 xpt_print(periph->path, "Couldn't malloc log_dir " in dastart()
3891 retval = scsi_ata_read_log(&start_ccb->csio, in dastart()
3898 /*protocol*/ softc->flags & DA_FLAG_CAN_ATA_DMA ? in dastart()
3906 xpt_print(periph->path, "scsi_ata_read_log() failed!"); in dastart()
3911 start_ccb->ccb_h.ccb_bp = NULL; in dastart()
3912 start_ccb->ccb_h.ccb_state = DA_CCB_PROBE_ATA_LOGDIR; in dastart()
3928 if ((softc->flags & DA_FLAG_CAN_ATA_IDLOG) == 0) { in dastart()
3935 xpt_print(periph->path, "Couldn't malloc id_dir " in dastart()
3941 retval = scsi_ata_read_log(&start_ccb->csio, in dastart()
3948 /*protocol*/ softc->flags & DA_FLAG_CAN_ATA_DMA ? in dastart()
3956 xpt_print(periph->path, "scsi_ata_read_log() failed!"); in dastart()
3961 start_ccb->ccb_h.ccb_bp = NULL; in dastart()
3962 start_ccb->ccb_h.ccb_state = DA_CCB_PROBE_ATA_IDDIR; in dastart()
3977 if ((softc->flags & DA_FLAG_CAN_ATA_SUPCAP) == 0) { in dastart()
3984 xpt_print(periph->path, "Couldn't malloc sup_cap " in dastart()
3990 retval = scsi_ata_read_log(&start_ccb->csio, in dastart()
3997 /*protocol*/ softc->flags & DA_FLAG_CAN_ATA_DMA ? in dastart()
4005 xpt_print(periph->path, "scsi_ata_read_log() failed!"); in dastart()
4011 start_ccb->ccb_h.ccb_bp = NULL; in dastart()
4012 start_ccb->ccb_h.ccb_state = DA_CCB_PROBE_ATA_SUP; in dastart()
4028 if ((softc->flags & DA_FLAG_CAN_ATA_ZONE) == 0) { in dastart()
4035 xpt_print(periph->path, "Couldn't malloc ata_zone " in dastart()
4041 retval = scsi_ata_read_log(&start_ccb->csio, in dastart()
4048 /*protocol*/ softc->flags & DA_FLAG_CAN_ATA_DMA ? in dastart()
4056 xpt_print(periph->path, "scsi_ata_read_log() failed!"); in dastart()
4061 start_ccb->ccb_h.ccb_bp = NULL; in dastart()
4062 start_ccb->ccb_h.ccb_state = DA_CCB_PROBE_ATA_ZONE; in dastart()
4087 xpt_print(periph->path, "Couldn't malloc zone VPD " in dastart()
4091 scsi_inquiry(&start_ccb->csio, in dastart()
4101 start_ccb->ccb_h.ccb_bp = NULL; in dastart()
4102 start_ccb->ccb_h.ccb_state = DA_CCB_PROBE_ZONE; in dastart()
4123 struct da_softc *softc = (struct da_softc *)periph->softc; in da_delete_unmap()
4125 uint8_t *buf = softc->unmap_buf; in da_delete_unmap()
4127 uint64_t lba, lastlba = (uint64_t)-1; in da_delete_unmap()
4142 bzero(softc->unmap_buf, sizeof(softc->unmap_buf)); in da_delete_unmap()
4156 bioq_insert_tail(&softc->delete_run_queue, bp1); in da_delete_unmap()
4157 lba = bp1->bio_pblkno; in da_delete_unmap()
4158 count = bp1->bio_bcount / softc->params.secsize; in da_delete_unmap()
4162 c = omin(count, UNMAP_RANGE_MAX - lastcount); in da_delete_unmap()
4165 scsi_ulto4b(lastcount, d[ranges - 1].length); in da_delete_unmap()
4166 count -= c; in da_delete_unmap()
4169 } else if ((softc->quirks & DA_Q_STRICT_UNMAP) && in da_delete_unmap()
4170 softc->unmap_gran != 0) { in da_delete_unmap()
4172 if ((c = lastcount % softc->unmap_gran) != 0) { in da_delete_unmap()
4174 totalcount -= lastcount; in da_delete_unmap()
4175 lastlba = (uint64_t)-1; in da_delete_unmap()
4177 ranges--; in da_delete_unmap()
4179 totalcount -= c; in da_delete_unmap()
4180 lastlba -= c; in da_delete_unmap()
4181 lastcount -= c; in da_delete_unmap()
4183 d[ranges - 1].length); in da_delete_unmap()
4187 c = (lba - softc->unmap_gran_align) % softc->unmap_gran; in da_delete_unmap()
4189 c = softc->unmap_gran - c; in da_delete_unmap()
4194 count -= c; in da_delete_unmap()
4201 if (totalcount + c > softc->unmap_max_lba || in da_delete_unmap()
4202 ranges >= softc->unmap_max_ranges) { in da_delete_unmap()
4203 xpt_print(periph->path, in da_delete_unmap()
4206 da_delete_method_desc[softc->delete_method], in da_delete_unmap()
4207 totalcount + c, softc->unmap_max_lba, in da_delete_unmap()
4208 ranges, softc->unmap_max_ranges); in da_delete_unmap()
4216 count -= c; in da_delete_unmap()
4220 bp1 = cam_iosched_next_trim(softc->cam_iosched); in da_delete_unmap()
4223 if (ranges >= softc->unmap_max_ranges || in da_delete_unmap()
4224 totalcount + bp1->bio_bcount / in da_delete_unmap()
4225 softc->params.secsize > softc->unmap_max_lba) { in da_delete_unmap()
4226 cam_iosched_put_back_trim(softc->cam_iosched, bp1); in da_delete_unmap()
4232 if ((softc->quirks & DA_Q_STRICT_UNMAP) && softc->unmap_gran != 0 && in da_delete_unmap()
4233 (c = lastcount % softc->unmap_gran) != 0) { in da_delete_unmap()
4235 ranges--; in da_delete_unmap()
4237 scsi_ulto4b(lastcount - c, d[ranges - 1].length); in da_delete_unmap()
4243 scsi_unmap(&ccb->csio, in da_delete_unmap()
4252 ccb->ccb_h.ccb_state = DA_CCB_DELETE; in da_delete_unmap()
4253 ccb->ccb_h.flags |= CAM_UNLOCKED; in da_delete_unmap()
4254 softc->trim_count++; in da_delete_unmap()
4255 softc->trim_ranges += ranges; in da_delete_unmap()
4256 softc->trim_lbas += totalcount; in da_delete_unmap()
4257 cam_iosched_submit_trim(softc->cam_iosched); in da_delete_unmap()
4263 struct da_softc *softc = (struct da_softc *)periph->softc; in da_delete_trim()
4265 uint8_t *buf = softc->unmap_buf; in da_delete_trim()
4266 uint64_t lastlba = (uint64_t)-1; in da_delete_trim()
4272 bzero(softc->unmap_buf, sizeof(softc->unmap_buf)); in da_delete_trim()
4276 bioq_insert_tail(&softc->delete_run_queue, bp1); in da_delete_trim()
4277 lba = bp1->bio_pblkno; in da_delete_trim()
4278 count = bp1->bio_bcount / softc->params.secsize; in da_delete_trim()
4283 c = omin(count, ATA_DSM_RANGE_MAX - lastcount); in da_delete_trim()
4285 off = (ranges - 1) * 8; in da_delete_trim()
4288 count -= c; in da_delete_trim()
4306 count -= c; in da_delete_trim()
4308 if (count != 0 && ranges == softc->trim_max_ranges) { in da_delete_trim()
4309 xpt_print(periph->path, in da_delete_trim()
4311 da_delete_method_desc[softc->delete_method], in da_delete_trim()
4313 (softc->trim_max_ranges - ranges) * in da_delete_trim()
4319 bp1 = cam_iosched_next_trim(softc->cam_iosched); in da_delete_trim()
4322 if (bp1->bio_bcount / softc->params.secsize > in da_delete_trim()
4323 (softc->trim_max_ranges - ranges) * ATA_DSM_RANGE_MAX) { in da_delete_trim()
4324 cam_iosched_put_back_trim(softc->cam_iosched, bp1); in da_delete_trim()
4330 scsi_ata_trim(&ccb->csio, in da_delete_trim()
4339 ccb->ccb_h.ccb_state = DA_CCB_DELETE; in da_delete_trim()
4340 ccb->ccb_h.flags |= CAM_UNLOCKED; in da_delete_trim()
4341 softc->trim_count++; in da_delete_trim()
4342 softc->trim_ranges += ranges; in da_delete_trim()
4343 softc->trim_lbas += block_count; in da_delete_trim()
4344 cam_iosched_submit_trim(softc->cam_iosched); in da_delete_trim()
4349 * of using softc->ws_max_blks as it is absolute max for the
4361 softc = (struct da_softc *)periph->softc; in da_delete_ws()
4362 ws_max_blks = softc->disk->d_delmaxsize / softc->params.secsize; in da_delete_ws()
4363 lba = bp->bio_pblkno; in da_delete_ws()
4368 bioq_insert_tail(&softc->delete_run_queue, bp1); in da_delete_ws()
4369 count += bp1->bio_bcount / softc->params.secsize; in da_delete_ws()
4371 xpt_print(periph->path, in da_delete_ws()
4373 da_delete_method_desc[softc->delete_method], in da_delete_ws()
4378 bp1 = cam_iosched_next_trim(softc->cam_iosched); in da_delete_ws()
4381 if (lba + count != bp1->bio_pblkno || in da_delete_ws()
4382 count + bp1->bio_bcount / in da_delete_ws()
4383 softc->params.secsize > ws_max_blks) { in da_delete_ws()
4384 cam_iosched_put_back_trim(softc->cam_iosched, bp1); in da_delete_ws()
4389 scsi_write_same(&ccb->csio, in da_delete_ws()
4393 /*byte2*/softc->delete_method == in da_delete_ws()
4395 softc->delete_method == DA_DELETE_WS16 ? 16 : 10, in da_delete_ws()
4399 /*dxfer_len*/ softc->params.secsize, in da_delete_ws()
4402 ccb->ccb_h.ccb_state = DA_CCB_DELETE; in da_delete_ws()
4403 ccb->ccb_h.flags |= CAM_UNLOCKED; in da_delete_ws()
4404 softc->trim_count++; in da_delete_ws()
4405 softc->trim_ranges++; in da_delete_ws()
4406 softc->trim_lbas += count; in da_delete_ws()
4407 cam_iosched_submit_trim(softc->cam_iosched); in da_delete_ws()
4420 cdb = ccb->csio.cdb_io.cdb_bytes; in cmd6workaround()
4421 softc = (struct da_softc *)xpt_path_periph(ccb->ccb_h.path)->softc; in cmd6workaround()
4423 if (ccb->ccb_h.ccb_state == DA_CCB_DELETE) { in cmd6workaround()
4424 da_delete_methods old_method = softc->delete_method; in cmd6workaround()
4440 if (softc->delete_method == DA_DELETE_DISABLE) in cmd6workaround()
4441 xpt_print(ccb->ccb_h.path, in cmd6workaround()
4445 xpt_print(ccb->ccb_h.path, in cmd6workaround()
4448 da_delete_method_desc[softc->delete_method]); in cmd6workaround()
4450 while ((bp = bioq_takefirst(&softc->delete_run_queue)) != NULL) in cmd6workaround()
4451 cam_iosched_queue_work(softc->cam_iosched, bp); in cmd6workaround()
4452 cam_iosched_queue_work(softc->cam_iosched, in cmd6workaround()
4453 (struct bio *)ccb->ccb_h.ccb_bp); in cmd6workaround()
4454 ccb->ccb_h.ccb_bp = NULL; in cmd6workaround()
4459 if ((ccb->ccb_h.flags & CAM_CDB_POINTER) == 0 && in cmd6workaround()
4461 (softc->quirks & DA_Q_NO_PREVENT) == 0) { in cmd6workaround()
4463 xpt_print(ccb->ccb_h.path, in cmd6workaround()
4465 softc->quirks |= DA_Q_NO_PREVENT; in cmd6workaround()
4470 if ((ccb->ccb_h.flags & CAM_CDB_POINTER) == 0 && in cmd6workaround()
4472 (softc->quirks & DA_Q_NO_SYNC_CACHE) == 0) { in cmd6workaround()
4474 xpt_print(ccb->ccb_h.path, in cmd6workaround()
4476 softc->quirks |= DA_Q_NO_SYNC_CACHE; in cmd6workaround()
4477 softc->disk->d_flags &= ~DISKFLAG_CANFLUSHCACHE; in cmd6workaround()
4482 if ((ccb->ccb_h.flags & CAM_CDB_POINTER) != 0 || in cmd6workaround()
4486 xpt_print(ccb->ccb_h.path, "READ(6)/WRITE(6) not supported, " in cmd6workaround()
4488 softc->minimum_cmd_size = 10; in cmd6workaround()
4492 cmd10->opcode = (cmd6.opcode == READ_6) ? READ_10 : WRITE_10; in cmd6workaround()
4493 cmd10->byte2 = 0; in cmd6workaround()
4494 scsi_ulto4b(scsi_3btoul(cmd6.addr), cmd10->addr); in cmd6workaround()
4495 cmd10->reserved = 0; in cmd6workaround()
4496 scsi_ulto2b(cmd6.length, cmd10->length); in cmd6workaround()
4497 cmd10->control = cmd6.control; in cmd6workaround()
4498 ccb->csio.cdb_len = sizeof(*cmd10); in cmd6workaround()
4501 frozen = (ccb->ccb_h.status & CAM_DEV_QFRZN) != 0; in cmd6workaround()
4502 ccb->ccb_h.status = CAM_REQUEUE_REQ; in cmd6workaround()
4505 cam_release_devq(ccb->ccb_h.path, in cmd6workaround()
4520 softc = periph->softc; in dazonedone()
4521 bp = (struct bio *)ccb->ccb_h.ccb_bp; in dazonedone()
4523 switch (bp->bio_zone.zone_cmd) { in dazonedone()
4539 rep = &bp->bio_zone.zone_params.report; in dazonedone()
4540 avail_len = ccb->csio.dxfer_len - ccb->csio.resid; in dazonedone()
4551 bp->bio_resid = ccb->csio.resid; in dazonedone()
4552 hdr = (struct scsi_report_zones_hdr *)ccb->csio.data_ptr; in dazonedone()
4559 bp->bio_error = EIO; in dazonedone()
4560 bp->bio_flags |= BIO_ERROR; in dazonedone()
4561 bp->bio_resid = bp->bio_bcount; in dazonedone()
4565 if (softc->zone_interface == DA_ZONE_IF_ATA_PASS) in dazonedone()
4570 hdr_len = ata ? le32dec(hdr->length) : in dazonedone()
4571 scsi_4btoul(hdr->length); in dazonedone()
4573 rep->entries_available = hdr_len / sizeof(*desc); in dazonedone()
4575 rep->entries_available = 0; in dazonedone()
4582 rep->header.same = hdr->byte4 & SRZ_SAME_MASK; in dazonedone()
4583 rep->header.maximum_lba = ata ? le64dec(hdr->maximum_lba) : in dazonedone()
4584 scsi_8btou64(hdr->maximum_lba); in dazonedone()
4590 rep->entries_filled = 0; in dazonedone()
4594 num_avail = min((avail_len - sizeof(*hdr)) / sizeof(*desc), in dazonedone()
4600 rep->entries_filled = 0; in dazonedone()
4604 num_to_fill = min(num_avail, rep->entries_allocated); in dazonedone()
4610 rep->entries_filled = 0; in dazonedone()
4614 for (i = 0, desc = &hdr->desc_list[0], entry=&rep->entries[0]; in dazonedone()
4625 entry->zone_type = desc->zone_type & SRZ_TYPE_MASK; in dazonedone()
4626 entry->zone_condition = in dazonedone()
4627 (desc->zone_flags & SRZ_ZONE_COND_MASK) >> in dazonedone()
4629 entry->zone_flags |= desc->zone_flags & in dazonedone()
4631 entry->zone_length = in dazonedone()
4632 ata ? le64dec(desc->zone_length) : in dazonedone()
4633 scsi_8btou64(desc->zone_length); in dazonedone()
4634 entry->zone_start_lba = in dazonedone()
4635 ata ? le64dec(desc->zone_start_lba) : in dazonedone()
4636 scsi_8btou64(desc->zone_start_lba); in dazonedone()
4637 entry->write_pointer_lba = in dazonedone()
4638 ata ? le64dec(desc->write_pointer_lba) : in dazonedone()
4639 scsi_8btou64(desc->write_pointer_lba); in dazonedone()
4641 rep->entries_filled = num_to_fill; in dazonedone()
4652 bp->bio_zone.zone_cmd); in dazonedone()
4656 if (bp->bio_zone.zone_cmd == DISK_ZONE_REPORT_ZONES) in dazonedone()
4657 free(ccb->csio.data_ptr, M_SCSIDA); in dazonedone()
4668 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone\n")); in dadone()
4670 softc = (struct da_softc *)periph->softc; in dadone()
4671 csio = &done_ccb->csio; in dadone()
4674 if (csio->bio != NULL) in dadone()
4675 biotrack(csio->bio, __func__); in dadone()
4677 state = csio->ccb_h.ccb_state & DA_CCB_TYPE_MASK; in dadone()
4680 bp = (struct bio *)done_ccb->ccb_h.ccb_bp; in dadone()
4681 if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { in dadone()
4685 if ((csio->ccb_h.ccb_state & DA_CCB_RETRY_UA) != 0) in dadone()
4702 bp = (struct bio *)done_ccb->ccb_h.ccb_bp; in dadone()
4705 (softc->flags & DA_FLAG_PACK_INVALID) != 0; in dadone()
4716 * queued I/O and short-circuit retries for in dadone()
4727 xpt_print(periph->path, "Invalidating pack\n"); in dadone()
4740 cam_iosched_flush(softc->cam_iosched, NULL, in dadone()
4744 bp->bio_error = error; in dadone()
4745 bp->bio_resid = bp->bio_bcount; in dadone()
4746 bp->bio_flags |= BIO_ERROR; in dadone()
4750 bp->bio_resid = 0; in dadone()
4752 bp->bio_resid = csio->resid; in dadone()
4753 bp->bio_error = 0; in dadone()
4754 if (bp->bio_resid != 0) in dadone()
4755 bp->bio_flags |= BIO_ERROR; in dadone()
4757 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) in dadone()
4758 cam_release_devq(done_ccb->ccb_h.path, in dadone()
4764 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) in dadone()
4766 if (bp->bio_cmd == BIO_ZONE) in dadone()
4769 bp->bio_resid = 0; in dadone()
4771 bp->bio_resid = csio->resid; in dadone()
4772 if ((csio->resid > 0) && (bp->bio_cmd != BIO_ZONE)) in dadone()
4773 bp->bio_flags |= BIO_ERROR; in dadone()
4774 if (softc->error_inject != 0) { in dadone()
4775 bp->bio_error = softc->error_inject; in dadone()
4776 bp->bio_resid = bp->bio_bcount; in dadone()
4777 bp->bio_flags |= BIO_ERROR; in dadone()
4778 softc->error_inject = 0; in dadone()
4784 LIST_REMOVE(&done_ccb->ccb_h, periph_links.le); in dadone()
4785 if (LIST_EMPTY(&softc->pending_ccbs)) in dadone()
4786 softc->flags |= DA_FLAG_WAS_OTAG; in dadone()
4794 cam_iosched_bio_complete(softc->cam_iosched, bp, done_ccb); in dadone()
4796 KASSERT(softc->refcount >= 1, ("dadone softc %p refcount %d", softc, softc->refcount)); in dadone()
4797 softc->refcount--; in dadone()
4802 TAILQ_CONCAT(&queue, &softc->delete_run_queue.queue, bio_queue); in dadone()
4803 softc->delete_run_queue.insert_point = NULL; in dadone()
4814 cam_iosched_trim_done(softc->cam_iosched); in dadone()
4819 bp1->bio_error = bp->bio_error; in dadone()
4820 if (bp->bio_flags & BIO_ERROR) { in dadone()
4821 bp1->bio_flags |= BIO_ERROR; in dadone()
4822 bp1->bio_resid = bp1->bio_bcount; in dadone()
4824 bp1->bio_resid = 0; in dadone()
4843 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone_probewp\n")); in dadone_probewp()
4845 softc = (struct da_softc *)periph->softc; in dadone_probewp()
4846 priority = done_ccb->ccb_h.pinfo.priority; in dadone_probewp()
4847 csio = &done_ccb->csio; in dadone_probewp()
4851 KASSERT(softc->state == DA_STATE_PROBE_WP, in dadone_probewp()
4853 softc->state, periph, done_ccb)); in dadone_probewp()
4854 KASSERT((csio->ccb_h.ccb_state & DA_CCB_TYPE_MASK) == DA_CCB_PROBE_WP, in dadone_probewp()
4856 (unsigned long)csio->ccb_h.ccb_state & DA_CCB_TYPE_MASK, periph, in dadone_probewp()
4863 if (csio->cdb_len > 6) { in dadone_probewp()
4865 (struct scsi_mode_header_10 *)csio->data_ptr; in dadone_probewp()
4866 len = 2 + scsi_2btoul(mh->data_length); in dadone_probewp()
4867 off = sizeof(*mh) + scsi_2btoul(mh->blk_desc_len); in dadone_probewp()
4868 dev_spec = mh->dev_spec; in dadone_probewp()
4871 (struct scsi_mode_header_6 *)csio->data_ptr; in dadone_probewp()
4872 len = 1 + mh->data_length; in dadone_probewp()
4873 off = sizeof(*mh) + mh->blk_desc_len; in dadone_probewp()
4874 dev_spec = mh->dev_spec; in dadone_probewp()
4877 softc->disk->d_flags |= DISKFLAG_WRITE_PROTECT; in dadone_probewp()
4879 softc->disk->d_flags &= ~DISKFLAG_WRITE_PROTECT; in dadone_probewp()
4882 if (off < len && off < csio->dxfer_len - csio->resid) in dadone_probewp()
4883 softc->mode_page = csio->data_ptr[off] & SMPH_PC_MASK; in dadone_probewp()
4892 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { in dadone_probewp()
4894 cam_release_devq(done_ccb->ccb_h.path, in dadone_probewp()
4902 softc->mode_page = -1; in dadone_probewp()
4906 free(csio->data_ptr, M_SCSIDA); in dadone_probewp()
4907 if ((softc->flags & DA_FLAG_CAN_RC16) != 0) in dadone_probewp()
4908 softc->state = DA_STATE_PROBE_RC16; in dadone_probewp()
4910 softc->state = DA_STATE_PROBE_RC; in dadone_probewp()
4928 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone_proberc\n")); in dadone_proberc()
4930 softc = (struct da_softc *)periph->softc; in dadone_proberc()
4931 priority = done_ccb->ccb_h.pinfo.priority; in dadone_proberc()
4932 csio = &done_ccb->csio; in dadone_proberc()
4933 state = csio->ccb_h.ccb_state & DA_CCB_TYPE_MASK; in dadone_proberc()
4935 KASSERT(softc->state == DA_STATE_PROBE_RC || softc->state == DA_STATE_PROBE_RC16, in dadone_proberc()
4937 softc->state, periph, done_ccb)); in dadone_proberc()
4945 announce_buf = softc->announce_temp; in dadone_proberc()
4949 rdcap =(struct scsi_read_capacity_data *)csio->data_ptr; in dadone_proberc()
4952 csio->data_ptr; in dadone_proberc()
4956 if ((csio->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in dadone_proberc()
4963 block_size = scsi_4btoul(rdcap->length); in dadone_proberc()
4964 maxsector = scsi_4btoul(rdcap->addr); in dadone_proberc()
4968 * According to SBC-2, if the standard 10 in dadone_proberc()
4977 softc->state = DA_STATE_PROBE_RC16; in dadone_proberc()
4983 block_size = scsi_4btoul(rcaplong->length); in dadone_proberc()
4984 maxsector = scsi_8btou64(rcaplong->addr); in dadone_proberc()
4985 lalba = scsi_2btoul(rcaplong->lalba_lbp); in dadone_proberc()
4996 maxsector = -1; in dadone_proberc()
4999 xpt_print(periph->path, in dadone_proberc()
5008 * non-NULL. in dadone_proberc()
5013 (softc->quirks & DA_Q_NO_UNMAP) == 0) in dadone_proberc()
5014 softc->flags |= DA_FLAG_LBP; in dadone_proberc()
5015 dp = &softc->params; in dadone_proberc()
5018 ((uintmax_t)dp->secsize * dp->sectors) / in dadone_proberc()
5020 (uintmax_t)dp->sectors, dp->secsize); in dadone_proberc()
5021 if (softc->p_type != 0) { in dadone_proberc()
5023 DA_ANNOUNCETMP_SZ - n, in dadone_proberc()
5024 ", DIF type %d", softc->p_type); in dadone_proberc()
5026 snprintf(announce_buf + n, DA_ANNOUNCETMP_SZ - n, ")"); in dadone_proberc()
5051 status = done_ccb->ccb_h.status; in dadone_proberc()
5053 cam_release_devq(done_ccb->ccb_h.path, in dadone_proberc()
5059 xpt_gdev_type(&cgd, done_ccb->ccb_h.path); in dadone_proberc()
5072 (softc->flags & DA_FLAG_CAN_RC16) && in dadone_proberc()
5073 (((csio->ccb_h.status & CAM_STATUS_MASK) == in dadone_proberc()
5080 softc->flags &= ~DA_FLAG_CAN_RC16; in dadone_proberc()
5082 softc->state = DA_STATE_PROBE_RC; in dadone_proberc()
5122 dasetgeom(periph, 512, -1, NULL, 0); in dadone_proberc()
5132 scsi_sense_print(&done_ccb->csio); in dadone_proberc()
5134 xpt_print(periph->path, in dadone_proberc()
5136 done_ccb->ccb_h.status); in dadone_proberc()
5139 xpt_print(periph->path, "fatal error, " in dadone_proberc()
5151 free(csio->data_ptr, M_SCSIDA); in dadone_proberc()
5153 ((softc->flags & DA_FLAG_ANNOUNCED) == 0)) { in dadone_proberc()
5156 sbuf_new(&sb, softc->announcebuf, DA_ANNOUNCE_SZ, in dadone_proberc()
5159 xpt_announce_quirks_sbuf(periph, &sb, softc->quirks, in dadone_proberc()
5171 &softc->sysctl_task); in dadone_proberc()
5174 xpt_print(periph->path, "fatal error, " in dadone_proberc()
5180 if (softc->flags & DA_FLAG_PROBED) { in dadone_proberc()
5185 softc->state = DA_STATE_PROBE_CACHE; in dadone_proberc()
5199 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone_probelbp\n")); in dadone_probelbp()
5201 softc = (struct da_softc *)periph->softc; in dadone_probelbp()
5202 priority = done_ccb->ccb_h.pinfo.priority; in dadone_probelbp()
5203 csio = &done_ccb->csio; in dadone_probelbp()
5204 lbp = (struct scsi_vpd_logical_block_prov *)csio->data_ptr; in dadone_probelbp()
5208 if ((csio->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in dadone_probelbp()
5210 * T10/1799-D Revision 31 states at least one of these in dadone_probelbp()
5214 (lbp->flags & SVPD_LBP_WS16)); in dadone_probelbp()
5216 (lbp->flags & SVPD_LBP_WS10)); in dadone_probelbp()
5218 (lbp->flags & SVPD_LBP_UNMAP)); in dadone_probelbp()
5226 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { in dadone_probelbp()
5228 cam_release_devq(done_ccb->ccb_h.path, in dadone_probelbp()
5236 * Failure indicates we don't support any SBC-3 in dadone_probelbp()
5243 softc->state = DA_STATE_PROBE_BLK_LIMITS; in dadone_probelbp()
5257 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone_probeblklimits\n")); in dadone_probeblklimits()
5259 softc = (struct da_softc *)periph->softc; in dadone_probeblklimits()
5260 priority = done_ccb->ccb_h.pinfo.priority; in dadone_probeblklimits()
5261 csio = &done_ccb->csio; in dadone_probeblklimits()
5262 block_limits = (struct scsi_vpd_block_limits *)csio->data_ptr; in dadone_probeblklimits()
5266 if ((csio->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in dadone_probeblklimits()
5268 block_limits->max_txfer_len); in dadone_probeblklimits()
5270 block_limits->max_unmap_lba_cnt); in dadone_probeblklimits()
5272 block_limits->max_unmap_blk_cnt); in dadone_probeblklimits()
5274 block_limits->opt_unmap_grain); in dadone_probeblklimits()
5276 block_limits->unmap_grain_align); in dadone_probeblklimits()
5278 block_limits->max_write_same_length); in dadone_probeblklimits()
5281 softc->disk->d_maxsize = MIN(softc->maxio, in dadone_probeblklimits()
5282 (off_t)max_txfer_len * softc->params.secsize); in dadone_probeblklimits()
5291 softc->unmap_max_lba = max_unmap_lba_cnt; in dadone_probeblklimits()
5292 softc->unmap_max_ranges = min(max_unmap_blk_cnt, in dadone_probeblklimits()
5295 softc->unmap_gran = unmap_gran; in dadone_probeblklimits()
5297 softc->unmap_gran_align = in dadone_probeblklimits()
5310 softc->ws_max_blks = ws_max_blks; in dadone_probeblklimits()
5318 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { in dadone_probeblklimits()
5320 cam_release_devq(done_ccb->ccb_h.path, in dadone_probeblklimits()
5331 softc->unmap_max_lba = 1; in dadone_probeblklimits()
5332 softc->unmap_max_ranges = 1; in dadone_probeblklimits()
5337 softc->state = DA_STATE_PROBE_BDC; in dadone_probeblklimits()
5351 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone_probebdc\n")); in dadone_probebdc()
5353 softc = (struct da_softc *)periph->softc; in dadone_probebdc()
5354 priority = done_ccb->ccb_h.pinfo.priority; in dadone_probebdc()
5355 csio = &done_ccb->csio; in dadone_probebdc()
5356 bdc = (struct scsi_vpd_block_device_characteristics *)csio->data_ptr; in dadone_probebdc()
5360 if ((csio->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in dadone_probebdc()
5364 * Disable queue sorting for non-rotational media in dadone_probebdc()
5367 uint16_t old_rate = softc->disk->d_rotation_rate; in dadone_probebdc()
5369 valid_len = csio->dxfer_len - csio->resid; in dadone_probebdc()
5372 softc->disk->d_rotation_rate = in dadone_probebdc()
5373 scsi_2btoul(bdc->medium_rotation_rate); in dadone_probebdc()
5374 if (softc->disk->d_rotation_rate == SVPD_NON_ROTATING) { in dadone_probebdc()
5376 softc->cam_iosched, 0); in dadone_probebdc()
5377 softc->flags &= ~DA_FLAG_ROTATING; in dadone_probebdc()
5379 if (softc->disk->d_rotation_rate != old_rate) { in dadone_probebdc()
5380 disk_attr_changed(softc->disk, in dadone_probebdc()
5385 && (softc->zone_mode == DA_ZONE_NONE)) { in dadone_probebdc()
5401 if ((bdc->flags & SVPD_ZBC_MASK) == in dadone_probebdc()
5403 softc->zone_mode = DA_ZONE_HOST_AWARE; in dadone_probebdc()
5404 softc->zone_interface = (ata_proto) ? in dadone_probebdc()
5406 } else if ((bdc->flags & SVPD_ZBC_MASK) == in dadone_probebdc()
5408 softc->zone_mode =DA_ZONE_DRIVE_MANAGED; in dadone_probebdc()
5409 softc->zone_interface = (ata_proto) ? in dadone_probebdc()
5411 } else if ((bdc->flags & SVPD_ZBC_MASK) != in dadone_probebdc()
5413 xpt_print(periph->path, "Unknown zoned " in dadone_probebdc()
5415 bdc->flags & SVPD_ZBC_MASK); in dadone_probebdc()
5425 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { in dadone_probebdc()
5427 cam_release_devq(done_ccb->ccb_h.path, in dadone_probebdc()
5437 softc->state = DA_STATE_PROBE_ATA; in dadone_probebdc()
5452 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone_probecache\n")); in dadone_probecache()
5454 softc = (struct da_softc *)periph->softc; in dadone_probecache()
5455 priority = done_ccb->ccb_h.pinfo.priority; in dadone_probecache()
5456 csio = &done_ccb->csio; in dadone_probecache()
5457 sense_hdr = (struct scsi_mode_header_6 *)csio->data_ptr; in dadone_probecache()
5458 cache_page = (struct scsi_caching_page *)(csio->data_ptr + in dadone_probecache()
5459 sizeof(struct scsi_mode_header_6) + sense_hdr->blk_desc_len); in dadone_probecache()
5461 if ((csio->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in dadone_probecache()
5472 if (sense_hdr->data_length + 1 < in dadone_probecache()
5473 sense_hdr->blk_desc_len + sizeof(*cache_page)) { in dadone_probecache()
5474 xpt_print(done_ccb->ccb_h.path, in dadone_probecache()
5476 sense_hdr->data_length, in dadone_probecache()
5477 sense_hdr->blk_desc_len); in dadone_probecache()
5480 if ((cache_page->page_code & ~SMS_PAGE_CTRL_MASK) != in dadone_probecache()
5482 xpt_print(done_ccb->ccb_h.path, in dadone_probecache()
5484 cache_page->page_code); in dadone_probecache()
5487 if (cache_page->page_length != sizeof(*cache_page) - in dadone_probecache()
5489 xpt_print(done_ccb->ccb_h.path, in dadone_probecache()
5491 cache_page->page_length); in dadone_probecache()
5506 if (softc->quirks & DA_Q_NO_SYNC_CACHE && in dadone_probecache()
5507 cache_page->flags1 & SCP_WCE) in dadone_probecache()
5508 xpt_print(done_ccb->ccb_h.path, in dadone_probecache()
5523 * none-the-less have working SYNCHRONIZE CACHE. Take our in dadone_probecache()
5527 * that's inserted will determine if SYNC is supported which in dadone_probecache()
5540 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { in dadone_probecache()
5542 cam_release_devq(done_ccb->ccb_h.path, in dadone_probecache()
5549 xpt_print(done_ccb->ccb_h.path, in dadone_probecache()
5562 xpt_print(done_ccb->ccb_h.path, in dadone_probecache()
5564 if (softc->quirks & DA_Q_NO_SYNC_CACHE) in dadone_probecache()
5565 xpt_print(done_ccb->ccb_h.path, in dadone_probecache()
5567 softc->quirks |= DA_Q_NO_SYNC_CACHE; in dadone_probecache()
5568 softc->disk->d_flags &= ~DISKFLAG_CANFLUSHCACHE; in dadone_probecache()
5573 /* Ensure re-probe doesn't see old delete. */ in dadone_probecache()
5574 softc->delete_available = 0; in dadone_probecache()
5576 if ((softc->flags & DA_FLAG_LBP) != 0) { in dadone_probecache()
5578 * Based on older SBC-3 spec revisions in dadone_probecache()
5594 softc->state = DA_STATE_PROBE_LBP; in dadone_probecache()
5596 softc->state = DA_STATE_PROBE_BDC; in dadone_probecache()
5613 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone_probeata\n")); in dadone_probeata()
5615 softc = (struct da_softc *)periph->softc; in dadone_probeata()
5616 priority = done_ccb->ccb_h.pinfo.priority; in dadone_probeata()
5617 csio = &done_ccb->csio; in dadone_probeata()
5618 ata_params = (struct ata_params *)csio->data_ptr; in dadone_probeata()
5624 if ((csio->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in dadone_probeata()
5628 if (ata_params->support_dsm & ATA_SUPPORT_DSM_TRIM && in dadone_probeata()
5629 (softc->quirks & DA_Q_NO_UNMAP) == 0) { in dadone_probeata()
5631 if (ata_params->max_dsm_blocks != 0) in dadone_probeata()
5632 softc->trim_max_ranges = min( in dadone_probeata()
5633 softc->trim_max_ranges, in dadone_probeata()
5634 ata_params->max_dsm_blocks * in dadone_probeata()
5638 * Disable queue sorting for non-rotational media in dadone_probeata()
5641 old_rate = softc->disk->d_rotation_rate; in dadone_probeata()
5642 softc->disk->d_rotation_rate = ata_params->media_rotation_rate; in dadone_probeata()
5643 if (softc->disk->d_rotation_rate == ATA_RATE_NON_ROTATING) { in dadone_probeata()
5644 cam_iosched_set_sort_queue(softc->cam_iosched, 0); in dadone_probeata()
5645 softc->flags &= ~DA_FLAG_ROTATING; in dadone_probeata()
5647 if (softc->disk->d_rotation_rate != old_rate) { in dadone_probeata()
5648 disk_attr_changed(softc->disk, in dadone_probeata()
5653 if (ata_params->capabilities1 & ATA_SUPPORT_DMA) in dadone_probeata()
5654 softc->flags |= DA_FLAG_CAN_ATA_DMA; in dadone_probeata()
5656 if (ata_params->support.extension & ATA_SUPPORT_GENLOG) in dadone_probeata()
5657 softc->flags |= DA_FLAG_CAN_ATA_LOG; in dadone_probeata()
5662 * SAT layer supports ZBC -> ZAC translation. In in dadone_probeata()
5668 if (softc->zone_mode == DA_ZONE_NONE) { in dadone_probeata()
5680 if ((ata_params->support3 & in dadone_probeata()
5683 softc->zone_mode = DA_ZONE_HOST_AWARE; in dadone_probeata()
5684 softc->zone_interface = in dadone_probeata()
5686 } else if ((ata_params->support3 & in dadone_probeata()
5689 softc->zone_mode =DA_ZONE_DRIVE_MANAGED; in dadone_probeata()
5690 softc->zone_interface = DA_ZONE_IF_ATA_PASS; in dadone_probeata()
5700 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { in dadone_probeata()
5702 cam_release_devq(done_ccb->ccb_h.path, in dadone_probeata()
5711 if ((softc->zone_mode == DA_ZONE_HOST_AWARE) in dadone_probeata()
5712 || (softc->zone_mode == DA_ZONE_HOST_MANAGED)) { in dadone_probeata()
5719 * ZBC -> ZAC translation, continue on to get the in dadone_probeata()
5722 * ZBC -> ZAC translation, we want to use that, in dadone_probeata()
5727 && (softc->flags & DA_FLAG_CAN_ATA_LOG) in dadone_probeata()
5728 && (softc->zone_interface == DA_ZONE_IF_ATA_PASS)) in dadone_probeata()
5729 softc->state = DA_STATE_PROBE_ATA_LOGDIR; in dadone_probeata()
5731 softc->state = DA_STATE_PROBE_ZONE; in dadone_probeata()
5751 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone_probeatalogdir\n")); in dadone_probeatalogdir()
5753 softc = (struct da_softc *)periph->softc; in dadone_probeatalogdir()
5754 priority = done_ccb->ccb_h.pinfo.priority; in dadone_probeatalogdir()
5755 csio = &done_ccb->csio; in dadone_probeatalogdir()
5758 if ((csio->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in dadone_probeatalogdir()
5760 softc->valid_logdir_len = 0; in dadone_probeatalogdir()
5761 bzero(&softc->ata_logdir, sizeof(softc->ata_logdir)); in dadone_probeatalogdir()
5762 softc->valid_logdir_len = csio->dxfer_len - csio->resid; in dadone_probeatalogdir()
5763 if (softc->valid_logdir_len > 0) in dadone_probeatalogdir()
5764 bcopy(csio->data_ptr, &softc->ata_logdir, in dadone_probeatalogdir()
5765 min(softc->valid_logdir_len, in dadone_probeatalogdir()
5766 sizeof(softc->ata_logdir))); in dadone_probeatalogdir()
5774 if ((softc->valid_logdir_len >= in dadone_probeatalogdir()
5776 && (le16dec(softc->ata_logdir.header) == in dadone_probeatalogdir()
5778 && (le16dec(&softc->ata_logdir.num_pages[ in dadone_probeatalogdir()
5780 sizeof(uint16_t)) - sizeof(uint16_t)]) > 0)){ in dadone_probeatalogdir()
5781 softc->flags |= DA_FLAG_CAN_ATA_IDLOG; in dadone_probeatalogdir()
5783 softc->flags &= ~DA_FLAG_CAN_ATA_IDLOG; in dadone_probeatalogdir()
5797 softc->flags &= ~(DA_FLAG_CAN_ATA_LOG | in dadone_probeatalogdir()
5799 if ((done_ccb->ccb_h.status & in dadone_probeatalogdir()
5802 cam_release_devq(done_ccb->ccb_h.path, in dadone_probeatalogdir()
5811 free(csio->data_ptr, M_SCSIDA); in dadone_probeatalogdir()
5814 && (softc->flags & DA_FLAG_CAN_ATA_IDLOG)) { in dadone_probeatalogdir()
5815 softc->state = DA_STATE_PROBE_ATA_IDDIR; in dadone_probeatalogdir()
5832 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone_probeataiddir\n")); in dadone_probeataiddir()
5834 softc = (struct da_softc *)periph->softc; in dadone_probeataiddir()
5835 priority = done_ccb->ccb_h.pinfo.priority; in dadone_probeataiddir()
5836 csio = &done_ccb->csio; in dadone_probeataiddir()
5840 if ((csio->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in dadone_probeataiddir()
5844 softc->valid_iddir_len = 0; in dadone_probeataiddir()
5845 bzero(&softc->ata_iddir, sizeof(softc->ata_iddir)); in dadone_probeataiddir()
5846 softc->flags &= ~(DA_FLAG_CAN_ATA_SUPCAP | in dadone_probeataiddir()
5848 softc->valid_iddir_len = csio->dxfer_len - csio->resid; in dadone_probeataiddir()
5849 if (softc->valid_iddir_len > 0) in dadone_probeataiddir()
5850 bcopy(csio->data_ptr, &softc->ata_iddir, in dadone_probeataiddir()
5851 min(softc->valid_iddir_len, in dadone_probeataiddir()
5852 sizeof(softc->ata_iddir))); in dadone_probeataiddir()
5856 max_entries = softc->valid_iddir_len - entries_offset; in dadone_probeataiddir()
5857 if ((softc->valid_iddir_len > (entries_offset + 1)) in dadone_probeataiddir()
5858 && (le64dec(softc->ata_iddir.header) == ATA_IDLOG_REVISION) in dadone_probeataiddir()
5859 && (softc->ata_iddir.entry_count > 0)) { in dadone_probeataiddir()
5862 num_entries = softc->ata_iddir.entry_count; in dadone_probeataiddir()
5864 softc->valid_iddir_len - entries_offset); in dadone_probeataiddir()
5866 if (softc->ata_iddir.entries[i] == in dadone_probeataiddir()
5868 softc->flags |= DA_FLAG_CAN_ATA_SUPCAP; in dadone_probeataiddir()
5869 else if (softc->ata_iddir.entries[i] == in dadone_probeataiddir()
5871 softc->flags |= DA_FLAG_CAN_ATA_ZONE; in dadone_probeataiddir()
5873 if ((softc->flags & DA_FLAG_CAN_ATA_SUPCAP) in dadone_probeataiddir()
5874 && (softc->flags & DA_FLAG_CAN_ATA_ZONE)) in dadone_probeataiddir()
5888 * a non-zero number of pages present for in dadone_probeataiddir()
5891 softc->flags &= ~DA_FLAG_CAN_ATA_IDLOG; in dadone_probeataiddir()
5892 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { in dadone_probeataiddir()
5894 cam_release_devq(done_ccb->ccb_h.path, in dadone_probeataiddir()
5903 free(csio->data_ptr, M_SCSIDA); in dadone_probeataiddir()
5905 if ((error == 0) && (softc->flags & DA_FLAG_CAN_ATA_SUPCAP)) { in dadone_probeataiddir()
5906 softc->state = DA_STATE_PROBE_ATA_SUP; in dadone_probeataiddir()
5923 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone_probeatasup\n")); in dadone_probeatasup()
5925 softc = (struct da_softc *)periph->softc; in dadone_probeatasup()
5926 priority = done_ccb->ccb_h.pinfo.priority; in dadone_probeatasup()
5927 csio = &done_ccb->csio; in dadone_probeatasup()
5931 if ((csio->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in dadone_probeatasup()
5937 sup_cap = (struct ata_identify_log_sup_cap *)csio->data_ptr; in dadone_probeatasup()
5938 valid_len = csio->dxfer_len - csio->resid; in dadone_probeatasup()
5940 sup_zac_cap) + 1 + sizeof(sup_cap->sup_zac_cap); in dadone_probeatasup()
5944 zoned = le64dec(sup_cap->zoned_cap); in dadone_probeatasup()
5953 softc->zone_mode = DA_ZONE_HOST_AWARE; in dadone_probeatasup()
5956 softc->zone_mode = in dadone_probeatasup()
5960 zac_cap = le64dec(sup_cap->sup_zac_cap); in dadone_probeatasup()
5963 softc->zone_flags |= in dadone_probeatasup()
5966 softc->zone_flags |= in dadone_probeatasup()
5969 softc->zone_flags |= in dadone_probeatasup()
5972 softc->zone_flags |= in dadone_probeatasup()
5975 softc->zone_flags |= in dadone_probeatasup()
5980 * ACS-4, r08 on April 28th, 2015. in dadone_probeatasup()
5986 softc->zone_flags |= DA_ZONE_FLAG_SUP_MASK; in dadone_probeatasup()
6000 softc->flags &= ~DA_FLAG_CAN_ATA_SUPCAP; in dadone_probeatasup()
6004 softc->zone_flags &= ~DA_ZONE_FLAG_SUP_MASK; in dadone_probeatasup()
6005 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { in dadone_probeatasup()
6007 cam_release_devq(done_ccb->ccb_h.path, in dadone_probeatasup()
6016 free(csio->data_ptr, M_SCSIDA); in dadone_probeatasup()
6018 if ((error == 0) && (softc->flags & DA_FLAG_CAN_ATA_ZONE)) { in dadone_probeatasup()
6019 softc->state = DA_STATE_PROBE_ATA_ZONE; in dadone_probeatasup()
6035 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone_probeatazone\n")); in dadone_probeatazone()
6037 softc = (struct da_softc *)periph->softc; in dadone_probeatazone()
6038 csio = &done_ccb->csio; in dadone_probeatazone()
6042 if ((csio->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in dadone_probeatazone()
6047 zi_log = (struct ata_zoned_info_log *)csio->data_ptr; in dadone_probeatazone()
6049 valid_len = csio->dxfer_len - csio->resid; in dadone_probeatazone()
6051 version_info) + 1 + sizeof(zi_log->version_info); in dadone_probeatazone()
6055 tmpvar = le64dec(zi_log->zoned_cap); in dadone_probeatazone()
6058 softc->zone_flags |= in dadone_probeatazone()
6061 softc->zone_flags &= in dadone_probeatazone()
6064 tmpvar = le64dec(zi_log->optimal_seq_zones); in dadone_probeatazone()
6066 softc->zone_flags |= DA_ZONE_FLAG_OPT_SEQ_SET; in dadone_probeatazone()
6067 softc->optimal_seq_zones = (tmpvar & in dadone_probeatazone()
6070 softc->zone_flags &= ~DA_ZONE_FLAG_OPT_SEQ_SET; in dadone_probeatazone()
6071 softc->optimal_seq_zones = 0; in dadone_probeatazone()
6074 tmpvar =le64dec(zi_log->optimal_nonseq_zones); in dadone_probeatazone()
6076 softc->zone_flags |= in dadone_probeatazone()
6078 softc->optimal_nonseq_zones = in dadone_probeatazone()
6081 softc->zone_flags &= in dadone_probeatazone()
6083 softc->optimal_nonseq_zones = 0; in dadone_probeatazone()
6086 tmpvar = le64dec(zi_log->max_seq_req_zones); in dadone_probeatazone()
6088 softc->zone_flags |= DA_ZONE_FLAG_MAX_SEQ_SET; in dadone_probeatazone()
6089 softc->max_seq_zones = in dadone_probeatazone()
6092 softc->zone_flags &= ~DA_ZONE_FLAG_MAX_SEQ_SET; in dadone_probeatazone()
6093 softc->max_seq_zones = 0; in dadone_probeatazone()
6102 softc->flags &= ~DA_FLAG_CAN_ATA_ZONE; in dadone_probeatazone()
6103 softc->flags &= ~DA_ZONE_FLAG_SET_MASK; in dadone_probeatazone()
6105 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { in dadone_probeatazone()
6107 cam_release_devq(done_ccb->ccb_h.path, in dadone_probeatazone()
6116 free(csio->data_ptr, M_SCSIDA); in dadone_probeatazone()
6129 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone_probezone\n")); in dadone_probezone()
6131 softc = (struct da_softc *)periph->softc; in dadone_probezone()
6132 csio = &done_ccb->csio; in dadone_probezone()
6136 if ((csio->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in dadone_probezone()
6142 zoned_bdc = (struct scsi_vpd_zoned_bdc *)csio->data_ptr; in dadone_probezone()
6143 valid_len = csio->dxfer_len - csio->resid; in dadone_probezone()
6146 sizeof(zoned_bdc->max_seq_req_zones); in dadone_probezone()
6148 && (scsi_2btoul(zoned_bdc->page_length) >= SVPD_ZBDC_PL)) { in dadone_probezone()
6149 if (zoned_bdc->flags & SVPD_ZBDC_URSWRZ) in dadone_probezone()
6150 softc->zone_flags |= DA_ZONE_FLAG_URSWRZ; in dadone_probezone()
6152 softc->zone_flags &= ~DA_ZONE_FLAG_URSWRZ; in dadone_probezone()
6153 softc->optimal_seq_zones = in dadone_probezone()
6154 scsi_4btoul(zoned_bdc->optimal_seq_zones); in dadone_probezone()
6155 softc->zone_flags |= DA_ZONE_FLAG_OPT_SEQ_SET; in dadone_probezone()
6156 softc->optimal_nonseq_zones = scsi_4btoul( in dadone_probezone()
6157 zoned_bdc->optimal_nonseq_zones); in dadone_probezone()
6158 softc->zone_flags |= DA_ZONE_FLAG_OPT_NONSEQ_SET; in dadone_probezone()
6159 softc->max_seq_zones = in dadone_probezone()
6160 scsi_4btoul(zoned_bdc->max_seq_req_zones); in dadone_probezone()
6161 softc->zone_flags |= DA_ZONE_FLAG_MAX_SEQ_SET; in dadone_probezone()
6168 * Re-check this assumption once the SAT spec is in dadone_probezone()
6175 softc->zone_flags |= DA_ZONE_FLAG_SUP_MASK; in dadone_probezone()
6182 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { in dadone_probezone()
6184 cam_release_devq(done_ccb->ccb_h.path, in dadone_probezone()
6193 free(csio->data_ptr, M_SCSIDA); in dadone_probezone()
6204 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone_tur\n")); in dadone_tur()
6206 softc = (struct da_softc *)periph->softc; in dadone_tur()
6210 if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { in dadone_tur()
6214 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) in dadone_tur()
6215 cam_release_devq(done_ccb->ccb_h.path, in dadone_tur()
6221 softc->flags &= ~DA_FLAG_TUR_PENDING; in dadone_tur()
6233 softc = (struct da_softc *)periph->softc; in dareprobe()
6238 if (softc->state != DA_STATE_NORMAL) in dareprobe()
6244 softc->state = DA_STATE_PROBE_WP; in dareprobe()
6256 if (ccb->csio.bio != NULL) in daerror()
6257 biotrack(ccb->csio.bio, __func__); in daerror()
6260 periph = xpt_path_periph(ccb->ccb_h.path); in daerror()
6261 softc = (struct da_softc *)periph->softc; in daerror()
6270 if ((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_INVALID) { in daerror()
6283 xpt_print(periph->path, "Capacity data has changed\n"); in daerror()
6284 softc->flags &= ~DA_FLAG_PROBED; in daerror()
6290 softc->flags &= ~DA_FLAG_PROBED; in daerror()
6291 disk_media_changed(softc->disk, M_NOWAIT); in daerror()
6305 xpt_print(periph->path, "INQUIRY data has changed\n"); in daerror()
6306 softc->flags &= ~DA_FLAG_PROBED; in daerror()
6310 asc == 0x3a && (softc->flags & DA_FLAG_PACK_INVALID) == 0) { in daerror()
6312 /* 3a/1: MEDIUM NOT PRESENT - TRAY CLOSED */ in daerror()
6313 /* 3a/2: MEDIUM NOT PRESENT - TRAY OPEN */ in daerror()
6314 /* 3a/3: MEDIUM NOT PRESENT - LOADABLE */ in daerror()
6315 /* 3a/4: MEDIUM NOT PRESENT - MEDIUM AUXILIARY MEMORY ACCESSIBLE */ in daerror()
6316 softc->flags |= DA_FLAG_PACK_INVALID; in daerror()
6317 disk_media_gone(softc->disk, M_NOWAIT); in daerror()
6324 switch (ccb->ccb_h.status & CAM_STATUS_MASK) { in daerror()
6326 softc->timeouts++; in daerror()
6335 softc->errors++; in daerror()
6349 if (softc->quirks & DA_Q_RETRY_BUSY) in daerror()
6358 struct da_softc *softc = periph->softc; in damediapoll()
6360 if (!cam_iosched_has_work_flags(softc->cam_iosched, DA_WORK_TUR) && in damediapoll()
6361 (softc->flags & DA_FLAG_TUR_PENDING) == 0 && in damediapoll()
6362 softc->state == DA_STATE_NORMAL && in damediapoll()
6363 LIST_EMPTY(&softc->pending_ccbs)) { in damediapoll()
6365 cam_iosched_set_work_flags(softc->cam_iosched, DA_WORK_TUR); in damediapoll()
6372 callout_schedule_sbt(&softc->mediapoll_c, in damediapoll()
6385 softc = (struct da_softc *)periph->softc; in daprevent()
6388 && (softc->flags & DA_FLAG_PACK_LOCKED) == 0) in daprevent()
6390 && (softc->flags & DA_FLAG_PACK_LOCKED) != 0)) { in daprevent()
6396 scsi_prevent(&ccb->csio, in daprevent()
6405 SF_RETRY_UA | SF_NO_PRINT, softc->disk->d_devstat); in daprevent()
6409 softc->flags &= ~DA_FLAG_PACK_LOCKED; in daprevent()
6411 softc->flags |= DA_FLAG_PACK_LOCKED; in daprevent()
6427 softc = (struct da_softc *)periph->softc; in dasetgeom()
6429 dp = &softc->params; in dasetgeom()
6430 dp->secsize = block_len; in dasetgeom()
6431 dp->sectors = maxsector + 1; in dasetgeom()
6433 lbppbe = rcaplong->prot_lbppbe & SRC16_LBPPBE; in dasetgeom()
6434 lalba = scsi_2btoul(rcaplong->lalba_lbp); in dasetgeom()
6436 if (rcaplong->prot & SRC16_PROT_EN) in dasetgeom()
6437 softc->p_type = ((rcaplong->prot & SRC16_P_TYPE) >> in dasetgeom()
6440 softc->p_type = 0; in dasetgeom()
6444 softc->p_type = 0; in dasetgeom()
6448 dp->stripesize = block_len << lbppbe; in dasetgeom()
6449 dp->stripeoffset = (dp->stripesize - block_len * lalba) % in dasetgeom()
6450 dp->stripesize; in dasetgeom()
6451 } else if (softc->quirks & DA_Q_4K) { in dasetgeom()
6452 dp->stripesize = 4096; in dasetgeom()
6453 dp->stripeoffset = 0; in dasetgeom()
6454 } else if (softc->unmap_gran != 0) { in dasetgeom()
6455 dp->stripesize = block_len * softc->unmap_gran; in dasetgeom()
6456 dp->stripeoffset = (dp->stripesize - block_len * in dasetgeom()
6457 softc->unmap_gran_align) % dp->stripesize; in dasetgeom()
6459 dp->stripesize = 0; in dasetgeom()
6460 dp->stripeoffset = 0; in dasetgeom()
6471 xpt_setup_ccb(&ccg.ccb_h, periph->path, CAM_PRIORITY_NORMAL); in dasetgeom()
6473 ccg.block_size = dp->secsize; in dasetgeom()
6474 ccg.volume_size = dp->sectors; in dasetgeom()
6481 * We don't know what went wrong here- but just pick in dasetgeom()
6485 dp->heads = 255; in dasetgeom()
6486 dp->secs_per_track = 255; in dasetgeom()
6487 dp->cylinders = dp->sectors / (255 * 255); in dasetgeom()
6488 if (dp->cylinders == 0) { in dasetgeom()
6489 dp->cylinders = 1; in dasetgeom()
6492 dp->heads = ccg.heads; in dasetgeom()
6493 dp->secs_per_track = ccg.secs_per_track; in dasetgeom()
6494 dp->cylinders = ccg.cylinders; in dasetgeom()
6504 && (bcmp(rcaplong, &softc->rcaplong, in dasetgeom()
6505 min(sizeof(softc->rcaplong), rcap_len)) != 0)) { in dasetgeom()
6509 xpt_setup_ccb(&cdai.ccb_h, periph->path, CAM_PRIORITY_NORMAL); in dasetgeom()
6519 xpt_print(periph->path, "%s: failed to set read " in dasetgeom()
6525 bcopy(rcaplong, &softc->rcaplong, in dasetgeom()
6526 min(sizeof(softc->rcaplong), rcap_len)); in dasetgeom()
6530 softc->disk->d_sectorsize = softc->params.secsize; in dasetgeom()
6531 softc->disk->d_mediasize = softc->params.secsize * (off_t)softc->params.sectors; in dasetgeom()
6532 softc->disk->d_stripesize = softc->params.stripesize; in dasetgeom()
6533 softc->disk->d_stripeoffset = softc->params.stripeoffset; in dasetgeom()
6535 softc->disk->d_fwsectors = softc->params.secs_per_track; in dasetgeom()
6536 softc->disk->d_fwheads = softc->params.heads; in dasetgeom()
6537 softc->disk->d_devstat->block_size = softc->params.secsize; in dasetgeom()
6538 softc->disk->d_devstat->flags &= ~DEVSTAT_BS_UNAVAILABLE; in dasetgeom()
6540 error = disk_resize(softc->disk, M_NOWAIT); in dasetgeom()
6542 xpt_print(periph->path, "disk_resize(9) failed, error = %d\n", error); in dasetgeom()
6549 struct da_softc *softc = periph->softc; in dasendorderedtag()
6553 if (!LIST_EMPTY(&softc->pending_ccbs)) { in dasendorderedtag()
6554 if ((softc->flags & DA_FLAG_WAS_OTAG) == 0) in dasendorderedtag()
6555 softc->flags |= DA_FLAG_NEED_OTAG; in dasendorderedtag()
6556 softc->flags &= ~DA_FLAG_WAS_OTAG; in dasendorderedtag()
6561 callout_schedule_sbt(&softc->sendordered_c, in dasendorderedtag()
6568 * sync the disk cache to physical media.
6582 softc = (struct da_softc *)periph->softc; in dashutdown()
6586 (softc->flags & DA_FLAG_OPEN)) { in dashutdown()
6587 dadump(softc->disk, NULL, 0, 0); in dashutdown()
6594 * We only sync the cache if the drive is still open, and in dashutdown()
6597 if (((softc->flags & DA_FLAG_OPEN) == 0) in dashutdown()
6598 || (softc->quirks & DA_Q_NO_SYNC_CACHE)) { in dashutdown()
6604 scsi_synchronize_cache(&ccb->csio, in dashutdown()
6615 softc->disk->d_devstat); in dashutdown()
6617 xpt_print(periph->path, "Synchronize cache failed\n"); in dashutdown()
6639 scsi_cmd = (struct scsi_format_unit *)&csio->cdb_io.cdb_bytes; in scsi_format_unit()
6640 scsi_cmd->opcode = FORMAT_UNIT; in scsi_format_unit()
6641 scsi_cmd->byte2 = byte2; in scsi_format_unit()
6642 scsi_ulto2b(ileave, scsi_cmd->interleave); in scsi_format_unit()
6676 &csio->cdb_io.cdb_bytes; in scsi_read_defects()
6680 cdb10->opcode = READ_DEFECT_DATA_10; in scsi_read_defects()
6681 cdb10->format = list_format; in scsi_read_defects()
6682 scsi_ulto2b(dxfer_len, cdb10->alloc_length); in scsi_read_defects()
6687 &csio->cdb_io.cdb_bytes; in scsi_read_defects()
6691 cdb12->opcode = READ_DEFECT_DATA_12; in scsi_read_defects()
6692 cdb12->format = list_format; in scsi_read_defects()
6693 scsi_ulto4b(dxfer_len, cdb12->alloc_length); in scsi_read_defects()
6694 scsi_ulto4b(addr_desc_index, cdb12->address_descriptor_index); in scsi_read_defects()
6718 scsi_cmd = (struct scsi_sanitize *)&csio->cdb_io.cdb_bytes; in scsi_sanitize()
6719 scsi_cmd->opcode = SANITIZE; in scsi_sanitize()
6720 scsi_cmd->byte2 = byte2; in scsi_sanitize()
6721 scsi_cmd->control = control; in scsi_sanitize()
6722 scsi_ulto2b(dxfer_len, scsi_cmd->length); in scsi_sanitize()
6747 scsi_cmd = (struct scsi_zbc_out *)&csio->cdb_io.cdb_bytes; in scsi_zbc_out()
6748 scsi_cmd->opcode = ZBC_OUT; in scsi_zbc_out()
6749 scsi_cmd->service_action = service_action; in scsi_zbc_out()
6750 scsi_u64to8b(zone_id, scsi_cmd->zone_id); in scsi_zbc_out()
6751 scsi_cmd->zone_flags = zone_flags; in scsi_zbc_out()
6774 scsi_cmd = (struct scsi_zbc_in *)&csio->cdb_io.cdb_bytes; in scsi_zbc_in()
6775 scsi_cmd->opcode = ZBC_IN; in scsi_zbc_in()
6776 scsi_cmd->service_action = service_action; in scsi_zbc_in()
6777 scsi_ulto4b(dxfer_len, scsi_cmd->length); in scsi_zbc_in()
6778 scsi_u64to8b(zone_start_lba, scsi_cmd->zone_start_lba); in scsi_zbc_in()
6779 scsi_cmd->zone_options = zone_options; in scsi_zbc_in()
6833 * That isn't clear from the SAT-4 spec (as of rev 05). in scsi_ata_zac_mgmt_out()
6843 * field. That isn't clear in the SAT-4 spec (as in scsi_ata_zac_mgmt_out()