/* 
 * File...........: linux/drivers/s390/block/dasd_diag.h
 * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com>
 * Based on.......: linux/drivers/s390/block/mdisk.h
 * ...............: by Hartmunt Penner <hpenner@de.ibm.com>
 * Bugreports.to..: <Linux390@de.ibm.com>
 * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000
 *
 * $Revision: 1.7 $
 */

#define MDSK_WRITE_REQ 0x01
#define MDSK_READ_REQ  0x02

#define INIT_BIO	0x00
#define RW_BIO		0x01
#define TERM_BIO	0x02

#define DEV_CLASS_FBA	0x01
#define DEV_CLASS_ECKD	0x04

#define DASD_DIAG_LC_INT_CODE		132
#define DASD_DIAG_LC_INT_STATUS		133
#define DASD_DIAG_LC_INT_PARM_31BIT	128
#define DASD_DIAG_LC_INT_PARM_64BIT	4536
#define DASD_DIAG_CODE_31BIT		0x03
#define DASD_DIAG_CODE_64BIT		0x07

#define DASD_DIAG_RWFLAG_ASYNC		0x02
#define DASD_DIAG_RWFLAG_NOCACHE	0x01

#define DASD_DIAG_FLAGA_FORMAT_64BIT	0x80

struct dasd_diag_characteristics {
	u16 dev_nr;
	u16 rdc_len;
	u8 vdev_class;
	u8 vdev_type;
	u8 vdev_status;
	u8 vdev_flags;
	u8 rdev_class;
	u8 rdev_type;
	u8 rdev_model;
	u8 rdev_features;
} __attribute__ ((packed, aligned(4)));

struct dasd_diag_cms_label {
	u8 label_id[4];
	u8 vol_id[6];
	u16 version_id;
	u32 block_size;
	u32 origin_ptr;
	u32 usable_count;
	u32 formatted_count;
	u32 block_count;
	u32 used_count;
	u32 fst_size;
	u32 fst_count;
	u8 format_date[6];
	u8 reserved1[2];
	u32 disk_offset;
	u32 map_block;
	u32 hblk_disp;
	u32 user_disp;
	u8 reserved2[4];
	u8 segment_name[8];
} __attribute__ ((packed));

#ifdef CONFIG_ARCH_S390X
#define DASD_DIAG_FLAGA_DEFAULT		DASD_DIAG_FLAGA_FORMAT_64BIT

typedef u64 blocknum_t;
typedef s64 sblocknum_t;

struct dasd_diag_bio {
	u8 type;
	u8 status;
	u8 spare1[2];
	u32 alet;
	blocknum_t block_number;
	u64 buffer;
} __attribute__ ((packed, aligned(8)));

struct dasd_diag_init_io {
	u16 dev_nr;
	u8 flaga;
	u8 spare1[21];
	u32 block_size;
	u8 spare2[4];
	blocknum_t offset;
	sblocknum_t start_block;
	blocknum_t end_block;
	u8  spare3[8];
} __attribute__ ((packed, aligned(8)));

struct dasd_diag_rw_io {
	u16 dev_nr;
	u8  flaga;
	u8  spare1[21];
	u8  key;
	u8  flags;
	u8  spare2[2];
	u32 block_count;
	u32 alet;
	u8  spare3[4];
	u64 interrupt_params;
	u64 bio_list;
	u8  spare4[8];
} __attribute__ ((packed, aligned(8)));
#else /* CONFIG_ARCH_S390X */
#define DASD_DIAG_FLAGA_DEFAULT		0x0

typedef u32 blocknum_t;
typedef s32 sblocknum_t;

struct dasd_diag_bio {
	u8 type;
	u8 status;
	u16 spare1;
	blocknum_t block_number;
	u32 alet;
	u32 buffer;
} __attribute__ ((packed, aligned(8)));

struct dasd_diag_init_io {
	u16 dev_nr;
	u8 flaga;
	u8 spare1[21];
	u32 block_size;
	blocknum_t offset;
	sblocknum_t start_block;
	blocknum_t end_block;
	u8 spare2[24];
} __attribute__ ((packed, aligned(8)));

struct dasd_diag_rw_io {
	u16 dev_nr;
	u8 flaga;
	u8 spare1[21];
	u8 key;
	u8 flags;
	u8 spare2[2];
	u32 block_count;
	u32 alet;
	u32 bio_list;
	u32 interrupt_params;
	u8 spare3[20];
} __attribute__ ((packed, aligned(8)));
#endif /* CONFIG_ARCH_S390X */
