Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v2.6.26 188 lines 6.1 kB view raw
1/* 2 * Copyright (C) 2001-2002 Andre Hedrick <andre@linux-ide.org> 3 * Portions (C) Copyright 2002 Red Hat Inc <alan@redhat.com> 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License as published by the 7 * Free Software Foundation; either version 2, or (at your option) any 8 * later version. 9 * 10 * This program is distributed in the hope that it will be useful, but 11 * WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * General Public License for more details. 14 * 15 * For the avoidance of doubt the "preferred form" of this code is one which 16 * is in an open non patent encumbered format. Where cryptographic key signing 17 * forms part of the process of creating an executable the information 18 * including keys needed to generate an equivalently functional executable 19 * are deemed to be part of the source code. 20 */ 21 22#include <linux/types.h> 23#include <linux/module.h> 24#include <linux/kernel.h> 25#include <linux/hdreg.h> 26#include <linux/pci.h> 27#include <linux/ide.h> 28#include <linux/init.h> 29 30static int ide_generic_all; /* Set to claim all devices */ 31 32module_param_named(all_generic_ide, ide_generic_all, bool, 0444); 33MODULE_PARM_DESC(all_generic_ide, "IDE generic will claim all unknown PCI IDE storage controllers."); 34 35#define IDE_HFLAGS_UMC (IDE_HFLAG_NO_DMA | IDE_HFLAG_FORCE_LEGACY_IRQS) 36 37#define DECLARE_GENERIC_PCI_DEV(name_str, extra_flags) \ 38 { \ 39 .name = name_str, \ 40 .host_flags = IDE_HFLAG_TRUST_BIOS_FOR_DMA | \ 41 extra_flags, \ 42 .swdma_mask = ATA_SWDMA2, \ 43 .mwdma_mask = ATA_MWDMA2, \ 44 .udma_mask = ATA_UDMA6, \ 45 } 46 47static const struct ide_port_info generic_chipsets[] __devinitdata = { 48 /* 0 */ DECLARE_GENERIC_PCI_DEV("Unknown", 0), 49 50 { /* 1 */ 51 .name = "NS87410", 52 .enablebits = { {0x43, 0x08, 0x08}, {0x47, 0x08, 0x08} }, 53 .host_flags = IDE_HFLAG_TRUST_BIOS_FOR_DMA, 54 .swdma_mask = ATA_SWDMA2, 55 .mwdma_mask = ATA_MWDMA2, 56 .udma_mask = ATA_UDMA6, 57 }, 58 59 /* 2 */ DECLARE_GENERIC_PCI_DEV("SAMURAI", 0), 60 /* 3 */ DECLARE_GENERIC_PCI_DEV("HT6565", 0), 61 /* 4 */ DECLARE_GENERIC_PCI_DEV("UM8673F", IDE_HFLAGS_UMC), 62 /* 5 */ DECLARE_GENERIC_PCI_DEV("UM8886A", IDE_HFLAGS_UMC), 63 /* 6 */ DECLARE_GENERIC_PCI_DEV("UM8886BF", IDE_HFLAGS_UMC), 64 /* 7 */ DECLARE_GENERIC_PCI_DEV("HINT_IDE", 0), 65 /* 8 */ DECLARE_GENERIC_PCI_DEV("VIA_IDE", IDE_HFLAG_NO_AUTODMA), 66 /* 9 */ DECLARE_GENERIC_PCI_DEV("OPTI621V", IDE_HFLAG_NO_AUTODMA), 67 68 { /* 10 */ 69 .name = "VIA8237SATA", 70 .host_flags = IDE_HFLAG_TRUST_BIOS_FOR_DMA | 71 IDE_HFLAG_OFF_BOARD, 72 .swdma_mask = ATA_SWDMA2, 73 .mwdma_mask = ATA_MWDMA2, 74 .udma_mask = ATA_UDMA6, 75 }, 76 77 /* 11 */ DECLARE_GENERIC_PCI_DEV("Piccolo0102", IDE_HFLAG_NO_AUTODMA), 78 /* 12 */ DECLARE_GENERIC_PCI_DEV("Piccolo0103", IDE_HFLAG_NO_AUTODMA), 79 /* 13 */ DECLARE_GENERIC_PCI_DEV("Piccolo0105", IDE_HFLAG_NO_AUTODMA), 80 81 { /* 14 */ 82 .name = "Revolution", 83 .host_flags = IDE_HFLAG_CLEAR_SIMPLEX | 84 IDE_HFLAG_TRUST_BIOS_FOR_DMA | 85 IDE_HFLAG_OFF_BOARD, 86 .swdma_mask = ATA_SWDMA2, 87 .mwdma_mask = ATA_MWDMA2, 88 .udma_mask = ATA_UDMA6, 89 } 90}; 91 92/** 93 * generic_init_one - called when a PIIX is found 94 * @dev: the generic device 95 * @id: the matching pci id 96 * 97 * Called when the PCI registration layer (or the IDE initialization) 98 * finds a device matching our IDE device tables. 99 */ 100 101static int __devinit generic_init_one(struct pci_dev *dev, const struct pci_device_id *id) 102{ 103 const struct ide_port_info *d = &generic_chipsets[id->driver_data]; 104 int ret = -ENODEV; 105 106 /* Don't use the generic entry unless instructed to do so */ 107 if (id->driver_data == 0 && ide_generic_all == 0) 108 goto out; 109 110 switch (dev->vendor) { 111 case PCI_VENDOR_ID_UMC: 112 if (dev->device == PCI_DEVICE_ID_UMC_UM8886A && 113 !(PCI_FUNC(dev->devfn) & 1)) 114 goto out; /* UM8886A/BF pair */ 115 break; 116 case PCI_VENDOR_ID_OPTI: 117 if (dev->device == PCI_DEVICE_ID_OPTI_82C558 && 118 !(PCI_FUNC(dev->devfn) & 1)) 119 goto out; 120 break; 121 case PCI_VENDOR_ID_JMICRON: 122 if (dev->device != PCI_DEVICE_ID_JMICRON_JMB368 && 123 PCI_FUNC(dev->devfn) != 1) 124 goto out; 125 break; 126 case PCI_VENDOR_ID_NS: 127 if (dev->device == PCI_DEVICE_ID_NS_87410 && 128 (dev->class >> 8) != PCI_CLASS_STORAGE_IDE) 129 goto out; 130 break; 131 } 132 133 if (dev->vendor != PCI_VENDOR_ID_JMICRON) { 134 u16 command; 135 pci_read_config_word(dev, PCI_COMMAND, &command); 136 if (!(command & PCI_COMMAND_IO)) { 137 printk(KERN_INFO "Skipping disabled %s IDE " 138 "controller.\n", d->name); 139 goto out; 140 } 141 } 142 ret = ide_setup_pci_device(dev, d); 143out: 144 return ret; 145} 146 147static const struct pci_device_id generic_pci_tbl[] = { 148 { PCI_VDEVICE(NS, PCI_DEVICE_ID_NS_87410), 1 }, 149 { PCI_VDEVICE(PCTECH, PCI_DEVICE_ID_PCTECH_SAMURAI_IDE), 2 }, 150 { PCI_VDEVICE(HOLTEK, PCI_DEVICE_ID_HOLTEK_6565), 3 }, 151 { PCI_VDEVICE(UMC, PCI_DEVICE_ID_UMC_UM8673F), 4 }, 152 { PCI_VDEVICE(UMC, PCI_DEVICE_ID_UMC_UM8886A), 5 }, 153 { PCI_VDEVICE(UMC, PCI_DEVICE_ID_UMC_UM8886BF), 6 }, 154 { PCI_VDEVICE(HINT, PCI_DEVICE_ID_HINT_VXPROII_IDE), 7 }, 155 { PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_82C561), 8 }, 156 { PCI_VDEVICE(OPTI, PCI_DEVICE_ID_OPTI_82C558), 9 }, 157#ifdef CONFIG_BLK_DEV_IDE_SATA 158 { PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_8237_SATA), 10 }, 159#endif 160 { PCI_VDEVICE(TOSHIBA, PCI_DEVICE_ID_TOSHIBA_PICCOLO), 11 }, 161 { PCI_VDEVICE(TOSHIBA, PCI_DEVICE_ID_TOSHIBA_PICCOLO_1), 12 }, 162 { PCI_VDEVICE(TOSHIBA, PCI_DEVICE_ID_TOSHIBA_PICCOLO_2), 13 }, 163 { PCI_VDEVICE(NETCELL, PCI_DEVICE_ID_REVOLUTION), 14 }, 164 /* 165 * Must come last. If you add entries adjust 166 * this table and generic_chipsets[] appropriately. 167 */ 168 { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL, 0 }, 169 { 0, }, 170}; 171MODULE_DEVICE_TABLE(pci, generic_pci_tbl); 172 173static struct pci_driver driver = { 174 .name = "PCI_IDE", 175 .id_table = generic_pci_tbl, 176 .probe = generic_init_one, 177}; 178 179static int __init generic_ide_init(void) 180{ 181 return ide_pci_register_driver(&driver); 182} 183 184module_init(generic_ide_init); 185 186MODULE_AUTHOR("Andre Hedrick"); 187MODULE_DESCRIPTION("PCI driver module for generic PCI IDE"); 188MODULE_LICENSE("GPL");