Annotation of Gnu-Mach/i386/i386at/gpl/linux/block/ide.h, revision 1.1

1.1     ! root        1: /*
        !             2:  *  linux/drivers/block/ide.h
        !             3:  *
        !             4:  *  Copyright (C) 1994, 1995  Linus Torvalds & authors
        !             5:  */
        !             6: 
        !             7: #include <linux/config.h>
        !             8: 
        !             9: /*
        !            10:  * This is the multiple IDE interface driver, as evolved from hd.c.  
        !            11:  * It supports up to four IDE interfaces, on one or more IRQs (usually 14 & 15).
        !            12:  * There can be up to two drives per interface, as per the ATA-2 spec.
        !            13:  *
        !            14:  * Primary i/f:    ide0: major=3;  (hda)         minor=0; (hdb)         minor=64
        !            15:  * Secondary i/f:  ide1: major=22; (hdc or hd1a) minor=0; (hdd or hd1b) minor=64
        !            16:  * Tertiary i/f:   ide2: major=33; (hde)         minor=0; (hdf)         minor=64
        !            17:  * Quaternary i/f: ide3: major=34; (hdg)         minor=0; (hdh)         minor=64
        !            18:  */
        !            19: 
        !            20: /******************************************************************************
        !            21:  * IDE driver configuration options (play with these as desired):
        !            22:  * 
        !            23:  * REALLY_SLOW_IO can be defined in ide.c and ide-cd.c, if necessary
        !            24:  */
        !            25: #undef REALLY_FAST_IO                  /* define if ide ports are perfect */
        !            26: #define INITIAL_MULT_COUNT     0       /* off=0; on=2,4,8,16,32, etc.. */
        !            27: 
        !            28: #ifndef SUPPORT_VLB_SYNC               /* 1 to support weird 32-bit chips */
        !            29: #define SUPPORT_VLB_SYNC       1       /* 0 to reduce kernel size */
        !            30: #endif
        !            31: #ifndef DISK_RECOVERY_TIME             /* off=0; on=access_delay_time */
        !            32: #define DISK_RECOVERY_TIME     0       /*  for hardware that needs it */
        !            33: #endif
        !            34: #ifndef OK_TO_RESET_CONTROLLER         /* 1 needed for good error recovery */
        !            35: #define OK_TO_RESET_CONTROLLER 1       /* 0 for use with AH2372A/B interface */
        !            36: #endif
        !            37: #ifndef FAKE_FDISK_FOR_EZDRIVE         /* 1 to help linux fdisk with EZDRIVE */
        !            38: #define FAKE_FDISK_FOR_EZDRIVE         1       /* 0 to reduce kernel size */
        !            39: #endif
        !            40: #ifndef FANCY_STATUS_DUMPS             /* 1 for human-readable drive errors */
        !            41: #define FANCY_STATUS_DUMPS     1       /* 0 to reduce kernel size */
        !            42: #endif
        !            43: 
        !            44: #if defined(CONFIG_BLK_DEV_IDECD) || defined(CONFIG_BLK_DEV_IDETAPE)
        !            45: #define CONFIG_BLK_DEV_IDEATAPI 1
        !            46: #endif
        !            47: 
        !            48: /*
        !            49:  * IDE_DRIVE_CMD is used to implement many features of the hdparm utility
        !            50:  */
        !            51: #define IDE_DRIVE_CMD          99      /* (magic) undef to reduce kernel size*/
        !            52: 
        !            53: /*
        !            54:  *  "No user-serviceable parts" beyond this point  :)
        !            55:  *****************************************************************************/
        !            56: 
        !            57: typedef unsigned char  byte;   /* used everywhere */
        !            58: 
        !            59: /*
        !            60:  * Probably not wise to fiddle with these
        !            61:  */
        !            62: #define ERROR_MAX      8       /* Max read/write errors per sector */
        !            63: #define ERROR_RESET    3       /* Reset controller every 4th retry */
        !            64: #define ERROR_RECAL    1       /* Recalibrate every 2nd retry */
        !            65: 
        !            66: /*
        !            67:  * Ensure that various configuration flags have compatible settings
        !            68:  */
        !            69: #ifdef REALLY_SLOW_IO
        !            70: #undef REALLY_FAST_IO
        !            71: #endif
        !            72: 
        !            73: /*
        !            74:  * Definitions for accessing IDE controller registers
        !            75:  */
        !            76: 
        !            77: #define HWIF(drive)            ((ide_hwif_t *)drive->hwif)
        !            78: #define HWGROUP(drive)         ((ide_hwgroup_t *)(HWIF(drive)->hwgroup))
        !            79: 
        !            80: #define IDE_DATA_OFFSET                (0)
        !            81: #define IDE_ERROR_OFFSET       (1)
        !            82: #define IDE_NSECTOR_OFFSET     (2)
        !            83: #define IDE_SECTOR_OFFSET      (3)
        !            84: #define IDE_LCYL_OFFSET                (4)
        !            85: #define IDE_HCYL_OFFSET                (5)
        !            86: #define IDE_SELECT_OFFSET      (6)
        !            87: #define IDE_STATUS_OFFSET      (7)
        !            88: #define IDE_FEATURE_OFFSET     IDE_ERROR_OFFSET
        !            89: #define IDE_COMMAND_OFFSET     IDE_STATUS_OFFSET
        !            90: 
        !            91: #define IDE_DATA_REG           (HWIF(drive)->io_base+IDE_DATA_OFFSET)
        !            92: #define IDE_ERROR_REG          (HWIF(drive)->io_base+IDE_ERROR_OFFSET)
        !            93: #define IDE_NSECTOR_REG                (HWIF(drive)->io_base+IDE_NSECTOR_OFFSET)
        !            94: #define IDE_SECTOR_REG         (HWIF(drive)->io_base+IDE_SECTOR_OFFSET)
        !            95: #define IDE_LCYL_REG           (HWIF(drive)->io_base+IDE_LCYL_OFFSET)
        !            96: #define IDE_HCYL_REG           (HWIF(drive)->io_base+IDE_HCYL_OFFSET)
        !            97: #define IDE_SELECT_REG         (HWIF(drive)->io_base+IDE_SELECT_OFFSET)
        !            98: #define IDE_STATUS_REG         (HWIF(drive)->io_base+IDE_STATUS_OFFSET)
        !            99: #define IDE_CONTROL_REG                (HWIF(drive)->ctl_port)
        !           100: #define IDE_FEATURE_REG                IDE_ERROR_REG
        !           101: #define IDE_COMMAND_REG                IDE_STATUS_REG
        !           102: #define IDE_ALTSTATUS_REG      IDE_CONTROL_REG
        !           103: 
        !           104: #ifdef REALLY_FAST_IO
        !           105: #define OUT_BYTE(b,p)          outb((b),p)
        !           106: #define IN_BYTE(p)             (byte)inb(p)
        !           107: #else
        !           108: #define OUT_BYTE(b,p)          outb_p((b),p)
        !           109: #define IN_BYTE(p)             (byte)inb_p(p)
        !           110: #endif /* REALLY_FAST_IO */
        !           111: 
        !           112: #define GET_ERR()              IN_BYTE(IDE_ERROR_REG)
        !           113: #define GET_STAT()             IN_BYTE(IDE_STATUS_REG)
        !           114: #define OK_STAT(stat,good,bad) (((stat)&((good)|(bad)))==(good))
        !           115: #define BAD_R_STAT             (BUSY_STAT   | ERR_STAT)
        !           116: #define BAD_W_STAT             (BAD_R_STAT  | WRERR_STAT)
        !           117: #define BAD_STAT               (BAD_R_STAT  | DRQ_STAT)
        !           118: #define DRIVE_READY            (READY_STAT  | SEEK_STAT)
        !           119: #define DATA_READY             (DRIVE_READY | DRQ_STAT)
        !           120: 
        !           121: /*
        !           122:  * Some more useful definitions
        !           123:  */
        !           124: #define IDE_MAJOR_NAME "ide"   /* the same for all i/f; see also genhd.c */
        !           125: #define MAJOR_NAME     IDE_MAJOR_NAME
        !           126: #define PARTN_BITS     6       /* number of minor dev bits for partitions */
        !           127: #define PARTN_MASK     ((1<<PARTN_BITS)-1)     /* a useful bit mask */
        !           128: #define MAX_DRIVES     2       /* per interface; 2 assumed by lots of code */
        !           129: #define MAX_HWIFS      4       /* an arbitrary, but realistic limit */
        !           130: #define SECTOR_WORDS   (512 / 4)       /* number of 32bit words per sector */
        !           131: 
        !           132: /*
        !           133:  * Timeouts for various operations:
        !           134:  */
        !           135: #define WAIT_DRQ       (5*HZ/100)      /* 50msec - spec allows up to 20ms */
        !           136: #define WAIT_READY     (3*HZ/100)      /* 30msec - should be instantaneous */
        !           137: #define WAIT_PIDENTIFY (1*HZ)  /* 1sec   - should be less than 3ms (?) */
        !           138: #define WAIT_WORSTCASE (30*HZ) /* 30sec  - worst case when spinning up */
        !           139: #define WAIT_CMD       (10*HZ) /* 10sec  - maximum wait for an IRQ to happen */
        !           140: 
        !           141: #ifdef CONFIG_BLK_DEV_IDETAPE
        !           142: #include "ide-tape.h"
        !           143: #endif /* CONFIG_BLK_DEV_IDETAPE */
        !           144: 
        !           145: #ifdef CONFIG_BLK_DEV_IDECD
        !           146: 
        !           147: struct atapi_request_sense {
        !           148:   unsigned char error_code : 7;
        !           149:   unsigned char valid      : 1;
        !           150:   byte reserved1;
        !           151:   unsigned char sense_key  : 4;
        !           152:   unsigned char reserved2  : 1;
        !           153:   unsigned char ili        : 1;
        !           154:   unsigned char reserved3  : 2;
        !           155:   byte info[4];
        !           156:   byte sense_len;
        !           157:   byte command_info[4];
        !           158:   byte asc;
        !           159:   byte ascq;
        !           160:   byte fru;
        !           161:   byte sense_key_specific[3];
        !           162: };
        !           163: 
        !           164: struct packet_command {
        !           165:   char *buffer;
        !           166:   int buflen;
        !           167:   int stat;
        !           168:   struct atapi_request_sense *sense_data;
        !           169:   unsigned char c[12];
        !           170: };
        !           171: 
        !           172: /* Space to hold the disk TOC. */
        !           173: 
        !           174: #define MAX_TRACKS 99
        !           175: struct atapi_toc_header {
        !           176:   unsigned short toc_length;
        !           177:   byte first_track;
        !           178:   byte last_track;
        !           179: };
        !           180: 
        !           181: struct atapi_toc_entry {
        !           182:   byte reserved1;
        !           183:   unsigned control : 4;
        !           184:   unsigned adr     : 4;
        !           185:   byte track;
        !           186:   byte reserved2;
        !           187:   union {
        !           188:     unsigned lba;
        !           189:     struct {
        !           190:       byte reserved3;
        !           191:       byte m;
        !           192:       byte s;
        !           193:       byte f;
        !           194:     } msf;
        !           195:   } addr;
        !           196: };
        !           197: 
        !           198: struct atapi_toc {
        !           199:   int    last_session_lba;
        !           200:   int    xa_flag;
        !           201:   unsigned capacity;
        !           202:   struct atapi_toc_header hdr;
        !           203:   struct atapi_toc_entry  ent[MAX_TRACKS+1];  /* One extra for the leadout. */
        !           204: };
        !           205: 
        !           206: 
        !           207: /* This structure is annoyingly close to, but not identical with,
        !           208:    the cdrom_subchnl structure from cdrom.h. */
        !           209: struct atapi_cdrom_subchnl 
        !           210: {
        !           211:   u_char  acdsc_reserved;
        !           212:   u_char  acdsc_audiostatus;
        !           213:   u_short acdsc_length;
        !           214:   u_char  acdsc_format;
        !           215: 
        !           216:   u_char  acdsc_adr:   4;
        !           217:   u_char  acdsc_ctrl:  4;
        !           218:   u_char  acdsc_trk;
        !           219:   u_char  acdsc_ind;
        !           220:   union
        !           221:   {
        !           222:     struct                     
        !           223:     {
        !           224:       u_char   minute;
        !           225:       u_char   second;
        !           226:       u_char   frame;
        !           227:     } msf;
        !           228:     int        lba;
        !           229:   } acdsc_absaddr;
        !           230:   union 
        !           231:   {
        !           232:     struct 
        !           233:     {
        !           234:       u_char   minute;
        !           235:       u_char   second;
        !           236:       u_char   frame;
        !           237:     } msf;
        !           238:     int        lba;
        !           239:   } acdsc_reladdr;
        !           240: };
        !           241: 
        !           242: 
        !           243: /* Extra per-device info for cdrom drives. */
        !           244: struct cdrom_info {
        !           245: 
        !           246:   /* Buffer for table of contents.  NULL if we haven't allocated
        !           247:      a TOC buffer for this device yet. */
        !           248: 
        !           249:   struct atapi_toc *toc;
        !           250: 
        !           251:   /* Sector buffer.  If a read request wants only the first part of a cdrom
        !           252:      block, we cache the rest of the block here, in the expectation that that
        !           253:      data is going to be wanted soon.  SECTOR_BUFFERED is the number of the
        !           254:      first buffered sector, and NSECTORS_BUFFERED is the number of sectors
        !           255:      in the buffer.  Before the buffer is allocated, we should have
        !           256:      SECTOR_BUFFER == NULL and NSECTORS_BUFFERED == 0. */
        !           257: 
        !           258:   unsigned long sector_buffered;
        !           259:   unsigned long nsectors_buffered;
        !           260:   char *sector_buffer;
        !           261: 
        !           262:   /* The result of the last successful request sense command
        !           263:      on this device. */
        !           264:   struct atapi_request_sense sense_data;
        !           265: };
        !           266: 
        !           267: #endif /* CONFIG_BLK_DEV_IDECD */
        !           268: 
        !           269: /*
        !           270:  * Now for the data we need to maintain per-drive:  ide_drive_t
        !           271:  */
        !           272: 
        !           273: typedef enum {ide_disk, ide_cdrom, ide_tape} ide_media_t;
        !           274: 
        !           275: typedef union {
        !           276:        unsigned all                    : 8;    /* all of the bits together */
        !           277:        struct {
        !           278:                unsigned set_geometry   : 1;    /* respecify drive geometry */
        !           279:                unsigned recalibrate    : 1;    /* seek to cyl 0      */
        !           280:                unsigned set_multmode   : 1;    /* set multmode count */
        !           281:                unsigned set_pio        : 1;    /* set pio mode */
        !           282:                unsigned reserved       : 4;    /* unused */
        !           283:                } b;
        !           284:        } special_t;
        !           285: 
        !           286: typedef union {
        !           287:        unsigned all                    : 8;    /* all of the bits together */
        !           288:        struct {
        !           289:                unsigned head           : 4;    /* always zeros here */
        !           290:                unsigned unit           : 1;    /* drive select number, 0 or 1 */
        !           291:                unsigned bit5           : 1;    /* always 1 */
        !           292:                unsigned lba            : 1;    /* using LBA instead of CHS */
        !           293:                unsigned bit7           : 1;    /* always 1 */
        !           294:        } b;
        !           295:        } select_t;
        !           296: 
        !           297: typedef struct ide_drive_s {
        !           298:        special_t       special;        /* special action flags */
        !           299:        unsigned present        : 1;    /* drive is physically present */
        !           300:        unsigned noprobe        : 1;    /* from:  hdx=noprobe */
        !           301:        unsigned keep_settings  : 1;    /* restore settings after drive reset */
        !           302:        unsigned busy           : 1;    /* currently doing revalidate_disk() */
        !           303:        unsigned removeable     : 1;    /* 1 if need to do check_media_change */
        !           304:        unsigned using_dma      : 1;    /* disk is using dma for read/write */
        !           305:        unsigned forced_geom    : 1;    /* 1 if hdx=c,h,s was given at boot */
        !           306:        unsigned unmask         : 1;    /* flag: okay to unmask other irqs */
        !           307:        unsigned autotune       : 2;    /* 1=autotune, 2=noautotune, 0=default */
        !           308: #if FAKE_FDISK_FOR_EZDRIVE
        !           309:        unsigned remap_0_to_1   : 1;    /* flag: partitioned with ezdrive */
        !           310: #endif /* FAKE_FDISK_FOR_EZDRIVE */
        !           311:        ide_media_t     media;          /* disk, cdrom, tape */
        !           312:        select_t        select;         /* basic drive/head select reg value */
        !           313:        byte            ctl;            /* "normal" value for IDE_CONTROL_REG */
        !           314:        byte            ready_stat;     /* min status value for drive ready */
        !           315:        byte            mult_count;     /* current multiple sector setting */
        !           316:        byte            mult_req;       /* requested multiple sector setting */
        !           317:        byte            pio_req;        /* requested multiple sector setting */
        !           318:        byte            io_32bit;       /* 0=16-bit, 1=32-bit, 2/3=32bit+sync */
        !           319:        byte            bad_wstat;      /* used for ignoring WRERR_STAT */
        !           320:        byte            sect0;          /* offset of first sector for DM6:DDO */
        !           321:        byte            usage;          /* current "open()" count for drive */
        !           322:        byte            head;           /* "real" number of heads */
        !           323:        byte            sect;           /* "real" sectors per track */
        !           324:        byte            bios_head;      /* BIOS/fdisk/LILO number of heads */
        !           325:        byte            bios_sect;      /* BIOS/fdisk/LILO sectors per track */
        !           326:        unsigned short  bios_cyl;       /* BIOS/fdisk/LILO number of cyls */
        !           327:        unsigned short  cyl;            /* "real" number of cyls */
        !           328:        void              *hwif;        /* actually (ide_hwif_t *) */
        !           329:        struct wait_queue *wqueue;      /* used to wait for drive in open() */
        !           330:        struct hd_driveid *id;          /* drive model identification info */
        !           331:        struct hd_struct  *part;        /* drive partition table */
        !           332:        char            name[4];        /* drive name, such as "hda" */
        !           333: #ifdef CONFIG_BLK_DEV_IDECD
        !           334:        struct cdrom_info cdrom_info;   /* for ide-cd.c */
        !           335: #endif /* CONFIG_BLK_DEV_IDECD */
        !           336: #ifdef CONFIG_BLK_DEV_IDETAPE
        !           337:        idetape_tape_t  tape;           /* for ide-tape.c */
        !           338: #endif /* CONFIG_BLK_DEV_IDETAPE */
        !           339: 
        !           340:        } ide_drive_t;
        !           341: 
        !           342: /*
        !           343:  * An ide_dmaproc_t() initiates/aborts DMA read/write operations on a drive.
        !           344:  *
        !           345:  * The caller is assumed to have selected the drive and programmed the drive's
        !           346:  * sector address using CHS or LBA.  All that remains is to prepare for DMA
        !           347:  * and then issue the actual read/write DMA/PIO command to the drive.
        !           348:  *
        !           349:  * Returns 0 if all went well.
        !           350:  * Returns 1 if DMA read/write could not be started, in which case the caller
        !           351:  * should either try again later, or revert to PIO for the current request.
        !           352:  */
        !           353: typedef enum { ide_dma_read = 0,       ide_dma_write = 1,
        !           354:                ide_dma_abort = 2,      ide_dma_check = 3,
        !           355:                ide_dma_status_bad = 4, ide_dma_transferred = 5,
        !           356:                ide_dma_begin = 6 }
        !           357:        ide_dma_action_t;
        !           358: 
        !           359: typedef int (ide_dmaproc_t)(ide_dma_action_t, ide_drive_t *);
        !           360: 
        !           361: 
        !           362: /*
        !           363:  * An ide_tuneproc_t() is used to set the speed of an IDE interface
        !           364:  * to a particular PIO mode.  The "byte" parameter is used
        !           365:  * to select the PIO mode by number (0,1,2,3,4,5), and a value of 255
        !           366:  * indicates that the interface driver should "auto-tune" the PIO mode
        !           367:  * according to the drive capabilities in drive->id;
        !           368:  *
        !           369:  * Not all interface types support tuning, and not all of those
        !           370:  * support all possible PIO settings.  They may silently ignore
        !           371:  * or round values as they see fit.
        !           372:  */
        !           373: typedef void (ide_tuneproc_t)(ide_drive_t *, byte);
        !           374: 
        !           375: /*
        !           376:  * This is used to provide HT6560B interface support.
        !           377:  * It will probably also be used by the DC4030VL driver.
        !           378:  */
        !           379: typedef void (ide_selectproc_t) (ide_drive_t *);
        !           380: 
        !           381: /*
        !           382:  * hwif_chipset_t is used to keep track of the specific hardware
        !           383:  * chipset used by each IDE interface, if known.
        !           384:  */
        !           385: typedef enum { ide_unknown,    ide_generic,    ide_triton,
        !           386:                ide_cmd640,     ide_dtc2278,    ide_ali14xx,
        !           387:                ide_qd6580,     ide_umc8672,    ide_ht6560b }
        !           388:        hwif_chipset_t;
        !           389: 
        !           390: typedef struct hwif_s {
        !           391:        struct hwif_s   *next;          /* for linked-list in ide_hwgroup_t */
        !           392:        void            *hwgroup;       /* actually (ide_hwgroup_t *) */
        !           393:        unsigned short  io_base;        /* base io port addr */
        !           394:        unsigned short  ctl_port;       /* usually io_base+0x206 */
        !           395:        ide_drive_t     drives[MAX_DRIVES];     /* drive info */
        !           396:        struct gendisk  *gd;            /* gendisk structure */
        !           397:        ide_tuneproc_t  *tuneproc;      /* routine to tune PIO mode for drives */
        !           398: #ifdef CONFIG_BLK_DEV_HT6560B
        !           399:        ide_selectproc_t *selectproc;   /* tweaks hardware to select drive */
        !           400: #endif /* CONFIG_BLK_DEV_HT6560B */
        !           401:        ide_dmaproc_t   *dmaproc;       /* dma read/write/abort routine */
        !           402:        unsigned long   *dmatable;      /* dma physical region descriptor table */
        !           403:        unsigned short  dma_base;       /* base addr for dma ports (triton) */
        !           404:        byte            irq;            /* our irq number */
        !           405:        byte            major;          /* our major number */
        !           406:        char            name[5];        /* name of interface, eg. "ide0" */
        !           407:        byte            index;          /* 0 for ide0; 1 for ide1; ... */
        !           408:        hwif_chipset_t  chipset;        /* sub-module for tuning.. */
        !           409:        unsigned        noprobe : 1;    /* don't probe for this interface */
        !           410:        unsigned        present : 1;    /* this interface exists */
        !           411:        unsigned        serialized : 1; /* valid only for ide_hwifs[0] */
        !           412:        unsigned        no_unmask : 1;  /* disallow setting unmask bits */
        !           413: #if (DISK_RECOVERY_TIME > 0)
        !           414:        unsigned long   last_time;      /* time when previous rq was done */
        !           415: #endif
        !           416: #ifdef CONFIG_BLK_DEV_IDECD
        !           417:        struct request request_sense_request;   /* from ide-cd.c */
        !           418:        struct packet_command request_sense_pc; /* from ide-cd.c */
        !           419: #endif /* CONFIG_BLK_DEV_IDECD */
        !           420: #ifdef CONFIG_BLK_DEV_IDETAPE
        !           421:        ide_drive_t     *tape_drive;    /* Pointer to the tape on this interface */
        !           422: #endif /* CONFIG_BLK_DEV_IDETAPE */
        !           423:        } ide_hwif_t;
        !           424: 
        !           425: /*
        !           426:  *  internal ide interrupt handler type
        !           427:  */
        !           428: typedef void (ide_handler_t)(ide_drive_t *);
        !           429: 
        !           430: typedef struct hwgroup_s {
        !           431:        ide_handler_t           *handler;/* irq handler, if active */
        !           432:        ide_drive_t             *drive; /* current drive */
        !           433:        ide_hwif_t              *hwif;  /* ptr to current hwif in linked-list */
        !           434:        struct request          *rq;    /* current request */
        !           435:        struct timer_list       timer;  /* failsafe timer */
        !           436:        struct request          wrq;    /* local copy of current write rq */
        !           437:        unsigned long           poll_timeout;   /* timeout value during long polls */
        !           438:        } ide_hwgroup_t;
        !           439: 
        !           440: /*
        !           441:  * ide_hwifs[] is the master data structure used to keep track
        !           442:  * of just about everything in ide.c.  Whenever possible, routines
        !           443:  * should be using pointers to a drive (ide_drive_t *) or 
        !           444:  * pointers to a hwif (ide_hwif_t *), rather than indexing this
        !           445:  * structure directly (the allocation/layout may change!).
        !           446:  */
        !           447: #ifdef _IDE_C
        !           448:        ide_hwif_t      ide_hwifs[MAX_HWIFS];   /* master data repository */
        !           449: #else
        !           450: extern ide_hwif_t      ide_hwifs[];
        !           451: #endif
        !           452: 
        !           453: /*
        !           454:  * One final include file, which references some of the data/defns from above
        !           455:  */
        !           456: #define IDE_DRIVER     /* "parameter" for blk.h */
        !           457: #include <linux/blk.h>
        !           458: 
        !           459: #if (DISK_RECOVERY_TIME > 0)
        !           460: void ide_set_recovery_timer (ide_hwif_t *);
        !           461: #define SET_RECOVERY_TIMER(drive) ide_set_recovery_timer (drive)
        !           462: #else
        !           463: #define SET_RECOVERY_TIMER(drive)
        !           464: #endif
        !           465: 
        !           466: /*
        !           467:  * This is used for (nearly) all data transfers from the IDE interface
        !           468:  */
        !           469: void ide_input_data (ide_drive_t *drive, void *buffer, unsigned int wcount);
        !           470: 
        !           471: /*
        !           472:  * This is used for (nearly) all data transfers to the IDE interface
        !           473:  */
        !           474: void ide_output_data (ide_drive_t *drive, void *buffer, unsigned int wcount);
        !           475: 
        !           476: /*
        !           477:  * This is used on exit from the driver, to designate the next irq handler
        !           478:  * and also to start the safety timer.
        !           479:  */
        !           480: void ide_set_handler (ide_drive_t *drive, ide_handler_t *handler, unsigned int timeout);
        !           481: 
        !           482: /*
        !           483:  * Error reporting, in human readable form (luxurious, but a memory hog).
        !           484:  */
        !           485: byte ide_dump_status (ide_drive_t *drive, const char *msg, byte stat);
        !           486: 
        !           487: /*
        !           488:  * ide_error() takes action based on the error returned by the controller.
        !           489:  * The calling function must return afterwards, to restart the request.
        !           490:  */
        !           491: void ide_error (ide_drive_t *drive, const char *msg, byte stat);
        !           492: 
        !           493: /*
        !           494:  * ide_fixstring() cleans up and (optionally) byte-swaps a text string,
        !           495:  * removing leading/trailing blanks and compressing internal blanks.
        !           496:  * It is primarily used to tidy up the model name/number fields as
        !           497:  * returned by the WIN_[P]IDENTIFY commands.
        !           498:  */
        !           499: void ide_fixstring (byte *s, const int bytecount, const int byteswap);
        !           500: 
        !           501: /*
        !           502:  * This routine busy-waits for the drive status to be not "busy".
        !           503:  * It then checks the status for all of the "good" bits and none
        !           504:  * of the "bad" bits, and if all is okay it returns 0.  All other
        !           505:  * cases return 1 after invoking ide_error() -- caller should return.
        !           506:  *
        !           507:  */
        !           508: int ide_wait_stat (ide_drive_t *drive, byte good, byte bad, unsigned long timeout);
        !           509: 
        !           510: /*
        !           511:  * This routine is called from the partition-table code in genhd.c
        !           512:  * to "convert" a drive to a logical geometry with fewer than 1024 cyls.
        !           513:  *
        !           514:  * The second parameter, "xparm", determines exactly how the translation
        !           515:  * will be handled:
        !           516:  *              0 = convert to CHS with fewer than 1024 cyls
        !           517:  *                     using the same method as Ontrack DiskManager.
        !           518:  *              1 = same as "0", plus offset everything by 63 sectors.
        !           519:  *             -1 = similar to "0", plus redirect sector 0 to sector 1.
        !           520:  *             >1 = convert to a CHS geometry with "xparm" heads.
        !           521:  *
        !           522:  * Returns 0 if the translation was not possible, if the device was not
        !           523:  * an IDE disk drive, or if a geometry was "forced" on the commandline.
        !           524:  * Returns 1 if the geometry translation was successful.
        !           525:  */
        !           526: int ide_xlate_1024 (kdev_t, int, const char *);
        !           527: 
        !           528: /*
        !           529:  * Start a reset operation for an IDE interface.
        !           530:  * The caller should return immediately after invoking this.
        !           531:  */
        !           532: void ide_do_reset (ide_drive_t *);
        !           533: 
        !           534: /*
        !           535:  * This function is intended to be used prior to invoking ide_do_drive_cmd().
        !           536:  */
        !           537: void ide_init_drive_cmd (struct request *rq);
        !           538: 
        !           539: /*
        !           540:  * "action" parameter type for ide_do_drive_cmd() below.
        !           541:  */
        !           542: typedef enum
        !           543:        {ide_wait,      /* insert rq at end of list, and wait for it */
        !           544:         ide_next,      /* insert rq immediately after current request */
        !           545:         ide_preempt,   /* insert rq in front of current request */
        !           546:         ide_end}       /* insert rq at end of list, but don't wait for it */
        !           547:  ide_action_t;
        !           548: 
        !           549: /*
        !           550:  * This function issues a special IDE device request
        !           551:  * onto the request queue.
        !           552:  *
        !           553:  * If action is ide_wait, then then rq is queued at the end of
        !           554:  * the request queue, and the function sleeps until it has been
        !           555:  * processed.  This is for use when invoked from an ioctl handler.
        !           556:  *
        !           557:  * If action is ide_preempt, then the rq is queued at the head of
        !           558:  * the request queue, displacing the currently-being-processed
        !           559:  * request and this function returns immediately without waiting
        !           560:  * for the new rq to be completed.  This is VERY DANGEROUS, and is
        !           561:  * intended for careful use by the ATAPI tape/cdrom driver code.
        !           562:  *
        !           563:  * If action is ide_next, then the rq is queued immediately after
        !           564:  * the currently-being-processed-request (if any), and the function
        !           565:  * returns without waiting for the new rq to be completed.  As above,
        !           566:  * This is VERY DANGEROUS, and is intended for careful use by the 
        !           567:  * ATAPI tape/cdrom driver code.
        !           568:  *
        !           569:  * If action is ide_end, then the rq is queued at the end of the
        !           570:  * request queue, and the function returns immediately without waiting
        !           571:  * for the new rq to be completed. This is again intended for careful
        !           572:  * use by the ATAPI tape/cdrom driver code. (Currently used by ide-tape.c,
        !           573:  * when operating in the pipelined operation mode).
        !           574:  */
        !           575: int ide_do_drive_cmd (ide_drive_t *drive, struct request *rq, ide_action_t action);
        !           576:  
        !           577: /*
        !           578:  * Clean up after success/failure of an explicit drive cmd.
        !           579:  * stat/err are used only when (HWGROUP(drive)->rq->cmd == IDE_DRIVE_CMD).
        !           580:  */
        !           581: void ide_end_drive_cmd (ide_drive_t *drive, byte stat, byte err);
        !           582: 
        !           583: #ifdef CONFIG_BLK_DEV_IDECD
        !           584: /*
        !           585:  * These are routines in ide-cd.c invoked from ide.c
        !           586:  */
        !           587: void ide_do_rw_cdrom (ide_drive_t *, unsigned long);
        !           588: int ide_cdrom_ioctl (ide_drive_t *, struct inode *, struct file *, unsigned int, unsigned long);
        !           589: int ide_cdrom_check_media_change (ide_drive_t *);
        !           590: int ide_cdrom_open (struct inode *, struct file *, ide_drive_t *);
        !           591: void ide_cdrom_release (struct inode *, struct file *, ide_drive_t *);
        !           592: void ide_cdrom_setup (ide_drive_t *);
        !           593: #endif /* CONFIG_BLK_DEV_IDECD */
        !           594: 
        !           595: #ifdef CONFIG_BLK_DEV_IDETAPE
        !           596: 
        !           597: /*
        !           598:  *     Functions in ide-tape.c which are invoked from ide.c:
        !           599:  */
        !           600: 
        !           601: /*
        !           602:  *     idetape_identify_device is called during device probing stage to
        !           603:  *     probe for an ide atapi tape drive and to initialize global variables
        !           604:  *     in ide-tape.c which provide the link between the character device
        !           605:  *     and the correspoding block device.
        !           606:  *
        !           607:  *     Returns 1 if an ide tape was detected and is supported.
        !           608:  *     Returns 0 otherwise.
        !           609:  */
        !           610:  
        !           611: int idetape_identify_device (ide_drive_t *drive,struct hd_driveid *id);
        !           612: 
        !           613: /*
        !           614:  *     idetape_setup is called a bit later than idetape_identify_device,
        !           615:  *     during the search for disk partitions, to initialize various tape
        !           616:  *     state variables in ide_drive_t *drive.
        !           617:  */
        !           618:  
        !           619: void idetape_setup (ide_drive_t *drive);
        !           620: 
        !           621: /*
        !           622:  *     idetape_do_request is our request function. It is called by ide.c
        !           623:  *     to process a new request.
        !           624:  */
        !           625: 
        !           626: void idetape_do_request (ide_drive_t *drive, struct request *rq, unsigned long block);
        !           627: 
        !           628: /*
        !           629:  *     idetape_end_request is used to finish servicing a request, and to
        !           630:  *     insert a pending pipeline request into the main device queue.
        !           631:  */
        !           632:  
        !           633: void idetape_end_request (byte uptodate, ide_hwgroup_t *hwgroup);
        !           634: 
        !           635: /*
        !           636:  *     Block device interface functions.
        !           637:  */
        !           638:   
        !           639: int idetape_blkdev_ioctl (ide_drive_t *drive, struct inode *inode, struct file *file,
        !           640:                        unsigned int cmd, unsigned long arg);
        !           641: int idetape_blkdev_open (struct inode *inode, struct file *filp, ide_drive_t *drive);
        !           642: void idetape_blkdev_release (struct inode *inode, struct file *filp, ide_drive_t *drive);
        !           643: 
        !           644: /*
        !           645:  *     idetape_register_chrdev initializes the character device interface to
        !           646:  *     the ide tape drive.
        !           647:  */
        !           648:  
        !           649: void idetape_register_chrdev (void);
        !           650: 
        !           651: #endif /* CONFIG_BLK_DEV_IDETAPE */
        !           652: 
        !           653: #ifdef CONFIG_BLK_DEV_TRITON
        !           654: void ide_init_triton (byte, byte);
        !           655: #endif /* CONFIG_BLK_DEV_TRITON */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.