1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com> 4*4882a593Smuzhiyun * Horst Hummel <Horst.Hummel@de.ibm.com> 5*4882a593Smuzhiyun * Bugreports.to..: <Linux390@de.ibm.com> 6*4882a593Smuzhiyun * Copyright IBM Corp. 1999, 2000 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifndef DASD_ECKD_H 11*4882a593Smuzhiyun #define DASD_ECKD_H 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun /***************************************************************************** 14*4882a593Smuzhiyun * SECTION: CCW Definitions 15*4882a593Smuzhiyun ****************************************************************************/ 16*4882a593Smuzhiyun #define DASD_ECKD_CCW_WRITE 0x05 17*4882a593Smuzhiyun #define DASD_ECKD_CCW_READ 0x06 18*4882a593Smuzhiyun #define DASD_ECKD_CCW_WRITE_HOME_ADDRESS 0x09 19*4882a593Smuzhiyun #define DASD_ECKD_CCW_READ_HOME_ADDRESS 0x0a 20*4882a593Smuzhiyun #define DASD_ECKD_CCW_WRITE_KD 0x0d 21*4882a593Smuzhiyun #define DASD_ECKD_CCW_READ_KD 0x0e 22*4882a593Smuzhiyun #define DASD_ECKD_CCW_ERASE 0x11 23*4882a593Smuzhiyun #define DASD_ECKD_CCW_READ_COUNT 0x12 24*4882a593Smuzhiyun #define DASD_ECKD_CCW_SLCK 0x14 25*4882a593Smuzhiyun #define DASD_ECKD_CCW_WRITE_RECORD_ZERO 0x15 26*4882a593Smuzhiyun #define DASD_ECKD_CCW_READ_RECORD_ZERO 0x16 27*4882a593Smuzhiyun #define DASD_ECKD_CCW_WRITE_CKD 0x1d 28*4882a593Smuzhiyun #define DASD_ECKD_CCW_READ_CKD 0x1e 29*4882a593Smuzhiyun #define DASD_ECKD_CCW_PSF 0x27 30*4882a593Smuzhiyun #define DASD_ECKD_CCW_SNID 0x34 31*4882a593Smuzhiyun #define DASD_ECKD_CCW_RSSD 0x3e 32*4882a593Smuzhiyun #define DASD_ECKD_CCW_LOCATE_RECORD 0x47 33*4882a593Smuzhiyun #define DASD_ECKD_CCW_LOCATE_RECORD_EXT 0x4b 34*4882a593Smuzhiyun #define DASD_ECKD_CCW_SNSS 0x54 35*4882a593Smuzhiyun #define DASD_ECKD_CCW_DEFINE_EXTENT 0x63 36*4882a593Smuzhiyun #define DASD_ECKD_CCW_WRITE_MT 0x85 37*4882a593Smuzhiyun #define DASD_ECKD_CCW_READ_MT 0x86 38*4882a593Smuzhiyun #define DASD_ECKD_CCW_WRITE_KD_MT 0x8d 39*4882a593Smuzhiyun #define DASD_ECKD_CCW_READ_KD_MT 0x8e 40*4882a593Smuzhiyun #define DASD_ECKD_CCW_READ_COUNT_MT 0x92 41*4882a593Smuzhiyun #define DASD_ECKD_CCW_RELEASE 0x94 42*4882a593Smuzhiyun #define DASD_ECKD_CCW_WRITE_FULL_TRACK 0x95 43*4882a593Smuzhiyun #define DASD_ECKD_CCW_READ_CKD_MT 0x9e 44*4882a593Smuzhiyun #define DASD_ECKD_CCW_WRITE_CKD_MT 0x9d 45*4882a593Smuzhiyun #define DASD_ECKD_CCW_WRITE_TRACK_DATA 0xA5 46*4882a593Smuzhiyun #define DASD_ECKD_CCW_READ_TRACK_DATA 0xA6 47*4882a593Smuzhiyun #define DASD_ECKD_CCW_RESERVE 0xB4 48*4882a593Smuzhiyun #define DASD_ECKD_CCW_READ_TRACK 0xDE 49*4882a593Smuzhiyun #define DASD_ECKD_CCW_PFX 0xE7 50*4882a593Smuzhiyun #define DASD_ECKD_CCW_PFX_READ 0xEA 51*4882a593Smuzhiyun #define DASD_ECKD_CCW_RSCK 0xF9 52*4882a593Smuzhiyun #define DASD_ECKD_CCW_RCD 0xFA 53*4882a593Smuzhiyun #define DASD_ECKD_CCW_DSO 0xF7 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun /* Define Subssystem Function / Orders */ 56*4882a593Smuzhiyun #define DSO_ORDER_RAS 0x81 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun /* 59*4882a593Smuzhiyun * Perform Subsystem Function / Orders 60*4882a593Smuzhiyun */ 61*4882a593Smuzhiyun #define PSF_ORDER_PRSSD 0x18 62*4882a593Smuzhiyun #define PSF_ORDER_CUIR_RESPONSE 0x1A 63*4882a593Smuzhiyun #define PSF_ORDER_SSC 0x1D 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun /* 66*4882a593Smuzhiyun * Perform Subsystem Function / Sub-Orders 67*4882a593Smuzhiyun */ 68*4882a593Smuzhiyun #define PSF_SUBORDER_QHA 0x1C /* Query Host Access */ 69*4882a593Smuzhiyun #define PSF_SUBORDER_VSQ 0x52 /* Volume Storage Query */ 70*4882a593Smuzhiyun #define PSF_SUBORDER_LCQ 0x53 /* Logical Configuration Query */ 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun /* 73*4882a593Smuzhiyun * CUIR response condition codes 74*4882a593Smuzhiyun */ 75*4882a593Smuzhiyun #define PSF_CUIR_INVALID 0x00 76*4882a593Smuzhiyun #define PSF_CUIR_COMPLETED 0x01 77*4882a593Smuzhiyun #define PSF_CUIR_NOT_SUPPORTED 0x02 78*4882a593Smuzhiyun #define PSF_CUIR_ERROR_IN_REQ 0x03 79*4882a593Smuzhiyun #define PSF_CUIR_DENIED 0x04 80*4882a593Smuzhiyun #define PSF_CUIR_LAST_PATH 0x05 81*4882a593Smuzhiyun #define PSF_CUIR_DEVICE_ONLINE 0x06 82*4882a593Smuzhiyun #define PSF_CUIR_VARY_FAILURE 0x07 83*4882a593Smuzhiyun #define PSF_CUIR_SOFTWARE_FAILURE 0x08 84*4882a593Smuzhiyun #define PSF_CUIR_NOT_RECOGNIZED 0x09 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun /* 87*4882a593Smuzhiyun * CUIR codes 88*4882a593Smuzhiyun */ 89*4882a593Smuzhiyun #define CUIR_QUIESCE 0x01 90*4882a593Smuzhiyun #define CUIR_RESUME 0x02 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun /* 93*4882a593Smuzhiyun * Out-of-space (OOS) Codes 94*4882a593Smuzhiyun */ 95*4882a593Smuzhiyun #define REPO_WARN 0x01 96*4882a593Smuzhiyun #define REPO_EXHAUST 0x02 97*4882a593Smuzhiyun #define POOL_WARN 0x03 98*4882a593Smuzhiyun #define POOL_EXHAUST 0x04 99*4882a593Smuzhiyun #define REPO_RELIEVE 0x05 100*4882a593Smuzhiyun #define POOL_RELIEVE 0x06 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun /* 103*4882a593Smuzhiyun * attention message definitions 104*4882a593Smuzhiyun */ 105*4882a593Smuzhiyun #define ATTENTION_LENGTH_CUIR 0x0e 106*4882a593Smuzhiyun #define ATTENTION_FORMAT_CUIR 0x01 107*4882a593Smuzhiyun #define ATTENTION_LENGTH_OOS 0x10 108*4882a593Smuzhiyun #define ATTENTION_FORMAT_OOS 0x06 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun #define DASD_ECKD_PG_GROUPED 0x10 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun /* 113*4882a593Smuzhiyun * Size that is reportet for large volumes in the old 16-bit no_cyl field 114*4882a593Smuzhiyun */ 115*4882a593Smuzhiyun #define LV_COMPAT_CYL 0xFFFE 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun #define FCX_MAX_DATA_FACTOR 65536 119*4882a593Smuzhiyun #define DASD_ECKD_RCD_DATA_SIZE 256 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun #define DASD_ECKD_PATH_THRHLD 256 122*4882a593Smuzhiyun #define DASD_ECKD_PATH_INTERVAL 300 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun /* 125*4882a593Smuzhiyun * Maximum number of blocks to be chained 126*4882a593Smuzhiyun */ 127*4882a593Smuzhiyun #define DASD_ECKD_MAX_BLOCKS 190 128*4882a593Smuzhiyun #define DASD_ECKD_MAX_BLOCKS_RAW 256 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun /***************************************************************************** 131*4882a593Smuzhiyun * SECTION: Type Definitions 132*4882a593Smuzhiyun ****************************************************************************/ 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun struct eckd_count { 135*4882a593Smuzhiyun __u16 cyl; 136*4882a593Smuzhiyun __u16 head; 137*4882a593Smuzhiyun __u8 record; 138*4882a593Smuzhiyun __u8 kl; 139*4882a593Smuzhiyun __u16 dl; 140*4882a593Smuzhiyun } __attribute__ ((packed)); 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun struct ch_t { 143*4882a593Smuzhiyun __u16 cyl; 144*4882a593Smuzhiyun __u16 head; 145*4882a593Smuzhiyun } __attribute__ ((packed)); 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun struct chr_t { 148*4882a593Smuzhiyun __u16 cyl; 149*4882a593Smuzhiyun __u16 head; 150*4882a593Smuzhiyun __u8 record; 151*4882a593Smuzhiyun } __attribute__ ((packed)); 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun struct DE_eckd_data { 154*4882a593Smuzhiyun struct { 155*4882a593Smuzhiyun unsigned char perm:2; /* Permissions on this extent */ 156*4882a593Smuzhiyun unsigned char reserved:1; 157*4882a593Smuzhiyun unsigned char seek:2; /* Seek control */ 158*4882a593Smuzhiyun unsigned char auth:2; /* Access authorization */ 159*4882a593Smuzhiyun unsigned char pci:1; /* PCI Fetch mode */ 160*4882a593Smuzhiyun } __attribute__ ((packed)) mask; 161*4882a593Smuzhiyun struct { 162*4882a593Smuzhiyun unsigned char mode:2; /* Architecture mode */ 163*4882a593Smuzhiyun unsigned char ckd:1; /* CKD Conversion */ 164*4882a593Smuzhiyun unsigned char operation:3; /* Operation mode */ 165*4882a593Smuzhiyun unsigned char cfw:1; /* Cache fast write */ 166*4882a593Smuzhiyun unsigned char dfw:1; /* DASD fast write */ 167*4882a593Smuzhiyun } __attribute__ ((packed)) attributes; 168*4882a593Smuzhiyun __u16 blk_size; /* Blocksize */ 169*4882a593Smuzhiyun __u16 fast_write_id; 170*4882a593Smuzhiyun __u8 ga_additional; /* Global Attributes Additional */ 171*4882a593Smuzhiyun __u8 ga_extended; /* Global Attributes Extended */ 172*4882a593Smuzhiyun struct ch_t beg_ext; 173*4882a593Smuzhiyun struct ch_t end_ext; 174*4882a593Smuzhiyun unsigned long ep_sys_time; /* Ext Parameter - System Time Stamp */ 175*4882a593Smuzhiyun __u8 ep_format; /* Extended Parameter format byte */ 176*4882a593Smuzhiyun __u8 ep_prio; /* Extended Parameter priority I/O byte */ 177*4882a593Smuzhiyun __u8 ep_reserved1; /* Extended Parameter Reserved */ 178*4882a593Smuzhiyun __u8 ep_rec_per_track; /* Number of records on a track */ 179*4882a593Smuzhiyun __u8 ep_reserved[4]; /* Extended Parameter Reserved */ 180*4882a593Smuzhiyun } __attribute__ ((packed)); 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun struct LO_eckd_data { 183*4882a593Smuzhiyun struct { 184*4882a593Smuzhiyun unsigned char orientation:2; 185*4882a593Smuzhiyun unsigned char operation:6; 186*4882a593Smuzhiyun } __attribute__ ((packed)) operation; 187*4882a593Smuzhiyun struct { 188*4882a593Smuzhiyun unsigned char last_bytes_used:1; 189*4882a593Smuzhiyun unsigned char reserved:6; 190*4882a593Smuzhiyun unsigned char read_count_suffix:1; 191*4882a593Smuzhiyun } __attribute__ ((packed)) auxiliary; 192*4882a593Smuzhiyun __u8 unused; 193*4882a593Smuzhiyun __u8 count; 194*4882a593Smuzhiyun struct ch_t seek_addr; 195*4882a593Smuzhiyun struct chr_t search_arg; 196*4882a593Smuzhiyun __u8 sector; 197*4882a593Smuzhiyun __u16 length; 198*4882a593Smuzhiyun } __attribute__ ((packed)); 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun struct LRE_eckd_data { 201*4882a593Smuzhiyun struct { 202*4882a593Smuzhiyun unsigned char orientation:2; 203*4882a593Smuzhiyun unsigned char operation:6; 204*4882a593Smuzhiyun } __attribute__ ((packed)) operation; 205*4882a593Smuzhiyun struct { 206*4882a593Smuzhiyun unsigned char length_valid:1; 207*4882a593Smuzhiyun unsigned char length_scope:1; 208*4882a593Smuzhiyun unsigned char imbedded_ccw_valid:1; 209*4882a593Smuzhiyun unsigned char check_bytes:2; 210*4882a593Smuzhiyun unsigned char imbedded_count_valid:1; 211*4882a593Smuzhiyun unsigned char reserved:1; 212*4882a593Smuzhiyun unsigned char read_count_suffix:1; 213*4882a593Smuzhiyun } __attribute__ ((packed)) auxiliary; 214*4882a593Smuzhiyun __u8 imbedded_ccw; 215*4882a593Smuzhiyun __u8 count; 216*4882a593Smuzhiyun struct ch_t seek_addr; 217*4882a593Smuzhiyun struct chr_t search_arg; 218*4882a593Smuzhiyun __u8 sector; 219*4882a593Smuzhiyun __u16 length; 220*4882a593Smuzhiyun __u8 imbedded_count; 221*4882a593Smuzhiyun __u8 extended_operation; 222*4882a593Smuzhiyun __u16 extended_parameter_length; 223*4882a593Smuzhiyun __u8 extended_parameter[]; 224*4882a593Smuzhiyun } __attribute__ ((packed)); 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun /* Prefix data for format 0x00 and 0x01 */ 227*4882a593Smuzhiyun struct PFX_eckd_data { 228*4882a593Smuzhiyun unsigned char format; 229*4882a593Smuzhiyun struct { 230*4882a593Smuzhiyun unsigned char define_extent:1; 231*4882a593Smuzhiyun unsigned char time_stamp:1; 232*4882a593Smuzhiyun unsigned char verify_base:1; 233*4882a593Smuzhiyun unsigned char hyper_pav:1; 234*4882a593Smuzhiyun unsigned char reserved:4; 235*4882a593Smuzhiyun } __attribute__ ((packed)) validity; 236*4882a593Smuzhiyun __u8 base_address; 237*4882a593Smuzhiyun __u8 aux; 238*4882a593Smuzhiyun __u8 base_lss; 239*4882a593Smuzhiyun __u8 reserved[7]; 240*4882a593Smuzhiyun struct DE_eckd_data define_extent; 241*4882a593Smuzhiyun struct LRE_eckd_data locate_record; 242*4882a593Smuzhiyun } __attribute__ ((packed)); 243*4882a593Smuzhiyun 244*4882a593Smuzhiyun struct dasd_eckd_characteristics { 245*4882a593Smuzhiyun __u16 cu_type; 246*4882a593Smuzhiyun struct { 247*4882a593Smuzhiyun unsigned char support:2; 248*4882a593Smuzhiyun unsigned char async:1; 249*4882a593Smuzhiyun unsigned char reserved:1; 250*4882a593Smuzhiyun unsigned char cache_info:1; 251*4882a593Smuzhiyun unsigned char model:3; 252*4882a593Smuzhiyun } __attribute__ ((packed)) cu_model; 253*4882a593Smuzhiyun __u16 dev_type; 254*4882a593Smuzhiyun __u8 dev_model; 255*4882a593Smuzhiyun struct { 256*4882a593Smuzhiyun unsigned char mult_burst:1; 257*4882a593Smuzhiyun unsigned char RT_in_LR:1; 258*4882a593Smuzhiyun unsigned char reserved1:1; 259*4882a593Smuzhiyun unsigned char RD_IN_LR:1; 260*4882a593Smuzhiyun unsigned char reserved2:4; 261*4882a593Smuzhiyun unsigned char reserved3:8; 262*4882a593Smuzhiyun unsigned char defect_wr:1; 263*4882a593Smuzhiyun unsigned char XRC_supported:1; 264*4882a593Smuzhiyun unsigned char reserved4:1; 265*4882a593Smuzhiyun unsigned char striping:1; 266*4882a593Smuzhiyun unsigned char reserved5:4; 267*4882a593Smuzhiyun unsigned char cfw:1; 268*4882a593Smuzhiyun unsigned char reserved6:2; 269*4882a593Smuzhiyun unsigned char cache:1; 270*4882a593Smuzhiyun unsigned char dual_copy:1; 271*4882a593Smuzhiyun unsigned char dfw:1; 272*4882a593Smuzhiyun unsigned char reset_alleg:1; 273*4882a593Smuzhiyun unsigned char sense_down:1; 274*4882a593Smuzhiyun } __attribute__ ((packed)) facilities; 275*4882a593Smuzhiyun __u8 dev_class; 276*4882a593Smuzhiyun __u8 unit_type; 277*4882a593Smuzhiyun __u16 no_cyl; 278*4882a593Smuzhiyun __u16 trk_per_cyl; 279*4882a593Smuzhiyun __u8 sec_per_trk; 280*4882a593Smuzhiyun __u8 byte_per_track[3]; 281*4882a593Smuzhiyun __u16 home_bytes; 282*4882a593Smuzhiyun __u8 formula; 283*4882a593Smuzhiyun union { 284*4882a593Smuzhiyun struct { 285*4882a593Smuzhiyun __u8 f1; 286*4882a593Smuzhiyun __u16 f2; 287*4882a593Smuzhiyun __u16 f3; 288*4882a593Smuzhiyun } __attribute__ ((packed)) f_0x01; 289*4882a593Smuzhiyun struct { 290*4882a593Smuzhiyun __u8 f1; 291*4882a593Smuzhiyun __u8 f2; 292*4882a593Smuzhiyun __u8 f3; 293*4882a593Smuzhiyun __u8 f4; 294*4882a593Smuzhiyun __u8 f5; 295*4882a593Smuzhiyun } __attribute__ ((packed)) f_0x02; 296*4882a593Smuzhiyun } __attribute__ ((packed)) factors; 297*4882a593Smuzhiyun __u16 first_alt_trk; 298*4882a593Smuzhiyun __u16 no_alt_trk; 299*4882a593Smuzhiyun __u16 first_dia_trk; 300*4882a593Smuzhiyun __u16 no_dia_trk; 301*4882a593Smuzhiyun __u16 first_sup_trk; 302*4882a593Smuzhiyun __u16 no_sup_trk; 303*4882a593Smuzhiyun __u8 MDR_ID; 304*4882a593Smuzhiyun __u8 OBR_ID; 305*4882a593Smuzhiyun __u8 director; 306*4882a593Smuzhiyun __u8 rd_trk_set; 307*4882a593Smuzhiyun __u16 max_rec_zero; 308*4882a593Smuzhiyun __u8 reserved1; 309*4882a593Smuzhiyun __u8 RWANY_in_LR; 310*4882a593Smuzhiyun __u8 factor6; 311*4882a593Smuzhiyun __u8 factor7; 312*4882a593Smuzhiyun __u8 factor8; 313*4882a593Smuzhiyun __u8 reserved2[3]; 314*4882a593Smuzhiyun __u8 reserved3[6]; 315*4882a593Smuzhiyun __u32 long_no_cyl; 316*4882a593Smuzhiyun } __attribute__ ((packed)); 317*4882a593Smuzhiyun 318*4882a593Smuzhiyun /* elements of the configuration data */ 319*4882a593Smuzhiyun struct dasd_ned { 320*4882a593Smuzhiyun struct { 321*4882a593Smuzhiyun __u8 identifier:2; 322*4882a593Smuzhiyun __u8 token_id:1; 323*4882a593Smuzhiyun __u8 sno_valid:1; 324*4882a593Smuzhiyun __u8 subst_sno:1; 325*4882a593Smuzhiyun __u8 recNED:1; 326*4882a593Smuzhiyun __u8 emuNED:1; 327*4882a593Smuzhiyun __u8 reserved:1; 328*4882a593Smuzhiyun } __attribute__ ((packed)) flags; 329*4882a593Smuzhiyun __u8 descriptor; 330*4882a593Smuzhiyun __u8 dev_class; 331*4882a593Smuzhiyun __u8 reserved; 332*4882a593Smuzhiyun __u8 dev_type[6]; 333*4882a593Smuzhiyun __u8 dev_model[3]; 334*4882a593Smuzhiyun __u8 HDA_manufacturer[3]; 335*4882a593Smuzhiyun __u8 HDA_location[2]; 336*4882a593Smuzhiyun __u8 HDA_seqno[12]; 337*4882a593Smuzhiyun __u8 ID; 338*4882a593Smuzhiyun __u8 unit_addr; 339*4882a593Smuzhiyun } __attribute__ ((packed)); 340*4882a593Smuzhiyun 341*4882a593Smuzhiyun struct dasd_sneq { 342*4882a593Smuzhiyun struct { 343*4882a593Smuzhiyun __u8 identifier:2; 344*4882a593Smuzhiyun __u8 reserved:6; 345*4882a593Smuzhiyun } __attribute__ ((packed)) flags; 346*4882a593Smuzhiyun __u8 res1; 347*4882a593Smuzhiyun __u16 format; 348*4882a593Smuzhiyun __u8 res2[4]; /* byte 4- 7 */ 349*4882a593Smuzhiyun __u8 sua_flags; /* byte 8 */ 350*4882a593Smuzhiyun __u8 base_unit_addr; /* byte 9 */ 351*4882a593Smuzhiyun __u8 res3[22]; /* byte 10-31 */ 352*4882a593Smuzhiyun } __attribute__ ((packed)); 353*4882a593Smuzhiyun 354*4882a593Smuzhiyun struct vd_sneq { 355*4882a593Smuzhiyun struct { 356*4882a593Smuzhiyun __u8 identifier:2; 357*4882a593Smuzhiyun __u8 reserved:6; 358*4882a593Smuzhiyun } __attribute__ ((packed)) flags; 359*4882a593Smuzhiyun __u8 res1; 360*4882a593Smuzhiyun __u16 format; 361*4882a593Smuzhiyun __u8 res2[4]; /* byte 4- 7 */ 362*4882a593Smuzhiyun __u8 uit[16]; /* byte 8-23 */ 363*4882a593Smuzhiyun __u8 res3[8]; /* byte 24-31 */ 364*4882a593Smuzhiyun } __attribute__ ((packed)); 365*4882a593Smuzhiyun 366*4882a593Smuzhiyun struct dasd_gneq { 367*4882a593Smuzhiyun struct { 368*4882a593Smuzhiyun __u8 identifier:2; 369*4882a593Smuzhiyun __u8 reserved:6; 370*4882a593Smuzhiyun } __attribute__ ((packed)) flags; 371*4882a593Smuzhiyun __u8 record_selector; 372*4882a593Smuzhiyun __u8 reserved[4]; 373*4882a593Smuzhiyun struct { 374*4882a593Smuzhiyun __u8 value:2; 375*4882a593Smuzhiyun __u8 number:6; 376*4882a593Smuzhiyun } __attribute__ ((packed)) timeout; 377*4882a593Smuzhiyun __u8 reserved3; 378*4882a593Smuzhiyun __u16 subsystemID; 379*4882a593Smuzhiyun __u8 reserved2[22]; 380*4882a593Smuzhiyun } __attribute__ ((packed)); 381*4882a593Smuzhiyun 382*4882a593Smuzhiyun struct dasd_rssd_features { 383*4882a593Smuzhiyun char feature[256]; 384*4882a593Smuzhiyun } __attribute__((packed)); 385*4882a593Smuzhiyun 386*4882a593Smuzhiyun struct dasd_rssd_messages { 387*4882a593Smuzhiyun __u16 length; 388*4882a593Smuzhiyun __u8 format; 389*4882a593Smuzhiyun __u8 code; 390*4882a593Smuzhiyun __u32 message_id; 391*4882a593Smuzhiyun __u8 flags; 392*4882a593Smuzhiyun char messages[4087]; 393*4882a593Smuzhiyun } __packed; 394*4882a593Smuzhiyun 395*4882a593Smuzhiyun /* 396*4882a593Smuzhiyun * Read Subsystem Data - Volume Storage Query 397*4882a593Smuzhiyun */ 398*4882a593Smuzhiyun struct dasd_rssd_vsq { 399*4882a593Smuzhiyun struct { 400*4882a593Smuzhiyun __u8 tse:1; 401*4882a593Smuzhiyun __u8 space_not_available:1; 402*4882a593Smuzhiyun __u8 ese:1; 403*4882a593Smuzhiyun __u8 unused:5; 404*4882a593Smuzhiyun } __packed vol_info; 405*4882a593Smuzhiyun __u8 unused1; 406*4882a593Smuzhiyun __u16 extent_pool_id; 407*4882a593Smuzhiyun __u8 warn_cap_limit; 408*4882a593Smuzhiyun __u8 warn_cap_guaranteed; 409*4882a593Smuzhiyun __u16 unused2; 410*4882a593Smuzhiyun __u32 limit_capacity; 411*4882a593Smuzhiyun __u32 guaranteed_capacity; 412*4882a593Smuzhiyun __u32 space_allocated; 413*4882a593Smuzhiyun __u32 space_configured; 414*4882a593Smuzhiyun __u32 logical_capacity; 415*4882a593Smuzhiyun } __packed; 416*4882a593Smuzhiyun 417*4882a593Smuzhiyun /* 418*4882a593Smuzhiyun * Extent Pool Summary 419*4882a593Smuzhiyun */ 420*4882a593Smuzhiyun struct dasd_ext_pool_sum { 421*4882a593Smuzhiyun __u16 pool_id; 422*4882a593Smuzhiyun __u8 repo_warn_thrshld; 423*4882a593Smuzhiyun __u8 warn_thrshld; 424*4882a593Smuzhiyun struct { 425*4882a593Smuzhiyun __u8 type:1; /* 0 - CKD / 1 - FB */ 426*4882a593Smuzhiyun __u8 track_space_efficient:1; 427*4882a593Smuzhiyun __u8 extent_space_efficient:1; 428*4882a593Smuzhiyun __u8 standard_volume:1; 429*4882a593Smuzhiyun __u8 extent_size_valid:1; 430*4882a593Smuzhiyun __u8 capacity_at_warnlevel:1; 431*4882a593Smuzhiyun __u8 pool_oos:1; 432*4882a593Smuzhiyun __u8 unused0:1; 433*4882a593Smuzhiyun __u8 unused1; 434*4882a593Smuzhiyun } __packed flags; 435*4882a593Smuzhiyun struct { 436*4882a593Smuzhiyun __u8 reserved0:1; 437*4882a593Smuzhiyun __u8 size_1G:1; 438*4882a593Smuzhiyun __u8 reserved1:5; 439*4882a593Smuzhiyun __u8 size_16M:1; 440*4882a593Smuzhiyun } __packed extent_size; 441*4882a593Smuzhiyun __u8 unused; 442*4882a593Smuzhiyun } __packed; 443*4882a593Smuzhiyun 444*4882a593Smuzhiyun /* 445*4882a593Smuzhiyun * Read Subsystem Data-Response - Logical Configuration Query - Header 446*4882a593Smuzhiyun */ 447*4882a593Smuzhiyun struct dasd_rssd_lcq { 448*4882a593Smuzhiyun __u16 data_length; /* Length of data returned */ 449*4882a593Smuzhiyun __u16 pool_count; /* Count of extent pools returned - Max: 448 */ 450*4882a593Smuzhiyun struct { 451*4882a593Smuzhiyun __u8 pool_info_valid:1; /* Detailed Information valid */ 452*4882a593Smuzhiyun __u8 pool_id_volume:1; 453*4882a593Smuzhiyun __u8 pool_id_cec:1; 454*4882a593Smuzhiyun __u8 unused0:5; 455*4882a593Smuzhiyun __u8 unused1; 456*4882a593Smuzhiyun } __packed header_flags; 457*4882a593Smuzhiyun char sfi_type[6]; /* Storage Facility Image Type (EBCDIC) */ 458*4882a593Smuzhiyun char sfi_model[3]; /* Storage Facility Image Model (EBCDIC) */ 459*4882a593Smuzhiyun __u8 sfi_seq_num[10]; /* Storage Facility Image Sequence Number */ 460*4882a593Smuzhiyun __u8 reserved[7]; 461*4882a593Smuzhiyun struct dasd_ext_pool_sum ext_pool_sum[448]; 462*4882a593Smuzhiyun } __packed; 463*4882a593Smuzhiyun 464*4882a593Smuzhiyun struct dasd_oos_message { 465*4882a593Smuzhiyun __u16 length; 466*4882a593Smuzhiyun __u8 format; 467*4882a593Smuzhiyun __u8 code; 468*4882a593Smuzhiyun __u8 percentage_empty; 469*4882a593Smuzhiyun __u8 reserved; 470*4882a593Smuzhiyun __u16 ext_pool_id; 471*4882a593Smuzhiyun __u16 token; 472*4882a593Smuzhiyun __u8 unused[6]; 473*4882a593Smuzhiyun } __packed; 474*4882a593Smuzhiyun 475*4882a593Smuzhiyun struct dasd_cuir_message { 476*4882a593Smuzhiyun __u16 length; 477*4882a593Smuzhiyun __u8 format; 478*4882a593Smuzhiyun __u8 code; 479*4882a593Smuzhiyun __u32 message_id; 480*4882a593Smuzhiyun __u8 flags; 481*4882a593Smuzhiyun __u8 neq_map[3]; 482*4882a593Smuzhiyun __u8 ned_map; 483*4882a593Smuzhiyun __u8 record_selector; 484*4882a593Smuzhiyun } __packed; 485*4882a593Smuzhiyun 486*4882a593Smuzhiyun struct dasd_psf_cuir_response { 487*4882a593Smuzhiyun __u8 order; 488*4882a593Smuzhiyun __u8 flags; 489*4882a593Smuzhiyun __u8 cc; 490*4882a593Smuzhiyun __u8 chpid; 491*4882a593Smuzhiyun __u16 device_nr; 492*4882a593Smuzhiyun __u16 reserved; 493*4882a593Smuzhiyun __u32 message_id; 494*4882a593Smuzhiyun __u64 system_id; 495*4882a593Smuzhiyun __u8 cssid; 496*4882a593Smuzhiyun __u8 ssid; 497*4882a593Smuzhiyun } __packed; 498*4882a593Smuzhiyun 499*4882a593Smuzhiyun struct dasd_ckd_path_group_entry { 500*4882a593Smuzhiyun __u8 status_flags; 501*4882a593Smuzhiyun __u8 pgid[11]; 502*4882a593Smuzhiyun __u8 sysplex_name[8]; 503*4882a593Smuzhiyun __u32 timestamp; 504*4882a593Smuzhiyun __u32 cylinder; 505*4882a593Smuzhiyun __u8 reserved[4]; 506*4882a593Smuzhiyun } __packed; 507*4882a593Smuzhiyun 508*4882a593Smuzhiyun struct dasd_ckd_host_information { 509*4882a593Smuzhiyun __u8 access_flags; 510*4882a593Smuzhiyun __u8 entry_size; 511*4882a593Smuzhiyun __u16 entry_count; 512*4882a593Smuzhiyun __u8 entry[16390]; 513*4882a593Smuzhiyun } __packed; 514*4882a593Smuzhiyun 515*4882a593Smuzhiyun struct dasd_psf_query_host_access { 516*4882a593Smuzhiyun __u8 access_flag; 517*4882a593Smuzhiyun __u8 version; 518*4882a593Smuzhiyun __u16 CKD_length; 519*4882a593Smuzhiyun __u16 SCSI_length; 520*4882a593Smuzhiyun __u8 unused[10]; 521*4882a593Smuzhiyun __u8 host_access_information[16394]; 522*4882a593Smuzhiyun } __packed; 523*4882a593Smuzhiyun 524*4882a593Smuzhiyun /* 525*4882a593Smuzhiyun * Perform Subsystem Function - Prepare for Read Subsystem Data 526*4882a593Smuzhiyun */ 527*4882a593Smuzhiyun struct dasd_psf_prssd_data { 528*4882a593Smuzhiyun unsigned char order; 529*4882a593Smuzhiyun unsigned char flags; 530*4882a593Smuzhiyun unsigned char reserved1; 531*4882a593Smuzhiyun unsigned char reserved2; 532*4882a593Smuzhiyun unsigned char lss; 533*4882a593Smuzhiyun unsigned char volume; 534*4882a593Smuzhiyun unsigned char suborder; 535*4882a593Smuzhiyun unsigned char varies[5]; 536*4882a593Smuzhiyun } __attribute__ ((packed)); 537*4882a593Smuzhiyun 538*4882a593Smuzhiyun /* 539*4882a593Smuzhiyun * Perform Subsystem Function - Set Subsystem Characteristics 540*4882a593Smuzhiyun */ 541*4882a593Smuzhiyun struct dasd_psf_ssc_data { 542*4882a593Smuzhiyun unsigned char order; 543*4882a593Smuzhiyun unsigned char flags; 544*4882a593Smuzhiyun unsigned char cu_type[4]; 545*4882a593Smuzhiyun unsigned char suborder; 546*4882a593Smuzhiyun unsigned char reserved[59]; 547*4882a593Smuzhiyun } __attribute__((packed)); 548*4882a593Smuzhiyun 549*4882a593Smuzhiyun /* Maximum number of extents for a single Release Allocated Space command */ 550*4882a593Smuzhiyun #define DASD_ECKD_RAS_EXTS_MAX 110U 551*4882a593Smuzhiyun 552*4882a593Smuzhiyun struct dasd_dso_ras_ext_range { 553*4882a593Smuzhiyun struct ch_t beg_ext; 554*4882a593Smuzhiyun struct ch_t end_ext; 555*4882a593Smuzhiyun } __packed; 556*4882a593Smuzhiyun 557*4882a593Smuzhiyun /* 558*4882a593Smuzhiyun * Define Subsytem Operation - Release Allocated Space 559*4882a593Smuzhiyun */ 560*4882a593Smuzhiyun struct dasd_dso_ras_data { 561*4882a593Smuzhiyun __u8 order; 562*4882a593Smuzhiyun struct { 563*4882a593Smuzhiyun __u8 message:1; /* Must be zero */ 564*4882a593Smuzhiyun __u8 reserved1:2; 565*4882a593Smuzhiyun __u8 vol_type:1; /* 0 - CKD/FBA, 1 - FB */ 566*4882a593Smuzhiyun __u8 reserved2:4; 567*4882a593Smuzhiyun } __packed flags; 568*4882a593Smuzhiyun /* Operation Flags to specify scope */ 569*4882a593Smuzhiyun struct { 570*4882a593Smuzhiyun __u8 reserved1:2; 571*4882a593Smuzhiyun /* Release Space by Extent */ 572*4882a593Smuzhiyun __u8 by_extent:1; /* 0 - entire volume, 1 - specified extents */ 573*4882a593Smuzhiyun __u8 guarantee_init:1; 574*4882a593Smuzhiyun __u8 force_release:1; /* Internal - will be ignored */ 575*4882a593Smuzhiyun __u16 reserved2:11; 576*4882a593Smuzhiyun } __packed op_flags; 577*4882a593Smuzhiyun __u8 lss; 578*4882a593Smuzhiyun __u8 dev_addr; 579*4882a593Smuzhiyun __u32 reserved1; 580*4882a593Smuzhiyun __u8 reserved2[10]; 581*4882a593Smuzhiyun __u16 nr_exts; /* Defines number of ext_scope - max 110 */ 582*4882a593Smuzhiyun __u16 reserved3; 583*4882a593Smuzhiyun } __packed; 584*4882a593Smuzhiyun 585*4882a593Smuzhiyun 586*4882a593Smuzhiyun /* 587*4882a593Smuzhiyun * some structures and definitions for alias handling 588*4882a593Smuzhiyun */ 589*4882a593Smuzhiyun struct dasd_unit_address_configuration { 590*4882a593Smuzhiyun struct { 591*4882a593Smuzhiyun char ua_type; 592*4882a593Smuzhiyun char base_ua; 593*4882a593Smuzhiyun } unit[256]; 594*4882a593Smuzhiyun } __attribute__((packed)); 595*4882a593Smuzhiyun 596*4882a593Smuzhiyun 597*4882a593Smuzhiyun #define MAX_DEVICES_PER_LCU 256 598*4882a593Smuzhiyun 599*4882a593Smuzhiyun /* flags on the LCU */ 600*4882a593Smuzhiyun #define NEED_UAC_UPDATE 0x01 601*4882a593Smuzhiyun #define UPDATE_PENDING 0x02 602*4882a593Smuzhiyun 603*4882a593Smuzhiyun enum pavtype {NO_PAV, BASE_PAV, HYPER_PAV}; 604*4882a593Smuzhiyun 605*4882a593Smuzhiyun 606*4882a593Smuzhiyun struct alias_root { 607*4882a593Smuzhiyun struct list_head serverlist; 608*4882a593Smuzhiyun spinlock_t lock; 609*4882a593Smuzhiyun }; 610*4882a593Smuzhiyun 611*4882a593Smuzhiyun struct alias_server { 612*4882a593Smuzhiyun struct list_head server; 613*4882a593Smuzhiyun struct dasd_uid uid; 614*4882a593Smuzhiyun struct list_head lculist; 615*4882a593Smuzhiyun }; 616*4882a593Smuzhiyun 617*4882a593Smuzhiyun struct summary_unit_check_work_data { 618*4882a593Smuzhiyun char reason; 619*4882a593Smuzhiyun struct dasd_device *device; 620*4882a593Smuzhiyun struct work_struct worker; 621*4882a593Smuzhiyun }; 622*4882a593Smuzhiyun 623*4882a593Smuzhiyun struct read_uac_work_data { 624*4882a593Smuzhiyun struct dasd_device *device; 625*4882a593Smuzhiyun struct delayed_work dwork; 626*4882a593Smuzhiyun }; 627*4882a593Smuzhiyun 628*4882a593Smuzhiyun struct alias_lcu { 629*4882a593Smuzhiyun struct list_head lcu; 630*4882a593Smuzhiyun struct dasd_uid uid; 631*4882a593Smuzhiyun enum pavtype pav; 632*4882a593Smuzhiyun char flags; 633*4882a593Smuzhiyun spinlock_t lock; 634*4882a593Smuzhiyun struct list_head grouplist; 635*4882a593Smuzhiyun struct list_head active_devices; 636*4882a593Smuzhiyun struct list_head inactive_devices; 637*4882a593Smuzhiyun struct dasd_unit_address_configuration *uac; 638*4882a593Smuzhiyun struct summary_unit_check_work_data suc_data; 639*4882a593Smuzhiyun struct read_uac_work_data ruac_data; 640*4882a593Smuzhiyun struct dasd_ccw_req *rsu_cqr; 641*4882a593Smuzhiyun struct completion lcu_setup; 642*4882a593Smuzhiyun }; 643*4882a593Smuzhiyun 644*4882a593Smuzhiyun struct alias_pav_group { 645*4882a593Smuzhiyun struct list_head group; 646*4882a593Smuzhiyun struct dasd_uid uid; 647*4882a593Smuzhiyun struct alias_lcu *lcu; 648*4882a593Smuzhiyun struct list_head baselist; 649*4882a593Smuzhiyun struct list_head aliaslist; 650*4882a593Smuzhiyun struct dasd_device *next; 651*4882a593Smuzhiyun }; 652*4882a593Smuzhiyun 653*4882a593Smuzhiyun struct dasd_conf_data { 654*4882a593Smuzhiyun struct dasd_ned neds[5]; 655*4882a593Smuzhiyun u8 reserved[64]; 656*4882a593Smuzhiyun struct dasd_gneq gneq; 657*4882a593Smuzhiyun } __packed; 658*4882a593Smuzhiyun 659*4882a593Smuzhiyun struct dasd_eckd_private { 660*4882a593Smuzhiyun struct dasd_eckd_characteristics rdc_data; 661*4882a593Smuzhiyun u8 *conf_data; 662*4882a593Smuzhiyun int conf_len; 663*4882a593Smuzhiyun 664*4882a593Smuzhiyun /* pointers to specific parts in the conf_data */ 665*4882a593Smuzhiyun struct dasd_ned *ned; 666*4882a593Smuzhiyun struct dasd_sneq *sneq; 667*4882a593Smuzhiyun struct vd_sneq *vdsneq; 668*4882a593Smuzhiyun struct dasd_gneq *gneq; 669*4882a593Smuzhiyun 670*4882a593Smuzhiyun struct eckd_count count_area[5]; 671*4882a593Smuzhiyun int init_cqr_status; 672*4882a593Smuzhiyun int uses_cdl; 673*4882a593Smuzhiyun struct attrib_data_t attrib; /* e.g. cache operations */ 674*4882a593Smuzhiyun struct dasd_rssd_features features; 675*4882a593Smuzhiyun struct dasd_rssd_vsq vsq; 676*4882a593Smuzhiyun struct dasd_ext_pool_sum eps; 677*4882a593Smuzhiyun u32 real_cyl; 678*4882a593Smuzhiyun 679*4882a593Smuzhiyun /* alias managemnet */ 680*4882a593Smuzhiyun struct dasd_uid uid; 681*4882a593Smuzhiyun struct alias_pav_group *pavgroup; 682*4882a593Smuzhiyun struct alias_lcu *lcu; 683*4882a593Smuzhiyun int count; 684*4882a593Smuzhiyun 685*4882a593Smuzhiyun u32 fcx_max_data; 686*4882a593Smuzhiyun char suc_reason; 687*4882a593Smuzhiyun }; 688*4882a593Smuzhiyun 689*4882a593Smuzhiyun 690*4882a593Smuzhiyun 691*4882a593Smuzhiyun int dasd_alias_make_device_known_to_lcu(struct dasd_device *); 692*4882a593Smuzhiyun void dasd_alias_disconnect_device_from_lcu(struct dasd_device *); 693*4882a593Smuzhiyun int dasd_alias_add_device(struct dasd_device *); 694*4882a593Smuzhiyun int dasd_alias_remove_device(struct dasd_device *); 695*4882a593Smuzhiyun struct dasd_device *dasd_alias_get_start_dev(struct dasd_device *); 696*4882a593Smuzhiyun void dasd_alias_handle_summary_unit_check(struct work_struct *); 697*4882a593Smuzhiyun void dasd_eckd_reset_ccw_to_base_io(struct dasd_ccw_req *); 698*4882a593Smuzhiyun int dasd_alias_update_add_device(struct dasd_device *); 699*4882a593Smuzhiyun #endif /* DASD_ECKD_H */ 700