master/master.c
changeset 361 29af81543ce1
parent 356 4bdc4f2e1a93
child 377 ecac8252f114
equal deleted inserted replaced
360:a7a8ed41b50a 361:29af81543ce1
    96    \return 0 in case of success, else < 0
    96    \return 0 in case of success, else < 0
    97 */
    97 */
    98 
    98 
    99 int ec_master_init(ec_master_t *master, /**< EtherCAT master */
    99 int ec_master_init(ec_master_t *master, /**< EtherCAT master */
   100                    unsigned int index, /**< master index */
   100                    unsigned int index, /**< master index */
   101                    unsigned int eoeif_count /**< number of EoE interfaces */
   101                    unsigned int eoeif_count, /**< number of EoE interfaces */
       
   102                    dev_t dev_num /**< number for XML cdev's */
   102                    )
   103                    )
   103 {
   104 {
   104     ec_eoe_t *eoe, *next_eoe;
   105     ec_eoe_t *eoe, *next_eoe;
   105     unsigned int i;
   106     unsigned int i;
   106 
   107 
   131     if (!(master->workqueue = create_singlethread_workqueue("EtherCAT"))) {
   132     if (!(master->workqueue = create_singlethread_workqueue("EtherCAT"))) {
   132         EC_ERR("Failed to create master workqueue.\n");
   133         EC_ERR("Failed to create master workqueue.\n");
   133         goto out_return;
   134         goto out_return;
   134     }
   135     }
   135 
   136 
       
   137     // init XML character device
       
   138     if (ec_xmldev_init(&master->xmldev, master, dev_num)) {
       
   139         EC_ERR("Failed to init XML character device.\n");
       
   140         goto out_clear_wq;
       
   141     }
       
   142 
   136     // create EoE handlers
   143     // create EoE handlers
   137     for (i = 0; i < eoeif_count; i++) {
   144     for (i = 0; i < eoeif_count; i++) {
   138         if (!(eoe = (ec_eoe_t *) kmalloc(sizeof(ec_eoe_t), GFP_KERNEL))) {
   145         if (!(eoe = (ec_eoe_t *) kmalloc(sizeof(ec_eoe_t), GFP_KERNEL))) {
   139             EC_ERR("Failed to allocate EoE-Object.\n");
   146             EC_ERR("Failed to allocate EoE-Object.\n");
   140             goto out_clear_eoe;
   147             goto out_clear_eoe;
   166     list_for_each_entry_safe(eoe, next_eoe, &master->eoe_handlers, list) {
   173     list_for_each_entry_safe(eoe, next_eoe, &master->eoe_handlers, list) {
   167         list_del(&eoe->list);
   174         list_del(&eoe->list);
   168         ec_eoe_clear(eoe);
   175         ec_eoe_clear(eoe);
   169         kfree(eoe);
   176         kfree(eoe);
   170     }
   177     }
       
   178     ec_xmldev_clear(&master->xmldev);
       
   179  out_clear_wq:
   171     destroy_workqueue(master->workqueue);
   180     destroy_workqueue(master->workqueue);
   172  out_return:
   181  out_return:
   173     return -1;
   182     return -1;
   174 }
   183 }
   175 
   184 
   189     EC_INFO("Clearing master %i...\n", master->index);
   198     EC_INFO("Clearing master %i...\n", master->index);
   190 
   199 
   191     ec_master_reset(master);
   200     ec_master_reset(master);
   192     ec_fsm_clear(&master->fsm);
   201     ec_fsm_clear(&master->fsm);
   193     destroy_workqueue(master->workqueue);
   202     destroy_workqueue(master->workqueue);
       
   203     ec_xmldev_clear(&master->xmldev);
   194 
   204 
   195     // clear EoE objects
   205     // clear EoE objects
   196     list_for_each_entry_safe(eoe, next_eoe, &master->eoe_handlers, list) {
   206     list_for_each_entry_safe(eoe, next_eoe, &master->eoe_handlers, list) {
   197         list_del(&eoe->list);
   207         list_del(&eoe->list);
   198         ec_eoe_clear(eoe);
   208         ec_eoe_clear(eoe);