aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ide')
-rw-r--r--drivers/ide/Kconfig17
-rw-r--r--drivers/ide/Makefile1
-rw-r--r--drivers/ide/amd74xx.c2
-rw-r--r--drivers/ide/atiixp.c4
-rw-r--r--drivers/ide/cs5536.c308
-rw-r--r--drivers/ide/falconide.c2
-rw-r--r--drivers/ide/icside.c2
-rw-r--r--drivers/ide/ide-acpi.c2
-rw-r--r--drivers/ide/ide-cd.c38
-rw-r--r--drivers/ide/ide-cd.h2
-rw-r--r--drivers/ide/ide-disk.c2
-rw-r--r--drivers/ide/ide-gd.c26
-rw-r--r--drivers/ide/ide-gd.h2
-rw-r--r--drivers/ide/ide-io.c9
-rw-r--r--drivers/ide/ide-iops.c2
-rw-r--r--drivers/ide/ide-pm.c12
-rw-r--r--drivers/ide/ide-probe.c48
-rw-r--r--drivers/ide/ide-tape.c29
-rw-r--r--drivers/ide/ide.c11
-rw-r--r--drivers/ide/it821x.c20
-rw-r--r--drivers/ide/palm_bk3710.c11
-rw-r--r--drivers/ide/qd65xx.c2
-rw-r--r--drivers/ide/qd65xx.h2
-rw-r--r--drivers/ide/sl82c105.c4
-rw-r--r--drivers/ide/tx4938ide.c1
-rw-r--r--drivers/ide/tx4939ide.c4
-rw-r--r--drivers/ide/via82cxxx.c7
27 files changed, 485 insertions, 85 deletions
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig
index 3f9503867e6b..e072903b12f0 100644
--- a/drivers/ide/Kconfig
+++ b/drivers/ide/Kconfig
@@ -46,7 +46,7 @@ menuconfig IDE
46 SMART parameters from disk drives. 46 SMART parameters from disk drives.
47 47
48 To compile this driver as a module, choose M here: the 48 To compile this driver as a module, choose M here: the
49 module will be called ide. 49 module will be called ide-core.ko.
50 50
51 For further information, please read <file:Documentation/ide/ide.txt>. 51 For further information, please read <file:Documentation/ide/ide.txt>.
52 52
@@ -465,6 +465,16 @@ config BLK_DEV_CS5535
465 465
466 It is safe to say Y to this question. 466 It is safe to say Y to this question.
467 467
468config BLK_DEV_CS5536
469 tristate "CS5536 chipset support"
470 depends on X86_32
471 select BLK_DEV_IDEDMA_PCI
472 help
473 This option enables support for the AMD CS5536
474 companion chip used with the Geode LX processor family.
475
476 If unsure, say N.
477
468config BLK_DEV_HPT366 478config BLK_DEV_HPT366
469 tristate "HPT36X/37X chipset support" 479 tristate "HPT36X/37X chipset support"
470 select BLK_DEV_IDEDMA_PCI 480 select BLK_DEV_IDEDMA_PCI
@@ -701,11 +711,6 @@ config BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
701 depends on SOC_AU1200 && BLK_DEV_IDE_AU1XXX 711 depends on SOC_AU1200 && BLK_DEV_IDE_AU1XXX
702endchoice 712endchoice
703 713
704config BLK_DEV_IDE_AU1XXX_SEQTS_PER_RQ
705 int "Maximum transfer size (KB) per request (up to 128)"
706 default "128"
707 depends on BLK_DEV_IDE_AU1XXX
708
709config BLK_DEV_IDE_TX4938 714config BLK_DEV_IDE_TX4938
710 tristate "TX4938 internal IDE support" 715 tristate "TX4938 internal IDE support"
711 depends on SOC_TX4938 716 depends on SOC_TX4938
diff --git a/drivers/ide/Makefile b/drivers/ide/Makefile
index c2b9c93f0095..d0e3d7d5b467 100644
--- a/drivers/ide/Makefile
+++ b/drivers/ide/Makefile
@@ -43,6 +43,7 @@ obj-$(CONFIG_BLK_DEV_CMD64X) += cmd64x.o
43obj-$(CONFIG_BLK_DEV_CS5520) += cs5520.o 43obj-$(CONFIG_BLK_DEV_CS5520) += cs5520.o
44obj-$(CONFIG_BLK_DEV_CS5530) += cs5530.o 44obj-$(CONFIG_BLK_DEV_CS5530) += cs5530.o
45obj-$(CONFIG_BLK_DEV_CS5535) += cs5535.o 45obj-$(CONFIG_BLK_DEV_CS5535) += cs5535.o
46obj-$(CONFIG_BLK_DEV_CS5536) += cs5536.o
46obj-$(CONFIG_BLK_DEV_SC1200) += sc1200.o 47obj-$(CONFIG_BLK_DEV_SC1200) += sc1200.o
47obj-$(CONFIG_BLK_DEV_CY82C693) += cy82c693.o 48obj-$(CONFIG_BLK_DEV_CY82C693) += cy82c693.o
48obj-$(CONFIG_BLK_DEV_DELKIN) += delkin_cb.o 49obj-$(CONFIG_BLK_DEV_DELKIN) += delkin_cb.o
diff --git a/drivers/ide/amd74xx.c b/drivers/ide/amd74xx.c
index 69660a431cd9..77267c859965 100644
--- a/drivers/ide/amd74xx.c
+++ b/drivers/ide/amd74xx.c
@@ -166,7 +166,7 @@ static unsigned int init_chipset_amd74xx(struct pci_dev *dev)
166 * Check for broken FIFO support. 166 * Check for broken FIFO support.
167 */ 167 */
168 if (dev->vendor == PCI_VENDOR_ID_AMD && 168 if (dev->vendor == PCI_VENDOR_ID_AMD &&
169 dev->vendor == PCI_DEVICE_ID_AMD_VIPER_7411) 169 dev->device == PCI_DEVICE_ID_AMD_VIPER_7411)
170 t &= 0x0f; 170 t &= 0x0f;
171 else 171 else
172 t |= 0xf0; 172 t |= 0xf0;
diff --git a/drivers/ide/atiixp.c b/drivers/ide/atiixp.c
index b2735d28f5cc..ecd1e62ca91a 100644
--- a/drivers/ide/atiixp.c
+++ b/drivers/ide/atiixp.c
@@ -52,7 +52,7 @@ static void atiixp_set_pio_mode(ide_drive_t *drive, const u8 pio)
52{ 52{
53 struct pci_dev *dev = to_pci_dev(drive->hwif->dev); 53 struct pci_dev *dev = to_pci_dev(drive->hwif->dev);
54 unsigned long flags; 54 unsigned long flags;
55 int timing_shift = (drive->dn & 2) ? 16 : 0 + (drive->dn & 1) ? 0 : 8; 55 int timing_shift = (drive->dn ^ 1) * 8;
56 u32 pio_timing_data; 56 u32 pio_timing_data;
57 u16 pio_mode_data; 57 u16 pio_mode_data;
58 58
@@ -85,7 +85,7 @@ static void atiixp_set_dma_mode(ide_drive_t *drive, const u8 speed)
85{ 85{
86 struct pci_dev *dev = to_pci_dev(drive->hwif->dev); 86 struct pci_dev *dev = to_pci_dev(drive->hwif->dev);
87 unsigned long flags; 87 unsigned long flags;
88 int timing_shift = (drive->dn & 2) ? 16 : 0 + (drive->dn & 1) ? 0 : 8; 88 int timing_shift = (drive->dn ^ 1) * 8;
89 u32 tmp32; 89 u32 tmp32;
90 u16 tmp16; 90 u16 tmp16;
91 u16 udma_ctl = 0; 91 u16 udma_ctl = 0;
diff --git a/drivers/ide/cs5536.c b/drivers/ide/cs5536.c
new file mode 100644
index 000000000000..7a62db719a46
--- /dev/null
+++ b/drivers/ide/cs5536.c
@@ -0,0 +1,308 @@
1/*
2 * CS5536 PATA support
3 * (C) 2007 Martin K. Petersen <mkp@mkp.net>
4 * (C) 2009 Bartlomiej Zolnierkiewicz
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 *
19 * Documentation:
20 * Available from AMD web site.
21 *
22 * The IDE timing registers for the CS5536 live in the Geode Machine
23 * Specific Register file and not PCI config space. Most BIOSes
24 * virtualize the PCI registers so the chip looks like a standard IDE
25 * controller. Unfortunately not all implementations get this right.
26 * In particular some have problems with unaligned accesses to the
27 * virtualized PCI registers. This driver always does full dword
28 * writes to work around the issue. Also, in case of a bad BIOS this
29 * driver can be loaded with the "msr=1" parameter which forces using
30 * the Machine Specific Registers to configure the device.
31 */
32
33#include <linux/kernel.h>
34#include <linux/module.h>
35#include <linux/pci.h>
36#include <linux/init.h>
37#include <linux/ide.h>
38#include <asm/msr.h>
39
40#define DRV_NAME "cs5536"
41
42enum {
43 MSR_IDE_CFG = 0x51300010,
44 PCI_IDE_CFG = 0x40,
45
46 CFG = 0,
47 DTC = 2,
48 CAST = 3,
49 ETC = 4,
50
51 IDE_CFG_CHANEN = (1 << 1),
52 IDE_CFG_CABLE = (1 << 17) | (1 << 16),
53
54 IDE_D0_SHIFT = 24,
55 IDE_D1_SHIFT = 16,
56 IDE_DRV_MASK = 0xff,
57
58 IDE_CAST_D0_SHIFT = 6,
59 IDE_CAST_D1_SHIFT = 4,
60 IDE_CAST_DRV_MASK = 0x3,
61
62 IDE_CAST_CMD_SHIFT = 24,
63 IDE_CAST_CMD_MASK = 0xff,
64
65 IDE_ETC_UDMA_MASK = 0xc0,
66};
67
68static int use_msr;
69
70static int cs5536_read(struct pci_dev *pdev, int reg, u32 *val)
71{
72 if (unlikely(use_msr)) {
73 u32 dummy;
74
75 rdmsr(MSR_IDE_CFG + reg, *val, dummy);
76 return 0;
77 }
78
79 return pci_read_config_dword(pdev, PCI_IDE_CFG + reg * 4, val);
80}
81
82static int cs5536_write(struct pci_dev *pdev, int reg, int val)
83{
84 if (unlikely(use_msr)) {
85 wrmsr(MSR_IDE_CFG + reg, val, 0);
86 return 0;
87 }
88
89 return pci_write_config_dword(pdev, PCI_IDE_CFG + reg * 4, val);
90}
91
92static void cs5536_program_dtc(ide_drive_t *drive, u8 tim)
93{
94 struct pci_dev *pdev = to_pci_dev(drive->hwif->dev);
95 int dshift = (drive->dn & 1) ? IDE_D1_SHIFT : IDE_D0_SHIFT;
96 u32 dtc;
97
98 cs5536_read(pdev, DTC, &dtc);
99 dtc &= ~(IDE_DRV_MASK << dshift);
100 dtc |= tim << dshift;
101 cs5536_write(pdev, DTC, dtc);
102}
103
104/**
105 * cs5536_cable_detect - detect cable type
106 * @hwif: Port to detect on
107 *
108 * Perform cable detection for ATA66 capable cable.
109 *
110 * Returns a cable type.
111 */
112
113static u8 cs5536_cable_detect(ide_hwif_t *hwif)
114{
115 struct pci_dev *pdev = to_pci_dev(hwif->dev);
116 u32 cfg;
117
118 cs5536_read(pdev, CFG, &cfg);
119
120 if (cfg & IDE_CFG_CABLE)
121 return ATA_CBL_PATA80;
122 else
123 return ATA_CBL_PATA40;
124}
125
126/**
127 * cs5536_set_pio_mode - PIO timing setup
128 * @drive: ATA device
129 * @pio: PIO mode number
130 */
131
132static void cs5536_set_pio_mode(ide_drive_t *drive, const u8 pio)
133{
134 static const u8 drv_timings[5] = {
135 0x98, 0x55, 0x32, 0x21, 0x20,
136 };
137
138 static const u8 addr_timings[5] = {
139 0x2, 0x1, 0x0, 0x0, 0x0,
140 };
141
142 static const u8 cmd_timings[5] = {
143 0x99, 0x92, 0x90, 0x22, 0x20,
144 };
145
146 struct pci_dev *pdev = to_pci_dev(drive->hwif->dev);
147 ide_drive_t *pair = ide_get_pair_dev(drive);
148 int cshift = (drive->dn & 1) ? IDE_CAST_D1_SHIFT : IDE_CAST_D0_SHIFT;
149 u32 cast;
150 u8 cmd_pio = pio;
151
152 if (pair)
153 cmd_pio = min(pio, ide_get_best_pio_mode(pair, 255, 4));
154
155 drive->drive_data &= (IDE_DRV_MASK << 8);
156 drive->drive_data |= drv_timings[pio];
157
158 cs5536_program_dtc(drive, drv_timings[pio]);
159
160 cs5536_read(pdev, CAST, &cast);
161
162 cast &= ~(IDE_CAST_DRV_MASK << cshift);
163 cast |= addr_timings[pio] << cshift;
164
165 cast &= ~(IDE_CAST_CMD_MASK << IDE_CAST_CMD_SHIFT);
166 cast |= cmd_timings[cmd_pio] << IDE_CAST_CMD_SHIFT;
167
168 cs5536_write(pdev, CAST, cast);
169}
170
171/**
172 * cs5536_set_dma_mode - DMA timing setup
173 * @drive: ATA device
174 * @mode: DMA mode
175 */
176
177static void cs5536_set_dma_mode(ide_drive_t *drive, const u8 mode)
178{
179 static const u8 udma_timings[6] = {
180 0xc2, 0xc1, 0xc0, 0xc4, 0xc5, 0xc6,
181 };
182
183 static const u8 mwdma_timings[3] = {
184 0x67, 0x21, 0x20,
185 };
186
187 struct pci_dev *pdev = to_pci_dev(drive->hwif->dev);
188 int dshift = (drive->dn & 1) ? IDE_D1_SHIFT : IDE_D0_SHIFT;
189 u32 etc;
190
191 cs5536_read(pdev, ETC, &etc);
192
193 if (mode >= XFER_UDMA_0) {
194 etc &= ~(IDE_DRV_MASK << dshift);
195 etc |= udma_timings[mode - XFER_UDMA_0] << dshift;
196 } else { /* MWDMA */
197 etc &= ~(IDE_ETC_UDMA_MASK << dshift);
198 drive->drive_data &= IDE_DRV_MASK;
199 drive->drive_data |= mwdma_timings[mode - XFER_MW_DMA_0] << 8;
200 }
201
202 cs5536_write(pdev, ETC, etc);
203}
204
205static void cs5536_dma_start(ide_drive_t *drive)
206{
207 if (drive->current_speed < XFER_UDMA_0 &&
208 (drive->drive_data >> 8) != (drive->drive_data & IDE_DRV_MASK))
209 cs5536_program_dtc(drive, drive->drive_data >> 8);
210
211 ide_dma_start(drive);
212}
213
214static int cs5536_dma_end(ide_drive_t *drive)
215{
216 int ret = ide_dma_end(drive);
217
218 if (drive->current_speed < XFER_UDMA_0 &&
219 (drive->drive_data >> 8) != (drive->drive_data & IDE_DRV_MASK))
220 cs5536_program_dtc(drive, drive->drive_data & IDE_DRV_MASK);
221
222 return ret;
223}
224
225static const struct ide_port_ops cs5536_port_ops = {
226 .set_pio_mode = cs5536_set_pio_mode,
227 .set_dma_mode = cs5536_set_dma_mode,
228 .cable_detect = cs5536_cable_detect,
229};
230
231static const struct ide_dma_ops cs5536_dma_ops = {
232 .dma_host_set = ide_dma_host_set,
233 .dma_setup = ide_dma_setup,
234 .dma_exec_cmd = ide_dma_exec_cmd,
235 .dma_start = cs5536_dma_start,
236 .dma_end = cs5536_dma_end,
237 .dma_test_irq = ide_dma_test_irq,
238 .dma_lost_irq = ide_dma_lost_irq,
239 .dma_timeout = ide_dma_timeout,
240};
241
242static const struct ide_port_info cs5536_info = {
243 .name = DRV_NAME,
244 .port_ops = &cs5536_port_ops,
245 .dma_ops = &cs5536_dma_ops,
246 .host_flags = IDE_HFLAG_SINGLE,
247 .pio_mask = ATA_PIO4,
248 .mwdma_mask = ATA_MWDMA2,
249 .udma_mask = ATA_UDMA5,
250};
251
252/**
253 * cs5536_init_one
254 * @dev: PCI device
255 * @id: Entry in match table
256 */
257
258static int cs5536_init_one(struct pci_dev *dev, const struct pci_device_id *id)
259{
260 u32 cfg;
261
262 if (use_msr)
263 printk(KERN_INFO DRV_NAME ": Using MSR regs instead of PCI\n");
264
265 cs5536_read(dev, CFG, &cfg);
266
267 if ((cfg & IDE_CFG_CHANEN) == 0) {
268 printk(KERN_ERR DRV_NAME ": disabled by BIOS\n");
269 return -ENODEV;
270 }
271
272 return ide_pci_init_one(dev, &cs5536_info, NULL);
273}
274
275static const struct pci_device_id cs5536_pci_tbl[] = {
276 { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_CS5536_IDE), },
277 { },
278};
279
280static struct pci_driver cs5536_pci_driver = {
281 .name = DRV_NAME,
282 .id_table = cs5536_pci_tbl,
283 .probe = cs5536_init_one,
284 .remove = ide_pci_remove,
285 .suspend = ide_pci_suspend,
286 .resume = ide_pci_resume,
287};
288
289static int __init cs5536_init(void)
290{
291 return pci_register_driver(&cs5536_pci_driver);
292}
293
294static void __exit cs5536_exit(void)
295{
296 pci_unregister_driver(&cs5536_pci_driver);
297}
298
299MODULE_AUTHOR("Martin K. Petersen, Bartlomiej Zolnierkiewicz");
300MODULE_DESCRIPTION("low-level driver for the CS5536 IDE controller");
301MODULE_LICENSE("GPL");
302MODULE_DEVICE_TABLE(pci, cs5536_pci_tbl);
303
304module_param_named(msr, use_msr, int, 0644);
305MODULE_PARM_DESC(msr, "Force using MSR to configure IDE function (Default: 0)");
306
307module_init(cs5536_init);
308module_exit(cs5536_exit);
diff --git a/drivers/ide/falconide.c b/drivers/ide/falconide.c
index a5ba820d69bb..a638e952d67a 100644
--- a/drivers/ide/falconide.c
+++ b/drivers/ide/falconide.c
@@ -82,7 +82,7 @@ static const struct ide_tp_ops falconide_tp_ops = {
82 82
83static const struct ide_port_info falconide_port_info = { 83static const struct ide_port_info falconide_port_info = {
84 .tp_ops = &falconide_tp_ops, 84 .tp_ops = &falconide_tp_ops,
85 .host_flags = IDE_HFLAG_NO_DMA, 85 .host_flags = IDE_HFLAG_NO_DMA | IDE_HFLAG_SERIALIZE,
86}; 86};
87 87
88static void __init falconide_setup_ports(hw_regs_t *hw) 88static void __init falconide_setup_ports(hw_regs_t *hw)
diff --git a/drivers/ide/icside.c b/drivers/ide/icside.c
index 97a35c667aee..415d7e24f2b6 100644
--- a/drivers/ide/icside.c
+++ b/drivers/ide/icside.c
@@ -534,7 +534,7 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec)
534 d.dma_ops = NULL; 534 d.dma_ops = NULL;
535 } 535 }
536 536
537 ret = ide_host_register(host, NULL, hws); 537 ret = ide_host_register(host, &d, hws);
538 if (ret) 538 if (ret)
539 goto err_free; 539 goto err_free;
540 540
diff --git a/drivers/ide/ide-acpi.c b/drivers/ide/ide-acpi.c
index d8f295bdad76..ec7d07fa570a 100644
--- a/drivers/ide/ide-acpi.c
+++ b/drivers/ide/ide-acpi.c
@@ -282,7 +282,7 @@ static int do_drive_get_GTF(ide_drive_t *drive,
282 port = hwif->channel ? drive->dn - 2: drive->dn; 282 port = hwif->channel ? drive->dn - 2: drive->dn;
283 283
284 DEBPRINT("ENTER: %s at %s, port#: %d, hard_port#: %d\n", 284 DEBPRINT("ENTER: %s at %s, port#: %d, hard_port#: %d\n",
285 hwif->name, dev->bus_id, port, hwif->channel); 285 hwif->name, dev_name(dev), port, hwif->channel);
286 286
287 if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0) { 287 if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0) {
288 DEBPRINT("%s drive %d:%d not present\n", 288 DEBPRINT("%s drive %d:%d not present\n",
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c
index cae69372cf45..ddfbea41d296 100644
--- a/drivers/ide/ide-cd.c
+++ b/drivers/ide/ide-cd.c
@@ -55,7 +55,7 @@
55 55
56static DEFINE_MUTEX(idecd_ref_mutex); 56static DEFINE_MUTEX(idecd_ref_mutex);
57 57
58static void ide_cd_release(struct kref *); 58static void ide_cd_release(struct device *);
59 59
60static struct cdrom_info *ide_cd_get(struct gendisk *disk) 60static struct cdrom_info *ide_cd_get(struct gendisk *disk)
61{ 61{
@@ -67,7 +67,7 @@ static struct cdrom_info *ide_cd_get(struct gendisk *disk)
67 if (ide_device_get(cd->drive)) 67 if (ide_device_get(cd->drive))
68 cd = NULL; 68 cd = NULL;
69 else 69 else
70 kref_get(&cd->kref); 70 get_device(&cd->dev);
71 71
72 } 72 }
73 mutex_unlock(&idecd_ref_mutex); 73 mutex_unlock(&idecd_ref_mutex);
@@ -79,7 +79,7 @@ static void ide_cd_put(struct cdrom_info *cd)
79 ide_drive_t *drive = cd->drive; 79 ide_drive_t *drive = cd->drive;
80 80
81 mutex_lock(&idecd_ref_mutex); 81 mutex_lock(&idecd_ref_mutex);
82 kref_put(&cd->kref, ide_cd_release); 82 put_device(&cd->dev);
83 ide_device_put(drive); 83 ide_device_put(drive);
84 mutex_unlock(&idecd_ref_mutex); 84 mutex_unlock(&idecd_ref_mutex);
85} 85}
@@ -194,6 +194,14 @@ static void cdrom_analyze_sense_data(ide_drive_t *drive,
194 bio_sectors = max(bio_sectors(failed_command->bio), 4U); 194 bio_sectors = max(bio_sectors(failed_command->bio), 4U);
195 sector &= ~(bio_sectors - 1); 195 sector &= ~(bio_sectors - 1);
196 196
197 /*
198 * The SCSI specification allows for the value
199 * returned by READ CAPACITY to be up to 75 2K
200 * sectors past the last readable block.
201 * Therefore, if we hit a medium error within the
202 * last 75 2K sectors, we decrease the saved size
203 * value.
204 */
197 if (sector < get_capacity(info->disk) && 205 if (sector < get_capacity(info->disk) &&
198 drive->probed_capacity - sector < 4 * 75) 206 drive->probed_capacity - sector < 4 * 75)
199 set_capacity(info->disk, sector); 207 set_capacity(info->disk, sector);
@@ -787,6 +795,9 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)
787 if (blk_fs_request(rq)) { 795 if (blk_fs_request(rq)) {
788 ide_end_request(drive, 1, rq->nr_sectors); 796 ide_end_request(drive, 1, rq->nr_sectors);
789 return ide_stopped; 797 return ide_stopped;
798 } else if (rq->cmd_type == REQ_TYPE_ATA_PC && !rq->bio) {
799 ide_end_request(drive, 1, 1);
800 return ide_stopped;
790 } 801 }
791 goto end_request; 802 goto end_request;
792 } 803 }
@@ -1787,15 +1798,17 @@ static void ide_cd_remove(ide_drive_t *drive)
1787 ide_debug_log(IDE_DBG_FUNC, "Call %s\n", __func__); 1798 ide_debug_log(IDE_DBG_FUNC, "Call %s\n", __func__);
1788 1799
1789 ide_proc_unregister_driver(drive, info->driver); 1800 ide_proc_unregister_driver(drive, info->driver);
1790 1801 device_del(&info->dev);
1791 del_gendisk(info->disk); 1802 del_gendisk(info->disk);
1792 1803
1793 ide_cd_put(info); 1804 mutex_lock(&idecd_ref_mutex);
1805 put_device(&info->dev);
1806 mutex_unlock(&idecd_ref_mutex);
1794} 1807}
1795 1808
1796static void ide_cd_release(struct kref *kref) 1809static void ide_cd_release(struct device *dev)
1797{ 1810{
1798 struct cdrom_info *info = to_ide_drv(kref, cdrom_info); 1811 struct cdrom_info *info = to_ide_drv(dev, cdrom_info);
1799 struct cdrom_device_info *devinfo = &info->devinfo; 1812 struct cdrom_device_info *devinfo = &info->devinfo;
1800 ide_drive_t *drive = info->drive; 1813 ide_drive_t *drive = info->drive;
1801 struct gendisk *g = info->disk; 1814 struct gendisk *g = info->disk;
@@ -1994,7 +2007,12 @@ static int ide_cd_probe(ide_drive_t *drive)
1994 2007
1995 ide_init_disk(g, drive); 2008 ide_init_disk(g, drive);
1996 2009
1997 kref_init(&info->kref); 2010 info->dev.parent = &drive->gendev;
2011 info->dev.release = ide_cd_release;
2012 dev_set_name(&info->dev, dev_name(&drive->gendev));
2013
2014 if (device_register(&info->dev))
2015 goto out_free_disk;
1998 2016
1999 info->drive = drive; 2017 info->drive = drive;
2000 info->driver = &ide_cdrom_driver; 2018 info->driver = &ide_cdrom_driver;
@@ -2008,7 +2026,7 @@ static int ide_cd_probe(ide_drive_t *drive)
2008 g->driverfs_dev = &drive->gendev; 2026 g->driverfs_dev = &drive->gendev;
2009 g->flags = GENHD_FL_CD | GENHD_FL_REMOVABLE; 2027 g->flags = GENHD_FL_CD | GENHD_FL_REMOVABLE;
2010 if (ide_cdrom_setup(drive)) { 2028 if (ide_cdrom_setup(drive)) {
2011 ide_cd_release(&info->kref); 2029 put_device(&info->dev);
2012 goto failed; 2030 goto failed;
2013 } 2031 }
2014 2032
@@ -2018,6 +2036,8 @@ static int ide_cd_probe(ide_drive_t *drive)
2018 add_disk(g); 2036 add_disk(g);
2019 return 0; 2037 return 0;
2020 2038
2039out_free_disk:
2040 put_disk(g);
2021out_free_cd: 2041out_free_cd:
2022 kfree(info); 2042 kfree(info);
2023failed: 2043failed:
diff --git a/drivers/ide/ide-cd.h b/drivers/ide/ide-cd.h
index ac40d6cb90a2..c878bfcf1116 100644
--- a/drivers/ide/ide-cd.h
+++ b/drivers/ide/ide-cd.h
@@ -80,7 +80,7 @@ struct cdrom_info {
80 ide_drive_t *drive; 80 ide_drive_t *drive;
81 struct ide_driver *driver; 81 struct ide_driver *driver;
82 struct gendisk *disk; 82 struct gendisk *disk;
83 struct kref kref; 83 struct device dev;
84 84
85 /* Buffer for table of contents. NULL if we haven't allocated 85 /* Buffer for table of contents. NULL if we haven't allocated
86 a TOC buffer for this device yet. */ 86 a TOC buffer for this device yet. */
diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c
index 4088a622873e..806760d24cef 100644
--- a/drivers/ide/ide-disk.c
+++ b/drivers/ide/ide-disk.c
@@ -633,7 +633,7 @@ static void ide_disk_setup(ide_drive_t *drive)
633 printk(KERN_INFO "%s: max request size: %dKiB\n", drive->name, 633 printk(KERN_INFO "%s: max request size: %dKiB\n", drive->name,
634 q->max_sectors / 2); 634 q->max_sectors / 2);
635 635
636 if (ata_id_is_ssd(id) || ata_id_is_cfa(id)) 636 if (ata_id_is_ssd(id))
637 queue_flag_set_unlocked(QUEUE_FLAG_NONROT, q); 637 queue_flag_set_unlocked(QUEUE_FLAG_NONROT, q);
638 638
639 /* calculate drive capacity, and select LBA if possible */ 639 /* calculate drive capacity, and select LBA if possible */
diff --git a/drivers/ide/ide-gd.c b/drivers/ide/ide-gd.c
index 7857b209c6df..047109419902 100644
--- a/drivers/ide/ide-gd.c
+++ b/drivers/ide/ide-gd.c
@@ -25,7 +25,7 @@ module_param(debug_mask, ulong, 0644);
25 25
26static DEFINE_MUTEX(ide_disk_ref_mutex); 26static DEFINE_MUTEX(ide_disk_ref_mutex);
27 27
28static void ide_disk_release(struct kref *); 28static void ide_disk_release(struct device *);
29 29
30static struct ide_disk_obj *ide_disk_get(struct gendisk *disk) 30static struct ide_disk_obj *ide_disk_get(struct gendisk *disk)
31{ 31{
@@ -37,7 +37,7 @@ static struct ide_disk_obj *ide_disk_get(struct gendisk *disk)
37 if (ide_device_get(idkp->drive)) 37 if (ide_device_get(idkp->drive))
38 idkp = NULL; 38 idkp = NULL;
39 else 39 else
40 kref_get(&idkp->kref); 40 get_device(&idkp->dev);
41 } 41 }
42 mutex_unlock(&ide_disk_ref_mutex); 42 mutex_unlock(&ide_disk_ref_mutex);
43 return idkp; 43 return idkp;
@@ -48,7 +48,7 @@ static void ide_disk_put(struct ide_disk_obj *idkp)
48 ide_drive_t *drive = idkp->drive; 48 ide_drive_t *drive = idkp->drive;
49 49
50 mutex_lock(&ide_disk_ref_mutex); 50 mutex_lock(&ide_disk_ref_mutex);
51 kref_put(&idkp->kref, ide_disk_release); 51 put_device(&idkp->dev);
52 ide_device_put(drive); 52 ide_device_put(drive);
53 mutex_unlock(&ide_disk_ref_mutex); 53 mutex_unlock(&ide_disk_ref_mutex);
54} 54}
@@ -66,17 +66,18 @@ static void ide_gd_remove(ide_drive_t *drive)
66 struct gendisk *g = idkp->disk; 66 struct gendisk *g = idkp->disk;
67 67
68 ide_proc_unregister_driver(drive, idkp->driver); 68 ide_proc_unregister_driver(drive, idkp->driver);
69 69 device_del(&idkp->dev);
70 del_gendisk(g); 70 del_gendisk(g);
71
72 drive->disk_ops->flush(drive); 71 drive->disk_ops->flush(drive);
73 72
74 ide_disk_put(idkp); 73 mutex_lock(&ide_disk_ref_mutex);
74 put_device(&idkp->dev);
75 mutex_unlock(&ide_disk_ref_mutex);
75} 76}
76 77
77static void ide_disk_release(struct kref *kref) 78static void ide_disk_release(struct device *dev)
78{ 79{
79 struct ide_disk_obj *idkp = to_ide_drv(kref, ide_disk_obj); 80 struct ide_disk_obj *idkp = to_ide_drv(dev, ide_disk_obj);
80 ide_drive_t *drive = idkp->drive; 81 ide_drive_t *drive = idkp->drive;
81 struct gendisk *g = idkp->disk; 82 struct gendisk *g = idkp->disk;
82 83
@@ -348,7 +349,12 @@ static int ide_gd_probe(ide_drive_t *drive)
348 349
349 ide_init_disk(g, drive); 350 ide_init_disk(g, drive);
350 351
351 kref_init(&idkp->kref); 352 idkp->dev.parent = &drive->gendev;
353 idkp->dev.release = ide_disk_release;
354 dev_set_name(&idkp->dev, dev_name(&drive->gendev));
355
356 if (device_register(&idkp->dev))
357 goto out_free_disk;
352 358
353 idkp->drive = drive; 359 idkp->drive = drive;
354 idkp->driver = &ide_gd_driver; 360 idkp->driver = &ide_gd_driver;
@@ -373,6 +379,8 @@ static int ide_gd_probe(ide_drive_t *drive)
373 add_disk(g); 379 add_disk(g);
374 return 0; 380 return 0;
375 381
382out_free_disk:
383 put_disk(g);
376out_free_idkp: 384out_free_idkp:
377 kfree(idkp); 385 kfree(idkp);
378failed: 386failed:
diff --git a/drivers/ide/ide-gd.h b/drivers/ide/ide-gd.h
index a86779f0756b..b604bdd318a1 100644
--- a/drivers/ide/ide-gd.h
+++ b/drivers/ide/ide-gd.h
@@ -17,7 +17,7 @@ struct ide_disk_obj {
17 ide_drive_t *drive; 17 ide_drive_t *drive;
18 struct ide_driver *driver; 18 struct ide_driver *driver;
19 struct gendisk *disk; 19 struct gendisk *disk;
20 struct kref kref; 20 struct device dev;
21 unsigned int openers; /* protected by BKL for now */ 21 unsigned int openers; /* protected by BKL for now */
22 22
23 /* Last failed packet command */ 23 /* Last failed packet command */
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c
index cc163319dfbd..9ee51adf567f 100644
--- a/drivers/ide/ide-io.c
+++ b/drivers/ide/ide-io.c
@@ -418,11 +418,14 @@ void ide_map_sg(ide_drive_t *drive, struct request *rq)
418 ide_hwif_t *hwif = drive->hwif; 418 ide_hwif_t *hwif = drive->hwif;
419 struct scatterlist *sg = hwif->sg_table; 419 struct scatterlist *sg = hwif->sg_table;
420 420
421 if (rq->cmd_type != REQ_TYPE_ATA_TASKFILE) { 421 if (rq->cmd_type == REQ_TYPE_ATA_TASKFILE) {
422 hwif->sg_nents = blk_rq_map_sg(drive->queue, rq, sg);
423 } else {
424 sg_init_one(sg, rq->buffer, rq->nr_sectors * SECTOR_SIZE); 422 sg_init_one(sg, rq->buffer, rq->nr_sectors * SECTOR_SIZE);
425 hwif->sg_nents = 1; 423 hwif->sg_nents = 1;
424 } else if (!rq->bio) {
425 sg_init_one(sg, rq->data, rq->data_len);
426 hwif->sg_nents = 1;
427 } else {
428 hwif->sg_nents = blk_rq_map_sg(drive->queue, rq, sg);
426 } 429 }
427} 430}
428 431
diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c
index e728cfe7273f..753b92ebe0ae 100644
--- a/drivers/ide/ide-iops.c
+++ b/drivers/ide/ide-iops.c
@@ -493,7 +493,7 @@ static int __ide_wait_stat(ide_drive_t *drive, u8 good, u8 bad, unsigned long ti
493 stat = tp_ops->read_status(hwif); 493 stat = tp_ops->read_status(hwif);
494 494
495 if (stat & ATA_BUSY) { 495 if (stat & ATA_BUSY) {
496 local_irq_save(flags); 496 local_save_flags(flags);
497 local_irq_enable_in_hardirq(); 497 local_irq_enable_in_hardirq();
498 timeout += jiffies; 498 timeout += jiffies;
499 while ((stat = tp_ops->read_status(hwif)) & ATA_BUSY) { 499 while ((stat = tp_ops->read_status(hwif)) & ATA_BUSY) {
diff --git a/drivers/ide/ide-pm.c b/drivers/ide/ide-pm.c
index 4b3bf6a06b70..60538d9c84ee 100644
--- a/drivers/ide/ide-pm.c
+++ b/drivers/ide/ide-pm.c
@@ -186,12 +186,10 @@ void ide_complete_pm_request(ide_drive_t *drive, struct request *rq)
186 blk_pm_suspend_request(rq) ? "suspend" : "resume"); 186 blk_pm_suspend_request(rq) ? "suspend" : "resume");
187#endif 187#endif
188 spin_lock_irqsave(q->queue_lock, flags); 188 spin_lock_irqsave(q->queue_lock, flags);
189 if (blk_pm_suspend_request(rq)) { 189 if (blk_pm_suspend_request(rq))
190 blk_stop_queue(q); 190 blk_stop_queue(q);
191 } else { 191 else
192 drive->dev_flags &= ~IDE_DFLAG_BLOCKED; 192 drive->dev_flags &= ~IDE_DFLAG_BLOCKED;
193 blk_start_queue(q);
194 }
195 spin_unlock_irqrestore(q->queue_lock, flags); 193 spin_unlock_irqrestore(q->queue_lock, flags);
196 194
197 drive->hwif->rq = NULL; 195 drive->hwif->rq = NULL;
@@ -219,6 +217,8 @@ void ide_check_pm_state(ide_drive_t *drive, struct request *rq)
219 * point. 217 * point.
220 */ 218 */
221 ide_hwif_t *hwif = drive->hwif; 219 ide_hwif_t *hwif = drive->hwif;
220 struct request_queue *q = drive->queue;
221 unsigned long flags;
222 int rc; 222 int rc;
223#ifdef DEBUG_PM 223#ifdef DEBUG_PM
224 printk("%s: Wakeup request inited, waiting for !BSY...\n", drive->name); 224 printk("%s: Wakeup request inited, waiting for !BSY...\n", drive->name);
@@ -231,5 +231,9 @@ void ide_check_pm_state(ide_drive_t *drive, struct request *rq)
231 rc = ide_wait_not_busy(hwif, 100000); 231 rc = ide_wait_not_busy(hwif, 100000);
232 if (rc) 232 if (rc)
233 printk(KERN_WARNING "%s: drive not ready on wakeup\n", drive->name); 233 printk(KERN_WARNING "%s: drive not ready on wakeup\n", drive->name);
234
235 spin_lock_irqsave(q->queue_lock, flags);
236 blk_start_queue(q);
237 spin_unlock_irqrestore(q->queue_lock, flags);
234 } 238 }
235} 239}
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c
index 0ccbb4459fb9..ce0818a993f6 100644
--- a/drivers/ide/ide-probe.c
+++ b/drivers/ide/ide-probe.c
@@ -649,7 +649,8 @@ static int ide_register_port(ide_hwif_t *hwif)
649 /* register with global device tree */ 649 /* register with global device tree */
650 dev_set_name(&hwif->gendev, hwif->name); 650 dev_set_name(&hwif->gendev, hwif->name);
651 hwif->gendev.driver_data = hwif; 651 hwif->gendev.driver_data = hwif;
652 hwif->gendev.parent = hwif->dev; 652 if (hwif->gendev.parent == NULL)
653 hwif->gendev.parent = hwif->dev;
653 hwif->gendev.release = hwif_release_dev; 654 hwif->gendev.release = hwif_release_dev;
654 655
655 ret = device_register(&hwif->gendev); 656 ret = device_register(&hwif->gendev);
@@ -796,7 +797,7 @@ static int ide_probe_port(ide_hwif_t *hwif)
796 if (irqd) 797 if (irqd)
797 disable_irq(hwif->irq); 798 disable_irq(hwif->irq);
798 799
799 local_irq_save(flags); 800 local_save_flags(flags);
800 local_irq_enable_in_hardirq(); 801 local_irq_enable_in_hardirq();
801 802
802 if (ide_port_wait_ready(hwif) == -EBUSY) 803 if (ide_port_wait_ready(hwif) == -EBUSY)
@@ -1466,6 +1467,30 @@ struct ide_host *ide_host_alloc(const struct ide_port_info *d, hw_regs_t **hws)
1466} 1467}
1467EXPORT_SYMBOL_GPL(ide_host_alloc); 1468EXPORT_SYMBOL_GPL(ide_host_alloc);
1468 1469
1470static void ide_port_free(ide_hwif_t *hwif)
1471{
1472 ide_port_free_devices(hwif);
1473 ide_free_port_slot(hwif->index);
1474 kfree(hwif);
1475}
1476
1477static void ide_disable_port(ide_hwif_t *hwif)
1478{
1479 struct ide_host *host = hwif->host;
1480 int i;
1481
1482 printk(KERN_INFO "%s: disabling port\n", hwif->name);
1483
1484 for (i = 0; i < MAX_HOST_PORTS; i++) {
1485 if (host->ports[i] == hwif) {
1486 host->ports[i] = NULL;
1487 host->n_ports--;
1488 }
1489 }
1490
1491 ide_port_free(hwif);
1492}
1493
1469int ide_host_register(struct ide_host *host, const struct ide_port_info *d, 1494int ide_host_register(struct ide_host *host, const struct ide_port_info *d,
1470 hw_regs_t **hws) 1495 hw_regs_t **hws)
1471{ 1496{
@@ -1506,8 +1531,12 @@ int ide_host_register(struct ide_host *host, const struct ide_port_info *d,
1506 hwif->present = 1; 1531 hwif->present = 1;
1507 1532
1508 if (hwif->chipset != ide_4drives || !hwif->mate || 1533 if (hwif->chipset != ide_4drives || !hwif->mate ||
1509 !hwif->mate->present) 1534 !hwif->mate->present) {
1510 ide_register_port(hwif); 1535 if (ide_register_port(hwif)) {
1536 ide_disable_port(hwif);
1537 continue;
1538 }
1539 }
1511 1540
1512 if (hwif->present) 1541 if (hwif->present)
1513 ide_port_tune_devices(hwif); 1542 ide_port_tune_devices(hwif);
@@ -1520,7 +1549,8 @@ int ide_host_register(struct ide_host *host, const struct ide_port_info *d,
1520 if (hwif_init(hwif) == 0) { 1549 if (hwif_init(hwif) == 0) {
1521 printk(KERN_INFO "%s: failed to initialize IDE " 1550 printk(KERN_INFO "%s: failed to initialize IDE "
1522 "interface\n", hwif->name); 1551 "interface\n", hwif->name);
1523 hwif->present = 0; 1552 device_unregister(&hwif->gendev);
1553 ide_disable_port(hwif);
1524 continue; 1554 continue;
1525 } 1555 }
1526 1556
@@ -1659,12 +1689,8 @@ void ide_host_free(struct ide_host *host)
1659 int i; 1689 int i;
1660 1690
1661 ide_host_for_each_port(i, hwif, host) { 1691 ide_host_for_each_port(i, hwif, host) {
1662 if (hwif == NULL) 1692 if (hwif)
1663 continue; 1693 ide_port_free(hwif);
1664
1665 ide_port_free_devices(hwif);
1666 ide_free_port_slot(hwif->index);
1667 kfree(hwif);
1668 } 1694 }
1669 1695
1670 kfree(host); 1696 kfree(host);
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c
index d7ecd3c79757..bb450a7608c2 100644
--- a/drivers/ide/ide-tape.c
+++ b/drivers/ide/ide-tape.c
@@ -169,7 +169,7 @@ typedef struct ide_tape_obj {
169 ide_drive_t *drive; 169 ide_drive_t *drive;
170 struct ide_driver *driver; 170 struct ide_driver *driver;
171 struct gendisk *disk; 171 struct gendisk *disk;
172 struct kref kref; 172 struct device dev;
173 173
174 /* 174 /*
175 * failed_pc points to the last failed packet command, or contains 175 * failed_pc points to the last failed packet command, or contains
@@ -267,7 +267,7 @@ static DEFINE_MUTEX(idetape_ref_mutex);
267 267
268static struct class *idetape_sysfs_class; 268static struct class *idetape_sysfs_class;
269 269
270static void ide_tape_release(struct kref *); 270static void ide_tape_release(struct device *);
271 271
272static struct ide_tape_obj *ide_tape_get(struct gendisk *disk) 272static struct ide_tape_obj *ide_tape_get(struct gendisk *disk)
273{ 273{
@@ -279,7 +279,7 @@ static struct ide_tape_obj *ide_tape_get(struct gendisk *disk)
279 if (ide_device_get(tape->drive)) 279 if (ide_device_get(tape->drive))
280 tape = NULL; 280 tape = NULL;
281 else 281 else
282 kref_get(&tape->kref); 282 get_device(&tape->dev);
283 } 283 }
284 mutex_unlock(&idetape_ref_mutex); 284 mutex_unlock(&idetape_ref_mutex);
285 return tape; 285 return tape;
@@ -290,7 +290,7 @@ static void ide_tape_put(struct ide_tape_obj *tape)
290 ide_drive_t *drive = tape->drive; 290 ide_drive_t *drive = tape->drive;
291 291
292 mutex_lock(&idetape_ref_mutex); 292 mutex_lock(&idetape_ref_mutex);
293 kref_put(&tape->kref, ide_tape_release); 293 put_device(&tape->dev);
294 ide_device_put(drive); 294 ide_device_put(drive);
295 mutex_unlock(&idetape_ref_mutex); 295 mutex_unlock(&idetape_ref_mutex);
296} 296}
@@ -308,7 +308,7 @@ static struct ide_tape_obj *ide_tape_chrdev_get(unsigned int i)
308 mutex_lock(&idetape_ref_mutex); 308 mutex_lock(&idetape_ref_mutex);
309 tape = idetape_devs[i]; 309 tape = idetape_devs[i];
310 if (tape) 310 if (tape)
311 kref_get(&tape->kref); 311 get_device(&tape->dev);
312 mutex_unlock(&idetape_ref_mutex); 312 mutex_unlock(&idetape_ref_mutex);
313 return tape; 313 return tape;
314} 314}
@@ -2256,15 +2256,17 @@ static void ide_tape_remove(ide_drive_t *drive)
2256 idetape_tape_t *tape = drive->driver_data; 2256 idetape_tape_t *tape = drive->driver_data;
2257 2257
2258 ide_proc_unregister_driver(drive, tape->driver); 2258 ide_proc_unregister_driver(drive, tape->driver);
2259 2259 device_del(&tape->dev);
2260 ide_unregister_region(tape->disk); 2260 ide_unregister_region(tape->disk);
2261 2261
2262 ide_tape_put(tape); 2262 mutex_lock(&idetape_ref_mutex);
2263 put_device(&tape->dev);
2264 mutex_unlock(&idetape_ref_mutex);
2263} 2265}
2264 2266
2265static void ide_tape_release(struct kref *kref) 2267static void ide_tape_release(struct device *dev)
2266{ 2268{
2267 struct ide_tape_obj *tape = to_ide_drv(kref, ide_tape_obj); 2269 struct ide_tape_obj *tape = to_ide_drv(dev, ide_tape_obj);
2268 ide_drive_t *drive = tape->drive; 2270 ide_drive_t *drive = tape->drive;
2269 struct gendisk *g = tape->disk; 2271 struct gendisk *g = tape->disk;
2270 2272
@@ -2407,7 +2409,12 @@ static int ide_tape_probe(ide_drive_t *drive)
2407 2409
2408 ide_init_disk(g, drive); 2410 ide_init_disk(g, drive);
2409 2411
2410 kref_init(&tape->kref); 2412 tape->dev.parent = &drive->gendev;
2413 tape->dev.release = ide_tape_release;
2414 dev_set_name(&tape->dev, dev_name(&drive->gendev));
2415
2416 if (device_register(&tape->dev))
2417 goto out_free_disk;
2411 2418
2412 tape->drive = drive; 2419 tape->drive = drive;
2413 tape->driver = &idetape_driver; 2420 tape->driver = &idetape_driver;
@@ -2436,6 +2443,8 @@ static int ide_tape_probe(ide_drive_t *drive)
2436 2443
2437 return 0; 2444 return 0;
2438 2445
2446out_free_disk:
2447 put_disk(g);
2439out_free_tape: 2448out_free_tape:
2440 kfree(tape); 2449 kfree(tape);
2441failed: 2450failed:
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c
index 258805da15c3..0920e3b0c962 100644
--- a/drivers/ide/ide.c
+++ b/drivers/ide/ide.c
@@ -337,6 +337,7 @@ static int ide_set_dev_param_mask(const char *s, struct kernel_param *kp)
337 int a, b, i, j = 1; 337 int a, b, i, j = 1;
338 unsigned int *dev_param_mask = (unsigned int *)kp->arg; 338 unsigned int *dev_param_mask = (unsigned int *)kp->arg;
339 339
340 /* controller . device (0 or 1) [ : 1 (set) | 0 (clear) ] */
340 if (sscanf(s, "%d.%d:%d", &a, &b, &j) != 3 && 341 if (sscanf(s, "%d.%d:%d", &a, &b, &j) != 3 &&
341 sscanf(s, "%d.%d", &a, &b) != 2) 342 sscanf(s, "%d.%d", &a, &b) != 2)
342 return -EINVAL; 343 return -EINVAL;
@@ -349,7 +350,7 @@ static int ide_set_dev_param_mask(const char *s, struct kernel_param *kp)
349 if (j) 350 if (j)
350 *dev_param_mask |= (1 << i); 351 *dev_param_mask |= (1 << i);
351 else 352 else
352 *dev_param_mask &= (1 << i); 353 *dev_param_mask &= ~(1 << i);
353 354
354 return 0; 355 return 0;
355} 356}
@@ -392,6 +393,8 @@ static int ide_set_disk_chs(const char *str, struct kernel_param *kp)
392{ 393{
393 int a, b, c = 0, h = 0, s = 0, i, j = 1; 394 int a, b, c = 0, h = 0, s = 0, i, j = 1;
394 395
396 /* controller . device (0 or 1) : Cylinders , Heads , Sectors */
397 /* controller . device (0 or 1) : 1 (use CHS) | 0 (ignore CHS) */
395 if (sscanf(str, "%d.%d:%d,%d,%d", &a, &b, &c, &h, &s) != 5 && 398 if (sscanf(str, "%d.%d:%d,%d,%d", &a, &b, &c, &h, &s) != 5 &&
396 sscanf(str, "%d.%d:%d", &a, &b, &j) != 3) 399 sscanf(str, "%d.%d:%d", &a, &b, &j) != 3)
397 return -EINVAL; 400 return -EINVAL;
@@ -407,7 +410,7 @@ static int ide_set_disk_chs(const char *str, struct kernel_param *kp)
407 if (j) 410 if (j)
408 ide_disks |= (1 << i); 411 ide_disks |= (1 << i);
409 else 412 else
410 ide_disks &= (1 << i); 413 ide_disks &= ~(1 << i);
411 414
412 ide_disks_chs[i].cyl = c; 415 ide_disks_chs[i].cyl = c;
413 ide_disks_chs[i].head = h; 416 ide_disks_chs[i].head = h;
@@ -469,6 +472,8 @@ static int ide_set_ignore_cable(const char *s, struct kernel_param *kp)
469{ 472{
470 int i, j = 1; 473 int i, j = 1;
471 474
475 /* controller (ignore) */
476 /* controller : 1 (ignore) | 0 (use) */
472 if (sscanf(s, "%d:%d", &i, &j) != 2 && sscanf(s, "%d", &i) != 1) 477 if (sscanf(s, "%d:%d", &i, &j) != 2 && sscanf(s, "%d", &i) != 1)
473 return -EINVAL; 478 return -EINVAL;
474 479
@@ -478,7 +483,7 @@ static int ide_set_ignore_cable(const char *s, struct kernel_param *kp)
478 if (j) 483 if (j)
479 ide_ignore_cable |= (1 << i); 484 ide_ignore_cable |= (1 << i);
480 else 485 else
481 ide_ignore_cable &= (1 << i); 486 ide_ignore_cable &= ~(1 << i);
482 487
483 return 0; 488 return 0;
484} 489}
diff --git a/drivers/ide/it821x.c b/drivers/ide/it821x.c
index 0be27ac1f077..13b8153112ed 100644
--- a/drivers/ide/it821x.c
+++ b/drivers/ide/it821x.c
@@ -5,9 +5,8 @@
5 * May be copied or modified under the terms of the GNU General Public License 5 * May be copied or modified under the terms of the GNU General Public License
6 * Based in part on the ITE vendor provided SCSI driver. 6 * Based in part on the ITE vendor provided SCSI driver.
7 * 7 *
8 * Documentation available from 8 * Documentation:
9 * http://www.ite.com.tw/pc/IT8212F_V04.pdf 9 * Datasheet is freely available, some other documents under NDA.
10 * Some other documents are NDA.
11 * 10 *
12 * The ITE8212 isn't exactly a standard IDE controller. It has two 11 * The ITE8212 isn't exactly a standard IDE controller. It has two
13 * modes. In pass through mode then it is an IDE controller. In its smart 12 * modes. In pass through mode then it is an IDE controller. In its smart
@@ -68,6 +67,8 @@
68 67
69#define DRV_NAME "it821x" 68#define DRV_NAME "it821x"
70 69
70#define QUIRK_VORTEX86 1
71
71struct it821x_dev 72struct it821x_dev
72{ 73{
73 unsigned int smart:1, /* Are we in smart raid mode */ 74 unsigned int smart:1, /* Are we in smart raid mode */
@@ -79,6 +80,7 @@ struct it821x_dev
79 u16 pio[2]; /* Cached PIO values */ 80 u16 pio[2]; /* Cached PIO values */
80 u16 mwdma[2]; /* Cached MWDMA values */ 81 u16 mwdma[2]; /* Cached MWDMA values */
81 u16 udma[2]; /* Cached UDMA values (per drive) */ 82 u16 udma[2]; /* Cached UDMA values (per drive) */
83 u16 quirks;
82}; 84};
83 85
84#define ATA_66 0 86#define ATA_66 0
@@ -557,8 +559,7 @@ static void __devinit init_hwif_it821x(ide_hwif_t *hwif)
557 * this is necessary. 559 * this is necessary.
558 */ 560 */
559 561
560 pci_read_config_byte(dev, 0x08, &conf); 562 if (dev->revision == 0x10) {
561 if (conf == 0x10) {
562 idev->timing10 = 1; 563 idev->timing10 = 1;
563 hwif->host_flags |= IDE_HFLAG_NO_ATAPI_DMA; 564 hwif->host_flags |= IDE_HFLAG_NO_ATAPI_DMA;
564 if (idev->smart == 0) 565 if (idev->smart == 0)
@@ -577,6 +578,12 @@ static void __devinit init_hwif_it821x(ide_hwif_t *hwif)
577 578
578 hwif->ultra_mask = ATA_UDMA6; 579 hwif->ultra_mask = ATA_UDMA6;
579 hwif->mwdma_mask = ATA_MWDMA2; 580 hwif->mwdma_mask = ATA_MWDMA2;
581
582 /* Vortex86SX quirk: prevent Ultra-DMA mode to fix BadCRC issue */
583 if (idev->quirks & QUIRK_VORTEX86) {
584 if (dev->revision == 0x11)
585 hwif->ultra_mask = 0;
586 }
580} 587}
581 588
582static void it8212_disable_raid(struct pci_dev *dev) 589static void it8212_disable_raid(struct pci_dev *dev)
@@ -649,6 +656,8 @@ static int __devinit it821x_init_one(struct pci_dev *dev, const struct pci_devic
649 return -ENOMEM; 656 return -ENOMEM;
650 } 657 }
651 658
659 itdevs->quirks = id->driver_data;
660
652 rc = ide_pci_init_one(dev, &it821x_chipset, itdevs); 661 rc = ide_pci_init_one(dev, &it821x_chipset, itdevs);
653 if (rc) 662 if (rc)
654 kfree(itdevs); 663 kfree(itdevs);
@@ -668,6 +677,7 @@ static void __devexit it821x_remove(struct pci_dev *dev)
668static const struct pci_device_id it821x_pci_tbl[] = { 677static const struct pci_device_id it821x_pci_tbl[] = {
669 { PCI_VDEVICE(ITE, PCI_DEVICE_ID_ITE_8211), 0 }, 678 { PCI_VDEVICE(ITE, PCI_DEVICE_ID_ITE_8211), 0 },
670 { PCI_VDEVICE(ITE, PCI_DEVICE_ID_ITE_8212), 0 }, 679 { PCI_VDEVICE(ITE, PCI_DEVICE_ID_ITE_8212), 0 },
680 { PCI_VDEVICE(RDC, PCI_DEVICE_ID_RDC_D1010), QUIRK_VORTEX86 },
671 { 0, }, 681 { 0, },
672}; 682};
673 683
diff --git a/drivers/ide/palm_bk3710.c b/drivers/ide/palm_bk3710.c
index a7ac490c9ae3..f38aac78044c 100644
--- a/drivers/ide/palm_bk3710.c
+++ b/drivers/ide/palm_bk3710.c
@@ -346,7 +346,8 @@ static int __init palm_bk3710_probe(struct platform_device *pdev)
346{ 346{
347 struct clk *clk; 347 struct clk *clk;
348 struct resource *mem, *irq; 348 struct resource *mem, *irq;
349 unsigned long base, rate; 349 void __iomem *base;
350 unsigned long rate;
350 int i, rc; 351 int i, rc;
351 hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL }; 352 hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL };
352 353
@@ -382,11 +383,13 @@ static int __init palm_bk3710_probe(struct platform_device *pdev)
382 base = IO_ADDRESS(mem->start); 383 base = IO_ADDRESS(mem->start);
383 384
384 /* Configure the Palm Chip controller */ 385 /* Configure the Palm Chip controller */
385 palm_bk3710_chipinit((void __iomem *)base); 386 palm_bk3710_chipinit(base);
386 387
387 for (i = 0; i < IDE_NR_PORTS - 2; i++) 388 for (i = 0; i < IDE_NR_PORTS - 2; i++)
388 hw.io_ports_array[i] = base + IDE_PALM_ATA_PRI_REG_OFFSET + i; 389 hw.io_ports_array[i] = (unsigned long)
389 hw.io_ports.ctl_addr = base + IDE_PALM_ATA_PRI_CTL_OFFSET; 390 (base + IDE_PALM_ATA_PRI_REG_OFFSET + i);
391 hw.io_ports.ctl_addr = (unsigned long)
392 (base + IDE_PALM_ATA_PRI_CTL_OFFSET);
390 hw.irq = irq->start; 393 hw.irq = irq->start;
391 hw.dev = &pdev->dev; 394 hw.dev = &pdev->dev;
392 hw.chipset = ide_palm3710; 395 hw.chipset = ide_palm3710;
diff --git a/drivers/ide/qd65xx.c b/drivers/ide/qd65xx.c
index 5b2e3af43c4b..08c4fa35e9b1 100644
--- a/drivers/ide/qd65xx.c
+++ b/drivers/ide/qd65xx.c
@@ -16,7 +16,7 @@
16 16
17/* 17/*
18 * Rewritten from the work of Colten Edwards <pje120@cs.usask.ca> by 18 * Rewritten from the work of Colten Edwards <pje120@cs.usask.ca> by
19 * Samuel Thibault <samuel.thibault@fnac.net> 19 * Samuel Thibault <samuel.thibault@ens-lyon.org>
20 */ 20 */
21 21
22#include <linux/module.h> 22#include <linux/module.h>
diff --git a/drivers/ide/qd65xx.h b/drivers/ide/qd65xx.h
index 6636f9665d16..d7e67a1a1dcc 100644
--- a/drivers/ide/qd65xx.h
+++ b/drivers/ide/qd65xx.h
@@ -4,7 +4,7 @@
4 4
5/* 5/*
6 * Authors: Petr Soucek <petr@ryston.cz> 6 * Authors: Petr Soucek <petr@ryston.cz>
7 * Samuel Thibault <samuel.thibault@fnac.net> 7 * Samuel Thibault <samuel.thibault@ens-lyon.org>
8 */ 8 */
9 9
10/* truncates a in [b,c] */ 10/* truncates a in [b,c] */
diff --git a/drivers/ide/sl82c105.c b/drivers/ide/sl82c105.c
index 48cc748c5043..6297956507c0 100644
--- a/drivers/ide/sl82c105.c
+++ b/drivers/ide/sl82c105.c
@@ -310,10 +310,6 @@ static const struct ide_port_info sl82c105_chipset __devinitdata = {
310 .dma_ops = &sl82c105_dma_ops, 310 .dma_ops = &sl82c105_dma_ops,
311 .host_flags = IDE_HFLAG_IO_32BIT | 311 .host_flags = IDE_HFLAG_IO_32BIT |
312 IDE_HFLAG_UNMASK_IRQS | 312 IDE_HFLAG_UNMASK_IRQS |
313/* FIXME: check for Compatibility mode in generic IDE PCI code */
314#if defined(CONFIG_LOPEC) || defined(CONFIG_SANDPOINT)
315 IDE_HFLAG_FORCE_LEGACY_IRQS |
316#endif
317 IDE_HFLAG_SERIALIZE_DMA | 313 IDE_HFLAG_SERIALIZE_DMA |
318 IDE_HFLAG_NO_AUTODMA, 314 IDE_HFLAG_NO_AUTODMA,
319 .pio_mask = ATA_PIO5, 315 .pio_mask = ATA_PIO5,
diff --git a/drivers/ide/tx4938ide.c b/drivers/ide/tx4938ide.c
index b4ef218072cd..d9095345f7ca 100644
--- a/drivers/ide/tx4938ide.c
+++ b/drivers/ide/tx4938ide.c
@@ -202,7 +202,6 @@ static const struct ide_tp_ops tx4938ide_tp_ops = {
202 .exec_command = ide_exec_command, 202 .exec_command = ide_exec_command,
203 .read_status = ide_read_status, 203 .read_status = ide_read_status,
204 .read_altstatus = ide_read_altstatus, 204 .read_altstatus = ide_read_altstatus,
205 .read_sff_dma_status = ide_read_sff_dma_status,
206 205
207 .set_irq = ide_set_irq, 206 .set_irq = ide_set_irq,
208 207
diff --git a/drivers/ide/tx4939ide.c b/drivers/ide/tx4939ide.c
index 882f6f07c476..40b0812a045c 100644
--- a/drivers/ide/tx4939ide.c
+++ b/drivers/ide/tx4939ide.c
@@ -261,9 +261,9 @@ static int tx4939ide_build_dmatable(ide_drive_t *drive, struct request *rq)
261 bcount = cur_len; 261 bcount = cur_len;
262 /* 262 /*
263 * This workaround for zero count seems required. 263 * This workaround for zero count seems required.
264 * (standard ide_build_dmatable do it too) 264 * (standard ide_build_dmatable does it too)
265 */ 265 */
266 if ((bcount & 0xffff) == 0x0000) 266 if (bcount == 0x10000)
267 bcount = 0x8000; 267 bcount = 0x8000;
268 *table++ = bcount & 0xffff; 268 *table++ = bcount & 0xffff;
269 *table++ = cur_addr; 269 *table++ = cur_addr;
diff --git a/drivers/ide/via82cxxx.c b/drivers/ide/via82cxxx.c
index fecc0e03c3fc..6092fe3f409d 100644
--- a/drivers/ide/via82cxxx.c
+++ b/drivers/ide/via82cxxx.c
@@ -432,8 +432,6 @@ static int __devinit via_init_one(struct pci_dev *dev, const struct pci_device_i
432 if (via_clock < 20000 || via_clock > 50000) { 432 if (via_clock < 20000 || via_clock > 50000) {
433 printk(KERN_WARNING DRV_NAME ": User given PCI clock speed " 433 printk(KERN_WARNING DRV_NAME ": User given PCI clock speed "
434 "impossible (%d), using 33 MHz instead.\n", via_clock); 434 "impossible (%d), using 33 MHz instead.\n", via_clock);
435 printk(KERN_WARNING DRV_NAME ": Use ide0=ata66 if you want "
436 "to assume 80-wire cable.\n");
437 via_clock = 33333; 435 via_clock = 33333;
438 } 436 }
439 437
@@ -450,6 +448,11 @@ static int __devinit via_init_one(struct pci_dev *dev, const struct pci_device_i
450 d.host_flags |= IDE_HFLAG_FORCE_LEGACY_IRQS; 448 d.host_flags |= IDE_HFLAG_FORCE_LEGACY_IRQS;
451#endif 449#endif
452 450
451#ifdef CONFIG_AMIGAONE
452 if (machine_is(amigaone))
453 d.host_flags |= IDE_HFLAG_FORCE_LEGACY_IRQS;
454#endif
455
453 d.udma_mask = via_config->udma_mask; 456 d.udma_mask = via_config->udma_mask;
454 457
455 vdev = kzalloc(sizeof(*vdev), GFP_KERNEL); 458 vdev = kzalloc(sizeof(*vdev), GFP_KERNEL);