static uint8_t set_device_configuration_extension(struct scsi_cmd *cmd, uint8_t *p) { uint8_t *sam_stat = &cmd->dbuf_p->sam_stat; struct lu_phy_attr *lu = cmd->lu; struct priv_lu_ssc *lu_priv = cmd->lu->lu_private; struct ssc_personality_template *pm; struct mode *mp; int page_code_len; int write_mode; int pews; /* Programable Early Warning Size */ pm = lu_priv->pm; mp = lookup_pcode(&lu->mode_pg, MODE_DEVICE_CONFIGURATION, 1); /* Code error * Any device supporting this should have this mode page defined */ if (!mp) { mkSenseBuf(HARDWARE_ERROR, E_INTERNAL_TARGET_FAILURE, sam_stat); return SAM_STAT_CHECK_CONDITION; } page_code_len = get_unaligned_be16(&p[2]); if (page_code_len != 0x1c) { MHVTL_LOG("Unexpected page code length.. Unexpected results"); mkSenseBuf(ILLEGAL_REQUEST, E_INVALID_FIELD_IN_PARMS, sam_stat); return SAM_STAT_CHECK_CONDITION; } write_mode = (p[5] & 0xf0) >> 4; if (write_mode > 1) { mkSenseBuf(ILLEGAL_REQUEST, E_INVALID_FIELD_IN_PARMS, sam_stat); return SAM_STAT_CHECK_CONDITION; } MHVTL_DBG(2, "%s mode", write_mode ? "Append-only" : "Write-anywhere"); pews = get_unaligned_be16(&p[6]); if (pm->drive_supports_prog_early_warning) { MHVTL_DBG(2, "Set Programable Early Warning Size: %d", pews); lu_priv->prog_early_warning_sz = pews; update_prog_early_warning(lu); } else { MHVTL_DBG(2, "Programable Early Warning Size not supported" " by this device"); } MHVTL_DBG(2, "Volume containing encrypted logical blocks " "requires encryption: %d", p[8] & 0x01); if (pm->drive_supports_append_only_mode) { /* Can't reset append-only mode via mode page ssc4 8.3.8 */ if (lu_priv->append_only_mode && write_mode == 0) { MHVTL_LOG("Can't reset append only mode via mode page"); mkSenseBuf(ILLEGAL_REQUEST, E_INVALID_FIELD_IN_PARMS, sam_stat); return SAM_STAT_CHECK_CONDITION; } if (write_mode) { lu_priv->append_only_mode = write_mode; lu_priv->allow_overwrite = FALSE; } } /* Now update our copy of this mode page */ mp->pcodePointer[5] &= 0x0f; mp->pcodePointer[5] |= write_mode << 4; return SAM_STAT_GOOD; }
void init_hp_ult_6(struct lu_phy_attr *lu) { init_ult_inquiry(lu); ssc_pm.name = pm_name_lto6; ssc_pm.lu = lu; personality_module_register(&ssc_pm); /* Drive capabilities need to be defined before mode pages */ ssc_pm.drive_supports_append_only_mode = FALSE; ssc_pm.drive_supports_early_warning = TRUE; ssc_pm.drive_supports_prog_early_warning = FALSE; add_mode_page_rw_err_recovery(lu); add_mode_disconnect_reconnect(lu); add_mode_control(lu); add_mode_control_extension(lu); add_mode_data_compression(lu); add_mode_device_configuration(lu); add_mode_device_configuration_extention(lu); add_mode_medium_partition(lu); add_mode_power_condition(lu); add_mode_information_exception(lu); add_mode_medium_configuration(lu); add_mode_ult_encr_mode_pages(lu); /* Extra for LTO-5 */ add_mode_vendor_25h_mode_pages(lu); add_mode_encryption_mode_attribute(lu); /* Supports non-zero programable early warning */ update_prog_early_warning(lu); add_log_write_err_counter(lu); add_log_read_err_counter(lu); add_log_sequential_access(lu); add_log_temperature_page(lu); add_log_tape_alert(lu); add_log_tape_usage(lu); add_log_tape_capacity(lu); add_log_data_compression(lu); ssc_pm.native_drive_density = &density_lto6; ssc_pm.update_encryption_mode = update_ult_encryption_mode, ssc_pm.encryption_capabilities = encr_capabilities_ult, ssc_pm.kad_validation = hp_lto_kad_validation, ssc_pm.clear_WORM = clear_ult_WORM, ssc_pm.set_WORM = set_ult_WORM, /* Capacity units in MBytes */ ((struct priv_lu_ssc *)lu->lu_private)->capacity_unit = 1L << 20; register_ops(lu, SECURITY_PROTOCOL_IN, ssc_spin); register_ops(lu, SECURITY_PROTOCOL_OUT, ssc_spout); add_density_support(&lu->den_list, &density_lto4, 0); add_density_support(&lu->den_list, &density_lto5, 1); add_density_support(&lu->den_list, &density_lto6, 1); add_drive_media_list(lu, LOAD_RO, "LTO4"); add_drive_media_list(lu, LOAD_RO, "LTO4 Clean"); add_drive_media_list(lu, LOAD_RO, "LTO4 WORM"); add_drive_media_list(lu, LOAD_RW, "LTO5"); add_drive_media_list(lu, LOAD_RO, "LTO5 Clean"); add_drive_media_list(lu, LOAD_RW, "LTO5 WORM"); add_drive_media_list(lu, LOAD_RW, "LTO5 ENCR"); add_drive_media_list(lu, LOAD_RW, "LTO6"); add_drive_media_list(lu, LOAD_RO, "LTO6 Clean"); add_drive_media_list(lu, LOAD_RW, "LTO6 WORM"); add_drive_media_list(lu, LOAD_RW, "LTO6 ENCR"); }
void init_ult3580_td7(struct lu_phy_attr *lu) { ssc_pm.name = pm_name_lto7; ssc_pm.lu = lu; ssc_pm.native_drive_density = &density_lto7; ssc_pm.update_encryption_mode = update_ult_encryption_mode; ssc_pm.encryption_capabilities = encr_capabilities_ult; ssc_pm.kad_validation = td4_kad_validation; ssc_pm.clear_WORM = clear_ult_WORM; ssc_pm.set_WORM = set_ult_WORM; ssc_pm.drive_supports_append_only_mode = TRUE; ssc_pm.drive_supports_early_warning = TRUE; ssc_pm.drive_supports_prog_early_warning = TRUE; ssc_pm.drive_supports_WORM = TRUE; ssc_pm.drive_supports_SPR = TRUE; ssc_pm.drive_supports_SP = TRUE; ssc_pm.drive_ANSI_VERSION = 5; ssc_personality_module_register(&ssc_pm); init_ult_inquiry(lu); add_mode_page_rw_err_recovery(lu); add_mode_disconnect_reconnect(lu); add_mode_control(lu); add_mode_control_extension(lu); add_mode_data_compression(lu); add_mode_device_configuration(lu); add_mode_device_configuration_extention(lu); add_mode_medium_partition(lu); add_mode_power_condition(lu); add_mode_information_exception(lu); add_mode_medium_configuration(lu); add_mode_ult_encr_mode_pages(lu); /* Extra for LTO-5 */ add_mode_vendor_25h_mode_pages(lu); add_mode_encryption_mode_attribute(lu); /* Supports non-zero programable early warning */ update_prog_early_warning(lu); add_log_write_err_counter(lu); add_log_read_err_counter(lu); add_log_sequential_access(lu); add_log_temperature_page(lu); add_log_tape_alert(lu); add_log_tape_usage(lu); add_log_tape_capacity(lu); add_log_data_compression(lu); /* Capacity units in MBytes */ ((struct priv_lu_ssc *)lu->lu_private)->capacity_unit = 1L << 20; add_density_support(&lu->den_list, &density_lto5, 0); add_density_support(&lu->den_list, &density_lto6, 1); add_density_support(&lu->den_list, &density_lto7, 1); add_drive_media_list(lu, LOAD_RO, "LTO5"); add_drive_media_list(lu, LOAD_RO, "LTO5 Clean"); add_drive_media_list(lu, LOAD_RW, "LTO5 WORM"); add_drive_media_list(lu, LOAD_RW, "LTO5 ENCR"); add_drive_media_list(lu, LOAD_RW, "LTO6"); add_drive_media_list(lu, LOAD_RO, "LTO6 Clean"); add_drive_media_list(lu, LOAD_RW, "LTO6 WORM"); add_drive_media_list(lu, LOAD_RW, "LTO6 ENCR"); add_drive_media_list(lu, LOAD_RW, "LTO7"); add_drive_media_list(lu, LOAD_RO, "LTO7 Clean"); add_drive_media_list(lu, LOAD_RW, "LTO7 WORM"); add_drive_media_list(lu, LOAD_RW, "LTO7 ENCR"); }