aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOndrej Zary <linux@rainbow-software.org>2015-11-17 13:23:41 -0500
committerMartin K. Petersen <martin.petersen@oracle.com>2015-11-25 22:08:29 -0500
commit1940ed62f9ca6d0b1f4c10afef3960f4f8a7d327 (patch)
treeca2b440172dff46eed22a775daf1eed4ddfe7c5d
parent3b836464809aff2795c22ba2a97f3b148e70282e (diff)
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>
-rw-r--r--drivers/scsi/atp870u.c118
1 files changed, 49 insertions, 69 deletions
diff --git a/drivers/scsi/atp870u.c b/drivers/scsi/atp870u.c
index 71123372e52b..a23f38717d90 100644
--- a/drivers/scsi/atp870u.c
+++ b/drivers/scsi/atp870u.c
@@ -933,38 +933,36 @@ oktosend:
933 933
934static unsigned char fun_scam(struct atp_unit *dev, unsigned short int *val) 934static unsigned char fun_scam(struct atp_unit *dev, unsigned short int *val)
935{ 935{
936 unsigned int tmport;
937 unsigned short int i, k; 936 unsigned short int i, k;
938 unsigned char j; 937 unsigned char j;
939 938
940 tmport = dev->ioport[0] + 0x1c; 939 outw(*val, dev->ioport[0] + 0x1c);
941 outw(*val, tmport);
942FUN_D7: 940FUN_D7:
943 for (i = 0; i < 10; i++) { /* stable >= bus settle delay(400 ns) */ 941 for (i = 0; i < 10; i++) { /* stable >= bus settle delay(400 ns) */
944 k = inw(tmport); 942 k = inw(dev->ioport[0] + 0x1c);
945 j = (unsigned char) (k >> 8); 943 j = (unsigned char) (k >> 8);
946 if ((k & 0x8000) != 0) { /* DB7 all release? */ 944 if ((k & 0x8000) != 0) { /* DB7 all release? */
947 goto FUN_D7; 945 goto FUN_D7;
948 } 946 }
949 } 947 }
950 *val |= 0x4000; /* assert DB6 */ 948 *val |= 0x4000; /* assert DB6 */
951 outw(*val, tmport); 949 outw(*val, dev->ioport[0] + 0x1c);
952 *val &= 0xdfff; /* assert DB5 */ 950 *val &= 0xdfff; /* assert DB5 */
953 outw(*val, tmport); 951 outw(*val, dev->ioport[0] + 0x1c);
954FUN_D5: 952FUN_D5:
955 for (i = 0; i < 10; i++) { /* stable >= bus settle delay(400 ns) */ 953 for (i = 0; i < 10; i++) { /* stable >= bus settle delay(400 ns) */
956 if ((inw(tmport) & 0x2000) != 0) { /* DB5 all release? */ 954 if ((inw(dev->ioport[0] + 0x1c) & 0x2000) != 0) { /* DB5 all release? */
957 goto FUN_D5; 955 goto FUN_D5;
958 } 956 }
959 } 957 }
960 *val |= 0x8000; /* no DB4-0, assert DB7 */ 958 *val |= 0x8000; /* no DB4-0, assert DB7 */
961 *val &= 0xe0ff; 959 *val &= 0xe0ff;
962 outw(*val, tmport); 960 outw(*val, dev->ioport[0] + 0x1c);
963 *val &= 0xbfff; /* release DB6 */ 961 *val &= 0xbfff; /* release DB6 */
964 outw(*val, tmport); 962 outw(*val, dev->ioport[0] + 0x1c);
965FUN_D6: 963FUN_D6:
966 for (i = 0; i < 10; i++) { /* stable >= bus settle delay(400 ns) */ 964 for (i = 0; i < 10; i++) { /* stable >= bus settle delay(400 ns) */
967 if ((inw(tmport) & 0x4000) != 0) { /* DB6 all release? */ 965 if ((inw(dev->ioport[0] + 0x1c) & 0x4000) != 0) { /* DB6 all release? */
968 goto FUN_D6; 966 goto FUN_D6;
969 } 967 }
970 } 968 }
@@ -975,7 +973,6 @@ FUN_D6:
975static void tscam(struct Scsi_Host *host) 973static void tscam(struct Scsi_Host *host)
976{ 974{
977 975
978 unsigned int tmport;
979 unsigned char i, j, k; 976 unsigned char i, j, k;
980 unsigned long n; 977 unsigned long n;
981 unsigned short int m, assignid_map, val; 978 unsigned short int m, assignid_map, val;
@@ -992,11 +989,9 @@ static void tscam(struct Scsi_Host *host)
992 } 989 }
993 */ 990 */
994 991
995 tmport = dev->ioport[0] + 1; 992 outb(0x08, dev->ioport[0] + 1);
996 outb(0x08, tmport++); 993 outb(0x7f, dev->ioport[0] + 2);
997 outb(0x7f, tmport); 994 outb(0x20, dev->ioport[0] + 0x11);
998 tmport = dev->ioport[0] + 0x11;
999 outb(0x20, tmport);
1000 995
1001 if ((dev->scam_on & 0x40) == 0) { 996 if ((dev->scam_on & 0x40) == 0) {
1002 return; 997 return;
@@ -1009,14 +1004,13 @@ static void tscam(struct Scsi_Host *host)
1009 j = 8; 1004 j = 8;
1010 } 1005 }
1011 assignid_map = m; 1006 assignid_map = m;
1012 tmport = dev->ioport[0] + 0x02; 1007 outb(0x02, dev->ioport[0] + 0x02); /* 2*2=4ms,3EH 2/32*3E=3.9ms */
1013 outb(0x02, tmport++); /* 2*2=4ms,3EH 2/32*3E=3.9ms */ 1008 outb(0, dev->ioport[0] + 0x03);
1014 outb(0, tmport++); 1009 outb(0, dev->ioport[0] + 0x04);
1015 outb(0, tmport++); 1010 outb(0, dev->ioport[0] + 0x05);
1016 outb(0, tmport++); 1011 outb(0, dev->ioport[0] + 0x06);
1017 outb(0, tmport++); 1012 outb(0, dev->ioport[0] + 0x07);
1018 outb(0, tmport++); 1013 outb(0, dev->ioport[0] + 0x08);
1019 outb(0, tmport++);
1020 1014
1021 for (i = 0; i < j; i++) { 1015 for (i = 0; i < j; i++) {
1022 m = 1; 1016 m = 1;
@@ -1024,79 +1018,69 @@ static void tscam(struct Scsi_Host *host)
1024 if ((m & assignid_map) != 0) { 1018 if ((m & assignid_map) != 0) {
1025 continue; 1019 continue;
1026 } 1020 }
1027 tmport = dev->ioport[0] + 0x0f; 1021 outb(0, dev->ioport[0] + 0x0f);
1028 outb(0, tmport++); 1022 outb(0, dev->ioport[0] + 0x12);
1029 tmport += 0x02; 1023 outb(0, dev->ioport[0] + 0x13);
1030 outb(0, tmport++); 1024 outb(0, dev->ioport[0] + 0x14);
1031 outb(0, tmport++);
1032 outb(0, tmport++);
1033 if (i > 7) { 1025 if (i > 7) {
1034 k = (i & 0x07) | 0x40; 1026 k = (i & 0x07) | 0x40;
1035 } else { 1027 } else {
1036 k = i; 1028 k = i;
1037 } 1029 }
1038 outb(k, tmport++); 1030 outb(k, dev->ioport[0] + 0x15);
1039 tmport = dev->ioport[0] + 0x1b;
1040 if (dev->chip_ver == 4) { 1031 if (dev->chip_ver == 4) {
1041 outb(0x01, tmport); 1032 outb(0x01, dev->ioport[0] + 0x1b);
1042 } else { 1033 } else {
1043 outb(0x00, tmport); 1034 outb(0x00, dev->ioport[0] + 0x1b);
1044 } 1035 }
1045wait_rdyok: 1036wait_rdyok:
1046 tmport = dev->ioport[0] + 0x18; 1037 outb(0x09, dev->ioport[0] + 0x18);
1047 outb(0x09, tmport);
1048 tmport += 0x07;
1049 1038
1050 while ((inb(tmport) & 0x80) == 0x00) 1039 while ((inb(dev->ioport[0] + 0x1f) & 0x80) == 0x00)
1051 cpu_relax(); 1040 cpu_relax();
1052 tmport -= 0x08; 1041 k = inb(dev->ioport[0] + 0x17);
1053 k = inb(tmport);
1054 if (k != 0x16) { 1042 if (k != 0x16) {
1055 if ((k == 0x85) || (k == 0x42)) { 1043 if ((k == 0x85) || (k == 0x42)) {
1056 continue; 1044 continue;
1057 } 1045 }
1058 tmport = dev->ioport[0] + 0x10; 1046 outb(0x41, dev->ioport[0] + 0x10);
1059 outb(0x41, tmport);
1060 goto wait_rdyok; 1047 goto wait_rdyok;
1061 } 1048 }
1062 assignid_map |= m; 1049 assignid_map |= m;
1063 1050
1064 } 1051 }
1065 tmport = dev->ioport[0] + 0x02; 1052 outb(0x7f, dev->ioport[0] + 0x02);
1066 outb(0x7f, tmport); 1053 outb(0x02, dev->ioport[0] + 0x1b);
1067 tmport = dev->ioport[0] + 0x1b;
1068 outb(0x02, tmport);
1069 1054
1070 outb(0, 0x80); 1055 outb(0, 0x80);
1071 1056
1072 val = 0x0080; /* bsy */ 1057 val = 0x0080; /* bsy */
1073 tmport = dev->ioport[0] + 0x1c; 1058 outw(val, dev->ioport[0] + 0x1c);
1074 outw(val, tmport);
1075 val |= 0x0040; /* sel */ 1059 val |= 0x0040; /* sel */
1076 outw(val, tmport); 1060 outw(val, dev->ioport[0] + 0x1c);
1077 val |= 0x0004; /* msg */ 1061 val |= 0x0004; /* msg */
1078 outw(val, tmport); 1062 outw(val, dev->ioport[0] + 0x1c);
1079 inb(0x80); /* 2 deskew delay(45ns*2=90ns) */ 1063 inb(0x80); /* 2 deskew delay(45ns*2=90ns) */
1080 val &= 0x007f; /* no bsy */ 1064 val &= 0x007f; /* no bsy */
1081 outw(val, tmport); 1065 outw(val, dev->ioport[0] + 0x1c);
1082 mdelay(128); 1066 mdelay(128);
1083 val &= 0x00fb; /* after 1ms no msg */ 1067 val &= 0x00fb; /* after 1ms no msg */
1084 outw(val, tmport); 1068 outw(val, dev->ioport[0] + 0x1c);
1085wait_nomsg: 1069wait_nomsg:
1086 if ((inb(tmport) & 0x04) != 0) { 1070 if ((inb(dev->ioport[0] + 0x1c) & 0x04) != 0) {
1087 goto wait_nomsg; 1071 goto wait_nomsg;
1088 } 1072 }
1089 outb(1, 0x80); 1073 outb(1, 0x80);
1090 udelay(100); 1074 udelay(100);
1091 for (n = 0; n < 0x30000; n++) { 1075 for (n = 0; n < 0x30000; n++) {
1092 if ((inb(tmport) & 0x80) != 0) { /* bsy ? */ 1076 if ((inb(dev->ioport[0] + 0x1c) & 0x80) != 0) { /* bsy ? */
1093 goto wait_io; 1077 goto wait_io;
1094 } 1078 }
1095 } 1079 }
1096 goto TCM_SYNC; 1080 goto TCM_SYNC;
1097wait_io: 1081wait_io:
1098 for (n = 0; n < 0x30000; n++) { 1082 for (n = 0; n < 0x30000; n++) {
1099 if ((inb(tmport) & 0x81) == 0x0081) { 1083 if ((inb(dev->ioport[0] + 0x1c) & 0x81) == 0x0081) {
1100 goto wait_io1; 1084 goto wait_io1;
1101 } 1085 }
1102 } 1086 }
@@ -1104,10 +1088,10 @@ wait_io:
1104wait_io1: 1088wait_io1:
1105 inb(0x80); 1089 inb(0x80);
1106 val |= 0x8003; /* io,cd,db7 */ 1090 val |= 0x8003; /* io,cd,db7 */
1107 outw(val, tmport); 1091 outw(val, dev->ioport[0] + 0x1c);
1108 inb(0x80); 1092 inb(0x80);
1109 val &= 0x00bf; /* no sel */ 1093 val &= 0x00bf; /* no sel */
1110 outw(val, tmport); 1094 outw(val, dev->ioport[0] + 0x1c);
1111 outb(2, 0x80); 1095 outb(2, 0x80);
1112TCM_SYNC: 1096TCM_SYNC:
1113 /* 1097 /*
@@ -1120,18 +1104,14 @@ TCM_SYNC:
1120 */ 1104 */
1121 mdelay(2); 1105 mdelay(2);
1122 udelay(48); 1106 udelay(48);
1123 if ((inb(tmport) & 0x80) == 0x00) { /* bsy ? */ 1107 if ((inb(dev->ioport[0] + 0x1c) & 0x80) == 0x00) { /* bsy ? */
1124 outw(0, tmport--); 1108 outw(0, dev->ioport[0] + 0x1c);
1125 outb(0, tmport); 1109 outb(0, dev->ioport[0] + 0x1b);
1126 tmport = dev->ioport[0] + 0x15; 1110 outb(0, dev->ioport[0] + 0x15);
1127 outb(0, tmport); 1111 outb(0x09, dev->ioport[0] + 0x18);
1128 tmport += 0x03; 1112 while ((inb(dev->ioport[0] + 0x1f) & 0x80) == 0)
1129 outb(0x09, tmport);
1130 tmport += 0x07;
1131 while ((inb(tmport) & 0x80) == 0)
1132 cpu_relax(); 1113 cpu_relax();
1133 tmport -= 0x08; 1114 inb(dev->ioport[0] + 0x17);
1134 inb(tmport);
1135 return; 1115 return;
1136 } 1116 }
1137 val &= 0x00ff; /* synchronization */ 1117 val &= 0x00ff; /* synchronization */
@@ -1145,7 +1125,7 @@ TCM_SYNC:
1145 i = 8; 1125 i = 8;
1146 j = 0; 1126 j = 0;
1147TCM_ID: 1127TCM_ID:
1148 if ((inw(tmport) & 0x2000) == 0) { 1128 if ((inw(dev->ioport[0] + 0x1c) & 0x2000) == 0) {
1149 goto TCM_ID; 1129 goto TCM_ID;
1150 } 1130 }
1151 outb(5, 0x80); 1131 outb(5, 0x80);