Blame view
drivers/ata/pata_rz1000.c
3.97 KB
669a5db41 [libata] Add a bu... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
/* * RZ1000/1001 driver based upon * * linux/drivers/ide/pci/rz1000.c Version 0.06 January 12, 2003 * Copyright (C) 1995-1998 Linus Torvalds & author (see below) * Principal Author: mlord@pobox.com (Mark Lord) * * See linux/MAINTAINERS for address of current maintainer. * * This file provides support for disabling the buggy read-ahead * mode of the RZ1000 IDE chipset, commonly used on Intel motherboards. */ #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 "pata_rz1000" |
8bc3fc470 libata: bump vers... |
24 |
#define DRV_VERSION "0.2.4" |
669a5db41 [libata] Add a bu... |
25 26 27 |
/** |
669a5db41 [libata] Add a bu... |
28 |
* rz1000_set_mode - mode setting function |
0260731f0 libata-link: link... |
29 |
* @link: ATA link |
b229a7b0a libata: set_mode,... |
30 |
* @unused: returned device on set_mode failure |
669a5db41 [libata] Add a bu... |
31 32 33 34 35 |
* * Use a non standard set_mode function. We don't want to be tuned. We * would prefer to be BIOS generic but for the fact our hardware is * whacked out. */ |
0260731f0 libata-link: link... |
36 |
static int rz1000_set_mode(struct ata_link *link, struct ata_device **unused) |
669a5db41 [libata] Add a bu... |
37 |
{ |
f58229f80 libata-link: impl... |
38 |
struct ata_device *dev; |
669a5db41 [libata] Add a bu... |
39 |
|
1eca4365b libata: beef up i... |
40 41 42 43 44 45 |
ata_for_each_dev(dev, link, ENABLED) { /* We don't really care */ dev->pio_mode = XFER_PIO_0; dev->xfer_mode = XFER_PIO_0; dev->xfer_shift = ATA_SHIFT_PIO; dev->flags |= ATA_DFLAG_PIO; |
a9a79dfec ata: Convert ata_... |
46 47 |
ata_dev_info(dev, "configured for PIO "); |
669a5db41 [libata] Add a bu... |
48 |
} |
b229a7b0a libata: set_mode,... |
49 |
return 0; |
669a5db41 [libata] Add a bu... |
50 51 52 53 |
} static struct scsi_host_template rz1000_sht = { |
68d1d07b5 libata: implement... |
54 |
ATA_PIO_SHT(DRV_NAME), |
669a5db41 [libata] Add a bu... |
55 56 57 |
}; static struct ata_port_operations rz1000_port_ops = { |
029cfd6b7 libata: implement... |
58 |
.inherits = &ata_sff_port_ops, |
2a25dfe4f pata_rz1000: supp... |
59 |
.cable_detect = ata_cable_40wire, |
029cfd6b7 libata: implement... |
60 |
.set_mode = rz1000_set_mode, |
669a5db41 [libata] Add a bu... |
61 |
}; |
ad4a42d28 [PATCH] pata_rz10... |
62 63 64 65 66 67 68 69 70 71 72 73 74 |
static int rz1000_fifo_disable(struct pci_dev *pdev) { u16 reg; /* Be exceptionally paranoid as we must be sure to apply the fix */ if (pci_read_config_word(pdev, 0x40, ®) != 0) return -1; reg &= 0xDFFF; if (pci_write_config_word(pdev, 0x40, reg) != 0) return -1; printk(KERN_INFO DRV_NAME ": disabled chipset readahead. "); return 0; } |
669a5db41 [libata] Add a bu... |
75 76 77 78 79 80 81 82 83 84 85 86 |
/** * rz1000_init_one - Register RZ1000 ATA PCI device with kernel services * @pdev: PCI device to register * @ent: Entry in rz1000_pci_tbl matching with @pdev * * Configure an RZ1000 interface. This doesn't require much special * handling except that we *MUST* kill the chipset readahead or the * user may experience data corruption. */ static int rz1000_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) { |
1626aeb88 libata: clean up ... |
87 |
static const struct ata_port_info info = { |
1d2808fd3 [libata] PATA dri... |
88 |
.flags = ATA_FLAG_SLAVE_POSS, |
14bdef982 [libata] convert ... |
89 |
.pio_mask = ATA_PIO4, |
669a5db41 [libata] Add a bu... |
90 91 |
.port_ops = &rz1000_port_ops }; |
1626aeb88 libata: clean up ... |
92 |
const struct ata_port_info *ppi[] = { &info, NULL }; |
669a5db41 [libata] Add a bu... |
93 |
|
06296a1e6 ata: Add and use ... |
94 |
ata_print_version_once(&pdev->dev, DRV_VERSION); |
669a5db41 [libata] Add a bu... |
95 |
|
1626aeb88 libata: clean up ... |
96 |
if (rz1000_fifo_disable(pdev) == 0) |
16ea0fc98 libata: Pass host... |
97 |
return ata_pci_sff_init_one(pdev, ppi, &rz1000_sht, NULL, 0); |
1626aeb88 libata: clean up ... |
98 |
|
669a5db41 [libata] Add a bu... |
99 100 101 102 103 |
printk(KERN_ERR DRV_NAME ": failed to disable read-ahead on chipset.. "); /* Not safe to use so skip */ return -ENODEV; } |
438ac6d5e libata: add missi... |
104 |
#ifdef CONFIG_PM |
ad4a42d28 [PATCH] pata_rz10... |
105 106 |
static int rz1000_reinit_one(struct pci_dev *pdev) { |
0826ef5f6 pata_rz1000: Powe... |
107 108 109 110 111 112 |
struct ata_host *host = dev_get_drvdata(&pdev->dev); int rc; rc = ata_pci_device_do_resume(pdev); if (rc) return rc; |
25985edce Fix common misspe... |
113 |
/* If this fails on resume (which is a "can't happen" case), we |
ad4a42d28 [PATCH] pata_rz10... |
114 115 116 |
must stop as any progress risks data loss */ if (rz1000_fifo_disable(pdev)) panic("rz1000 fifo"); |
0826ef5f6 pata_rz1000: Powe... |
117 118 119 |
ata_host_resume(host); return 0; |
ad4a42d28 [PATCH] pata_rz10... |
120 |
} |
438ac6d5e libata: add missi... |
121 |
#endif |
ad4a42d28 [PATCH] pata_rz10... |
122 |
|
2d2744fc8 [libata] PCI ID t... |
123 124 125 126 127 |
static const struct pci_device_id pata_rz1000[] = { { PCI_VDEVICE(PCTECH, PCI_DEVICE_ID_PCTECH_RZ1000), }, { PCI_VDEVICE(PCTECH, PCI_DEVICE_ID_PCTECH_RZ1001), }, { }, |
669a5db41 [libata] Add a bu... |
128 129 130 |
}; static struct pci_driver rz1000_pci_driver = { |
2d2744fc8 [libata] PCI ID t... |
131 |
.name = DRV_NAME, |
669a5db41 [libata] Add a bu... |
132 133 |
.id_table = pata_rz1000, .probe = rz1000_init_one, |
ad4a42d28 [PATCH] pata_rz10... |
134 |
.remove = ata_pci_remove_one, |
438ac6d5e libata: add missi... |
135 |
#ifdef CONFIG_PM |
ad4a42d28 [PATCH] pata_rz10... |
136 137 |
.suspend = ata_pci_device_suspend, .resume = rz1000_reinit_one, |
438ac6d5e libata: add missi... |
138 |
#endif |
669a5db41 [libata] Add a bu... |
139 |
}; |
669a5db41 [libata] Add a bu... |
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
static int __init rz1000_init(void) { return pci_register_driver(&rz1000_pci_driver); } static void __exit rz1000_exit(void) { pci_unregister_driver(&rz1000_pci_driver); } MODULE_AUTHOR("Alan Cox"); MODULE_DESCRIPTION("low-level driver for RZ1000 PCI ATA"); MODULE_LICENSE("GPL"); MODULE_DEVICE_TABLE(pci, pata_rz1000); MODULE_VERSION(DRV_VERSION); module_init(rz1000_init); module_exit(rz1000_exit); |