xref: /linux/arch/s390/include/asm/scsw.h (revision 79790b6818e96c58fe2bffee1b418c16e64e7b80)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  *  Helper functions for scsw access.
4  *
5  *    Copyright IBM Corp. 2008, 2012
6  *    Author(s): Peter Oberparleiter <peter.oberparleiter@de.ibm.com>
7  */
8 
9 #ifndef _ASM_S390_SCSW_H_
10 #define _ASM_S390_SCSW_H_
11 
12 #include <linux/types.h>
13 #include <asm/css_chars.h>
14 #include <asm/dma-types.h>
15 #include <asm/cio.h>
16 
17 /**
18  * struct cmd_scsw - command-mode subchannel status word
19  * @key: subchannel key
20  * @sctl: suspend control
21  * @eswf: esw format
22  * @cc: deferred condition code
23  * @fmt: format
24  * @pfch: prefetch
25  * @isic: initial-status interruption control
26  * @alcc: address-limit checking control
27  * @ssi: suppress-suspended interruption
28  * @zcc: zero condition code
29  * @ectl: extended control
30  * @pno: path not operational
31  * @res: reserved
32  * @fctl: function control
33  * @actl: activity control
34  * @stctl: status control
35  * @cpa: channel program address
36  * @dstat: device status
37  * @cstat: subchannel status
38  * @count: residual count
39  */
40 struct cmd_scsw {
41 	__u32 key  : 4;
42 	__u32 sctl : 1;
43 	__u32 eswf : 1;
44 	__u32 cc   : 2;
45 	__u32 fmt  : 1;
46 	__u32 pfch : 1;
47 	__u32 isic : 1;
48 	__u32 alcc : 1;
49 	__u32 ssi  : 1;
50 	__u32 zcc  : 1;
51 	__u32 ectl : 1;
52 	__u32 pno  : 1;
53 	__u32 res  : 1;
54 	__u32 fctl : 3;
55 	__u32 actl : 7;
56 	__u32 stctl : 5;
57 	dma32_t cpa;
58 	__u32 dstat : 8;
59 	__u32 cstat : 8;
60 	__u32 count : 16;
61 } __attribute__ ((packed));
62 
63 /**
64  * struct tm_scsw - transport-mode subchannel status word
65  * @key: subchannel key
66  * @eswf: esw format
67  * @cc: deferred condition code
68  * @fmt: format
69  * @x: IRB-format control
70  * @q: interrogate-complete
71  * @ectl: extended control
72  * @pno: path not operational
73  * @fctl: function control
74  * @actl: activity control
75  * @stctl: status control
76  * @tcw: TCW address
77  * @dstat: device status
78  * @cstat: subchannel status
79  * @fcxs: FCX status
80  * @schxs: subchannel-extended status
81  */
82 struct tm_scsw {
83 	u32 key:4;
84 	u32 :1;
85 	u32 eswf:1;
86 	u32 cc:2;
87 	u32 fmt:3;
88 	u32 x:1;
89 	u32 q:1;
90 	u32 :1;
91 	u32 ectl:1;
92 	u32 pno:1;
93 	u32 :1;
94 	u32 fctl:3;
95 	u32 actl:7;
96 	u32 stctl:5;
97 	dma32_t tcw;
98 	u32 dstat:8;
99 	u32 cstat:8;
100 	u32 fcxs:8;
101 	u32 ifob:1;
102 	u32 sesq:7;
103 } __attribute__ ((packed));
104 
105 /**
106  * struct eadm_scsw - subchannel status word for eadm subchannels
107  * @key: subchannel key
108  * @eswf: esw format
109  * @cc: deferred condition code
110  * @ectl: extended control
111  * @fctl: function control
112  * @actl: activity control
113  * @stctl: status control
114  * @aob: AOB address
115  * @dstat: device status
116  * @cstat: subchannel status
117  */
118 struct eadm_scsw {
119 	u32 key:4;
120 	u32:1;
121 	u32 eswf:1;
122 	u32 cc:2;
123 	u32:6;
124 	u32 ectl:1;
125 	u32:2;
126 	u32 fctl:3;
127 	u32 actl:7;
128 	u32 stctl:5;
129 	dma32_t aob;
130 	u32 dstat:8;
131 	u32 cstat:8;
132 	u32:16;
133 } __packed;
134 
135 /**
136  * union scsw - subchannel status word
137  * @cmd: command-mode SCSW
138  * @tm: transport-mode SCSW
139  * @eadm: eadm SCSW
140  */
141 union scsw {
142 	struct cmd_scsw cmd;
143 	struct tm_scsw tm;
144 	struct eadm_scsw eadm;
145 } __packed;
146 
147 #define SCSW_FCTL_CLEAR_FUNC	 0x1
148 #define SCSW_FCTL_HALT_FUNC	 0x2
149 #define SCSW_FCTL_START_FUNC	 0x4
150 
151 #define SCSW_ACTL_SUSPENDED	 0x1
152 #define SCSW_ACTL_DEVACT	 0x2
153 #define SCSW_ACTL_SCHACT	 0x4
154 #define SCSW_ACTL_CLEAR_PEND	 0x8
155 #define SCSW_ACTL_HALT_PEND	 0x10
156 #define SCSW_ACTL_START_PEND	 0x20
157 #define SCSW_ACTL_RESUME_PEND	 0x40
158 
159 #define SCSW_STCTL_STATUS_PEND	 0x1
160 #define SCSW_STCTL_SEC_STATUS	 0x2
161 #define SCSW_STCTL_PRIM_STATUS	 0x4
162 #define SCSW_STCTL_INTER_STATUS	 0x8
163 #define SCSW_STCTL_ALERT_STATUS	 0x10
164 
165 #define DEV_STAT_ATTENTION	 0x80
166 #define DEV_STAT_STAT_MOD	 0x40
167 #define DEV_STAT_CU_END		 0x20
168 #define DEV_STAT_BUSY		 0x10
169 #define DEV_STAT_CHN_END	 0x08
170 #define DEV_STAT_DEV_END	 0x04
171 #define DEV_STAT_UNIT_CHECK	 0x02
172 #define DEV_STAT_UNIT_EXCEP	 0x01
173 
174 #define SCHN_STAT_PCI		 0x80
175 #define SCHN_STAT_INCORR_LEN	 0x40
176 #define SCHN_STAT_PROG_CHECK	 0x20
177 #define SCHN_STAT_PROT_CHECK	 0x10
178 #define SCHN_STAT_CHN_DATA_CHK	 0x08
179 #define SCHN_STAT_CHN_CTRL_CHK	 0x04
180 #define SCHN_STAT_INTF_CTRL_CHK	 0x02
181 #define SCHN_STAT_CHAIN_CHECK	 0x01
182 
183 #define SCSW_SESQ_DEV_NOFCX	 3
184 #define SCSW_SESQ_PATH_NOFCX	 4
185 
186 /*
187  * architectured values for first sense byte
188  */
189 #define SNS0_CMD_REJECT		0x80
190 #define SNS_CMD_REJECT		SNS0_CMD_REJEC
191 #define SNS0_INTERVENTION_REQ	0x40
192 #define SNS0_BUS_OUT_CHECK	0x20
193 #define SNS0_EQUIPMENT_CHECK	0x10
194 #define SNS0_DATA_CHECK		0x08
195 #define SNS0_OVERRUN		0x04
196 #define SNS0_INCOMPL_DOMAIN	0x01
197 
198 /*
199  * architectured values for second sense byte
200  */
201 #define SNS1_PERM_ERR		0x80
202 #define SNS1_INV_TRACK_FORMAT	0x40
203 #define SNS1_EOC		0x20
204 #define SNS1_MESSAGE_TO_OPER	0x10
205 #define SNS1_NO_REC_FOUND	0x08
206 #define SNS1_FILE_PROTECTED	0x04
207 #define SNS1_WRITE_INHIBITED	0x02
208 #define SNS1_INPRECISE_END	0x01
209 
210 /*
211  * architectured values for third sense byte
212  */
213 #define SNS2_REQ_INH_WRITE	0x80
214 #define SNS2_CORRECTABLE	0x40
215 #define SNS2_FIRST_LOG_ERR	0x20
216 #define SNS2_ENV_DATA_PRESENT	0x10
217 #define SNS2_INPRECISE_END	0x04
218 
219 /*
220  * architectured values for PPRC errors
221  */
222 #define SNS7_INVALID_ON_SEC	0x0e
223 
224 /**
225  * scsw_is_tm - check for transport mode scsw
226  * @scsw: pointer to scsw
227  *
228  * Return non-zero if the specified scsw is a transport mode scsw, zero
229  * otherwise.
230  */
scsw_is_tm(union scsw * scsw)231 static inline int scsw_is_tm(union scsw *scsw)
232 {
233 	return css_general_characteristics.fcx && (scsw->tm.x == 1);
234 }
235 
236 /**
237  * scsw_key - return scsw key field
238  * @scsw: pointer to scsw
239  *
240  * Return the value of the key field of the specified scsw, regardless of
241  * whether it is a transport mode or command mode scsw.
242  */
scsw_key(union scsw * scsw)243 static inline u32 scsw_key(union scsw *scsw)
244 {
245 	if (scsw_is_tm(scsw))
246 		return scsw->tm.key;
247 	else
248 		return scsw->cmd.key;
249 }
250 
251 /**
252  * scsw_eswf - return scsw eswf field
253  * @scsw: pointer to scsw
254  *
255  * Return the value of the eswf field of the specified scsw, regardless of
256  * whether it is a transport mode or command mode scsw.
257  */
scsw_eswf(union scsw * scsw)258 static inline u32 scsw_eswf(union scsw *scsw)
259 {
260 	if (scsw_is_tm(scsw))
261 		return scsw->tm.eswf;
262 	else
263 		return scsw->cmd.eswf;
264 }
265 
266 /**
267  * scsw_cc - return scsw cc field
268  * @scsw: pointer to scsw
269  *
270  * Return the value of the cc field of the specified scsw, regardless of
271  * whether it is a transport mode or command mode scsw.
272  */
scsw_cc(union scsw * scsw)273 static inline u32 scsw_cc(union scsw *scsw)
274 {
275 	if (scsw_is_tm(scsw))
276 		return scsw->tm.cc;
277 	else
278 		return scsw->cmd.cc;
279 }
280 
281 /**
282  * scsw_ectl - return scsw ectl field
283  * @scsw: pointer to scsw
284  *
285  * Return the value of the ectl field of the specified scsw, regardless of
286  * whether it is a transport mode or command mode scsw.
287  */
scsw_ectl(union scsw * scsw)288 static inline u32 scsw_ectl(union scsw *scsw)
289 {
290 	if (scsw_is_tm(scsw))
291 		return scsw->tm.ectl;
292 	else
293 		return scsw->cmd.ectl;
294 }
295 
296 /**
297  * scsw_pno - return scsw pno field
298  * @scsw: pointer to scsw
299  *
300  * Return the value of the pno field of the specified scsw, regardless of
301  * whether it is a transport mode or command mode scsw.
302  */
scsw_pno(union scsw * scsw)303 static inline u32 scsw_pno(union scsw *scsw)
304 {
305 	if (scsw_is_tm(scsw))
306 		return scsw->tm.pno;
307 	else
308 		return scsw->cmd.pno;
309 }
310 
311 /**
312  * scsw_fctl - return scsw fctl field
313  * @scsw: pointer to scsw
314  *
315  * Return the value of the fctl field of the specified scsw, regardless of
316  * whether it is a transport mode or command mode scsw.
317  */
scsw_fctl(union scsw * scsw)318 static inline u32 scsw_fctl(union scsw *scsw)
319 {
320 	if (scsw_is_tm(scsw))
321 		return scsw->tm.fctl;
322 	else
323 		return scsw->cmd.fctl;
324 }
325 
326 /**
327  * scsw_actl - return scsw actl field
328  * @scsw: pointer to scsw
329  *
330  * Return the value of the actl field of the specified scsw, regardless of
331  * whether it is a transport mode or command mode scsw.
332  */
scsw_actl(union scsw * scsw)333 static inline u32 scsw_actl(union scsw *scsw)
334 {
335 	if (scsw_is_tm(scsw))
336 		return scsw->tm.actl;
337 	else
338 		return scsw->cmd.actl;
339 }
340 
341 /**
342  * scsw_stctl - return scsw stctl field
343  * @scsw: pointer to scsw
344  *
345  * Return the value of the stctl field of the specified scsw, regardless of
346  * whether it is a transport mode or command mode scsw.
347  */
scsw_stctl(union scsw * scsw)348 static inline u32 scsw_stctl(union scsw *scsw)
349 {
350 	if (scsw_is_tm(scsw))
351 		return scsw->tm.stctl;
352 	else
353 		return scsw->cmd.stctl;
354 }
355 
356 /**
357  * scsw_dstat - return scsw dstat field
358  * @scsw: pointer to scsw
359  *
360  * Return the value of the dstat field of the specified scsw, regardless of
361  * whether it is a transport mode or command mode scsw.
362  */
scsw_dstat(union scsw * scsw)363 static inline u32 scsw_dstat(union scsw *scsw)
364 {
365 	if (scsw_is_tm(scsw))
366 		return scsw->tm.dstat;
367 	else
368 		return scsw->cmd.dstat;
369 }
370 
371 /**
372  * scsw_cstat - return scsw cstat field
373  * @scsw: pointer to scsw
374  *
375  * Return the value of the cstat field of the specified scsw, regardless of
376  * whether it is a transport mode or command mode scsw.
377  */
scsw_cstat(union scsw * scsw)378 static inline u32 scsw_cstat(union scsw *scsw)
379 {
380 	if (scsw_is_tm(scsw))
381 		return scsw->tm.cstat;
382 	else
383 		return scsw->cmd.cstat;
384 }
385 
386 /**
387  * scsw_cmd_is_valid_key - check key field validity
388  * @scsw: pointer to scsw
389  *
390  * Return non-zero if the key field of the specified command mode scsw is
391  * valid, zero otherwise.
392  */
scsw_cmd_is_valid_key(union scsw * scsw)393 static inline int scsw_cmd_is_valid_key(union scsw *scsw)
394 {
395 	return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
396 }
397 
398 /**
399  * scsw_cmd_is_valid_sctl - check sctl field validity
400  * @scsw: pointer to scsw
401  *
402  * Return non-zero if the sctl field of the specified command mode scsw is
403  * valid, zero otherwise.
404  */
scsw_cmd_is_valid_sctl(union scsw * scsw)405 static inline int scsw_cmd_is_valid_sctl(union scsw *scsw)
406 {
407 	return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
408 }
409 
410 /**
411  * scsw_cmd_is_valid_eswf - check eswf field validity
412  * @scsw: pointer to scsw
413  *
414  * Return non-zero if the eswf field of the specified command mode scsw is
415  * valid, zero otherwise.
416  */
scsw_cmd_is_valid_eswf(union scsw * scsw)417 static inline int scsw_cmd_is_valid_eswf(union scsw *scsw)
418 {
419 	return (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND);
420 }
421 
422 /**
423  * scsw_cmd_is_valid_cc - check cc field validity
424  * @scsw: pointer to scsw
425  *
426  * Return non-zero if the cc field of the specified command mode scsw is
427  * valid, zero otherwise.
428  */
scsw_cmd_is_valid_cc(union scsw * scsw)429 static inline int scsw_cmd_is_valid_cc(union scsw *scsw)
430 {
431 	return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC) &&
432 	       (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND);
433 }
434 
435 /**
436  * scsw_cmd_is_valid_fmt - check fmt field validity
437  * @scsw: pointer to scsw
438  *
439  * Return non-zero if the fmt field of the specified command mode scsw is
440  * valid, zero otherwise.
441  */
scsw_cmd_is_valid_fmt(union scsw * scsw)442 static inline int scsw_cmd_is_valid_fmt(union scsw *scsw)
443 {
444 	return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
445 }
446 
447 /**
448  * scsw_cmd_is_valid_pfch - check pfch field validity
449  * @scsw: pointer to scsw
450  *
451  * Return non-zero if the pfch field of the specified command mode scsw is
452  * valid, zero otherwise.
453  */
scsw_cmd_is_valid_pfch(union scsw * scsw)454 static inline int scsw_cmd_is_valid_pfch(union scsw *scsw)
455 {
456 	return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
457 }
458 
459 /**
460  * scsw_cmd_is_valid_isic - check isic field validity
461  * @scsw: pointer to scsw
462  *
463  * Return non-zero if the isic field of the specified command mode scsw is
464  * valid, zero otherwise.
465  */
scsw_cmd_is_valid_isic(union scsw * scsw)466 static inline int scsw_cmd_is_valid_isic(union scsw *scsw)
467 {
468 	return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
469 }
470 
471 /**
472  * scsw_cmd_is_valid_alcc - check alcc field validity
473  * @scsw: pointer to scsw
474  *
475  * Return non-zero if the alcc field of the specified command mode scsw is
476  * valid, zero otherwise.
477  */
scsw_cmd_is_valid_alcc(union scsw * scsw)478 static inline int scsw_cmd_is_valid_alcc(union scsw *scsw)
479 {
480 	return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
481 }
482 
483 /**
484  * scsw_cmd_is_valid_ssi - check ssi field validity
485  * @scsw: pointer to scsw
486  *
487  * Return non-zero if the ssi field of the specified command mode scsw is
488  * valid, zero otherwise.
489  */
scsw_cmd_is_valid_ssi(union scsw * scsw)490 static inline int scsw_cmd_is_valid_ssi(union scsw *scsw)
491 {
492 	return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
493 }
494 
495 /**
496  * scsw_cmd_is_valid_zcc - check zcc field validity
497  * @scsw: pointer to scsw
498  *
499  * Return non-zero if the zcc field of the specified command mode scsw is
500  * valid, zero otherwise.
501  */
scsw_cmd_is_valid_zcc(union scsw * scsw)502 static inline int scsw_cmd_is_valid_zcc(union scsw *scsw)
503 {
504 	return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC) &&
505 	       (scsw->cmd.stctl & SCSW_STCTL_INTER_STATUS);
506 }
507 
508 /**
509  * scsw_cmd_is_valid_ectl - check ectl field validity
510  * @scsw: pointer to scsw
511  *
512  * Return non-zero if the ectl field of the specified command mode scsw is
513  * valid, zero otherwise.
514  */
scsw_cmd_is_valid_ectl(union scsw * scsw)515 static inline int scsw_cmd_is_valid_ectl(union scsw *scsw)
516 {
517 	/* Must be status pending. */
518 	if (!(scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND))
519 		return 0;
520 
521 	/* Must have alert status. */
522 	if (!(scsw->cmd.stctl & SCSW_STCTL_ALERT_STATUS))
523 		return 0;
524 
525 	/* Must be alone or together with primary, secondary or both,
526 	 * => no intermediate status.
527 	 */
528 	if (scsw->cmd.stctl & SCSW_STCTL_INTER_STATUS)
529 		return 0;
530 
531 	return 1;
532 }
533 
534 /**
535  * scsw_cmd_is_valid_pno - check pno field validity
536  * @scsw: pointer to scsw
537  *
538  * Return non-zero if the pno field of the specified command mode scsw is
539  * valid, zero otherwise.
540  */
scsw_cmd_is_valid_pno(union scsw * scsw)541 static inline int scsw_cmd_is_valid_pno(union scsw *scsw)
542 {
543 	/* Must indicate at least one I/O function. */
544 	if (!scsw->cmd.fctl)
545 		return 0;
546 
547 	/* Must be status pending. */
548 	if (!(scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND))
549 		return 0;
550 
551 	/* Can be status pending alone, or with any combination of primary,
552 	 * secondary and alert => no intermediate status.
553 	 */
554 	if (!(scsw->cmd.stctl & SCSW_STCTL_INTER_STATUS))
555 		return 1;
556 
557 	/* If intermediate, must be suspended. */
558 	if (scsw->cmd.actl & SCSW_ACTL_SUSPENDED)
559 		return 1;
560 
561 	return 0;
562 }
563 
564 /**
565  * scsw_cmd_is_valid_fctl - check fctl field validity
566  * @scsw: pointer to scsw
567  *
568  * Return non-zero if the fctl field of the specified command mode scsw is
569  * valid, zero otherwise.
570  */
scsw_cmd_is_valid_fctl(union scsw * scsw)571 static inline int scsw_cmd_is_valid_fctl(union scsw *scsw)
572 {
573 	/* Only valid if pmcw.dnv == 1*/
574 	return 1;
575 }
576 
577 /**
578  * scsw_cmd_is_valid_actl - check actl field validity
579  * @scsw: pointer to scsw
580  *
581  * Return non-zero if the actl field of the specified command mode scsw is
582  * valid, zero otherwise.
583  */
scsw_cmd_is_valid_actl(union scsw * scsw)584 static inline int scsw_cmd_is_valid_actl(union scsw *scsw)
585 {
586 	/* Only valid if pmcw.dnv == 1*/
587 	return 1;
588 }
589 
590 /**
591  * scsw_cmd_is_valid_stctl - check stctl field validity
592  * @scsw: pointer to scsw
593  *
594  * Return non-zero if the stctl field of the specified command mode scsw is
595  * valid, zero otherwise.
596  */
scsw_cmd_is_valid_stctl(union scsw * scsw)597 static inline int scsw_cmd_is_valid_stctl(union scsw *scsw)
598 {
599 	/* Only valid if pmcw.dnv == 1*/
600 	return 1;
601 }
602 
603 /**
604  * scsw_cmd_is_valid_dstat - check dstat field validity
605  * @scsw: pointer to scsw
606  *
607  * Return non-zero if the dstat field of the specified command mode scsw is
608  * valid, zero otherwise.
609  */
scsw_cmd_is_valid_dstat(union scsw * scsw)610 static inline int scsw_cmd_is_valid_dstat(union scsw *scsw)
611 {
612 	return (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND) &&
613 	       (scsw->cmd.cc != 3);
614 }
615 
616 /**
617  * scsw_cmd_is_valid_cstat - check cstat field validity
618  * @scsw: pointer to scsw
619  *
620  * Return non-zero if the cstat field of the specified command mode scsw is
621  * valid, zero otherwise.
622  */
scsw_cmd_is_valid_cstat(union scsw * scsw)623 static inline int scsw_cmd_is_valid_cstat(union scsw *scsw)
624 {
625 	return (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND) &&
626 	       (scsw->cmd.cc != 3);
627 }
628 
629 /**
630  * scsw_tm_is_valid_key - check key field validity
631  * @scsw: pointer to scsw
632  *
633  * Return non-zero if the key field of the specified transport mode scsw is
634  * valid, zero otherwise.
635  */
scsw_tm_is_valid_key(union scsw * scsw)636 static inline int scsw_tm_is_valid_key(union scsw *scsw)
637 {
638 	return (scsw->tm.fctl & SCSW_FCTL_START_FUNC);
639 }
640 
641 /**
642  * scsw_tm_is_valid_eswf - check eswf field validity
643  * @scsw: pointer to scsw
644  *
645  * Return non-zero if the eswf field of the specified transport mode scsw is
646  * valid, zero otherwise.
647  */
scsw_tm_is_valid_eswf(union scsw * scsw)648 static inline int scsw_tm_is_valid_eswf(union scsw *scsw)
649 {
650 	return (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND);
651 }
652 
653 /**
654  * scsw_tm_is_valid_cc - check cc field validity
655  * @scsw: pointer to scsw
656  *
657  * Return non-zero if the cc field of the specified transport mode scsw is
658  * valid, zero otherwise.
659  */
scsw_tm_is_valid_cc(union scsw * scsw)660 static inline int scsw_tm_is_valid_cc(union scsw *scsw)
661 {
662 	return (scsw->tm.fctl & SCSW_FCTL_START_FUNC) &&
663 	       (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND);
664 }
665 
666 /**
667  * scsw_tm_is_valid_fmt - check fmt field validity
668  * @scsw: pointer to scsw
669  *
670  * Return non-zero if the fmt field of the specified transport mode scsw is
671  * valid, zero otherwise.
672  */
scsw_tm_is_valid_fmt(union scsw * scsw)673 static inline int scsw_tm_is_valid_fmt(union scsw *scsw)
674 {
675 	return 1;
676 }
677 
678 /**
679  * scsw_tm_is_valid_x - check x field validity
680  * @scsw: pointer to scsw
681  *
682  * Return non-zero if the x field of the specified transport mode scsw is
683  * valid, zero otherwise.
684  */
scsw_tm_is_valid_x(union scsw * scsw)685 static inline int scsw_tm_is_valid_x(union scsw *scsw)
686 {
687 	return 1;
688 }
689 
690 /**
691  * scsw_tm_is_valid_q - check q field validity
692  * @scsw: pointer to scsw
693  *
694  * Return non-zero if the q field of the specified transport mode scsw is
695  * valid, zero otherwise.
696  */
scsw_tm_is_valid_q(union scsw * scsw)697 static inline int scsw_tm_is_valid_q(union scsw *scsw)
698 {
699 	return 1;
700 }
701 
702 /**
703  * scsw_tm_is_valid_ectl - check ectl field validity
704  * @scsw: pointer to scsw
705  *
706  * Return non-zero if the ectl field of the specified transport mode scsw is
707  * valid, zero otherwise.
708  */
scsw_tm_is_valid_ectl(union scsw * scsw)709 static inline int scsw_tm_is_valid_ectl(union scsw *scsw)
710 {
711 	/* Must be status pending. */
712 	if (!(scsw->tm.stctl & SCSW_STCTL_STATUS_PEND))
713 		return 0;
714 
715 	/* Must have alert status. */
716 	if (!(scsw->tm.stctl & SCSW_STCTL_ALERT_STATUS))
717 		return 0;
718 
719 	/* Must be alone or together with primary, secondary or both,
720 	 * => no intermediate status.
721 	 */
722 	if (scsw->tm.stctl & SCSW_STCTL_INTER_STATUS)
723 		return 0;
724 
725 	return 1;
726 }
727 
728 /**
729  * scsw_tm_is_valid_pno - check pno field validity
730  * @scsw: pointer to scsw
731  *
732  * Return non-zero if the pno field of the specified transport mode scsw is
733  * valid, zero otherwise.
734  */
scsw_tm_is_valid_pno(union scsw * scsw)735 static inline int scsw_tm_is_valid_pno(union scsw *scsw)
736 {
737 	/* Must indicate at least one I/O function. */
738 	if (!scsw->tm.fctl)
739 		return 0;
740 
741 	/* Must be status pending. */
742 	if (!(scsw->tm.stctl & SCSW_STCTL_STATUS_PEND))
743 		return 0;
744 
745 	/* Can be status pending alone, or with any combination of primary,
746 	 * secondary and alert => no intermediate status.
747 	 */
748 	if (!(scsw->tm.stctl & SCSW_STCTL_INTER_STATUS))
749 		return 1;
750 
751 	/* If intermediate, must be suspended. */
752 	if (scsw->tm.actl & SCSW_ACTL_SUSPENDED)
753 		return 1;
754 
755 	return 0;
756 }
757 
758 /**
759  * scsw_tm_is_valid_fctl - check fctl field validity
760  * @scsw: pointer to scsw
761  *
762  * Return non-zero if the fctl field of the specified transport mode scsw is
763  * valid, zero otherwise.
764  */
scsw_tm_is_valid_fctl(union scsw * scsw)765 static inline int scsw_tm_is_valid_fctl(union scsw *scsw)
766 {
767 	/* Only valid if pmcw.dnv == 1*/
768 	return 1;
769 }
770 
771 /**
772  * scsw_tm_is_valid_actl - check actl field validity
773  * @scsw: pointer to scsw
774  *
775  * Return non-zero if the actl field of the specified transport mode scsw is
776  * valid, zero otherwise.
777  */
scsw_tm_is_valid_actl(union scsw * scsw)778 static inline int scsw_tm_is_valid_actl(union scsw *scsw)
779 {
780 	/* Only valid if pmcw.dnv == 1*/
781 	return 1;
782 }
783 
784 /**
785  * scsw_tm_is_valid_stctl - check stctl field validity
786  * @scsw: pointer to scsw
787  *
788  * Return non-zero if the stctl field of the specified transport mode scsw is
789  * valid, zero otherwise.
790  */
scsw_tm_is_valid_stctl(union scsw * scsw)791 static inline int scsw_tm_is_valid_stctl(union scsw *scsw)
792 {
793 	/* Only valid if pmcw.dnv == 1*/
794 	return 1;
795 }
796 
797 /**
798  * scsw_tm_is_valid_dstat - check dstat field validity
799  * @scsw: pointer to scsw
800  *
801  * Return non-zero if the dstat field of the specified transport mode scsw is
802  * valid, zero otherwise.
803  */
scsw_tm_is_valid_dstat(union scsw * scsw)804 static inline int scsw_tm_is_valid_dstat(union scsw *scsw)
805 {
806 	return (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND) &&
807 	       (scsw->tm.cc != 3);
808 }
809 
810 /**
811  * scsw_tm_is_valid_cstat - check cstat field validity
812  * @scsw: pointer to scsw
813  *
814  * Return non-zero if the cstat field of the specified transport mode scsw is
815  * valid, zero otherwise.
816  */
scsw_tm_is_valid_cstat(union scsw * scsw)817 static inline int scsw_tm_is_valid_cstat(union scsw *scsw)
818 {
819 	return (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND) &&
820 	       (scsw->tm.cc != 3);
821 }
822 
823 /**
824  * scsw_tm_is_valid_fcxs - check fcxs field validity
825  * @scsw: pointer to scsw
826  *
827  * Return non-zero if the fcxs field of the specified transport mode scsw is
828  * valid, zero otherwise.
829  */
scsw_tm_is_valid_fcxs(union scsw * scsw)830 static inline int scsw_tm_is_valid_fcxs(union scsw *scsw)
831 {
832 	return 1;
833 }
834 
835 /**
836  * scsw_tm_is_valid_schxs - check schxs field validity
837  * @scsw: pointer to scsw
838  *
839  * Return non-zero if the schxs field of the specified transport mode scsw is
840  * valid, zero otherwise.
841  */
scsw_tm_is_valid_schxs(union scsw * scsw)842 static inline int scsw_tm_is_valid_schxs(union scsw *scsw)
843 {
844 	return (scsw->tm.cstat & (SCHN_STAT_PROG_CHECK |
845 				  SCHN_STAT_INTF_CTRL_CHK |
846 				  SCHN_STAT_PROT_CHECK |
847 				  SCHN_STAT_CHN_DATA_CHK));
848 }
849 
850 /**
851  * scsw_is_valid_actl - check actl field validity
852  * @scsw: pointer to scsw
853  *
854  * Return non-zero if the actl field of the specified scsw is valid,
855  * regardless of whether it is a transport mode or command mode scsw.
856  * Return zero if the field does not contain a valid value.
857  */
scsw_is_valid_actl(union scsw * scsw)858 static inline int scsw_is_valid_actl(union scsw *scsw)
859 {
860 	if (scsw_is_tm(scsw))
861 		return scsw_tm_is_valid_actl(scsw);
862 	else
863 		return scsw_cmd_is_valid_actl(scsw);
864 }
865 
866 /**
867  * scsw_is_valid_cc - check cc field validity
868  * @scsw: pointer to scsw
869  *
870  * Return non-zero if the cc field of the specified scsw is valid,
871  * regardless of whether it is a transport mode or command mode scsw.
872  * Return zero if the field does not contain a valid value.
873  */
scsw_is_valid_cc(union scsw * scsw)874 static inline int scsw_is_valid_cc(union scsw *scsw)
875 {
876 	if (scsw_is_tm(scsw))
877 		return scsw_tm_is_valid_cc(scsw);
878 	else
879 		return scsw_cmd_is_valid_cc(scsw);
880 }
881 
882 /**
883  * scsw_is_valid_cstat - check cstat field validity
884  * @scsw: pointer to scsw
885  *
886  * Return non-zero if the cstat field of the specified scsw is valid,
887  * regardless of whether it is a transport mode or command mode scsw.
888  * Return zero if the field does not contain a valid value.
889  */
scsw_is_valid_cstat(union scsw * scsw)890 static inline int scsw_is_valid_cstat(union scsw *scsw)
891 {
892 	if (scsw_is_tm(scsw))
893 		return scsw_tm_is_valid_cstat(scsw);
894 	else
895 		return scsw_cmd_is_valid_cstat(scsw);
896 }
897 
898 /**
899  * scsw_is_valid_dstat - check dstat field validity
900  * @scsw: pointer to scsw
901  *
902  * Return non-zero if the dstat field of the specified scsw is valid,
903  * regardless of whether it is a transport mode or command mode scsw.
904  * Return zero if the field does not contain a valid value.
905  */
scsw_is_valid_dstat(union scsw * scsw)906 static inline int scsw_is_valid_dstat(union scsw *scsw)
907 {
908 	if (scsw_is_tm(scsw))
909 		return scsw_tm_is_valid_dstat(scsw);
910 	else
911 		return scsw_cmd_is_valid_dstat(scsw);
912 }
913 
914 /**
915  * scsw_is_valid_ectl - check ectl field validity
916  * @scsw: pointer to scsw
917  *
918  * Return non-zero if the ectl field of the specified scsw is valid,
919  * regardless of whether it is a transport mode or command mode scsw.
920  * Return zero if the field does not contain a valid value.
921  */
scsw_is_valid_ectl(union scsw * scsw)922 static inline int scsw_is_valid_ectl(union scsw *scsw)
923 {
924 	if (scsw_is_tm(scsw))
925 		return scsw_tm_is_valid_ectl(scsw);
926 	else
927 		return scsw_cmd_is_valid_ectl(scsw);
928 }
929 
930 /**
931  * scsw_is_valid_eswf - check eswf field validity
932  * @scsw: pointer to scsw
933  *
934  * Return non-zero if the eswf field of the specified scsw is valid,
935  * regardless of whether it is a transport mode or command mode scsw.
936  * Return zero if the field does not contain a valid value.
937  */
scsw_is_valid_eswf(union scsw * scsw)938 static inline int scsw_is_valid_eswf(union scsw *scsw)
939 {
940 	if (scsw_is_tm(scsw))
941 		return scsw_tm_is_valid_eswf(scsw);
942 	else
943 		return scsw_cmd_is_valid_eswf(scsw);
944 }
945 
946 /**
947  * scsw_is_valid_fctl - check fctl field validity
948  * @scsw: pointer to scsw
949  *
950  * Return non-zero if the fctl field of the specified scsw is valid,
951  * regardless of whether it is a transport mode or command mode scsw.
952  * Return zero if the field does not contain a valid value.
953  */
scsw_is_valid_fctl(union scsw * scsw)954 static inline int scsw_is_valid_fctl(union scsw *scsw)
955 {
956 	if (scsw_is_tm(scsw))
957 		return scsw_tm_is_valid_fctl(scsw);
958 	else
959 		return scsw_cmd_is_valid_fctl(scsw);
960 }
961 
962 /**
963  * scsw_is_valid_key - check key field validity
964  * @scsw: pointer to scsw
965  *
966  * Return non-zero if the key field of the specified scsw is valid,
967  * regardless of whether it is a transport mode or command mode scsw.
968  * Return zero if the field does not contain a valid value.
969  */
scsw_is_valid_key(union scsw * scsw)970 static inline int scsw_is_valid_key(union scsw *scsw)
971 {
972 	if (scsw_is_tm(scsw))
973 		return scsw_tm_is_valid_key(scsw);
974 	else
975 		return scsw_cmd_is_valid_key(scsw);
976 }
977 
978 /**
979  * scsw_is_valid_pno - check pno field validity
980  * @scsw: pointer to scsw
981  *
982  * Return non-zero if the pno field of the specified scsw is valid,
983  * regardless of whether it is a transport mode or command mode scsw.
984  * Return zero if the field does not contain a valid value.
985  */
scsw_is_valid_pno(union scsw * scsw)986 static inline int scsw_is_valid_pno(union scsw *scsw)
987 {
988 	if (scsw_is_tm(scsw))
989 		return scsw_tm_is_valid_pno(scsw);
990 	else
991 		return scsw_cmd_is_valid_pno(scsw);
992 }
993 
994 /**
995  * scsw_is_valid_stctl - check stctl field validity
996  * @scsw: pointer to scsw
997  *
998  * Return non-zero if the stctl field of the specified scsw is valid,
999  * regardless of whether it is a transport mode or command mode scsw.
1000  * Return zero if the field does not contain a valid value.
1001  */
scsw_is_valid_stctl(union scsw * scsw)1002 static inline int scsw_is_valid_stctl(union scsw *scsw)
1003 {
1004 	if (scsw_is_tm(scsw))
1005 		return scsw_tm_is_valid_stctl(scsw);
1006 	else
1007 		return scsw_cmd_is_valid_stctl(scsw);
1008 }
1009 
1010 /**
1011  * scsw_cmd_is_solicited - check for solicited scsw
1012  * @scsw: pointer to scsw
1013  *
1014  * Return non-zero if the command mode scsw indicates that the associated
1015  * status condition is solicited, zero if it is unsolicited.
1016  */
scsw_cmd_is_solicited(union scsw * scsw)1017 static inline int scsw_cmd_is_solicited(union scsw *scsw)
1018 {
1019 	return (scsw->cmd.cc != 0) || (scsw->cmd.stctl !=
1020 		(SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS));
1021 }
1022 
1023 /**
1024  * scsw_tm_is_solicited - check for solicited scsw
1025  * @scsw: pointer to scsw
1026  *
1027  * Return non-zero if the transport mode scsw indicates that the associated
1028  * status condition is solicited, zero if it is unsolicited.
1029  */
scsw_tm_is_solicited(union scsw * scsw)1030 static inline int scsw_tm_is_solicited(union scsw *scsw)
1031 {
1032 	return (scsw->tm.cc != 0) || (scsw->tm.stctl !=
1033 		(SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS));
1034 }
1035 
1036 /**
1037  * scsw_is_solicited - check for solicited scsw
1038  * @scsw: pointer to scsw
1039  *
1040  * Return non-zero if the transport or command mode scsw indicates that the
1041  * associated status condition is solicited, zero if it is unsolicited.
1042  */
scsw_is_solicited(union scsw * scsw)1043 static inline int scsw_is_solicited(union scsw *scsw)
1044 {
1045 	if (scsw_is_tm(scsw))
1046 		return scsw_tm_is_solicited(scsw);
1047 	else
1048 		return scsw_cmd_is_solicited(scsw);
1049 }
1050 
1051 #endif /* _ASM_S390_SCSW_H_ */
1052