Home | History | Annotate | Download | only in ext2fs
      1 /*
      2  * v1.0
      3  *
      4  * Disk I/O include file for the ext2fs/DOS library.
      5  *
      6  * Copyright (c) 1997 Mark Habersack
      7  *
      8  * %Begin-Header%
      9  * This file may be redistributed under the terms of the GNU Library
     10  * General Public License, version 2.
     11  * %End-Header%
     12  */
     13 
     14 #ifndef __diskio_h
     15 #define __diskio_h
     16 #ifdef __TURBOC__
     17 #ifndef __LARGE__
     18 # error "ext2fs/DOS library requires LARGE model!"
     19 #endif
     20 #endif
     21 
     22 #ifdef __TURBOC__
     23 #include "msdos.h"
     24 #endif
     25 
     26 /*
     27  * A helper structure used in LBA => CHS conversion
     28  */
     29 typedef struct
     30 {
     31   unsigned short       cyl;     /* Cylinder (or track) */
     32   unsigned short       head;
     33   unsigned short       sector;
     34   unsigned short       offset;  /* Offset of byte within the sector */
     35 } CHS;
     36 
     37 /*
     38  * All partition data we need is here
     39  */
     40 typedef struct
     41 {
     42   char                 *dev;  /* _Linux_ device name (like "/dev/hda1") */
     43   unsigned char        phys;  /* Physical DOS drive number */
     44   unsigned long        start; /* LBA address of partition start */
     45   unsigned long        len;   /* length of partition in sectors */
     46   unsigned char        pno;   /* Partition number (read from *dev) */
     47 
     48   /* This partition's drive geometry */
     49   unsigned short       cyls;
     50   unsigned short       heads;
     51   unsigned short       sects;
     52 } PARTITION;
     53 
     54 /*
     55  * PC partition table entry format
     56  */
     57 #ifdef __DJGPP__
     58 #pragma pack(1)
     59 #endif
     60 typedef struct
     61 {
     62   unsigned char        active;
     63   unsigned char        start_head;
     64   unsigned char        start_sec;
     65   unsigned char        start_cyl;
     66   unsigned char        type;
     67   unsigned char        end_head;
     68   unsigned char        end_sec;
     69   unsigned char        end_cyl;
     70   unsigned long        first_sec_rel;
     71   unsigned long        size;
     72 } PTABLE_ENTRY;
     73 #ifdef __DJGPP__
     74 #pragma pack()
     75 #endif
     76 
     77 /*
     78  * INT 0x13 operation codes
     79  */
     80 #define DISK_READ          0x02
     81 #define DISK_WRITE         0x03
     82 #define DISK_GET_GEOMETRY  0x08
     83 #define DISK_READY         0x10
     84 
     85 /*
     86  * Errors to put in _dio_error
     87  */
     88 #define ERR_BADDEV         0x00000001L
     89 #define ERR_HARDWARE       0x00000002L
     90 #define ERR_NOTSUPP        0x00000003L
     91 #define ERR_NOTEXT2FS      0x00000004L
     92 #define ERR_EMPTYPART      0x00000005L
     93 #define ERR_LINUXSWAP      0x00000006L
     94 
     95 /*
     96  * Functions in diskio.c
     97  */
     98 
     99 /*
    100  * Variable contains last module's error
    101  */
    102 extern unsigned long        _dio_error;
    103 
    104 /*
    105  * This one contains last hardware error (if _dio_error == ERR_HARDWARE)
    106  */
    107 extern unsigned long        _dio_hw_error;
    108 
    109 /*
    110  * Macros to check for disk hardware errors
    111  */
    112 #define HW_OK()             ((unsigned char)_dio_hw_error == 0x00)
    113 #define HW_BAD_CMD()        ((unsigned char)_dio_hw_error == 0x01)
    114 #define HW_NO_ADDR_MARK()   ((unsigned char)_dio_hw_error == 0x02)
    115 #define HW_WRITE_PROT()     ((unsigned char)_dio_hw_error == 0x03)
    116 #define HW_NO_SECTOR()      ((unsigned char)_dio_hw_error == 0x04)
    117 #define HW_RESET_FAIL()     ((unsigned char)_dio_hw_error == 0x05)
    118 #define HW_DISK_CHANGED()   ((unsigned char)_dio_hw_error == 0x06)
    119 #define HW_DRIVE_FAIL()     ((unsigned char)_dio_hw_error == 0x07)
    120 #define HW_DMA_OVERRUN()    ((unsigned char)_dio_hw_error == 0x08)
    121 #define HW_DMA_BOUNDARY()   ((unsigned char)_dio_hw_error == 0x09)
    122 #define HW_BAD_SECTOR()     ((unsigned char)_dio_hw_error == 0x0A)
    123 #define HW_BAD_TRACK()      ((unsigned char)_dio_hw_error == 0x0B)
    124 #define HW_UNSUPP_TRACK()   ((unsigned char)_dio_hw_error == 0x0C)
    125 #define HW_BAD_CRC_ECC()    ((unsigned char)_dio_hw_error == 0x10)
    126 #define HW_CRC_ECC_CORR()   ((unsigned char)_dio_hw_error == 0x11)
    127 #define HW_CONTR_FAIL()     ((unsigned char)_dio_hw_error == 0x20)
    128 #define HW_SEEK_FAIL()      ((unsigned char)_dio_hw_error == 0x40)
    129 #define HW_ATTACH_FAIL()    ((unsigned char)_dio_hw_error == 0x80)
    130 #define HW_DRIVE_NREADY()   ((unsigned char)_dio_hw_error == 0xAA)
    131 #define HW_UNDEF_ERROR()    ((unsigned char)_dio_hw_error == 0xBB)
    132 #define HW_WRITE_FAULT()    ((unsigned char)_dio_hw_error == 0xCC)
    133 #define HW_STATUS_ERROR()   ((unsigned char)_dio_hw_error == 0xE0)
    134 #define HW_SENSE_FAIL()     ((unsigned char)_dio_hw_error == 0xFF)
    135 
    136 
    137 /*
    138  * Open the specified partition.
    139  * String 'dev' must have a format:
    140  *
    141  *  /dev/{sd|hd|fd}[X]
    142  *
    143  * where,
    144  *
    145  *  only one of the option in curly braces can be used and X is an optional
    146  *  partition number for the given device. If X is not specified, function
    147  *  scans the drive's partition table in search for the first Linux ext2fs
    148  *  partition (signature 0x83). Along the way it dives into every extended
    149  *  partition encountered.
    150  *  Scan ends if either (a) there are no more used partition entries, or
    151  *  (b) there is no Xth partition.
    152  *
    153  * Routine returns 0 on success and !=0 otherwise.
    154  */
    155 int open_partition(char *dev);
    156 
    157 #endif /* __diskio_h */
    158