1 /*
2  *  drivers/s390/net/iucv.h
3  *    IUCV base support.
4  *
5  *  S390 version
6  *    Copyright (C) 2000 IBM Corporation
7  *    Author(s):Alan Altmark (Alan_Altmark@us.ibm.com)
8  *		Xenia Tkatschow (xenia@us.ibm.com)
9  *
10  *
11  * Functionality:
12  * To explore any of the IUCV functions, one must first register
13  * their program using iucv_register_program(). Once your program has
14  * successfully completed a register, it can exploit the other functions.
15  * For furthur reference on all IUCV functionality, refer to the
16  * CP Programming Services book, also available on the web
17  * thru www.ibm.com/s390/vm/pubs, manual # SC24-5760
18  *
19  *      Definition of Return Codes
20  *      -All positive return codes including zero are reflected back
21  *       from CP except for iucv_register_program. The definition of each
22  *       return code can be found in CP Programming Services book.
23  *       Also available on the web thru www.ibm.com/s390/vm/pubs, manual # SC24-5760
24  *      - Return Code of:
25  *             (-EINVAL) Invalid value
26  *             (-ENOMEM) storage allocation failed
27  *	pgmask defined in iucv_register_program will be set depending on input
28  *	paramters.
29  *
30  */
31 
32 #include <linux/types.h>
33 #define uchar  unsigned char
34 #define ushort unsigned short
35 #define ulong  unsigned long
36 #define iucv_handle_t void *
37 
38 /* flags1:
39  * All flags are defined in the field IPFLAGS1 of each function
40  * and can be found in CP Programming Services.
41  * IPLOCAL  - Indicates the connect can only be satisfied on the
42  *            local system
43  * IPPRTY   - Indicates a priority message
44  * IPQUSCE  - Indicates you do not want to receive messages on a
45  *            path until an iucv_resume is issued
46  * IPRMDATA - Indicates that the message is in the parameter list
47  */
48 #define IPLOCAL   	0x01
49 #define IPPRTY         	0x20
50 #define IPQUSCE        	0x40
51 #define IPRMDATA       	0x80
52 
53 /* flags1_out:
54  * All flags are defined in the output field of IPFLAGS1 for each function
55  * and can be found in CP Programming Services.
56  * IPNORPY - Specifies this is a one-way message and no reply is expected.
57  * IPPRTY   - Indicates a priority message is permitted. Defined in flags1.
58  */
59 #define IPNORPY         0x10
60 
61 #define Nonpriority_MessagePendingInterruptsFlag         0x80
62 #define Priority_MessagePendingInterruptsFlag            0x40
63 #define Nonpriority_MessageCompletionInterruptsFlag      0x20
64 #define Priority_MessageCompletionInterruptsFlag         0x10
65 #define IUCVControlInterruptsFlag                        0x08
66 #define AllInterrupts					 0xf8
67 
68 /*
69  * Mapping of external interrupt buffers should be used with the corresponding
70  * interrupt types.
71  * Names: iucv_ConnectionPending    ->  connection pending
72  *        iucv_ConnectionComplete   ->  connection complete
73  *        iucv_ConnectionSevered    ->  connection severed
74  *        iucv_ConnectionQuiesced   ->  connection quiesced
75  *        iucv_ConnectionResumed    ->  connection resumed
76  *        iucv_MessagePending       ->  message pending
77  *        iucv_MessageComplete      ->  message complete
78  */
79 typedef struct {
80 	u16 ippathid;
81 	uchar ipflags1;
82 	uchar iptype;
83 	u16 ipmsglim;
84 	u16 res1;
85 	uchar ipvmid[8];
86 	uchar ipuser[16];
87 	u32 res3;
88 	uchar ippollfg;
89 	uchar res4[3];
90 } iucv_ConnectionPending;
91 
92 typedef struct {
93 	u16 ippathid;
94 	uchar ipflags1;
95 	uchar iptype;
96 	u16 ipmsglim;
97 	u16 res1;
98 	uchar res2[8];
99 	uchar ipuser[16];
100 	u32 res3;
101 	uchar ippollfg;
102 	uchar res4[3];
103 } iucv_ConnectionComplete;
104 
105 typedef struct {
106 	u16 ippathid;
107 	uchar res1;
108 	uchar iptype;
109 	u32 res2;
110 	uchar res3[8];
111 	uchar ipuser[16];
112 	u32 res4;
113 	uchar ippollfg;
114 	uchar res5[3];
115 } iucv_ConnectionSevered;
116 
117 typedef struct {
118 	u16 ippathid;
119 	uchar res1;
120 	uchar iptype;
121 	u32 res2;
122 	uchar res3[8];
123 	uchar ipuser[16];
124 	u32 res4;
125 	uchar ippollfg;
126 	uchar res5[3];
127 } iucv_ConnectionQuiesced;
128 
129 typedef struct {
130 	u16 ippathid;
131 	uchar res1;
132 	uchar iptype;
133 	u32 res2;
134 	uchar res3[8];
135 	uchar ipuser[16];
136 	u32 res4;
137 	uchar ippollfg;
138 	uchar res5[3];
139 } iucv_ConnectionResumed;
140 
141 typedef struct {
142 	u16 ippathid;
143 	uchar ipflags1;
144 	uchar iptype;
145 	u32 ipmsgid;
146 	u32 iptrgcls;
147 	uchar iprmmsg1[4];
148 	union u1 {
149 		u32 ipbfln1f;
150 		uchar iprmmsg2[4];
151 	} ln1msg2;
152 	u32 res1[3];
153 	u32 ipbfln2f;
154 	uchar ippollfg;
155 	uchar res2[3];
156 } iucv_MessagePending;
157 
158 typedef struct {
159 	u16 ippathid;
160 	uchar ipflags1;
161 	uchar iptype;
162 	u32 ipmsgid;
163 	u32 ipaudit;
164 	uchar iprmmsg[8];
165 	u32 ipsrccls;
166 	u32 ipmsgtag;
167 	u32 res;
168 	u32 ipbfln2f;
169 	uchar ippollfg;
170 	uchar res2[3];
171 } iucv_MessageComplete;
172 
173 /*
174  * iucv_interrupt_ops_t: Is a vector of functions that handle
175  * IUCV interrupts.
176  * Parameter list:
177  *         eib - is a pointer to a 40-byte area described
178  *               with one of the structures above.
179  *         pgm_data - this data is strictly for the
180  *                    interrupt handler that is passed by
181  *                    the application. This may be an address
182  *                    or token.
183 */
184 typedef struct {
185 	void (*ConnectionPending) (iucv_ConnectionPending * eib,
186 				   void *pgm_data);
187 	void (*ConnectionComplete) (iucv_ConnectionComplete * eib,
188 				    void *pgm_data);
189 	void (*ConnectionSevered) (iucv_ConnectionSevered * eib,
190 				   void *pgm_data);
191 	void (*ConnectionQuiesced) (iucv_ConnectionQuiesced * eib,
192 				    void *pgm_data);
193 	void (*ConnectionResumed) (iucv_ConnectionResumed * eib,
194 				   void *pgm_data);
195 	void (*MessagePending) (iucv_MessagePending * eib, void *pgm_data);
196 	void (*MessageComplete) (iucv_MessageComplete * eib, void *pgm_data);
197 } iucv_interrupt_ops_t;
198 
199 /*
200  *iucv_array_t : Defines buffer array.
201  * Inside the array may be 31- bit addresses and 31-bit lengths.
202 */
203 typedef struct {
204 	u32 address;
205 	u32 length;
206 } iucv_array_t __attribute__ ((aligned (8)));
207 
208 /*   -prototypes-    */
209 /*
210  * Name: iucv_register_program
211  * Purpose: Registers an application with IUCV
212  * Input: prmname - user identification
213  *        userid  - machine identification
214  *        pgmmask - indicates which bits in the prmname and userid combined will be
215  *  		    used to determine who is given control
216  *        ops     - address of vector of interrupt handlers
217  *        pgm_data- application data passed to interrupt handlers
218  * Output: NA
219  * Return: address of handler
220  *         (0) - Error occured, registration not completed.
221  * NOTE: Exact cause of failure will be recorded in syslog.
222 */
223 iucv_handle_t iucv_register_program (uchar pgmname[16],
224 				     uchar userid[8],
225 				     uchar pgmmask[24],
226 				     iucv_interrupt_ops_t * ops,
227 				     void *pgm_data);
228 
229 /*
230  * Name: iucv_unregister_program
231  * Purpose: Unregister application with IUCV
232  * Input: address of handler
233  * Output: NA
234  * Return: (0) - Normal return
235  *         (-EINVAL) - Internal error, wild pointer
236 */
237 int iucv_unregister_program (iucv_handle_t handle);
238 
239 /*
240  * Name: iucv_accept
241  * Purpose: This function is issued after the user receives a Connection Pending external
242  *          interrupt and now wishes to complete the IUCV communication path.
243  * Input:  pathid - u16 , Path identification number
244  *         msglim_reqstd - u16, The number of outstanding messages requested.
245  *         user_data - uchar[16], Data specified by the iucv_connect function.
246  *	   flags1 - int, Contains options for this path.
247  *           -IPPRTY   - 0x20- Specifies if you want to send priority message.
248  *           -IPRMDATA - 0x80, Specifies whether your program can handle a message
249  *            	in  the parameter list.
250  *           -IPQUSCE  - 0x40, Specifies whether you want to quiesce the path being
251  *		established.
252  *         handle - iucv_handle_t, Address of handler.
253  *         pgm_data - void *, Application data passed to interrupt handlers.
254  *         flags1_out - int * Contains information about the path
255  *           - IPPRTY - 0x20, Indicates you may send priority messages.
256  *         msglim - *u16, Number of outstanding messages.
257  * Output: return code from CP IUCV call.
258 */
259 
260 int iucv_accept (u16 pathid,
261 		 u16 msglim_reqstd,
262 		 uchar user_data[16],
263 		 int flags1,
264 		 iucv_handle_t handle,
265 		 void *pgm_data, int *flags1_out, u16 * msglim);
266 
267 /*
268  * Name: iucv_connect
269  * Purpose: This function establishes an IUCV path. Although the connect may complete
270  *	    successfully, you are not able to use the path until you receive an IUCV
271  *          Connection Complete external interrupt.
272  * Input: pathid - u16 *, Path identification number
273  *        msglim_reqstd - u16, Number of outstanding messages requested
274  *        user_data - uchar[16], 16-byte user data
275  *	  userid - uchar[8], User identification
276  *        system_name - uchar[8], 8-byte identifying the system name
277  *	  flags1 - int, Contains options for this path.
278  *          -IPPRTY -   0x20, Specifies if you want to send priority message.
279  *          -IPRMDATA - 0x80, Specifies whether your program can handle a message
280  *            	 in  the parameter list.
281  *          -IPQUSCE -  0x40, Specifies whether you want to quiesce the path being
282  *		established.
283  *          -IPLOCAL -  0X01, Allows an application to force the partner to be on
284  *		the local system. If local is specified then target class cannot be
285  *		specified.
286  *        flags1_out - int * Contains information about the path
287  *           - IPPRTY - 0x20, Indicates you may send priority messages.
288  *        msglim - * u16, Number of outstanding messages
289  *        handle - iucv_handle_t, Address of handler
290  *        pgm_data - void *, Application data passed to interrupt handlers
291  * Output: return code from CP IUCV call
292  *         rc - return code from iucv_declare_buffer
293  *         -EINVAL - Invalid handle passed by application
294  *         -EINVAL - Pathid address is NULL
295  *         add_pathid_result - Return code from internal function add_pathid
296 */
297 int
298     iucv_connect (u16 * pathid,
299 		  u16 msglim_reqstd,
300 		  uchar user_data[16],
301 		  uchar userid[8],
302 		  uchar system_name[8],
303 		  int flags1,
304 		  int *flags1_out,
305 		  u16 * msglim, iucv_handle_t handle, void *pgm_data);
306 
307 /*
308  * Name: iucv_purge
309  * Purpose: This function cancels a message that you have sent.
310  * Input: pathid - Path identification number.
311  *        msgid - Specifies the message ID of the message to be purged.
312  *        srccls - Specifies the source message class.
313  * Output: audit - Contains information about asynchronous error
314  *                 that may have affected the normal completion
315  *                 of this message.
316  * Return: Return code from CP IUCV call.
317 */
318 int iucv_purge (u16 pathid, u32 msgid, u32 srccls, __u32 *audit);
319 /*
320  * Name: iucv_query_maxconn
321  * Purpose: This function determines the maximum number of communication paths you
322  *	    may establish.
323  * Return:  maxconn - ulong, Maximum number of connection the virtual machine may
324  *          establish.
325 */
326 ulong iucv_query_maxconn (void);
327 
328 /*
329  * Name: iucv_query_bufsize
330  * Purpose: This function determines how large an external interrupt
331  *          buffer IUCV requires to store information.
332  * Return:  bufsize - ulong, Size of external interrupt buffer.
333  */
334 ulong iucv_query_bufsize (void);
335 
336 /*
337  * Name: iucv_quiesce
338  * Purpose: This function temporarily suspends incoming messages on an
339  *          IUCV path. You can later reactivate the path by invoking
340  *          the iucv_resume function.
341  * Input: pathid - Path identification number
342  *        user_data  - 16-bytes of user data
343  * Output: NA
344  * Return: Return code from CP IUCV call.
345 */
346 int iucv_quiesce (u16 pathid, uchar user_data[16]);
347 
348 /*
349  * Name: iucv_receive
350  * Purpose: This function receives messages that are being sent to you
351  *          over established paths. Data will be returned in buffer for length of
352  *          buflen.
353  * Input:
354  *       pathid - Path identification number.
355  *       buffer - Address of buffer to receive.
356  *       buflen - Length of buffer to receive.
357  *       msgid - Specifies the message ID.
358  *       trgcls - Specifies target class.
359  * Output:
360  *	 flags1_out: int *, Contains information about this path.
361  *         IPNORPY - 0x10 Specifies this is a one-way message and no reply is
362  *	   expected.
363  *         IPPRTY  - 0x20 Specifies if you want to send priority message.
364  *         IPRMDATA - 0x80 specifies the data is contained in the parameter list
365  *       residual_buffer - address of buffer updated by the number
366  *                         of bytes you have received.
367  *       residual_length -
368  *              Contains one of the following values, if the receive buffer is:
369  *               The same length as the message, this field is zero.
370  *               Longer than the message, this field contains the number of
371  *                bytes remaining in the buffer.
372  *               Shorter than the message, this field contains the residual
373  *                count (that is, the number of bytes remaining in the
374  *                message that does not fit into the buffer. In this
375  *                case b2f0_result = 5.
376  * Return: Return code from CP IUCV call.
377  *         (-EINVAL) - buffer address is pointing to NULL
378 */
379 int iucv_receive (u16 pathid,
380 		  u32 msgid,
381 		  u32 trgcls,
382 		  void *buffer,
383 		  ulong buflen,
384 		  int *flags1_out,
385 		  ulong * residual_buffer, ulong * residual_length);
386 
387  /*
388   * Name: iucv_receive_array
389   * Purpose: This function receives messages that are being sent to you
390   *          over established paths. Data will be returned in first buffer for
391   *          length of first buffer.
392   * Input: pathid - Path identification number.
393   *        msgid - specifies the message ID.
394   *        trgcls - Specifies target class.
395   *        buffer - Address of array of buffers.
396   *        buflen - Total length of buffers.
397   * Output:
398   *        flags1_out: int *, Contains information about this path.
399   *          IPNORPY - 0x10 Specifies this is a one-way message and no reply is
400   *          expected.
401   *          IPPRTY  - 0x20 Specifies if you want to send priority message.
402   *          IPRMDATA - 0x80 specifies the data is contained in the parameter list
403   *       residual_buffer - address points to the current list entry IUCV
404   *                         is working on.
405   *       residual_length -
406   *              Contains one of the following values, if the receive buffer is:
407   *               The same length as the message, this field is zero.
408   *               Longer than the message, this field contains the number of
409   *                bytes remaining in the buffer.
410   *               Shorter than the message, this field contains the residual
411   *                count (that is, the number of bytes remaining in the
412   *                message that does not fit into the buffer. In this
413   *                case b2f0_result = 5.
414   * Return: Return code from CP IUCV call.
415   *         (-EINVAL) - Buffer address is NULL.
416   */
417 int iucv_receive_array (u16 pathid,
418 			u32 msgid,
419 			u32 trgcls,
420 			iucv_array_t * buffer,
421 			ulong buflen,
422 			int *flags1_out,
423 			ulong * residual_buffer, ulong * residual_length);
424 
425 /*
426  * Name: iucv_reject
427  * Purpose: The reject function refuses a specified message. Between the
428  *          time you are notified of a message and the time that you
429  *          complete the message, the message may be rejected.
430  * Input: pathid - Path identification number.
431  *        msgid - Specifies the message ID.
432  *        trgcls - Specifies target class.
433  * Output: NA
434  * Return: Return code from CP IUCV call.
435 */
436 int iucv_reject (u16 pathid, u32 msgid, u32 trgcls);
437 
438 /*
439  * Name: iucv_reply
440  * Purpose: This function responds to the two-way messages that you
441  *          receive. You must identify completely the message to
442  *          which you wish to reply. ie, pathid, msgid, and trgcls.
443  * Input: pathid - Path identification number.
444  *        msgid - Specifies the message ID.
445  *        trgcls - Specifies target class.
446  *        flags1 - Option for path.
447  *          IPPRTY- 0x20, Specifies if you want to send priority message.
448  *        buffer - Address of reply buffer.
449  *        buflen - Length of reply buffer.
450  * Output: residual_buffer - Address of buffer updated by the number
451  *                    of bytes you have moved.
452  *         residual_length - Contains one of the following values:
453  *		If the answer buffer is the same length as the reply, this field
454  *		 contains zero.
455  *		If the answer buffer is longer than the reply, this field contains
456  *		 the number of bytes remaining in the buffer.
457  *		If the answer buffer is shorter than the reply, this field contains
458  *		 a residual count (that is, the number of bytes remianing in the
459  *		 reply that does not fit into the buffer. In this
460  *               case b2f0_result = 5.
461  * Return: Return code from CP IUCV call.
462  *         (-EINVAL) - Buffer address is NULL.
463 */
464 int iucv_reply (u16 pathid,
465 		u32 msgid,
466 		u32 trgcls,
467 		int flags1,
468 		void *buffer, ulong buflen, ulong * residual_buffer,
469 		ulong * residual_length);
470 
471 /*
472  * Name: iucv_reply_array
473  * Purpose: This function responds to the two-way messages that you
474  *          receive. You must identify completely the message to
475  *          which you wish to reply. ie, pathid, msgid, and trgcls.
476  *          The array identifies a list of addresses and lengths of
477  *          discontiguous buffers that contains the reply data.
478  * Input: pathid - Path identification number
479  *        msgid - Specifies the message ID.
480  *        trgcls - Specifies target class.
481  *        flags1 - Option for path.
482  *          IPPRTY- 0x20, Specifies if you want to send priority message.
483  *        buffer - Address of array of reply buffers.
484  *        buflen - Total length of reply buffers.
485  * Output: residual_buffer - Address of buffer which IUCV is currently working on.
486  *         residual_length - Contains one of the following values:
487  *              If the answer buffer is the same length as the reply, this field
488  *               contains zero.
489  *              If the answer buffer is longer than the reply, this field contains
490  *               the number of bytes remaining in the buffer.
491  *              If the answer buffer is shorter than the reply, this field contains
492  *               a residual count (that is, the number of bytes remianing in the
493  *               reply that does not fit into the buffer. In this
494  *               case b2f0_result = 5.
495  * Return: Return code from CP IUCV call.
496  *         (-EINVAL) - Buffer address is NULL.
497 */
498 int iucv_reply_array (u16 pathid,
499 		      u32 msgid,
500 		      u32 trgcls,
501 		      int flags1,
502 		      iucv_array_t * buffer,
503 		      ulong buflen, ulong * residual_address,
504 		      ulong * residual_length);
505 
506 /*
507  * Name: iucv_reply_prmmsg
508  * Purpose: This function responds to the two-way messages that you
509  *          receive. You must identify completely the message to
510  *          which you wish to reply. ie, pathid, msgid, and trgcls.
511  *          Prmmsg signifies the data is moved into the
512  *          parameter list.
513  * Input: pathid - Path identification number.
514  *        msgid - Specifies the message ID.
515  *        trgcls - Specifies target class.
516  *        flags1 - Option for path.
517  *          IPPRTY- 0x20 Specifies if you want to send priority message.
518  *        prmmsg - 8-bytes of data to be placed into the parameter.
519  *                 list.
520  * Output: NA
521  * Return: Return code from CP IUCV call.
522 */
523 int iucv_reply_prmmsg (u16 pathid,
524 		       u32 msgid, u32 trgcls, int flags1, uchar prmmsg[8]);
525 
526 /*
527  * Name: iucv_resume
528  * Purpose: This function restores communications over a quiesced path
529  * Input: pathid - Path identification number.
530  *        user_data  - 16-bytes of user data.
531  * Output: NA
532  * Return: Return code from CP IUCV call.
533 */
534 int iucv_resume (u16 pathid, uchar user_data[16]);
535 
536 /*
537  * Name: iucv_send
538  * Purpose: This function transmits data to another application.
539  *          Data to be transmitted is in a buffer and this is a
540  *          one-way message and the receiver will not reply to the
541  *          message.
542  * Input: pathid - Path identification number.
543  *        trgcls - Specifies target class.
544  *        srccls - Specifies the source message class.
545  *        msgtag - Specifies a tag to be associated with the message.
546  *        flags1 - Option for path.
547  *          IPPRTY- 0x20 Specifies if you want to send priority message.
548  *        buffer - Address of send buffer.
549  *        buflen - Length of send buffer.
550  * Output: msgid - Specifies the message ID.
551  * Return: Return code from CP IUCV call.
552  *         (-EINVAL) - Buffer address is NULL.
553 */
554 int iucv_send (u16 pathid,
555 	       u32 * msgid,
556 	       u32 trgcls,
557 	       u32 srccls, u32 msgtag, int flags1, void *buffer, ulong buflen);
558 
559 /*
560  * Name: iucv_send_array
561  * Purpose: This function transmits data to another application.
562  *          The contents of buffer is the address of the array of
563  *          addresses and lengths of discontiguous buffers that hold
564  *          the message text. This is a one-way message and the
565  *          receiver will not reply to the message.
566  * Input: pathid - Path identification number.
567  *        trgcls - Specifies target class.
568  *        srccls - Specifies the source message class.
569  *        msgtag - Specifies a tag to be associated witht the message.
570  *        flags1 - Option for path.
571  *          IPPRTY- specifies if you want to send priority message.
572  *        buffer - Address of array of send buffers.
573  *        buflen - Total length of send buffers.
574  * Output: msgid - Specifies the message ID.
575  * Return: Return code from CP IUCV call.
576  *         (-EINVAL) - Buffer address is NULL.
577 */
578 int iucv_send_array (u16 pathid,
579 		     u32 * msgid,
580 		     u32 trgcls,
581 		     u32 srccls,
582 		     u32 msgtag,
583 		     int flags1, iucv_array_t * buffer, ulong buflen);
584 
585 /*
586  * Name: iucv_send_prmmsg
587  * Purpose: This function transmits data to another application.
588  *          Prmmsg specifies that the 8-bytes of data are to be moved
589  *          into the parameter list. This is a one-way message and the
590  *          receiver will not reply to the message.
591  * Input: pathid - Path identification number.
592  *        trgcls - Specifies target class.
593  *        srccls - Specifies the source message class.
594  *        msgtag - Specifies a tag to be associated with the message.
595  *        flags1 - Option for path.
596  *          IPPRTY- 0x20 specifies if you want to send priority message.
597  *        prmmsg - 8-bytes of data to be placed into parameter list.
598  * Output: msgid - Specifies the message ID.
599  * Return: Return code from CP IUCV call.
600 */
601 int iucv_send_prmmsg (u16 pathid,
602 		      u32 * msgid,
603 		      u32 trgcls,
604 		      u32 srccls, u32 msgtag, int flags1, uchar prmmsg[8]);
605 
606 /*
607  * Name: iucv_send2way
608  * Purpose: This function transmits data to another application.
609  *          Data to be transmitted is in a buffer. The receiver
610  *          of the send is expected to reply to the message and
611  *          a buffer is provided into which IUCV moves the reply
612  *          to this message.
613  * Input: pathid - Path identification number.
614  *        trgcls - Specifies target class.
615  *        srccls - Specifies the source message class.
616  *        msgtag - Specifies a tag associated with the message.
617  *        flags1 - Option for path.
618  *          IPPRTY- 0x20 Specifies if you want to send priority message.
619  *        buffer - Address of send buffer.
620  *        buflen - Length of send buffer.
621  *        ansbuf - Address of buffer into which IUCV moves the reply of
622  *                 this message.
623  *        anslen - Address of length of buffer.
624  * Output: msgid - Specifies the message ID.
625  * Return: Return code from CP IUCV call.
626  *         (-EINVAL) - Buffer or ansbuf address is NULL.
627 */
628 int iucv_send2way (u16 pathid,
629 		   u32 * msgid,
630 		   u32 trgcls,
631 		   u32 srccls,
632 		   u32 msgtag,
633 		   int flags1,
634 		   void *buffer, ulong buflen, void *ansbuf, ulong anslen);
635 
636 /*
637  * Name: iucv_send2way_array
638  * Purpose: This function transmits data to another application.
639  *          The contents of buffer is the address of the array of
640  *          addresses and lengths of discontiguous buffers that hold
641  *          the message text. The receiver of the send is expected to
642  *          reply to the message and a buffer is provided into which
643  *          IUCV moves the reply to this message.
644  * Input: pathid - Path identification number.
645  *        trgcls - Specifies target class.
646  *        srccls - Specifies the source message class.
647  *        msgtag - Specifies a tag to be associated with the message.
648  *        flags1 - Option for path.
649  *          IPPRTY- 0x20 Specifies if you want to send priority message.
650  *        buffer - Sddress of array of send buffers.
651  *        buflen - Total length of send buffers.
652  *        ansbuf - Address of array of buffer into which IUCV moves the reply
653  *                 of this message.
654  *        anslen - Address of length reply buffers.
655  * Output: msgid - Specifies the message ID.
656  * Return: Return code from CP IUCV call.
657  *         (-EINVAL) - Buffer address is NULL.
658 */
659 int iucv_send2way_array (u16 pathid,
660 			 u32 * msgid,
661 			 u32 trgcls,
662 			 u32 srccls,
663 			 u32 msgtag,
664 			 int flags1,
665 			 iucv_array_t * buffer,
666 			 ulong buflen, iucv_array_t * ansbuf, ulong anslen);
667 
668 /*
669  * Name: iucv_send2way_prmmsg
670  * Purpose: This function transmits data to another application.
671  *          Prmmsg specifies that the 8-bytes of data are to be moved
672  *          into the parameter list. This is a two-way message and the
673  *          receiver of the message is expected to reply. A buffer
674  *          is provided into which IUCV moves the reply to this
675  *          message.
676  * Input: pathid - Rath identification number.
677  *        trgcls - Specifies target class.
678  *        srccls - Specifies the source message class.
679  *        msgtag - Specifies a tag to be associated with the message.
680  *        flags1 - Option for path.
681  *          IPPRTY- 0x20 Specifies if you want to send priority message.
682  *        prmmsg - 8-bytes of data to be placed in parameter list.
683  *        ansbuf - Address of buffer into which IUCV moves the reply of
684  *                 this message.
685  *        anslen - Address of length of buffer.
686  * Output: msgid - Specifies the message ID.
687  * Return: Return code from CP IUCV call.
688  *         (-EINVAL) - Buffer address is NULL.
689 */
690 int iucv_send2way_prmmsg (u16 pathid,
691 			  u32 * msgid,
692 			  u32 trgcls,
693 			  u32 srccls,
694 			  u32 msgtag,
695 			  ulong flags1,
696 			  uchar prmmsg[8], void *ansbuf, ulong anslen);
697 
698 /*
699  * Name: iucv_send2way_prmmsg_array
700  * Purpose: This function transmits data to another application.
701  *          Prmmsg specifies that the 8-bytes of data are to be moved
702  *          into the parameter list. This is a two-way message and the
703  *          receiver of the message is expected to reply. A buffer
704  *          is provided into which IUCV moves the reply to this
705  *          message. The contents of ansbuf is the address of the
706  *          array of addresses and lengths of discontiguous buffers
707  *          that contain the reply.
708  * Input: pathid - Path identification number.
709  *        trgcls - Specifies target class.
710  *        srccls - Specifies the source message class.
711  *        msgtag - Specifies a tag to be associated with the message.
712  *        flags1 - Option for path.
713  *          IPPRTY- 0x20 specifies if you want to send priority message.
714  *        prmmsg - 8-bytes of data to be placed into the parameter list.
715  *        ansbuf - Address of array of buffer into which IUCV moves the reply
716  *                 of this message.
717  *        anslen - Address of length of reply buffers.
718  * Output: msgid - Specifies the message ID.
719  * Return: Return code from CP IUCV call.
720  *         (-EINVAL) - Ansbuf address is NULL.
721 */
722 int iucv_send2way_prmmsg_array (u16 pathid,
723 				u32 * msgid,
724 				u32 trgcls,
725 				u32 srccls,
726 				u32 msgtag,
727 				int flags1,
728 				uchar prmmsg[8],
729 				iucv_array_t * ansbuf, ulong anslen);
730 
731 /*
732  * Name: iucv_setmask
733  * Purpose: This function enables or disables the following IUCV
734  *          external interruptions: Nonpriority and priority message
735  *          interrupts, nonpriority and priority reply interrupts.
736  * Input: SetMaskFlag - options for interrupts
737  *           0x80 - Nonpriority_MessagePendingInterruptsFlag
738  *           0x40 - Priority_MessagePendingInterruptsFlag
739  *           0x20 - Nonpriority_MessageCompletionInterruptsFlag
740  *           0x10 - Priority_MessageCompletionInterruptsFlag
741  *           0x08 - IUCVControlInterruptsFlag
742  * Output: NA
743  * Return: Return code from CP IUCV call.
744 */
745 int iucv_setmask (int SetMaskFlag);
746 
747 /*
748  * Name: iucv_sever
749  * Purpose: This function terminates an IUCV path.
750  * Input: pathid - Path identification number.
751  *        user_data - 16-bytes of user data.
752  * Output: NA
753  * Return: Return code from CP IUCV call.
754  *         (-EINVAL) - Interal error, wild pointer.
755 */
756 int iucv_sever (u16 pathid, uchar user_data[16]);
757