diff -r 98335157e54e -r e91ef35c36db master/frame.c --- a/master/frame.c Sun Feb 26 12:26:23 2006 +0000 +++ b/master/frame.c Tue Feb 28 09:09:08 2006 +0000 @@ -405,6 +405,12 @@ /** Sendet einen einzeln Rahmen und wartet auf dessen Empfang. + Wenn der Working-Counter nicht gesetzt wurde, wird der Rahmen + nochmals gesendet. + + \todo Das ist noch nicht schön, da hier zwei Protokollschichten + vermischt werden. + \return 0 bei Erfolg, sonst < 0 */ @@ -412,32 +418,49 @@ /**< Rahmen zum Senden/Empfangen */ ) { - unsigned int tries_left; - - if (unlikely(ec_frame_send(frame) < 0)) { - EC_ERR("Frame sending failed!\n"); - return -1; - } - - tries_left = 20; + unsigned int timeout_tries_left, response_tries_left; + unsigned int tries; + + tries = 0; + response_tries_left = 10; do { - udelay(1); - ec_device_call_isr(&frame->master->device); - tries_left--; - } - while (unlikely(!ec_device_received(&frame->master->device) - && tries_left)); - - if (unlikely(!tries_left)) { - EC_ERR("Frame timeout!\n"); - return -1; - } - - if (unlikely(ec_frame_receive(frame) < 0)) { - EC_ERR("Frame receiving failed!\n"); - return -1; - } + tries++; + if (unlikely(ec_frame_send(frame) < 0)) { + EC_ERR("Frame sending failed!\n"); + return -1; + } + + timeout_tries_left = 20; + do + { + udelay(1); + ec_device_call_isr(&frame->master->device); + timeout_tries_left--; + } + while (unlikely(!ec_device_received(&frame->master->device) + && timeout_tries_left)); + + if (unlikely(!timeout_tries_left)) { + EC_ERR("Frame timeout!\n"); + return -1; + } + + if (unlikely(ec_frame_receive(frame) < 0)) { + EC_ERR("Frame receiving failed!\n"); + return -1; + } + + response_tries_left--; + } + while (unlikely(!frame->working_counter && response_tries_left)); + + if (unlikely(!response_tries_left)) { + EC_ERR("No response!"); + return -1; + } + + if (tries > 1) EC_WARN("%i tries necessary...\n", tries); return 0; }