Annotation of Gnu-Mach/linux/src/drivers/block/ide_modes.h, revision 1.1.1.1

1.1       root        1: #ifndef _IDE_MODES_H
                      2: #define _IDE_MODES_H
                      3: /*
                      4:  *  linux/drivers/block/ide_modes.h
                      5:  *
                      6:  *  Copyright (C) 1996  Linus Torvalds, Igor Abramov, and Mark Lord
                      7:  */
                      8: 
                      9: #include <linux/config.h>
                     10: 
                     11: /*
                     12:  * Shared data/functions for determining best PIO mode for an IDE drive.
                     13:  * Most of this stuff originally lived in cmd640.c, and changes to the
                     14:  * ide_pio_blacklist[] table should be made with EXTREME CAUTION to avoid
                     15:  * breaking the fragile cmd640.c support.
                     16:  */
                     17: 
                     18: #if defined(CONFIG_BLK_DEV_CMD640) || defined(CONFIG_IDE_CHIPSETS)
                     19: 
                     20: /*
                     21:  * Standard (generic) timings for PIO modes, from ATA2 specification.
                     22:  * These timings are for access to the IDE data port register *only*.
                     23:  * Some drives may specify a mode, while also specifying a different
                     24:  * value for cycle_time (from drive identification data).
                     25:  */
                     26: typedef struct ide_pio_timings_s {
                     27:        int     setup_time;     /* Address setup (ns) minimum */
                     28:        int     active_time;    /* Active pulse (ns) minimum */
                     29:        int     cycle_time;     /* Cycle time (ns) minimum = (setup + active + recovery) */
                     30: } ide_pio_timings_t;
                     31: 
                     32: typedef struct ide_pio_data_s {
                     33:        byte pio_mode;
                     34:        byte use_iordy;
                     35:        byte overridden;
                     36:        byte blacklisted;
                     37:        unsigned int cycle_time;
                     38: } ide_pio_data_t;
                     39:        
                     40: #ifndef _IDE_C
                     41: 
                     42: int ide_scan_pio_blacklist (char *model);
                     43: byte ide_get_best_pio_mode (ide_drive_t *drive, byte mode_wanted, byte max_mode, ide_pio_data_t *d);
                     44: extern const ide_pio_timings_t ide_pio_timings[6];
                     45: 
                     46: #else /* _IDE_C */
                     47: 
                     48: const ide_pio_timings_t ide_pio_timings[6] = {
                     49:        { 70,   165,    600 },  /* PIO Mode 0 */
                     50:        { 50,   125,    383 },  /* PIO Mode 1 */
                     51:        { 30,   100,    240 },  /* PIO Mode 2 */
                     52:        { 30,   80,     180 },  /* PIO Mode 3 with IORDY */
                     53:        { 25,   70,     120 },  /* PIO Mode 4 with IORDY */
                     54:        { 20,   50,     100 }   /* PIO Mode 5 with IORDY (nonstandard) */
                     55: };
                     56: 
                     57: /*
                     58:  * Black list. Some drives incorrectly report their maximal PIO mode,
                     59:  * at least in respect to CMD640. Here we keep info on some known drives.
                     60:  */
                     61: static struct ide_pio_info {
                     62:        const char      *name;
                     63:        int             pio;
                     64: } ide_pio_blacklist [] = {
                     65: /*     { "Conner Peripherals 1275MB - CFS1275A", 4 }, */
                     66:        { "Conner Peripherals 540MB - CFS540A", 3 },
                     67: 
                     68:        { "WDC AC2700",  3 },
                     69:        { "WDC AC2540",  3 },
                     70:        { "WDC AC2420",  3 },
                     71:        { "WDC AC2340",  3 },
                     72:        { "WDC AC2250",  0 },
                     73:        { "WDC AC2200",  0 },
                     74:        { "WDC AC21200", 4 },
                     75:        { "WDC AC2120",  0 },
                     76:        { "WDC AC2850",  3 },
                     77:        { "WDC AC1270",  3 },
                     78:        { "WDC AC1170",  1 },
                     79:        { "WDC AC1210",  1 },
                     80:        { "WDC AC280",   0 },
                     81: /*     { "WDC AC21000", 4 }, */
                     82:        { "WDC AC31000", 3 },
                     83:        { "WDC AC31200", 3 },
                     84: /*     { "WDC AC31600", 4 }, */
                     85: 
                     86:        { "Maxtor 7131 AT", 1 },
                     87:        { "Maxtor 7171 AT", 1 },
                     88:        { "Maxtor 7213 AT", 1 },
                     89:        { "Maxtor 7245 AT", 1 },
                     90:        { "Maxtor 7345 AT", 1 },
                     91:        { "Maxtor 7546 AT", 3 },
                     92:        { "Maxtor 7540 AV", 3 },
                     93: 
                     94:        { "SAMSUNG SHD-3121A", 1 },
                     95:        { "SAMSUNG SHD-3122A", 1 },
                     96:        { "SAMSUNG SHD-3172A", 1 },
                     97: 
                     98: /*     { "ST51080A", 4 },
                     99:  *     { "ST51270A", 4 },
                    100:  *     { "ST31220A", 4 },
                    101:  *     { "ST31640A", 4 },
                    102:  *     { "ST32140A", 4 },
                    103:  *     { "ST3780A",  4 },
                    104:  */
                    105:        { "ST5660A",  3 },
                    106:        { "ST3660A",  3 },
                    107:        { "ST3630A",  3 },
                    108:        { "ST3655A",  3 },
                    109:        { "ST3391A",  3 },
                    110:        { "ST3390A",  1 },
                    111:        { "ST3600A",  1 },
                    112:        { "ST3290A",  0 },
                    113:        { "ST3144A",  0 },
                    114: 
                    115:        { "QUANTUM ELS127A", 0 },
                    116:        { "QUANTUM ELS170A", 0 },
                    117:        { "QUANTUM LPS240A", 0 },
                    118:        { "QUANTUM LPS210A", 3 },
                    119:        { "QUANTUM LPS270A", 3 },
                    120:        { "QUANTUM LPS365A", 3 },
                    121:        { "QUANTUM LPS540A", 3 },
                    122:        { "QUANTUM LIGHTNING 540A", 3 },
                    123:        { "QUANTUM LIGHTNING 730A", 3 },
                    124:        { "QUANTUM FIREBALL", 3 }, /* For models 540/640/1080/1280 */
                    125:                                   /* 1080A works fine in mode4 with triton */
                    126:        { NULL, 0 }
                    127: };
                    128: 
                    129: /*
                    130:  * This routine searches the ide_pio_blacklist for an entry
                    131:  * matching the start/whole of the supplied model name.
                    132:  *
                    133:  * Returns -1 if no match found.
                    134:  * Otherwise returns the recommended PIO mode from ide_pio_blacklist[].
                    135:  */
                    136: int ide_scan_pio_blacklist (char *model)
                    137: {
                    138:        struct ide_pio_info *p;
                    139: 
                    140:        for (p = ide_pio_blacklist; p->name != NULL; p++) {
                    141:                if (strncmp(p->name, model, strlen(p->name)) == 0)
                    142:                        return p->pio;
                    143:        }
                    144:        return -1;
                    145: }
                    146: 
                    147: /*
                    148:  * This routine returns the recommended PIO settings for a given drive,
                    149:  * based on the drive->id information and the ide_pio_blacklist[].
                    150:  * This is used by most chipset support modules when "auto-tuning".
                    151:  */
                    152: 
                    153: /*
                    154:  * Drive PIO mode auto selection
                    155:  */
                    156: byte ide_get_best_pio_mode (ide_drive_t *drive, byte mode_wanted, byte max_mode, ide_pio_data_t *d)
                    157: {
                    158:        int pio_mode;
                    159:        int cycle_time = 0;
                    160:        int use_iordy = 0;
                    161:        struct hd_driveid* id = drive->id;
                    162:        int overridden  = 0;
                    163:        int blacklisted = 0;
                    164: 
                    165:        if (mode_wanted != 255) {
                    166:                pio_mode = mode_wanted;
                    167:        } else if (!drive->id) {
                    168:                pio_mode = 0;
                    169:        } else if ((pio_mode = ide_scan_pio_blacklist(id->model)) != -1) {
                    170:                overridden = 1;
                    171:                blacklisted = 1;
                    172:                use_iordy = (pio_mode > 2);
                    173:        } else {
                    174:                pio_mode = id->tPIO;
                    175:                if (pio_mode > 2) {     /* 2 is maximum allowed tPIO value */
                    176:                        pio_mode = 2;
                    177:                        overridden = 1;
                    178:                }
                    179:                if (id->field_valid & 2) {        /* drive implements ATA2? */
                    180:                        if (id->capability & 8) { /* drive supports use_iordy? */
                    181:                                use_iordy = 1;
                    182:                                cycle_time = id->eide_pio_iordy;
                    183:                                if (id->eide_pio_modes & 7) {
                    184:                                        overridden = 0;
                    185:                                        if (id->eide_pio_modes & 4)
                    186:                                                pio_mode = 5;
                    187:                                        else if (id->eide_pio_modes & 2)
                    188:                                                pio_mode = 4;
                    189:                                        else
                    190:                                                pio_mode = 3;
                    191:                                }
                    192:                        } else {
                    193:                                cycle_time = id->eide_pio;
                    194:                        }
                    195:                }
                    196: 
                    197:                /*
                    198:                 * Conservative "downgrade" for all pre-ATA2 drives
                    199:                 */
                    200:                if (pio_mode && pio_mode < 4) {
                    201:                        pio_mode--;
                    202:                        overridden = 1;
                    203: #if 0
                    204:                        use_iordy = (pio_mode > 2);
                    205: #endif
                    206:                        if (cycle_time && cycle_time < ide_pio_timings[pio_mode].cycle_time)
                    207:                                cycle_time = 0; /* use standard timing */
                    208:                }
                    209:        }
                    210:        if (pio_mode > max_mode) {
                    211:                pio_mode = max_mode;
                    212:                cycle_time = 0;
                    213:        }
                    214:        if (d) {
                    215:                d->pio_mode = pio_mode;
                    216:                d->cycle_time = cycle_time ? cycle_time : ide_pio_timings[pio_mode].cycle_time;
                    217:                d->use_iordy = use_iordy;
                    218:                d->overridden = overridden;
                    219:                d->blacklisted = blacklisted;
                    220:        }
                    221:        return pio_mode;
                    222: }
                    223: 
                    224: #endif /* _IDE_C */
                    225: #endif /* defined(CONFIG_BLK_DEV_CMD640) || defined(CONFIG_IDE_CHIPSETS) */
                    226: #endif /* _IDE_MODES_H */

unix.superglobalmegacorp.com

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