137 ec_datagram_t *datagram, *next; |
137 ec_datagram_t *datagram, *next; |
138 ec_domain_t *domain; |
138 ec_domain_t *domain; |
139 |
139 |
140 domain = container_of(kobj, ec_domain_t, kobj); |
140 domain = container_of(kobj, ec_domain_t, kobj); |
141 |
141 |
142 EC_INFO("Clearing domain %i.\n", domain->index); |
|
143 |
|
144 list_for_each_entry_safe(datagram, next, &domain->datagrams, list) { |
142 list_for_each_entry_safe(datagram, next, &domain->datagrams, list) { |
145 ec_datagram_clear(datagram); |
143 ec_datagram_clear(datagram); |
146 kfree(datagram); |
144 kfree(datagram); |
147 } |
145 } |
148 |
146 |
220 data_reg->sync = sync; |
218 data_reg->sync = sync; |
221 data_reg->sync_offset = byte_offset; |
219 data_reg->sync_offset = byte_offset; |
222 data_reg->data_ptr = data_ptr; |
220 data_reg->data_ptr = data_ptr; |
223 |
221 |
224 list_add_tail(&data_reg->list, &domain->data_regs); |
222 list_add_tail(&data_reg->list, &domain->data_regs); |
|
223 |
|
224 ec_slave_request_state(slave, EC_SLAVE_STATE_OP); |
|
225 |
225 return 0; |
226 return 0; |
226 } |
227 } |
227 |
228 |
228 /*****************************************************************************/ |
229 /*****************************************************************************/ |
229 |
230 |
295 sync->index, slave->ring_position, sync_length); |
296 sync->index, slave->ring_position, sync_length); |
296 } |
297 } |
297 } |
298 } |
298 |
299 |
299 list_add_tail(&data_reg->list, &domain->data_regs); |
300 list_add_tail(&data_reg->list, &domain->data_regs); |
|
301 |
|
302 ec_slave_request_state(slave, EC_SLAVE_STATE_OP); |
|
303 |
300 return 0; |
304 return 0; |
301 } |
305 } |
302 |
306 |
303 /*****************************************************************************/ |
307 /*****************************************************************************/ |
304 |
308 |
446 |
450 |
447 /** |
451 /** |
448 Places all process data datagrams in the masters datagram queue. |
452 Places all process data datagrams in the masters datagram queue. |
449 */ |
453 */ |
450 |
454 |
451 void ec_domain_queue(ec_domain_t *domain /**< EtherCAT domain */) |
455 void ec_domain_queue_datagrams(ec_domain_t *domain /**< EtherCAT domain */) |
452 { |
456 { |
453 ec_datagram_t *datagram; |
457 ec_datagram_t *datagram; |
454 |
458 |
455 list_for_each_entry(datagram, &domain->datagrams, list) { |
459 list_for_each_entry(datagram, &domain->datagrams, list) { |
456 ec_master_queue_datagram(domain->master, datagram); |
460 ec_master_queue_datagram(domain->master, datagram); |
|
461 } |
|
462 } |
|
463 |
|
464 /*****************************************************************************/ |
|
465 |
|
466 /** |
|
467 Dequeues all datagrams from the masters datagram queue. |
|
468 */ |
|
469 |
|
470 void ec_domain_dequeue_datagrams(ec_domain_t *domain /**< EtherCAT domain */) |
|
471 { |
|
472 ec_datagram_t *datagram; |
|
473 |
|
474 list_for_each_entry(datagram, &domain->datagrams, list) { |
|
475 if (!list_empty(&datagram->queue)) // datagram queued? |
|
476 list_del_init(&datagram->queue); |
457 } |
477 } |
458 } |
478 } |
459 |
479 |
460 /*****************************************************************************/ |
480 /*****************************************************************************/ |
461 |
481 |
516 |
536 |
517 // translate address and validate slave |
537 // translate address and validate slave |
518 if (!(slave = ecrt_master_get_slave(master, address))) return NULL; |
538 if (!(slave = ecrt_master_get_slave(master, address))) return NULL; |
519 if (ec_slave_validate(slave, vendor_id, product_code)) return NULL; |
539 if (ec_slave_validate(slave, vendor_id, product_code)) return NULL; |
520 |
540 |
521 if (!data_ptr) { |
541 if (!data_ptr) return slave; |
522 // data_ptr is NULL => mark slave as "registered" (do not warn) |
|
523 slave->registered = 1; |
|
524 } |
|
525 |
542 |
526 list_for_each_entry(pdo, &slave->sii_pdos, list) { |
543 list_for_each_entry(pdo, &slave->sii_pdos, list) { |
527 list_for_each_entry(entry, &pdo->entries, list) { |
544 list_for_each_entry(entry, &pdo->entries, list) { |
528 if (entry->index != pdo_index |
545 if (entry->index != pdo_index |
529 || entry->subindex != pdo_subindex) continue; |
546 || entry->subindex != pdo_subindex) continue; |
530 |
547 |
531 if (data_ptr) { |
548 if (ec_domain_reg_pdo_entry(domain, slave, pdo, entry, data_ptr)) { |
532 ec_domain_reg_pdo_entry(domain, slave, pdo, entry, data_ptr); |
549 return NULL; |
533 } |
550 } |
534 |
551 |
535 return slave; |
552 return slave; |
536 } |
553 } |
537 } |
554 } |
538 |
555 |
539 EC_ERR("Slave %i does not provide PDO 0x%04X:%i.\n", |
556 EC_ERR("Slave %i does not provide PDO 0x%04X:%i.\n", |
540 slave->ring_position, pdo_index, pdo_subindex); |
557 slave->ring_position, pdo_index, pdo_subindex); |
541 slave->registered = 0; |
|
542 return NULL; |
558 return NULL; |
543 } |
559 } |
544 |
560 |
545 /*****************************************************************************/ |
561 /*****************************************************************************/ |
546 |
562 |
607 |
623 |
608 // translate address and validate slave |
624 // translate address and validate slave |
609 if (!(slave = ecrt_master_get_slave(master, address))) return NULL; |
625 if (!(slave = ecrt_master_get_slave(master, address))) return NULL; |
610 if (ec_slave_validate(slave, vendor_id, product_code)) return NULL; |
626 if (ec_slave_validate(slave, vendor_id, product_code)) return NULL; |
611 |
627 |
612 if (!data_ptr) { |
628 if (!data_ptr) return slave; |
613 // data_ptr is NULL => mark slave as "registered" (do not warn) |
|
614 slave->registered = 1; |
|
615 return slave; |
|
616 } |
|
617 |
629 |
618 if (ec_domain_reg_pdo_range(domain, slave, |
630 if (ec_domain_reg_pdo_range(domain, slave, |
619 direction, offset, length, data_ptr)) { |
631 direction, offset, length, data_ptr)) { |
620 return NULL; |
632 return NULL; |
621 } |
633 } |