Blame view

drivers/ata/ata_generic.c 7.98 KB
669a5db41   Jeff Garzik   [libata] Add a bu...
1
2
  /*
   *  ata_generic.c - Generic PATA/SATA controller driver.
ab7716300   Alan Cox   ata: Switch all m...
3
   *  Copyright 2005 Red Hat Inc, all rights reserved.
669a5db41   Jeff Garzik   [libata] Add a bu...
4
   *
85cd7251b   Jeff Garzik   [libata #pata-dri...
5
   *  Elements from ide/pci/generic.c
669a5db41   Jeff Garzik   [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   Jeff Garzik   [libata #pata-dri...
10
   *
669a5db41   Jeff Garzik   [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   Jeff Garzik   [libata #pata-dri...
16
   *  work.
669a5db41   Jeff Garzik   [libata] Add a bu...
17
18
19
20
21
   */
  
  #include <linux/kernel.h>
  #include <linux/module.h>
  #include <linux/pci.h>
669a5db41   Jeff Garzik   [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   Alan Cox   ata_generic: Cena...
28
  #define DRV_VERSION "0.2.15"
669a5db41   Jeff Garzik   [libata] Add a bu...
29
30
31
32
  
  /*
   *	A generic parallel ATA driver using libata
   */
1529c69ad   Tejun Heo   ata_generic: impl...
33
34
35
  enum {
  	ATA_GEN_CLASS_MATCH		= (1 << 0),
  	ATA_GEN_FORCE_DMA		= (1 << 1),
60039a529   Alan Cox   ata: Intel IDE-R ...
36
  	ATA_GEN_INTEL_IDER		= (1 << 2),
1529c69ad   Tejun Heo   ata_generic: impl...
37
  };
669a5db41   Jeff Garzik   [libata] Add a bu...
38
  /**
669a5db41   Jeff Garzik   [libata] Add a bu...
39
   *	generic_set_mode	-	mode setting
0260731f0   Tejun Heo   libata-link: link...
40
   *	@link: link to set up
b229a7b0a   Alan Cox   libata: set_mode,...
41
   *	@unused: returned device on error
669a5db41   Jeff Garzik   [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   Jeff Garzik   [libata #pata-dri...
46
   *	and respect them.
669a5db41   Jeff Garzik   [libata] Add a bu...
47
   */
85cd7251b   Jeff Garzik   [libata #pata-dri...
48

0260731f0   Tejun Heo   libata-link: link...
49
  static int generic_set_mode(struct ata_link *link, struct ata_device **unused)
669a5db41   Jeff Garzik   [libata] Add a bu...
50
  {
0260731f0   Tejun Heo   libata-link: link...
51
  	struct ata_port *ap = link->ap;
1529c69ad   Tejun Heo   ata_generic: impl...
52
  	const struct pci_device_id *id = ap->host->private_data;
669a5db41   Jeff Garzik   [libata] Add a bu...
53
  	int dma_enabled = 0;
f58229f80   Tejun Heo   libata-link: impl...
54
  	struct ata_device *dev;
669a5db41   Jeff Garzik   [libata] Add a bu...
55

1529c69ad   Tejun Heo   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   Alan Cox   ata_generic: Chec...
60
  		dma_enabled = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
1529c69ad   Tejun Heo   ata_generic: impl...
61
  	}
85cd7251b   Jeff Garzik   [libata #pata-dri...
62

1eca4365b   Tejun Heo   libata: beef up i...
63
  	ata_for_each_dev(dev, link, ENABLED) {
f8ab6d8e1   Tejun Heo   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   Tejun Heo   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   Joe Perches   ata: Convert ata_...
80
81
  			ata_dev_info(dev, "configured for %s
  ", name);
9d3501ab9   Tejun Heo   libata: kill ata_...
82
83
84
  
  			dev->xfer_mode = ata_xfer_mask2mode(xfer_mask);
  			dev->xfer_shift = ata_xfer_mode2shift(dev->xfer_mode);
f8ab6d8e1   Tejun Heo   ata_generic: unin...
85
86
  			dev->flags &= ~ATA_DFLAG_PIO;
  		} else {
a9a79dfec   Joe Perches   ata: Convert ata_...
87
88
  			ata_dev_info(dev, "configured for PIO
  ");
f8ab6d8e1   Tejun Heo   ata_generic: unin...
89
90
91
  			dev->xfer_mode = XFER_PIO_0;
  			dev->xfer_shift = ATA_SHIFT_PIO;
  			dev->flags |= ATA_DFLAG_PIO;
669a5db41   Jeff Garzik   [libata] Add a bu...
92
93
  		}
  	}
b229a7b0a   Alan Cox   libata: set_mode,...
94
  	return 0;
669a5db41   Jeff Garzik   [libata] Add a bu...
95
96
97
  }
  
  static struct scsi_host_template generic_sht = {
68d1d07b5   Tejun Heo   libata: implement...
98
  	ATA_BMDMA_SHT(DRV_NAME),
669a5db41   Jeff Garzik   [libata] Add a bu...
99
100
101
  };
  
  static struct ata_port_operations generic_port_ops = {
029cfd6b7   Tejun Heo   libata: implement...
102
  	.inherits	= &ata_bmdma_port_ops,
eb4a2c7f0   Alan Cox   pata: cable methods
103
  	.cable_detect	= ata_cable_unknown,
029cfd6b7   Tejun Heo   libata: implement...
104
  	.set_mode	= generic_set_mode,
85cd7251b   Jeff Garzik   [libata #pata-dri...
105
  };
669a5db41   Jeff Garzik   [libata] Add a bu...
106
107
108
  static int all_generic_ide;		/* Set to claim all devices */
  
  /**
60039a529   Alan Cox   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   Jeff Garzik   [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   Jeff Garzik   [libata #pata-dri...
157
   *	interface is one we wish to claim and if so we perform any chip
669a5db41   Jeff Garzik   [libata] Add a bu...
158
159
   *	specific hacks then let the ATA layer do the heavy lifting.
   */
85cd7251b   Jeff Garzik   [libata #pata-dri...
160

669a5db41   Jeff Garzik   [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   Tejun Heo   libata: clean up ...
164
  	static const struct ata_port_info info = {
1d2808fd3   Jeff Garzik   [libata] PATA dri...
165
  		.flags = ATA_FLAG_SLAVE_POSS,
14bdef982   Erik Inge Bolsø   [libata] convert ...
166
167
  		.pio_mask = ATA_PIO4,
  		.mwdma_mask = ATA_MWDMA2,
bf6263a85   Jeff Garzik   [libata] Use ATA_...
168
  		.udma_mask = ATA_UDMA5,
669a5db41   Jeff Garzik   [libata] Add a bu...
169
170
  		.port_ops = &generic_port_ops
  	};
1626aeb88   Tejun Heo   libata: clean up ...
171
  	const struct ata_port_info *ppi[] = { &info, NULL };
85cd7251b   Jeff Garzik   [libata #pata-dri...
172

669a5db41   Jeff Garzik   [libata] Add a bu...
173
  	/* Don't use the generic entry unless instructed to do so */
1529c69ad   Tejun Heo   ata_generic: impl...
174
  	if ((id->driver_data & ATA_GEN_CLASS_MATCH) && all_generic_ide == 0)
669a5db41   Jeff Garzik   [libata] Add a bu...
175
  		return -ENODEV;
47ee9108c   Andi Kleen   ata_generic: Skip...
176
  	if ((id->driver_data & ATA_GEN_INTEL_IDER) && !all_generic_ide)
60039a529   Alan Cox   ata: Intel IDE-R ...
177
178
  		if (!is_intel_ider(dev))
  			return -ENODEV;
669a5db41   Jeff Garzik   [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   Jeff Garzik   [libata #pata-dri...
195

669a5db41   Jeff Garzik   [libata] Add a bu...
196
  	if (dev->vendor == PCI_VENDOR_ID_AL)
9363c3825   Tejun Heo   libata: rename SF...
197
  		ata_pci_bmdma_clear_simplex(dev);
669a5db41   Jeff Garzik   [libata] Add a bu...
198

05177f178   Alan Cox   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   Tejun Heo   ata_generic: impl...
205
  	return ata_pci_bmdma_init_one(dev, ppi, &generic_sht, (void *)id, 0);
669a5db41   Jeff Garzik   [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   Jeff Garzik   [libata #pata-dri...
211
  	{ PCI_DEVICE(PCI_VENDOR_ID_UMC,    PCI_DEVICE_ID_UMC_UM8673F), },
669a5db41   Jeff Garzik   [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   Tejun Heo   ata_generic: impl...
217
218
  	{ PCI_DEVICE(PCI_VENDOR_ID_CENATEK,PCI_DEVICE_ID_CENATEK_IDE),
  	  .driver_data = ATA_GEN_FORCE_DMA },
8e182a90f   Alan Cox   pata_piccolo: Dri...
219
  #if !defined(CONFIG_PATA_TOSHIBA) && !defined(CONFIG_PATA_TOSHIBA_MODULE)
669a5db41   Jeff Garzik   [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   Alan Cox   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   Alan Cox   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   Jeff Garzik   [libata] trivial:...
227
  	  PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL,
60039a529   Alan Cox   ata: Intel IDE-R ...
228
  	  .driver_data = ATA_GEN_INTEL_IDER },
669a5db41   Jeff Garzik   [libata] Add a bu...
229
  	/* Must come last. If you add entries adjust this table appropriately */
1529c69ad   Tejun Heo   ata_generic: impl...
230
231
  	{ PCI_DEVICE_CLASS(PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL),
  	  .driver_data = ATA_GEN_CLASS_MATCH },
669a5db41   Jeff Garzik   [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   Alan Cox   [PATCH] PATA liba...
239
  	.remove		= ata_pci_remove_one,
58eb8cd56   Bartlomiej Zolnierkiewicz   ata: use CONFIG_P...
240
  #ifdef CONFIG_PM_SLEEP
30ced0f0d   Alan Cox   [PATCH] PATA liba...
241
242
  	.suspend	= ata_pci_device_suspend,
  	.resume		= ata_pci_device_resume,
438ac6d5e   Tejun Heo   libata: add missi...
243
  #endif
669a5db41   Jeff Garzik   [libata] Add a bu...
244
  };
2fc75da0c   Axel Lin   ata: use module_p...
245
  module_pci_driver(ata_generic_pci_driver);
669a5db41   Jeff Garzik   [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   Jeff Garzik   [libata] Add a bu...
252
  module_param(all_generic_ide, int, 0);