?? RIGHT := 110 ??
?? NEWTITLE := 'INITIALIZE_TAPE_VOLUME Ring 3.', ??
MODULE dmm$initialize_tape_r3;

{ PURPOSE:
{   This module contains interface to manipulate task private
{   data structures during tape label initialization.

?? NEWTITLE := 'Global Declarations Referenced by This Module.', EJECT ??

*copyc cmp$get_element_name_via_lun
*copyc cmp$get_logical_unit_number
*copyc fmp$obtain_element_name
*copyc jmp$system_job
*copyc osp$set_status_abnormal
*copyc dmt$initv_saved_info

  VAR
    dmv$initialize_tape_volume: [XDCL, #GATE, STATIC, oss$task_private] dmt$initialize_tape_volume :=
      [FALSE];

  VAR
    dmv$initv_saved_info: [XDCL, #GATE, oss$task_private] ^dmt$initv_saved_info := NIL;

?? PUSH (LISTEXT := ON) ??
*copyc cme$logical_configuration_utl
*copyc cme$logical_configuration_mgr
*copyc cmv$logical_unit_table
*copyc dmt$initialize_tape_volume
*copyc oss$task_private
*copyc osv$task_private_heap
*copyc rmt$density
?? POP ??

?? OLDTITLE ??
?? NEWTITLE := '  dmp$obtain_assigned_element', EJECT ??

{ PURPOSE:
{   This procedure obtains the element name of the tape associated
{   with the tape file.

  PROCEDURE [XDCL, #GATE] dmp$obtain_assigned_element
    (    local_file_name: amt$local_file_name;
     VAR assigned_element: cmt$element_name;
     VAR status: ost$status);

    VAR
      name: cmt$element_name;

    fmp$obtain_element_name (local_file_name, name, status);
    IF status.normal THEN
      assigned_element := name;
    IFEND;

  PROCEND dmp$obtain_assigned_element;

?? OLDTITLE ??
?? NEWTITLE := '  dmp$save_tape_initv_vol_info', EJECT ??

{ PURPOSE:
{   This procedure saves various info related to a volume, for an instance
{   of initialize_tape_volume.

  PROCEDURE [XDCL, #GATE] dmp$save_tape_initv_vol_info
    (    volume_info: dmt$initv_saved_info);

    IF dmv$initv_saved_info = NIL THEN
      ALLOCATE dmv$initv_saved_info IN osv$task_private_heap^;
    IFEND;

    dmv$initv_saved_info^ := volume_info;

    IF volume_info.owner_id = '              ' THEN
      dmv$initv_saved_info^.owner_id (1, 14) := 'NONE          ';
    IFEND;

  PROCEND dmp$save_tape_initv_vol_info;

?? OLDTITLE ??
?? NEWTITLE := '  dmp$setup_tape_init_in_progress', EJECT ??

{ PURPOSE:
{   This procedure sets up a task private flag to indicates
{   whether or not initialize_tape_volume is in progress and
{   what logical unit is being used.

  PROCEDURE [XDCL, #GATE] dmp$setup_tape_init_in_progress
    (    in_progress: boolean;
         element_name: cmt$element_name;
         logical_unit: iot$logical_unit);


    IF NOT in_progress AND (dmv$initv_saved_info <> NIL) THEN
      FREE dmv$initv_saved_info IN osv$task_private_heap^;
    IFEND;

    dmv$initialize_tape_volume.in_progress := in_progress;
    dmv$initialize_tape_volume.element_name := element_name;
    dmv$initialize_tape_volume.logical_unit := logical_unit;

  PROCEND dmp$setup_tape_init_in_progress;

?? OLDTITLE ??
?? NEWTITLE := '   dmp$validate_tape_element', EJECT ??

{ PURPOSE:
{   This procedures validates the proper density of the tape
{   unit being chosen for initialize_tape_volume.

  PROCEDURE [XDCL, #GATE] dmp$validate_tape_element
    (    lun: iot$logical_unit;
         tape_density: rmt$density;
     VAR status: ost$status);

    VAR
      element_name: cmt$element_name,
      local_status: ost$status,
      density_valid: boolean,
      unit_type: iot$unit_type;

    status.normal := TRUE;
    element_name := '';

    get_unit_type_via_lun (lun, unit_type, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    density_valid := FALSE;

    IF (unit_type = ioc$dt_mt679_2) OR (unit_type = ioc$dt_mt679_3) OR (unit_type = ioc$dt_mt679_4) THEN
      IF (tape_density = rmc$800) OR (tape_density = rmc$1600) THEN
        density_valid := TRUE;
      IFEND;
    ELSEIF (unit_type = ioc$dt_mt5682_1x) THEN
      IF (tape_density = rmc$38000) THEN
        density_valid := TRUE;
      IFEND;
    ELSE
      IF (tape_density = rmc$1600) OR (tape_density = rmc$6250) THEN
        density_valid := TRUE;
      IFEND;
    IFEND;

    IF NOT density_valid THEN
      cmp$get_element_name_via_lun (lun, element_name, local_status);
      osp$set_status_abnormal (cmc$configuration_management_id, cme$lcu_unit_density_mismatch, element_name,
            status);
    IFEND;

  PROCEND dmp$validate_tape_element;

?? OLDTITLE ??
?? NEWTITLE := '   get_unit_type_via_lun', EJECT ??

{ PURPOSE:
{   This procedure returns the unit type given the logical unit.


  PROCEDURE get_unit_type_via_lun
    (    lun: iot$logical_unit;
     VAR unit_type: iot$unit_type;
     VAR status: ost$status);

    VAR
      local_status: ost$status,
      element_name: cmt$element_name,
      tape_unit: boolean;

    status.normal := TRUE;
    element_name := '';

    unit_type := cmv$logical_unit_table^ [lun].unit_interface_table^.unit_type;

    tape_unit := (unit_type <= ioc$highest_tape_unit);

    IF NOT tape_unit THEN
      cmp$get_element_name_via_lun (lun, element_name, local_status);
      osp$set_status_abnormal (cmc$configuration_management_id, cme$lcu_illegal_tape_unit_name, element_name,
            status);
    IFEND;

  PROCEND get_unit_type_via_lun;

MODEND dmm$initialize_tape_r3;
