equal
deleted
inserted
replaced
180 return -EOVERFLOW; |
180 return -EOVERFLOW; |
181 } |
181 } |
182 |
182 |
183 fmmu = &sc->fmmu_configs[sc->used_fmmus]; |
183 fmmu = &sc->fmmu_configs[sc->used_fmmus]; |
184 |
184 |
185 down(&sc->master->master_sem); |
185 ec_mutex_lock(&sc->master->master_mutex); |
186 ec_fmmu_config_init(fmmu, sc, sync_index, dir); |
186 ec_fmmu_config_init(fmmu, sc, sync_index, dir); |
187 fmmu_logical_start_address = domain->tx_size; |
187 fmmu_logical_start_address = domain->tx_size; |
188 tx_size = fmmu->data_size; |
188 tx_size = fmmu->data_size; |
189 if (sc->allow_overlapping_pdos && sc->used_fmmus > 0) { |
189 if (sc->allow_overlapping_pdos && sc->used_fmmus > 0) { |
190 prev_fmmu = &sc->fmmu_configs[sc->used_fmmus-1]; |
190 prev_fmmu = &sc->fmmu_configs[sc->used_fmmus-1]; |
197 tx_size = 0; |
197 tx_size = 0; |
198 fmmu_logical_start_address = prev_fmmu->logical_start_address; |
198 fmmu_logical_start_address = prev_fmmu->logical_start_address; |
199 } |
199 } |
200 } |
200 } |
201 ec_fmmu_config_domain(fmmu,domain,fmmu_logical_start_address,tx_size); |
201 ec_fmmu_config_domain(fmmu,domain,fmmu_logical_start_address,tx_size); |
202 up(&sc->master->master_sem); |
202 ec_mutex_unlock(&sc->master->master_mutex); |
203 |
203 |
204 ++sc->used_fmmus; |
204 ++sc->used_fmmus; |
205 return fmmu->domain_address; |
205 return fmmu->domain_address; |
206 } |
206 } |
207 |
207 |
534 if (sync_index >= EC_MAX_SYNC_MANAGERS) { |
534 if (sync_index >= EC_MAX_SYNC_MANAGERS) { |
535 EC_CONFIG_ERR(sc, "Invalid sync manager index %u!\n", sync_index); |
535 EC_CONFIG_ERR(sc, "Invalid sync manager index %u!\n", sync_index); |
536 return -EINVAL; |
536 return -EINVAL; |
537 } |
537 } |
538 |
538 |
539 down(&sc->master->master_sem); |
539 ec_mutex_lock(&sc->master->master_mutex); |
540 |
540 |
541 pdo = ec_pdo_list_add_pdo(&sc->sync_configs[sync_index].pdos, pdo_index); |
541 pdo = ec_pdo_list_add_pdo(&sc->sync_configs[sync_index].pdos, pdo_index); |
542 if (IS_ERR(pdo)) { |
542 if (IS_ERR(pdo)) { |
543 up(&sc->master->master_sem); |
543 ec_mutex_unlock(&sc->master->master_mutex); |
544 return PTR_ERR(pdo); |
544 return PTR_ERR(pdo); |
545 } |
545 } |
546 pdo->sync_index = sync_index; |
546 pdo->sync_index = sync_index; |
547 |
547 |
548 ec_slave_config_load_default_mapping(sc, pdo); |
548 ec_slave_config_load_default_mapping(sc, pdo); |
549 |
549 |
550 up(&sc->master->master_sem); |
550 ec_mutex_unlock(&sc->master->master_mutex); |
551 return 0; |
551 return 0; |
552 } |
552 } |
553 |
553 |
554 /*****************************************************************************/ |
554 /*****************************************************************************/ |
555 |
555 |
562 if (sync_index >= EC_MAX_SYNC_MANAGERS) { |
562 if (sync_index >= EC_MAX_SYNC_MANAGERS) { |
563 EC_CONFIG_ERR(sc, "Invalid sync manager index %u!\n", sync_index); |
563 EC_CONFIG_ERR(sc, "Invalid sync manager index %u!\n", sync_index); |
564 return; |
564 return; |
565 } |
565 } |
566 |
566 |
567 down(&sc->master->master_sem); |
567 ec_mutex_lock(&sc->master->master_mutex); |
568 ec_pdo_list_clear_pdos(&sc->sync_configs[sync_index].pdos); |
568 ec_pdo_list_clear_pdos(&sc->sync_configs[sync_index].pdos); |
569 up(&sc->master->master_sem); |
569 ec_mutex_unlock(&sc->master->master_mutex); |
570 } |
570 } |
571 |
571 |
572 /*****************************************************************************/ |
572 /*****************************************************************************/ |
573 |
573 |
574 int ecrt_slave_config_pdo_mapping_add(ec_slave_config_t *sc, |
574 int ecrt_slave_config_pdo_mapping_add(ec_slave_config_t *sc, |
590 if ((pdo = ec_pdo_list_find_pdo( |
590 if ((pdo = ec_pdo_list_find_pdo( |
591 &sc->sync_configs[sync_index].pdos, pdo_index))) |
591 &sc->sync_configs[sync_index].pdos, pdo_index))) |
592 break; |
592 break; |
593 |
593 |
594 if (pdo) { |
594 if (pdo) { |
595 down(&sc->master->master_sem); |
595 ec_mutex_lock(&sc->master->master_mutex); |
596 entry = ec_pdo_add_entry(pdo, entry_index, entry_subindex, |
596 entry = ec_pdo_add_entry(pdo, entry_index, entry_subindex, |
597 entry_bit_length); |
597 entry_bit_length); |
598 up(&sc->master->master_sem); |
598 ec_mutex_unlock(&sc->master->master_mutex); |
599 if (IS_ERR(entry)) |
599 if (IS_ERR(entry)) |
600 retval = PTR_ERR(entry); |
600 retval = PTR_ERR(entry); |
601 } else { |
601 } else { |
602 EC_CONFIG_ERR(sc, "PDO 0x%04X is not assigned.\n", pdo_index); |
602 EC_CONFIG_ERR(sc, "PDO 0x%04X is not assigned.\n", pdo_index); |
603 retval = -ENOENT; |
603 retval = -ENOENT; |
621 if ((pdo = ec_pdo_list_find_pdo( |
621 if ((pdo = ec_pdo_list_find_pdo( |
622 &sc->sync_configs[sync_index].pdos, pdo_index))) |
622 &sc->sync_configs[sync_index].pdos, pdo_index))) |
623 break; |
623 break; |
624 |
624 |
625 if (pdo) { |
625 if (pdo) { |
626 down(&sc->master->master_sem); |
626 ec_mutex_lock(&sc->master->master_mutex); |
627 ec_pdo_clear_entries(pdo); |
627 ec_pdo_clear_entries(pdo); |
628 up(&sc->master->master_sem); |
628 ec_mutex_unlock(&sc->master->master_mutex); |
629 } else { |
629 } else { |
630 EC_CONFIG_WARN(sc, "PDO 0x%04X is not assigned.\n", pdo_index); |
630 EC_CONFIG_WARN(sc, "PDO 0x%04X is not assigned.\n", pdo_index); |
631 } |
631 } |
632 } |
632 } |
633 |
633 |
803 ec_sdo_request_clear(req); |
803 ec_sdo_request_clear(req); |
804 kfree(req); |
804 kfree(req); |
805 return ret; |
805 return ret; |
806 } |
806 } |
807 |
807 |
808 down(&sc->master->master_sem); |
808 ec_mutex_lock(&sc->master->master_mutex); |
809 list_add_tail(&req->list, &sc->sdo_configs); |
809 list_add_tail(&req->list, &sc->sdo_configs); |
810 up(&sc->master->master_sem); |
810 ec_mutex_unlock(&sc->master->master_mutex); |
811 return 0; |
811 return 0; |
812 } |
812 } |
813 |
813 |
814 /*****************************************************************************/ |
814 /*****************************************************************************/ |
815 |
815 |
888 ec_sdo_request_clear(req); |
888 ec_sdo_request_clear(req); |
889 kfree(req); |
889 kfree(req); |
890 return ret; |
890 return ret; |
891 } |
891 } |
892 |
892 |
893 down(&sc->master->master_sem); |
893 ec_mutex_lock(&sc->master->master_mutex); |
894 list_add_tail(&req->list, &sc->sdo_configs); |
894 list_add_tail(&req->list, &sc->sdo_configs); |
895 up(&sc->master->master_sem); |
895 ec_mutex_unlock(&sc->master->master_mutex); |
896 return 0; |
896 return 0; |
897 } |
897 } |
898 |
898 |
899 /*****************************************************************************/ |
899 /*****************************************************************************/ |
900 |
900 |
929 |
929 |
930 // prepare data for optional writing |
930 // prepare data for optional writing |
931 memset(req->data, 0x00, size); |
931 memset(req->data, 0x00, size); |
932 req->data_size = size; |
932 req->data_size = size; |
933 |
933 |
934 down(&sc->master->master_sem); |
934 ec_mutex_lock(&sc->master->master_mutex); |
935 list_add_tail(&req->list, &sc->sdo_requests); |
935 list_add_tail(&req->list, &sc->sdo_requests); |
936 up(&sc->master->master_sem); |
936 ec_mutex_unlock(&sc->master->master_mutex); |
937 |
937 |
938 return req; |
938 return req; |
939 } |
939 } |
940 |
940 |
941 /*****************************************************************************/ |
941 /*****************************************************************************/ |
971 if (ret < 0) { |
971 if (ret < 0) { |
972 kfree(voe); |
972 kfree(voe); |
973 return ERR_PTR(ret); |
973 return ERR_PTR(ret); |
974 } |
974 } |
975 |
975 |
976 down(&sc->master->master_sem); |
976 ec_mutex_lock(&sc->master->master_mutex); |
977 list_add_tail(&voe->list, &sc->voe_handlers); |
977 list_add_tail(&voe->list, &sc->voe_handlers); |
978 up(&sc->master->master_sem); |
978 ec_mutex_unlock(&sc->master->master_mutex); |
979 |
979 |
980 return voe; |
980 return voe; |
981 } |
981 } |
982 |
982 |
983 /*****************************************************************************/ |
983 /*****************************************************************************/ |
1054 ec_soe_request_clear(req); |
1054 ec_soe_request_clear(req); |
1055 kfree(req); |
1055 kfree(req); |
1056 return ret; |
1056 return ret; |
1057 } |
1057 } |
1058 |
1058 |
1059 down(&sc->master->master_sem); |
1059 ec_mutex_lock(&sc->master->master_mutex); |
1060 list_add_tail(&req->list, &sc->soe_configs); |
1060 list_add_tail(&req->list, &sc->soe_configs); |
1061 up(&sc->master->master_sem); |
1061 ec_mutex_unlock(&sc->master->master_mutex); |
1062 return 0; |
1062 return 0; |
1063 } |
1063 } |
1064 |
1064 |
1065 /*****************************************************************************/ |
1065 /*****************************************************************************/ |
1066 |
1066 |