161 int ec_fsm_soe_success(ec_fsm_soe_t *fsm /**< Finite state machine */) |
161 int ec_fsm_soe_success(ec_fsm_soe_t *fsm /**< Finite state machine */) |
162 { |
162 { |
163 return fsm->state == ec_fsm_soe_end; |
163 return fsm->state == ec_fsm_soe_end; |
164 } |
164 } |
165 |
165 |
|
166 /*****************************************************************************/ |
|
167 |
|
168 /** Output information about a failed SoE transfer. |
|
169 */ |
|
170 void ec_fsm_soe_print_error(ec_fsm_soe_t *fsm /**< Finite state machine */) |
|
171 { |
|
172 ec_soe_request_t *request = fsm->request; |
|
173 |
|
174 EC_ERR(""); |
|
175 |
|
176 if (request->dir == EC_DIR_OUTPUT) { |
|
177 printk("Writing"); |
|
178 } else { |
|
179 printk("Reading"); |
|
180 } |
|
181 |
|
182 printk("IDN 0x%04X failed on slave %u.\n", |
|
183 request->idn, fsm->slave->ring_position); |
|
184 } |
|
185 |
166 /****************************************************************************** |
186 /****************************************************************************** |
167 * SoE read state machine |
187 * SoE read state machine |
168 *****************************************************************************/ |
188 *****************************************************************************/ |
169 |
189 |
170 /** SoE state: READ START. |
190 /** SoE state: READ START. |
180 if (master->debug_level) |
200 if (master->debug_level) |
181 EC_DBG("Reading IDN 0x%04X from slave %u.\n", |
201 EC_DBG("Reading IDN 0x%04X from slave %u.\n", |
182 request->idn, slave->ring_position); |
202 request->idn, slave->ring_position); |
183 |
203 |
184 if (!(slave->sii.mailbox_protocols & EC_MBOX_SOE)) { |
204 if (!(slave->sii.mailbox_protocols & EC_MBOX_SOE)) { |
185 EC_ERR("Slave %u does not support SoE!\n", slave->ring_position); |
205 EC_ERR("Slave does not support SoE!\n"); |
186 fsm->state = ec_fsm_soe_error; |
206 fsm->state = ec_fsm_soe_error; |
|
207 ec_fsm_soe_print_error(fsm); |
187 return; |
208 return; |
188 } |
209 } |
189 |
210 |
190 data = ec_slave_mbox_prepare_send(slave, datagram, EC_MBOX_TYPE_SOE, |
211 data = ec_slave_mbox_prepare_send(slave, datagram, EC_MBOX_TYPE_SOE, |
191 EC_SOE_READ_REQUEST_SIZE); |
212 EC_SOE_READ_REQUEST_SIZE); |
192 if (IS_ERR(data)) { |
213 if (IS_ERR(data)) { |
193 fsm->state = ec_fsm_soe_error; |
214 fsm->state = ec_fsm_soe_error; |
|
215 ec_fsm_soe_print_error(fsm); |
194 return; |
216 return; |
195 } |
217 } |
196 |
218 |
197 EC_WRITE_U8(data, EC_SOE_OPCODE_READ_REQUEST); |
219 EC_WRITE_U8(data, EC_SOE_OPCODE_READ_REQUEST); |
198 EC_WRITE_U8(data + 1, 1 << 6); // request value |
220 EC_WRITE_U8(data + 1, 1 << 6); // request value |
222 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
244 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
223 return; // FIXME: check for response first? |
245 return; // FIXME: check for response first? |
224 |
246 |
225 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
247 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
226 fsm->state = ec_fsm_soe_error; |
248 fsm->state = ec_fsm_soe_error; |
227 EC_ERR("Failed to receive SoE read request for slave %u: ", |
249 EC_ERR("Failed to receive SoE read request: "); |
228 slave->ring_position); |
|
229 ec_datagram_print_state(datagram); |
250 ec_datagram_print_state(datagram); |
|
251 ec_fsm_soe_print_error(fsm); |
230 return; |
252 return; |
231 } |
253 } |
232 |
254 |
233 diff_ms = (jiffies - fsm->request->jiffies_sent) * 1000 / HZ; |
255 diff_ms = (jiffies - fsm->request->jiffies_sent) * 1000 / HZ; |
234 |
256 |
238 // no response; send request datagram again |
260 // no response; send request datagram again |
239 return; |
261 return; |
240 } |
262 } |
241 } |
263 } |
242 fsm->state = ec_fsm_soe_error; |
264 fsm->state = ec_fsm_soe_error; |
243 EC_ERR("Reception of SoE read request for IDN 0x%04x failed" |
265 EC_ERR("Reception of SoE read request failed after %u ms: ", |
244 " after %u ms on slave %u: ", |
266 (u32) diff_ms); |
245 fsm->request->idn, (u32) diff_ms, |
|
246 fsm->slave->ring_position); |
|
247 ec_datagram_print_wc_error(datagram); |
267 ec_datagram_print_wc_error(datagram); |
|
268 ec_fsm_soe_print_error(fsm); |
248 return; |
269 return; |
249 } |
270 } |
250 |
271 |
251 fsm->jiffies_start = datagram->jiffies_sent; |
272 fsm->jiffies_start = datagram->jiffies_sent; |
252 ec_slave_mbox_prepare_check(slave, datagram); // can not fail. |
273 ec_slave_mbox_prepare_check(slave, datagram); // can not fail. |
266 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
287 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
267 return; |
288 return; |
268 |
289 |
269 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
290 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
270 fsm->state = ec_fsm_soe_error; |
291 fsm->state = ec_fsm_soe_error; |
271 EC_ERR("Failed to receive SoE mailbox check datagram from slave %u: ", |
292 EC_ERR("Failed to receive SoE mailbox check datagram: "); |
272 slave->ring_position); |
|
273 ec_datagram_print_state(datagram); |
293 ec_datagram_print_state(datagram); |
|
294 ec_fsm_soe_print_error(fsm); |
274 return; |
295 return; |
275 } |
296 } |
276 |
297 |
277 if (datagram->working_counter != 1) { |
298 if (datagram->working_counter != 1) { |
278 fsm->state = ec_fsm_soe_error; |
299 fsm->state = ec_fsm_soe_error; |
279 EC_ERR("Reception of SoE mailbox check datagram failed on slave %u: ", |
300 EC_ERR("Reception of SoE mailbox check datagram failed: "); |
280 slave->ring_position); |
|
281 ec_datagram_print_wc_error(datagram); |
301 ec_datagram_print_wc_error(datagram); |
|
302 ec_fsm_soe_print_error(fsm); |
282 return; |
303 return; |
283 } |
304 } |
284 |
305 |
285 if (!ec_slave_mbox_check(datagram)) { |
306 if (!ec_slave_mbox_check(datagram)) { |
286 unsigned long diff_ms = |
307 unsigned long diff_ms = |
287 (datagram->jiffies_received - fsm->jiffies_start) * 1000 / HZ; |
308 (datagram->jiffies_received - fsm->jiffies_start) * 1000 / HZ; |
288 if (diff_ms >= EC_SOE_RESPONSE_TIMEOUT) { |
309 if (diff_ms >= EC_SOE_RESPONSE_TIMEOUT) { |
289 fsm->state = ec_fsm_soe_error; |
310 fsm->state = ec_fsm_soe_error; |
290 EC_ERR("Timeout after %u ms while waiting for IDN 0x%04x" |
311 EC_ERR("Timeout after %u ms while waiting for read response.\n", |
291 " read response on slave %u.\n", (u32) diff_ms, |
312 (u32) diff_ms); |
292 fsm->request->idn, slave->ring_position); |
313 ec_fsm_soe_print_error(fsm); |
293 return; |
314 return; |
294 } |
315 } |
295 |
316 |
296 ec_slave_mbox_prepare_check(slave, datagram); // can not fail. |
317 ec_slave_mbox_prepare_check(slave, datagram); // can not fail. |
297 fsm->retries = EC_FSM_RETRIES; |
318 fsm->retries = EC_FSM_RETRIES; |
321 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
342 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
322 return; // FIXME: request again? |
343 return; // FIXME: request again? |
323 |
344 |
324 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
345 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
325 fsm->state = ec_fsm_soe_error; |
346 fsm->state = ec_fsm_soe_error; |
326 EC_ERR("Failed to receive SoE read response datagram for" |
347 EC_ERR("Failed to receive SoE read response datagram: "); |
327 " slave %u: ", slave->ring_position); |
|
328 ec_datagram_print_state(datagram); |
348 ec_datagram_print_state(datagram); |
|
349 ec_fsm_soe_print_error(fsm); |
329 return; |
350 return; |
330 } |
351 } |
331 |
352 |
332 if (datagram->working_counter != 1) { |
353 if (datagram->working_counter != 1) { |
333 fsm->state = ec_fsm_soe_error; |
354 fsm->state = ec_fsm_soe_error; |
334 EC_ERR("Reception of SoE read response failed on slave %u: ", |
355 EC_ERR("Reception of SoE read response failed: "); |
335 slave->ring_position); |
|
336 ec_datagram_print_wc_error(datagram); |
356 ec_datagram_print_wc_error(datagram); |
|
357 ec_fsm_soe_print_error(fsm); |
337 return; |
358 return; |
338 } |
359 } |
339 |
360 |
340 data = ec_slave_mbox_fetch(slave, datagram, &mbox_prot, &rec_size); |
361 data = ec_slave_mbox_fetch(slave, datagram, &mbox_prot, &rec_size); |
341 if (IS_ERR(data)) { |
362 if (IS_ERR(data)) { |
342 fsm->state = ec_fsm_soe_error; |
363 fsm->state = ec_fsm_soe_error; |
|
364 ec_fsm_soe_print_error(fsm); |
343 return; |
365 return; |
344 } |
366 } |
345 |
367 |
346 if (master->debug_level) { |
368 if (master->debug_level) { |
347 EC_DBG("SCC read response:\n"); |
369 EC_DBG("SCC read response:\n"); |
348 ec_print_data(data, rec_size); |
370 ec_print_data(data, rec_size); |
349 } |
371 } |
350 |
372 |
351 if (mbox_prot != EC_MBOX_TYPE_SOE) { |
373 if (mbox_prot != EC_MBOX_TYPE_SOE) { |
352 fsm->state = ec_fsm_soe_error; |
374 fsm->state = ec_fsm_soe_error; |
353 EC_WARN("Received mailbox protocol 0x%02X as response.\n", mbox_prot); |
375 EC_ERR("Received mailbox protocol 0x%02X as response.\n", mbox_prot); |
|
376 ec_fsm_soe_print_error(fsm); |
354 return; |
377 return; |
355 } |
378 } |
356 |
379 |
357 if (rec_size < EC_SOE_READ_RESPONSE_SIZE) { |
380 if (rec_size < EC_SOE_READ_RESPONSE_SIZE) { |
358 fsm->state = ec_fsm_soe_error; |
381 fsm->state = ec_fsm_soe_error; |
359 EC_ERR("Received currupted SoE read response (%zu bytes)!\n", |
382 EC_ERR("Received currupted SoE read response" |
360 rec_size); |
383 " (%zu bytes)!\n", rec_size); |
361 ec_print_data(data, rec_size); |
384 ec_print_data(data, rec_size); |
|
385 ec_fsm_soe_print_error(fsm); |
362 return; |
386 return; |
363 } |
387 } |
364 |
388 |
365 header = EC_READ_U8(data); |
389 header = EC_READ_U8(data); |
366 opcode = header & 0x7; |
390 opcode = header & 0x7; |
368 error_flag = (header >> 4) & 1; |
392 error_flag = (header >> 4) & 1; |
369 |
393 |
370 if (opcode != EC_SOE_OPCODE_READ_RESPONSE) { |
394 if (opcode != EC_SOE_OPCODE_READ_RESPONSE) { |
371 EC_ERR("Received no read response (opcode %x).\n", opcode); |
395 EC_ERR("Received no read response (opcode %x).\n", opcode); |
372 ec_print_data(data, rec_size); |
396 ec_print_data(data, rec_size); |
|
397 ec_fsm_soe_print_error(fsm); |
373 fsm->state = ec_fsm_soe_error; |
398 fsm->state = ec_fsm_soe_error; |
374 return; |
399 return; |
375 } |
400 } |
376 |
401 |
377 if (error_flag) { |
402 if (error_flag) { |
378 req->error_code = EC_READ_U16(data + rec_size - 2); |
403 req->error_code = EC_READ_U16(data + rec_size - 2); |
379 EC_ERR("Received error response:\n"); |
404 EC_ERR("Received error response:\n"); |
380 ec_print_soe_error(req->error_code); |
405 ec_print_soe_error(req->error_code); |
|
406 ec_fsm_soe_print_error(fsm); |
381 fsm->state = ec_fsm_soe_error; |
407 fsm->state = ec_fsm_soe_error; |
382 return; |
408 return; |
383 } else { |
409 } else { |
384 req->error_code = 0x0000; |
410 req->error_code = 0x0000; |
385 } |
411 } |
386 |
412 |
387 value_included = (EC_READ_U8(data + 1) >> 6) & 1; |
413 value_included = (EC_READ_U8(data + 1) >> 6) & 1; |
388 if (!value_included) { |
414 if (!value_included) { |
389 EC_ERR("No value included!\n"); |
415 EC_ERR("No value included!\n"); |
|
416 ec_fsm_soe_print_error(fsm); |
390 fsm->state = ec_fsm_soe_error; |
417 fsm->state = ec_fsm_soe_error; |
391 return; |
418 return; |
392 } |
419 } |
393 |
420 |
394 data_size = rec_size - EC_SOE_READ_RESPONSE_SIZE; |
421 data_size = rec_size - EC_SOE_READ_RESPONSE_SIZE; |
395 if (ec_soe_request_append_data(req, |
422 if (ec_soe_request_append_data(req, |
396 data + EC_SOE_READ_RESPONSE_SIZE, data_size)) { |
423 data + EC_SOE_READ_RESPONSE_SIZE, data_size)) { |
397 fsm->state = ec_fsm_soe_error; |
424 fsm->state = ec_fsm_soe_error; |
|
425 ec_fsm_soe_print_error(fsm); |
398 return; |
426 return; |
399 } |
427 } |
400 |
428 |
401 if (incomplete) { |
429 if (incomplete) { |
402 if (master->debug_level) { |
430 if (master->debug_level) { |
438 header_size = EC_MBOX_HEADER_SIZE + EC_SOE_WRITE_REQUEST_SIZE; |
466 header_size = EC_MBOX_HEADER_SIZE + EC_SOE_WRITE_REQUEST_SIZE; |
439 if (slave->configured_rx_mailbox_size <= header_size) { |
467 if (slave->configured_rx_mailbox_size <= header_size) { |
440 EC_ERR("Mailbox size (%u) too small for SoE write.\n", |
468 EC_ERR("Mailbox size (%u) too small for SoE write.\n", |
441 slave->configured_rx_mailbox_size); |
469 slave->configured_rx_mailbox_size); |
442 fsm->state = ec_fsm_soe_error; |
470 fsm->state = ec_fsm_soe_error; |
|
471 ec_fsm_soe_print_error(fsm); |
443 return; |
472 return; |
444 } |
473 } |
445 |
474 |
446 remaining_size = req->data_size - fsm->offset; |
475 remaining_size = req->data_size - fsm->offset; |
447 max_fragment_size = slave->configured_rx_mailbox_size - header_size; |
476 max_fragment_size = slave->configured_rx_mailbox_size - header_size; |
488 if (master->debug_level) |
518 if (master->debug_level) |
489 EC_DBG("Writing IDN 0x%04X (%zu byte) to slave %u.\n", |
519 EC_DBG("Writing IDN 0x%04X (%zu byte) to slave %u.\n", |
490 req->idn, req->data_size, slave->ring_position); |
520 req->idn, req->data_size, slave->ring_position); |
491 |
521 |
492 if (!(slave->sii.mailbox_protocols & EC_MBOX_SOE)) { |
522 if (!(slave->sii.mailbox_protocols & EC_MBOX_SOE)) { |
493 EC_ERR("Slave %u does not support SoE!\n", slave->ring_position); |
523 EC_ERR("Slave does not support SoE!\n"); |
494 fsm->state = ec_fsm_soe_error; |
524 fsm->state = ec_fsm_soe_error; |
|
525 ec_fsm_soe_print_error(fsm); |
495 return; |
526 return; |
496 } |
527 } |
497 |
528 |
498 fsm->offset = 0; |
529 fsm->offset = 0; |
499 ec_fsm_soe_write_next_fragment(fsm); |
530 ec_fsm_soe_write_next_fragment(fsm); |
512 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
543 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
513 return; // FIXME: check for response first? |
544 return; // FIXME: check for response first? |
514 |
545 |
515 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
546 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
516 fsm->state = ec_fsm_soe_error; |
547 fsm->state = ec_fsm_soe_error; |
517 EC_ERR("Failed to receive SoE write request for slave %u: ", |
548 EC_ERR("Failed to receive SoE write request: "); |
518 slave->ring_position); |
|
519 ec_datagram_print_state(datagram); |
549 ec_datagram_print_state(datagram); |
|
550 ec_fsm_soe_print_error(fsm); |
520 return; |
551 return; |
521 } |
552 } |
522 |
553 |
523 diff_ms = (jiffies - fsm->request->jiffies_sent) * 1000 / HZ; |
554 diff_ms = (jiffies - fsm->request->jiffies_sent) * 1000 / HZ; |
524 |
555 |
558 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
588 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
559 return; |
589 return; |
560 |
590 |
561 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
591 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
562 fsm->state = ec_fsm_soe_error; |
592 fsm->state = ec_fsm_soe_error; |
563 EC_ERR("Failed to receive SoE write request datagram from slave %u: ", |
593 EC_ERR("Failed to receive SoE write request datagram: "); |
564 slave->ring_position); |
|
565 ec_datagram_print_state(datagram); |
594 ec_datagram_print_state(datagram); |
|
595 ec_fsm_soe_print_error(fsm); |
566 return; |
596 return; |
567 } |
597 } |
568 |
598 |
569 if (datagram->working_counter != 1) { |
599 if (datagram->working_counter != 1) { |
570 fsm->state = ec_fsm_soe_error; |
600 fsm->state = ec_fsm_soe_error; |
571 EC_ERR("Reception of SoE write request datagram failed on slave %u: ", |
601 EC_ERR("Reception of SoE write request datagram: "); |
572 slave->ring_position); |
|
573 ec_datagram_print_wc_error(datagram); |
602 ec_datagram_print_wc_error(datagram); |
|
603 ec_fsm_soe_print_error(fsm); |
574 return; |
604 return; |
575 } |
605 } |
576 |
606 |
577 if (fsm->offset < req->data_size) { |
607 if (fsm->offset < req->data_size) { |
578 ec_fsm_soe_write_next_fragment(fsm); |
608 ec_fsm_soe_write_next_fragment(fsm); |
580 if (!ec_slave_mbox_check(datagram)) { |
610 if (!ec_slave_mbox_check(datagram)) { |
581 unsigned long diff_ms = |
611 unsigned long diff_ms = |
582 (datagram->jiffies_received - fsm->jiffies_start) * 1000 / HZ; |
612 (datagram->jiffies_received - fsm->jiffies_start) * 1000 / HZ; |
583 if (diff_ms >= EC_SOE_RESPONSE_TIMEOUT) { |
613 if (diff_ms >= EC_SOE_RESPONSE_TIMEOUT) { |
584 fsm->state = ec_fsm_soe_error; |
614 fsm->state = ec_fsm_soe_error; |
585 EC_ERR("Timeout after %u ms while waiting for IDN 0x%04x" |
615 EC_ERR("Timeout after %u ms while waiting" |
586 " write response on slave %u.\n", (u32) diff_ms, |
616 " for write response.\n", (u32) diff_ms); |
587 fsm->request->idn, slave->ring_position); |
617 ec_fsm_soe_print_error(fsm); |
588 return; |
618 return; |
589 } |
619 } |
590 |
620 |
591 ec_slave_mbox_prepare_check(slave, datagram); // can not fail. |
621 ec_slave_mbox_prepare_check(slave, datagram); // can not fail. |
592 fsm->retries = EC_FSM_RETRIES; |
622 fsm->retries = EC_FSM_RETRIES; |
617 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
647 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
618 return; // FIXME: request again? |
648 return; // FIXME: request again? |
619 |
649 |
620 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
650 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
621 fsm->state = ec_fsm_soe_error; |
651 fsm->state = ec_fsm_soe_error; |
622 EC_ERR("Failed to receive SoE write response datagram for" |
652 EC_ERR("Failed to receive SoE write response datagram: "); |
623 " slave %u: ", slave->ring_position); |
|
624 ec_datagram_print_state(datagram); |
653 ec_datagram_print_state(datagram); |
|
654 ec_fsm_soe_print_error(fsm); |
625 return; |
655 return; |
626 } |
656 } |
627 |
657 |
628 if (datagram->working_counter != 1) { |
658 if (datagram->working_counter != 1) { |
629 fsm->state = ec_fsm_soe_error; |
659 fsm->state = ec_fsm_soe_error; |
630 EC_ERR("Reception of SoE write response failed on slave %u: ", |
660 EC_ERR("Reception of SoE write response failed: "); |
631 slave->ring_position); |
|
632 ec_datagram_print_wc_error(datagram); |
661 ec_datagram_print_wc_error(datagram); |
|
662 ec_fsm_soe_print_error(fsm); |
633 return; |
663 return; |
634 } |
664 } |
635 |
665 |
636 data = ec_slave_mbox_fetch(slave, datagram, &mbox_prot, &rec_size); |
666 data = ec_slave_mbox_fetch(slave, datagram, &mbox_prot, &rec_size); |
637 if (IS_ERR(data)) { |
667 if (IS_ERR(data)) { |
638 fsm->state = ec_fsm_soe_error; |
668 fsm->state = ec_fsm_soe_error; |
|
669 ec_fsm_soe_print_error(fsm); |
639 return; |
670 return; |
640 } |
671 } |
641 |
672 |
642 if (master->debug_level) { |
673 if (master->debug_level) { |
643 EC_DBG("SCC write response:\n"); |
674 EC_DBG("SCC write response:\n"); |
644 ec_print_data(data, rec_size); |
675 ec_print_data(data, rec_size); |
645 } |
676 } |
646 |
677 |
647 if (mbox_prot != EC_MBOX_TYPE_SOE) { |
678 if (mbox_prot != EC_MBOX_TYPE_SOE) { |
648 fsm->state = ec_fsm_soe_error; |
679 fsm->state = ec_fsm_soe_error; |
649 EC_WARN("Received mailbox protocol 0x%02X as response.\n", mbox_prot); |
680 EC_ERR("Received mailbox protocol 0x%02X as response.\n", mbox_prot); |
|
681 ec_fsm_soe_print_error(fsm); |
650 return; |
682 return; |
651 } |
683 } |
652 |
684 |
653 if (rec_size < EC_SOE_WRITE_RESPONSE_SIZE) { |
685 if (rec_size < EC_SOE_WRITE_RESPONSE_SIZE) { |
654 fsm->state = ec_fsm_soe_error; |
686 fsm->state = ec_fsm_soe_error; |
655 EC_ERR("Received currupted SoE write response (%zu bytes)!\n", |
687 EC_ERR("Received currupted SoE write response (%zu bytes)!\n", |
656 rec_size); |
688 rec_size); |
657 ec_print_data(data, rec_size); |
689 ec_print_data(data, rec_size); |
|
690 ec_fsm_soe_print_error(fsm); |
658 return; |
691 return; |
659 } |
692 } |
660 |
693 |
661 opcode = EC_READ_U8(data) & 0x7; |
694 opcode = EC_READ_U8(data) & 0x7; |
662 if (opcode != EC_SOE_OPCODE_WRITE_RESPONSE) { |
695 if (opcode != EC_SOE_OPCODE_WRITE_RESPONSE) { |
663 EC_ERR("Received no write response (opcode %x).\n", opcode); |
696 EC_ERR("Received no write response (opcode %x).\n", opcode); |
664 ec_print_data(data, rec_size); |
697 ec_print_data(data, rec_size); |
|
698 ec_fsm_soe_print_error(fsm); |
665 fsm->state = ec_fsm_soe_error; |
699 fsm->state = ec_fsm_soe_error; |
666 return; |
700 return; |
667 } |
701 } |
668 |
702 |
669 idn = EC_READ_U16(data + 2); |
703 idn = EC_READ_U16(data + 2); |
670 if (idn != req->idn) { |
704 if (idn != req->idn) { |
671 EC_ERR("Received response for wrong IDN 0x%04x.\n", idn); |
705 EC_ERR("Received response for wrong IDN 0x%04x.\n", idn); |
672 ec_print_data(data, rec_size); |
706 ec_print_data(data, rec_size); |
|
707 ec_fsm_soe_print_error(fsm); |
673 fsm->state = ec_fsm_soe_error; |
708 fsm->state = ec_fsm_soe_error; |
674 return; |
709 return; |
675 } |
710 } |
676 |
711 |
677 error_flag = (EC_READ_U8(data) >> 4) & 1; |
712 error_flag = (EC_READ_U8(data) >> 4) & 1; |