]>
Commit | Line | Data |
---|---|---|
82094b55 AF |
1 | From: Gerald Schaefer <geraldsc@de.ibm.com> |
2 | Subject: [PATCH] cio: move scsw helper functions to header file | |
3 | References: bnc#532063,LTC#55526 | |
4 | ||
5 | From: Heiko Carstens <heiko.carstens@de.ibm.com> | |
6 | ||
7 | All scsw helper functions are very short and usage of them shouldn't | |
8 | result in function calls. Therefore we move them to a separate header | |
9 | file. | |
10 | Also saves a lot of EXPORT_SYMBOLs. | |
11 | ||
12 | Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> | |
13 | Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> | |
14 | ||
15 | Acked-by: John Jolly <jjolly@suse.de> | |
16 | --- | |
17 | ||
18 | arch/s390/include/asm/chsc.h | 28 + | |
19 | arch/s390/include/asm/cio.h | 223 ---------- | |
20 | arch/s390/include/asm/scsw.h | 956 +++++++++++++++++++++++++++++++++++++++++++ | |
21 | drivers/s390/cio/Makefile | 2 | |
22 | drivers/s390/cio/chsc.h | 24 - | |
23 | drivers/s390/cio/scsw.c | 843 ------------------------------------- | |
24 | 6 files changed, 986 insertions(+), 1090 deletions(-) | |
25 | ||
26 | Index: linux-sles11/arch/s390/include/asm/chsc.h | |
27 | =================================================================== | |
28 | --- linux-sles11.orig/arch/s390/include/asm/chsc.h | |
29 | +++ linux-sles11/arch/s390/include/asm/chsc.h | |
30 | @@ -124,4 +124,32 @@ struct chsc_cpd_info { | |
31 | #define CHSC_INFO_CPD _IOWR(CHSC_IOCTL_MAGIC, 0x87, struct chsc_cpd_info) | |
32 | #define CHSC_INFO_DCAL _IOWR(CHSC_IOCTL_MAGIC, 0x88, struct chsc_dcal) | |
33 | ||
34 | +#ifdef __KERNEL__ | |
35 | + | |
36 | +struct css_general_char { | |
37 | + u64 : 12; | |
38 | + u32 dynio : 1; /* bit 12 */ | |
39 | + u32 : 28; | |
40 | + u32 aif : 1; /* bit 41 */ | |
41 | + u32 : 3; | |
42 | + u32 mcss : 1; /* bit 45 */ | |
43 | + u32 fcs : 1; /* bit 46 */ | |
44 | + u32 : 1; | |
45 | + u32 ext_mb : 1; /* bit 48 */ | |
46 | + u32 : 7; | |
47 | + u32 aif_tdd : 1; /* bit 56 */ | |
48 | + u32 : 1; | |
49 | + u32 qebsm : 1; /* bit 58 */ | |
50 | + u32 : 8; | |
51 | + u32 aif_osa : 1; /* bit 67 */ | |
52 | + u32 : 14; | |
53 | + u32 cib : 1; /* bit 82 */ | |
54 | + u32 : 5; | |
55 | + u32 fcx : 1; /* bit 88 */ | |
56 | + u32 : 7; | |
57 | +}__attribute__((packed)); | |
58 | + | |
59 | +extern struct css_general_char css_general_characteristics; | |
60 | + | |
61 | +#endif /* __KERNEL__ */ | |
62 | #endif | |
63 | Index: linux-sles11/arch/s390/include/asm/cio.h | |
64 | =================================================================== | |
65 | --- linux-sles11.orig/arch/s390/include/asm/cio.h | |
66 | +++ linux-sles11/arch/s390/include/asm/cio.h | |
67 | @@ -15,228 +15,7 @@ | |
68 | #define LPM_ANYPATH 0xff | |
69 | #define __MAX_CSSID 0 | |
70 | ||
71 | -/** | |
72 | - * struct cmd_scsw - command-mode subchannel status word | |
73 | - * @key: subchannel key | |
74 | - * @sctl: suspend control | |
75 | - * @eswf: esw format | |
76 | - * @cc: deferred condition code | |
77 | - * @fmt: format | |
78 | - * @pfch: prefetch | |
79 | - * @isic: initial-status interruption control | |
80 | - * @alcc: address-limit checking control | |
81 | - * @ssi: suppress-suspended interruption | |
82 | - * @zcc: zero condition code | |
83 | - * @ectl: extended control | |
84 | - * @pno: path not operational | |
85 | - * @res: reserved | |
86 | - * @fctl: function control | |
87 | - * @actl: activity control | |
88 | - * @stctl: status control | |
89 | - * @cpa: channel program address | |
90 | - * @dstat: device status | |
91 | - * @cstat: subchannel status | |
92 | - * @count: residual count | |
93 | - */ | |
94 | -struct cmd_scsw { | |
95 | - __u32 key : 4; | |
96 | - __u32 sctl : 1; | |
97 | - __u32 eswf : 1; | |
98 | - __u32 cc : 2; | |
99 | - __u32 fmt : 1; | |
100 | - __u32 pfch : 1; | |
101 | - __u32 isic : 1; | |
102 | - __u32 alcc : 1; | |
103 | - __u32 ssi : 1; | |
104 | - __u32 zcc : 1; | |
105 | - __u32 ectl : 1; | |
106 | - __u32 pno : 1; | |
107 | - __u32 res : 1; | |
108 | - __u32 fctl : 3; | |
109 | - __u32 actl : 7; | |
110 | - __u32 stctl : 5; | |
111 | - __u32 cpa; | |
112 | - __u32 dstat : 8; | |
113 | - __u32 cstat : 8; | |
114 | - __u32 count : 16; | |
115 | -} __attribute__ ((packed)); | |
116 | - | |
117 | -/** | |
118 | - * struct tm_scsw - transport-mode subchannel status word | |
119 | - * @key: subchannel key | |
120 | - * @eswf: esw format | |
121 | - * @cc: deferred condition code | |
122 | - * @fmt: format | |
123 | - * @x: IRB-format control | |
124 | - * @q: interrogate-complete | |
125 | - * @ectl: extended control | |
126 | - * @pno: path not operational | |
127 | - * @fctl: function control | |
128 | - * @actl: activity control | |
129 | - * @stctl: status control | |
130 | - * @tcw: TCW address | |
131 | - * @dstat: device status | |
132 | - * @cstat: subchannel status | |
133 | - * @fcxs: FCX status | |
134 | - * @schxs: subchannel-extended status | |
135 | - */ | |
136 | -struct tm_scsw { | |
137 | - u32 key:4; | |
138 | - u32 :1; | |
139 | - u32 eswf:1; | |
140 | - u32 cc:2; | |
141 | - u32 fmt:3; | |
142 | - u32 x:1; | |
143 | - u32 q:1; | |
144 | - u32 :1; | |
145 | - u32 ectl:1; | |
146 | - u32 pno:1; | |
147 | - u32 :1; | |
148 | - u32 fctl:3; | |
149 | - u32 actl:7; | |
150 | - u32 stctl:5; | |
151 | - u32 tcw; | |
152 | - u32 dstat:8; | |
153 | - u32 cstat:8; | |
154 | - u32 fcxs:8; | |
155 | - u32 schxs:8; | |
156 | -} __attribute__ ((packed)); | |
157 | - | |
158 | -/** | |
159 | - * union scsw - subchannel status word | |
160 | - * @cmd: command-mode SCSW | |
161 | - * @tm: transport-mode SCSW | |
162 | - */ | |
163 | -union scsw { | |
164 | - struct cmd_scsw cmd; | |
165 | - struct tm_scsw tm; | |
166 | -} __attribute__ ((packed)); | |
167 | - | |
168 | -int scsw_is_tm(union scsw *scsw); | |
169 | -u32 scsw_key(union scsw *scsw); | |
170 | -u32 scsw_eswf(union scsw *scsw); | |
171 | -u32 scsw_cc(union scsw *scsw); | |
172 | -u32 scsw_ectl(union scsw *scsw); | |
173 | -u32 scsw_pno(union scsw *scsw); | |
174 | -u32 scsw_fctl(union scsw *scsw); | |
175 | -u32 scsw_actl(union scsw *scsw); | |
176 | -u32 scsw_stctl(union scsw *scsw); | |
177 | -u32 scsw_dstat(union scsw *scsw); | |
178 | -u32 scsw_cstat(union scsw *scsw); | |
179 | -int scsw_is_solicited(union scsw *scsw); | |
180 | -int scsw_is_valid_key(union scsw *scsw); | |
181 | -int scsw_is_valid_eswf(union scsw *scsw); | |
182 | -int scsw_is_valid_cc(union scsw *scsw); | |
183 | -int scsw_is_valid_ectl(union scsw *scsw); | |
184 | -int scsw_is_valid_pno(union scsw *scsw); | |
185 | -int scsw_is_valid_fctl(union scsw *scsw); | |
186 | -int scsw_is_valid_actl(union scsw *scsw); | |
187 | -int scsw_is_valid_stctl(union scsw *scsw); | |
188 | -int scsw_is_valid_dstat(union scsw *scsw); | |
189 | -int scsw_is_valid_cstat(union scsw *scsw); | |
190 | -int scsw_cmd_is_valid_key(union scsw *scsw); | |
191 | -int scsw_cmd_is_valid_sctl(union scsw *scsw); | |
192 | -int scsw_cmd_is_valid_eswf(union scsw *scsw); | |
193 | -int scsw_cmd_is_valid_cc(union scsw *scsw); | |
194 | -int scsw_cmd_is_valid_fmt(union scsw *scsw); | |
195 | -int scsw_cmd_is_valid_pfch(union scsw *scsw); | |
196 | -int scsw_cmd_is_valid_isic(union scsw *scsw); | |
197 | -int scsw_cmd_is_valid_alcc(union scsw *scsw); | |
198 | -int scsw_cmd_is_valid_ssi(union scsw *scsw); | |
199 | -int scsw_cmd_is_valid_zcc(union scsw *scsw); | |
200 | -int scsw_cmd_is_valid_ectl(union scsw *scsw); | |
201 | -int scsw_cmd_is_valid_pno(union scsw *scsw); | |
202 | -int scsw_cmd_is_valid_fctl(union scsw *scsw); | |
203 | -int scsw_cmd_is_valid_actl(union scsw *scsw); | |
204 | -int scsw_cmd_is_valid_stctl(union scsw *scsw); | |
205 | -int scsw_cmd_is_valid_dstat(union scsw *scsw); | |
206 | -int scsw_cmd_is_valid_cstat(union scsw *scsw); | |
207 | -int scsw_cmd_is_solicited(union scsw *scsw); | |
208 | -int scsw_tm_is_valid_key(union scsw *scsw); | |
209 | -int scsw_tm_is_valid_eswf(union scsw *scsw); | |
210 | -int scsw_tm_is_valid_cc(union scsw *scsw); | |
211 | -int scsw_tm_is_valid_fmt(union scsw *scsw); | |
212 | -int scsw_tm_is_valid_x(union scsw *scsw); | |
213 | -int scsw_tm_is_valid_q(union scsw *scsw); | |
214 | -int scsw_tm_is_valid_ectl(union scsw *scsw); | |
215 | -int scsw_tm_is_valid_pno(union scsw *scsw); | |
216 | -int scsw_tm_is_valid_fctl(union scsw *scsw); | |
217 | -int scsw_tm_is_valid_actl(union scsw *scsw); | |
218 | -int scsw_tm_is_valid_stctl(union scsw *scsw); | |
219 | -int scsw_tm_is_valid_dstat(union scsw *scsw); | |
220 | -int scsw_tm_is_valid_cstat(union scsw *scsw); | |
221 | -int scsw_tm_is_valid_fcxs(union scsw *scsw); | |
222 | -int scsw_tm_is_valid_schxs(union scsw *scsw); | |
223 | -int scsw_tm_is_solicited(union scsw *scsw); | |
224 | - | |
225 | -#define SCSW_FCTL_CLEAR_FUNC 0x1 | |
226 | -#define SCSW_FCTL_HALT_FUNC 0x2 | |
227 | -#define SCSW_FCTL_START_FUNC 0x4 | |
228 | - | |
229 | -#define SCSW_ACTL_SUSPENDED 0x1 | |
230 | -#define SCSW_ACTL_DEVACT 0x2 | |
231 | -#define SCSW_ACTL_SCHACT 0x4 | |
232 | -#define SCSW_ACTL_CLEAR_PEND 0x8 | |
233 | -#define SCSW_ACTL_HALT_PEND 0x10 | |
234 | -#define SCSW_ACTL_START_PEND 0x20 | |
235 | -#define SCSW_ACTL_RESUME_PEND 0x40 | |
236 | - | |
237 | -#define SCSW_STCTL_STATUS_PEND 0x1 | |
238 | -#define SCSW_STCTL_SEC_STATUS 0x2 | |
239 | -#define SCSW_STCTL_PRIM_STATUS 0x4 | |
240 | -#define SCSW_STCTL_INTER_STATUS 0x8 | |
241 | -#define SCSW_STCTL_ALERT_STATUS 0x10 | |
242 | - | |
243 | -#define DEV_STAT_ATTENTION 0x80 | |
244 | -#define DEV_STAT_STAT_MOD 0x40 | |
245 | -#define DEV_STAT_CU_END 0x20 | |
246 | -#define DEV_STAT_BUSY 0x10 | |
247 | -#define DEV_STAT_CHN_END 0x08 | |
248 | -#define DEV_STAT_DEV_END 0x04 | |
249 | -#define DEV_STAT_UNIT_CHECK 0x02 | |
250 | -#define DEV_STAT_UNIT_EXCEP 0x01 | |
251 | - | |
252 | -#define SCHN_STAT_PCI 0x80 | |
253 | -#define SCHN_STAT_INCORR_LEN 0x40 | |
254 | -#define SCHN_STAT_PROG_CHECK 0x20 | |
255 | -#define SCHN_STAT_PROT_CHECK 0x10 | |
256 | -#define SCHN_STAT_CHN_DATA_CHK 0x08 | |
257 | -#define SCHN_STAT_CHN_CTRL_CHK 0x04 | |
258 | -#define SCHN_STAT_INTF_CTRL_CHK 0x02 | |
259 | -#define SCHN_STAT_CHAIN_CHECK 0x01 | |
260 | - | |
261 | -/* | |
262 | - * architectured values for first sense byte | |
263 | - */ | |
264 | -#define SNS0_CMD_REJECT 0x80 | |
265 | -#define SNS_CMD_REJECT SNS0_CMD_REJEC | |
266 | -#define SNS0_INTERVENTION_REQ 0x40 | |
267 | -#define SNS0_BUS_OUT_CHECK 0x20 | |
268 | -#define SNS0_EQUIPMENT_CHECK 0x10 | |
269 | -#define SNS0_DATA_CHECK 0x08 | |
270 | -#define SNS0_OVERRUN 0x04 | |
271 | -#define SNS0_INCOMPL_DOMAIN 0x01 | |
272 | - | |
273 | -/* | |
274 | - * architectured values for second sense byte | |
275 | - */ | |
276 | -#define SNS1_PERM_ERR 0x80 | |
277 | -#define SNS1_INV_TRACK_FORMAT 0x40 | |
278 | -#define SNS1_EOC 0x20 | |
279 | -#define SNS1_MESSAGE_TO_OPER 0x10 | |
280 | -#define SNS1_NO_REC_FOUND 0x08 | |
281 | -#define SNS1_FILE_PROTECTED 0x04 | |
282 | -#define SNS1_WRITE_INHIBITED 0x02 | |
283 | -#define SNS1_INPRECISE_END 0x01 | |
284 | - | |
285 | -/* | |
286 | - * architectured values for third sense byte | |
287 | - */ | |
288 | -#define SNS2_REQ_INH_WRITE 0x80 | |
289 | -#define SNS2_CORRECTABLE 0x40 | |
290 | -#define SNS2_FIRST_LOG_ERR 0x20 | |
291 | -#define SNS2_ENV_DATA_PRESENT 0x10 | |
292 | -#define SNS2_INPRECISE_END 0x04 | |
293 | +#include <asm/scsw.h> | |
294 | ||
295 | /** | |
296 | * struct ccw1 - channel command word | |
297 | Index: linux-sles11/arch/s390/include/asm/scsw.h | |
298 | =================================================================== | |
299 | --- /dev/null | |
300 | +++ linux-sles11/arch/s390/include/asm/scsw.h | |
301 | @@ -0,0 +1,956 @@ | |
302 | +/* | |
303 | + * Helper functions for scsw access. | |
304 | + * | |
305 | + * Copyright IBM Corp. 2008,2009 | |
306 | + * Author(s): Peter Oberparleiter <peter.oberparleiter@de.ibm.com> | |
307 | + */ | |
308 | + | |
309 | +#ifndef _ASM_S390_SCSW_H_ | |
310 | +#define _ASM_S390_SCSW_H_ | |
311 | + | |
312 | +#include <linux/types.h> | |
313 | +#include <asm/chsc.h> | |
314 | +#include <asm/cio.h> | |
315 | + | |
316 | +/** | |
317 | + * struct cmd_scsw - command-mode subchannel status word | |
318 | + * @key: subchannel key | |
319 | + * @sctl: suspend control | |
320 | + * @eswf: esw format | |
321 | + * @cc: deferred condition code | |
322 | + * @fmt: format | |
323 | + * @pfch: prefetch | |
324 | + * @isic: initial-status interruption control | |
325 | + * @alcc: address-limit checking control | |
326 | + * @ssi: suppress-suspended interruption | |
327 | + * @zcc: zero condition code | |
328 | + * @ectl: extended control | |
329 | + * @pno: path not operational | |
330 | + * @res: reserved | |
331 | + * @fctl: function control | |
332 | + * @actl: activity control | |
333 | + * @stctl: status control | |
334 | + * @cpa: channel program address | |
335 | + * @dstat: device status | |
336 | + * @cstat: subchannel status | |
337 | + * @count: residual count | |
338 | + */ | |
339 | +struct cmd_scsw { | |
340 | + __u32 key : 4; | |
341 | + __u32 sctl : 1; | |
342 | + __u32 eswf : 1; | |
343 | + __u32 cc : 2; | |
344 | + __u32 fmt : 1; | |
345 | + __u32 pfch : 1; | |
346 | + __u32 isic : 1; | |
347 | + __u32 alcc : 1; | |
348 | + __u32 ssi : 1; | |
349 | + __u32 zcc : 1; | |
350 | + __u32 ectl : 1; | |
351 | + __u32 pno : 1; | |
352 | + __u32 res : 1; | |
353 | + __u32 fctl : 3; | |
354 | + __u32 actl : 7; | |
355 | + __u32 stctl : 5; | |
356 | + __u32 cpa; | |
357 | + __u32 dstat : 8; | |
358 | + __u32 cstat : 8; | |
359 | + __u32 count : 16; | |
360 | +} __attribute__ ((packed)); | |
361 | + | |
362 | +/** | |
363 | + * struct tm_scsw - transport-mode subchannel status word | |
364 | + * @key: subchannel key | |
365 | + * @eswf: esw format | |
366 | + * @cc: deferred condition code | |
367 | + * @fmt: format | |
368 | + * @x: IRB-format control | |
369 | + * @q: interrogate-complete | |
370 | + * @ectl: extended control | |
371 | + * @pno: path not operational | |
372 | + * @fctl: function control | |
373 | + * @actl: activity control | |
374 | + * @stctl: status control | |
375 | + * @tcw: TCW address | |
376 | + * @dstat: device status | |
377 | + * @cstat: subchannel status | |
378 | + * @fcxs: FCX status | |
379 | + * @schxs: subchannel-extended status | |
380 | + */ | |
381 | +struct tm_scsw { | |
382 | + u32 key:4; | |
383 | + u32 :1; | |
384 | + u32 eswf:1; | |
385 | + u32 cc:2; | |
386 | + u32 fmt:3; | |
387 | + u32 x:1; | |
388 | + u32 q:1; | |
389 | + u32 :1; | |
390 | + u32 ectl:1; | |
391 | + u32 pno:1; | |
392 | + u32 :1; | |
393 | + u32 fctl:3; | |
394 | + u32 actl:7; | |
395 | + u32 stctl:5; | |
396 | + u32 tcw; | |
397 | + u32 dstat:8; | |
398 | + u32 cstat:8; | |
399 | + u32 fcxs:8; | |
400 | + u32 schxs:8; | |
401 | +} __attribute__ ((packed)); | |
402 | + | |
403 | +/** | |
404 | + * union scsw - subchannel status word | |
405 | + * @cmd: command-mode SCSW | |
406 | + * @tm: transport-mode SCSW | |
407 | + */ | |
408 | +union scsw { | |
409 | + struct cmd_scsw cmd; | |
410 | + struct tm_scsw tm; | |
411 | +} __attribute__ ((packed)); | |
412 | + | |
413 | +#define SCSW_FCTL_CLEAR_FUNC 0x1 | |
414 | +#define SCSW_FCTL_HALT_FUNC 0x2 | |
415 | +#define SCSW_FCTL_START_FUNC 0x4 | |
416 | + | |
417 | +#define SCSW_ACTL_SUSPENDED 0x1 | |
418 | +#define SCSW_ACTL_DEVACT 0x2 | |
419 | +#define SCSW_ACTL_SCHACT 0x4 | |
420 | +#define SCSW_ACTL_CLEAR_PEND 0x8 | |
421 | +#define SCSW_ACTL_HALT_PEND 0x10 | |
422 | +#define SCSW_ACTL_START_PEND 0x20 | |
423 | +#define SCSW_ACTL_RESUME_PEND 0x40 | |
424 | + | |
425 | +#define SCSW_STCTL_STATUS_PEND 0x1 | |
426 | +#define SCSW_STCTL_SEC_STATUS 0x2 | |
427 | +#define SCSW_STCTL_PRIM_STATUS 0x4 | |
428 | +#define SCSW_STCTL_INTER_STATUS 0x8 | |
429 | +#define SCSW_STCTL_ALERT_STATUS 0x10 | |
430 | + | |
431 | +#define DEV_STAT_ATTENTION 0x80 | |
432 | +#define DEV_STAT_STAT_MOD 0x40 | |
433 | +#define DEV_STAT_CU_END 0x20 | |
434 | +#define DEV_STAT_BUSY 0x10 | |
435 | +#define DEV_STAT_CHN_END 0x08 | |
436 | +#define DEV_STAT_DEV_END 0x04 | |
437 | +#define DEV_STAT_UNIT_CHECK 0x02 | |
438 | +#define DEV_STAT_UNIT_EXCEP 0x01 | |
439 | + | |
440 | +#define SCHN_STAT_PCI 0x80 | |
441 | +#define SCHN_STAT_INCORR_LEN 0x40 | |
442 | +#define SCHN_STAT_PROG_CHECK 0x20 | |
443 | +#define SCHN_STAT_PROT_CHECK 0x10 | |
444 | +#define SCHN_STAT_CHN_DATA_CHK 0x08 | |
445 | +#define SCHN_STAT_CHN_CTRL_CHK 0x04 | |
446 | +#define SCHN_STAT_INTF_CTRL_CHK 0x02 | |
447 | +#define SCHN_STAT_CHAIN_CHECK 0x01 | |
448 | + | |
449 | +/* | |
450 | + * architectured values for first sense byte | |
451 | + */ | |
452 | +#define SNS0_CMD_REJECT 0x80 | |
453 | +#define SNS_CMD_REJECT SNS0_CMD_REJEC | |
454 | +#define SNS0_INTERVENTION_REQ 0x40 | |
455 | +#define SNS0_BUS_OUT_CHECK 0x20 | |
456 | +#define SNS0_EQUIPMENT_CHECK 0x10 | |
457 | +#define SNS0_DATA_CHECK 0x08 | |
458 | +#define SNS0_OVERRUN 0x04 | |
459 | +#define SNS0_INCOMPL_DOMAIN 0x01 | |
460 | + | |
461 | +/* | |
462 | + * architectured values for second sense byte | |
463 | + */ | |
464 | +#define SNS1_PERM_ERR 0x80 | |
465 | +#define SNS1_INV_TRACK_FORMAT 0x40 | |
466 | +#define SNS1_EOC 0x20 | |
467 | +#define SNS1_MESSAGE_TO_OPER 0x10 | |
468 | +#define SNS1_NO_REC_FOUND 0x08 | |
469 | +#define SNS1_FILE_PROTECTED 0x04 | |
470 | +#define SNS1_WRITE_INHIBITED 0x02 | |
471 | +#define SNS1_INPRECISE_END 0x01 | |
472 | + | |
473 | +/* | |
474 | + * architectured values for third sense byte | |
475 | + */ | |
476 | +#define SNS2_REQ_INH_WRITE 0x80 | |
477 | +#define SNS2_CORRECTABLE 0x40 | |
478 | +#define SNS2_FIRST_LOG_ERR 0x20 | |
479 | +#define SNS2_ENV_DATA_PRESENT 0x10 | |
480 | +#define SNS2_INPRECISE_END 0x04 | |
481 | + | |
482 | +/** | |
483 | + * scsw_is_tm - check for transport mode scsw | |
484 | + * @scsw: pointer to scsw | |
485 | + * | |
486 | + * Return non-zero if the specified scsw is a transport mode scsw, zero | |
487 | + * otherwise. | |
488 | + */ | |
489 | +static inline int scsw_is_tm(union scsw *scsw) | |
490 | +{ | |
491 | + return css_general_characteristics.fcx && (scsw->tm.x == 1); | |
492 | +} | |
493 | + | |
494 | +/** | |
495 | + * scsw_key - return scsw key field | |
496 | + * @scsw: pointer to scsw | |
497 | + * | |
498 | + * Return the value of the key field of the specified scsw, regardless of | |
499 | + * whether it is a transport mode or command mode scsw. | |
500 | + */ | |
501 | +static inline u32 scsw_key(union scsw *scsw) | |
502 | +{ | |
503 | + if (scsw_is_tm(scsw)) | |
504 | + return scsw->tm.key; | |
505 | + else | |
506 | + return scsw->cmd.key; | |
507 | +} | |
508 | + | |
509 | +/** | |
510 | + * scsw_eswf - return scsw eswf field | |
511 | + * @scsw: pointer to scsw | |
512 | + * | |
513 | + * Return the value of the eswf field of the specified scsw, regardless of | |
514 | + * whether it is a transport mode or command mode scsw. | |
515 | + */ | |
516 | +static inline u32 scsw_eswf(union scsw *scsw) | |
517 | +{ | |
518 | + if (scsw_is_tm(scsw)) | |
519 | + return scsw->tm.eswf; | |
520 | + else | |
521 | + return scsw->cmd.eswf; | |
522 | +} | |
523 | + | |
524 | +/** | |
525 | + * scsw_cc - return scsw cc field | |
526 | + * @scsw: pointer to scsw | |
527 | + * | |
528 | + * Return the value of the cc field of the specified scsw, regardless of | |
529 | + * whether it is a transport mode or command mode scsw. | |
530 | + */ | |
531 | +static inline u32 scsw_cc(union scsw *scsw) | |
532 | +{ | |
533 | + if (scsw_is_tm(scsw)) | |
534 | + return scsw->tm.cc; | |
535 | + else | |
536 | + return scsw->cmd.cc; | |
537 | +} | |
538 | + | |
539 | +/** | |
540 | + * scsw_ectl - return scsw ectl field | |
541 | + * @scsw: pointer to scsw | |
542 | + * | |
543 | + * Return the value of the ectl field of the specified scsw, regardless of | |
544 | + * whether it is a transport mode or command mode scsw. | |
545 | + */ | |
546 | +static inline u32 scsw_ectl(union scsw *scsw) | |
547 | +{ | |
548 | + if (scsw_is_tm(scsw)) | |
549 | + return scsw->tm.ectl; | |
550 | + else | |
551 | + return scsw->cmd.ectl; | |
552 | +} | |
553 | + | |
554 | +/** | |
555 | + * scsw_pno - return scsw pno field | |
556 | + * @scsw: pointer to scsw | |
557 | + * | |
558 | + * Return the value of the pno field of the specified scsw, regardless of | |
559 | + * whether it is a transport mode or command mode scsw. | |
560 | + */ | |
561 | +static inline u32 scsw_pno(union scsw *scsw) | |
562 | +{ | |
563 | + if (scsw_is_tm(scsw)) | |
564 | + return scsw->tm.pno; | |
565 | + else | |
566 | + return scsw->cmd.pno; | |
567 | +} | |
568 | + | |
569 | +/** | |
570 | + * scsw_fctl - return scsw fctl field | |
571 | + * @scsw: pointer to scsw | |
572 | + * | |
573 | + * Return the value of the fctl field of the specified scsw, regardless of | |
574 | + * whether it is a transport mode or command mode scsw. | |
575 | + */ | |
576 | +static inline u32 scsw_fctl(union scsw *scsw) | |
577 | +{ | |
578 | + if (scsw_is_tm(scsw)) | |
579 | + return scsw->tm.fctl; | |
580 | + else | |
581 | + return scsw->cmd.fctl; | |
582 | +} | |
583 | + | |
584 | +/** | |
585 | + * scsw_actl - return scsw actl field | |
586 | + * @scsw: pointer to scsw | |
587 | + * | |
588 | + * Return the value of the actl field of the specified scsw, regardless of | |
589 | + * whether it is a transport mode or command mode scsw. | |
590 | + */ | |
591 | +static inline u32 scsw_actl(union scsw *scsw) | |
592 | +{ | |
593 | + if (scsw_is_tm(scsw)) | |
594 | + return scsw->tm.actl; | |
595 | + else | |
596 | + return scsw->cmd.actl; | |
597 | +} | |
598 | + | |
599 | +/** | |
600 | + * scsw_stctl - return scsw stctl field | |
601 | + * @scsw: pointer to scsw | |
602 | + * | |
603 | + * Return the value of the stctl field of the specified scsw, regardless of | |
604 | + * whether it is a transport mode or command mode scsw. | |
605 | + */ | |
606 | +static inline u32 scsw_stctl(union scsw *scsw) | |
607 | +{ | |
608 | + if (scsw_is_tm(scsw)) | |
609 | + return scsw->tm.stctl; | |
610 | + else | |
611 | + return scsw->cmd.stctl; | |
612 | +} | |
613 | + | |
614 | +/** | |
615 | + * scsw_dstat - return scsw dstat field | |
616 | + * @scsw: pointer to scsw | |
617 | + * | |
618 | + * Return the value of the dstat field of the specified scsw, regardless of | |
619 | + * whether it is a transport mode or command mode scsw. | |
620 | + */ | |
621 | +static inline u32 scsw_dstat(union scsw *scsw) | |
622 | +{ | |
623 | + if (scsw_is_tm(scsw)) | |
624 | + return scsw->tm.dstat; | |
625 | + else | |
626 | + return scsw->cmd.dstat; | |
627 | +} | |
628 | + | |
629 | +/** | |
630 | + * scsw_cstat - return scsw cstat field | |
631 | + * @scsw: pointer to scsw | |
632 | + * | |
633 | + * Return the value of the cstat field of the specified scsw, regardless of | |
634 | + * whether it is a transport mode or command mode scsw. | |
635 | + */ | |
636 | +static inline u32 scsw_cstat(union scsw *scsw) | |
637 | +{ | |
638 | + if (scsw_is_tm(scsw)) | |
639 | + return scsw->tm.cstat; | |
640 | + else | |
641 | + return scsw->cmd.cstat; | |
642 | +} | |
643 | + | |
644 | +/** | |
645 | + * scsw_cmd_is_valid_key - check key field validity | |
646 | + * @scsw: pointer to scsw | |
647 | + * | |
648 | + * Return non-zero if the key field of the specified command mode scsw is | |
649 | + * valid, zero otherwise. | |
650 | + */ | |
651 | +static inline int scsw_cmd_is_valid_key(union scsw *scsw) | |
652 | +{ | |
653 | + return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC); | |
654 | +} | |
655 | + | |
656 | +/** | |
657 | + * scsw_cmd_is_valid_sctl - check fctl field validity | |
658 | + * @scsw: pointer to scsw | |
659 | + * | |
660 | + * Return non-zero if the fctl field of the specified command mode scsw is | |
661 | + * valid, zero otherwise. | |
662 | + */ | |
663 | +static inline int scsw_cmd_is_valid_sctl(union scsw *scsw) | |
664 | +{ | |
665 | + return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC); | |
666 | +} | |
667 | + | |
668 | +/** | |
669 | + * scsw_cmd_is_valid_eswf - check eswf field validity | |
670 | + * @scsw: pointer to scsw | |
671 | + * | |
672 | + * Return non-zero if the eswf field of the specified command mode scsw is | |
673 | + * valid, zero otherwise. | |
674 | + */ | |
675 | +static inline int scsw_cmd_is_valid_eswf(union scsw *scsw) | |
676 | +{ | |
677 | + return (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND); | |
678 | +} | |
679 | + | |
680 | +/** | |
681 | + * scsw_cmd_is_valid_cc - check cc field validity | |
682 | + * @scsw: pointer to scsw | |
683 | + * | |
684 | + * Return non-zero if the cc field of the specified command mode scsw is | |
685 | + * valid, zero otherwise. | |
686 | + */ | |
687 | +static inline int scsw_cmd_is_valid_cc(union scsw *scsw) | |
688 | +{ | |
689 | + return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC) && | |
690 | + (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND); | |
691 | +} | |
692 | + | |
693 | +/** | |
694 | + * scsw_cmd_is_valid_fmt - check fmt field validity | |
695 | + * @scsw: pointer to scsw | |
696 | + * | |
697 | + * Return non-zero if the fmt field of the specified command mode scsw is | |
698 | + * valid, zero otherwise. | |
699 | + */ | |
700 | +static inline int scsw_cmd_is_valid_fmt(union scsw *scsw) | |
701 | +{ | |
702 | + return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC); | |
703 | +} | |
704 | + | |
705 | +/** | |
706 | + * scsw_cmd_is_valid_pfch - check pfch field validity | |
707 | + * @scsw: pointer to scsw | |
708 | + * | |
709 | + * Return non-zero if the pfch field of the specified command mode scsw is | |
710 | + * valid, zero otherwise. | |
711 | + */ | |
712 | +static inline int scsw_cmd_is_valid_pfch(union scsw *scsw) | |
713 | +{ | |
714 | + return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC); | |
715 | +} | |
716 | + | |
717 | +/** | |
718 | + * scsw_cmd_is_valid_isic - check isic field validity | |
719 | + * @scsw: pointer to scsw | |
720 | + * | |
721 | + * Return non-zero if the isic field of the specified command mode scsw is | |
722 | + * valid, zero otherwise. | |
723 | + */ | |
724 | +static inline int scsw_cmd_is_valid_isic(union scsw *scsw) | |
725 | +{ | |
726 | + return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC); | |
727 | +} | |
728 | + | |
729 | +/** | |
730 | + * scsw_cmd_is_valid_alcc - check alcc field validity | |
731 | + * @scsw: pointer to scsw | |
732 | + * | |
733 | + * Return non-zero if the alcc field of the specified command mode scsw is | |
734 | + * valid, zero otherwise. | |
735 | + */ | |
736 | +static inline int scsw_cmd_is_valid_alcc(union scsw *scsw) | |
737 | +{ | |
738 | + return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC); | |
739 | +} | |
740 | + | |
741 | +/** | |
742 | + * scsw_cmd_is_valid_ssi - check ssi field validity | |
743 | + * @scsw: pointer to scsw | |
744 | + * | |
745 | + * Return non-zero if the ssi field of the specified command mode scsw is | |
746 | + * valid, zero otherwise. | |
747 | + */ | |
748 | +static inline int scsw_cmd_is_valid_ssi(union scsw *scsw) | |
749 | +{ | |
750 | + return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC); | |
751 | +} | |
752 | + | |
753 | +/** | |
754 | + * scsw_cmd_is_valid_zcc - check zcc field validity | |
755 | + * @scsw: pointer to scsw | |
756 | + * | |
757 | + * Return non-zero if the zcc field of the specified command mode scsw is | |
758 | + * valid, zero otherwise. | |
759 | + */ | |
760 | +static inline int scsw_cmd_is_valid_zcc(union scsw *scsw) | |
761 | +{ | |
762 | + return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC) && | |
763 | + (scsw->cmd.stctl & SCSW_STCTL_INTER_STATUS); | |
764 | +} | |
765 | + | |
766 | +/** | |
767 | + * scsw_cmd_is_valid_ectl - check ectl field validity | |
768 | + * @scsw: pointer to scsw | |
769 | + * | |
770 | + * Return non-zero if the ectl field of the specified command mode scsw is | |
771 | + * valid, zero otherwise. | |
772 | + */ | |
773 | +static inline int scsw_cmd_is_valid_ectl(union scsw *scsw) | |
774 | +{ | |
775 | + return (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND) && | |
776 | + !(scsw->cmd.stctl & SCSW_STCTL_INTER_STATUS) && | |
777 | + (scsw->cmd.stctl & SCSW_STCTL_ALERT_STATUS); | |
778 | +} | |
779 | + | |
780 | +/** | |
781 | + * scsw_cmd_is_valid_pno - check pno field validity | |
782 | + * @scsw: pointer to scsw | |
783 | + * | |
784 | + * Return non-zero if the pno field of the specified command mode scsw is | |
785 | + * valid, zero otherwise. | |
786 | + */ | |
787 | +static inline int scsw_cmd_is_valid_pno(union scsw *scsw) | |
788 | +{ | |
789 | + return (scsw->cmd.fctl != 0) && | |
790 | + (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND) && | |
791 | + (!(scsw->cmd.stctl & SCSW_STCTL_INTER_STATUS) || | |
792 | + ((scsw->cmd.stctl & SCSW_STCTL_INTER_STATUS) && | |
793 | + (scsw->cmd.actl & SCSW_ACTL_SUSPENDED))); | |
794 | +} | |
795 | + | |
796 | +/** | |
797 | + * scsw_cmd_is_valid_fctl - check fctl field validity | |
798 | + * @scsw: pointer to scsw | |
799 | + * | |
800 | + * Return non-zero if the fctl field of the specified command mode scsw is | |
801 | + * valid, zero otherwise. | |
802 | + */ | |
803 | +static inline int scsw_cmd_is_valid_fctl(union scsw *scsw) | |
804 | +{ | |
805 | + /* Only valid if pmcw.dnv == 1*/ | |
806 | + return 1; | |
807 | +} | |
808 | + | |
809 | +/** | |
810 | + * scsw_cmd_is_valid_actl - check actl field validity | |
811 | + * @scsw: pointer to scsw | |
812 | + * | |
813 | + * Return non-zero if the actl field of the specified command mode scsw is | |
814 | + * valid, zero otherwise. | |
815 | + */ | |
816 | +static inline int scsw_cmd_is_valid_actl(union scsw *scsw) | |
817 | +{ | |
818 | + /* Only valid if pmcw.dnv == 1*/ | |
819 | + return 1; | |
820 | +} | |
821 | + | |
822 | +/** | |
823 | + * scsw_cmd_is_valid_stctl - check stctl field validity | |
824 | + * @scsw: pointer to scsw | |
825 | + * | |
826 | + * Return non-zero if the stctl field of the specified command mode scsw is | |
827 | + * valid, zero otherwise. | |
828 | + */ | |
829 | +static inline int scsw_cmd_is_valid_stctl(union scsw *scsw) | |
830 | +{ | |
831 | + /* Only valid if pmcw.dnv == 1*/ | |
832 | + return 1; | |
833 | +} | |
834 | + | |
835 | +/** | |
836 | + * scsw_cmd_is_valid_dstat - check dstat field validity | |
837 | + * @scsw: pointer to scsw | |
838 | + * | |
839 | + * Return non-zero if the dstat field of the specified command mode scsw is | |
840 | + * valid, zero otherwise. | |
841 | + */ | |
842 | +static inline int scsw_cmd_is_valid_dstat(union scsw *scsw) | |
843 | +{ | |
844 | + return (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND) && | |
845 | + (scsw->cmd.cc != 3); | |
846 | +} | |
847 | + | |
848 | +/** | |
849 | + * scsw_cmd_is_valid_cstat - check cstat field validity | |
850 | + * @scsw: pointer to scsw | |
851 | + * | |
852 | + * Return non-zero if the cstat field of the specified command mode scsw is | |
853 | + * valid, zero otherwise. | |
854 | + */ | |
855 | +static inline int scsw_cmd_is_valid_cstat(union scsw *scsw) | |
856 | +{ | |
857 | + return (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND) && | |
858 | + (scsw->cmd.cc != 3); | |
859 | +} | |
860 | + | |
861 | +/** | |
862 | + * scsw_tm_is_valid_key - check key field validity | |
863 | + * @scsw: pointer to scsw | |
864 | + * | |
865 | + * Return non-zero if the key field of the specified transport mode scsw is | |
866 | + * valid, zero otherwise. | |
867 | + */ | |
868 | +static inline int scsw_tm_is_valid_key(union scsw *scsw) | |
869 | +{ | |
870 | + return (scsw->tm.fctl & SCSW_FCTL_START_FUNC); | |
871 | +} | |
872 | + | |
873 | +/** | |
874 | + * scsw_tm_is_valid_eswf - check eswf field validity | |
875 | + * @scsw: pointer to scsw | |
876 | + * | |
877 | + * Return non-zero if the eswf field of the specified transport mode scsw is | |
878 | + * valid, zero otherwise. | |
879 | + */ | |
880 | +static inline int scsw_tm_is_valid_eswf(union scsw *scsw) | |
881 | +{ | |
882 | + return (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND); | |
883 | +} | |
884 | + | |
885 | +/** | |
886 | + * scsw_tm_is_valid_cc - check cc field validity | |
887 | + * @scsw: pointer to scsw | |
888 | + * | |
889 | + * Return non-zero if the cc field of the specified transport mode scsw is | |
890 | + * valid, zero otherwise. | |
891 | + */ | |
892 | +static inline int scsw_tm_is_valid_cc(union scsw *scsw) | |
893 | +{ | |
894 | + return (scsw->tm.fctl & SCSW_FCTL_START_FUNC) && | |
895 | + (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND); | |
896 | +} | |
897 | + | |
898 | +/** | |
899 | + * scsw_tm_is_valid_fmt - check fmt field validity | |
900 | + * @scsw: pointer to scsw | |
901 | + * | |
902 | + * Return non-zero if the fmt field of the specified transport mode scsw is | |
903 | + * valid, zero otherwise. | |
904 | + */ | |
905 | +static inline int scsw_tm_is_valid_fmt(union scsw *scsw) | |
906 | +{ | |
907 | + return 1; | |
908 | +} | |
909 | + | |
910 | +/** | |
911 | + * scsw_tm_is_valid_x - check x field validity | |
912 | + * @scsw: pointer to scsw | |
913 | + * | |
914 | + * Return non-zero if the x field of the specified transport mode scsw is | |
915 | + * valid, zero otherwise. | |
916 | + */ | |
917 | +static inline int scsw_tm_is_valid_x(union scsw *scsw) | |
918 | +{ | |
919 | + return 1; | |
920 | +} | |
921 | + | |
922 | +/** | |
923 | + * scsw_tm_is_valid_q - check q field validity | |
924 | + * @scsw: pointer to scsw | |
925 | + * | |
926 | + * Return non-zero if the q field of the specified transport mode scsw is | |
927 | + * valid, zero otherwise. | |
928 | + */ | |
929 | +static inline int scsw_tm_is_valid_q(union scsw *scsw) | |
930 | +{ | |
931 | + return 1; | |
932 | +} | |
933 | + | |
934 | +/** | |
935 | + * scsw_tm_is_valid_ectl - check ectl field validity | |
936 | + * @scsw: pointer to scsw | |
937 | + * | |
938 | + * Return non-zero if the ectl field of the specified transport mode scsw is | |
939 | + * valid, zero otherwise. | |
940 | + */ | |
941 | +static inline int scsw_tm_is_valid_ectl(union scsw *scsw) | |
942 | +{ | |
943 | + return (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND) && | |
944 | + !(scsw->tm.stctl & SCSW_STCTL_INTER_STATUS) && | |
945 | + (scsw->tm.stctl & SCSW_STCTL_ALERT_STATUS); | |
946 | +} | |
947 | + | |
948 | +/** | |
949 | + * scsw_tm_is_valid_pno - check pno field validity | |
950 | + * @scsw: pointer to scsw | |
951 | + * | |
952 | + * Return non-zero if the pno field of the specified transport mode scsw is | |
953 | + * valid, zero otherwise. | |
954 | + */ | |
955 | +static inline int scsw_tm_is_valid_pno(union scsw *scsw) | |
956 | +{ | |
957 | + return (scsw->tm.fctl != 0) && | |
958 | + (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND) && | |
959 | + (!(scsw->tm.stctl & SCSW_STCTL_INTER_STATUS) || | |
960 | + ((scsw->tm.stctl & SCSW_STCTL_INTER_STATUS) && | |
961 | + (scsw->tm.actl & SCSW_ACTL_SUSPENDED))); | |
962 | +} | |
963 | + | |
964 | +/** | |
965 | + * scsw_tm_is_valid_fctl - check fctl field validity | |
966 | + * @scsw: pointer to scsw | |
967 | + * | |
968 | + * Return non-zero if the fctl field of the specified transport mode scsw is | |
969 | + * valid, zero otherwise. | |
970 | + */ | |
971 | +static inline int scsw_tm_is_valid_fctl(union scsw *scsw) | |
972 | +{ | |
973 | + /* Only valid if pmcw.dnv == 1*/ | |
974 | + return 1; | |
975 | +} | |
976 | + | |
977 | +/** | |
978 | + * scsw_tm_is_valid_actl - check actl field validity | |
979 | + * @scsw: pointer to scsw | |
980 | + * | |
981 | + * Return non-zero if the actl field of the specified transport mode scsw is | |
982 | + * valid, zero otherwise. | |
983 | + */ | |
984 | +static inline int scsw_tm_is_valid_actl(union scsw *scsw) | |
985 | +{ | |
986 | + /* Only valid if pmcw.dnv == 1*/ | |
987 | + return 1; | |
988 | +} | |
989 | + | |
990 | +/** | |
991 | + * scsw_tm_is_valid_stctl - check stctl field validity | |
992 | + * @scsw: pointer to scsw | |
993 | + * | |
994 | + * Return non-zero if the stctl field of the specified transport mode scsw is | |
995 | + * valid, zero otherwise. | |
996 | + */ | |
997 | +static inline int scsw_tm_is_valid_stctl(union scsw *scsw) | |
998 | +{ | |
999 | + /* Only valid if pmcw.dnv == 1*/ | |
1000 | + return 1; | |
1001 | +} | |
1002 | + | |
1003 | +/** | |
1004 | + * scsw_tm_is_valid_dstat - check dstat field validity | |
1005 | + * @scsw: pointer to scsw | |
1006 | + * | |
1007 | + * Return non-zero if the dstat field of the specified transport mode scsw is | |
1008 | + * valid, zero otherwise. | |
1009 | + */ | |
1010 | +static inline int scsw_tm_is_valid_dstat(union scsw *scsw) | |
1011 | +{ | |
1012 | + return (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND) && | |
1013 | + (scsw->tm.cc != 3); | |
1014 | +} | |
1015 | + | |
1016 | +/** | |
1017 | + * scsw_tm_is_valid_cstat - check cstat field validity | |
1018 | + * @scsw: pointer to scsw | |
1019 | + * | |
1020 | + * Return non-zero if the cstat field of the specified transport mode scsw is | |
1021 | + * valid, zero otherwise. | |
1022 | + */ | |
1023 | +static inline int scsw_tm_is_valid_cstat(union scsw *scsw) | |
1024 | +{ | |
1025 | + return (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND) && | |
1026 | + (scsw->tm.cc != 3); | |
1027 | +} | |
1028 | + | |
1029 | +/** | |
1030 | + * scsw_tm_is_valid_fcxs - check fcxs field validity | |
1031 | + * @scsw: pointer to scsw | |
1032 | + * | |
1033 | + * Return non-zero if the fcxs field of the specified transport mode scsw is | |
1034 | + * valid, zero otherwise. | |
1035 | + */ | |
1036 | +static inline int scsw_tm_is_valid_fcxs(union scsw *scsw) | |
1037 | +{ | |
1038 | + return 1; | |
1039 | +} | |
1040 | + | |
1041 | +/** | |
1042 | + * scsw_tm_is_valid_schxs - check schxs field validity | |
1043 | + * @scsw: pointer to scsw | |
1044 | + * | |
1045 | + * Return non-zero if the schxs field of the specified transport mode scsw is | |
1046 | + * valid, zero otherwise. | |
1047 | + */ | |
1048 | +static inline int scsw_tm_is_valid_schxs(union scsw *scsw) | |
1049 | +{ | |
1050 | + return (scsw->tm.cstat & (SCHN_STAT_PROG_CHECK | | |
1051 | + SCHN_STAT_INTF_CTRL_CHK | | |
1052 | + SCHN_STAT_PROT_CHECK | | |
1053 | + SCHN_STAT_CHN_DATA_CHK)); | |
1054 | +} | |
1055 | + | |
1056 | +/** | |
1057 | + * scsw_is_valid_actl - check actl field validity | |
1058 | + * @scsw: pointer to scsw | |
1059 | + * | |
1060 | + * Return non-zero if the actl field of the specified scsw is valid, | |
1061 | + * regardless of whether it is a transport mode or command mode scsw. | |
1062 | + * Return zero if the field does not contain a valid value. | |
1063 | + */ | |
1064 | +static inline int scsw_is_valid_actl(union scsw *scsw) | |
1065 | +{ | |
1066 | + if (scsw_is_tm(scsw)) | |
1067 | + return scsw_tm_is_valid_actl(scsw); | |
1068 | + else | |
1069 | + return scsw_cmd_is_valid_actl(scsw); | |
1070 | +} | |
1071 | + | |
1072 | +/** | |
1073 | + * scsw_is_valid_cc - check cc field validity | |
1074 | + * @scsw: pointer to scsw | |
1075 | + * | |
1076 | + * Return non-zero if the cc field of the specified scsw is valid, | |
1077 | + * regardless of whether it is a transport mode or command mode scsw. | |
1078 | + * Return zero if the field does not contain a valid value. | |
1079 | + */ | |
1080 | +static inline int scsw_is_valid_cc(union scsw *scsw) | |
1081 | +{ | |
1082 | + if (scsw_is_tm(scsw)) | |
1083 | + return scsw_tm_is_valid_cc(scsw); | |
1084 | + else | |
1085 | + return scsw_cmd_is_valid_cc(scsw); | |
1086 | +} | |
1087 | + | |
1088 | +/** | |
1089 | + * scsw_is_valid_cstat - check cstat field validity | |
1090 | + * @scsw: pointer to scsw | |
1091 | + * | |
1092 | + * Return non-zero if the cstat field of the specified scsw is valid, | |
1093 | + * regardless of whether it is a transport mode or command mode scsw. | |
1094 | + * Return zero if the field does not contain a valid value. | |
1095 | + */ | |
1096 | +static inline int scsw_is_valid_cstat(union scsw *scsw) | |
1097 | +{ | |
1098 | + if (scsw_is_tm(scsw)) | |
1099 | + return scsw_tm_is_valid_cstat(scsw); | |
1100 | + else | |
1101 | + return scsw_cmd_is_valid_cstat(scsw); | |
1102 | +} | |
1103 | + | |
1104 | +/** | |
1105 | + * scsw_is_valid_dstat - check dstat field validity | |
1106 | + * @scsw: pointer to scsw | |
1107 | + * | |
1108 | + * Return non-zero if the dstat field of the specified scsw is valid, | |
1109 | + * regardless of whether it is a transport mode or command mode scsw. | |
1110 | + * Return zero if the field does not contain a valid value. | |
1111 | + */ | |
1112 | +static inline int scsw_is_valid_dstat(union scsw *scsw) | |
1113 | +{ | |
1114 | + if (scsw_is_tm(scsw)) | |
1115 | + return scsw_tm_is_valid_dstat(scsw); | |
1116 | + else | |
1117 | + return scsw_cmd_is_valid_dstat(scsw); | |
1118 | +} | |
1119 | + | |
1120 | +/** | |
1121 | + * scsw_is_valid_ectl - check ectl field validity | |
1122 | + * @scsw: pointer to scsw | |
1123 | + * | |
1124 | + * Return non-zero if the ectl field of the specified scsw is valid, | |
1125 | + * regardless of whether it is a transport mode or command mode scsw. | |
1126 | + * Return zero if the field does not contain a valid value. | |
1127 | + */ | |
1128 | +static inline int scsw_is_valid_ectl(union scsw *scsw) | |
1129 | +{ | |
1130 | + if (scsw_is_tm(scsw)) | |
1131 | + return scsw_tm_is_valid_ectl(scsw); | |
1132 | + else | |
1133 | + return scsw_cmd_is_valid_ectl(scsw); | |
1134 | +} | |
1135 | + | |
1136 | +/** | |
1137 | + * scsw_is_valid_eswf - check eswf field validity | |
1138 | + * @scsw: pointer to scsw | |
1139 | + * | |
1140 | + * Return non-zero if the eswf field of the specified scsw is valid, | |
1141 | + * regardless of whether it is a transport mode or command mode scsw. | |
1142 | + * Return zero if the field does not contain a valid value. | |
1143 | + */ | |
1144 | +static inline int scsw_is_valid_eswf(union scsw *scsw) | |
1145 | +{ | |
1146 | + if (scsw_is_tm(scsw)) | |
1147 | + return scsw_tm_is_valid_eswf(scsw); | |
1148 | + else | |
1149 | + return scsw_cmd_is_valid_eswf(scsw); | |
1150 | +} | |
1151 | + | |
1152 | +/** | |
1153 | + * scsw_is_valid_fctl - check fctl field validity | |
1154 | + * @scsw: pointer to scsw | |
1155 | + * | |
1156 | + * Return non-zero if the fctl field of the specified scsw is valid, | |
1157 | + * regardless of whether it is a transport mode or command mode scsw. | |
1158 | + * Return zero if the field does not contain a valid value. | |
1159 | + */ | |
1160 | +static inline int scsw_is_valid_fctl(union scsw *scsw) | |
1161 | +{ | |
1162 | + if (scsw_is_tm(scsw)) | |
1163 | + return scsw_tm_is_valid_fctl(scsw); | |
1164 | + else | |
1165 | + return scsw_cmd_is_valid_fctl(scsw); | |
1166 | +} | |
1167 | + | |
1168 | +/** | |
1169 | + * scsw_is_valid_key - check key field validity | |
1170 | + * @scsw: pointer to scsw | |
1171 | + * | |
1172 | + * Return non-zero if the key field of the specified scsw is valid, | |
1173 | + * regardless of whether it is a transport mode or command mode scsw. | |
1174 | + * Return zero if the field does not contain a valid value. | |
1175 | + */ | |
1176 | +static inline int scsw_is_valid_key(union scsw *scsw) | |
1177 | +{ | |
1178 | + if (scsw_is_tm(scsw)) | |
1179 | + return scsw_tm_is_valid_key(scsw); | |
1180 | + else | |
1181 | + return scsw_cmd_is_valid_key(scsw); | |
1182 | +} | |
1183 | + | |
1184 | +/** | |
1185 | + * scsw_is_valid_pno - check pno field validity | |
1186 | + * @scsw: pointer to scsw | |
1187 | + * | |
1188 | + * Return non-zero if the pno field of the specified scsw is valid, | |
1189 | + * regardless of whether it is a transport mode or command mode scsw. | |
1190 | + * Return zero if the field does not contain a valid value. | |
1191 | + */ | |
1192 | +static inline int scsw_is_valid_pno(union scsw *scsw) | |
1193 | +{ | |
1194 | + if (scsw_is_tm(scsw)) | |
1195 | + return scsw_tm_is_valid_pno(scsw); | |
1196 | + else | |
1197 | + return scsw_cmd_is_valid_pno(scsw); | |
1198 | +} | |
1199 | + | |
1200 | +/** | |
1201 | + * scsw_is_valid_stctl - check stctl field validity | |
1202 | + * @scsw: pointer to scsw | |
1203 | + * | |
1204 | + * Return non-zero if the stctl field of the specified scsw is valid, | |
1205 | + * regardless of whether it is a transport mode or command mode scsw. | |
1206 | + * Return zero if the field does not contain a valid value. | |
1207 | + */ | |
1208 | +static inline int scsw_is_valid_stctl(union scsw *scsw) | |
1209 | +{ | |
1210 | + if (scsw_is_tm(scsw)) | |
1211 | + return scsw_tm_is_valid_stctl(scsw); | |
1212 | + else | |
1213 | + return scsw_cmd_is_valid_stctl(scsw); | |
1214 | +} | |
1215 | + | |
1216 | +/** | |
1217 | + * scsw_cmd_is_solicited - check for solicited scsw | |
1218 | + * @scsw: pointer to scsw | |
1219 | + * | |
1220 | + * Return non-zero if the command mode scsw indicates that the associated | |
1221 | + * status condition is solicited, zero if it is unsolicited. | |
1222 | + */ | |
1223 | +static inline int scsw_cmd_is_solicited(union scsw *scsw) | |
1224 | +{ | |
1225 | + return (scsw->cmd.cc != 0) || (scsw->cmd.stctl != | |
1226 | + (SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS)); | |
1227 | +} | |
1228 | + | |
1229 | +/** | |
1230 | + * scsw_tm_is_solicited - check for solicited scsw | |
1231 | + * @scsw: pointer to scsw | |
1232 | + * | |
1233 | + * Return non-zero if the transport mode scsw indicates that the associated | |
1234 | + * status condition is solicited, zero if it is unsolicited. | |
1235 | + */ | |
1236 | +static inline int scsw_tm_is_solicited(union scsw *scsw) | |
1237 | +{ | |
1238 | + return (scsw->tm.cc != 0) || (scsw->tm.stctl != | |
1239 | + (SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS)); | |
1240 | +} | |
1241 | + | |
1242 | +/** | |
1243 | + * scsw_is_solicited - check for solicited scsw | |
1244 | + * @scsw: pointer to scsw | |
1245 | + * | |
1246 | + * Return non-zero if the transport or command mode scsw indicates that the | |
1247 | + * associated status condition is solicited, zero if it is unsolicited. | |
1248 | + */ | |
1249 | +static inline int scsw_is_solicited(union scsw *scsw) | |
1250 | +{ | |
1251 | + if (scsw_is_tm(scsw)) | |
1252 | + return scsw_tm_is_solicited(scsw); | |
1253 | + else | |
1254 | + return scsw_cmd_is_solicited(scsw); | |
1255 | +} | |
1256 | + | |
1257 | +#endif /* _ASM_S390_SCSW_H_ */ | |
1258 | Index: linux-sles11/drivers/s390/cio/chsc.h | |
1259 | =================================================================== | |
1260 | --- linux-sles11.orig/drivers/s390/cio/chsc.h | |
1261 | +++ linux-sles11/drivers/s390/cio/chsc.h | |
1262 | @@ -37,29 +37,6 @@ struct channel_path_desc { | |
1263 | ||
1264 | struct channel_path; | |
1265 | ||
1266 | -struct css_general_char { | |
1267 | - u64 : 12; | |
1268 | - u32 dynio : 1; /* bit 12 */ | |
1269 | - u32 : 28; | |
1270 | - u32 aif : 1; /* bit 41 */ | |
1271 | - u32 : 3; | |
1272 | - u32 mcss : 1; /* bit 45 */ | |
1273 | - u32 fcs : 1; /* bit 46 */ | |
1274 | - u32 : 1; | |
1275 | - u32 ext_mb : 1; /* bit 48 */ | |
1276 | - u32 : 7; | |
1277 | - u32 aif_tdd : 1; /* bit 56 */ | |
1278 | - u32 : 1; | |
1279 | - u32 qebsm : 1; /* bit 58 */ | |
1280 | - u32 : 8; | |
1281 | - u32 aif_osa : 1; /* bit 67 */ | |
1282 | - u32 : 14; | |
1283 | - u32 cib : 1; /* bit 82 */ | |
1284 | - u32 : 5; | |
1285 | - u32 fcx : 1; /* bit 88 */ | |
1286 | - u32 : 7; | |
1287 | -}__attribute__((packed)); | |
1288 | - | |
1289 | struct css_chsc_char { | |
1290 | u64 res; | |
1291 | u64 : 20; | |
1292 | @@ -72,7 +49,6 @@ struct css_chsc_char { | |
1293 | u32 : 19; | |
1294 | }__attribute__((packed)); | |
1295 | ||
1296 | -extern struct css_general_char css_general_characteristics; | |
1297 | extern struct css_chsc_char css_chsc_characteristics; | |
1298 | ||
1299 | struct chsc_ssd_info { | |
1300 | Index: linux-sles11/drivers/s390/cio/Makefile | |
1301 | =================================================================== | |
1302 | --- linux-sles11.orig/drivers/s390/cio/Makefile | |
1303 | +++ linux-sles11/drivers/s390/cio/Makefile | |
1304 | @@ -2,7 +2,7 @@ | |
1305 | # Makefile for the S/390 common i/o drivers | |
1306 | # | |
1307 | ||
1308 | -obj-y += airq.o blacklist.o chsc.o cio.o css.o chp.o idset.o isc.o scsw.o \ | |
1309 | +obj-y += airq.o blacklist.o chsc.o cio.o css.o chp.o idset.o isc.o \ | |
1310 | fcx.o itcw.o | |
1311 | ccw_device-objs += device.o device_fsm.o device_ops.o | |
1312 | ccw_device-objs += device_id.o device_pgid.o device_status.o | |
1313 | Index: linux-sles11/drivers/s390/cio/scsw.c | |
1314 | =================================================================== | |
1315 | --- linux-sles11.orig/drivers/s390/cio/scsw.c | |
1316 | +++ /dev/null | |
1317 | @@ -1,843 +0,0 @@ | |
1318 | -/* | |
1319 | - * Helper functions for scsw access. | |
1320 | - * | |
1321 | - * Copyright IBM Corp. 2008 | |
1322 | - * Author(s): Peter Oberparleiter <peter.oberparleiter@de.ibm.com> | |
1323 | - */ | |
1324 | - | |
1325 | -#include <linux/types.h> | |
1326 | -#include <linux/module.h> | |
1327 | -#include <asm/cio.h> | |
1328 | -#include "css.h" | |
1329 | -#include "chsc.h" | |
1330 | - | |
1331 | -/** | |
1332 | - * scsw_is_tm - check for transport mode scsw | |
1333 | - * @scsw: pointer to scsw | |
1334 | - * | |
1335 | - * Return non-zero if the specified scsw is a transport mode scsw, zero | |
1336 | - * otherwise. | |
1337 | - */ | |
1338 | -int scsw_is_tm(union scsw *scsw) | |
1339 | -{ | |
1340 | - return css_general_characteristics.fcx && (scsw->tm.x == 1); | |
1341 | -} | |
1342 | -EXPORT_SYMBOL(scsw_is_tm); | |
1343 | - | |
1344 | -/** | |
1345 | - * scsw_key - return scsw key field | |
1346 | - * @scsw: pointer to scsw | |
1347 | - * | |
1348 | - * Return the value of the key field of the specified scsw, regardless of | |
1349 | - * whether it is a transport mode or command mode scsw. | |
1350 | - */ | |
1351 | -u32 scsw_key(union scsw *scsw) | |
1352 | -{ | |
1353 | - if (scsw_is_tm(scsw)) | |
1354 | - return scsw->tm.key; | |
1355 | - else | |
1356 | - return scsw->cmd.key; | |
1357 | -} | |
1358 | -EXPORT_SYMBOL(scsw_key); | |
1359 | - | |
1360 | -/** | |
1361 | - * scsw_eswf - return scsw eswf field | |
1362 | - * @scsw: pointer to scsw | |
1363 | - * | |
1364 | - * Return the value of the eswf field of the specified scsw, regardless of | |
1365 | - * whether it is a transport mode or command mode scsw. | |
1366 | - */ | |
1367 | -u32 scsw_eswf(union scsw *scsw) | |
1368 | -{ | |
1369 | - if (scsw_is_tm(scsw)) | |
1370 | - return scsw->tm.eswf; | |
1371 | - else | |
1372 | - return scsw->cmd.eswf; | |
1373 | -} | |
1374 | -EXPORT_SYMBOL(scsw_eswf); | |
1375 | - | |
1376 | -/** | |
1377 | - * scsw_cc - return scsw cc field | |
1378 | - * @scsw: pointer to scsw | |
1379 | - * | |
1380 | - * Return the value of the cc field of the specified scsw, regardless of | |
1381 | - * whether it is a transport mode or command mode scsw. | |
1382 | - */ | |
1383 | -u32 scsw_cc(union scsw *scsw) | |
1384 | -{ | |
1385 | - if (scsw_is_tm(scsw)) | |
1386 | - return scsw->tm.cc; | |
1387 | - else | |
1388 | - return scsw->cmd.cc; | |
1389 | -} | |
1390 | -EXPORT_SYMBOL(scsw_cc); | |
1391 | - | |
1392 | -/** | |
1393 | - * scsw_ectl - return scsw ectl field | |
1394 | - * @scsw: pointer to scsw | |
1395 | - * | |
1396 | - * Return the value of the ectl field of the specified scsw, regardless of | |
1397 | - * whether it is a transport mode or command mode scsw. | |
1398 | - */ | |
1399 | -u32 scsw_ectl(union scsw *scsw) | |
1400 | -{ | |
1401 | - if (scsw_is_tm(scsw)) | |
1402 | - return scsw->tm.ectl; | |
1403 | - else | |
1404 | - return scsw->cmd.ectl; | |
1405 | -} | |
1406 | -EXPORT_SYMBOL(scsw_ectl); | |
1407 | - | |
1408 | -/** | |
1409 | - * scsw_pno - return scsw pno field | |
1410 | - * @scsw: pointer to scsw | |
1411 | - * | |
1412 | - * Return the value of the pno field of the specified scsw, regardless of | |
1413 | - * whether it is a transport mode or command mode scsw. | |
1414 | - */ | |
1415 | -u32 scsw_pno(union scsw *scsw) | |
1416 | -{ | |
1417 | - if (scsw_is_tm(scsw)) | |
1418 | - return scsw->tm.pno; | |
1419 | - else | |
1420 | - return scsw->cmd.pno; | |
1421 | -} | |
1422 | -EXPORT_SYMBOL(scsw_pno); | |
1423 | - | |
1424 | -/** | |
1425 | - * scsw_fctl - return scsw fctl field | |
1426 | - * @scsw: pointer to scsw | |
1427 | - * | |
1428 | - * Return the value of the fctl field of the specified scsw, regardless of | |
1429 | - * whether it is a transport mode or command mode scsw. | |
1430 | - */ | |
1431 | -u32 scsw_fctl(union scsw *scsw) | |
1432 | -{ | |
1433 | - if (scsw_is_tm(scsw)) | |
1434 | - return scsw->tm.fctl; | |
1435 | - else | |
1436 | - return scsw->cmd.fctl; | |
1437 | -} | |
1438 | -EXPORT_SYMBOL(scsw_fctl); | |
1439 | - | |
1440 | -/** | |
1441 | - * scsw_actl - return scsw actl field | |
1442 | - * @scsw: pointer to scsw | |
1443 | - * | |
1444 | - * Return the value of the actl field of the specified scsw, regardless of | |
1445 | - * whether it is a transport mode or command mode scsw. | |
1446 | - */ | |
1447 | -u32 scsw_actl(union scsw *scsw) | |
1448 | -{ | |
1449 | - if (scsw_is_tm(scsw)) | |
1450 | - return scsw->tm.actl; | |
1451 | - else | |
1452 | - return scsw->cmd.actl; | |
1453 | -} | |
1454 | -EXPORT_SYMBOL(scsw_actl); | |
1455 | - | |
1456 | -/** | |
1457 | - * scsw_stctl - return scsw stctl field | |
1458 | - * @scsw: pointer to scsw | |
1459 | - * | |
1460 | - * Return the value of the stctl field of the specified scsw, regardless of | |
1461 | - * whether it is a transport mode or command mode scsw. | |
1462 | - */ | |
1463 | -u32 scsw_stctl(union scsw *scsw) | |
1464 | -{ | |
1465 | - if (scsw_is_tm(scsw)) | |
1466 | - return scsw->tm.stctl; | |
1467 | - else | |
1468 | - return scsw->cmd.stctl; | |
1469 | -} | |
1470 | -EXPORT_SYMBOL(scsw_stctl); | |
1471 | - | |
1472 | -/** | |
1473 | - * scsw_dstat - return scsw dstat field | |
1474 | - * @scsw: pointer to scsw | |
1475 | - * | |
1476 | - * Return the value of the dstat field of the specified scsw, regardless of | |
1477 | - * whether it is a transport mode or command mode scsw. | |
1478 | - */ | |
1479 | -u32 scsw_dstat(union scsw *scsw) | |
1480 | -{ | |
1481 | - if (scsw_is_tm(scsw)) | |
1482 | - return scsw->tm.dstat; | |
1483 | - else | |
1484 | - return scsw->cmd.dstat; | |
1485 | -} | |
1486 | -EXPORT_SYMBOL(scsw_dstat); | |
1487 | - | |
1488 | -/** | |
1489 | - * scsw_cstat - return scsw cstat field | |
1490 | - * @scsw: pointer to scsw | |
1491 | - * | |
1492 | - * Return the value of the cstat field of the specified scsw, regardless of | |
1493 | - * whether it is a transport mode or command mode scsw. | |
1494 | - */ | |
1495 | -u32 scsw_cstat(union scsw *scsw) | |
1496 | -{ | |
1497 | - if (scsw_is_tm(scsw)) | |
1498 | - return scsw->tm.cstat; | |
1499 | - else | |
1500 | - return scsw->cmd.cstat; | |
1501 | -} | |
1502 | -EXPORT_SYMBOL(scsw_cstat); | |
1503 | - | |
1504 | -/** | |
1505 | - * scsw_cmd_is_valid_key - check key field validity | |
1506 | - * @scsw: pointer to scsw | |
1507 | - * | |
1508 | - * Return non-zero if the key field of the specified command mode scsw is | |
1509 | - * valid, zero otherwise. | |
1510 | - */ | |
1511 | -int scsw_cmd_is_valid_key(union scsw *scsw) | |
1512 | -{ | |
1513 | - return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC); | |
1514 | -} | |
1515 | -EXPORT_SYMBOL(scsw_cmd_is_valid_key); | |
1516 | - | |
1517 | -/** | |
1518 | - * scsw_cmd_is_valid_sctl - check fctl field validity | |
1519 | - * @scsw: pointer to scsw | |
1520 | - * | |
1521 | - * Return non-zero if the fctl field of the specified command mode scsw is | |
1522 | - * valid, zero otherwise. | |
1523 | - */ | |
1524 | -int scsw_cmd_is_valid_sctl(union scsw *scsw) | |
1525 | -{ | |
1526 | - return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC); | |
1527 | -} | |
1528 | -EXPORT_SYMBOL(scsw_cmd_is_valid_sctl); | |
1529 | - | |
1530 | -/** | |
1531 | - * scsw_cmd_is_valid_eswf - check eswf field validity | |
1532 | - * @scsw: pointer to scsw | |
1533 | - * | |
1534 | - * Return non-zero if the eswf field of the specified command mode scsw is | |
1535 | - * valid, zero otherwise. | |
1536 | - */ | |
1537 | -int scsw_cmd_is_valid_eswf(union scsw *scsw) | |
1538 | -{ | |
1539 | - return (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND); | |
1540 | -} | |
1541 | -EXPORT_SYMBOL(scsw_cmd_is_valid_eswf); | |
1542 | - | |
1543 | -/** | |
1544 | - * scsw_cmd_is_valid_cc - check cc field validity | |
1545 | - * @scsw: pointer to scsw | |
1546 | - * | |
1547 | - * Return non-zero if the cc field of the specified command mode scsw is | |
1548 | - * valid, zero otherwise. | |
1549 | - */ | |
1550 | -int scsw_cmd_is_valid_cc(union scsw *scsw) | |
1551 | -{ | |
1552 | - return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC) && | |
1553 | - (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND); | |
1554 | -} | |
1555 | -EXPORT_SYMBOL(scsw_cmd_is_valid_cc); | |
1556 | - | |
1557 | -/** | |
1558 | - * scsw_cmd_is_valid_fmt - check fmt field validity | |
1559 | - * @scsw: pointer to scsw | |
1560 | - * | |
1561 | - * Return non-zero if the fmt field of the specified command mode scsw is | |
1562 | - * valid, zero otherwise. | |
1563 | - */ | |
1564 | -int scsw_cmd_is_valid_fmt(union scsw *scsw) | |
1565 | -{ | |
1566 | - return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC); | |
1567 | -} | |
1568 | -EXPORT_SYMBOL(scsw_cmd_is_valid_fmt); | |
1569 | - | |
1570 | -/** | |
1571 | - * scsw_cmd_is_valid_pfch - check pfch field validity | |
1572 | - * @scsw: pointer to scsw | |
1573 | - * | |
1574 | - * Return non-zero if the pfch field of the specified command mode scsw is | |
1575 | - * valid, zero otherwise. | |
1576 | - */ | |
1577 | -int scsw_cmd_is_valid_pfch(union scsw *scsw) | |
1578 | -{ | |
1579 | - return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC); | |
1580 | -} | |
1581 | -EXPORT_SYMBOL(scsw_cmd_is_valid_pfch); | |
1582 | - | |
1583 | -/** | |
1584 | - * scsw_cmd_is_valid_isic - check isic field validity | |
1585 | - * @scsw: pointer to scsw | |
1586 | - * | |
1587 | - * Return non-zero if the isic field of the specified command mode scsw is | |
1588 | - * valid, zero otherwise. | |
1589 | - */ | |
1590 | -int scsw_cmd_is_valid_isic(union scsw *scsw) | |
1591 | -{ | |
1592 | - return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC); | |
1593 | -} | |
1594 | -EXPORT_SYMBOL(scsw_cmd_is_valid_isic); | |
1595 | - | |
1596 | -/** | |
1597 | - * scsw_cmd_is_valid_alcc - check alcc field validity | |
1598 | - * @scsw: pointer to scsw | |
1599 | - * | |
1600 | - * Return non-zero if the alcc field of the specified command mode scsw is | |
1601 | - * valid, zero otherwise. | |
1602 | - */ | |
1603 | -int scsw_cmd_is_valid_alcc(union scsw *scsw) | |
1604 | -{ | |
1605 | - return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC); | |
1606 | -} | |
1607 | -EXPORT_SYMBOL(scsw_cmd_is_valid_alcc); | |
1608 | - | |
1609 | -/** | |
1610 | - * scsw_cmd_is_valid_ssi - check ssi field validity | |
1611 | - * @scsw: pointer to scsw | |
1612 | - * | |
1613 | - * Return non-zero if the ssi field of the specified command mode scsw is | |
1614 | - * valid, zero otherwise. | |
1615 | - */ | |
1616 | -int scsw_cmd_is_valid_ssi(union scsw *scsw) | |
1617 | -{ | |
1618 | - return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC); | |
1619 | -} | |
1620 | -EXPORT_SYMBOL(scsw_cmd_is_valid_ssi); | |
1621 | - | |
1622 | -/** | |
1623 | - * scsw_cmd_is_valid_zcc - check zcc field validity | |
1624 | - * @scsw: pointer to scsw | |
1625 | - * | |
1626 | - * Return non-zero if the zcc field of the specified command mode scsw is | |
1627 | - * valid, zero otherwise. | |
1628 | - */ | |
1629 | -int scsw_cmd_is_valid_zcc(union scsw *scsw) | |
1630 | -{ | |
1631 | - return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC) && | |
1632 | - (scsw->cmd.stctl & SCSW_STCTL_INTER_STATUS); | |
1633 | -} | |
1634 | -EXPORT_SYMBOL(scsw_cmd_is_valid_zcc); | |
1635 | - | |
1636 | -/** | |
1637 | - * scsw_cmd_is_valid_ectl - check ectl field validity | |
1638 | - * @scsw: pointer to scsw | |
1639 | - * | |
1640 | - * Return non-zero if the ectl field of the specified command mode scsw is | |
1641 | - * valid, zero otherwise. | |
1642 | - */ | |
1643 | -int scsw_cmd_is_valid_ectl(union scsw *scsw) | |
1644 | -{ | |
1645 | - return (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND) && | |
1646 | - !(scsw->cmd.stctl & SCSW_STCTL_INTER_STATUS) && | |
1647 | - (scsw->cmd.stctl & SCSW_STCTL_ALERT_STATUS); | |
1648 | -} | |
1649 | -EXPORT_SYMBOL(scsw_cmd_is_valid_ectl); | |
1650 | - | |
1651 | -/** | |
1652 | - * scsw_cmd_is_valid_pno - check pno field validity | |
1653 | - * @scsw: pointer to scsw | |
1654 | - * | |
1655 | - * Return non-zero if the pno field of the specified command mode scsw is | |
1656 | - * valid, zero otherwise. | |
1657 | - */ | |
1658 | -int scsw_cmd_is_valid_pno(union scsw *scsw) | |
1659 | -{ | |
1660 | - return (scsw->cmd.fctl != 0) && | |
1661 | - (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND) && | |
1662 | - (!(scsw->cmd.stctl & SCSW_STCTL_INTER_STATUS) || | |
1663 | - ((scsw->cmd.stctl & SCSW_STCTL_INTER_STATUS) && | |
1664 | - (scsw->cmd.actl & SCSW_ACTL_SUSPENDED))); | |
1665 | -} | |
1666 | -EXPORT_SYMBOL(scsw_cmd_is_valid_pno); | |
1667 | - | |
1668 | -/** | |
1669 | - * scsw_cmd_is_valid_fctl - check fctl field validity | |
1670 | - * @scsw: pointer to scsw | |
1671 | - * | |
1672 | - * Return non-zero if the fctl field of the specified command mode scsw is | |
1673 | - * valid, zero otherwise. | |
1674 | - */ | |
1675 | -int scsw_cmd_is_valid_fctl(union scsw *scsw) | |
1676 | -{ | |
1677 | - /* Only valid if pmcw.dnv == 1*/ | |
1678 | - return 1; | |
1679 | -} | |
1680 | -EXPORT_SYMBOL(scsw_cmd_is_valid_fctl); | |
1681 | - | |
1682 | -/** | |
1683 | - * scsw_cmd_is_valid_actl - check actl field validity | |
1684 | - * @scsw: pointer to scsw | |
1685 | - * | |
1686 | - * Return non-zero if the actl field of the specified command mode scsw is | |
1687 | - * valid, zero otherwise. | |
1688 | - */ | |
1689 | -int scsw_cmd_is_valid_actl(union scsw *scsw) | |
1690 | -{ | |
1691 | - /* Only valid if pmcw.dnv == 1*/ | |
1692 | - return 1; | |
1693 | -} | |
1694 | -EXPORT_SYMBOL(scsw_cmd_is_valid_actl); | |
1695 | - | |
1696 | -/** | |
1697 | - * scsw_cmd_is_valid_stctl - check stctl field validity | |
1698 | - * @scsw: pointer to scsw | |
1699 | - * | |
1700 | - * Return non-zero if the stctl field of the specified command mode scsw is | |
1701 | - * valid, zero otherwise. | |
1702 | - */ | |
1703 | -int scsw_cmd_is_valid_stctl(union scsw *scsw) | |
1704 | -{ | |
1705 | - /* Only valid if pmcw.dnv == 1*/ | |
1706 | - return 1; | |
1707 | -} | |
1708 | -EXPORT_SYMBOL(scsw_cmd_is_valid_stctl); | |
1709 | - | |
1710 | -/** | |
1711 | - * scsw_cmd_is_valid_dstat - check dstat field validity | |
1712 | - * @scsw: pointer to scsw | |
1713 | - * | |
1714 | - * Return non-zero if the dstat field of the specified command mode scsw is | |
1715 | - * valid, zero otherwise. | |
1716 | - */ | |
1717 | -int scsw_cmd_is_valid_dstat(union scsw *scsw) | |
1718 | -{ | |
1719 | - return (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND) && | |
1720 | - (scsw->cmd.cc != 3); | |
1721 | -} | |
1722 | -EXPORT_SYMBOL(scsw_cmd_is_valid_dstat); | |
1723 | - | |
1724 | -/** | |
1725 | - * scsw_cmd_is_valid_cstat - check cstat field validity | |
1726 | - * @scsw: pointer to scsw | |
1727 | - * | |
1728 | - * Return non-zero if the cstat field of the specified command mode scsw is | |
1729 | - * valid, zero otherwise. | |
1730 | - */ | |
1731 | -int scsw_cmd_is_valid_cstat(union scsw *scsw) | |
1732 | -{ | |
1733 | - return (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND) && | |
1734 | - (scsw->cmd.cc != 3); | |
1735 | -} | |
1736 | -EXPORT_SYMBOL(scsw_cmd_is_valid_cstat); | |
1737 | - | |
1738 | -/** | |
1739 | - * scsw_tm_is_valid_key - check key field validity | |
1740 | - * @scsw: pointer to scsw | |
1741 | - * | |
1742 | - * Return non-zero if the key field of the specified transport mode scsw is | |
1743 | - * valid, zero otherwise. | |
1744 | - */ | |
1745 | -int scsw_tm_is_valid_key(union scsw *scsw) | |
1746 | -{ | |
1747 | - return (scsw->tm.fctl & SCSW_FCTL_START_FUNC); | |
1748 | -} | |
1749 | -EXPORT_SYMBOL(scsw_tm_is_valid_key); | |
1750 | - | |
1751 | -/** | |
1752 | - * scsw_tm_is_valid_eswf - check eswf field validity | |
1753 | - * @scsw: pointer to scsw | |
1754 | - * | |
1755 | - * Return non-zero if the eswf field of the specified transport mode scsw is | |
1756 | - * valid, zero otherwise. | |
1757 | - */ | |
1758 | -int scsw_tm_is_valid_eswf(union scsw *scsw) | |
1759 | -{ | |
1760 | - return (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND); | |
1761 | -} | |
1762 | -EXPORT_SYMBOL(scsw_tm_is_valid_eswf); | |
1763 | - | |
1764 | -/** | |
1765 | - * scsw_tm_is_valid_cc - check cc field validity | |
1766 | - * @scsw: pointer to scsw | |
1767 | - * | |
1768 | - * Return non-zero if the cc field of the specified transport mode scsw is | |
1769 | - * valid, zero otherwise. | |
1770 | - */ | |
1771 | -int scsw_tm_is_valid_cc(union scsw *scsw) | |
1772 | -{ | |
1773 | - return (scsw->tm.fctl & SCSW_FCTL_START_FUNC) && | |
1774 | - (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND); | |
1775 | -} | |
1776 | -EXPORT_SYMBOL(scsw_tm_is_valid_cc); | |
1777 | - | |
1778 | -/** | |
1779 | - * scsw_tm_is_valid_fmt - check fmt field validity | |
1780 | - * @scsw: pointer to scsw | |
1781 | - * | |
1782 | - * Return non-zero if the fmt field of the specified transport mode scsw is | |
1783 | - * valid, zero otherwise. | |
1784 | - */ | |
1785 | -int scsw_tm_is_valid_fmt(union scsw *scsw) | |
1786 | -{ | |
1787 | - return 1; | |
1788 | -} | |
1789 | -EXPORT_SYMBOL(scsw_tm_is_valid_fmt); | |
1790 | - | |
1791 | -/** | |
1792 | - * scsw_tm_is_valid_x - check x field validity | |
1793 | - * @scsw: pointer to scsw | |
1794 | - * | |
1795 | - * Return non-zero if the x field of the specified transport mode scsw is | |
1796 | - * valid, zero otherwise. | |
1797 | - */ | |
1798 | -int scsw_tm_is_valid_x(union scsw *scsw) | |
1799 | -{ | |
1800 | - return 1; | |
1801 | -} | |
1802 | -EXPORT_SYMBOL(scsw_tm_is_valid_x); | |
1803 | - | |
1804 | -/** | |
1805 | - * scsw_tm_is_valid_q - check q field validity | |
1806 | - * @scsw: pointer to scsw | |
1807 | - * | |
1808 | - * Return non-zero if the q field of the specified transport mode scsw is | |
1809 | - * valid, zero otherwise. | |
1810 | - */ | |
1811 | -int scsw_tm_is_valid_q(union scsw *scsw) | |
1812 | -{ | |
1813 | - return 1; | |
1814 | -} | |
1815 | -EXPORT_SYMBOL(scsw_tm_is_valid_q); | |
1816 | - | |
1817 | -/** | |
1818 | - * scsw_tm_is_valid_ectl - check ectl field validity | |
1819 | - * @scsw: pointer to scsw | |
1820 | - * | |
1821 | - * Return non-zero if the ectl field of the specified transport mode scsw is | |
1822 | - * valid, zero otherwise. | |
1823 | - */ | |
1824 | -int scsw_tm_is_valid_ectl(union scsw *scsw) | |
1825 | -{ | |
1826 | - return (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND) && | |
1827 | - !(scsw->tm.stctl & SCSW_STCTL_INTER_STATUS) && | |
1828 | - (scsw->tm.stctl & SCSW_STCTL_ALERT_STATUS); | |
1829 | -} | |
1830 | -EXPORT_SYMBOL(scsw_tm_is_valid_ectl); | |
1831 | - | |
1832 | -/** | |
1833 | - * scsw_tm_is_valid_pno - check pno field validity | |
1834 | - * @scsw: pointer to scsw | |
1835 | - * | |
1836 | - * Return non-zero if the pno field of the specified transport mode scsw is | |
1837 | - * valid, zero otherwise. | |
1838 | - */ | |
1839 | -int scsw_tm_is_valid_pno(union scsw *scsw) | |
1840 | -{ | |
1841 | - return (scsw->tm.fctl != 0) && | |
1842 | - (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND) && | |
1843 | - (!(scsw->tm.stctl & SCSW_STCTL_INTER_STATUS) || | |
1844 | - ((scsw->tm.stctl & SCSW_STCTL_INTER_STATUS) && | |
1845 | - (scsw->tm.actl & SCSW_ACTL_SUSPENDED))); | |
1846 | -} | |
1847 | -EXPORT_SYMBOL(scsw_tm_is_valid_pno); | |
1848 | - | |
1849 | -/** | |
1850 | - * scsw_tm_is_valid_fctl - check fctl field validity | |
1851 | - * @scsw: pointer to scsw | |
1852 | - * | |
1853 | - * Return non-zero if the fctl field of the specified transport mode scsw is | |
1854 | - * valid, zero otherwise. | |
1855 | - */ | |
1856 | -int scsw_tm_is_valid_fctl(union scsw *scsw) | |
1857 | -{ | |
1858 | - /* Only valid if pmcw.dnv == 1*/ | |
1859 | - return 1; | |
1860 | -} | |
1861 | -EXPORT_SYMBOL(scsw_tm_is_valid_fctl); | |
1862 | - | |
1863 | -/** | |
1864 | - * scsw_tm_is_valid_actl - check actl field validity | |
1865 | - * @scsw: pointer to scsw | |
1866 | - * | |
1867 | - * Return non-zero if the actl field of the specified transport mode scsw is | |
1868 | - * valid, zero otherwise. | |
1869 | - */ | |
1870 | -int scsw_tm_is_valid_actl(union scsw *scsw) | |
1871 | -{ | |
1872 | - /* Only valid if pmcw.dnv == 1*/ | |
1873 | - return 1; | |
1874 | -} | |
1875 | -EXPORT_SYMBOL(scsw_tm_is_valid_actl); | |
1876 | - | |
1877 | -/** | |
1878 | - * scsw_tm_is_valid_stctl - check stctl field validity | |
1879 | - * @scsw: pointer to scsw | |
1880 | - * | |
1881 | - * Return non-zero if the stctl field of the specified transport mode scsw is | |
1882 | - * valid, zero otherwise. | |
1883 | - */ | |
1884 | -int scsw_tm_is_valid_stctl(union scsw *scsw) | |
1885 | -{ | |
1886 | - /* Only valid if pmcw.dnv == 1*/ | |
1887 | - return 1; | |
1888 | -} | |
1889 | -EXPORT_SYMBOL(scsw_tm_is_valid_stctl); | |
1890 | - | |
1891 | -/** | |
1892 | - * scsw_tm_is_valid_dstat - check dstat field validity | |
1893 | - * @scsw: pointer to scsw | |
1894 | - * | |
1895 | - * Return non-zero if the dstat field of the specified transport mode scsw is | |
1896 | - * valid, zero otherwise. | |
1897 | - */ | |
1898 | -int scsw_tm_is_valid_dstat(union scsw *scsw) | |
1899 | -{ | |
1900 | - return (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND) && | |
1901 | - (scsw->tm.cc != 3); | |
1902 | -} | |
1903 | -EXPORT_SYMBOL(scsw_tm_is_valid_dstat); | |
1904 | - | |
1905 | -/** | |
1906 | - * scsw_tm_is_valid_cstat - check cstat field validity | |
1907 | - * @scsw: pointer to scsw | |
1908 | - * | |
1909 | - * Return non-zero if the cstat field of the specified transport mode scsw is | |
1910 | - * valid, zero otherwise. | |
1911 | - */ | |
1912 | -int scsw_tm_is_valid_cstat(union scsw *scsw) | |
1913 | -{ | |
1914 | - return (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND) && | |
1915 | - (scsw->tm.cc != 3); | |
1916 | -} | |
1917 | -EXPORT_SYMBOL(scsw_tm_is_valid_cstat); | |
1918 | - | |
1919 | -/** | |
1920 | - * scsw_tm_is_valid_fcxs - check fcxs field validity | |
1921 | - * @scsw: pointer to scsw | |
1922 | - * | |
1923 | - * Return non-zero if the fcxs field of the specified transport mode scsw is | |
1924 | - * valid, zero otherwise. | |
1925 | - */ | |
1926 | -int scsw_tm_is_valid_fcxs(union scsw *scsw) | |
1927 | -{ | |
1928 | - return 1; | |
1929 | -} | |
1930 | -EXPORT_SYMBOL(scsw_tm_is_valid_fcxs); | |
1931 | - | |
1932 | -/** | |
1933 | - * scsw_tm_is_valid_schxs - check schxs field validity | |
1934 | - * @scsw: pointer to scsw | |
1935 | - * | |
1936 | - * Return non-zero if the schxs field of the specified transport mode scsw is | |
1937 | - * valid, zero otherwise. | |
1938 | - */ | |
1939 | -int scsw_tm_is_valid_schxs(union scsw *scsw) | |
1940 | -{ | |
1941 | - return (scsw->tm.cstat & (SCHN_STAT_PROG_CHECK | | |
1942 | - SCHN_STAT_INTF_CTRL_CHK | | |
1943 | - SCHN_STAT_PROT_CHECK | | |
1944 | - SCHN_STAT_CHN_DATA_CHK)); | |
1945 | -} | |
1946 | -EXPORT_SYMBOL(scsw_tm_is_valid_schxs); | |
1947 | - | |
1948 | -/** | |
1949 | - * scsw_is_valid_actl - check actl field validity | |
1950 | - * @scsw: pointer to scsw | |
1951 | - * | |
1952 | - * Return non-zero if the actl field of the specified scsw is valid, | |
1953 | - * regardless of whether it is a transport mode or command mode scsw. | |
1954 | - * Return zero if the field does not contain a valid value. | |
1955 | - */ | |
1956 | -int scsw_is_valid_actl(union scsw *scsw) | |
1957 | -{ | |
1958 | - if (scsw_is_tm(scsw)) | |
1959 | - return scsw_tm_is_valid_actl(scsw); | |
1960 | - else | |
1961 | - return scsw_cmd_is_valid_actl(scsw); | |
1962 | -} | |
1963 | -EXPORT_SYMBOL(scsw_is_valid_actl); | |
1964 | - | |
1965 | -/** | |
1966 | - * scsw_is_valid_cc - check cc field validity | |
1967 | - * @scsw: pointer to scsw | |
1968 | - * | |
1969 | - * Return non-zero if the cc field of the specified scsw is valid, | |
1970 | - * regardless of whether it is a transport mode or command mode scsw. | |
1971 | - * Return zero if the field does not contain a valid value. | |
1972 | - */ | |
1973 | -int scsw_is_valid_cc(union scsw *scsw) | |
1974 | -{ | |
1975 | - if (scsw_is_tm(scsw)) | |
1976 | - return scsw_tm_is_valid_cc(scsw); | |
1977 | - else | |
1978 | - return scsw_cmd_is_valid_cc(scsw); | |
1979 | -} | |
1980 | -EXPORT_SYMBOL(scsw_is_valid_cc); | |
1981 | - | |
1982 | -/** | |
1983 | - * scsw_is_valid_cstat - check cstat field validity | |
1984 | - * @scsw: pointer to scsw | |
1985 | - * | |
1986 | - * Return non-zero if the cstat field of the specified scsw is valid, | |
1987 | - * regardless of whether it is a transport mode or command mode scsw. | |
1988 | - * Return zero if the field does not contain a valid value. | |
1989 | - */ | |
1990 | -int scsw_is_valid_cstat(union scsw *scsw) | |
1991 | -{ | |
1992 | - if (scsw_is_tm(scsw)) | |
1993 | - return scsw_tm_is_valid_cstat(scsw); | |
1994 | - else | |
1995 | - return scsw_cmd_is_valid_cstat(scsw); | |
1996 | -} | |
1997 | -EXPORT_SYMBOL(scsw_is_valid_cstat); | |
1998 | - | |
1999 | -/** | |
2000 | - * scsw_is_valid_dstat - check dstat field validity | |
2001 | - * @scsw: pointer to scsw | |
2002 | - * | |
2003 | - * Return non-zero if the dstat field of the specified scsw is valid, | |
2004 | - * regardless of whether it is a transport mode or command mode scsw. | |
2005 | - * Return zero if the field does not contain a valid value. | |
2006 | - */ | |
2007 | -int scsw_is_valid_dstat(union scsw *scsw) | |
2008 | -{ | |
2009 | - if (scsw_is_tm(scsw)) | |
2010 | - return scsw_tm_is_valid_dstat(scsw); | |
2011 | - else | |
2012 | - return scsw_cmd_is_valid_dstat(scsw); | |
2013 | -} | |
2014 | -EXPORT_SYMBOL(scsw_is_valid_dstat); | |
2015 | - | |
2016 | -/** | |
2017 | - * scsw_is_valid_ectl - check ectl field validity | |
2018 | - * @scsw: pointer to scsw | |
2019 | - * | |
2020 | - * Return non-zero if the ectl field of the specified scsw is valid, | |
2021 | - * regardless of whether it is a transport mode or command mode scsw. | |
2022 | - * Return zero if the field does not contain a valid value. | |
2023 | - */ | |
2024 | -int scsw_is_valid_ectl(union scsw *scsw) | |
2025 | -{ | |
2026 | - if (scsw_is_tm(scsw)) | |
2027 | - return scsw_tm_is_valid_ectl(scsw); | |
2028 | - else | |
2029 | - return scsw_cmd_is_valid_ectl(scsw); | |
2030 | -} | |
2031 | -EXPORT_SYMBOL(scsw_is_valid_ectl); | |
2032 | - | |
2033 | -/** | |
2034 | - * scsw_is_valid_eswf - check eswf field validity | |
2035 | - * @scsw: pointer to scsw | |
2036 | - * | |
2037 | - * Return non-zero if the eswf field of the specified scsw is valid, | |
2038 | - * regardless of whether it is a transport mode or command mode scsw. | |
2039 | - * Return zero if the field does not contain a valid value. | |
2040 | - */ | |
2041 | -int scsw_is_valid_eswf(union scsw *scsw) | |
2042 | -{ | |
2043 | - if (scsw_is_tm(scsw)) | |
2044 | - return scsw_tm_is_valid_eswf(scsw); | |
2045 | - else | |
2046 | - return scsw_cmd_is_valid_eswf(scsw); | |
2047 | -} | |
2048 | -EXPORT_SYMBOL(scsw_is_valid_eswf); | |
2049 | - | |
2050 | -/** | |
2051 | - * scsw_is_valid_fctl - check fctl field validity | |
2052 | - * @scsw: pointer to scsw | |
2053 | - * | |
2054 | - * Return non-zero if the fctl field of the specified scsw is valid, | |
2055 | - * regardless of whether it is a transport mode or command mode scsw. | |
2056 | - * Return zero if the field does not contain a valid value. | |
2057 | - */ | |
2058 | -int scsw_is_valid_fctl(union scsw *scsw) | |
2059 | -{ | |
2060 | - if (scsw_is_tm(scsw)) | |
2061 | - return scsw_tm_is_valid_fctl(scsw); | |
2062 | - else | |
2063 | - return scsw_cmd_is_valid_fctl(scsw); | |
2064 | -} | |
2065 | -EXPORT_SYMBOL(scsw_is_valid_fctl); | |
2066 | - | |
2067 | -/** | |
2068 | - * scsw_is_valid_key - check key field validity | |
2069 | - * @scsw: pointer to scsw | |
2070 | - * | |
2071 | - * Return non-zero if the key field of the specified scsw is valid, | |
2072 | - * regardless of whether it is a transport mode or command mode scsw. | |
2073 | - * Return zero if the field does not contain a valid value. | |
2074 | - */ | |
2075 | -int scsw_is_valid_key(union scsw *scsw) | |
2076 | -{ | |
2077 | - if (scsw_is_tm(scsw)) | |
2078 | - return scsw_tm_is_valid_key(scsw); | |
2079 | - else | |
2080 | - return scsw_cmd_is_valid_key(scsw); | |
2081 | -} | |
2082 | -EXPORT_SYMBOL(scsw_is_valid_key); | |
2083 | - | |
2084 | -/** | |
2085 | - * scsw_is_valid_pno - check pno field validity | |
2086 | - * @scsw: pointer to scsw | |
2087 | - * | |
2088 | - * Return non-zero if the pno field of the specified scsw is valid, | |
2089 | - * regardless of whether it is a transport mode or command mode scsw. | |
2090 | - * Return zero if the field does not contain a valid value. | |
2091 | - */ | |
2092 | -int scsw_is_valid_pno(union scsw *scsw) | |
2093 | -{ | |
2094 | - if (scsw_is_tm(scsw)) | |
2095 | - return scsw_tm_is_valid_pno(scsw); | |
2096 | - else | |
2097 | - return scsw_cmd_is_valid_pno(scsw); | |
2098 | -} | |
2099 | -EXPORT_SYMBOL(scsw_is_valid_pno); | |
2100 | - | |
2101 | -/** | |
2102 | - * scsw_is_valid_stctl - check stctl field validity | |
2103 | - * @scsw: pointer to scsw | |
2104 | - * | |
2105 | - * Return non-zero if the stctl field of the specified scsw is valid, | |
2106 | - * regardless of whether it is a transport mode or command mode scsw. | |
2107 | - * Return zero if the field does not contain a valid value. | |
2108 | - */ | |
2109 | -int scsw_is_valid_stctl(union scsw *scsw) | |
2110 | -{ | |
2111 | - if (scsw_is_tm(scsw)) | |
2112 | - return scsw_tm_is_valid_stctl(scsw); | |
2113 | - else | |
2114 | - return scsw_cmd_is_valid_stctl(scsw); | |
2115 | -} | |
2116 | -EXPORT_SYMBOL(scsw_is_valid_stctl); | |
2117 | - | |
2118 | -/** | |
2119 | - * scsw_cmd_is_solicited - check for solicited scsw | |
2120 | - * @scsw: pointer to scsw | |
2121 | - * | |
2122 | - * Return non-zero if the command mode scsw indicates that the associated | |
2123 | - * status condition is solicited, zero if it is unsolicited. | |
2124 | - */ | |
2125 | -int scsw_cmd_is_solicited(union scsw *scsw) | |
2126 | -{ | |
2127 | - return (scsw->cmd.cc != 0) || (scsw->cmd.stctl != | |
2128 | - (SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS)); | |
2129 | -} | |
2130 | -EXPORT_SYMBOL(scsw_cmd_is_solicited); | |
2131 | - | |
2132 | -/** | |
2133 | - * scsw_tm_is_solicited - check for solicited scsw | |
2134 | - * @scsw: pointer to scsw | |
2135 | - * | |
2136 | - * Return non-zero if the transport mode scsw indicates that the associated | |
2137 | - * status condition is solicited, zero if it is unsolicited. | |
2138 | - */ | |
2139 | -int scsw_tm_is_solicited(union scsw *scsw) | |
2140 | -{ | |
2141 | - return (scsw->tm.cc != 0) || (scsw->tm.stctl != | |
2142 | - (SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS)); | |
2143 | -} | |
2144 | -EXPORT_SYMBOL(scsw_tm_is_solicited); | |
2145 | - | |
2146 | -/** | |
2147 | - * scsw_is_solicited - check for solicited scsw | |
2148 | - * @scsw: pointer to scsw | |
2149 | - * | |
2150 | - * Return non-zero if the transport or command mode scsw indicates that the | |
2151 | - * associated status condition is solicited, zero if it is unsolicited. | |
2152 | - */ | |
2153 | -int scsw_is_solicited(union scsw *scsw) | |
2154 | -{ | |
2155 | - if (scsw_is_tm(scsw)) | |
2156 | - return scsw_tm_is_solicited(scsw); | |
2157 | - else | |
2158 | - return scsw_cmd_is_solicited(scsw); | |
2159 | -} | |
2160 | -EXPORT_SYMBOL(scsw_is_solicited); |