# HG changeset patch # User Florian Pose # Date 1144223751 0 # Node ID 1961b674466c5cf5cad0e6ea115daa93f0aecf2f # Parent 36530399236b8826af2d533d6c786d31ebc402be Plugfest: master_open()/close() ausgelagert. diff -r 36530399236b -r 1961b674466c master/master.c --- a/master/master.c Wed Apr 05 07:47:26 2006 +0000 +++ b/master/master.c Wed Apr 05 07:55:51 2006 +0000 @@ -131,47 +131,6 @@ /*****************************************************************************/ /** - Öffnet das EtherCAT-Geraet des Masters. - - \return 0 wenn alles ok, < 0 wenn kein Gerät registriert wurde oder - es nicht geoeffnet werden konnte. -*/ - -int ec_master_open(ec_master_t *master /**< Der EtherCAT-Master */) -{ - if (!master->device) { - EC_ERR("No device registered!\n"); - return -1; - } - - if (ec_device_open(master->device)) { - EC_ERR("Could not open device!\n"); - return -1; - } - - return 0; -} - -/*****************************************************************************/ - -/** - Schliesst das EtherCAT-Geraet, auf dem der Master arbeitet. -*/ - -void ec_master_close(ec_master_t *master /**< EtherCAT-Master */) -{ - if (!master->device) { - EC_WARN("Warning - Trying to close an unregistered device!\n"); - return; - } - - if (ec_device_close(master->device)) - EC_WARN("Warning - Could not close device!\n"); -} - -/*****************************************************************************/ - -/** Stellt ein Kommando in die Warteschlange. */ diff -r 36530399236b -r 1961b674466c master/master.h --- a/master/master.h Wed Apr 05 07:47:26 2006 +0000 +++ b/master/master.h Wed Apr 05 07:55:51 2006 +0000 @@ -73,10 +73,6 @@ void ec_master_queue_command(ec_master_t *, ec_command_t *); int ec_master_simple_io(ec_master_t *, ec_command_t *); -// Registration of devices -int ec_master_open(ec_master_t *); -void ec_master_close(ec_master_t *); - // Slave management int ec_master_bus_scan(ec_master_t *); diff -r 36530399236b -r 1961b674466c master/module.c --- a/master/module.c Wed Apr 05 07:47:26 2006 +0000 +++ b/master/module.c Wed Apr 05 07:55:51 2006 +0000 @@ -82,14 +82,13 @@ if (!(ec_masters = (ec_master_t *) kmalloc(sizeof(ec_master_t) * ec_master_count, GFP_KERNEL))) { - EC_ERR("Could not allocate memory for EtherCAT master(s)!\n"); + EC_ERR("Failed to allocate master(s)!\n"); goto out_return; } - if (!(ec_masters_reserved = - (unsigned int *) kmalloc(sizeof(int) * ec_master_count, - GFP_KERNEL))) { - EC_ERR("Could not allocate memory for reservation flags!\n"); + if (!(ec_masters_reserved = (unsigned int *) + kmalloc(sizeof(int) * ec_master_count, GFP_KERNEL))) { + EC_ERR("Failed to allocate reservation flags!\n"); goto out_free_masters; } @@ -241,7 +240,7 @@ { ec_master_t *master; - EC_INFO("===== Starting master %i... =====\n", index); + EC_INFO("Requesting master %i...\n", index); if (index < 0 || index >= ec_master_count) { EC_ERR("Master %i does not exist!\n", index); @@ -249,48 +248,49 @@ } if (ec_masters_reserved[index]) { - EC_ERR("Master %i already in use!\n", index); + EC_ERR("Master %i is already in use!\n", index); goto req_return; } + ec_masters_reserved[index] = 1; master = &ec_masters[index]; if (!master->device) { - EC_ERR("Master %i has no device assigned yet!\n", index); - goto req_return; + EC_ERR("Master %i has no assigned device!\n", index); + goto req_release; } if (!try_module_get(master->device->module)) { EC_ERR("Failed to reserve device module!\n"); - goto req_return; - } - - if (ec_master_open(master)) { + goto req_release; + } + + if (ec_device_open(master->device)) { EC_ERR("Failed to open device!\n"); goto req_module_put; } - if (!master->device->link_state) EC_WARN("Link is DOWN.\n"); + if (!master->device->link_state) + EC_WARN("Link is DOWN.\n"); if (ec_master_bus_scan(master) != 0) { EC_ERR("Bus scan failed!\n"); goto req_close; } - ec_masters_reserved[index] = 1; - EC_INFO("===== Master %i ready. =====\n", index); - + EC_INFO("Master %i is ready.\n", index); return master; req_close: - ec_master_close(master); - + if (ec_device_close(master->device)) + EC_WARN("Warning - Failed to close device!\n"); req_module_put: module_put(master->device->module); ec_master_reset(master); - + req_release: + ec_masters_reserved[index] = 0; req_return: - EC_INFO("===== Failed to start master %i =====\n", index); + EC_ERR("Failed requesting master %i.\n", index); return NULL; } @@ -300,7 +300,7 @@ Gibt einen zuvor angeforderten EtherCAT-Master wieder frei. */ -void ecrt_release_master(ec_master_t *master /**< EtherCAT-Masdter */) +void ecrt_release_master(ec_master_t *master /**< EtherCAT-Master */) { unsigned int i, found; @@ -313,19 +313,21 @@ } if (!found) { - EC_WARN("Master %X was never requested!\n", (u32) master); + EC_WARN("Master 0x%08X was never requested!\n", (u32) master); return; } - EC_INFO("===== Stopping master %i... =====\n", i); - - ec_master_close(master); + EC_INFO("Releasing master %i...\n", i); + ec_master_reset(master); + if (ec_device_close(master->device)) + EC_WARN("Warning - Failed to close device!\n"); + module_put(master->device->module); ec_masters_reserved[i] = 0; - EC_INFO("===== Master %i stopped. =====\n", i); + EC_INFO("Released master %i.\n", i); return; }