[S390] dasd: add hyper PAV support to DASD device driver, part 1
[safe/jmp/linux-2.6] / drivers / s390 / block / dasd_eckd.h
index e15dd79..fc2509c 100644 (file)
@@ -1,7 +1,7 @@
-/* 
+/*
  * File...........: linux/drivers/s390/block/dasd_eckd.h
  * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com>
- *                  Horst Hummel <Horst.Hummel@de.ibm.com> 
+ *                 Horst Hummel <Horst.Hummel@de.ibm.com>
  * Bugreports.to..: <Linux390@de.ibm.com>
  * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000
  *
@@ -29,7 +29,7 @@
 #define DASD_ECKD_CCW_PSF               0x27
 #define DASD_ECKD_CCW_RSSD              0x3e
 #define DASD_ECKD_CCW_LOCATE_RECORD     0x47
-#define DASD_ECKD_CCW_SNSS               0x54
+#define DASD_ECKD_CCW_SNSS              0x54
 #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_READ_CKD_MT       0x9e
 #define DASD_ECKD_CCW_WRITE_CKD_MT      0x9d
 #define DASD_ECKD_CCW_RESERVE           0xB4
+#define DASD_ECKD_CCW_PFX               0xE7
+#define DASD_ECKD_CCW_RSCK              0xF9
 
 /*
- *Perform Subsystem Function / Sub-Orders
+ * Perform Subsystem Function / Sub-Orders
  */
-#define PSF_ORDER_PRSSD                         0x18
+#define PSF_ORDER_PRSSD 0x18
+#define PSF_ORDER_SSC  0x1D
 
 /*****************************************************************************
  * SECTION: Type Definitions
@@ -136,6 +139,25 @@ struct LO_eckd_data {
        __u16 length;
 } __attribute__ ((packed));
 
+/* Prefix data for format 0x00 and 0x01 */
+struct PFX_eckd_data {
+       unsigned char format;
+       struct {
+               unsigned char define_extend:1;
+               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];
+       struct DE_eckd_data define_extend;
+       struct LO_eckd_data locate_record;
+       __u8 LO_extended_data[4];
+} __attribute__ ((packed));
+
 struct dasd_eckd_characteristics {
        __u16 cu_type;
        struct {
@@ -155,7 +177,7 @@ struct dasd_eckd_characteristics {
                unsigned char reserved2:4;
                unsigned char reserved3:8;
                unsigned char defect_wr:1;
-               unsigned char XRC_supported:1; 
+               unsigned char XRC_supported:1;
                unsigned char reserved4:1;
                unsigned char striping:1;
                unsigned char reserved5:4;
@@ -228,26 +250,38 @@ struct dasd_eckd_confdata {
                unsigned char HDA_manufacturer[3];
                unsigned char HDA_location[2];
                unsigned char HDA_seqno[12];
-               __u16 ID;
+               __u8 ID;
+               __u8 unit_addr;
        } __attribute__ ((packed)) ned1;
-       struct {
+       union {
                struct {
-                       unsigned char identifier:2;
-                       unsigned char token_id:1;
-                       unsigned char sno_valid:1;
-                       unsigned char subst_sno:1;
-                       unsigned char recNED:1;
-                       unsigned char emuNED:1;
-                       unsigned char reserved:1;
-               } __attribute__ ((packed)) flags;
-               __u8 descriptor;
-               __u8 reserved[2];
-               unsigned char dev_type[6];
-               unsigned char dev_model[3];
-               unsigned char DASD_manufacturer[3];
-               unsigned char DASD_location[2];
-               unsigned char DASD_seqno[12];
-               __u16 ID;
+                       struct {
+                               unsigned char identifier:2;
+                               unsigned char token_id:1;
+                               unsigned char sno_valid:1;
+                               unsigned char subst_sno:1;
+                               unsigned char recNED:1;
+                               unsigned char emuNED:1;
+                               unsigned char reserved:1;
+                       } __attribute__ ((packed)) flags;
+                       __u8 descriptor;
+                       __u8 reserved[2];
+                       unsigned char dev_type[6];
+                       unsigned char dev_model[3];
+                       unsigned char DASD_manufacturer[3];
+                       unsigned char DASD_location[2];
+                       unsigned char DASD_seqno[12];
+                       __u16 ID;
+               } __attribute__ ((packed)) ned;
+               struct {
+                       unsigned char flags;            /* byte  0    */
+                       unsigned char res1;             /* byte  1    */
+                       __u16 format;                   /* byte  2-3  */
+                       unsigned char res2[4];          /* byte  4-7  */
+                       unsigned char sua_flags;        /* byte  8    */
+                       __u8 base_unit_addr;            /* byte  9    */
+                       unsigned char res3[22];         /* byte 10-31 */
+               } __attribute__ ((packed)) sneq;
        } __attribute__ ((packed)) ned2;
        struct {
                struct {
@@ -332,8 +366,13 @@ struct dasd_eckd_path {
        __u8 npm;
 };
 
+struct dasd_rssd_features {
+       char feature[256];
+} __attribute__((packed));
+
+
 /*
- * Perform Subsystem Function - Prepare for Read Subsystem Data         
+ * Perform Subsystem Function - Prepare for Read Subsystem Data
  */
 struct dasd_psf_prssd_data {
        unsigned char order;
@@ -343,4 +382,110 @@ struct dasd_psf_prssd_data {
        unsigned char varies[9];
 } __attribute__ ((packed));
 
+/*
+ * 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));
+
+
+/*
+ * 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;
+};
+
+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;
+};
+
+
+struct dasd_eckd_private {
+       struct dasd_eckd_characteristics rdc_data;
+       struct dasd_eckd_confdata conf_data;
+       struct dasd_eckd_path path_data;
+       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;
+
+       /* alias managemnet */
+       struct dasd_uid uid;
+       struct alias_pav_group *pavgroup;
+       struct alias_lcu *lcu;
+       int count;
+};
+
+
+
+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 *);
+void dasd_alias_handle_summary_unit_check(struct dasd_device *, struct irb *);
+void dasd_eckd_reset_ccw_to_base_io(struct dasd_ccw_req *);
+
 #endif                         /* DASD_ECKD_H */