1193323Sed/* SPDX-License-Identifier: GPL-2.0 */
2193323Sed/*
3193323Sed *    tape device discipline for 3590 tapes.
4193323Sed *
5193323Sed *    Copyright IBM Corp. 2001, 2006
6193323Sed *    Author(s): Stefan Bader <shbader@de.ibm.com>
7193323Sed *		 Michael Holzheu <holzheu@de.ibm.com>
8193323Sed *		 Martin Schwidefsky <schwidefsky@de.ibm.com>
9193323Sed */
10193323Sed
11193323Sed#ifndef _TAPE_3590_H
12193323Sed#define _TAPE_3590_H
13193323Sed
14249423Sdim#define MEDIUM_SENSE	0xc2
15193323Sed#define READ_PREVIOUS	0x0a
16249423Sdim#define MODE_SENSE	0xcf
17249423Sdim#define PERFORM_SS_FUNC 0x77
18193323Sed#define READ_SS_DATA	0x3e
19193323Sed
20193323Sed#define PREP_RD_SS_DATA 0x18
21193323Sed#define RD_ATTMSG	0x3
22249423Sdim
23249423Sdim#define SENSE_BRA_PER  0
24193323Sed#define SENSE_BRA_CONT 1
25193323Sed#define SENSE_BRA_RE   2
26193323Sed#define SENSE_BRA_DRE  3
27249423Sdim
28249423Sdim#define SENSE_FMT_LIBRARY	0x23
29193323Sed#define SENSE_FMT_UNSOLICITED	0x40
30193323Sed#define SENSE_FMT_COMMAND_REJ	0x41
31193323Sed#define SENSE_FMT_COMMAND_EXEC0 0x50
32193323Sed#define SENSE_FMT_COMMAND_EXEC1 0x51
33193323Sed#define SENSE_FMT_EVENT0	0x60
34199989Srdivacky#define SENSE_FMT_EVENT1	0x61
35200581Srdivacky#define SENSE_FMT_MIM		0x70
36200581Srdivacky#define SENSE_FMT_SIM		0x71
37199989Srdivacky
38193323Sed#define MSENSE_UNASSOCIATED	 0x00
39193323Sed#define MSENSE_ASSOCIATED_MOUNT	 0x01
40193323Sed#define MSENSE_ASSOCIATED_UMOUNT 0x02
41193323Sed#define MSENSE_CRYPT_MASK	 0x00000010
42193323Sed
43193323Sed#define TAPE_3590_MAX_MSG	 0xb0
44193323Sed
45193323Sed/* Datatypes */
46193323Sed
47198090Srdivackystruct tape_3590_disc_data {
48193323Sed	struct tape390_crypt_info crypt_info;
49193323Sed	int read_back_op;
50200581Srdivacky};
51200581Srdivacky
52243830Sdim#define TAPE_3590_CRYPT_INFO(device) \
53200581Srdivacky	((struct tape_3590_disc_data*)(device->discdata))->crypt_info
54200581Srdivacky#define TAPE_3590_READ_BACK_OP(device) \
55193323Sed	((struct tape_3590_disc_data*)(device->discdata))->read_back_op
56199989Srdivacky
57199989Srdivackystruct tape_3590_sense {
58193323Sed
59193323Sed	unsigned int command_rej:1;
60193323Sed	unsigned int interv_req:1;
61193323Sed	unsigned int bus_out_check:1;
62193323Sed	unsigned int eq_check:1;
63193323Sed	unsigned int data_check:1;
64193323Sed	unsigned int overrun:1;
65193323Sed	unsigned int def_unit_check:1;
66193323Sed	unsigned int assgnd_elsew:1;
67193323Sed
68193323Sed	unsigned int locate_fail:1;
69193323Sed	unsigned int inst_online:1;
70193323Sed	unsigned int reserved:1;
71193323Sed	unsigned int blk_seq_err:1;
72193323Sed	unsigned int begin_part:1;
73193323Sed	unsigned int wr_mode:1;
74193323Sed	unsigned int wr_prot:1;
75243830Sdim	unsigned int not_cap:1;
76193323Sed
77193323Sed	unsigned int bra:2;
78193323Sed	unsigned int lc:3;
79193323Sed	unsigned int vlf_active:1;
80193323Sed	unsigned int stm:1;
81200581Srdivacky	unsigned int med_pos:1;
82193323Sed
83193323Sed	unsigned int rac:8;
84193323Sed
85193323Sed	unsigned int rc_rqc:16;
86200581Srdivacky
87193323Sed	unsigned int mc:8;
88193323Sed
89193323Sed	unsigned int sense_fmt:8;
90221345Sdim
91221345Sdim	union {
92193323Sed		struct {
93198090Srdivacky			unsigned int emc:4;
94218893Sdim			unsigned int smc:4;
95193323Sed			unsigned int sev:2;
96193323Sed			unsigned int reserved:6;
97193323Sed			unsigned int md:8;
98193323Sed			unsigned int refcode:8;
99193323Sed			unsigned int mid:16;
100193323Sed			unsigned int mp:16;
101200581Srdivacky			unsigned char volid[6];
102199989Srdivacky			unsigned int fid:8;
103199989Srdivacky		} f70;
104199989Srdivacky		struct {
105199989Srdivacky			unsigned int emc:4;
106199989Srdivacky			unsigned int smc:4;
107199989Srdivacky			unsigned int sev:2;
108199989Srdivacky			unsigned int reserved1:5;
109199989Srdivacky			unsigned int mdf:1;
110199989Srdivacky			unsigned char md[3];
111199989Srdivacky			unsigned int simid:8;
112193323Sed			unsigned int uid:16;
113193323Sed			unsigned int refcode1:16;
114193323Sed			unsigned int refcode2:16;
115193323Sed			unsigned int refcode3:16;
116193323Sed			unsigned int reserved2:8;
117193323Sed		} f71;
118193323Sed		unsigned char data[14];
119193323Sed	} fmt;
120193323Sed	unsigned char pad[10];
121193323Sed
122193323Sed} __attribute__ ((packed));
123193323Sed
124193323Sedstruct tape_3590_med_sense {
125193323Sed	unsigned int macst:4;
126193323Sed	unsigned int masst:4;
127193323Sed	char pad1[7];
128193323Sed	unsigned int flags;
129193323Sed	char pad2[116];
130193323Sed} __attribute__ ((packed));
131193323Sed
132193323Sedstruct tape_3590_rdc_data {
133193323Sed	char data[64];
134193323Sed} __attribute__ ((packed));
135193323Sed
136193323Sed/* Datastructures for 3592 encryption support */
137199989Srdivacky
138200581Srdivackystruct tape3592_kekl {
139193323Sed	__u8 flags;
140193323Sed	char label[64];
141193323Sed} __attribute__ ((packed));
142193323Sed
143193323Sedstruct tape3592_kekl_pair {
144193323Sed	__u8 count;
145193323Sed	struct tape3592_kekl kekl[2];
146193323Sed} __attribute__ ((packed));
147193323Sed
148243830Sdimstruct tape3592_kekl_query_data {
149198090Srdivacky	__u16 len;
150193323Sed	__u8  fmt;
151198090Srdivacky	__u8  mc;
152198090Srdivacky	__u32 id;
153193323Sed	__u8  flags;
154193323Sed	struct tape3592_kekl_pair kekls;
155193323Sed	char reserved[116];
156193323Sed} __attribute__ ((packed));
157193323Sed
158193323Sedstruct tape3592_kekl_query_order {
159193323Sed	__u8 code;
160193323Sed	__u8 flags;
161193323Sed	char reserved1[2];
162193323Sed	__u8 max_count;
163193323Sed	char reserved2[35];
164193323Sed} __attribute__ ((packed));
165193323Sed
166193323Sedstruct tape3592_kekl_set_order {
167193323Sed	__u8 code;
168198090Srdivacky	__u8 flags;
169198090Srdivacky	char reserved1[2];
170193323Sed	__u8 op;
171193323Sed	struct tape3592_kekl_pair kekls;
172193323Sed	char reserved2[120];
173193323Sed} __attribute__ ((packed));
174193323Sed
175193323Sed#endif /* _TAPE_3590_H */
176193323Sed