/*
    libparted - a library for manipulating disk partitions
    Copyright (C) 1998 - 2001, 2005 Free Software Foundation, Inc.

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/

/**
 * \addtogroup PedDevice
 * @{
 */

/** \file device.h */

#ifndef PED_DEVICE_H_INCLUDED
#define PED_DEVICE_H_INCLUDED

#include <parted/timer.h>

/** We can address 2^63 sectors */
typedef long long PedSector;

/** \deprecated Removal from API planned */
typedef enum {
        PED_DEVICE_UNKNOWN      = 0,
        PED_DEVICE_SCSI         = 1,
        PED_DEVICE_IDE          = 2,
        PED_DEVICE_DAC960       = 3,
        PED_DEVICE_CPQARRAY     = 4,
        PED_DEVICE_FILE         = 5,
        PED_DEVICE_ATARAID      = 6,
        PED_DEVICE_I2O          = 7,
        PED_DEVICE_UBD          = 8,
        PED_DEVICE_DASD         = 9,
        PED_DEVICE_VIODASD      = 10,
        PED_DEVICE_SX8          = 11
#ifdef ENABLE_DEVICE_MAPPER
                                    ,
        PED_DEVICE_DM           = 12
#endif
} PedDeviceType;

typedef struct _PedDevice PedDevice;
typedef struct _PedDeviceArchOps PedDeviceArchOps;
typedef struct _PedCHSGeometry PedCHSGeometry;

/**
 * A cylinder-head-sector "old-style" geometry.
 * 
 * A device addressed in this way has C*H*S sectors.
 */
struct _PedCHSGeometry {
        int             cylinders;
        int             heads;
        int             sectors;
};

/** A block device - for example, /dev/hda, not /dev/hda3 */
struct _PedDevice {
        PedDevice*      next;

        char*           model;          /**< \brief description of hardware
                                             (manufacturer, model) */
        char*           path;           /**< device /dev entry */

        PedDeviceType   type;           /**< SCSI, IDE, etc.
                                             \deprecated \sa PedDeviceType */
        long long       sector_size;            /**< logical sector size */
        long long       phys_sector_size;       /**< physical sector size */
        PedSector       length;                 /**< device length (LBA) */

        int             open_count; /**< the number of times this device has
                                         been opened with ped_device_open(). */
        int             read_only;
        int             external_mode;
        int             dirty;
        int             boot_dirty;

        PedCHSGeometry  hw_geom;
        PedCHSGeometry  bios_geom;
        short           host, did;

        void*           arch_specific;
};

/**
 * List of functions implementing architecture-specific operations.
 */
struct _PedDeviceArchOps {
        PedDevice* (*_new) (const char* path);
        void (*destroy) (PedDevice* dev);
        int (*is_busy) (PedDevice* dev);
        int (*open) (PedDevice* dev);
        int (*refresh_open) (PedDevice* dev);
        int (*close) (PedDevice* dev);
        int (*refresh_close) (PedDevice* dev);
        int (*read) (const PedDevice* dev, void* buffer,
                     PedSector start, PedSector count);
        int (*write) (PedDevice* dev, const void* buffer,
                      PedSector start, PedSector count);
        int (*sync) (PedDevice* dev);
        int (*sync_fast) (PedDevice* dev);
        PedSector (*check) (PedDevice* dev, void* buffer,
                            PedSector start, PedSector count);
        void (*probe_all) ();
};

extern void ped_device_probe_all ();
extern void ped_device_free_all ();

extern PedDevice* ped_device_get (const char* name);
extern PedDevice* ped_device_get_next (const PedDevice* dev);
extern int ped_device_is_busy (PedDevice* dev);
extern int ped_device_open (PedDevice* dev);
extern int ped_device_close (PedDevice* dev);
extern void ped_device_destroy (PedDevice* dev);
extern void ped_device_cache_remove (PedDevice* dev);

extern int ped_device_begin_external_access (PedDevice* dev);
extern int ped_device_end_external_access (PedDevice* dev);

extern int ped_device_read (const PedDevice* dev, void* buffer,
                            PedSector start, PedSector count);
extern int ped_device_write (PedDevice* dev, const void* buffer,
                             PedSector start, PedSector count);
extern int ped_device_sync (PedDevice* dev);
extern int ped_device_sync_fast (PedDevice* dev);
extern PedSector ped_device_check (PedDevice* dev, void* buffer,
                                   PedSector start, PedSector count);
extern PedConstraint* ped_device_get_constraint (PedDevice* dev);

/* private stuff ;-) */

extern void _ped_device_probe (const char* path);

#endif /* PED_DEVICE_H_INCLUDED */

/** @} */

