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