178 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
178 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
179 return; |
179 return; |
180 |
180 |
181 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
181 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
182 fsm->state = ec_fsm_change_state_error; |
182 fsm->state = ec_fsm_change_state_error; |
183 EC_ERR("Failed to receive state datagram from slave %i" |
183 EC_ERR("Failed to receive state datagram from slave %u" |
184 " (datagram state %i)!\n", |
184 " (datagram state %u)!\n", |
185 fsm->slave->ring_position, datagram->state); |
185 fsm->slave->ring_position, datagram->state); |
186 return; |
186 return; |
187 } |
187 } |
188 |
188 |
189 if (fsm->take_time) { |
189 if (fsm->take_time) { |
194 if (datagram->working_counter == 0) { |
194 if (datagram->working_counter == 0) { |
195 if (datagram->jiffies_received - fsm->jiffies_start >= 3 * HZ) { |
195 if (datagram->jiffies_received - fsm->jiffies_start >= 3 * HZ) { |
196 char state_str[EC_STATE_STRING_SIZE]; |
196 char state_str[EC_STATE_STRING_SIZE]; |
197 ec_state_string(fsm->requested_state, state_str); |
197 ec_state_string(fsm->requested_state, state_str); |
198 fsm->state = ec_fsm_change_state_error; |
198 fsm->state = ec_fsm_change_state_error; |
199 EC_ERR("Failed to set state %s on slave %i: ", |
199 EC_ERR("Failed to set state %s on slave %u: ", |
200 state_str, fsm->slave->ring_position); |
200 state_str, fsm->slave->ring_position); |
201 ec_datagram_print_wc_error(datagram); |
201 ec_datagram_print_wc_error(datagram); |
202 return; |
202 return; |
203 } |
203 } |
204 |
204 |
211 |
211 |
212 if (unlikely(datagram->working_counter > 1)) { |
212 if (unlikely(datagram->working_counter > 1)) { |
213 char state_str[EC_STATE_STRING_SIZE]; |
213 char state_str[EC_STATE_STRING_SIZE]; |
214 ec_state_string(fsm->requested_state, state_str); |
214 ec_state_string(fsm->requested_state, state_str); |
215 fsm->state = ec_fsm_change_state_error; |
215 fsm->state = ec_fsm_change_state_error; |
216 EC_ERR("Failed to set state %s on slave %i: ", |
216 EC_ERR("Failed to set state %s on slave %u: ", |
217 state_str, fsm->slave->ring_position); |
217 state_str, fsm->slave->ring_position); |
218 ec_datagram_print_wc_error(datagram); |
218 ec_datagram_print_wc_error(datagram); |
219 return; |
219 return; |
220 } |
220 } |
221 |
221 |
243 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
243 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
244 return; |
244 return; |
245 |
245 |
246 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
246 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
247 fsm->state = ec_fsm_change_state_error; |
247 fsm->state = ec_fsm_change_state_error; |
248 EC_ERR("Failed to receive state checking datagram from slave %i" |
248 EC_ERR("Failed to receive state checking datagram from slave %u" |
249 " (datagram state %i).\n", |
249 " (datagram state %u).\n", |
250 slave->ring_position, datagram->state); |
250 slave->ring_position, datagram->state); |
251 return; |
251 return; |
252 } |
252 } |
253 |
253 |
254 if (datagram->working_counter != 1) { |
254 if (datagram->working_counter != 1) { |
255 char req_state[EC_STATE_STRING_SIZE]; |
255 char req_state[EC_STATE_STRING_SIZE]; |
256 ec_state_string(fsm->requested_state, req_state); |
256 ec_state_string(fsm->requested_state, req_state); |
257 fsm->state = ec_fsm_change_state_error; |
257 fsm->state = ec_fsm_change_state_error; |
258 EC_ERR("Failed to check state %s on slave %i: ", |
258 EC_ERR("Failed to check state %s on slave %u: ", |
259 req_state, slave->ring_position); |
259 req_state, slave->ring_position); |
260 ec_datagram_print_wc_error(datagram); |
260 ec_datagram_print_wc_error(datagram); |
261 return; |
261 return; |
262 } |
262 } |
263 |
263 |
283 // Slave spontaneously changed its state just before the new state |
283 // Slave spontaneously changed its state just before the new state |
284 // was written. Accept current state as old state and wait for |
284 // was written. Accept current state as old state and wait for |
285 // state change |
285 // state change |
286 fsm->spontaneous_change = 1; |
286 fsm->spontaneous_change = 1; |
287 fsm->old_state = slave->current_state; |
287 fsm->old_state = slave->current_state; |
288 EC_WARN("Slave %i changed to %s in the meantime.\n", |
288 EC_WARN("Slave %u changed to %s in the meantime.\n", |
289 slave->ring_position, cur_state); |
289 slave->ring_position, cur_state); |
290 goto check_again; |
290 goto check_again; |
291 } |
291 } |
292 |
292 |
293 // state change error |
293 // state change error |
294 |
294 |
295 slave->error_flag = 1; |
295 slave->error_flag = 1; |
296 ec_state_string(fsm->requested_state, req_state); |
296 ec_state_string(fsm->requested_state, req_state); |
297 |
297 |
298 EC_ERR("Failed to set %s state, slave %i refused state change (%s).\n", |
298 EC_ERR("Failed to set %s state, slave %u refused state change (%s).\n", |
299 req_state, slave->ring_position, cur_state); |
299 req_state, slave->ring_position, cur_state); |
300 // fetch AL status error code |
300 // fetch AL status error code |
301 ec_datagram_fprd(datagram, slave->station_address, 0x0134, 2); |
301 ec_datagram_fprd(datagram, slave->station_address, 0x0134, 2); |
302 fsm->retries = EC_FSM_RETRIES; |
302 fsm->retries = EC_FSM_RETRIES; |
303 fsm->state = ec_fsm_change_state_code; |
303 fsm->state = ec_fsm_change_state_code; |
309 if (datagram->jiffies_received - fsm->jiffies_start >= HZ) { // 1s |
309 if (datagram->jiffies_received - fsm->jiffies_start >= HZ) { // 1s |
310 // timeout while checking |
310 // timeout while checking |
311 char state_str[EC_STATE_STRING_SIZE]; |
311 char state_str[EC_STATE_STRING_SIZE]; |
312 ec_state_string(fsm->requested_state, state_str); |
312 ec_state_string(fsm->requested_state, state_str); |
313 fsm->state = ec_fsm_change_state_error; |
313 fsm->state = ec_fsm_change_state_error; |
314 EC_ERR("Timeout while setting state %s on slave %i.\n", |
314 EC_ERR("Timeout while setting state %s on slave %u.\n", |
315 state_str, slave->ring_position); |
315 state_str, slave->ring_position); |
316 return; |
316 return; |
317 } |
317 } |
318 |
318 |
319 check_again: |
319 check_again: |
378 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
378 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
379 return; |
379 return; |
380 |
380 |
381 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
381 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
382 fsm->state = ec_fsm_change_state_error; |
382 fsm->state = ec_fsm_change_state_error; |
383 EC_ERR("Failed to receive AL status code datagram from slave %i" |
383 EC_ERR("Failed to receive AL status code datagram from slave %u" |
384 " (datagram state %i).\n", |
384 " (datagram state %u).\n", |
385 fsm->slave->ring_position, datagram->state); |
385 fsm->slave->ring_position, datagram->state); |
386 return; |
386 return; |
387 } |
387 } |
388 |
388 |
389 if (datagram->working_counter != 1) { |
389 if (datagram->working_counter != 1) { |
437 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
437 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
438 return; |
438 return; |
439 |
439 |
440 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
440 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
441 fsm->state = ec_fsm_change_state_error; |
441 fsm->state = ec_fsm_change_state_error; |
442 EC_ERR("Failed to receive state ack datagram for slave %i" |
442 EC_ERR("Failed to receive state ack datagram for slave %u" |
443 " (datagram state %i).\n", |
443 " (datagram state %u).\n", |
444 slave->ring_position, datagram->state); |
444 slave->ring_position, datagram->state); |
445 return; |
445 return; |
446 } |
446 } |
447 |
447 |
448 if (datagram->working_counter != 1) { |
448 if (datagram->working_counter != 1) { |
449 fsm->state = ec_fsm_change_state_error; |
449 fsm->state = ec_fsm_change_state_error; |
450 EC_ERR("Reception of state ack datagram failed on slave %i: ", |
450 EC_ERR("Reception of state ack datagram failed on slave %u: ", |
451 slave->ring_position); |
451 slave->ring_position); |
452 ec_datagram_print_wc_error(datagram); |
452 ec_datagram_print_wc_error(datagram); |
453 return; |
453 return; |
454 } |
454 } |
455 |
455 |
476 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
476 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
477 return; |
477 return; |
478 |
478 |
479 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
479 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
480 fsm->state = ec_fsm_change_state_error; |
480 fsm->state = ec_fsm_change_state_error; |
481 EC_ERR("Failed to receive state ack check datagram from slave %i" |
481 EC_ERR("Failed to receive state ack check datagram from slave %u" |
482 " (datagram state %i).\n", |
482 " (datagram state %u).\n", |
483 slave->ring_position, datagram->state); |
483 slave->ring_position, datagram->state); |
484 return; |
484 return; |
485 } |
485 } |
486 |
486 |
487 if (datagram->working_counter != 1) { |
487 if (datagram->working_counter != 1) { |
488 fsm->state = ec_fsm_change_state_error; |
488 fsm->state = ec_fsm_change_state_error; |
489 EC_ERR("Reception of state ack check datagram failed on slave %i: ", |
489 EC_ERR("Reception of state ack check datagram failed on slave %u: ", |
490 slave->ring_position); |
490 slave->ring_position); |
491 ec_datagram_print_wc_error(datagram); |
491 ec_datagram_print_wc_error(datagram); |
492 return; |
492 return; |
493 } |
493 } |
494 |
494 |
506 fsm->state = ec_fsm_change_state_error; |
506 fsm->state = ec_fsm_change_state_error; |
507 } |
507 } |
508 else { // EC_FSM_CHANGE_MODE_ACK_ONLY |
508 else { // EC_FSM_CHANGE_MODE_ACK_ONLY |
509 fsm->state = ec_fsm_change_state_end; |
509 fsm->state = ec_fsm_change_state_end; |
510 } |
510 } |
511 EC_INFO("Acknowledged state %s on slave %i.\n", |
511 EC_INFO("Acknowledged state %s on slave %u.\n", |
512 state_str, slave->ring_position); |
512 state_str, slave->ring_position); |
513 return; |
513 return; |
514 } |
514 } |
515 |
515 |
516 if (datagram->jiffies_received - fsm->jiffies_start >= HZ) { // 1s |
516 if (datagram->jiffies_received - fsm->jiffies_start >= HZ) { // 1s |
517 // timeout while checking |
517 // timeout while checking |
518 char state_str[EC_STATE_STRING_SIZE]; |
518 char state_str[EC_STATE_STRING_SIZE]; |
519 ec_state_string(slave->current_state, state_str); |
519 ec_state_string(slave->current_state, state_str); |
520 fsm->state = ec_fsm_change_state_error; |
520 fsm->state = ec_fsm_change_state_error; |
521 EC_ERR("Timeout while acknowledging state %s on slave %i.\n", |
521 EC_ERR("Timeout while acknowledging state %s on slave %u.\n", |
522 state_str, slave->ring_position); |
522 state_str, slave->ring_position); |
523 return; |
523 return; |
524 } |
524 } |
525 |
525 |
526 // reread new AL status |
526 // reread new AL status |