master/frame.c
changeset 89 e91ef35c36db
parent 84 b4ae98855cea
child 90 044e97bce4bd
equal deleted inserted replaced
88:98335157e54e 89:e91ef35c36db
   403 /*****************************************************************************/
   403 /*****************************************************************************/
   404 
   404 
   405 /**
   405 /**
   406    Sendet einen einzeln Rahmen und wartet auf dessen Empfang.
   406    Sendet einen einzeln Rahmen und wartet auf dessen Empfang.
   407 
   407 
       
   408    Wenn der Working-Counter nicht gesetzt wurde, wird der Rahmen
       
   409    nochmals gesendet.
       
   410 
       
   411    \todo Das ist noch nicht schön, da hier zwei Protokollschichten
       
   412    vermischt werden.
       
   413 
   408    \return 0 bei Erfolg, sonst < 0
   414    \return 0 bei Erfolg, sonst < 0
   409 */
   415 */
   410 
   416 
   411 int ec_frame_send_receive(ec_frame_t *frame
   417 int ec_frame_send_receive(ec_frame_t *frame
   412                           /**< Rahmen zum Senden/Empfangen */
   418                           /**< Rahmen zum Senden/Empfangen */
   413                           )
   419                           )
   414 {
   420 {
   415     unsigned int tries_left;
   421     unsigned int timeout_tries_left, response_tries_left;
   416 
   422     unsigned int tries;
   417     if (unlikely(ec_frame_send(frame) < 0)) {
   423 
   418         EC_ERR("Frame sending failed!\n");
   424     tries = 0;
   419         return -1;
   425     response_tries_left = 10;
   420     }
       
   421 
       
   422     tries_left = 20;
       
   423     do
   426     do
   424     {
   427     {
   425         udelay(1);
   428         tries++;
   426         ec_device_call_isr(&frame->master->device);
   429         if (unlikely(ec_frame_send(frame) < 0)) {
   427         tries_left--;
   430             EC_ERR("Frame sending failed!\n");
   428     }
   431             return -1;
   429     while (unlikely(!ec_device_received(&frame->master->device)
   432         }
   430                     && tries_left));
   433 
   431 
   434         timeout_tries_left = 20;
   432     if (unlikely(!tries_left)) {
   435         do
   433         EC_ERR("Frame timeout!\n");
   436         {
   434         return -1;
   437             udelay(1);
   435     }
   438             ec_device_call_isr(&frame->master->device);
   436 
   439             timeout_tries_left--;
   437     if (unlikely(ec_frame_receive(frame) < 0)) {
   440         }
   438         EC_ERR("Frame receiving failed!\n");
   441         while (unlikely(!ec_device_received(&frame->master->device)
   439         return -1;
   442                         && timeout_tries_left));
   440     }
   443 
       
   444         if (unlikely(!timeout_tries_left)) {
       
   445             EC_ERR("Frame timeout!\n");
       
   446             return -1;
       
   447         }
       
   448 
       
   449         if (unlikely(ec_frame_receive(frame) < 0)) {
       
   450             EC_ERR("Frame receiving failed!\n");
       
   451             return -1;
       
   452         }
       
   453 
       
   454         response_tries_left--;
       
   455     }
       
   456     while (unlikely(!frame->working_counter && response_tries_left));
       
   457 
       
   458     if (unlikely(!response_tries_left)) {
       
   459         EC_ERR("No response!");
       
   460         return -1;
       
   461     }
       
   462 
       
   463     if (tries > 1) EC_WARN("%i tries necessary...\n", tries);
   441 
   464 
   442     return 0;
   465     return 0;
   443 }
   466 }
   444 
   467 
   445 /*****************************************************************************/
   468 /*****************************************************************************/