/*
 *  drivers/s390/net/iucv.h
 *    IUCV base support.
 *
 *  S390 version
 *    Copyright (C) 2000 IBM Corporation
 *    Author(s):Alan Altmark (Alan_Altmark@us.ibm.com)
 *		Xenia Tkatschow (xenia@us.ibm.com)
 *
 *
 * Functionality:
 * To explore any of the IUCV functions, one must first register
 * their program using iucv_register_program(). Once your program has
 * successfully completed a register, it can exploit the other functions.
 * For furthur reference on all IUCV functionality, refer to the
 * CP Programming Services book, also available on the web
 * thru www.ibm.com/s390/vm/pubs, manual # SC24-5760
 *
 *      Definition of Return Codes
 *      -All positive return codes including zero are reflected back
 *       from CP except for iucv_register_program. The definition of each
 *       return code can be found in CP Programming Services book.
 *       Also available on the web thru www.ibm.com/s390/vm/pubs, manual # SC24-5760
 *      - Return Code of:
 *             (-EINVAL) Invalid value
 *             (-ENOMEM) storage allocation failed
 *	pgmask defined in iucv_register_program will be set depending on input
 *	paramters.
 *
 */

#include <linux/types.h>
#include <asm/debug.h>

/**
 * Debug Facility stuff
 */
#define IUCV_DBF_SETUP_NAME "iucv_setup"
#define IUCV_DBF_SETUP_LEN 32
#define IUCV_DBF_SETUP_PAGES 2
#define IUCV_DBF_SETUP_NR_AREAS 1
#define IUCV_DBF_SETUP_LEVEL 3

#define IUCV_DBF_DATA_NAME "iucv_data"
#define IUCV_DBF_DATA_LEN 128
#define IUCV_DBF_DATA_PAGES 2
#define IUCV_DBF_DATA_NR_AREAS 1
#define IUCV_DBF_DATA_LEVEL 2

#define IUCV_DBF_TRACE_NAME "iucv_trace"
#define IUCV_DBF_TRACE_LEN 16
#define IUCV_DBF_TRACE_PAGES 4
#define IUCV_DBF_TRACE_NR_AREAS 1
#define IUCV_DBF_TRACE_LEVEL 3

#define IUCV_DBF_TEXT(name,level,text) \
	do { \
		debug_text_event(iucv_dbf_##name,level,text); \
	} while (0)

#define IUCV_DBF_HEX(name,level,addr,len) \
	do { \
		debug_event(iucv_dbf_##name,level,(void*)(addr),len); \
	} while (0)

DECLARE_PER_CPU(char[256], iucv_dbf_txt_buf);

#define IUCV_DBF_TEXT_(name,level,text...)				\
	do {								\
		char* iucv_dbf_txt_buf = get_cpu_var(iucv_dbf_txt_buf);	\
		sprintf(iucv_dbf_txt_buf, text);		  	\
		debug_text_event(iucv_dbf_##name,level,iucv_dbf_txt_buf); \
		put_cpu_var(iucv_dbf_txt_buf);				\
	} while (0)

#define IUCV_DBF_SPRINTF(name,level,text...) \
	do { \
		debug_sprintf_event(iucv_dbf_trace, level, ##text ); \
		debug_sprintf_event(iucv_dbf_trace, level, text ); \
	} while (0)

/**
 * some more debug stuff
 */
#define IUCV_HEXDUMP16(importance,header,ptr) \
PRINT_##importance(header "%02x %02x %02x %02x  %02x %02x %02x %02x  " \
		   "%02x %02x %02x %02x  %02x %02x %02x %02x\n", \
		   *(((char*)ptr)),*(((char*)ptr)+1),*(((char*)ptr)+2), \
		   *(((char*)ptr)+3),*(((char*)ptr)+4),*(((char*)ptr)+5), \
		   *(((char*)ptr)+6),*(((char*)ptr)+7),*(((char*)ptr)+8), \
		   *(((char*)ptr)+9),*(((char*)ptr)+10),*(((char*)ptr)+11), \
		   *(((char*)ptr)+12),*(((char*)ptr)+13), \
		   *(((char*)ptr)+14),*(((char*)ptr)+15)); \
PRINT_##importance(header "%02x %02x %02x %02x  %02x %02x %02x %02x  " \
		   "%02x %02x %02x %02x  %02x %02x %02x %02x\n", \
		   *(((char*)ptr)+16),*(((char*)ptr)+17), \
		   *(((char*)ptr)+18),*(((char*)ptr)+19), \
		   *(((char*)ptr)+20),*(((char*)ptr)+21), \
		   *(((char*)ptr)+22),*(((char*)ptr)+23), \
		   *(((char*)ptr)+24),*(((char*)ptr)+25), \
		   *(((char*)ptr)+26),*(((char*)ptr)+27), \
		   *(((char*)ptr)+28),*(((char*)ptr)+29), \
		   *(((char*)ptr)+30),*(((char*)ptr)+31));

static inline void
iucv_hex_dump(unsigned char *buf, size_t len)
{
	size_t i;

	for (i = 0; i < len; i++) {
		if (i && !(i % 16))
			printk("\n");
		printk("%02x ", *(buf + i));
	}
	printk("\n");
}
/**
 * end of debug stuff
 */

#define uchar  unsigned char
#define ushort unsigned short
#define ulong  unsigned long
#define iucv_handle_t void *

/* flags1:
 * All flags are defined in the field IPFLAGS1 of each function
 * and can be found in CP Programming Services.
 * IPLOCAL  - Indicates the connect can only be satisfied on the
 *            local system
 * IPPRTY   - Indicates a priority message
 * IPQUSCE  - Indicates you do not want to receive messages on a
 *            path until an iucv_resume is issued
 * IPRMDATA - Indicates that the message is in the parameter list
 */
#define IPLOCAL   	0x01
#define IPPRTY         	0x20
#define IPQUSCE        	0x40
#define IPRMDATA       	0x80

/* flags1_out:
 * All flags are defined in the output field of IPFLAGS1 for each function
 * and can be found in CP Programming Services.
 * IPNORPY - Specifies this is a one-way message and no reply is expected.
 * IPPRTY   - Indicates a priority message is permitted. Defined in flags1.
 */
#define IPNORPY         0x10

#define Nonpriority_MessagePendingInterruptsFlag         0x80
#define Priority_MessagePendingInterruptsFlag            0x40
#define Nonpriority_MessageCompletionInterruptsFlag      0x20
#define Priority_MessageCompletionInterruptsFlag         0x10
#define IUCVControlInterruptsFlag                        0x08
#define AllInterrupts                                    0xf8
/*
 * Mapping of external interrupt buffers should be used with the corresponding
 * interrupt types.
 * Names: iucv_ConnectionPending    ->  connection pending
 *        iucv_ConnectionComplete   ->  connection complete
 *        iucv_ConnectionSevered    ->  connection severed
 *        iucv_ConnectionQuiesced   ->  connection quiesced
 *        iucv_ConnectionResumed    ->  connection resumed
 *        iucv_MessagePending       ->  message pending
 *        iucv_MessageComplete      ->  message complete
 */
typedef struct {
	u16 ippathid;
	uchar ipflags1;
	uchar iptype;
	u16 ipmsglim;
	u16 res1;
	uchar ipvmid[8];
	uchar ipuser[16];
	u32 res3;
	uchar ippollfg;
	uchar res4[3];
} iucv_ConnectionPending;

typedef struct {
	u16 ippathid;
	uchar ipflags1;
	uchar iptype;
	u16 ipmsglim;
	u16 res1;
	uchar res2[8];
	uchar ipuser[16];
	u32 res3;
	uchar ippollfg;
	uchar res4[3];
} iucv_ConnectionComplete;

typedef struct {
	u16 ippathid;
	uchar res1;
	uchar iptype;
	u32 res2;
	uchar res3[8];
	uchar ipuser[16];
	u32 res4;
	uchar ippollfg;
	uchar res5[3];
} iucv_ConnectionSevered;

typedef struct {
	u16 ippathid;
	uchar res1;
	uchar iptype;
	u32 res2;
	uchar res3[8];
	uchar ipuser[16];
	u32 res4;
	uchar ippollfg;
	uchar res5[3];
} iucv_ConnectionQuiesced;

typedef struct {
	u16 ippathid;
	uchar res1;
	uchar iptype;
	u32 res2;
	uchar res3[8];
	uchar ipuser[16];
	u32 res4;
	uchar ippollfg;
	uchar res5[3];
} iucv_ConnectionResumed;

typedef struct {
	u16 ippathid;
	uchar ipflags1;
	uchar iptype;
	u32 ipmsgid;
	u32 iptrgcls;
	union u2 {
		u32 iprmmsg1_u32;
		uchar iprmmsg1[4];
	} ln1msg1;
	union u1 {
		u32 ipbfln1f;
		uchar iprmmsg2[4];
	} ln1msg2;
	u32 res1[3];
	u32 ipbfln2f;
	uchar ippollfg;
	uchar res2[3];
} iucv_MessagePending;

typedef struct {
	u16 ippathid;
	uchar ipflags1;
	uchar iptype;
	u32 ipmsgid;
	u32 ipaudit;
	uchar iprmmsg[8];
	u32 ipsrccls;
	u32 ipmsgtag;
	u32 res;
	u32 ipbfln2f;
	uchar ippollfg;
	uchar res2[3];
} iucv_MessageComplete;

/*
 * iucv_interrupt_ops_t: Is a vector of functions that handle
 * IUCV interrupts.
 * Parameter list:
 *         eib - is a pointer to a 40-byte area described
 *               with one of the structures above.
 *         pgm_data - this data is strictly for the
 *                    interrupt handler that is passed by
 *                    the application. This may be an address
 *                    or token.
*/
typedef struct {
	void (*ConnectionPending) (iucv_ConnectionPending * eib,
				   void *pgm_data);
	void (*ConnectionComplete) (iucv_ConnectionComplete * eib,
				    void *pgm_data);
	void (*ConnectionSevered) (iucv_ConnectionSevered * eib,
				   void *pgm_data);
	void (*ConnectionQuiesced) (iucv_ConnectionQuiesced * eib,
				    void *pgm_data);
	void (*ConnectionResumed) (iucv_ConnectionResumed * eib,
				   void *pgm_data);
	void (*MessagePending) (iucv_MessagePending * eib, void *pgm_data);
	void (*MessageComplete) (iucv_MessageComplete * eib, void *pgm_data);
} iucv_interrupt_ops_t;

/*
 *iucv_array_t : Defines buffer array.
 * Inside the array may be 31- bit addresses and 31-bit lengths.
*/
typedef struct {
	u32 address;
	u32 length;
} iucv_array_t __attribute__ ((aligned (8)));

extern struct bus_type iucv_bus;
extern struct device *iucv_root;

/*   -prototypes-    */
/*
 * Name: iucv_register_program
 * Purpose: Registers an application with IUCV
 * Input: prmname - user identification
 *        userid  - machine identification
 *        pgmmask - indicates which bits in the prmname and userid combined will be
 *  		    used to determine who is given control
 *        ops     - address of vector of interrupt handlers
 *        pgm_data- application data passed to interrupt handlers
 * Output: NA
 * Return: address of handler
 *         (0) - Error occurred, registration not completed.
 * NOTE: Exact cause of failure will be recorded in syslog.
*/
iucv_handle_t iucv_register_program (uchar pgmname[16],
				     uchar userid[8],
				     uchar pgmmask[24],
				     iucv_interrupt_ops_t * ops,
				     void *pgm_data);

/*
 * Name: iucv_unregister_program
 * Purpose: Unregister application with IUCV
 * Input: address of handler
 * Output: NA
 * Return: (0) - Normal return
 *         (-EINVAL) - Internal error, wild pointer
*/
int iucv_unregister_program (iucv_handle_t handle);

/*
 * Name: iucv_accept
 * Purpose: This function is issued after the user receives a Connection Pending external
 *          interrupt and now wishes to complete the IUCV communication path.
 * Input:  pathid - u16 , Path identification number
 *         msglim_reqstd - u16, The number of outstanding messages requested.
 *         user_data - uchar[16], Data specified by the iucv_connect function.
 *	   flags1 - int, Contains options for this path.
 *           -IPPRTY   - 0x20- Specifies if you want to send priority message.
 *           -IPRMDATA - 0x80, Specifies whether your program can handle a message
 *            	in  the parameter list.
 *           -IPQUSCE  - 0x40, Specifies whether you want to quiesce the path being
 *		established.
 *         handle - iucv_handle_t, Address of handler.
 *         pgm_data - void *, Application data passed to interrupt handlers.
 *         flags1_out - int * Contains information about the path
 *           - IPPRTY - 0x20, Indicates you may send priority messages.
 *         msglim - *u16, Number of outstanding messages.
 * Output: return code from CP IUCV call.
*/

int iucv_accept (u16 pathid,
		 u16 msglim_reqstd,
		 uchar user_data[16],
		 int flags1,
		 iucv_handle_t handle,
		 void *pgm_data, int *flags1_out, u16 * msglim);

/*
 * Name: iucv_connect
 * Purpose: This function establishes an IUCV path. Although the connect may complete
 *	    successfully, you are not able to use the path until you receive an IUCV
 *          Connection Complete external interrupt.
 * Input: pathid - u16 *, Path identification number
 *        msglim_reqstd - u16, Number of outstanding messages requested
 *        user_data - uchar[16], 16-byte user data
 *	  userid - uchar[8], User identification
 *        system_name - uchar[8], 8-byte identifying the system name
 *	  flags1 - int, Contains options for this path.
 *          -IPPRTY -   0x20, Specifies if you want to send priority message.
 *          -IPRMDATA - 0x80, Specifies whether your program can handle a message
 *            	 in  the parameter list.
 *          -IPQUSCE -  0x40, Specifies whether you want to quiesce the path being
 *		established.
 *          -IPLOCAL -  0X01, Allows an application to force the partner to be on
 *		the local system. If local is specified then target class cannot be
 *		specified.
 *        flags1_out - int * Contains information about the path
 *           - IPPRTY - 0x20, Indicates you may send priority messages.
 *        msglim - * u16, Number of outstanding messages
 *        handle - iucv_handle_t, Address of handler
 *        pgm_data - void *, Application data passed to interrupt handlers
 * Output: return code from CP IUCV call
 *         rc - return code from iucv_declare_buffer
 *         -EINVAL - Invalid handle passed by application
 *         -EINVAL - Pathid address is NULL
 *         add_pathid_result - Return code from internal function add_pathid
*/
int
    iucv_connect (u16 * pathid,
		  u16 msglim_reqstd,
		  uchar user_data[16],
		  uchar userid[8],
		  uchar system_name[8],
		  int flags1,
		  int *flags1_out,
		  u16 * msglim, iucv_handle_t handle, void *pgm_data);

/*
 * Name: iucv_purge
 * Purpose: This function cancels a message that you have sent.
 * Input: pathid - Path identification number.
 *        msgid - Specifies the message ID of the message to be purged.
 *        srccls - Specifies the source message class.
 * Output: audit - Contains information about asynchronous error
 *                 that may have affected the normal completion
 *                 of this message.
 * Return: Return code from CP IUCV call.
*/
int iucv_purge (u16 pathid, u32 msgid, u32 srccls, __u32 *audit);
/*
 * Name: iucv_query_maxconn
 * Purpose: This function determines the maximum number of communication paths you
 *	    may establish.
 * Return:  maxconn - ulong, Maximum number of connection the virtual machine may
 *          establish.
*/
ulong iucv_query_maxconn (void);

/*
 * Name: iucv_query_bufsize
 * Purpose: This function determines how large an external interrupt
 *          buffer IUCV requires to store information.
 * Return:  bufsize - ulong, Size of external interrupt buffer.
 */
ulong iucv_query_bufsize (void);

/*
 * Name: iucv_quiesce
 * Purpose: This function temporarily suspends incoming messages on an
 *          IUCV path. You can later reactivate the path by invoking
 *          the iucv_resume function.
 * Input: pathid - Path identification number
 *        user_data  - 16-bytes of user data
 * Output: NA
 * Return: Return code from CP IUCV call.
*/
int iucv_quiesce (u16 pathid, uchar user_data[16]);

/*
 * Name: iucv_receive
 * Purpose: This function receives messages that are being sent to you
 *          over established paths. Data will be returned in buffer for length of
 *          buflen.
 * Input:
 *       pathid - Path identification number.
 *       buffer - Address of buffer to receive.
 *       buflen - Length of buffer to receive.
 *       msgid - Specifies the message ID.
 *       trgcls - Specifies target class.
 * Output:
 *	 flags1_out: int *, Contains information about this path.
 *         IPNORPY - 0x10 Specifies this is a one-way message and no reply is
 *	   expected.
 *         IPPRTY  - 0x20 Specifies if you want to send priority message.
 *         IPRMDATA - 0x80 specifies the data is contained in the parameter list
 *       residual_buffer - address of buffer updated by the number
 *                         of bytes you have received.
 *       residual_length -
 *              Contains one of the following values, if the receive buffer is:
 *               The same length as the message, this field is zero.
 *               Longer than the message, this field contains the number of
 *                bytes remaining in the buffer.
 *               Shorter than the message, this field contains the residual
 *                count (that is, the number of bytes remaining in the
 *                message that does not fit into the buffer. In this
 *                case b2f0_result = 5.
 * Return: Return code from CP IUCV call.
 *         (-EINVAL) - buffer address is pointing to NULL
*/
int iucv_receive (u16 pathid,
		  u32 msgid,
		  u32 trgcls,
		  void *buffer,
		  ulong buflen,
		  int *flags1_out,
		  ulong * residual_buffer, ulong * residual_length);

 /*
  * Name: iucv_receive_array
  * Purpose: This function receives messages that are being sent to you
  *          over established paths. Data will be returned in first buffer for
  *          length of first buffer.
  * Input: pathid - Path identification number.
  *        msgid - specifies the message ID.
  *        trgcls - Specifies target class.
  *        buffer - Address of array of buffers.
  *        buflen - Total length of buffers.
  * Output:
  *        flags1_out: int *, Contains information about this path.
  *          IPNORPY - 0x10 Specifies this is a one-way message and no reply is
  *          expected.
  *          IPPRTY  - 0x20 Specifies if you want to send priority message.
  *          IPRMDATA - 0x80 specifies the data is contained in the parameter list
  *       residual_buffer - address points to the current list entry IUCV
  *                         is working on.
  *       residual_length -
  *              Contains one of the following values, if the receive buffer is:
  *               The same length as the message, this field is zero.
  *               Longer than the message, this field contains the number of
  *                bytes remaining in the buffer.
  *               Shorter than the message, this field contains the residual
  *                count (that is, the number of bytes remaining in the
  *                message that does not fit into the buffer. In this
  *                case b2f0_result = 5.
  * Return: Return code from CP IUCV call.
  *         (-EINVAL) - Buffer address is NULL.
  */
int iucv_receive_array (u16 pathid,
			u32 msgid,
			u32 trgcls,
			iucv_array_t * buffer,
			ulong buflen,
			int *flags1_out,
			ulong * residual_buffer, ulong * residual_length);

/*
 * Name: iucv_reject
 * Purpose: The reject function refuses a specified message. Between the
 *          time you are notified of a message and the time that you
 *          complete the message, the message may be rejected.
 * Input: pathid - Path identification number.
 *        msgid - Specifies the message ID.
 *        trgcls - Specifies target class.
 * Output: NA
 * Return: Return code from CP IUCV call.
*/
int iucv_reject (u16 pathid, u32 msgid, u32 trgcls);

/*
 * Name: iucv_reply
 * Purpose: This function responds to the two-way messages that you
 *          receive. You must identify completely the message to
 *          which you wish to reply. ie, pathid, msgid, and trgcls.
 * Input: pathid - Path identification number.
 *        msgid - Specifies the message ID.
 *        trgcls - Specifies target class.
 *        flags1 - Option for path.
 *          IPPRTY- 0x20, Specifies if you want to send priority message.
 *        buffer - Address of reply buffer.
 *        buflen - Length of reply buffer.
 * Output: residual_buffer - Address of buffer updated by the number
 *                    of bytes you have moved.
 *         residual_length - Contains one of the following values:
 *		If the answer buffer is the same length as the reply, this field
 *		 contains zero.
 *		If the answer buffer is longer than the reply, this field contains
 *		 the number of bytes remaining in the buffer.
 *		If the answer buffer is shorter than the reply, this field contains
 *		 a residual count (that is, the number of bytes remianing in the
 *		 reply that does not fit into the buffer. In this
 *               case b2f0_result = 5.
 * Return: Return code from CP IUCV call.
 *         (-EINVAL) - Buffer address is NULL.
*/
int iucv_reply (u16 pathid,
		u32 msgid,
		u32 trgcls,
		int flags1,
		void *buffer, ulong buflen, ulong * residual_buffer,
		ulong * residual_length);

/*
 * Name: iucv_reply_array
 * Purpose: This function responds to the two-way messages that you
 *          receive. You must identify completely the message to
 *          which you wish to reply. ie, pathid, msgid, and trgcls.
 *          The array identifies a list of addresses and lengths of
 *          discontiguous buffers that contains the reply data.
 * Input: pathid - Path identification number
 *        msgid - Specifies the message ID.
 *        trgcls - Specifies target class.
 *        flags1 - Option for path.
 *          IPPRTY- 0x20, Specifies if you want to send priority message.
 *        buffer - Address of array of reply buffers.
 *        buflen - Total length of reply buffers.
 * Output: residual_buffer - Address of buffer which IUCV is currently working on.
 *         residual_length - Contains one of the following values:
 *              If the answer buffer is the same length as the reply, this field
 *               contains zero.
 *              If the answer buffer is longer than the reply, this field contains
 *               the number of bytes remaining in the buffer.
 *              If the answer buffer is shorter than the reply, this field contains
 *               a residual count (that is, the number of bytes remianing in the
 *               reply that does not fit into the buffer. In this
 *               case b2f0_result = 5.
 * Return: Return code from CP IUCV call.
 *         (-EINVAL) - Buffer address is NULL.
*/
int iucv_reply_array (u16 pathid,
		      u32 msgid,
		      u32 trgcls,
		      int flags1,
		      iucv_array_t * buffer,
		      ulong buflen, ulong * residual_address,
		      ulong * residual_length);

/*
 * Name: iucv_reply_prmmsg
 * Purpose: This function responds to the two-way messages that you
 *          receive. You must identify completely the message to
 *          which you wish to reply. ie, pathid, msgid, and trgcls.
 *          Prmmsg signifies the data is moved into the
 *          parameter list.
 * Input: pathid - Path identification number.
 *        msgid - Specifies the message ID.
 *        trgcls - Specifies target class.
 *        flags1 - Option for path.
 *          IPPRTY- 0x20 Specifies if you want to send priority message.
 *        prmmsg - 8-bytes of data to be placed into the parameter.
 *                 list.
 * Output: NA
 * Return: Return code from CP IUCV call.
*/
int iucv_reply_prmmsg (u16 pathid,
		       u32 msgid, u32 trgcls, int flags1, uchar prmmsg[8]);

/*
 * Name: iucv_resume
 * Purpose: This function restores communications over a quiesced path
 * Input: pathid - Path identification number.
 *        user_data  - 16-bytes of user data.
 * Output: NA
 * Return: Return code from CP IUCV call.
*/
int iucv_resume (u16 pathid, uchar user_data[16]);

/*
 * Name: iucv_send
 * Purpose: This function transmits data to another application.
 *          Data to be transmitted is in a buffer and this is a
 *          one-way message and the receiver will not reply to the
 *          message.
 * Input: pathid - Path identification number.
 *        trgcls - Specifies target class.
 *        srccls - Specifies the source message class.
 *        msgtag - Specifies a tag to be associated with the message.
 *        flags1 - Option for path.
 *          IPPRTY- 0x20 Specifies if you want to send priority message.
 *        buffer - Address of send buffer.
 *        buflen - Length of send buffer.
 * Output: msgid - Specifies the message ID.
 * Return: Return code from CP IUCV call.
 *         (-EINVAL) - Buffer address is NULL.
*/
int iucv_send (u16 pathid,
	       u32 * msgid,
	       u32 trgcls,
	       u32 srccls, u32 msgtag, int flags1, void *buffer, ulong buflen);

/*
 * Name: iucv_send_array
 * Purpose: This function transmits data to another application.
 *          The contents of buffer is the address of the array of
 *          addresses and lengths of discontiguous buffers that hold
 *          the message text. This is a one-way message and the
 *          receiver will not reply to the message.
 * Input: pathid - Path identification number.
 *        trgcls - Specifies target class.
 *        srccls - Specifies the source message class.
 *        msgtag - Specifies a tag to be associated witht the message.
 *        flags1 - Option for path.
 *          IPPRTY- specifies if you want to send priority message.
 *        buffer - Address of array of send buffers.
 *        buflen - Total length of send buffers.
 * Output: msgid - Specifies the message ID.
 * Return: Return code from CP IUCV call.
 *         (-EINVAL) - Buffer address is NULL.
*/
int iucv_send_array (u16 pathid,
		     u32 * msgid,
		     u32 trgcls,
		     u32 srccls,
		     u32 msgtag,
		     int flags1, iucv_array_t * buffer, ulong buflen);

/*
 * Name: iucv_send_prmmsg
 * Purpose: This function transmits data to another application.
 *          Prmmsg specifies that the 8-bytes of data are to be moved
 *          into the parameter list. This is a one-way message and the
 *          receiver will not reply to the message.
 * Input: pathid - Path identification number.
 *        trgcls - Specifies target class.
 *        srccls - Specifies the source message class.
 *        msgtag - Specifies a tag to be associated with the message.
 *        flags1 - Option for path.
 *          IPPRTY- 0x20 specifies if you want to send priority message.
 *        prmmsg - 8-bytes of data to be placed into parameter list.
 * Output: msgid - Specifies the message ID.
 * Return: Return code from CP IUCV call.
*/
int iucv_send_prmmsg (u16 pathid,
		      u32 * msgid,
		      u32 trgcls,
		      u32 srccls, u32 msgtag, int flags1, uchar prmmsg[8]);

/*
 * Name: iucv_send2way
 * Purpose: This function transmits data to another application.
 *          Data to be transmitted is in a buffer. The receiver
 *          of the send is expected to reply to the message and
 *          a buffer is provided into which IUCV moves the reply
 *          to this message.
 * Input: pathid - Path identification number.
 *        trgcls - Specifies target class.
 *        srccls - Specifies the source message class.
 *        msgtag - Specifies a tag associated with the message.
 *        flags1 - Option for path.
 *          IPPRTY- 0x20 Specifies if you want to send priority message.
 *        buffer - Address of send buffer.
 *        buflen - Length of send buffer.
 *        ansbuf - Address of buffer into which IUCV moves the reply of
 *                 this message.
 *        anslen - Address of length of buffer.
 * Output: msgid - Specifies the message ID.
 * Return: Return code from CP IUCV call.
 *         (-EINVAL) - Buffer or ansbuf address is NULL.
*/
int iucv_send2way (u16 pathid,
		   u32 * msgid,
		   u32 trgcls,
		   u32 srccls,
		   u32 msgtag,
		   int flags1,
		   void *buffer, ulong buflen, void *ansbuf, ulong anslen);

/*
 * Name: iucv_send2way_array
 * Purpose: This function transmits data to another application.
 *          The contents of buffer is the address of the array of
 *          addresses and lengths of discontiguous buffers that hold
 *          the message text. The receiver of the send is expected to
 *          reply to the message and a buffer is provided into which
 *          IUCV moves the reply to this message.
 * Input: pathid - Path identification number.
 *        trgcls - Specifies target class.
 *        srccls - Specifies the source message class.
 *        msgtag - Specifies a tag to be associated with the message.
 *        flags1 - Option for path.
 *          IPPRTY- 0x20 Specifies if you want to send priority message.
 *        buffer - Sddress of array of send buffers.
 *        buflen - Total length of send buffers.
 *        ansbuf - Address of array of buffer into which IUCV moves the reply
 *                 of this message.
 *        anslen - Address of length reply buffers.
 * Output: msgid - Specifies the message ID.
 * Return: Return code from CP IUCV call.
 *         (-EINVAL) - Buffer address is NULL.
*/
int iucv_send2way_array (u16 pathid,
			 u32 * msgid,
			 u32 trgcls,
			 u32 srccls,
			 u32 msgtag,
			 int flags1,
			 iucv_array_t * buffer,
			 ulong buflen, iucv_array_t * ansbuf, ulong anslen);

/*
 * Name: iucv_send2way_prmmsg
 * Purpose: This function transmits data to another application.
 *          Prmmsg specifies that the 8-bytes of data are to be moved
 *          into the parameter list. This is a two-way message and the
 *          receiver of the message is expected to reply. A buffer
 *          is provided into which IUCV moves the reply to this
 *          message.
 * Input: pathid - Rath identification number.
 *        trgcls - Specifies target class.
 *        srccls - Specifies the source message class.
 *        msgtag - Specifies a tag to be associated with the message.
 *        flags1 - Option for path.
 *          IPPRTY- 0x20 Specifies if you want to send priority message.
 *        prmmsg - 8-bytes of data to be placed in parameter list.
 *        ansbuf - Address of buffer into which IUCV moves the reply of
 *                 this message.
 *        anslen - Address of length of buffer.
 * Output: msgid - Specifies the message ID.
 * Return: Return code from CP IUCV call.
 *         (-EINVAL) - Buffer address is NULL.
*/
int iucv_send2way_prmmsg (u16 pathid,
			  u32 * msgid,
			  u32 trgcls,
			  u32 srccls,
			  u32 msgtag,
			  ulong flags1,
			  uchar prmmsg[8], void *ansbuf, ulong anslen);

/*
 * Name: iucv_send2way_prmmsg_array
 * Purpose: This function transmits data to another application.
 *          Prmmsg specifies that the 8-bytes of data are to be moved
 *          into the parameter list. This is a two-way message and the
 *          receiver of the message is expected to reply. A buffer
 *          is provided into which IUCV moves the reply to this
 *          message. The contents of ansbuf is the address of the
 *          array of addresses and lengths of discontiguous buffers
 *          that contain the reply.
 * Input: pathid - Path identification number.
 *        trgcls - Specifies target class.
 *        srccls - Specifies the source message class.
 *        msgtag - Specifies a tag to be associated with the message.
 *        flags1 - Option for path.
 *          IPPRTY- 0x20 specifies if you want to send priority message.
 *        prmmsg - 8-bytes of data to be placed into the parameter list.
 *        ansbuf - Address of array of buffer into which IUCV moves the reply
 *                 of this message.
 *        anslen - Address of length of reply buffers.
 * Output: msgid - Specifies the message ID.
 * Return: Return code from CP IUCV call.
 *         (-EINVAL) - Ansbuf address is NULL.
*/
int iucv_send2way_prmmsg_array (u16 pathid,
				u32 * msgid,
				u32 trgcls,
				u32 srccls,
				u32 msgtag,
				int flags1,
				uchar prmmsg[8],
				iucv_array_t * ansbuf, ulong anslen);

/*
 * Name: iucv_setmask
 * Purpose: This function enables or disables the following IUCV
 *          external interruptions: Nonpriority and priority message
 *          interrupts, nonpriority and priority reply interrupts.
 * Input: SetMaskFlag - options for interrupts
 *           0x80 - Nonpriority_MessagePendingInterruptsFlag
 *           0x40 - Priority_MessagePendingInterruptsFlag
 *           0x20 - Nonpriority_MessageCompletionInterruptsFlag
 *           0x10 - Priority_MessageCompletionInterruptsFlag
 *           0x08 - IUCVControlInterruptsFlag
 * Output: NA
 * Return: Return code from CP IUCV call.
*/
int iucv_setmask (int SetMaskFlag);

/*
 * Name: iucv_sever
 * Purpose: This function terminates an IUCV path.
 * Input: pathid - Path identification number.
 *        user_data - 16-bytes of user data.
 * Output: NA
 * Return: Return code from CP IUCV call.
 *         (-EINVAL) - Interal error, wild pointer.
*/
int iucv_sever (u16 pathid, uchar user_data[16]);
