Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
ata_generic.c
Go to the documentation of this file.
1 /*
2  * ata_generic.c - Generic PATA/SATA controller driver.
3  * Copyright 2005 Red Hat Inc, all rights reserved.
4  *
5  * Elements from ide/pci/generic.c
6  * Copyright (C) 2001-2002 Andre Hedrick <[email protected]>
7  * Portions (C) Copyright 2002 Red Hat Inc <[email protected]>
8  *
9  * May be copied or modified under the terms of the GNU General Public License
10  *
11  * Driver for PCI IDE interfaces implementing the standard bus mastering
12  * interface functionality. This assumes the BIOS did the drive set up and
13  * tuning for us. By default we do not grab all IDE class devices as they
14  * may have other drivers or need fixups to avoid problems. Instead we keep
15  * a default list of stuff without documentation/driver that appears to
16  * work.
17  */
18 
19 #include <linux/kernel.h>
20 #include <linux/module.h>
21 #include <linux/pci.h>
22 #include <linux/init.h>
23 #include <linux/blkdev.h>
24 #include <linux/delay.h>
25 #include <scsi/scsi_host.h>
26 #include <linux/libata.h>
27 
28 #define DRV_NAME "ata_generic"
29 #define DRV_VERSION "0.2.15"
30 
31 /*
32  * A generic parallel ATA driver using libata
33  */
34 
35 enum {
36  ATA_GEN_CLASS_MATCH = (1 << 0),
37  ATA_GEN_FORCE_DMA = (1 << 1),
38  ATA_GEN_INTEL_IDER = (1 << 2),
39 };
40 
52 static int generic_set_mode(struct ata_link *link, struct ata_device **unused)
53 {
54  struct ata_port *ap = link->ap;
55  const struct pci_device_id *id = ap->host->private_data;
56  int dma_enabled = 0;
57  struct ata_device *dev;
58 
59  if (id->driver_data & ATA_GEN_FORCE_DMA) {
60  dma_enabled = 0xff;
61  } else if (ap->ioaddr.bmdma_addr) {
62  /* Bits 5 and 6 indicate if DMA is active on master/slave */
63  dma_enabled = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
64  }
65 
66  ata_for_each_dev(dev, link, ENABLED) {
67  /* We don't really care */
68  dev->pio_mode = XFER_PIO_0;
69  dev->dma_mode = XFER_MW_DMA_0;
70  /* We do need the right mode information for DMA or PIO
71  and this comes from the current configuration flags */
72  if (dma_enabled & (1 << (5 + dev->devno))) {
73  unsigned int xfer_mask = ata_id_xfermask(dev->id);
74  const char *name;
75 
76  if (xfer_mask & (ATA_MASK_MWDMA | ATA_MASK_UDMA))
77  name = ata_mode_string(xfer_mask);
78  else {
79  /* SWDMA perhaps? */
80  name = "DMA";
81  xfer_mask |= ata_xfer_mode2mask(XFER_MW_DMA_0);
82  }
83 
84  ata_dev_info(dev, "configured for %s\n", name);
85 
86  dev->xfer_mode = ata_xfer_mask2mode(xfer_mask);
88  dev->flags &= ~ATA_DFLAG_PIO;
89  } else {
90  ata_dev_info(dev, "configured for PIO\n");
91  dev->xfer_mode = XFER_PIO_0;
93  dev->flags |= ATA_DFLAG_PIO;
94  }
95  }
96  return 0;
97 }
98 
99 static struct scsi_host_template generic_sht = {
100  ATA_BMDMA_SHT(DRV_NAME),
101 };
102 
103 static struct ata_port_operations generic_port_ops = {
104  .inherits = &ata_bmdma_port_ops,
105  .cable_detect = ata_cable_unknown,
106  .set_mode = generic_set_mode,
107 };
108 
109 static int all_generic_ide; /* Set to claim all devices */
110 
125 static int is_intel_ider(struct pci_dev *dev)
126 {
127  /* For Intel IDE the value at 0xF8 is only zero on IDE-R
128  interfaces */
129  u32 r;
130  u16 t;
131 
132  /* Check the manufacturing ID, it will be zero for IDE-R */
133  pci_read_config_dword(dev, 0xF8, &r);
134  /* Not IDE-R: punt so that ata_(old)piix gets it */
135  if (r != 0)
136  return 0;
137  /* 0xF8 will also be zero on some early Intel IDE devices
138  but they will have a sane timing register */
139  pci_read_config_word(dev, 0x40, &t);
140  if (t != 0)
141  return 0;
142  /* Finally check if the timing register is writable so that
143  we eliminate any early devices hot-docked in a docking
144  station */
145  pci_write_config_word(dev, 0x40, 1);
146  pci_read_config_word(dev, 0x40, &t);
147  if (t) {
148  pci_write_config_word(dev, 0x40, 0);
149  return 0;
150  }
151  return 1;
152 }
153 
164 static int ata_generic_init_one(struct pci_dev *dev, const struct pci_device_id *id)
165 {
166  u16 command;
167  static const struct ata_port_info info = {
168  .flags = ATA_FLAG_SLAVE_POSS,
169  .pio_mask = ATA_PIO4,
170  .mwdma_mask = ATA_MWDMA2,
171  .udma_mask = ATA_UDMA5,
172  .port_ops = &generic_port_ops
173  };
174  const struct ata_port_info *ppi[] = { &info, NULL };
175 
176  /* Don't use the generic entry unless instructed to do so */
177  if ((id->driver_data & ATA_GEN_CLASS_MATCH) && all_generic_ide == 0)
178  return -ENODEV;
179 
180  if ((id->driver_data & ATA_GEN_INTEL_IDER) && !all_generic_ide)
181  if (!is_intel_ider(dev))
182  return -ENODEV;
183 
184  /* Devices that need care */
185  if (dev->vendor == PCI_VENDOR_ID_UMC &&
187  (!(PCI_FUNC(dev->devfn) & 1)))
188  return -ENODEV;
189 
190  if (dev->vendor == PCI_VENDOR_ID_OPTI &&
192  (!(PCI_FUNC(dev->devfn) & 1)))
193  return -ENODEV;
194 
195  /* Don't re-enable devices in generic mode or we will break some
196  motherboards with disabled and unused IDE controllers */
197  pci_read_config_word(dev, PCI_COMMAND, &command);
198  if (!(command & PCI_COMMAND_IO))
199  return -ENODEV;
200 
201  if (dev->vendor == PCI_VENDOR_ID_AL)
202  ata_pci_bmdma_clear_simplex(dev);
203 
204  if (dev->vendor == PCI_VENDOR_ID_ATI) {
205  int rc = pcim_enable_device(dev);
206  if (rc < 0)
207  return rc;
208  pcim_pin_device(dev);
209  }
210  return ata_pci_bmdma_init_one(dev, ppi, &generic_sht, (void *)id, 0);
211 }
212 
213 static struct pci_device_id ata_generic[] = {
223  .driver_data = ATA_GEN_FORCE_DMA },
224  /*
225  * For some reason, MCP89 on MacBook 7,1 doesn't work with
226  * ahci, use ata_generic instead.
227  */
229  PCI_VENDOR_ID_APPLE, 0xcb89,
230  .driver_data = ATA_GEN_FORCE_DMA },
231 #if !defined(CONFIG_PATA_TOSHIBA) && !defined(CONFIG_PATA_TOSHIBA_MODULE)
236 #endif
237  /* Intel, IDE class device */
239  PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL,
240  .driver_data = ATA_GEN_INTEL_IDER },
241  /* Must come last. If you add entries adjust this table appropriately */
242  { PCI_DEVICE_CLASS(PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL),
243  .driver_data = ATA_GEN_CLASS_MATCH },
244  { 0, },
245 };
246 
247 static struct pci_driver ata_generic_pci_driver = {
248  .name = DRV_NAME,
249  .id_table = ata_generic,
250  .probe = ata_generic_init_one,
251  .remove = ata_pci_remove_one,
252 #ifdef CONFIG_PM
253  .suspend = ata_pci_device_suspend,
254  .resume = ata_pci_device_resume,
255 #endif
256 };
257 
258 module_pci_driver(ata_generic_pci_driver);
259 
260 MODULE_AUTHOR("Alan Cox");
261 MODULE_DESCRIPTION("low-level driver for generic ATA");
262 MODULE_LICENSE("GPL");
263 MODULE_DEVICE_TABLE(pci, ata_generic);
265 
266 module_param(all_generic_ide, int, 0);