root/drivers/block/ide.h

/* [previous][next][first][last][top][bottom][index][help] */

INCLUDED FROM


   1 /*
   2  *  linux/drivers/block/ide.h
   3  *
   4  *  Copyright (C) 1994, 1995  Linus Torvalds & authors
   5  */
   6 
   7 /*
   8  * This is the multiple IDE interface driver, as evolved from hd.c.  
   9  * It supports up to four IDE interfaces, on one or more IRQs (usually 14 & 15).
  10  * There can be up to two drives per interface, as per the ATA-2 spec.
  11  *
  12  * Primary i/f:    ide0: major=3;  (hda)         minor=0; (hdb)         minor=64
  13  * Secondary i/f:  ide1: major=22; (hdc or hd1a) minor=0; (hdd or hd1b) minor=64
  14  * Tertiary i/f:   ide2: major=33; (hde)         minor=0; (hdf)         minor=64
  15  * Quaternary i/f: ide3: major=34; (hdg)         minor=0; (hdh)         minor=64
  16  */
  17 
  18 /******************************************************************************
  19  * IDE driver configuration options (play with these as desired):
  20  */
  21 #undef REALLY_SLOW_IO                   /* most systems can safely undef this */
  22 #include <asm/io.h>
  23 
  24 #define REALLY_FAST_IO                  /* define if ide ports are perfect */
  25 #define INITIAL_MULT_COUNT      0       /* off=0; on=2,4,8,16,32, etc.. */
  26 
  27 #ifndef DISK_RECOVERY_TIME              /* off=0; on=access_delay_time */
  28 #define DISK_RECOVERY_TIME      0       /*  for hardware that needs it */
  29 #endif
  30 #ifndef OK_TO_RESET_CONTROLLER          /* 1 needed for good error recovery */
  31 #define OK_TO_RESET_CONTROLLER  1       /* 0 for use with AH2372A/B interface */
  32 #endif
  33 #ifndef SUPPORT_DTC2278                 /* 1 to support DTC2278 chipset */
  34 #define SUPPORT_DTC2278         1       /* 0 to reduce kernel size */
  35 #endif
  36 #ifndef FANCY_STATUS_DUMPS              /* 1 for human-readable drive errors */
  37 #define FANCY_STATUS_DUMPS      1       /* 0 to reduce kernel size */
  38 #endif
  39 
  40 /*
  41  * IDE_DRIVE_CMD is used to implement many features of the hdparm utility
  42  */
  43 #define IDE_DRIVE_CMD           99      /* (magic) undef to reduce kernel size*/
  44 
  45 /*
  46  *  "No user-serviceable parts" beyond this point  :)
  47  *****************************************************************************/
  48 
  49 typedef unsigned char   byte;   /* used everywhere */
  50 
  51 /*
  52  * Probably not wise to fiddle with these
  53  */
  54 #define ERROR_MAX       8       /* Max read/write errors per sector */
  55 #define ERROR_RESET     3       /* Reset controller every 4th retry */
  56 #define ERROR_RECAL     1       /* Recalibrate every 2nd retry */
  57 
  58 /*
  59  * Ensure that various configuration flags have compatible settings
  60  */
  61 #ifdef REALLY_SLOW_IO
  62 #undef REALLY_FAST_IO
  63 #endif
  64 
  65 /*
  66  * Definitions for accessing IDE controller registers
  67  */
  68 
  69 #define HWIF(drive)             ((ide_hwif_t *)drive->hwif)
  70 #define HWGROUP(drive)          ((ide_hwgroup_t *)(HWIF(drive)->hwgroup))
  71 
  72 #define IDE_DATA_REG            (HWIF(drive)->io_base)
  73 #define IDE_ERROR_REG           (HWIF(drive)->io_base+1)
  74 #define IDE_NSECTOR_REG         (HWIF(drive)->io_base+2)
  75 #define IDE_SECTOR_REG          (HWIF(drive)->io_base+3)
  76 #define IDE_LCYL_REG            (HWIF(drive)->io_base+4)
  77 #define IDE_HCYL_REG            (HWIF(drive)->io_base+5)
  78 #define IDE_SELECT_REG          (HWIF(drive)->io_base+6)
  79 #define IDE_STATUS_REG          (HWIF(drive)->io_base+7)
  80 #define IDE_CONTROL_REG         (HWIF(drive)->ctl_port)
  81 #define IDE_FEATURE_REG         IDE_ERROR_REG
  82 #define IDE_COMMAND_REG         IDE_STATUS_REG
  83 #define IDE_ALTSTATUS_REG       IDE_CONTROL_REG
  84 
  85 #ifdef REALLY_FAST_IO
  86 #define OUT_BYTE(b,p)           outb((b),p)
  87 #define IN_BYTE(p)              (byte)inb(p)
  88 #else
  89 #define OUT_BYTE(b,p)           outb_p((b),p)
  90 #define IN_BYTE(p)              (byte)inb_p(p)
  91 #endif /* REALLY_FAST_IO */
  92 
  93 #define GET_ERR()               IN_BYTE(IDE_ERROR_REG)
  94 #define GET_STAT()              IN_BYTE(IDE_STATUS_REG)
  95 #define OK_STAT(stat,good,bad)  (((stat)&((good)|(bad)))==(good))
  96 #define BAD_R_STAT              (BUSY_STAT   | ERR_STAT)
  97 #define BAD_W_STAT              (BAD_R_STAT  | WRERR_STAT)
  98 #define BAD_STAT                (BAD_R_STAT  | DRQ_STAT)
  99 #define DRIVE_READY             (READY_STAT  | SEEK_STAT)
 100 #define DATA_READY              (DRIVE_READY | DRQ_STAT)
 101 
 102 /*
 103  * Some more useful definitions
 104  */
 105 #define IDE_MAJOR_NAME  "ide"   /* the same for all i/f; see also genhd.c */
 106 #define MAJOR_NAME      IDE_MAJOR_NAME
 107 #define PARTN_BITS      6       /* number of minor dev bits for partitions */
 108 #define PARTN_MASK      ((1<<PARTN_BITS)-1)     /* a useful bit mask */
 109 #define MAX_DRIVES      2       /* per interface; 2 assumed by lots of code */
 110 #define MAX_HWIFS       4       /* an arbitrary, but realistic limit */
 111 #define SECTOR_WORDS    (512 / 4)       /* number of 32bit words per sector */
 112 
 113 /*
 114  * Timeouts for various operations:
 115  */
 116 #define WAIT_DRQ        (5*HZ/100)      /* 50msec - spec allows up to 20ms */
 117 #define WAIT_READY      (3*HZ/100)      /* 30msec - should be instantaneous */
 118 #define WAIT_PIDENTIFY  (1*HZ)  /* 1sec   - should be less than 3ms (?) */
 119 #define WAIT_WORSTCASE  (30*HZ) /* 30sec  - worst case when spinning up */
 120 #define WAIT_CMD        (10*HZ) /* 10sec  - maximum wait for an IRQ to happen */
 121 
 122 #ifdef CONFIG_BLK_DEV_IDECD
 123 
 124 struct packet_command {
 125   char *buffer;
 126   int buflen;
 127   int stat;
 128   unsigned char c[12];
 129 };
 130 
 131 
 132 struct atapi_request_sense {
 133   unsigned char error_code : 7;
 134   unsigned char valid      : 1;
 135   byte reserved1;
 136   unsigned char sense_key  : 4;
 137   unsigned char reserved2  : 1;
 138   unsigned char ili        : 1;
 139   unsigned char reserved3  : 2;
 140   byte info[4];
 141   byte sense_len;
 142   byte command_info[4];
 143   byte asc;
 144   byte ascq;
 145   byte fru;
 146   byte sense_key_specific[3];
 147 };
 148 
 149 /* Space to hold the disk TOC. */
 150 
 151 #define MAX_TRACKS 99
 152 struct atapi_toc_header {
 153   unsigned short toc_length;
 154   byte first_track;
 155   byte last_track;
 156 };
 157 
 158 struct atapi_toc_entry {
 159   byte reserved1;
 160   unsigned control : 4;
 161   unsigned adr     : 4;
 162   byte track;
 163   byte reserved2;
 164   unsigned lba;
 165 };
 166 
 167 struct atapi_toc {
 168   struct atapi_toc_header hdr;
 169   struct atapi_toc_entry  ent[MAX_TRACKS+1];  /* One extra for the leadout. */
 170 };
 171 
 172 /* Extra per-device info for cdrom drives. */
 173 struct cdrom_info {
 174 
 175   /* Buffer for table of contents.  NULL if we haven't allocated
 176      a TOC buffer for this device yet. */
 177 
 178   struct atapi_toc *toc;
 179 
 180   /* Sector buffer.  If a read request wants only the first part of a cdrom
 181      block, we cache the rest of the block here, in the expectation that that
 182      data is going to be wanted soon.  SECTOR_BUFFERED is the number of the
 183      first buffered sector, and NSECTORS_BUFFERED is the number of sectors
 184      in the buffer.  Before the buffer is allocated, we should have
 185      SECTOR_BUFFER == NULL and NSECTORS_BUFFERED == 0. */
 186 
 187   unsigned long sector_buffered;
 188   unsigned long nsectors_buffered;
 189   char *sector_buffer;
 190 
 191   /* The result of the last successful request sense command
 192      on this device. */
 193   struct atapi_request_sense sense_data;
 194 };
 195 
 196 #endif /* CONFIG_BLK_DEV_IDECD */
 197 
 198 /*
 199  * Now for the data we need to maintain per-drive:  ide_drive_t
 200  */
 201 typedef enum {disk, cdrom} media_t;
 202 
 203 typedef union {
 204         unsigned all                    : 8;    /* all of the bits together */
 205         struct {
 206                 unsigned set_geometry   : 1;    /* respecify drive geometry */
 207                 unsigned recalibrate    : 1;    /* seek to cyl 0      */
 208                 unsigned set_multmode   : 1;    /* set multmode count */
 209                 unsigned reserved       : 5;    /* unused */
 210                 } b;
 211         } special_t;
 212 
 213 typedef union {
 214         unsigned all                    : 8;    /* all of the bits together */
 215         struct {
 216                 unsigned head           : 4;    /* always zeros here */
 217                 unsigned unit           : 1;    /* drive select number, 0 or 1 */
 218                 unsigned bit5           : 1;    /* always 1 */
 219                 unsigned lba            : 1;    /* using LBA instead of CHS */
 220                 unsigned bit7           : 1;    /* always 1 */
 221         } b;
 222         } select_t;
 223 
 224 typedef struct ide_drive_s {
 225         special_t       special;        /* special action flags */
 226         unsigned present        : 1;    /* drive is physically present */
 227         unsigned noprobe        : 1;    /* from:  hdx=noprobe */
 228         unsigned keep_settings  : 1;    /* restore settings after drive reset */
 229         unsigned busy           : 1;    /* currently doing revalidate_disk() */
 230         unsigned vlb_32bit      : 1;    /* use 32bit in/out for data */
 231         unsigned vlb_sync       : 1;    /* needed for some 32bit chip sets */
 232         unsigned removeable     : 1;    /* 1 if need to do check_media_change */
 233         unsigned dma_capable    : 1;    /* for Intel Triton chipset, others.. */
 234         select_t        select;         /* basic drive/head select reg value */
 235         byte            unmask;         /* flag: okay to unmask other irqs */
 236         void            *hwif;          /* actually (ide_hwif_t *) */
 237         byte            ctl;            /* "normal" value for IDE_CONTROL_REG */
 238         byte            ready_stat;     /* min status value for drive ready */
 239         byte            wpcom;          /* ignored by all IDE drives */
 240         media_t         media;          /* disk, cdrom, tape */
 241         byte            mult_count;     /* current multiple sector setting */
 242         byte            mult_req;       /* requested multiple sector setting */
 243         byte            chipset;        /* interface chipset access method */
 244         byte            bad_wstat;      /* used for ignoring WRERR_STAT */
 245         byte            sect0;          /* offset of first sector for DM6:DDO */
 246         byte            usage;          /* current "open()" count for drive */
 247         byte            head;           /* "real" number of heads */
 248         byte            sect;           /* "real" sectors per track */
 249         byte            bios_head;      /* BIOS/fdisk/LILO number of heads */
 250         byte            bios_sect;      /* BIOS/fdisk/LILO sectors per track */
 251         unsigned short  bios_cyl;       /* BIOS/fdisk/LILO number of cyls */
 252         unsigned short  cyl;            /* "real" number of cyls */
 253         struct wait_queue *wqueue;      /* used to wait for drive in open() */
 254         struct hd_driveid *id;          /* drive model identification info */
 255         struct hd_struct  *part;        /* drive partition table */
 256         char            name[4];        /* drive name, such as "hda" */
 257 #ifdef CONFIG_BLK_DEV_IDECD
 258         struct cdrom_info cdrom_info;   /* from ide-cd.c */
 259 #endif /* CONFIG_BLK_DEV_IDECD */
 260         } ide_drive_t;
 261 
 262 typedef struct hwif_s {
 263         struct hwif_s   *next;          /* for linked-list in ide_hwgroup_t */
 264         void            *hwgroup;       /* actually (ide_hwgroup_t *) */
 265         unsigned short  io_base;        /* base io port addr */
 266         unsigned short  ctl_port;       /* usually io_base+0x206 */
 267         ide_drive_t             drives[MAX_DRIVES];     /* drive info */
 268         struct gendisk  *gd;            /* gendisk structure */
 269         byte            irq;            /* our irq number */
 270         byte            major;          /* our major number */
 271         byte            drivecount;     /* how many drives attached */
 272         char            name[5];        /* name of interface, eg. "ide0" */
 273         unsigned        noprobe : 1;    /* don't probe for this interface */
 274         unsigned        present : 1;    /* this interface exists */
 275         unsigned long   reset_timeout;  /* timeout value during ide resets */
 276 #if (DISK_RECOVERY_TIME > 0)
 277         unsigned long   last_timer;     /* time when previous rq was done */
 278 #endif
 279 #ifdef CONFIG_BLK_DEV_IDECD
 280         struct request request_sense_request;   /* from ide-cd.c */
 281         struct packet_command request_sense_pc; /* from ide-cd.c */
 282 #endif /* CONFIG_BLK_DEV_IDECD */
 283         } ide_hwif_t;
 284 
 285 /*
 286  *  our internal interrupt handler type
 287  */
 288 typedef void (ide_handler_t)(ide_drive_t *);
 289 
 290 typedef struct hwgroup_s {
 291         ide_handler_t           *handler;/* irq handler, if active */
 292         ide_drive_t             *drive; /* current drive */
 293         ide_hwif_t              *hwif;  /* ptr to current hwif in linked-list */
 294         struct request          *rq;    /* current request */
 295         struct timer_list       timer;  /* failsafe timer */
 296         struct request          wrq;    /* local copy of current write rq */
 297         } ide_hwgroup_t;
 298 
 299 /*
 300  * One final include file, which references some of the data/defns from above
 301  */
 302 #define IDE_DRIVER      /* "parameter" for blk.h */
 303 #include "blk.h"
 304 
 305 #if (DISK_RECOVERY_TIME > 0)
 306 void ide_set_recovery_timer (ide_hwif_t *);
 307 #define SET_RECOVERY_TIMER(drive) ide_set_recovery_timer (drive)
 308 #else
 309 #define SET_RECOVERY_TIMER(drive)
 310 #endif
 311 
 312 /*
 313  * The main (re-)entry point for handling a new request is IDE_DO_REQUEST.
 314  * Note that IDE_DO_REQUEST should *only* ever be invoked from an interrupt
 315  * handler.  All others, such as a timer expiry handler, should call
 316  * do_hwgroup_request() instead (currently local to ide.c).
 317  */
 318 void ide_do_request (ide_hwgroup_t *);
 319 #define IDE_DO_REQUEST { SET_RECOVERY_TIMER(HWIF(drive)); ide_do_request(HWGROUP(drive)); }
 320 
 321 
 322 /*
 323  * This is used for (nearly) all data transfers from the IDE interface
 324  */
 325 void ide_input_data (ide_drive_t *drive, void *buffer, unsigned int wcount);
 326 
 327 /*
 328  * This is used for (nearly) all data transfers to the IDE interface
 329  */
 330 void ide_output_data (ide_drive_t *drive, void *buffer, unsigned int wcount);
 331 
 332 /*
 333  * This is used on exit from the driver, to designate the next irq handler
 334  * and also to start the safety timer.
 335  */
 336 void ide_set_handler (ide_drive_t *drive, ide_handler_t *handler);
 337 
 338 /*
 339  * Error reporting, in human readable form (luxurious, but a memory hog).
 340  */
 341 byte ide_dump_status (ide_drive_t *drive, const char *msg, byte stat);
 342 
 343 /*
 344  * ide_error() takes action based on the error returned by the controller.
 345  *
 346  * Returns 1 if an ide reset operation has been initiated, in which case
 347  * the caller MUST simply return from the driver (through however many levels).
 348  * Returns 0 otherwise.
 349  */
 350 int ide_error (ide_drive_t *drive, const char *msg, byte stat);
 351 
 352 /*
 353  * This routine busy-waits for the drive status to be not "busy".
 354  * It then checks the status for all of the "good" bits and none
 355  * of the "bad" bits, and if all is okay it returns 0.  All other
 356  * cases return 1 after invoking ide_error()
 357  *
 358  */
 359 int ide_wait_stat (ide_drive_t *drive, byte good, byte bad, unsigned long timeout);
 360 
 361 /*
 362  * This is called from genhd.c to correct DiskManager/EZ-Drive geometries
 363  */
 364 int ide_xlate_1024(dev_t, int, const char *);
 365 
 366 #ifdef CONFIG_BLK_DEV_IDECD
 367 /*
 368  * These are routines in ide-cd.c invoked from ide.c
 369  */
 370 void ide_do_rw_cdrom (ide_drive_t *, unsigned long);
 371 int ide_cdrom_ioctl (ide_drive_t *, struct inode *, struct file *, unsigned int, unsigned long);
 372 int ide_cdrom_check_media_change (ide_drive_t *);
 373 int ide_cdrom_open (struct inode *, struct file *, ide_drive_t *);
 374 void ide_cdrom_release (struct inode *, struct file *, ide_drive_t *);
 375 void ide_cdrom_setup (ide_drive_t *);
 376 #endif /* CONFIG_BLK_DEV_IDECD */

/* [previous][next][first][last][top][bottom][index][help] */