aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/ide.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ide/ide.c')
-rw-r--r--drivers/ide/ide.c76
1 files changed, 19 insertions, 57 deletions
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c
index 2b8453510e09..d4a6b102a772 100644
--- a/drivers/ide/ide.c
+++ b/drivers/ide/ide.c
@@ -50,29 +50,16 @@
50#include <linux/types.h> 50#include <linux/types.h>
51#include <linux/string.h> 51#include <linux/string.h>
52#include <linux/kernel.h> 52#include <linux/kernel.h>
53#include <linux/timer.h>
54#include <linux/mm.h>
55#include <linux/interrupt.h> 53#include <linux/interrupt.h>
56#include <linux/major.h> 54#include <linux/major.h>
57#include <linux/errno.h> 55#include <linux/errno.h>
58#include <linux/genhd.h> 56#include <linux/genhd.h>
59#include <linux/blkpg.h>
60#include <linux/slab.h> 57#include <linux/slab.h>
61#include <linux/init.h> 58#include <linux/init.h>
62#include <linux/pci.h> 59#include <linux/pci.h>
63#include <linux/delay.h>
64#include <linux/ide.h> 60#include <linux/ide.h>
65#include <linux/completion.h> 61#include <linux/completion.h>
66#include <linux/reboot.h>
67#include <linux/cdrom.h>
68#include <linux/seq_file.h>
69#include <linux/device.h> 62#include <linux/device.h>
70#include <linux/bitops.h>
71
72#include <asm/byteorder.h>
73#include <asm/irq.h>
74#include <asm/uaccess.h>
75#include <asm/io.h>
76 63
77 64
78/* default maximum number of failures */ 65/* default maximum number of failures */
@@ -91,8 +78,6 @@ DEFINE_MUTEX(ide_cfg_mtx);
91__cacheline_aligned_in_smp DEFINE_SPINLOCK(ide_lock); 78__cacheline_aligned_in_smp DEFINE_SPINLOCK(ide_lock);
92EXPORT_SYMBOL(ide_lock); 79EXPORT_SYMBOL(ide_lock);
93 80
94ide_hwif_t ide_hwifs[MAX_HWIFS]; /* master data repository */
95
96static void ide_port_init_devices_data(ide_hwif_t *); 81static void ide_port_init_devices_data(ide_hwif_t *);
97 82
98/* 83/*
@@ -121,7 +106,6 @@ void ide_init_port_data(ide_hwif_t *hwif, unsigned int index)
121 106
122 ide_port_init_devices_data(hwif); 107 ide_port_init_devices_data(hwif);
123} 108}
124EXPORT_SYMBOL_GPL(ide_init_port_data);
125 109
126static void ide_port_init_devices_data(ide_hwif_t *hwif) 110static void ide_port_init_devices_data(ide_hwif_t *hwif)
127{ 111{
@@ -150,18 +134,6 @@ static void ide_port_init_devices_data(ide_hwif_t *hwif)
150 } 134 }
151} 135}
152 136
153static void __init init_ide_data (void)
154{
155 unsigned int index;
156
157 /* Initialise all interface structures */
158 for (index = 0; index < MAX_HWIFS; ++index) {
159 ide_hwif_t *hwif = &ide_hwifs[index];
160
161 ide_init_port_data(hwif, index);
162 }
163}
164
165void ide_remove_port_from_hwgroup(ide_hwif_t *hwif) 137void ide_remove_port_from_hwgroup(ide_hwif_t *hwif)
166{ 138{
167 ide_hwgroup_t *hwgroup = hwif->hwgroup; 139 ide_hwgroup_t *hwgroup = hwif->hwgroup;
@@ -312,7 +284,8 @@ void ide_init_port_hw(ide_hwif_t *hwif, hw_regs_t *hw)
312 memcpy(&hwif->io_ports, &hw->io_ports, sizeof(hwif->io_ports)); 284 memcpy(&hwif->io_ports, &hw->io_ports, sizeof(hwif->io_ports));
313 hwif->irq = hw->irq; 285 hwif->irq = hw->irq;
314 hwif->chipset = hw->chipset; 286 hwif->chipset = hw->chipset;
315 hwif->gendev.parent = hw->dev; 287 hwif->dev = hw->dev;
288 hwif->gendev.parent = hw->parent ? hw->parent : hw->dev;
316 hwif->ack_intr = hw->ack_intr; 289 hwif->ack_intr = hw->ack_intr;
317} 290}
318EXPORT_SYMBOL_GPL(ide_init_port_hw); 291EXPORT_SYMBOL_GPL(ide_init_port_hw);
@@ -556,6 +529,22 @@ static int generic_ide_resume(struct device *dev)
556 return err; 529 return err;
557} 530}
558 531
532static int generic_drive_reset(ide_drive_t *drive)
533{
534 struct request *rq;
535 int ret = 0;
536
537 rq = blk_get_request(drive->queue, READ, __GFP_WAIT);
538 rq->cmd_type = REQ_TYPE_SPECIAL;
539 rq->cmd_len = 1;
540 rq->cmd[0] = REQ_DRIVE_RESET;
541 rq->cmd_flags |= REQ_SOFTBARRIER;
542 if (blk_execute_rq(drive->queue, NULL, rq, 1))
543 ret = rq->errors;
544 blk_put_request(rq);
545 return ret;
546}
547
559int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device *bdev, 548int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device *bdev,
560 unsigned int cmd, unsigned long arg) 549 unsigned int cmd, unsigned long arg)
561{ 550{
@@ -630,33 +619,8 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device
630 if (!capable(CAP_SYS_ADMIN)) 619 if (!capable(CAP_SYS_ADMIN))
631 return -EACCES; 620 return -EACCES;
632 621
633 /* 622 return generic_drive_reset(drive);
634 * Abort the current command on the
635 * group if there is one, taking
636 * care not to allow anything else
637 * to be queued and to die on the
638 * spot if we miss one somehow
639 */
640
641 spin_lock_irqsave(&ide_lock, flags);
642
643 if (HWGROUP(drive)->resetting) {
644 spin_unlock_irqrestore(&ide_lock, flags);
645 return -EBUSY;
646 }
647 623
648 ide_abort(drive, "drive reset");
649
650 BUG_ON(HWGROUP(drive)->handler);
651
652 /* Ensure nothing gets queued after we
653 drop the lock. Reset will clear the busy */
654
655 HWGROUP(drive)->busy = 1;
656 spin_unlock_irqrestore(&ide_lock, flags);
657 (void) ide_do_reset(drive);
658
659 return 0;
660 case HDIO_GET_BUSSTATE: 624 case HDIO_GET_BUSSTATE:
661 if (!capable(CAP_SYS_ADMIN)) 625 if (!capable(CAP_SYS_ADMIN))
662 return -EACCES; 626 return -EACCES;
@@ -1021,8 +985,6 @@ static int __init ide_init(void)
1021 goto out_port_class; 985 goto out_port_class;
1022 } 986 }
1023 987
1024 init_ide_data();
1025
1026 proc_ide_create(); 988 proc_ide_create();
1027 989
1028 return 0; 990 return 0;