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

Commit cc7c15ec authored by Alan Cox's avatar Alan Cox Committed by Jeff Garzik
Browse files

pata_qdi: Fix initialisation



The QDI init code contains some bugs which mean it only works if you have
a test setup that causes both a successful and failed probe. Fix this

Found by Philip Guo

(Who found it working on code analysis tools not running VLB IDE
controllers)

Signed-off-by: default avatarAlan Cox <alan@redhat.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent fb9f8905
Loading
Loading
Loading
Loading
+8 −4
Original line number Original line Diff line number Diff line
@@ -363,7 +363,8 @@ static __init int qdi_init(void)
					release_region(port, 2);
					release_region(port, 2);
					continue;
					continue;
				}
				}
				ct += qdi_init_one(port, 6500, ide_port[r & 0x01], ide_irq[r & 0x01], r & 0x04);
				if (qdi_init_one(port, 6500, ide_port[r & 0x01], ide_irq[r & 0x01], r & 0x04) == 0)
					ct++;
			}
			}
			if (((r & 0xF0) == 0xA0) || (r & 0xF0) == 0x50) {
			if (((r & 0xF0) == 0xA0) || (r & 0xF0) == 0x50) {
				/* QD6580: dual channel */
				/* QD6580: dual channel */
@@ -375,11 +376,14 @@ static __init int qdi_init(void)
				res = inb(port + 3);
				res = inb(port + 3);
				if (res & 1) {
				if (res & 1) {
					/* Single channel mode */
					/* Single channel mode */
					ct += qdi_init_one(port, 6580, ide_port[r & 0x01], ide_irq[r & 0x01], r & 0x04);
					if (qdi_init_one(port, 6580, ide_port[r & 0x01], ide_irq[r & 0x01], r & 0x04))
						ct++;
				} else {
				} else {
					/* Dual channel mode */
					/* Dual channel mode */
					ct += qdi_init_one(port, 6580, 0x1F0, 14, r & 0x04);
					if (qdi_init_one(port, 6580, 0x1F0, 14, r & 0x04) == 0)
					ct += qdi_init_one(port + 2, 6580, 0x170, 15, r & 0x04);
						ct++;
					if (qdi_init_one(port + 2, 6580, 0x170, 15, r & 0x04) == 0)
						ct++;
				}
				}
			}
			}
		}
		}