188 if (fsm->take_time) { |
188 if (fsm->take_time) { |
189 fsm->take_time = 0; |
189 fsm->take_time = 0; |
190 fsm->jiffies_start = datagram->jiffies_sent; |
190 fsm->jiffies_start = datagram->jiffies_sent; |
191 } |
191 } |
192 |
192 |
193 if (datagram->working_counter != 1) { |
193 if (datagram->working_counter == 0) { |
194 if (datagram->jiffies_received - fsm->jiffies_start >= 3 * HZ) { |
194 if (datagram->jiffies_received - fsm->jiffies_start >= 3 * HZ) { |
195 char state_str[EC_STATE_STRING_SIZE]; |
195 char state_str[EC_STATE_STRING_SIZE]; |
196 ec_state_string(fsm->requested_state, state_str); |
196 ec_state_string(fsm->requested_state, state_str); |
197 fsm->state = ec_fsm_change_state_error; |
197 fsm->state = ec_fsm_change_state_error; |
198 EC_ERR("Failed to set state %s on slave %i: Slave did not" |
198 EC_ERR("Failed to set state %s on slave %i: ", |
199 " respond.\n", state_str, fsm->slave->ring_position); |
199 state_str, fsm->slave->ring_position); |
|
200 ec_datagram_print_wc_error(datagram); |
200 return; |
201 return; |
201 } |
202 } |
202 |
203 |
203 // repeat writing new state to slave |
204 // repeat writing new state to slave |
204 ec_datagram_npwr(datagram, slave->station_address, 0x0120, 2); |
205 ec_datagram_npwr(datagram, slave->station_address, 0x0120, 2); |
205 EC_WRITE_U16(datagram->data, fsm->requested_state); |
206 EC_WRITE_U16(datagram->data, fsm->requested_state); |
206 fsm->retries = EC_FSM_RETRIES; |
207 fsm->retries = EC_FSM_RETRIES; |
207 return; |
208 return; |
208 } |
209 } |
209 |
210 |
|
211 if (unlikely(datagram->working_counter > 1)) { |
|
212 char state_str[EC_STATE_STRING_SIZE]; |
|
213 ec_state_string(fsm->requested_state, state_str); |
|
214 fsm->state = ec_fsm_change_state_error; |
|
215 EC_ERR("Failed to set state %s on slave %i: ", |
|
216 state_str, fsm->slave->ring_position); |
|
217 ec_datagram_print_wc_error(datagram); |
|
218 return; |
|
219 } |
|
220 |
210 fsm->take_time = 1; |
221 fsm->take_time = 1; |
211 |
222 |
212 // read AL status from slave |
223 // read AL status from slave |
213 ec_datagram_nprd(datagram, slave->station_address, 0x0130, 2); |
224 ec_datagram_nprd(datagram, slave->station_address, 0x0130, 2); |
214 fsm->retries = EC_FSM_RETRIES; |
225 fsm->retries = EC_FSM_RETRIES; |
240 |
251 |
241 if (datagram->working_counter != 1) { |
252 if (datagram->working_counter != 1) { |
242 char req_state[EC_STATE_STRING_SIZE]; |
253 char req_state[EC_STATE_STRING_SIZE]; |
243 ec_state_string(fsm->requested_state, req_state); |
254 ec_state_string(fsm->requested_state, req_state); |
244 fsm->state = ec_fsm_change_state_error; |
255 fsm->state = ec_fsm_change_state_error; |
245 EC_ERR("Failed to check state %s on slave %i.\n", |
256 EC_ERR("Failed to check state %s on slave %i: ", |
246 req_state, slave->ring_position); |
257 req_state, slave->ring_position); |
|
258 ec_datagram_print_wc_error(datagram); |
247 return; |
259 return; |
248 } |
260 } |
249 |
261 |
250 if (fsm->take_time) { |
262 if (fsm->take_time) { |
251 fsm->take_time = 0; |
263 fsm->take_time = 0; |
370 fsm->slave->ring_position, datagram->state); |
382 fsm->slave->ring_position, datagram->state); |
371 return; |
383 return; |
372 } |
384 } |
373 |
385 |
374 if (datagram->working_counter != 1) { |
386 if (datagram->working_counter != 1) { |
375 EC_WARN("Reception of AL status code datagram failed.\n"); |
387 EC_WARN("Reception of AL status code datagram failed: "); |
|
388 ec_datagram_print_wc_error(datagram); |
376 } |
389 } |
377 else { |
390 else { |
378 if ((code = EC_READ_U16(datagram->data))) { |
391 if ((code = EC_READ_U16(datagram->data))) { |
379 for (al_msg = al_status_messages; al_msg->code; al_msg++) { |
392 for (al_msg = al_status_messages; al_msg->code; al_msg++) { |
380 if (al_msg->code != code) continue; |
393 if (al_msg->code != code) continue; |
469 return; |
483 return; |
470 } |
484 } |
471 |
485 |
472 if (datagram->working_counter != 1) { |
486 if (datagram->working_counter != 1) { |
473 fsm->state = ec_fsm_change_state_error; |
487 fsm->state = ec_fsm_change_state_error; |
474 EC_ERR("Reception of state ack check datagram failed - slave %i did" |
488 EC_ERR("Reception of state ack check datagram failed on slave %i: ", |
475 " not respond.\n", slave->ring_position); |
489 slave->ring_position); |
|
490 ec_datagram_print_wc_error(datagram); |
476 return; |
491 return; |
477 } |
492 } |
478 |
493 |
479 if (fsm->take_time) { |
494 if (fsm->take_time) { |
480 fsm->take_time = 0; |
495 fsm->take_time = 0; |