master/master.c
changeset 113 a3dbd6bc8fce
parent 111 9963537ec776
child 114 e4b4b5a85e75
equal deleted inserted replaced
112:eec7639c7be9 113:a3dbd6bc8fce
   367                         )
   367                         )
   368 {
   368 {
   369     unsigned int response_tries_left;
   369     unsigned int response_tries_left;
   370 
   370 
   371     response_tries_left = 10;
   371     response_tries_left = 10;
   372     do
   372 
       
   373     while (1)
   373     {
   374     {
   374         ec_master_queue_command(master, command);
   375         ec_master_queue_command(master, command);
   375         ecrt_master_sync_io(master);
   376         ecrt_master_sync_io(master);
   376 
   377 
   377         if (command->state == EC_CMD_RECEIVED) {
   378         if (command->state == EC_CMD_RECEIVED) {
   378             break;
   379             if (likely(command->working_counter))
       
   380                 return 0;
   379         }
   381         }
   380         else if (command->state == EC_CMD_TIMEOUT) {
   382         else if (command->state == EC_CMD_TIMEOUT) {
   381             EC_ERR("Simple-IO TIMEOUT!\n");
   383             EC_ERR("Simple-IO TIMEOUT!\n");
   382             return -1;
   384             return -1;
   383         }
   385         }
   386             return -1;
   388             return -1;
   387         }
   389         }
   388 
   390 
   389         // Keine direkte Antwort. Dem Slave Zeit lassen...
   391         // Keine direkte Antwort. Dem Slave Zeit lassen...
   390         udelay(10);
   392         udelay(10);
   391     }
   393 
   392     while (unlikely(!command->working_counter && --response_tries_left));
   394         if (unlikely(--response_tries_left)) {
   393 
   395             EC_ERR("No response in simple-IO!\n");
   394     if (unlikely(!response_tries_left)) {
   396             return -1;
   395         EC_ERR("No response in simple-IO!\n");
   397         }
   396         return -1;
   398     }
   397     }
       
   398 
       
   399     return 0;
       
   400 }
   399 }
   401 
   400 
   402 /*****************************************************************************/
   401 /*****************************************************************************/
   403 
   402 
   404 /**
   403 /**
   858     ec_master_send_commands(master);
   857     ec_master_send_commands(master);
   859 
   858 
   860     t_start = get_cycles(); // Sendezeit nehmen
   859     t_start = get_cycles(); // Sendezeit nehmen
   861     t_timeout = master->timeout * cpu_khz / 1000;
   860     t_timeout = master->timeout * cpu_khz / 1000;
   862 
   861 
   863     do {
   862     while (1)
       
   863     {
   864         ec_device_call_isr(master->device);
   864         ec_device_call_isr(master->device);
   865 
   865 
   866         t_end = get_cycles(); // Aktuelle Zeit nehmen
   866         t_end = get_cycles(); // Aktuelle Zeit nehmen
   867         if (t_end - t_start >= t_timeout) break; // Timeout
   867         if (t_end - t_start >= t_timeout) break; // Timeout
   868 
   868 
   871             if (command->state == EC_CMD_RECEIVED)
   871             if (command->state == EC_CMD_RECEIVED)
   872                 list_del_init(&command->list);
   872                 list_del_init(&command->list);
   873             else if (command->state == EC_CMD_SENT)
   873             else if (command->state == EC_CMD_SENT)
   874                 commands_sent++;
   874                 commands_sent++;
   875         }
   875         }
   876     } while (commands_sent);
   876 
       
   877         if (!commands_sent) break;
       
   878     }
   877 
   879 
   878     // Zeit abgelaufen. Alle verbleibenden Kommandos entfernen.
   880     // Zeit abgelaufen. Alle verbleibenden Kommandos entfernen.
   879     list_for_each_entry_safe(command, next, &master->commands, list) {
   881     list_for_each_entry_safe(command, next, &master->commands, list) {
   880         switch (command->state) {
   882         switch (command->state) {
   881             case EC_CMD_SENT:
   883             case EC_CMD_SENT:
   981 
   983 
   982     t_start = get_cycles(); // Sendezeit nehmen
   984     t_start = get_cycles(); // Sendezeit nehmen
   983     t_timeout = master->timeout * cpu_khz / 1000;
   985     t_timeout = master->timeout * cpu_khz / 1000;
   984 
   986 
   985     // Aktiv warten!
   987     // Aktiv warten!
   986     do {
   988     while (1) {
   987         t_end = get_cycles();
   989         t_end = get_cycles();
   988     }
   990         if (t_end - t_start >= t_timeout) break;
   989     while (t_end - t_start < t_timeout);
   991     }
   990 }
   992 }
   991 
   993 
   992 /*****************************************************************************/
   994 /*****************************************************************************/
   993 
   995 
   994 /**
   996 /**