0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef _ASM_S390_SCSW_H_
0010 #define _ASM_S390_SCSW_H_
0011
0012 #include <linux/types.h>
0013 #include <asm/css_chars.h>
0014 #include <asm/cio.h>
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039 struct cmd_scsw {
0040 __u32 key : 4;
0041 __u32 sctl : 1;
0042 __u32 eswf : 1;
0043 __u32 cc : 2;
0044 __u32 fmt : 1;
0045 __u32 pfch : 1;
0046 __u32 isic : 1;
0047 __u32 alcc : 1;
0048 __u32 ssi : 1;
0049 __u32 zcc : 1;
0050 __u32 ectl : 1;
0051 __u32 pno : 1;
0052 __u32 res : 1;
0053 __u32 fctl : 3;
0054 __u32 actl : 7;
0055 __u32 stctl : 5;
0056 __u32 cpa;
0057 __u32 dstat : 8;
0058 __u32 cstat : 8;
0059 __u32 count : 16;
0060 } __attribute__ ((packed));
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081 struct tm_scsw {
0082 u32 key:4;
0083 u32 :1;
0084 u32 eswf:1;
0085 u32 cc:2;
0086 u32 fmt:3;
0087 u32 x:1;
0088 u32 q:1;
0089 u32 :1;
0090 u32 ectl:1;
0091 u32 pno:1;
0092 u32 :1;
0093 u32 fctl:3;
0094 u32 actl:7;
0095 u32 stctl:5;
0096 u32 tcw;
0097 u32 dstat:8;
0098 u32 cstat:8;
0099 u32 fcxs:8;
0100 u32 ifob:1;
0101 u32 sesq:7;
0102 } __attribute__ ((packed));
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117 struct eadm_scsw {
0118 u32 key:4;
0119 u32:1;
0120 u32 eswf:1;
0121 u32 cc:2;
0122 u32:6;
0123 u32 ectl:1;
0124 u32:2;
0125 u32 fctl:3;
0126 u32 actl:7;
0127 u32 stctl:5;
0128 u32 aob;
0129 u32 dstat:8;
0130 u32 cstat:8;
0131 u32:16;
0132 } __packed;
0133
0134
0135
0136
0137
0138
0139
0140 union scsw {
0141 struct cmd_scsw cmd;
0142 struct tm_scsw tm;
0143 struct eadm_scsw eadm;
0144 } __packed;
0145
0146 #define SCSW_FCTL_CLEAR_FUNC 0x1
0147 #define SCSW_FCTL_HALT_FUNC 0x2
0148 #define SCSW_FCTL_START_FUNC 0x4
0149
0150 #define SCSW_ACTL_SUSPENDED 0x1
0151 #define SCSW_ACTL_DEVACT 0x2
0152 #define SCSW_ACTL_SCHACT 0x4
0153 #define SCSW_ACTL_CLEAR_PEND 0x8
0154 #define SCSW_ACTL_HALT_PEND 0x10
0155 #define SCSW_ACTL_START_PEND 0x20
0156 #define SCSW_ACTL_RESUME_PEND 0x40
0157
0158 #define SCSW_STCTL_STATUS_PEND 0x1
0159 #define SCSW_STCTL_SEC_STATUS 0x2
0160 #define SCSW_STCTL_PRIM_STATUS 0x4
0161 #define SCSW_STCTL_INTER_STATUS 0x8
0162 #define SCSW_STCTL_ALERT_STATUS 0x10
0163
0164 #define DEV_STAT_ATTENTION 0x80
0165 #define DEV_STAT_STAT_MOD 0x40
0166 #define DEV_STAT_CU_END 0x20
0167 #define DEV_STAT_BUSY 0x10
0168 #define DEV_STAT_CHN_END 0x08
0169 #define DEV_STAT_DEV_END 0x04
0170 #define DEV_STAT_UNIT_CHECK 0x02
0171 #define DEV_STAT_UNIT_EXCEP 0x01
0172
0173 #define SCHN_STAT_PCI 0x80
0174 #define SCHN_STAT_INCORR_LEN 0x40
0175 #define SCHN_STAT_PROG_CHECK 0x20
0176 #define SCHN_STAT_PROT_CHECK 0x10
0177 #define SCHN_STAT_CHN_DATA_CHK 0x08
0178 #define SCHN_STAT_CHN_CTRL_CHK 0x04
0179 #define SCHN_STAT_INTF_CTRL_CHK 0x02
0180 #define SCHN_STAT_CHAIN_CHECK 0x01
0181
0182 #define SCSW_SESQ_DEV_NOFCX 3
0183 #define SCSW_SESQ_PATH_NOFCX 4
0184
0185
0186
0187
0188 #define SNS0_CMD_REJECT 0x80
0189 #define SNS_CMD_REJECT SNS0_CMD_REJEC
0190 #define SNS0_INTERVENTION_REQ 0x40
0191 #define SNS0_BUS_OUT_CHECK 0x20
0192 #define SNS0_EQUIPMENT_CHECK 0x10
0193 #define SNS0_DATA_CHECK 0x08
0194 #define SNS0_OVERRUN 0x04
0195 #define SNS0_INCOMPL_DOMAIN 0x01
0196
0197
0198
0199
0200 #define SNS1_PERM_ERR 0x80
0201 #define SNS1_INV_TRACK_FORMAT 0x40
0202 #define SNS1_EOC 0x20
0203 #define SNS1_MESSAGE_TO_OPER 0x10
0204 #define SNS1_NO_REC_FOUND 0x08
0205 #define SNS1_FILE_PROTECTED 0x04
0206 #define SNS1_WRITE_INHIBITED 0x02
0207 #define SNS1_INPRECISE_END 0x01
0208
0209
0210
0211
0212 #define SNS2_REQ_INH_WRITE 0x80
0213 #define SNS2_CORRECTABLE 0x40
0214 #define SNS2_FIRST_LOG_ERR 0x20
0215 #define SNS2_ENV_DATA_PRESENT 0x10
0216 #define SNS2_INPRECISE_END 0x04
0217
0218
0219
0220
0221
0222
0223
0224
0225 static inline int scsw_is_tm(union scsw *scsw)
0226 {
0227 return css_general_characteristics.fcx && (scsw->tm.x == 1);
0228 }
0229
0230
0231
0232
0233
0234
0235
0236
0237 static inline u32 scsw_key(union scsw *scsw)
0238 {
0239 if (scsw_is_tm(scsw))
0240 return scsw->tm.key;
0241 else
0242 return scsw->cmd.key;
0243 }
0244
0245
0246
0247
0248
0249
0250
0251
0252 static inline u32 scsw_eswf(union scsw *scsw)
0253 {
0254 if (scsw_is_tm(scsw))
0255 return scsw->tm.eswf;
0256 else
0257 return scsw->cmd.eswf;
0258 }
0259
0260
0261
0262
0263
0264
0265
0266
0267 static inline u32 scsw_cc(union scsw *scsw)
0268 {
0269 if (scsw_is_tm(scsw))
0270 return scsw->tm.cc;
0271 else
0272 return scsw->cmd.cc;
0273 }
0274
0275
0276
0277
0278
0279
0280
0281
0282 static inline u32 scsw_ectl(union scsw *scsw)
0283 {
0284 if (scsw_is_tm(scsw))
0285 return scsw->tm.ectl;
0286 else
0287 return scsw->cmd.ectl;
0288 }
0289
0290
0291
0292
0293
0294
0295
0296
0297 static inline u32 scsw_pno(union scsw *scsw)
0298 {
0299 if (scsw_is_tm(scsw))
0300 return scsw->tm.pno;
0301 else
0302 return scsw->cmd.pno;
0303 }
0304
0305
0306
0307
0308
0309
0310
0311
0312 static inline u32 scsw_fctl(union scsw *scsw)
0313 {
0314 if (scsw_is_tm(scsw))
0315 return scsw->tm.fctl;
0316 else
0317 return scsw->cmd.fctl;
0318 }
0319
0320
0321
0322
0323
0324
0325
0326
0327 static inline u32 scsw_actl(union scsw *scsw)
0328 {
0329 if (scsw_is_tm(scsw))
0330 return scsw->tm.actl;
0331 else
0332 return scsw->cmd.actl;
0333 }
0334
0335
0336
0337
0338
0339
0340
0341
0342 static inline u32 scsw_stctl(union scsw *scsw)
0343 {
0344 if (scsw_is_tm(scsw))
0345 return scsw->tm.stctl;
0346 else
0347 return scsw->cmd.stctl;
0348 }
0349
0350
0351
0352
0353
0354
0355
0356
0357 static inline u32 scsw_dstat(union scsw *scsw)
0358 {
0359 if (scsw_is_tm(scsw))
0360 return scsw->tm.dstat;
0361 else
0362 return scsw->cmd.dstat;
0363 }
0364
0365
0366
0367
0368
0369
0370
0371
0372 static inline u32 scsw_cstat(union scsw *scsw)
0373 {
0374 if (scsw_is_tm(scsw))
0375 return scsw->tm.cstat;
0376 else
0377 return scsw->cmd.cstat;
0378 }
0379
0380
0381
0382
0383
0384
0385
0386
0387 static inline int scsw_cmd_is_valid_key(union scsw *scsw)
0388 {
0389 return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
0390 }
0391
0392
0393
0394
0395
0396
0397
0398
0399 static inline int scsw_cmd_is_valid_sctl(union scsw *scsw)
0400 {
0401 return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
0402 }
0403
0404
0405
0406
0407
0408
0409
0410
0411 static inline int scsw_cmd_is_valid_eswf(union scsw *scsw)
0412 {
0413 return (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND);
0414 }
0415
0416
0417
0418
0419
0420
0421
0422
0423 static inline int scsw_cmd_is_valid_cc(union scsw *scsw)
0424 {
0425 return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC) &&
0426 (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND);
0427 }
0428
0429
0430
0431
0432
0433
0434
0435
0436 static inline int scsw_cmd_is_valid_fmt(union scsw *scsw)
0437 {
0438 return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
0439 }
0440
0441
0442
0443
0444
0445
0446
0447
0448 static inline int scsw_cmd_is_valid_pfch(union scsw *scsw)
0449 {
0450 return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
0451 }
0452
0453
0454
0455
0456
0457
0458
0459
0460 static inline int scsw_cmd_is_valid_isic(union scsw *scsw)
0461 {
0462 return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
0463 }
0464
0465
0466
0467
0468
0469
0470
0471
0472 static inline int scsw_cmd_is_valid_alcc(union scsw *scsw)
0473 {
0474 return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
0475 }
0476
0477
0478
0479
0480
0481
0482
0483
0484 static inline int scsw_cmd_is_valid_ssi(union scsw *scsw)
0485 {
0486 return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
0487 }
0488
0489
0490
0491
0492
0493
0494
0495
0496 static inline int scsw_cmd_is_valid_zcc(union scsw *scsw)
0497 {
0498 return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC) &&
0499 (scsw->cmd.stctl & SCSW_STCTL_INTER_STATUS);
0500 }
0501
0502
0503
0504
0505
0506
0507
0508
0509 static inline int scsw_cmd_is_valid_ectl(union scsw *scsw)
0510 {
0511
0512 if (!(scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND))
0513 return 0;
0514
0515
0516 if (!(scsw->cmd.stctl & SCSW_STCTL_ALERT_STATUS))
0517 return 0;
0518
0519
0520
0521
0522 if (scsw->cmd.stctl & SCSW_STCTL_INTER_STATUS)
0523 return 0;
0524
0525 return 1;
0526 }
0527
0528
0529
0530
0531
0532
0533
0534
0535 static inline int scsw_cmd_is_valid_pno(union scsw *scsw)
0536 {
0537
0538 if (!scsw->cmd.fctl)
0539 return 0;
0540
0541
0542 if (!(scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND))
0543 return 0;
0544
0545
0546
0547
0548 if (!(scsw->cmd.stctl & SCSW_STCTL_INTER_STATUS))
0549 return 1;
0550
0551
0552 if (scsw->cmd.actl & SCSW_ACTL_SUSPENDED)
0553 return 1;
0554
0555 return 0;
0556 }
0557
0558
0559
0560
0561
0562
0563
0564
0565 static inline int scsw_cmd_is_valid_fctl(union scsw *scsw)
0566 {
0567
0568 return 1;
0569 }
0570
0571
0572
0573
0574
0575
0576
0577
0578 static inline int scsw_cmd_is_valid_actl(union scsw *scsw)
0579 {
0580
0581 return 1;
0582 }
0583
0584
0585
0586
0587
0588
0589
0590
0591 static inline int scsw_cmd_is_valid_stctl(union scsw *scsw)
0592 {
0593
0594 return 1;
0595 }
0596
0597
0598
0599
0600
0601
0602
0603
0604 static inline int scsw_cmd_is_valid_dstat(union scsw *scsw)
0605 {
0606 return (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND) &&
0607 (scsw->cmd.cc != 3);
0608 }
0609
0610
0611
0612
0613
0614
0615
0616
0617 static inline int scsw_cmd_is_valid_cstat(union scsw *scsw)
0618 {
0619 return (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND) &&
0620 (scsw->cmd.cc != 3);
0621 }
0622
0623
0624
0625
0626
0627
0628
0629
0630 static inline int scsw_tm_is_valid_key(union scsw *scsw)
0631 {
0632 return (scsw->tm.fctl & SCSW_FCTL_START_FUNC);
0633 }
0634
0635
0636
0637
0638
0639
0640
0641
0642 static inline int scsw_tm_is_valid_eswf(union scsw *scsw)
0643 {
0644 return (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND);
0645 }
0646
0647
0648
0649
0650
0651
0652
0653
0654 static inline int scsw_tm_is_valid_cc(union scsw *scsw)
0655 {
0656 return (scsw->tm.fctl & SCSW_FCTL_START_FUNC) &&
0657 (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND);
0658 }
0659
0660
0661
0662
0663
0664
0665
0666
0667 static inline int scsw_tm_is_valid_fmt(union scsw *scsw)
0668 {
0669 return 1;
0670 }
0671
0672
0673
0674
0675
0676
0677
0678
0679 static inline int scsw_tm_is_valid_x(union scsw *scsw)
0680 {
0681 return 1;
0682 }
0683
0684
0685
0686
0687
0688
0689
0690
0691 static inline int scsw_tm_is_valid_q(union scsw *scsw)
0692 {
0693 return 1;
0694 }
0695
0696
0697
0698
0699
0700
0701
0702
0703 static inline int scsw_tm_is_valid_ectl(union scsw *scsw)
0704 {
0705
0706 if (!(scsw->tm.stctl & SCSW_STCTL_STATUS_PEND))
0707 return 0;
0708
0709
0710 if (!(scsw->tm.stctl & SCSW_STCTL_ALERT_STATUS))
0711 return 0;
0712
0713
0714
0715
0716 if (scsw->tm.stctl & SCSW_STCTL_INTER_STATUS)
0717 return 0;
0718
0719 return 1;
0720 }
0721
0722
0723
0724
0725
0726
0727
0728
0729 static inline int scsw_tm_is_valid_pno(union scsw *scsw)
0730 {
0731
0732 if (!scsw->tm.fctl)
0733 return 0;
0734
0735
0736 if (!(scsw->tm.stctl & SCSW_STCTL_STATUS_PEND))
0737 return 0;
0738
0739
0740
0741
0742 if (!(scsw->tm.stctl & SCSW_STCTL_INTER_STATUS))
0743 return 1;
0744
0745
0746 if (scsw->tm.actl & SCSW_ACTL_SUSPENDED)
0747 return 1;
0748
0749 return 0;
0750 }
0751
0752
0753
0754
0755
0756
0757
0758
0759 static inline int scsw_tm_is_valid_fctl(union scsw *scsw)
0760 {
0761
0762 return 1;
0763 }
0764
0765
0766
0767
0768
0769
0770
0771
0772 static inline int scsw_tm_is_valid_actl(union scsw *scsw)
0773 {
0774
0775 return 1;
0776 }
0777
0778
0779
0780
0781
0782
0783
0784
0785 static inline int scsw_tm_is_valid_stctl(union scsw *scsw)
0786 {
0787
0788 return 1;
0789 }
0790
0791
0792
0793
0794
0795
0796
0797
0798 static inline int scsw_tm_is_valid_dstat(union scsw *scsw)
0799 {
0800 return (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND) &&
0801 (scsw->tm.cc != 3);
0802 }
0803
0804
0805
0806
0807
0808
0809
0810
0811 static inline int scsw_tm_is_valid_cstat(union scsw *scsw)
0812 {
0813 return (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND) &&
0814 (scsw->tm.cc != 3);
0815 }
0816
0817
0818
0819
0820
0821
0822
0823
0824 static inline int scsw_tm_is_valid_fcxs(union scsw *scsw)
0825 {
0826 return 1;
0827 }
0828
0829
0830
0831
0832
0833
0834
0835
0836 static inline int scsw_tm_is_valid_schxs(union scsw *scsw)
0837 {
0838 return (scsw->tm.cstat & (SCHN_STAT_PROG_CHECK |
0839 SCHN_STAT_INTF_CTRL_CHK |
0840 SCHN_STAT_PROT_CHECK |
0841 SCHN_STAT_CHN_DATA_CHK));
0842 }
0843
0844
0845
0846
0847
0848
0849
0850
0851
0852 static inline int scsw_is_valid_actl(union scsw *scsw)
0853 {
0854 if (scsw_is_tm(scsw))
0855 return scsw_tm_is_valid_actl(scsw);
0856 else
0857 return scsw_cmd_is_valid_actl(scsw);
0858 }
0859
0860
0861
0862
0863
0864
0865
0866
0867
0868 static inline int scsw_is_valid_cc(union scsw *scsw)
0869 {
0870 if (scsw_is_tm(scsw))
0871 return scsw_tm_is_valid_cc(scsw);
0872 else
0873 return scsw_cmd_is_valid_cc(scsw);
0874 }
0875
0876
0877
0878
0879
0880
0881
0882
0883
0884 static inline int scsw_is_valid_cstat(union scsw *scsw)
0885 {
0886 if (scsw_is_tm(scsw))
0887 return scsw_tm_is_valid_cstat(scsw);
0888 else
0889 return scsw_cmd_is_valid_cstat(scsw);
0890 }
0891
0892
0893
0894
0895
0896
0897
0898
0899
0900 static inline int scsw_is_valid_dstat(union scsw *scsw)
0901 {
0902 if (scsw_is_tm(scsw))
0903 return scsw_tm_is_valid_dstat(scsw);
0904 else
0905 return scsw_cmd_is_valid_dstat(scsw);
0906 }
0907
0908
0909
0910
0911
0912
0913
0914
0915
0916 static inline int scsw_is_valid_ectl(union scsw *scsw)
0917 {
0918 if (scsw_is_tm(scsw))
0919 return scsw_tm_is_valid_ectl(scsw);
0920 else
0921 return scsw_cmd_is_valid_ectl(scsw);
0922 }
0923
0924
0925
0926
0927
0928
0929
0930
0931
0932 static inline int scsw_is_valid_eswf(union scsw *scsw)
0933 {
0934 if (scsw_is_tm(scsw))
0935 return scsw_tm_is_valid_eswf(scsw);
0936 else
0937 return scsw_cmd_is_valid_eswf(scsw);
0938 }
0939
0940
0941
0942
0943
0944
0945
0946
0947
0948 static inline int scsw_is_valid_fctl(union scsw *scsw)
0949 {
0950 if (scsw_is_tm(scsw))
0951 return scsw_tm_is_valid_fctl(scsw);
0952 else
0953 return scsw_cmd_is_valid_fctl(scsw);
0954 }
0955
0956
0957
0958
0959
0960
0961
0962
0963
0964 static inline int scsw_is_valid_key(union scsw *scsw)
0965 {
0966 if (scsw_is_tm(scsw))
0967 return scsw_tm_is_valid_key(scsw);
0968 else
0969 return scsw_cmd_is_valid_key(scsw);
0970 }
0971
0972
0973
0974
0975
0976
0977
0978
0979
0980 static inline int scsw_is_valid_pno(union scsw *scsw)
0981 {
0982 if (scsw_is_tm(scsw))
0983 return scsw_tm_is_valid_pno(scsw);
0984 else
0985 return scsw_cmd_is_valid_pno(scsw);
0986 }
0987
0988
0989
0990
0991
0992
0993
0994
0995
0996 static inline int scsw_is_valid_stctl(union scsw *scsw)
0997 {
0998 if (scsw_is_tm(scsw))
0999 return scsw_tm_is_valid_stctl(scsw);
1000 else
1001 return scsw_cmd_is_valid_stctl(scsw);
1002 }
1003
1004
1005
1006
1007
1008
1009
1010
1011 static inline int scsw_cmd_is_solicited(union scsw *scsw)
1012 {
1013 return (scsw->cmd.cc != 0) || (scsw->cmd.stctl !=
1014 (SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS));
1015 }
1016
1017
1018
1019
1020
1021
1022
1023
1024 static inline int scsw_tm_is_solicited(union scsw *scsw)
1025 {
1026 return (scsw->tm.cc != 0) || (scsw->tm.stctl !=
1027 (SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS));
1028 }
1029
1030
1031
1032
1033
1034
1035
1036
1037 static inline int scsw_is_solicited(union scsw *scsw)
1038 {
1039 if (scsw_is_tm(scsw))
1040 return scsw_tm_is_solicited(scsw);
1041 else
1042 return scsw_cmd_is_solicited(scsw);
1043 }
1044
1045 #endif