2006-06-29 14:58:12 +02:00
/*
2005-04-16 15:20:36 -07:00
* Author ( s ) . . . . . . : Holger Smolinski < Holger . Smolinski @ de . ibm . com >
2006-06-29 14:58:12 +02:00
* Horst Hummel < Horst . Hummel @ de . ibm . com >
2005-04-16 15:20:36 -07:00
* Bugreports . to . . : < Linux390 @ de . ibm . com >
2012-07-20 11:15:04 +02:00
* Copyright IBM Corp . 1999 , 2000
2005-04-16 15:20:36 -07:00
*
*/
# ifndef DASD_ECKD_H
# define DASD_ECKD_H
/*****************************************************************************
* SECTION : CCW Definitions
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# define DASD_ECKD_CCW_WRITE 0x05
# define DASD_ECKD_CCW_READ 0x06
# define DASD_ECKD_CCW_WRITE_HOME_ADDRESS 0x09
# define DASD_ECKD_CCW_READ_HOME_ADDRESS 0x0a
# define DASD_ECKD_CCW_WRITE_KD 0x0d
# define DASD_ECKD_CCW_READ_KD 0x0e
# define DASD_ECKD_CCW_ERASE 0x11
# define DASD_ECKD_CCW_READ_COUNT 0x12
# define DASD_ECKD_CCW_SLCK 0x14
# define DASD_ECKD_CCW_WRITE_RECORD_ZERO 0x15
# define DASD_ECKD_CCW_READ_RECORD_ZERO 0x16
# define DASD_ECKD_CCW_WRITE_CKD 0x1d
# define DASD_ECKD_CCW_READ_CKD 0x1e
# define DASD_ECKD_CCW_PSF 0x27
2010-10-29 16:50:43 +02:00
# define DASD_ECKD_CCW_SNID 0x34
2005-04-16 15:20:36 -07:00
# define DASD_ECKD_CCW_RSSD 0x3e
# define DASD_ECKD_CCW_LOCATE_RECORD 0x47
2006-03-24 03:15:25 -08:00
# define DASD_ECKD_CCW_SNSS 0x54
2005-04-16 15:20:36 -07:00
# define DASD_ECKD_CCW_DEFINE_EXTENT 0x63
# define DASD_ECKD_CCW_WRITE_MT 0x85
# define DASD_ECKD_CCW_READ_MT 0x86
# define DASD_ECKD_CCW_WRITE_KD_MT 0x8d
# define DASD_ECKD_CCW_READ_KD_MT 0x8e
# define DASD_ECKD_CCW_RELEASE 0x94
2011-01-05 12:48:06 +01:00
# define DASD_ECKD_CCW_WRITE_FULL_TRACK 0x95
2005-04-16 15:20:36 -07:00
# define DASD_ECKD_CCW_READ_CKD_MT 0x9e
# define DASD_ECKD_CCW_WRITE_CKD_MT 0x9d
2009-03-26 15:23:48 +01:00
# define DASD_ECKD_CCW_WRITE_TRACK_DATA 0xA5
# define DASD_ECKD_CCW_READ_TRACK_DATA 0xA6
2005-04-16 15:20:36 -07:00
# define DASD_ECKD_CCW_RESERVE 0xB4
2011-01-05 12:48:06 +01:00
# define DASD_ECKD_CCW_READ_TRACK 0xDE
2008-01-26 14:11:23 +01:00
# define DASD_ECKD_CCW_PFX 0xE7
2009-03-26 15:23:48 +01:00
# define DASD_ECKD_CCW_PFX_READ 0xEA
2008-01-26 14:11:23 +01:00
# define DASD_ECKD_CCW_RSCK 0xF9
2011-01-05 12:48:03 +01:00
# define DASD_ECKD_CCW_RCD 0xFA
2005-04-16 15:20:36 -07:00
/*
2006-06-29 15:08:18 +02:00
* Perform Subsystem Function / Sub - Orders
2005-04-16 15:20:36 -07:00
*/
2014-10-01 14:39:47 +02:00
# define PSF_ORDER_PRSSD 0x18
# define PSF_ORDER_CUIR_RESPONSE 0x1A
# define PSF_ORDER_SSC 0x1D
/*
* CUIR response condition codes
*/
# define PSF_CUIR_INVALID 0x00
# define PSF_CUIR_COMPLETED 0x01
# define PSF_CUIR_NOT_SUPPORTED 0x02
# define PSF_CUIR_ERROR_IN_REQ 0x03
# define PSF_CUIR_DENIED 0x04
# define PSF_CUIR_LAST_PATH 0x05
# define PSF_CUIR_DEVICE_ONLINE 0x06
# define PSF_CUIR_VARY_FAILURE 0x07
# define PSF_CUIR_SOFTWARE_FAILURE 0x08
# define PSF_CUIR_NOT_RECOGNIZED 0x09
/*
* CUIR codes
*/
# define CUIR_QUIESCE 0x01
# define CUIR_RESUME 0x02
/*
* attention message definitions
*/
# define ATTENTION_LENGTH_CUIR 0x0e
# define ATTENTION_FORMAT_CUIR 0x01
2005-04-16 15:20:36 -07:00
2009-03-26 15:23:47 +01:00
/*
* Size that is reportet for large volumes in the old 16 - bit no_cyl field
*/
# define LV_COMPAT_CYL 0xFFFE
2011-01-05 12:48:02 +01:00
# define FCX_MAX_DATA_FACTOR 65536
2011-01-05 12:48:03 +01:00
# define DASD_ECKD_RCD_DATA_SIZE 256
2011-01-05 12:48:02 +01:00
2005-04-16 15:20:36 -07:00
/*****************************************************************************
* SECTION : Type Definitions
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
struct eckd_count {
__u16 cyl ;
__u16 head ;
__u8 record ;
__u8 kl ;
__u16 dl ;
} __attribute__ ( ( packed ) ) ;
struct ch_t {
__u16 cyl ;
__u16 head ;
} __attribute__ ( ( packed ) ) ;
struct chs_t {
__u16 cyl ;
__u16 head ;
__u32 sector ;
} __attribute__ ( ( packed ) ) ;
struct chr_t {
__u16 cyl ;
__u16 head ;
__u8 record ;
} __attribute__ ( ( packed ) ) ;
struct geom_t {
__u16 cyl ;
__u16 head ;
__u32 sector ;
} __attribute__ ( ( packed ) ) ;
struct eckd_home {
__u8 skip_control [ 14 ] ;
__u16 cell_number ;
__u8 physical_addr [ 3 ] ;
__u8 flag ;
struct ch_t track_addr ;
__u8 reserved ;
__u8 key_length ;
__u8 reserved2 [ 2 ] ;
} __attribute__ ( ( packed ) ) ;
struct DE_eckd_data {
struct {
unsigned char perm : 2 ; /* Permissions on this extent */
unsigned char reserved : 1 ;
unsigned char seek : 2 ; /* Seek control */
unsigned char auth : 2 ; /* Access authorization */
unsigned char pci : 1 ; /* PCI Fetch mode */
} __attribute__ ( ( packed ) ) mask ;
struct {
unsigned char mode : 2 ; /* Architecture mode */
unsigned char ckd : 1 ; /* CKD Conversion */
unsigned char operation : 3 ; /* Operation mode */
unsigned char cfw : 1 ; /* Cache fast write */
unsigned char dfw : 1 ; /* DASD fast write */
} __attribute__ ( ( packed ) ) attributes ;
__u16 blk_size ; /* Blocksize */
__u16 fast_write_id ;
__u8 ga_additional ; /* Global Attributes Additional */
__u8 ga_extended ; /* Global Attributes Extended */
struct ch_t beg_ext ;
struct ch_t end_ext ;
unsigned long long ep_sys_time ; /* Ext Parameter - System Time Stamp */
__u8 ep_format ; /* Extended Parameter format byte */
__u8 ep_prio ; /* Extended Parameter priority I/O byte */
2009-03-26 15:23:48 +01:00
__u8 ep_reserved1 ; /* Extended Parameter Reserved */
__u8 ep_rec_per_track ; /* Number of records on a track */
__u8 ep_reserved [ 4 ] ; /* Extended Parameter Reserved */
2005-04-16 15:20:36 -07:00
} __attribute__ ( ( packed ) ) ;
struct LO_eckd_data {
struct {
unsigned char orientation : 2 ;
unsigned char operation : 6 ;
} __attribute__ ( ( packed ) ) operation ;
struct {
unsigned char last_bytes_used : 1 ;
unsigned char reserved : 6 ;
unsigned char read_count_suffix : 1 ;
} __attribute__ ( ( packed ) ) auxiliary ;
__u8 unused ;
__u8 count ;
struct ch_t seek_addr ;
struct chr_t search_arg ;
__u8 sector ;
__u16 length ;
} __attribute__ ( ( packed ) ) ;
2009-03-26 15:23:48 +01:00
struct LRE_eckd_data {
struct {
unsigned char orientation : 2 ;
unsigned char operation : 6 ;
} __attribute__ ( ( packed ) ) operation ;
struct {
unsigned char length_valid : 1 ;
unsigned char length_scope : 1 ;
unsigned char imbedded_ccw_valid : 1 ;
unsigned char check_bytes : 2 ;
unsigned char imbedded_count_valid : 1 ;
unsigned char reserved : 1 ;
unsigned char read_count_suffix : 1 ;
} __attribute__ ( ( packed ) ) auxiliary ;
__u8 imbedded_ccw ;
__u8 count ;
struct ch_t seek_addr ;
struct chr_t search_arg ;
__u8 sector ;
__u16 length ;
__u8 imbedded_count ;
__u8 extended_operation ;
__u16 extended_parameter_length ;
__u8 extended_parameter [ 0 ] ;
} __attribute__ ( ( packed ) ) ;
2008-01-26 14:11:23 +01:00
/* Prefix data for format 0x00 and 0x01 */
struct PFX_eckd_data {
unsigned char format ;
struct {
2009-03-26 15:23:48 +01:00
unsigned char define_extent : 1 ;
2008-01-26 14:11:23 +01:00
unsigned char time_stamp : 1 ;
unsigned char verify_base : 1 ;
unsigned char hyper_pav : 1 ;
unsigned char reserved : 4 ;
} __attribute__ ( ( packed ) ) validity ;
__u8 base_address ;
__u8 aux ;
__u8 base_lss ;
__u8 reserved [ 7 ] ;
2009-03-26 15:23:48 +01:00
struct DE_eckd_data define_extent ;
struct LRE_eckd_data locate_record ;
2008-01-26 14:11:23 +01:00
} __attribute__ ( ( packed ) ) ;
2005-04-16 15:20:36 -07:00
struct dasd_eckd_characteristics {
__u16 cu_type ;
struct {
unsigned char support : 2 ;
unsigned char async : 1 ;
unsigned char reserved : 1 ;
unsigned char cache_info : 1 ;
unsigned char model : 3 ;
} __attribute__ ( ( packed ) ) cu_model ;
__u16 dev_type ;
__u8 dev_model ;
struct {
unsigned char mult_burst : 1 ;
unsigned char RT_in_LR : 1 ;
unsigned char reserved1 : 1 ;
unsigned char RD_IN_LR : 1 ;
unsigned char reserved2 : 4 ;
unsigned char reserved3 : 8 ;
unsigned char defect_wr : 1 ;
2006-06-29 14:58:12 +02:00
unsigned char XRC_supported : 1 ;
2005-04-16 15:20:36 -07:00
unsigned char reserved4 : 1 ;
unsigned char striping : 1 ;
unsigned char reserved5 : 4 ;
unsigned char cfw : 1 ;
unsigned char reserved6 : 2 ;
unsigned char cache : 1 ;
unsigned char dual_copy : 1 ;
unsigned char dfw : 1 ;
unsigned char reset_alleg : 1 ;
unsigned char sense_down : 1 ;
} __attribute__ ( ( packed ) ) facilities ;
__u8 dev_class ;
__u8 unit_type ;
__u16 no_cyl ;
__u16 trk_per_cyl ;
__u8 sec_per_trk ;
__u8 byte_per_track [ 3 ] ;
__u16 home_bytes ;
__u8 formula ;
union {
struct {
__u8 f1 ;
__u16 f2 ;
__u16 f3 ;
} __attribute__ ( ( packed ) ) f_0x01 ;
struct {
__u8 f1 ;
__u8 f2 ;
__u8 f3 ;
__u8 f4 ;
__u8 f5 ;
} __attribute__ ( ( packed ) ) f_0x02 ;
} __attribute__ ( ( packed ) ) factors ;
__u16 first_alt_trk ;
__u16 no_alt_trk ;
__u16 first_dia_trk ;
__u16 no_dia_trk ;
__u16 first_sup_trk ;
__u16 no_sup_trk ;
__u8 MDR_ID ;
__u8 OBR_ID ;
__u8 director ;
__u8 rd_trk_set ;
__u16 max_rec_zero ;
__u8 reserved1 ;
__u8 RWANY_in_LR ;
__u8 factor6 ;
__u8 factor7 ;
__u8 factor8 ;
__u8 reserved2 [ 3 ] ;
2009-03-26 15:23:47 +01:00
__u8 reserved3 [ 6 ] ;
__u32 long_no_cyl ;
2005-04-16 15:20:36 -07:00
} __attribute__ ( ( packed ) ) ;
2008-08-01 16:39:09 +02:00
/* elements of the configuration data */
struct dasd_ned {
2005-04-16 15:20:36 -07:00
struct {
2008-08-01 16:39:09 +02:00
__u8 identifier : 2 ;
__u8 token_id : 1 ;
__u8 sno_valid : 1 ;
__u8 subst_sno : 1 ;
__u8 recNED : 1 ;
__u8 emuNED : 1 ;
__u8 reserved : 1 ;
} __attribute__ ( ( packed ) ) flags ;
__u8 descriptor ;
__u8 dev_class ;
__u8 reserved ;
__u8 dev_type [ 6 ] ;
__u8 dev_model [ 3 ] ;
__u8 HDA_manufacturer [ 3 ] ;
__u8 HDA_location [ 2 ] ;
__u8 HDA_seqno [ 12 ] ;
__u8 ID ;
__u8 unit_addr ;
} __attribute__ ( ( packed ) ) ;
struct dasd_sneq {
2005-04-16 15:20:36 -07:00
struct {
2008-08-01 16:39:09 +02:00
__u8 identifier : 2 ;
__u8 reserved : 6 ;
} __attribute__ ( ( packed ) ) flags ;
__u8 res1 ;
__u16 format ;
__u8 res2 [ 4 ] ; /* byte 4- 7 */
__u8 sua_flags ; /* byte 8 */
__u8 base_unit_addr ; /* byte 9 */
__u8 res3 [ 22 ] ; /* byte 10-31 */
} __attribute__ ( ( packed ) ) ;
struct vd_sneq {
2005-04-16 15:20:36 -07:00
struct {
2008-08-01 16:39:09 +02:00
__u8 identifier : 2 ;
__u8 reserved : 6 ;
} __attribute__ ( ( packed ) ) flags ;
__u8 res1 ;
__u16 format ;
__u8 res2 [ 4 ] ; /* byte 4- 7 */
__u8 uit [ 16 ] ; /* byte 8-23 */
__u8 res3 [ 8 ] ; /* byte 24-31 */
} __attribute__ ( ( packed ) ) ;
struct dasd_gneq {
2005-04-16 15:20:36 -07:00
struct {
2008-08-01 16:39:09 +02:00
__u8 identifier : 2 ;
__u8 reserved : 6 ;
} __attribute__ ( ( packed ) ) flags ;
2015-08-07 13:20:16 +02:00
__u8 record_selector ;
__u8 reserved [ 4 ] ;
2010-08-09 18:13:00 +02:00
struct {
__u8 value : 2 ;
__u8 number : 6 ;
} __attribute__ ( ( packed ) ) timeout ;
__u8 reserved3 ;
2008-08-01 16:39:09 +02:00
__u16 subsystemID ;
__u8 reserved2 [ 22 ] ;
2005-04-16 15:20:36 -07:00
} __attribute__ ( ( packed ) ) ;
2008-01-26 14:11:23 +01:00
struct dasd_rssd_features {
char feature [ 256 ] ;
} __attribute__ ( ( packed ) ) ;
2014-10-01 14:39:47 +02:00
struct dasd_rssd_messages {
__u16 length ;
__u8 format ;
__u8 code ;
__u32 message_id ;
__u8 flags ;
char messages [ 4087 ] ;
} __packed ;
struct dasd_cuir_message {
__u16 length ;
__u8 format ;
__u8 code ;
__u32 message_id ;
__u8 flags ;
__u8 neq_map [ 3 ] ;
__u8 ned_map ;
__u8 record_selector ;
} __packed ;
struct dasd_psf_cuir_response {
__u8 order ;
__u8 flags ;
__u8 cc ;
__u8 chpid ;
__u16 device_nr ;
__u16 reserved ;
__u32 message_id ;
__u64 system_id ;
__u8 cssid ;
__u8 ssid ;
} __packed ;
2008-01-26 14:11:23 +01:00
2005-04-16 15:20:36 -07:00
/*
2006-06-29 14:58:12 +02:00
* Perform Subsystem Function - Prepare for Read Subsystem Data
2005-04-16 15:20:36 -07:00
*/
struct dasd_psf_prssd_data {
unsigned char order ;
unsigned char flags ;
unsigned char reserved [ 4 ] ;
unsigned char suborder ;
2008-08-21 19:46:38 +02:00
unsigned char varies [ 5 ] ;
2005-04-16 15:20:36 -07:00
} __attribute__ ( ( packed ) ) ;
2006-06-29 15:08:18 +02:00
/*
* Perform Subsystem Function - Set Subsystem Characteristics
*/
struct dasd_psf_ssc_data {
unsigned char order ;
unsigned char flags ;
unsigned char cu_type [ 4 ] ;
unsigned char suborder ;
unsigned char reserved [ 59 ] ;
} __attribute__ ( ( packed ) ) ;
2008-01-26 14:11:23 +01:00
/*
* some structures and definitions for alias handling
*/
struct dasd_unit_address_configuration {
struct {
char ua_type ;
char base_ua ;
} unit [ 256 ] ;
} __attribute__ ( ( packed ) ) ;
# define MAX_DEVICES_PER_LCU 256
/* flags on the LCU */
# define NEED_UAC_UPDATE 0x01
# define UPDATE_PENDING 0x02
enum pavtype { NO_PAV , BASE_PAV , HYPER_PAV } ;
struct alias_root {
struct list_head serverlist ;
spinlock_t lock ;
} ;
struct alias_server {
struct list_head server ;
struct dasd_uid uid ;
struct list_head lculist ;
} ;
struct summary_unit_check_work_data {
char reason ;
struct dasd_device * device ;
struct work_struct worker ;
} ;
struct read_uac_work_data {
struct dasd_device * device ;
struct delayed_work dwork ;
} ;
struct alias_lcu {
struct list_head lcu ;
struct dasd_uid uid ;
enum pavtype pav ;
char flags ;
spinlock_t lock ;
struct list_head grouplist ;
struct list_head active_devices ;
struct list_head inactive_devices ;
struct dasd_unit_address_configuration * uac ;
struct summary_unit_check_work_data suc_data ;
struct read_uac_work_data ruac_data ;
struct dasd_ccw_req * rsu_cqr ;
2009-12-07 12:51:53 +01:00
struct completion lcu_setup ;
2008-01-26 14:11:23 +01:00
} ;
struct alias_pav_group {
struct list_head group ;
struct dasd_uid uid ;
struct alias_lcu * lcu ;
struct list_head baselist ;
struct list_head aliaslist ;
struct dasd_device * next ;
} ;
2015-08-07 13:20:16 +02:00
struct dasd_conf_data {
struct dasd_ned neds [ 5 ] ;
u8 reserved [ 64 ] ;
struct dasd_gneq gneq ;
} __packed ;
2008-01-26 14:11:23 +01:00
struct dasd_eckd_private {
struct dasd_eckd_characteristics rdc_data ;
2008-08-01 16:39:09 +02:00
u8 * conf_data ;
int conf_len ;
2015-08-07 13:20:16 +02:00
/* per path configuration data */
struct dasd_conf_data * path_conf_data [ 8 ] ;
2008-08-01 16:39:09 +02:00
/* pointers to specific parts in the conf_data */
struct dasd_ned * ned ;
struct dasd_sneq * sneq ;
struct vd_sneq * vdsneq ;
struct dasd_gneq * gneq ;
2008-01-26 14:11:23 +01:00
struct eckd_count count_area [ 5 ] ;
int init_cqr_status ;
int uses_cdl ;
struct attrib_data_t attrib ; /* e.g. cache operations */
struct dasd_rssd_features features ;
2009-03-26 15:23:47 +01:00
u32 real_cyl ;
2008-01-26 14:11:23 +01:00
/* alias managemnet */
struct dasd_uid uid ;
struct alias_pav_group * pavgroup ;
struct alias_lcu * lcu ;
int count ;
2011-01-05 12:48:02 +01:00
u32 fcx_max_data ;
2016-02-23 10:15:27 +01:00
char suc_reason ;
2008-01-26 14:11:23 +01:00
} ;
int dasd_alias_make_device_known_to_lcu ( struct dasd_device * ) ;
void dasd_alias_disconnect_device_from_lcu ( struct dasd_device * ) ;
int dasd_alias_add_device ( struct dasd_device * ) ;
int dasd_alias_remove_device ( struct dasd_device * ) ;
struct dasd_device * dasd_alias_get_start_dev ( struct dasd_device * ) ;
2016-02-23 10:15:27 +01:00
void dasd_alias_handle_summary_unit_check ( struct work_struct * ) ;
2008-01-26 14:11:23 +01:00
void dasd_eckd_reset_ccw_to_base_io ( struct dasd_ccw_req * ) ;
2009-12-07 12:51:53 +01:00
void dasd_alias_lcu_setup_complete ( struct dasd_device * ) ;
void dasd_alias_wait_for_lcu_setup ( struct dasd_device * ) ;
2010-05-17 10:00:10 +02:00
int dasd_alias_update_add_device ( struct dasd_device * ) ;
2005-04-16 15:20:36 -07:00
# endif /* DASD_ECKD_H */