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