134 slave->current_state = EC_SLAVE_STATE_UNKNOWN; |
134 slave->current_state = EC_SLAVE_STATE_UNKNOWN; |
135 slave->configured = 0; |
135 slave->configured = 0; |
136 slave->error_flag = 0; |
136 slave->error_flag = 0; |
137 slave->online = 1; |
137 slave->online = 1; |
138 slave->fmmu_count = 0; |
138 slave->fmmu_count = 0; |
139 slave->registered = 0; |
|
140 |
139 |
141 slave->coupler_index = 0; |
140 slave->coupler_index = 0; |
142 slave->coupler_subindex = 0xFFFF; |
141 slave->coupler_subindex = 0xFFFF; |
143 |
142 |
144 slave->base_type = 0; |
143 slave->base_type = 0; |
241 list_del(&sdo->list); |
240 list_del(&sdo->list); |
242 kobject_del(&sdo->kobj); |
241 kobject_del(&sdo->kobj); |
243 kobject_put(&sdo->kobj); |
242 kobject_put(&sdo->kobj); |
244 } |
243 } |
245 |
244 |
246 // free SDO kobject |
245 // free SDO kobject FIXME |
247 if (slave->sdo_dictionary_fetched) kobject_del(&slave->sdo_kobj); |
246 if (slave->sdo_dictionary_fetched) kobject_del(&slave->sdo_kobj); |
248 kobject_put(&slave->sdo_kobj); |
247 kobject_put(&slave->sdo_kobj); |
249 |
248 |
250 // free all SDO configurations |
249 // free all SDO configurations |
251 list_for_each_entry_safe(sdodata, next_sdodata, &slave->sdo_confs, list) { |
250 list_for_each_entry_safe(sdodata, next_sdodata, &slave->sdo_confs, list) { |
256 |
255 |
257 if (slave->eeprom_data) kfree(slave->eeprom_data); |
256 if (slave->eeprom_data) kfree(slave->eeprom_data); |
258 if (slave->new_eeprom_data) kfree(slave->new_eeprom_data); |
257 if (slave->new_eeprom_data) kfree(slave->new_eeprom_data); |
259 |
258 |
260 kfree(slave); |
259 kfree(slave); |
|
260 } |
|
261 |
|
262 /*****************************************************************************/ |
|
263 |
|
264 /** |
|
265 Reset slave from operation mode. |
|
266 */ |
|
267 |
|
268 void ec_slave_reset(ec_slave_t *slave /**< EtherCAT slave */) |
|
269 { |
|
270 slave->fmmu_count = 0; |
|
271 } |
|
272 |
|
273 /*****************************************************************************/ |
|
274 |
|
275 /** |
|
276 */ |
|
277 |
|
278 void ec_slave_request_state(ec_slave_t *slave, /**< ETherCAT slave */ |
|
279 ec_slave_state_t state /**< new state */ |
|
280 ) |
|
281 { |
|
282 slave->requested_state = state; |
|
283 slave->error_flag = 0; |
261 } |
284 } |
262 |
285 |
263 /*****************************************************************************/ |
286 /*****************************************************************************/ |
264 |
287 |
265 /** |
288 /** |
808 ec_slave_t *slave = container_of(kobj, ec_slave_t, kobj); |
830 ec_slave_t *slave = container_of(kobj, ec_slave_t, kobj); |
809 |
831 |
810 if (attr == &attr_state) { |
832 if (attr == &attr_state) { |
811 char state[EC_STATE_STRING_SIZE]; |
833 char state[EC_STATE_STRING_SIZE]; |
812 if (!strcmp(buffer, "INIT\n")) |
834 if (!strcmp(buffer, "INIT\n")) |
813 slave->requested_state = EC_SLAVE_STATE_INIT; |
835 ec_slave_request_state(slave, EC_SLAVE_STATE_INIT); |
814 else if (!strcmp(buffer, "PREOP\n")) |
836 else if (!strcmp(buffer, "PREOP\n")) |
815 slave->requested_state = EC_SLAVE_STATE_PREOP; |
837 ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP); |
816 else if (!strcmp(buffer, "SAVEOP\n")) |
838 else if (!strcmp(buffer, "SAVEOP\n")) |
817 slave->requested_state = EC_SLAVE_STATE_SAVEOP; |
839 ec_slave_request_state(slave, EC_SLAVE_STATE_SAVEOP); |
818 else if (!strcmp(buffer, "OP\n")) |
840 else if (!strcmp(buffer, "OP\n")) |
819 slave->requested_state = EC_SLAVE_STATE_OP; |
841 ec_slave_request_state(slave, EC_SLAVE_STATE_OP); |
820 else { |
842 else { |
821 EC_ERR("Invalid slave state \"%s\"!\n", buffer); |
843 EC_ERR("Invalid slave state \"%s\"!\n", buffer); |
822 return -EINVAL; |
844 return -EINVAL; |
823 } |
845 } |
824 |
846 |
825 ec_state_string(slave->requested_state, state); |
847 ec_state_string(slave->requested_state, state); |
826 EC_INFO("Accepted new state %s for slave %i.\n", |
848 EC_INFO("Accepted new state %s for slave %i.\n", |
827 state, slave->ring_position); |
849 state, slave->ring_position); |
828 slave->error_flag = 0; |
|
829 return size; |
850 return size; |
830 } |
851 } |
831 else if (attr == &attr_eeprom) { |
852 else if (attr == &attr_eeprom) { |
832 if (!ec_slave_write_eeprom(slave, buffer, size)) |
853 if (!ec_slave_write_eeprom(slave, buffer, size)) |
833 return size; |
854 return size; |