diff -r 86ebf18a029f -r 2c3ccdde3919 master/fsm_master.c --- a/master/fsm_master.c Wed Nov 14 22:08:32 2012 +0100 +++ b/master/fsm_master.c Wed Nov 14 22:12:57 2012 +0100 @@ -2,7 +2,7 @@ * * $Id$ * - * Copyright (C) 2006-2008 Florian Pose, Ingenieurgemeinschaft IgH + * Copyright (C) 2006-2012 Florian Pose, Ingenieurgemeinschaft IgH * * This file is part of the IgH EtherCAT Master. * @@ -65,7 +65,6 @@ void ec_fsm_master_state_write_sii(ec_fsm_master_t *); void ec_fsm_master_state_sdo_dictionary(ec_fsm_master_t *); void ec_fsm_master_state_sdo_request(ec_fsm_master_t *); -void ec_fsm_master_state_reg_request(ec_fsm_master_t *); void ec_fsm_master_enter_clear_addresses(ec_fsm_master_t *); void ec_fsm_master_enter_write_system_times(ec_fsm_master_t *); @@ -404,62 +403,6 @@ /*****************************************************************************/ -/** Check for pending register requests and process one. - * - * \return non-zero, if a register request is processed. - */ -int ec_fsm_master_action_process_register( - ec_fsm_master_t *fsm /**< Master state machine. */ - ) -{ - ec_master_t *master = fsm->master; - ec_reg_request_t *request; - - // search the first request to be processed - while (!list_empty(&master->reg_requests)) { - - // get first request - request = list_entry(master->reg_requests.next, - ec_reg_request_t, list); - list_del_init(&request->list); // dequeue - request->state = EC_INT_REQUEST_BUSY; - - // found pending request; process it! - EC_SLAVE_DBG(request->slave, 1, "Processing register request, " - "offset 0x%04x, length %zu...\n", - request->offset, request->length); - - if (request->length > fsm->datagram->mem_size) { - EC_MASTER_ERR(master, "Request length (%zu) exceeds maximum " - "datagram size (%zu)!\n", request->length, - fsm->datagram->mem_size); - request->state = EC_INT_REQUEST_FAILURE; - wake_up(&master->reg_queue); - continue; - } - - fsm->reg_request = request; - - if (request->dir == EC_DIR_INPUT) { - ec_datagram_fprd(fsm->datagram, request->slave->station_address, - request->offset, request->length); - ec_datagram_zero(fsm->datagram); - } else { - ec_datagram_fpwr(fsm->datagram, request->slave->station_address, - request->offset, request->length); - memcpy(fsm->datagram->data, request->data, request->length); - } - fsm->datagram->device_index = request->slave->device_index; - fsm->retries = EC_FSM_RETRIES; - fsm->state = ec_fsm_master_state_reg_request; - return 1; - } - - return 0; -} - -/*****************************************************************************/ - /** Check for pending SDO requests and process one. * * \return non-zero, if an SDO request is processed. @@ -509,7 +452,6 @@ return 0; } - /*****************************************************************************/ /** Master action: IDLE. @@ -563,12 +505,9 @@ } // check for pending SII write operations. - if (ec_fsm_master_action_process_sii(fsm)) + if (ec_fsm_master_action_process_sii(fsm)) { return; // SII write request found - - // check for pending register requests. - if (ec_fsm_master_action_process_register(fsm)) - return; // register request processing + } ec_fsm_master_restart(fsm); } @@ -1276,64 +1215,11 @@ EC_SLAVE_DBG(fsm->slave, 1, "Finished internal SDO request.\n"); // check for another SDO request - if (ec_fsm_master_action_process_sdo(fsm)) + if (ec_fsm_master_action_process_sdo(fsm)) { return; // processing another request + } ec_fsm_master_restart(fsm); } /*****************************************************************************/ - -/** Master state: REG REQUEST. - */ -void ec_fsm_master_state_reg_request( - ec_fsm_master_t *fsm /**< Master state machine. */ - ) -{ - ec_master_t *master = fsm->master; - ec_datagram_t *datagram = fsm->datagram; - ec_reg_request_t *request = fsm->reg_request; - - if (datagram->state != EC_DATAGRAM_RECEIVED) { - EC_MASTER_ERR(master, "Failed to receive register" - " request datagram: "); - ec_datagram_print_state(datagram); - request->state = EC_INT_REQUEST_FAILURE; - wake_up(&master->reg_queue); - ec_fsm_master_restart(fsm); - return; - } - - if (datagram->working_counter == 1) { - if (request->dir == EC_DIR_INPUT) { // read request - if (request->data) - kfree(request->data); - request->data = kmalloc(request->length, GFP_KERNEL); - if (!request->data) { - EC_MASTER_ERR(master, "Failed to allocate %zu bytes" - " of memory for register data.\n", request->length); - request->state = EC_INT_REQUEST_FAILURE; - wake_up(&master->reg_queue); - ec_fsm_master_restart(fsm); - return; - } - memcpy(request->data, datagram->data, request->length); - } - - request->state = EC_INT_REQUEST_SUCCESS; - EC_SLAVE_DBG(request->slave, 1, "Register request successful.\n"); - } else { - request->state = EC_INT_REQUEST_FAILURE; - EC_MASTER_ERR(master, "Register request failed.\n"); - } - - wake_up(&master->reg_queue); - - // check for another register request - if (ec_fsm_master_action_process_register(fsm)) - return; // processing another request - - ec_fsm_master_restart(fsm); -} - -/*****************************************************************************/