^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_ */