==== //depot/users/kenm/FreeBSD-test3/sys/cam/ata/ata_da.c#24 - /usr/home/kenm/perforce4/kenm/FreeBSD-test3/sys/cam/ata/ata_da.c ==== *** /tmp/tmp.23228.14 Tue May 24 14:11:58 2016 --- /usr/home/kenm/perforce4/kenm/FreeBSD-test3/sys/cam/ata/ata_da.c Tue May 24 14:11:29 2016 *************** *** 115,126 **** ADA_Q_NONE = 0x00, ADA_Q_4K = 0x01, ADA_Q_NCQ_TRIM_BROKEN = 0x02, } ada_quirks; #define ADA_Q_BIT_STRING \ "\020" \ "\0014K" \ ! "\002NCQ_TRIM_BROKEN" typedef enum { ADA_CCB_RAHEAD = 0x01, --- 115,130 ---- ADA_Q_NONE = 0x00, ADA_Q_4K = 0x01, ADA_Q_NCQ_TRIM_BROKEN = 0x02, + ADA_Q_LOG_BROKEN = 0x04, + ADA_Q_SMR_DM = 0x08 } ada_quirks; #define ADA_Q_BIT_STRING \ "\020" \ "\0014K" \ ! "\002NCQ_TRIM_BROKEN" \ ! "\003LOG_BROKEN" \ ! "\004SMR_DM" typedef enum { ADA_CCB_RAHEAD = 0x01, *************** *** 679,684 **** --- 683,719 ---- { T_DIRECT, SIP_MEDIA_FIXED, "*", "SG9XCS2D*", "*" }, /*quirks*/ADA_Q_4K }, + #if 0 + { + /* + * Samsung drive that doesn't support READ LOG EXT or + * READ LOG DMA EXT, despite reporting that it does in + * ATA identify data: + * SAMSUNG HD200HJ KF100-06 + */ + { T_DIRECT, SIP_MEDIA_FIXED, "*", "SAMSUNG HD200*", "*" }, + /*quirks*/ADA_Q_LOG_BROKEN + }, + { + /* + * Samsung drive that doesn't support READ LOG EXT or + * READ LOG DMA EXT, despite reporting that it does in + * ATA identify data: + * SAMSUNG HD501LJ CR100-10 + */ + { T_DIRECT, SIP_MEDIA_FIXED, "*", "SAMSUNG HD501*", "*" }, + /*quirks*/ADA_Q_LOG_BROKEN + }, + #endif + { + /* + * Seagate Lamarr 8TB Shingled Magnetic Recording (SMR) + * Drive Managed SATA hard drive. This drive doesn't report + * in firmware that it is a drive managed SMR drive. + */ + { T_DIRECT, SIP_MEDIA_FIXED, "*", "ST8000AS0002*", "*" }, + /*quirks*/ADA_Q_SMR_DM + }, { /* Default */ { *************** *** 1258,1264 **** softc->state = ADA_STATE_RAHEAD; else if (ADA_WC >= 0 && softc->flags & ADA_FLAG_CAN_RAHEAD) softc->state = ADA_STATE_WCACHE; ! else if (softc->flags & ADA_FLAG_CAN_LOG) softc->state = ADA_STATE_LOGDIR; else break; --- 1293,1300 ---- softc->state = ADA_STATE_RAHEAD; else if (ADA_WC >= 0 && softc->flags & ADA_FLAG_CAN_RAHEAD) softc->state = ADA_STATE_WCACHE; ! else if ((softc->flags & ADA_FLAG_CAN_LOG) ! && (softc->zone_mode != ADA_ZONE_NONE)) softc->state = ADA_STATE_LOGDIR; else break; *************** *** 1581,1587 **** */ adasetdeletemethod(softc); ! if (cgd->ident_data.support.extension & ATA_SUPPORT_GENLOG) softc->flags |= ADA_FLAG_CAN_LOG; else softc->flags &= ~ADA_FLAG_CAN_LOG; --- 1617,1624 ---- */ adasetdeletemethod(softc); ! if ((cgd->ident_data.support.extension & ATA_SUPPORT_GENLOG) ! && ((softc->quirks & ADA_Q_LOG_BROKEN) == 0)) softc->flags |= ADA_FLAG_CAN_LOG; else softc->flags &= ~ADA_FLAG_CAN_LOG; *************** *** 1592,1597 **** --- 1629,1636 ---- else if ((cgd->ident_data.support3 & ATA_SUPPORT_ZONE_MASK) == ATA_SUPPORT_ZONE_DEV_MANAGED) softc->zone_mode = ADA_ZONE_DRIVE_MANAGED; + else if (softc->quirks & ADA_Q_SMR_DM) + softc->zone_mode = ADA_ZONE_DRIVE_MANAGED; else softc->zone_mode = ADA_ZONE_NONE; *************** *** 1639,1649 **** return(CAM_REQ_CMP_ERR); } - /* - * Set support flags based on the Identify data. - */ - adasetflags(softc, cgd); - periph->softc = softc; /* --- 1678,1683 ---- *************** *** 1683,1688 **** --- 1717,1728 ---- snprintf(announce_buf, sizeof(announce_buf), "kern.cam.ada.%d.write_cache", periph->unit_number); TUNABLE_INT_FETCH(announce_buf, &softc->write_cache); + + /* + * Set support flags based on the Identify data. + */ + adasetflags(softc, cgd); + /* Disable queue sorting for non-rotational media by default. */ if (cgd->ident_data.media_rotation_rate == ATA_RATE_NON_ROTATING) { softc->rotating = 0; *************** *** 1817,1823 **** softc->state = ADA_STATE_RAHEAD; } else if (ADA_WC >= 0 && softc->flags & ADA_FLAG_CAN_WCACHE) { softc->state = ADA_STATE_WCACHE; ! } else if (softc->flags & ADA_FLAG_CAN_LOG) { softc->state = ADA_STATE_LOGDIR; } else { /* --- 1857,1864 ---- softc->state = ADA_STATE_RAHEAD; } else if (ADA_WC >= 0 && softc->flags & ADA_FLAG_CAN_WCACHE) { softc->state = ADA_STATE_WCACHE; ! } else if ((softc->flags & ADA_FLAG_CAN_LOG) ! && (softc->zone_mode != ADA_ZONE_NONE)) { softc->state = ADA_STATE_LOGDIR; } else { /* *************** *** 2862,2868 **** /* Drop freeze taken due to CAM_DEV_QFREEZE */ cam_release_devq(path, 0, 0, 0, FALSE); ! if (softc->flags & ADA_FLAG_CAN_LOG) { xpt_release_ccb(done_ccb); softc->state = ADA_STATE_LOGDIR; xpt_schedule(periph, priority); --- 2903,2910 ---- /* Drop freeze taken due to CAM_DEV_QFREEZE */ cam_release_devq(path, 0, 0, 0, FALSE); ! if ((softc->flags & ADA_FLAG_CAN_LOG) ! && (softc->zone_mode != ADA_ZONE_NONE)) { xpt_release_ccb(done_ccb); softc->state = ADA_STATE_LOGDIR; xpt_schedule(periph, priority);