diff options
author | Ondrej Zary <linux@rainbow-software.org> | 2015-11-17 13:23:41 -0500 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2015-11-25 22:08:29 -0500 |
commit | 1940ed62f9ca6d0b1f4c10afef3960f4f8a7d327 (patch) | |
tree | ca2b440172dff46eed22a775daf1eed4ddfe7c5d | |
parent | 3b836464809aff2795c22ba2a97f3b148e70282e (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.c | 118 |
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 | ||
934 | static unsigned char fun_scam(struct atp_unit *dev, unsigned short int *val) | 934 | static 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); | ||
942 | FUN_D7: | 940 | FUN_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); |
954 | FUN_D5: | 952 | FUN_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); |
965 | FUN_D6: | 963 | FUN_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: | |||
975 | static void tscam(struct Scsi_Host *host) | 973 | static 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 | } |
1045 | wait_rdyok: | 1036 | wait_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); |
1085 | wait_nomsg: | 1069 | wait_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; |
1097 | wait_io: | 1081 | wait_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: | |||
1104 | wait_io1: | 1088 | wait_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); |
1112 | TCM_SYNC: | 1096 | TCM_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; |
1147 | TCM_ID: | 1127 | TCM_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); |