Lines Matching +full:camera +full:- +full:command +full:- +full:set
1 /*-
4 * SPDX-License-Identifier: BSD-2-Clause
84 * ATA -> LOGDIR -> IDDIR -> SUP -> ATA_ZONE
398 softc->delete_available |= (1 << delete_method); \
400 softc->delete_available &= ~(1 << delete_method); \
434 * synchronize cache command.
442 * This drive doesn't like the synchronize cache command
451 * This drive doesn't like the synchronize cache command
460 * Doesn't like the synchronize cache command.
468 * Doesn't like the synchronize cache command.
476 * Doesn't like the synchronize cache command.
483 * Doesn't like the synchronize cache command.
493 * 6-byte CDB.
506 * Doesn't like the synchronize cache command.
538 * EXATELECOM (Sigmatel) i-Bead 100/105 USB Flash MP3 Player
541 {T_DIRECT, SIP_MEDIA_REMOVABLE, "EXATEL", "i-BEAD10*", "*"},
594 * SEAGRAND NP-900 MP3 Player
597 {T_DIRECT, SIP_MEDIA_REMOVABLE, "SEAGRAND", "NP-900*", "*"},
628 {T_DIRECT, SIP_MEDIA_REMOVABLE, "TEAC" , "FD-05*", "*"},
633 * Kingston DataTraveler II+ USB Pen-Drive.
678 {T_DIRECT, SIP_MEDIA_REMOVABLE, "USB-DISK", "FreeDik-FlashUsb",
699 * United MP5512 Portable MP3 Player (2-in-1 USB DISK/MP3)
745 * Genesys 6-in-1 Card Reader
753 * Rekam Digital CAMERA
756 {T_DIRECT, SIP_MEDIA_REMOVABLE, "CAMERA*", "4MP-9J6*",
777 * X-Micro Flash Disk
780 {T_DIRECT, SIP_MEDIA_REMOVABLE, "X-Micro", "Flash Disk",
825 * I/O Magic USB flash - Giga Bank
828 {T_DIRECT, SIP_MEDIA_FIXED, "GS-Magic", "stor*", "*"},
849 * Storcase (Kingston) InfoStation IFS FC2/SATA-R 201A
852 {T_DIRECT, SIP_MEDIA_FIXED, "IFS", "FC2/SATA-R*",
857 * Samsung YP-U3 mp3-player
860 {T_DIRECT, SIP_MEDIA_REMOVABLE, "Samsung", "YP-U3",
869 * Sony Cyber-Shot DSC cameras
891 * I-O Data USB Flash Disk
894 {T_DIRECT, SIP_MEDIA_REMOVABLE, "I-O DATA", "USB Flash Disk*",
1134 * Olympus digital cameras (C-3040ZOOM, C-2040ZOOM, C-1)
1142 * Olympus digital cameras (D-370)
1150 * Olympus digital cameras (E-100RS, E-10).
1158 * Olympus FE-210 camera
1165 * Pentax Digital Camera
1168 {T_DIRECT, SIP_MEDIA_REMOVABLE, "PENTAX", "DIGITAL CAMERA",
1180 * Laser MP3-2GA13 MP3 player
1200 { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "Corsair CSSD-F*", "*" },
1232 { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "M4-CT???M4SSD2*", "*" },
1240 { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "C300-CTFDDAC???MAG*",
1285 * Intel X25-M Series SSDs
1320 { T_DIRECT, SIP_MEDIA_FIXED, "*", "OCZ-AGILITY2*", "*" },
1328 { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "OCZ-AGILITY3*", "*" },
1352 { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "OCZ-VERTEX3*", "*" },
1360 { T_DIRECT, SIP_MEDIA_FIXED, "ATA", "OCZ-VERTEX4*", "*" },
1441 * connected via SATA-to-SAS interposer and because of this
1465 * Hama Innostor USB-Stick
1481 * MX-ES USB Drive by Mach Xtreme
1594 "Disable detection of write-protected disks");
1655 "max -- also bogus"
1681 struct da_softc *softc = periph->softc; in da_periph_hold()
1683 cnt = atomic_fetchadd_int(&softc->ref_flags[token], 1); in da_periph_hold()
1685 panic("Re-holding for reason %d, cnt = %d", token, cnt); in da_periph_hold()
1694 struct da_softc *softc = periph->softc; in da_periph_unhold()
1699 cnt = atomic_fetchadd_int(&softc->ref_flags[token], -1); in da_periph_unhold()
1715 struct da_softc *softc = periph->softc; in da_periph_acquire()
1717 cnt = atomic_fetchadd_int(&softc->ref_flags[token], 1); in da_periph_acquire()
1719 panic("Re-refing for reason %d, cnt = %d", token, cnt); in da_periph_acquire()
1728 struct da_softc *softc = periph->softc; in da_periph_release()
1733 cnt = atomic_fetchadd_int(&softc->ref_flags[token], -1); in da_periph_release()
1743 struct da_softc *softc = periph->softc; in da_periph_release_locked()
1748 cnt = atomic_fetchadd_int(&softc->ref_flags[token], -1); in da_periph_release_locked()
1775 periph = (struct cam_periph *)dp->d_drv1; in daopen()
1787 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE | CAM_DEBUG_PERIPH, in daopen()
1790 softc = (struct da_softc *)periph->softc; in daopen()
1794 error = cam_periph_sleep(periph, &softc->disk->d_mediasize, PRIBIO, in daopen()
1797 xpt_print(periph->path, "unable to retrieve capacity data\n"); in daopen()
1799 if (periph->flags & CAM_PERIPH_INVALID) in daopen()
1802 if (error == 0 && (softc->flags & DA_FLAG_PACK_REMOVABLE) != 0 && in daopen()
1803 (softc->quirks & DA_Q_NO_PREVENT) == 0) in daopen()
1807 * Only 'validate' the pack if the media size is non-zero and the in daopen()
1813 if (error == 0 && softc->params.sectors != 0) in daopen()
1814 softc->flags &= ~DA_FLAG_PACK_INVALID; in daopen()
1816 softc->flags |= DA_FLAG_PACK_INVALID; in daopen()
1819 softc->flags |= DA_FLAG_OPEN; in daopen()
1837 periph = (struct cam_periph *)dp->d_drv1; in daclose()
1838 softc = (struct da_softc *)periph->softc; in daclose()
1840 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE | CAM_DEBUG_PERIPH, in daclose()
1845 if ((softc->flags & DA_FLAG_DIRTY) != 0 && in daclose()
1846 (softc->quirks & DA_Q_NO_SYNC_CACHE) == 0 && in daclose()
1847 (softc->flags & DA_FLAG_PACK_INVALID) == 0) { in daclose()
1849 scsi_synchronize_cache(&ccb->csio, /*retries*/1, in daclose()
1855 softc->disk->d_devstat); in daclose()
1856 softc->flags &= ~DA_FLAG_DIRTY; in daclose()
1861 if ((softc->flags & DA_FLAG_PACK_REMOVABLE) != 0 && in daclose()
1862 (softc->quirks & DA_Q_NO_PREVENT) == 0) in daclose()
1873 if ((softc->flags & DA_FLAG_PACK_REMOVABLE) != 0) in daclose()
1874 softc->disk->d_devstat->flags |= DEVSTAT_BS_UNAVAILABLE; in daclose()
1876 softc->flags &= ~DA_FLAG_OPEN; in daclose()
1877 while (softc->refcount != 0) in daclose()
1878 cam_periph_sleep(periph, &softc->refcount, PRIBIO, "daclose", 1); in daclose()
1887 struct da_softc *softc = (struct da_softc *)periph->softc; in daschedule()
1889 if (softc->state != DA_STATE_NORMAL) in daschedule()
1892 cam_iosched_schedule(softc->cam_iosched, periph); in daschedule()
1906 periph = (struct cam_periph *)bp->bio_disk->d_drv1; in dastrategy()
1907 softc = (struct da_softc *)periph->softc; in dastrategy()
1914 * - the medium is missing in dastrategy()
1915 * - its size is unknown in dastrategy()
1916 * - it differs from the medium present at daopen in dastrategy()
1917 * - we're tearing the cam periph device down in dastrategy()
1919 * the last condition since PACK_INVALID is set when we invalidate in dastrategy()
1922 if ((softc->flags & DA_FLAG_PACK_INVALID)) { in dastrategy()
1928 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dastrategy(%p)\n", bp)); in dastrategy()
1935 if (bp->bio_cmd == BIO_ZONE) in dastrategy()
1936 bp->bio_flags |= BIO_ORDERED; in dastrategy()
1941 cam_iosched_queue_work(softc->cam_iosched, bp); in dastrategy()
1963 periph = dp->d_drv1; in dadump()
1964 softc = (struct da_softc *)periph->softc; in dadump()
1965 secsize = softc->params.secsize; in dadump()
1971 if ((softc->flags & DA_FLAG_PACK_INVALID) != 0) in dadump()
1976 xpt_setup_ccb(&csio.ccb_h, periph->path, CAM_PRIORITY_NORMAL); in dadump()
1984 /*minimum_cmd_size*/ softc->minimum_cmd_size, in dadump()
2001 if ((softc->quirks & DA_Q_NO_SYNC_CACHE) == 0) { in dadump()
2002 xpt_setup_ccb(&csio.ccb_h, periph->path, CAM_PRIORITY_NORMAL); in dadump()
2015 xpt_print(periph->path, "Synchronize cache failed\n"); in dadump()
2029 periph = (struct cam_periph *)bp->bio_disk->d_drv1; in dagetattr()
2031 ret = xpt_getattr(bp->bio_data, bp->bio_length, bp->bio_attribute, in dagetattr()
2032 periph->path); in dagetattr()
2035 bp->bio_completed = bp->bio_length; in dagetattr()
2074 periph = (struct cam_periph *)dp->d_drv1; in dadiskgonecb()
2084 softc = (struct da_softc *)periph->softc; in daoninvalidate()
2087 * De-register any async callbacks. in daoninvalidate()
2089 xpt_register_async(0, daasync, periph, periph->path); in daoninvalidate()
2091 softc->flags |= DA_FLAG_PACK_INVALID; in daoninvalidate()
2093 softc->invalidations++; in daoninvalidate()
2102 cam_iosched_flush(softc->cam_iosched, NULL, ENXIO); in daoninvalidate()
2108 disk_gone(softc->disk); in daoninvalidate()
2116 softc = (struct da_softc *)periph->softc; in dacleanup()
2120 cam_iosched_fini(softc->cam_iosched); in dacleanup()
2125 if ((softc->flags & DA_FLAG_SCTX_INIT) != 0) { in dacleanup()
2127 if (sysctl_ctx_free(&softc->sysctl_stats_ctx) != 0) in dacleanup()
2128 xpt_print(periph->path, in dacleanup()
2131 if (sysctl_ctx_free(&softc->sysctl_ctx) != 0) in dacleanup()
2132 xpt_print(periph->path, in dacleanup()
2136 callout_drain(&softc->mediapoll_c); in dacleanup()
2137 disk_destroy(softc->disk); in dacleanup()
2138 callout_drain(&softc->sendordered_c); in dacleanup()
2161 if (cgd->protocol != PROTO_SCSI) in daasync()
2163 if (SID_QUAL(&cgd->inq_data) != SID_QUAL_LU_CONNECTED) in daasync()
2165 if (SID_TYPE(&cgd->inq_data) != T_DIRECT in daasync()
2166 && SID_TYPE(&cgd->inq_data) != T_RBC in daasync()
2167 && SID_TYPE(&cgd->inq_data) != T_OPTICAL in daasync()
2168 && SID_TYPE(&cgd->inq_data) != T_ZBC_HM) in daasync()
2196 softc = periph->softc; in daasync()
2197 disk_attr_changed(softc->disk, "GEOM::physpath", in daasync()
2207 softc = (struct da_softc *)periph->softc; in daasync()
2215 if (xpt_path_periph(ccb->ccb_h.path) != periph && in daasync()
2220 xpt_print(ccb->ccb_h.path, in daasync()
2223 softc->flags &= ~DA_FLAG_PROBED; in daasync()
2228 softc->flags &= ~DA_FLAG_PROBED; in daasync()
2229 disk_media_changed(softc->disk, M_NOWAIT); in daasync()
2232 xpt_print(ccb->ccb_h.path, in daasync()
2235 softc->flags &= ~DA_FLAG_PROBED; in daasync()
2247 softc = (struct da_softc *)periph->softc; in daasync()
2248 if (!cam_iosched_has_work_flags(softc->cam_iosched, DA_WORK_TUR) && in daasync()
2249 (softc->flags & DA_FLAG_TUR_PENDING) == 0) { in daasync()
2251 cam_iosched_set_work_flags(softc->cam_iosched, DA_WORK_TUR); in daasync()
2262 softc = (struct da_softc *)periph->softc; in daasync()
2267 softc->flags |= DA_FLAG_RETRY_UA; in daasync()
2268 LIST_FOREACH(ccbh, &softc->pending_ccbs, periph_links.le) in daasync()
2269 ccbh->ccb_state |= DA_CCB_RETRY_UA; in daasync()
2274 softc = (struct da_softc *)periph->softc; in daasync()
2275 softc->flags &= ~DA_FLAG_PROBED; in daasync()
2296 if (periph->flags & CAM_PERIPH_INVALID) { in dasysctlinit()
2301 softc = (struct da_softc *)periph->softc; in dasysctlinit()
2302 snprintf(tmpstr, sizeof(tmpstr), "CAM DA unit %d", periph->unit_number); in dasysctlinit()
2303 snprintf(tmpstr2, sizeof(tmpstr2), "%d", periph->unit_number); in dasysctlinit()
2305 sysctl_ctx_init(&softc->sysctl_ctx); in dasysctlinit()
2307 softc->flags |= DA_FLAG_SCTX_INIT; in dasysctlinit()
2309 softc->sysctl_tree = SYSCTL_ADD_NODE_WITH_LABEL(&softc->sysctl_ctx, in dasysctlinit()
2312 if (softc->sysctl_tree == NULL) { in dasysctlinit()
2322 SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in dasysctlinit()
2327 SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in dasysctlinit()
2332 SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in dasysctlinit()
2335 &softc->minimum_cmd_size, 0, dacmdsizesysctl, "I", in dasysctlinit()
2337 SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, in dasysctlinit()
2338 SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, in dasysctlinit()
2339 "trim_count", CTLFLAG_RD, &softc->trim_count, in dasysctlinit()
2341 SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, in dasysctlinit()
2342 SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, in dasysctlinit()
2343 "trim_ranges", CTLFLAG_RD, &softc->trim_ranges, in dasysctlinit()
2345 SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, in dasysctlinit()
2346 SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, in dasysctlinit()
2347 "trim_lbas", CTLFLAG_RD, &softc->trim_lbas, in dasysctlinit()
2350 SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in dasysctlinit()
2355 SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in dasysctlinit()
2360 SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, in dasysctlinit()
2361 SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, in dasysctlinit()
2362 "optimal_seq_zones", CTLFLAG_RD, &softc->optimal_seq_zones, in dasysctlinit()
2364 SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, in dasysctlinit()
2365 SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, in dasysctlinit()
2367 &softc->optimal_nonseq_zones, in dasysctlinit()
2368 "Optimal Number of Non-Sequentially Written Sequential Write " in dasysctlinit()
2370 SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, in dasysctlinit()
2371 SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, in dasysctlinit()
2372 "max_seq_zones", CTLFLAG_RD, &softc->max_seq_zones, in dasysctlinit()
2375 SYSCTL_ADD_INT(&softc->sysctl_ctx, in dasysctlinit()
2376 SYSCTL_CHILDREN(softc->sysctl_tree), in dasysctlinit()
2380 &softc->error_inject, in dasysctlinit()
2384 SYSCTL_ADD_INT(&softc->sysctl_ctx, in dasysctlinit()
2385 SYSCTL_CHILDREN(softc->sysctl_tree), in dasysctlinit()
2389 &softc->p_type, in dasysctlinit()
2393 SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in dasysctlinit()
2397 SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in dasysctlinit()
2399 &softc->flags, (u_int)DA_FLAG_ROTATING, dabitsysctl, "I", in dasysctlinit()
2401 SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in dasysctlinit()
2403 &softc->flags, (u_int)DA_FLAG_UNMAPPEDIO, dabitsysctl, "I", in dasysctlinit()
2407 SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in dasysctlinit()
2417 xpt_setup_ccb(&cts.ccb_h, periph->path, CAM_PRIORITY_NONE); in dasysctlinit()
2429 if (fc->valid & CTS_FC_VALID_WWPN) { in dasysctlinit()
2430 softc->wwpn = fc->wwpn; in dasysctlinit()
2431 SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, in dasysctlinit()
2432 SYSCTL_CHILDREN(softc->sysctl_tree), in dasysctlinit()
2434 &softc->wwpn, "World Wide Port Name"); in dasysctlinit()
2443 softc->sysctl_stats_tree = SYSCTL_ADD_NODE(&softc->sysctl_stats_ctx, in dasysctlinit()
2444 SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, "stats", in dasysctlinit()
2446 SYSCTL_ADD_INT(&softc->sysctl_stats_ctx, in dasysctlinit()
2447 SYSCTL_CHILDREN(softc->sysctl_stats_tree), in dasysctlinit()
2451 &softc->errors, in dasysctlinit()
2454 SYSCTL_ADD_INT(&softc->sysctl_stats_ctx, in dasysctlinit()
2455 SYSCTL_CHILDREN(softc->sysctl_stats_tree), in dasysctlinit()
2459 &softc->timeouts, in dasysctlinit()
2462 SYSCTL_ADD_INT(&softc->sysctl_stats_ctx, in dasysctlinit()
2463 SYSCTL_CHILDREN(softc->sysctl_stats_tree), in dasysctlinit()
2467 &softc->invalidations, in dasysctlinit()
2472 cam_iosched_sysctl_init(softc->cam_iosched, &softc->sysctl_ctx, in dasysctlinit()
2473 softc->sysctl_tree); in dasysctlinit()
2487 value = softc->disk->d_delmaxsize; in dadeletemaxsysctl()
2489 if ((error != 0) || (req->newptr == NULL)) in dadeletemaxsysctl()
2493 if (value > dadeletemaxsize(softc, softc->delete_method)) { in dadeletemaxsysctl()
2496 softc->disk->d_delmaxsize = value; in dadeletemaxsysctl()
2511 || (req->newptr == NULL)) in dacmdsizesysctl()
2542 if ((error != 0) || (req->newptr == NULL)) in dasysctlsofttimeout()
2557 softc->delete_method = delete_method; in dadeletemethodset()
2558 softc->disk->d_delmaxsize = dadeletemaxsize(softc, delete_method); in dadeletemethodset()
2559 softc->delete_func = da_delete_functions[delete_method]; in dadeletemethodset()
2561 if (softc->delete_method > DA_DELETE_DISABLE) in dadeletemethodset()
2562 softc->disk->d_flags |= DISKFLAG_CANDELETE; in dadeletemethodset()
2564 softc->disk->d_flags &= ~DISKFLAG_CANDELETE; in dadeletemethodset()
2574 sectors = (off_t)softc->unmap_max_lba; in dadeletemaxsize()
2577 sectors = (off_t)ATA_DSM_RANGE_MAX * softc->trim_max_ranges; in dadeletemaxsize()
2580 sectors = omin(softc->ws_max_blks, WS16_MAX_BLKS); in dadeletemaxsize()
2584 sectors = omin(softc->ws_max_blks, WS10_MAX_BLKS); in dadeletemaxsize()
2590 return (off_t)softc->params.secsize * in dadeletemaxsize()
2591 omin(sectors, softc->params.sectors); in dadeletemaxsize()
2599 softc = (struct da_softc *)periph->softc; in daprobedone()
2605 if (bootverbose && (softc->flags & DA_FLAG_ANNOUNCED) == 0) { in daprobedone()
2612 if ((softc->delete_available & (1 << i)) == 0 && in daprobedone()
2613 i != softc->delete_method) in daprobedone()
2619 if (i == softc->delete_method) in daprobedone()
2624 printf("%s%d: %s\n", periph->periph_name, in daprobedone()
2625 periph->unit_number, buf); in daprobedone()
2627 if ((softc->disk->d_flags & DISKFLAG_WRITE_PROTECT) != 0 && in daprobedone()
2628 (softc->flags & DA_FLAG_ANNOUNCED) == 0) { in daprobedone()
2629 printf("%s%d: Write Protected\n", periph->periph_name, in daprobedone()
2630 periph->unit_number); in daprobedone()
2642 softc->state = DA_STATE_NORMAL; in daprobedone()
2643 softc->flags |= DA_FLAG_PROBED; in daprobedone()
2645 wakeup(&softc->disk->d_mediasize); in daprobedone()
2646 if ((softc->flags & DA_FLAG_ANNOUNCED) == 0) { in daprobedone()
2647 softc->flags |= DA_FLAG_ANNOUNCED; in daprobedone()
2654 disk_create(softc->disk, DISK_VERSION); in daprobedone()
2667 i = softc->delete_method_pref; in dadeletemethodchoose()
2668 methods = softc->delete_available | (1 << DA_DELETE_DISABLE); in dadeletemethodchoose()
2674 /* Use the pre-defined order to choose the best performing delete. */ in dadeletemethodchoose()
2678 if (softc->delete_available & (1 << i)) { in dadeletemethodchoose()
2697 if (error || !req->newptr) in dabitsysctl()
2711 if (softc->flags != 0) in daflagssysctl()
2712 sbuf_printf(&sbuf, "0x%b", (unsigned)softc->flags, DA_FLAG_STRING); in daflagssysctl()
2731 value = softc->delete_method; in dadeletemethodsysctl()
2738 if (error != 0 || req->newptr == NULL) in dadeletemethodsysctl()
2746 softc->delete_method_pref = i; in dadeletemethodsysctl()
2760 switch (softc->zone_mode) { in dazonemodesysctl()
2796 if (softc->zone_flags & da_zone_desc_table[i].value) { in dazonesupsysctl()
2838 LIST_INIT(&softc->pending_ccbs); in daregister()
2839 softc->state = DA_STATE_PROBE_WP; in daregister()
2840 bioq_init(&softc->delete_run_queue); in daregister()
2841 if (SID_IS_REMOVABLE(&cgd->inq_data)) in daregister()
2842 softc->flags |= DA_FLAG_PACK_REMOVABLE; in daregister()
2843 softc->unmap_max_ranges = UNMAP_MAX_RANGES; in daregister()
2844 softc->unmap_max_lba = UNMAP_RANGE_MAX; in daregister()
2845 softc->unmap_gran = 0; in daregister()
2846 softc->unmap_gran_align = 0; in daregister()
2847 softc->ws_max_blks = WS16_MAX_BLKS; in daregister()
2848 softc->trim_max_ranges = ATA_TRIM_MAX_RANGES; in daregister()
2849 softc->flags |= DA_FLAG_ROTATING; in daregister()
2851 periph->softc = softc; in daregister()
2856 match = cam_quirkmatch((caddr_t)&cgd->inq_data, in daregister()
2862 softc->quirks = ((struct da_quirk_entry *)match)->quirks; in daregister()
2864 softc->quirks = DA_Q_NONE; in daregister()
2867 xpt_path_inq(&cpi, periph->path); in daregister()
2869 softc->quirks |= DA_Q_NO_6_BYTE; in daregister()
2871 /* Override quirks if tunable is set */ in daregister()
2873 periph->unit_number); in daregister()
2874 quirks = softc->quirks; in daregister()
2876 softc->quirks = quirks; in daregister()
2878 if (SID_TYPE(&cgd->inq_data) == T_ZBC_HM) in daregister()
2879 softc->zone_mode = DA_ZONE_HOST_MANAGED; in daregister()
2880 else if (softc->quirks & DA_Q_SMR_DM) in daregister()
2881 softc->zone_mode = DA_ZONE_DRIVE_MANAGED; in daregister()
2883 softc->zone_mode = DA_ZONE_NONE; in daregister()
2885 if (softc->zone_mode != DA_ZONE_NONE) { in daregister()
2888 softc->zone_interface = DA_ZONE_IF_ATA_SAT; in daregister()
2890 softc->zone_interface = DA_ZONE_IF_ATA_PASS; in daregister()
2892 softc->zone_interface = DA_ZONE_IF_SCSI; in daregister()
2895 TASK_INIT(&softc->sysctl_task, 0, dasysctlinit, periph); in daregister()
2898 * Let XPT know we can use UMA-allocated CCBs. in daregister()
2903 periph->ccb_zone = da_ccb_zone; in daregister()
2916 callout_init_mtx(&softc->sendordered_c, cam_periph_mtx(periph), 0); in daregister()
2917 callout_reset_sbt(&softc->sendordered_c, in daregister()
2925 if (softc->quirks & DA_Q_NO_6_BYTE || SID_TYPE(&cgd->inq_data) == T_RBC) in daregister()
2926 softc->minimum_cmd_size = 10; in daregister()
2928 softc->minimum_cmd_size = 6; in daregister()
2934 periph->unit_number); in daregister()
2935 TUNABLE_INT_FETCH(tmpstr, &softc->minimum_cmd_size); in daregister()
2940 if (softc->minimum_cmd_size > 12) in daregister()
2941 softc->minimum_cmd_size = 16; in daregister()
2942 else if (softc->minimum_cmd_size > 10) in daregister()
2943 softc->minimum_cmd_size = 12; in daregister()
2944 else if (softc->minimum_cmd_size > 6) in daregister()
2945 softc->minimum_cmd_size = 10; in daregister()
2947 softc->minimum_cmd_size = 6; in daregister()
2950 softc->mode_page = SMS_ALL_PAGES_PAGE; in daregister()
2953 if (SID_ANSI_REV(&cgd->inq_data) >= SCSI_REV_SPC3 && in daregister()
2954 (softc->quirks & DA_Q_NO_RC16) == 0) { in daregister()
2955 softc->flags |= DA_FLAG_CAN_RC16; in daregister()
2961 softc->disk = disk_alloc(); in daregister()
2962 softc->disk->d_devstat = devstat_new_entry(periph->periph_name, in daregister()
2963 periph->unit_number, 0, in daregister()
2965 SID_TYPE(&cgd->inq_data) | in daregister()
2968 softc->disk->d_open = daopen; in daregister()
2969 softc->disk->d_close = daclose; in daregister()
2970 softc->disk->d_strategy = dastrategy; in daregister()
2971 if (cam_sim_pollable(periph->sim)) in daregister()
2972 softc->disk->d_dump = dadump; in daregister()
2973 softc->disk->d_getattr = dagetattr; in daregister()
2974 softc->disk->d_gone = dadiskgonecb; in daregister()
2975 softc->disk->d_name = "da"; in daregister()
2976 softc->disk->d_drv1 = periph; in daregister()
2978 softc->maxio = DFLTPHYS; /* traditional default */ in daregister()
2980 softc->maxio = maxphys; /* for safety */ in daregister()
2982 softc->maxio = cpi.maxio; in daregister()
2983 if (softc->quirks & DA_Q_128KB) in daregister()
2984 softc->maxio = min(softc->maxio, 128 * 1024); in daregister()
2985 softc->disk->d_maxsize = softc->maxio; in daregister()
2986 softc->disk->d_unit = periph->unit_number; in daregister()
2987 softc->disk->d_flags = DISKFLAG_DIRECT_COMPLETION | DISKFLAG_CANZONE; in daregister()
2988 if ((softc->quirks & DA_Q_NO_SYNC_CACHE) == 0) in daregister()
2989 softc->disk->d_flags |= DISKFLAG_CANFLUSHCACHE; in daregister()
2991 softc->flags |= DA_FLAG_UNMAPPEDIO; in daregister()
2992 softc->disk->d_flags |= DISKFLAG_UNMAPPED_BIO; in daregister()
2994 cam_strvis(softc->disk->d_descr, cgd->inq_data.vendor, in daregister()
2995 sizeof(cgd->inq_data.vendor), sizeof(softc->disk->d_descr)); in daregister()
2996 strlcat(softc->disk->d_descr, " ", sizeof(softc->disk->d_descr)); in daregister()
2997 cam_strvis(&softc->disk->d_descr[strlen(softc->disk->d_descr)], in daregister()
2998 cgd->inq_data.product, sizeof(cgd->inq_data.product), in daregister()
2999 sizeof(softc->disk->d_descr) - strlen(softc->disk->d_descr)); in daregister()
3000 softc->disk->d_hba_vendor = cpi.hba_vendor; in daregister()
3001 softc->disk->d_hba_device = cpi.hba_device; in daregister()
3002 softc->disk->d_hba_subvendor = cpi.hba_subvendor; in daregister()
3003 softc->disk->d_hba_subdevice = cpi.hba_subdevice; in daregister()
3004 snprintf(softc->disk->d_attachment, sizeof(softc->disk->d_attachment), in daregister()
3007 if (cam_iosched_init(&softc->cam_iosched, periph, softc->disk, in daregister()
3025 AC_INQ_CHANGED, daasync, periph, periph->path); in daregister()
3030 callout_init_mtx(&softc->mediapoll_c, cam_periph_mtx(periph), 0); in daregister()
3031 if ((softc->flags & DA_FLAG_PACK_REMOVABLE) && in daregister()
3032 (cgd->inq_flags & SID_AEN) == 0 && in daregister()
3034 callout_reset_sbt(&softc->mediapoll_c, da_poll_period * SBT_1S, in daregister()
3059 return -1; in da_zone_bio_to_scsi()
3071 if (bp->bio_cmd != BIO_ZONE) { in da_zone_cmd()
3076 softc = periph->softc; in da_zone_cmd()
3078 switch (bp->bio_zone.zone_cmd) { in da_zone_cmd()
3087 zone_sa = da_zone_bio_to_scsi(bp->bio_zone.zone_cmd); in da_zone_cmd()
3088 if (zone_sa == -1) { in da_zone_cmd()
3089 xpt_print(periph->path, "Cannot translate zone " in da_zone_cmd()
3090 "cmd %#x to SCSI\n", bp->bio_zone.zone_cmd); in da_zone_cmd()
3096 lba = bp->bio_zone.zone_params.rwp.id; in da_zone_cmd()
3098 if (bp->bio_zone.zone_params.rwp.flags & in da_zone_cmd()
3102 if (softc->zone_interface != DA_ZONE_IF_ATA_PASS) { in da_zone_cmd()
3103 scsi_zbc_out(&ccb->csio, in da_zone_cmd()
3120 * supports it. This is new as of SAT-4. in da_zone_cmd()
3123 * ZBC -> ZAC translation, since they are both in da_zone_cmd()
3124 * in the SAT-4 spec. in da_zone_cmd()
3132 * 4. It requires a 32-byte CDB, which at least at in da_zone_cmd()
3137 error = scsi_ata_zac_mgmt_out(&ccb->csio, in da_zone_cmd()
3153 xpt_print(periph->path, in da_zone_cmd()
3168 rep = &bp->bio_zone.zone_params.report; in da_zone_cmd()
3170 num_entries = rep->entries_allocated; in da_zone_cmd()
3172 xpt_print(periph->path, "No entries allocated for " in da_zone_cmd()
3179 alloc_size = min(alloc_size, softc->disk->d_maxsize); in da_zone_cmd()
3182 xpt_print(periph->path, "Unable to allocate memory " in da_zone_cmd()
3188 if (softc->zone_interface != DA_ZONE_IF_ATA_PASS) { in da_zone_cmd()
3189 scsi_zbc_in(&ccb->csio, in da_zone_cmd()
3194 /*zone_start_lba*/ rep->starting_id, in da_zone_cmd()
3195 /*zone_options*/ rep->rep_options, in da_zone_cmd()
3206 * supports it. This is new as of SAT-4. in da_zone_cmd()
3209 * ZBC -> ZAC translation, since they are both in da_zone_cmd()
3210 * in the SAT-4 spec. in da_zone_cmd()
3218 * 4. It requires a 32-byte CDB, which at least at in da_zone_cmd()
3223 error = scsi_ata_zac_mgmt_in(&ccb->csio, in da_zone_cmd()
3229 /*zone_id*/ rep->starting_id, in da_zone_cmd()
3230 /*zone_flags*/ rep->rep_options, in da_zone_cmd()
3239 xpt_print(periph->path, in da_zone_cmd()
3253 * it. devstat uses bio_bcount - bio_resid to calculate in da_zone_cmd()
3255 * uses bio_length - bio_resid to calculate the amount of in da_zone_cmd()
3264 * really an option. For now, just set the count to the in da_zone_cmd()
3270 bp->bio_bcount = bp->bio_length; in da_zone_cmd()
3279 params = &bp->bio_zone.zone_params.disk_params; in da_zone_cmd()
3282 switch (softc->zone_mode) { in da_zone_cmd()
3284 params->zone_mode = DISK_ZONE_MODE_DRIVE_MANAGED; in da_zone_cmd()
3287 params->zone_mode = DISK_ZONE_MODE_HOST_AWARE; in da_zone_cmd()
3290 params->zone_mode = DISK_ZONE_MODE_HOST_MANAGED; in da_zone_cmd()
3294 params->zone_mode = DISK_ZONE_MODE_NONE; in da_zone_cmd()
3298 if (softc->zone_flags & DA_ZONE_FLAG_URSWRZ) in da_zone_cmd()
3299 params->flags |= DISK_ZONE_DISK_URSWRZ; in da_zone_cmd()
3301 if (softc->zone_flags & DA_ZONE_FLAG_OPT_SEQ_SET) { in da_zone_cmd()
3302 params->optimal_seq_zones = softc->optimal_seq_zones; in da_zone_cmd()
3303 params->flags |= DISK_ZONE_OPT_SEQ_SET; in da_zone_cmd()
3306 if (softc->zone_flags & DA_ZONE_FLAG_OPT_NONSEQ_SET) { in da_zone_cmd()
3307 params->optimal_nonseq_zones = in da_zone_cmd()
3308 softc->optimal_nonseq_zones; in da_zone_cmd()
3309 params->flags |= DISK_ZONE_OPT_NONSEQ_SET; in da_zone_cmd()
3312 if (softc->zone_flags & DA_ZONE_FLAG_MAX_SEQ_SET) { in da_zone_cmd()
3313 params->max_seq_zones = softc->max_seq_zones; in da_zone_cmd()
3314 params->flags |= DISK_ZONE_MAX_SEQ_SET; in da_zone_cmd()
3316 if (softc->zone_flags & DA_ZONE_FLAG_RZ_SUP) in da_zone_cmd()
3317 params->flags |= DISK_ZONE_RZ_SUP; in da_zone_cmd()
3319 if (softc->zone_flags & DA_ZONE_FLAG_OPEN_SUP) in da_zone_cmd()
3320 params->flags |= DISK_ZONE_OPEN_SUP; in da_zone_cmd()
3322 if (softc->zone_flags & DA_ZONE_FLAG_CLOSE_SUP) in da_zone_cmd()
3323 params->flags |= DISK_ZONE_CLOSE_SUP; in da_zone_cmd()
3325 if (softc->zone_flags & DA_ZONE_FLAG_FINISH_SUP) in da_zone_cmd()
3326 params->flags |= DISK_ZONE_FINISH_SUP; in da_zone_cmd()
3328 if (softc->zone_flags & DA_ZONE_FLAG_RWP_SUP) in da_zone_cmd()
3329 params->flags |= DISK_ZONE_RWP_SUP; in da_zone_cmd()
3345 softc = (struct da_softc *)periph->softc; in dastart()
3347 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dastart\n")); in dastart()
3350 switch (softc->state) { in dastart()
3357 bp = cam_iosched_next_bio(softc->cam_iosched); in dastart()
3359 if (cam_iosched_has_work_flags(softc->cam_iosched, in dastart()
3361 softc->flags |= DA_FLAG_TUR_PENDING; in dastart()
3362 cam_iosched_clr_work_flags(softc->cam_iosched, in dastart()
3364 scsi_test_unit_ready(&start_ccb->csio, in dastart()
3370 start_ccb->ccb_h.ccb_bp = NULL; in dastart()
3371 start_ccb->ccb_h.ccb_state = DA_CCB_TUR; in dastart()
3378 if (bp->bio_cmd == BIO_DELETE) { in dastart()
3379 if (softc->delete_func != NULL) { in dastart()
3380 softc->delete_func(periph, start_ccb, bp); in dastart()
3392 if (cam_iosched_has_work_flags(softc->cam_iosched, in dastart()
3394 cam_iosched_clr_work_flags(softc->cam_iosched, in dastart()
3399 if ((bp->bio_flags & BIO_ORDERED) != 0 || in dastart()
3400 (softc->flags & DA_FLAG_NEED_OTAG) != 0) { in dastart()
3401 softc->flags &= ~DA_FLAG_NEED_OTAG; in dastart()
3402 softc->flags |= DA_FLAG_WAS_OTAG; in dastart()
3408 switch (bp->bio_cmd) { in dastart()
3417 if (bp->bio_cmd == BIO_WRITE) { in dastart()
3418 softc->flags |= DA_FLAG_DIRTY; in dastart()
3424 data_ptr = bp->bio_data; in dastart()
3425 if ((bp->bio_flags & (BIO_UNMAPPED|BIO_VLIST)) != 0) { in dastart()
3430 scsi_read_write(&start_ccb->csio, in dastart()
3436 softc->minimum_cmd_size, in dastart()
3437 /*lba*/bp->bio_pblkno, in dastart()
3438 /*block_count*/bp->bio_bcount / in dastart()
3439 softc->params.secsize, in dastart()
3441 /*dxfer_len*/ bp->bio_bcount, in dastart()
3445 start_ccb->csio.bio = bp; in dastart()
3452 * isn't dirty, FLUSH is a no-op. Use the in dastart()
3456 if ((softc->quirks & DA_Q_NO_SYNC_CACHE) != 0 || in dastart()
3457 (softc->flags & DA_FLAG_DIRTY) == 0) { in dastart()
3467 scsi_synchronize_cache(&start_ccb->csio, in dastart()
3476 * Clear the dirty flag before sending the command. in dastart()
3483 softc->flags &= ~DA_FLAG_DIRTY; in dastart()
3513 start_ccb->ccb_h.ccb_state = DA_CCB_BUFFER_IO; in dastart()
3514 start_ccb->ccb_h.flags |= CAM_UNLOCKED; in dastart()
3515 start_ccb->ccb_h.softtimeout = sbttotv(da_default_softtimeout); in dastart()
3518 LIST_INSERT_HEAD(&softc->pending_ccbs, in dastart()
3519 &start_ccb->ccb_h, periph_links.le); in dastart()
3522 if ((softc->flags & DA_FLAG_RETRY_UA) != 0) { in dastart()
3523 start_ccb->ccb_h.ccb_state |= DA_CCB_RETRY_UA; in dastart()
3524 softc->flags &= ~DA_FLAG_RETRY_UA; in dastart()
3527 start_ccb->ccb_h.ccb_bp = bp; in dastart()
3528 softc->refcount++; in dastart()
3542 if (da_disable_wp_detection || softc->mode_page < 0) { in dastart()
3543 if ((softc->flags & DA_FLAG_CAN_RC16) != 0) in dastart()
3544 softc->state = DA_STATE_PROBE_RC16; in dastart()
3546 softc->state = DA_STATE_PROBE_RC; in dastart()
3552 xpt_print(periph->path, "Unable to send mode sense - " in dastart()
3554 if ((softc->flags & DA_FLAG_CAN_RC16) != 0) in dastart()
3555 softc->state = DA_STATE_PROBE_RC16; in dastart()
3557 softc->state = DA_STATE_PROBE_RC; in dastart()
3560 scsi_mode_sense_len(&start_ccb->csio, in dastart()
3566 /*page*/ softc->mode_page, in dastart()
3569 /*minimum_cmd_size*/ softc->minimum_cmd_size, in dastart()
3572 start_ccb->ccb_h.ccb_bp = NULL; in dastart()
3573 start_ccb->ccb_h.ccb_state = DA_CCB_PROBE_WP; in dastart()
3588 scsi_read_capacity(&start_ccb->csio, in dastart()
3595 start_ccb->ccb_h.ccb_bp = NULL; in dastart()
3596 start_ccb->ccb_h.ccb_state = DA_CCB_PROBE_RC; in dastart()
3611 scsi_read_capacity_16(&start_ccb->csio, in dastart()
3622 start_ccb->ccb_h.ccb_bp = NULL; in dastart()
3623 start_ccb->ccb_h.ccb_state = DA_CCB_PROBE_RC16; in dastart()
3633 * If we get here we don't support any SBC-3 delete in dastart()
3636 * support it according to T10/1799-D Revision 31 in dastart()
3639 * from the available set. in dastart()
3641 softc->state = DA_STATE_PROBE_BLK_LIMITS; in dastart()
3654 scsi_inquiry(&start_ccb->csio, in dastart()
3664 start_ccb->ccb_h.ccb_bp = NULL; in dastart()
3665 start_ccb->ccb_h.ccb_state = DA_CCB_PROBE_LBP; in dastart()
3675 softc->state = DA_STATE_PROBE_BDC; in dastart()
3688 scsi_inquiry(&start_ccb->csio, in dastart()
3698 start_ccb->ccb_h.ccb_bp = NULL; in dastart()
3699 start_ccb->ccb_h.ccb_state = DA_CCB_PROBE_BLK_LIMITS; in dastart()
3708 softc->state = DA_STATE_PROBE_ATA; in dastart()
3721 scsi_inquiry(&start_ccb->csio, in dastart()
3731 start_ccb->ccb_h.ccb_bp = NULL; in dastart()
3732 start_ccb->ccb_h.ccb_state = DA_CCB_PROBE_BDC; in dastart()
3741 if ((softc->zone_mode == DA_ZONE_HOST_AWARE) in dastart()
3742 || (softc->zone_mode == DA_ZONE_HOST_MANAGED)) { in dastart()
3750 softc->state = DA_STATE_PROBE_ZONE; in dastart()
3757 ata_params = &periph->path->device->ident_data; in dastart()
3759 scsi_ata_identify(&start_ccb->csio, in dastart()
3767 start_ccb->ccb_h.ccb_bp = NULL; in dastart()
3768 start_ccb->ccb_h.ccb_state = DA_CCB_PROBE_ATA; in dastart()
3779 if ((softc->flags & DA_FLAG_CAN_ATA_LOG) == 0) { in dastart()
3796 xpt_print(periph->path, "Couldn't malloc log_dir " in dastart()
3802 retval = scsi_ata_read_log(&start_ccb->csio, in dastart()
3809 /*protocol*/ softc->flags & DA_FLAG_CAN_ATA_DMA ? in dastart()
3817 xpt_print(periph->path, "scsi_ata_read_log() failed!"); in dastart()
3822 start_ccb->ccb_h.ccb_bp = NULL; in dastart()
3823 start_ccb->ccb_h.ccb_state = DA_CCB_PROBE_ATA_LOGDIR; in dastart()
3839 if ((softc->flags & DA_FLAG_CAN_ATA_IDLOG) == 0) { in dastart()
3846 xpt_print(periph->path, "Couldn't malloc id_dir " in dastart()
3852 retval = scsi_ata_read_log(&start_ccb->csio, in dastart()
3859 /*protocol*/ softc->flags & DA_FLAG_CAN_ATA_DMA ? in dastart()
3867 xpt_print(periph->path, "scsi_ata_read_log() failed!"); in dastart()
3872 start_ccb->ccb_h.ccb_bp = NULL; in dastart()
3873 start_ccb->ccb_h.ccb_state = DA_CCB_PROBE_ATA_IDDIR; in dastart()
3888 if ((softc->flags & DA_FLAG_CAN_ATA_SUPCAP) == 0) { in dastart()
3895 xpt_print(periph->path, "Couldn't malloc sup_cap " in dastart()
3901 retval = scsi_ata_read_log(&start_ccb->csio, in dastart()
3908 /*protocol*/ softc->flags & DA_FLAG_CAN_ATA_DMA ? in dastart()
3916 xpt_print(periph->path, "scsi_ata_read_log() failed!"); in dastart()
3922 start_ccb->ccb_h.ccb_bp = NULL; in dastart()
3923 start_ccb->ccb_h.ccb_state = DA_CCB_PROBE_ATA_SUP; in dastart()
3939 if ((softc->flags & DA_FLAG_CAN_ATA_ZONE) == 0) { in dastart()
3946 xpt_print(periph->path, "Couldn't malloc ata_zone " in dastart()
3952 retval = scsi_ata_read_log(&start_ccb->csio, in dastart()
3959 /*protocol*/ softc->flags & DA_FLAG_CAN_ATA_DMA ? in dastart()
3967 xpt_print(periph->path, "scsi_ata_read_log() failed!"); in dastart()
3972 start_ccb->ccb_h.ccb_bp = NULL; in dastart()
3973 start_ccb->ccb_h.ccb_state = DA_CCB_PROBE_ATA_ZONE; in dastart()
3998 xpt_print(periph->path, "Couldn't malloc zone VPD " in dastart()
4002 scsi_inquiry(&start_ccb->csio, in dastart()
4012 start_ccb->ccb_h.ccb_bp = NULL; in dastart()
4013 start_ccb->ccb_h.ccb_state = DA_CCB_PROBE_ZONE; in dastart()
4034 struct da_softc *softc = (struct da_softc *)periph->softc; in da_delete_unmap()
4036 uint8_t *buf = softc->unmap_buf; in da_delete_unmap()
4038 uint64_t lba, lastlba = (uint64_t)-1; in da_delete_unmap()
4053 bzero(softc->unmap_buf, sizeof(softc->unmap_buf)); in da_delete_unmap()
4067 bioq_insert_tail(&softc->delete_run_queue, bp1); in da_delete_unmap()
4068 lba = bp1->bio_pblkno; in da_delete_unmap()
4069 count = bp1->bio_bcount / softc->params.secsize; in da_delete_unmap()
4073 c = omin(count, UNMAP_RANGE_MAX - lastcount); in da_delete_unmap()
4076 scsi_ulto4b(lastcount, d[ranges - 1].length); in da_delete_unmap()
4077 count -= c; in da_delete_unmap()
4080 } else if ((softc->quirks & DA_Q_STRICT_UNMAP) && in da_delete_unmap()
4081 softc->unmap_gran != 0) { in da_delete_unmap()
4083 if ((c = lastcount % softc->unmap_gran) != 0) { in da_delete_unmap()
4085 totalcount -= lastcount; in da_delete_unmap()
4086 lastlba = (uint64_t)-1; in da_delete_unmap()
4088 ranges--; in da_delete_unmap()
4090 totalcount -= c; in da_delete_unmap()
4091 lastlba -= c; in da_delete_unmap()
4092 lastcount -= c; in da_delete_unmap()
4094 d[ranges - 1].length); in da_delete_unmap()
4098 c = (lba - softc->unmap_gran_align) % softc->unmap_gran; in da_delete_unmap()
4100 c = softc->unmap_gran - c; in da_delete_unmap()
4105 count -= c; in da_delete_unmap()
4112 if (totalcount + c > softc->unmap_max_lba || in da_delete_unmap()
4113 ranges >= softc->unmap_max_ranges) { in da_delete_unmap()
4114 xpt_print(periph->path, in da_delete_unmap()
4117 da_delete_method_desc[softc->delete_method], in da_delete_unmap()
4118 totalcount + c, softc->unmap_max_lba, in da_delete_unmap()
4119 ranges, softc->unmap_max_ranges); in da_delete_unmap()
4127 count -= c; in da_delete_unmap()
4131 bp1 = cam_iosched_next_trim(softc->cam_iosched); in da_delete_unmap()
4134 if (ranges >= softc->unmap_max_ranges || in da_delete_unmap()
4135 totalcount + bp1->bio_bcount / in da_delete_unmap()
4136 softc->params.secsize > softc->unmap_max_lba) { in da_delete_unmap()
4137 cam_iosched_put_back_trim(softc->cam_iosched, bp1); in da_delete_unmap()
4143 if ((softc->quirks & DA_Q_STRICT_UNMAP) && softc->unmap_gran != 0 && in da_delete_unmap()
4144 (c = lastcount % softc->unmap_gran) != 0) { in da_delete_unmap()
4146 ranges--; in da_delete_unmap()
4148 scsi_ulto4b(lastcount - c, d[ranges - 1].length); in da_delete_unmap()
4154 scsi_unmap(&ccb->csio, in da_delete_unmap()
4163 ccb->ccb_h.ccb_state = DA_CCB_DELETE; in da_delete_unmap()
4164 ccb->ccb_h.flags |= CAM_UNLOCKED; in da_delete_unmap()
4165 softc->trim_count++; in da_delete_unmap()
4166 softc->trim_ranges += ranges; in da_delete_unmap()
4167 softc->trim_lbas += totalcount; in da_delete_unmap()
4168 cam_iosched_submit_trim(softc->cam_iosched); in da_delete_unmap()
4174 struct da_softc *softc = (struct da_softc *)periph->softc; in da_delete_trim()
4176 uint8_t *buf = softc->unmap_buf; in da_delete_trim()
4177 uint64_t lastlba = (uint64_t)-1; in da_delete_trim()
4183 bzero(softc->unmap_buf, sizeof(softc->unmap_buf)); in da_delete_trim()
4187 bioq_insert_tail(&softc->delete_run_queue, bp1); in da_delete_trim()
4188 lba = bp1->bio_pblkno; in da_delete_trim()
4189 count = bp1->bio_bcount / softc->params.secsize; in da_delete_trim()
4194 c = omin(count, ATA_DSM_RANGE_MAX - lastcount); in da_delete_trim()
4196 off = (ranges - 1) * 8; in da_delete_trim()
4199 count -= c; in da_delete_trim()
4217 count -= c; in da_delete_trim()
4219 if (count != 0 && ranges == softc->trim_max_ranges) { in da_delete_trim()
4220 xpt_print(periph->path, in da_delete_trim()
4222 da_delete_method_desc[softc->delete_method], in da_delete_trim()
4224 (softc->trim_max_ranges - ranges) * in da_delete_trim()
4230 bp1 = cam_iosched_next_trim(softc->cam_iosched); in da_delete_trim()
4233 if (bp1->bio_bcount / softc->params.secsize > in da_delete_trim()
4234 (softc->trim_max_ranges - ranges) * ATA_DSM_RANGE_MAX) { in da_delete_trim()
4235 cam_iosched_put_back_trim(softc->cam_iosched, bp1); in da_delete_trim()
4241 scsi_ata_trim(&ccb->csio, in da_delete_trim()
4250 ccb->ccb_h.ccb_state = DA_CCB_DELETE; in da_delete_trim()
4251 ccb->ccb_h.flags |= CAM_UNLOCKED; in da_delete_trim()
4252 softc->trim_count++; in da_delete_trim()
4253 softc->trim_ranges += ranges; in da_delete_trim()
4254 softc->trim_lbas += block_count; in da_delete_trim()
4255 cam_iosched_submit_trim(softc->cam_iosched); in da_delete_trim()
4260 * of using softc->ws_max_blks as it is absolute max for the
4272 softc = (struct da_softc *)periph->softc; in da_delete_ws()
4273 ws_max_blks = softc->disk->d_delmaxsize / softc->params.secsize; in da_delete_ws()
4274 lba = bp->bio_pblkno; in da_delete_ws()
4279 bioq_insert_tail(&softc->delete_run_queue, bp1); in da_delete_ws()
4280 count += bp1->bio_bcount / softc->params.secsize; in da_delete_ws()
4282 xpt_print(periph->path, in da_delete_ws()
4284 da_delete_method_desc[softc->delete_method], in da_delete_ws()
4289 bp1 = cam_iosched_next_trim(softc->cam_iosched); in da_delete_ws()
4292 if (lba + count != bp1->bio_pblkno || in da_delete_ws()
4293 count + bp1->bio_bcount / in da_delete_ws()
4294 softc->params.secsize > ws_max_blks) { in da_delete_ws()
4295 cam_iosched_put_back_trim(softc->cam_iosched, bp1); in da_delete_ws()
4300 scsi_write_same(&ccb->csio, in da_delete_ws()
4304 /*byte2*/softc->delete_method == in da_delete_ws()
4306 softc->delete_method == DA_DELETE_WS16 ? 16 : 10, in da_delete_ws()
4310 /*dxfer_len*/ softc->params.secsize, in da_delete_ws()
4313 ccb->ccb_h.ccb_state = DA_CCB_DELETE; in da_delete_ws()
4314 ccb->ccb_h.flags |= CAM_UNLOCKED; in da_delete_ws()
4315 softc->trim_count++; in da_delete_ws()
4316 softc->trim_ranges++; in da_delete_ws()
4317 softc->trim_lbas += count; in da_delete_ws()
4318 cam_iosched_submit_trim(softc->cam_iosched); in da_delete_ws()
4331 cdb = ccb->csio.cdb_io.cdb_bytes; in cmd6workaround()
4332 softc = (struct da_softc *)xpt_path_periph(ccb->ccb_h.path)->softc; in cmd6workaround()
4334 if (ccb->ccb_h.ccb_state == DA_CCB_DELETE) { in cmd6workaround()
4335 da_delete_methods old_method = softc->delete_method; in cmd6workaround()
4351 if (softc->delete_method == DA_DELETE_DISABLE) in cmd6workaround()
4352 xpt_print(ccb->ccb_h.path, in cmd6workaround()
4356 xpt_print(ccb->ccb_h.path, in cmd6workaround()
4359 da_delete_method_desc[softc->delete_method]); in cmd6workaround()
4361 while ((bp = bioq_takefirst(&softc->delete_run_queue)) != NULL) in cmd6workaround()
4362 cam_iosched_queue_work(softc->cam_iosched, bp); in cmd6workaround()
4363 cam_iosched_queue_work(softc->cam_iosched, in cmd6workaround()
4364 (struct bio *)ccb->ccb_h.ccb_bp); in cmd6workaround()
4365 ccb->ccb_h.ccb_bp = NULL; in cmd6workaround()
4370 if ((ccb->ccb_h.flags & CAM_CDB_POINTER) == 0 && in cmd6workaround()
4372 (softc->quirks & DA_Q_NO_PREVENT) == 0) { in cmd6workaround()
4374 xpt_print(ccb->ccb_h.path, in cmd6workaround()
4376 softc->quirks |= DA_Q_NO_PREVENT; in cmd6workaround()
4381 if ((ccb->ccb_h.flags & CAM_CDB_POINTER) == 0 && in cmd6workaround()
4383 (softc->quirks & DA_Q_NO_SYNC_CACHE) == 0) { in cmd6workaround()
4385 xpt_print(ccb->ccb_h.path, in cmd6workaround()
4387 softc->quirks |= DA_Q_NO_SYNC_CACHE; in cmd6workaround()
4388 softc->disk->d_flags &= ~DISKFLAG_CANFLUSHCACHE; in cmd6workaround()
4393 if ((ccb->ccb_h.flags & CAM_CDB_POINTER) != 0 || in cmd6workaround()
4397 xpt_print(ccb->ccb_h.path, "READ(6)/WRITE(6) not supported, " in cmd6workaround()
4399 softc->minimum_cmd_size = 10; in cmd6workaround()
4403 cmd10->opcode = (cmd6.opcode == READ_6) ? READ_10 : WRITE_10; in cmd6workaround()
4404 cmd10->byte2 = 0; in cmd6workaround()
4405 scsi_ulto4b(scsi_3btoul(cmd6.addr), cmd10->addr); in cmd6workaround()
4406 cmd10->reserved = 0; in cmd6workaround()
4407 scsi_ulto2b(cmd6.length, cmd10->length); in cmd6workaround()
4408 cmd10->control = cmd6.control; in cmd6workaround()
4409 ccb->csio.cdb_len = sizeof(*cmd10); in cmd6workaround()
4412 frozen = (ccb->ccb_h.status & CAM_DEV_QFRZN) != 0; in cmd6workaround()
4413 ccb->ccb_h.status = CAM_REQUEUE_REQ; in cmd6workaround()
4416 cam_release_devq(ccb->ccb_h.path, in cmd6workaround()
4431 softc = periph->softc; in dazonedone()
4432 bp = (struct bio *)ccb->ccb_h.ccb_bp; in dazonedone()
4434 switch (bp->bio_zone.zone_cmd) { in dazonedone()
4450 rep = &bp->bio_zone.zone_params.report; in dazonedone()
4451 avail_len = ccb->csio.dxfer_len - ccb->csio.resid; in dazonedone()
4462 bp->bio_resid = ccb->csio.resid; in dazonedone()
4463 hdr = (struct scsi_report_zones_hdr *)ccb->csio.data_ptr; in dazonedone()
4470 bp->bio_error = EIO; in dazonedone()
4471 bp->bio_flags |= BIO_ERROR; in dazonedone()
4472 bp->bio_resid = bp->bio_bcount; in dazonedone()
4476 if (softc->zone_interface == DA_ZONE_IF_ATA_PASS) in dazonedone()
4481 hdr_len = ata ? le32dec(hdr->length) : in dazonedone()
4482 scsi_4btoul(hdr->length); in dazonedone()
4484 rep->entries_available = hdr_len / sizeof(*desc); in dazonedone()
4486 rep->entries_available = 0; in dazonedone()
4493 rep->header.same = hdr->byte4 & SRZ_SAME_MASK; in dazonedone()
4494 rep->header.maximum_lba = ata ? le64dec(hdr->maximum_lba) : in dazonedone()
4495 scsi_8btou64(hdr->maximum_lba); in dazonedone()
4501 rep->entries_filled = 0; in dazonedone()
4505 num_avail = min((avail_len - sizeof(*hdr)) / sizeof(*desc), in dazonedone()
4511 rep->entries_filled = 0; in dazonedone()
4515 num_to_fill = min(num_avail, rep->entries_allocated); in dazonedone()
4521 rep->entries_filled = 0; in dazonedone()
4525 for (i = 0, desc = &hdr->desc_list[0], entry=&rep->entries[0]; in dazonedone()
4536 entry->zone_type = desc->zone_type & SRZ_TYPE_MASK; in dazonedone()
4537 entry->zone_condition = in dazonedone()
4538 (desc->zone_flags & SRZ_ZONE_COND_MASK) >> in dazonedone()
4540 entry->zone_flags |= desc->zone_flags & in dazonedone()
4542 entry->zone_length = in dazonedone()
4543 ata ? le64dec(desc->zone_length) : in dazonedone()
4544 scsi_8btou64(desc->zone_length); in dazonedone()
4545 entry->zone_start_lba = in dazonedone()
4546 ata ? le64dec(desc->zone_start_lba) : in dazonedone()
4547 scsi_8btou64(desc->zone_start_lba); in dazonedone()
4548 entry->write_pointer_lba = in dazonedone()
4549 ata ? le64dec(desc->write_pointer_lba) : in dazonedone()
4550 scsi_8btou64(desc->write_pointer_lba); in dazonedone()
4552 rep->entries_filled = num_to_fill; in dazonedone()
4559 * should be handled without queueing the command to the in dazonedone()
4562 panic("%s: Invalid zone command %d", __func__, in dazonedone()
4563 bp->bio_zone.zone_cmd); in dazonedone()
4567 if (bp->bio_zone.zone_cmd == DISK_ZONE_REPORT_ZONES) in dazonedone()
4568 free(ccb->csio.data_ptr, M_SCSIDA); in dazonedone()
4579 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone\n")); in dadone()
4581 softc = (struct da_softc *)periph->softc; in dadone()
4582 csio = &done_ccb->csio; in dadone()
4585 if (csio->bio != NULL) in dadone()
4586 biotrack(csio->bio, __func__); in dadone()
4588 state = csio->ccb_h.ccb_state & DA_CCB_TYPE_MASK; in dadone()
4591 bp = (struct bio *)done_ccb->ccb_h.ccb_bp; in dadone()
4592 if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { in dadone()
4596 if ((csio->ccb_h.ccb_state & DA_CCB_RETRY_UA) != 0) in dadone()
4608 * refresh bp, since cmd6workaround may set it to NULL when in dadone()
4613 bp = (struct bio *)done_ccb->ccb_h.ccb_bp; in dadone()
4616 (softc->flags & DA_FLAG_PACK_INVALID) != 0; in dadone()
4624 * since we set the pack invalid bit only for in dadone()
4627 * queued I/O and short-circuit retries for in dadone()
4632 * While we do also set the pack invalid bit in dadone()
4638 xpt_print(periph->path, "Invalidating pack\n"); in dadone()
4651 cam_iosched_flush(softc->cam_iosched, NULL, in dadone()
4655 bp->bio_error = error; in dadone()
4656 bp->bio_resid = bp->bio_bcount; in dadone()
4657 bp->bio_flags |= BIO_ERROR; in dadone()
4661 bp->bio_resid = 0; in dadone()
4663 bp->bio_resid = csio->resid; in dadone()
4664 bp->bio_error = 0; in dadone()
4665 if (bp->bio_resid != 0) in dadone()
4666 bp->bio_flags |= BIO_ERROR; in dadone()
4668 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) in dadone()
4669 cam_release_devq(done_ccb->ccb_h.path, in dadone()
4675 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) in dadone()
4677 if (bp->bio_cmd == BIO_ZONE) in dadone()
4680 bp->bio_resid = 0; in dadone()
4682 bp->bio_resid = csio->resid; in dadone()
4683 if ((csio->resid > 0) && (bp->bio_cmd != BIO_ZONE)) in dadone()
4684 bp->bio_flags |= BIO_ERROR; in dadone()
4685 if (softc->error_inject != 0) { in dadone()
4686 bp->bio_error = softc->error_inject; in dadone()
4687 bp->bio_resid = bp->bio_bcount; in dadone()
4688 bp->bio_flags |= BIO_ERROR; in dadone()
4689 softc->error_inject = 0; in dadone()
4695 LIST_REMOVE(&done_ccb->ccb_h, periph_links.le); in dadone()
4696 if (LIST_EMPTY(&softc->pending_ccbs)) in dadone()
4697 softc->flags |= DA_FLAG_WAS_OTAG; in dadone()
4705 cam_iosched_bio_complete(softc->cam_iosched, bp, done_ccb); in dadone()
4707 KASSERT(softc->refcount >= 1, ("dadone softc %p refcount %d", softc, softc->refcount)); in dadone()
4708 softc->refcount--; in dadone()
4713 TAILQ_CONCAT(&queue, &softc->delete_run_queue.queue, bio_queue); in dadone()
4714 softc->delete_run_queue.insert_point = NULL; in dadone()
4719 * delete_running set to 0 before the call above to in dadone()
4721 * requests are pushed down. We set delete_running to 0 in dadone()
4725 cam_iosched_trim_done(softc->cam_iosched); in dadone()
4730 bp1->bio_error = bp->bio_error; in dadone()
4731 if (bp->bio_flags & BIO_ERROR) { in dadone()
4732 bp1->bio_flags |= BIO_ERROR; in dadone()
4733 bp1->bio_resid = bp1->bio_bcount; in dadone()
4735 bp1->bio_resid = 0; in dadone()
4754 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone_probewp\n")); in dadone_probewp()
4756 softc = (struct da_softc *)periph->softc; in dadone_probewp()
4757 priority = done_ccb->ccb_h.pinfo.priority; in dadone_probewp()
4758 csio = &done_ccb->csio; in dadone_probewp()
4762 KASSERT(softc->state == DA_STATE_PROBE_WP, in dadone_probewp()
4764 softc->state, periph, done_ccb)); in dadone_probewp()
4765 KASSERT((csio->ccb_h.ccb_state & DA_CCB_TYPE_MASK) == DA_CCB_PROBE_WP, in dadone_probewp()
4767 (unsigned long)csio->ccb_h.ccb_state & DA_CCB_TYPE_MASK, periph, in dadone_probewp()
4774 if (csio->cdb_len > 6) { in dadone_probewp()
4776 (struct scsi_mode_header_10 *)csio->data_ptr; in dadone_probewp()
4777 len = 2 + scsi_2btoul(mh->data_length); in dadone_probewp()
4778 off = sizeof(*mh) + scsi_2btoul(mh->blk_desc_len); in dadone_probewp()
4779 dev_spec = mh->dev_spec; in dadone_probewp()
4782 (struct scsi_mode_header_6 *)csio->data_ptr; in dadone_probewp()
4783 len = 1 + mh->data_length; in dadone_probewp()
4784 off = sizeof(*mh) + mh->blk_desc_len; in dadone_probewp()
4785 dev_spec = mh->dev_spec; in dadone_probewp()
4788 softc->disk->d_flags |= DISKFLAG_WRITE_PROTECT; in dadone_probewp()
4790 softc->disk->d_flags &= ~DISKFLAG_WRITE_PROTECT; in dadone_probewp()
4793 if (off < len && off < csio->dxfer_len - csio->resid) in dadone_probewp()
4794 softc->mode_page = csio->data_ptr[off] & SMPH_PC_MASK; in dadone_probewp()
4803 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { in dadone_probewp()
4805 cam_release_devq(done_ccb->ccb_h.path, in dadone_probewp()
4813 softc->mode_page = -1; in dadone_probewp()
4817 free(csio->data_ptr, M_SCSIDA); in dadone_probewp()
4818 if ((softc->flags & DA_FLAG_CAN_RC16) != 0) in dadone_probewp()
4819 softc->state = DA_STATE_PROBE_RC16; in dadone_probewp()
4821 softc->state = DA_STATE_PROBE_RC; in dadone_probewp()
4839 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone_proberc\n")); in dadone_proberc()
4841 softc = (struct da_softc *)periph->softc; in dadone_proberc()
4842 priority = done_ccb->ccb_h.pinfo.priority; in dadone_proberc()
4843 csio = &done_ccb->csio; in dadone_proberc()
4844 state = csio->ccb_h.ccb_state & DA_CCB_TYPE_MASK; in dadone_proberc()
4846 KASSERT(softc->state == DA_STATE_PROBE_RC || softc->state == DA_STATE_PROBE_RC16, in dadone_proberc()
4848 softc->state, periph, done_ccb)); in dadone_proberc()
4857 announce_buf = softc->announce_temp; in dadone_proberc()
4861 rdcap =(struct scsi_read_capacity_data *)csio->data_ptr; in dadone_proberc()
4864 csio->data_ptr; in dadone_proberc()
4868 if ((csio->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in dadone_proberc()
4875 block_size = scsi_4btoul(rdcap->length); in dadone_proberc()
4876 maxsector = scsi_4btoul(rdcap->addr); in dadone_proberc()
4880 * According to SBC-2, if the standard 10 in dadone_proberc()
4881 * byte READ CAPACITY command returns 2^32, in dadone_proberc()
4883 * the command, since the device in question in dadone_proberc()
4885 * with the short version of the command. in dadone_proberc()
4889 softc->state = DA_STATE_PROBE_RC16; in dadone_proberc()
4895 block_size = scsi_4btoul(rcaplong->length); in dadone_proberc()
4896 maxsector = scsi_8btou64(rcaplong->addr); in dadone_proberc()
4897 lalba = scsi_2btoul(rcaplong->lalba_lbp); in dadone_proberc()
4908 maxsector = -1; in dadone_proberc()
4911 xpt_print(periph->path, in dadone_proberc()
4920 * non-NULL. in dadone_proberc()
4925 dp = &softc->params; in dadone_proberc()
4928 ((uintmax_t)dp->secsize * dp->sectors) / in dadone_proberc()
4930 (uintmax_t)dp->sectors, dp->secsize); in dadone_proberc()
4931 if (softc->p_type != 0) { in dadone_proberc()
4933 DA_ANNOUNCETMP_SZ - n, in dadone_proberc()
4934 ", DIF type %d", softc->p_type); in dadone_proberc()
4936 snprintf(announce_buf + n, DA_ANNOUNCETMP_SZ - n, ")"); in dadone_proberc()
4961 status = done_ccb->ccb_h.status; in dadone_proberc()
4963 cam_release_devq(done_ccb->ccb_h.path, in dadone_proberc()
4970 xpt_setup_ccb(&cgd.ccb_h, done_ccb->ccb_h.path, in dadone_proberc()
4986 (softc->flags & DA_FLAG_CAN_RC16) && in dadone_proberc()
4987 (((csio->ccb_h.status & CAM_STATUS_MASK) == in dadone_proberc()
4994 softc->flags &= ~DA_FLAG_CAN_RC16; in dadone_proberc()
4996 softc->state = DA_STATE_PROBE_RC; in dadone_proberc()
5014 * 44/71: ATA DEVICE FAILED SET FEATURES in dadone_proberc()
5023 dasetgeom(periph, 512, -1, NULL, 0); in dadone_proberc()
5033 scsi_sense_print(&done_ccb->csio); in dadone_proberc()
5035 xpt_print(periph->path, in dadone_proberc()
5037 done_ccb->ccb_h.status); in dadone_proberc()
5040 xpt_print(periph->path, "fatal error, " in dadone_proberc()
5052 free(csio->data_ptr, M_SCSIDA); in dadone_proberc()
5054 ((softc->flags & DA_FLAG_ANNOUNCED) == 0)) { in dadone_proberc()
5057 sbuf_new(&sb, softc->announcebuf, DA_ANNOUNCE_SZ, in dadone_proberc()
5060 xpt_announce_quirks_sbuf(periph, &sb, softc->quirks, in dadone_proberc()
5072 &softc->sysctl_task); in dadone_proberc()
5075 xpt_print(periph->path, "fatal error, " in dadone_proberc()
5081 if (softc->flags & DA_FLAG_PROBED) { in dadone_proberc()
5086 /* Ensure re-probe doesn't see old delete. */ in dadone_proberc()
5087 softc->delete_available = 0; in dadone_proberc()
5089 if (lbp && (softc->quirks & DA_Q_NO_UNMAP) == 0) { in dadone_proberc()
5091 * Based on older SBC-3 spec revisions in dadone_proberc()
5107 softc->state = DA_STATE_PROBE_LBP; in dadone_proberc()
5113 softc->state = DA_STATE_PROBE_BDC; in dadone_proberc()
5127 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone_probelbp\n")); in dadone_probelbp()
5129 softc = (struct da_softc *)periph->softc; in dadone_probelbp()
5130 priority = done_ccb->ccb_h.pinfo.priority; in dadone_probelbp()
5131 csio = &done_ccb->csio; in dadone_probelbp()
5132 lbp = (struct scsi_vpd_logical_block_prov *)csio->data_ptr; in dadone_probelbp()
5136 if ((csio->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in dadone_probelbp()
5138 * T10/1799-D Revision 31 states at least one of these in dadone_probelbp()
5142 (lbp->flags & SVPD_LBP_WS16)); in dadone_probelbp()
5144 (lbp->flags & SVPD_LBP_WS10)); in dadone_probelbp()
5146 (lbp->flags & SVPD_LBP_UNMAP)); in dadone_probelbp()
5154 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { in dadone_probelbp()
5156 cam_release_devq(done_ccb->ccb_h.path, in dadone_probelbp()
5164 * Failure indicates we don't support any SBC-3 in dadone_probelbp()
5171 softc->state = DA_STATE_PROBE_BLK_LIMITS; in dadone_probelbp()
5185 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone_probeblklimits\n")); in dadone_probeblklimits()
5187 softc = (struct da_softc *)periph->softc; in dadone_probeblklimits()
5188 priority = done_ccb->ccb_h.pinfo.priority; in dadone_probeblklimits()
5189 csio = &done_ccb->csio; in dadone_probeblklimits()
5190 block_limits = (struct scsi_vpd_block_limits *)csio->data_ptr; in dadone_probeblklimits()
5194 if ((csio->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in dadone_probeblklimits()
5196 block_limits->max_txfer_len); in dadone_probeblklimits()
5198 block_limits->max_unmap_lba_cnt); in dadone_probeblklimits()
5200 block_limits->max_unmap_blk_cnt); in dadone_probeblklimits()
5202 block_limits->opt_unmap_grain); in dadone_probeblklimits()
5204 block_limits->unmap_grain_align); in dadone_probeblklimits()
5206 block_limits->max_write_same_length); in dadone_probeblklimits()
5209 softc->disk->d_maxsize = MIN(softc->maxio, in dadone_probeblklimits()
5210 (off_t)max_txfer_len * softc->params.secsize); in dadone_probeblklimits()
5219 softc->unmap_max_lba = max_unmap_lba_cnt; in dadone_probeblklimits()
5220 softc->unmap_max_ranges = min(max_unmap_blk_cnt, in dadone_probeblklimits()
5223 softc->unmap_gran = unmap_gran; in dadone_probeblklimits()
5225 softc->unmap_gran_align = in dadone_probeblklimits()
5238 softc->ws_max_blks = ws_max_blks; in dadone_probeblklimits()
5246 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { in dadone_probeblklimits()
5248 cam_release_devq(done_ccb->ccb_h.path, in dadone_probeblklimits()
5259 softc->unmap_max_lba = 1; in dadone_probeblklimits()
5260 softc->unmap_max_ranges = 1; in dadone_probeblklimits()
5265 softc->state = DA_STATE_PROBE_BDC; in dadone_probeblklimits()
5279 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone_probebdc\n")); in dadone_probebdc()
5281 softc = (struct da_softc *)periph->softc; in dadone_probebdc()
5282 priority = done_ccb->ccb_h.pinfo.priority; in dadone_probebdc()
5283 csio = &done_ccb->csio; in dadone_probebdc()
5284 bdc = (struct scsi_vpd_block_device_characteristics *)csio->data_ptr; in dadone_probebdc()
5288 if ((csio->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in dadone_probebdc()
5292 * Disable queue sorting for non-rotational media in dadone_probebdc()
5295 uint16_t old_rate = softc->disk->d_rotation_rate; in dadone_probebdc()
5297 valid_len = csio->dxfer_len - csio->resid; in dadone_probebdc()
5300 softc->disk->d_rotation_rate = in dadone_probebdc()
5301 scsi_2btoul(bdc->medium_rotation_rate); in dadone_probebdc()
5302 if (softc->disk->d_rotation_rate == SVPD_NON_ROTATING) { in dadone_probebdc()
5304 softc->cam_iosched, 0); in dadone_probebdc()
5305 softc->flags &= ~DA_FLAG_ROTATING; in dadone_probebdc()
5307 if (softc->disk->d_rotation_rate != old_rate) { in dadone_probebdc()
5308 disk_attr_changed(softc->disk, in dadone_probebdc()
5313 && (softc->zone_mode == DA_ZONE_NONE)) { in dadone_probebdc()
5323 * The Zoned field will only be set for in dadone_probebdc()
5327 * set to T_ZBC_HM (0x14). in dadone_probebdc()
5329 if ((bdc->flags & SVPD_ZBC_MASK) == in dadone_probebdc()
5331 softc->zone_mode = DA_ZONE_HOST_AWARE; in dadone_probebdc()
5332 softc->zone_interface = (ata_proto) ? in dadone_probebdc()
5334 } else if ((bdc->flags & SVPD_ZBC_MASK) == in dadone_probebdc()
5336 softc->zone_mode =DA_ZONE_DRIVE_MANAGED; in dadone_probebdc()
5337 softc->zone_interface = (ata_proto) ? in dadone_probebdc()
5339 } else if ((bdc->flags & SVPD_ZBC_MASK) != in dadone_probebdc()
5341 xpt_print(periph->path, "Unknown zoned " in dadone_probebdc()
5343 bdc->flags & SVPD_ZBC_MASK); in dadone_probebdc()
5353 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { in dadone_probebdc()
5355 cam_release_devq(done_ccb->ccb_h.path, in dadone_probebdc()
5365 softc->state = DA_STATE_PROBE_ATA; in dadone_probebdc()
5381 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone_probeata\n")); in dadone_probeata()
5383 softc = (struct da_softc *)periph->softc; in dadone_probeata()
5384 priority = done_ccb->ccb_h.pinfo.priority; in dadone_probeata()
5385 csio = &done_ccb->csio; in dadone_probeata()
5386 ata_params = (struct ata_params *)csio->data_ptr; in dadone_probeata()
5392 if ((csio->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in dadone_probeata()
5396 if (ata_params->support_dsm & ATA_SUPPORT_DSM_TRIM && in dadone_probeata()
5397 (softc->quirks & DA_Q_NO_UNMAP) == 0) { in dadone_probeata()
5399 if (ata_params->max_dsm_blocks != 0) in dadone_probeata()
5400 softc->trim_max_ranges = min( in dadone_probeata()
5401 softc->trim_max_ranges, in dadone_probeata()
5402 ata_params->max_dsm_blocks * in dadone_probeata()
5406 * Disable queue sorting for non-rotational media in dadone_probeata()
5409 old_rate = softc->disk->d_rotation_rate; in dadone_probeata()
5410 softc->disk->d_rotation_rate = ata_params->media_rotation_rate; in dadone_probeata()
5411 if (softc->disk->d_rotation_rate == ATA_RATE_NON_ROTATING) { in dadone_probeata()
5412 cam_iosched_set_sort_queue(softc->cam_iosched, 0); in dadone_probeata()
5413 softc->flags &= ~DA_FLAG_ROTATING; in dadone_probeata()
5415 if (softc->disk->d_rotation_rate != old_rate) { in dadone_probeata()
5416 disk_attr_changed(softc->disk, in dadone_probeata()
5421 if (ata_params->capabilities1 & ATA_SUPPORT_DMA) in dadone_probeata()
5422 softc->flags |= DA_FLAG_CAN_ATA_DMA; in dadone_probeata()
5424 if (ata_params->support.extension & ATA_SUPPORT_GENLOG) in dadone_probeata()
5425 softc->flags |= DA_FLAG_CAN_ATA_LOG; in dadone_probeata()
5430 * SAT layer supports ZBC -> ZAC translation. In in dadone_probeata()
5436 if (softc->zone_mode == DA_ZONE_NONE) { in dadone_probeata()
5440 * set. This is because it has either been in dadone_probeata()
5441 * set as a quirk, or when we probed the in dadone_probeata()
5443 * the zoned field was set. The latter in dadone_probeata()
5448 if ((ata_params->support3 & in dadone_probeata()
5451 softc->zone_mode = DA_ZONE_HOST_AWARE; in dadone_probeata()
5452 softc->zone_interface = in dadone_probeata()
5454 } else if ((ata_params->support3 & in dadone_probeata()
5457 softc->zone_mode =DA_ZONE_DRIVE_MANAGED; in dadone_probeata()
5458 softc->zone_interface = DA_ZONE_IF_ATA_PASS; in dadone_probeata()
5468 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { in dadone_probeata()
5470 cam_release_devq(done_ccb->ccb_h.path, in dadone_probeata()
5479 if ((softc->zone_mode == DA_ZONE_HOST_AWARE) in dadone_probeata()
5480 || (softc->zone_mode == DA_ZONE_HOST_MANAGED)) { in dadone_probeata()
5487 * ZBC -> ZAC translation, continue on to get the in dadone_probeata()
5490 * ZBC -> ZAC translation, we want to use that, in dadone_probeata()
5495 && (softc->flags & DA_FLAG_CAN_ATA_LOG) in dadone_probeata()
5496 && (softc->zone_interface == DA_ZONE_IF_ATA_PASS)) in dadone_probeata()
5497 softc->state = DA_STATE_PROBE_ATA_LOGDIR; in dadone_probeata()
5499 softc->state = DA_STATE_PROBE_ZONE; in dadone_probeata()
5519 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone_probeatalogdir\n")); in dadone_probeatalogdir()
5521 softc = (struct da_softc *)periph->softc; in dadone_probeatalogdir()
5522 priority = done_ccb->ccb_h.pinfo.priority; in dadone_probeatalogdir()
5523 csio = &done_ccb->csio; in dadone_probeatalogdir()
5526 if ((csio->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in dadone_probeatalogdir()
5528 softc->valid_logdir_len = 0; in dadone_probeatalogdir()
5529 bzero(&softc->ata_logdir, sizeof(softc->ata_logdir)); in dadone_probeatalogdir()
5530 softc->valid_logdir_len = csio->dxfer_len - csio->resid; in dadone_probeatalogdir()
5531 if (softc->valid_logdir_len > 0) in dadone_probeatalogdir()
5532 bcopy(csio->data_ptr, &softc->ata_logdir, in dadone_probeatalogdir()
5533 min(softc->valid_logdir_len, in dadone_probeatalogdir()
5534 sizeof(softc->ata_logdir))); in dadone_probeatalogdir()
5542 if ((softc->valid_logdir_len >= in dadone_probeatalogdir()
5544 && (le16dec(softc->ata_logdir.header) == in dadone_probeatalogdir()
5546 && (le16dec(&softc->ata_logdir.num_pages[ in dadone_probeatalogdir()
5548 sizeof(uint16_t)) - sizeof(uint16_t)]) > 0)){ in dadone_probeatalogdir()
5549 softc->flags |= DA_FLAG_CAN_ATA_IDLOG; in dadone_probeatalogdir()
5551 softc->flags &= ~DA_FLAG_CAN_ATA_IDLOG; in dadone_probeatalogdir()
5562 * supported even if the bit is set in the in dadone_probeatalogdir()
5565 softc->flags &= ~(DA_FLAG_CAN_ATA_LOG | in dadone_probeatalogdir()
5567 if ((done_ccb->ccb_h.status & in dadone_probeatalogdir()
5570 cam_release_devq(done_ccb->ccb_h.path, in dadone_probeatalogdir()
5579 free(csio->data_ptr, M_SCSIDA); in dadone_probeatalogdir()
5582 && (softc->flags & DA_FLAG_CAN_ATA_IDLOG)) { in dadone_probeatalogdir()
5583 softc->state = DA_STATE_PROBE_ATA_IDDIR; in dadone_probeatalogdir()
5600 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone_probeataiddir\n")); in dadone_probeataiddir()
5602 softc = (struct da_softc *)periph->softc; in dadone_probeataiddir()
5603 priority = done_ccb->ccb_h.pinfo.priority; in dadone_probeataiddir()
5604 csio = &done_ccb->csio; in dadone_probeataiddir()
5608 if ((csio->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in dadone_probeataiddir()
5612 softc->valid_iddir_len = 0; in dadone_probeataiddir()
5613 bzero(&softc->ata_iddir, sizeof(softc->ata_iddir)); in dadone_probeataiddir()
5614 softc->flags &= ~(DA_FLAG_CAN_ATA_SUPCAP | in dadone_probeataiddir()
5616 softc->valid_iddir_len = csio->dxfer_len - csio->resid; in dadone_probeataiddir()
5617 if (softc->valid_iddir_len > 0) in dadone_probeataiddir()
5618 bcopy(csio->data_ptr, &softc->ata_iddir, in dadone_probeataiddir()
5619 min(softc->valid_iddir_len, in dadone_probeataiddir()
5620 sizeof(softc->ata_iddir))); in dadone_probeataiddir()
5624 max_entries = softc->valid_iddir_len - entries_offset; in dadone_probeataiddir()
5625 if ((softc->valid_iddir_len > (entries_offset + 1)) in dadone_probeataiddir()
5626 && (le64dec(softc->ata_iddir.header) == ATA_IDLOG_REVISION) in dadone_probeataiddir()
5627 && (softc->ata_iddir.entry_count > 0)) { in dadone_probeataiddir()
5630 num_entries = softc->ata_iddir.entry_count; in dadone_probeataiddir()
5632 softc->valid_iddir_len - entries_offset); in dadone_probeataiddir()
5634 if (softc->ata_iddir.entries[i] == in dadone_probeataiddir()
5636 softc->flags |= DA_FLAG_CAN_ATA_SUPCAP; in dadone_probeataiddir()
5637 else if (softc->ata_iddir.entries[i] == in dadone_probeataiddir()
5639 softc->flags |= DA_FLAG_CAN_ATA_ZONE; in dadone_probeataiddir()
5641 if ((softc->flags & DA_FLAG_CAN_ATA_SUPCAP) in dadone_probeataiddir()
5642 && (softc->flags & DA_FLAG_CAN_ATA_ZONE)) in dadone_probeataiddir()
5656 * a non-zero number of pages present for in dadone_probeataiddir()
5659 softc->flags &= ~DA_FLAG_CAN_ATA_IDLOG; in dadone_probeataiddir()
5660 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { in dadone_probeataiddir()
5662 cam_release_devq(done_ccb->ccb_h.path, in dadone_probeataiddir()
5671 free(csio->data_ptr, M_SCSIDA); in dadone_probeataiddir()
5673 if ((error == 0) && (softc->flags & DA_FLAG_CAN_ATA_SUPCAP)) { in dadone_probeataiddir()
5674 softc->state = DA_STATE_PROBE_ATA_SUP; in dadone_probeataiddir()
5691 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone_probeatasup\n")); in dadone_probeatasup()
5693 softc = (struct da_softc *)periph->softc; in dadone_probeatasup()
5694 priority = done_ccb->ccb_h.pinfo.priority; in dadone_probeatasup()
5695 csio = &done_ccb->csio; in dadone_probeatasup()
5699 if ((csio->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in dadone_probeatasup()
5705 sup_cap = (struct ata_identify_log_sup_cap *)csio->data_ptr; in dadone_probeatasup()
5706 valid_len = csio->dxfer_len - csio->resid; in dadone_probeatasup()
5708 sup_zac_cap) + 1 + sizeof(sup_cap->sup_zac_cap); in dadone_probeatasup()
5712 zoned = le64dec(sup_cap->zoned_cap); in dadone_probeatasup()
5716 * set, because this is also in the in dadone_probeatasup()
5721 softc->zone_mode = DA_ZONE_HOST_AWARE; in dadone_probeatasup()
5724 softc->zone_mode = in dadone_probeatasup()
5728 zac_cap = le64dec(sup_cap->sup_zac_cap); in dadone_probeatasup()
5731 softc->zone_flags |= in dadone_probeatasup()
5734 softc->zone_flags |= in dadone_probeatasup()
5737 softc->zone_flags |= in dadone_probeatasup()
5740 softc->zone_flags |= in dadone_probeatasup()
5743 softc->zone_flags |= in dadone_probeatasup()
5748 * ACS-4, r08 on April 28th, 2015. in dadone_probeatasup()
5754 softc->zone_flags |= DA_ZONE_FLAG_SUP_MASK; in dadone_probeatasup()
5768 softc->flags &= ~DA_FLAG_CAN_ATA_SUPCAP; in dadone_probeatasup()
5772 softc->zone_flags &= ~DA_ZONE_FLAG_SUP_MASK; in dadone_probeatasup()
5773 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { in dadone_probeatasup()
5775 cam_release_devq(done_ccb->ccb_h.path, in dadone_probeatasup()
5784 free(csio->data_ptr, M_SCSIDA); in dadone_probeatasup()
5786 if ((error == 0) && (softc->flags & DA_FLAG_CAN_ATA_ZONE)) { in dadone_probeatasup()
5787 softc->state = DA_STATE_PROBE_ATA_ZONE; in dadone_probeatasup()
5803 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone_probeatazone\n")); in dadone_probeatazone()
5805 softc = (struct da_softc *)periph->softc; in dadone_probeatazone()
5806 csio = &done_ccb->csio; in dadone_probeatazone()
5810 if ((csio->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in dadone_probeatazone()
5815 zi_log = (struct ata_zoned_info_log *)csio->data_ptr; in dadone_probeatazone()
5817 valid_len = csio->dxfer_len - csio->resid; in dadone_probeatazone()
5819 version_info) + 1 + sizeof(zi_log->version_info); in dadone_probeatazone()
5823 tmpvar = le64dec(zi_log->zoned_cap); in dadone_probeatazone()
5826 softc->zone_flags |= in dadone_probeatazone()
5829 softc->zone_flags &= in dadone_probeatazone()
5832 tmpvar = le64dec(zi_log->optimal_seq_zones); in dadone_probeatazone()
5834 softc->zone_flags |= DA_ZONE_FLAG_OPT_SEQ_SET; in dadone_probeatazone()
5835 softc->optimal_seq_zones = (tmpvar & in dadone_probeatazone()
5838 softc->zone_flags &= ~DA_ZONE_FLAG_OPT_SEQ_SET; in dadone_probeatazone()
5839 softc->optimal_seq_zones = 0; in dadone_probeatazone()
5842 tmpvar =le64dec(zi_log->optimal_nonseq_zones); in dadone_probeatazone()
5844 softc->zone_flags |= in dadone_probeatazone()
5846 softc->optimal_nonseq_zones = in dadone_probeatazone()
5849 softc->zone_flags &= in dadone_probeatazone()
5851 softc->optimal_nonseq_zones = 0; in dadone_probeatazone()
5854 tmpvar = le64dec(zi_log->max_seq_req_zones); in dadone_probeatazone()
5856 softc->zone_flags |= DA_ZONE_FLAG_MAX_SEQ_SET; in dadone_probeatazone()
5857 softc->max_seq_zones = in dadone_probeatazone()
5860 softc->zone_flags &= ~DA_ZONE_FLAG_MAX_SEQ_SET; in dadone_probeatazone()
5861 softc->max_seq_zones = 0; in dadone_probeatazone()
5870 softc->flags &= ~DA_FLAG_CAN_ATA_ZONE; in dadone_probeatazone()
5871 softc->flags &= ~DA_ZONE_FLAG_SET_MASK; in dadone_probeatazone()
5873 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { in dadone_probeatazone()
5875 cam_release_devq(done_ccb->ccb_h.path, in dadone_probeatazone()
5884 free(csio->data_ptr, M_SCSIDA); in dadone_probeatazone()
5897 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone_probezone\n")); in dadone_probezone()
5899 softc = (struct da_softc *)periph->softc; in dadone_probezone()
5900 csio = &done_ccb->csio; in dadone_probezone()
5904 if ((csio->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in dadone_probezone()
5910 zoned_bdc = (struct scsi_vpd_zoned_bdc *)csio->data_ptr; in dadone_probezone()
5911 valid_len = csio->dxfer_len - csio->resid; in dadone_probezone()
5914 sizeof(zoned_bdc->max_seq_req_zones); in dadone_probezone()
5916 && (scsi_2btoul(zoned_bdc->page_length) >= SVPD_ZBDC_PL)) { in dadone_probezone()
5917 if (zoned_bdc->flags & SVPD_ZBDC_URSWRZ) in dadone_probezone()
5918 softc->zone_flags |= DA_ZONE_FLAG_URSWRZ; in dadone_probezone()
5920 softc->zone_flags &= ~DA_ZONE_FLAG_URSWRZ; in dadone_probezone()
5921 softc->optimal_seq_zones = in dadone_probezone()
5922 scsi_4btoul(zoned_bdc->optimal_seq_zones); in dadone_probezone()
5923 softc->zone_flags |= DA_ZONE_FLAG_OPT_SEQ_SET; in dadone_probezone()
5924 softc->optimal_nonseq_zones = scsi_4btoul( in dadone_probezone()
5925 zoned_bdc->optimal_nonseq_zones); in dadone_probezone()
5926 softc->zone_flags |= DA_ZONE_FLAG_OPT_NONSEQ_SET; in dadone_probezone()
5927 softc->max_seq_zones = in dadone_probezone()
5928 scsi_4btoul(zoned_bdc->max_seq_req_zones); in dadone_probezone()
5929 softc->zone_flags |= DA_ZONE_FLAG_MAX_SEQ_SET; in dadone_probezone()
5936 * Re-check this assumption once the SAT spec is in dadone_probezone()
5943 softc->zone_flags |= DA_ZONE_FLAG_SUP_MASK; in dadone_probezone()
5950 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { in dadone_probezone()
5952 cam_release_devq(done_ccb->ccb_h.path, in dadone_probezone()
5961 free(csio->data_ptr, M_SCSIDA); in dadone_probezone()
5972 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("dadone_tur\n")); in dadone_tur()
5974 softc = (struct da_softc *)periph->softc; in dadone_tur()
5978 if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { in dadone_tur()
5982 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) in dadone_tur()
5983 cam_release_devq(done_ccb->ccb_h.path, in dadone_tur()
5989 softc->flags &= ~DA_FLAG_TUR_PENDING; in dadone_tur()
6001 softc = (struct da_softc *)periph->softc; in dareprobe()
6006 if (softc->state != DA_STATE_NORMAL) in dareprobe()
6012 softc->state = DA_STATE_PROBE_WP; in dareprobe()
6024 if (ccb->csio.bio != NULL) in daerror()
6025 biotrack(ccb->csio.bio, __func__); in daerror()
6028 periph = xpt_path_periph(ccb->ccb_h.path); in daerror()
6029 softc = (struct da_softc *)periph->softc; in daerror()
6038 if ((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_INVALID) { in daerror()
6051 xpt_print(periph->path, "Capacity data has changed\n"); in daerror()
6052 softc->flags &= ~DA_FLAG_PROBED; in daerror()
6058 softc->flags &= ~DA_FLAG_PROBED; in daerror()
6059 disk_media_changed(softc->disk, M_NOWAIT); in daerror()
6073 xpt_print(periph->path, "INQUIRY data has changed\n"); in daerror()
6074 softc->flags &= ~DA_FLAG_PROBED; in daerror()
6078 asc == 0x3a && (softc->flags & DA_FLAG_PACK_INVALID) == 0) { in daerror()
6080 /* 3a/1: MEDIUM NOT PRESENT - TRAY CLOSED */ in daerror()
6081 /* 3a/2: MEDIUM NOT PRESENT - TRAY OPEN */ in daerror()
6082 /* 3a/3: MEDIUM NOT PRESENT - LOADABLE */ in daerror()
6083 /* 3a/4: MEDIUM NOT PRESENT - MEDIUM AUXILIARY MEMORY ACCESSIBLE */ in daerror()
6084 softc->flags |= DA_FLAG_PACK_INVALID; in daerror()
6085 disk_media_gone(softc->disk, M_NOWAIT); in daerror()
6092 switch (ccb->ccb_h.status & CAM_STATUS_MASK) { in daerror()
6094 softc->timeouts++; in daerror()
6103 softc->errors++; in daerror()
6117 if (softc->quirks & DA_Q_RETRY_BUSY) in daerror()
6126 struct da_softc *softc = periph->softc; in damediapoll()
6128 if (!cam_iosched_has_work_flags(softc->cam_iosched, DA_WORK_TUR) && in damediapoll()
6129 (softc->flags & DA_FLAG_TUR_PENDING) == 0 && in damediapoll()
6130 softc->state == DA_STATE_NORMAL && in damediapoll()
6131 LIST_EMPTY(&softc->pending_ccbs)) { in damediapoll()
6133 cam_iosched_set_work_flags(softc->cam_iosched, DA_WORK_TUR); in damediapoll()
6140 callout_schedule_sbt(&softc->mediapoll_c, in damediapoll()
6153 softc = (struct da_softc *)periph->softc; in daprevent()
6156 && (softc->flags & DA_FLAG_PACK_LOCKED) == 0) in daprevent()
6158 && (softc->flags & DA_FLAG_PACK_LOCKED) != 0)) { in daprevent()
6164 scsi_prevent(&ccb->csio, in daprevent()
6173 SF_RETRY_UA | SF_NO_PRINT, softc->disk->d_devstat); in daprevent()
6177 softc->flags &= ~DA_FLAG_PACK_LOCKED; in daprevent()
6179 softc->flags |= DA_FLAG_PACK_LOCKED; in daprevent()
6195 softc = (struct da_softc *)periph->softc; in dasetgeom()
6197 dp = &softc->params; in dasetgeom()
6198 dp->secsize = block_len; in dasetgeom()
6199 dp->sectors = maxsector + 1; in dasetgeom()
6201 lbppbe = rcaplong->prot_lbppbe & SRC16_LBPPBE; in dasetgeom()
6202 lalba = scsi_2btoul(rcaplong->lalba_lbp); in dasetgeom()
6204 if (rcaplong->prot & SRC16_PROT_EN) in dasetgeom()
6205 softc->p_type = ((rcaplong->prot & SRC16_P_TYPE) >> in dasetgeom()
6208 softc->p_type = 0; in dasetgeom()
6212 softc->p_type = 0; in dasetgeom()
6216 dp->stripesize = block_len << lbppbe; in dasetgeom()
6217 dp->stripeoffset = (dp->stripesize - block_len * lalba) % in dasetgeom()
6218 dp->stripesize; in dasetgeom()
6219 } else if (softc->quirks & DA_Q_4K) { in dasetgeom()
6220 dp->stripesize = 4096; in dasetgeom()
6221 dp->stripeoffset = 0; in dasetgeom()
6222 } else if (softc->unmap_gran != 0) { in dasetgeom()
6223 dp->stripesize = block_len * softc->unmap_gran; in dasetgeom()
6224 dp->stripeoffset = (dp->stripesize - block_len * in dasetgeom()
6225 softc->unmap_gran_align) % dp->stripesize; in dasetgeom()
6227 dp->stripesize = 0; in dasetgeom()
6228 dp->stripeoffset = 0; in dasetgeom()
6239 xpt_setup_ccb(&ccg.ccb_h, periph->path, CAM_PRIORITY_NORMAL); in dasetgeom()
6241 ccg.block_size = dp->secsize; in dasetgeom()
6242 ccg.volume_size = dp->sectors; in dasetgeom()
6249 * We don't know what went wrong here- but just pick in dasetgeom()
6253 dp->heads = 255; in dasetgeom()
6254 dp->secs_per_track = 255; in dasetgeom()
6255 dp->cylinders = dp->sectors / (255 * 255); in dasetgeom()
6256 if (dp->cylinders == 0) { in dasetgeom()
6257 dp->cylinders = 1; in dasetgeom()
6260 dp->heads = ccg.heads; in dasetgeom()
6261 dp->secs_per_track = ccg.secs_per_track; in dasetgeom()
6262 dp->cylinders = ccg.cylinders; in dasetgeom()
6272 && (bcmp(rcaplong, &softc->rcaplong, in dasetgeom()
6273 min(sizeof(softc->rcaplong), rcap_len)) != 0)) { in dasetgeom()
6277 xpt_setup_ccb(&cdai.ccb_h, periph->path, CAM_PRIORITY_NORMAL); in dasetgeom()
6287 xpt_print(periph->path, "%s: failed to set read " in dasetgeom()
6293 bcopy(rcaplong, &softc->rcaplong, in dasetgeom()
6294 min(sizeof(softc->rcaplong), rcap_len)); in dasetgeom()
6298 softc->disk->d_sectorsize = softc->params.secsize; in dasetgeom()
6299 softc->disk->d_mediasize = softc->params.secsize * (off_t)softc->params.sectors; in dasetgeom()
6300 softc->disk->d_stripesize = softc->params.stripesize; in dasetgeom()
6301 softc->disk->d_stripeoffset = softc->params.stripeoffset; in dasetgeom()
6303 softc->disk->d_fwsectors = softc->params.secs_per_track; in dasetgeom()
6304 softc->disk->d_fwheads = softc->params.heads; in dasetgeom()
6305 softc->disk->d_devstat->block_size = softc->params.secsize; in dasetgeom()
6306 softc->disk->d_devstat->flags &= ~DEVSTAT_BS_UNAVAILABLE; in dasetgeom()
6308 error = disk_resize(softc->disk, M_NOWAIT); in dasetgeom()
6310 xpt_print(periph->path, "disk_resize(9) failed, error = %d\n", error); in dasetgeom()
6317 struct da_softc *softc = periph->softc; in dasendorderedtag()
6321 if (!LIST_EMPTY(&softc->pending_ccbs)) { in dasendorderedtag()
6322 if ((softc->flags & DA_FLAG_WAS_OTAG) == 0) in dasendorderedtag()
6323 softc->flags |= DA_FLAG_NEED_OTAG; in dasendorderedtag()
6324 softc->flags &= ~DA_FLAG_WAS_OTAG; in dasendorderedtag()
6329 callout_schedule_sbt(&softc->sendordered_c, in dasendorderedtag()
6350 softc = (struct da_softc *)periph->softc; in dashutdown()
6354 (softc->flags & DA_FLAG_OPEN)) { in dashutdown()
6355 dadump(softc->disk, NULL, 0, 0); in dashutdown()
6365 if (((softc->flags & DA_FLAG_OPEN) == 0) in dashutdown()
6366 || (softc->quirks & DA_Q_NO_SYNC_CACHE)) { in dashutdown()
6372 scsi_synchronize_cache(&ccb->csio, in dashutdown()
6383 softc->disk->d_devstat); in dashutdown()
6385 xpt_print(periph->path, "Synchronize cache failed\n"); in dashutdown()
6407 scsi_cmd = (struct scsi_format_unit *)&csio->cdb_io.cdb_bytes; in scsi_format_unit()
6408 scsi_cmd->opcode = FORMAT_UNIT; in scsi_format_unit()
6409 scsi_cmd->byte2 = byte2; in scsi_format_unit()
6410 scsi_ulto2b(ileave, scsi_cmd->interleave); in scsi_format_unit()
6435 * These conditions allow using the 10 byte command. Otherwise we in scsi_read_defects()
6436 * need to use the 12 byte command. in scsi_read_defects()
6444 &csio->cdb_io.cdb_bytes; in scsi_read_defects()
6448 cdb10->opcode = READ_DEFECT_DATA_10; in scsi_read_defects()
6449 cdb10->format = list_format; in scsi_read_defects()
6450 scsi_ulto2b(dxfer_len, cdb10->alloc_length); in scsi_read_defects()
6455 &csio->cdb_io.cdb_bytes; in scsi_read_defects()
6459 cdb12->opcode = READ_DEFECT_DATA_12; in scsi_read_defects()
6460 cdb12->format = list_format; in scsi_read_defects()
6461 scsi_ulto4b(dxfer_len, cdb12->alloc_length); in scsi_read_defects()
6462 scsi_ulto4b(addr_desc_index, cdb12->address_descriptor_index); in scsi_read_defects()
6486 scsi_cmd = (struct scsi_sanitize *)&csio->cdb_io.cdb_bytes; in scsi_sanitize()
6487 scsi_cmd->opcode = SANITIZE; in scsi_sanitize()
6488 scsi_cmd->byte2 = byte2; in scsi_sanitize()
6489 scsi_cmd->control = control; in scsi_sanitize()
6490 scsi_ulto2b(dxfer_len, scsi_cmd->length); in scsi_sanitize()
6515 scsi_cmd = (struct scsi_zbc_out *)&csio->cdb_io.cdb_bytes; in scsi_zbc_out()
6516 scsi_cmd->opcode = ZBC_OUT; in scsi_zbc_out()
6517 scsi_cmd->service_action = service_action; in scsi_zbc_out()
6518 scsi_u64to8b(zone_id, scsi_cmd->zone_id); in scsi_zbc_out()
6519 scsi_cmd->zone_flags = zone_flags; in scsi_zbc_out()
6542 scsi_cmd = (struct scsi_zbc_in *)&csio->cdb_io.cdb_bytes; in scsi_zbc_in()
6543 scsi_cmd->opcode = ZBC_IN; in scsi_zbc_in()
6544 scsi_cmd->service_action = service_action; in scsi_zbc_in()
6545 scsi_ulto4b(dxfer_len, scsi_cmd->length); in scsi_zbc_in()
6546 scsi_u64to8b(zone_start_lba, scsi_cmd->zone_start_lba); in scsi_zbc_in()
6547 scsi_cmd->zone_options = zone_options; in scsi_zbc_in()
6600 * will set the NCQ tag number in the tag field. in scsi_ata_zac_mgmt_out()
6601 * That isn't clear from the SAT-4 spec (as of rev 05). in scsi_ata_zac_mgmt_out()
6611 * field. That isn't clear in the SAT-4 spec (as in scsi_ata_zac_mgmt_out()
6655 /*command*/ command_out, in scsi_ata_zac_mgmt_out()
6739 /*command*/ command_out, in scsi_ata_zac_mgmt_in()