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