master/slave_config.c
changeset 1844 b6bd88d4806b
parent 1798 e7733f825982
child 1873 219be3742274
equal deleted inserted replaced
1843:4d44d8bee580 1844:b6bd88d4806b
    84     sc->dc_sync[1].shift_time = 0x00000000;
    84     sc->dc_sync[1].shift_time = 0x00000000;
    85 
    85 
    86     INIT_LIST_HEAD(&sc->sdo_configs);
    86     INIT_LIST_HEAD(&sc->sdo_configs);
    87     INIT_LIST_HEAD(&sc->sdo_requests);
    87     INIT_LIST_HEAD(&sc->sdo_requests);
    88     INIT_LIST_HEAD(&sc->voe_handlers);
    88     INIT_LIST_HEAD(&sc->voe_handlers);
       
    89     INIT_LIST_HEAD(&sc->soe_configs);
    89 }
    90 }
    90 
    91 
    91 /*****************************************************************************/
    92 /*****************************************************************************/
    92 
    93 
    93 /** Slave configuration destructor.
    94 /** Slave configuration destructor.
    99         )
   100         )
   100 {
   101 {
   101     unsigned int i;
   102     unsigned int i;
   102     ec_sdo_request_t *req, *next_req;
   103     ec_sdo_request_t *req, *next_req;
   103     ec_voe_handler_t *voe, *next_voe;
   104     ec_voe_handler_t *voe, *next_voe;
       
   105     ec_soe_request_t *soe, *next_soe;
   104 
   106 
   105     ec_slave_config_detach(sc);
   107     ec_slave_config_detach(sc);
   106 
   108 
   107     // Free sync managers
   109     // Free sync managers
   108     for (i = 0; i < EC_MAX_SYNC_MANAGERS; i++)
   110     for (i = 0; i < EC_MAX_SYNC_MANAGERS; i++)
   125     // free all VoE handlers
   127     // free all VoE handlers
   126     list_for_each_entry_safe(voe, next_voe, &sc->voe_handlers, list) {
   128     list_for_each_entry_safe(voe, next_voe, &sc->voe_handlers, list) {
   127         list_del(&voe->list);
   129         list_del(&voe->list);
   128         ec_voe_handler_clear(voe);
   130         ec_voe_handler_clear(voe);
   129         kfree(voe);
   131         kfree(voe);
       
   132     }
       
   133 
       
   134     // free all SoE configurations
       
   135     list_for_each_entry_safe(soe, next_soe, &sc->soe_configs, list) {
       
   136         list_del(&soe->list);
       
   137         ec_soe_request_clear(soe);
       
   138         kfree(soe);
   130     }
   139     }
   131 }
   140 }
   132 
   141 
   133 /*****************************************************************************/
   142 /*****************************************************************************/
   134 
   143 
   944         state->al_state = sc->slave->current_state;
   953         state->al_state = sc->slave->current_state;
   945     } else {
   954     } else {
   946         state->operational = 0;
   955         state->operational = 0;
   947         state->al_state = EC_SLAVE_STATE_UNKNOWN;
   956         state->al_state = EC_SLAVE_STATE_UNKNOWN;
   948     }
   957     }
       
   958 }
       
   959 
       
   960 /*****************************************************************************/
       
   961 
       
   962 int ecrt_slave_config_idn(ec_slave_config_t *sc, uint16_t idn,
       
   963 		const uint8_t *data, size_t size)
       
   964 {
       
   965     ec_slave_t *slave = sc->slave;
       
   966     ec_soe_request_t *req;
       
   967     int ret;
       
   968 
       
   969     if (sc->master->debug_level)
       
   970         EC_DBG("ecrt_slave_config_idn(sc = 0x%p, idn = 0x%04X, "
       
   971                 "data = 0x%p, size = %zu)\n", sc, idn, data, size);
       
   972 
       
   973     if (slave && !(slave->sii.mailbox_protocols & EC_MBOX_SOE)) {
       
   974         EC_ERR("Slave %u does not support SoE!\n", slave->ring_position);
       
   975         return -EPROTONOSUPPORT; // protocol not supported
       
   976     }
       
   977 
       
   978     if (!(req = (ec_soe_request_t *)
       
   979           kmalloc(sizeof(ec_soe_request_t), GFP_KERNEL))) {
       
   980         EC_ERR("Failed to allocate memory for IDN configuration!\n");
       
   981         return -ENOMEM;
       
   982     }
       
   983 
       
   984     ec_soe_request_init(req);
       
   985     ec_soe_request_set_idn(req, idn);
       
   986 
       
   987     ret = ec_soe_request_copy_data(req, data, size);
       
   988     if (ret < 0) {
       
   989         ec_soe_request_clear(req);
       
   990         kfree(req);
       
   991         return ret;
       
   992     }
       
   993         
       
   994     down(&sc->master->master_sem);
       
   995     list_add_tail(&req->list, &sc->soe_configs);
       
   996     up(&sc->master->master_sem);
       
   997     return 0;
   949 }
   998 }
   950 
   999 
   951 /*****************************************************************************/
  1000 /*****************************************************************************/
   952 
  1001 
   953 /** \cond */
  1002 /** \cond */
   967 EXPORT_SYMBOL(ecrt_slave_config_sdo32);
  1016 EXPORT_SYMBOL(ecrt_slave_config_sdo32);
   968 EXPORT_SYMBOL(ecrt_slave_config_complete_sdo);
  1017 EXPORT_SYMBOL(ecrt_slave_config_complete_sdo);
   969 EXPORT_SYMBOL(ecrt_slave_config_create_sdo_request);
  1018 EXPORT_SYMBOL(ecrt_slave_config_create_sdo_request);
   970 EXPORT_SYMBOL(ecrt_slave_config_create_voe_handler);
  1019 EXPORT_SYMBOL(ecrt_slave_config_create_voe_handler);
   971 EXPORT_SYMBOL(ecrt_slave_config_state);
  1020 EXPORT_SYMBOL(ecrt_slave_config_state);
       
  1021 EXPORT_SYMBOL(ecrt_slave_config_idn);
   972 
  1022 
   973 /** \endcond */
  1023 /** \endcond */
   974 
  1024 
   975 /*****************************************************************************/
  1025 /*****************************************************************************/