--- a/master/fsm_slave.c Thu Dec 23 09:28:39 2010 +0100
+++ b/master/fsm_slave.c Thu Dec 23 09:48:56 2010 +0100
@@ -178,9 +178,10 @@
list_del_init(&request->list); // dequeue
if (slave->current_state & EC_SLAVE_STATE_ACK_ERR) {
- EC_SLAVE_WARN(slave, "Aborting SDO request,"
- " slave has error flag set.\n");
+ EC_SLAVE_WARN(slave, "Aborting SDO request %p,"
+ " slave has error flag set.\n",request);
request->req.state = EC_INT_REQUEST_FAILURE;
+ kref_put(&request->refcount,ec_master_sdo_request_release);
wake_up(&slave->sdo_queue);
fsm->sdo_request = NULL;
fsm->state = ec_fsm_slave_state_idle;
@@ -188,8 +189,9 @@
}
if (slave->current_state == EC_SLAVE_STATE_INIT) {
- EC_SLAVE_WARN(slave, "Aborting SDO request, slave is in INIT.\n");
+ EC_SLAVE_WARN(slave, "Aborting SDO request %p, slave is in INIT.\n",request);
request->req.state = EC_INT_REQUEST_FAILURE;
+ kref_put(&request->refcount,ec_master_sdo_request_release);
wake_up(&slave->sdo_queue);
fsm->sdo_request = NULL;
fsm->state = ec_fsm_slave_state_idle;
@@ -199,10 +201,10 @@
request->req.state = EC_INT_REQUEST_BUSY;
// Found pending SDO request. Execute it!
- EC_SLAVE_DBG(slave, 1, "Processing SDO request...\n");
+ EC_SLAVE_DBG(slave, 1, "Processing SDO request %p...\n",request);
// Start SDO transfer
- fsm->sdo_request = &request->req;
+ fsm->sdo_request = request;
fsm->state = ec_fsm_slave_state_sdo_request;
ec_fsm_coe_transfer(&fsm->fsm_coe, slave, &request->req);
ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately
@@ -221,7 +223,7 @@
)
{
ec_slave_t *slave = fsm->slave;
- ec_sdo_request_t *request = fsm->sdo_request;
+ ec_master_sdo_request_t *request = fsm->sdo_request;
if (ec_fsm_coe_exec(&fsm->fsm_coe))
{
@@ -229,18 +231,20 @@
return;
}
if (!ec_fsm_coe_success(&fsm->fsm_coe)) {
- EC_SLAVE_ERR(slave, "Failed to process SDO request.\n");
- request->state = EC_INT_REQUEST_FAILURE;
+ EC_SLAVE_ERR(slave, "Failed to process SDO request %p.\n",request);
+ request->req.state = EC_INT_REQUEST_FAILURE;
+ kref_put(&request->refcount,ec_master_sdo_request_release);
wake_up(&slave->sdo_queue);
fsm->sdo_request = NULL;
fsm->state = ec_fsm_slave_state_idle;
return;
}
- EC_SLAVE_DBG(slave, 1, "Finished SDO request.\n");
+ EC_SLAVE_DBG(slave, 1, "Finished SDO request %p.\n",request);
// SDO request finished
- request->state = EC_INT_REQUEST_SUCCESS;
+ request->req.state = EC_INT_REQUEST_SUCCESS;
+ kref_put(&request->refcount,ec_master_sdo_request_release);
wake_up(&slave->sdo_queue);
fsm->sdo_request = NULL;