00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00035
00036
00037 #include "globals.h"
00038 #include "master.h"
00039 #include "mailbox.h"
00040 #include "fsm_foe.h"
00041 #include "foe.h"
00042
00043
00044
00047 #define EC_FSM_FOE_TIMEOUT 3000
00048
00051 #define EC_MBOX_TYPE_FILEACCESS 0x04
00052
00055 #define EC_FOE_HEADER_SIZE 6
00056
00057
00058
00059
00060
00061
00062
00063
00066 enum {
00067 EC_FOE_OPCODE_RRQ = 1,
00068 EC_FOE_OPCODE_WRQ = 2,
00069 EC_FOE_OPCODE_DATA = 3,
00070 EC_FOE_OPCODE_ACK = 4,
00071 EC_FOE_OPCODE_ERR = 5,
00072 EC_FOE_OPCODE_BUSY = 6
00073 } ec_foe_opcode_t;
00074
00075
00076
00077 int ec_foe_prepare_data_send(ec_fsm_foe_t *, ec_datagram_t *);
00078 int ec_foe_prepare_wrq_send(ec_fsm_foe_t *, ec_datagram_t *);
00079 int ec_foe_prepare_rrq_send(ec_fsm_foe_t *, ec_datagram_t *);
00080 int ec_foe_prepare_send_ack(ec_fsm_foe_t *, ec_datagram_t *);
00081
00082 void ec_foe_set_tx_error(ec_fsm_foe_t *, uint32_t);
00083 void ec_foe_set_rx_error(ec_fsm_foe_t *, uint32_t);
00084
00085 void ec_fsm_foe_end(ec_fsm_foe_t *, ec_datagram_t *);
00086 void ec_fsm_foe_error(ec_fsm_foe_t *, ec_datagram_t *);
00087
00088 void ec_fsm_foe_state_wrq_sent(ec_fsm_foe_t *, ec_datagram_t *);
00089 void ec_fsm_foe_state_rrq_sent(ec_fsm_foe_t *, ec_datagram_t *);
00090
00091 void ec_fsm_foe_state_ack_check(ec_fsm_foe_t *, ec_datagram_t *);
00092 void ec_fsm_foe_state_ack_read(ec_fsm_foe_t *, ec_datagram_t *);
00093
00094 void ec_fsm_foe_state_data_sent(ec_fsm_foe_t *, ec_datagram_t *);
00095
00096 void ec_fsm_foe_state_data_check(ec_fsm_foe_t *, ec_datagram_t *);
00097 void ec_fsm_foe_state_data_read(ec_fsm_foe_t *, ec_datagram_t *);
00098 void ec_fsm_foe_state_sent_ack(ec_fsm_foe_t *, ec_datagram_t *);
00099
00100 void ec_fsm_foe_write_start(ec_fsm_foe_t *, ec_datagram_t *);
00101 void ec_fsm_foe_read_start(ec_fsm_foe_t *, ec_datagram_t *);
00102
00103
00104
00107 void ec_fsm_foe_init(
00108 ec_fsm_foe_t *fsm
00109 )
00110 {
00111 fsm->state = NULL;
00112 fsm->datagram = NULL;
00113 }
00114
00115
00116
00119 void ec_fsm_foe_clear(ec_fsm_foe_t *fsm )
00120 {
00121 }
00122
00123
00124
00129 int ec_fsm_foe_exec(
00130 ec_fsm_foe_t *fsm,
00131 ec_datagram_t *datagram
00132 )
00133 {
00134 int datagram_used = 0;
00135
00136 if (fsm->datagram &&
00137 (fsm->datagram->state == EC_DATAGRAM_INIT ||
00138 fsm->datagram->state == EC_DATAGRAM_QUEUED ||
00139 fsm->datagram->state == EC_DATAGRAM_SENT)) {
00140
00141 return datagram_used;
00142 }
00143
00144 fsm->state(fsm, datagram);
00145
00146 datagram_used =
00147 fsm->state != ec_fsm_foe_end && fsm->state != ec_fsm_foe_error;
00148
00149 if (datagram_used) {
00150 fsm->datagram = datagram;
00151 } else {
00152 fsm->datagram = NULL;
00153 }
00154
00155 return datagram_used;
00156 }
00157
00158
00159
00163 int ec_fsm_foe_success(const ec_fsm_foe_t *fsm )
00164 {
00165 return fsm->state == ec_fsm_foe_end;
00166 }
00167
00168
00169
00172 void ec_fsm_foe_transfer(
00173 ec_fsm_foe_t *fsm,
00174 ec_slave_t *slave,
00175 ec_foe_request_t *request
00176 )
00177 {
00178 fsm->slave = slave;
00179 fsm->request = request;
00180
00181 if (request->dir == EC_DIR_OUTPUT) {
00182 fsm->tx_buffer = fsm->request->buffer;
00183 fsm->tx_buffer_size = fsm->request->data_size;
00184 fsm->tx_buffer_offset = 0;
00185
00186 fsm->tx_filename = fsm->request->file_name;
00187 fsm->tx_filename_len = strlen(fsm->tx_filename);
00188
00189 fsm->state = ec_fsm_foe_write_start;
00190 }
00191 else {
00192 fsm->rx_buffer = fsm->request->buffer;
00193 fsm->rx_buffer_size = fsm->request->buffer_size;
00194
00195 fsm->rx_filename = fsm->request->file_name;
00196 fsm->rx_filename_len = strlen(fsm->rx_filename);
00197
00198 fsm->state = ec_fsm_foe_read_start;
00199 }
00200 }
00201
00202
00203
00206 void ec_fsm_foe_error(
00207 ec_fsm_foe_t *fsm,
00208 ec_datagram_t *datagram
00209 )
00210 {
00211 #ifdef DEBUG_FOE
00212 EC_SLAVE_DBG(fsm->slave, 0, "%s()\n", __func__);
00213 #endif
00214 }
00215
00216
00217
00220 void ec_fsm_foe_end(
00221 ec_fsm_foe_t *fsm,
00222 ec_datagram_t *datagram
00223 )
00224 {
00225 #ifdef DEBUG_FOE
00226 EC_SLAVE_DBG(fsm->slave, 0, "%s()\n", __func__);
00227 #endif
00228 }
00229
00230
00231
00236 int ec_foe_prepare_data_send(
00237 ec_fsm_foe_t *fsm,
00238 ec_datagram_t *datagram
00239 )
00240 {
00241 size_t remaining_size, current_size;
00242 uint8_t *data;
00243
00244 remaining_size = fsm->tx_buffer_size - fsm->tx_buffer_offset;
00245
00246 if (remaining_size < fsm->slave->configured_tx_mailbox_size
00247 - EC_MBOX_HEADER_SIZE - EC_FOE_HEADER_SIZE) {
00248 current_size = remaining_size;
00249 fsm->tx_last_packet = 1;
00250 } else {
00251 current_size = fsm->slave->configured_tx_mailbox_size
00252 - EC_MBOX_HEADER_SIZE - EC_FOE_HEADER_SIZE;
00253 }
00254
00255 data = ec_slave_mbox_prepare_send(fsm->slave,
00256 datagram, EC_MBOX_TYPE_FILEACCESS,
00257 current_size + EC_FOE_HEADER_SIZE);
00258 if (IS_ERR(data)) {
00259 return -1;
00260 }
00261
00262 EC_WRITE_U16(data, EC_FOE_OPCODE_DATA);
00263 EC_WRITE_U32(data + 2, fsm->tx_packet_no);
00264
00265 memcpy(data + EC_FOE_HEADER_SIZE,
00266 fsm->tx_buffer + fsm->tx_buffer_offset, current_size);
00267 fsm->tx_current_size = current_size;
00268
00269 return 0;
00270 }
00271
00272
00273
00278 int ec_foe_prepare_wrq_send(
00279 ec_fsm_foe_t *fsm,
00280 ec_datagram_t *datagram
00281 )
00282 {
00283 size_t current_size;
00284 uint8_t *data;
00285
00286 fsm->tx_buffer_offset = 0;
00287 fsm->tx_current_size = 0;
00288 fsm->tx_packet_no = 0;
00289 fsm->tx_last_packet = 0;
00290
00291 current_size = fsm->tx_filename_len;
00292
00293 data = ec_slave_mbox_prepare_send(fsm->slave, datagram,
00294 EC_MBOX_TYPE_FILEACCESS, current_size + EC_FOE_HEADER_SIZE);
00295 if (IS_ERR(data)) {
00296 return -1;
00297 }
00298
00299 EC_WRITE_U16( data, EC_FOE_OPCODE_WRQ);
00300 EC_WRITE_U32( data + 2, fsm->tx_packet_no );
00301
00302 memcpy(data + EC_FOE_HEADER_SIZE, fsm->tx_filename, current_size);
00303
00304 return 0;
00305 }
00306
00307
00308
00311 void ec_fsm_foe_write_start(
00312 ec_fsm_foe_t *fsm,
00313 ec_datagram_t *datagram
00314 )
00315 {
00316 ec_slave_t *slave = fsm->slave;
00317
00318 fsm->tx_buffer_offset = 0;
00319 fsm->tx_current_size = 0;
00320 fsm->tx_packet_no = 0;
00321 fsm->tx_last_packet = 0;
00322
00323 #ifdef DEBUG_FOE
00324 EC_SLAVE_DBG(fsm->slave, 0, "%s()\n", __func__);
00325 #endif
00326
00327 if (!(slave->sii.mailbox_protocols & EC_MBOX_FOE)) {
00328 ec_foe_set_tx_error(fsm, FOE_MBOX_PROT_ERROR);
00329 EC_SLAVE_ERR(slave, "Slave does not support FoE!\n");
00330 return;
00331 }
00332
00333 if (ec_foe_prepare_wrq_send(fsm, datagram)) {
00334 ec_foe_set_tx_error(fsm, FOE_PROT_ERROR);
00335 return;
00336 }
00337
00338 fsm->state = ec_fsm_foe_state_wrq_sent;
00339 }
00340
00341
00342
00345 void ec_fsm_foe_state_ack_check(
00346 ec_fsm_foe_t *fsm,
00347 ec_datagram_t *datagram
00348 )
00349 {
00350 ec_slave_t *slave = fsm->slave;
00351
00352 #ifdef DEBUG_FOE
00353 EC_SLAVE_DBG(fsm->slave, 0, "%s()\n", __func__);
00354 #endif
00355
00356 if (fsm->datagram->state != EC_DATAGRAM_RECEIVED) {
00357 ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR);
00358 EC_SLAVE_ERR(slave, "Failed to receive FoE mailbox check datagram: ");
00359 ec_datagram_print_state(fsm->datagram);
00360 return;
00361 }
00362
00363 if (fsm->datagram->working_counter != 1) {
00364 ec_foe_set_rx_error(fsm, FOE_WC_ERROR);
00365 EC_SLAVE_ERR(slave, "Reception of FoE mailbox check datagram"
00366 " failed: ");
00367 ec_datagram_print_wc_error(fsm->datagram);
00368 return;
00369 }
00370
00371 if (!ec_slave_mbox_check(fsm->datagram)) {
00372
00373 unsigned long diff_ms = (fsm->datagram->jiffies_received -
00374 fsm->jiffies_start) * 1000 / HZ;
00375 if (diff_ms >= EC_FSM_FOE_TIMEOUT) {
00376 ec_foe_set_tx_error(fsm, FOE_TIMEOUT_ERROR);
00377 EC_SLAVE_ERR(slave, "Timeout while waiting for ack response.\n");
00378 return;
00379 }
00380
00381 ec_slave_mbox_prepare_check(slave, datagram);
00382 fsm->retries = EC_FSM_RETRIES;
00383 return;
00384 }
00385
00386
00387 ec_slave_mbox_prepare_fetch(slave, datagram);
00388
00389 fsm->retries = EC_FSM_RETRIES;
00390 fsm->state = ec_fsm_foe_state_ack_read;
00391 }
00392
00393
00394
00397 void ec_fsm_foe_state_ack_read(
00398 ec_fsm_foe_t *fsm,
00399 ec_datagram_t *datagram
00400 )
00401 {
00402 ec_slave_t *slave = fsm->slave;
00403 uint8_t *data, mbox_prot;
00404 uint8_t opCode;
00405 size_t rec_size;
00406
00407 #ifdef DEBUG_FOE
00408 EC_SLAVE_DBG(fsm->slave, 0, "%s()\n", __func__);
00409 #endif
00410
00411 if (fsm->datagram->state != EC_DATAGRAM_RECEIVED) {
00412 ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR);
00413 EC_SLAVE_ERR(slave, "Failed to receive FoE ack response datagram: ");
00414 ec_datagram_print_state(fsm->datagram);
00415 return;
00416 }
00417
00418 if (fsm->datagram->working_counter != 1) {
00419 ec_foe_set_rx_error(fsm, FOE_WC_ERROR);
00420 EC_SLAVE_ERR(slave, "Reception of FoE ack response failed: ");
00421 ec_datagram_print_wc_error(fsm->datagram);
00422 return;
00423 }
00424
00425 data = ec_slave_mbox_fetch(slave, fsm->datagram, &mbox_prot, &rec_size);
00426 if (IS_ERR(data)) {
00427 ec_foe_set_tx_error(fsm, FOE_PROT_ERROR);
00428 return;
00429 }
00430
00431 if (mbox_prot != EC_MBOX_TYPE_FILEACCESS) {
00432 ec_foe_set_tx_error(fsm, FOE_MBOX_PROT_ERROR);
00433 EC_SLAVE_ERR(slave, "Received mailbox protocol 0x%02X as response.\n",
00434 mbox_prot);
00435 return;
00436 }
00437
00438 opCode = EC_READ_U8(data);
00439
00440 if (opCode == EC_FOE_OPCODE_BUSY) {
00441
00442 if (ec_foe_prepare_data_send(fsm, datagram)) {
00443 ec_foe_set_tx_error(fsm, FOE_PROT_ERROR);
00444 EC_SLAVE_ERR(slave, "Slave is busy.\n");
00445 return;
00446 }
00447 fsm->state = ec_fsm_foe_state_data_sent;
00448 return;
00449 }
00450
00451 if (opCode == EC_FOE_OPCODE_ACK) {
00452 fsm->tx_packet_no++;
00453 fsm->tx_buffer_offset += fsm->tx_current_size;
00454
00455 if (fsm->tx_last_packet) {
00456 fsm->state = ec_fsm_foe_end;
00457 return;
00458 }
00459
00460 if (ec_foe_prepare_data_send(fsm, datagram)) {
00461 ec_foe_set_tx_error(fsm, FOE_PROT_ERROR);
00462 return;
00463 }
00464 fsm->state = ec_fsm_foe_state_data_sent;
00465 return;
00466 }
00467 ec_foe_set_tx_error(fsm, FOE_ACK_ERROR);
00468 }
00469
00470
00471
00477 void ec_fsm_foe_state_wrq_sent(
00478 ec_fsm_foe_t *fsm,
00479 ec_datagram_t *datagram
00480 )
00481 {
00482 ec_slave_t *slave = fsm->slave;
00483
00484 #ifdef DEBUG_FOE
00485 EC_SLAVE_DBG(fsm->slave, 0, "%s()\n", __func__);
00486 #endif
00487
00488 if (fsm->datagram->state != EC_DATAGRAM_RECEIVED) {
00489 ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR);
00490 EC_SLAVE_ERR(slave, "Failed to send FoE WRQ: ");
00491 ec_datagram_print_state(fsm->datagram);
00492 return;
00493 }
00494
00495 if (fsm->datagram->working_counter != 1) {
00496
00497 ec_foe_set_rx_error(fsm, FOE_WC_ERROR);
00498 EC_SLAVE_ERR(slave, "Reception of FoE WRQ failed: ");
00499 ec_datagram_print_wc_error(fsm->datagram);
00500 return;
00501 }
00502
00503 fsm->jiffies_start = fsm->datagram->jiffies_sent;
00504
00505 ec_slave_mbox_prepare_check(slave, datagram);
00506
00507 fsm->retries = EC_FSM_RETRIES;
00508 fsm->state = ec_fsm_foe_state_ack_check;
00509 }
00510
00511
00512
00518 void ec_fsm_foe_state_data_sent(
00519 ec_fsm_foe_t *fsm,
00520 ec_datagram_t *datagram
00521 )
00522 {
00523 ec_slave_t *slave = fsm->slave;
00524
00525 #ifdef DEBUG_FOE
00526 EC_SLAVE_DBG(fsm->slave, 0, "%s()\n", __func__);
00527 #endif
00528
00529 if (fsm->datagram->state != EC_DATAGRAM_RECEIVED) {
00530 ec_foe_set_tx_error(fsm, FOE_RECEIVE_ERROR);
00531 EC_SLAVE_ERR(slave, "Failed to receive FoE ack response datagram: ");
00532 ec_datagram_print_state(fsm->datagram);
00533 return;
00534 }
00535
00536 if (fsm->datagram->working_counter != 1) {
00537 ec_foe_set_tx_error(fsm, FOE_WC_ERROR);
00538 EC_SLAVE_ERR(slave, "Reception of FoE data send failed: ");
00539 ec_datagram_print_wc_error(fsm->datagram);
00540 return;
00541 }
00542
00543 ec_slave_mbox_prepare_check(slave, datagram);
00544 fsm->jiffies_start = jiffies;
00545 fsm->retries = EC_FSM_RETRIES;
00546 fsm->state = ec_fsm_foe_state_ack_check;
00547 }
00548
00549
00550
00555 int ec_foe_prepare_rrq_send(
00556 ec_fsm_foe_t *fsm,
00557 ec_datagram_t *datagram
00558 )
00559 {
00560 size_t current_size;
00561 uint8_t *data;
00562
00563 current_size = fsm->rx_filename_len;
00564
00565 data = ec_slave_mbox_prepare_send(fsm->slave, datagram,
00566 EC_MBOX_TYPE_FILEACCESS, current_size + EC_FOE_HEADER_SIZE);
00567 if (IS_ERR(data)) {
00568 return -1;
00569 }
00570
00571 EC_WRITE_U16(data, EC_FOE_OPCODE_RRQ);
00572 EC_WRITE_U32(data + 2, 0x00000000);
00573 memcpy(data + EC_FOE_HEADER_SIZE, fsm->rx_filename, current_size);
00574
00575 if (fsm->slave->master->debug_level) {
00576 EC_SLAVE_DBG(fsm->slave, 1, "FoE Read Request:\n");
00577 ec_print_data(data, current_size + EC_FOE_HEADER_SIZE);
00578 }
00579
00580 return 0;
00581 }
00582
00583
00584
00589 int ec_foe_prepare_send_ack(
00590 ec_fsm_foe_t *fsm,
00591 ec_datagram_t *datagram
00592 )
00593 {
00594 uint8_t *data;
00595
00596 data = ec_slave_mbox_prepare_send(fsm->slave, datagram,
00597 EC_MBOX_TYPE_FILEACCESS, EC_FOE_HEADER_SIZE);
00598 if (IS_ERR(data)) {
00599 return -1;
00600 }
00601
00602 EC_WRITE_U16(data, EC_FOE_OPCODE_ACK);
00603 EC_WRITE_U32(data + 2, fsm->rx_expected_packet_no);
00604
00605 return 0;
00606 }
00607
00608
00609
00615 void ec_fsm_foe_state_rrq_sent(
00616 ec_fsm_foe_t *fsm,
00617 ec_datagram_t *datagram
00618 )
00619 {
00620 ec_slave_t *slave = fsm->slave;
00621
00622 #ifdef DEBUG_FOE
00623 EC_SLAVE_DBG(fsm->slave, 0, "%s()\n", __func__);
00624 #endif
00625
00626 if (fsm->datagram->state != EC_DATAGRAM_RECEIVED) {
00627 ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR);
00628 EC_SLAVE_ERR(slave, "Failed to send FoE RRQ: ");
00629 ec_datagram_print_state(fsm->datagram);
00630 return;
00631 }
00632
00633 if (fsm->datagram->working_counter != 1) {
00634
00635 ec_foe_set_rx_error(fsm, FOE_WC_ERROR);
00636 EC_SLAVE_ERR(slave, "Reception of FoE RRQ failed: ");
00637 ec_datagram_print_wc_error(fsm->datagram);
00638 return;
00639 }
00640
00641 fsm->jiffies_start = fsm->datagram->jiffies_sent;
00642
00643 ec_slave_mbox_prepare_check(slave, datagram);
00644
00645 fsm->retries = EC_FSM_RETRIES;
00646 fsm->state = ec_fsm_foe_state_data_check;
00647 }
00648
00649
00650
00653 void ec_fsm_foe_read_start(
00654 ec_fsm_foe_t *fsm,
00655 ec_datagram_t *datagram
00656 )
00657 {
00658 ec_slave_t *slave = fsm->slave;
00659
00660 fsm->rx_buffer_offset = 0;
00661 fsm->rx_expected_packet_no = 1;
00662 fsm->rx_last_packet = 0;
00663
00664 #ifdef DEBUG_FOE
00665 EC_SLAVE_DBG(fsm->slave, 0, "%s()\n", __func__);
00666 #endif
00667
00668 if (!(slave->sii.mailbox_protocols & EC_MBOX_FOE)) {
00669 ec_foe_set_tx_error(fsm, FOE_MBOX_PROT_ERROR);
00670 EC_SLAVE_ERR(slave, "Slave does not support FoE!\n");
00671 return;
00672 }
00673
00674 if (ec_foe_prepare_rrq_send(fsm, datagram)) {
00675 ec_foe_set_rx_error(fsm, FOE_PROT_ERROR);
00676 return;
00677 }
00678
00679 fsm->state = ec_fsm_foe_state_rrq_sent;
00680 }
00681
00682
00683
00686 void ec_fsm_foe_state_data_check(
00687 ec_fsm_foe_t *fsm,
00688 ec_datagram_t *datagram
00689 )
00690 {
00691 ec_slave_t *slave = fsm->slave;
00692
00693 #ifdef DEBUG_FOE
00694 EC_SLAVE_DBG(fsm->slave, 0, "%s()\n", __func__);
00695 #endif
00696
00697 if (fsm->datagram->state != EC_DATAGRAM_RECEIVED) {
00698 ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR);
00699 EC_SLAVE_ERR(slave, "Failed to send FoE DATA READ: ");
00700 ec_datagram_print_state(fsm->datagram);
00701 return;
00702 }
00703
00704 if (fsm->datagram->working_counter != 1) {
00705 ec_foe_set_rx_error(fsm, FOE_WC_ERROR);
00706 EC_SLAVE_ERR(slave, "Reception of FoE DATA READ: ");
00707 ec_datagram_print_wc_error(fsm->datagram);
00708 return;
00709 }
00710
00711 if (!ec_slave_mbox_check(fsm->datagram)) {
00712 unsigned long diff_ms = (fsm->datagram->jiffies_received -
00713 fsm->jiffies_start) * 1000 / HZ;
00714 if (diff_ms >= EC_FSM_FOE_TIMEOUT) {
00715 ec_foe_set_tx_error(fsm, FOE_TIMEOUT_ERROR);
00716 EC_SLAVE_ERR(slave, "Timeout while waiting for ack response.\n");
00717 return;
00718 }
00719
00720 ec_slave_mbox_prepare_check(slave, datagram);
00721 fsm->retries = EC_FSM_RETRIES;
00722 return;
00723 }
00724
00725
00726 ec_slave_mbox_prepare_fetch(slave, datagram);
00727
00728 fsm->retries = EC_FSM_RETRIES;
00729 fsm->state = ec_fsm_foe_state_data_read;
00730 }
00731
00732
00733
00736 void ec_fsm_foe_state_data_read(
00737 ec_fsm_foe_t *fsm,
00738 ec_datagram_t *datagram
00739 )
00740 {
00741 size_t rec_size;
00742 uint8_t *data, opCode, packet_no, mbox_prot;
00743
00744 ec_slave_t *slave = fsm->slave;
00745
00746 #ifdef DEBUG_FOE
00747 EC_SLAVE_DBG(fsm->slave, 0, "%s()\n", __func__);
00748 #endif
00749
00750 if (fsm->datagram->state != EC_DATAGRAM_RECEIVED) {
00751 ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR);
00752 EC_SLAVE_ERR(slave, "Failed to receive FoE DATA READ datagram: ");
00753 ec_datagram_print_state(fsm->datagram);
00754 return;
00755 }
00756
00757 if (fsm->datagram->working_counter != 1) {
00758 ec_foe_set_rx_error(fsm, FOE_WC_ERROR);
00759 EC_SLAVE_ERR(slave, "Reception of FoE DATA READ failed: ");
00760 ec_datagram_print_wc_error(fsm->datagram);
00761 return;
00762 }
00763
00764 data = ec_slave_mbox_fetch(slave, fsm->datagram, &mbox_prot, &rec_size);
00765 if (IS_ERR(data)) {
00766 ec_foe_set_rx_error(fsm, FOE_MBOX_FETCH_ERROR);
00767 return;
00768 }
00769
00770 if (mbox_prot != EC_MBOX_TYPE_FILEACCESS) {
00771 EC_SLAVE_ERR(slave, "Received mailbox protocol 0x%02X as response.\n",
00772 mbox_prot);
00773 ec_foe_set_rx_error(fsm, FOE_PROT_ERROR);
00774 return;
00775 }
00776
00777 opCode = EC_READ_U8(data);
00778
00779 if (opCode == EC_FOE_OPCODE_BUSY) {
00780 if (ec_foe_prepare_send_ack(fsm, datagram)) {
00781 ec_foe_set_rx_error(fsm, FOE_PROT_ERROR);
00782 }
00783 return;
00784 }
00785
00786 if (opCode == EC_FOE_OPCODE_ERR) {
00787 fsm->request->error_code = EC_READ_U32(data + 2);
00788 EC_SLAVE_ERR(slave, "Received FoE Error Request (code 0x%08x).\n",
00789 fsm->request->error_code);
00790 if (rec_size > 6) {
00791 uint8_t text[256];
00792 strncpy(text, data + 6, min(rec_size - 6, sizeof(text)));
00793 EC_SLAVE_ERR(slave, "FoE Error Text: %s\n", text);
00794 }
00795 ec_foe_set_rx_error(fsm, FOE_OPCODE_ERROR);
00796 return;
00797 }
00798
00799 if (opCode != EC_FOE_OPCODE_DATA) {
00800 EC_SLAVE_ERR(slave, "Received OPCODE %x, expected %x.\n",
00801 opCode, EC_FOE_OPCODE_DATA);
00802 fsm->request->error_code = 0x00000000;
00803 ec_foe_set_rx_error(fsm, FOE_OPCODE_ERROR);
00804 return;
00805 }
00806
00807 packet_no = EC_READ_U16(data + 2);
00808 if (packet_no != fsm->rx_expected_packet_no) {
00809 EC_SLAVE_ERR(slave, "Received unexpected packet number.\n");
00810 ec_foe_set_rx_error(fsm, FOE_PACKETNO_ERROR);
00811 return;
00812 }
00813
00814 rec_size -= EC_FOE_HEADER_SIZE;
00815
00816 if (fsm->rx_buffer_size >= fsm->rx_buffer_offset + rec_size) {
00817 memcpy(fsm->rx_buffer + fsm->rx_buffer_offset,
00818 data + EC_FOE_HEADER_SIZE, rec_size);
00819 fsm->rx_buffer_offset += rec_size;
00820 }
00821
00822 fsm->rx_last_packet =
00823 (rec_size + EC_MBOX_HEADER_SIZE + EC_FOE_HEADER_SIZE
00824 != slave->configured_rx_mailbox_size);
00825
00826 if (fsm->rx_last_packet ||
00827 (slave->configured_rx_mailbox_size - EC_MBOX_HEADER_SIZE
00828 - EC_FOE_HEADER_SIZE + fsm->rx_buffer_offset)
00829 <= fsm->rx_buffer_size) {
00830
00831
00832 #ifdef DEBUG_FOE
00833 EC_SLAVE_DBG(fsm->slave, 0, "last_packet=true\n");
00834 #endif
00835 if (ec_foe_prepare_send_ack(fsm, datagram)) {
00836 ec_foe_set_rx_error(fsm, FOE_RX_DATA_ACK_ERROR);
00837 return;
00838 }
00839
00840 fsm->state = ec_fsm_foe_state_sent_ack;
00841 }
00842 else {
00843
00844
00845 EC_SLAVE_ERR(slave, "Data do not fit in receive buffer!\n");
00846 printk(" rx_buffer_size = %d\n", fsm->rx_buffer_size);
00847 printk("rx_buffer_offset = %d\n", fsm->rx_buffer_offset);
00848 printk(" rec_size = %zd\n", rec_size);
00849 printk(" rx_mailbox_size = %d\n", slave->configured_rx_mailbox_size);
00850 printk(" rx_last_packet = %d\n", fsm->rx_last_packet);
00851 fsm->request->result = FOE_READY;
00852 }
00853 }
00854
00855
00856
00859 void ec_fsm_foe_state_sent_ack(
00860 ec_fsm_foe_t *fsm,
00861 ec_datagram_t *datagram
00862 )
00863 {
00864 ec_slave_t *slave = fsm->slave;
00865
00866 #ifdef DEBUG_FOE
00867 EC_SLAVE_DBG(fsm->slave, 0, "%s()\n", __func__);
00868 #endif
00869
00870 if (fsm->datagram->state != EC_DATAGRAM_RECEIVED) {
00871 ec_foe_set_rx_error(fsm, FOE_RECEIVE_ERROR);
00872 EC_SLAVE_ERR(slave, "Failed to send FoE ACK: ");
00873 ec_datagram_print_state(fsm->datagram);
00874 return;
00875 }
00876
00877 if (fsm->datagram->working_counter != 1) {
00878
00879 ec_foe_set_rx_error(fsm, FOE_WC_ERROR);
00880 EC_SLAVE_ERR(slave, "Reception of FoE ACK failed: ");
00881 ec_datagram_print_wc_error(fsm->datagram);
00882 return;
00883 }
00884
00885 fsm->jiffies_start = fsm->datagram->jiffies_sent;
00886
00887 ec_slave_mbox_prepare_check(slave, datagram);
00888
00889 if (fsm->rx_last_packet) {
00890 fsm->rx_expected_packet_no = 0;
00891 fsm->request->data_size = fsm->rx_buffer_offset;
00892 fsm->state = ec_fsm_foe_end;
00893 }
00894 else {
00895 fsm->rx_expected_packet_no++;
00896 fsm->retries = EC_FSM_RETRIES;
00897 fsm->state = ec_fsm_foe_state_data_check;
00898 }
00899 }
00900
00901
00902
00905 void ec_foe_set_tx_error(
00906 ec_fsm_foe_t *fsm,
00907 uint32_t errorcode
00908 )
00909 {
00910 fsm->request->result = errorcode;
00911 fsm->state = ec_fsm_foe_error;
00912 }
00913
00914
00915
00918 void ec_foe_set_rx_error(
00919 ec_fsm_foe_t *fsm,
00920 uint32_t errorcode
00921 )
00922 {
00923 fsm->request->result = errorcode;
00924 fsm->state = ec_fsm_foe_error;
00925 }
00926
00927