Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

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