Lines Matching +full:trim +full:- +full:data +full:- +full:valid
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
230 { "NONE", "DISABLED", "CFA Erase", "DSM Trim", "DSM Trim via NCQ" };
244 uint8_t data[TRIM_MAX_RANGES * ATA_DSM_RANGE_SIZE]; member
446 * 4k optimised & trim only works in 4k requests + 4k aligned
448 { T_DIRECT, SIP_MEDIA_FIXED, "*", "Corsair CSSD-F*", "*" },
454 * 4k optimised & trim only works in 4k requests + 4k aligned
462 * 4k optimised & trim only works in 4k requests + 4k aligned
470 * 4k optimised & trim only works in 4k requests + 4k aligned
478 * 4k optimised & trim only works in 4k requests + 4k aligned
480 { T_DIRECT, SIP_MEDIA_FIXED, "*", "M4-CT???M4SSD2*", "*" },
486 * NCQ Trim works
494 * NCQ Trim doesn't work
502 * NCQ Trim doesn't work, but only on MU01 firmware
510 * NCQ Trim doesn't work, but only on MU01 firmware
520 { T_DIRECT, SIP_MEDIA_FIXED, "*", "C300-CTFDDAC???MAG*",
526 * NCQ Trim doesn't work
534 * 4k optimised & trim only works in 4k requests + 4k aligned
542 * 4k optimised & trim only works in 4k requests + 4k aligned
550 * 4k optimised & trim only works in 4k requests + 4k aligned
558 * 4k optimised & trim only works in 4k requests + 4k aligned
566 * 4k optimised & trim only works in 4k requests + 4k aligned
573 * Intel X25-M Series SSDs
574 * 4k optimised & trim only works in 4k requests + 4k aligned
590 * 4k optimised & trim only works in 4k requests + 4k aligned
598 * 4k optimised & trim only works in 4k requests + 4k aligned
606 * 4k optimised & trim only works in 4k requests + 4k aligned
614 * NCQ Trim works?
622 * NCQ Trim doesn't work
630 * NCQ Trim doesn't work, but only MU01 firmware
638 * 4k optimised & trim only works in 4k requests + 4k aligned
646 * 4k optimised & trim only works in 4k requests + 4k aligned
648 { T_DIRECT, SIP_MEDIA_FIXED, "*", "OCZ-AGILITY2*", "*" },
654 * 4k optimised & trim only works in 4k requests + 4k aligned
656 { T_DIRECT, SIP_MEDIA_FIXED, "*", "OCZ-AGILITY3*", "*" },
662 * 4k optimised & trim only works in 4k requests + 4k aligned
670 * 4k optimised & trim only works in 4k requests + 4k aligned
678 * 4k optimised & trim only works in 4k requests + 4k aligned
680 { T_DIRECT, SIP_MEDIA_FIXED, "*", "OCZ-VERTEX3*", "*" },
686 * 4k optimised & trim only works in 4k requests + 4k aligned
688 { T_DIRECT, SIP_MEDIA_FIXED, "*", "OCZ-VERTEX4*", "*" },
694 * 4k optimised, NCQ TRIM seems to work
702 * 4k optimised, NCQ TRIM Broken (normal TRIM is fine)
710 * 4k optimised, NCQ TRIM Broken (normal TRIM is fine)
718 * 4k optimised, NCQ TRIM Broken (normal TRIM is fine)
726 * 4k optimised, NCQ TRIM broken (normal TRIM fine)
734 * 4k optimised, NCQ TRIM broken (normal TRIM fine)
742 * 4k optimised, NCQ TRIM broken (normal TRIM fine)
786 * 4k optimised & trim only works in 4k requests + 4k aligned
803 * ATA identify data:
804 * SAMSUNG HD200HJ KF100-06
813 * ATA identify data:
814 * SAMSUNG HD501LJ CR100-10
834 /* Seagate IronWolf 110 SATA SSD NCQ Trim is unstable */
913 #define ADA_RA (softc->read_ahead >= 0 ? \
914 softc->read_ahead : ada_read_ahead)
915 #define ADA_WC (softc->write_cache >= 0 ? \
916 softc->write_cache : ada_write_cache)
941 &ada_read_ahead, 0, "Enable disk read-ahead");
984 periph = (struct cam_periph *)dp->d_drv1; in adaopen()
996 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE | CAM_DEBUG_PERIPH, in adaopen()
999 softc = (struct ada_softc *)periph->softc; in adaopen()
1000 softc->flags |= ADA_FLAG_OPEN; in adaopen()
1015 periph = (struct cam_periph *)dp->d_drv1; in adaclose()
1016 softc = (struct ada_softc *)periph->softc; in adaclose()
1019 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE | CAM_DEBUG_PERIPH, in adaclose()
1023 if ((softc->flags & ADA_FLAG_DIRTY) != 0 && in adaclose()
1024 (softc->flags & ADA_FLAG_CAN_FLUSHCACHE) != 0 && in adaclose()
1025 (periph->flags & CAM_PERIPH_INVALID) == 0 && in adaclose()
1028 cam_fill_ataio(&ccb->ataio, in adaclose()
1037 if (softc->flags & ADA_FLAG_CAN_48BIT) in adaclose()
1038 ata_48bit_cmd(&ccb->ataio, ATA_FLUSHCACHE48, 0, 0, 0); in adaclose()
1040 ata_28bit_cmd(&ccb->ataio, ATA_FLUSHCACHE, 0, 0, 0); in adaclose()
1042 /*sense_flags*/0, softc->disk->d_devstat); in adaclose()
1045 xpt_print(periph->path, "Synchronize cache failed\n"); in adaclose()
1046 softc->flags &= ~ADA_FLAG_DIRTY; in adaclose()
1051 softc->flags &= ~ADA_FLAG_OPEN; in adaclose()
1053 while (softc->refcount != 0) in adaclose()
1054 cam_periph_sleep(periph, &softc->refcount, PRIBIO, "adaclose", 1); in adaclose()
1063 struct ada_softc *softc = (struct ada_softc *)periph->softc; in adaschedule()
1065 if (softc->state != ADA_STATE_NORMAL) in adaschedule()
1068 cam_iosched_schedule(softc->cam_iosched, periph); in adaschedule()
1082 periph = (struct cam_periph *)bp->bio_disk->d_drv1; in adastrategy()
1083 softc = (struct ada_softc *)periph->softc; in adastrategy()
1087 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("adastrategy(%p)\n", bp)); in adastrategy()
1092 if ((periph->flags & CAM_PERIPH_INVALID) != 0) { in adastrategy()
1103 if (bp->bio_cmd == BIO_ZONE) in adastrategy()
1104 bp->bio_flags |= BIO_ORDERED; in adastrategy()
1109 cam_iosched_queue_work(softc->cam_iosched, bp); in adastrategy()
1133 periph = dp->d_drv1; in adadump()
1134 softc = (struct ada_softc *)periph->softc; in adadump()
1135 secsize = softc->params.secsize; in adadump()
1138 if ((periph->flags & CAM_PERIPH_INVALID) != 0) in adadump()
1143 xpt_setup_ccb(&ataio.ccb_h, periph->path, CAM_PRIORITY_NORMAL); in adadump()
1153 if ((softc->flags & ADA_FLAG_CAN_48BIT) && in adadump()
1170 if (softc->flags & ADA_FLAG_CAN_FLUSHCACHE) { in adadump()
1171 xpt_setup_ccb(&ataio.ccb_h, periph->path, CAM_PRIORITY_NORMAL); in adadump()
1188 if (softc->flags & ADA_FLAG_CAN_48BIT) in adadump()
1195 xpt_print(periph->path, "Synchronize cache failed\n"); in adadump()
1241 periph = (struct cam_periph *)dp->d_drv1; in adadiskgonecb()
1251 softc = (struct ada_softc *)periph->softc; in adaoninvalidate()
1254 * De-register any async callbacks. in adaoninvalidate()
1256 xpt_register_async(0, adaasync, periph, periph->path); in adaoninvalidate()
1258 softc->invalidations++; in adaoninvalidate()
1267 cam_iosched_flush(softc->cam_iosched, NULL, ENXIO); in adaoninvalidate()
1273 disk_gone(softc->disk); in adaoninvalidate()
1281 softc = (struct ada_softc *)periph->softc; in adacleanup()
1285 cam_iosched_fini(softc->cam_iosched); in adacleanup()
1290 if ((softc->flags & ADA_FLAG_SCTX_INIT) != 0) { in adacleanup()
1292 if (sysctl_ctx_free(&softc->sysctl_stats_ctx) != 0) in adacleanup()
1293 xpt_print(periph->path, in adacleanup()
1296 if (sysctl_ctx_free(&softc->sysctl_ctx) != 0) in adacleanup()
1297 xpt_print(periph->path, in adacleanup()
1301 disk_destroy(softc->disk); in adacleanup()
1302 callout_drain(&softc->sendordered_c); in adacleanup()
1311 if (softc->flags & ADA_FLAG_CAN_NCQ_TRIM) in adasetdeletemethod()
1312 softc->delete_method = ADA_DELETE_NCQ_DSM_TRIM; in adasetdeletemethod()
1313 else if (softc->flags & ADA_FLAG_CAN_TRIM) in adasetdeletemethod()
1314 softc->delete_method = ADA_DELETE_DSM_TRIM; in adasetdeletemethod()
1315 else if ((softc->flags & ADA_FLAG_CAN_CFA) && !(softc->flags & ADA_FLAG_CAN_48BIT)) in adasetdeletemethod()
1316 softc->delete_method = ADA_DELETE_CFA_ERASE; in adasetdeletemethod()
1318 softc->delete_method = ADA_DELETE_NONE; in adasetdeletemethod()
1340 if (cgd->protocol != PROTO_ATA) in adaasync()
1362 softc = (struct ada_softc *)periph->softc; in adaasync()
1363 xpt_gdev_type(&cgd, periph->path); in adaasync()
1366 * Update our information based on the new Identify data. in adaasync()
1370 disk_resize(softc->disk, M_NOWAIT); in adaasync()
1381 softc = periph->softc; in adaasync()
1382 disk_attr_changed(softc->disk, "GEOM::physpath", in adaasync()
1390 softc = (struct ada_softc *)periph->softc; in adaasync()
1391 if (softc->state != ADA_STATE_NORMAL) in adaasync()
1393 if (ADA_RA >= 0 && softc->flags & ADA_FLAG_CAN_RAHEAD) in adaasync()
1394 softc->state = ADA_STATE_RAHEAD; in adaasync()
1395 else if (ADA_WC >= 0 && softc->flags & ADA_FLAG_CAN_WCACHE) in adaasync()
1396 softc->state = ADA_STATE_WCACHE; in adaasync()
1397 else if ((softc->flags & ADA_FLAG_CAN_LOG) in adaasync()
1398 && (softc->zone_mode != ADA_ZONE_NONE)) in adaasync()
1399 softc->state = ADA_STATE_LOGDIR; in adaasync()
1403 softc->state = ADA_STATE_NORMAL; in adaasync()
1423 switch (softc->zone_mode) { in adazonemodesysctl()
1459 if (softc->zone_flags & ada_zone_desc_table[i].value) { in adazonesupsysctl()
1486 if ((periph->flags & CAM_PERIPH_INVALID) != 0) { in adasysctlinit()
1491 softc = (struct ada_softc *)periph->softc; in adasysctlinit()
1492 snprintf(tmpstr, sizeof(tmpstr), "CAM ADA unit %d",periph->unit_number); in adasysctlinit()
1493 snprintf(tmpstr2, sizeof(tmpstr2), "%d", periph->unit_number); in adasysctlinit()
1495 sysctl_ctx_init(&softc->sysctl_ctx); in adasysctlinit()
1496 softc->flags |= ADA_FLAG_SCTX_INIT; in adasysctlinit()
1497 softc->sysctl_tree = SYSCTL_ADD_NODE_WITH_LABEL(&softc->sysctl_ctx, in adasysctlinit()
1500 if (softc->sysctl_tree == NULL) { in adasysctlinit()
1506 SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in adasysctlinit()
1511 SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, in adasysctlinit()
1512 SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, in adasysctlinit()
1513 "trim_count", CTLFLAG_RD, &softc->trim_count, in adasysctlinit()
1515 SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, in adasysctlinit()
1516 SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, in adasysctlinit()
1517 "trim_ranges", CTLFLAG_RD, &softc->trim_ranges, in adasysctlinit()
1519 SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, in adasysctlinit()
1520 SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, in adasysctlinit()
1521 "trim_lbas", CTLFLAG_RD, &softc->trim_lbas, in adasysctlinit()
1523 SYSCTL_ADD_INT(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in adasysctlinit()
1525 &softc->read_ahead, 0, "Enable disk read ahead."); in adasysctlinit()
1526 SYSCTL_ADD_INT(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in adasysctlinit()
1528 &softc->write_cache, 0, "Enable disk write cache."); in adasysctlinit()
1529 SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in adasysctlinit()
1534 SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in adasysctlinit()
1539 SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, in adasysctlinit()
1540 SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, in adasysctlinit()
1541 "optimal_seq_zones", CTLFLAG_RD, &softc->optimal_seq_zones, in adasysctlinit()
1543 SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, in adasysctlinit()
1544 SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, in adasysctlinit()
1546 &softc->optimal_nonseq_zones, in adasysctlinit()
1547 "Optimal Number of Non-Sequentially Written Sequential Write " in adasysctlinit()
1549 SYSCTL_ADD_UQUAD(&softc->sysctl_ctx, in adasysctlinit()
1550 SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, in adasysctlinit()
1551 "max_seq_zones", CTLFLAG_RD, &softc->max_seq_zones, in adasysctlinit()
1553 SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in adasysctlinit()
1557 SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in adasysctlinit()
1559 &softc->flags, (u_int)ADA_FLAG_UNMAPPEDIO, adabitsysctl, "I", in adasysctlinit()
1561 SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in adasysctlinit()
1563 &softc->flags, (u_int)ADA_FLAG_ROTATING, adabitsysctl, "I", in adasysctlinit()
1572 SYSCTL_ADD_INT(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in adasysctlinit()
1574 &softc->force_read_error, 0, in adasysctlinit()
1576 SYSCTL_ADD_INT(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in adasysctlinit()
1578 &softc->force_write_error, 0, in adasysctlinit()
1580 SYSCTL_ADD_INT(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in adasysctlinit()
1582 &softc->periodic_read_error, 0, in adasysctlinit()
1584 SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree), in adasysctlinit()
1591 softc->sysctl_stats_tree = SYSCTL_ADD_NODE(&softc->sysctl_stats_ctx, in adasysctlinit()
1592 SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, "stats", in adasysctlinit()
1594 SYSCTL_ADD_INT(&softc->sysctl_stats_ctx, in adasysctlinit()
1595 SYSCTL_CHILDREN(softc->sysctl_stats_tree), in adasysctlinit()
1597 &softc->timeouts, 0, in adasysctlinit()
1599 SYSCTL_ADD_INT(&softc->sysctl_stats_ctx, in adasysctlinit()
1600 SYSCTL_CHILDREN(softc->sysctl_stats_tree), in adasysctlinit()
1602 &softc->errors, 0, in adasysctlinit()
1604 SYSCTL_ADD_INT(&softc->sysctl_stats_ctx, in adasysctlinit()
1605 SYSCTL_CHILDREN(softc->sysctl_stats_tree), in adasysctlinit()
1607 &softc->invalidations, 0, in adasysctlinit()
1611 cam_iosched_sysctl_init(softc->cam_iosched, &softc->sysctl_ctx, in adasysctlinit()
1612 softc->sysctl_tree); in adasysctlinit()
1626 periph = (struct cam_periph *)bp->bio_disk->d_drv1; in adagetattr()
1628 ret = xpt_getattr(bp->bio_data, bp->bio_length, bp->bio_attribute, in adagetattr()
1629 periph->path); in adagetattr()
1632 bp->bio_completed = bp->bio_length; in adagetattr()
1646 value = softc->delete_method; in adadeletemethodsysctl()
1653 if (error != 0 || req->newptr == NULL) in adadeletemethodsysctl()
1656 if ((softc->flags & ADA_FLAG_CAN_CFA) && in adadeletemethodsysctl()
1657 !(softc->flags & ADA_FLAG_CAN_48BIT)) in adadeletemethodsysctl()
1659 if (softc->flags & ADA_FLAG_CAN_TRIM) in adadeletemethodsysctl()
1661 if (softc->flags & ADA_FLAG_CAN_NCQ_TRIM) in adadeletemethodsysctl()
1667 softc->delete_method = i; in adadeletemethodsysctl()
1682 if (error || !req->newptr) in adabitsysctl()
1696 if (softc->flags != 0) in adaflagssysctl()
1697 sbuf_printf(&sbuf, "0x%b", (unsigned)softc->flags, ADA_FLAG_STRING); in adaflagssysctl()
1709 if ((cgd->ident_data.capabilities1 & ATA_SUPPORT_DMA) && in adasetflags()
1710 (cgd->inq_flags & SID_DMA)) in adasetflags()
1711 softc->flags |= ADA_FLAG_CAN_DMA; in adasetflags()
1713 softc->flags &= ~ADA_FLAG_CAN_DMA; in adasetflags()
1715 if (cgd->ident_data.support.command2 & ATA_SUPPORT_ADDRESS48) { in adasetflags()
1716 softc->flags |= ADA_FLAG_CAN_48BIT; in adasetflags()
1717 if (cgd->inq_flags & SID_DMA48) in adasetflags()
1718 softc->flags |= ADA_FLAG_CAN_DMA48; in adasetflags()
1720 softc->flags &= ~ADA_FLAG_CAN_DMA48; in adasetflags()
1722 softc->flags &= ~(ADA_FLAG_CAN_48BIT | ADA_FLAG_CAN_DMA48); in adasetflags()
1724 if (cgd->ident_data.support.command2 & ATA_SUPPORT_FLUSHCACHE) in adasetflags()
1725 softc->flags |= ADA_FLAG_CAN_FLUSHCACHE; in adasetflags()
1727 softc->flags &= ~ADA_FLAG_CAN_FLUSHCACHE; in adasetflags()
1729 if (cgd->ident_data.support.command1 & ATA_SUPPORT_POWERMGT) in adasetflags()
1730 softc->flags |= ADA_FLAG_CAN_POWERMGT; in adasetflags()
1732 softc->flags &= ~ADA_FLAG_CAN_POWERMGT; in adasetflags()
1734 if ((cgd->ident_data.satacapabilities & ATA_SUPPORT_NCQ) && in adasetflags()
1735 (cgd->inq_flags & SID_DMA) && (cgd->inq_flags & SID_CmdQue)) in adasetflags()
1736 softc->flags |= ADA_FLAG_CAN_NCQ; in adasetflags()
1738 softc->flags &= ~ADA_FLAG_CAN_NCQ; in adasetflags()
1740 if ((cgd->ident_data.support_dsm & ATA_SUPPORT_DSM_TRIM) && in adasetflags()
1741 (cgd->inq_flags & SID_DMA) && in adasetflags()
1742 (softc->quirks & ADA_Q_NO_TRIM) == 0) { in adasetflags()
1743 softc->flags |= ADA_FLAG_CAN_TRIM; in adasetflags()
1744 softc->trim_max_ranges = TRIM_MAX_RANGES; in adasetflags()
1745 if (cgd->ident_data.max_dsm_blocks != 0) { in adasetflags()
1746 softc->trim_max_ranges = in adasetflags()
1747 min(cgd->ident_data.max_dsm_blocks * in adasetflags()
1748 ATA_DSM_BLK_RANGES, softc->trim_max_ranges); in adasetflags()
1757 if ((softc->quirks & ADA_Q_NCQ_TRIM_BROKEN) == 0 && in adasetflags()
1758 (softc->flags & ADA_FLAG_PIM_ATA_EXT) != 0 && in adasetflags()
1759 (cgd->ident_data.satacapabilities2 & in adasetflags()
1761 (softc->flags & ADA_FLAG_CAN_TRIM) != 0) in adasetflags()
1762 softc->flags |= ADA_FLAG_CAN_NCQ_TRIM; in adasetflags()
1764 softc->flags &= ~ADA_FLAG_CAN_NCQ_TRIM; in adasetflags()
1766 softc->flags &= ~(ADA_FLAG_CAN_TRIM | ADA_FLAG_CAN_NCQ_TRIM); in adasetflags()
1768 if (cgd->ident_data.support.command2 & ATA_SUPPORT_CFA) in adasetflags()
1769 softc->flags |= ADA_FLAG_CAN_CFA; in adasetflags()
1771 softc->flags &= ~ADA_FLAG_CAN_CFA; in adasetflags()
1779 if ((cgd->ident_data.support.extension & ATA_SUPPORT_GENLOG) in adasetflags()
1780 && ((softc->quirks & ADA_Q_LOG_BROKEN) == 0)) in adasetflags()
1781 softc->flags |= ADA_FLAG_CAN_LOG; in adasetflags()
1783 softc->flags &= ~ADA_FLAG_CAN_LOG; in adasetflags()
1785 if ((cgd->ident_data.support3 & ATA_SUPPORT_ZONE_MASK) == in adasetflags()
1787 softc->zone_mode = ADA_ZONE_HOST_AWARE; in adasetflags()
1788 else if (((cgd->ident_data.support3 & ATA_SUPPORT_ZONE_MASK) == in adasetflags()
1790 || (softc->quirks & ADA_Q_SMR_DM)) in adasetflags()
1791 softc->zone_mode = ADA_ZONE_DRIVE_MANAGED; in adasetflags()
1793 softc->zone_mode = ADA_ZONE_NONE; in adasetflags()
1795 if (cgd->ident_data.support.command1 & ATA_SUPPORT_LOOKAHEAD) in adasetflags()
1796 softc->flags |= ADA_FLAG_CAN_RAHEAD; in adasetflags()
1798 softc->flags &= ~ADA_FLAG_CAN_RAHEAD; in adasetflags()
1800 if (cgd->ident_data.support.command1 & ATA_SUPPORT_WRITECACHE) in adasetflags()
1801 softc->flags |= ADA_FLAG_CAN_WCACHE; in adasetflags()
1803 softc->flags &= ~ADA_FLAG_CAN_WCACHE; in adasetflags()
1832 announce_buf = softc->announce_temp; in adaregister()
1835 periph->softc = softc; in adaregister()
1836 xpt_path_inq(&softc->cpi, periph->path); in adaregister()
1841 match = cam_quirkmatch((caddr_t)&cgd->ident_data, in adaregister()
1846 softc->quirks = ((struct ada_quirk_entry *)match)->quirks; in adaregister()
1848 softc->quirks = ADA_Q_NONE; in adaregister()
1850 TASK_INIT(&softc->sysctl_task, 0, adasysctlinit, periph); in adaregister()
1860 "kern.cam.ada.%d.quirks", periph->unit_number); in adaregister()
1861 quirks = softc->quirks; in adaregister()
1863 softc->quirks = quirks; in adaregister()
1864 softc->read_ahead = -1; in adaregister()
1866 "kern.cam.ada.%d.read_ahead", periph->unit_number); in adaregister()
1867 TUNABLE_INT_FETCH(announce_buf, &softc->read_ahead); in adaregister()
1868 softc->write_cache = -1; in adaregister()
1870 "kern.cam.ada.%d.write_cache", periph->unit_number); in adaregister()
1871 TUNABLE_INT_FETCH(announce_buf, &softc->write_cache); in adaregister()
1874 * Let XPT know we can use UMA-allocated CCBs. in adaregister()
1879 periph->ccb_zone = ada_ccb_zone; in adaregister()
1883 * Set support flags based on the Identify data and quirks. in adaregister()
1886 if (softc->cpi.hba_misc & PIM_ATA_EXT) in adaregister()
1887 softc->flags |= ADA_FLAG_PIM_ATA_EXT; in adaregister()
1889 /* Disable queue sorting for non-rotational media by default. */ in adaregister()
1890 if (cgd->ident_data.media_rotation_rate == ATA_RATE_NON_ROTATING) { in adaregister()
1891 softc->flags &= ~ADA_FLAG_ROTATING; in adaregister()
1893 softc->flags |= ADA_FLAG_ROTATING; in adaregister()
1895 softc->disk = disk_alloc(); in adaregister()
1897 softc->disk->d_devstat = devstat_new_entry(periph->periph_name, in adaregister()
1898 periph->unit_number, softc->params.secsize, in adaregister()
1901 XPORT_DEVSTAT_TYPE(softc->cpi.transport), in adaregister()
1903 softc->disk->d_open = adaopen; in adaregister()
1904 softc->disk->d_close = adaclose; in adaregister()
1905 softc->disk->d_strategy = adastrategy; in adaregister()
1906 softc->disk->d_getattr = adagetattr; in adaregister()
1907 if (cam_sim_pollable(periph->sim)) in adaregister()
1908 softc->disk->d_dump = adadump; in adaregister()
1909 softc->disk->d_gone = adadiskgonecb; in adaregister()
1910 softc->disk->d_name = "ada"; in adaregister()
1911 softc->disk->d_drv1 = periph; in adaregister()
1912 softc->disk->d_unit = periph->unit_number; in adaregister()
1914 if (cam_iosched_init(&softc->cam_iosched, periph, softc->disk, in adaregister()
1921 cam_iosched_set_sort_queue(softc->cam_iosched, in adaregister()
1922 (softc->flags & ADA_FLAG_ROTATING) ? -1 : 0); in adaregister()
1926 dp = &softc->params; in adaregister()
1929 ((uintmax_t)dp->secsize * dp->sectors) / (1024 * 1024), in adaregister()
1930 (uintmax_t)dp->sectors, dp->secsize); in adaregister()
1932 sbuf_new(&sb, softc->announce_buffer, ADA_ANNOUNCE_SZ, SBUF_FIXEDLEN); in adaregister()
1934 xpt_announce_quirks_sbuf(periph, &sb, softc->quirks, ADA_Q_BIT_STRING); in adaregister()
1943 taskqueue_enqueue(taskqueue_thread, &softc->sysctl_task); in adaregister()
1955 adaasync, periph, periph->path); in adaregister()
1961 callout_init_mtx(&softc->sendordered_c, cam_periph_mtx(periph), 0); in adaregister()
1962 callout_reset_sbt(&softc->sendordered_c, in adaregister()
1969 if (ADA_RA >= 0 && softc->flags & ADA_FLAG_CAN_RAHEAD) { in adaregister()
1970 softc->state = ADA_STATE_RAHEAD; in adaregister()
1971 } else if (ADA_WC >= 0 && softc->flags & ADA_FLAG_CAN_WCACHE) { in adaregister()
1972 softc->state = ADA_STATE_WCACHE; in adaregister()
1973 } else if ((softc->flags & ADA_FLAG_CAN_LOG) in adaregister()
1974 && (softc->zone_mode != ADA_ZONE_NONE)) { in adaregister()
1975 softc->state = ADA_STATE_LOGDIR; in adaregister()
1992 uint64_t lastlba = (uint64_t)-1, lbas = 0; in ada_dsmtrim_req_create()
1996 TAILQ_INIT(&req->bps); in ada_dsmtrim_req_create()
1998 uint64_t lba = bp->bio_pblkno; in ada_dsmtrim_req_create()
1999 int count = bp->bio_bcount / softc->params.secsize; in ada_dsmtrim_req_create()
2003 c = min(count, ATA_DSM_RANGE_MAX - lastcount); in ada_dsmtrim_req_create()
2005 off = (ranges - 1) * ATA_DSM_RANGE_SIZE; in ada_dsmtrim_req_create()
2006 req->data[off + 6] = lastcount & 0xff; in ada_dsmtrim_req_create()
2007 req->data[off + 7] = in ada_dsmtrim_req_create()
2009 count -= c; in ada_dsmtrim_req_create()
2017 req->data[off + 0] = lba & 0xff; in ada_dsmtrim_req_create()
2018 req->data[off + 1] = (lba >> 8) & 0xff; in ada_dsmtrim_req_create()
2019 req->data[off + 2] = (lba >> 16) & 0xff; in ada_dsmtrim_req_create()
2020 req->data[off + 3] = (lba >> 24) & 0xff; in ada_dsmtrim_req_create()
2021 req->data[off + 4] = (lba >> 32) & 0xff; in ada_dsmtrim_req_create()
2022 req->data[off + 5] = (lba >> 40) & 0xff; in ada_dsmtrim_req_create()
2023 req->data[off + 6] = c & 0xff; in ada_dsmtrim_req_create()
2024 req->data[off + 7] = (c >> 8) & 0xff; in ada_dsmtrim_req_create()
2027 count -= c; in ada_dsmtrim_req_create()
2037 TAILQ_INSERT_TAIL(&req->bps, bp, bio_queue); in ada_dsmtrim_req_create()
2039 bp = cam_iosched_next_trim(softc->cam_iosched); in ada_dsmtrim_req_create()
2042 if (bp->bio_bcount / softc->params.secsize > in ada_dsmtrim_req_create()
2043 (softc->trim_max_ranges - ranges) * ATA_DSM_RANGE_MAX) { in ada_dsmtrim_req_create()
2044 cam_iosched_put_back_trim(softc->cam_iosched, bp); in ada_dsmtrim_req_create()
2048 softc->trim_count++; in ada_dsmtrim_req_create()
2049 softc->trim_ranges += ranges; in ada_dsmtrim_req_create()
2050 softc->trim_lbas += lbas; in ada_dsmtrim_req_create()
2058 struct trim_request *req = &softc->trim_req; in ada_dsmtrim()
2067 req->data, in ada_dsmtrim()
2077 struct trim_request *req = &softc->trim_req; in ada_ncq_dsmtrim()
2086 req->data, in ada_ncq_dsmtrim()
2093 ataio->cmd.sector_count_exp = ATA_SFPDMA_DSM; in ada_ncq_dsmtrim()
2094 ataio->ata_flags |= ATA_FLAG_AUX; in ada_ncq_dsmtrim()
2095 ataio->aux = 1; in ada_ncq_dsmtrim()
2101 struct trim_request *req = &softc->trim_req; in ada_cfaerase()
2102 uint64_t lba = bp->bio_pblkno; in ada_cfaerase()
2103 uint16_t count = bp->bio_bcount / softc->params.secsize; in ada_cfaerase()
2106 TAILQ_INIT(&req->bps); in ada_cfaerase()
2107 TAILQ_INSERT_TAIL(&req->bps, bp, bio_queue); in ada_cfaerase()
2137 return -1; in ada_zone_bio_to_ata()
2149 if (bp->bio_cmd != BIO_ZONE) { in ada_zone_cmd()
2154 softc = periph->softc; in ada_zone_cmd()
2156 switch (bp->bio_zone.zone_cmd) { in ada_zone_cmd()
2165 zone_sa = ada_zone_bio_to_ata(bp->bio_zone.zone_cmd); in ada_zone_cmd()
2166 if (zone_sa == -1) { in ada_zone_cmd()
2167 xpt_print(periph->path, "Cannot translate zone " in ada_zone_cmd()
2168 "cmd %#x to ATA\n", bp->bio_zone.zone_cmd); in ada_zone_cmd()
2174 lba = bp->bio_zone.zone_params.rwp.id; in ada_zone_cmd()
2176 if (bp->bio_zone.zone_params.rwp.flags & in ada_zone_cmd()
2180 ata_zac_mgmt_out(&ccb->ataio, in ada_zone_cmd()
2183 /*use_ncq*/ (softc->flags & in ada_zone_cmd()
2201 rep = &bp->bio_zone.zone_params.report; in ada_zone_cmd()
2203 num_entries = rep->entries_allocated; in ada_zone_cmd()
2205 xpt_print(periph->path, "No entries allocated for " in ada_zone_cmd()
2212 alloc_size = min(alloc_size, softc->disk->d_maxsize); in ada_zone_cmd()
2215 xpt_print(periph->path, "Unable to allocate memory " in ada_zone_cmd()
2221 ata_zac_mgmt_in(&ccb->ataio, in ada_zone_cmd()
2224 /*use_ncq*/ (softc->flags & in ada_zone_cmd()
2227 /*zone_id*/ rep->starting_id, in ada_zone_cmd()
2228 /*zone_flags*/ rep->rep_options, in ada_zone_cmd()
2236 * how much data was transferred. in ada_zone_cmd()
2240 * it. devstat uses bio_bcount - bio_resid to calculate in ada_zone_cmd()
2241 * the amount of data transferred. The GEOM disk code in ada_zone_cmd()
2242 * uses bio_length - bio_resid to calculate the amount of in ada_zone_cmd()
2243 * data in bio_completed. We have different structure in ada_zone_cmd()
2254 * amount of data reported to devstat will be slightly in ada_zone_cmd()
2257 bp->bio_bcount = bp->bio_length; in ada_zone_cmd()
2266 params = &bp->bio_zone.zone_params.disk_params; in ada_zone_cmd()
2269 switch (softc->zone_mode) { in ada_zone_cmd()
2271 params->zone_mode = DISK_ZONE_MODE_DRIVE_MANAGED; in ada_zone_cmd()
2274 params->zone_mode = DISK_ZONE_MODE_HOST_AWARE; in ada_zone_cmd()
2277 params->zone_mode = DISK_ZONE_MODE_HOST_MANAGED; in ada_zone_cmd()
2281 params->zone_mode = DISK_ZONE_MODE_NONE; in ada_zone_cmd()
2285 if (softc->zone_flags & ADA_ZONE_FLAG_URSWRZ) in ada_zone_cmd()
2286 params->flags |= DISK_ZONE_DISK_URSWRZ; in ada_zone_cmd()
2288 if (softc->zone_flags & ADA_ZONE_FLAG_OPT_SEQ_SET) { in ada_zone_cmd()
2289 params->optimal_seq_zones = softc->optimal_seq_zones; in ada_zone_cmd()
2290 params->flags |= DISK_ZONE_OPT_SEQ_SET; in ada_zone_cmd()
2293 if (softc->zone_flags & ADA_ZONE_FLAG_OPT_NONSEQ_SET) { in ada_zone_cmd()
2294 params->optimal_nonseq_zones = in ada_zone_cmd()
2295 softc->optimal_nonseq_zones; in ada_zone_cmd()
2296 params->flags |= DISK_ZONE_OPT_NONSEQ_SET; in ada_zone_cmd()
2299 if (softc->zone_flags & ADA_ZONE_FLAG_MAX_SEQ_SET) { in ada_zone_cmd()
2300 params->max_seq_zones = softc->max_seq_zones; in ada_zone_cmd()
2301 params->flags |= DISK_ZONE_MAX_SEQ_SET; in ada_zone_cmd()
2303 if (softc->zone_flags & ADA_ZONE_FLAG_RZ_SUP) in ada_zone_cmd()
2304 params->flags |= DISK_ZONE_RZ_SUP; in ada_zone_cmd()
2306 if (softc->zone_flags & ADA_ZONE_FLAG_OPEN_SUP) in ada_zone_cmd()
2307 params->flags |= DISK_ZONE_OPEN_SUP; in ada_zone_cmd()
2309 if (softc->zone_flags & ADA_ZONE_FLAG_CLOSE_SUP) in ada_zone_cmd()
2310 params->flags |= DISK_ZONE_CLOSE_SUP; in ada_zone_cmd()
2312 if (softc->zone_flags & ADA_ZONE_FLAG_FINISH_SUP) in ada_zone_cmd()
2313 params->flags |= DISK_ZONE_FINISH_SUP; in ada_zone_cmd()
2315 if (softc->zone_flags & ADA_ZONE_FLAG_RWP_SUP) in ada_zone_cmd()
2316 params->flags |= DISK_ZONE_RWP_SUP; in ada_zone_cmd()
2329 struct ada_softc *softc = (struct ada_softc *)periph->softc; in adastart()
2330 struct ccb_ataio *ataio = &start_ccb->ataio; in adastart()
2331 uint32_t priority = start_ccb->ccb_h.pinfo.priority; in adastart()
2333 CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("adastart\n")); in adastart()
2345 if ((softc->state != ADA_STATE_NORMAL && priority != CAM_PRIORITY_DEV) || in adastart()
2346 (softc->state == ADA_STATE_NORMAL && priority != CAM_PRIORITY_NORMAL)) { in adastart()
2347 xpt_print(periph->path, "Bad priority for state %d prio %d\n", in adastart()
2348 softc->state, priority); in adastart()
2353 switch (softc->state) { in adastart()
2363 bp = cam_iosched_next_bio(softc->cam_iosched); in adastart()
2369 if ((bp->bio_flags & BIO_ORDERED) != 0 || in adastart()
2370 (bp->bio_cmd != BIO_DELETE && (softc->flags & ADA_FLAG_NEED_OTAG) != 0)) { in adastart()
2371 softc->flags &= ~ADA_FLAG_NEED_OTAG; in adastart()
2372 softc->flags |= ADA_FLAG_WAS_OTAG; in adastart()
2377 switch (bp->bio_cmd) { in adastart()
2381 uint64_t lba = bp->bio_pblkno; in adastart()
2382 uint16_t count = bp->bio_bcount / softc->params.secsize; in adastart()
2386 if (bp->bio_cmd == BIO_WRITE) { in adastart()
2387 softc->flags |= ADA_FLAG_DIRTY; in adastart()
2393 data_ptr = bp->bio_data; in adastart()
2394 if ((bp->bio_flags & (BIO_UNMAPPED|BIO_VLIST)) != 0) { in adastart()
2411 if (bp->bio_cmd == BIO_READ) { in adastart()
2412 if (softc->force_read_error) { in adastart()
2413 softc->force_read_error--; in adastart()
2416 if (softc->periodic_read_error > 0) { in adastart()
2417 if (++softc->periodic_read_count >= in adastart()
2418 softc->periodic_read_error) { in adastart()
2419 softc->periodic_read_count = 0; in adastart()
2424 if (softc->force_write_error) { in adastart()
2425 softc->force_write_error--; in adastart()
2436 KASSERT((bp->bio_flags & BIO_UNMAPPED) == 0 || in adastart()
2437 round_page(bp->bio_bcount + bp->bio_ma_offset) / in adastart()
2438 PAGE_SIZE == bp->bio_ma_n, in adastart()
2446 bp->bio_bcount, in adastart()
2449 if ((softc->flags & ADA_FLAG_CAN_NCQ) && tag_code) { in adastart()
2450 if (bp->bio_cmd == BIO_READ) { in adastart()
2457 } else if ((softc->flags & ADA_FLAG_CAN_48BIT) && in adastart()
2460 if (softc->flags & ADA_FLAG_CAN_DMA48) { in adastart()
2461 if (bp->bio_cmd == BIO_READ) { in adastart()
2469 if (bp->bio_cmd == BIO_READ) { in adastart()
2480 if (softc->flags & ADA_FLAG_CAN_DMA) { in adastart()
2481 if (bp->bio_cmd == BIO_READ) { in adastart()
2489 if (bp->bio_cmd == BIO_READ) { in adastart()
2501 switch (softc->delete_method) { in adastart()
2517 start_ccb->ccb_h.ccb_state = ADA_CCB_TRIM; in adastart()
2518 start_ccb->ccb_h.flags |= CAM_UNLOCKED; in adastart()
2519 cam_iosched_submit_trim(softc->cam_iosched); in adastart()
2531 if (softc->flags & ADA_FLAG_CAN_48BIT) in adastart()
2564 start_ccb->ccb_h.ccb_state = ADA_CCB_BUFFER_IO; in adastart()
2565 start_ccb->ccb_h.flags |= CAM_UNLOCKED; in adastart()
2567 start_ccb->ccb_h.ccb_bp = bp; in adastart()
2568 softc->outstanding_cmds++; in adastart()
2569 softc->refcount++; in adastart()
2584 softc->state == ADA_STATE_RAHEAD ? "rahead" : "wcache")); in adastart()
2595 if (softc->state == ADA_STATE_RAHEAD) { in adastart()
2598 start_ccb->ccb_h.ccb_state = ADA_CCB_RAHEAD; in adastart()
2602 start_ccb->ccb_h.ccb_state = ADA_CCB_WCACHE; in adastart()
2604 start_ccb->ccb_h.flags |= CAM_DEV_QFREEZE; in adastart()
2616 if ((softc->flags & ADA_FLAG_CAN_LOG) == 0) { in adastart()
2623 xpt_print(periph->path, "Couldn't malloc log_dir " in adastart()
2624 "data\n"); in adastart()
2625 softc->state = ADA_STATE_NORMAL; in adastart()
2636 /*protocol*/ softc->flags & ADA_FLAG_CAN_DMA ? in adastart()
2642 start_ccb->ccb_h.ccb_state = ADA_CCB_LOGDIR; in adastart()
2656 xpt_print(periph->path, "Couldn't malloc id_dir " in adastart()
2657 "data\n"); in adastart()
2668 /*protocol*/ softc->flags & ADA_FLAG_CAN_DMA ? in adastart()
2674 start_ccb->ccb_h.ccb_state = ADA_CCB_IDDIR; in adastart()
2688 xpt_print(periph->path, "Couldn't malloc sup_cap " in adastart()
2689 "data\n"); in adastart()
2700 /*protocol*/ softc->flags & ADA_FLAG_CAN_DMA ? in adastart()
2706 start_ccb->ccb_h.ccb_state = ADA_CCB_SUP_CAP; in adastart()
2720 xpt_print(periph->path, "Couldn't malloc ata_zone " in adastart()
2721 "data\n"); in adastart()
2732 /*protocol*/ softc->flags & ADA_FLAG_CAN_DMA ? in adastart()
2738 start_ccb->ccb_h.ccb_state = ADA_CCB_ZONE; in adastart()
2750 softc = (struct ada_softc *)periph->softc; in adaprobedone()
2761 softc->state = ADA_STATE_NORMAL; in adaprobedone()
2762 softc->flags |= ADA_FLAG_PROBED; in adaprobedone()
2764 if ((softc->flags & ADA_FLAG_ANNOUNCED) == 0) { in adaprobedone()
2765 softc->flags |= ADA_FLAG_ANNOUNCED; in adaprobedone()
2772 disk_create(softc->disk, DISK_VERSION); in adaprobedone()
2784 bp = (struct bio *)ccb->ccb_h.ccb_bp; in adazonedone()
2786 switch (bp->bio_zone.zone_cmd) { in adazonedone()
2801 rep = &bp->bio_zone.zone_params.report; in adazonedone()
2802 avail_len = ccb->ataio.dxfer_len - ccb->ataio.resid; in adazonedone()
2806 * to determine how much data was transferred. Because in adazonedone()
2807 * the size of the SCSI/ATA data structures is different in adazonedone()
2809 * amount of data actually transferred from the drive will in adazonedone()
2810 * be different than the amount of data transferred to in adazonedone()
2813 hdr = (struct scsi_report_zones_hdr *)ccb->ataio.data_ptr; in adazonedone()
2820 bp->bio_error = EIO; in adazonedone()
2821 bp->bio_flags |= BIO_ERROR; in adazonedone()
2822 bp->bio_resid = bp->bio_bcount; in adazonedone()
2826 hdr_len = le32dec(hdr->length); in adazonedone()
2828 rep->entries_available = hdr_len / sizeof(*desc); in adazonedone()
2830 rep->entries_available = 0; in adazonedone()
2837 rep->header.same = hdr->byte4 & SRZ_SAME_MASK; in adazonedone()
2838 rep->header.maximum_lba = le64dec(hdr->maximum_lba); in adazonedone()
2844 rep->entries_filled = 0; in adazonedone()
2845 bp->bio_resid = bp->bio_bcount; in adazonedone()
2849 num_avail = min((avail_len - sizeof(*hdr)) / sizeof(*desc), in adazonedone()
2852 * If the drive didn't return any data, then we're done. in adazonedone()
2855 rep->entries_filled = 0; in adazonedone()
2856 bp->bio_resid = bp->bio_bcount; in adazonedone()
2860 num_to_fill = min(num_avail, rep->entries_allocated); in adazonedone()
2866 rep->entries_filled = 0; in adazonedone()
2867 bp->bio_resid = bp->bio_bcount; in adazonedone()
2871 for (i = 0, desc = &hdr->desc_list[0], entry=&rep->entries[0]; in adazonedone()
2882 entry->zone_type = desc->zone_type & SRZ_TYPE_MASK; in adazonedone()
2883 entry->zone_condition = in adazonedone()
2884 (desc->zone_flags & SRZ_ZONE_COND_MASK) >> in adazonedone()
2886 entry->zone_flags |= desc->zone_flags & in adazonedone()
2888 entry->zone_length = le64dec(desc->zone_length); in adazonedone()
2889 entry->zone_start_lba = le64dec(desc->zone_start_lba); in adazonedone()
2890 entry->write_pointer_lba = in adazonedone()
2891 le64dec(desc->write_pointer_lba); in adazonedone()
2893 rep->entries_filled = num_to_fill; in adazonedone()
2900 bp->bio_resid = bp->bio_bcount - (num_to_fill * sizeof(*entry)); in adazonedone()
2911 bp->bio_zone.zone_cmd); in adazonedone()
2915 if (bp->bio_zone.zone_cmd == DISK_ZONE_REPORT_ZONES) in adazonedone()
2916 free(ccb->ataio.data_ptr, M_ATADA); in adazonedone()
2928 softc = (struct ada_softc *)periph->softc; in adadone()
2929 ataio = &done_ccb->ataio; in adadone()
2930 path = done_ccb->ccb_h.path; in adadone()
2931 priority = done_ccb->ccb_h.pinfo.priority; in adadone()
2935 state = ataio->ccb_h.ccb_state & ADA_CCB_TYPE_MASK; in adadone()
2948 bp = (struct bio *)done_ccb->ccb_h.ccb_bp; in adadone()
2949 if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { in adadone()
2956 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) in adadone()
2963 * If we get an error on an NCQ DSM TRIM, fall back in adadone()
2964 * to a non-NCQ DSM TRIM forever. Please note that if in adadone()
2966 * However, for this one trim, we treat it as advisory in adadone()
2971 (softc->flags & ADA_FLAG_CAN_NCQ_TRIM) != 0) { in adadone()
2972 softc->flags &= ~ADA_FLAG_CAN_NCQ_TRIM; in adadone()
2977 if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) in adadone()
2982 bp->bio_error = error; in adadone()
2984 bp->bio_resid = bp->bio_bcount; in adadone()
2985 bp->bio_flags |= BIO_ERROR; in adadone()
2987 if (bp->bio_cmd == BIO_ZONE) in adadone()
2990 bp->bio_resid = 0; in adadone()
2992 bp->bio_resid = ataio->resid; in adadone()
2994 if ((bp->bio_resid > 0) in adadone()
2995 && (bp->bio_cmd != BIO_ZONE)) in adadone()
2996 bp->bio_flags |= BIO_ERROR; in adadone()
2998 softc->outstanding_cmds--; in adadone()
2999 if (softc->outstanding_cmds == 0) in adadone()
3000 softc->flags |= ADA_FLAG_WAS_OTAG; in adadone()
3009 cam_iosched_bio_complete(softc->cam_iosched, bp, done_ccb); in adadone()
3011 KASSERT(softc->refcount >= 1, ("adadone softc %p refcount %d", softc, softc->refcount)); in adadone()
3012 softc->refcount--; in adadone()
3018 TAILQ_CONCAT(&queue, &softc->trim_req.bps, bio_queue); in adadone()
3029 cam_iosched_trim_done(softc->cam_iosched); in adadone()
3034 bp1->bio_error = error; in adadone()
3036 bp1->bio_flags |= BIO_ERROR; in adadone()
3037 bp1->bio_resid = bp1->bio_bcount; in adadone()
3039 bp1->bio_resid = 0; in adadone()
3055 if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { in adadone()
3060 } else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { in adadone()
3070 softc->state = ADA_STATE_WCACHE; in adadone()
3082 if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { in adadone()
3087 } else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) { in adadone()
3099 if ((softc->flags & ADA_FLAG_CAN_LOG) in adadone()
3100 && (softc->zone_mode != ADA_ZONE_NONE)) { in adadone()
3102 softc->state = ADA_STATE_LOGDIR; in adadone()
3117 if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in adadone()
3119 softc->valid_logdir_len = 0; in adadone()
3120 bzero(&softc->ata_logdir, sizeof(softc->ata_logdir)); in adadone()
3121 softc->valid_logdir_len = in adadone()
3122 ataio->dxfer_len - ataio->resid; in adadone()
3123 if (softc->valid_logdir_len > 0) in adadone()
3124 bcopy(ataio->data_ptr, &softc->ata_logdir, in adadone()
3125 min(softc->valid_logdir_len, in adadone()
3126 sizeof(softc->ata_logdir))); in adadone()
3134 if ((softc->valid_logdir_len >= in adadone()
3136 && (le16dec(softc->ata_logdir.header) == in adadone()
3138 && (le16dec(&softc->ata_logdir.num_pages[ in adadone()
3140 sizeof(uint16_t)) - sizeof(uint16_t)]) > 0)){ in adadone()
3141 softc->flags |= ADA_FLAG_CAN_IDLOG; in adadone()
3143 softc->flags &= ~ADA_FLAG_CAN_IDLOG; in adadone()
3155 * identify data. in adadone()
3157 softc->flags &= ~(ADA_FLAG_CAN_LOG | in adadone()
3159 if ((done_ccb->ccb_h.status & in adadone()
3162 cam_release_devq(done_ccb->ccb_h.path, in adadone()
3171 free(ataio->data_ptr, M_ATADA); in adadone()
3174 && (softc->flags & ADA_FLAG_CAN_IDLOG)) { in adadone()
3175 softc->state = ADA_STATE_IDDIR; in adadone()
3190 if ((ataio->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in adadone()
3194 softc->valid_iddir_len = 0; in adadone()
3195 bzero(&softc->ata_iddir, sizeof(softc->ata_iddir)); in adadone()
3196 softc->flags &= ~(ADA_FLAG_CAN_SUPCAP | in adadone()
3198 softc->valid_iddir_len = in adadone()
3199 ataio->dxfer_len - ataio->resid; in adadone()
3200 if (softc->valid_iddir_len > 0) in adadone()
3201 bcopy(ataio->data_ptr, &softc->ata_iddir, in adadone()
3202 min(softc->valid_iddir_len, in adadone()
3203 sizeof(softc->ata_iddir))); in adadone()
3207 max_entries = softc->valid_iddir_len - entries_offset; in adadone()
3208 if ((softc->valid_iddir_len > (entries_offset + 1)) in adadone()
3209 && (le64dec(softc->ata_iddir.header) == in adadone()
3211 && (softc->ata_iddir.entry_count > 0)) { in adadone()
3214 num_entries = softc->ata_iddir.entry_count; in adadone()
3216 softc->valid_iddir_len - entries_offset); in adadone()
3219 if (softc->ata_iddir.entries[i] == in adadone()
3221 softc->flags |= in adadone()
3223 else if (softc->ata_iddir.entries[i]== in adadone()
3225 softc->flags |= in adadone()
3228 if ((softc->flags & in adadone()
3230 && (softc->flags & in adadone()
3242 * If we can't get the ATA Identify Data log in adadone()
3245 * a non-zero number of pages present for in adadone()
3248 softc->flags &= ~ADA_FLAG_CAN_IDLOG; in adadone()
3249 if ((done_ccb->ccb_h.status & in adadone()
3252 cam_release_devq(done_ccb->ccb_h.path, in adadone()
3261 free(ataio->data_ptr, M_ATADA); in adadone()
3264 && (softc->flags & ADA_FLAG_CAN_SUPCAP)) { in adadone()
3265 softc->state = ADA_STATE_SUP_CAP; in adadone()
3279 if ((ataio->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in adadone()
3286 ataio->data_ptr; in adadone()
3287 valid_len = ataio->dxfer_len - ataio->resid; in adadone()
3290 sup_zac_cap) + 1 + sizeof(sup_cap->sup_zac_cap); in adadone()
3294 zoned = le64dec(sup_cap->zoned_cap); in adadone()
3299 * ATA identify data. in adadone()
3303 softc->zone_mode = in adadone()
3307 softc->zone_mode = in adadone()
3311 zac_cap = le64dec(sup_cap->sup_zac_cap); in adadone()
3314 softc->zone_flags |= in adadone()
3317 softc->zone_flags |= in adadone()
3320 softc->zone_flags |= in adadone()
3323 softc->zone_flags |= in adadone()
3326 softc->zone_flags |= in adadone()
3331 * ACS-4, r08 on April 28th, 2015. in adadone()
3337 softc->zone_flags |= in adadone()
3348 * If we can't get the ATA Identify Data in adadone()
3352 softc->flags &= ~ADA_FLAG_CAN_SUPCAP; in adadone()
3356 softc->zone_flags &= ~ADA_ZONE_FLAG_SUP_MASK; in adadone()
3357 if ((done_ccb->ccb_h.status & in adadone()
3360 cam_release_devq(done_ccb->ccb_h.path, in adadone()
3369 free(ataio->data_ptr, M_ATADA); in adadone()
3372 && (softc->flags & ADA_FLAG_CAN_ZONE)) { in adadone()
3373 softc->state = ADA_STATE_ZONE; in adadone()
3387 if ((ataio->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { in adadone()
3392 zi_log = (struct ata_zoned_info_log *)ataio->data_ptr; in adadone()
3394 valid_len = ataio->dxfer_len - ataio->resid; in adadone()
3396 version_info) + 1 + sizeof(zi_log->version_info); in adadone()
3400 tmpvar = le64dec(zi_log->zoned_cap); in adadone()
3403 softc->zone_flags |= in adadone()
3406 softc->zone_flags &= in adadone()
3409 tmpvar = le64dec(zi_log->optimal_seq_zones); in adadone()
3411 softc->zone_flags |= in adadone()
3413 softc->optimal_seq_zones = (tmpvar & in adadone()
3416 softc->zone_flags &= in adadone()
3418 softc->optimal_seq_zones = 0; in adadone()
3421 tmpvar =le64dec(zi_log->optimal_nonseq_zones); in adadone()
3423 softc->zone_flags |= in adadone()
3425 softc->optimal_nonseq_zones = in adadone()
3428 softc->zone_flags &= in adadone()
3430 softc->optimal_nonseq_zones = 0; in adadone()
3433 tmpvar = le64dec(zi_log->max_seq_req_zones); in adadone()
3435 softc->zone_flags |= in adadone()
3437 softc->max_seq_zones = in adadone()
3440 softc->zone_flags &= in adadone()
3442 softc->max_seq_zones = 0; in adadone()
3451 softc->flags &= ~ADA_FLAG_CAN_ZONE; in adadone()
3452 softc->flags &= ~ADA_ZONE_FLAG_SET_MASK; in adadone()
3454 if ((done_ccb->ccb_h.status & in adadone()
3457 cam_release_devq(done_ccb->ccb_h.path, in adadone()
3465 free(ataio->data_ptr, M_ATADA); in adadone()
3471 /* No-op. We're polling */ in adadone()
3486 periph = xpt_path_periph(ccb->ccb_h.path); in adaerror()
3487 softc = (struct ada_softc *)periph->softc; in adaerror()
3489 switch (ccb->ccb_h.status & CAM_STATUS_MASK) { in adaerror()
3491 softc->timeouts++; in adaerror()
3499 softc->errors++; in adaerror()
3512 struct disk_params *dp = &softc->params; in adasetgeom()
3518 dp->secsize = ata_logical_sector_size(&cgd->ident_data); in adasetgeom()
3519 if ((cgd->ident_data.atavalid & ATA_FLAG_54_58) && in adasetgeom()
3520 cgd->ident_data.current_heads != 0 && in adasetgeom()
3521 cgd->ident_data.current_sectors != 0) { in adasetgeom()
3522 dp->heads = cgd->ident_data.current_heads; in adasetgeom()
3523 dp->secs_per_track = cgd->ident_data.current_sectors; in adasetgeom()
3524 dp->cylinders = cgd->ident_data.cylinders; in adasetgeom()
3525 dp->sectors = (uint32_t)cgd->ident_data.current_size_1 | in adasetgeom()
3526 ((uint32_t)cgd->ident_data.current_size_2 << 16); in adasetgeom()
3528 dp->heads = cgd->ident_data.heads; in adasetgeom()
3529 dp->secs_per_track = cgd->ident_data.sectors; in adasetgeom()
3530 dp->cylinders = cgd->ident_data.cylinders; in adasetgeom()
3531 dp->sectors = cgd->ident_data.cylinders * in adasetgeom()
3532 (uint32_t)(dp->heads * dp->secs_per_track); in adasetgeom()
3534 lbasize = (uint32_t)cgd->ident_data.lba_size_1 | in adasetgeom()
3535 ((uint32_t)cgd->ident_data.lba_size_2 << 16); in adasetgeom()
3537 /* use the 28bit LBA size if valid or bigger than the CHS mapping */ in adasetgeom()
3538 if (cgd->ident_data.cylinders == 16383 || dp->sectors < lbasize) in adasetgeom()
3539 dp->sectors = lbasize; in adasetgeom()
3541 /* use the 48bit LBA size if valid */ in adasetgeom()
3542 lbasize48 = ((uint64_t)cgd->ident_data.lba_size48_1) | in adasetgeom()
3543 ((uint64_t)cgd->ident_data.lba_size48_2 << 16) | in adasetgeom()
3544 ((uint64_t)cgd->ident_data.lba_size48_3 << 32) | in adasetgeom()
3545 ((uint64_t)cgd->ident_data.lba_size48_4 << 48); in adasetgeom()
3546 if ((cgd->ident_data.support.command2 & ATA_SUPPORT_ADDRESS48) && in adasetgeom()
3548 dp->sectors = lbasize48; in adasetgeom()
3550 maxio = softc->cpi.maxio; /* Honor max I/O size of SIM */ in adasetgeom()
3555 if (softc->flags & ADA_FLAG_CAN_48BIT) in adasetgeom()
3556 maxio = min(maxio, 65536 * softc->params.secsize); in adasetgeom()
3558 maxio = min(maxio, 256 * softc->params.secsize); in adasetgeom()
3559 if (softc->quirks & ADA_Q_128KB) in adasetgeom()
3561 softc->disk->d_maxsize = maxio; in adasetgeom()
3563 if (softc->flags & ADA_FLAG_CAN_FLUSHCACHE) in adasetgeom()
3565 if (softc->flags & ADA_FLAG_CAN_TRIM) { in adasetgeom()
3567 softc->disk->d_delmaxsize = softc->params.secsize * in adasetgeom()
3568 ATA_DSM_RANGE_MAX * softc->trim_max_ranges; in adasetgeom()
3569 } else if ((softc->flags & ADA_FLAG_CAN_CFA) && in adasetgeom()
3570 !(softc->flags & ADA_FLAG_CAN_48BIT)) { in adasetgeom()
3572 softc->disk->d_delmaxsize = 256 * softc->params.secsize; in adasetgeom()
3574 softc->disk->d_delmaxsize = maxio; in adasetgeom()
3575 if ((softc->cpi.hba_misc & PIM_UNMAPPED) != 0) { in adasetgeom()
3577 softc->flags |= ADA_FLAG_UNMAPPEDIO; in adasetgeom()
3579 softc->disk->d_flags = d_flags; in adasetgeom()
3590 tmpsize = MIN(sizeof(softc->disk->d_descr) - 1, in adasetgeom()
3591 sizeof(cgd->ident_data.model)); in adasetgeom()
3592 memcpy(softc->disk->d_descr, cgd->ident_data.model, tmpsize); in adasetgeom()
3593 softc->disk->d_descr[tmpsize] = '\0'; in adasetgeom()
3595 tmpsize = MIN(sizeof(softc->disk->d_ident) - 1, in adasetgeom()
3596 sizeof(cgd->ident_data.serial)); in adasetgeom()
3597 memcpy(softc->disk->d_ident, cgd->ident_data.serial, tmpsize); in adasetgeom()
3598 softc->disk->d_ident[tmpsize] = '\0'; in adasetgeom()
3600 softc->disk->d_sectorsize = softc->params.secsize; in adasetgeom()
3601 softc->disk->d_mediasize = (off_t)softc->params.sectors * in adasetgeom()
3602 softc->params.secsize; in adasetgeom()
3603 if (ata_physical_sector_size(&cgd->ident_data) != in adasetgeom()
3604 softc->params.secsize) { in adasetgeom()
3605 softc->disk->d_stripesize = in adasetgeom()
3606 ata_physical_sector_size(&cgd->ident_data); in adasetgeom()
3607 softc->disk->d_stripeoffset = (softc->disk->d_stripesize - in adasetgeom()
3608 ata_logical_sector_offset(&cgd->ident_data)) % in adasetgeom()
3609 softc->disk->d_stripesize; in adasetgeom()
3610 } else if (softc->quirks & ADA_Q_4K) { in adasetgeom()
3611 softc->disk->d_stripesize = 4096; in adasetgeom()
3612 softc->disk->d_stripeoffset = 0; in adasetgeom()
3614 softc->disk->d_fwsectors = softc->params.secs_per_track; in adasetgeom()
3615 softc->disk->d_fwheads = softc->params.heads; in adasetgeom()
3616 softc->disk->d_rotation_rate = cgd->ident_data.media_rotation_rate; in adasetgeom()
3617 snprintf(softc->disk->d_attachment, sizeof(softc->disk->d_attachment), in adasetgeom()
3618 "%s%d", softc->cpi.dev_name, softc->cpi.unit_number); in adasetgeom()
3627 if (softc->outstanding_cmds > 0) { in adasendorderedtag()
3628 if ((softc->flags & ADA_FLAG_WAS_OTAG) == 0) in adasendorderedtag()
3629 softc->flags |= ADA_FLAG_NEED_OTAG; in adasendorderedtag()
3630 softc->flags &= ~ADA_FLAG_WAS_OTAG; in adasendorderedtag()
3635 callout_schedule_sbt(&softc->sendordered_c, in adasendorderedtag()
3653 softc = (struct ada_softc *)periph->softc; in adaflush()
3657 (softc->flags & ADA_FLAG_OPEN)) { in adaflush()
3658 adadump(softc->disk, NULL, 0, 0); in adaflush()
3667 if (((softc->flags & ADA_FLAG_OPEN) == 0) || in adaflush()
3668 (softc->flags & ADA_FLAG_CAN_FLUSHCACHE) == 0) { in adaflush()
3674 cam_fill_ataio(&ccb->ataio, in adaflush()
3682 if (softc->flags & ADA_FLAG_CAN_48BIT) in adaflush()
3683 ata_48bit_cmd(&ccb->ataio, ATA_FLUSHCACHE48, 0, 0, 0); in adaflush()
3685 ata_28bit_cmd(&ccb->ataio, ATA_FLUSHCACHE, 0, 0, 0); in adaflush()
3689 softc->disk->d_devstat); in adaflush()
3691 xpt_print(periph->path, "Synchronize cache failed\n"); in adaflush()
3707 /* If we panicked with lock held - not recurse here. */ in adaspindown()
3711 softc = (struct ada_softc *)periph->softc; in adaspindown()
3713 * We only spin-down the drive if it is capable of it.. in adaspindown()
3715 if ((softc->flags & ADA_FLAG_CAN_POWERMGT) == 0) { in adaspindown()
3726 xpt_setup_ccb(&local_ccb.ccb_h, periph->path, in adaspindown()
3739 softc->disk->d_devstat); in adaspindown()
3741 xpt_print(periph->path, in adaspindown()
3747 xpt_print(periph->path, in adaspindown()
3755 xpt_print(periph->path, in adaspindown()
3767 xpt_print(periph->path, "spin-down\n"); in adaspindown()
3770 xpt_setup_ccb(&local_ccb.ccb_h, periph->path, CAM_PRIORITY_NORMAL); in adaspindown()
3784 softc->disk->d_devstat); in adaspindown()
3786 xpt_print(periph->path, "Spin-down disk failed\n"); in adaspindown()
3802 * STANDBY IMMEDIATE saves any volatile data to the drive. It also spins in adashutdown()
3803 * down hard drives. IDLE IMMEDIATE also saves the volatile data without in adashutdown()
3807 * flush the data because the BIOS in many systems resets the HBA in adashutdown()
3809 * as license to toss the volatile data, and others count as unclean in adashutdown()
3828 * SLEEP also fushes any volatile data, like STANDBY IMEDIATE, in adasuspend()
3846 softc = (struct ada_softc *)periph->softc; in adaresume()
3848 * We only spin-down the drive if it is capable of it.. in adaresume()
3850 if ((softc->flags & ADA_FLAG_CAN_POWERMGT) == 0) { in adaresume()
3856 xpt_print(periph->path, "resume\n"); in adaresume()
3862 cam_release_devq(periph->path, in adaresume()