• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Helper functions for scsw access.
3  *
4  *    Copyright IBM Corp. 2008
5  *    Author(s): Peter Oberparleiter <peter.oberparleiter@de.ibm.com>
6  */
7 
8 #include <linux/types.h>
9 #include <linux/module.h>
10 #include <asm/cio.h>
11 #include "css.h"
12 #include "chsc.h"
13 
14 /**
15  * scsw_is_tm - check for transport mode scsw
16  * @scsw: pointer to scsw
17  *
18  * Return non-zero if the specified scsw is a transport mode scsw, zero
19  * otherwise.
20  */
scsw_is_tm(union scsw * scsw)21 int scsw_is_tm(union scsw *scsw)
22 {
23 	return css_general_characteristics.fcx && (scsw->tm.x == 1);
24 }
25 EXPORT_SYMBOL(scsw_is_tm);
26 
27 /**
28  * scsw_key - return scsw key field
29  * @scsw: pointer to scsw
30  *
31  * Return the value of the key field of the specified scsw, regardless of
32  * whether it is a transport mode or command mode scsw.
33  */
scsw_key(union scsw * scsw)34 u32 scsw_key(union scsw *scsw)
35 {
36 	if (scsw_is_tm(scsw))
37 		return scsw->tm.key;
38 	else
39 		return scsw->cmd.key;
40 }
41 EXPORT_SYMBOL(scsw_key);
42 
43 /**
44  * scsw_eswf - return scsw eswf field
45  * @scsw: pointer to scsw
46  *
47  * Return the value of the eswf field of the specified scsw, regardless of
48  * whether it is a transport mode or command mode scsw.
49  */
scsw_eswf(union scsw * scsw)50 u32 scsw_eswf(union scsw *scsw)
51 {
52 	if (scsw_is_tm(scsw))
53 		return scsw->tm.eswf;
54 	else
55 		return scsw->cmd.eswf;
56 }
57 EXPORT_SYMBOL(scsw_eswf);
58 
59 /**
60  * scsw_cc - return scsw cc field
61  * @scsw: pointer to scsw
62  *
63  * Return the value of the cc field of the specified scsw, regardless of
64  * whether it is a transport mode or command mode scsw.
65  */
scsw_cc(union scsw * scsw)66 u32 scsw_cc(union scsw *scsw)
67 {
68 	if (scsw_is_tm(scsw))
69 		return scsw->tm.cc;
70 	else
71 		return scsw->cmd.cc;
72 }
73 EXPORT_SYMBOL(scsw_cc);
74 
75 /**
76  * scsw_ectl - return scsw ectl field
77  * @scsw: pointer to scsw
78  *
79  * Return the value of the ectl field of the specified scsw, regardless of
80  * whether it is a transport mode or command mode scsw.
81  */
scsw_ectl(union scsw * scsw)82 u32 scsw_ectl(union scsw *scsw)
83 {
84 	if (scsw_is_tm(scsw))
85 		return scsw->tm.ectl;
86 	else
87 		return scsw->cmd.ectl;
88 }
89 EXPORT_SYMBOL(scsw_ectl);
90 
91 /**
92  * scsw_pno - return scsw pno field
93  * @scsw: pointer to scsw
94  *
95  * Return the value of the pno field of the specified scsw, regardless of
96  * whether it is a transport mode or command mode scsw.
97  */
scsw_pno(union scsw * scsw)98 u32 scsw_pno(union scsw *scsw)
99 {
100 	if (scsw_is_tm(scsw))
101 		return scsw->tm.pno;
102 	else
103 		return scsw->cmd.pno;
104 }
105 EXPORT_SYMBOL(scsw_pno);
106 
107 /**
108  * scsw_fctl - return scsw fctl field
109  * @scsw: pointer to scsw
110  *
111  * Return the value of the fctl field of the specified scsw, regardless of
112  * whether it is a transport mode or command mode scsw.
113  */
scsw_fctl(union scsw * scsw)114 u32 scsw_fctl(union scsw *scsw)
115 {
116 	if (scsw_is_tm(scsw))
117 		return scsw->tm.fctl;
118 	else
119 		return scsw->cmd.fctl;
120 }
121 EXPORT_SYMBOL(scsw_fctl);
122 
123 /**
124  * scsw_actl - return scsw actl field
125  * @scsw: pointer to scsw
126  *
127  * Return the value of the actl field of the specified scsw, regardless of
128  * whether it is a transport mode or command mode scsw.
129  */
scsw_actl(union scsw * scsw)130 u32 scsw_actl(union scsw *scsw)
131 {
132 	if (scsw_is_tm(scsw))
133 		return scsw->tm.actl;
134 	else
135 		return scsw->cmd.actl;
136 }
137 EXPORT_SYMBOL(scsw_actl);
138 
139 /**
140  * scsw_stctl - return scsw stctl field
141  * @scsw: pointer to scsw
142  *
143  * Return the value of the stctl field of the specified scsw, regardless of
144  * whether it is a transport mode or command mode scsw.
145  */
scsw_stctl(union scsw * scsw)146 u32 scsw_stctl(union scsw *scsw)
147 {
148 	if (scsw_is_tm(scsw))
149 		return scsw->tm.stctl;
150 	else
151 		return scsw->cmd.stctl;
152 }
153 EXPORT_SYMBOL(scsw_stctl);
154 
155 /**
156  * scsw_dstat - return scsw dstat field
157  * @scsw: pointer to scsw
158  *
159  * Return the value of the dstat field of the specified scsw, regardless of
160  * whether it is a transport mode or command mode scsw.
161  */
scsw_dstat(union scsw * scsw)162 u32 scsw_dstat(union scsw *scsw)
163 {
164 	if (scsw_is_tm(scsw))
165 		return scsw->tm.dstat;
166 	else
167 		return scsw->cmd.dstat;
168 }
169 EXPORT_SYMBOL(scsw_dstat);
170 
171 /**
172  * scsw_cstat - return scsw cstat field
173  * @scsw: pointer to scsw
174  *
175  * Return the value of the cstat field of the specified scsw, regardless of
176  * whether it is a transport mode or command mode scsw.
177  */
scsw_cstat(union scsw * scsw)178 u32 scsw_cstat(union scsw *scsw)
179 {
180 	if (scsw_is_tm(scsw))
181 		return scsw->tm.cstat;
182 	else
183 		return scsw->cmd.cstat;
184 }
185 EXPORT_SYMBOL(scsw_cstat);
186 
187 /**
188  * scsw_cmd_is_valid_key - check key field validity
189  * @scsw: pointer to scsw
190  *
191  * Return non-zero if the key field of the specified command mode scsw is
192  * valid, zero otherwise.
193  */
scsw_cmd_is_valid_key(union scsw * scsw)194 int scsw_cmd_is_valid_key(union scsw *scsw)
195 {
196 	return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
197 }
198 EXPORT_SYMBOL(scsw_cmd_is_valid_key);
199 
200 /**
201  * scsw_cmd_is_valid_sctl - check fctl field validity
202  * @scsw: pointer to scsw
203  *
204  * Return non-zero if the fctl field of the specified command mode scsw is
205  * valid, zero otherwise.
206  */
scsw_cmd_is_valid_sctl(union scsw * scsw)207 int scsw_cmd_is_valid_sctl(union scsw *scsw)
208 {
209 	return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
210 }
211 EXPORT_SYMBOL(scsw_cmd_is_valid_sctl);
212 
213 /**
214  * scsw_cmd_is_valid_eswf - check eswf field validity
215  * @scsw: pointer to scsw
216  *
217  * Return non-zero if the eswf field of the specified command mode scsw is
218  * valid, zero otherwise.
219  */
scsw_cmd_is_valid_eswf(union scsw * scsw)220 int scsw_cmd_is_valid_eswf(union scsw *scsw)
221 {
222 	return (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND);
223 }
224 EXPORT_SYMBOL(scsw_cmd_is_valid_eswf);
225 
226 /**
227  * scsw_cmd_is_valid_cc - check cc field validity
228  * @scsw: pointer to scsw
229  *
230  * Return non-zero if the cc field of the specified command mode scsw is
231  * valid, zero otherwise.
232  */
scsw_cmd_is_valid_cc(union scsw * scsw)233 int scsw_cmd_is_valid_cc(union scsw *scsw)
234 {
235 	return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC) &&
236 	       (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND);
237 }
238 EXPORT_SYMBOL(scsw_cmd_is_valid_cc);
239 
240 /**
241  * scsw_cmd_is_valid_fmt - check fmt field validity
242  * @scsw: pointer to scsw
243  *
244  * Return non-zero if the fmt field of the specified command mode scsw is
245  * valid, zero otherwise.
246  */
scsw_cmd_is_valid_fmt(union scsw * scsw)247 int scsw_cmd_is_valid_fmt(union scsw *scsw)
248 {
249 	return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
250 }
251 EXPORT_SYMBOL(scsw_cmd_is_valid_fmt);
252 
253 /**
254  * scsw_cmd_is_valid_pfch - check pfch field validity
255  * @scsw: pointer to scsw
256  *
257  * Return non-zero if the pfch field of the specified command mode scsw is
258  * valid, zero otherwise.
259  */
scsw_cmd_is_valid_pfch(union scsw * scsw)260 int scsw_cmd_is_valid_pfch(union scsw *scsw)
261 {
262 	return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
263 }
264 EXPORT_SYMBOL(scsw_cmd_is_valid_pfch);
265 
266 /**
267  * scsw_cmd_is_valid_isic - check isic field validity
268  * @scsw: pointer to scsw
269  *
270  * Return non-zero if the isic field of the specified command mode scsw is
271  * valid, zero otherwise.
272  */
scsw_cmd_is_valid_isic(union scsw * scsw)273 int scsw_cmd_is_valid_isic(union scsw *scsw)
274 {
275 	return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
276 }
277 EXPORT_SYMBOL(scsw_cmd_is_valid_isic);
278 
279 /**
280  * scsw_cmd_is_valid_alcc - check alcc field validity
281  * @scsw: pointer to scsw
282  *
283  * Return non-zero if the alcc field of the specified command mode scsw is
284  * valid, zero otherwise.
285  */
scsw_cmd_is_valid_alcc(union scsw * scsw)286 int scsw_cmd_is_valid_alcc(union scsw *scsw)
287 {
288 	return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
289 }
290 EXPORT_SYMBOL(scsw_cmd_is_valid_alcc);
291 
292 /**
293  * scsw_cmd_is_valid_ssi - check ssi field validity
294  * @scsw: pointer to scsw
295  *
296  * Return non-zero if the ssi field of the specified command mode scsw is
297  * valid, zero otherwise.
298  */
scsw_cmd_is_valid_ssi(union scsw * scsw)299 int scsw_cmd_is_valid_ssi(union scsw *scsw)
300 {
301 	return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
302 }
303 EXPORT_SYMBOL(scsw_cmd_is_valid_ssi);
304 
305 /**
306  * scsw_cmd_is_valid_zcc - check zcc field validity
307  * @scsw: pointer to scsw
308  *
309  * Return non-zero if the zcc field of the specified command mode scsw is
310  * valid, zero otherwise.
311  */
scsw_cmd_is_valid_zcc(union scsw * scsw)312 int scsw_cmd_is_valid_zcc(union scsw *scsw)
313 {
314 	return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC) &&
315 	       (scsw->cmd.stctl & SCSW_STCTL_INTER_STATUS);
316 }
317 EXPORT_SYMBOL(scsw_cmd_is_valid_zcc);
318 
319 /**
320  * scsw_cmd_is_valid_ectl - check ectl field validity
321  * @scsw: pointer to scsw
322  *
323  * Return non-zero if the ectl field of the specified command mode scsw is
324  * valid, zero otherwise.
325  */
scsw_cmd_is_valid_ectl(union scsw * scsw)326 int scsw_cmd_is_valid_ectl(union scsw *scsw)
327 {
328 	return (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND) &&
329 	       !(scsw->cmd.stctl & SCSW_STCTL_INTER_STATUS) &&
330 	       (scsw->cmd.stctl & SCSW_STCTL_ALERT_STATUS);
331 }
332 EXPORT_SYMBOL(scsw_cmd_is_valid_ectl);
333 
334 /**
335  * scsw_cmd_is_valid_pno - check pno field validity
336  * @scsw: pointer to scsw
337  *
338  * Return non-zero if the pno field of the specified command mode scsw is
339  * valid, zero otherwise.
340  */
scsw_cmd_is_valid_pno(union scsw * scsw)341 int scsw_cmd_is_valid_pno(union scsw *scsw)
342 {
343 	return (scsw->cmd.fctl != 0) &&
344 	       (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND) &&
345 	       (!(scsw->cmd.stctl & SCSW_STCTL_INTER_STATUS) ||
346 		 ((scsw->cmd.stctl & SCSW_STCTL_INTER_STATUS) &&
347 		  (scsw->cmd.actl & SCSW_ACTL_SUSPENDED)));
348 }
349 EXPORT_SYMBOL(scsw_cmd_is_valid_pno);
350 
351 /**
352  * scsw_cmd_is_valid_fctl - check fctl field validity
353  * @scsw: pointer to scsw
354  *
355  * Return non-zero if the fctl field of the specified command mode scsw is
356  * valid, zero otherwise.
357  */
scsw_cmd_is_valid_fctl(union scsw * scsw)358 int scsw_cmd_is_valid_fctl(union scsw *scsw)
359 {
360 	/* Only valid if pmcw.dnv == 1*/
361 	return 1;
362 }
363 EXPORT_SYMBOL(scsw_cmd_is_valid_fctl);
364 
365 /**
366  * scsw_cmd_is_valid_actl - check actl field validity
367  * @scsw: pointer to scsw
368  *
369  * Return non-zero if the actl field of the specified command mode scsw is
370  * valid, zero otherwise.
371  */
scsw_cmd_is_valid_actl(union scsw * scsw)372 int scsw_cmd_is_valid_actl(union scsw *scsw)
373 {
374 	/* Only valid if pmcw.dnv == 1*/
375 	return 1;
376 }
377 EXPORT_SYMBOL(scsw_cmd_is_valid_actl);
378 
379 /**
380  * scsw_cmd_is_valid_stctl - check stctl field validity
381  * @scsw: pointer to scsw
382  *
383  * Return non-zero if the stctl field of the specified command mode scsw is
384  * valid, zero otherwise.
385  */
scsw_cmd_is_valid_stctl(union scsw * scsw)386 int scsw_cmd_is_valid_stctl(union scsw *scsw)
387 {
388 	/* Only valid if pmcw.dnv == 1*/
389 	return 1;
390 }
391 EXPORT_SYMBOL(scsw_cmd_is_valid_stctl);
392 
393 /**
394  * scsw_cmd_is_valid_dstat - check dstat field validity
395  * @scsw: pointer to scsw
396  *
397  * Return non-zero if the dstat field of the specified command mode scsw is
398  * valid, zero otherwise.
399  */
scsw_cmd_is_valid_dstat(union scsw * scsw)400 int scsw_cmd_is_valid_dstat(union scsw *scsw)
401 {
402 	return (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND) &&
403 	       (scsw->cmd.cc != 3);
404 }
405 EXPORT_SYMBOL(scsw_cmd_is_valid_dstat);
406 
407 /**
408  * scsw_cmd_is_valid_cstat - check cstat field validity
409  * @scsw: pointer to scsw
410  *
411  * Return non-zero if the cstat field of the specified command mode scsw is
412  * valid, zero otherwise.
413  */
scsw_cmd_is_valid_cstat(union scsw * scsw)414 int scsw_cmd_is_valid_cstat(union scsw *scsw)
415 {
416 	return (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND) &&
417 	       (scsw->cmd.cc != 3);
418 }
419 EXPORT_SYMBOL(scsw_cmd_is_valid_cstat);
420 
421 /**
422  * scsw_tm_is_valid_key - check key field validity
423  * @scsw: pointer to scsw
424  *
425  * Return non-zero if the key field of the specified transport mode scsw is
426  * valid, zero otherwise.
427  */
scsw_tm_is_valid_key(union scsw * scsw)428 int scsw_tm_is_valid_key(union scsw *scsw)
429 {
430 	return (scsw->tm.fctl & SCSW_FCTL_START_FUNC);
431 }
432 EXPORT_SYMBOL(scsw_tm_is_valid_key);
433 
434 /**
435  * scsw_tm_is_valid_eswf - check eswf field validity
436  * @scsw: pointer to scsw
437  *
438  * Return non-zero if the eswf field of the specified transport mode scsw is
439  * valid, zero otherwise.
440  */
scsw_tm_is_valid_eswf(union scsw * scsw)441 int scsw_tm_is_valid_eswf(union scsw *scsw)
442 {
443 	return (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND);
444 }
445 EXPORT_SYMBOL(scsw_tm_is_valid_eswf);
446 
447 /**
448  * scsw_tm_is_valid_cc - check cc field validity
449  * @scsw: pointer to scsw
450  *
451  * Return non-zero if the cc field of the specified transport mode scsw is
452  * valid, zero otherwise.
453  */
scsw_tm_is_valid_cc(union scsw * scsw)454 int scsw_tm_is_valid_cc(union scsw *scsw)
455 {
456 	return (scsw->tm.fctl & SCSW_FCTL_START_FUNC) &&
457 	       (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND);
458 }
459 EXPORT_SYMBOL(scsw_tm_is_valid_cc);
460 
461 /**
462  * scsw_tm_is_valid_fmt - check fmt field validity
463  * @scsw: pointer to scsw
464  *
465  * Return non-zero if the fmt field of the specified transport mode scsw is
466  * valid, zero otherwise.
467  */
scsw_tm_is_valid_fmt(union scsw * scsw)468 int scsw_tm_is_valid_fmt(union scsw *scsw)
469 {
470 	return 1;
471 }
472 EXPORT_SYMBOL(scsw_tm_is_valid_fmt);
473 
474 /**
475  * scsw_tm_is_valid_x - check x field validity
476  * @scsw: pointer to scsw
477  *
478  * Return non-zero if the x field of the specified transport mode scsw is
479  * valid, zero otherwise.
480  */
scsw_tm_is_valid_x(union scsw * scsw)481 int scsw_tm_is_valid_x(union scsw *scsw)
482 {
483 	return 1;
484 }
485 EXPORT_SYMBOL(scsw_tm_is_valid_x);
486 
487 /**
488  * scsw_tm_is_valid_q - check q field validity
489  * @scsw: pointer to scsw
490  *
491  * Return non-zero if the q field of the specified transport mode scsw is
492  * valid, zero otherwise.
493  */
scsw_tm_is_valid_q(union scsw * scsw)494 int scsw_tm_is_valid_q(union scsw *scsw)
495 {
496 	return 1;
497 }
498 EXPORT_SYMBOL(scsw_tm_is_valid_q);
499 
500 /**
501  * scsw_tm_is_valid_ectl - check ectl field validity
502  * @scsw: pointer to scsw
503  *
504  * Return non-zero if the ectl field of the specified transport mode scsw is
505  * valid, zero otherwise.
506  */
scsw_tm_is_valid_ectl(union scsw * scsw)507 int scsw_tm_is_valid_ectl(union scsw *scsw)
508 {
509 	return (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND) &&
510 	       !(scsw->tm.stctl & SCSW_STCTL_INTER_STATUS) &&
511 	       (scsw->tm.stctl & SCSW_STCTL_ALERT_STATUS);
512 }
513 EXPORT_SYMBOL(scsw_tm_is_valid_ectl);
514 
515 /**
516  * scsw_tm_is_valid_pno - check pno field validity
517  * @scsw: pointer to scsw
518  *
519  * Return non-zero if the pno field of the specified transport mode scsw is
520  * valid, zero otherwise.
521  */
scsw_tm_is_valid_pno(union scsw * scsw)522 int scsw_tm_is_valid_pno(union scsw *scsw)
523 {
524 	return (scsw->tm.fctl != 0) &&
525 	       (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND) &&
526 	       (!(scsw->tm.stctl & SCSW_STCTL_INTER_STATUS) ||
527 		 ((scsw->tm.stctl & SCSW_STCTL_INTER_STATUS) &&
528 		  (scsw->tm.actl & SCSW_ACTL_SUSPENDED)));
529 }
530 EXPORT_SYMBOL(scsw_tm_is_valid_pno);
531 
532 /**
533  * scsw_tm_is_valid_fctl - check fctl field validity
534  * @scsw: pointer to scsw
535  *
536  * Return non-zero if the fctl field of the specified transport mode scsw is
537  * valid, zero otherwise.
538  */
scsw_tm_is_valid_fctl(union scsw * scsw)539 int scsw_tm_is_valid_fctl(union scsw *scsw)
540 {
541 	/* Only valid if pmcw.dnv == 1*/
542 	return 1;
543 }
544 EXPORT_SYMBOL(scsw_tm_is_valid_fctl);
545 
546 /**
547  * scsw_tm_is_valid_actl - check actl field validity
548  * @scsw: pointer to scsw
549  *
550  * Return non-zero if the actl field of the specified transport mode scsw is
551  * valid, zero otherwise.
552  */
scsw_tm_is_valid_actl(union scsw * scsw)553 int scsw_tm_is_valid_actl(union scsw *scsw)
554 {
555 	/* Only valid if pmcw.dnv == 1*/
556 	return 1;
557 }
558 EXPORT_SYMBOL(scsw_tm_is_valid_actl);
559 
560 /**
561  * scsw_tm_is_valid_stctl - check stctl field validity
562  * @scsw: pointer to scsw
563  *
564  * Return non-zero if the stctl field of the specified transport mode scsw is
565  * valid, zero otherwise.
566  */
scsw_tm_is_valid_stctl(union scsw * scsw)567 int scsw_tm_is_valid_stctl(union scsw *scsw)
568 {
569 	/* Only valid if pmcw.dnv == 1*/
570 	return 1;
571 }
572 EXPORT_SYMBOL(scsw_tm_is_valid_stctl);
573 
574 /**
575  * scsw_tm_is_valid_dstat - check dstat field validity
576  * @scsw: pointer to scsw
577  *
578  * Return non-zero if the dstat field of the specified transport mode scsw is
579  * valid, zero otherwise.
580  */
scsw_tm_is_valid_dstat(union scsw * scsw)581 int scsw_tm_is_valid_dstat(union scsw *scsw)
582 {
583 	return (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND) &&
584 	       (scsw->tm.cc != 3);
585 }
586 EXPORT_SYMBOL(scsw_tm_is_valid_dstat);
587 
588 /**
589  * scsw_tm_is_valid_cstat - check cstat field validity
590  * @scsw: pointer to scsw
591  *
592  * Return non-zero if the cstat field of the specified transport mode scsw is
593  * valid, zero otherwise.
594  */
scsw_tm_is_valid_cstat(union scsw * scsw)595 int scsw_tm_is_valid_cstat(union scsw *scsw)
596 {
597 	return (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND) &&
598 	       (scsw->tm.cc != 3);
599 }
600 EXPORT_SYMBOL(scsw_tm_is_valid_cstat);
601 
602 /**
603  * scsw_tm_is_valid_fcxs - check fcxs field validity
604  * @scsw: pointer to scsw
605  *
606  * Return non-zero if the fcxs field of the specified transport mode scsw is
607  * valid, zero otherwise.
608  */
scsw_tm_is_valid_fcxs(union scsw * scsw)609 int scsw_tm_is_valid_fcxs(union scsw *scsw)
610 {
611 	return 1;
612 }
613 EXPORT_SYMBOL(scsw_tm_is_valid_fcxs);
614 
615 /**
616  * scsw_tm_is_valid_schxs - check schxs field validity
617  * @scsw: pointer to scsw
618  *
619  * Return non-zero if the schxs field of the specified transport mode scsw is
620  * valid, zero otherwise.
621  */
scsw_tm_is_valid_schxs(union scsw * scsw)622 int scsw_tm_is_valid_schxs(union scsw *scsw)
623 {
624 	return (scsw->tm.cstat & (SCHN_STAT_PROG_CHECK |
625 				  SCHN_STAT_INTF_CTRL_CHK |
626 				  SCHN_STAT_PROT_CHECK |
627 				  SCHN_STAT_CHN_DATA_CHK));
628 }
629 EXPORT_SYMBOL(scsw_tm_is_valid_schxs);
630 
631 /**
632  * scsw_is_valid_actl - check actl field validity
633  * @scsw: pointer to scsw
634  *
635  * Return non-zero if the actl field of the specified scsw is valid,
636  * regardless of whether it is a transport mode or command mode scsw.
637  * Return zero if the field does not contain a valid value.
638  */
scsw_is_valid_actl(union scsw * scsw)639 int scsw_is_valid_actl(union scsw *scsw)
640 {
641 	if (scsw_is_tm(scsw))
642 		return scsw_tm_is_valid_actl(scsw);
643 	else
644 		return scsw_cmd_is_valid_actl(scsw);
645 }
646 EXPORT_SYMBOL(scsw_is_valid_actl);
647 
648 /**
649  * scsw_is_valid_cc - check cc field validity
650  * @scsw: pointer to scsw
651  *
652  * Return non-zero if the cc field of the specified scsw is valid,
653  * regardless of whether it is a transport mode or command mode scsw.
654  * Return zero if the field does not contain a valid value.
655  */
scsw_is_valid_cc(union scsw * scsw)656 int scsw_is_valid_cc(union scsw *scsw)
657 {
658 	if (scsw_is_tm(scsw))
659 		return scsw_tm_is_valid_cc(scsw);
660 	else
661 		return scsw_cmd_is_valid_cc(scsw);
662 }
663 EXPORT_SYMBOL(scsw_is_valid_cc);
664 
665 /**
666  * scsw_is_valid_cstat - check cstat field validity
667  * @scsw: pointer to scsw
668  *
669  * Return non-zero if the cstat field of the specified scsw is valid,
670  * regardless of whether it is a transport mode or command mode scsw.
671  * Return zero if the field does not contain a valid value.
672  */
scsw_is_valid_cstat(union scsw * scsw)673 int scsw_is_valid_cstat(union scsw *scsw)
674 {
675 	if (scsw_is_tm(scsw))
676 		return scsw_tm_is_valid_cstat(scsw);
677 	else
678 		return scsw_cmd_is_valid_cstat(scsw);
679 }
680 EXPORT_SYMBOL(scsw_is_valid_cstat);
681 
682 /**
683  * scsw_is_valid_dstat - check dstat field validity
684  * @scsw: pointer to scsw
685  *
686  * Return non-zero if the dstat field of the specified scsw is valid,
687  * regardless of whether it is a transport mode or command mode scsw.
688  * Return zero if the field does not contain a valid value.
689  */
scsw_is_valid_dstat(union scsw * scsw)690 int scsw_is_valid_dstat(union scsw *scsw)
691 {
692 	if (scsw_is_tm(scsw))
693 		return scsw_tm_is_valid_dstat(scsw);
694 	else
695 		return scsw_cmd_is_valid_dstat(scsw);
696 }
697 EXPORT_SYMBOL(scsw_is_valid_dstat);
698 
699 /**
700  * scsw_is_valid_ectl - check ectl field validity
701  * @scsw: pointer to scsw
702  *
703  * Return non-zero if the ectl field of the specified scsw is valid,
704  * regardless of whether it is a transport mode or command mode scsw.
705  * Return zero if the field does not contain a valid value.
706  */
scsw_is_valid_ectl(union scsw * scsw)707 int scsw_is_valid_ectl(union scsw *scsw)
708 {
709 	if (scsw_is_tm(scsw))
710 		return scsw_tm_is_valid_ectl(scsw);
711 	else
712 		return scsw_cmd_is_valid_ectl(scsw);
713 }
714 EXPORT_SYMBOL(scsw_is_valid_ectl);
715 
716 /**
717  * scsw_is_valid_eswf - check eswf field validity
718  * @scsw: pointer to scsw
719  *
720  * Return non-zero if the eswf field of the specified scsw is valid,
721  * regardless of whether it is a transport mode or command mode scsw.
722  * Return zero if the field does not contain a valid value.
723  */
scsw_is_valid_eswf(union scsw * scsw)724 int scsw_is_valid_eswf(union scsw *scsw)
725 {
726 	if (scsw_is_tm(scsw))
727 		return scsw_tm_is_valid_eswf(scsw);
728 	else
729 		return scsw_cmd_is_valid_eswf(scsw);
730 }
731 EXPORT_SYMBOL(scsw_is_valid_eswf);
732 
733 /**
734  * scsw_is_valid_fctl - check fctl field validity
735  * @scsw: pointer to scsw
736  *
737  * Return non-zero if the fctl field of the specified scsw is valid,
738  * regardless of whether it is a transport mode or command mode scsw.
739  * Return zero if the field does not contain a valid value.
740  */
scsw_is_valid_fctl(union scsw * scsw)741 int scsw_is_valid_fctl(union scsw *scsw)
742 {
743 	if (scsw_is_tm(scsw))
744 		return scsw_tm_is_valid_fctl(scsw);
745 	else
746 		return scsw_cmd_is_valid_fctl(scsw);
747 }
748 EXPORT_SYMBOL(scsw_is_valid_fctl);
749 
750 /**
751  * scsw_is_valid_key - check key field validity
752  * @scsw: pointer to scsw
753  *
754  * Return non-zero if the key field of the specified scsw is valid,
755  * regardless of whether it is a transport mode or command mode scsw.
756  * Return zero if the field does not contain a valid value.
757  */
scsw_is_valid_key(union scsw * scsw)758 int scsw_is_valid_key(union scsw *scsw)
759 {
760 	if (scsw_is_tm(scsw))
761 		return scsw_tm_is_valid_key(scsw);
762 	else
763 		return scsw_cmd_is_valid_key(scsw);
764 }
765 EXPORT_SYMBOL(scsw_is_valid_key);
766 
767 /**
768  * scsw_is_valid_pno - check pno field validity
769  * @scsw: pointer to scsw
770  *
771  * Return non-zero if the pno field of the specified scsw is valid,
772  * regardless of whether it is a transport mode or command mode scsw.
773  * Return zero if the field does not contain a valid value.
774  */
scsw_is_valid_pno(union scsw * scsw)775 int scsw_is_valid_pno(union scsw *scsw)
776 {
777 	if (scsw_is_tm(scsw))
778 		return scsw_tm_is_valid_pno(scsw);
779 	else
780 		return scsw_cmd_is_valid_pno(scsw);
781 }
782 EXPORT_SYMBOL(scsw_is_valid_pno);
783 
784 /**
785  * scsw_is_valid_stctl - check stctl field validity
786  * @scsw: pointer to scsw
787  *
788  * Return non-zero if the stctl field of the specified scsw is valid,
789  * regardless of whether it is a transport mode or command mode scsw.
790  * Return zero if the field does not contain a valid value.
791  */
scsw_is_valid_stctl(union scsw * scsw)792 int scsw_is_valid_stctl(union scsw *scsw)
793 {
794 	if (scsw_is_tm(scsw))
795 		return scsw_tm_is_valid_stctl(scsw);
796 	else
797 		return scsw_cmd_is_valid_stctl(scsw);
798 }
799 EXPORT_SYMBOL(scsw_is_valid_stctl);
800 
801 /**
802  * scsw_cmd_is_solicited - check for solicited scsw
803  * @scsw: pointer to scsw
804  *
805  * Return non-zero if the command mode scsw indicates that the associated
806  * status condition is solicited, zero if it is unsolicited.
807  */
scsw_cmd_is_solicited(union scsw * scsw)808 int scsw_cmd_is_solicited(union scsw *scsw)
809 {
810 	return (scsw->cmd.cc != 0) || (scsw->cmd.stctl !=
811 		(SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS));
812 }
813 EXPORT_SYMBOL(scsw_cmd_is_solicited);
814 
815 /**
816  * scsw_tm_is_solicited - check for solicited scsw
817  * @scsw: pointer to scsw
818  *
819  * Return non-zero if the transport mode scsw indicates that the associated
820  * status condition is solicited, zero if it is unsolicited.
821  */
scsw_tm_is_solicited(union scsw * scsw)822 int scsw_tm_is_solicited(union scsw *scsw)
823 {
824 	return (scsw->tm.cc != 0) || (scsw->tm.stctl !=
825 		(SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS));
826 }
827 EXPORT_SYMBOL(scsw_tm_is_solicited);
828 
829 /**
830  * scsw_is_solicited - check for solicited scsw
831  * @scsw: pointer to scsw
832  *
833  * Return non-zero if the transport or command mode scsw indicates that the
834  * associated status condition is solicited, zero if it is unsolicited.
835  */
scsw_is_solicited(union scsw * scsw)836 int scsw_is_solicited(union scsw *scsw)
837 {
838 	if (scsw_is_tm(scsw))
839 		return scsw_tm_is_solicited(scsw);
840 	else
841 		return scsw_cmd_is_solicited(scsw);
842 }
843 EXPORT_SYMBOL(scsw_is_solicited);
844