Blame view
drivers/ata/ata_generic.c
7.98 KB
669a5db41 [libata] Add a bu... |
1 2 |
/* * ata_generic.c - Generic PATA/SATA controller driver. |
ab7716300 ata: Switch all m... |
3 |
* Copyright 2005 Red Hat Inc, all rights reserved. |
669a5db41 [libata] Add a bu... |
4 |
* |
85cd7251b [libata #pata-dri... |
5 |
* Elements from ide/pci/generic.c |
669a5db41 [libata] Add a bu... |
6 7 8 9 |
* Copyright (C) 2001-2002 Andre Hedrick <andre@linux-ide.org> * Portions (C) Copyright 2002 Red Hat Inc <alan@redhat.com> * * May be copied or modified under the terms of the GNU General Public License |
85cd7251b [libata #pata-dri... |
10 |
* |
669a5db41 [libata] Add a bu... |
11 12 13 14 15 |
* Driver for PCI IDE interfaces implementing the standard bus mastering * interface functionality. This assumes the BIOS did the drive set up and * tuning for us. By default we do not grab all IDE class devices as they * may have other drivers or need fixups to avoid problems. Instead we keep * a default list of stuff without documentation/driver that appears to |
85cd7251b [libata #pata-dri... |
16 |
* work. |
669a5db41 [libata] Add a bu... |
17 18 19 20 21 |
*/ #include <linux/kernel.h> #include <linux/module.h> #include <linux/pci.h> |
669a5db41 [libata] Add a bu... |
22 23 24 25 26 27 |
#include <linux/blkdev.h> #include <linux/delay.h> #include <scsi/scsi_host.h> #include <linux/libata.h> #define DRV_NAME "ata_generic" |
5e8f757cb ata_generic: Cena... |
28 |
#define DRV_VERSION "0.2.15" |
669a5db41 [libata] Add a bu... |
29 30 31 32 |
/* * A generic parallel ATA driver using libata */ |
1529c69ad ata_generic: impl... |
33 34 35 |
enum { ATA_GEN_CLASS_MATCH = (1 << 0), ATA_GEN_FORCE_DMA = (1 << 1), |
60039a529 ata: Intel IDE-R ... |
36 |
ATA_GEN_INTEL_IDER = (1 << 2), |
1529c69ad ata_generic: impl... |
37 |
}; |
669a5db41 [libata] Add a bu... |
38 |
/** |
669a5db41 [libata] Add a bu... |
39 |
* generic_set_mode - mode setting |
0260731f0 libata-link: link... |
40 |
* @link: link to set up |
b229a7b0a libata: set_mode,... |
41 |
* @unused: returned device on error |
669a5db41 [libata] Add a bu... |
42 43 44 45 |
* * Use a non standard set_mode function. We don't want to be tuned. * The BIOS configured everything. Our job is not to fiddle. We * read the dma enabled bits from the PCI configuration of the device |
85cd7251b [libata #pata-dri... |
46 |
* and respect them. |
669a5db41 [libata] Add a bu... |
47 |
*/ |
85cd7251b [libata #pata-dri... |
48 |
|
0260731f0 libata-link: link... |
49 |
static int generic_set_mode(struct ata_link *link, struct ata_device **unused) |
669a5db41 [libata] Add a bu... |
50 |
{ |
0260731f0 libata-link: link... |
51 |
struct ata_port *ap = link->ap; |
1529c69ad ata_generic: impl... |
52 |
const struct pci_device_id *id = ap->host->private_data; |
669a5db41 [libata] Add a bu... |
53 |
int dma_enabled = 0; |
f58229f80 libata-link: impl... |
54 |
struct ata_device *dev; |
669a5db41 [libata] Add a bu... |
55 |
|
1529c69ad ata_generic: impl... |
56 57 58 59 |
if (id->driver_data & ATA_GEN_FORCE_DMA) { dma_enabled = 0xff; } else if (ap->ioaddr.bmdma_addr) { /* Bits 5 and 6 indicate if DMA is active on master/slave */ |
d6f4d5eaf ata_generic: Chec... |
60 |
dma_enabled = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS); |
1529c69ad ata_generic: impl... |
61 |
} |
85cd7251b [libata #pata-dri... |
62 |
|
1eca4365b libata: beef up i... |
63 |
ata_for_each_dev(dev, link, ENABLED) { |
f8ab6d8e1 ata_generic: unin... |
64 65 66 67 68 69 |
/* We don't really care */ dev->pio_mode = XFER_PIO_0; dev->dma_mode = XFER_MW_DMA_0; /* We do need the right mode information for DMA or PIO and this comes from the current configuration flags */ if (dma_enabled & (1 << (5 + dev->devno))) { |
9d3501ab9 libata: kill ata_... |
70 71 72 73 74 75 76 77 78 79 |
unsigned int xfer_mask = ata_id_xfermask(dev->id); const char *name; if (xfer_mask & (ATA_MASK_MWDMA | ATA_MASK_UDMA)) name = ata_mode_string(xfer_mask); else { /* SWDMA perhaps? */ name = "DMA"; xfer_mask |= ata_xfer_mode2mask(XFER_MW_DMA_0); } |
a9a79dfec ata: Convert ata_... |
80 81 |
ata_dev_info(dev, "configured for %s ", name); |
9d3501ab9 libata: kill ata_... |
82 83 84 |
dev->xfer_mode = ata_xfer_mask2mode(xfer_mask); dev->xfer_shift = ata_xfer_mode2shift(dev->xfer_mode); |
f8ab6d8e1 ata_generic: unin... |
85 86 |
dev->flags &= ~ATA_DFLAG_PIO; } else { |
a9a79dfec ata: Convert ata_... |
87 88 |
ata_dev_info(dev, "configured for PIO "); |
f8ab6d8e1 ata_generic: unin... |
89 90 91 |
dev->xfer_mode = XFER_PIO_0; dev->xfer_shift = ATA_SHIFT_PIO; dev->flags |= ATA_DFLAG_PIO; |
669a5db41 [libata] Add a bu... |
92 93 |
} } |
b229a7b0a libata: set_mode,... |
94 |
return 0; |
669a5db41 [libata] Add a bu... |
95 96 97 |
} static struct scsi_host_template generic_sht = { |
68d1d07b5 libata: implement... |
98 |
ATA_BMDMA_SHT(DRV_NAME), |
669a5db41 [libata] Add a bu... |
99 100 101 |
}; static struct ata_port_operations generic_port_ops = { |
029cfd6b7 libata: implement... |
102 |
.inherits = &ata_bmdma_port_ops, |
eb4a2c7f0 pata: cable methods |
103 |
.cable_detect = ata_cable_unknown, |
029cfd6b7 libata: implement... |
104 |
.set_mode = generic_set_mode, |
85cd7251b [libata #pata-dri... |
105 |
}; |
669a5db41 [libata] Add a bu... |
106 107 108 |
static int all_generic_ide; /* Set to claim all devices */ /** |
60039a529 ata: Intel IDE-R ... |
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
* is_intel_ider - identify intel IDE-R devices * @dev: PCI device * * Distinguish Intel IDE-R controller devices from other Intel IDE * devices. IDE-R devices have no timing registers and are in * most respects virtual. They should be driven by the ata_generic * driver. * * IDE-R devices have PCI offset 0xF8.L as zero, later Intel ATA has * it non zero. All Intel ATA has 0x40 writable (timing), but it is * not writable on IDE-R devices (this is guaranteed). */ static int is_intel_ider(struct pci_dev *dev) { /* For Intel IDE the value at 0xF8 is only zero on IDE-R interfaces */ u32 r; u16 t; /* Check the manufacturing ID, it will be zero for IDE-R */ pci_read_config_dword(dev, 0xF8, &r); /* Not IDE-R: punt so that ata_(old)piix gets it */ if (r != 0) return 0; /* 0xF8 will also be zero on some early Intel IDE devices but they will have a sane timing register */ pci_read_config_word(dev, 0x40, &t); if (t != 0) return 0; /* Finally check if the timing register is writable so that we eliminate any early devices hot-docked in a docking station */ pci_write_config_word(dev, 0x40, 1); pci_read_config_word(dev, 0x40, &t); if (t) { pci_write_config_word(dev, 0x40, 0); return 0; } return 1; } /** |
669a5db41 [libata] Add a bu... |
152 153 154 155 156 |
* ata_generic_init - attach generic IDE * @dev: PCI device found * @id: match entry * * Called each time a matching IDE interface is found. We check if the |
85cd7251b [libata #pata-dri... |
157 |
* interface is one we wish to claim and if so we perform any chip |
669a5db41 [libata] Add a bu... |
158 159 |
* specific hacks then let the ATA layer do the heavy lifting. */ |
85cd7251b [libata #pata-dri... |
160 |
|
669a5db41 [libata] Add a bu... |
161 162 163 |
static int ata_generic_init_one(struct pci_dev *dev, const struct pci_device_id *id) { u16 command; |
1626aeb88 libata: clean up ... |
164 |
static const struct ata_port_info info = { |
1d2808fd3 [libata] PATA dri... |
165 |
.flags = ATA_FLAG_SLAVE_POSS, |
14bdef982 [libata] convert ... |
166 167 |
.pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, |
bf6263a85 [libata] Use ATA_... |
168 |
.udma_mask = ATA_UDMA5, |
669a5db41 [libata] Add a bu... |
169 170 |
.port_ops = &generic_port_ops }; |
1626aeb88 libata: clean up ... |
171 |
const struct ata_port_info *ppi[] = { &info, NULL }; |
85cd7251b [libata #pata-dri... |
172 |
|
669a5db41 [libata] Add a bu... |
173 |
/* Don't use the generic entry unless instructed to do so */ |
1529c69ad ata_generic: impl... |
174 |
if ((id->driver_data & ATA_GEN_CLASS_MATCH) && all_generic_ide == 0) |
669a5db41 [libata] Add a bu... |
175 |
return -ENODEV; |
47ee9108c ata_generic: Skip... |
176 |
if ((id->driver_data & ATA_GEN_INTEL_IDER) && !all_generic_ide) |
60039a529 ata: Intel IDE-R ... |
177 178 |
if (!is_intel_ider(dev)) return -ENODEV; |
669a5db41 [libata] Add a bu... |
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 |
/* Devices that need care */ if (dev->vendor == PCI_VENDOR_ID_UMC && dev->device == PCI_DEVICE_ID_UMC_UM8886A && (!(PCI_FUNC(dev->devfn) & 1))) return -ENODEV; if (dev->vendor == PCI_VENDOR_ID_OPTI && dev->device == PCI_DEVICE_ID_OPTI_82C558 && (!(PCI_FUNC(dev->devfn) & 1))) return -ENODEV; /* Don't re-enable devices in generic mode or we will break some motherboards with disabled and unused IDE controllers */ pci_read_config_word(dev, PCI_COMMAND, &command); if (!(command & PCI_COMMAND_IO)) return -ENODEV; |
85cd7251b [libata #pata-dri... |
195 |
|
669a5db41 [libata] Add a bu... |
196 |
if (dev->vendor == PCI_VENDOR_ID_AL) |
9363c3825 libata: rename SF... |
197 |
ata_pci_bmdma_clear_simplex(dev); |
669a5db41 [libata] Add a bu... |
198 |
|
05177f178 pata_atiixp: Don'... |
199 200 201 202 203 204 |
if (dev->vendor == PCI_VENDOR_ID_ATI) { int rc = pcim_enable_device(dev); if (rc < 0) return rc; pcim_pin_device(dev); } |
1529c69ad ata_generic: impl... |
205 |
return ata_pci_bmdma_init_one(dev, ppi, &generic_sht, (void *)id, 0); |
669a5db41 [libata] Add a bu... |
206 207 208 209 210 |
} static struct pci_device_id ata_generic[] = { { PCI_DEVICE(PCI_VENDOR_ID_PCTECH, PCI_DEVICE_ID_PCTECH_SAMURAI_IDE), }, { PCI_DEVICE(PCI_VENDOR_ID_HOLTEK, PCI_DEVICE_ID_HOLTEK_6565), }, |
85cd7251b [libata #pata-dri... |
211 |
{ PCI_DEVICE(PCI_VENDOR_ID_UMC, PCI_DEVICE_ID_UMC_UM8673F), }, |
669a5db41 [libata] Add a bu... |
212 213 214 215 216 |
{ PCI_DEVICE(PCI_VENDOR_ID_UMC, PCI_DEVICE_ID_UMC_UM8886A), }, { PCI_DEVICE(PCI_VENDOR_ID_UMC, PCI_DEVICE_ID_UMC_UM8886BF), }, { PCI_DEVICE(PCI_VENDOR_ID_HINT, PCI_DEVICE_ID_HINT_VXPROII_IDE), }, { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C561), }, { PCI_DEVICE(PCI_VENDOR_ID_OPTI, PCI_DEVICE_ID_OPTI_82C558), }, |
1529c69ad ata_generic: impl... |
217 218 |
{ PCI_DEVICE(PCI_VENDOR_ID_CENATEK,PCI_DEVICE_ID_CENATEK_IDE), .driver_data = ATA_GEN_FORCE_DMA }, |
8e182a90f pata_piccolo: Dri... |
219 |
#if !defined(CONFIG_PATA_TOSHIBA) && !defined(CONFIG_PATA_TOSHIBA_MODULE) |
669a5db41 [libata] Add a bu... |
220 221 |
{ PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_1), }, { PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_2), }, |
8e182a90f pata_piccolo: Dri... |
222 223 |
{ PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_3), }, { PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_5), }, |
60039a529 ata: Intel IDE-R ... |
224 225 226 |
#endif /* Intel, IDE class device */ { PCI_VENDOR_ID_INTEL, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, |
4fca377f7 [libata] trivial:... |
227 |
PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL, |
60039a529 ata: Intel IDE-R ... |
228 |
.driver_data = ATA_GEN_INTEL_IDER }, |
669a5db41 [libata] Add a bu... |
229 |
/* Must come last. If you add entries adjust this table appropriately */ |
1529c69ad ata_generic: impl... |
230 231 |
{ PCI_DEVICE_CLASS(PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL), .driver_data = ATA_GEN_CLASS_MATCH }, |
669a5db41 [libata] Add a bu... |
232 233 234 235 236 237 238 |
{ 0, }, }; static struct pci_driver ata_generic_pci_driver = { .name = DRV_NAME, .id_table = ata_generic, .probe = ata_generic_init_one, |
30ced0f0d [PATCH] PATA liba... |
239 |
.remove = ata_pci_remove_one, |
58eb8cd56 ata: use CONFIG_P... |
240 |
#ifdef CONFIG_PM_SLEEP |
30ced0f0d [PATCH] PATA liba... |
241 242 |
.suspend = ata_pci_device_suspend, .resume = ata_pci_device_resume, |
438ac6d5e libata: add missi... |
243 |
#endif |
669a5db41 [libata] Add a bu... |
244 |
}; |
2fc75da0c ata: use module_p... |
245 |
module_pci_driver(ata_generic_pci_driver); |
669a5db41 [libata] Add a bu... |
246 247 248 249 250 251 |
MODULE_AUTHOR("Alan Cox"); MODULE_DESCRIPTION("low-level driver for generic ATA"); MODULE_LICENSE("GPL"); MODULE_DEVICE_TABLE(pci, ata_generic); MODULE_VERSION(DRV_VERSION); |
669a5db41 [libata] Add a bu... |
252 |
module_param(all_generic_ide, int, 0); |