--- 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;
}