Annotation of Gnu-Mach/i386/i386at/gpl/linux/block/ide.h, revision 1.1.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.