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

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
...@@ -933,38 +933,36 @@ static void send_s870(struct atp_unit *dev,unsigned char c) ...@@ -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) static unsigned char fun_scam(struct atp_unit *dev, unsigned short int *val)
{ {
unsigned int tmport;
unsigned short int i, k; unsigned short int i, k;
unsigned char j; unsigned char j;
tmport = dev->ioport[0] + 0x1c; outw(*val, dev->ioport[0] + 0x1c);
outw(*val, tmport);
FUN_D7: FUN_D7:
for (i = 0; i < 10; i++) { /* stable >= bus settle delay(400 ns) */ 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); j = (unsigned char) (k >> 8);
if ((k & 0x8000) != 0) { /* DB7 all release? */ if ((k & 0x8000) != 0) { /* DB7 all release? */
goto FUN_D7; goto FUN_D7;
} }
} }
*val |= 0x4000; /* assert DB6 */ *val |= 0x4000; /* assert DB6 */
outw(*val, tmport); outw(*val, dev->ioport[0] + 0x1c);
*val &= 0xdfff; /* assert DB5 */ *val &= 0xdfff; /* assert DB5 */
outw(*val, tmport); outw(*val, dev->ioport[0] + 0x1c);
FUN_D5: FUN_D5:
for (i = 0; i < 10; i++) { /* stable >= bus settle delay(400 ns) */ 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; goto FUN_D5;
} }
} }
*val |= 0x8000; /* no DB4-0, assert DB7 */ *val |= 0x8000; /* no DB4-0, assert DB7 */
*val &= 0xe0ff; *val &= 0xe0ff;
outw(*val, tmport); outw(*val, dev->ioport[0] + 0x1c);
*val &= 0xbfff; /* release DB6 */ *val &= 0xbfff; /* release DB6 */
outw(*val, tmport); outw(*val, dev->ioport[0] + 0x1c);
FUN_D6: FUN_D6:
for (i = 0; i < 10; i++) { /* stable >= bus settle delay(400 ns) */ 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; goto FUN_D6;
} }
} }
...@@ -975,7 +973,6 @@ static unsigned char fun_scam(struct atp_unit *dev, unsigned short int *val) ...@@ -975,7 +973,6 @@ static unsigned char fun_scam(struct atp_unit *dev, unsigned short int *val)
static void tscam(struct Scsi_Host *host) static void tscam(struct Scsi_Host *host)
{ {
unsigned int tmport;
unsigned char i, j, k; unsigned char i, j, k;
unsigned long n; unsigned long n;
unsigned short int m, assignid_map, val; unsigned short int m, assignid_map, val;
...@@ -992,11 +989,9 @@ static void tscam(struct Scsi_Host *host) ...@@ -992,11 +989,9 @@ static void tscam(struct Scsi_Host *host)
} }
*/ */
tmport = dev->ioport[0] + 1; outb(0x08, dev->ioport[0] + 1);
outb(0x08, tmport++); outb(0x7f, dev->ioport[0] + 2);
outb(0x7f, tmport); outb(0x20, dev->ioport[0] + 0x11);
tmport = dev->ioport[0] + 0x11;
outb(0x20, tmport);
if ((dev->scam_on & 0x40) == 0) { if ((dev->scam_on & 0x40) == 0) {
return; return;
...@@ -1009,14 +1004,13 @@ static void tscam(struct Scsi_Host *host) ...@@ -1009,14 +1004,13 @@ static void tscam(struct Scsi_Host *host)
j = 8; j = 8;
} }
assignid_map = m; assignid_map = m;
tmport = dev->ioport[0] + 0x02; outb(0x02, dev->ioport[0] + 0x02); /* 2*2=4ms,3EH 2/32*3E=3.9ms */
outb(0x02, tmport++); /* 2*2=4ms,3EH 2/32*3E=3.9ms */ outb(0, dev->ioport[0] + 0x03);
outb(0, tmport++); outb(0, dev->ioport[0] + 0x04);
outb(0, tmport++); outb(0, dev->ioport[0] + 0x05);
outb(0, tmport++); outb(0, dev->ioport[0] + 0x06);
outb(0, tmport++); outb(0, dev->ioport[0] + 0x07);
outb(0, tmport++); outb(0, dev->ioport[0] + 0x08);
outb(0, tmport++);
for (i = 0; i < j; i++) { for (i = 0; i < j; i++) {
m = 1; m = 1;
...@@ -1024,79 +1018,69 @@ static void tscam(struct Scsi_Host *host) ...@@ -1024,79 +1018,69 @@ static void tscam(struct Scsi_Host *host)
if ((m & assignid_map) != 0) { if ((m & assignid_map) != 0) {
continue; continue;
} }
tmport = dev->ioport[0] + 0x0f; outb(0, dev->ioport[0] + 0x0f);
outb(0, tmport++); outb(0, dev->ioport[0] + 0x12);
tmport += 0x02; outb(0, dev->ioport[0] + 0x13);
outb(0, tmport++); outb(0, dev->ioport[0] + 0x14);
outb(0, tmport++);
outb(0, tmport++);
if (i > 7) { if (i > 7) {
k = (i & 0x07) | 0x40; k = (i & 0x07) | 0x40;
} else { } else {
k = i; k = i;
} }
outb(k, tmport++); outb(k, dev->ioport[0] + 0x15);
tmport = dev->ioport[0] + 0x1b;
if (dev->chip_ver == 4) { if (dev->chip_ver == 4) {
outb(0x01, tmport); outb(0x01, dev->ioport[0] + 0x1b);
} else { } else {
outb(0x00, tmport); outb(0x00, dev->ioport[0] + 0x1b);
} }
wait_rdyok: wait_rdyok:
tmport = dev->ioport[0] + 0x18; outb(0x09, dev->ioport[0] + 0x18);
outb(0x09, tmport);
tmport += 0x07;
while ((inb(tmport) & 0x80) == 0x00) while ((inb(dev->ioport[0] + 0x1f) & 0x80) == 0x00)
cpu_relax(); cpu_relax();
tmport -= 0x08; k = inb(dev->ioport[0] + 0x17);
k = inb(tmport);
if (k != 0x16) { if (k != 0x16) {
if ((k == 0x85) || (k == 0x42)) { if ((k == 0x85) || (k == 0x42)) {
continue; continue;
} }
tmport = dev->ioport[0] + 0x10; outb(0x41, dev->ioport[0] + 0x10);
outb(0x41, tmport);
goto wait_rdyok; goto wait_rdyok;
} }
assignid_map |= m; assignid_map |= m;
} }
tmport = dev->ioport[0] + 0x02; outb(0x7f, dev->ioport[0] + 0x02);
outb(0x7f, tmport); outb(0x02, dev->ioport[0] + 0x1b);
tmport = dev->ioport[0] + 0x1b;
outb(0x02, tmport);
outb(0, 0x80); outb(0, 0x80);
val = 0x0080; /* bsy */ val = 0x0080; /* bsy */
tmport = dev->ioport[0] + 0x1c; outw(val, dev->ioport[0] + 0x1c);
outw(val, tmport);
val |= 0x0040; /* sel */ val |= 0x0040; /* sel */
outw(val, tmport); outw(val, dev->ioport[0] + 0x1c);
val |= 0x0004; /* msg */ val |= 0x0004; /* msg */
outw(val, tmport); outw(val, dev->ioport[0] + 0x1c);
inb(0x80); /* 2 deskew delay(45ns*2=90ns) */ inb(0x80); /* 2 deskew delay(45ns*2=90ns) */
val &= 0x007f; /* no bsy */ val &= 0x007f; /* no bsy */
outw(val, tmport); outw(val, dev->ioport[0] + 0x1c);
mdelay(128); mdelay(128);
val &= 0x00fb; /* after 1ms no msg */ val &= 0x00fb; /* after 1ms no msg */
outw(val, tmport); outw(val, dev->ioport[0] + 0x1c);
wait_nomsg: wait_nomsg:
if ((inb(tmport) & 0x04) != 0) { if ((inb(dev->ioport[0] + 0x1c) & 0x04) != 0) {
goto wait_nomsg; goto wait_nomsg;
} }
outb(1, 0x80); outb(1, 0x80);
udelay(100); udelay(100);
for (n = 0; n < 0x30000; n++) { 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 wait_io;
} }
} }
goto TCM_SYNC; goto TCM_SYNC;
wait_io: wait_io:
for (n = 0; n < 0x30000; n++) { for (n = 0; n < 0x30000; n++) {
if ((inb(tmport) & 0x81) == 0x0081) { if ((inb(dev->ioport[0] + 0x1c) & 0x81) == 0x0081) {
goto wait_io1; goto wait_io1;
} }
} }
...@@ -1104,10 +1088,10 @@ static void tscam(struct Scsi_Host *host) ...@@ -1104,10 +1088,10 @@ static void tscam(struct Scsi_Host *host)
wait_io1: wait_io1:
inb(0x80); inb(0x80);
val |= 0x8003; /* io,cd,db7 */ val |= 0x8003; /* io,cd,db7 */
outw(val, tmport); outw(val, dev->ioport[0] + 0x1c);
inb(0x80); inb(0x80);
val &= 0x00bf; /* no sel */ val &= 0x00bf; /* no sel */
outw(val, tmport); outw(val, dev->ioport[0] + 0x1c);
outb(2, 0x80); outb(2, 0x80);
TCM_SYNC: TCM_SYNC:
/* /*
...@@ -1120,18 +1104,14 @@ static void tscam(struct Scsi_Host *host) ...@@ -1120,18 +1104,14 @@ static void tscam(struct Scsi_Host *host)
*/ */
mdelay(2); mdelay(2);
udelay(48); udelay(48);
if ((inb(tmport) & 0x80) == 0x00) { /* bsy ? */ if ((inb(dev->ioport[0] + 0x1c) & 0x80) == 0x00) { /* bsy ? */
outw(0, tmport--); outw(0, dev->ioport[0] + 0x1c);
outb(0, tmport); outb(0, dev->ioport[0] + 0x1b);
tmport = dev->ioport[0] + 0x15; outb(0, dev->ioport[0] + 0x15);
outb(0, tmport); outb(0x09, dev->ioport[0] + 0x18);
tmport += 0x03; while ((inb(dev->ioport[0] + 0x1f) & 0x80) == 0)
outb(0x09, tmport);
tmport += 0x07;
while ((inb(tmport) & 0x80) == 0)
cpu_relax(); cpu_relax();
tmport -= 0x08; inb(dev->ioport[0] + 0x17);
inb(tmport);
return; return;
} }
val &= 0x00ff; /* synchronization */ val &= 0x00ff; /* synchronization */
...@@ -1145,7 +1125,7 @@ static void tscam(struct Scsi_Host *host) ...@@ -1145,7 +1125,7 @@ static void tscam(struct Scsi_Host *host)
i = 8; i = 8;
j = 0; j = 0;
TCM_ID: TCM_ID:
if ((inw(tmport) & 0x2000) == 0) { if ((inw(dev->ioport[0] + 0x1c) & 0x2000) == 0) {
goto TCM_ID; goto TCM_ID;
} }
outb(5, 0x80); outb(5, 0x80);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment