master/slave_config.c
changeset 2028 55854f070c4a
parent 2008 470342b23341
child 2101 01b30593e942
equal deleted inserted replaced
2027:ac35f4d38a31 2028:55854f070c4a
   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