diff -r a0b686241178 -r 74ede087bc85 master/master.c --- a/master/master.c Tue Dec 04 14:54:12 2012 +0100 +++ b/master/master.c Tue Dec 04 16:05:23 2012 +0100 @@ -220,7 +220,8 @@ master->app_cb_data = NULL; INIT_LIST_HEAD(&master->sii_requests); - init_waitqueue_head(&master->sii_queue); + + init_waitqueue_head(&master->request_queue); // init devices for (dev_idx = EC_DEVICE_MAIN; dev_idx < ec_master_num_devices(master); @@ -434,8 +435,8 @@ master->dc_ref_clock = NULL; - // external requests are obsolete, so we wake pending waiters and remove - // them from the list + // External requests are obsolete, so we wake pending waiters and remove + // them from the list. while (!list_empty(&master->sii_requests)) { ec_sii_write_request_t *request = @@ -445,7 +446,7 @@ EC_MASTER_WARN(master, "Discarding SII request, slave %u about" " to be deleted.\n", request->slave->ring_position); request->state = EC_INT_REQUEST_FAILURE; - wake_up(&master->sii_queue); + wake_up(&master->request_queue); } for (slave = master->slaves; @@ -2667,6 +2668,7 @@ { ec_sdo_request_t request; ec_slave_t *slave; + int ret; EC_MASTER_DBG(master, 1, "%s(master = 0x%p," " slave_position = %u, index = 0x%04X, subindex = 0x%02X," @@ -2681,9 +2683,10 @@ ec_sdo_request_init(&request); ecrt_sdo_request_index(&request, index, subindex); - if (ec_sdo_request_alloc(&request, data_size)) { + ret = ec_sdo_request_alloc(&request, data_size); + if (ret) { ec_sdo_request_clear(&request); - return -ENOMEM; + return ret; } memcpy(request.data, data, data_size); @@ -2702,7 +2705,7 @@ return -EINVAL; } - EC_SLAVE_DBG(slave, 1, "Schedule SDO download request.\n"); + EC_SLAVE_DBG(slave, 1, "Scheduling SDO download request.\n"); // schedule request. list_add_tail(&request.list, &slave->sdo_requests); @@ -2710,7 +2713,7 @@ up(&master->master_sem); // wait for processing through FSM - if (wait_event_interruptible(slave->sdo_queue, + if (wait_event_interruptible(master->request_queue, request.state != EC_INT_REQUEST_QUEUED)) { // interrupted by signal down(&master->master_sem); @@ -2724,22 +2727,21 @@ up(&master->master_sem); } - // FIXME slave may become invalid! - // wait until master FSM has finished processing - wait_event(slave->sdo_queue, request.state != EC_INT_REQUEST_BUSY); - - EC_SLAVE_DBG(slave, 1, "Finished SDO download request.\n"); + wait_event(master->request_queue, request.state != EC_INT_REQUEST_BUSY); *abort_code = request.abort_code; if (request.state == EC_INT_REQUEST_SUCCESS) { - return 0; + ret = 0; } else if (request.errno) { - return -request.errno; + ret = -request.errno; } else { - return -EIO; - } + ret = -EIO; + } + + ec_sdo_request_clear(&request); + return ret; } /*****************************************************************************/ @@ -2750,6 +2752,7 @@ { ec_sdo_request_t request; ec_slave_t *slave; + int ret; EC_MASTER_DBG(master, 1, "%s(master = 0x%p," " slave_position = %u, index = 0x%04X," @@ -2764,9 +2767,10 @@ ec_sdo_request_init(&request); ecrt_sdo_request_index(&request, index, 0); - if (ec_sdo_request_alloc(&request, data_size)) { + ret = ec_sdo_request_alloc(&request, data_size); + if (ret) { ec_sdo_request_clear(&request); - return -ENOMEM; + return ret; } request.complete_access = 1; @@ -2786,7 +2790,7 @@ return -EINVAL; } - EC_SLAVE_DBG(slave, 1, "Schedule SDO download request" + EC_SLAVE_DBG(slave, 1, "Scheduling SDO download request" " (complete access).\n"); // schedule request. @@ -2795,7 +2799,7 @@ up(&master->master_sem); // wait for processing through FSM - if (wait_event_interruptible(slave->sdo_queue, + if (wait_event_interruptible(master->request_queue, request.state != EC_INT_REQUEST_QUEUED)) { // interrupted by signal down(&master->master_sem); @@ -2809,23 +2813,21 @@ up(&master->master_sem); } - // FIXME slave may become invalid! - // wait until master FSM has finished processing - wait_event(slave->sdo_queue, request.state != EC_INT_REQUEST_BUSY); - - EC_SLAVE_DBG(slave, 1, "Finished SDO download request" - " (complete access).\n"); + wait_event(master->request_queue, request.state != EC_INT_REQUEST_BUSY); *abort_code = request.abort_code; if (request.state == EC_INT_REQUEST_SUCCESS) { - return 0; + ret = 0; } else if (request.errno) { - return -request.errno; + ret = -request.errno; } else { - return -EIO; - } + ret = -EIO; + } + + ec_sdo_request_clear(&request); + return ret; } /*****************************************************************************/ @@ -2836,7 +2838,7 @@ { ec_sdo_request_t request; ec_slave_t *slave; - int retval = 0; + int ret = 0; EC_MASTER_DBG(master, 1, "%s(master = 0x%p," " slave_position = %u, index = 0x%04X, subindex = 0x%02X," @@ -2861,7 +2863,7 @@ return -EINVAL; } - EC_SLAVE_DBG(slave, 1, "Schedule SDO upload request.\n"); + EC_SLAVE_DBG(slave, 1, "Scheduling SDO upload request.\n"); // schedule request. list_add_tail(&request.list, &slave->sdo_requests); @@ -2869,7 +2871,7 @@ up(&master->master_sem); // wait for processing through FSM - if (wait_event_interruptible(slave->sdo_queue, + if (wait_event_interruptible(master->request_queue, request.state != EC_INT_REQUEST_QUEUED)) { // interrupted by signal down(&master->master_sem); @@ -2883,34 +2885,32 @@ up(&master->master_sem); } - // FIXME slave may become invalid! - // wait until master FSM has finished processing - wait_event(slave->sdo_queue, request.state != EC_INT_REQUEST_BUSY); - - EC_SLAVE_DBG(slave, 1, "Finished SDO upload request.\n"); + wait_event(master->request_queue, request.state != EC_INT_REQUEST_BUSY); *abort_code = request.abort_code; if (request.state != EC_INT_REQUEST_SUCCESS) { *result_size = 0; if (request.errno) { - retval = -request.errno; + ret = -request.errno; } else { - retval = -EIO; + ret = -EIO; } } else { if (request.data_size > target_size) { EC_MASTER_ERR(master, "Buffer too small.\n"); - ec_sdo_request_clear(&request); - return -EOVERFLOW; - } - memcpy(target, request.data, request.data_size); - *result_size = request.data_size; + ret = -EOVERFLOW; + } + else { + memcpy(target, request.data, request.data_size); + *result_size = request.data_size; + ret = 0; + } } ec_sdo_request_clear(&request); - return retval; + return ret; } /*****************************************************************************/ @@ -2963,7 +2963,7 @@ up(&master->master_sem); // wait for processing through FSM - if (wait_event_interruptible(slave->soe_queue, + if (wait_event_interruptible(master->request_queue, request.state != EC_INT_REQUEST_QUEUED)) { // interrupted by signal down(&master->master_sem); @@ -2977,10 +2977,8 @@ up(&master->master_sem); } - // FIXME slave may become invalid - // wait until master FSM has finished processing - wait_event(slave->soe_queue, request.state != EC_INT_REQUEST_BUSY); + wait_event(master->request_queue, request.state != EC_INT_REQUEST_BUSY); if (error_code) { *error_code = request.error_code; @@ -3023,15 +3021,15 @@ return -EINVAL; } + EC_SLAVE_DBG(slave, 1, "Scheduling SoE read request.\n"); + // schedule request. list_add_tail(&request.list, &slave->soe_requests); up(&master->master_sem); - EC_SLAVE_DBG(slave, 1, "Scheduled SoE read request.\n"); - // wait for processing through FSM - if (wait_event_interruptible(slave->soe_queue, + if (wait_event_interruptible(master->request_queue, request.state != EC_INT_REQUEST_QUEUED)) { // interrupted by signal down(&master->master_sem); @@ -3045,17 +3043,13 @@ up(&master->master_sem); } - // FIXME slave may become invalid - // wait until master FSM has finished processing - wait_event(slave->soe_queue, request.state != EC_INT_REQUEST_BUSY); + wait_event(master->request_queue, request.state != EC_INT_REQUEST_BUSY); if (error_code) { *error_code = request.error_code; } - EC_SLAVE_DBG(slave, 1, "Read %zd bytes via SoE.\n", request.data_size); - if (request.state != EC_INT_REQUEST_SUCCESS) { if (result_size) { *result_size = 0;