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