18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * PIO blacklist. Some drives incorrectly report their maximal PIO mode, 48c2ecf20Sopenharmony_ci * at least in respect to CMD640. Here we keep info on some known drives. 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * Changes to the ide_pio_blacklist[] should be made with EXTREME CAUTION 78c2ecf20Sopenharmony_ci * to avoid breaking the fragile cmd640.c support. 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <linux/string.h> 118c2ecf20Sopenharmony_ci#include <linux/ide.h> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_cistatic struct ide_pio_info { 148c2ecf20Sopenharmony_ci const char *name; 158c2ecf20Sopenharmony_ci int pio; 168c2ecf20Sopenharmony_ci} ide_pio_blacklist [] = { 178c2ecf20Sopenharmony_ci { "Conner Peripherals 540MB - CFS540A", 3 }, 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci { "WDC AC2700", 3 }, 208c2ecf20Sopenharmony_ci { "WDC AC2540", 3 }, 218c2ecf20Sopenharmony_ci { "WDC AC2420", 3 }, 228c2ecf20Sopenharmony_ci { "WDC AC2340", 3 }, 238c2ecf20Sopenharmony_ci { "WDC AC2250", 0 }, 248c2ecf20Sopenharmony_ci { "WDC AC2200", 0 }, 258c2ecf20Sopenharmony_ci { "WDC AC21200", 4 }, 268c2ecf20Sopenharmony_ci { "WDC AC2120", 0 }, 278c2ecf20Sopenharmony_ci { "WDC AC2850", 3 }, 288c2ecf20Sopenharmony_ci { "WDC AC1270", 3 }, 298c2ecf20Sopenharmony_ci { "WDC AC1170", 1 }, 308c2ecf20Sopenharmony_ci { "WDC AC1210", 1 }, 318c2ecf20Sopenharmony_ci { "WDC AC280", 0 }, 328c2ecf20Sopenharmony_ci { "WDC AC31000", 3 }, 338c2ecf20Sopenharmony_ci { "WDC AC31200", 3 }, 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci { "Maxtor 7131 AT", 1 }, 368c2ecf20Sopenharmony_ci { "Maxtor 7171 AT", 1 }, 378c2ecf20Sopenharmony_ci { "Maxtor 7213 AT", 1 }, 388c2ecf20Sopenharmony_ci { "Maxtor 7245 AT", 1 }, 398c2ecf20Sopenharmony_ci { "Maxtor 7345 AT", 1 }, 408c2ecf20Sopenharmony_ci { "Maxtor 7546 AT", 3 }, 418c2ecf20Sopenharmony_ci { "Maxtor 7540 AV", 3 }, 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci { "SAMSUNG SHD-3121A", 1 }, 448c2ecf20Sopenharmony_ci { "SAMSUNG SHD-3122A", 1 }, 458c2ecf20Sopenharmony_ci { "SAMSUNG SHD-3172A", 1 }, 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci { "ST5660A", 3 }, 488c2ecf20Sopenharmony_ci { "ST3660A", 3 }, 498c2ecf20Sopenharmony_ci { "ST3630A", 3 }, 508c2ecf20Sopenharmony_ci { "ST3655A", 3 }, 518c2ecf20Sopenharmony_ci { "ST3391A", 3 }, 528c2ecf20Sopenharmony_ci { "ST3390A", 1 }, 538c2ecf20Sopenharmony_ci { "ST3600A", 1 }, 548c2ecf20Sopenharmony_ci { "ST3290A", 0 }, 558c2ecf20Sopenharmony_ci { "ST3144A", 0 }, 568c2ecf20Sopenharmony_ci { "ST3491A", 1 }, /* reports 3, should be 1 or 2 (depending on drive) 578c2ecf20Sopenharmony_ci according to Seagate's FIND-ATA program */ 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci { "QUANTUM ELS127A", 0 }, 608c2ecf20Sopenharmony_ci { "QUANTUM ELS170A", 0 }, 618c2ecf20Sopenharmony_ci { "QUANTUM LPS240A", 0 }, 628c2ecf20Sopenharmony_ci { "QUANTUM LPS210A", 3 }, 638c2ecf20Sopenharmony_ci { "QUANTUM LPS270A", 3 }, 648c2ecf20Sopenharmony_ci { "QUANTUM LPS365A", 3 }, 658c2ecf20Sopenharmony_ci { "QUANTUM LPS540A", 3 }, 668c2ecf20Sopenharmony_ci { "QUANTUM LIGHTNING 540A", 3 }, 678c2ecf20Sopenharmony_ci { "QUANTUM LIGHTNING 730A", 3 }, 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci { "QUANTUM FIREBALL_540", 3 }, /* Older Quantum Fireballs don't work */ 708c2ecf20Sopenharmony_ci { "QUANTUM FIREBALL_640", 3 }, 718c2ecf20Sopenharmony_ci { "QUANTUM FIREBALL_1080", 3 }, 728c2ecf20Sopenharmony_ci { "QUANTUM FIREBALL_1280", 3 }, 738c2ecf20Sopenharmony_ci { NULL, 0 } 748c2ecf20Sopenharmony_ci}; 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci/** 778c2ecf20Sopenharmony_ci * ide_scan_pio_blacklist - check for a blacklisted drive 788c2ecf20Sopenharmony_ci * @model: Drive model string 798c2ecf20Sopenharmony_ci * 808c2ecf20Sopenharmony_ci * This routine searches the ide_pio_blacklist for an entry 818c2ecf20Sopenharmony_ci * matching the start/whole of the supplied model name. 828c2ecf20Sopenharmony_ci * 838c2ecf20Sopenharmony_ci * Returns -1 if no match found. 848c2ecf20Sopenharmony_ci * Otherwise returns the recommended PIO mode from ide_pio_blacklist[]. 858c2ecf20Sopenharmony_ci */ 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ciint ide_scan_pio_blacklist(char *model) 888c2ecf20Sopenharmony_ci{ 898c2ecf20Sopenharmony_ci struct ide_pio_info *p; 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_ci for (p = ide_pio_blacklist; p->name != NULL; p++) { 928c2ecf20Sopenharmony_ci if (strncmp(p->name, model, strlen(p->name)) == 0) 938c2ecf20Sopenharmony_ci return p->pio; 948c2ecf20Sopenharmony_ci } 958c2ecf20Sopenharmony_ci return -1; 968c2ecf20Sopenharmony_ci} 97