pccard_cis.c (167086) | pccard_cis.c (179483) |
---|---|
1/* $NetBSD: pcmcia_cis.c,v 1.17 2000/02/10 09:01:52 chopps Exp $ */ | 1/* $NetBSD: pcmcia_cis.c,v 1.17 2000/02/10 09:01:52 chopps Exp $ */ |
2/* $FreeBSD: head/sys/dev/pccard/pccard_cis.c 167086 2007-02-27 17:23:29Z jhb $ */ | 2/* $FreeBSD: head/sys/dev/pccard/pccard_cis.c 179483 2008-06-01 20:55:34Z imp $ */ |
3 4/*- 5 * Copyright (c) 1997 Marc Horowitz. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright --- 882 unchanged lines hidden (view full) --- 893 /* reset the default cfe for each cfe list */ 894 state->temp_cfe = init_cfe; 895 state->default_cfe = &state->temp_cfe; 896 } 897 DPRINTF(("CISTPL_CONFIG\n")); 898 break; 899 case CISTPL_CFTABLE_ENTRY: 900 { | 3 4/*- 5 * Copyright (c) 1997 Marc Horowitz. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright --- 882 unchanged lines hidden (view full) --- 893 /* reset the default cfe for each cfe list */ 894 state->temp_cfe = init_cfe; 895 state->default_cfe = &state->temp_cfe; 896 } 897 DPRINTF(("CISTPL_CONFIG\n")); 898 break; 899 case CISTPL_CFTABLE_ENTRY: 900 { |
901 int idx, i, j; | 901 int idx, i; |
902 u_int reg, reg2; 903 u_int intface, def, num; 904 u_int power, timing, iospace, irq, memspace, misc; 905 struct pccard_config_entry *cfe; 906 907 idx = 0; 908 | 902 u_int reg, reg2; 903 u_int intface, def, num; 904 u_int power, timing, iospace, irq, memspace, misc; 905 struct pccard_config_entry *cfe; 906 907 idx = 0; 908 |
909 reg = pccard_tuple_read_1(tuple, idx); 910 idx++; | 909 reg = pccard_tuple_read_1(tuple, idx++); |
911 intface = reg & PCCARD_TPCE_INDX_INTFACE; 912 def = reg & PCCARD_TPCE_INDX_DEFAULT; 913 num = reg & PCCARD_TPCE_INDX_NUM_MASK; 914 915 /* 916 * this is a little messy. Some cards have only a 917 * cfentry with the default bit set. So, as we go 918 * through the list, we add new indexes to the queue, --- 59 unchanged lines hidden (view full) --- 978 */ 979 if (!def) { 980 state->temp_cfe = *state->default_cfe; 981 state->default_cfe = &state->temp_cfe; 982 } 983 } 984 985 if (intface) { | 910 intface = reg & PCCARD_TPCE_INDX_INTFACE; 911 def = reg & PCCARD_TPCE_INDX_DEFAULT; 912 num = reg & PCCARD_TPCE_INDX_NUM_MASK; 913 914 /* 915 * this is a little messy. Some cards have only a 916 * cfentry with the default bit set. So, as we go 917 * through the list, we add new indexes to the queue, --- 59 unchanged lines hidden (view full) --- 977 */ 978 if (!def) { 979 state->temp_cfe = *state->default_cfe; 980 state->default_cfe = &state->temp_cfe; 981 } 982 } 983 984 if (intface) { |
986 reg = pccard_tuple_read_1(tuple, idx); 987 idx++; | 985 reg = pccard_tuple_read_1(tuple, idx++); |
988 cfe->flags &= ~(PCCARD_CFE_MWAIT_REQUIRED 989 | PCCARD_CFE_RDYBSY_ACTIVE 990 | PCCARD_CFE_WP_ACTIVE 991 | PCCARD_CFE_BVD_ACTIVE); 992 if (reg & PCCARD_TPCE_IF_MWAIT) 993 cfe->flags |= PCCARD_CFE_MWAIT_REQUIRED; 994 if (reg & PCCARD_TPCE_IF_RDYBSY) 995 cfe->flags |= PCCARD_CFE_RDYBSY_ACTIVE; 996 if (reg & PCCARD_TPCE_IF_WP) 997 cfe->flags |= PCCARD_CFE_WP_ACTIVE; 998 if (reg & PCCARD_TPCE_IF_BVD) 999 cfe->flags |= PCCARD_CFE_BVD_ACTIVE; 1000 cfe->iftype = reg & PCCARD_TPCE_IF_IFTYPE; 1001 } | 986 cfe->flags &= ~(PCCARD_CFE_MWAIT_REQUIRED 987 | PCCARD_CFE_RDYBSY_ACTIVE 988 | PCCARD_CFE_WP_ACTIVE 989 | PCCARD_CFE_BVD_ACTIVE); 990 if (reg & PCCARD_TPCE_IF_MWAIT) 991 cfe->flags |= PCCARD_CFE_MWAIT_REQUIRED; 992 if (reg & PCCARD_TPCE_IF_RDYBSY) 993 cfe->flags |= PCCARD_CFE_RDYBSY_ACTIVE; 994 if (reg & PCCARD_TPCE_IF_WP) 995 cfe->flags |= PCCARD_CFE_WP_ACTIVE; 996 if (reg & PCCARD_TPCE_IF_BVD) 997 cfe->flags |= PCCARD_CFE_BVD_ACTIVE; 998 cfe->iftype = reg & PCCARD_TPCE_IF_IFTYPE; 999 } |
1002 reg = pccard_tuple_read_1(tuple, idx); 1003 idx++; | 1000 reg = pccard_tuple_read_1(tuple, idx++); |
1004 1005 power = reg & PCCARD_TPCE_FS_POWER_MASK; 1006 timing = reg & PCCARD_TPCE_FS_TIMING; 1007 iospace = reg & PCCARD_TPCE_FS_IOSPACE; 1008 irq = reg & PCCARD_TPCE_FS_IRQ; 1009 memspace = reg & PCCARD_TPCE_FS_MEMSPACE_MASK; 1010 misc = reg & PCCARD_TPCE_FS_MISC; 1011 1012 if (power) { 1013 /* skip over power, don't save */ 1014 /* for each parameter selection byte */ 1015 for (i = 0; i < power; i++) { | 1001 1002 power = reg & PCCARD_TPCE_FS_POWER_MASK; 1003 timing = reg & PCCARD_TPCE_FS_TIMING; 1004 iospace = reg & PCCARD_TPCE_FS_IOSPACE; 1005 irq = reg & PCCARD_TPCE_FS_IRQ; 1006 memspace = reg & PCCARD_TPCE_FS_MEMSPACE_MASK; 1007 misc = reg & PCCARD_TPCE_FS_MISC; 1008 1009 if (power) { 1010 /* skip over power, don't save */ 1011 /* for each parameter selection byte */ 1012 for (i = 0; i < power; i++) { |
1016 reg = pccard_tuple_read_1(tuple, idx); 1017 idx++; 1018 /* for each bit */ 1019 for (j = 0; j < 7; j++) { 1020 /* if the bit is set */ 1021 if ((reg >> j) & 0x01) { 1022 /* skip over bytes */ 1023 do { 1024 reg2 = pccard_tuple_read_1(tuple, idx); 1025 idx++; 1026 /* 1027 * until 1028 * non-extensi 1029 * on byte 1030 */ 1031 } while (reg2 & 0x80); 1032 } | 1013 reg = pccard_tuple_read_1(tuple, idx++); 1014 for (; reg; reg >>= 1) 1015 { 1016 /* set bit -> read */ 1017 if ((reg & 1) == 0) 1018 continue; 1019 /* skip over bytes */ 1020 do { 1021 reg2 = pccard_tuple_read_1(tuple, idx++); 1022 /* 1023 * until non-extension 1024 * byte 1025 */ 1026 } while (reg2 & 0x80); |
1033 } 1034 } 1035 } 1036 if (timing) { 1037 /* skip over timing, don't save */ | 1027 } 1028 } 1029 } 1030 if (timing) { 1031 /* skip over timing, don't save */ |
1038 reg = pccard_tuple_read_1(tuple, idx); 1039 idx++; | 1032 reg = pccard_tuple_read_1(tuple, idx++); |
1040 1041 if ((reg & PCCARD_TPCE_TD_RESERVED_MASK) != 1042 PCCARD_TPCE_TD_RESERVED_MASK) 1043 idx++; 1044 if ((reg & PCCARD_TPCE_TD_RDYBSY_MASK) != 1045 PCCARD_TPCE_TD_RDYBSY_MASK) 1046 idx++; 1047 if ((reg & PCCARD_TPCE_TD_WAIT_MASK) != 1048 PCCARD_TPCE_TD_WAIT_MASK) 1049 idx++; 1050 } 1051 if (iospace) { 1052 if (tuple->length <= idx) { 1053 DPRINTF(("ran out of space before TCPE_IO\n")); 1054 goto abort_cfe; 1055 } 1056 | 1033 1034 if ((reg & PCCARD_TPCE_TD_RESERVED_MASK) != 1035 PCCARD_TPCE_TD_RESERVED_MASK) 1036 idx++; 1037 if ((reg & PCCARD_TPCE_TD_RDYBSY_MASK) != 1038 PCCARD_TPCE_TD_RDYBSY_MASK) 1039 idx++; 1040 if ((reg & PCCARD_TPCE_TD_WAIT_MASK) != 1041 PCCARD_TPCE_TD_WAIT_MASK) 1042 idx++; 1043 } 1044 if (iospace) { 1045 if (tuple->length <= idx) { 1046 DPRINTF(("ran out of space before TCPE_IO\n")); 1047 goto abort_cfe; 1048 } 1049 |
1057 reg = pccard_tuple_read_1(tuple, idx); 1058 idx++; | 1050 reg = pccard_tuple_read_1(tuple, idx++); |
1059 cfe->flags &= 1060 ~(PCCARD_CFE_IO8 | PCCARD_CFE_IO16); 1061 if (reg & PCCARD_TPCE_IO_BUSWIDTH_8BIT) 1062 cfe->flags |= PCCARD_CFE_IO8; 1063 if (reg & PCCARD_TPCE_IO_BUSWIDTH_16BIT) 1064 cfe->flags |= PCCARD_CFE_IO16; 1065 cfe->iomask = 1066 reg & PCCARD_TPCE_IO_IOADDRLINES_MASK; 1067 1068 if (reg & PCCARD_TPCE_IO_HASRANGE) { | 1051 cfe->flags &= 1052 ~(PCCARD_CFE_IO8 | PCCARD_CFE_IO16); 1053 if (reg & PCCARD_TPCE_IO_BUSWIDTH_8BIT) 1054 cfe->flags |= PCCARD_CFE_IO8; 1055 if (reg & PCCARD_TPCE_IO_BUSWIDTH_16BIT) 1056 cfe->flags |= PCCARD_CFE_IO16; 1057 cfe->iomask = 1058 reg & PCCARD_TPCE_IO_IOADDRLINES_MASK; 1059 1060 if (reg & PCCARD_TPCE_IO_HASRANGE) { |
1069 reg = pccard_tuple_read_1(tuple, idx); 1070 idx++; 1071 | 1061 reg = pccard_tuple_read_1(tuple, idx++); |
1072 cfe->num_iospace = 1 + (reg & 1073 PCCARD_TPCE_IO_RANGE_COUNT); 1074 1075 if (cfe->num_iospace > 1076 (sizeof(cfe->iospace) / 1077 sizeof(cfe->iospace[0]))) { 1078 DPRINTF(("too many io " 1079 "spaces %d", 1080 cfe->num_iospace)); 1081 state->card->error++; 1082 break; 1083 } 1084 for (i = 0; i < cfe->num_iospace; i++) { 1085 switch (reg & PCCARD_TPCE_IO_RANGE_ADDRSIZE_MASK) { 1086 case PCCARD_TPCE_IO_RANGE_ADDRSIZE_ONE: 1087 cfe->iospace[i].start = | 1062 cfe->num_iospace = 1 + (reg & 1063 PCCARD_TPCE_IO_RANGE_COUNT); 1064 1065 if (cfe->num_iospace > 1066 (sizeof(cfe->iospace) / 1067 sizeof(cfe->iospace[0]))) { 1068 DPRINTF(("too many io " 1069 "spaces %d", 1070 cfe->num_iospace)); 1071 state->card->error++; 1072 break; 1073 } 1074 for (i = 0; i < cfe->num_iospace; i++) { 1075 switch (reg & PCCARD_TPCE_IO_RANGE_ADDRSIZE_MASK) { 1076 case PCCARD_TPCE_IO_RANGE_ADDRSIZE_ONE: 1077 cfe->iospace[i].start = |
1088 pccard_tuple_read_1(tuple, idx); 1089 idx++; | 1078 pccard_tuple_read_1(tuple, idx++); |
1090 break; 1091 case PCCARD_TPCE_IO_RANGE_ADDRSIZE_TWO: 1092 cfe->iospace[i].start = 1093 pccard_tuple_read_2(tuple, idx); 1094 idx += 2; 1095 break; 1096 case PCCARD_TPCE_IO_RANGE_ADDRSIZE_FOUR: 1097 cfe->iospace[i].start = 1098 pccard_tuple_read_4(tuple, idx); 1099 idx += 4; 1100 break; 1101 } 1102 switch (reg & 1103 PCCARD_TPCE_IO_RANGE_LENGTHSIZE_MASK) { 1104 case PCCARD_TPCE_IO_RANGE_LENGTHSIZE_ONE: 1105 cfe->iospace[i].length = | 1079 break; 1080 case PCCARD_TPCE_IO_RANGE_ADDRSIZE_TWO: 1081 cfe->iospace[i].start = 1082 pccard_tuple_read_2(tuple, idx); 1083 idx += 2; 1084 break; 1085 case PCCARD_TPCE_IO_RANGE_ADDRSIZE_FOUR: 1086 cfe->iospace[i].start = 1087 pccard_tuple_read_4(tuple, idx); 1088 idx += 4; 1089 break; 1090 } 1091 switch (reg & 1092 PCCARD_TPCE_IO_RANGE_LENGTHSIZE_MASK) { 1093 case PCCARD_TPCE_IO_RANGE_LENGTHSIZE_ONE: 1094 cfe->iospace[i].length = |
1106 pccard_tuple_read_1(tuple, idx); 1107 idx++; | 1095 pccard_tuple_read_1(tuple, idx++); |
1108 break; 1109 case PCCARD_TPCE_IO_RANGE_LENGTHSIZE_TWO: 1110 cfe->iospace[i].length = 1111 pccard_tuple_read_2(tuple, idx); 1112 idx += 2; 1113 break; 1114 case PCCARD_TPCE_IO_RANGE_LENGTHSIZE_FOUR: 1115 cfe->iospace[i].length = --- 11 unchanged lines hidden (view full) --- 1127 } 1128 } 1129 if (irq) { 1130 if (tuple->length <= idx) { 1131 DPRINTF(("ran out of space before TCPE_IR\n")); 1132 goto abort_cfe; 1133 } 1134 | 1096 break; 1097 case PCCARD_TPCE_IO_RANGE_LENGTHSIZE_TWO: 1098 cfe->iospace[i].length = 1099 pccard_tuple_read_2(tuple, idx); 1100 idx += 2; 1101 break; 1102 case PCCARD_TPCE_IO_RANGE_LENGTHSIZE_FOUR: 1103 cfe->iospace[i].length = --- 11 unchanged lines hidden (view full) --- 1115 } 1116 } 1117 if (irq) { 1118 if (tuple->length <= idx) { 1119 DPRINTF(("ran out of space before TCPE_IR\n")); 1120 goto abort_cfe; 1121 } 1122 |
1135 reg = pccard_tuple_read_1(tuple, idx); 1136 idx++; | 1123 reg = pccard_tuple_read_1(tuple, idx++); |
1137 cfe->flags &= ~(PCCARD_CFE_IRQSHARE 1138 | PCCARD_CFE_IRQPULSE 1139 | PCCARD_CFE_IRQLEVEL); 1140 if (reg & PCCARD_TPCE_IR_SHARE) 1141 cfe->flags |= PCCARD_CFE_IRQSHARE; 1142 if (reg & PCCARD_TPCE_IR_PULSE) 1143 cfe->flags |= PCCARD_CFE_IRQPULSE; 1144 if (reg & PCCARD_TPCE_IR_LEVEL) --- 36 unchanged lines hidden (view full) --- 1181 pccard_tuple_read_2(tuple, idx); 1182 idx += 2; 1183 cfe->memspace[0].hostaddr = cfe->memspace[0].cardaddr; 1184 } else { 1185 int lengthsize; 1186 int cardaddrsize; 1187 int hostaddrsize; 1188 | 1124 cfe->flags &= ~(PCCARD_CFE_IRQSHARE 1125 | PCCARD_CFE_IRQPULSE 1126 | PCCARD_CFE_IRQLEVEL); 1127 if (reg & PCCARD_TPCE_IR_SHARE) 1128 cfe->flags |= PCCARD_CFE_IRQSHARE; 1129 if (reg & PCCARD_TPCE_IR_PULSE) 1130 cfe->flags |= PCCARD_CFE_IRQPULSE; 1131 if (reg & PCCARD_TPCE_IR_LEVEL) --- 36 unchanged lines hidden (view full) --- 1168 pccard_tuple_read_2(tuple, idx); 1169 idx += 2; 1170 cfe->memspace[0].hostaddr = cfe->memspace[0].cardaddr; 1171 } else { 1172 int lengthsize; 1173 int cardaddrsize; 1174 int hostaddrsize; 1175 |
1189 reg = pccard_tuple_read_1(tuple, idx); 1190 idx++; 1191 | 1176 reg = pccard_tuple_read_1(tuple, idx++); |
1192 cfe->num_memspace = (reg & 1193 PCCARD_TPCE_MS_COUNT) + 1; | 1177 cfe->num_memspace = (reg & 1178 PCCARD_TPCE_MS_COUNT) + 1; |
1194 | |
1195 if (cfe->num_memspace > 1196 (sizeof(cfe->memspace) / 1197 sizeof(cfe->memspace[0]))) { 1198 DPRINTF(("too many mem " 1199 "spaces %d", 1200 cfe->num_memspace)); 1201 state->card->error++; 1202 break; --- 47 unchanged lines hidden (view full) --- 1250 } else 1251 cfe->num_memspace = 0; 1252 if (misc) { 1253 if (tuple->length <= idx) { 1254 DPRINTF(("ran out of space before TCPE_MI\n")); 1255 goto abort_cfe; 1256 } 1257 | 1179 if (cfe->num_memspace > 1180 (sizeof(cfe->memspace) / 1181 sizeof(cfe->memspace[0]))) { 1182 DPRINTF(("too many mem " 1183 "spaces %d", 1184 cfe->num_memspace)); 1185 state->card->error++; 1186 break; --- 47 unchanged lines hidden (view full) --- 1234 } else 1235 cfe->num_memspace = 0; 1236 if (misc) { 1237 if (tuple->length <= idx) { 1238 DPRINTF(("ran out of space before TCPE_MI\n")); 1239 goto abort_cfe; 1240 } 1241 |
1258 reg = pccard_tuple_read_1(tuple, idx); 1259 idx++; | 1242 reg = pccard_tuple_read_1(tuple, idx++); |
1260 cfe->flags &= ~(PCCARD_CFE_POWERDOWN 1261 | PCCARD_CFE_READONLY 1262 | PCCARD_CFE_AUDIO); 1263 if (reg & PCCARD_TPCE_MI_PWRDOWN) 1264 cfe->flags |= PCCARD_CFE_POWERDOWN; 1265 if (reg & PCCARD_TPCE_MI_READONLY) 1266 cfe->flags |= PCCARD_CFE_READONLY; 1267 if (reg & PCCARD_TPCE_MI_AUDIO) 1268 cfe->flags |= PCCARD_CFE_AUDIO; 1269 cfe->maxtwins = reg & PCCARD_TPCE_MI_MAXTWINS; 1270 1271 while (reg & PCCARD_TPCE_MI_EXT) { | 1243 cfe->flags &= ~(PCCARD_CFE_POWERDOWN 1244 | PCCARD_CFE_READONLY 1245 | PCCARD_CFE_AUDIO); 1246 if (reg & PCCARD_TPCE_MI_PWRDOWN) 1247 cfe->flags |= PCCARD_CFE_POWERDOWN; 1248 if (reg & PCCARD_TPCE_MI_READONLY) 1249 cfe->flags |= PCCARD_CFE_READONLY; 1250 if (reg & PCCARD_TPCE_MI_AUDIO) 1251 cfe->flags |= PCCARD_CFE_AUDIO; 1252 cfe->maxtwins = reg & PCCARD_TPCE_MI_MAXTWINS; 1253 1254 while (reg & PCCARD_TPCE_MI_EXT) { |
1272 reg = pccard_tuple_read_1(tuple, idx); 1273 idx++; | 1255 reg = pccard_tuple_read_1(tuple, idx++); |
1274 } 1275 } 1276 /* skip all the subtuples */ 1277 } 1278 1279 abort_cfe: 1280 DPRINTF(("CISTPL_CFTABLE_ENTRY\n")); 1281 break; --- 41 unchanged lines hidden --- | 1256 } 1257 } 1258 /* skip all the subtuples */ 1259 } 1260 1261 abort_cfe: 1262 DPRINTF(("CISTPL_CFTABLE_ENTRY\n")); 1263 break; --- 41 unchanged lines hidden --- |