master/master.c
changeset 2021 ee30e7f90c2e
parent 2020 47db5df5c7b3
child 2022 393e7aef6706
equal deleted inserted replaced
2020:47db5df5c7b3 2021:ee30e7f90c2e
   167     init_waitqueue_head(&master->config_queue);
   167     init_waitqueue_head(&master->config_queue);
   168     
   168     
   169     INIT_LIST_HEAD(&master->datagram_queue);
   169     INIT_LIST_HEAD(&master->datagram_queue);
   170     master->datagram_index = 0;
   170     master->datagram_index = 0;
   171 
   171 
   172     INIT_LIST_HEAD(&master->ext_datagram_queue);
   172     sema_init(&master->fsm_queue_sem, 1);
   173     sema_init(&master->ext_queue_sem, 1);
       
   174 
       
   175     INIT_LIST_HEAD(&master->fsm_datagram_queue);
   173     INIT_LIST_HEAD(&master->fsm_datagram_queue);
   176     
   174     
   177     // send interval in IDLE phase
   175     // send interval in IDLE phase
   178     ec_master_set_send_interval(master, 1000000 / HZ);
   176     ec_master_set_send_interval(master, 1000000 / HZ);
   179 
   177 
   688         )
   686         )
   689 {
   687 {
   690     ec_datagram_t *datagram, *n;
   688     ec_datagram_t *datagram, *n;
   691     size_t queue_size = 0;
   689     size_t queue_size = 0;
   692 
   690 
   693     down(&master->ext_queue_sem);
   691     down(&master->fsm_queue_sem);
   694     if (list_empty(&master->fsm_datagram_queue)) {
   692     if (list_empty(&master->fsm_datagram_queue)) {
   695         up(&master->ext_queue_sem);
   693         up(&master->fsm_queue_sem);
   696         return;
   694         return;
   697     }
   695     }
   698     list_for_each_entry(datagram, &master->datagram_queue, queue) {
   696     list_for_each_entry(datagram, &master->datagram_queue, queue) {
   699         queue_size += datagram->data_size;
   697         queue_size += datagram->data_size;
   700     }
   698     }
   760                 }
   758                 }
   761 #endif
   759 #endif
   762             }
   760             }
   763         }
   761         }
   764     }
   762     }
   765     up(&master->ext_queue_sem);
   763     up(&master->fsm_queue_sem);
   766 }
   764 }
   767 
   765 
   768 /*****************************************************************************/
   766 /*****************************************************************************/
   769 
   767 
   770 /** Sets the expected interval between calls to ecrt_master_send
   768 /** Sets the expected interval between calls to ecrt_master_send
   803         ec_datagram_t *datagram /**< datagram */
   801         ec_datagram_t *datagram /**< datagram */
   804         )
   802         )
   805 {
   803 {
   806     ec_datagram_t *queued_datagram;
   804     ec_datagram_t *queued_datagram;
   807 
   805 
   808     down(&master->ext_queue_sem);
   806     down(&master->fsm_queue_sem);
   809 
   807 
   810     // check, if the datagram is already queued
   808     // check, if the datagram is already queued
   811     list_for_each_entry(queued_datagram, &master->fsm_datagram_queue,
   809     list_for_each_entry(queued_datagram, &master->fsm_datagram_queue,
   812             queue) {
   810             queue) {
   813         if (queued_datagram == datagram) {
   811         if (queued_datagram == datagram) {
   814             datagram->state = EC_DATAGRAM_QUEUED;
   812             datagram->state = EC_DATAGRAM_QUEUED;
   815             up(&master->ext_queue_sem);
   813             up(&master->fsm_queue_sem);
   816             return;
   814             return;
   817         }
   815         }
   818     }
   816     }
   819 
   817 
   820 #if DEBUG_INJECT
   818 #if DEBUG_INJECT
   827 #ifdef EC_HAVE_CYCLES
   825 #ifdef EC_HAVE_CYCLES
   828     datagram->cycles_sent = get_cycles();
   826     datagram->cycles_sent = get_cycles();
   829 #endif
   827 #endif
   830     datagram->jiffies_sent = jiffies;
   828     datagram->jiffies_sent = jiffies;
   831 
   829 
   832     up(&master->ext_queue_sem);
   830     up(&master->fsm_queue_sem);
   833 }
   831 }
   834 
   832 
   835 /*****************************************************************************/
   833 /*****************************************************************************/
   836 
   834 
   837 /** Places a datagram in the datagram queue.
   835 /** Places a datagram in the datagram queue.
   857 
   855 
   858     list_add_tail(&datagram->queue, &master->datagram_queue);
   856     list_add_tail(&datagram->queue, &master->datagram_queue);
   859     datagram->state = EC_DATAGRAM_QUEUED;
   857     datagram->state = EC_DATAGRAM_QUEUED;
   860 }
   858 }
   861 
   859 
   862 /*****************************************************************************/
       
   863 
       
   864 /** Places a datagram in the non-application datagram queue.
       
   865  */
       
   866 void ec_master_queue_datagram_ext(
       
   867         ec_master_t *master, /**< EtherCAT master */
       
   868         ec_datagram_t *datagram /**< datagram */
       
   869         )
       
   870 {
       
   871     down(&master->ext_queue_sem);
       
   872     list_add_tail(&datagram->queue, &master->ext_datagram_queue);
       
   873     up(&master->ext_queue_sem);
       
   874 }
       
   875 
   860 
   876 /*****************************************************************************/
   861 /*****************************************************************************/
   877 
   862 
   878 /** Sends the datagrams in the queue.
   863 /** Sends the datagrams in the queue.
   879  *
   864  *
  2113 
  2098 
  2114 /*****************************************************************************/
  2099 /*****************************************************************************/
  2115 
  2100 
  2116 void ecrt_master_send_ext(ec_master_t *master)
  2101 void ecrt_master_send_ext(ec_master_t *master)
  2117 {
  2102 {
  2118     ec_datagram_t *datagram, *next;
       
  2119 
       
  2120     list_for_each_entry_safe(datagram, next, &master->ext_datagram_queue,
       
  2121             queue) {
       
  2122         list_del(&datagram->queue);
       
  2123         ec_master_queue_datagram(master, datagram);
       
  2124     }
       
  2125 
       
  2126     ecrt_master_send(master);
  2103     ecrt_master_send(master);
  2127 }
  2104 }
  2128 
  2105 
  2129 /*****************************************************************************/
  2106 /*****************************************************************************/
  2130 
  2107