equal
deleted
inserted
replaced
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); |