master/master.c
changeset 441 ffa13db95e10
parent 435 779a18d12e6c
child 444 31223539fc00
equal deleted inserted replaced
440:16fddae16c94 441:ffa13db95e10
    56 
    56 
    57 void ec_master_clear(struct kobject *);
    57 void ec_master_clear(struct kobject *);
    58 void ec_master_sync_io(ec_master_t *);
    58 void ec_master_sync_io(ec_master_t *);
    59 void ec_master_idle_run(void *);
    59 void ec_master_idle_run(void *);
    60 void ec_master_eoe_run(unsigned long);
    60 void ec_master_eoe_run(unsigned long);
       
    61 void ec_master_check_sdo(unsigned long);
    61 ssize_t ec_show_master_attribute(struct kobject *, struct attribute *, char *);
    62 ssize_t ec_show_master_attribute(struct kobject *, struct attribute *, char *);
    62 ssize_t ec_store_master_attribute(struct kobject *, struct attribute *,
    63 ssize_t ec_store_master_attribute(struct kobject *, struct attribute *,
    63                                   const char *, size_t);
    64                                   const char *, size_t);
    64 
    65 
    65 /*****************************************************************************/
    66 /*****************************************************************************/
   128         master->eoe_cycle_times[i] = 0;
   129         master->eoe_cycle_times[i] = 0;
   129     }
   130     }
   130     master->idle_cycle_time_pos = 0;
   131     master->idle_cycle_time_pos = 0;
   131     master->eoe_cycle_time_pos = 0;
   132     master->eoe_cycle_time_pos = 0;
   132     master->debug_level = 0;
   133     master->debug_level = 0;
   133     INIT_LIST_HEAD(&master->sdo_requests);
   134     init_MUTEX(&master->sdo_sem);
   134     init_waitqueue_head(&master->sdo_wait_queue);
   135     init_timer(&master->sdo_timer);
       
   136     master->sdo_timer.function = ec_master_check_sdo;
       
   137     master->sdo_timer.data = (unsigned long) master;
       
   138     init_completion(&master->sdo_complete);
   135 
   139 
   136     // create workqueue
   140     // create workqueue
   137     if (!(master->workqueue = create_singlethread_workqueue("EtherCAT"))) {
   141     if (!(master->workqueue = create_singlethread_workqueue("EtherCAT"))) {
   138         EC_ERR("Failed to create master workqueue.\n");
   142         EC_ERR("Failed to create master workqueue.\n");
   139         goto out_return;
   143         goto out_return;
   299    Flushes the SDO request queue.
   303    Flushes the SDO request queue.
   300 */
   304 */
   301 
   305 
   302 void ec_master_flush_sdo_requests(ec_master_t *master)
   306 void ec_master_flush_sdo_requests(ec_master_t *master)
   303 {
   307 {
   304     ec_sdo_request_t *req, *next_req;
   308     del_timer_sync(&master->sdo_timer);
   305 
   309     complete(&master->sdo_complete);
   306     list_for_each_entry_safe(req, next_req, &master->sdo_requests, queue) {
   310     master->sdo_request = NULL;
   307         list_del_init(&req->queue);
   311     master->sdo_seq_user = 0;
   308         req->return_code = -1;
   312     master->sdo_seq_master = 0;
   309     }
       
   310 
       
   311     wake_up_interruptible(&master->sdo_wait_queue);
       
   312 }
   313 }
   313 
   314 
   314 /*****************************************************************************/
   315 /*****************************************************************************/
   315 
   316 
   316 /**
   317 /**
  1002 
  1003 
  1003     master->eoe_running = 0;
  1004     master->eoe_running = 0;
  1004 }
  1005 }
  1005 
  1006 
  1006 /*****************************************************************************/
  1007 /*****************************************************************************/
       
  1008 
  1007 /**
  1009 /**
  1008    Does the Ethernet-over-EtherCAT processing.
  1010    Does the Ethernet-over-EtherCAT processing.
  1009 */
  1011 */
  1010 
  1012 
  1011 void ec_master_eoe_run(unsigned long data /**< master pointer */)
  1013 void ec_master_eoe_run(unsigned long data /**< master pointer */)
  1060  queue_timer:
  1062  queue_timer:
  1061     restart_jiffies = HZ / EC_EOE_FREQUENCY;
  1063     restart_jiffies = HZ / EC_EOE_FREQUENCY;
  1062     if (!restart_jiffies) restart_jiffies = 1;
  1064     if (!restart_jiffies) restart_jiffies = 1;
  1063     master->eoe_timer.expires += restart_jiffies;
  1065     master->eoe_timer.expires += restart_jiffies;
  1064     add_timer(&master->eoe_timer);
  1066     add_timer(&master->eoe_timer);
       
  1067 }
       
  1068 
       
  1069 /*****************************************************************************/
       
  1070 
       
  1071 /**
       
  1072 */
       
  1073 
       
  1074 void ec_master_check_sdo(unsigned long data /**< master pointer */)
       
  1075 {
       
  1076     ec_master_t *master = (ec_master_t *) data;
       
  1077 
       
  1078     if (master->sdo_seq_master != master->sdo_seq_user) {
       
  1079         master->sdo_timer.expires = jiffies + 10;
       
  1080         add_timer(&master->sdo_timer);
       
  1081         return;
       
  1082     }
       
  1083 
       
  1084     // master has processed the request
       
  1085     complete(&master->sdo_complete);
  1065 }
  1086 }
  1066 
  1087 
  1067 /*****************************************************************************/
  1088 /*****************************************************************************/
  1068 
  1089 
  1069 /**
  1090 /**