diff options
Diffstat (limited to 'drivers/s390/crypto/z90hardware.c')
-rw-r--r-- | drivers/s390/crypto/z90hardware.c | 301 |
1 files changed, 293 insertions, 8 deletions
diff --git a/drivers/s390/crypto/z90hardware.c b/drivers/s390/crypto/z90hardware.c index c215e0889736..7c3ed52e03e1 100644 --- a/drivers/s390/crypto/z90hardware.c +++ b/drivers/s390/crypto/z90hardware.c | |||
@@ -1,9 +1,9 @@ | |||
1 | /* | 1 | /* |
2 | * linux/drivers/s390/crypto/z90hardware.c | 2 | * linux/drivers/s390/crypto/z90hardware.c |
3 | * | 3 | * |
4 | * z90crypt 1.3.2 | 4 | * z90crypt 1.3.3 |
5 | * | 5 | * |
6 | * Copyright (C) 2001, 2004 IBM Corporation | 6 | * Copyright (C) 2001, 2005 IBM Corporation |
7 | * Author(s): Robert Burroughs (burrough@us.ibm.com) | 7 | * Author(s): Robert Burroughs (burrough@us.ibm.com) |
8 | * Eric Rossman (edrossma@us.ibm.com) | 8 | * Eric Rossman (edrossma@us.ibm.com) |
9 | * | 9 | * |
@@ -648,6 +648,87 @@ static struct cca_public_sec static_cca_pub_sec = { | |||
648 | #define RESPONSE_CPRB_SIZE 0x000006B8 | 648 | #define RESPONSE_CPRB_SIZE 0x000006B8 |
649 | #define RESPONSE_CPRBX_SIZE 0x00000724 | 649 | #define RESPONSE_CPRBX_SIZE 0x00000724 |
650 | 650 | ||
651 | struct type50_hdr { | ||
652 | u8 reserved1; | ||
653 | u8 msg_type_code; | ||
654 | u16 msg_len; | ||
655 | u8 reserved2; | ||
656 | u8 ignored; | ||
657 | u16 reserved3; | ||
658 | }; | ||
659 | |||
660 | #define TYPE50_TYPE_CODE 0x50 | ||
661 | |||
662 | #define TYPE50_MEB1_LEN (sizeof(struct type50_meb1_msg)) | ||
663 | #define TYPE50_MEB2_LEN (sizeof(struct type50_meb2_msg)) | ||
664 | #define TYPE50_CRB1_LEN (sizeof(struct type50_crb1_msg)) | ||
665 | #define TYPE50_CRB2_LEN (sizeof(struct type50_crb2_msg)) | ||
666 | |||
667 | #define TYPE50_MEB1_FMT 0x0001 | ||
668 | #define TYPE50_MEB2_FMT 0x0002 | ||
669 | #define TYPE50_CRB1_FMT 0x0011 | ||
670 | #define TYPE50_CRB2_FMT 0x0012 | ||
671 | |||
672 | struct type50_meb1_msg { | ||
673 | struct type50_hdr header; | ||
674 | u16 keyblock_type; | ||
675 | u8 reserved[6]; | ||
676 | u8 exponent[128]; | ||
677 | u8 modulus[128]; | ||
678 | u8 message[128]; | ||
679 | }; | ||
680 | |||
681 | struct type50_meb2_msg { | ||
682 | struct type50_hdr header; | ||
683 | u16 keyblock_type; | ||
684 | u8 reserved[6]; | ||
685 | u8 exponent[256]; | ||
686 | u8 modulus[256]; | ||
687 | u8 message[256]; | ||
688 | }; | ||
689 | |||
690 | struct type50_crb1_msg { | ||
691 | struct type50_hdr header; | ||
692 | u16 keyblock_type; | ||
693 | u8 reserved[6]; | ||
694 | u8 p[64]; | ||
695 | u8 q[64]; | ||
696 | u8 dp[64]; | ||
697 | u8 dq[64]; | ||
698 | u8 u[64]; | ||
699 | u8 message[128]; | ||
700 | }; | ||
701 | |||
702 | struct type50_crb2_msg { | ||
703 | struct type50_hdr header; | ||
704 | u16 keyblock_type; | ||
705 | u8 reserved[6]; | ||
706 | u8 p[128]; | ||
707 | u8 q[128]; | ||
708 | u8 dp[128]; | ||
709 | u8 dq[128]; | ||
710 | u8 u[128]; | ||
711 | u8 message[256]; | ||
712 | }; | ||
713 | |||
714 | union type50_msg { | ||
715 | struct type50_meb1_msg meb1; | ||
716 | struct type50_meb2_msg meb2; | ||
717 | struct type50_crb1_msg crb1; | ||
718 | struct type50_crb2_msg crb2; | ||
719 | }; | ||
720 | |||
721 | struct type80_hdr { | ||
722 | u8 reserved1; | ||
723 | u8 type; | ||
724 | u16 len; | ||
725 | u8 code; | ||
726 | u8 reserved2[3]; | ||
727 | u8 reserved3[8]; | ||
728 | }; | ||
729 | |||
730 | #define TYPE80_RSP_CODE 0x80 | ||
731 | |||
651 | struct error_hdr { | 732 | struct error_hdr { |
652 | unsigned char reserved1; | 733 | unsigned char reserved1; |
653 | unsigned char type; | 734 | unsigned char type; |
@@ -657,6 +738,7 @@ struct error_hdr { | |||
657 | }; | 738 | }; |
658 | 739 | ||
659 | #define TYPE82_RSP_CODE 0x82 | 740 | #define TYPE82_RSP_CODE 0x82 |
741 | #define TYPE88_RSP_CODE 0x88 | ||
660 | 742 | ||
661 | #define REP82_ERROR_MACHINE_FAILURE 0x10 | 743 | #define REP82_ERROR_MACHINE_FAILURE 0x10 |
662 | #define REP82_ERROR_PREEMPT_FAILURE 0x12 | 744 | #define REP82_ERROR_PREEMPT_FAILURE 0x12 |
@@ -679,6 +761,22 @@ struct error_hdr { | |||
679 | #define REP82_ERROR_PACKET_TRUNCATED 0xA0 | 761 | #define REP82_ERROR_PACKET_TRUNCATED 0xA0 |
680 | #define REP82_ERROR_ZERO_BUFFER_LEN 0xB0 | 762 | #define REP82_ERROR_ZERO_BUFFER_LEN 0xB0 |
681 | 763 | ||
764 | #define REP88_ERROR_MODULE_FAILURE 0x10 | ||
765 | #define REP88_ERROR_MODULE_TIMEOUT 0x11 | ||
766 | #define REP88_ERROR_MODULE_NOTINIT 0x13 | ||
767 | #define REP88_ERROR_MODULE_NOTAVAIL 0x14 | ||
768 | #define REP88_ERROR_MODULE_DISABLED 0x15 | ||
769 | #define REP88_ERROR_MODULE_IN_DIAGN 0x17 | ||
770 | #define REP88_ERROR_FASTPATH_DISABLD 0x19 | ||
771 | #define REP88_ERROR_MESSAGE_TYPE 0x20 | ||
772 | #define REP88_ERROR_MESSAGE_MALFORMD 0x22 | ||
773 | #define REP88_ERROR_MESSAGE_LENGTH 0x23 | ||
774 | #define REP88_ERROR_RESERVED_FIELD 0x24 | ||
775 | #define REP88_ERROR_KEY_TYPE 0x34 | ||
776 | #define REP88_ERROR_INVALID_KEY 0x82 | ||
777 | #define REP88_ERROR_OPERAND 0x84 | ||
778 | #define REP88_ERROR_OPERAND_EVEN_MOD 0x85 | ||
779 | |||
682 | #define CALLER_HEADER 12 | 780 | #define CALLER_HEADER 12 |
683 | 781 | ||
684 | static inline int | 782 | static inline int |
@@ -1029,10 +1127,6 @@ query_online(int deviceNr, int cdx, int resetNr, int *q_depth, int *dev_type) | |||
1029 | stat = HD_ONLINE; | 1127 | stat = HD_ONLINE; |
1030 | *q_depth = t_depth + 1; | 1128 | *q_depth = t_depth + 1; |
1031 | switch (t_dev_type) { | 1129 | switch (t_dev_type) { |
1032 | case OTHER_HW: | ||
1033 | stat = HD_NOT_THERE; | ||
1034 | *dev_type = NILDEV; | ||
1035 | break; | ||
1036 | case PCICA_HW: | 1130 | case PCICA_HW: |
1037 | *dev_type = PCICA; | 1131 | *dev_type = PCICA; |
1038 | break; | 1132 | break; |
@@ -1045,6 +1139,9 @@ query_online(int deviceNr, int cdx, int resetNr, int *q_depth, int *dev_type) | |||
1045 | case CEX2C_HW: | 1139 | case CEX2C_HW: |
1046 | *dev_type = CEX2C; | 1140 | *dev_type = CEX2C; |
1047 | break; | 1141 | break; |
1142 | case CEX2A_HW: | ||
1143 | *dev_type = CEX2A; | ||
1144 | break; | ||
1048 | default: | 1145 | default: |
1049 | *dev_type = NILDEV; | 1146 | *dev_type = NILDEV; |
1050 | break; | 1147 | break; |
@@ -2029,6 +2126,177 @@ ICACRT_msg_to_type6CRT_msgX(struct ica_rsa_modexpo_crt *icaMsg_p, int cdx, | |||
2029 | return 0; | 2126 | return 0; |
2030 | } | 2127 | } |
2031 | 2128 | ||
2129 | static int | ||
2130 | ICAMEX_msg_to_type50MEX_msg(struct ica_rsa_modexpo *icaMex_p, int *z90cMsg_l_p, | ||
2131 | union type50_msg *z90cMsg_p) | ||
2132 | { | ||
2133 | int mod_len, msg_size, mod_tgt_len, exp_tgt_len, inp_tgt_len; | ||
2134 | unsigned char *mod_tgt, *exp_tgt, *inp_tgt; | ||
2135 | union type50_msg *tmp_type50_msg; | ||
2136 | |||
2137 | mod_len = icaMex_p->inputdatalength; | ||
2138 | |||
2139 | msg_size = ((mod_len <= 128) ? TYPE50_MEB1_LEN : TYPE50_MEB2_LEN) + | ||
2140 | CALLER_HEADER; | ||
2141 | |||
2142 | memset(z90cMsg_p, 0, msg_size); | ||
2143 | |||
2144 | tmp_type50_msg = (union type50_msg *) | ||
2145 | ((unsigned char *) z90cMsg_p + CALLER_HEADER); | ||
2146 | |||
2147 | tmp_type50_msg->meb1.header.msg_type_code = TYPE50_TYPE_CODE; | ||
2148 | |||
2149 | if (mod_len <= 128) { | ||
2150 | tmp_type50_msg->meb1.header.msg_len = TYPE50_MEB1_LEN; | ||
2151 | tmp_type50_msg->meb1.keyblock_type = TYPE50_MEB1_FMT; | ||
2152 | mod_tgt = tmp_type50_msg->meb1.modulus; | ||
2153 | mod_tgt_len = sizeof(tmp_type50_msg->meb1.modulus); | ||
2154 | exp_tgt = tmp_type50_msg->meb1.exponent; | ||
2155 | exp_tgt_len = sizeof(tmp_type50_msg->meb1.exponent); | ||
2156 | inp_tgt = tmp_type50_msg->meb1.message; | ||
2157 | inp_tgt_len = sizeof(tmp_type50_msg->meb1.message); | ||
2158 | } else { | ||
2159 | tmp_type50_msg->meb2.header.msg_len = TYPE50_MEB2_LEN; | ||
2160 | tmp_type50_msg->meb2.keyblock_type = TYPE50_MEB2_FMT; | ||
2161 | mod_tgt = tmp_type50_msg->meb2.modulus; | ||
2162 | mod_tgt_len = sizeof(tmp_type50_msg->meb2.modulus); | ||
2163 | exp_tgt = tmp_type50_msg->meb2.exponent; | ||
2164 | exp_tgt_len = sizeof(tmp_type50_msg->meb2.exponent); | ||
2165 | inp_tgt = tmp_type50_msg->meb2.message; | ||
2166 | inp_tgt_len = sizeof(tmp_type50_msg->meb2.message); | ||
2167 | } | ||
2168 | |||
2169 | mod_tgt += (mod_tgt_len - mod_len); | ||
2170 | if (copy_from_user(mod_tgt, icaMex_p->n_modulus, mod_len)) | ||
2171 | return SEN_RELEASED; | ||
2172 | if (is_empty(mod_tgt, mod_len)) | ||
2173 | return SEN_USER_ERROR; | ||
2174 | exp_tgt += (exp_tgt_len - mod_len); | ||
2175 | if (copy_from_user(exp_tgt, icaMex_p->b_key, mod_len)) | ||
2176 | return SEN_RELEASED; | ||
2177 | if (is_empty(exp_tgt, mod_len)) | ||
2178 | return SEN_USER_ERROR; | ||
2179 | inp_tgt += (inp_tgt_len - mod_len); | ||
2180 | if (copy_from_user(inp_tgt, icaMex_p->inputdata, mod_len)) | ||
2181 | return SEN_RELEASED; | ||
2182 | if (is_empty(inp_tgt, mod_len)) | ||
2183 | return SEN_USER_ERROR; | ||
2184 | |||
2185 | *z90cMsg_l_p = msg_size - CALLER_HEADER; | ||
2186 | |||
2187 | return 0; | ||
2188 | } | ||
2189 | |||
2190 | static int | ||
2191 | ICACRT_msg_to_type50CRT_msg(struct ica_rsa_modexpo_crt *icaMsg_p, | ||
2192 | int *z90cMsg_l_p, union type50_msg *z90cMsg_p) | ||
2193 | { | ||
2194 | int mod_len, short_len, long_len, tmp_size, p_tgt_len, q_tgt_len, | ||
2195 | dp_tgt_len, dq_tgt_len, u_tgt_len, inp_tgt_len, long_offset; | ||
2196 | unsigned char *p_tgt, *q_tgt, *dp_tgt, *dq_tgt, *u_tgt, *inp_tgt, | ||
2197 | temp[8]; | ||
2198 | union type50_msg *tmp_type50_msg; | ||
2199 | |||
2200 | mod_len = icaMsg_p->inputdatalength; | ||
2201 | short_len = mod_len / 2; | ||
2202 | long_len = mod_len / 2 + 8; | ||
2203 | long_offset = 0; | ||
2204 | |||
2205 | if (long_len > 128) { | ||
2206 | memset(temp, 0x00, sizeof(temp)); | ||
2207 | if (copy_from_user(temp, icaMsg_p->np_prime, long_len-128)) | ||
2208 | return SEN_RELEASED; | ||
2209 | if (!is_empty(temp, 8)) | ||
2210 | return SEN_NOT_AVAIL; | ||
2211 | if (copy_from_user(temp, icaMsg_p->bp_key, long_len-128)) | ||
2212 | return SEN_RELEASED; | ||
2213 | if (!is_empty(temp, 8)) | ||
2214 | return SEN_NOT_AVAIL; | ||
2215 | if (copy_from_user(temp, icaMsg_p->u_mult_inv, long_len-128)) | ||
2216 | return SEN_RELEASED; | ||
2217 | if (!is_empty(temp, 8)) | ||
2218 | return SEN_NOT_AVAIL; | ||
2219 | long_offset = long_len - 128; | ||
2220 | long_len = 128; | ||
2221 | } | ||
2222 | |||
2223 | tmp_size = ((mod_len <= 128) ? TYPE50_CRB1_LEN : TYPE50_CRB2_LEN) + | ||
2224 | CALLER_HEADER; | ||
2225 | |||
2226 | memset(z90cMsg_p, 0, tmp_size); | ||
2227 | |||
2228 | tmp_type50_msg = (union type50_msg *) | ||
2229 | ((unsigned char *) z90cMsg_p + CALLER_HEADER); | ||
2230 | |||
2231 | tmp_type50_msg->crb1.header.msg_type_code = TYPE50_TYPE_CODE; | ||
2232 | if (long_len <= 64) { | ||
2233 | tmp_type50_msg->crb1.header.msg_len = TYPE50_CRB1_LEN; | ||
2234 | tmp_type50_msg->crb1.keyblock_type = TYPE50_CRB1_FMT; | ||
2235 | p_tgt = tmp_type50_msg->crb1.p; | ||
2236 | p_tgt_len = sizeof(tmp_type50_msg->crb1.p); | ||
2237 | q_tgt = tmp_type50_msg->crb1.q; | ||
2238 | q_tgt_len = sizeof(tmp_type50_msg->crb1.q); | ||
2239 | dp_tgt = tmp_type50_msg->crb1.dp; | ||
2240 | dp_tgt_len = sizeof(tmp_type50_msg->crb1.dp); | ||
2241 | dq_tgt = tmp_type50_msg->crb1.dq; | ||
2242 | dq_tgt_len = sizeof(tmp_type50_msg->crb1.dq); | ||
2243 | u_tgt = tmp_type50_msg->crb1.u; | ||
2244 | u_tgt_len = sizeof(tmp_type50_msg->crb1.u); | ||
2245 | inp_tgt = tmp_type50_msg->crb1.message; | ||
2246 | inp_tgt_len = sizeof(tmp_type50_msg->crb1.message); | ||
2247 | } else { | ||
2248 | tmp_type50_msg->crb2.header.msg_len = TYPE50_CRB2_LEN; | ||
2249 | tmp_type50_msg->crb2.keyblock_type = TYPE50_CRB2_FMT; | ||
2250 | p_tgt = tmp_type50_msg->crb2.p; | ||
2251 | p_tgt_len = sizeof(tmp_type50_msg->crb2.p); | ||
2252 | q_tgt = tmp_type50_msg->crb2.q; | ||
2253 | q_tgt_len = sizeof(tmp_type50_msg->crb2.q); | ||
2254 | dp_tgt = tmp_type50_msg->crb2.dp; | ||
2255 | dp_tgt_len = sizeof(tmp_type50_msg->crb2.dp); | ||
2256 | dq_tgt = tmp_type50_msg->crb2.dq; | ||
2257 | dq_tgt_len = sizeof(tmp_type50_msg->crb2.dq); | ||
2258 | u_tgt = tmp_type50_msg->crb2.u; | ||
2259 | u_tgt_len = sizeof(tmp_type50_msg->crb2.u); | ||
2260 | inp_tgt = tmp_type50_msg->crb2.message; | ||
2261 | inp_tgt_len = sizeof(tmp_type50_msg->crb2.message); | ||
2262 | } | ||
2263 | |||
2264 | p_tgt += (p_tgt_len - long_len); | ||
2265 | if (copy_from_user(p_tgt, icaMsg_p->np_prime + long_offset, long_len)) | ||
2266 | return SEN_RELEASED; | ||
2267 | if (is_empty(p_tgt, long_len)) | ||
2268 | return SEN_USER_ERROR; | ||
2269 | q_tgt += (q_tgt_len - short_len); | ||
2270 | if (copy_from_user(q_tgt, icaMsg_p->nq_prime, short_len)) | ||
2271 | return SEN_RELEASED; | ||
2272 | if (is_empty(q_tgt, short_len)) | ||
2273 | return SEN_USER_ERROR; | ||
2274 | dp_tgt += (dp_tgt_len - long_len); | ||
2275 | if (copy_from_user(dp_tgt, icaMsg_p->bp_key + long_offset, long_len)) | ||
2276 | return SEN_RELEASED; | ||
2277 | if (is_empty(dp_tgt, long_len)) | ||
2278 | return SEN_USER_ERROR; | ||
2279 | dq_tgt += (dq_tgt_len - short_len); | ||
2280 | if (copy_from_user(dq_tgt, icaMsg_p->bq_key, short_len)) | ||
2281 | return SEN_RELEASED; | ||
2282 | if (is_empty(dq_tgt, short_len)) | ||
2283 | return SEN_USER_ERROR; | ||
2284 | u_tgt += (u_tgt_len - long_len); | ||
2285 | if (copy_from_user(u_tgt, icaMsg_p->u_mult_inv + long_offset, long_len)) | ||
2286 | return SEN_RELEASED; | ||
2287 | if (is_empty(u_tgt, long_len)) | ||
2288 | return SEN_USER_ERROR; | ||
2289 | inp_tgt += (inp_tgt_len - mod_len); | ||
2290 | if (copy_from_user(inp_tgt, icaMsg_p->inputdata, mod_len)) | ||
2291 | return SEN_RELEASED; | ||
2292 | if (is_empty(inp_tgt, mod_len)) | ||
2293 | return SEN_USER_ERROR; | ||
2294 | |||
2295 | *z90cMsg_l_p = tmp_size - CALLER_HEADER; | ||
2296 | |||
2297 | return 0; | ||
2298 | } | ||
2299 | |||
2032 | int | 2300 | int |
2033 | convert_request(unsigned char *buffer, int func, unsigned short function, | 2301 | convert_request(unsigned char *buffer, int func, unsigned short function, |
2034 | int cdx, int dev_type, int *msg_l_p, unsigned char *msg_p) | 2302 | int cdx, int dev_type, int *msg_l_p, unsigned char *msg_p) |
@@ -2071,6 +2339,16 @@ convert_request(unsigned char *buffer, int func, unsigned short function, | |||
2071 | cdx, msg_l_p, (struct type6_msg *) msg_p, | 2339 | cdx, msg_l_p, (struct type6_msg *) msg_p, |
2072 | dev_type); | 2340 | dev_type); |
2073 | } | 2341 | } |
2342 | if (dev_type == CEX2A) { | ||
2343 | if (func == ICARSACRT) | ||
2344 | return ICACRT_msg_to_type50CRT_msg( | ||
2345 | (struct ica_rsa_modexpo_crt *) buffer, | ||
2346 | msg_l_p, (union type50_msg *) msg_p); | ||
2347 | else | ||
2348 | return ICAMEX_msg_to_type50MEX_msg( | ||
2349 | (struct ica_rsa_modexpo *) buffer, | ||
2350 | msg_l_p, (union type50_msg *) msg_p); | ||
2351 | } | ||
2074 | 2352 | ||
2075 | return 0; | 2353 | return 0; |
2076 | } | 2354 | } |
@@ -2081,8 +2359,8 @@ unset_ext_bitlens(void) | |||
2081 | { | 2359 | { |
2082 | if (!ext_bitlens_msg_count) { | 2360 | if (!ext_bitlens_msg_count) { |
2083 | PRINTK("Unable to use coprocessors for extended bitlengths. " | 2361 | PRINTK("Unable to use coprocessors for extended bitlengths. " |
2084 | "Using PCICAs (if present) for extended bitlengths. " | 2362 | "Using PCICAs/CEX2As (if present) for extended " |
2085 | "This is not an error.\n"); | 2363 | "bitlengths. This is not an error.\n"); |
2086 | ext_bitlens_msg_count++; | 2364 | ext_bitlens_msg_count++; |
2087 | } | 2365 | } |
2088 | ext_bitlens = 0; | 2366 | ext_bitlens = 0; |
@@ -2094,6 +2372,7 @@ convert_response(unsigned char *response, unsigned char *buffer, | |||
2094 | { | 2372 | { |
2095 | struct ica_rsa_modexpo *icaMsg_p = (struct ica_rsa_modexpo *) buffer; | 2373 | struct ica_rsa_modexpo *icaMsg_p = (struct ica_rsa_modexpo *) buffer; |
2096 | struct error_hdr *errh_p = (struct error_hdr *) response; | 2374 | struct error_hdr *errh_p = (struct error_hdr *) response; |
2375 | struct type80_hdr *t80h_p = (struct type80_hdr *) response; | ||
2097 | struct type84_hdr *t84h_p = (struct type84_hdr *) response; | 2376 | struct type84_hdr *t84h_p = (struct type84_hdr *) response; |
2098 | struct type86_fmt2_msg *t86m_p = (struct type86_fmt2_msg *) response; | 2377 | struct type86_fmt2_msg *t86m_p = (struct type86_fmt2_msg *) response; |
2099 | int reply_code, service_rc, service_rs, src_l; | 2378 | int reply_code, service_rc, service_rs, src_l; |
@@ -2108,6 +2387,7 @@ convert_response(unsigned char *response, unsigned char *buffer, | |||
2108 | src_l = 0; | 2387 | src_l = 0; |
2109 | switch (errh_p->type) { | 2388 | switch (errh_p->type) { |
2110 | case TYPE82_RSP_CODE: | 2389 | case TYPE82_RSP_CODE: |
2390 | case TYPE88_RSP_CODE: | ||
2111 | reply_code = errh_p->reply_code; | 2391 | reply_code = errh_p->reply_code; |
2112 | src_p = (unsigned char *)errh_p; | 2392 | src_p = (unsigned char *)errh_p; |
2113 | PRINTK("Hardware error: Type %02X Message Header: " | 2393 | PRINTK("Hardware error: Type %02X Message Header: " |
@@ -2116,6 +2396,10 @@ convert_response(unsigned char *response, unsigned char *buffer, | |||
2116 | src_p[0], src_p[1], src_p[2], src_p[3], | 2396 | src_p[0], src_p[1], src_p[2], src_p[3], |
2117 | src_p[4], src_p[5], src_p[6], src_p[7]); | 2397 | src_p[4], src_p[5], src_p[6], src_p[7]); |
2118 | break; | 2398 | break; |
2399 | case TYPE80_RSP_CODE: | ||
2400 | src_l = icaMsg_p->outputdatalength; | ||
2401 | src_p = response + (int)t80h_p->len - src_l; | ||
2402 | break; | ||
2119 | case TYPE84_RSP_CODE: | 2403 | case TYPE84_RSP_CODE: |
2120 | src_l = icaMsg_p->outputdatalength; | 2404 | src_l = icaMsg_p->outputdatalength; |
2121 | src_p = response + (int)t84h_p->len - src_l; | 2405 | src_p = response + (int)t84h_p->len - src_l; |
@@ -2202,6 +2486,7 @@ convert_response(unsigned char *response, unsigned char *buffer, | |||
2202 | if (reply_code) | 2486 | if (reply_code) |
2203 | switch (reply_code) { | 2487 | switch (reply_code) { |
2204 | case REP82_ERROR_OPERAND_INVALID: | 2488 | case REP82_ERROR_OPERAND_INVALID: |
2489 | case REP88_ERROR_MESSAGE_MALFORMD: | ||
2205 | return REC_OPERAND_INV; | 2490 | return REC_OPERAND_INV; |
2206 | case REP82_ERROR_OPERAND_SIZE: | 2491 | case REP82_ERROR_OPERAND_SIZE: |
2207 | return REC_OPERAND_SIZE; | 2492 | return REC_OPERAND_SIZE; |