
MODULE iom$initialize_sectors;

*copyc osd$default_pragmats
*copyc iot$cylinders_to_initialize
*copyc iot$logical_unit
*copyc iot$io_function
*copyc dmt$ms_logical_device_address
*copyc iot$completion_status
*copyc ost$hardware_subranges
*copyc osk$keypoints
*copyc iok$keypoints
*copyc iop$mass_storage_io
*copyc osv$mainframe_wired_cb_heap
*copyc ost$status
*copyc ioe$st_errors


  PROCEDURE [XDCL, #GATE] iop$initialize_sectors (logical_unit:
    iot$logical_unit;
        cylinders: array [ * ] OF iot$cylinders_to_initialize;
    VAR status: ost$status);

    VAR
      initialize_sector_list_p: ^iot$initialize_sector_list,
      length: ost$byte_count,
      io_function: iot$io_function,
      i: integer,
      device_address: dmt$ms_logical_device_address,
      completion_status: iot$completion_status,
      p_completion_status: ^iot$completion_status;


    status.normal := TRUE;

    ALLOCATE initialize_sector_list_p: [1 .. UPPERBOUND (cylinders)] IN
          osv$mainframe_wired_cb_heap^;

    FOR i := 1 TO UPPERBOUND (cylinders) DO
      initialize_sector_list_p^.list [i].cylinders := cylinders [i];
      initialize_sector_list_p^.list [i].fill1 := 0;
    FOREND;
    length := #SIZE (initialize_sector_list_p^);
    io_function := ioc$initialize_sectors;
    device_address.allocation_unit_mau_address := 0;
    device_address.maus_per_position := 264;
    device_address.logical_unit_number := logical_unit;
    device_address.transfer_length := length;
    device_address.transfer_mau_offset := 0;
    device_address.write_translation := TRUE;
    device_address.au_was_previously_written := TRUE;
    device_address.preset_value := 0;
    completion_status := 0;
    p_completion_status := ^completion_status;

    iop$mass_storage_io (initialize_sector_list_p, length, io_function,
          device_address, TRUE, p_completion_status, status);

    FREE initialize_sector_list_p IN osv$mainframe_wired_cb_heap^;



  PROCEND iop$initialize_sectors;
MODEND iom$initialize_sectors;
