mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-01-23 10:19:53 +07:00
atp870u: Untangle tmport #3
Untangle the tmport crap so it becomes obvious what ports are accessed. Signed-off-by: Ondrej Zary <linux@rainbow-software.org> Reviewed-by: Hannes Reinicke <hare@suse.de> Acked-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
3b83646480
commit
1940ed62f9
@ -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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
*/
|
*/
|
||||||
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)
|
|||||||
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);
|
||||||
|
Loading…
Reference in New Issue
Block a user