equal
deleted
inserted
replaced
132 */ |
132 */ |
133 int ec_fsm_master_exec( |
133 int ec_fsm_master_exec( |
134 ec_fsm_master_t *fsm /**< Master state machine. */ |
134 ec_fsm_master_t *fsm /**< Master state machine. */ |
135 ) |
135 ) |
136 { |
136 { |
137 if (ec_mbox_is_datagram_state(fsm->mbox,EC_DATAGRAM_QUEUED) |
137 if (ec_mbox_is_datagram_state(fsm->mbox, EC_DATAGRAM_QUEUED) |
138 || ec_mbox_is_datagram_state(fsm->mbox,EC_DATAGRAM_SENT)) { |
138 || ec_mbox_is_datagram_state(fsm->mbox, EC_DATAGRAM_SENT)) { |
139 // datagram was not sent or received yet. |
139 // datagram was not sent or received yet. |
140 return 0; |
140 return 0; |
141 } |
141 } |
|
142 |
142 fsm->state(fsm); |
143 fsm->state(fsm); |
143 return 1; |
144 return 1; |
144 } |
145 } |
145 |
146 |
146 /*****************************************************************************/ |
147 /*****************************************************************************/ |
389 if (request->length > fsm->datagram->mem_size) { |
390 if (request->length > fsm->datagram->mem_size) { |
390 EC_MASTER_ERR(master, "Request length (%zu) exceeds maximum " |
391 EC_MASTER_ERR(master, "Request length (%zu) exceeds maximum " |
391 "datagram size (%zu)!\n", request->length, |
392 "datagram size (%zu)!\n", request->length, |
392 fsm->datagram->mem_size); |
393 fsm->datagram->mem_size); |
393 request->state = EC_INT_REQUEST_FAILURE; |
394 request->state = EC_INT_REQUEST_FAILURE; |
394 kref_put(&request->refcount,ec_master_reg_request_release); |
395 kref_put(&request->refcount, ec_master_reg_request_release); |
395 wake_up(&master->reg_queue); |
396 wake_up(&master->reg_queue); |
396 continue; |
397 continue; |
397 } |
398 } |
398 |
399 |
399 fsm->reg_request = request; |
400 fsm->reg_request = request; |
992 and the app_time set time */ |
993 and the app_time set time */ |
993 #ifdef EC_HAVE_CYCLES |
994 #ifdef EC_HAVE_CYCLES |
994 correction = |
995 correction = |
995 (datagram->cycles_sent - slave->master->dc_cycles_app_start_time) |
996 (datagram->cycles_sent - slave->master->dc_cycles_app_start_time) |
996 * 1000000LL; |
997 * 1000000LL; |
997 do_div(correction,cpu_khz); |
998 do_div(correction, cpu_khz); |
998 #else |
999 #else |
999 correction = |
1000 correction = |
1000 (u64) ((datagram->jiffies_sent-slave->master->dc_jiffies_app_start_time) * 1000 / HZ) |
1001 (u64) ((datagram->jiffies_sent-slave->master->dc_jiffies_app_start_time) * 1000 / HZ) |
1001 * 1000000; |
1002 * 1000000; |
1002 #endif |
1003 #endif |
1067 if (ec_fsm_sii_exec(&fsm->fsm_sii)) return; |
1068 if (ec_fsm_sii_exec(&fsm->fsm_sii)) return; |
1068 |
1069 |
1069 if (!ec_fsm_sii_success(&fsm->fsm_sii)) { |
1070 if (!ec_fsm_sii_success(&fsm->fsm_sii)) { |
1070 EC_SLAVE_ERR(slave, "Failed to write SII data.\n"); |
1071 EC_SLAVE_ERR(slave, "Failed to write SII data.\n"); |
1071 request->state = EC_INT_REQUEST_FAILURE; |
1072 request->state = EC_INT_REQUEST_FAILURE; |
1072 kref_put(&request->refcount,ec_master_sii_write_request_release); |
1073 kref_put(&request->refcount, ec_master_sii_write_request_release); |
1073 wake_up(&master->sii_queue); |
1074 wake_up(&master->sii_queue); |
1074 ec_fsm_master_restart(fsm); |
1075 ec_fsm_master_restart(fsm); |
1075 return; |
1076 return; |
1076 } |
1077 } |
1077 |
1078 |
1096 slave->effective_alias = slave->sii.alias; |
1097 slave->effective_alias = slave->sii.alias; |
1097 } |
1098 } |
1098 // TODO: Evaluate other SII contents! |
1099 // TODO: Evaluate other SII contents! |
1099 |
1100 |
1100 request->state = EC_INT_REQUEST_SUCCESS; |
1101 request->state = EC_INT_REQUEST_SUCCESS; |
1101 kref_put(&request->refcount,ec_master_sii_write_request_release); |
1102 kref_put(&request->refcount, ec_master_sii_write_request_release); |
1102 wake_up(&master->sii_queue); |
1103 wake_up(&master->sii_queue); |
1103 |
1104 |
1104 // check for another SII write request |
1105 // check for another SII write request |
1105 if (ec_fsm_master_action_process_sii(fsm)) |
1106 if (ec_fsm_master_action_process_sii(fsm)) |
1106 return; // processing another request |
1107 return; // processing another request |
1190 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
1191 if (datagram->state != EC_DATAGRAM_RECEIVED) { |
1191 EC_MASTER_ERR(master, "Failed to receive register" |
1192 EC_MASTER_ERR(master, "Failed to receive register" |
1192 " request datagram: "); |
1193 " request datagram: "); |
1193 ec_datagram_print_state(datagram); |
1194 ec_datagram_print_state(datagram); |
1194 request->state = EC_INT_REQUEST_FAILURE; |
1195 request->state = EC_INT_REQUEST_FAILURE; |
1195 kref_put(&request->refcount,ec_master_reg_request_release); |
1196 kref_put(&request->refcount, ec_master_reg_request_release); |
1196 wake_up(&master->reg_queue); |
1197 wake_up(&master->reg_queue); |
1197 ec_fsm_master_restart(fsm); |
1198 ec_fsm_master_restart(fsm); |
1198 return; |
1199 return; |
1199 } |
1200 } |
1200 |
1201 |
1205 request->data = kmalloc(request->length, GFP_KERNEL); |
1206 request->data = kmalloc(request->length, GFP_KERNEL); |
1206 if (!request->data) { |
1207 if (!request->data) { |
1207 EC_MASTER_ERR(master, "Failed to allocate %zu bytes" |
1208 EC_MASTER_ERR(master, "Failed to allocate %zu bytes" |
1208 " of memory for register data.\n", request->length); |
1209 " of memory for register data.\n", request->length); |
1209 request->state = EC_INT_REQUEST_FAILURE; |
1210 request->state = EC_INT_REQUEST_FAILURE; |
1210 kref_put(&request->refcount,ec_master_reg_request_release); |
1211 kref_put(&request->refcount, ec_master_reg_request_release); |
1211 wake_up(&master->reg_queue); |
1212 wake_up(&master->reg_queue); |
1212 ec_fsm_master_restart(fsm); |
1213 ec_fsm_master_restart(fsm); |
1213 return; |
1214 return; |
1214 } |
1215 } |
1215 memcpy(request->data, datagram->data, request->length); |
1216 memcpy(request->data, datagram->data, request->length); |
1220 } else { |
1221 } else { |
1221 request->state = EC_INT_REQUEST_FAILURE; |
1222 request->state = EC_INT_REQUEST_FAILURE; |
1222 EC_MASTER_ERR(master, "Register request failed.\n"); |
1223 EC_MASTER_ERR(master, "Register request failed.\n"); |
1223 } |
1224 } |
1224 |
1225 |
1225 kref_put(&request->refcount,ec_master_reg_request_release); |
1226 kref_put(&request->refcount, ec_master_reg_request_release); |
1226 wake_up(&master->reg_queue); |
1227 wake_up(&master->reg_queue); |
1227 |
1228 |
1228 // check for another register request |
1229 // check for another register request |
1229 if (ec_fsm_master_action_process_register(fsm)) |
1230 if (ec_fsm_master_action_process_register(fsm)) |
1230 return; // processing another request |
1231 return; // processing another request |
1239 */ |
1240 */ |
1240 void ec_master_sii_write_request_release(struct kref *ref) |
1241 void ec_master_sii_write_request_release(struct kref *ref) |
1241 { |
1242 { |
1242 ec_sii_write_request_t *request = container_of(ref, ec_sii_write_request_t, refcount); |
1243 ec_sii_write_request_t *request = container_of(ref, ec_sii_write_request_t, refcount); |
1243 if (request->slave) |
1244 if (request->slave) |
1244 EC_SLAVE_DBG(request->slave, 1, "Releasing SII write request %p.\n",request); |
1245 EC_SLAVE_DBG(request->slave, 1, "Releasing SII write request %p.\n", |
|
1246 request); |
1245 kfree(request->words); |
1247 kfree(request->words); |
1246 kfree(request); |
1248 kfree(request); |
1247 } |
1249 } |
1248 |
1250 |
1249 /*****************************************************************************/ |
1251 /*****************************************************************************/ |
1253 */ |
1255 */ |
1254 void ec_master_reg_request_release(struct kref *ref) |
1256 void ec_master_reg_request_release(struct kref *ref) |
1255 { |
1257 { |
1256 ec_reg_request_t *request = container_of(ref, ec_reg_request_t, refcount); |
1258 ec_reg_request_t *request = container_of(ref, ec_reg_request_t, refcount); |
1257 if (request->slave) |
1259 if (request->slave) |
1258 EC_SLAVE_DBG(request->slave, 1, "Releasing reg request %p.\n",request); |
1260 EC_SLAVE_DBG(request->slave, 1, "Releasing reg request %p.\n", |
|
1261 request); |
1259 if (request->data) |
1262 if (request->data) |
1260 kfree(request->data); |
1263 kfree(request->data); |
1261 kfree(request); |
1264 kfree(request); |
1262 } |
1265 } |
1263 |
1266 |
1268 */ |
1271 */ |
1269 void ec_master_sdo_request_release(struct kref *ref) |
1272 void ec_master_sdo_request_release(struct kref *ref) |
1270 { |
1273 { |
1271 ec_master_sdo_request_t *request = container_of(ref, ec_master_sdo_request_t, refcount); |
1274 ec_master_sdo_request_t *request = container_of(ref, ec_master_sdo_request_t, refcount); |
1272 if (request->slave) |
1275 if (request->slave) |
1273 EC_SLAVE_DBG(request->slave, 1, "Releasing SDO request %p.\n",request); |
1276 EC_SLAVE_DBG(request->slave, 1, "Releasing SDO request %p.\n", |
|
1277 request); |
1274 ec_sdo_request_clear(&request->req); |
1278 ec_sdo_request_clear(&request->req); |
1275 kfree(request); |
1279 kfree(request); |
1276 } |
1280 } |
1277 |
1281 |
1278 /*****************************************************************************/ |
1282 /*****************************************************************************/ |
1282 */ |
1286 */ |
1283 void ec_master_foe_request_release(struct kref *ref) |
1287 void ec_master_foe_request_release(struct kref *ref) |
1284 { |
1288 { |
1285 ec_master_foe_request_t *request = container_of(ref, ec_master_foe_request_t, refcount); |
1289 ec_master_foe_request_t *request = container_of(ref, ec_master_foe_request_t, refcount); |
1286 if (request->slave) |
1290 if (request->slave) |
1287 EC_SLAVE_DBG(request->slave, 1, "Releasing FoE request %p.\n",request); |
1291 EC_SLAVE_DBG(request->slave, 1, "Releasing FoE request %p.\n", |
|
1292 request); |
1288 ec_foe_request_clear(&request->req); |
1293 ec_foe_request_clear(&request->req); |
1289 kfree(request); |
1294 kfree(request); |
1290 } |
1295 } |
1291 |
1296 |
1292 /*****************************************************************************/ |
1297 /*****************************************************************************/ |
1296 */ |
1301 */ |
1297 void ec_master_soe_request_release(struct kref *ref) |
1302 void ec_master_soe_request_release(struct kref *ref) |
1298 { |
1303 { |
1299 ec_master_soe_request_t *request = container_of(ref, ec_master_soe_request_t, refcount); |
1304 ec_master_soe_request_t *request = container_of(ref, ec_master_soe_request_t, refcount); |
1300 if (request->slave) |
1305 if (request->slave) |
1301 EC_SLAVE_DBG(request->slave, 1, "Releasing SoE request %p.\n",request); |
1306 EC_SLAVE_DBG(request->slave, 1, "Releasing SoE request %p.\n", |
|
1307 request); |
1302 ec_soe_request_clear(&request->req); |
1308 ec_soe_request_clear(&request->req); |
1303 kfree(request); |
1309 kfree(request); |
1304 } |
1310 } |