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 /*****************************************************************************/ |