Commit 1940ed62 authored by Ondrej Zary's avatar Ondrej Zary Committed by Martin K. Petersen
Browse files

atp870u: Untangle tmport #3



Untangle the tmport crap so it becomes obvious what ports are accessed.

Signed-off-by: default avatarOndrej Zary <linux@rainbow-software.org>
Reviewed-by: default avatarHannes Reinicke <hare@suse.de>
Acked-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 3b836464
Loading
Loading
Loading
Loading
+49 −69
Original line number Diff line number Diff line
@@ -933,38 +933,36 @@ static void send_s870(struct atp_unit *dev,unsigned char c)

static unsigned char fun_scam(struct atp_unit *dev, unsigned short int *val)
{
	unsigned int tmport;
	unsigned short int i, k;
	unsigned char j;

	tmport = dev->ioport[0] + 0x1c;
	outw(*val, tmport);
	outw(*val, dev->ioport[0] + 0x1c);
FUN_D7:
	for (i = 0; i < 10; i++) {	/* stable >= bus settle delay(400 ns)  */
		k = inw(tmport);
		k = inw(dev->ioport[0] + 0x1c);
		j = (unsigned char) (k >> 8);
		if ((k & 0x8000) != 0) {	/* DB7 all release?    */
			goto FUN_D7;
		}
	}
	*val |= 0x4000;		/* assert DB6           */
	outw(*val, tmport);
	outw(*val, dev->ioport[0] + 0x1c);
	*val &= 0xdfff;		/* assert DB5           */
	outw(*val, tmport);
	outw(*val, dev->ioport[0] + 0x1c);
FUN_D5:
	for (i = 0; i < 10; i++) {	/* stable >= bus settle delay(400 ns) */
		if ((inw(tmport) & 0x2000) != 0) {	/* DB5 all release?       */
		if ((inw(dev->ioport[0] + 0x1c) & 0x2000) != 0) {	/* DB5 all release?       */
			goto FUN_D5;
		}
	}
	*val |= 0x8000;		/* no DB4-0, assert DB7    */
	*val &= 0xe0ff;
	outw(*val, tmport);
	outw(*val, dev->ioport[0] + 0x1c);
	*val &= 0xbfff;		/* release DB6             */
	outw(*val, tmport);
	outw(*val, dev->ioport[0] + 0x1c);
FUN_D6:
	for (i = 0; i < 10; i++) {	/* stable >= bus settle delay(400 ns)  */
		if ((inw(tmport) & 0x4000) != 0) {	/* DB6 all release?  */
		if ((inw(dev->ioport[0] + 0x1c) & 0x4000) != 0) {	/* DB6 all release?  */
			goto FUN_D6;
		}
	}
@@ -975,7 +973,6 @@ static unsigned char fun_scam(struct atp_unit *dev, unsigned short int *val)
static void tscam(struct Scsi_Host *host)
{

	unsigned int tmport;
	unsigned char i, j, k;
	unsigned long n;
	unsigned short int m, assignid_map, val;
@@ -992,11 +989,9 @@ static void tscam(struct Scsi_Host *host)
	}
 */

	tmport = dev->ioport[0] + 1;
	outb(0x08, tmport++);
	outb(0x7f, tmport);
	tmport = dev->ioport[0] + 0x11;
	outb(0x20, tmport);
	outb(0x08, dev->ioport[0] + 1);
	outb(0x7f, dev->ioport[0] + 2);
	outb(0x20, dev->ioport[0] + 0x11);

	if ((dev->scam_on & 0x40) == 0) {
		return;
@@ -1009,14 +1004,13 @@ static void tscam(struct Scsi_Host *host)
		j = 8;
	}
	assignid_map = m;
	tmport = dev->ioport[0] + 0x02;
	outb(0x02, tmport++);	/* 2*2=4ms,3EH 2/32*3E=3.9ms */
	outb(0, tmport++);
	outb(0, tmport++);
	outb(0, tmport++);
	outb(0, tmport++);
	outb(0, tmport++);
	outb(0, tmport++);
	outb(0x02, dev->ioport[0] + 0x02);	/* 2*2=4ms,3EH 2/32*3E=3.9ms */
	outb(0, dev->ioport[0] + 0x03);
	outb(0, dev->ioport[0] + 0x04);
	outb(0, dev->ioport[0] + 0x05);
	outb(0, dev->ioport[0] + 0x06);
	outb(0, dev->ioport[0] + 0x07);
	outb(0, dev->ioport[0] + 0x08);

	for (i = 0; i < j; i++) {
		m = 1;
@@ -1024,79 +1018,69 @@ static void tscam(struct Scsi_Host *host)
		if ((m & assignid_map) != 0) {
			continue;
		}
		tmport = dev->ioport[0] + 0x0f;
		outb(0, tmport++);
		tmport += 0x02;
		outb(0, tmport++);
		outb(0, tmport++);
		outb(0, tmport++);
		outb(0, dev->ioport[0] + 0x0f);
		outb(0, dev->ioport[0] + 0x12);
		outb(0, dev->ioport[0] + 0x13);
		outb(0, dev->ioport[0] + 0x14);
		if (i > 7) {
			k = (i & 0x07) | 0x40;
		} else {
			k = i;
		}
		outb(k, tmport++);
		tmport = dev->ioport[0] + 0x1b;
		outb(k, dev->ioport[0] + 0x15);
		if (dev->chip_ver == 4) {
			outb(0x01, tmport);
			outb(0x01, dev->ioport[0] + 0x1b);
		} else {
			outb(0x00, tmport);
			outb(0x00, dev->ioport[0] + 0x1b);
		}
wait_rdyok:
		tmport = dev->ioport[0] + 0x18;
		outb(0x09, tmport);
		tmport += 0x07;
		outb(0x09, dev->ioport[0] + 0x18);

		while ((inb(tmport) & 0x80) == 0x00)
		while ((inb(dev->ioport[0] + 0x1f) & 0x80) == 0x00)
			cpu_relax();
		tmport -= 0x08;
		k = inb(tmport);
		k = inb(dev->ioport[0] + 0x17);
		if (k != 0x16) {
			if ((k == 0x85) || (k == 0x42)) {
				continue;
			}
			tmport = dev->ioport[0] + 0x10;
			outb(0x41, tmport);
			outb(0x41, dev->ioport[0] + 0x10);
			goto wait_rdyok;
		}
		assignid_map |= m;

	}
	tmport = dev->ioport[0] + 0x02;
	outb(0x7f, tmport);
	tmport = dev->ioport[0] + 0x1b;
	outb(0x02, tmport);
	outb(0x7f, dev->ioport[0] + 0x02);
	outb(0x02, dev->ioport[0] + 0x1b);

	outb(0, 0x80);

	val = 0x0080;		/* bsy  */
	tmport = dev->ioport[0] + 0x1c;
	outw(val, tmport);
	outw(val, dev->ioport[0] + 0x1c);
	val |= 0x0040;		/* sel  */
	outw(val, tmport);
	outw(val, dev->ioport[0] + 0x1c);
	val |= 0x0004;		/* msg  */
	outw(val, tmport);
	outw(val, dev->ioport[0] + 0x1c);
	inb(0x80);		/* 2 deskew delay(45ns*2=90ns) */
	val &= 0x007f;		/* no bsy  */
	outw(val, tmport);
	outw(val, dev->ioport[0] + 0x1c);
	mdelay(128);
	val &= 0x00fb;		/* after 1ms no msg */
	outw(val, tmport);
	outw(val, dev->ioport[0] + 0x1c);
wait_nomsg:
	if ((inb(tmport) & 0x04) != 0) {
	if ((inb(dev->ioport[0] + 0x1c) & 0x04) != 0) {
		goto wait_nomsg;
	}
	outb(1, 0x80);
	udelay(100);
	for (n = 0; n < 0x30000; n++) {
		if ((inb(tmport) & 0x80) != 0) {	/* bsy ? */
		if ((inb(dev->ioport[0] + 0x1c) & 0x80) != 0) {	/* bsy ? */
			goto wait_io;
		}
	}
	goto TCM_SYNC;
wait_io:
	for (n = 0; n < 0x30000; n++) {
		if ((inb(tmport) & 0x81) == 0x0081) {
		if ((inb(dev->ioport[0] + 0x1c) & 0x81) == 0x0081) {
			goto wait_io1;
		}
	}
@@ -1104,10 +1088,10 @@ static void tscam(struct Scsi_Host *host)
wait_io1:
	inb(0x80);
	val |= 0x8003;		/* io,cd,db7  */
	outw(val, tmport);
	outw(val, dev->ioport[0] + 0x1c);
	inb(0x80);
	val &= 0x00bf;		/* no sel     */
	outw(val, tmport);
	outw(val, dev->ioport[0] + 0x1c);
	outb(2, 0x80);
TCM_SYNC:
	/*
@@ -1120,18 +1104,14 @@ static void tscam(struct Scsi_Host *host)
	 */
	mdelay(2);
	udelay(48);
	if ((inb(tmport) & 0x80) == 0x00) {	/* bsy ? */
		outw(0, tmport--);
		outb(0, tmport);
		tmport = dev->ioport[0] + 0x15;
		outb(0, tmport);
		tmport += 0x03;
		outb(0x09, tmport);
		tmport += 0x07;
		while ((inb(tmport) & 0x80) == 0)
	if ((inb(dev->ioport[0] + 0x1c) & 0x80) == 0x00) {	/* bsy ? */
		outw(0, dev->ioport[0] + 0x1c);
		outb(0, dev->ioport[0] + 0x1b);
		outb(0, dev->ioport[0] + 0x15);
		outb(0x09, dev->ioport[0] + 0x18);
		while ((inb(dev->ioport[0] + 0x1f) & 0x80) == 0)
			cpu_relax();
		tmport -= 0x08;
		inb(tmport);
		inb(dev->ioport[0] + 0x17);
		return;
	}
	val &= 0x00ff;		/* synchronization  */
@@ -1145,7 +1125,7 @@ static void tscam(struct Scsi_Host *host)
	i = 8;
	j = 0;
TCM_ID:
	if ((inw(tmport) & 0x2000) == 0) {
	if ((inw(dev->ioport[0] + 0x1c) & 0x2000) == 0) {
		goto TCM_ID;
	}
	outb(5, 0x80);