1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 21da177e4SLinus Torvalds /* 31da177e4SLinus Torvalds * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com> 41da177e4SLinus Torvalds * Horst Hummel <Horst.Hummel@de.ibm.com> 51da177e4SLinus Torvalds * Bugreports.to..: <Linux390@de.ibm.com> 6a53c8fabSHeiko Carstens * Copyright IBM Corp. 1999, 2000 71da177e4SLinus Torvalds * 81da177e4SLinus Torvalds */ 91da177e4SLinus Torvalds 101da177e4SLinus Torvalds #ifndef DASD_ECKD_H 111da177e4SLinus Torvalds #define DASD_ECKD_H 121da177e4SLinus Torvalds 131da177e4SLinus Torvalds /***************************************************************************** 141da177e4SLinus Torvalds * SECTION: CCW Definitions 151da177e4SLinus Torvalds ****************************************************************************/ 16*32ff8ce0SStefan Haberland #define DASD_ECKD_CCW_NOP 0x03 171da177e4SLinus Torvalds #define DASD_ECKD_CCW_WRITE 0x05 181da177e4SLinus Torvalds #define DASD_ECKD_CCW_READ 0x06 191da177e4SLinus Torvalds #define DASD_ECKD_CCW_WRITE_HOME_ADDRESS 0x09 201da177e4SLinus Torvalds #define DASD_ECKD_CCW_READ_HOME_ADDRESS 0x0a 211da177e4SLinus Torvalds #define DASD_ECKD_CCW_WRITE_KD 0x0d 221da177e4SLinus Torvalds #define DASD_ECKD_CCW_READ_KD 0x0e 231da177e4SLinus Torvalds #define DASD_ECKD_CCW_ERASE 0x11 241da177e4SLinus Torvalds #define DASD_ECKD_CCW_READ_COUNT 0x12 251da177e4SLinus Torvalds #define DASD_ECKD_CCW_SLCK 0x14 261da177e4SLinus Torvalds #define DASD_ECKD_CCW_WRITE_RECORD_ZERO 0x15 271da177e4SLinus Torvalds #define DASD_ECKD_CCW_READ_RECORD_ZERO 0x16 281da177e4SLinus Torvalds #define DASD_ECKD_CCW_WRITE_CKD 0x1d 291da177e4SLinus Torvalds #define DASD_ECKD_CCW_READ_CKD 0x1e 301da177e4SLinus Torvalds #define DASD_ECKD_CCW_PSF 0x27 31196339f1SStefan Weinhuber #define DASD_ECKD_CCW_SNID 0x34 321da177e4SLinus Torvalds #define DASD_ECKD_CCW_RSSD 0x3e 331da177e4SLinus Torvalds #define DASD_ECKD_CCW_LOCATE_RECORD 0x47 3445f186beSJan Höppner #define DASD_ECKD_CCW_LOCATE_RECORD_EXT 0x4b 3520c64468SStefan Weinhuber #define DASD_ECKD_CCW_SNSS 0x54 361da177e4SLinus Torvalds #define DASD_ECKD_CCW_DEFINE_EXTENT 0x63 371da177e4SLinus Torvalds #define DASD_ECKD_CCW_WRITE_MT 0x85 381da177e4SLinus Torvalds #define DASD_ECKD_CCW_READ_MT 0x86 391da177e4SLinus Torvalds #define DASD_ECKD_CCW_WRITE_KD_MT 0x8d 401da177e4SLinus Torvalds #define DASD_ECKD_CCW_READ_KD_MT 0x8e 418fd57520SJan Höppner #define DASD_ECKD_CCW_READ_COUNT_MT 0x92 421da177e4SLinus Torvalds #define DASD_ECKD_CCW_RELEASE 0x94 43e4dbb0f2SStefan Haberland #define DASD_ECKD_CCW_WRITE_FULL_TRACK 0x95 441da177e4SLinus Torvalds #define DASD_ECKD_CCW_READ_CKD_MT 0x9e 451da177e4SLinus Torvalds #define DASD_ECKD_CCW_WRITE_CKD_MT 0x9d 46f3eb5384SStefan Weinhuber #define DASD_ECKD_CCW_WRITE_TRACK_DATA 0xA5 47f3eb5384SStefan Weinhuber #define DASD_ECKD_CCW_READ_TRACK_DATA 0xA6 481da177e4SLinus Torvalds #define DASD_ECKD_CCW_RESERVE 0xB4 49e4dbb0f2SStefan Haberland #define DASD_ECKD_CCW_READ_TRACK 0xDE 508e09f215SStefan Weinhuber #define DASD_ECKD_CCW_PFX 0xE7 51f3eb5384SStefan Weinhuber #define DASD_ECKD_CCW_PFX_READ 0xEA 528e09f215SStefan Weinhuber #define DASD_ECKD_CCW_RSCK 0xF9 53a4d26c6aSStefan Weinhuber #define DASD_ECKD_CCW_RCD 0xFA 5491dc4a19SJan Höppner #define DASD_ECKD_CCW_DSO 0xF7 5591dc4a19SJan Höppner 56be4f361dSBhaskar Chowdhury /* Define Subsystem Function / Orders */ 5791dc4a19SJan Höppner #define DSO_ORDER_RAS 0x81 581da177e4SLinus Torvalds 591da177e4SLinus Torvalds /* 60461db0eaSJan Höppner * Perform Subsystem Function / Orders 611da177e4SLinus Torvalds */ 621da177e4SLinus Torvalds #define PSF_ORDER_PRSSD 0x18 635db8440cSStefan Haberland #define PSF_ORDER_CUIR_RESPONSE 0x1A 6440545573SHorst Hummel #define PSF_ORDER_SSC 0x1D 651da177e4SLinus Torvalds 66b44b0ab3SStefan Weinhuber /* 67461db0eaSJan Höppner * Perform Subsystem Function / Sub-Orders 68461db0eaSJan Höppner */ 69461db0eaSJan Höppner #define PSF_SUBORDER_QHA 0x1C /* Query Host Access */ 703f217cceSStefan Haberland #define PSF_SUBORDER_PPRCEQ 0x50 /* PPRC Extended Query */ 71c729696bSJan Höppner #define PSF_SUBORDER_VSQ 0x52 /* Volume Storage Query */ 72c729696bSJan Höppner #define PSF_SUBORDER_LCQ 0x53 /* Logical Configuration Query */ 73461db0eaSJan Höppner 74461db0eaSJan Höppner /* 753f217cceSStefan Haberland * PPRC Extended Query Scopes 763f217cceSStefan Haberland */ 773f217cceSStefan Haberland #define PPRCEQ_SCOPE_4 0x04 /* Scope 4 for PPRC Extended Query */ 783f217cceSStefan Haberland 793f217cceSStefan Haberland /* 805db8440cSStefan Haberland * CUIR response condition codes 815db8440cSStefan Haberland */ 825db8440cSStefan Haberland #define PSF_CUIR_INVALID 0x00 835db8440cSStefan Haberland #define PSF_CUIR_COMPLETED 0x01 845db8440cSStefan Haberland #define PSF_CUIR_NOT_SUPPORTED 0x02 855db8440cSStefan Haberland #define PSF_CUIR_ERROR_IN_REQ 0x03 865db8440cSStefan Haberland #define PSF_CUIR_DENIED 0x04 875db8440cSStefan Haberland #define PSF_CUIR_LAST_PATH 0x05 885db8440cSStefan Haberland #define PSF_CUIR_DEVICE_ONLINE 0x06 895db8440cSStefan Haberland #define PSF_CUIR_VARY_FAILURE 0x07 905db8440cSStefan Haberland #define PSF_CUIR_SOFTWARE_FAILURE 0x08 915db8440cSStefan Haberland #define PSF_CUIR_NOT_RECOGNIZED 0x09 925db8440cSStefan Haberland 935db8440cSStefan Haberland /* 945db8440cSStefan Haberland * CUIR codes 955db8440cSStefan Haberland */ 965db8440cSStefan Haberland #define CUIR_QUIESCE 0x01 975db8440cSStefan Haberland #define CUIR_RESUME 0x02 985db8440cSStefan Haberland 995db8440cSStefan Haberland /* 1009e12e54cSJan Höppner * Out-of-space (OOS) Codes 1019e12e54cSJan Höppner */ 1029e12e54cSJan Höppner #define REPO_WARN 0x01 1039e12e54cSJan Höppner #define REPO_EXHAUST 0x02 1049e12e54cSJan Höppner #define POOL_WARN 0x03 1059e12e54cSJan Höppner #define POOL_EXHAUST 0x04 1069e12e54cSJan Höppner #define REPO_RELIEVE 0x05 1079e12e54cSJan Höppner #define POOL_RELIEVE 0x06 1089e12e54cSJan Höppner 1099e12e54cSJan Höppner /* 1105db8440cSStefan Haberland * attention message definitions 1115db8440cSStefan Haberland */ 1125db8440cSStefan Haberland #define ATTENTION_LENGTH_CUIR 0x0e 1135db8440cSStefan Haberland #define ATTENTION_FORMAT_CUIR 0x01 1149e12e54cSJan Höppner #define ATTENTION_LENGTH_OOS 0x10 1159e12e54cSJan Höppner #define ATTENTION_FORMAT_OOS 0x06 1165db8440cSStefan Haberland 1175a3b7b11SStefan Haberland #define DASD_ECKD_PG_GROUPED 0x10 1185a3b7b11SStefan Haberland 1195db8440cSStefan Haberland /* 120be4f361dSBhaskar Chowdhury * Size that is reported for large volumes in the old 16-bit no_cyl field 121b44b0ab3SStefan Weinhuber */ 122b44b0ab3SStefan Weinhuber #define LV_COMPAT_CYL 0xFFFE 123b44b0ab3SStefan Weinhuber 124ef19298bSStefan Weinhuber 125ef19298bSStefan Weinhuber #define FCX_MAX_DATA_FACTOR 65536 126a4d26c6aSStefan Weinhuber #define DASD_ECKD_RCD_DATA_SIZE 256 127ef19298bSStefan Weinhuber 128a521b048SStefan Haberland #define DASD_ECKD_PATH_THRHLD 256 129a521b048SStefan Haberland #define DASD_ECKD_PATH_INTERVAL 300 130ef19298bSStefan Weinhuber 131a0610a8aSJan Höppner /* 132a0610a8aSJan Höppner * Maximum number of blocks to be chained 133a0610a8aSJan Höppner */ 134a0610a8aSJan Höppner #define DASD_ECKD_MAX_BLOCKS 190 135a0610a8aSJan Höppner #define DASD_ECKD_MAX_BLOCKS_RAW 256 136a0610a8aSJan Höppner 1371da177e4SLinus Torvalds /***************************************************************************** 1381da177e4SLinus Torvalds * SECTION: Type Definitions 1391da177e4SLinus Torvalds ****************************************************************************/ 1401da177e4SLinus Torvalds 1411da177e4SLinus Torvalds struct eckd_count { 1421da177e4SLinus Torvalds __u16 cyl; 1431da177e4SLinus Torvalds __u16 head; 1441da177e4SLinus Torvalds __u8 record; 1451da177e4SLinus Torvalds __u8 kl; 1461da177e4SLinus Torvalds __u16 dl; 1471da177e4SLinus Torvalds } __attribute__ ((packed)); 1481da177e4SLinus Torvalds 1491da177e4SLinus Torvalds struct ch_t { 1501da177e4SLinus Torvalds __u16 cyl; 1511da177e4SLinus Torvalds __u16 head; 1521da177e4SLinus Torvalds } __attribute__ ((packed)); 1531da177e4SLinus Torvalds 1541da177e4SLinus Torvalds struct chr_t { 1551da177e4SLinus Torvalds __u16 cyl; 1561da177e4SLinus Torvalds __u16 head; 1571da177e4SLinus Torvalds __u8 record; 1581da177e4SLinus Torvalds } __attribute__ ((packed)); 1591da177e4SLinus Torvalds 1601da177e4SLinus Torvalds struct DE_eckd_data { 1611da177e4SLinus Torvalds struct { 1621da177e4SLinus Torvalds unsigned char perm:2; /* Permissions on this extent */ 1631da177e4SLinus Torvalds unsigned char reserved:1; 1641da177e4SLinus Torvalds unsigned char seek:2; /* Seek control */ 1651da177e4SLinus Torvalds unsigned char auth:2; /* Access authorization */ 1661da177e4SLinus Torvalds unsigned char pci:1; /* PCI Fetch mode */ 1671da177e4SLinus Torvalds } __attribute__ ((packed)) mask; 1681da177e4SLinus Torvalds struct { 1691da177e4SLinus Torvalds unsigned char mode:2; /* Architecture mode */ 1701da177e4SLinus Torvalds unsigned char ckd:1; /* CKD Conversion */ 1711da177e4SLinus Torvalds unsigned char operation:3; /* Operation mode */ 1721da177e4SLinus Torvalds unsigned char cfw:1; /* Cache fast write */ 1731da177e4SLinus Torvalds unsigned char dfw:1; /* DASD fast write */ 1741da177e4SLinus Torvalds } __attribute__ ((packed)) attributes; 1751da177e4SLinus Torvalds __u16 blk_size; /* Blocksize */ 1761da177e4SLinus Torvalds __u16 fast_write_id; 1771da177e4SLinus Torvalds __u8 ga_additional; /* Global Attributes Additional */ 1781da177e4SLinus Torvalds __u8 ga_extended; /* Global Attributes Extended */ 1791da177e4SLinus Torvalds struct ch_t beg_ext; 1801da177e4SLinus Torvalds struct ch_t end_ext; 1817bf76f01SJan Höppner unsigned long ep_sys_time; /* Ext Parameter - System Time Stamp */ 1821da177e4SLinus Torvalds __u8 ep_format; /* Extended Parameter format byte */ 1831da177e4SLinus Torvalds __u8 ep_prio; /* Extended Parameter priority I/O byte */ 184f3eb5384SStefan Weinhuber __u8 ep_reserved1; /* Extended Parameter Reserved */ 185f3eb5384SStefan Weinhuber __u8 ep_rec_per_track; /* Number of records on a track */ 186f3eb5384SStefan Weinhuber __u8 ep_reserved[4]; /* Extended Parameter Reserved */ 1871da177e4SLinus Torvalds } __attribute__ ((packed)); 1881da177e4SLinus Torvalds 1891da177e4SLinus Torvalds struct LO_eckd_data { 1901da177e4SLinus Torvalds struct { 1911da177e4SLinus Torvalds unsigned char orientation:2; 1921da177e4SLinus Torvalds unsigned char operation:6; 1931da177e4SLinus Torvalds } __attribute__ ((packed)) operation; 1941da177e4SLinus Torvalds struct { 1951da177e4SLinus Torvalds unsigned char last_bytes_used:1; 1961da177e4SLinus Torvalds unsigned char reserved:6; 1971da177e4SLinus Torvalds unsigned char read_count_suffix:1; 1981da177e4SLinus Torvalds } __attribute__ ((packed)) auxiliary; 1991da177e4SLinus Torvalds __u8 unused; 2001da177e4SLinus Torvalds __u8 count; 2011da177e4SLinus Torvalds struct ch_t seek_addr; 2021da177e4SLinus Torvalds struct chr_t search_arg; 2031da177e4SLinus Torvalds __u8 sector; 2041da177e4SLinus Torvalds __u16 length; 2051da177e4SLinus Torvalds } __attribute__ ((packed)); 2061da177e4SLinus Torvalds 207f3eb5384SStefan Weinhuber struct LRE_eckd_data { 208f3eb5384SStefan Weinhuber struct { 209f3eb5384SStefan Weinhuber unsigned char orientation:2; 210f3eb5384SStefan Weinhuber unsigned char operation:6; 211f3eb5384SStefan Weinhuber } __attribute__ ((packed)) operation; 212f3eb5384SStefan Weinhuber struct { 213f3eb5384SStefan Weinhuber unsigned char length_valid:1; 214f3eb5384SStefan Weinhuber unsigned char length_scope:1; 215f3eb5384SStefan Weinhuber unsigned char imbedded_ccw_valid:1; 216f3eb5384SStefan Weinhuber unsigned char check_bytes:2; 217f3eb5384SStefan Weinhuber unsigned char imbedded_count_valid:1; 218f3eb5384SStefan Weinhuber unsigned char reserved:1; 219f3eb5384SStefan Weinhuber unsigned char read_count_suffix:1; 220f3eb5384SStefan Weinhuber } __attribute__ ((packed)) auxiliary; 221f3eb5384SStefan Weinhuber __u8 imbedded_ccw; 222f3eb5384SStefan Weinhuber __u8 count; 223f3eb5384SStefan Weinhuber struct ch_t seek_addr; 224f3eb5384SStefan Weinhuber struct chr_t search_arg; 225f3eb5384SStefan Weinhuber __u8 sector; 226f3eb5384SStefan Weinhuber __u16 length; 227f3eb5384SStefan Weinhuber __u8 imbedded_count; 228f3eb5384SStefan Weinhuber __u8 extended_operation; 229f3eb5384SStefan Weinhuber __u16 extended_parameter_length; 230fa226f1dSGustavo A. R. Silva __u8 extended_parameter[]; 231f3eb5384SStefan Weinhuber } __attribute__ ((packed)); 232f3eb5384SStefan Weinhuber 2338e09f215SStefan Weinhuber /* Prefix data for format 0x00 and 0x01 */ 2348e09f215SStefan Weinhuber struct PFX_eckd_data { 2358e09f215SStefan Weinhuber unsigned char format; 2368e09f215SStefan Weinhuber struct { 237f3eb5384SStefan Weinhuber unsigned char define_extent:1; 2388e09f215SStefan Weinhuber unsigned char time_stamp:1; 2398e09f215SStefan Weinhuber unsigned char verify_base:1; 2408e09f215SStefan Weinhuber unsigned char hyper_pav:1; 2418e09f215SStefan Weinhuber unsigned char reserved:4; 2428e09f215SStefan Weinhuber } __attribute__ ((packed)) validity; 2438e09f215SStefan Weinhuber __u8 base_address; 2448e09f215SStefan Weinhuber __u8 aux; 2458e09f215SStefan Weinhuber __u8 base_lss; 2468e09f215SStefan Weinhuber __u8 reserved[7]; 247f3eb5384SStefan Weinhuber struct DE_eckd_data define_extent; 248f3eb5384SStefan Weinhuber struct LRE_eckd_data locate_record; 2498e09f215SStefan Weinhuber } __attribute__ ((packed)); 2508e09f215SStefan Weinhuber 2511da177e4SLinus Torvalds struct dasd_eckd_characteristics { 2521da177e4SLinus Torvalds __u16 cu_type; 2531da177e4SLinus Torvalds struct { 2541da177e4SLinus Torvalds unsigned char support:2; 2551da177e4SLinus Torvalds unsigned char async:1; 2561da177e4SLinus Torvalds unsigned char reserved:1; 2571da177e4SLinus Torvalds unsigned char cache_info:1; 2581da177e4SLinus Torvalds unsigned char model:3; 2591da177e4SLinus Torvalds } __attribute__ ((packed)) cu_model; 2601da177e4SLinus Torvalds __u16 dev_type; 2611da177e4SLinus Torvalds __u8 dev_model; 2621da177e4SLinus Torvalds struct { 2631da177e4SLinus Torvalds unsigned char mult_burst:1; 2641da177e4SLinus Torvalds unsigned char RT_in_LR:1; 2651da177e4SLinus Torvalds unsigned char reserved1:1; 2661da177e4SLinus Torvalds unsigned char RD_IN_LR:1; 2671da177e4SLinus Torvalds unsigned char reserved2:4; 2681da177e4SLinus Torvalds unsigned char reserved3:8; 2691da177e4SLinus Torvalds unsigned char defect_wr:1; 2701da177e4SLinus Torvalds unsigned char XRC_supported:1; 271a91ff09dSStefan Haberland unsigned char PPRC_enabled:1; 2721da177e4SLinus Torvalds unsigned char striping:1; 2731da177e4SLinus Torvalds unsigned char reserved5:4; 2741da177e4SLinus Torvalds unsigned char cfw:1; 2751da177e4SLinus Torvalds unsigned char reserved6:2; 2761da177e4SLinus Torvalds unsigned char cache:1; 2771da177e4SLinus Torvalds unsigned char dual_copy:1; 2781da177e4SLinus Torvalds unsigned char dfw:1; 2791da177e4SLinus Torvalds unsigned char reset_alleg:1; 2801da177e4SLinus Torvalds unsigned char sense_down:1; 2811da177e4SLinus Torvalds } __attribute__ ((packed)) facilities; 2821da177e4SLinus Torvalds __u8 dev_class; 2831da177e4SLinus Torvalds __u8 unit_type; 2841da177e4SLinus Torvalds __u16 no_cyl; 2851da177e4SLinus Torvalds __u16 trk_per_cyl; 2861da177e4SLinus Torvalds __u8 sec_per_trk; 2871da177e4SLinus Torvalds __u8 byte_per_track[3]; 2881da177e4SLinus Torvalds __u16 home_bytes; 2891da177e4SLinus Torvalds __u8 formula; 2901da177e4SLinus Torvalds union { 2911da177e4SLinus Torvalds struct { 2921da177e4SLinus Torvalds __u8 f1; 2931da177e4SLinus Torvalds __u16 f2; 2941da177e4SLinus Torvalds __u16 f3; 2951da177e4SLinus Torvalds } __attribute__ ((packed)) f_0x01; 2961da177e4SLinus Torvalds struct { 2971da177e4SLinus Torvalds __u8 f1; 2981da177e4SLinus Torvalds __u8 f2; 2991da177e4SLinus Torvalds __u8 f3; 3001da177e4SLinus Torvalds __u8 f4; 3011da177e4SLinus Torvalds __u8 f5; 3021da177e4SLinus Torvalds } __attribute__ ((packed)) f_0x02; 3031da177e4SLinus Torvalds } __attribute__ ((packed)) factors; 3041da177e4SLinus Torvalds __u16 first_alt_trk; 3051da177e4SLinus Torvalds __u16 no_alt_trk; 3061da177e4SLinus Torvalds __u16 first_dia_trk; 3071da177e4SLinus Torvalds __u16 no_dia_trk; 3081da177e4SLinus Torvalds __u16 first_sup_trk; 3091da177e4SLinus Torvalds __u16 no_sup_trk; 3101da177e4SLinus Torvalds __u8 MDR_ID; 3111da177e4SLinus Torvalds __u8 OBR_ID; 3121da177e4SLinus Torvalds __u8 director; 3131da177e4SLinus Torvalds __u8 rd_trk_set; 3141da177e4SLinus Torvalds __u16 max_rec_zero; 3151da177e4SLinus Torvalds __u8 reserved1; 3161da177e4SLinus Torvalds __u8 RWANY_in_LR; 3171da177e4SLinus Torvalds __u8 factor6; 3181da177e4SLinus Torvalds __u8 factor7; 3191da177e4SLinus Torvalds __u8 factor8; 3201da177e4SLinus Torvalds __u8 reserved2[3]; 321b44b0ab3SStefan Weinhuber __u8 reserved3[6]; 322b44b0ab3SStefan Weinhuber __u32 long_no_cyl; 3231da177e4SLinus Torvalds } __attribute__ ((packed)); 3241da177e4SLinus Torvalds 3254abb08c2SStefan Weinhuber /* elements of the configuration data */ 3264abb08c2SStefan Weinhuber struct dasd_ned { 3271da177e4SLinus Torvalds struct { 3284abb08c2SStefan Weinhuber __u8 identifier:2; 3294abb08c2SStefan Weinhuber __u8 token_id:1; 3304abb08c2SStefan Weinhuber __u8 sno_valid:1; 3314abb08c2SStefan Weinhuber __u8 subst_sno:1; 3324abb08c2SStefan Weinhuber __u8 recNED:1; 3334abb08c2SStefan Weinhuber __u8 emuNED:1; 3344abb08c2SStefan Weinhuber __u8 reserved:1; 3351da177e4SLinus Torvalds } __attribute__ ((packed)) flags; 3361da177e4SLinus Torvalds __u8 descriptor; 3371da177e4SLinus Torvalds __u8 dev_class; 3381da177e4SLinus Torvalds __u8 reserved; 3394abb08c2SStefan Weinhuber __u8 dev_type[6]; 3404abb08c2SStefan Weinhuber __u8 dev_model[3]; 3414abb08c2SStefan Weinhuber __u8 HDA_manufacturer[3]; 3422b7a8dc0SKees Cook struct { 3434abb08c2SStefan Weinhuber __u8 HDA_location[2]; 3444abb08c2SStefan Weinhuber __u8 HDA_seqno[12]; 3452b7a8dc0SKees Cook } serial; 3463d052595SHorst Hummel __u8 ID; 3473d052595SHorst Hummel __u8 unit_addr; 3484abb08c2SStefan Weinhuber } __attribute__ ((packed)); 3494abb08c2SStefan Weinhuber 3504abb08c2SStefan Weinhuber struct dasd_sneq { 3511da177e4SLinus Torvalds struct { 3524abb08c2SStefan Weinhuber __u8 identifier:2; 3534abb08c2SStefan Weinhuber __u8 reserved:6; 3541da177e4SLinus Torvalds } __attribute__ ((packed)) flags; 3554abb08c2SStefan Weinhuber __u8 res1; 3564abb08c2SStefan Weinhuber __u16 format; 3574abb08c2SStefan Weinhuber __u8 res2[4]; /* byte 4- 7 */ 3584abb08c2SStefan Weinhuber __u8 sua_flags; /* byte 8 */ 3593d052595SHorst Hummel __u8 base_unit_addr; /* byte 9 */ 3604abb08c2SStefan Weinhuber __u8 res3[22]; /* byte 10-31 */ 3614abb08c2SStefan Weinhuber } __attribute__ ((packed)); 3624abb08c2SStefan Weinhuber 3634abb08c2SStefan Weinhuber struct vd_sneq { 3641da177e4SLinus Torvalds struct { 3654abb08c2SStefan Weinhuber __u8 identifier:2; 3664abb08c2SStefan Weinhuber __u8 reserved:6; 3671da177e4SLinus Torvalds } __attribute__ ((packed)) flags; 3684abb08c2SStefan Weinhuber __u8 res1; 3694abb08c2SStefan Weinhuber __u16 format; 3704abb08c2SStefan Weinhuber __u8 res2[4]; /* byte 4- 7 */ 3714abb08c2SStefan Weinhuber __u8 uit[16]; /* byte 8-23 */ 3724abb08c2SStefan Weinhuber __u8 res3[8]; /* byte 24-31 */ 3734abb08c2SStefan Weinhuber } __attribute__ ((packed)); 3744abb08c2SStefan Weinhuber 3754abb08c2SStefan Weinhuber struct dasd_gneq { 3761da177e4SLinus Torvalds struct { 3774abb08c2SStefan Weinhuber __u8 identifier:2; 3784abb08c2SStefan Weinhuber __u8 reserved:6; 3791da177e4SLinus Torvalds } __attribute__ ((packed)) flags; 380b179b037SStefan Haberland __u8 record_selector; 381b179b037SStefan Haberland __u8 reserved[4]; 3827c8faa86SStefan Haberland struct { 3837c8faa86SStefan Haberland __u8 value:2; 3847c8faa86SStefan Haberland __u8 number:6; 3857c8faa86SStefan Haberland } __attribute__ ((packed)) timeout; 3867c8faa86SStefan Haberland __u8 reserved3; 3871da177e4SLinus Torvalds __u16 subsystemID; 3884abb08c2SStefan Weinhuber __u8 reserved2[22]; 3891da177e4SLinus Torvalds } __attribute__ ((packed)); 3901da177e4SLinus Torvalds 3918e09f215SStefan Weinhuber struct dasd_rssd_features { 3928e09f215SStefan Weinhuber char feature[256]; 3938e09f215SStefan Weinhuber } __attribute__((packed)); 3948e09f215SStefan Weinhuber 3955db8440cSStefan Haberland struct dasd_rssd_messages { 3965db8440cSStefan Haberland __u16 length; 3975db8440cSStefan Haberland __u8 format; 3985db8440cSStefan Haberland __u8 code; 3995db8440cSStefan Haberland __u32 message_id; 4005db8440cSStefan Haberland __u8 flags; 4015db8440cSStefan Haberland char messages[4087]; 4025db8440cSStefan Haberland } __packed; 4035db8440cSStefan Haberland 404c729696bSJan Höppner /* 405c729696bSJan Höppner * Read Subsystem Data - Volume Storage Query 406c729696bSJan Höppner */ 407c729696bSJan Höppner struct dasd_rssd_vsq { 408c729696bSJan Höppner struct { 409c729696bSJan Höppner __u8 tse:1; 410c729696bSJan Höppner __u8 space_not_available:1; 411c729696bSJan Höppner __u8 ese:1; 412c729696bSJan Höppner __u8 unused:5; 413c729696bSJan Höppner } __packed vol_info; 414c729696bSJan Höppner __u8 unused1; 415c729696bSJan Höppner __u16 extent_pool_id; 416c729696bSJan Höppner __u8 warn_cap_limit; 417c729696bSJan Höppner __u8 warn_cap_guaranteed; 418c729696bSJan Höppner __u16 unused2; 419c729696bSJan Höppner __u32 limit_capacity; 420c729696bSJan Höppner __u32 guaranteed_capacity; 421c729696bSJan Höppner __u32 space_allocated; 422c729696bSJan Höppner __u32 space_configured; 423c729696bSJan Höppner __u32 logical_capacity; 424c729696bSJan Höppner } __packed; 425c729696bSJan Höppner 426c729696bSJan Höppner /* 427c729696bSJan Höppner * Extent Pool Summary 428c729696bSJan Höppner */ 429c729696bSJan Höppner struct dasd_ext_pool_sum { 430c729696bSJan Höppner __u16 pool_id; 431c729696bSJan Höppner __u8 repo_warn_thrshld; 432c729696bSJan Höppner __u8 warn_thrshld; 433c729696bSJan Höppner struct { 434c729696bSJan Höppner __u8 type:1; /* 0 - CKD / 1 - FB */ 435c729696bSJan Höppner __u8 track_space_efficient:1; 436c729696bSJan Höppner __u8 extent_space_efficient:1; 437c729696bSJan Höppner __u8 standard_volume:1; 438c729696bSJan Höppner __u8 extent_size_valid:1; 439c729696bSJan Höppner __u8 capacity_at_warnlevel:1; 440c729696bSJan Höppner __u8 pool_oos:1; 441c729696bSJan Höppner __u8 unused0:1; 442c729696bSJan Höppner __u8 unused1; 443c729696bSJan Höppner } __packed flags; 444c729696bSJan Höppner struct { 445c729696bSJan Höppner __u8 reserved0:1; 446c729696bSJan Höppner __u8 size_1G:1; 447c729696bSJan Höppner __u8 reserved1:5; 448c729696bSJan Höppner __u8 size_16M:1; 449c729696bSJan Höppner } __packed extent_size; 450c729696bSJan Höppner __u8 unused; 451c729696bSJan Höppner } __packed; 452c729696bSJan Höppner 453c729696bSJan Höppner /* 454c729696bSJan Höppner * Read Subsystem Data-Response - Logical Configuration Query - Header 455c729696bSJan Höppner */ 456c729696bSJan Höppner struct dasd_rssd_lcq { 457c729696bSJan Höppner __u16 data_length; /* Length of data returned */ 458c729696bSJan Höppner __u16 pool_count; /* Count of extent pools returned - Max: 448 */ 459c729696bSJan Höppner struct { 460c729696bSJan Höppner __u8 pool_info_valid:1; /* Detailed Information valid */ 461c729696bSJan Höppner __u8 pool_id_volume:1; 462c729696bSJan Höppner __u8 pool_id_cec:1; 463c729696bSJan Höppner __u8 unused0:5; 464c729696bSJan Höppner __u8 unused1; 465c729696bSJan Höppner } __packed header_flags; 466c729696bSJan Höppner char sfi_type[6]; /* Storage Facility Image Type (EBCDIC) */ 467c729696bSJan Höppner char sfi_model[3]; /* Storage Facility Image Model (EBCDIC) */ 468c729696bSJan Höppner __u8 sfi_seq_num[10]; /* Storage Facility Image Sequence Number */ 469c729696bSJan Höppner __u8 reserved[7]; 470c729696bSJan Höppner struct dasd_ext_pool_sum ext_pool_sum[448]; 471c729696bSJan Höppner } __packed; 472c729696bSJan Höppner 4739e12e54cSJan Höppner struct dasd_oos_message { 4749e12e54cSJan Höppner __u16 length; 4759e12e54cSJan Höppner __u8 format; 4769e12e54cSJan Höppner __u8 code; 4779e12e54cSJan Höppner __u8 percentage_empty; 4789e12e54cSJan Höppner __u8 reserved; 4799e12e54cSJan Höppner __u16 ext_pool_id; 4809e12e54cSJan Höppner __u16 token; 4819e12e54cSJan Höppner __u8 unused[6]; 4829e12e54cSJan Höppner } __packed; 4839e12e54cSJan Höppner 4845db8440cSStefan Haberland struct dasd_cuir_message { 4855db8440cSStefan Haberland __u16 length; 4865db8440cSStefan Haberland __u8 format; 4875db8440cSStefan Haberland __u8 code; 4885db8440cSStefan Haberland __u32 message_id; 4895db8440cSStefan Haberland __u8 flags; 4905db8440cSStefan Haberland __u8 neq_map[3]; 4915db8440cSStefan Haberland __u8 ned_map; 4925db8440cSStefan Haberland __u8 record_selector; 4935db8440cSStefan Haberland } __packed; 4945db8440cSStefan Haberland 4955db8440cSStefan Haberland struct dasd_psf_cuir_response { 4965db8440cSStefan Haberland __u8 order; 4975db8440cSStefan Haberland __u8 flags; 4985db8440cSStefan Haberland __u8 cc; 4995db8440cSStefan Haberland __u8 chpid; 5005db8440cSStefan Haberland __u16 device_nr; 5015db8440cSStefan Haberland __u16 reserved; 5025db8440cSStefan Haberland __u32 message_id; 5035db8440cSStefan Haberland __u64 system_id; 5045db8440cSStefan Haberland __u8 cssid; 5055db8440cSStefan Haberland __u8 ssid; 5065db8440cSStefan Haberland } __packed; 5078e09f215SStefan Weinhuber 5085a3b7b11SStefan Haberland struct dasd_ckd_path_group_entry { 5095a3b7b11SStefan Haberland __u8 status_flags; 5105a3b7b11SStefan Haberland __u8 pgid[11]; 5115a3b7b11SStefan Haberland __u8 sysplex_name[8]; 5125a3b7b11SStefan Haberland __u32 timestamp; 5135a3b7b11SStefan Haberland __u32 cylinder; 5145a3b7b11SStefan Haberland __u8 reserved[4]; 5155a3b7b11SStefan Haberland } __packed; 5165a3b7b11SStefan Haberland 5175a3b7b11SStefan Haberland struct dasd_ckd_host_information { 5185a3b7b11SStefan Haberland __u8 access_flags; 5195a3b7b11SStefan Haberland __u8 entry_size; 5205a3b7b11SStefan Haberland __u16 entry_count; 5215a3b7b11SStefan Haberland __u8 entry[16390]; 5225a3b7b11SStefan Haberland } __packed; 5235a3b7b11SStefan Haberland 5245a3b7b11SStefan Haberland struct dasd_psf_query_host_access { 5255a3b7b11SStefan Haberland __u8 access_flag; 5265a3b7b11SStefan Haberland __u8 version; 5275a3b7b11SStefan Haberland __u16 CKD_length; 5285a3b7b11SStefan Haberland __u16 SCSI_length; 5295a3b7b11SStefan Haberland __u8 unused[10]; 5305a3b7b11SStefan Haberland __u8 host_access_information[16394]; 5315a3b7b11SStefan Haberland } __packed; 5325a3b7b11SStefan Haberland 5331da177e4SLinus Torvalds /* 5341da177e4SLinus Torvalds * Perform Subsystem Function - Prepare for Read Subsystem Data 5351da177e4SLinus Torvalds */ 5361da177e4SLinus Torvalds struct dasd_psf_prssd_data { 5371da177e4SLinus Torvalds unsigned char order; 5381da177e4SLinus Torvalds unsigned char flags; 5395a3b7b11SStefan Haberland unsigned char reserved1; 5405a3b7b11SStefan Haberland unsigned char reserved2; 5415a3b7b11SStefan Haberland unsigned char lss; 5425a3b7b11SStefan Haberland unsigned char volume; 5431da177e4SLinus Torvalds unsigned char suborder; 54449fd38bdSStefan Weinhuber unsigned char varies[5]; 5451da177e4SLinus Torvalds } __attribute__ ((packed)); 5461da177e4SLinus Torvalds 54740545573SHorst Hummel /* 54840545573SHorst Hummel * Perform Subsystem Function - Set Subsystem Characteristics 54940545573SHorst Hummel */ 55040545573SHorst Hummel struct dasd_psf_ssc_data { 55140545573SHorst Hummel unsigned char order; 55240545573SHorst Hummel unsigned char flags; 55340545573SHorst Hummel unsigned char cu_type[4]; 55440545573SHorst Hummel unsigned char suborder; 55540545573SHorst Hummel unsigned char reserved[59]; 55640545573SHorst Hummel } __attribute__((packed)); 55740545573SHorst Hummel 55891dc4a19SJan Höppner /* Maximum number of extents for a single Release Allocated Space command */ 55991dc4a19SJan Höppner #define DASD_ECKD_RAS_EXTS_MAX 110U 56091dc4a19SJan Höppner 56191dc4a19SJan Höppner struct dasd_dso_ras_ext_range { 56291dc4a19SJan Höppner struct ch_t beg_ext; 56391dc4a19SJan Höppner struct ch_t end_ext; 56491dc4a19SJan Höppner } __packed; 56591dc4a19SJan Höppner 56691dc4a19SJan Höppner /* 567be4f361dSBhaskar Chowdhury * Define Subsystem Operation - Release Allocated Space 56891dc4a19SJan Höppner */ 56991dc4a19SJan Höppner struct dasd_dso_ras_data { 57091dc4a19SJan Höppner __u8 order; 57191dc4a19SJan Höppner struct { 57291dc4a19SJan Höppner __u8 message:1; /* Must be zero */ 57391dc4a19SJan Höppner __u8 reserved1:2; 57491dc4a19SJan Höppner __u8 vol_type:1; /* 0 - CKD/FBA, 1 - FB */ 57591dc4a19SJan Höppner __u8 reserved2:4; 57691dc4a19SJan Höppner } __packed flags; 57791dc4a19SJan Höppner /* Operation Flags to specify scope */ 57891dc4a19SJan Höppner struct { 57991dc4a19SJan Höppner __u8 reserved1:2; 58091dc4a19SJan Höppner /* Release Space by Extent */ 58191dc4a19SJan Höppner __u8 by_extent:1; /* 0 - entire volume, 1 - specified extents */ 58291dc4a19SJan Höppner __u8 guarantee_init:1; 58391dc4a19SJan Höppner __u8 force_release:1; /* Internal - will be ignored */ 58491dc4a19SJan Höppner __u16 reserved2:11; 58591dc4a19SJan Höppner } __packed op_flags; 58691dc4a19SJan Höppner __u8 lss; 58791dc4a19SJan Höppner __u8 dev_addr; 58891dc4a19SJan Höppner __u32 reserved1; 58991dc4a19SJan Höppner __u8 reserved2[10]; 59091dc4a19SJan Höppner __u16 nr_exts; /* Defines number of ext_scope - max 110 */ 59191dc4a19SJan Höppner __u16 reserved3; 59291dc4a19SJan Höppner } __packed; 59391dc4a19SJan Höppner 5948e09f215SStefan Weinhuber 5958e09f215SStefan Weinhuber /* 5968e09f215SStefan Weinhuber * some structures and definitions for alias handling 5978e09f215SStefan Weinhuber */ 5988e09f215SStefan Weinhuber struct dasd_unit_address_configuration { 5998e09f215SStefan Weinhuber struct { 6008e09f215SStefan Weinhuber char ua_type; 6018e09f215SStefan Weinhuber char base_ua; 6028e09f215SStefan Weinhuber } unit[256]; 6038e09f215SStefan Weinhuber } __attribute__((packed)); 6048e09f215SStefan Weinhuber 6058e09f215SStefan Weinhuber 6068e09f215SStefan Weinhuber #define MAX_DEVICES_PER_LCU 256 6078e09f215SStefan Weinhuber 6088e09f215SStefan Weinhuber /* flags on the LCU */ 6098e09f215SStefan Weinhuber #define NEED_UAC_UPDATE 0x01 6108e09f215SStefan Weinhuber #define UPDATE_PENDING 0x02 6118e09f215SStefan Weinhuber 6128e09f215SStefan Weinhuber enum pavtype {NO_PAV, BASE_PAV, HYPER_PAV}; 6138e09f215SStefan Weinhuber 6148e09f215SStefan Weinhuber 6158e09f215SStefan Weinhuber struct alias_root { 6168e09f215SStefan Weinhuber struct list_head serverlist; 6178e09f215SStefan Weinhuber spinlock_t lock; 6188e09f215SStefan Weinhuber }; 6198e09f215SStefan Weinhuber 6208e09f215SStefan Weinhuber struct alias_server { 6218e09f215SStefan Weinhuber struct list_head server; 6228e09f215SStefan Weinhuber struct dasd_uid uid; 6238e09f215SStefan Weinhuber struct list_head lculist; 6248e09f215SStefan Weinhuber }; 6258e09f215SStefan Weinhuber 6268e09f215SStefan Weinhuber struct summary_unit_check_work_data { 6278e09f215SStefan Weinhuber char reason; 6288e09f215SStefan Weinhuber struct dasd_device *device; 6298e09f215SStefan Weinhuber struct work_struct worker; 6308e09f215SStefan Weinhuber }; 6318e09f215SStefan Weinhuber 6328e09f215SStefan Weinhuber struct read_uac_work_data { 6338e09f215SStefan Weinhuber struct dasd_device *device; 6348e09f215SStefan Weinhuber struct delayed_work dwork; 6358e09f215SStefan Weinhuber }; 6368e09f215SStefan Weinhuber 6378e09f215SStefan Weinhuber struct alias_lcu { 6388e09f215SStefan Weinhuber struct list_head lcu; 6398e09f215SStefan Weinhuber struct dasd_uid uid; 6408e09f215SStefan Weinhuber enum pavtype pav; 6418e09f215SStefan Weinhuber char flags; 6428e09f215SStefan Weinhuber spinlock_t lock; 6438e09f215SStefan Weinhuber struct list_head grouplist; 6448e09f215SStefan Weinhuber struct list_head active_devices; 6458e09f215SStefan Weinhuber struct list_head inactive_devices; 6468e09f215SStefan Weinhuber struct dasd_unit_address_configuration *uac; 6478e09f215SStefan Weinhuber struct summary_unit_check_work_data suc_data; 6488e09f215SStefan Weinhuber struct read_uac_work_data ruac_data; 6498e09f215SStefan Weinhuber struct dasd_ccw_req *rsu_cqr; 650f4ac1d02SStefan Weinhuber struct completion lcu_setup; 6518e09f215SStefan Weinhuber }; 6528e09f215SStefan Weinhuber 6538e09f215SStefan Weinhuber struct alias_pav_group { 6548e09f215SStefan Weinhuber struct list_head group; 6558e09f215SStefan Weinhuber struct dasd_uid uid; 6568e09f215SStefan Weinhuber struct alias_lcu *lcu; 6578e09f215SStefan Weinhuber struct list_head baselist; 6588e09f215SStefan Weinhuber struct list_head aliaslist; 6598e09f215SStefan Weinhuber struct dasd_device *next; 6608e09f215SStefan Weinhuber }; 6618e09f215SStefan Weinhuber 662b179b037SStefan Haberland struct dasd_conf_data { 663b179b037SStefan Haberland struct dasd_ned neds[5]; 664b179b037SStefan Haberland u8 reserved[64]; 665b179b037SStefan Haberland struct dasd_gneq gneq; 666b179b037SStefan Haberland } __packed; 667b179b037SStefan Haberland 668542e30ceSStefan Haberland struct dasd_conf { 669542e30ceSStefan Haberland u8 *data; 670542e30ceSStefan Haberland int len; 6714abb08c2SStefan Weinhuber /* pointers to specific parts in the conf_data */ 6724abb08c2SStefan Weinhuber struct dasd_ned *ned; 6734abb08c2SStefan Weinhuber struct dasd_sneq *sneq; 6744abb08c2SStefan Weinhuber struct vd_sneq *vdsneq; 6754abb08c2SStefan Weinhuber struct dasd_gneq *gneq; 676542e30ceSStefan Haberland }; 677542e30ceSStefan Haberland 678542e30ceSStefan Haberland struct dasd_eckd_private { 679542e30ceSStefan Haberland struct dasd_eckd_characteristics rdc_data; 680542e30ceSStefan Haberland struct dasd_conf conf; 6814abb08c2SStefan Weinhuber 6828e09f215SStefan Weinhuber struct eckd_count count_area[5]; 6838e09f215SStefan Weinhuber int init_cqr_status; 6848e09f215SStefan Weinhuber int uses_cdl; 6858e09f215SStefan Weinhuber struct attrib_data_t attrib; /* e.g. cache operations */ 6868e09f215SStefan Weinhuber struct dasd_rssd_features features; 687c729696bSJan Höppner struct dasd_rssd_vsq vsq; 688c729696bSJan Höppner struct dasd_ext_pool_sum eps; 689b44b0ab3SStefan Weinhuber u32 real_cyl; 6908e09f215SStefan Weinhuber 691be4f361dSBhaskar Chowdhury /* alias management */ 6928e09f215SStefan Weinhuber struct dasd_uid uid; 6938e09f215SStefan Weinhuber struct alias_pav_group *pavgroup; 6948e09f215SStefan Weinhuber struct alias_lcu *lcu; 6958e09f215SStefan Weinhuber int count; 696ef19298bSStefan Weinhuber 697ef19298bSStefan Weinhuber u32 fcx_max_data; 69859a9ed5fSStefan Haberland char suc_reason; 6998e09f215SStefan Weinhuber }; 7008e09f215SStefan Weinhuber 7018e09f215SStefan Weinhuber 7028e09f215SStefan Weinhuber 7038e09f215SStefan Weinhuber int dasd_alias_make_device_known_to_lcu(struct dasd_device *); 7048e09f215SStefan Weinhuber void dasd_alias_disconnect_device_from_lcu(struct dasd_device *); 7058e09f215SStefan Weinhuber int dasd_alias_add_device(struct dasd_device *); 7068e09f215SStefan Weinhuber int dasd_alias_remove_device(struct dasd_device *); 7078e09f215SStefan Weinhuber struct dasd_device *dasd_alias_get_start_dev(struct dasd_device *); 70859a9ed5fSStefan Haberland void dasd_alias_handle_summary_unit_check(struct work_struct *); 7098e09f215SStefan Weinhuber void dasd_eckd_reset_ccw_to_base_io(struct dasd_ccw_req *); 710501183f2SStefan Haberland int dasd_alias_update_add_device(struct dasd_device *); 7111da177e4SLinus Torvalds #endif /* DASD_ECKD_H */ 712