master/fsm_soe.c
changeset 1881 f0047c6226c0
parent 1877 7b77000f9764
child 1882 8ae8cc56d910
equal deleted inserted replaced
1880:f46bec1b5f21 1881:f0047c6226c0
   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;
   454 
   483 
   455     data = ec_slave_mbox_prepare_send(slave, datagram, EC_MBOX_TYPE_SOE,
   484     data = ec_slave_mbox_prepare_send(slave, datagram, EC_MBOX_TYPE_SOE,
   456             EC_SOE_WRITE_REQUEST_SIZE + fragment_size);
   485             EC_SOE_WRITE_REQUEST_SIZE + fragment_size);
   457     if (IS_ERR(data)) {
   486     if (IS_ERR(data)) {
   458         fsm->state = ec_fsm_soe_error;
   487         fsm->state = ec_fsm_soe_error;
       
   488         ec_fsm_soe_print_error(fsm);
   459         return;
   489         return;
   460     }
   490     }
   461 
   491 
   462     EC_WRITE_U8(data, EC_SOE_OPCODE_WRITE_REQUEST | incomplete << 3);
   492     EC_WRITE_U8(data, EC_SOE_OPCODE_WRITE_REQUEST | incomplete << 3);
   463     EC_WRITE_U8(data + 1, 1 << 6); // only value included
   493     EC_WRITE_U8(data + 1, 1 << 6); // only value included
   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 
   528                 // no response; send request datagram again
   559                 // no response; send request datagram again
   529                 return;
   560                 return;
   530             }
   561             }
   531         }
   562         }
   532         fsm->state = ec_fsm_soe_error;
   563         fsm->state = ec_fsm_soe_error;
   533         EC_ERR("Reception of SoE write request for IDN 0x%04x failed"
   564         EC_ERR("Reception of SoE write request failed after %u ms: ",
   534                 " after %u ms on slave %u: ",
   565                 (u32) diff_ms);
   535                 fsm->request->idn, (u32) diff_ms,
       
   536                 fsm->slave->ring_position);
       
   537         ec_datagram_print_wc_error(datagram);
   566         ec_datagram_print_wc_error(datagram);
       
   567         ec_fsm_soe_print_error(fsm);
   538         return;
   568         return;
   539     }
   569     }
   540 
   570 
   541     fsm->jiffies_start = datagram->jiffies_sent;
   571     fsm->jiffies_start = datagram->jiffies_sent;
   542 
   572 
   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;
   683             req->error_code = EC_READ_U16(data + EC_SOE_WRITE_RESPONSE_SIZE);
   718             req->error_code = EC_READ_U16(data + EC_SOE_WRITE_RESPONSE_SIZE);
   684             EC_ERR("Received error response:\n");
   719             EC_ERR("Received error response:\n");
   685             ec_print_soe_error(req->error_code);
   720             ec_print_soe_error(req->error_code);
   686         }
   721         }
   687         ec_print_data(data, rec_size);
   722         ec_print_data(data, rec_size);
       
   723         ec_fsm_soe_print_error(fsm);
   688         fsm->state = ec_fsm_soe_error;
   724         fsm->state = ec_fsm_soe_error;
   689         return;
   725         return;
   690     } else {
   726     } else {
   691         req->error_code = 0x0000;
   727         req->error_code = 0x0000;
   692     }
   728     }