Annotation of Gnu-Mach/linux/src/drivers/block/ide_modes.h, revision 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.