diff -r 2bd8ad8bf41f -r 7a025a9e192d master/fsm_master.c --- a/master/fsm_master.c Wed Jan 05 11:33:31 2011 +0100 +++ b/master/fsm_master.c Wed Jan 05 12:26:33 2011 +0100 @@ -391,6 +391,7 @@ "datagram size (%zu)!\n", request->length, fsm->datagram->mem_size); request->state = EC_INT_REQUEST_FAILURE; + kref_put(&request->refcount,ec_master_reg_request_release); wake_up(&master->reg_queue); continue; } @@ -1191,6 +1192,7 @@ " request datagram: "); ec_datagram_print_state(datagram); request->state = EC_INT_REQUEST_FAILURE; + kref_put(&request->refcount,ec_master_reg_request_release); wake_up(&master->reg_queue); ec_fsm_master_restart(fsm); return; @@ -1205,6 +1207,7 @@ EC_MASTER_ERR(master, "Failed to allocate %zu bytes" " of memory for register data.\n", request->length); request->state = EC_INT_REQUEST_FAILURE; + kref_put(&request->refcount,ec_master_reg_request_release); wake_up(&master->reg_queue); ec_fsm_master_restart(fsm); return; @@ -1219,6 +1222,7 @@ EC_MASTER_ERR(master, "Register request failed.\n"); } + kref_put(&request->refcount,ec_master_reg_request_release); wake_up(&master->reg_queue); // check for another register request @@ -1243,6 +1247,20 @@ /*****************************************************************************/ +/** called by kref_put if the reg request's refcount becomes zero. + * + */ +void ec_master_reg_request_release(struct kref *ref) +{ + ec_reg_request_t *request = container_of(ref, ec_reg_request_t, refcount); + EC_SLAVE_DBG(request->slave, 1, "Releasing reg request %p.\n",request); + if (request->data) + kfree(request->data); + kfree(request); +} + +/*****************************************************************************/ + /** called by kref_put if the SDO request's refcount becomes zero. * */