/*
 *  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_INDEX 1
#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_INDEX 1
#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_INDEX 2
#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]);
