Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f949820d authored by Bartlomiej Zolnierkiewicz's avatar Bartlomiej Zolnierkiewicz
Browse files

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 6c5f8cc3.

Cc: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Cc: Jeff Garzik <jeff@garzik.org>
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent a34a8751
Loading
Loading
Loading
Loading
+9 −8
Original line number Original line Diff line number Diff line
@@ -89,13 +89,15 @@


static int timings[4]={-1,-1,-1,-1}; /* stores current timing for each timer */
static int timings[4]={-1,-1,-1,-1}; /* stores current timing for each timer */


static DEFINE_SPINLOCK(qd65xx_lock);

static void qd_write_reg (u8 content, unsigned long reg)
static void qd_write_reg (u8 content, unsigned long reg)
{
{
	unsigned long flags;
	unsigned long flags;


	spin_lock_irqsave(&ide_lock, flags);
	spin_lock_irqsave(&qd65xx_lock, flags);
	outb(content,reg);
	outb(content,reg);
	spin_unlock_irqrestore(&ide_lock, flags);
	spin_unlock_irqrestore(&qd65xx_lock, flags);
}
}


static u8 __init qd_read_reg (unsigned long reg)
static u8 __init qd_read_reg (unsigned long reg)
@@ -103,9 +105,9 @@ static u8 __init qd_read_reg (unsigned long reg)
	unsigned long flags;
	unsigned long flags;
	u8 read;
	u8 read;


	spin_lock_irqsave(&ide_lock, flags);
	spin_lock_irqsave(&qd65xx_lock, flags);
	read = inb(reg);
	read = inb(reg);
	spin_unlock_irqrestore(&ide_lock, flags);
	spin_unlock_irqrestore(&qd65xx_lock, flags);
	return read;
	return read;
}
}


@@ -301,16 +303,15 @@ static void qd6580_set_pio_mode(ide_drive_t *drive, const u8 pio)


static int __init qd_testreg(int port)
static int __init qd_testreg(int port)
{
{
	u8 savereg;
	u8 readreg;
	unsigned long flags;
	unsigned long flags;
	u8 savereg, readreg;


	spin_lock_irqsave(&ide_lock, flags);
	spin_lock_irqsave(&qd65xx_lock, flags);
	savereg = inb_p(port);
	savereg = inb_p(port);
	outb_p(QD_TESTVAL, port);	/* safe value */
	outb_p(QD_TESTVAL, port);	/* safe value */
	readreg = inb_p(port);
	readreg = inb_p(port);
	outb(savereg, port);
	outb(savereg, port);
	spin_unlock_irqrestore(&ide_lock, flags);
	spin_unlock_irqrestore(&qd65xx_lock, flags);


	if (savereg == QD_TESTVAL) {
	if (savereg == QD_TESTVAL) {
		printk(KERN_ERR "Outch ! the probe for qd65xx isn't reliable !\n");
		printk(KERN_ERR "Outch ! the probe for qd65xx isn't reliable !\n");