162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com> 462306a36Sopenharmony_ci * Horst Hummel <Horst.Hummel@de.ibm.com> 562306a36Sopenharmony_ci * Bugreports.to..: <Linux390@de.ibm.com> 662306a36Sopenharmony_ci * Copyright IBM Corp. 1999, 2000 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#ifndef DASD_ECKD_H 1162306a36Sopenharmony_ci#define DASD_ECKD_H 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci/***************************************************************************** 1462306a36Sopenharmony_ci * SECTION: CCW Definitions 1562306a36Sopenharmony_ci ****************************************************************************/ 1662306a36Sopenharmony_ci#define DASD_ECKD_CCW_NOP 0x03 1762306a36Sopenharmony_ci#define DASD_ECKD_CCW_WRITE 0x05 1862306a36Sopenharmony_ci#define DASD_ECKD_CCW_READ 0x06 1962306a36Sopenharmony_ci#define DASD_ECKD_CCW_WRITE_HOME_ADDRESS 0x09 2062306a36Sopenharmony_ci#define DASD_ECKD_CCW_READ_HOME_ADDRESS 0x0a 2162306a36Sopenharmony_ci#define DASD_ECKD_CCW_WRITE_KD 0x0d 2262306a36Sopenharmony_ci#define DASD_ECKD_CCW_READ_KD 0x0e 2362306a36Sopenharmony_ci#define DASD_ECKD_CCW_ERASE 0x11 2462306a36Sopenharmony_ci#define DASD_ECKD_CCW_READ_COUNT 0x12 2562306a36Sopenharmony_ci#define DASD_ECKD_CCW_SLCK 0x14 2662306a36Sopenharmony_ci#define DASD_ECKD_CCW_WRITE_RECORD_ZERO 0x15 2762306a36Sopenharmony_ci#define DASD_ECKD_CCW_READ_RECORD_ZERO 0x16 2862306a36Sopenharmony_ci#define DASD_ECKD_CCW_WRITE_CKD 0x1d 2962306a36Sopenharmony_ci#define DASD_ECKD_CCW_READ_CKD 0x1e 3062306a36Sopenharmony_ci#define DASD_ECKD_CCW_PSF 0x27 3162306a36Sopenharmony_ci#define DASD_ECKD_CCW_SNID 0x34 3262306a36Sopenharmony_ci#define DASD_ECKD_CCW_RSSD 0x3e 3362306a36Sopenharmony_ci#define DASD_ECKD_CCW_LOCATE_RECORD 0x47 3462306a36Sopenharmony_ci#define DASD_ECKD_CCW_LOCATE_RECORD_EXT 0x4b 3562306a36Sopenharmony_ci#define DASD_ECKD_CCW_SNSS 0x54 3662306a36Sopenharmony_ci#define DASD_ECKD_CCW_DEFINE_EXTENT 0x63 3762306a36Sopenharmony_ci#define DASD_ECKD_CCW_WRITE_MT 0x85 3862306a36Sopenharmony_ci#define DASD_ECKD_CCW_READ_MT 0x86 3962306a36Sopenharmony_ci#define DASD_ECKD_CCW_WRITE_KD_MT 0x8d 4062306a36Sopenharmony_ci#define DASD_ECKD_CCW_READ_KD_MT 0x8e 4162306a36Sopenharmony_ci#define DASD_ECKD_CCW_READ_COUNT_MT 0x92 4262306a36Sopenharmony_ci#define DASD_ECKD_CCW_RELEASE 0x94 4362306a36Sopenharmony_ci#define DASD_ECKD_CCW_WRITE_FULL_TRACK 0x95 4462306a36Sopenharmony_ci#define DASD_ECKD_CCW_READ_CKD_MT 0x9e 4562306a36Sopenharmony_ci#define DASD_ECKD_CCW_WRITE_CKD_MT 0x9d 4662306a36Sopenharmony_ci#define DASD_ECKD_CCW_WRITE_TRACK_DATA 0xA5 4762306a36Sopenharmony_ci#define DASD_ECKD_CCW_READ_TRACK_DATA 0xA6 4862306a36Sopenharmony_ci#define DASD_ECKD_CCW_RESERVE 0xB4 4962306a36Sopenharmony_ci#define DASD_ECKD_CCW_READ_TRACK 0xDE 5062306a36Sopenharmony_ci#define DASD_ECKD_CCW_PFX 0xE7 5162306a36Sopenharmony_ci#define DASD_ECKD_CCW_PFX_READ 0xEA 5262306a36Sopenharmony_ci#define DASD_ECKD_CCW_RSCK 0xF9 5362306a36Sopenharmony_ci#define DASD_ECKD_CCW_RCD 0xFA 5462306a36Sopenharmony_ci#define DASD_ECKD_CCW_DSO 0xF7 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci/* Define Subsystem Function / Orders */ 5762306a36Sopenharmony_ci#define DSO_ORDER_RAS 0x81 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci/* 6062306a36Sopenharmony_ci * Perform Subsystem Function / Orders 6162306a36Sopenharmony_ci */ 6262306a36Sopenharmony_ci#define PSF_ORDER_PRSSD 0x18 6362306a36Sopenharmony_ci#define PSF_ORDER_CUIR_RESPONSE 0x1A 6462306a36Sopenharmony_ci#define PSF_ORDER_SSC 0x1D 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci/* 6762306a36Sopenharmony_ci * Perform Subsystem Function / Sub-Orders 6862306a36Sopenharmony_ci */ 6962306a36Sopenharmony_ci#define PSF_SUBORDER_QHA 0x1C /* Query Host Access */ 7062306a36Sopenharmony_ci#define PSF_SUBORDER_PPRCEQ 0x50 /* PPRC Extended Query */ 7162306a36Sopenharmony_ci#define PSF_SUBORDER_VSQ 0x52 /* Volume Storage Query */ 7262306a36Sopenharmony_ci#define PSF_SUBORDER_LCQ 0x53 /* Logical Configuration Query */ 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci/* 7562306a36Sopenharmony_ci * PPRC Extended Query Scopes 7662306a36Sopenharmony_ci */ 7762306a36Sopenharmony_ci#define PPRCEQ_SCOPE_4 0x04 /* Scope 4 for PPRC Extended Query */ 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci/* 8062306a36Sopenharmony_ci * CUIR response condition codes 8162306a36Sopenharmony_ci */ 8262306a36Sopenharmony_ci#define PSF_CUIR_INVALID 0x00 8362306a36Sopenharmony_ci#define PSF_CUIR_COMPLETED 0x01 8462306a36Sopenharmony_ci#define PSF_CUIR_NOT_SUPPORTED 0x02 8562306a36Sopenharmony_ci#define PSF_CUIR_ERROR_IN_REQ 0x03 8662306a36Sopenharmony_ci#define PSF_CUIR_DENIED 0x04 8762306a36Sopenharmony_ci#define PSF_CUIR_LAST_PATH 0x05 8862306a36Sopenharmony_ci#define PSF_CUIR_DEVICE_ONLINE 0x06 8962306a36Sopenharmony_ci#define PSF_CUIR_VARY_FAILURE 0x07 9062306a36Sopenharmony_ci#define PSF_CUIR_SOFTWARE_FAILURE 0x08 9162306a36Sopenharmony_ci#define PSF_CUIR_NOT_RECOGNIZED 0x09 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci/* 9462306a36Sopenharmony_ci * CUIR codes 9562306a36Sopenharmony_ci */ 9662306a36Sopenharmony_ci#define CUIR_QUIESCE 0x01 9762306a36Sopenharmony_ci#define CUIR_RESUME 0x02 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci/* 10062306a36Sopenharmony_ci * Out-of-space (OOS) Codes 10162306a36Sopenharmony_ci */ 10262306a36Sopenharmony_ci#define REPO_WARN 0x01 10362306a36Sopenharmony_ci#define REPO_EXHAUST 0x02 10462306a36Sopenharmony_ci#define POOL_WARN 0x03 10562306a36Sopenharmony_ci#define POOL_EXHAUST 0x04 10662306a36Sopenharmony_ci#define REPO_RELIEVE 0x05 10762306a36Sopenharmony_ci#define POOL_RELIEVE 0x06 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci/* 11062306a36Sopenharmony_ci * attention message definitions 11162306a36Sopenharmony_ci */ 11262306a36Sopenharmony_ci#define ATTENTION_LENGTH_CUIR 0x0e 11362306a36Sopenharmony_ci#define ATTENTION_FORMAT_CUIR 0x01 11462306a36Sopenharmony_ci#define ATTENTION_LENGTH_OOS 0x10 11562306a36Sopenharmony_ci#define ATTENTION_FORMAT_OOS 0x06 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci#define DASD_ECKD_PG_GROUPED 0x10 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci/* 12062306a36Sopenharmony_ci * Size that is reported for large volumes in the old 16-bit no_cyl field 12162306a36Sopenharmony_ci */ 12262306a36Sopenharmony_ci#define LV_COMPAT_CYL 0xFFFE 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci#define FCX_MAX_DATA_FACTOR 65536 12662306a36Sopenharmony_ci#define DASD_ECKD_RCD_DATA_SIZE 256 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci#define DASD_ECKD_PATH_THRHLD 256 12962306a36Sopenharmony_ci#define DASD_ECKD_PATH_INTERVAL 300 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci/* 13262306a36Sopenharmony_ci * Maximum number of blocks to be chained 13362306a36Sopenharmony_ci */ 13462306a36Sopenharmony_ci#define DASD_ECKD_MAX_BLOCKS 190 13562306a36Sopenharmony_ci#define DASD_ECKD_MAX_BLOCKS_RAW 256 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci/***************************************************************************** 13862306a36Sopenharmony_ci * SECTION: Type Definitions 13962306a36Sopenharmony_ci ****************************************************************************/ 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_cistruct eckd_count { 14262306a36Sopenharmony_ci __u16 cyl; 14362306a36Sopenharmony_ci __u16 head; 14462306a36Sopenharmony_ci __u8 record; 14562306a36Sopenharmony_ci __u8 kl; 14662306a36Sopenharmony_ci __u16 dl; 14762306a36Sopenharmony_ci} __attribute__ ((packed)); 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_cistruct ch_t { 15062306a36Sopenharmony_ci __u16 cyl; 15162306a36Sopenharmony_ci __u16 head; 15262306a36Sopenharmony_ci} __attribute__ ((packed)); 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_cistruct chr_t { 15562306a36Sopenharmony_ci __u16 cyl; 15662306a36Sopenharmony_ci __u16 head; 15762306a36Sopenharmony_ci __u8 record; 15862306a36Sopenharmony_ci} __attribute__ ((packed)); 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_cistruct DE_eckd_data { 16162306a36Sopenharmony_ci struct { 16262306a36Sopenharmony_ci unsigned char perm:2; /* Permissions on this extent */ 16362306a36Sopenharmony_ci unsigned char reserved:1; 16462306a36Sopenharmony_ci unsigned char seek:2; /* Seek control */ 16562306a36Sopenharmony_ci unsigned char auth:2; /* Access authorization */ 16662306a36Sopenharmony_ci unsigned char pci:1; /* PCI Fetch mode */ 16762306a36Sopenharmony_ci } __attribute__ ((packed)) mask; 16862306a36Sopenharmony_ci struct { 16962306a36Sopenharmony_ci unsigned char mode:2; /* Architecture mode */ 17062306a36Sopenharmony_ci unsigned char ckd:1; /* CKD Conversion */ 17162306a36Sopenharmony_ci unsigned char operation:3; /* Operation mode */ 17262306a36Sopenharmony_ci unsigned char cfw:1; /* Cache fast write */ 17362306a36Sopenharmony_ci unsigned char dfw:1; /* DASD fast write */ 17462306a36Sopenharmony_ci } __attribute__ ((packed)) attributes; 17562306a36Sopenharmony_ci __u16 blk_size; /* Blocksize */ 17662306a36Sopenharmony_ci __u16 fast_write_id; 17762306a36Sopenharmony_ci __u8 ga_additional; /* Global Attributes Additional */ 17862306a36Sopenharmony_ci __u8 ga_extended; /* Global Attributes Extended */ 17962306a36Sopenharmony_ci struct ch_t beg_ext; 18062306a36Sopenharmony_ci struct ch_t end_ext; 18162306a36Sopenharmony_ci unsigned long ep_sys_time; /* Ext Parameter - System Time Stamp */ 18262306a36Sopenharmony_ci __u8 ep_format; /* Extended Parameter format byte */ 18362306a36Sopenharmony_ci __u8 ep_prio; /* Extended Parameter priority I/O byte */ 18462306a36Sopenharmony_ci __u8 ep_reserved1; /* Extended Parameter Reserved */ 18562306a36Sopenharmony_ci __u8 ep_rec_per_track; /* Number of records on a track */ 18662306a36Sopenharmony_ci __u8 ep_reserved[4]; /* Extended Parameter Reserved */ 18762306a36Sopenharmony_ci} __attribute__ ((packed)); 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_cistruct LO_eckd_data { 19062306a36Sopenharmony_ci struct { 19162306a36Sopenharmony_ci unsigned char orientation:2; 19262306a36Sopenharmony_ci unsigned char operation:6; 19362306a36Sopenharmony_ci } __attribute__ ((packed)) operation; 19462306a36Sopenharmony_ci struct { 19562306a36Sopenharmony_ci unsigned char last_bytes_used:1; 19662306a36Sopenharmony_ci unsigned char reserved:6; 19762306a36Sopenharmony_ci unsigned char read_count_suffix:1; 19862306a36Sopenharmony_ci } __attribute__ ((packed)) auxiliary; 19962306a36Sopenharmony_ci __u8 unused; 20062306a36Sopenharmony_ci __u8 count; 20162306a36Sopenharmony_ci struct ch_t seek_addr; 20262306a36Sopenharmony_ci struct chr_t search_arg; 20362306a36Sopenharmony_ci __u8 sector; 20462306a36Sopenharmony_ci __u16 length; 20562306a36Sopenharmony_ci} __attribute__ ((packed)); 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_cistruct LRE_eckd_data { 20862306a36Sopenharmony_ci struct { 20962306a36Sopenharmony_ci unsigned char orientation:2; 21062306a36Sopenharmony_ci unsigned char operation:6; 21162306a36Sopenharmony_ci } __attribute__ ((packed)) operation; 21262306a36Sopenharmony_ci struct { 21362306a36Sopenharmony_ci unsigned char length_valid:1; 21462306a36Sopenharmony_ci unsigned char length_scope:1; 21562306a36Sopenharmony_ci unsigned char imbedded_ccw_valid:1; 21662306a36Sopenharmony_ci unsigned char check_bytes:2; 21762306a36Sopenharmony_ci unsigned char imbedded_count_valid:1; 21862306a36Sopenharmony_ci unsigned char reserved:1; 21962306a36Sopenharmony_ci unsigned char read_count_suffix:1; 22062306a36Sopenharmony_ci } __attribute__ ((packed)) auxiliary; 22162306a36Sopenharmony_ci __u8 imbedded_ccw; 22262306a36Sopenharmony_ci __u8 count; 22362306a36Sopenharmony_ci struct ch_t seek_addr; 22462306a36Sopenharmony_ci struct chr_t search_arg; 22562306a36Sopenharmony_ci __u8 sector; 22662306a36Sopenharmony_ci __u16 length; 22762306a36Sopenharmony_ci __u8 imbedded_count; 22862306a36Sopenharmony_ci __u8 extended_operation; 22962306a36Sopenharmony_ci __u16 extended_parameter_length; 23062306a36Sopenharmony_ci __u8 extended_parameter[]; 23162306a36Sopenharmony_ci} __attribute__ ((packed)); 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci/* Prefix data for format 0x00 and 0x01 */ 23462306a36Sopenharmony_cistruct PFX_eckd_data { 23562306a36Sopenharmony_ci unsigned char format; 23662306a36Sopenharmony_ci struct { 23762306a36Sopenharmony_ci unsigned char define_extent:1; 23862306a36Sopenharmony_ci unsigned char time_stamp:1; 23962306a36Sopenharmony_ci unsigned char verify_base:1; 24062306a36Sopenharmony_ci unsigned char hyper_pav:1; 24162306a36Sopenharmony_ci unsigned char reserved:4; 24262306a36Sopenharmony_ci } __attribute__ ((packed)) validity; 24362306a36Sopenharmony_ci __u8 base_address; 24462306a36Sopenharmony_ci __u8 aux; 24562306a36Sopenharmony_ci __u8 base_lss; 24662306a36Sopenharmony_ci __u8 reserved[7]; 24762306a36Sopenharmony_ci struct DE_eckd_data define_extent; 24862306a36Sopenharmony_ci struct LRE_eckd_data locate_record; 24962306a36Sopenharmony_ci} __attribute__ ((packed)); 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_cistruct dasd_eckd_characteristics { 25262306a36Sopenharmony_ci __u16 cu_type; 25362306a36Sopenharmony_ci struct { 25462306a36Sopenharmony_ci unsigned char support:2; 25562306a36Sopenharmony_ci unsigned char async:1; 25662306a36Sopenharmony_ci unsigned char reserved:1; 25762306a36Sopenharmony_ci unsigned char cache_info:1; 25862306a36Sopenharmony_ci unsigned char model:3; 25962306a36Sopenharmony_ci } __attribute__ ((packed)) cu_model; 26062306a36Sopenharmony_ci __u16 dev_type; 26162306a36Sopenharmony_ci __u8 dev_model; 26262306a36Sopenharmony_ci struct { 26362306a36Sopenharmony_ci unsigned char mult_burst:1; 26462306a36Sopenharmony_ci unsigned char RT_in_LR:1; 26562306a36Sopenharmony_ci unsigned char reserved1:1; 26662306a36Sopenharmony_ci unsigned char RD_IN_LR:1; 26762306a36Sopenharmony_ci unsigned char reserved2:4; 26862306a36Sopenharmony_ci unsigned char reserved3:8; 26962306a36Sopenharmony_ci unsigned char defect_wr:1; 27062306a36Sopenharmony_ci unsigned char XRC_supported:1; 27162306a36Sopenharmony_ci unsigned char PPRC_enabled:1; 27262306a36Sopenharmony_ci unsigned char striping:1; 27362306a36Sopenharmony_ci unsigned char reserved5:4; 27462306a36Sopenharmony_ci unsigned char cfw:1; 27562306a36Sopenharmony_ci unsigned char reserved6:2; 27662306a36Sopenharmony_ci unsigned char cache:1; 27762306a36Sopenharmony_ci unsigned char dual_copy:1; 27862306a36Sopenharmony_ci unsigned char dfw:1; 27962306a36Sopenharmony_ci unsigned char reset_alleg:1; 28062306a36Sopenharmony_ci unsigned char sense_down:1; 28162306a36Sopenharmony_ci } __attribute__ ((packed)) facilities; 28262306a36Sopenharmony_ci __u8 dev_class; 28362306a36Sopenharmony_ci __u8 unit_type; 28462306a36Sopenharmony_ci __u16 no_cyl; 28562306a36Sopenharmony_ci __u16 trk_per_cyl; 28662306a36Sopenharmony_ci __u8 sec_per_trk; 28762306a36Sopenharmony_ci __u8 byte_per_track[3]; 28862306a36Sopenharmony_ci __u16 home_bytes; 28962306a36Sopenharmony_ci __u8 formula; 29062306a36Sopenharmony_ci union { 29162306a36Sopenharmony_ci struct { 29262306a36Sopenharmony_ci __u8 f1; 29362306a36Sopenharmony_ci __u16 f2; 29462306a36Sopenharmony_ci __u16 f3; 29562306a36Sopenharmony_ci } __attribute__ ((packed)) f_0x01; 29662306a36Sopenharmony_ci struct { 29762306a36Sopenharmony_ci __u8 f1; 29862306a36Sopenharmony_ci __u8 f2; 29962306a36Sopenharmony_ci __u8 f3; 30062306a36Sopenharmony_ci __u8 f4; 30162306a36Sopenharmony_ci __u8 f5; 30262306a36Sopenharmony_ci } __attribute__ ((packed)) f_0x02; 30362306a36Sopenharmony_ci } __attribute__ ((packed)) factors; 30462306a36Sopenharmony_ci __u16 first_alt_trk; 30562306a36Sopenharmony_ci __u16 no_alt_trk; 30662306a36Sopenharmony_ci __u16 first_dia_trk; 30762306a36Sopenharmony_ci __u16 no_dia_trk; 30862306a36Sopenharmony_ci __u16 first_sup_trk; 30962306a36Sopenharmony_ci __u16 no_sup_trk; 31062306a36Sopenharmony_ci __u8 MDR_ID; 31162306a36Sopenharmony_ci __u8 OBR_ID; 31262306a36Sopenharmony_ci __u8 director; 31362306a36Sopenharmony_ci __u8 rd_trk_set; 31462306a36Sopenharmony_ci __u16 max_rec_zero; 31562306a36Sopenharmony_ci __u8 reserved1; 31662306a36Sopenharmony_ci __u8 RWANY_in_LR; 31762306a36Sopenharmony_ci __u8 factor6; 31862306a36Sopenharmony_ci __u8 factor7; 31962306a36Sopenharmony_ci __u8 factor8; 32062306a36Sopenharmony_ci __u8 reserved2[3]; 32162306a36Sopenharmony_ci __u8 reserved3[6]; 32262306a36Sopenharmony_ci __u32 long_no_cyl; 32362306a36Sopenharmony_ci} __attribute__ ((packed)); 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_ci/* elements of the configuration data */ 32662306a36Sopenharmony_cistruct dasd_ned { 32762306a36Sopenharmony_ci struct { 32862306a36Sopenharmony_ci __u8 identifier:2; 32962306a36Sopenharmony_ci __u8 token_id:1; 33062306a36Sopenharmony_ci __u8 sno_valid:1; 33162306a36Sopenharmony_ci __u8 subst_sno:1; 33262306a36Sopenharmony_ci __u8 recNED:1; 33362306a36Sopenharmony_ci __u8 emuNED:1; 33462306a36Sopenharmony_ci __u8 reserved:1; 33562306a36Sopenharmony_ci } __attribute__ ((packed)) flags; 33662306a36Sopenharmony_ci __u8 descriptor; 33762306a36Sopenharmony_ci __u8 dev_class; 33862306a36Sopenharmony_ci __u8 reserved; 33962306a36Sopenharmony_ci __u8 dev_type[6]; 34062306a36Sopenharmony_ci __u8 dev_model[3]; 34162306a36Sopenharmony_ci __u8 HDA_manufacturer[3]; 34262306a36Sopenharmony_ci struct { 34362306a36Sopenharmony_ci __u8 HDA_location[2]; 34462306a36Sopenharmony_ci __u8 HDA_seqno[12]; 34562306a36Sopenharmony_ci } serial; 34662306a36Sopenharmony_ci __u8 ID; 34762306a36Sopenharmony_ci __u8 unit_addr; 34862306a36Sopenharmony_ci} __attribute__ ((packed)); 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_cistruct dasd_sneq { 35162306a36Sopenharmony_ci struct { 35262306a36Sopenharmony_ci __u8 identifier:2; 35362306a36Sopenharmony_ci __u8 reserved:6; 35462306a36Sopenharmony_ci } __attribute__ ((packed)) flags; 35562306a36Sopenharmony_ci __u8 res1; 35662306a36Sopenharmony_ci __u16 format; 35762306a36Sopenharmony_ci __u8 res2[4]; /* byte 4- 7 */ 35862306a36Sopenharmony_ci __u8 sua_flags; /* byte 8 */ 35962306a36Sopenharmony_ci __u8 base_unit_addr; /* byte 9 */ 36062306a36Sopenharmony_ci __u8 res3[22]; /* byte 10-31 */ 36162306a36Sopenharmony_ci} __attribute__ ((packed)); 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_cistruct vd_sneq { 36462306a36Sopenharmony_ci struct { 36562306a36Sopenharmony_ci __u8 identifier:2; 36662306a36Sopenharmony_ci __u8 reserved:6; 36762306a36Sopenharmony_ci } __attribute__ ((packed)) flags; 36862306a36Sopenharmony_ci __u8 res1; 36962306a36Sopenharmony_ci __u16 format; 37062306a36Sopenharmony_ci __u8 res2[4]; /* byte 4- 7 */ 37162306a36Sopenharmony_ci __u8 uit[16]; /* byte 8-23 */ 37262306a36Sopenharmony_ci __u8 res3[8]; /* byte 24-31 */ 37362306a36Sopenharmony_ci} __attribute__ ((packed)); 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_cistruct dasd_gneq { 37662306a36Sopenharmony_ci struct { 37762306a36Sopenharmony_ci __u8 identifier:2; 37862306a36Sopenharmony_ci __u8 reserved:6; 37962306a36Sopenharmony_ci } __attribute__ ((packed)) flags; 38062306a36Sopenharmony_ci __u8 record_selector; 38162306a36Sopenharmony_ci __u8 reserved[4]; 38262306a36Sopenharmony_ci struct { 38362306a36Sopenharmony_ci __u8 value:2; 38462306a36Sopenharmony_ci __u8 number:6; 38562306a36Sopenharmony_ci } __attribute__ ((packed)) timeout; 38662306a36Sopenharmony_ci __u8 reserved3; 38762306a36Sopenharmony_ci __u16 subsystemID; 38862306a36Sopenharmony_ci __u8 reserved2[22]; 38962306a36Sopenharmony_ci} __attribute__ ((packed)); 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_cistruct dasd_rssd_features { 39262306a36Sopenharmony_ci char feature[256]; 39362306a36Sopenharmony_ci} __attribute__((packed)); 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_cistruct dasd_rssd_messages { 39662306a36Sopenharmony_ci __u16 length; 39762306a36Sopenharmony_ci __u8 format; 39862306a36Sopenharmony_ci __u8 code; 39962306a36Sopenharmony_ci __u32 message_id; 40062306a36Sopenharmony_ci __u8 flags; 40162306a36Sopenharmony_ci char messages[4087]; 40262306a36Sopenharmony_ci} __packed; 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ci/* 40562306a36Sopenharmony_ci * Read Subsystem Data - Volume Storage Query 40662306a36Sopenharmony_ci */ 40762306a36Sopenharmony_cistruct dasd_rssd_vsq { 40862306a36Sopenharmony_ci struct { 40962306a36Sopenharmony_ci __u8 tse:1; 41062306a36Sopenharmony_ci __u8 space_not_available:1; 41162306a36Sopenharmony_ci __u8 ese:1; 41262306a36Sopenharmony_ci __u8 unused:5; 41362306a36Sopenharmony_ci } __packed vol_info; 41462306a36Sopenharmony_ci __u8 unused1; 41562306a36Sopenharmony_ci __u16 extent_pool_id; 41662306a36Sopenharmony_ci __u8 warn_cap_limit; 41762306a36Sopenharmony_ci __u8 warn_cap_guaranteed; 41862306a36Sopenharmony_ci __u16 unused2; 41962306a36Sopenharmony_ci __u32 limit_capacity; 42062306a36Sopenharmony_ci __u32 guaranteed_capacity; 42162306a36Sopenharmony_ci __u32 space_allocated; 42262306a36Sopenharmony_ci __u32 space_configured; 42362306a36Sopenharmony_ci __u32 logical_capacity; 42462306a36Sopenharmony_ci} __packed; 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_ci/* 42762306a36Sopenharmony_ci * Extent Pool Summary 42862306a36Sopenharmony_ci */ 42962306a36Sopenharmony_cistruct dasd_ext_pool_sum { 43062306a36Sopenharmony_ci __u16 pool_id; 43162306a36Sopenharmony_ci __u8 repo_warn_thrshld; 43262306a36Sopenharmony_ci __u8 warn_thrshld; 43362306a36Sopenharmony_ci struct { 43462306a36Sopenharmony_ci __u8 type:1; /* 0 - CKD / 1 - FB */ 43562306a36Sopenharmony_ci __u8 track_space_efficient:1; 43662306a36Sopenharmony_ci __u8 extent_space_efficient:1; 43762306a36Sopenharmony_ci __u8 standard_volume:1; 43862306a36Sopenharmony_ci __u8 extent_size_valid:1; 43962306a36Sopenharmony_ci __u8 capacity_at_warnlevel:1; 44062306a36Sopenharmony_ci __u8 pool_oos:1; 44162306a36Sopenharmony_ci __u8 unused0:1; 44262306a36Sopenharmony_ci __u8 unused1; 44362306a36Sopenharmony_ci } __packed flags; 44462306a36Sopenharmony_ci struct { 44562306a36Sopenharmony_ci __u8 reserved0:1; 44662306a36Sopenharmony_ci __u8 size_1G:1; 44762306a36Sopenharmony_ci __u8 reserved1:5; 44862306a36Sopenharmony_ci __u8 size_16M:1; 44962306a36Sopenharmony_ci } __packed extent_size; 45062306a36Sopenharmony_ci __u8 unused; 45162306a36Sopenharmony_ci} __packed; 45262306a36Sopenharmony_ci 45362306a36Sopenharmony_ci/* 45462306a36Sopenharmony_ci * Read Subsystem Data-Response - Logical Configuration Query - Header 45562306a36Sopenharmony_ci */ 45662306a36Sopenharmony_cistruct dasd_rssd_lcq { 45762306a36Sopenharmony_ci __u16 data_length; /* Length of data returned */ 45862306a36Sopenharmony_ci __u16 pool_count; /* Count of extent pools returned - Max: 448 */ 45962306a36Sopenharmony_ci struct { 46062306a36Sopenharmony_ci __u8 pool_info_valid:1; /* Detailed Information valid */ 46162306a36Sopenharmony_ci __u8 pool_id_volume:1; 46262306a36Sopenharmony_ci __u8 pool_id_cec:1; 46362306a36Sopenharmony_ci __u8 unused0:5; 46462306a36Sopenharmony_ci __u8 unused1; 46562306a36Sopenharmony_ci } __packed header_flags; 46662306a36Sopenharmony_ci char sfi_type[6]; /* Storage Facility Image Type (EBCDIC) */ 46762306a36Sopenharmony_ci char sfi_model[3]; /* Storage Facility Image Model (EBCDIC) */ 46862306a36Sopenharmony_ci __u8 sfi_seq_num[10]; /* Storage Facility Image Sequence Number */ 46962306a36Sopenharmony_ci __u8 reserved[7]; 47062306a36Sopenharmony_ci struct dasd_ext_pool_sum ext_pool_sum[448]; 47162306a36Sopenharmony_ci} __packed; 47262306a36Sopenharmony_ci 47362306a36Sopenharmony_cistruct dasd_oos_message { 47462306a36Sopenharmony_ci __u16 length; 47562306a36Sopenharmony_ci __u8 format; 47662306a36Sopenharmony_ci __u8 code; 47762306a36Sopenharmony_ci __u8 percentage_empty; 47862306a36Sopenharmony_ci __u8 reserved; 47962306a36Sopenharmony_ci __u16 ext_pool_id; 48062306a36Sopenharmony_ci __u16 token; 48162306a36Sopenharmony_ci __u8 unused[6]; 48262306a36Sopenharmony_ci} __packed; 48362306a36Sopenharmony_ci 48462306a36Sopenharmony_cistruct dasd_cuir_message { 48562306a36Sopenharmony_ci __u16 length; 48662306a36Sopenharmony_ci __u8 format; 48762306a36Sopenharmony_ci __u8 code; 48862306a36Sopenharmony_ci __u32 message_id; 48962306a36Sopenharmony_ci __u8 flags; 49062306a36Sopenharmony_ci __u8 neq_map[3]; 49162306a36Sopenharmony_ci __u8 ned_map; 49262306a36Sopenharmony_ci __u8 record_selector; 49362306a36Sopenharmony_ci} __packed; 49462306a36Sopenharmony_ci 49562306a36Sopenharmony_cistruct dasd_psf_cuir_response { 49662306a36Sopenharmony_ci __u8 order; 49762306a36Sopenharmony_ci __u8 flags; 49862306a36Sopenharmony_ci __u8 cc; 49962306a36Sopenharmony_ci __u8 chpid; 50062306a36Sopenharmony_ci __u16 device_nr; 50162306a36Sopenharmony_ci __u16 reserved; 50262306a36Sopenharmony_ci __u32 message_id; 50362306a36Sopenharmony_ci __u64 system_id; 50462306a36Sopenharmony_ci __u8 cssid; 50562306a36Sopenharmony_ci __u8 ssid; 50662306a36Sopenharmony_ci} __packed; 50762306a36Sopenharmony_ci 50862306a36Sopenharmony_cistruct dasd_ckd_path_group_entry { 50962306a36Sopenharmony_ci __u8 status_flags; 51062306a36Sopenharmony_ci __u8 pgid[11]; 51162306a36Sopenharmony_ci __u8 sysplex_name[8]; 51262306a36Sopenharmony_ci __u32 timestamp; 51362306a36Sopenharmony_ci __u32 cylinder; 51462306a36Sopenharmony_ci __u8 reserved[4]; 51562306a36Sopenharmony_ci} __packed; 51662306a36Sopenharmony_ci 51762306a36Sopenharmony_cistruct dasd_ckd_host_information { 51862306a36Sopenharmony_ci __u8 access_flags; 51962306a36Sopenharmony_ci __u8 entry_size; 52062306a36Sopenharmony_ci __u16 entry_count; 52162306a36Sopenharmony_ci __u8 entry[16390]; 52262306a36Sopenharmony_ci} __packed; 52362306a36Sopenharmony_ci 52462306a36Sopenharmony_cistruct dasd_psf_query_host_access { 52562306a36Sopenharmony_ci __u8 access_flag; 52662306a36Sopenharmony_ci __u8 version; 52762306a36Sopenharmony_ci __u16 CKD_length; 52862306a36Sopenharmony_ci __u16 SCSI_length; 52962306a36Sopenharmony_ci __u8 unused[10]; 53062306a36Sopenharmony_ci __u8 host_access_information[16394]; 53162306a36Sopenharmony_ci} __packed; 53262306a36Sopenharmony_ci 53362306a36Sopenharmony_ci/* 53462306a36Sopenharmony_ci * Perform Subsystem Function - Prepare for Read Subsystem Data 53562306a36Sopenharmony_ci */ 53662306a36Sopenharmony_cistruct dasd_psf_prssd_data { 53762306a36Sopenharmony_ci unsigned char order; 53862306a36Sopenharmony_ci unsigned char flags; 53962306a36Sopenharmony_ci unsigned char reserved1; 54062306a36Sopenharmony_ci unsigned char reserved2; 54162306a36Sopenharmony_ci unsigned char lss; 54262306a36Sopenharmony_ci unsigned char volume; 54362306a36Sopenharmony_ci unsigned char suborder; 54462306a36Sopenharmony_ci unsigned char varies[5]; 54562306a36Sopenharmony_ci} __attribute__ ((packed)); 54662306a36Sopenharmony_ci 54762306a36Sopenharmony_ci/* 54862306a36Sopenharmony_ci * Perform Subsystem Function - Set Subsystem Characteristics 54962306a36Sopenharmony_ci */ 55062306a36Sopenharmony_cistruct dasd_psf_ssc_data { 55162306a36Sopenharmony_ci unsigned char order; 55262306a36Sopenharmony_ci unsigned char flags; 55362306a36Sopenharmony_ci unsigned char cu_type[4]; 55462306a36Sopenharmony_ci unsigned char suborder; 55562306a36Sopenharmony_ci unsigned char reserved[59]; 55662306a36Sopenharmony_ci} __attribute__((packed)); 55762306a36Sopenharmony_ci 55862306a36Sopenharmony_ci/* Maximum number of extents for a single Release Allocated Space command */ 55962306a36Sopenharmony_ci#define DASD_ECKD_RAS_EXTS_MAX 110U 56062306a36Sopenharmony_ci 56162306a36Sopenharmony_cistruct dasd_dso_ras_ext_range { 56262306a36Sopenharmony_ci struct ch_t beg_ext; 56362306a36Sopenharmony_ci struct ch_t end_ext; 56462306a36Sopenharmony_ci} __packed; 56562306a36Sopenharmony_ci 56662306a36Sopenharmony_ci/* 56762306a36Sopenharmony_ci * Define Subsystem Operation - Release Allocated Space 56862306a36Sopenharmony_ci */ 56962306a36Sopenharmony_cistruct dasd_dso_ras_data { 57062306a36Sopenharmony_ci __u8 order; 57162306a36Sopenharmony_ci struct { 57262306a36Sopenharmony_ci __u8 message:1; /* Must be zero */ 57362306a36Sopenharmony_ci __u8 reserved1:2; 57462306a36Sopenharmony_ci __u8 vol_type:1; /* 0 - CKD/FBA, 1 - FB */ 57562306a36Sopenharmony_ci __u8 reserved2:4; 57662306a36Sopenharmony_ci } __packed flags; 57762306a36Sopenharmony_ci /* Operation Flags to specify scope */ 57862306a36Sopenharmony_ci struct { 57962306a36Sopenharmony_ci __u8 reserved1:2; 58062306a36Sopenharmony_ci /* Release Space by Extent */ 58162306a36Sopenharmony_ci __u8 by_extent:1; /* 0 - entire volume, 1 - specified extents */ 58262306a36Sopenharmony_ci __u8 guarantee_init:1; 58362306a36Sopenharmony_ci __u8 force_release:1; /* Internal - will be ignored */ 58462306a36Sopenharmony_ci __u16 reserved2:11; 58562306a36Sopenharmony_ci } __packed op_flags; 58662306a36Sopenharmony_ci __u8 lss; 58762306a36Sopenharmony_ci __u8 dev_addr; 58862306a36Sopenharmony_ci __u32 reserved1; 58962306a36Sopenharmony_ci __u8 reserved2[10]; 59062306a36Sopenharmony_ci __u16 nr_exts; /* Defines number of ext_scope - max 110 */ 59162306a36Sopenharmony_ci __u16 reserved3; 59262306a36Sopenharmony_ci} __packed; 59362306a36Sopenharmony_ci 59462306a36Sopenharmony_ci 59562306a36Sopenharmony_ci/* 59662306a36Sopenharmony_ci * some structures and definitions for alias handling 59762306a36Sopenharmony_ci */ 59862306a36Sopenharmony_cistruct dasd_unit_address_configuration { 59962306a36Sopenharmony_ci struct { 60062306a36Sopenharmony_ci char ua_type; 60162306a36Sopenharmony_ci char base_ua; 60262306a36Sopenharmony_ci } unit[256]; 60362306a36Sopenharmony_ci} __attribute__((packed)); 60462306a36Sopenharmony_ci 60562306a36Sopenharmony_ci 60662306a36Sopenharmony_ci#define MAX_DEVICES_PER_LCU 256 60762306a36Sopenharmony_ci 60862306a36Sopenharmony_ci/* flags on the LCU */ 60962306a36Sopenharmony_ci#define NEED_UAC_UPDATE 0x01 61062306a36Sopenharmony_ci#define UPDATE_PENDING 0x02 61162306a36Sopenharmony_ci 61262306a36Sopenharmony_cienum pavtype {NO_PAV, BASE_PAV, HYPER_PAV}; 61362306a36Sopenharmony_ci 61462306a36Sopenharmony_ci 61562306a36Sopenharmony_cistruct alias_root { 61662306a36Sopenharmony_ci struct list_head serverlist; 61762306a36Sopenharmony_ci spinlock_t lock; 61862306a36Sopenharmony_ci}; 61962306a36Sopenharmony_ci 62062306a36Sopenharmony_cistruct alias_server { 62162306a36Sopenharmony_ci struct list_head server; 62262306a36Sopenharmony_ci struct dasd_uid uid; 62362306a36Sopenharmony_ci struct list_head lculist; 62462306a36Sopenharmony_ci}; 62562306a36Sopenharmony_ci 62662306a36Sopenharmony_cistruct summary_unit_check_work_data { 62762306a36Sopenharmony_ci char reason; 62862306a36Sopenharmony_ci struct dasd_device *device; 62962306a36Sopenharmony_ci struct work_struct worker; 63062306a36Sopenharmony_ci}; 63162306a36Sopenharmony_ci 63262306a36Sopenharmony_cistruct read_uac_work_data { 63362306a36Sopenharmony_ci struct dasd_device *device; 63462306a36Sopenharmony_ci struct delayed_work dwork; 63562306a36Sopenharmony_ci}; 63662306a36Sopenharmony_ci 63762306a36Sopenharmony_cistruct alias_lcu { 63862306a36Sopenharmony_ci struct list_head lcu; 63962306a36Sopenharmony_ci struct dasd_uid uid; 64062306a36Sopenharmony_ci enum pavtype pav; 64162306a36Sopenharmony_ci char flags; 64262306a36Sopenharmony_ci spinlock_t lock; 64362306a36Sopenharmony_ci struct list_head grouplist; 64462306a36Sopenharmony_ci struct list_head active_devices; 64562306a36Sopenharmony_ci struct list_head inactive_devices; 64662306a36Sopenharmony_ci struct dasd_unit_address_configuration *uac; 64762306a36Sopenharmony_ci struct summary_unit_check_work_data suc_data; 64862306a36Sopenharmony_ci struct read_uac_work_data ruac_data; 64962306a36Sopenharmony_ci struct dasd_ccw_req *rsu_cqr; 65062306a36Sopenharmony_ci struct completion lcu_setup; 65162306a36Sopenharmony_ci}; 65262306a36Sopenharmony_ci 65362306a36Sopenharmony_cistruct alias_pav_group { 65462306a36Sopenharmony_ci struct list_head group; 65562306a36Sopenharmony_ci struct dasd_uid uid; 65662306a36Sopenharmony_ci struct alias_lcu *lcu; 65762306a36Sopenharmony_ci struct list_head baselist; 65862306a36Sopenharmony_ci struct list_head aliaslist; 65962306a36Sopenharmony_ci struct dasd_device *next; 66062306a36Sopenharmony_ci}; 66162306a36Sopenharmony_ci 66262306a36Sopenharmony_cistruct dasd_conf_data { 66362306a36Sopenharmony_ci struct dasd_ned neds[5]; 66462306a36Sopenharmony_ci u8 reserved[64]; 66562306a36Sopenharmony_ci struct dasd_gneq gneq; 66662306a36Sopenharmony_ci} __packed; 66762306a36Sopenharmony_ci 66862306a36Sopenharmony_cistruct dasd_conf { 66962306a36Sopenharmony_ci u8 *data; 67062306a36Sopenharmony_ci int len; 67162306a36Sopenharmony_ci /* pointers to specific parts in the conf_data */ 67262306a36Sopenharmony_ci struct dasd_ned *ned; 67362306a36Sopenharmony_ci struct dasd_sneq *sneq; 67462306a36Sopenharmony_ci struct vd_sneq *vdsneq; 67562306a36Sopenharmony_ci struct dasd_gneq *gneq; 67662306a36Sopenharmony_ci}; 67762306a36Sopenharmony_ci 67862306a36Sopenharmony_cistruct dasd_eckd_private { 67962306a36Sopenharmony_ci struct dasd_eckd_characteristics rdc_data; 68062306a36Sopenharmony_ci struct dasd_conf conf; 68162306a36Sopenharmony_ci 68262306a36Sopenharmony_ci struct eckd_count count_area[5]; 68362306a36Sopenharmony_ci int init_cqr_status; 68462306a36Sopenharmony_ci int uses_cdl; 68562306a36Sopenharmony_ci struct attrib_data_t attrib; /* e.g. cache operations */ 68662306a36Sopenharmony_ci struct dasd_rssd_features features; 68762306a36Sopenharmony_ci struct dasd_rssd_vsq vsq; 68862306a36Sopenharmony_ci struct dasd_ext_pool_sum eps; 68962306a36Sopenharmony_ci u32 real_cyl; 69062306a36Sopenharmony_ci 69162306a36Sopenharmony_ci /* alias management */ 69262306a36Sopenharmony_ci struct dasd_uid uid; 69362306a36Sopenharmony_ci struct alias_pav_group *pavgroup; 69462306a36Sopenharmony_ci struct alias_lcu *lcu; 69562306a36Sopenharmony_ci int count; 69662306a36Sopenharmony_ci 69762306a36Sopenharmony_ci u32 fcx_max_data; 69862306a36Sopenharmony_ci char suc_reason; 69962306a36Sopenharmony_ci}; 70062306a36Sopenharmony_ci 70162306a36Sopenharmony_ci 70262306a36Sopenharmony_ci 70362306a36Sopenharmony_ciint dasd_alias_make_device_known_to_lcu(struct dasd_device *); 70462306a36Sopenharmony_civoid dasd_alias_disconnect_device_from_lcu(struct dasd_device *); 70562306a36Sopenharmony_ciint dasd_alias_add_device(struct dasd_device *); 70662306a36Sopenharmony_ciint dasd_alias_remove_device(struct dasd_device *); 70762306a36Sopenharmony_cistruct dasd_device *dasd_alias_get_start_dev(struct dasd_device *); 70862306a36Sopenharmony_civoid dasd_alias_handle_summary_unit_check(struct work_struct *); 70962306a36Sopenharmony_civoid dasd_eckd_reset_ccw_to_base_io(struct dasd_ccw_req *); 71062306a36Sopenharmony_ciint dasd_alias_update_add_device(struct dasd_device *); 71162306a36Sopenharmony_ci#endif /* DASD_ECKD_H */ 712