aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/legacy/qd65xx.c
diff options
context:
space:
mode:
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2007-10-19 18:32:35 -0400
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2007-10-19 18:32:35 -0400
commitf949820de30b6fd0eb958f7eea87dac190de1cec (patch)
tree0b1b0daca8efc572354a44bf202215ba830bc7dc /drivers/ide/legacy/qd65xx.c
parenta34a8751f312bd4674d48d63556efa8f0e3a1021 (diff)
qd65xx: fix deadlock on error handling
Stop abusing ide_lock lock (switch to a private locking). Fixes same issue as fixed by Alan Cox in atiixp host driver with commit 6c5f8cc33eb2e10b6ab788bbe259fc142a068627. Cc: Sergei Shtylyov <sshtylyov@ru.mvista.com> Cc: Jeff Garzik <jeff@garzik.org> Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide/legacy/qd65xx.c')
-rw-r--r--drivers/ide/legacy/qd65xx.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/drivers/ide/legacy/qd65xx.c b/drivers/ide/legacy/qd65xx.c
index 85104bc79a1d..ffd9c0556d12 100644
--- a/drivers/ide/legacy/qd65xx.c
+++ b/drivers/ide/legacy/qd65xx.c
@@ -89,13 +89,15 @@
89 89
90static int timings[4]={-1,-1,-1,-1}; /* stores current timing for each timer */ 90static int timings[4]={-1,-1,-1,-1}; /* stores current timing for each timer */
91 91
92static DEFINE_SPINLOCK(qd65xx_lock);
93
92static void qd_write_reg (u8 content, unsigned long reg) 94static void qd_write_reg (u8 content, unsigned long reg)
93{ 95{
94 unsigned long flags; 96 unsigned long flags;
95 97
96 spin_lock_irqsave(&ide_lock, flags); 98 spin_lock_irqsave(&qd65xx_lock, flags);
97 outb(content,reg); 99 outb(content,reg);
98 spin_unlock_irqrestore(&ide_lock, flags); 100 spin_unlock_irqrestore(&qd65xx_lock, flags);
99} 101}
100 102
101static u8 __init qd_read_reg (unsigned long reg) 103static u8 __init qd_read_reg (unsigned long reg)
@@ -103,9 +105,9 @@ static u8 __init qd_read_reg (unsigned long reg)
103 unsigned long flags; 105 unsigned long flags;
104 u8 read; 106 u8 read;
105 107
106 spin_lock_irqsave(&ide_lock, flags); 108 spin_lock_irqsave(&qd65xx_lock, flags);
107 read = inb(reg); 109 read = inb(reg);
108 spin_unlock_irqrestore(&ide_lock, flags); 110 spin_unlock_irqrestore(&qd65xx_lock, flags);
109 return read; 111 return read;
110} 112}
111 113
@@ -301,16 +303,15 @@ static void qd6580_set_pio_mode(ide_drive_t *drive, const u8 pio)
301 303
302static int __init qd_testreg(int port) 304static int __init qd_testreg(int port)
303{ 305{
304 u8 savereg;
305 u8 readreg;
306 unsigned long flags; 306 unsigned long flags;
307 u8 savereg, readreg;
307 308
308 spin_lock_irqsave(&ide_lock, flags); 309 spin_lock_irqsave(&qd65xx_lock, flags);
309 savereg = inb_p(port); 310 savereg = inb_p(port);
310 outb_p(QD_TESTVAL, port); /* safe value */ 311 outb_p(QD_TESTVAL, port); /* safe value */
311 readreg = inb_p(port); 312 readreg = inb_p(port);
312 outb(savereg, port); 313 outb(savereg, port);
313 spin_unlock_irqrestore(&ide_lock, flags); 314 spin_unlock_irqrestore(&qd65xx_lock, flags);
314 315
315 if (savereg == QD_TESTVAL) { 316 if (savereg == QD_TESTVAL) {
316 printk(KERN_ERR "Outch ! the probe for qd65xx isn't reliable !\n"); 317 printk(KERN_ERR "Outch ! the probe for qd65xx isn't reliable !\n");