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