ata_generic.c 8.5 KB
Newer Older
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 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
10
 *
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
16
 *  work.
17 18 19 20 21 22 23 24 25 26 27 28
 */

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/pci.h>
#include <linux/init.h>
#include <linux/blkdev.h>
#include <linux/delay.h>
#include <scsi/scsi_host.h>
#include <linux/libata.h>

#define DRV_NAME "ata_generic"
A
Alan Cox 已提交
29
#define DRV_VERSION "0.2.15"
30 31 32 33 34

/*
 *	A generic parallel ATA driver using libata
 */

35 36 37
enum {
	ATA_GEN_CLASS_MATCH		= (1 << 0),
	ATA_GEN_FORCE_DMA		= (1 << 1),
A
Alan Cox 已提交
38
	ATA_GEN_INTEL_IDER		= (1 << 2),
39 40
};

41 42
/**
 *	generic_set_mode	-	mode setting
43
 *	@link: link to set up
A
Alan 已提交
44
 *	@unused: returned device on error
45 46 47 48
 *
 *	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
49
 *	and respect them.
50
 */
51

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 60 61 62
	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 */
63
		dma_enabled = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS);
64
	}
65

T
Tejun Heo 已提交
66
	ata_for_each_dev(dev, link, ENABLED) {
67 68 69 70 71 72
		/* 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))) {
T
Tejun Heo 已提交
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
			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);
			}

			ata_dev_printk(dev, KERN_INFO, "configured for %s\n",
				       name);

			dev->xfer_mode = ata_xfer_mask2mode(xfer_mask);
			dev->xfer_shift = ata_xfer_mode2shift(dev->xfer_mode);
89 90 91 92 93 94
			dev->flags &= ~ATA_DFLAG_PIO;
		} else {
			ata_dev_printk(dev, KERN_INFO, "configured for PIO\n");
			dev->xfer_mode = XFER_PIO_0;
			dev->xfer_shift = ATA_SHIFT_PIO;
			dev->flags |= ATA_DFLAG_PIO;
95 96
		}
	}
A
Alan 已提交
97
	return 0;
98 99 100
}

static struct scsi_host_template generic_sht = {
101
	ATA_BMDMA_SHT(DRV_NAME),
102 103 104
};

static struct ata_port_operations generic_port_ops = {
105
	.inherits	= &ata_bmdma_port_ops,
A
Alan Cox 已提交
106
	.cable_detect	= ata_cable_unknown,
107
	.set_mode	= generic_set_mode,
108 109
};

110 111
static int all_generic_ide;		/* Set to claim all devices */

A
Alan Cox 已提交
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 152 153 154
/**
 *	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;
}

155 156 157 158 159 160
/**
 *	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
161
 *	interface is one we wish to claim and if so we perform any chip
162 163
 *	specific hacks then let the ATA layer do the heavy lifting.
 */
164

165 166 167
static int ata_generic_init_one(struct pci_dev *dev, const struct pci_device_id *id)
{
	u16 command;
T
Tejun Heo 已提交
168
	static const struct ata_port_info info = {
169
		.flags = ATA_FLAG_SLAVE_POSS,
170 171
		.pio_mask = ATA_PIO4,
		.mwdma_mask = ATA_MWDMA2,
172
		.udma_mask = ATA_UDMA5,
173 174
		.port_ops = &generic_port_ops
	};
T
Tejun Heo 已提交
175
	const struct ata_port_info *ppi[] = { &info, NULL };
176

177
	/* Don't use the generic entry unless instructed to do so */
178
	if ((id->driver_data & ATA_GEN_CLASS_MATCH) && all_generic_ide == 0)
179 180
		return -ENODEV;

A
Alan Cox 已提交
181 182 183 184
	if (id->driver_data & ATA_GEN_INTEL_IDER)
		if (!is_intel_ider(dev))
			return -ENODEV;

185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
	/* 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;
201

202
	if (dev->vendor == PCI_VENDOR_ID_AL)
T
Tejun Heo 已提交
203
		ata_pci_bmdma_clear_simplex(dev);
204

A
Alan Cox 已提交
205 206 207 208 209 210
	if (dev->vendor == PCI_VENDOR_ID_ATI) {
		int rc = pcim_enable_device(dev);
		if (rc < 0)
			return rc;
		pcim_pin_device(dev);
	}
211
	return ata_pci_bmdma_init_one(dev, ppi, &generic_sht, (void *)id, 0);
212 213 214 215 216
}

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), },
217
	{ PCI_DEVICE(PCI_VENDOR_ID_UMC,    PCI_DEVICE_ID_UMC_UM8673F), },
218 219 220 221 222
	{ 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), },
223 224
	{ PCI_DEVICE(PCI_VENDOR_ID_CENATEK,PCI_DEVICE_ID_CENATEK_IDE),
	  .driver_data = ATA_GEN_FORCE_DMA },
225 226 227 228 229
	/*
	 * For some reason, MCP89 on MacBook 7,1 doesn't work with
	 * ahci, use ata_generic instead.
	 */
	{ PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP89_SATA,
230 231
	  PCI_VENDOR_ID_APPLE, 0xcb89,
	  .driver_data = ATA_GEN_FORCE_DMA },
232
#if !defined(CONFIG_PATA_TOSHIBA) && !defined(CONFIG_PATA_TOSHIBA_MODULE)
233 234
	{ PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_1), },
	{ PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_2),  },
235 236
	{ PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_3),  },
	{ PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_5),  },
A
Alan Cox 已提交
237 238 239 240 241
#endif
	/* Intel, IDE class device */
	{ PCI_VENDOR_ID_INTEL, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
	  PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL, 
	  .driver_data = ATA_GEN_INTEL_IDER },
242
	/* Must come last. If you add entries adjust this table appropriately */
243 244
	{ PCI_DEVICE_CLASS(PCI_CLASS_STORAGE_IDE << 8, 0xFFFFFF00UL),
	  .driver_data = ATA_GEN_CLASS_MATCH },
245 246 247 248 249 250 251
	{ 0, },
};

static struct pci_driver ata_generic_pci_driver = {
	.name 		= DRV_NAME,
	.id_table	= ata_generic,
	.probe 		= ata_generic_init_one,
252
	.remove		= ata_pci_remove_one,
253
#ifdef CONFIG_PM
254 255
	.suspend	= ata_pci_device_suspend,
	.resume		= ata_pci_device_resume,
256
#endif
257 258 259 260
};

static int __init ata_generic_init(void)
{
261
	return pci_register_driver(&ata_generic_pci_driver);
262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280
}


static void __exit ata_generic_exit(void)
{
	pci_unregister_driver(&ata_generic_pci_driver);
}


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);

module_init(ata_generic_init);
module_exit(ata_generic_exit);

module_param(all_generic_ide, int, 0);