Linux-libre 5.4.48-gnu
[librecmc/linux-libre.git] / drivers / s390 / char / tape_3590.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  *    tape device discipline for 3590 tapes.
4  *
5  *    Copyright IBM Corp. 2001, 2006
6  *    Author(s): Stefan Bader <shbader@de.ibm.com>
7  *               Michael Holzheu <holzheu@de.ibm.com>
8  *               Martin Schwidefsky <schwidefsky@de.ibm.com>
9  */
10
11 #ifndef _TAPE_3590_H
12 #define _TAPE_3590_H
13
14 #define MEDIUM_SENSE    0xc2
15 #define READ_PREVIOUS   0x0a
16 #define MODE_SENSE      0xcf
17 #define PERFORM_SS_FUNC 0x77
18 #define READ_SS_DATA    0x3e
19
20 #define PREP_RD_SS_DATA 0x18
21 #define RD_ATTMSG       0x3
22
23 #define SENSE_BRA_PER  0
24 #define SENSE_BRA_CONT 1
25 #define SENSE_BRA_RE   2
26 #define SENSE_BRA_DRE  3
27
28 #define SENSE_FMT_LIBRARY       0x23
29 #define SENSE_FMT_UNSOLICITED   0x40
30 #define SENSE_FMT_COMMAND_REJ   0x41
31 #define SENSE_FMT_COMMAND_EXEC0 0x50
32 #define SENSE_FMT_COMMAND_EXEC1 0x51
33 #define SENSE_FMT_EVENT0        0x60
34 #define SENSE_FMT_EVENT1        0x61
35 #define SENSE_FMT_MIM           0x70
36 #define SENSE_FMT_SIM           0x71
37
38 #define MSENSE_UNASSOCIATED      0x00
39 #define MSENSE_ASSOCIATED_MOUNT  0x01
40 #define MSENSE_ASSOCIATED_UMOUNT 0x02
41 #define MSENSE_CRYPT_MASK        0x00000010
42
43 #define TAPE_3590_MAX_MSG        0xb0
44
45 /* Datatypes */
46
47 struct tape_3590_disc_data {
48         struct tape390_crypt_info crypt_info;
49         int read_back_op;
50 };
51
52 #define TAPE_3590_CRYPT_INFO(device) \
53         ((struct tape_3590_disc_data*)(device->discdata))->crypt_info
54 #define TAPE_3590_READ_BACK_OP(device) \
55         ((struct tape_3590_disc_data*)(device->discdata))->read_back_op
56
57 struct tape_3590_sense {
58
59         unsigned int command_rej:1;
60         unsigned int interv_req:1;
61         unsigned int bus_out_check:1;
62         unsigned int eq_check:1;
63         unsigned int data_check:1;
64         unsigned int overrun:1;
65         unsigned int def_unit_check:1;
66         unsigned int assgnd_elsew:1;
67
68         unsigned int locate_fail:1;
69         unsigned int inst_online:1;
70         unsigned int reserved:1;
71         unsigned int blk_seq_err:1;
72         unsigned int begin_part:1;
73         unsigned int wr_mode:1;
74         unsigned int wr_prot:1;
75         unsigned int not_cap:1;
76
77         unsigned int bra:2;
78         unsigned int lc:3;
79         unsigned int vlf_active:1;
80         unsigned int stm:1;
81         unsigned int med_pos:1;
82
83         unsigned int rac:8;
84
85         unsigned int rc_rqc:16;
86
87         unsigned int mc:8;
88
89         unsigned int sense_fmt:8;
90
91         union {
92                 struct {
93                         unsigned int emc:4;
94                         unsigned int smc:4;
95                         unsigned int sev:2;
96                         unsigned int reserved:6;
97                         unsigned int md:8;
98                         unsigned int refcode:8;
99                         unsigned int mid:16;
100                         unsigned int mp:16;
101                         unsigned char volid[6];
102                         unsigned int fid:8;
103                 } f70;
104                 struct {
105                         unsigned int emc:4;
106                         unsigned int smc:4;
107                         unsigned int sev:2;
108                         unsigned int reserved1:5;
109                         unsigned int mdf:1;
110                         unsigned char md[3];
111                         unsigned int simid:8;
112                         unsigned int uid:16;
113                         unsigned int refcode1:16;
114                         unsigned int refcode2:16;
115                         unsigned int refcode3:16;
116                         unsigned int reserved2:8;
117                 } f71;
118                 unsigned char data[14];
119         } fmt;
120         unsigned char pad[10];
121
122 } __attribute__ ((packed));
123
124 struct tape_3590_med_sense {
125         unsigned int macst:4;
126         unsigned int masst:4;
127         char pad1[7];
128         unsigned int flags;
129         char pad2[116];
130 } __attribute__ ((packed));
131
132 struct tape_3590_rdc_data {
133         char data[64];
134 } __attribute__ ((packed));
135
136 /* Datastructures for 3592 encryption support */
137
138 struct tape3592_kekl {
139         __u8 flags;
140         char label[64];
141 } __attribute__ ((packed));
142
143 struct tape3592_kekl_pair {
144         __u8 count;
145         struct tape3592_kekl kekl[2];
146 } __attribute__ ((packed));
147
148 struct tape3592_kekl_query_data {
149         __u16 len;
150         __u8  fmt;
151         __u8  mc;
152         __u32 id;
153         __u8  flags;
154         struct tape3592_kekl_pair kekls;
155         char reserved[116];
156 } __attribute__ ((packed));
157
158 struct tape3592_kekl_query_order {
159         __u8 code;
160         __u8 flags;
161         char reserved1[2];
162         __u8 max_count;
163         char reserved2[35];
164 } __attribute__ ((packed));
165
166 struct tape3592_kekl_set_order {
167         __u8 code;
168         __u8 flags;
169         char reserved1[2];
170         __u8 op;
171         struct tape3592_kekl_pair kekls;
172         char reserved2[120];
173 } __attribute__ ((packed));
174
175 #endif /* _TAPE_3590_H */