Пример #1
0
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;
}
Пример #2
0
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");
}
Пример #3
0
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");
}