brintos

brintos / linux-shallow public Read only

0
0
Text · 16.6 KiB · f9299bd Raw
712 lines · c
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, 20007 *8 */9 10#ifndef DASD_ECKD_H11#define DASD_ECKD_H12 13/*****************************************************************************14 * SECTION: CCW Definitions15 ****************************************************************************/16#define DASD_ECKD_CCW_NOP		 0x0317#define DASD_ECKD_CCW_WRITE		 0x0518#define DASD_ECKD_CCW_READ		 0x0619#define DASD_ECKD_CCW_WRITE_HOME_ADDRESS 0x0920#define DASD_ECKD_CCW_READ_HOME_ADDRESS	 0x0a21#define DASD_ECKD_CCW_WRITE_KD		 0x0d22#define DASD_ECKD_CCW_READ_KD		 0x0e23#define DASD_ECKD_CCW_ERASE		 0x1124#define DASD_ECKD_CCW_READ_COUNT	 0x1225#define DASD_ECKD_CCW_SLCK		 0x1426#define DASD_ECKD_CCW_WRITE_RECORD_ZERO	 0x1527#define DASD_ECKD_CCW_READ_RECORD_ZERO	 0x1628#define DASD_ECKD_CCW_WRITE_CKD		 0x1d29#define DASD_ECKD_CCW_READ_CKD		 0x1e30#define DASD_ECKD_CCW_PSF		 0x2731#define DASD_ECKD_CCW_SNID		 0x3432#define DASD_ECKD_CCW_RSSD		 0x3e33#define DASD_ECKD_CCW_LOCATE_RECORD	 0x4734#define DASD_ECKD_CCW_LOCATE_RECORD_EXT	 0x4b35#define DASD_ECKD_CCW_SNSS		 0x5436#define DASD_ECKD_CCW_DEFINE_EXTENT	 0x6337#define DASD_ECKD_CCW_WRITE_MT		 0x8538#define DASD_ECKD_CCW_READ_MT		 0x8639#define DASD_ECKD_CCW_WRITE_KD_MT	 0x8d40#define DASD_ECKD_CCW_READ_KD_MT	 0x8e41#define DASD_ECKD_CCW_READ_COUNT_MT	 0x9242#define DASD_ECKD_CCW_RELEASE		 0x9443#define DASD_ECKD_CCW_WRITE_FULL_TRACK	 0x9544#define DASD_ECKD_CCW_READ_CKD_MT	 0x9e45#define DASD_ECKD_CCW_WRITE_CKD_MT	 0x9d46#define DASD_ECKD_CCW_WRITE_TRACK_DATA	 0xA547#define DASD_ECKD_CCW_READ_TRACK_DATA	 0xA648#define DASD_ECKD_CCW_RESERVE		 0xB449#define DASD_ECKD_CCW_READ_TRACK	 0xDE50#define DASD_ECKD_CCW_PFX		 0xE751#define DASD_ECKD_CCW_PFX_READ		 0xEA52#define DASD_ECKD_CCW_RSCK		 0xF953#define DASD_ECKD_CCW_RCD		 0xFA54#define DASD_ECKD_CCW_DSO		 0xF755 56/* Define Subsystem Function / Orders */57#define DSO_ORDER_RAS			 0x8158 59/*60 * Perform Subsystem Function / Orders61 */62#define PSF_ORDER_PRSSD			 0x1863#define PSF_ORDER_CUIR_RESPONSE		 0x1A64#define PSF_ORDER_SSC			 0x1D65 66/*67 * Perform Subsystem Function / Sub-Orders68 */69#define PSF_SUBORDER_QHA		 0x1C /* Query Host Access */70#define PSF_SUBORDER_PPRCEQ		 0x50 /* PPRC Extended Query */71#define PSF_SUBORDER_VSQ		 0x52 /* Volume Storage Query */72#define PSF_SUBORDER_LCQ		 0x53 /* Logical Configuration Query */73 74/*75 * PPRC Extended Query Scopes76 */77#define PPRCEQ_SCOPE_4			 0x04 /* Scope 4 for PPRC Extended Query */78 79/*80 * CUIR response condition codes81 */82#define PSF_CUIR_INVALID		 0x0083#define PSF_CUIR_COMPLETED		 0x0184#define PSF_CUIR_NOT_SUPPORTED		 0x0285#define PSF_CUIR_ERROR_IN_REQ		 0x0386#define PSF_CUIR_DENIED			 0x0487#define PSF_CUIR_LAST_PATH		 0x0588#define PSF_CUIR_DEVICE_ONLINE		 0x0689#define PSF_CUIR_VARY_FAILURE		 0x0790#define PSF_CUIR_SOFTWARE_FAILURE	 0x0891#define PSF_CUIR_NOT_RECOGNIZED		 0x0992 93/*94 * CUIR codes95 */96#define CUIR_QUIESCE			 0x0197#define CUIR_RESUME			 0x0298 99/*100 * Out-of-space (OOS) Codes101 */102#define REPO_WARN			 0x01103#define REPO_EXHAUST			 0x02104#define POOL_WARN			 0x03105#define POOL_EXHAUST			 0x04106#define REPO_RELIEVE			 0x05107#define POOL_RELIEVE			 0x06108 109/*110 * attention message definitions111 */112#define ATTENTION_LENGTH_CUIR		 0x0e113#define ATTENTION_FORMAT_CUIR		 0x01114#define ATTENTION_LENGTH_OOS		 0x10115#define ATTENTION_FORMAT_OOS		 0x06116 117#define DASD_ECKD_PG_GROUPED		 0x10118 119/*120 * Size that is reported for large volumes in the old 16-bit no_cyl field121 */122#define LV_COMPAT_CYL 0xFFFE123 124 125#define FCX_MAX_DATA_FACTOR 65536126#define DASD_ECKD_RCD_DATA_SIZE 256127 128#define DASD_ECKD_PATH_THRHLD		 256129#define DASD_ECKD_PATH_INTERVAL		 300130 131/*132 * Maximum number of blocks to be chained133 */134#define DASD_ECKD_MAX_BLOCKS		 190135#define DASD_ECKD_MAX_BLOCKS_RAW	 256136 137/*****************************************************************************138 * SECTION: Type Definitions139 ****************************************************************************/140 141struct eckd_count {142	__u16 cyl;143	__u16 head;144	__u8 record;145	__u8 kl;146	__u16 dl;147} __attribute__ ((packed));148 149struct ch_t {150	__u16 cyl;151	__u16 head;152} __attribute__ ((packed));153 154struct chr_t {155	__u16 cyl;156	__u16 head;157	__u8 record;158} __attribute__ ((packed));159 160struct DE_eckd_data {161	struct {162		unsigned char perm:2;	/* Permissions on this extent */163		unsigned char reserved:1;164		unsigned char seek:2;	/* Seek control */165		unsigned char auth:2;	/* Access authorization */166		unsigned char pci:1;	/* PCI Fetch mode */167	} __attribute__ ((packed)) mask;168	struct {169		unsigned char mode:2;	/* Architecture mode */170		unsigned char ckd:1;	/* CKD Conversion */171		unsigned char operation:3;	/* Operation mode */172		unsigned char cfw:1;	/* Cache fast write */173		unsigned char dfw:1;	/* DASD fast write */174	} __attribute__ ((packed)) attributes;175	__u16 blk_size;		/* Blocksize */176	__u16 fast_write_id;177	__u8 ga_additional;	/* Global Attributes Additional */178	__u8 ga_extended;	/* Global Attributes Extended	*/179	struct ch_t beg_ext;180	struct ch_t end_ext;181	unsigned long ep_sys_time; /* Ext Parameter - System Time Stamp */182	__u8 ep_format;        /* Extended Parameter format byte       */183	__u8 ep_prio;          /* Extended Parameter priority I/O byte */184	__u8 ep_reserved1;     /* Extended Parameter Reserved	       */185	__u8 ep_rec_per_track; /* Number of records on a track	       */186	__u8 ep_reserved[4];   /* Extended Parameter Reserved	       */187} __attribute__ ((packed));188 189struct LO_eckd_data {190	struct {191		unsigned char orientation:2;192		unsigned char operation:6;193	} __attribute__ ((packed)) operation;194	struct {195		unsigned char last_bytes_used:1;196		unsigned char reserved:6;197		unsigned char read_count_suffix:1;198	} __attribute__ ((packed)) auxiliary;199	__u8 unused;200	__u8 count;201	struct ch_t seek_addr;202	struct chr_t search_arg;203	__u8 sector;204	__u16 length;205} __attribute__ ((packed));206 207struct LRE_eckd_data {208	struct {209		unsigned char orientation:2;210		unsigned char operation:6;211	} __attribute__ ((packed)) operation;212	struct {213		unsigned char length_valid:1;214		unsigned char length_scope:1;215		unsigned char imbedded_ccw_valid:1;216		unsigned char check_bytes:2;217		unsigned char imbedded_count_valid:1;218		unsigned char reserved:1;219		unsigned char read_count_suffix:1;220	} __attribute__ ((packed)) auxiliary;221	__u8 imbedded_ccw;222	__u8 count;223	struct ch_t seek_addr;224	struct chr_t search_arg;225	__u8 sector;226	__u16 length;227	__u8 imbedded_count;228	__u8 extended_operation;229	__u16 extended_parameter_length;230	__u8 extended_parameter[];231} __attribute__ ((packed));232 233/* Prefix data for format 0x00 and 0x01 */234struct PFX_eckd_data {235	unsigned char format;236	struct {237		unsigned char define_extent:1;238		unsigned char time_stamp:1;239		unsigned char verify_base:1;240		unsigned char hyper_pav:1;241		unsigned char reserved:4;242	} __attribute__ ((packed)) validity;243	__u8 base_address;244	__u8 aux;245	__u8 base_lss;246	__u8 reserved[7];247	struct DE_eckd_data define_extent;248	struct LRE_eckd_data locate_record;249} __attribute__ ((packed));250 251struct dasd_eckd_characteristics {252	__u16 cu_type;253	struct {254		unsigned char support:2;255		unsigned char async:1;256		unsigned char reserved:1;257		unsigned char cache_info:1;258		unsigned char model:3;259	} __attribute__ ((packed)) cu_model;260	__u16 dev_type;261	__u8 dev_model;262	struct {263		unsigned char mult_burst:1;264		unsigned char RT_in_LR:1;265		unsigned char reserved1:1;266		unsigned char RD_IN_LR:1;267		unsigned char reserved2:4;268		unsigned char reserved3:8;269		unsigned char defect_wr:1;270		unsigned char XRC_supported:1;271		unsigned char PPRC_enabled:1;272		unsigned char striping:1;273		unsigned char reserved5:4;274		unsigned char cfw:1;275		unsigned char reserved6:2;276		unsigned char cache:1;277		unsigned char dual_copy:1;278		unsigned char dfw:1;279		unsigned char reset_alleg:1;280		unsigned char sense_down:1;281	} __attribute__ ((packed)) facilities;282	__u8 dev_class;283	__u8 unit_type;284	__u16 no_cyl;285	__u16 trk_per_cyl;286	__u8 sec_per_trk;287	__u8 byte_per_track[3];288	__u16 home_bytes;289	__u8 formula;290	union {291		struct {292			__u8 f1;293			__u16 f2;294			__u16 f3;295		} __attribute__ ((packed)) f_0x01;296		struct {297			__u8 f1;298			__u8 f2;299			__u8 f3;300			__u8 f4;301			__u8 f5;302		} __attribute__ ((packed)) f_0x02;303	} __attribute__ ((packed)) factors;304	__u16 first_alt_trk;305	__u16 no_alt_trk;306	__u16 first_dia_trk;307	__u16 no_dia_trk;308	__u16 first_sup_trk;309	__u16 no_sup_trk;310	__u8 MDR_ID;311	__u8 OBR_ID;312	__u8 director;313	__u8 rd_trk_set;314	__u16 max_rec_zero;315	__u8 reserved1;316	__u8 RWANY_in_LR;317	__u8 factor6;318	__u8 factor7;319	__u8 factor8;320	__u8 reserved2[3];321	__u8 reserved3[6];322	__u32 long_no_cyl;323} __attribute__ ((packed));324 325/* elements of the configuration data */326struct dasd_ned {327	struct {328		__u8 identifier:2;329		__u8 token_id:1;330		__u8 sno_valid:1;331		__u8 subst_sno:1;332		__u8 recNED:1;333		__u8 emuNED:1;334		__u8 reserved:1;335	} __attribute__ ((packed)) flags;336	__u8 descriptor;337	__u8 dev_class;338	__u8 reserved;339	__u8 dev_type[6];340	__u8 dev_model[3];341	__u8 HDA_manufacturer[3];342	struct {343		__u8 HDA_location[2];344		__u8 HDA_seqno[12];345	} serial;346	__u8 ID;347	__u8 unit_addr;348} __attribute__ ((packed));349 350struct dasd_sneq {351	struct {352		__u8 identifier:2;353		__u8 reserved:6;354	} __attribute__ ((packed)) flags;355	__u8 res1;356	__u16 format;357	__u8 res2[4];		/* byte  4- 7 */358	__u8 sua_flags;		/* byte  8    */359	__u8 base_unit_addr;	/* byte  9    */360	__u8 res3[22];		/* byte 10-31 */361} __attribute__ ((packed));362 363struct vd_sneq {364	struct {365		__u8 identifier:2;366		__u8 reserved:6;367	} __attribute__ ((packed)) flags;368	__u8 res1;369	__u16 format;370	__u8 res2[4];	/* byte  4- 7 */371	__u8 uit[16];	/* byte  8-23 */372	__u8 res3[8];	/* byte 24-31 */373} __attribute__ ((packed));374 375struct dasd_gneq {376	struct {377		__u8 identifier:2;378		__u8 reserved:6;379	} __attribute__ ((packed)) flags;380	__u8 record_selector;381	__u8 reserved[4];382	struct {383		__u8 value:2;384		__u8 number:6;385	} __attribute__ ((packed)) timeout;386	__u8 reserved3;387	__u16 subsystemID;388	__u8 reserved2[22];389} __attribute__ ((packed));390 391struct dasd_rssd_features {392	char feature[256];393} __attribute__((packed));394 395struct dasd_rssd_messages {396	__u16 length;397	__u8 format;398	__u8 code;399	__u32 message_id;400	__u8 flags;401	char messages[4087];402} __packed;403 404/*405 * Read Subsystem Data - Volume Storage Query406 */407struct dasd_rssd_vsq {408	struct {409		__u8 tse:1;410		__u8 space_not_available:1;411		__u8 ese:1;412		__u8 unused:5;413	} __packed vol_info;414	__u8 unused1;415	__u16 extent_pool_id;416	__u8 warn_cap_limit;417	__u8 warn_cap_guaranteed;418	__u16 unused2;419	__u32 limit_capacity;420	__u32 guaranteed_capacity;421	__u32 space_allocated;422	__u32 space_configured;423	__u32 logical_capacity;424} __packed;425 426/*427 * Extent Pool Summary428 */429struct dasd_ext_pool_sum {430	__u16 pool_id;431	__u8 repo_warn_thrshld;432	__u8 warn_thrshld;433	struct {434		__u8 type:1;			/* 0 - CKD / 1 - FB */435		__u8 track_space_efficient:1;436		__u8 extent_space_efficient:1;437		__u8 standard_volume:1;438		__u8 extent_size_valid:1;439		__u8 capacity_at_warnlevel:1;440		__u8 pool_oos:1;441		__u8 unused0:1;442		__u8 unused1;443	} __packed flags;444	struct {445		__u8 reserved0:1;446		__u8 size_1G:1;447		__u8 reserved1:5;448		__u8 size_16M:1;449	} __packed extent_size;450	__u8 unused;451} __packed;452 453/*454 * Read Subsystem Data-Response - Logical Configuration Query - Header455 */456struct dasd_rssd_lcq {457	__u16 data_length;		/* Length of data returned */458	__u16 pool_count;		/* Count of extent pools returned - Max: 448 */459	struct {460		__u8 pool_info_valid:1;	/* Detailed Information valid */461		__u8 pool_id_volume:1;462		__u8 pool_id_cec:1;463		__u8 unused0:5;464		__u8 unused1;465	} __packed header_flags;466	char sfi_type[6];		/* Storage Facility Image Type (EBCDIC) */467	char sfi_model[3];		/* Storage Facility Image Model (EBCDIC) */468	__u8 sfi_seq_num[10];		/* Storage Facility Image Sequence Number */469	__u8 reserved[7];470	struct dasd_ext_pool_sum ext_pool_sum[448];471} __packed;472 473struct dasd_oos_message {474	__u16 length;475	__u8 format;476	__u8 code;477	__u8 percentage_empty;478	__u8 reserved;479	__u16 ext_pool_id;480	__u16 token;481	__u8 unused[6];482} __packed;483 484struct dasd_cuir_message {485	__u16 length;486	__u8 format;487	__u8 code;488	__u32 message_id;489	__u8 flags;490	__u8 neq_map[3];491	__u8 ned_map;492	__u8 record_selector;493} __packed;494 495struct dasd_psf_cuir_response {496	__u8 order;497	__u8 flags;498	__u8 cc;499	__u8 chpid;500	__u16 device_nr;501	__u16 reserved;502	__u32 message_id;503	__u64 system_id;504	__u8 cssid;505	__u8 ssid;506} __packed;507 508struct dasd_ckd_path_group_entry {509	__u8 status_flags;510	__u8 pgid[11];511	__u8 sysplex_name[8];512	__u32 timestamp;513	__u32 cylinder;514	__u8 reserved[4];515} __packed;516 517struct dasd_ckd_host_information {518	__u8 access_flags;519	__u8 entry_size;520	__u16 entry_count;521	__u8 entry[16390];522} __packed;523 524struct dasd_psf_query_host_access {525	__u8 access_flag;526	__u8 version;527	__u16 CKD_length;528	__u16 SCSI_length;529	__u8 unused[10];530	__u8 host_access_information[16394];531} __packed;532 533/*534 * Perform Subsystem Function - Prepare for Read Subsystem Data535 */536struct dasd_psf_prssd_data {537	unsigned char order;538	unsigned char flags;539	unsigned char reserved1;540	unsigned char reserved2;541	unsigned char lss;542	unsigned char volume;543	unsigned char suborder;544	unsigned char varies[5];545} __attribute__ ((packed));546 547/*548 * Perform Subsystem Function - Set Subsystem Characteristics549 */550struct dasd_psf_ssc_data {551	unsigned char order;552	unsigned char flags;553	unsigned char cu_type[4];554	unsigned char suborder;555	unsigned char reserved[59];556} __attribute__((packed));557 558/* Maximum number of extents for a single Release Allocated Space command */559#define DASD_ECKD_RAS_EXTS_MAX		110U560 561struct dasd_dso_ras_ext_range {562	struct ch_t beg_ext;563	struct ch_t end_ext;564} __packed;565 566/*567 * Define Subsystem Operation - Release Allocated Space568 */569struct dasd_dso_ras_data {570	__u8 order;571	struct {572		__u8 message:1;		/* Must be zero */573		__u8 reserved1:2;574		__u8 vol_type:1;	/* 0 - CKD/FBA, 1 - FB */575		__u8 reserved2:4;576	} __packed flags;577	/* Operation Flags to specify scope */578	struct {579		__u8 reserved1:2;580		/* Release Space by Extent */581		__u8 by_extent:1;	/* 0 - entire volume, 1 - specified extents */582		__u8 guarantee_init:1;583		__u8 force_release:1;	/* Internal - will be ignored */584		__u16 reserved2:11;585	} __packed op_flags;586	__u8 lss;587	__u8 dev_addr;588	__u32 reserved1;589	__u8 reserved2[10];590	__u16 nr_exts;			/* Defines number of ext_scope - max 110 */591	__u16 reserved3;592} __packed;593 594 595/*596 * some structures and definitions for alias handling597 */598struct dasd_unit_address_configuration {599	struct {600		char ua_type;601		char base_ua;602	} unit[256];603} __attribute__((packed));604 605 606#define MAX_DEVICES_PER_LCU 256607 608/* flags on the LCU  */609#define NEED_UAC_UPDATE  0x01610#define UPDATE_PENDING	0x02611 612enum pavtype {NO_PAV, BASE_PAV, HYPER_PAV};613 614 615struct alias_root {616	struct list_head serverlist;617	spinlock_t lock;618};619 620struct alias_server {621	struct list_head server;622	struct dasd_uid uid;623	struct list_head lculist;624};625 626struct summary_unit_check_work_data {627	char reason;628	struct dasd_device *device;629	struct work_struct worker;630};631 632struct read_uac_work_data {633	struct dasd_device *device;634	struct delayed_work dwork;635};636 637struct alias_lcu {638	struct list_head lcu;639	struct dasd_uid uid;640	enum pavtype pav;641	char flags;642	spinlock_t lock;643	struct list_head grouplist;644	struct list_head active_devices;645	struct list_head inactive_devices;646	struct dasd_unit_address_configuration *uac;647	struct summary_unit_check_work_data suc_data;648	struct read_uac_work_data ruac_data;649	struct dasd_ccw_req *rsu_cqr;650	struct completion lcu_setup;651};652 653struct alias_pav_group {654	struct list_head group;655	struct dasd_uid uid;656	struct alias_lcu *lcu;657	struct list_head baselist;658	struct list_head aliaslist;659	struct dasd_device *next;660};661 662struct dasd_conf_data {663	struct dasd_ned neds[5];664	u8 reserved[64];665	struct dasd_gneq gneq;666} __packed;667 668struct dasd_conf {669	u8 *data;670	int len;671	/* pointers to specific parts in the conf_data */672	struct dasd_ned *ned;673	struct dasd_sneq *sneq;674	struct vd_sneq *vdsneq;675	struct dasd_gneq *gneq;676};677 678struct dasd_eckd_private {679	struct dasd_eckd_characteristics rdc_data;680	struct dasd_conf conf;681 682	struct eckd_count count_area[5];683	int init_cqr_status;684	int uses_cdl;685	struct attrib_data_t attrib;	/* e.g. cache operations */686	struct dasd_rssd_features features;687	struct dasd_rssd_vsq vsq;688	struct dasd_ext_pool_sum eps;689	u32 real_cyl;690 691	/* alias management */692	struct dasd_uid uid;693	struct alias_pav_group *pavgroup;694	struct alias_lcu *lcu;695	int count;696 697	u32 fcx_max_data;698	char suc_reason;699};700 701 702 703int dasd_alias_make_device_known_to_lcu(struct dasd_device *);704void dasd_alias_disconnect_device_from_lcu(struct dasd_device *);705int dasd_alias_add_device(struct dasd_device *);706int dasd_alias_remove_device(struct dasd_device *);707struct dasd_device *dasd_alias_get_start_dev(struct dasd_device *);708void dasd_alias_handle_summary_unit_check(struct work_struct *);709void dasd_eckd_reset_ccw_to_base_io(struct dasd_ccw_req *);710int dasd_alias_update_add_device(struct dasd_device *);711#endif				/* DASD_ECKD_H */712