/*
 * File...........: s390-tools/fdasd/fdasd.h
 * Author(s)......: Volker Sameske <sameske@de.ibm.com>
 *                  Horst Hummel   <Horst.Hummel@de.ibm.com>
 * Bugreports.to..: <Linux390@de.ibm.com>
 * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2001-2002
 *
 * History of changes (starts March 2001)
 * version 1.01 - menu entry 's' to show mapping devnode - DS name
 *         1.02 - DS names count now from 0001 instead from 0000
 *         1.03 - volser checks: 'AA AAA' to 'AAAAA '
 *              - removed dependency to kernel headers.
 *         1.04 - added -p option
 *         1.05 - new API policy, set it back to 0
 */
#ifndef FDASD_H
#define FDASD_H

#include <parted/vtoc.h>

/*****************************************************************************
 * SECTION: Definitions needed for DASD-API (see dasd.h)                     *
 *****************************************************************************/

#define DASD_IOCTL_LETTER 'D'

#define DASD_PARTN_BITS 2

#define PARTITION_LINUX_SWAP    0x82
#define PARTITION_LINUX         0x83
#define PARTITION_LINUX_EXT     0x85
#define PARTITION_LINUX_LVM     0x8e
#define PARTITION_LINUX_RAID    0xfd
#define PARTITION_LINUX_LVM_OLD 0xfe

#define PART_TYPE_NATIVE "NATIVE"
#define PART_TYPE_SWAP   "SWAP  "
#define PART_TYPE_RAID   "RAID  "
#define PART_TYPE_LVM    "LVM   "

#ifdef DEBUG_DASD
#define PDEBUG           fprintf(stderr, "%s:%d:%s\n", \
                         __FILE__,                              \
                         __LINE__,                              \
                         __PRETTY_FUNCTION__);
#else
#define PDEBUG
#endif

/* 
 * struct dasd_information_t
 * represents any data about the device, which is visible to userspace.
 *  including foramt and featueres.
 */
typedef struct dasd_information_t {
	unsigned int devno;           /* S/390 devno                         */
	unsigned int real_devno;      /* for aliases                         */
	unsigned int schid;           /* S/390 subchannel identifier         */
	unsigned int cu_type  : 16;   /* from SenseID                        */
	unsigned int cu_model :  8;   /* from SenseID                        */
	unsigned int dev_type : 16;   /* from SenseID                        */
	unsigned int dev_model : 8;   /* from SenseID                        */
	unsigned int open_count; 
	unsigned int req_queue_len; 
	unsigned int chanq_len;       /* length of chanq                     */
	char type[4];                 /* from discipline.name, 'none' for    */
	                              /* unknown                             */
	unsigned int status;          /* current device level                */
	unsigned int label_block;     /* where to find the VOLSER            */
	unsigned int FBA_layout;      /* fixed block size (like AIXVOL)      */
	unsigned int characteristics_size;
	unsigned int confdata_size;
	char characteristics[64];     /* from read_device_characteristics    */
	char configuration_data[256]; /* from read_configuration_data        */
} dasd_information_t;

/* 
 * struct format_data_t
 * represents all data necessary to format a dasd
 */
typedef struct format_data_t {
	int start_unit; /* from track */
	int stop_unit;  /* to track */
	int blksize;    /* sectorsize */
	int intensity;  
} format_data_t;

/*
 * values to be used for format_data_t.intensity
 * 0/8: normal format
 * 1/9: also write record zero
 * 3/11: also write home address
 * 4/12: invalidate track
 */
#define DASD_FMT_INT_FMT_R0 1 /* write record zero */
#define DASD_FMT_INT_FMT_HA 2 /* write home address, also set FMT_R0 ! */
#define DASD_FMT_INT_INVAL  4 /* invalidate tracks */
#define DASD_FMT_INT_COMPAT 8 /* use OS/390 compatible disk layout */


/* Disable the volume (for Linux) */
#define BIODASDDISABLE _IO(DASD_IOCTL_LETTER,0) 
/* Enable the volume (for Linux) */
#define BIODASDENABLE  _IO(DASD_IOCTL_LETTER,1)  

/* retrieve API version number */
#define DASDAPIVER     _IOR(DASD_IOCTL_LETTER,0,int)
/* Get information on a dasd device (enhanced) */
#define BIODASDINFO   _IOR(DASD_IOCTL_LETTER,1,dasd_information_t)


/*****************************************************************************
 * SECTION: Further IOCTL Definitions  (see fs.h)                            *
 *****************************************************************************/
/* re-read partition table */
#define BLKRRPART  _IO(0x12,95)	
/* get block device sector size */
#define BLKSSZGET  _IO(0x12,104)

/*****************************************************************************
 * SECTION: Definition from hdreq.h                                          *
 *****************************************************************************/

struct fdasd_hd_geometry {
      unsigned char heads;
      unsigned char sectors;
      unsigned short cylinders;
      unsigned long start;
};

/* get device geometry */
#define HDIO_GETGEO		0x0301	

/*****************************************************************************
 * SECTION: FDASD internal types                                             *
 *****************************************************************************/

#define DASD_MIN_API_VERSION 0

#define DEFAULT_FDASD_CONF "/etc/fdasd.conf" /* default config file */

#define PARTN_MASK ((1 << DASD_PARTN_BITS) - 1)
#define USABLE_PARTITIONS ((1 << DASD_PARTN_BITS) - 1)

#define FDASD_VERSION "1.05"
#define FDASD_ERROR "fdasd error: "
#define DEVICE "device"
#define DISC   "disc"
#define PART   "part"

#define ALTERNATE_CYLINDERS_USED 0x10

typedef struct partition_info {
	u_int8_t used;
	unsigned long start_trk;
	unsigned long end_trk;
	unsigned long len_trk;
	unsigned long fspace_trk;
	format1_label_t *f1; 
	struct partition_info *next;
	struct partition_info *prev;
	u_int8_t type;
} partition_info_t;

typedef struct config_data {
	unsigned long start;
	unsigned long stop;
} config_data_t;

typedef struct fdasd_anchor {
	int vlabel_changed;
	int vtoc_changed;
	int devname_specified;
	int volid_specified;
	int config_specified;
	int auto_partition;
	int print_table;
	int big_disk;
	int silent;
	int verbose;
	int devno;
	int option_reuse;
	int option_recreate;
	int partno[USABLE_PARTITIONS];
	u_int16_t dev_type;
	unsigned int used_partitions;
	unsigned long label_pos;
	unsigned int  blksize;
	unsigned long fspace_trk;
	format4_label_t  *f4;
	format5_label_t  *f5;
	format7_label_t  *f7;
	partition_info_t *first;
	partition_info_t *last;
	volume_label_t   *vlabel;
	config_data_t confdata[USABLE_PARTITIONS];
	struct fdasd_hd_geometry geo;
} fdasd_anchor_t;

enum offset {lower, upper};

enum fdasd_failure {
	unable_to_open_disk,
	unable_to_seek_disk,
	unable_to_read_disk,
	read_only_disk,
	unable_to_ioctl,
	api_version_mismatch,
	wrong_disk_type,
	wrong_disk_format,
	disk_in_use,
	config_syntax_error,
	vlabel_corrupted,
	dsname_corrupted,
	malloc_failed,
	device_verification_failed
};

void fdasd_cleanup (fdasd_anchor_t *anchor);
void fdasd_initialize_anchor (fdasd_anchor_t * anc);
void fdasd_get_geometry (fdasd_anchor_t *anc, int fd);
void fdasd_check_api_version (fdasd_anchor_t *anc, int fd);
int fdasd_check_volume (fdasd_anchor_t *anc, int fd);
int fdasd_write_labels (fdasd_anchor_t *anc, int fd);
int fdasd_invalid_vtoc_pointer(fdasd_anchor_t *anc);
void fdasd_recreate_vtoc(fdasd_anchor_t *anc);
partition_info_t * fdasd_add_partition (fdasd_anchor_t *anc,
                                        unsigned int start, unsigned int stop);
int fdasd_prepare_labels (fdasd_anchor_t *anc, int fd) ;

#endif /* FDASD_H */
