
/*
 * Copyright (c) 1997-2000 by MCST.
 */

/*
 * Defines and structures used by both the driver
 * and user application
 */

#ifndef __LINUX_MCPM_IO_H__
#define __LINUX_MCPM_IO_H__

#ifdef	__cplusplus
extern "C" {
#endif

#include <sys/types.h>

#include <linux/mcst/define.h>
#include <linux/mcst/linux_me90_io.h>


/*
 * Commands for 'ioctl' entry of mcb driver
 * Список команд реализованных в драйвере модуля MCPM и исполняемых
 * посредством системного вызова ioctl()
 */

#define MCPM_IO			('M' << 8)

#define	MCPMIO_LOAD_MP_DRV_CODE			ME90IO_LOAD_MP_DRV_CODE
#define	MCPMIO_STARTUP_MP_DRV			ME90IO_STARTUP_MP_DRV
#define	MCPMIO_STARTUP_MP_ROM_DRV		ME90IO_STARTUP_MP_ROM_DRV
#define	MCPMIO_SPECIFIED_TRANSFER		(MCPM_IO | 3)
#define	MCPMIO_RESET_MP				ME90IO_RESET_MP
#define	MCPMIO_BATCH_TRANSFER			(MCPM_IO | 5)
#define	MCPMIO_SET_INTR_MODE			(MCPM_IO | 6)
#define	MCPMIO_RESET_INTR_MODE			(MCPM_IO | 7)
#define	MCPMIO_GET_DRIVER_INFO			ME90IO_GET_DRIVER_INFO
#define	MCPMIO_LOCK_RESET_MODULE_ON_ERROR		\
		ME90IO_LOCK_RESET_MODULE_ON_ERROR
#define	MCPMIO_UNLOCK_RESET_MODULE_ON_ERROR		\
		ME90IO_UNLOCK_RESET_MODULE_ON_ERROR
#define	MCPMIO_WAIT_FOR_TRANSFER_IN_PROGRESS		\
		ME90IO_WAIT_FOR_TRANSFER_IN_PROGRESS
#define	MCPMIO_STARTUP_MP_CODE			ME90IO_STARTUP_MP_CODE
#define	MCPMIO_SET_MP_STATE			ME90IO_SET_MP_STATE
#define	MCPMIO_SET_COMMON_BUF_MAPING_MODE	(MCPM_IO | 15)
#define	MCPMIO_RESET_COMMON_BUF_MAPING_MODE	(MCPM_IO | 16)
#define	MCPMIO_SUBDEV_MAP_TRANSFER		(MCPM_IO | 17)
#define	MCPMIO_OUT_LAST_TRANS_STATE		ME90IO_OUT_LAST_TRANS_STATE
#define	MCPMIO_GET_DRIVER_TRACE_MSG		ME90IO_GET_DRIVER_TRACE_MSG
#define	MCPMIO_RESTART_BOARD			ME90IO_RESTART_BOARD
#define	MCPMIO_INIT_TRANSFER_MODES		(MCPM_IO | 21)
#define	MCPMIO_HALT_TRANSFER_MODES		(MCPM_IO | 22)
#define	MCPMIO_INIT_BATCH_TRANSFER_MODES	(MCPM_IO | 23)
#define	MCPMIO_WRITE_DEV_ADAPTER_REG		ME90IO_WRITE_DEV_ADAPTER_REG
#define	MCPMIO_READ_DEV_ADAPTER_REG		ME90IO_READ_DEV_ADAPTER_REG
#define	MCPMIO_GET_DEVICE_INFO			(MCPM_IO | 26)
#define	MCPMIO_SET_DRV_GENERAL_MODE		ME90IO_SET_DRV_GENERAL_MODE
#define	MCPMIO_RESET_DRV_GENERAL_MODE		ME90IO_RESET_DRV_GENERAL_MODE
#define	MCPMIO_GET_DRV_GENERAL_MODES		ME90IO_GET_DRV_GENERAL_MODES
#define	MCPMIO_PUT_DRV_GENERAL_MODES		ME90IO_PUT_DRV_GENERAL_MODES
#define	MCPMIO_WAIT_FOR_ASYNC_TRANS_END		ME90IO_WAIT_FOR_ASYNC_TRANS_END
#define	MCPMIO_CHECK_RESTART_BOARD		ME90IO_CHECK_RESTART_BOARD
#define	MCPMIO_START_RESTART_BOARD		ME90IO_START_RESTART_BOARD
#define	MCPMIO_CONTINUE_RESTART_BOARD		ME90IO_CONTINUE_RESTART_BOARD

/*
 *  I/O operation mode flags
 *  Флаги режимов исполнения операций обмена с модулем
 */

#define	DMA_TRANSFER_IO_MODE		0x0002	/* DMA transfer */
						/* обмен в режиме DMA */
#define	BMEM_TRANSFER_IO_MODE		0x0004	/* transfer BMEM <-> SPARC */
						/* only test mode usege */
						/* обмен в тестовом режиме: */
						/* локальная память модуля */
						/* БОЗУ <-> основная память */
						/* комплекса (без выхода в */
						/* канал) */

/*
 *  Map of error code detected by MP driver (mp_error_code field of ioctl
 *  commands)
 *  Список кодов ошибок вырабатываемых драйвером (в основном его МП-частью) при
 *  исполнении команд реализованных через ioctl()
 *  (возможные значения поля drv_error_code в используемых для этих команд
 *  структурах)
 */

#define	DEV_NOT_RESPOND_MCPM_ERROR	1
#define	SUBDEV_NOT_SET_MCPM_ERROR	2

#define   MCPM_REPEAT_INIT     		1
#define   MCPM_ILLEG_CHAN      		2
#define   MCPM_ILLEG_STATUS    		3
#define   MCPM_ILLEG_CTRL_B    		4
#define   MCPM_ILLEG_TERM_A    		5
#define   MCPM_ILLEG_SUBADR    		6
#define   MCPM_REGIM_ERROR     		7
#define   MCPM_NOT_INIT        		8
#define   MCPM_ILLEG_COM       		9
#define   MCPM_ILLEG_MSG_SIZE  		10
#define   MCPM_REPEAT_EXCH     		11
#define   BCW_HARDWARE_MCPM_ERROR	12
#define   MCPM_SP_BZ_FORB      		13
#define   MCPM_LOOK_ROSH       		14
#define   MCPM_ILLEG_PACKET    		15
#define   MCPM_LOOK_VSK_CTL    		16
#define   MCPM_CRASH_TIMER     		17
#define   MCPM_ILLEG_BUF       		18
#define   PACKET_MCPM_ERROR    		19
#define   MCPM_CRASH_ABORT     		20
#define   MCPM_CRASH_TIMER_CTL 		21
#define   MCPM_EXCH_END_NOT    		22
#define   MCPM_TACT_350_NOT    		23
#define   MCPM_SUSPEND         		24 

#define	BAD_PACKETS_NUM_MCPM_ERROR	0x22
#define	CANCELED_MCPM_ERROR		0x23

/*
 *  Types of I/O transfer error codes
 *  Типы используемые для значений кодов ошибок обмена
 */

typedef	u_char		mcpm_drv_err_t;		/* code of error detected by */
						/* MCPM driver */
						/* тип для кодов ошибок */
						/* обмена обнаруживаемых */
						/* драйвером модуля */
						/* (программные ошибки) */
typedef	u_short		mcpm_bcw_t;		/* built-in check word of */
						/* MCPM hardware (channel */
						/* adapter errors) */
						/* тип слова встроенного */
						/* аппаратного контроля */
						/* модуля канала */
						/* (аппаратная ошибка) */

/*
 *  packet and batch of packets types specifications
 *  Описания типов данных используемых при обменах с MCPM
 */

typedef	u_char		mcpm_io_op_t;		/* I/O operation flags */
						/* код операции обмена */
typedef	u_char		mcpm_iodev_num_t;	/* MCPM device number */
						/* номер устройства или */
						/* подустройства на канале */
typedef	u_short		mcpm_io_word_t;		/* word of data buffer */
						/* тип соответствующий слову */
						/* данных обменов */
typedef	u_char		mcpm_io_size_t;		/* data buffer size */
						/* длина массива данных для */
						/* обмена */
typedef	u_char		mcpm_adp_mode_t;	/* MCPM channel adapter */
						/* control-state mode bits */
						/* тип соответствующий */
						/* значению с битами */
						/* управления аппаратурой */

/*
 *  Device number and I/O operation flags description
 *  Описание полного номера устройства, его составляющих, кода операции обмена
 *  с устройством и диапазона возможных их значений.
 *  Для групповой команды адрес ОУ должен быть равен 31.
 */

typedef struct mcpm_dev_num
{
	mcpm_iodev_num_t	main_addr;	/* main address of device */
						/* номер основного устройства */
	mcpm_iodev_num_t	sub_addr;	/* subaddress of device */
						/* номер подустройства */
} mcpm_dev_num_t;

#define	MCPM_MIN_DEVICE_NUM			0
#define	MCPM_MAX_DEVICE_NUM			31
#define	MCPM_MIN_SUBDEVICE_NUM			1
#define	MCPM_MAX_SUBDEVICE_NUM			30

/*
 *  Подустройство (а точнее дескриптор результатов передатчика)
 *  'MCPM_ERRORS_SUBDEVICE_NUM' используется для общих ошибок канала.
 *  В него помещаются все сообщения об ошибках, которые относятся
 *  ко всему каналу в целом или не могут быть привязаны к какому-то
 *  конкретному подустройству.
 */

#define	MCPM_ERRORS_SUBDEVICE_NUM		0

/*
 *  MCPM I/O operation encoding (mcpm_io_op_t and mcpm_iopack_op_t)
 *  Кодировка операций обмена с MCPM (mcpm_io_op_t & mcpm_iopack_op_t)
 */

#define	MCPM_IO_WRITE	0x1			/* write operation */
						/* запись (передача в канал) */
#define	MCPM_IO_READ	0x2			/* read operation */
						/* чтение (прием из канала) */

/*
 *  Channel Control word structure description
 *  Описание командного слова получаемого оконечником из канала
 *  или посылаемого контроллером в канал перед началом исполнения
 *  непосредственно обмена.
 */

typedef struct mcpm_ccw
{
	mcpm_io_word_t	main_addr	:  5;	/* [15:11] device address  */
						/* номер основного устройства */
						/* обмен c которым заказан */
	mcpm_io_word_t	write_flag	:  1;	/* [10] write I/O operation  */
						/* flags */
						/* признак передачи в канал */
						/* если 0 - то должен быть */
						/* прием */
	mcpm_io_word_t	sub_addr	:  5;	/* [ 9: 5] subaddress of */
						/* device */
						/* номер подустройства, */
						/* обмен c которым заказан */
	mcpm_io_word_t	word_size	:  5;	/* [ 4: 0] word size of */
						/* transfer */
						/* размер обмена в словах */
						/* канала (16 бит) */
} mcpm_ccw_t;

/*
 *  MCPM-controller I/O operation packet and batch of packets specifications
 *  Структуры и описания типов данных для обменов с использованием пакетов
 *  и пачки пакетов (обмены в режиме контроллера)
 */

/*
 *  MCPM I/O operation batch of packets specifications. The batch is common
 *  structure and comprises descriptors of packets, data buffers and I/O
 *  operation results area for each packet. Descriptors of packets are the
 *  first item of the batch and other allocated with fixed offset into batch,
 *  including all packets I/O data buffers
 *  Обмен с MCPM в режиме контроллера представляет собой пачку пакетов,
 *  каждый из которых является требованием на передачу данных в канал или прием
 *  данных из канала.
 *  Пачка обмена является общей структурой состоящей из следующих областей:
 *       batch_desc      - дескриптор пачки описывающий ее параметры и
 *                         обобщенные результаты обмена по данной пачке;
 *       packets         - область дескрипторов пакетов, описывающих конкретные
 *                         запросы на обмен и их результаты;
 *       data_bufs       - область данных для всех пакетов;
 *       private_area    - область пользовательской информации для всех
 *                         пакетов составляющих пачку.
 *  Области внутри пачки должны следовать именно в том порядке, в котором они
 *  перечислены выше. Каждая обасть должна выделяться по максимуму исходя из
 *  максимального количества пакетов в одном обмене, максимального размера
 *  масиива передаваемых и принимаемых данных и с учетом кратности размеру
 *  блока обмена между каналом и основной памятью в режиме непосредственного
 *  доступа (DMA).
 *  Все параметры пачки (максимальное число пакетов в пачке, максимальный
 *  размер буфера обмена, размер блока работы с памятью) описываются далее
 *  с помощью "#define' и могут быть легко изменены, если в этом возникнет
 *  необходимость. При инициализации режима обмена с каналом (см. далее)
 *  параметры пачки передаются драйверу для динамической настройки на
 *  конкретное использование канала;
 *  Тем самым, каждая область имеет свой фиксированный адрес внутри пачки и 
 *  более того, каждый пакет составляющий пачку имеет фиксированные смещения 
 *  для своего дескриптора и буфера данных:
 *
 *                      ____________________________________
 *   batch_desc     ->  |       дескриптор пачки и         |
 *                      |  обобщенного результата обмена   |
 *                      |----------------------------------|
 *   packets        ->  |   дескриптор 0-го пакета пачки   |
 *                      |----------------------------------|
 *                      |   дескриптор 1-го пакета пачки   |
 *                      |----------------------------------|
 *                      |   ............................   |
 *                      |__________________________________|
 *                      |   дескриптор последнего пакета   |
 *                      |----------------------------------|
 *                      |   ............................   |
 *                      |   ............................   |
 *                      |   ............................   |
 *                      |__________________________________|
 *   data_bufs      ->  |     буфер данных 0-го пакета     |
 *                      |                                  |
 *                      |                                  |
 *                      |                                  |
 *                      |----------------------------------|
 *                      |     буфер данных 1-го пакета     |
 *                      |                                  |
 *                      |                                  |
 *                      |                                  |
 *                      |----------------------------------|
 *                      |   ............................   |
 *                      |   ............................   |
 *                      |   ............................   |
 *                      |__________________________________|
 *                      |  буфер данных последнего пакета  |
 *                      |                                  |
 *                      |                                  |
 *                      |                                  |
 *                      |----------------------------------|
 *                      |   ............................   |
 *                      |   ............................   |
 *                      |   ............................   |
 *                      |----------------------------------|
 *   private_area   ->  |   пользовательская информации    |
 *			|        0-го пакета пачки         |
 *                      |----------------------------------|
 *                      |   пользовательская информации    |
 *			|        1-го пакета пачки         |
 *                      |----------------------------------|
 *                      |   ............................   |
 *                      |__________________________________|
 *                      |   пользовательская информации    |
 *			|     последнего пакета пачки      |
 *                      |----------------------------------|
 *                      |   ............................   |
 *                      |   ............................   |
 *                      |   ............................   |
 *                      |__________________________________|
 *
 *     Дескриптор пачки всегда находится в начале каждой пачки и иметт
 *  фиксированный размер Как составная часть в него входит дескриптор
 *  обобщенных результатов обмена и он формируется на основе результатов
 *  завершения обмена по данной пачке. На основе значения его полей можно
 *  следить за тем закончен обмен или нет (см. далее описание структуры
 *  обобщенного дескриптора).
 *     Дескрипторы пакетов включенных в обмен формируются в соответствующей
 *  области в том порядке, в котором пакеты и должны выдаваться или приниматься
 *  из канала. Каждый дескриптор содержит время начала исполнения данного
 *  пакета (номер такта Т350 внутри Т1750). Времена исполнения пакетов должны
 *  не убывать. Вслед за последним дескриптром может оставаться пустая
 *  область до начала буферов данных. Размеры этой области не столь велики
 *  чтобы влиять на производительность обмена.
 *     Буфер для каждого пакета имеет свой фиксированный адрес и размер
 *  в области данных и он соответствует относительному номеру пакета
 *  внутри пачки. Потери памяти при неполном заполнении буферов не столь
 *  велики, если учитывать небольшое число пакетов и размер буфера.
 *     Пользовательская информация для каждого пакета формируется исключительно
 *  из потребностей пользовательской программы. Здесь можно разместить либо
 *  адрес некоторого массива, либо указатель на некоторую структуру,
 *  содержащую дополнительную информацию для каждого пакета.
 *            Т Р Е Б О В А Н И Я :
 *     Смещение области для буферов данных и размер буфера должен быть кратен
 *  размеру блока обмена между каналом и основной памятью в режиме DMA.
 *            Р Е К О М Е Н Д А Ц И И :
 *     Описать структуру пачки состоящую из указанных выше областей, где все
 *  они выделены по максимуму и при этои обеспечиваются рекомендации по
 *  выравненности адресов (см. пример описания пачки далее).
 *     Буфера под пачки в необходимом количестве будут выделены при
 *  инициализации режима обменов (открытии канала MCPM, см далее). Указатели
 *  на созданные буфера возвращаются как результат инициализации, ввиде
 *  массива, в котором индекс указателя является номером данной пачки в общем
 *  пуле буферов. Каждый буфер пачки инициализирован как конкретный экземпляр
 *  структуры 'mcpm_iobatch_t' описанной дадее, где максимальное число пакетов
 *  'MCPM_MAX_PACKETS_NUM' и размер буфера данных 'MCPM_MAX_DATA_BUF_SIZE'
 *  полагаются равными значениям поданным в качестве параметров инициализации
 *  канала. В дескрипторе пачки инициализированы все поля с фиксированными и
 *  постоянными значениями, в нулевое состояние установлены дескрипторы пактов
 *  и результатов обмена, а также обобщенный дескриптор результатов. Однако
 *  пользовательская программа может сама переинициализировать необходимые
 *  поля и элементы каждой пачки.
 *     Дальнейшие обмены по пачкам предполагают использование буферов по
 *  круговому алгоритму, т.е, пачки формируются и запускаются последовательно,
 *  начиная с 0-ой, далее 1-ая и так далее по кругу. Сообщать о готовности
 *  новой пачки следует в такте Т1750 предшествующем такту, в котором она
 *  должна исполняться. В одном такте Т1750 может быть запущена только одна
 *  пачка. Сообщить о готовности пачки можно с помощью соответствующей функции
 *  из библотеки 'open_mkb_drv.h'. Драйвер организует предварительную подкачку
 *  пачки в местную память контроллера на фоне обмена по текущей пачке.
 *  Реальный запуск обмена на исполнение в канале начнется в следующем такте
 *  Т1750, а пакеты, составляющие пачку, будут начинать исполняться в
 *  соответствии с временами их пуска, т.е. номерами тактов Т350 внутри Т1750.
 */

/*
 *  Default value of MCPM batch specifications
 *  Значения по умолчанию основных параметров при обменах по пачкам состоящим
 *  из пакетов с требованиями на передачу или прием из канала MCPM
 *  Именно эти значения используются в драйвере MCPM в качестве параметров
 *  пачки и пакетов, если они не указываются явным образом при инициализации
 *  обменов в канале (см. инициализацию режимов обмена далее)
 *  Здесь следует указывать реальные значения параметров, без учета кратности
 *  их или их производных размеру блока обмена в режиме DMA и эти же значения
 *  можно передавать в драйвер при инициализации, поскольку там они будут
 *  приведены в соответствие с необходимой кратностью.
 */

#define	MCPM_MAX_PACKETS_NUM_DEF	2	/* default value of MCPM max */
						/* number of packets in */
						/* I/O operations batch */
						/* максимальное число пакетов */
						/* которое можеть быть в */
						/* одной пачке по умолчанию */

#define	MCPM_DMA_BURST_SIZE_DEF		32	/* default value of MCPM DMA */
						/* burst size for I/O */
						/* operations  */
						/* размер (в байтах) блока */
						/* обмена канала с основной */
						/* памятью в режиме */
						/* непосредственного доступа */
						/* (DMA) по умолчанию */

#define	MCPM_MAX_DATA_BUF_SIZE_DEF	64	/* default value of MCPM max */
						/* size of I/O data buffer */
						/* макимальная длина в байтах */
						/* массива принимаемых или */
						/* передаваемых данных для */
						/* любых пакетов по умолчанию */

#define	MCPM_SUBCLOCKS_NUM		5	/* number of subclocks in */
						/* main clock */
						/* число интервалов Т350 */
						/* вутри основной тактовой */
						/* частоты Т1750 */

/*
 *  Value of MCPM batch main specifications
 *  Значения основных параметров при обменах по пачкам составленным из
 *  пакетов с требованиями на передачу или прием из канала MCPM.
 *  Эти значения могут быть определены и пользователями перед подстановкой
 *  данного заголовочного файла (т.е. перед #include "mcpm_io.h"), если они не
 *  определены, то берутся значения по умолчанию.
 *  Все эти параметры имеют смысл только для структуры пачки описываемой
 *  далее и не влияют на соответствующие умолчания в драйвере (см. выше),
 *  но могут быть переданы в драйвер для динамической настройки при
 *  инициализации обменов в канале (см. инициализацию режимов обмена далее).
 *  Здесь следует указывать реальные значения параметров, без учета кратности
 *  их или их производных размеру блока обмена в режиме DMA и эти же значения
 *  можно передавать в драйвер при инициализации, поскольку там они будут
 *  приведены в соответствие с необходимой кратностью.
 */

#ifndef	MCPM_MAX_PACKETS_NUM
#define	MCPM_MAX_PACKETS_NUM		MCPM_MAX_PACKETS_NUM_DEF
#endif	/* MCPM_MAX_PACKETS_NUM */

#ifndef	MCPM_DMA_BURST_SIZE
#define	MCPM_DMA_BURST_SIZE		MCPM_DMA_BURST_SIZE_DEF
#endif	/* MCPM_DMA_BURST_SIZE */

#ifndef	MCPM_MAX_DATA_BUF_SIZE
#define	MCPM_MAX_DATA_BUF_SIZE		MCPM_MAX_DATA_BUF_SIZE_DEF
#endif	/* MCPM_MAX_DATA_BUF_SIZE */

/*
 *  Convert array of structure elements num to be an even multiple
 *  of alignment of DMA burst size MCPM_DMA_BURST_SIZE
 *  Макрос для преобразования размера массива из элементов некоторой структуры
 *  с учетом кратности блоку обмена в режиме DMA.
 *  nelem - исходное число элементов в массиве
 *  elsize - размер элемента в байтах
 *  off - смещение массива относительно начала области в которой он находится
 *  bsize - размер блока обмена в режиме DMA
 *  результат - скорректированное число элементов в массиве для обеспечения
 *              кратности MCPM_DMA_BURST_SIZE
 */

#define	TO_MCPM_DMA_BURST_SIZE_ALIGN(nelem, elsize, off, bsize) ((((((nelem) * \
		(elsize) + (off) + ((bsize)-1)) / (bsize)) * (bsize)) \
		- (off)) / (elsize))

/*
 *  packet and batch of packets types specifications
 *  Описания типов данных для обменов с использованием пакетов
 *  и пачки пакетов
 */

typedef	char		mcpm_iopack_num_t;	/* number of MCPM packets */
						/* количество пакетов в пачке */
typedef	mcpm_io_op_t	mcpm_iopack_op_t;	/* I/O operation flags */
						/* код операции обмена */
typedef	mcpm_io_word_t	mcpm_iopack_word_t;	/* word of packet data buffer */
						/* тип соответствующий слову */
						/* данных пакетных обменов */
typedef	mcpm_io_size_t	mcpm_iopack_size_t;	/* packet data buffer size */
						/* длина массива данных при */
						/* обменах по пакету */
typedef	u_char		mcpm_iopack_clock_t;	/* clock number (T350) of */
						/* MCPM packets */
						/* номер интервала Т350 */
						/* в котором данный пакет */
						/* должен быть выполнен */

/*
 *  Descriptor of batch of packets of I/O data transfer operation.
 *  Структура дескриптора пачки для обменов с MCPM. 
 *  Дескриптор пачки содержит всю необходимую информацию о пачке, ее
 *  элементах и обобщенный дескриптор результатов обмена по данной пачке.
 *  Он находится в начале каждой пачки и имеет фиксированный
 *  размерu. В дескрипторе пачки пользовательской программе следует лишь
 *  определить значение количества пакетов в конкретной пачке.
 *  Перед стартом каждого обмена драйвером и МП обеспечивается обнуление
 *  полей обобщенного дескриптора результатов, а по завершению обмена они
 *  устанавливаются в соответствующие значения. Это позволяет пользовательской
 *  программе следить за концом обмена по данной пачке на основе значения
 *  признака завершения:
 *
 *	trans_completed
 *
 *  Если значение признака - ненулевое, то обмен завершен.
 */

typedef struct mcpm_iobatdesc {			/* I/O batch descroptor */
						/* дескриптор пачки */
	mcpm_iopack_num_t
			packet_num;		/* number of packets in the */
						/* batch */
						/* количество пакетов в пачке */
						/* динамическое поле должно */
						/* всякий раз определяться */
						/* пользователем при */
						/* формировании пачки */
	mcpm_iopack_num_t
			batch_num;		/* number of batch buffer */
						/* номер буфера пачки */
                                                /* присваивается драйвером */
						/* при создании буфера пачки */
						/* и не должно изменяться */
	mcpm_iopack_num_t
			real_packet_num;	/* number of real serviced */
						/* packets in the batch */
						/* количество реально */
						/* исполненных пакетов из */
						/* пачки */
	mcpm_drv_err_t	common_error_code;      /* I/O transfer common error */
						/* code detected by driver */
						/* общий для всей пачки код */
						/* ошибки обмена */
						/* обнаруженной драйвером */
						/* (программная ошибка) */
	u_short		trans_num;		/* unique number of transfer */
						/* associated with batch */
						/* уникальный номер пакетного */
						/* обмена */
	u_short		trans_completed;	/* batch transfer with buf is */
						/* completed */
						/* признак того, что обмен */
						/* по данной пачке выполнен */
} mcpm_iobatdesc_t;

/*
 *  MCPM physical packet of I/O operation (batch item)
 *  Структура дескриптора пакета из которых состоит пачка.
 *  Данная структура включает в себя описание заявки на обмен, а также поля
 *  результатов его исполнения, т.е. дескриптор результатов обмена для пакета.
 *  Для групповой команды адрес ОУ должен быть равен 31.
 */

typedef struct mcpm_iopack_desc {		/* I/O packet descriptor */
						/* структура дескриптора */
						/* пакета из которых */
						/* образуется пачка для */
						/* обмена физического уровня */
	mcpm_dev_num_t	device;			/* device number description */
						/* полный номер устройства */
	mcpm_iopack_size_t
			data_size;		/* byte size of transfered */
						/* packet data buffer */
						/* длина в байтах массива */
						/* данных передаваемых или */
						/* принимаемых из канала по */
						/* данному пакету */
	mcpm_drv_err_t	drv_error_code;		/* I/O transfer code of error */
						/* detected by driver */
						/* код ошибки обмена */
						/* обнаруженной драйвером */
						/* (программная ошибка) */
	mcpm_bcw_t	channel_check_word;	/* MCPM channel hardware  */
						/* built-in check word state */
						/* слово встроенного */
						/* аппаратного контроля */
						/* (аппаратный контроль при */
						/* обмене с каналом) */

	mcpm_iopack_op_t	io_flags;	/* I/O operation flags */
						/* (MCPM_READ / MCPM_WRITE) */
						/* код операции обмена с */
						/* устройством */
	mcpm_iopack_clock_t	clock_num;	/* clock number (T350) of */
						/* MCPM packets */
						/* номер интервала Т350 */
						/* в котором данный пакет */
						/* должен быть выполнен */
} mcpm_iopack_desc_t;

/*
 *  MCPM data buffer of packet of I/O operation
 *  Структура буфера данных пакетного обмена
 *  Буфер данных представляет собой обычный массив и в данной структуре он
 *  представлен ввиде об'единения массивов разных форматов,
 *  Размер буфера при необходимости корректируется для обеспечения
 *  кратности блоку обмена в режиме DMA.
 */

typedef union mcpm_iopack_buf {			/* I/O packet data buffer */
						/* структура буфера данных */
						/* пакета обмена */
	mcpm_iopack_word_t			/* as array of MCPM channel */
						/* words */
						/* массив слов данных пакета */
						/* слово в смысле канала MCPM */
						/* (2 байта, 16 бит) */
		words[TO_MCPM_DMA_BURST_SIZE_ALIGN(MCPM_MAX_DATA_BUF_SIZE /
				sizeof(mcpm_iopack_word_t),
			sizeof(mcpm_iopack_word_t), 0, MCPM_DMA_BURST_SIZE)];
	u_long					/* as array of main memory */
						/* long words (int) */
						/* массив слов основной */
						/* памяти (4 байтаб 32 бит) */
		longs[TO_MCPM_DMA_BURST_SIZE_ALIGN(MCPM_MAX_DATA_BUF_SIZE /
			sizeof(u_long), sizeof(u_long), 0,
			MCPM_DMA_BURST_SIZE)];
	u_char					/* as array of bytes */
						/* массив байтов */
		bytes[TO_MCPM_DMA_BURST_SIZE_ALIGN(MCPM_MAX_DATA_BUF_SIZE,
			sizeof(u_char), 0, MCPM_DMA_BURST_SIZE)];
} mcpm_iopack_buf_t;

/*
 *  Structure of batch of I/O operation packets
 *  Описания структуры пачки для пакетных обменов с MCPM
 *  Область для дескрипторов пачки, пакетов и для буферов данных отводится в
 *  структуре обязательно с учетом кратности блоку обмена в режиме DMA.
 *  Данное описание можно использовать и как пример для собственной
 *  структуры пачки, но с учетом всех требований для организации пачки и
 *  и его компанет изложенных выше
 *  Драйвер создает и инициализирует общие буфера пачек как конкретные
 *  экземпляры именно данной структуры. При этом в дескрипторе пачки
 *  инициализированы все поля с фиксированными и постоянными значениями, в
 *  нулевое состояние установлены дескрипторы пактов и результатов обмена, а
 *  также обобщенный дескриптор результатов.
 */

typedef struct mcpm_iobatch {		/* batch of I/O operation packets */
					/* структура пачки для пакетных */
					/* обменов */
	mcpm_iobatdesc_t
		batch_desc;		/* descriptor of batch */
					/* дескриптор пачки */

	mcpm_iopack_desc_t		/* descriptors of packets area */
					/* область дескрипторов пакетов */
					/* составляющих пачку */
		packets[TO_MCPM_DMA_BURST_SIZE_ALIGN(MCPM_MAX_PACKETS_NUM,
			sizeof(mcpm_iopack_desc_t), sizeof(mcpm_iobatdesc_t),
			MCPM_DMA_BURST_SIZE)];

	mcpm_iopack_buf_t		/* area of data buffers to write */
					/* область буферов данных пакетов */
					/* для приема и передачи в канал */
		data_bufs[MCPM_MAX_PACKETS_NUM];

	void				/* "opaque" user private area */
					/* область пользовательской */
					/* информации об обмене для каждого */
					/* пакета составляющего пачку */
		*private_area[
			TO_MCPM_DMA_BURST_SIZE_ALIGN(MCPM_MAX_PACKETS_NUM,
				sizeof(void *), 0, MCPM_DMA_BURST_SIZE)];
} mcpm_iobatch_t;

/*
 *  MCPM I/O operation request specifications. The request consist of
 *  packets, Any packet points virtual address of arbitrary I/O data buffer.
 *  I/O operation results area for each packet pointed by own virtual address
 *  Синхронные и асинхронные обмены с каналои MCPM в защищенном режиме с
 *  использованием буферов драйвера и контролем завершения и результатов
 *  обмена по каждой пачке.
 */

/*
 *  Batch of packets of I/O data transfer operation common results
 *  Описание структуры обобщенных результатов исполнения пачки пакетных
 *  обменов
 */

typedef	struct mcpm_iobatinfo			/* single I/O data transfer  */
						/* operation results info */
						/* результаты обычного обмена */
{
	u_short		trans_num;		/* unique number of transfer */
						/* associated with batch */
						/* уникальный номер пакетного */
						/* обмена */
	mcpm_drv_err_t	common_error_code;      /* I/O transfer common error */
						/* code detected by driver */
						/* общий для всей пачки код */
						/* ошибки обмена */
						/* обнаруженной драйвером */
						/* (программная ошибка) */
	u_char		board_error_code;	/* the MCPM board internal */
						/* register of error state */
						/* состояние регистра ошибок */
						/* модуля (РОШ) */
						/* (аппаратный контроль при */
						/* обменах с шиной) */
	mcpm_iopack_num_t
			real_packet_num;	/* number of real serviced */
						/* packets in the batch */
						/* количество реально */
						/* исполненных пакетов из */
						/* пачки */
	int		trans_errno;		/* value of errno for I/O */
						/* request, if zero then no */
						/* errors detected */
						/* обобщенный код ошибки */
						/* обмена, значение */
						/* переменной errno в которое */
						/* она устанавливается по */
						/* окончании обмена */
						/* если код - нулевой, то */
						/* никаких ошибок неn */
	hrtime_t	req_receive_time;	/* transfer request receiving */
						/* time (from uxer) */
						/* время получения запроса */
						/* на обмен драйвером */
	hrtime_t	intr_transfer_end;	/* interrupt on transfer end */
						/* on SPARC */
						/* время получения пр-ия от */
						/* МП о завершении обмена */
	hrtime_t	transfer_start;		/* transfer start time on */
						/* SPARC */
						/* время старта обмена (пуск */
						/* МП на исполнение) */
	hrtime_t	transfer_finish;	/* transfer finish time on */
						/* SPARC */
						/* время завершения обмена в */
						/* драйвере (далее только */
						/* возврат в пользователя) */
	hrtime_t	event_start_time;	/* some event start time */
						/* время старта некоторого */
						/* события в драйвере */
						/* (используется для замеров */
						/* при отладке и оптимизации) */
	hrtime_t	event_end_time;		/* some event end time */
						/* время конца некоторого */
						/* события в драйвере */
						/* (используется для замеров */
						/* при отладке и оптимизации) */
} mcpm_iobatinfo_t;

/*
 *  Specifications of batch of I/O data transfer operation packets.
 *  Структура описателя операции обмена по пачке составленной из пакетов
 *  конкретных требований на прием и передачу данных
 *  Описатель является основной структурой для исполнения обмена с
 *  каналом-контроллером
 */

typedef struct mcpm_iobatspec {			/* batch of I/O data transfer */
						/* specifications */
	mcpm_iobatdesc_t
			batch;			/* the batch descroptor */
						/* дескриптор пачки */
	int		async_trans;		/* asynchronous transfer mode */
						/* признак асинхронного */
						/* режима обмена */
	int		timer_interval;		/* timer interval of waiting */
						/* for I/O batch end */
						/* интервал времени ожидания */
						/* завершения пачки обменов */
	mcpm_iobatinfo_t
			*common_results;	/* I/O batch common results */
						/* указатель на структуру для */
						/* записи информации об общих */
						/* результатах обмена по */
						/* данной пачке */
						/* может быть и NULL */
} mcpm_iobatspec_t;

typedef struct ctrl_com_result {    	/* results of control command */
					/* результат завершения команды */
				     /* управления в контроллере и оконечнике */
	u_char	mp_error_code;		/* I/O transfer code of error */
					/* detected by MP driver */
	u_char	channel_num;		/* channel number */
	mcpm_io_word_t  ctrl_command;	/* command word */
					/* командное слово */
	u_char		lost_commands;	/* число завершенных, но */
					/* необработанных команд */
	u_char		data_presence;	/* 1 - команда со словом данных, */
					/* 0 - без и следующий элемент имеет */
					/* неопределенное значение */
	mcpm_io_word_t  data_word;	/* word of data */
					/* слово данных */
	mcpm_io_word_t  answer_word;	/* answer word */
					/* ответное слово, имеет определенное */
					/* значение только в контроллере */
					/* только для негрупповых команд */
	mcpm_io_word_t  vsk_word;	/* vsk */
					/* слово ВСК */
} ctrl_com_result_t;

/*
 *  Optimum default value of batch transfer specifications
 */

#define	MCPM_BATCH_TRANS_TIMER_DEF	2000000	/* timer interval of waiting */
						/* for I/O transfer end (usec)*/


/*
 *  MCPM-device I/O operation map specifications
 *  Структуры и описания типов данных для обменов с использованием карты
 *  обменов (обмены в режиме оконечника)
 */

/*
 *  MCPM device I/O operation specifications.
 *  При обменах с каналом MCPM, работающим в режиме оконечника используется
 *  карта обменов. Элементами карты являются подустройства, которые
 *  задействованы для конкретного оконечника. Каждый из них имеет собственный
 *  номер и тип - приемник или передатчик. Подустройство с одним номером может
 *  быть и приемником, и передатчиком, в любом случае они рассматриваются как
 *  независимые и каждый является полноценным элементом карты обменов.
 *  Для организации обменов с любым подустройством используются буфера имеющие
 *  следующую структуру:
 *                        ____________________________________
 *   mcpm_iosubd_desc ->  |     заголовок буфера обмена      |
 *                        |      (содержит дескриптор        |
 *                        |       результатов обмена)        |
 *                        |                                  |
 *                        |----------------------------------|
 *   mcpm_data_buf    ->  |      буфер принимаемых из        |
 *                        |     канала или передаваемых      |
 *                        |        в канал данных            |
 *                        |                                  |
 *                        |                                  |
 *                        |                                  |
 *                        |                                  |
 *                        |                                  |
 *                        |                                  |
 *                        |                                  |
 *                        |                                  |
 *                        |__________________________________|
 *
 *     Заголовок буфера обмена является обязательным элементом каждого буфера,
 *  находится в его начале, содержит некоторую информацию об обмене и его
 *  результатах и имеет фиксированный размер - 8 слов (32 байта) что совпадает
 *  с размером блока обмена между каналом и основной памятью в режиме
 *  непосредственного доступа (DMA). Непосредственно данные принятые из канала
 *  принятые из канала или передаваемые в канал следуют вслед за заголовком.
 *  На основе значения полей дескриптора результатов можно следить за тем
 *  закончен обмен или нет (см. далее описание структуры заголовка).
 *     Пример описания такого рода структуры приведен ниже и рекомендуется для
 *  использован в пользовательских программах, поскольку такая же структура
 *  буфера используется в драйвере и библиотечных функциях 'open_mcpm_drv.h'.
 *     Буфера обменов для всех подустройств, составляющих карту обменов с
 *  каналом, в необходимом количестве будут выделены при инициализации режима
 *  обменов (открытии канала MCPM в режиме оконечника, см далее). Указатели
 *  на созданные буфера карты работ возвращаются как результат инициализации,
 *  ввиде массива, в котором индекс указателя является номером данного буфера
 *  в общем пуле буферов. Буфер карты обменов представляет собой массив
 *  буферов для всех подустройств. Для каждого подустройства отведены по два
 *  буфера - для приемника и для оконечника. Индекс буфера в обмещ массиве
 *  карты обменов совпадает с номером подустройства. Каждый буфер обмена
 *  подустройства инициализирован как конкретный экземпляр структуры
 *  'mcpm_iosubdbuf_t' описанной далее, где размер буфера данных
 *  'MCPM_MAX_DATA_BUF_SIZE' полагаются равными значению поданному в
 *  качестве параметра инициализации канала. В заголовке буфера установлены
 *  в соответствующие значения все фиксированные поля и в начальное
 *  (нулевое) состояние - поля дескриптора результатов обмена (см. далее
 *  описание заголовка, где для каждого поля указано каким образом и кем оно
 *  инициализируется).
 *  При реальной работе с оконечником следует использовать один неподменяемый
 *  буфер обмена для каждого подустройства. После инициализации канала и
 *  создания буферов подустройств пользовательская программа должна с помощью
 *  соответствующих библиотечных функций запросить для каждого подустройства,
 *  обмен с которым предусмотрен для данного оконечника, созданный буфер обмена,
 *  установить в нем поля описывающие непосредственно заявку на обмен (в
 *  основном это размер обмена) и включить его в карту обменов, как активный
 *  его элемент. С этого момента данное подустройство считается готовым к
 *  обменам и в случае прихода из канала заявки на данное подустройство, она
 *  исполняется в соответствии с установленными в заголовке буфера значениями
 *  параметров обмена.
 *
 *  Кроме того существует два тестовых режима использования подустройств:
 *     с автоматическим переключением буферов после завершения обменов и
 *     с управляемым переключением на новый буфер.
 *     В автамитечском режиме все буфера подустройства становятся активными и
 *  каждый новый обмен происходит со следующим буфером по круговому алгоритму,
 *  а при запросе выполненных обменов выдаются все завершеннык на даннвй
 *  момент обмены по подустройству.
 *     В режиме с управлением после инициализации канала и создания буферов
 *  подустройств пользовательская программа должна с помощью соответствующих
 *  библиотечных функций запросить для каждого подустройства, обмен с которым
 *  предусмотрен для данного оконечника, первый из созданных буферов обмена,
 *  установить в нем поля описывающие непосредственно заявку на обмен (в
 *  основном это размер обмена) и включить его в карту обменов, как активный
 *  его элемент. С этого момента данное подустройство считается готовым к
 *  обменам и в случае прихода из канала заявки на данное подустройство, она
 *  исполняется в соответствии с установленными значениями полей заголовка.
 *  В дальнейшем можно запрашивать следующий буфер, инициализировать его и
 *  подменять текущий. Буфера используются по круговому алгоритму. До тех пор
 *  пока буфер для конкретного подустройства не изменен, все приходящие из
 *  канала заявки к данному подустройству выполняются с текущим установленным
 *  буфером.
 *     Соответствующая библиотечная функция позволяет следить за выполненными
 *  обменами и выдает указатель на массив буферов подустройств, обмен с
 *  которыми завершен после последнего подобного запроса. Для всех приемников
 *  рекомендуется применять автоматический режим перключения на новые буфера
 *  или подменить буфер приема и только после этого разбираться с содержимым
 *  завершенных. Это гарантирует то, что в момент обработки его содержимого в
 *  него не будет приниматься новые данные и не будет возникать смешивание
 *  двух разных массивов данных обмена.
 *  Для передатчиков тем более правильно: запросить следующий буфер,
 *  подготовить его содержимон и в нужный момент подменить им текущий.
 */

/*
 *  MCPM subdevice buffer of I/O operation descriptor (transfer map item)
 *  Структура дескриптора буфера подустройства (заголовок буфера обмена), из
 *  которых состоит карта обменов для оконечника канала MCPM. 
 *  Данная структура включает в себя описание заявки на обмен, а также поля
 *  результатов его исполнения, т.е. дескриптор результатов обмена.
 *  Заголовок буфера обмена является обязательным элементом каждого буфера
 *  подустройств, находится в его начале и должен иметь фиксированный
 *  размер - 8 слов (32 байта) что совпадает с размером блока обмена между
 *  каналом и основной памятью в режиме непосредственного доступа (DMA).
 *  В связи с этим структура дополняется до 8 слов неиспользуемыми полями.
 *  Непосредственно данные принятые из канала или передаваемые в канал следуют
 *  вслед за заголовком.
 *  На основе значения полей дескриптора результатов можно следить за тем
 *  закончен обмен или нет.
 *  После завершения очередного обмена с данным буфером должен обнуляться
 *  признак завершения обмена с буфером, что обеспечивает библиотечная функция
 *  ожидания завершения обменов в оконечнике из 'open_mcpm_drv.h', и при этом
 *  поля дескриптора результатов установлены в соответствующие значения.
 *  Это позволяет пользовательской или библотечной функции следить за концом
 *  обмена с данным буфером на основе значения признака:
 *	trans_completed
 *  Если признак - ненулевое, то обмен завершен.
 *  Счетчик обменов 'trans_counter' содержит всегда число обменов которое было
 *  выполнено с данным буфером после того как он был подан для обменов с
 *  подустройством и до подмены на другой. Это позволяет контролировать
 *  сколько же реально обменов произошло по данной заявке и не были ли
 *  потеряны некоторые из них.
 */

typedef struct mcpm_iosubd_desc {		/* I/O transfer descriptor */
						/* структура дескриптора */
						/* буфера обмена */
						/* подустройства */
	mcpm_bcw_t	channel_check_word;	/* MCPM channel hardware  */
						/* built-in check word state */
						/* слоао встроеннолго */
						/* аппаратного контроля */
						/* (аппаратный контроль при */
						/* обмене с каналом) */
	u_char		board_error_code;	/* the MCPM board internal */
						/* register of error state */
						/* состояние регистра ошибок */
						/* модуля (РОШ) */
						/* (аппаратный контроль при */
						/* обменах с шиной) */
	mcpm_drv_err_t	drv_error_code;		/* I/O transfer code of error */
						/* detected by driver */
						/* код ошибки обмена */
						/* обнаруженной драйвером */
						/* (программная ошибка) */
	u_short		trans_num;		/* unique number of transfer */
						/* associated with batch */
						/* уникальный номер обмена */
						/* с данным подустройством */
	char		trans_counter;		/* counter of transfers */
						/* with this buf of subdevice */
						/* счетчик обменов с данным */
						/* буфером подустройства */
						/* обнуляется перед тем, как */
						/* данный буфер подается для */
						/* обменов с подустройством */
						/* и увеличивается после */
						/* каждого выполненного */
						/* обмена по данной заявке */
	u_char		trans_completed;	/* subdevice transfer with */
						/* buf is completed */
						/* признак того, что обмен */
						/* по данной заявке выполнен */
	mcpm_ccw_t	control_word;		/* the channel control word */
						/* received from channel */
						/* командное слово полученное */
						/* из канала при запуске */
						/* с подустройством */
	short		real_byte_size;		/* byte size of actually */
						/* transfered by subdevice */
						/* размер обмена: реальное */
						/* кол-во переданных или */
						/* принятых байтов */
	mcpm_io_word_t	data_word;		/* слово данных, полученное */
						/* с командой управления */
	u_short		unused_word3;		/* unused word of structure */
						/* добавлено для того чтобы */
						/* размер структуры был */
						/* фиксирован - 8 слов */
	mcpm_io_op_t	io_flags;		/* I/O operation flags */
						/* (MCPM_IO_READ или */
						/* MCPM_IO_WRITE) */
						/* код операции обмена */
                                                /* присваивается драйвером */
						/* при создании буфера */
						/* и не должен изменяться */
	mcpm_iodev_num_t
			sub_addr;		/* subaddress of device */
						/* номер подустройства */
						/* присваивается драйвером */
						/* при создании буфера */
						/* и не должен изменяться */
	char		buf_num;		/* number of subdevice buffer */
						/* номер буфера обмена */
						/* подустройства */
                                                /* присваивается драйвером */
						/* при создании буфера */
						/* и не должно изменяться */
	mcpm_io_size_t	data_size;		/* byte size of transfered */
						/* data by subdevice */
						/* длина в байтах массива */
						/* данных передаваемых или */
						/* принимаемых из канала для */
						/* данного подустройства */
						/* должно устанавливаться */
						/* пользовательской */
						/* программой при подготовке */
						/* по данному буферу */
	void		*private_info;		/* "opaque" user private area */
						/* пользовательская */
						/* информации об обмене для */
						/* подустройства */
	hrtime_t	drv_time;
/*	long		unused_word6;	*/	/* unused word of structure */
						/* добавлено для того чтобы */
						/* размер структуры был */
						/* фиксирован - 8 слов */
/*	long		unused_word7;	*/	/* unused word of structure */
						/* добавлено для того чтобы */
						/* размер структуры был */
						/* фиксирован - 8 слов */
} mcpm_iosubd_desc_t;

/*
 *  MCPM data buffer of subdevice I/O operation
 *  Структура буфера данных для обмена с подустройством
 *  Буфер данных представляет собой обычный массив и в данной структуре он
 *  представлен ввиде об'единения массивов разных форматов,
 *  Размер буфера при необходимости корректируется для обеспечения
 *  кратности блоку обмена в режиме DMA.
 */

typedef union mcpm_data_buf {			/* I/O packet data buffer */
						/* структура буфера данных */
						/* подустройства */
	mcpm_io_word_t				/* as array of MCPM channel */
						/* words */
						/* массив слов данных обмена */
						/* слово в смысле канала MCPM */
						/* (2 байта, 16 бит) */
		words[TO_MCPM_DMA_BURST_SIZE_ALIGN(MCPM_MAX_DATA_BUF_SIZE /
				sizeof(mcpm_io_word_t),
			sizeof(mcpm_io_word_t), 0, MCPM_DMA_BURST_SIZE)];
	u_long					/* as array of main memory */
						/* long words (int) */
						/* массив слов основной */
						/* памяти (4 байтаб 32 бит) */
		longs[TO_MCPM_DMA_BURST_SIZE_ALIGN(MCPM_MAX_DATA_BUF_SIZE /
			sizeof(u_long), sizeof(u_long), 0,
			MCPM_DMA_BURST_SIZE)];
	u_char					/* as array of bytes */
						/* массив байтов */
		bytes[TO_MCPM_DMA_BURST_SIZE_ALIGN(MCPM_MAX_DATA_BUF_SIZE,
			sizeof(u_char), 0, MCPM_DMA_BURST_SIZE)];
} mcpm_data_buf_t;

/*
 *  Structure of subdevice I/O operation buffer
 *  Описания структуры буфера обмена для подустройств оконечника MCPM
 *  Данное описание можно использовать и как пример для собственной
 *  структуры пачки, но с учетом всех требований для организации буфера
 *  подустройства и его компанет изложенных выше.
 *  Драйвер создает и инициализирует общие буфера подустройств как конкретные
 *  экземпляры именно данной структуры. При этом в заголовке буфера
 *  инициализированы все поля с фиксированными и постоянными значениями, в
 *  нулевое состояние установлены результатов обмена.
 */

typedef struct mcpm_iosubdbuf {		/* subdevice buffer of I/O operation */
					/* структура буфера обменов для */
					/* подустройства оконечника */
	mcpm_iosubd_desc_t
		buf_desc;		/* descriptor of buffer */
					/* дескриптор буфера и результатов */

	mcpm_data_buf_t			/* data buffer to read or to write */
					/* область буфера данных для приема */
					/* или передачи в канал */
		data_buf;

} mcpm_iosubdbuf_t;

/*
 *  Subdevice buffer of I/O operations map
 *  Описания структуры элемента карты обменов оконечника MCPM - подустройства.
 *  Каждое подустройство описывается как пара буферов обмена - буфер приемника
 *  и буфер передатчика.
 *  Дапная структура является внутренним представлением карты обменов
 *  оконечника и на пользователя непосредственно не выходит.
 */

typedef struct mcpm_iomap_subd {	/* subdevice buffer of I/O operation */
					/* map */
					/* структура элемента карты обменов */
					/* оконечника MCPM - подустройства */
	mcpm_iosubdbuf_t	write;	/* buffer of transmitter */
					/* буфер передатчика */
	mcpm_iosubdbuf_t	read;	/* buffer of receiver */
					/* буфер приемника */

} mcpm_iomap_subd_t;

/*
 *  MCPM device I/O operations map
 *  Описания карты обменов оконечника MCPM - массив буферов всех подустройств.
 *  Дапная структура является внутренним представлением карты обменов
 *  оконечника и на пользователя непосредственно не выходит.
 */

typedef mcpm_iomap_subd_t		mcpm_iomap_t;

/*
 *  MCPM device I/O operation request specifications. 
 *  Синхронные и асинхронные обмены с каналои MCPM в режиме оконечника в
 *  защищенном режиме с использованием буферов драйвера и контролем
 *  завершения и результатов обмена по каждому подустройству.
 */

/*
 *  Batch of packets of I/O data transfer operation common results
 *  Описание структуры дескриптора результатов исполнения обмена для
 *  подустройства из общей карты обменов оконечника.
 */

typedef	struct mcpm_iosubdinfo			/* subdevice of transfer map */
						/* I/O operation results info */
						/* результаты обмена */
						/* для подадреса */
{
	u_short		trans_num;		/* unique number of transfer */
						/* associated with it */
						/* уникальный номер обмена */
						/* для данного подустройства */
	mcpm_drv_err_t	drv_error_code;         /* I/O transfer code of error */
						/* detected by driver */
						/* код ошибки обмена */
						/* обнаруженной драйвером */
						/* (программная ошибка) */
	mcpm_bcw_t	channel_check_word;	/* MCPM channel hardware  */
						/* built-in check word state */
						/* слоао встроеннолго */
						/* аппаратного контроля */
						/* (аппаратный контроль при */
						/* обмене с каналом) */
	u_char		board_error_code;	/* the MCPM board internal */
						/* register of error state */
						/* состояние регистра ошибок */
						/* модуля (РОШ) */
						/* (аппаратный контроль при */
						/* обменах с шиной) */
	size_t		real_byte_size;		/* byte size of actually */
						/* transfered */
						/* set by driver and return */
						/* as I/O operation result */
						/* размер обмена: реальное */
						/* кол-во переданных или */
						/* принятых байтов */
	int		trans_errno;		/* value of errno for I/O */
						/* request, if zero then no */
						/* errors detected */
						/* обобщенный код ошибки */
						/* обмена, значение */
						/* переменной errno в которое */
						/* она устанавливается по */
						/* окончании обмена */
						/* если код - нулевой, то */
						/* никаких ошибок неn */
	hrtime_t	req_receive_time;	/* transfer request receiving */
						/* time (from uxer) */
						/* время получения запроса */
						/* на обмен драйвером */
	hrtime_t	intr_transfer_end;	/* interrupt on transfer end */
						/* on SPARC */
						/* время получения пр-ия от */
						/* МП о завершении обмена */
	hrtime_t	transfer_start;		/* transfer start time on */
						/* SPARC */
						/* время старта обмена (пуск */
						/* МП на исполнение) */
	hrtime_t	transfer_finish;	/* transfer finish time on */
						/* SPARC */
						/* время завершения обмена в */
						/* драйвере (далее только */
						/* возврат в пользователя) */
	hrtime_t	event_start_time;	/* some event start time */
						/* время старта некоторого */
						/* события в драйвере */
						/* (используется для замеров */
						/* при отладке и оптимизации) */
	hrtime_t	event_end_time;		/* some event end time */
						/* время конца некоторого */
						/* события в драйвере */
						/* (используется для замеров */
						/* при отладке и оптимизации) */
} mcpm_iosubdinfo_t;

/*
 *  Specifications of I/O operation of subdevice of transfer map
 *  Структура описателя обмена для подадреса мз общей карты обменов
 */

typedef struct mcpm_iosubdspec
{
	caddr_t		buf_base;		/* memory data buffer base */
						/* address */
						/* базовый адрес массива */
						/* обмена */
	mcpm_io_size_t	buf_byte_size;		/* byte size of transfered */
						/* data array */
						/* размер массива обмена в */
						/* байтаъ */
	mcpm_io_op_t	io_flags;		/* I/O operation flags */
						/* (MCPM_READ / MCPM_WRITE) */
						/* код операции обмена, */
	mcpm_iodev_num_t
			sub_addr;		/* subaddress of device */
						/* номер подустройства */
	mcpm_iosubdinfo_t
			*trans_res_info;	/* transfer results info */
						/* указатель на структуру для */
						/* записи информации о */
						/* результатах обмена */
						/* может быть и NULL */
} mcpm_iosubdspec_t;


/*
 *  MCPM I/O operation in the test mode specifications
 *  Структуры и описания типов данных для обменов в тестовом режиме
 *  (обмены как для оконечника, так и для контроллера)
 */


/*
 *  Results of simple I/O transfer in the test mode
 *  Описание структуры результатов исполнения одиночной операции
 *  обмена в тестовом режиме
 */

typedef	struct mcpm_iotrinfo			/* single I/O data transfer  */
						/* operation results info */
						/* результаты обычного обмена */
						/* в тестовом режиме */
{
	u_short		trans_num;		/* unique number of transfer */
						/* associated with it */
						/* уникальный номер обмена */
	mcpm_drv_err_t	drv_error_code;         /* I/O transfer code of error */
						/* detected by driver */
						/* код ошибки обмена */
						/* обнаруженной драйвером */
						/* (программная ошибка) */
	mcpm_bcw_t	channel_check_word;	/* MCPM channel hardware  */
						/* built-in check word state */
						/* слоао встроеннолго */
						/* аппаратного контроля */
						/* (аппаратный контроль при */
						/* обмене с каналом) */
	u_char		board_error_code;	/* the MCPM board internal */
						/* register of error state */
						/* состояние регистра ошибок */
						/* модуля (РОШ) */
						/* (аппаратный контроль при */
						/* обменах с шиной) */
	size_t		real_byte_size;		/* byte size of actually */
						/* transfered */
						/* set by driver and return */
						/* as I/O operation result */
						/* размер обмена: реальное */
						/* кол-во переданных или */
						/* принятых байтов */
						/* этоже значение */
						/* вырабатывается как */
						/* результат обмена, если нет */
						/* ошибок */
	int		trans_errno;		/* value of errno for I/O */
						/* request, if zero then no */
						/* errors detected */
						/* обобщенный код ошибки */
						/* обмена, значение */
						/* переменной errno в которое */
						/* она устанавливается по */
						/* окончании обмена */
						/* если код - нулевой, то */
						/* никаких ошибок неn */
	int		burst_byte_size;        /* used I/O transfer burst */
						/* bytes size */
						/* размер блоков данных */
						/* использованный для */
						/* DMA обменов */
	hrtime_t	req_receive_time;	/* transfer request receiving */
						/* time (from uxer) */
						/* время получения запроса */
						/* на обмен драйвером */
	hrtime_t	intr_transfer_end;	/* interrupt on transfer end */
						/* on SPARC */
						/* время получения пр-ия от */
						/* МП о завершении обмена */
	hrtime_t	transfer_start;		/* transfer start time on */
						/* SPARC */
						/* время старта обмена (пуск */
						/* МП на исполнение) */
	hrtime_t	transfer_finish;	/* transfer finish time on */
						/* SPARC */
						/* время завершения обмена в */
						/* драйвере (далее только */
						/* возврат в пользователя) */
	hrtime_t	event_start_time;	/* some event start time */
						/* время старта некоторого */
						/* события в драйвере */
						/* (используется для замеров */
						/* при отладке и оптимизации) */
	hrtime_t	event_end_time;		/* some event end time */
						/* время конца некоторого */
						/* события в драйвере */
						/* (используется для замеров */
						/* при отладке и оптимизации) */
} mcpm_iotrinfo_t;

/*
 *  Specifications of single I/O data transfer operation in the test mode
 *  Структура описателя обычной (одиночной) операции обмена в тестовом режиме
 */

typedef struct mcpm_iotrspec
{
	caddr_t		buf_base;		/* memory data buffer base */
						/* address */
						/* базовый адрес массива */
						/* обмена */
	mcpm_io_size_t	buf_byte_size;		/* byte size of transfered */
						/* data array */
						/* размер массива обмена в */
						/* байтаъ */
	mcpm_io_op_t	io_flags;		/* I/O operation flags */
						/* (MCPM_READ / MCPM_WRITE) */
						/* код операции обмена, */
	int		async_trans;		/* asynchronous transfer mode */
						/* признак асинхронного */
						/* режима обмена */
	int		io_mode_flags;		/* I/O mode flags */
						/* (DMA_TRANSFER_IO_MODE ...) */
						/* режим исполнения обмена: */
						/* (DMA_TRANSFER_IO_MODE ...) */
	int		burst_sizes;		/* allowed burst sizes for */
						/* DMA transfer */
						/* маска допустимыъ размеров */
						/* блоков для DMA-обменов */
	int		timer_interval;		/* timer interval of waiting */
						/* for I/O transfer end */
						/* интервал времени ожидания */
						/* завершения операции обмена */
	int		cntr_flag;		/* channel is inited as */
						/* controller (if flag == 0 */
						/* then as device) */
						/* признак того, что канал */
						/* является контроллером, */
						/* если 0, то оконечник */
	mcpm_iodev_num_t
			device_num;		/* device # description */
						/* (only as controller use */
						/* of channel is needed */
						/* номер устройства */
						/* необходим только при */
						/* обмене с контроллером */
	mcpm_iodev_num_t
			subdevice_num;		/* subdevice # description */
						/* (only as controller use */
						/* of channel is needed */
						/* номер подустройства */
						/* необходим только при */
						/* обмене с контроллером */
	mcpm_iotrinfo_t	*trans_res_info;	/* transfer results info */
						/* указатель на структуру для */
						/* записи информации о */
						/* результатах обмена */
						/* может быть и NULL */
} mcpm_iotrspec_t;

/*
 *  Optimum default value of transfer specifications
 *  Оптимальные значения по умолчанию некоторых параметров обмена
 */

#define	MCPM_TRANS_TIMER_INTERVAL_DEF	2000000	/* timer interval of waiting */
						/* for I/O transfer end (usec)*/
						/* интервал времени ожидания */
						/* завершения операции обмена */

/*
 *  MCPM board channel I/O transfer state initialization
 *  Инициализации режима обменов с модулем и каналом
 */


/*
 *  MCPM board batch of I/O data transfer operation packets state
 *  initialization
 *  Структура параметров инициализации режима обменов для MCPM
 *  Описание структуры параметров инициализации канала в режиме пакетных
 *  обменов, где каждый обмен представляет собой пачку пакетов с требованиями
 *  на прем или передачу данных через канал.
 *  Данный режим возможен только для канала работающего как контроллер.
 */

typedef struct mcpm_init_batch {		/* MCPM init transfer state */
						/* specifications */
	mcpm_iopack_num_t
			max_packets_num;	/* max number of packets in */
						/* I/O operations batch */
						/* максимальное число пакетов */
						/* которое может быть в одной */
						/* пачке (реальное число */
						/* без учета кратности DMA) */
	mcpm_iopack_size_t
			max_data_buf_size;	/* max size of I/O data */
						/* buffer */
						/* максимальный размер */
						/* массива обмена для одного */
						/* пакета (реальный размер */
						/* без учета кратности DMA) */
	int		buf_num;		/* # of buffers for I/O data */
						/* transfer */
						/* количество буыеров пачек */
						/* для обменов с каналом */
	u_long		timer_interval;		/* hangup of channel I/O */
						/* transfer timer interval */
						/* (usec) */
						/* значение таймера для */
						/* программного контроля */
						/* зависания обменов */
						/* при работе с каналом */
						/* (в микросекундах) */
	int		poll_mode_flag;		/* poll mode: transfer finish */
						/* must be polled */
						/* признак режима опроса */
						/* завершения очередного */
						/* обмена: в этом случае */
						/* возможен запуск poll() для */
						/* ожидания завершения */
						/* очередного обмена */
	int		async_start_mode;	/* asynchronous start of */
						/* batch mode */
						/* признак асинхронного пуска */
						/* обменов по пачкам */
						/* если признак 0 - то обмен */
						/* запускается аппаратно в */
						/* соответствии с указанными */
						/* в пакетах подтактами */
						/* если признак 1 - то обмен */
						/* должен быть запущен */
						/* программно */
	mcpm_adp_mode_t	cntr_mode_state;	/* channel adapter hardware */
						/* control-state mode bits */
						/* биты управления */
						/* аппаратурой */
	size_t		*real_buf_size_p;	/* real size of transfer buf */
						/* указатель на переменную */
						/* для записи реального */
						/* размера буфера пачки c */
						/* учетом элкмкетов пачки и */
						/* необходимых кратностей */
						/* адресов и размеров*/
	int		*error_code_p;		/* code of error detected by */
						/* driver (SPARC or MP) */
						/* during  initialization */
						/* указатель на переменную */
						/* для записи кода ошибки, */
						/* если таковая будет */
						/* обнаружена в процессе */
						/* инициализации */
} mcpm_init_batch_t;

/*
 *  Default value of I/O transfer state specifications
 *  Значения по умолчанию параметров инициализации пакетного режима обменов
 */

#define	MCPM_BATCH_BUF_NUM_DEF		4	/* default value of MCPM */
						/* number of transfer bufs */
						/* число буферов обмена */
#define	MCPM_MIN_BATCH_BUF_NUM		4	/* value of MCPM min */
						/* number of transfer bufs */
						/* минимально необходимое */
						/* число буферов обмена */
#define	MCPM_MAX_BATCH_BUF_NUM		4	/* value of MCPM max */
						/* number of transfer bufs */
						/* максимально допустимое */
						/* число буферов обмена */
#define	MCPM_MAX_TRANS_BATCH_QUEUE_SIZE	3	/* max number of transfer */
						/* batches in the queue */
						/* максимальное число пачек */
						/* очереди готовых, */
						/* исполняющихся или */
						/* завершенных, но еще  */
						/* невостребованных обменов */
						/* 2 завершенных и */
						/* 1 исполняемый или */
						/* 1 завершенный, */
						/* 1 исполняемый и */
						/* 1 готовый к исполнению */
#define	MCPM_HUNGUP_TIMER_INTERVAL_DEF	800	/* default value of MCPM */
						/* hangup of I/O transfer */
						/* timer interval (usec) */
						/* значение таймера для */
						/* программного контроля */
						/* зависания обменов */
						/* при работе с каналом */
						/* (в микросекундах) */


/*
 *  MCPM device of I/O data transfer subdevice map state initialization
 *  Описание структуры параметров инициализации канала MCPM в режиме оконечника
 *  Обмены в оконечнике выполняются в соответствии с картой обменов,
 *  составленной из заявок для определынных подустройств, Каждое подустройство
 *  состоит из приемника и передатчика.
 *  Данный режим возможен только для канала работающего как оконечник.
 */

typedef struct mcpm_init_iomap {		/* MCPM-device init transfer */
						/* state specifications */
						/* параметры инициализации */
						/* канала MCPM в режиме */
						/* оконечника */
	mcpm_iodev_num_t
			device_num;		/* the device address */
						/* номер устройства, который */
						/* присвоин данному */
						/* оконечнику */
	mcpm_iodev_num_t
			min_subdevice_num;	/* min # of subdevice for */
						/* the device */
						/* минимальный номер */
						/* подустр-ва, используемый */
						/* для данного оконечника */
						/* (позволяет оптимизировать */
						/* размер карты обменов, не */
						/* выделяя память для */
						/* неиспользуемых подустр-в) */
	mcpm_iodev_num_t
			max_subdevice_num;	/* max # of subdevice for */
						/* the device */
						/* максимальный номер */
						/* подустр-ва, используемый */
						/* для данного оконечника */
						/* (позволяет оптимизировать */
						/* размер карты обменов, не */
						/* выделяя память для */
						/* неиспользуемых подустр-в) */
	mcpm_io_size_t	max_data_buf_size;	/* max size of I/O data */
						/* buffer */
						/* максимальный размер */
						/* массива обмена для одного */
						/* подустройства (реальный */
						/* размер без учета кратности */
						/* DMA) */
	int		buf_num;		/* # of buffers for I/O data */
						/* transfer */
						/* количество буыеров обмена */
						/* для каждого подустройства */
	u_long		timer_interval;		/* hangup of channel I/O */
						/* transfer timer interval */
						/* (usec) */
						/* значение таймера для */
						/* программного контроля */
						/* зависания обменов */
						/* при работе с каналом */
						/* (в микросекундах) */
	int		poll_mode_flag;		/* poll mode: transfer finish */
						/* must be polled */
						/* признак режима опроса */
						/* завершения очередного */
						/* обмена: в этом случае */
						/* возможен запуск poll() для */
						/* ожидания завершения */
						/* обмена хотя бы для одного */
						/* подустройства */
	mcpm_adp_mode_t	cntr_mode_state;	/* channel adapter hardware */
						/* control-state mode bits */
						/* биты управления */
						/* аппаратурой */
	size_t		*real_buf_size_p;	/* real size of transfer buf */
						/* указатель на переменную */
						/* для записи реального */
						/* размера буфера карты */
						/* обменов c учетом элкмкетов */
						/* карты - буферов */
						/* подустройств и */
						/* необходимых кратностей */
						/* адресов и размеров*/
	int		*error_code_p;		/* code of error detected by */
						/* driver (SPARC or MP) */
						/* during  initialization */
						/* указатель на переменную */
						/* для записи кода ошибки, */
						/* если таковая будет */
						/* обнаружена в процессе */
						/* инициализации */
} mcpm_init_iomap_t;

/*
 *  Default value of MCPM device I/O transfer map mode state specifications
 *  Значения по умолчанию некоторых параметров инициализации в режиме
 *  оконечника.
 */

#define	MCPM_E90_DEVICE_NUM_DEF		0x00	/* default value of MCPM */
						/* the device address */
						/* номер устройства, если */
						/* канал инициализируется как */
						/* оконечник */
#define	MCPM_MIN_SUBDEVICE_NUM_DEF	MCPM_MIN_SUBDEVICE_NUM
						/* min # of subdevice for */
						/* the device */
						/* минимальный номер */
						/* подустр-ва, используемый */
						/* для данного оконечника */
#define	MCPM_MAX_SUBDEVICE_NUM_DEF	MCPM_MAX_SUBDEVICE_NUM
						/* max # of subdevice for */
						/* the device */
						/* максимальный номер */
						/* подустр-ва, используемый */
						/* для данного оконечника */
#define	MCPM_MAX_DATA_BUF_SIZE_DEF	64	/* default value of MCPM max */
						/* size of I/O transfer */
						/* максимальный размер обмена */
#define	MCPM_SUBDEV_BUF_NUM_DEF		2	/* default value of MCPM */
						/* number of transfer bufs */
						/* число буферов обмена */
						/* для каждого подустр-ва */
#define	MCPM_MIN_SUBDEV_BUF_NUM		1	/* value of MCPM min */
						/* number of transfer bufs */
						/* минимально необходимое */
						/* число буферов обмена */
						/* для каждого подустр-ва */
#define	MCPM_MAX_SUBDEV_BUF_NUM		8	/* value of MCPM max */
						/* number of transfer bufs */
						/* максимально допустимое */
						/* число буферов обмена */
						/* для каждого подустр-ва */
						/* только в тестовом режиме */
						/* в рабочем режиме - только */
						/* 1 (один) буфер */
#define	MCPM_HUNGUP_TIMER_INTERVAL_DEF	800	/* default value of MCPM */
						/* hangup of I/O transfer */
						/* timer interval (usec) */
						/* значение таймера для */
						/* программного контроля */
						/* зависания обменов */
						/* при работе с каналом */
						/* (в микросекундах) */
#define	MCPM_CNTR_MODE_STATE_BITS_DEF	0x00	/* default value of MCPM */
						/* channel adapter */
						/* control-state mode bits */
						/* биты управления */
						/* аппаратурой */

/*
 *  MCPM board I/O transfer state halt
 *  Описание структуры параметров останова обменов и закрытия канала
 */

typedef struct mcpm_halt_trans {		/* halt transfer state and */
						/* close channel request */
						/* описание структура для */
						/* команды останова обменов */
						/* и закрытия канала */
	int		waiting_time;		/* timer interval of waiting */
						/* for last transfer will be */
						/* finished and channel */
						/* closed (usec) */
						/* время ожидания завершения */
						/* последнего обмена и */
						/* закрытия канала, после */
						/* которого все буфера */
						/* обменов удаляются */
						/* если 0, то ожидания нет */
						/* буфера будут удалены при */
						/* следующей инициализации */
						/* или при закрытии уст-ва */
						/* ( close() ) */
						/* если < 0, то ожидать */
						/* следует не более времени */
						/* заданного при открытии */
						/* в качестве значения */
						/* таймера для контроля */
						/* зависания обменов */
						/* если > 0, то это время в */
						/* микросекундах, после */
						/* которого все буфера  */
						/* обменов удаляются */

} mcpm_halt_trans_t;

/*
 *  The driver private buffers management (support and strategy of buffer
 *  transfer from/to main memory and to/from user  requests.
 *  Структура определяющая поддержку и обслуживание собственных буферов
 *  драйвера в основной памяти
 *  (совпадает с общей для большинства модулей Е-90 структурой)
 */

typedef me90_buf_man_t			mcpm_buf_man_t;

/*
 *  Optimum default value of driver main memory buffers management args
 *  Значения по умолчанию параметров обслуживания буферов в основной памяти
 */

#define	MIN_MCPM_FREE_BUF_NUM_DEF	1	/* 1 for next transfer */
						/* 1 свободный для */
						/* следующего обмена */
#define	MAX_MCPM_BUF_NUM_DEF		1 	/* only 1 transfer available */
						/* at any time */
						/* только 1 обмен может быть */
						/* в любой момент */
#define	MIN_MCPM_TOTAL_BUF_NUM_DEF	1	/* in progress + next + free */
						/* 1 для текущего + */
						/* 0 для следующего + */
						/* 0 для завершенного */

/*
 *  MCPM channel I/O single transfer mode state initialization
 *  Описание структуры параметров инициализации канала в режиме обычных
 *  (одиночных) обменов (может быть как для контроллера, так и для оконечника).
 *  Подобный режим используется для тестирования канала и модуля MCPM
 */

typedef struct mcpm_init_trans {		/* MCPM init transfer mode */
						/* specifications */
						/* описание структура для */
						/* команды инициализации */
						/* режима обменов */
	int		cntr_flag;		/* channel is inited as */
						/* controller (if flag == 0 */
						/* then as device) */
						/* признак того, что канал */
						/* инициализируется как */
						/* контроллер */
	mcpm_iodev_num_t
			device_num;		/* the device address if */
						/* channel must be device */
						/* rathe controller */
						/* номер устройства, если */
						/* канал инициализируется как */
						/* оконечник */
	size_t		max_trans_size;		/* max size of I/O transfer */
						/* максимальный размер буфера */
						/* обмена */
						/* если <= 0, то размер */
						/* берется в соответствии с */
						/* умочанием описанным ниже */
	u_long		timer_interval;		/* hangup of I/O transfer */
						/* timer interval (usec) */
						/* значение таймера для */
						/* контроля зависания при */
						/* обмене с каналом */
	mcpm_adp_mode_t	cntr_mode_state;	/* channel adapter hardware */
						/* control-state mode bits */
						/* биты управления */
						/* аппаратурой */
	int		waiting_time;		/* timer interval of waiting */
						/* for all transfers will be */
						/* finished and channel can */
						/* be closed (usec) */
						/* if 0 then all */
						/* not terminated transfers */
						/* deleted immediately */
						/* if < 0 then "infinite" */
						/* waiting while all */
						/* transfers will be done */
						/* if > 0 then timed waiting */
						/* for transfers end and */
						/* delete residual transfers */
						/* время ожидания завершения */
						/* всех обменов, которые */
						/* могут еще идти в канале, */
						/* прежде чем канал может */
						/* быть переинициализирован */
						/* если 0, то все еще не */
						/* завершенные обмены будут */
						/* удалены немедленно */
						/* если < 0, то бесконечное */
						/* время ожидания */
						/* если > 0, то это время в */
						/* микросекундах, после */
						/* которого оставшиеся обмены */
						/* безусловно удаляются */
	mcpm_buf_man_t	*trans_buf_management;	/* management of driver main */
						/* memory buffers for data */
						/* transfer from/to user */
						/* request */
						/* параметры стратегии работы */
						/* с буферами драйвера в */
						/* основной памяти для */
						/* обеспечения запросов на */
						/* обмен от пользователя */
						/* если NULL, то беруься */
						/* значения по умолчанию для */
						/* работы с буферами, */
						/* описанные выше */
	int		*error_code_p;		/* code of error detected by */
						/* driver (SPARC or MP) */
						/* указатель на переменную */
						/* для записи ошибки */
						/* обнаруженной при */
						/* инициализации */
} mcpm_init_trans_t;

/*
 *  Default value of MCPM single transfer mode state specifications
 *  Значения по умолчанию некоторых параметров инициализации в режиме
 *  одиночных обменов.
 */

#define	MCPM_E90_DEVICE_NUM_DEF		0x00	/* default value of MCPM */
						/* the device address */
						/* номер устройства, если */
						/* канал инициализируется как */
						/* оконечник */
#define	MCPM_MAX_DATA_BUF_SIZE_DEF	64	/* default value of MCPM max */
						/* size of I/O transfer */
						/* максимальный размер обмена */
#define	MCPM_CNTR_MODE_STATE_BITS_DEF	0x00	/* default value of MCPM */
						/* channel adapter */
						/* control-state mode bits */
						/* биты управления */
						/* аппаратурой */
#define	MCPM_HALT_TRANS_WAIT_TIME_DEF	-1	/* default value of waiting */
						/* time for all transfers end */
						/* (usec) */
						/* время ожидания завершения */
						/* всех обменов, которые */
						/* могут еще идти в канале, */
						/* прежде чем канал может */
						/* быть переинициализирован */
						/* микросекунды */

/*
 *  Driver state and modes some info structure (like all other module of E-90)
 *  Структура описывающая информацию о состоянии и режимах драйвера
 *  Подается для заполнения в соответствующую команду реализованную через
 *  ioctl() вызов
 *  (совпадает с общей для большинства модулей Е-90 структурой)
 */

typedef me90_drv_info_t			mcpm_drv_info_t;

/*
 *  MCPM device (instance & channel) info
 *  Структура описывающая информацию о том какое устройство MCPM
 *  связано с открытым дескриптором файла
 *  Подается для заполнения в соответствующую команду реализованную через
 *  ioctl() вызов.
 */

typedef	struct mcpm_dev_info {
	int		instance;	/* instance of MCPM module */
	int		channel;	/* instance of MCPM module */
	int		cntr_flag;	/* channel open as controller */
} mcpm_dev_info_t;

/*
 *  Module External Interrupts Generation Set/Reset in internal test mode
 */

typedef struct mcpm_intr_set
{
	int		timer_interval;		/* timer interval of */
						/* interrupts generation */
} mcpm_intr_set_t;

#ifdef	__cplusplus
}
#endif

#endif	/* __MCPM_IO_H__ */

